From d512bc895a00caa3e494d93de6b7dd441e4f4a9e Mon Sep 17 00:00:00 2001 From: Eduardo Ribeiro Date: Sat, 20 Dec 2025 18:21:58 -0400 Subject: [PATCH] fix: table search functionality in Board --- src/BoardResourcePage.php | 4 ++++ src/Concerns/CanSearchBoardRecords.php | 7 +++++-- src/Concerns/HasBoardRecords.php | 7 +++++++ 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/BoardResourcePage.php b/src/BoardResourcePage.php index 464e7fd..ee181ff 100644 --- a/src/BoardResourcePage.php +++ b/src/BoardResourcePage.php @@ -9,6 +9,7 @@ use Filament\Actions\Exceptions\ActionNotResolvableException; use Filament\Forms\Contracts\HasForms; use Filament\Resources\Pages\Page; +use Livewire\Attributes\Url; use Relaticle\Flowforge\Concerns\BaseBoard; use Relaticle\Flowforge\Contracts\HasBoard; @@ -25,6 +26,9 @@ abstract class BoardResourcePage extends Page implements HasActions, HasBoard, H { use BaseBoard; + #[Url(as: 'search')] + public $tableSearch = ''; + protected string $view = 'flowforge::filament.pages.board-page'; /** diff --git a/src/Concerns/CanSearchBoardRecords.php b/src/Concerns/CanSearchBoardRecords.php index 07d3080..a621ef4 100644 --- a/src/Concerns/CanSearchBoardRecords.php +++ b/src/Concerns/CanSearchBoardRecords.php @@ -18,9 +18,12 @@ trait CanSearchBoardRecords /** * Make the board searchable. */ - public function searchable(array | Closure $fields = []): static + public function searchable(string | array | Closure $fields = []): static { - $this->searchableFields = $this->evaluate($fields); + // Ensure fields is an array + $searchableFields = is_string($fields) ? [$fields] : $fields; + + $this->searchableFields = $this->evaluate($searchableFields); $this->isSearchable = true; return $this; diff --git a/src/Concerns/HasBoardRecords.php b/src/Concerns/HasBoardRecords.php index 9188f2b..92dd732 100644 --- a/src/Concerns/HasBoardRecords.php +++ b/src/Concerns/HasBoardRecords.php @@ -81,6 +81,13 @@ public function getBoardRecords(string $columnId): Collection $queryClone = (clone $baseQuery)->where($statusField, $columnId); } + // Apply search + if ($livewire->hasTableSearch()) { + $queryClone->where(function ($q) use (&$livewire) { + return $q->whereAny($this->getSearchableFields(), 'LIKE', '%' . $livewire->getTableSearch() . '%'); + }); + } + $positionField = $this->getPositionIdentifierAttribute(); if ($positionField && $this->modelHasColumn($queryClone->getModel(), $positionField)) {