setPrimaryKey('id') ->setDefaultSort('inspections.created_at', 'desc') ->setSortingPillsEnabled(false) ->setSecondaryHeaderEnabled() ->setAdditionalSelects([ 'inspections.id as id', 'inspections.created_at as created_at', 'inspections.feature_id as feature_id', 'inspections.template_id as template_id', 'inspections.user_id as user_id', ]); } public function builder(): Builder { $user = Auth::user(); abort_unless( $user->can('manage all') || Project::whereKey($this->projectId)->whereHas('users', fn ($q) => $q->where('user_id', $user->id))->exists(), 403 ); return Inspection::query() ->where('inspections.project_id', $this->projectId) ->with(['feature', 'template', 'user', 'media']); } public function columns(): array { return [ Column::make('Fecha', 'created_at') ->sortable() ->secondaryHeaderFilter('fecha') ->format(fn ($value, $row) => $row->created_at?->format('d/m/Y') ?? '—'), Column::make('Elemento') ->secondaryHeaderFilter('elemento') ->label(fn ($row) => $row->feature?->name ? ''.e($row->feature->name).'' : '') ->html(), Column::make('Plantilla') ->label(fn ($row) => e($row->template?->name ?? '—')), Column::make('Resultado', 'result') ->sortable() ->secondaryHeaderFilter('resultado') ->format(fn ($value) => $value ? ''.e($value).'' : '') ->html(), Column::make('Usuario') ->secondaryHeaderFilter('usuario') ->label(fn ($row) => e($row->user?->name ?? '—')), Column::make('Fotos') ->label(fn ($row) => $this->renderPhotosColumn($row)) ->html(), Column::make('Acciones') ->label(fn ($row) => '
' .'' .'@can("edit inspections")' .'' .'@endcan' .'@can("delete inspections")' .'' .'@endcan' .'
') ->html(), ]; } private function renderPhotosColumn($row): string { $images = $row->media->where('category', 'image')->values(); $count = $images->count(); if ($count === 0) { return ''; } $thumbnails = $images->take(3)->map(fn ($m) => '' .''.e($m->name).'' .'' )->implode(''); $more = $count > 3 ? '+'.($count - 3).'' : ''; return '
'.$thumbnails.$more.'
'; } public function filters(): array { $results = Inspection::where('project_id', $this->projectId) ->whereNotNull('result')->distinct()->orderBy('result') ->pluck('result', 'result')->toArray(); $users = User::whereIn('id', Inspection::where('project_id', $this->projectId) ->whereNotNull('user_id')->distinct()->pluck('user_id')) ->orderBy('name')->pluck('name', 'id')->toArray(); return [ DateFilter::make('Fecha', 'fecha') ->filter(fn (Builder $query, string $value) => $query->whereDate('inspections.created_at', $value)), TextFilter::make('Elemento', 'elemento') ->config(['placeholder' => 'Buscar elemento…']) ->filter(fn (Builder $query, string $value) => $query->whereHas('feature', fn ($f) => $f->where('name', 'like', '%'.$value.'%'))), SelectFilter::make('Resultado', 'resultado') ->options(['' => 'Todos'] + $results) ->filter(fn (Builder $query, string $value) => $query->where('inspections.result', $value)), SelectFilter::make('Usuario', 'usuario') ->options(['' => 'Todos'] + $users) ->filter(fn (Builder $query, string $value) => $query->where('inspections.user_id', $value)), ]; } }