const SOURCE_RESULT_MODE_NORMAL = 'normal';
const SOURCE_RESULT_MODE_OVERVIEW = 'overview';
- public function getSources($criteria = [], $props = [], $limit_val = 0, $offset_val = 0, $mode = self::SOURCE_RESULT_MODE_NORMAL) {
+ public function getSources($criteria = [], $props = [], $limit_val = 0, $offset_val = 0, $order_by = null, $order_direction = 'DESC', $mode = self::SOURCE_RESULT_MODE_NORMAL) {
$jobs_show = new \JobsShow;
$config = $jobs_show->show(
ConsoleOutputPage::OUTPUT_FORMAT_JSON
// below work only with filtered jobs
$sources = $sources_ft;
+ $misc = $this->getModule('misc');
+
+ // Sort items if needed
+ if (is_string($order_by)) {
+ // Sort all items
+ $misc->sortResultsByField($sources, $order_by, $order_direction);
+ }
+
if ($mode == self::SOURCE_RESULT_MODE_OVERVIEW) {
// Overview mode.
$res = [];
$endtime_to = $this->Request->contains('endtime_to') && $misc->isValidInteger($this->Request['endtime_to']) ? (int)$this->Request['endtime_to'] : null;
$jobstatus = $this->Request->contains('jobstatus') && $misc->isValidState($this->Request['jobstatus']) ? $this->Request['jobstatus'] : '';
$hasobject = $this->Request->contains('hasobject') && $misc->isValidBoolean($this->Request['hasobject']) ? $this->Request['hasobject'] : null;
+ $order_by = $this->Request->contains('order_by') && $misc->isValidColumn($this->Request['order_by']) ? $this->Request['order_by']: null;
+ $order_direction = $this->Request->contains('order_direction') && $misc->isValidOrderDirection($this->Request['order_direction']) ? $this->Request['order_direction']: 'DESC';
$mode = ($this->Request->contains('overview') && $misc->isValidBooleanTrue($this->Request['overview'])) ? SourceManager::SOURCE_RESULT_MODE_OVERVIEW : SourceManager::SOURCE_RESULT_MODE_NORMAL;
+ $allowed_sort_fields = ['job', 'client', 'fileset', 'starttime', 'endtime', 'jobid', 'content', 'type', 'jobstatus', 'joberrors'];
+ if (is_string($order_by) && !in_array($order_by, $allowed_sort_fields)) {
+ $this->output = SourceError::MSG_ERROR_INVALID_PROPERTY;
+ $this->error = SourceError::ERROR_INVALID_PROPERTY;
+ return;
+ }
+
$props = [];
if (!is_null($job)) {
$props['job'] = $job;
$props,
$limit,
$offset,
+ $order_by,
+ $order_direction,
$mode
);
$this->output = $sources;
const RPATH_PATTERN = '/^b2\d+$/';
+ /**
+ * Order directions.
+ */
+ const ORDER_DIRECTION_ASC = 'asc';
+ const ORDER_DIRECTION_DESC = 'desc';
+
public $job_types = array(
'B' => 'Backup',
'M' => 'Migrated',
}
return $jobid;
}
+
+ public function sortResultsByField(&$result, $order_by, $order_direction) {
+ $order_by = strtolower($order_by);
+ $order_direction = strtolower($order_direction);
+ $sort_by_func = function($a, $b) use ($order_by, $order_direction) {
+ $cmp = strnatcasecmp($a[$order_by], $b[$order_by]);
+ if ($order_direction === self::ORDER_DIRECTION_DESC) {
+ $cmp = -$cmp;
+ }
+ return $cmp;
+ };
+ usort($result, $sort_by_func);
+ }
}
?>