From 98427c76ec562216e48726991e8bbc1b8f3aec44 Mon Sep 17 00:00:00 2001 From: Ian Cowan Date: Mon, 9 Feb 2026 22:01:56 -0500 Subject: [PATCH 01/12] #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 4efd8d2aa..4e6188a0d 100644 --- a/resources/views/inc/dashboard_head.blade.php +++ b/resources/views/inc/dashboard_head.blade.php @@ -1,26 +1,23 @@ - + + + From 119d96aa3410ea40b2df42a61e1d2a521333a140 Mon Sep 17 00:00:00 2001 From: Ian Cowan Date: Mon, 9 Feb 2026 23:45:45 -0500 Subject: [PATCH 02/12] #863 Lay framework for impersonation --- app/Providers/AppServiceProvider.php | 4 +++ app/User.php | 12 ++++++++ app/View/Composers/ImpersonationComposer.php | 31 ++++++++++++++++++++ resources/views/inc/dashboard_head.blade.php | 21 ++++++++----- 4 files changed, 61 insertions(+), 7 deletions(-) create mode 100644 app/View/Composers/ImpersonationComposer.php diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index 01e6b2750..d25d7db14 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -2,11 +2,13 @@ namespace App\Providers; +use App\View\Composers\ImpersonationComposer; use Illuminate\Pagination\LengthAwarePaginator; use Illuminate\Pagination\Paginator; use Illuminate\Support\Collection; use Illuminate\Support\Facades\Blade; use Illuminate\Support\Facades\Schema; +use Illuminate\Support\Facades\View; use Illuminate\Support\Facades\Vite; use Illuminate\Support\ServiceProvider; @@ -24,6 +26,8 @@ public function boot(): void { return toggleEnabled($toggle_name); }); + View::composer('inc.dashboard_head', ImpersonationComposer::class); + /** * Paginate a standard Laravel Collection. * diff --git a/app/User.php b/app/User.php index 08bb784ff..d25250103 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 000000000..955685623 --- /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 4e6188a0d..889343344 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 bcf958ea3b5d5cb3c71f48174fb04cfdc8ed3bc9 Mon Sep 17 00:00:00 2001 From: Ian Cowan Date: Tue, 10 Feb 2026 10:23:03 -0500 Subject: [PATCH 03/12] #863 Add routes for impersonation and set session var --- .../Controllers/ImpersonationController.php | 24 +++++++++++++++++++ app/User.php | 2 +- app/View/Composers/ImpersonationComposer.php | 2 +- resources/views/inc/dashboard_head.blade.php | 6 ++--- routes/web.php | 5 ++++ 5 files changed, 34 insertions(+), 5 deletions(-) create mode 100644 app/Http/Controllers/ImpersonationController.php diff --git a/app/Http/Controllers/ImpersonationController.php b/app/Http/Controllers/ImpersonationController.php new file mode 100644 index 000000000..345ed2681 --- /dev/null +++ b/app/Http/Controllers/ImpersonationController.php @@ -0,0 +1,24 @@ +user_id); + if (is_null($user)) { + return redirect()->back()->with('error', 'That user does not exist'); + } + + session()->put('impersonate', $user->id); + return redirect('/dashboard'); + } + + public function stop() { + session()->forget('impersonate'); + return redirect('/dashboard'); + } +} diff --git a/app/User.php b/app/User.php index d25250103..b3168e93e 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 955685623..e67529d5e 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 889343344..7fff16dbc 100644 --- a/resources/views/inc/dashboard_head.blade.php +++ b/resources/views/inc/dashboard_head.blade.php @@ -15,11 +15,11 @@