diff --git a/containers/libreportal/frontend/components/apps/core/js/apps-manager.js b/containers/libreportal/frontend/components/apps/core/js/apps-manager.js index 41727e4..32e4a62 100755 --- a/containers/libreportal/frontend/components/apps/core/js/apps-manager.js +++ b/containers/libreportal/frontend/components/apps/core/js/apps-manager.js @@ -369,9 +369,17 @@ class AppsManager { // Force config tab for install/manage buttons targetTab = 'config'; } else { - // Preserve existing tab or default to config for direct navigation - const currentUrl = new URL(window.location.href); - targetTab = currentUrl.searchParams.get('tab') || 'config'; + // Preserve the existing main tab, defaulting to config for direct + // navigation. The app is path-based now (/app//), so the tab + // lives in the PATH — the old searchParams.get('tab') read the dead ?tab= + // query, was always null, and snapped every non-config tab back to config + // (loadTabContent calls showAppDetail on every switch). Read it off the + // path, and only honour it when we're already on THIS app — a cross-app + // switch or cold nav starts at config. + const parts = window.appPartsFromPath + ? window.appPartsFromPath(window.location.pathname) + : { app: '', tab: 'config' }; + targetTab = (parts.app === appName && parts.tab) ? parts.tab : 'config'; } // Preserve the config sub-category (/app//config/) when the URL