setPrimaryKey('id') ->setDefaultSort('name', 'asc') ->setSortingPillsEnabled(false) ->setSecondaryHeaderEnabled() ->setAdditionalSelects(['features.id as id', 'features.layer_id as layer_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 Feature::query() ->whereHas('layer.phase', fn ($q) => $q->where('project_id', $this->projectId)) ->with(['layer.phase']); } public function columns(): array { return [ Column::make('Elemento', 'name') ->sortable() ->searchable() ->secondaryHeaderFilter('name') ->format(fn ($value) => '' . e($value) . '') ->html(), Column::make('Capa') ->secondaryHeaderFilter('layer') ->label(fn ($row) => e($row->layer?->name ?? '—')), Column::make('Fase') ->secondaryHeaderFilter('phase') ->label(fn ($row) => e($row->layer?->phase?->name ?? '—')), Column::make('Progreso', 'progress') ->sortable() ->format(function ($value) { $cls = $value >= 100 ? 'badge-success' : ($value > 0 ? 'badge-warning' : 'badge-ghost'); return '' . (int) $value . '%'; }) ->html(), Column::make('Acciones') ->label(fn ($row) => '
') ->html(), ]; } public function filters(): array { $layers = Layer::whereHas('phase', fn ($q) => $q->where('project_id', $this->projectId)) ->orderBy('name')->pluck('name', 'id')->toArray(); $phases = Phase::where('project_id', $this->projectId) ->orderBy('order')->pluck('name', 'id')->toArray(); return [ TextFilter::make('Elemento', 'name') ->config(['placeholder' => 'Buscar elemento…']) ->filter(fn (Builder $query, string $value) => $query->where('features.name', 'like', '%' . $value . '%')), SelectFilter::make('Capa', 'layer') ->options(['' => 'Todas'] + $layers) ->filter(fn (Builder $query, string $value) => $query->where('features.layer_id', $value)), SelectFilter::make('Fase', 'phase') ->options(['' => 'Todas'] + $phases) ->filter(fn (Builder $query, string $value) => $query->whereHas('layer', fn ($l) => $l->where('phase_id', $value))), ]; } }