From 3d29243cf06523264e52834926c1e20a287786bd Mon Sep 17 00:00:00 2001 From: Boy132 Date: Tue, 18 Mar 2025 17:35:36 +0100 Subject: [PATCH] Add tag filter to lists (#1124) --- .../Resources/EggResource/Pages/ListEggs.php | 5 ++ .../NodeResource/Pages/ListNodes.php | 5 ++ .../Components/Tables/Filters/TagsFilter.php | 57 +++++++++++++++++++ 3 files changed, 67 insertions(+) create mode 100644 app/Filament/Components/Tables/Filters/TagsFilter.php diff --git a/app/Filament/Admin/Resources/EggResource/Pages/ListEggs.php b/app/Filament/Admin/Resources/EggResource/Pages/ListEggs.php index 088b2406b..9a6095b57 100644 --- a/app/Filament/Admin/Resources/EggResource/Pages/ListEggs.php +++ b/app/Filament/Admin/Resources/EggResource/Pages/ListEggs.php @@ -7,6 +7,7 @@ use App\Filament\Components\Actions\ImportEggAction as ImportEggHeaderAction; use App\Filament\Components\Tables\Actions\ExportEggAction; use App\Filament\Components\Tables\Actions\ImportEggAction; use App\Filament\Components\Tables\Actions\UpdateEggAction; +use App\Filament\Components\Tables\Filters\TagsFilter; use App\Models\Egg; use Filament\Actions\CreateAction as CreateHeaderAction; use Filament\Resources\Pages\ListRecords; @@ -77,6 +78,10 @@ class ListEggs extends ListRecords CreateAction::make(), ImportEggAction::make() ->multiple(), + ]) + ->filters([ + TagsFilter::make() + ->model(Egg::class), ]); } diff --git a/app/Filament/Admin/Resources/NodeResource/Pages/ListNodes.php b/app/Filament/Admin/Resources/NodeResource/Pages/ListNodes.php index 957902ca0..7b0b57004 100644 --- a/app/Filament/Admin/Resources/NodeResource/Pages/ListNodes.php +++ b/app/Filament/Admin/Resources/NodeResource/Pages/ListNodes.php @@ -4,6 +4,7 @@ namespace App\Filament\Admin\Resources\NodeResource\Pages; use App\Filament\Admin\Resources\NodeResource; use App\Filament\Components\Tables\Columns\NodeHealthColumn; +use App\Filament\Components\Tables\Filters\TagsFilter; use App\Models\Node; use Filament\Actions; use Filament\Resources\Pages\ListRecords; @@ -65,6 +66,10 @@ class ListNodes extends ListRecords ->emptyStateHeading(trans('admin/node.no_nodes')) ->emptyStateActions([ CreateAction::make(), + ]) + ->filters([ + TagsFilter::make() + ->model(Node::class), ]); } diff --git a/app/Filament/Components/Tables/Filters/TagsFilter.php b/app/Filament/Components/Tables/Filters/TagsFilter.php new file mode 100644 index 000000000..2eef04e44 --- /dev/null +++ b/app/Filament/Components/Tables/Filters/TagsFilter.php @@ -0,0 +1,57 @@ +query(fn (Builder $query, array $data) => $query->when($data['tag'], fn (Builder $query, $tag) => $query->whereJsonContains('tags', $tag))); + + $this->indicateUsing(fn (array $data) => $data['tag'] ? 'Tag: ' . $data['tag'] : null); + + $this->resetState(['tag' => null]); + + $this->visible(fn () => $this->getTags()->count() > 0); + } + + private function getTags(): Collection + { + return $this->getModel()::query()->pluck('tags')->flatten()->unique(); + } + + public function getFormField(): Field + { + return Select::make('tag') + ->preload() + ->searchable() + ->options(fn () => $this->getTags()->mapWithKeys(fn ($tag) => [$tag => $tag])); + } + + public function model(string $model): static + { + $this->model = $model; + + return $this; + } + + public function getModel(): string + { + return $this->model; + } +}