diff --git a/config/services.php b/config/services.php index 0fcb6a806f..4886e5568c 100644 --- a/config/services.php +++ b/config/services.php @@ -39,6 +39,7 @@ use EasyCorp\Bundle\EasyAdminBundle\Field\Configurator\DateTimeConfigurator; use EasyCorp\Bundle\EasyAdminBundle\Field\Configurator\EmailConfigurator; use EasyCorp\Bundle\EasyAdminBundle\Field\Configurator\FormConfigurator; +use EasyCorp\Bundle\EasyAdminBundle\Field\Configurator\HideIfFieldConfigurator; use EasyCorp\Bundle\EasyAdminBundle\Field\Configurator\IdConfigurator; use EasyCorp\Bundle\EasyAdminBundle\Field\Configurator\ImageConfigurator; use EasyCorp\Bundle\EasyAdminBundle\Field\Configurator\IntegerConfigurator; @@ -407,6 +408,8 @@ ->set(UrlConfigurator::class) + ->set(HideIfFieldConfigurator::class) + ->set(AssetPackage::class) ->arg(0, service('request_stack')) ->tag('assets.package', ['package' => AssetPackage::PACKAGE_NAME]) diff --git a/src/Field/Configurator/HideIfFieldConfigurator.php b/src/Field/Configurator/HideIfFieldConfigurator.php new file mode 100644 index 0000000000..cb43820d9a --- /dev/null +++ b/src/Field/Configurator/HideIfFieldConfigurator.php @@ -0,0 +1,38 @@ +getCustomOptions()->has('hideIf'); + } + + public function configure(FieldDto $field, EntityDto $entityDto, $context): void + { + $condition = $field->getCustomOption('hideIf'); + + if (null === $condition) { + return; + } + + $shouldHide = false; + + if (\is_bool($condition)) { + $shouldHide = $condition; + } elseif (\is_callable($condition)) { + $entityInstance = $entityDto->getInstance(); + $shouldHide = (bool) $condition($entityInstance); + } + + if ($shouldHide) { + $field->setDisplayedOn(KeyValueStore::new([])); + } + } +} diff --git a/src/Field/FieldTrait.php b/src/Field/FieldTrait.php index c7676152a4..a14e3256aa 100644 --- a/src/Field/FieldTrait.php +++ b/src/Field/FieldTrait.php @@ -505,4 +505,22 @@ public function getAsDto(): FieldDto { return $this->dto; } + + /** + * Hides this field based on a condition. + * + * The $condition can be: + * - a callable that returns a boolean (receives the entity as argument) + * - a boolean value + * + * Example usage: + * ->hideIf(fn($entity) => !$entity->isActive()) + * ->hideIf(true) // always hide + */ + public function hideIf(bool|callable $condition): static + { + $this->setCustomOption('hideIf', $condition); + + return $this; + } }