Implement filter helpers for ajax table controllers (#9660)

Reduces boiler plate code.
This commit is contained in:
Tony Murray 2019-01-14 14:00:05 -06:00 committed by GitHub
parent 33c886247c
commit 394c40e541
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 58 additions and 31 deletions

View File

@ -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.

View File

@ -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)

View File

@ -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);
}

View File

@ -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);
}