. * * @link https://www.librenms.org * * @copyright 2018 Tony Murray * @author Tony Murray */ namespace App\Http\Controllers\Select; use App\Http\Controllers\PaginatedAjaxController; use Illuminate\Contracts\Pagination\Paginator; use Illuminate\Database\Eloquent\Model; use Illuminate\Http\Request; use Illuminate\Support\Str; abstract class SelectController extends PaginatedAjaxController { final protected function baseRules() { return [ 'limit' => 'int', 'page' => 'int', 'term' => 'nullable|string', ]; } /** * The default method called by the route handler * * @param \Illuminate\Http\Request $request * @return \Illuminate\Http\JsonResponse */ public function __invoke(Request $request) { $this->validate($request, $this->rules()); $limit = $request->get('limit', 50); $query = $this->baseQuery($request)->when($request->has('id'), function ($query) { return $query->whereKey(request('id')); }); $query = $this->search($request->get('term'), $query, $this->searchFields($request)); $this->sort($request, $query); $paginator = $query->simplePaginate($limit); return $this->formatResponse($paginator); } /** * @param Paginator $paginator * @return \Illuminate\Http\JsonResponse */ protected function formatResponse($paginator) { return response()->json([ 'results' => collect($paginator->items())->map([$this, 'formatItem']), 'pagination' => ['more' => $paginator->hasMorePages()], ]); } /** * Default item formatting, should supply at least id and text keys * Check select2 docs. * Default implementation uses primary key and the first value in the model * If only one value is in the model attributes, that is the id and text. * * @param Model $model * @return array */ public function formatItem($model) { $attributes = collect($model->getAttributes()); return [ 'id' => $attributes->count() == 1 ? $attributes->first() : $model->getKey(), 'text' => $attributes->forget($model->getKeyName())->first(), ]; } protected function includeGeneral(): bool { if (request()->has('id') && request('id') !== 0) { return false; } elseif (request()->has('term') && ! Str::contains('general', strtolower(request('term')))) { return false; } return true; } }