diff --git a/config/services.php b/config/services.php index e5030aff70..f3ef037f64 100644 --- a/config/services.php +++ b/config/services.php @@ -10,6 +10,7 @@ use EasyCorp\Bundle\EasyAdminBundle\Command\MakeCrudControllerCommand; use EasyCorp\Bundle\EasyAdminBundle\Contracts\Field\FieldConfiguratorInterface; use EasyCorp\Bundle\EasyAdminBundle\Contracts\Filter\FilterConfiguratorInterface; +use EasyCorp\Bundle\EasyAdminBundle\Contracts\Icon\EntityIconGeneratorInterface; use EasyCorp\Bundle\EasyAdminBundle\Contracts\Menu\MenuItemMatcherInterface; use EasyCorp\Bundle\EasyAdminBundle\Contracts\Orm\EntityPaginatorInterface; use EasyCorp\Bundle\EasyAdminBundle\Contracts\Translation\EntityTranslationIdGeneratorInterface; @@ -73,6 +74,7 @@ use EasyCorp\Bundle\EasyAdminBundle\Form\Type\CrudFormType; use EasyCorp\Bundle\EasyAdminBundle\Form\Type\FileUploadType; use EasyCorp\Bundle\EasyAdminBundle\Form\Type\FiltersFormType; +use EasyCorp\Bundle\EasyAdminBundle\Icon\EntityIconGenerator; use EasyCorp\Bundle\EasyAdminBundle\Intl\IntlFormatter; use EasyCorp\Bundle\EasyAdminBundle\Maker\ClassMaker; use EasyCorp\Bundle\EasyAdminBundle\Menu\MenuItemMatcher; @@ -252,6 +254,7 @@ ->arg(3, service(AdminUrlGenerator::class)) ->arg(4, service(MenuItemMatcherInterface::class)) ->arg(5, service(EntityTranslationIdGeneratorInterface::class)) + ->arg(6, service(EntityIconGeneratorInterface::class)) ->set(MenuItemMatcher::class) ->arg(0, service(AdminUrlGenerator::class)) @@ -446,6 +449,10 @@ ->alias(EntityTranslationIdGeneratorInterface::class, EntityTranslationIdGenerator::class) + ->set(EntityIconGenerator::class) + + ->alias(EntityIconGeneratorInterface::class, EntityIconGenerator::class) + ->set(AssetPackage::class) ->arg(0, service('request_stack')) ->tag('assets.package', ['package' => AssetPackage::PACKAGE_NAME]) diff --git a/doc/dashboards.rst b/doc/dashboards.rst index 896e9157ee..62c8ba9ed3 100644 --- a/doc/dashboards.rst +++ b/doc/dashboards.rst @@ -843,6 +843,32 @@ generator to return the menu items:: // ... } +Icons +~~~~~ + +If you prefer to configure all icons for links to entities in one place you can implement +``EntityIconGeneratorInterface``: + + namespace App\EasyAdmin\Icon; + + use App\Entity\Developer; + use App\Entity\Invoice; + use EasyCorp\Bundle\EasyAdminBundle\Contracts\Icon\EntityIconGeneratorInterface; + use Symfony\Component\DependencyInjection\Attribute\AsAlias; + + #[AsAlias(EntityIconGeneratorInterface::class)] + class EntityIconGenerator implements EntityIconGeneratorInterface + { + public function generate(string $entity): ?string + { + return match ($entity) { + Developer::class => 'fa-solid fa-user', + Invoice::class => 'fa fa-file-invoice', + default => null, + }; + } + } + .. _dashboards-user-menu: User Menu diff --git a/src/Contracts/Icon/EntityIconGeneratorInterface.php b/src/Contracts/Icon/EntityIconGeneratorInterface.php new file mode 100644 index 0000000000..1fc6621390 --- /dev/null +++ b/src/Contracts/Icon/EntityIconGeneratorInterface.php @@ -0,0 +1,14 @@ +entityTranslationIdGenerator) { trigger_deprecation( @@ -43,6 +45,14 @@ public function __construct( '$entityTranslationIdGenerator', ); } + if (null === $this->entityIconGenerator) { + trigger_deprecation( + 'easycorp/easyadmin-bundle', + '4.28', + 'Not passing argument "$entityIconGenerator" will cause an error in 5.0.0.', + '$entityIconGenerator', + ); + } } /** @@ -119,6 +129,10 @@ private function buildMenuItem(MenuItemDto $menuItemDto, array $subItems, string $menuItemDto->setLabel($label); } + if (MenuItemDto::TYPE_CRUD === $menuItemDto->getType() && null === $menuItemDto->getIcon() && null !== $this->entityIconGenerator) { + $menuItemDto->setIcon($this->entityIconGenerator->generate($menuItemDto->getRouteParameters()[EA::ENTITY_FQCN])); + } + $url = $this->generateMenuItemUrl($menuItemDto); $menuItemDto->setLinkUrl($url); diff --git a/src/Icon/EntityIconGenerator.php b/src/Icon/EntityIconGenerator.php new file mode 100644 index 0000000000..e2c5a69202 --- /dev/null +++ b/src/Icon/EntityIconGenerator.php @@ -0,0 +1,13 @@ +