diff --git a/containers/libreportal/frontend/js/components/app/apps-manager.js b/containers/libreportal/frontend/js/components/app/apps-manager.js index 7c66b62..8b9a688 100755 --- a/containers/libreportal/frontend/js/components/app/apps-manager.js +++ b/containers/libreportal/frontend/js/components/app/apps-manager.js @@ -1914,10 +1914,10 @@ class AppsManager { // Get navigation button for installing required services getNavigationButton(fieldKey) { const servicePages = { - 'AUTHELIA': 'app.html?app=authelia', - 'HEADSCALE': 'app.html?app=headscale', - 'WHITELIST': 'app.html?app=traefik', - 'TRAEFIK': 'app.html?app=traefik' + 'AUTHELIA': '/app/authelia', + 'HEADSCALE': '/app/headscale', + 'WHITELIST': '/app/traefik', + 'TRAEFIK': '/app/traefik' }; let serviceName; @@ -1947,8 +1947,14 @@ class AppsManager { // Handle navigation with unsaved changes check handleNavigation(url, serviceName) { - // For now, just navigate - could add unsaved changes detection later - window.location.href = url; + // SPA in-app nav (path-based routes), with an absolute-path full-load + // fallback. A relative window.location.href here resolved wrong from the + // /admin/config/* pages these buttons render on. + if (typeof window.navigateToRoute === 'function' && window.spaClean) { + window.navigateToRoute(url); + } else { + window.location.href = url; + } } // Generate disabled field with navigation button diff --git a/containers/libreportal/frontend/js/system/setup-wizard.js b/containers/libreportal/frontend/js/system/setup-wizard.js index 43150ff..ba59ad2 100755 --- a/containers/libreportal/frontend/js/system/setup-wizard.js +++ b/containers/libreportal/frontend/js/system/setup-wizard.js @@ -668,9 +668,12 @@ class SetupWizard { this.container.classList.add('setup-launched'); setTimeout(() => { - const target = `tasks.html?task=${encodeURIComponent(firstTaskId)}&from=setup`; - if (window.router && typeof window.router.navigate === 'function') { - window.router.navigate(target); + // Path-based route (the app uses /… URLs); the specific task is still + // selected via ?task=. Navigate via the SPA helper, with an absolute-path + // full-load fallback. + const target = `/tasks/all?task=${encodeURIComponent(firstTaskId)}&from=setup`; + if (typeof window.navigateToRoute === 'function' && window.spaClean) { + window.navigateToRoute(target); this.hide(); } else { window.location.href = target;