setPrimaryKey('id') ->setDefaultSort('inspection_templates.name', 'asc') ->setSortingPillsEnabled(false) ->setSecondaryHeaderEnabled() ->setAdditionalSelects([ 'inspection_templates.id as id', 'inspection_templates.fields as fields', ]); } /** Refrescar cuando el manager crea/edita/borra. */ #[On('templates-changed')] public function refreshRows(): void { // } public function builder(): Builder { abort_unless(Auth::user()->can('manage templates'), 403); return InspectionTemplate::query() ->withCount('projects'); } public function columns(): array { return [ Column::make('Plantilla', 'name') ->sortable()->searchable() ->secondaryHeaderFilter('name') ->format(fn ($value) => ''.e($value).'') ->html(), Column::make('Descripción', 'description') ->searchable() ->secondaryHeaderFilter('description') ->format(fn ($value) => $value ? ''.e($value).'' : '') ->html(), Column::make('Campos') ->label(fn ($row) => ''.count($row->fields ?? []).'') ->html(), Column::make('Proyectos') ->secondaryHeaderFilter('usage') ->label(function ($row) { $n = (int) ($row->projects_count ?? 0); $cls = $n > 0 ? 'badge-info' : 'badge-ghost'; return ''.$n.''; }) ->html(), Column::make('Acciones') ->label(fn ($row) => '
') ->html(), ]; } public function filters(): array { return [ TextFilter::make('Plantilla', 'name') ->config(['placeholder' => 'Buscar nombre…']) ->filter(fn (Builder $q, string $v) => $q->where('inspection_templates.name', 'like', '%'.$v.'%')), TextFilter::make('Descripción', 'description') ->config(['placeholder' => 'Buscar descripción…']) ->filter(fn (Builder $q, string $v) => $q->where('inspection_templates.description', 'like', '%'.$v.'%')), SelectFilter::make('Uso', 'usage') ->options(['' => 'Todos', 'used' => 'En uso (≥1 proyecto)', 'unused' => 'Sin uso']) ->filter(function (Builder $q, string $v) { if ($v === 'used') { $q->has('projects'); } if ($v === 'unused') { $q->doesntHave('projects'); } }), ]; } }