If you want to show/hide a group of fields based on some other dropdown/radio value, you don't need to define visible/hidden for each field, you can make it a Fieldset.
If you want to show/hide the Fieldset based on value of another form field, you need to add ->live()
to that field and add visible()
or hidden()
to the Fieldset with the condition.
That condition has $get()
parameter that contains all the current values of the form, so you can check them and show/hide the Fieldset.
app/Filament/Resources/PropertyResource.php:
use App\Enum\PropertyType; // ... Forms\Components\Radio::make('property_type') ->options(PropertyType::class) ->default(PropertyType::SALE) ->inline() ->inlineLabel(false) ->live(), Forms\Components\Fieldset::make('Sale Pricing') ->label('Pricing') ->visible(function (Forms\Get $get) { return $get('property_type') == PropertyType::SALE; }) ->schema([ Forms\Components\TextInput::make('sale_price'), Forms\Components\TextInput::make('down_payment'), ]),Forms\Components\Fieldset::make('Rent Pricing') ->label('Pricing') ->visible(function (Forms\Get $get) { return $get('property_type') == PropertyType::RENT; }) ->schema([ Forms\Components\TextInput::make('rent_price'), Forms\Components\TextInput::make('deposit'), ]),
Additionally, this example contains Enum class for PropertyType, so if you're curious about this one:
app/Enum/PropertyType.php:
namespace App\Enum; use Filament\Support\Contracts\HasLabel; enum PropertyType: string implements HasLabel{ case SALE = 'sale'; case RENT = 'rent'; public function getLabel(): string { return match ($this) { self::SALE => 'Sale', self::RENT => 'Rent', }; }}
A few of our Premium Examples: