setPrimaryKey('id') ->setDefaultSort('created_at', 'desc') ->setSortingPillsEnabled(false) ->setAdditionalSelects(['projects.id as id', 'projects.created_at as created_at']); } public function builder(): Builder { return Project::accessibleBy(Auth::user()) ->with('phases'); } public function columns(): array { return [ Column::make('Referencia', 'reference') ->sortable() ->searchable() ->format(function ($value, $row) { $url = route('projects.dashboard', $row->id); return $value ? ''.e($value).'' : ''; }) ->html(), Column::make(__('Name'), 'name') ->sortable() ->searchable(), Column::make(__('Address'), 'address') ->sortable() ->searchable() ->format(fn ($value) => $value ? ''.e($value).'' : '') ->html(), Column::make(__('Status'), 'status') ->sortable() ->format(function ($value) { $map = [ 'planning' => ['badge-ghost', 'Planificación'], 'in_progress' => ['badge-primary', 'En progreso'], 'paused' => ['badge-warning', 'Pausado'], 'completed' => ['badge-success', 'Completado'], ]; [$cls, $label] = $map[$value] ?? ['badge-ghost', ucfirst($value)]; return ''.$label.''; }) ->html(), Column::make(__('Progress')) ->label(function ($row) { $avg = $row->phases->avg('progress_percent') ?? 0; $pct = round($avg); return '
'.$pct.'%
'; }) ->html(), Column::make(__('Start Date'), 'start_date') ->sortable() ->format(fn ($value) => $value ? $value->format('d/m/Y') : '—'), Column::make(__('Est. End'), 'end_date_estimated') ->sortable() ->format(fn ($value) => $value ? $value->format('d/m/Y') : '—'), Column::make(__('Actions')) ->label(function ($row) { $dashboard = route('projects.dashboard', $row->id); $map = route('projects.map', $row->id); $edit = route('projects.edit', $row->id); $canEdit = Auth::user()->can('edit projects'); $html = '
'; $html .= ' '; $html .= ' '; if ($canEdit) { $html .= ' '; } $html .= '
'; return $html; }) ->html(), ]; } public function filters(): array { return []; } }