From 9b01203b7c821dafbf5e642c384a44c32448a87e Mon Sep 17 00:00:00 2001 From: Lance Pioch Date: Sat, 7 Feb 2026 13:21:14 -0500 Subject: [PATCH] Add per-user toggle to redirect admins to /admin after login (#2191) --- app/Enums/CustomizationKey.php | 2 ++ app/Filament/Pages/Auth/EditProfile.php | 14 ++++++++++++++ app/Http/Responses/LoginResponse.php | 25 +++++++++++++++++++++++++ app/Providers/AppServiceProvider.php | 3 +++ lang/en/profile.php | 2 ++ 5 files changed, 46 insertions(+) create mode 100644 app/Http/Responses/LoginResponse.php diff --git a/app/Enums/CustomizationKey.php b/app/Enums/CustomizationKey.php index c5de12425..784829f24 100644 --- a/app/Enums/CustomizationKey.php +++ b/app/Enums/CustomizationKey.php @@ -12,6 +12,7 @@ enum CustomizationKey: string case DashboardLayout = 'dashboard_layout'; case ButtonStyle = 'button_style'; + case RedirectToAdmin = 'redirect_to_admin'; public function getDefaultValue(): string|int|bool { @@ -23,6 +24,7 @@ enum CustomizationKey: string self::TopNavigation => config('panel.filament.default-navigation', 'sidebar'), self::DashboardLayout => 'grid', self::ButtonStyle => true, + self::RedirectToAdmin => false, }; } diff --git a/app/Filament/Pages/Auth/EditProfile.php b/app/Filament/Pages/Auth/EditProfile.php index 0ab26c4f6..5ab777112 100644 --- a/app/Filament/Pages/Auth/EditProfile.php +++ b/app/Filament/Pages/Auth/EditProfile.php @@ -474,6 +474,17 @@ class EditProfile extends BaseEditProfile false => 'Icon Button', ]), ]), + Section::make(trans('profile.admin')) + ->collapsible() + ->icon(TablerIcon::Shield) + ->visible(fn (User $user) => $user->isAdmin()) + ->schema([ + ToggleButtons::make('redirect_to_admin') + ->label(trans('profile.redirect_to_admin')) + ->helperText(trans('profile.redirect_to_admin_help')) + ->inline() + ->boolean(), + ]), Section::make(trans('profile.console')) ->collapsible() ->icon(TablerIcon::Terminal2) @@ -599,6 +610,7 @@ class EditProfile extends BaseEditProfile 'dashboard_layout' => $data['dashboard_layout'], 'top_navigation' => $data['top_navigation'], 'button_style' => $data['button_style'], + 'redirect_to_admin' => $data['redirect_to_admin'] ?? $this->getUser()->getCustomization(CustomizationKey::RedirectToAdmin), ]; unset( @@ -608,6 +620,7 @@ class EditProfile extends BaseEditProfile $data['dashboard_layout'], $data['top_navigation'], $data['button_style'], + $data['redirect_to_admin'], ); $data['customization'] = json_encode($customization); @@ -623,6 +636,7 @@ class EditProfile extends BaseEditProfile $data['console_graph_period'] = (int) $this->getUser()->getCustomization(CustomizationKey::ConsoleGraphPeriod); $data['dashboard_layout'] = $this->getUser()->getCustomization(CustomizationKey::DashboardLayout); $data['button_style'] = $this->getUser()->getCustomization(CustomizationKey::ButtonStyle); + $data['redirect_to_admin'] = $this->getUser()->getCustomization(CustomizationKey::RedirectToAdmin); // Handle migration from boolean to string navigation types $topNavigation = $this->getUser()->getCustomization(CustomizationKey::TopNavigation); diff --git a/app/Http/Responses/LoginResponse.php b/app/Http/Responses/LoginResponse.php new file mode 100644 index 000000000..de069dd3c --- /dev/null +++ b/app/Http/Responses/LoginResponse.php @@ -0,0 +1,25 @@ +user(); + + if ($user?->getCustomization(CustomizationKey::RedirectToAdmin) && $user->canAccessPanel(Filament::getPanel('admin'))) { + return redirect()->intended(Filament::getPanel('admin')->getUrl()); + } + + return redirect()->intended(Filament::getUrl()); + } +} diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index c4d4ec769..927ef7bce 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -27,6 +27,7 @@ use App\Services\Helpers\SoftwareVersionService; use Dedoc\Scramble\Scramble; use Dedoc\Scramble\Support\Generator\OpenApi; use Dedoc\Scramble\Support\Generator\SecurityScheme; +use Filament\Auth\Http\Responses\Contracts\LoginResponse as LoginResponseContract; use Illuminate\Config\Repository; use Illuminate\Database\Eloquent\Relations\Relation; use Illuminate\Foundation\Application; @@ -125,6 +126,8 @@ class AppServiceProvider extends ServiceProvider */ public function register(): void { + $this->app->bind(LoginResponseContract::class, \App\Http\Responses\LoginResponse::class); + Scramble::ignoreDefaultRoutes(); /** @var PluginService $pluginService */ diff --git a/lang/en/profile.php b/lang/en/profile.php index f6a6095c1..db8df82d6 100644 --- a/lang/en/profile.php +++ b/lang/en/profile.php @@ -64,6 +64,8 @@ return [ 'sidebar' => 'Sidebar', 'topbar' => 'Topbar', 'mixed' => 'Mixed', + 'redirect_to_admin' => 'Redirect to Admin on Login', + 'redirect_to_admin_help' => 'When enabled, you will be redirected to the admin area after logging in instead of the server list.', 'no_oauth' => 'No Accounts Linked', 'no_api_keys' => 'No API Keys', 'no_ssh_keys' => 'No SSH Keys',