From 2e2954fb59ea7b477b59e129e3dcb0708123c9cc Mon Sep 17 00:00:00 2001 From: "Joseph.Rawlings" Date: Wed, 3 Dec 2025 19:51:10 -0500 Subject: [PATCH] refactor: update icon input handling in NavbarLinkResource to improve user experience and validation --- .../Admin/Resources/NavbarLinkResource.php | 66 +++++++------------ 1 file changed, 25 insertions(+), 41 deletions(-) diff --git a/extensions/Others/NavbarManager/Admin/Resources/NavbarLinkResource.php b/extensions/Others/NavbarManager/Admin/Resources/NavbarLinkResource.php index 6530a80fe..db59e5689 100644 --- a/extensions/Others/NavbarManager/Admin/Resources/NavbarLinkResource.php +++ b/extensions/Others/NavbarManager/Admin/Resources/NavbarLinkResource.php @@ -10,9 +10,27 @@ use Filament\Forms\Get; use Filament\Resources\Resource; use Filament\Tables; use Filament\Tables\Table; +use Illuminate\Database\Eloquent\Builder; class NavbarLinkResource extends Resource { + protected static function normalizeIcon(?string $icon): ?string + { + if (empty($icon)) { + return null; + } + + $icon = strtolower(trim($icon)); + if ($icon === '') { + return null; + } + + if (!str_starts_with($icon, 'ri-')) { + $icon = 'ri-' . ltrim($icon, '-'); + } + + return $icon; + } protected static ?string $model = NavbarLink::class; protected static ?string $navigationIcon = 'heroicon-o-bars-3'; @@ -248,47 +266,13 @@ class NavbarLinkResource extends Resource ]) ->columns(2), - Forms\Components\Select::make('icon') - ->label('Icon') - ->searchable() - ->options([ - 'ri-home-line' => 'Home', - 'ri-dashboard-line' => 'Dashboard', - 'ri-user-line' => 'User', - 'ri-settings-line' => 'Settings', - 'ri-file-line' => 'File', - 'ri-folder-line' => 'Folder', - 'ri-mail-line' => 'Mail', - 'ri-phone-line' => 'Phone', - 'ri-calendar-line' => 'Calendar', - 'ri-time-line' => 'Time', - 'ri-notification-line' => 'Notification', - 'ri-search-line' => 'Search', - 'ri-add-line' => 'Add', - 'ri-edit-line' => 'Edit', - 'ri-delete-line' => 'Delete', - 'ri-arrow-right-line' => 'Arrow Right', - 'ri-arrow-left-line' => 'Arrow Left', - 'ri-arrow-up-line' => 'Arrow Up', - 'ri-arrow-down-line' => 'Arrow Down', - 'ri-link-line' => 'Link', - 'ri-external-link-line' => 'External Link', - 'ri-bookmark-line' => 'Bookmark', - 'ri-star-line' => 'Star', - 'ri-heart-line' => 'Heart', - 'ri-eye-line' => 'Eye', - 'ri-lock-line' => 'Lock', - 'ri-unlock-line' => 'Unlock', - 'ri-shield-line' => 'Shield', - 'ri-check-line' => 'Check', - 'ri-close-line' => 'Close', - 'ri-information-line' => 'Information', - 'ri-question-line' => 'Question', - 'ri-warning-line' => 'Warning', - 'ri-error-warning-line' => 'Error', - ]) - ->placeholder('Select an icon') - ->helperText('RemixIcon class name'), + Forms\Components\TextInput::make('icon') + ->label('Icon Class') + ->placeholder('ri-home-line or home-line') + ->helperText('Use any Remix Icon (see https://github.com/Remix-Design/RemixIcon/blob/master/tags.json). Prefix is optional—we will auto-add `ri-`.') + ->regex('/^(?:ri-)?[a-z0-9-]+$/i') + ->maxLength(80) + ->dehydrateStateUsing(fn ($state) => self::normalizeIcon($state)), Forms\Components\Select::make('condition') ->label('Visibility Condition')