From 9195f623a29bcfec4f345b5d6a40dc439a02f38b Mon Sep 17 00:00:00 2001 From: Ian Cowan Date: Mon, 9 Feb 2026 22:01:56 -0500 Subject: [PATCH 01/14] #863 Fix controller dash navbar formatting --- resources/views/inc/dashboard_head.blade.php | 37 +++++++++----------- 1 file changed, 17 insertions(+), 20 deletions(-) diff --git a/resources/views/inc/dashboard_head.blade.php b/resources/views/inc/dashboard_head.blade.php index 6fde59c0..4739899e 100644 --- a/resources/views/inc/dashboard_head.blade.php +++ b/resources/views/inc/dashboard_head.blade.php @@ -1,25 +1,22 @@ - + + + From 75dcc41de0c1ada7a3937674d778334fa7065a5f Mon Sep 17 00:00:00 2001 From: Ian Cowan Date: Mon, 9 Feb 2026 23:45:45 -0500 Subject: [PATCH 02/14] #863 Lay framework for impersonation --- app/Providers/AppServiceProvider.php | 2 ++ app/User.php | 12 ++++++++ app/View/Composers/ImpersonationComposer.php | 31 ++++++++++++++++++++ resources/views/inc/dashboard_head.blade.php | 21 ++++++++----- 4 files changed, 59 insertions(+), 7 deletions(-) create mode 100644 app/View/Composers/ImpersonationComposer.php diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index c7df652b..9e0904ec 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -4,6 +4,7 @@ use App\Enums\FeatureToggles; use App\Enums\SessionVariables; +use App\View\Composers\ImpersonationComposer; use Illuminate\Pagination\LengthAwarePaginator; use Illuminate\Pagination\Paginator; use Illuminate\Support\Collection; @@ -29,6 +30,7 @@ public function boot(): void { View::share('FeatureToggles', FeatureToggles::class); View::share('SessionVariables', SessionVariables::class); + View::composer('inc.dashboard_head', ImpersonationComposer::class); /** * Paginate a standard Laravel Collection. diff --git a/app/User.php b/app/User.php index 08bb784f..d2525010 100644 --- a/app/User.php +++ b/app/User.php @@ -73,6 +73,18 @@ public function getFullNameRatingAttribute() { return $this->full_name . ' - ' . $this->rating_short; } + public function getImpersonationNameAttribute() { + $roles = array_reduce($this->roles->toArray(), function ($role_string, $role) { + return $role_string . $role['name'] . ', '; + }, ''); + + if ($roles != '') { + $roles = ' (' . trim($roles, ', ') . ')'; + } + + return $this->full_name . ' ' . $this->id . ' - ' . $this->rating_short . $roles; + } + public static $RatingShort = [ 0 => 'N/A', 1 => 'OBS', 2 => 'S1', diff --git a/app/View/Composers/ImpersonationComposer.php b/app/View/Composers/ImpersonationComposer.php new file mode 100644 index 00000000..95568562 --- /dev/null +++ b/app/View/Composers/ImpersonationComposer.php @@ -0,0 +1,31 @@ +isAbleTo('snrStaff')) { + $users = User::get()->pluck('impersonation_name', 'id'); + } + + $view->with('users', $users)->with('is_impersonating', $is_impersonating); + } +} diff --git a/resources/views/inc/dashboard_head.blade.php b/resources/views/inc/dashboard_head.blade.php index 4739899e..c11ae741 100644 --- a/resources/views/inc/dashboard_head.blade.php +++ b/resources/views/inc/dashboard_head.blade.php @@ -3,20 +3,27 @@ @include('inc.logo', ['color' => 'black']) - - + From 6e39399c031ffb25e1c7df5b8513284093e5aeb1 Mon Sep 17 00:00:00 2001 From: Ian Cowan Date: Tue, 10 Feb 2026 10:23:03 -0500 Subject: [PATCH 03/14] #863 Add routes for impersonation and set session var --- app/Enums/SessionVariables.php | 1 + .../Controllers/ImpersonationController.php | 25 +++++++++++++++++++ app/User.php | 2 +- app/View/Composers/ImpersonationComposer.php | 2 +- resources/views/inc/dashboard_head.blade.php | 6 ++--- routes/web.php | 5 ++++ 6 files changed, 36 insertions(+), 5 deletions(-) create mode 100644 app/Http/Controllers/ImpersonationController.php diff --git a/app/Enums/SessionVariables.php b/app/Enums/SessionVariables.php index b50691b0..61eb4114 100644 --- a/app/Enums/SessionVariables.php +++ b/app/Enums/SessionVariables.php @@ -8,4 +8,5 @@ enum SessionVariables: string { case VATSIM_AUTH_STATE = 'vatsimauthstate'; case REALOPS_PILOT_REDIRECT = 'pilot_redirect'; case REALOPS_PILOT_REDIRECT_PATH = 'pilot_redirect_path'; + case IMPERSONATE = 'impersonate'; } diff --git a/app/Http/Controllers/ImpersonationController.php b/app/Http/Controllers/ImpersonationController.php new file mode 100644 index 00000000..3610f562 --- /dev/null +++ b/app/Http/Controllers/ImpersonationController.php @@ -0,0 +1,25 @@ +user_id); + if (is_null($user)) { + return redirect()->back()->with(SessionVariables::ERROR->value, 'That user does not exist'); + } + + session()->put(SessionVariables::IMPERSONATE->value, $user->id); + return redirect('/dashboard'); + } + + public function stop() { + session()->forget(SessionVariables::IMPERSONATE->value); + return redirect('/dashboard'); + } +} diff --git a/app/User.php b/app/User.php index d2525010..b3168e93 100644 --- a/app/User.php +++ b/app/User.php @@ -82,7 +82,7 @@ public function getImpersonationNameAttribute() { $roles = ' (' . trim($roles, ', ') . ')'; } - return $this->full_name . ' ' . $this->id . ' - ' . $this->rating_short . $roles; + return $this->backwards_name . ' ' . $this->id . ' - ' . $this->rating_short . $roles; } public static $RatingShort = [ diff --git a/app/View/Composers/ImpersonationComposer.php b/app/View/Composers/ImpersonationComposer.php index 95568562..e67529d5 100644 --- a/app/View/Composers/ImpersonationComposer.php +++ b/app/View/Composers/ImpersonationComposer.php @@ -23,7 +23,7 @@ public function compose(View $view): void { $is_impersonating = false; if (Auth::user()->isAbleTo('snrStaff')) { - $users = User::get()->pluck('impersonation_name', 'id'); + $users = User::orderBy('lname', 'ASC')->get()->pluck('impersonation_name', 'id'); } $view->with('users', $users)->with('is_impersonating', $is_impersonating); diff --git a/resources/views/inc/dashboard_head.blade.php b/resources/views/inc/dashboard_head.blade.php index c11ae741..bea5436d 100644 --- a/resources/views/inc/dashboard_head.blade.php +++ b/resources/views/inc/dashboard_head.blade.php @@ -15,11 +15,11 @@