From 394c40e541e293d7ab34c37e2ed5f76966c95e36 Mon Sep 17 00:00:00 2001 From: Tony Murray Date: Mon, 14 Jan 2019 14:00:05 -0600 Subject: [PATCH] Implement filter helpers for ajax table controllers (#9660) Reduces boiler plate code. --- .../Controllers/PaginatedAjaxController.php | 33 +++++++++++++++++-- .../Controllers/Table/EventlogController.php | 20 +++++------ .../Controllers/Table/SyslogController.php | 31 ++++++++--------- .../Controllers/Table/TableController.php | 5 ++- 4 files changed, 58 insertions(+), 31 deletions(-) diff --git a/app/Http/Controllers/PaginatedAjaxController.php b/app/Http/Controllers/PaginatedAjaxController.php index 4de057b072..5fd2f86a9e 100644 --- a/app/Http/Controllers/PaginatedAjaxController.php +++ b/app/Http/Controllers/PaginatedAjaxController.php @@ -65,7 +65,7 @@ abstract class PaginatedAjaxController extends Controller } /** - * Defines search fields will be searched in order + * Defines search fields. They will be searched in order. * * @param \Illuminate\Http\Request $request * @return array @@ -76,6 +76,18 @@ abstract class PaginatedAjaxController extends Controller return []; } + /** + * Defines filter fields. Request and table fields must match. + * + * @param \Illuminate\Http\Request $request + * @return array + * @SuppressWarnings(PHPMD.UnusedFormalParameter) + */ + protected function filterFields($request) + { + return []; + } + /** * Format an item for display. Default is pass-through * @@ -88,7 +100,7 @@ abstract class PaginatedAjaxController extends Controller } /** - * @param string + * @param string $search * @param Builder $query * @param array $fields * @return Builder @@ -107,6 +119,23 @@ abstract class PaginatedAjaxController extends Controller return $query; } + /** + * @param Request $request + * @param Builder $query + * @param array $fields + */ + protected function filter($request, $query, $fields) + { + foreach ($fields as $target => $field) { + if ($value = $request->get($field)) { + if (is_string($target)) { + $query->where($target, $value); + } else { + $query->where($field, $value); + } + } + } + } /** * Validate the given request with the given rules. diff --git a/app/Http/Controllers/Table/EventlogController.php b/app/Http/Controllers/Table/EventlogController.php index 966ebaa63b..4f5e63be67 100644 --- a/app/Http/Controllers/Table/EventlogController.php +++ b/app/Http/Controllers/Table/EventlogController.php @@ -45,6 +45,14 @@ class EventlogController extends TableController return ['message']; } + protected function filterFields($request) + { + return [ + 'device_id' => 'device', + 'type' => 'eventtype', + ]; + } + /** * Defines the base query for this resource * @@ -53,17 +61,7 @@ class EventlogController extends TableController */ public function baseQuery($request) { - $query = Eventlog::hasAccess($request->user())->with('device'); - - if ($device_id = $request->get('device')) { - $query->where('device_id', $device_id); - } - - if ($type = $request->get('eventtype')) { - $query->where('type', $type); - } - - return $query; + return Eventlog::hasAccess($request->user())->with('device'); } public function formatItem($eventlog) diff --git a/app/Http/Controllers/Table/SyslogController.php b/app/Http/Controllers/Table/SyslogController.php index 0445e5ab9e..5f45b3ca03 100644 --- a/app/Http/Controllers/Table/SyslogController.php +++ b/app/Http/Controllers/Table/SyslogController.php @@ -30,11 +30,6 @@ use Illuminate\Database\Eloquent\Builder; class SyslogController extends TableController { - public function searchFields($request) - { - return ['msg']; - } - public function rules() { return [ @@ -46,6 +41,20 @@ class SyslogController extends TableController ]; } + public function searchFields($request) + { + return ['msg']; + } + + public function filterFields($request) + { + return [ + 'device_id' => 'device', + 'program' => 'program', + 'priority' => 'priority', + ]; + } + /** * Defines the base query for this resource * @@ -57,18 +66,6 @@ class SyslogController extends TableController /** @var Builder $query */ $query = Syslog::hasAccess($request->user())->with('device'); - if ($device_id = $request->get('device')) { - $query->where('device_id', $device_id); - } - - if ($program = $request->get('program')) { - $query->where('program', $program); - } - - if ($priority = $request->get('priority')) { - $query->where('priority', $priority); - } - if ($from = $request->get('from')) { $query->where('timestamp', '>=', $from); } diff --git a/app/Http/Controllers/Table/TableController.php b/app/Http/Controllers/Table/TableController.php index f00d92964a..ed8116b7ce 100644 --- a/app/Http/Controllers/Table/TableController.php +++ b/app/Http/Controllers/Table/TableController.php @@ -32,6 +32,8 @@ use Illuminate\Http\Request; abstract class TableController extends PaginatedAjaxController { + protected $default_sort = []; + final protected function baseRules() { return SimpleTableController::$base_rules; @@ -49,8 +51,9 @@ abstract class TableController extends PaginatedAjaxController $query = $this->baseQuery($request); $this->search($request->get('searchPhrase'), $query, $this->searchFields($request)); + $this->filter($request, $query, $this->filterFields($request)); - $sort = $request->get('sort', []); + $sort = $request->get('sort', $this->default_sort); foreach ($sort as $column => $direction) { $query->orderBy($column, $direction); }