*/ class ProductsTable extends Table { protected $model = Product::class; protected string $tableClass = 'table mb-0'; public function toolbars(): array { $categoryFilter = SelectFilter::make('category') ->placeholder(__('Filter category')) ->options(Category::pluck('name', 'id')) ->filter( fn (Builder $q, string $value) => $q->whereHas( 'category', fn (Builder $q) => $q->where('id', $value) ) ); return [ Toolbar::make($this) ->appendStart(Search::make()) ->appendStart($categoryFilter) ->appendEnd(PageSize::make()) ->appendEnd(ColumnSelect::make()), ]; } public function query(): Builder { return parent::query() ->with('category'); } protected function search(Builder $q, string $s): void { $q->search($s); } public function columns(): array { return [ Column::make('id', 'ID') ->sortable(fn (Builder $q, string $dir) => $q->orderBy('id', $dir)), Column::make('name', 'Name') ->sortable(fn (Builder $q, string $dir) => $q->orderBy('name', $dir)), Column::make('category_name', 'Category') ->slot(fn ($r) => $r->category->name), Column::make('price', 'Price') ->sortable(fn (Builder $q, string $dir) => $q->orderBy('price', $dir)) ->slot(fn ($r, $c) => "£{$r->{$c->name}}"), Column::make('stock', 'Stock') ->sortable(fn (Builder $q, string $dir) => $q->orderBy('stock', $dir)), ]; } public function wrapperComponent(string $location): array { return match ($location) { 'table' => ['table.card-table', ['title' => 'Products']], 'pagination' => ['table.card-pagination'], default => parent::wrapperComponent($location), }; } }