diff --git a/packages/forms/src/Components/CheckboxList.php b/packages/forms/src/Components/CheckboxList.php index 067d014f12..7fdacd3e6c 100644 --- a/packages/forms/src/Components/CheckboxList.php +++ b/packages/forms/src/Components/CheckboxList.php @@ -6,6 +6,7 @@ use Closure; use Filament\Actions\Action; use Filament\Schemas\Components\StateCasts\Contracts\StateCast; use Filament\Schemas\Components\StateCasts\EnumArrayStateCast; +use Filament\Schemas\Components\StateCasts\StringArrayStateCast; use Filament\Support\Concerns\HasExtraAlpineAttributes; use Filament\Support\Enums\Size; use Filament\Support\Services\RelationshipJoiner; @@ -54,16 +55,6 @@ class CheckboxList extends Field implements Contracts\CanDisableOptions, Contrac { parent::setUp(); - $this->default([]); - - $this->afterStateHydrated(static function (CheckboxList $component, $state): void { - if (is_array($state)) { - return; - } - - $component->state([]); - }); - $this->searchDebounce(0); $this->registerActions([ @@ -332,6 +323,18 @@ class CheckboxList extends Field implements Contracts\CanDisableOptions, Contrac ); } + /** + * @return array + */ + public function getDefaultStateCasts(): array + { + if ($this->hasCustomStateCasts() || filled($this->getEnum())) { + return []; + } + + return [app(StringArrayStateCast::class)]; + } + /** * @return ?array */ diff --git a/packages/forms/src/Components/ModalTableSelect.php b/packages/forms/src/Components/ModalTableSelect.php index 6b91ebe5c1..075eaa86f0 100644 --- a/packages/forms/src/Components/ModalTableSelect.php +++ b/packages/forms/src/Components/ModalTableSelect.php @@ -4,6 +4,9 @@ namespace Filament\Forms\Components; use Closure; use Filament\Actions\Action; +use Filament\Schemas\Components\StateCasts\Contracts\StateCast; +use Filament\Schemas\Components\StateCasts\StringArrayStateCast; +use Filament\Schemas\Components\StateCasts\StringStateCast; use Filament\Support\Enums\IconPosition; use Filament\Support\Icons\Heroicon; use Filament\Support\Services\RelationshipJoiner; @@ -65,20 +68,6 @@ class ModalTableSelect extends Field { parent::setUp(); - $this->default(static fn (ModalTableSelect $component): ?array => $component->isMultiple() ? [] : null); - - $this->afterStateHydrated(static function (ModalTableSelect $component, $state): void { - if (! $component->isMultiple()) { - return; - } - - if (is_array($state)) { - return; - } - - $component->state([]); - }); - $this->registerActions([ fn (ModalTableSelect $component): Action => $component->getSelectAction(), ]); @@ -679,4 +668,20 @@ class ModalTableSelect extends Field { return $this->evaluate($this->tableArguments) ?? []; } + + /** + * @return array + */ + public function getDefaultStateCasts(): array + { + if ($this->hasCustomStateCasts()) { + return []; + } + + if ($this->isMultiple()) { + return [app(StringArrayStateCast::class)]; + } + + return [app(StringStateCast::class, ['isNullable' => true])]; + } } diff --git a/packages/forms/src/Components/Radio.php b/packages/forms/src/Components/Radio.php index 319e01c25c..842464e3ed 100644 --- a/packages/forms/src/Components/Radio.php +++ b/packages/forms/src/Components/Radio.php @@ -4,6 +4,8 @@ namespace Filament\Forms\Components; use Closure; use Filament\Schemas\Components\StateCasts\BooleanStateCast; +use Filament\Schemas\Components\StateCasts\Contracts\StateCast; +use Filament\Schemas\Components\StateCasts\StringStateCast; class Radio extends Field implements Contracts\CanDisableOptions { @@ -57,6 +59,18 @@ class Radio extends Field implements Contracts\CanDisableOptions return $state; } + /** + * @return array + */ + public function getDefaultStateCasts(): array + { + if ($this->hasCustomStateCasts() || filled($this->getEnum())) { + return []; + } + + return [app(StringStateCast::class, ['isNullable' => true])]; + } + /** * @return ?array */ diff --git a/packages/forms/src/Components/Repeater.php b/packages/forms/src/Components/Repeater.php index 2269695bc2..26c182ec01 100644 --- a/packages/forms/src/Components/Repeater.php +++ b/packages/forms/src/Components/Repeater.php @@ -908,7 +908,7 @@ class Repeater extends Field implements CanConcealComponents, HasExtraItemAction $this->relationship = $name ?? $this->getName(); $this->modifyRelationshipQueryUsing = $modifyQueryUsing; - $this->afterStateHydrated(function (Repeater $component): void { + $this->afterStateHydrated(static function (Repeater $component): void { if (! is_array($component->hydratedDefaultState)) { return; } diff --git a/packages/forms/src/Components/Select.php b/packages/forms/src/Components/Select.php index c62269cab7..5d38b5c032 100644 --- a/packages/forms/src/Components/Select.php +++ b/packages/forms/src/Components/Select.php @@ -133,20 +133,6 @@ class Select extends Field implements Contracts\CanDisableOptions, Contracts\Has { parent::setUp(); - $this->default(static fn (Select $component): ?array => $component->isMultiple() ? [] : null); - - $this->afterStateHydrated(static function (Select $component, $state): void { - if (! $component->isMultiple()) { - return; - } - - if (is_array($state)) { - return; - } - - $component->state([]); - }); - $this->transformOptionsForJsUsing(static function (Select $component, array $options): array { return collect($options) ->map(fn ($label, $value): array => is_array($label) diff --git a/packages/forms/src/Components/Slider.php b/packages/forms/src/Components/Slider.php index b669e7abb3..74f346d00a 100644 --- a/packages/forms/src/Components/Slider.php +++ b/packages/forms/src/Components/Slider.php @@ -82,7 +82,7 @@ class Slider extends Field implements Contracts\HasNestedRecursiveValidationRule { parent::setUp(); - $this->default(fn (Slider $component): float | int => $component->getMinValue()); + $this->default(static fn (Slider $component): float | int => $component->getMinValue()); $this->required(); diff --git a/packages/forms/src/Components/TableSelect.php b/packages/forms/src/Components/TableSelect.php index d571674ff2..8531a4261e 100644 --- a/packages/forms/src/Components/TableSelect.php +++ b/packages/forms/src/Components/TableSelect.php @@ -3,6 +3,9 @@ namespace Filament\Forms\Components; use Closure; +use Filament\Schemas\Components\StateCasts\Contracts\StateCast; +use Filament\Schemas\Components\StateCasts\StringArrayStateCast; +use Filament\Schemas\Components\StateCasts\StringStateCast; use Illuminate\Contracts\Support\Htmlable; use Illuminate\Database\Eloquent\Collection; use Illuminate\Database\Eloquent\Model; @@ -303,4 +306,20 @@ class TableSelect extends Field { return (bool) $this->evaluate($this->isMultiple); } + + /** + * @return array + */ + public function getDefaultStateCasts(): array + { + if ($this->hasCustomStateCasts()) { + return []; + } + + if ($this->isMultiple()) { + return [app(StringArrayStateCast::class)]; + } + + return [app(StringStateCast::class, ['isNullable' => true])]; + } } diff --git a/packages/forms/src/Components/ToggleButtons.php b/packages/forms/src/Components/ToggleButtons.php index 1f6006dac4..7d01ef92fb 100644 --- a/packages/forms/src/Components/ToggleButtons.php +++ b/packages/forms/src/Components/ToggleButtons.php @@ -8,6 +8,8 @@ use Filament\Schemas\Components\StateCasts\BooleanStateCast; use Filament\Schemas\Components\StateCasts\Contracts\StateCast; use Filament\Schemas\Components\StateCasts\EnumArrayStateCast; use Filament\Schemas\Components\StateCasts\EnumStateCast; +use Filament\Schemas\Components\StateCasts\StringArrayStateCast; +use Filament\Schemas\Components\StateCasts\StringStateCast; use Filament\Support\Facades\FilamentIcon; use Filament\Support\Icons\Heroicon; @@ -36,25 +38,6 @@ class ToggleButtons extends Field implements Contracts\CanDisableOptions protected bool | Closure $areButtonLabelsHidden = false; - protected function setUp(): void - { - parent::setUp(); - - $this->default(fn (ToggleButtons $component): mixed => $component->isMultiple() ? [] : null); - - $this->afterStateHydrated(static function (ToggleButtons $component, $state): void { - if (! $component->isMultiple()) { - return; - } - - if (is_array($state)) { - return; - } - - $component->state([]); - }); - } - public function grouped(): static { return $this->view(static::GROUPED_VIEW); @@ -143,6 +126,22 @@ class ToggleButtons extends Field implements Contracts\CanDisableOptions ); } + /** + * @return array + */ + public function getDefaultStateCasts(): array + { + if ($this->hasCustomStateCasts() || filled($this->getEnum())) { + return []; + } + + if ($this->isMultiple()) { + return [app(StringArrayStateCast::class)]; + } + + return [app(StringStateCast::class, ['isNullable' => true])]; + } + /** * @return ?array */