From e744b8d67ef1d18050158dd523ba7d804c1c8528 Mon Sep 17 00:00:00 2001
From: Sam Light <samlight1994@gmail.com>
Date: Sun, 30 Mar 2025 14:20:57 +0100
Subject: Filters, sorting, escaping and more....

---
 workbench/app/Livewire/ProductsTable.php | 36 +++++++++++++++++++++++---------
 1 file changed, 26 insertions(+), 10 deletions(-)

(limited to 'workbench/app/Livewire')

diff --git a/workbench/app/Livewire/ProductsTable.php b/workbench/app/Livewire/ProductsTable.php
index c5a0f61..9717b5d 100644
--- a/workbench/app/Livewire/ProductsTable.php
+++ b/workbench/app/Livewire/ProductsTable.php
@@ -3,12 +3,14 @@
 namespace Workbench\App\Livewire;
 
 use Workbench\App\Models\Product;
+use Workbench\App\Models\Category;
 
 use Lightscale\LaralightTables\Columns\Column;
 use Lightscale\LaralightTables\Toolbar;
 use Lightscale\LaralightTables\Toolbar\Search;
 use Lightscale\LaralightTables\Toolbar\PageSize;
 use Lightscale\LaralightTables\Toolbar\ColumnSelect;
+use Lightscale\LaralightTables\Toolbar\SelectFilter;
 
 use Illuminate\Database\Eloquent\Builder;
 
@@ -18,12 +20,21 @@ class ProductsTable extends Table
 
     public function toolbar(): Toolbar
     {
-        return parent::toolbar()
-            ->addStartItem(new Search())
-            ->addEndItem(new PageSize())
-            ->addEndItem(new ColumnSelect());
+        $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;
+        return parent::toolbar()
+            ->addStartItem(Search::make())
+            ->addStartItem($categoryFilter)
+            ->addEndItem(PageSize::make())
+            ->addEndItem(ColumnSelect::make());
     }
 
     public function query(): Builder
@@ -40,12 +51,17 @@ class ProductsTable extends Table
     public function columns(): array
     {
         return [
-            Column::make('id', 'ID'),
-            Column::make('name', 'Name'),
-            Column::make('category.name', 'Category')
+            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'),
-            Column::make('stock', 'Stock'),
+            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)),
         ];
     }
 }
-- 
cgit v1.2.3