From ab4c2a1d1dedaf16c2961e98d517f11575a910df Mon Sep 17 00:00:00 2001 From: dmason30 Date: Fri, 6 Jun 2025 17:38:03 +0100 Subject: [PATCH] Attempt to describe filter forms and handle form filters --- src/DescribeFilamentResourceTool.php | 21 ++++++++++++++--- src/GetFilamentResourceDataTool.php | 34 ++++++++++++++++++++-------- 2 files changed, 43 insertions(+), 12 deletions(-) diff --git a/src/DescribeFilamentResourceTool.php b/src/DescribeFilamentResourceTool.php index ed367df..b536b3b 100644 --- a/src/DescribeFilamentResourceTool.php +++ b/src/DescribeFilamentResourceTool.php @@ -217,14 +217,14 @@ public function mapFilterType(BaseFilter $filter): string }; } - public function mapFormComponent(Component $component, Resource $resource): ?array + public function mapFormComponent(Component $component, ?Resource $resource = null): ?array { $baseInfo = [ 'name' => $component->getName(), 'type' => $this->mapComponentType($component), 'label' => $component->getLabel(), 'required' => method_exists($component, 'isRequired') ? $component->isRequired() : null, - 'disabled' => method_exists($component, 'isDisabled') ? $component->isDisabled() : null, + // 'disabled' => method_exists($component, 'isDisabled') ? $component->isDisabled() : null, // Needs container to be instantiated // 'nullable' => method_exists($component, 'isNullable') ? $component->isNullable() : null, // Needs checking validation rules ]; @@ -232,7 +232,7 @@ public function mapFormComponent(Component $component, Resource $resource): ?arr $baseInfo['maxLength'] = $component->getMaxLength(); } - if ($component instanceof Select && $component->getRelationshipName()) { + if ($resource && $component instanceof Select && $component->getRelationshipName()) { $modelClass = $resource::getModel(); $modelInstance = app($modelClass); $relationshipDefinition = $modelInstance->{$component->getRelationshipName()}(); @@ -293,6 +293,21 @@ public function mapTableFilter(BaseFilter $filter): array $baseInfo['optionsSource'] = $options; } } + + if ($filter->hasFormSchema()) { + /** @var Component $component */ + $fields = collect($filter->getFormSchema()) + ->reject(fn (Component $component) => $component instanceof Grid || $component instanceof Fieldset) + ->map(fn (Component $component) => $this->mapFormComponent($component)) + ->filter() + ->values() + ->all(); + + if ($fields) { + $baseInfo['fields'] = $fields; + } + } + // Add more specific filter type mappings here if needed return $baseInfo; diff --git a/src/GetFilamentResourceDataTool.php b/src/GetFilamentResourceDataTool.php index 08ae58c..e1a3b5b 100644 --- a/src/GetFilamentResourceDataTool.php +++ b/src/GetFilamentResourceDataTool.php @@ -4,6 +4,8 @@ use Exception; use Filament\Tables\Columns\Column; +use Filament\Tables\Concerns\InteractsWithTable; +use Filament\Tables\Filters\SelectFilter; use Illuminate\Database\Eloquent\Model; use Illuminate\Support\Facades\Log; use JsonException; @@ -32,6 +34,8 @@ public function build(): PrismTool try { $listPageClass = $resource::getPages()['index']; $component = $listPageClass->getPage(); + + /** @var InteractsWithTable $listPage */ $listPage = new $component; $listPage->bootedInteractsWithTable(); $table = $listPage->getTable(); @@ -44,17 +48,29 @@ public function build(): PrismTool $listPage->tableSearch = $filters[$column->getName()]; }); + $listPage->resetTableFiltersForm(); + foreach ($listPage->getTable()->getFilters() as $filter) { - if (method_exists($filter, 'isMultiple') && $filter->isMultiple()) { - $listPage->tableFilters[$filter->getName()] = [ - 'values' => isset($filters[$filter->getName()]) - ? (array) $filters[$filter->getName()] - : null, - ]; + $value = $filters[$filter->getName()] ?? null; + + if (blank($value)) { + continue; + } + + if ($filter instanceof SelectFilter) { + if (method_exists($filter, 'isMultiple') && $filter->isMultiple()) { + $listPage->tableFilters[$filter->getName()] = [ + 'values' => isset($filters[$filter->getName()]) + ? (array) $filters[$filter->getName()] + : null, + ]; + } else { + $listPage->tableFilters[$filter->getName()] = [ + 'value' => $filters[$filter->getName()] ?? null, + ]; + } } else { - $listPage->tableFilters[$filter->getName()] = [ - 'value' => $filters[$filter->getName()] ?? null, - ]; + $listPage->tableFilters[$filter->getName()] = $value; } }