From db0a1de92fdd60c0a477bcd78c477a8d41a16035 Mon Sep 17 00:00:00 2001 From: boban Date: Fri, 12 Jun 2026 13:45:40 +0200 Subject: [PATCH] feat: multi-server switcher + fleet context - WithFleetContext concern: resolves the active server (session, default first online) + the fleet. - ServerSwitcher Livewire component in the persistent sidebar: dropdown of the fleet; selecting persists active_server_id in the session and re-navigates so panels reflect the choice. - Dashboard reacts: resource rings + panel subtitles follow the active server. Co-Authored-By: Claude Opus 4.8 (1M context) --- app/Livewire/Concerns/WithFleetContext.php | 27 +++++++++++++ app/Livewire/Dashboard.php | 5 ++- app/Livewire/ServerSwitcher.php | 36 +++++++++++++++++ resources/views/components/sidebar.blade.php | 12 +----- resources/views/livewire/dashboard.blade.php | 12 +++--- .../views/livewire/server-switcher.blade.php | 40 +++++++++++++++++++ 6 files changed, 115 insertions(+), 17 deletions(-) create mode 100644 app/Livewire/Concerns/WithFleetContext.php create mode 100644 app/Livewire/ServerSwitcher.php create mode 100644 resources/views/livewire/server-switcher.blade.php diff --git a/app/Livewire/Concerns/WithFleetContext.php b/app/Livewire/Concerns/WithFleetContext.php new file mode 100644 index 0000000..c543131 --- /dev/null +++ b/app/Livewire/Concerns/WithFleetContext.php @@ -0,0 +1,27 @@ +get(); + } + + public function activeServer(): ?Server + { + $fleet = $this->fleet(); + + return $fleet->firstWhere('id', session('active_server_id')) + ?? $fleet->firstWhere('status', 'online') + ?? $fleet->first(); + } +} diff --git a/app/Livewire/Dashboard.php b/app/Livewire/Dashboard.php index aebf0cc..d1b3d22 100644 --- a/app/Livewire/Dashboard.php +++ b/app/Livewire/Dashboard.php @@ -2,6 +2,7 @@ namespace App\Livewire; +use App\Livewire\Concerns\WithFleetContext; use Livewire\Attributes\Layout; use Livewire\Attributes\Title; use Livewire\Component; @@ -10,6 +11,8 @@ use Livewire\Component; #[Title('Clusev — Dashboard')] class Dashboard extends Component { + use WithFleetContext; + /** * Mock fleet data. Replaced by the SSH layer (phpseclib) + Reverb later. * Shapes mirror what MetricsPoller/FleetService will return. @@ -52,6 +55,6 @@ class Dashboard extends Component public function render() { - return view('livewire.dashboard'); + return view('livewire.dashboard', ['active' => $this->activeServer()]); } } diff --git a/app/Livewire/ServerSwitcher.php b/app/Livewire/ServerSwitcher.php new file mode 100644 index 0000000..0226e17 --- /dev/null +++ b/app/Livewire/ServerSwitcher.php @@ -0,0 +1,36 @@ +firstOrFail(); + + session(['active_server_id' => $server->id]); + + $this->redirect(request()->header('Referer') ?: route('dashboard'), navigate: true); + } + + public function render() + { + $servers = Server::orderBy('name')->get(); + $active = $servers->firstWhere('id', session('active_server_id')) + ?? $servers->firstWhere('status', 'online') + ?? $servers->first(); + + return view('livewire.server-switcher', [ + 'servers' => $servers, + 'active' => $active, + ]); + } +} diff --git a/resources/views/components/sidebar.blade.php b/resources/views/components/sidebar.blade.php index 687b960..3e6255f 100644 --- a/resources/views/components/sidebar.blade.php +++ b/resources/views/components/sidebar.blade.php @@ -16,17 +16,9 @@ - {{-- Server switcher (mock) --}} + {{-- Server switcher --}}
- +
{{-- Nav --}} diff --git a/resources/views/livewire/dashboard.blade.php b/resources/views/livewire/dashboard.blade.php index d46fb52..91faa27 100644 --- a/resources/views/livewire/dashboard.blade.php +++ b/resources/views/livewire/dashboard.blade.php @@ -31,7 +31,7 @@ {{-- Live chart (2/3) + resource rings (1/3) --}}
- + Reverb @@ -57,11 +57,11 @@
- +
- - - + + +
@@ -82,7 +82,7 @@
- +
@foreach ($services as $svc)
diff --git a/resources/views/livewire/server-switcher.blade.php b/resources/views/livewire/server-switcher.blade.php new file mode 100644 index 0000000..0b753d7 --- /dev/null +++ b/resources/views/livewire/server-switcher.blade.php @@ -0,0 +1,40 @@ +
+ + +
+
+ @foreach ($servers as $server) + + @endforeach +
+
+