. * * @link https://www.librenms.org * @copyright 2018 Tony Murray * @author Tony Murray */ namespace App\Http\Controllers\Table; use App\Http\Controllers\PaginatedAjaxController; use Illuminate\Contracts\Pagination\LengthAwarePaginator; use Illuminate\Database\Eloquent\Builder; use Illuminate\Http\Request; abstract class TableController extends PaginatedAjaxController { protected $model; protected function sortFields($request) { if (isset($this->model)) { $fields = \Schema::getColumnListing((new $this->model)->getTable()); return array_combine($fields, $fields); } return []; } final protected function baseRules() { return SimpleTableController::$base_rules; } /** * @param Request $request * @return \Illuminate\Http\JsonResponse */ public function __invoke(Request $request) { $this->validate($request, $this->rules()); /** @var Builder $query */ $query = $this->baseQuery($request); $this->search($request->get('searchPhrase'), $query, $this->searchFields($request)); $this->filter($request, $query, $this->filterFields($request)); $this->sort($request, $query); $limit = $request->get('rowCount', 25); $page = $request->get('current', 1); if ($limit < 0) { $limit = $query->count(); $page = null; } $paginator = $query->paginate($limit, ['*'], 'page', $page); return $this->formatResponse($paginator); } /** * @param LengthAwarePaginator $paginator * @return \Illuminate\Http\JsonResponse */ protected function formatResponse($paginator) { return response()->json([ 'current' => $paginator->currentPage(), 'rowCount' => $paginator->count(), 'rows' => collect($paginator->items())->map([$this, 'formatItem']), 'total' => $paginator->total(), ]); } }