From e7399c312f9f653fb0659ff7907ad50dcc526f4d Mon Sep 17 00:00:00 2001 From: Johannes Meyer Date: Fri, 4 Dec 2015 07:44:55 +0100 Subject: [PATCH] SortBox: Add support for sort defaults provided by the controller action --- library/Icinga/Web/Controller.php | 11 ++-- library/Icinga/Web/Widget/SortBox.php | 78 +++++++++++++++++---------- 2 files changed, 56 insertions(+), 33 deletions(-) diff --git a/library/Icinga/Web/Controller.php b/library/Icinga/Web/Controller.php index ca6cb7e23..e955a3dae 100644 --- a/library/Icinga/Web/Controller.php +++ b/library/Icinga/Web/Controller.php @@ -100,16 +100,17 @@ class Controller extends ModuleActionController * * The widget is set on the `sortBox' view property only if the current view has not been requested as compact * - * @param array $columns An array containing the sort columns, with the - * submit value as the key and the label as the value - * @param Sortable $query Query to apply the user chosen sort rules on + * @param array $columns An array containing the sort columns, with the + * submit value as the key and the label as the value + * @param Sortable $query Query to apply the user chosen sort rules on + * @param array $defaults An array containing default sort directions for specific columns * * @return $this */ - protected function setupSortControl(array $columns, Sortable $query = null) + protected function setupSortControl(array $columns, Sortable $query = null, array $defaults = null) { $request = $this->getRequest(); - $sortBox = SortBox::create('sortbox-' . $request->getActionName(), $columns); + $sortBox = SortBox::create('sortbox-' . $request->getActionName(), $columns, $defaults); $sortBox->setRequest($request); if ($query) { diff --git a/library/Icinga/Web/Widget/SortBox.php b/library/Icinga/Web/Widget/SortBox.php index deb95244d..edeafc3b5 100644 --- a/library/Icinga/Web/Widget/SortBox.php +++ b/library/Icinga/Web/Widget/SortBox.php @@ -33,6 +33,15 @@ class SortBox extends AbstractWidget */ protected $sortFields; + /** + * An array containing default sort directions for specific columns + * + * The first entry will be used as default sort column. + * + * @var array + */ + protected $sortDefaults; + /** * The name used to uniquely identfy the forms being created * @@ -59,11 +68,13 @@ class SortBox extends AbstractWidget * * @param string $name The name for the SortBox * @param array $sortFields An array containing the columns and their labels to be displayed in the SortBox + * @param array $sortDefaults An array containing default sort directions for specific columns */ - public function __construct($name, array $sortFields) + public function __construct($name, array $sortFields, array $sortDefaults = null) { $this->name = $name; $this->sortFields = $sortFields; + $this->sortDefaults = $sortDefaults; } /** @@ -71,12 +82,13 @@ class SortBox extends AbstractWidget * * @param string $name The name for the SortBox * @param array $sortFields An array containing the columns and their labels to be displayed in the SortBox + * @param array $sortDefaults An array containing default sort directions for specific columns * * @return SortBox */ - public static function create($name, array $sortFields) + public static function create($name, array $sortFields, array $sortDefaults = null) { - return new static($name, $sortFields); + return new static($name, $sortFields, $sortDefaults); } /** @@ -105,30 +117,6 @@ class SortBox extends AbstractWidget return $this; } - /** - * Apply the sort rules from the given or current request on the query - * - * @param Request $request - * - * @return $this - */ - public function handleRequest(Request $request = null) - { - if ($this->query !== null) { - if ($request === null) { - $request = Icinga::app()->getRequest(); - } - if (! ($sort = $request->getParam('sort'))) { - list($sort, $dir) = $this->getSortDefaults(); - } else { - list($_, $dir) = $this->getSortDefaults($sort); - } - $this->query->order($sort, $request->getParam('dir', $dir)); - } - - return $this; - } - /** * Return the default sort rule for the query * @@ -139,7 +127,14 @@ class SortBox extends AbstractWidget protected function getSortDefaults($column = null) { $direction = null; - if ($this->query !== null && $this->query instanceof SortRules) { + if (! empty($this->sortDefaults) && ($column === null || isset($this->sortDefaults[$column]))) { + if ($column === null) { + reset($this->sortDefaults); + $column = key($this->sortDefaults); + } + + $direction = $this->sortDefaults[$column]; + } elseif ($this->query !== null && $this->query instanceof SortRules) { $sortRules = $this->query->getSortRules(); if ($column === null) { $column = key($sortRules); @@ -152,9 +147,36 @@ class SortBox extends AbstractWidget reset($this->sortFields); $column = key($this->sortFields); } + return array($column, $direction); } + /** + * Apply the sort rules from the given or current request on the query + * + * @param Request $request + * + * @return $this + */ + public function handleRequest(Request $request = null) + { + if ($this->query !== null) { + if ($request === null) { + $request = Icinga::app()->getRequest(); + } + + if (! ($sort = $request->getParam('sort'))) { + list($sort, $dir) = $this->getSortDefaults(); + } else { + list($_, $dir) = $this->getSortDefaults($sort); + } + + $this->query->order($sort, $request->getParam('dir', $dir)); + } + + return $this; + } + /** * Render this SortBox as HTML *