Skip to content

Commit 5f69c8b

Browse files
committed
Add EntityIconGenerator feature
1 parent 2916dbf commit 5f69c8b

File tree

5 files changed

+74
-0
lines changed

5 files changed

+74
-0
lines changed

config/services.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
use EasyCorp\Bundle\EasyAdminBundle\Command\MakeCrudControllerCommand;
1111
use EasyCorp\Bundle\EasyAdminBundle\Contracts\Field\FieldConfiguratorInterface;
1212
use EasyCorp\Bundle\EasyAdminBundle\Contracts\Filter\FilterConfiguratorInterface;
13+
use EasyCorp\Bundle\EasyAdminBundle\Contracts\Icon\EntityIconGeneratorInterface;
1314
use EasyCorp\Bundle\EasyAdminBundle\Contracts\Menu\MenuItemMatcherInterface;
1415
use EasyCorp\Bundle\EasyAdminBundle\Contracts\Orm\EntityPaginatorInterface;
1516
use EasyCorp\Bundle\EasyAdminBundle\Contracts\Translation\EntityTranslationIdGeneratorInterface;
@@ -73,6 +74,7 @@
7374
use EasyCorp\Bundle\EasyAdminBundle\Form\Type\CrudFormType;
7475
use EasyCorp\Bundle\EasyAdminBundle\Form\Type\FileUploadType;
7576
use EasyCorp\Bundle\EasyAdminBundle\Form\Type\FiltersFormType;
77+
use EasyCorp\Bundle\EasyAdminBundle\Icon\EntityIconGenerator;
7678
use EasyCorp\Bundle\EasyAdminBundle\Intl\IntlFormatter;
7779
use EasyCorp\Bundle\EasyAdminBundle\Maker\ClassMaker;
7880
use EasyCorp\Bundle\EasyAdminBundle\Menu\MenuItemMatcher;
@@ -252,6 +254,7 @@
252254
->arg(3, service(AdminUrlGenerator::class))
253255
->arg(4, service(MenuItemMatcherInterface::class))
254256
->arg(5, service(EntityTranslationIdGeneratorInterface::class))
257+
->arg(6, service(EntityIconGeneratorInterface::class))
255258

256259
->set(MenuItemMatcher::class)
257260
->arg(0, service(AdminUrlGenerator::class))
@@ -446,6 +449,10 @@
446449

447450
->alias(EntityTranslationIdGeneratorInterface::class, EntityTranslationIdGenerator::class)
448451

452+
->set(EntityIconGenerator::class)
453+
454+
->alias(EntityIconGeneratorInterface::class, EntityIconGenerator::class)
455+
449456
->set(AssetPackage::class)
450457
->arg(0, service('request_stack'))
451458
->tag('assets.package', ['package' => AssetPackage::PACKAGE_NAME])

doc/dashboards.rst

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -843,6 +843,32 @@ generator to return the menu items::
843843
// ...
844844
}
845845

846+
Icons
847+
~~~~~
848+
849+
If you prefer to configure all icons for links to entities in one place you can implement
850+
``EntityIconGeneratorInterface``:
851+
852+
namespace App\EasyAdmin\Icon;
853+
854+
use App\Entity\Developer;
855+
use App\Entity\Invoice;
856+
use EasyCorp\Bundle\EasyAdminBundle\Contracts\Icon\EntityIconGeneratorInterface;
857+
use Symfony\Component\DependencyInjection\Attribute\AsAlias;
858+
859+
#[AsAlias(EntityIconGeneratorInterface::class)]
860+
class EntityIconGenerator implements EntityIconGeneratorInterface
861+
{
862+
public function generate(string $entity): ?string
863+
{
864+
return match ($entity) {
865+
Developer::class => 'fa-solid fa-user',
866+
Invoice::class => 'fa fa-file-invoice',
867+
default => null,
868+
};
869+
}
870+
}
871+
846872
.. _dashboards-user-menu:
847873

848874
User Menu
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<?php
2+
3+
namespace EasyCorp\Bundle\EasyAdminBundle\Contracts\Icon;
4+
5+
interface EntityIconGeneratorInterface
6+
{
7+
/**
8+
* For a given entity FQCN (for example "App\Entity\Invoice") generates a string representing
9+
* an icon (for example "fa fa-file-invoice").
10+
*
11+
* @param class-string $entity
12+
*/
13+
public function generate(string $entity): ?string;
14+
}

src/Factory/MenuFactory.php

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
use EasyCorp\Bundle\EasyAdminBundle\Config\UserMenu;
88
use EasyCorp\Bundle\EasyAdminBundle\Context\AdminContext;
99
use EasyCorp\Bundle\EasyAdminBundle\Contracts\Factory\MenuFactoryInterface;
10+
use EasyCorp\Bundle\EasyAdminBundle\Contracts\Icon\EntityIconGeneratorInterface;
1011
use EasyCorp\Bundle\EasyAdminBundle\Contracts\Menu\MenuItemInterface;
1112
use EasyCorp\Bundle\EasyAdminBundle\Contracts\Menu\MenuItemMatcherInterface;
1213
use EasyCorp\Bundle\EasyAdminBundle\Contracts\Provider\AdminContextProviderInterface;
@@ -34,6 +35,7 @@ public function __construct(
3435
private readonly AdminUrlGeneratorInterface $adminUrlGenerator,
3536
private readonly MenuItemMatcherInterface $menuItemMatcher,
3637
private readonly ?EntityTranslationIdGeneratorInterface $entityTranslationIdGenerator = null,
38+
private readonly ?EntityIconGeneratorInterface $entityIconGenerator = null,
3739
) {
3840
if (null === $this->entityTranslationIdGenerator) {
3941
trigger_deprecation(
@@ -43,6 +45,14 @@ public function __construct(
4345
'$entityTranslationIdGenerator',
4446
);
4547
}
48+
if (null === $this->entityIconGenerator) {
49+
trigger_deprecation(
50+
'easycorp/easyadmin-bundle',
51+
'4.28',
52+
'Not passing argument "$entityIconGenerator" will cause an error in 5.0.0.',
53+
'$entityIconGenerator',
54+
);
55+
}
4656
}
4757

4858
/**
@@ -119,6 +129,10 @@ private function buildMenuItem(MenuItemDto $menuItemDto, array $subItems, string
119129
$menuItemDto->setLabel($label);
120130
}
121131

132+
if (MenuItemDto::TYPE_CRUD === $menuItemDto->getType() && null === $menuItemDto->getIcon() && null !== $this->entityIconGenerator) {
133+
$menuItemDto->setIcon($this->entityIconGenerator->generate($menuItemDto->getRouteParameters()[EA::ENTITY_FQCN]));
134+
}
135+
122136
$url = $this->generateMenuItemUrl($menuItemDto);
123137
$menuItemDto->setLinkUrl($url);
124138

src/Icon/EntityIconGenerator.php

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<?php
2+
3+
namespace EasyCorp\Bundle\EasyAdminBundle\Icon;
4+
5+
use EasyCorp\Bundle\EasyAdminBundle\Contracts\Icon\EntityIconGeneratorInterface;
6+
7+
final class EntityIconGenerator implements EntityIconGeneratorInterface
8+
{
9+
public function generate(string $entity): ?string
10+
{
11+
return null;
12+
}
13+
}

0 commit comments

Comments
 (0)