diff --git a/resources/js/app.js b/resources/js/app.js index 5d2188d..dade033 100644 --- a/resources/js/app.js +++ b/resources/js/app.js @@ -198,27 +198,3 @@ document.addEventListener('alpine:init', () => { }, })); }); - -// Keep the active-server session in sync with the server-details page on screen, even -// when wire:navigate restores a page from its bfcache (Back/Forward) without re-running -// Show::mount(). The details page tags its root with data-clusev-activate=. -let clusevActivateChain = Promise.resolve(); -document.addEventListener('livewire:navigated', () => { - const el = document.querySelector('[data-clusev-activate]'); - if (!el) return; - const url = el.dataset.clusevActivate; - const token = document.querySelector('meta[name="csrf-token"]')?.content ?? ''; - // SERIALIZE: run each activation after the previous one resolves, so the LATEST - // navigation's request is guaranteed to reach the server last — a stale activation - // can never overwrite a newer selection. A per-request timeout prevents a hung - // request from stalling the chain. - clusevActivateChain = clusevActivateChain.then(() => { - const ctrl = new AbortController(); - const timer = setTimeout(() => ctrl.abort(), 5000); - return fetch(url, { - method: 'POST', - headers: { 'X-CSRF-TOKEN': token, 'X-Requested-With': 'XMLHttpRequest' }, - signal: ctrl.signal, - }).catch(() => {}).finally(() => clearTimeout(timer)); - }); -}); diff --git a/resources/views/livewire/servers/show.blade.php b/resources/views/livewire/servers/show.blade.php index 0d6bd73..02f3d29 100644 --- a/resources/views/livewire/servers/show.blade.php +++ b/resources/views/livewire/servers/show.blade.php @@ -36,7 +36,7 @@ ]; @endphp -
+
diff --git a/routes/web.php b/routes/web.php index 4876493..5ecadfa 100644 --- a/routes/web.php +++ b/routes/web.php @@ -11,7 +11,6 @@ use App\Livewire\Services; use App\Livewire\Settings; use App\Livewire\System; use App\Livewire\Versions; -use App\Models\Server; use App\Services\DeploymentService; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth as AuthFacade; @@ -81,14 +80,6 @@ Route::middleware('auth')->group(function () { Route::get('/servers', Servers\Index::class)->name('servers.index'); Route::get('/servers/{server}', Servers\Show::class)->name('servers.show'); - // Re-assert the active server when a details page is shown — incl. a wire:navigate - // bfcache restore (Back/Forward), which never re-runs Show::mount(). A tiny JS hook - // on `livewire:navigated` posts here so the session context never drifts. - Route::post('/servers/{server}/activate', function (Server $server) { - session(['active_server_id' => $server->id]); - - return response()->noContent(); - })->name('servers.activate'); Route::get('/services', Services\Index::class)->name('services.index'); Route::get('/files', Files\Index::class)->name('files.index'); diff --git a/tests/Feature/ServerContextSyncTest.php b/tests/Feature/ServerContextSyncTest.php index 4d7c0ec..cd4610b 100644 --- a/tests/Feature/ServerContextSyncTest.php +++ b/tests/Feature/ServerContextSyncTest.php @@ -19,17 +19,6 @@ class ServerContextSyncTest extends TestCase return Server::create(['name' => $name, 'ip' => '10.0.0.'.rand(2, 250), 'ssh_port' => 22, 'status' => 'online']); } - public function test_activate_endpoint_sets_active_server(): void - { - // onboarded user — the route sits behind EnsureSecurityOnboarded - $this->actingAs(User::factory()->create(['two_factor_secret' => 'x', 'two_factor_confirmed_at' => now()])); - $b = $this->server('B'); - - $this->post(route('servers.activate', $b))->assertNoContent(); - - $this->assertSame($b->id, session('active_server_id')); - } - public function test_viewing_server_details_sets_it_active(): void { $this->actingAs(User::factory()->create());