diff --git a/src/Filament/Integration/Builders/BaseBuilder.php b/src/Filament/Integration/Builders/BaseBuilder.php index 99dccc0..c31f6ba 100644 --- a/src/Filament/Integration/Builders/BaseBuilder.php +++ b/src/Filament/Integration/Builders/BaseBuilder.php @@ -19,6 +19,8 @@ abstract class BaseBuilder { protected Model&HasCustomFields $model; + protected Model|string|null $explicitModel = null; + protected Builder $sections; protected array $except = []; @@ -52,6 +54,7 @@ public function forModel(Model|string $model): static } $this->model = $model; + $this->explicitModel = $model; $this->sections = CustomFields::newSectionModel()->query() ->forEntityType($model::class) diff --git a/src/Filament/Integration/Builders/FormBuilder.php b/src/Filament/Integration/Builders/FormBuilder.php index 919cc43..dbc6726 100644 --- a/src/Filament/Integration/Builders/FormBuilder.php +++ b/src/Filament/Integration/Builders/FormBuilder.php @@ -16,7 +16,10 @@ class FormBuilder extends BaseBuilder { public function build(): Grid { - return Grid::make(1)->schema($this->values()->toArray()); + return FormContainer::make() + ->forModel($this->explicitModel ?? null) + ->only($this->only) + ->except($this->except); } private function getDependentFieldCodes(Collection $fields): array diff --git a/src/Filament/Integration/Builders/FormContainer.php b/src/Filament/Integration/Builders/FormContainer.php new file mode 100644 index 0000000..26f88ae --- /dev/null +++ b/src/Filament/Integration/Builders/FormContainer.php @@ -0,0 +1,65 @@ +schema(fn (): array => $container->generateSchema()); + + return $container; + } + + public function forModel(Model|string|null $model): static + { + $this->explicitModel = $model; + + return $this; + } + + public function except(array $fieldCodes): static + { + $this->except = $fieldCodes; + + return $this; + } + + public function only(array $fieldCodes): static + { + $this->only = $fieldCodes; + + return $this; + } + + private function generateSchema(): array + { + // Inline priority: explicit ?? record ?? model class + $model = $this->explicitModel ?? $this->getRecord() ?? $this->getModel(); + + if ($model === null) { + return []; // Graceful fallback + } + + $builder = app(FormBuilder::class); + + return $builder + ->forModel($model) + ->only($this->only) + ->except($this->except) + ->values() + ->toArray(); + } +} diff --git a/src/Filament/Integration/Builders/InfolistBuilder.php b/src/Filament/Integration/Builders/InfolistBuilder.php index 775df5e..d204bb7 100644 --- a/src/Filament/Integration/Builders/InfolistBuilder.php +++ b/src/Filament/Integration/Builders/InfolistBuilder.php @@ -6,10 +6,11 @@ use Filament\Infolists\Components\Entry; use Filament\Schemas\Components\Component; -use Filament\Schemas\Components\Grid; +use Illuminate\Database\Eloquent\Model; use Illuminate\Support\Collection; use Relaticle\CustomFields\Filament\Integration\Factories\FieldInfolistsFactory; use Relaticle\CustomFields\Filament\Integration\Factories\SectionInfolistsFactory; +use Relaticle\CustomFields\Models\Contracts\HasCustomFields; use Relaticle\CustomFields\Models\CustomField; use Relaticle\CustomFields\Models\CustomFieldSection; use Relaticle\CustomFields\Services\Visibility\BackendVisibilityService; @@ -24,14 +25,24 @@ final class InfolistBuilder extends BaseBuilder public function build(): Component { - return Grid::make(1)->schema($this->values()->toArray()); + return InfolistContainer::make() + ->forModel($this->explicitModel ?? null) + ->hiddenLabels($this->hiddenLabels) + ->visibleWhenFilled($this->visibleWhenFilled) + ->withoutSections($this->withoutSections) + ->only($this->only) + ->except($this->except); } /** * @return Collection */ - public function values(): Collection + public function values(null|(Model&HasCustomFields) $model = null): Collection { + if ($model !== null) { + $this->forModel($model); + } + $fieldInfolistsFactory = app(FieldInfolistsFactory::class); $sectionInfolistsFactory = app(SectionInfolistsFactory::class); $backendVisibilityService = app(BackendVisibilityService::class); diff --git a/src/Filament/Integration/Builders/InfolistContainer.php b/src/Filament/Integration/Builders/InfolistContainer.php new file mode 100644 index 0000000..aced518 --- /dev/null +++ b/src/Filament/Integration/Builders/InfolistContainer.php @@ -0,0 +1,97 @@ +schema(fn (): array => $container->generateSchema()); + + return $container; + } + + public function forModel(Model|string|null $model): static + { + $this->explicitModel = $model; + + return $this; + } + + public function except(array $fieldCodes): static + { + $this->except = $fieldCodes; + + return $this; + } + + public function only(array $fieldCodes): static + { + $this->only = $fieldCodes; + + return $this; + } + + public function hiddenLabels(bool $hiddenLabels = true): static + { + $this->hiddenLabels = $hiddenLabels; + + return $this; + } + + public function visibleWhenFilled(bool $visibleWhenFilled = true): static + { + $this->visibleWhenFilled = $visibleWhenFilled; + + return $this; + } + + public function withoutSections(bool $withoutSections = true): static + { + $this->withoutSections = $withoutSections; + + return $this; + } + + /** + * @return array + */ + private function generateSchema(): array + { + // Inline priority: explicit ?? record ?? model class + $model = $this->explicitModel ?? $this->getRecord() ?? $this->getModel(); + + if ($model === null) { + return []; // Graceful fallback + } + + $builder = app(InfolistBuilder::class) + ->forModel($model) + ->only($this->only) + ->except($this->except) + ->hiddenLabels($this->hiddenLabels) + ->visibleWhenFilled($this->visibleWhenFilled) + ->withoutSections($this->withoutSections); + + return $builder->values()->toArray(); + } +}