From d16e7dd876bfee550fe6ac6ad520d488a8688545 Mon Sep 17 00:00:00 2001 From: MartinOscar <40749467+rmartinoscar@users.noreply.github.com> Date: Thu, 27 Nov 2025 22:51:57 +0000 Subject: [PATCH] Better `Role` icons (#1936) Fix `Role` class path for `::getNavigationIcon()` Allow to register custom model icons Co-authored-by: Boy132 --- .../Admin/Resources/Roles/RoleResource.php | 14 +------ app/Models/Role.php | 39 +++++++++++++++++++ 2 files changed, 40 insertions(+), 13 deletions(-) diff --git a/app/Filament/Admin/Resources/Roles/RoleResource.php b/app/Filament/Admin/Resources/Roles/RoleResource.php index e5b6ecf2a..6a53efb4f 100644 --- a/app/Filament/Admin/Resources/Roles/RoleResource.php +++ b/app/Filament/Admin/Resources/Roles/RoleResource.php @@ -160,23 +160,11 @@ class RoleResource extends Resource */ private static function makeSection(string $model, array $options): Section { - $model = ucwords($model); - - $icon = null; - - if (class_exists('\App\Filament\Admin\Resources\\' . $model . 'Resource')) { - $icon = ('\App\Filament\Admin\Resources\\' . $model . 'Resource')::getNavigationIcon(); - } elseif (class_exists('\App\Filament\Admin\Pages\\' . $model)) { - $icon = ('\App\Filament\Admin\Pages\\' . $model)::getNavigationIcon(); - } elseif (class_exists('\App\Filament\Server\Resources\\' . $model . 'Resource')) { - $icon = ('\App\Filament\Server\Resources\\' . $model . 'Resource')::getNavigationIcon(); - } - return Section::make(Str::headline($model)) ->columnSpan(1) ->collapsible() ->collapsed() - ->icon($icon) + ->icon(Role::getModelIcon($model)) ->headerActions([ Action::make('count') ->label(fn (Get $get) => count($get(strtolower($model) . '_list'))) diff --git a/app/Models/Role.php b/app/Models/Role.php index 5d4d16d8d..02a99f469 100644 --- a/app/Models/Role.php +++ b/app/Models/Role.php @@ -54,6 +54,12 @@ class Role extends BaseRole ], ]; + public const MODEL_ICONS = [ + 'health' => 'tabler-heart', + 'activityLog' => 'tabler-stack', + 'panelLog' => 'tabler-file-info', + ]; + /** @var array> */ protected static array $customPermissions = []; @@ -79,6 +85,14 @@ class Role extends BaseRole ]); } + /** @var array */ + protected static array $customModelIcons = []; + + public static function registerCustomModelIcon(string $model, string $icon): void + { + static::$customModelIcons[$model] = $icon; + } + /** @return array> */ public static function getPermissionList(): array { @@ -124,6 +138,31 @@ class Role extends BaseRole return $allPermissions; } + public static function getModelIcon(string $model): ?string + { + $customModels = array_merge(static::MODEL_ICONS, static::$customModelIcons); + + if (array_key_exists($model, $customModels)) { + return $customModels[$model]; + } + + $model = ucwords($model); + + if (class_exists($class = '\\App\\Filament\\Admin\\Resources\\' . $model . 's\\' . $model . 'Resource')) { + return $class::getNavigationIcon(); + } + + if (class_exists($class = '\\App\\Filament\\Admin\\Pages\\' . $model)) { + return $class::getNavigationIcon(); + } + + if (class_exists($class = '\\App\\Filament\\Server\\Resources\\' . $model . 's\\' . $model . 'Resource')) { + return $class::getNavigationIcon(); + } + + return null; + } + public function isRootAdmin(): bool { return $this->name === self::ROOT_ADMIN;