diff --git a/src/StarterKits/Filament/Base/FilamentStarterKit.php b/src/StarterKits/Filament/Base/FilamentStarterKit.php index 03a3721..19927b0 100644 --- a/src/StarterKits/Filament/Base/FilamentStarterKit.php +++ b/src/StarterKits/Filament/Base/FilamentStarterKit.php @@ -2,14 +2,21 @@ namespace XtendPackages\RESTPresenter\StarterKits\Filament\Base; +use Filament\Forms\ComponentContainer; +use Filament\Forms\Components\Field; use Filament\Resources\Pages\ListRecords; -use Filament\Tables\Contracts\HasTable; +use Illuminate\Database\Eloquent\Model; +use Illuminate\Support\Collection; +use Illuminate\Support\Facades\Schema; use Illuminate\Support\Str; use Symfony\Component\Finder\SplFileInfo; use XtendPackages\RESTPresenter\Base\StarterKit; +use XtendPackages\RESTPresenter\Concerns\InteractsWithDbSchema; class FilamentStarterKit extends StarterKit { + use InteractsWithDbSchema; + protected array $resources = []; public function autoDiscover(): array @@ -31,20 +38,45 @@ protected function autoDiscoverResources(): void $table = $page->table( table: mock('Filament\Tables\Table')->makePartial(), ); + /** @var \Filament\Forms\Form $form */ - $form = $page->form( - form: mock('Filament\Forms\Form')->makePartial(), - ); + // $form = $page->form( + // form: mock('Filament\Forms\Form')->makePartial(), + // ); + $resourceNamespace = Str::of(get_class($page)) ->replace('App\\Filament\\', '') ->before('\\Pages') ->replaceLast('Resource', '') + ->plural() ->value(); + + // $fields = collect($form->getComponents()) + // ->filter(fn ($field) => is_subclass_of($field, Field::class)) + // ->map(fn ($field) => $field->getName()); + // @todo Merge validation rules from nested form fields + + $modelFields = $this->generateModelFields(resolve($page->getModel()))->keyBy('name'); + $tableColumns = collect(['id' => 'integer'])->merge(collect($table->getColumns()))->keys()->values(); + $fields = $tableColumns->intersect($modelFields->keys())->mapWithKeys( + fn ($column) => [$column => $modelFields[$column]], + )->merge($modelFields); + $this->resources[$resourceNamespace] = [ 'columns' => collect($table->getColumns())->keys(), - 'fields' => $form->getComponents(), + 'fields' => $fields->toArray(), 'model' => $page->getModel(), ]; }); } + + protected function generateModelFields(Model $model): Collection + { + $table = $model->getTable(); + + return $this->getTableColumns( + table: $table, + withProperties: true, + ); + } }