Files
filament/packages/forms/src/Components/Radio.php
T
2025-09-15 13:43:44 +01:00

93 lines
2.3 KiB
PHP

<?php
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
{
use Concerns\CanDisableOptions;
use Concerns\CanDisableOptionsWhenSelectedInSiblingRepeaterItems;
use Concerns\CanFixIndistinctState;
use Concerns\HasDescriptions;
use Concerns\HasExtraInputAttributes;
use Concerns\HasGridDirection;
use Concerns\HasOptions;
/**
* @var view-string
*/
protected string $view = 'filament-forms::components.radio';
protected bool | Closure $isInline = false;
public function boolean(?string $trueLabel = null, ?string $falseLabel = null): static
{
$this->options([
1 => $trueLabel ?? __('filament-forms::components.radio.boolean.true'),
0 => $falseLabel ?? __('filament-forms::components.radio.boolean.false'),
]);
$this->stateCast(app(BooleanStateCast::class, ['isStoredAsInt' => true]));
return $this;
}
public function inline(bool | Closure $condition = true): static
{
$this->isInline = $condition;
return $this;
}
public function isInline(): bool
{
return (bool) $this->evaluate($this->isInline);
}
public function getDefaultState(): mixed
{
$state = parent::getDefaultState();
if (is_bool($state)) {
return $state ? 1 : 0;
}
return $state;
}
/**
* @return array<StateCast>
*/
public function getDefaultStateCasts(): array
{
if ($this->hasCustomStateCasts() || filled($this->getEnum())) {
return parent::getDefaultStateCasts();
}
return [app(StringStateCast::class, ['isNullable' => true])];
}
/**
* @return ?array<string>
*/
public function getInValidationRuleValues(): ?array
{
$values = parent::getInValidationRuleValues();
if ($values !== null) {
return $values;
}
return array_keys($this->getEnabledOptions());
}
public function hasNullableBooleanState(): bool
{
return true;
}
}