Better Role icons (#1936)

Fix `Role` class path for `::getNavigationIcon()`
Allow to register custom model icons
Co-authored-by: Boy132 <mail@boy132.de>
This commit is contained in:
MartinOscar 2025-11-27 22:51:57 +00:00 committed by GitHub
parent 897b95ec13
commit d16e7dd876
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 40 additions and 13 deletions

View File

@ -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')))

View File

@ -54,6 +54,12 @@ class Role extends BaseRole
],
];
public const MODEL_ICONS = [
'health' => 'tabler-heart',
'activityLog' => 'tabler-stack',
'panelLog' => 'tabler-file-info',
];
/** @var array<string, array<string>> */
protected static array $customPermissions = [];
@ -79,6 +85,14 @@ class Role extends BaseRole
]);
}
/** @var array<string, string> */
protected static array $customModelIcons = [];
public static function registerCustomModelIcon(string $model, string $icon): void
{
static::$customModelIcons[$model] = $icon;
}
/** @return array<string, array<string>> */
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;