From 0f1aa2c38e0056178731cb4fddf767d1a53996b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Javier=20Bra=C3=B1a?= Date: Wed, 27 May 2026 13:38:23 +0200 Subject: [PATCH] feat: Update ProjectTable with ID column, improved actions buttons, and modern column configuration --- app/Livewire/ProjectTable.php | 97 +++++++++++++++++++++++++---------- 1 file changed, 69 insertions(+), 28 deletions(-) diff --git a/app/Livewire/ProjectTable.php b/app/Livewire/ProjectTable.php index 387240d..8c564d0 100644 --- a/app/Livewire/ProjectTable.php +++ b/app/Livewire/ProjectTable.php @@ -4,6 +4,9 @@ namespace App\Livewire; use Rappasoft\LaravelLivewireTables\DataTableComponent; use Rappasoft\LaravelLivewireTables\Views\Column; +use Rappasoft\LaravelLivewireTables\Views\Columns\{BooleanColumn, ButtonGroupColumn, LinkColumn, ImageColumn}; +use Rappasoft\LaravelLivewireTables\Views\Filters\{DateFilter, MultiSelectFilter, SelectFilter}; + use App\Models\Project; class ProjectTable extends DataTableComponent @@ -14,53 +17,91 @@ class ProjectTable extends DataTableComponent { $this->setPrimaryKey('id') ->setDefaultSort('created_at', 'desc') - ->setTableAttributes(['class' => 'table-auto w-full']) - ->setThAttributes(['class' => 'px-4 py-2 text-left text-xs font-medium text-gray-500 uppercase tracking-wider']) - ->setTdAttributes(['class' => 'px-4 py-2 whitespace-nowrap text-sm text-gray-900']); + ->setTableAttributes(['class' => 'table-auto w-full']); + + $this->setThAttributes(function(Column $column) { + return ['class' => 'px-4 py-2 text-left text-xs font-medium text-gray-500 uppercase tracking-wider']; + }); + + $this->setTdAttributes(function(Column $column) { + return ['class' => 'px-4 py-2 whitespace-nowrap text-sm text-gray-900']; + }); } public function columns(): array { return [ + Column::make(__('ID'), 'id') + ->sortable() + ->searchable(), + Column::make(__('Project Name'), 'name') ->sortable() ->searchable(), + Column::make(__('Address'), 'address') ->sortable() ->searchable(), + Column::make(__('Status'), 'status') - ->sortable() - ->filterable([ - 'planning' => __('Planning'), - 'in_progress' => __('In progress'), - 'paused' => __('Paused'), - 'completed' => __('Completed'), - ]) - ->label(fn ($value, $row, $column) => - match ($value) { - 'planning' => ''.__('Planning').'', - 'in_progress' => ''.__('In progress').'', - 'paused' => ''.__('Paused').'', - 'completed' => ''.__('Completed').'', - default => $value - } - ), + ->sortable(), + Column::make(__('Start Date'), 'start_date') ->sortable() ->format(fn ($value, $row, $column) => $value ? $value->format('Y-m-d') : ''), + Column::make(__('Estimated End Date'), 'end_date_estimated') ->sortable() ->format(fn ($value, $row, $column) => $value ? $value->format('Y-m-d') : ''), + Column::make(__('Actions')) - ->label(fn ($row) => '
- '.__('Edit').' -
- '.csrf_field().' - - -
-
') - ->htmlAttribute(['class' => 'text-right']), + ->label(function ($row) { + $confirm = __('Are you sure you want to delete this project?'); + + return ' +
+ '.__('Edit').' +
+ '.csrf_field().' + + +
+
'; + }) + ->html(), + + ButtonGroupColumn::make(__('Actions')) + ->attributes(function($row) { + return [ + 'class' => 'space-x-2', + ]; + }) + ->buttons([ + LinkColumn::make('Edit') + ->title(fn($row) => __('Edit')) + ->location(fn($row) => route('projects.edit', $row->id)) + ->attributes(function($row) { + return [ + 'target' => '_blank', + 'class' => 'text-blue-500 hover:underline', + ]; + }), + + LinkColumn::make('View') // make() has no effect in this case but needs to be set anyway + ->title(fn($row) => __('View')) + ->location(fn($row) => route('projects.map', $row->id)) + ->attributes(function($row) { + return [ + 'class' => 'text-blue-500 hover:underline', + ]; + }), + + ]), ]; } + + public function filters(): array + { + return []; + } } \ No newline at end of file