feat: persist active settings tab in URL hash (v55)

URL gains &stab=<panel> when settings are open (e.g. #...&settings=1&stab=accounts).
Tab switches update the URL; reload reopens settings on the same tab.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Scarriffle
2026-06-15 20:52:14 +02:00
parent d04e2952cb
commit 6365f99ac0
2 changed files with 13 additions and 4 deletions

View File

@@ -76,6 +76,8 @@ function readUrlState() {
if (!isNaN(d.getTime())) out.date = d; if (!isNaN(d.getTime())) out.date = d;
} }
out.settings = params.get('settings') === '1'; out.settings = params.get('settings') === '1';
const stab = params.get('stab');
if (stab && ['profile','general','accounts','users'].includes(stab)) out.stab = stab;
return out; return out;
} }
@@ -87,7 +89,11 @@ function writeUrlState() {
const d = state.currentDate; const d = state.currentDate;
const dateStr = `${d.getFullYear()}-${String(d.getMonth()+1).padStart(2,'0')}-${String(d.getDate()).padStart(2,'0')}`; const dateStr = `${d.getFullYear()}-${String(d.getMonth()+1).padStart(2,'0')}-${String(d.getDate()).padStart(2,'0')}`;
let newHash = `date=${dateStr}&view=${state.currentView}`; let newHash = `date=${dateStr}&view=${state.currentView}`;
if (uiSettingsOpen) newHash += '&settings=1'; if (uiSettingsOpen) {
newHash += '&settings=1';
const activeTab = document.querySelector('.settings-nav-btn.active');
if (activeTab) newHash += `&stab=${activeTab.dataset.panel}`;
}
if (window.location.hash.replace(/^#/,'') !== newHash) { if (window.location.hash.replace(/^#/,'') !== newHash) {
// replaceState statt pushState: prev/next-Klicks sollen nicht jeden // replaceState statt pushState: prev/next-Klicks sollen nicht jeden
// einzelnen Tag in den Browser-History-Stack drücken // einzelnen Tag in den Browser-History-Stack drücken
@@ -3063,8 +3069,10 @@ function openSettingsModal() {
if (usersNavBtn) usersNavBtn.classList.toggle('hidden', !user.is_admin); if (usersNavBtn) usersNavBtn.classList.toggle('hidden', !user.is_admin);
if (user.is_admin) loadUsers(); if (user.is_admin) loadUsers();
// Activate first panel // Activate panel from URL or fall back to first visible
const firstBtn = document.querySelector('.settings-nav-btn:not(.hidden)'); const urlTab = readUrlState().stab;
const tabBtn = urlTab && document.querySelector(`.settings-nav-btn[data-panel="${urlTab}"]:not(.hidden)`);
const firstBtn = tabBtn || document.querySelector('.settings-nav-btn:not(.hidden)');
if (firstBtn) activateSettingsPanel(firstBtn.dataset.panel); if (firstBtn) activateSettingsPanel(firstBtn.dataset.panel);
// Render unified calendar table // Render unified calendar table
@@ -3076,6 +3084,7 @@ function openSettingsModal() {
function activateSettingsPanel(panel) { function activateSettingsPanel(panel) {
document.querySelectorAll('.settings-nav-btn').forEach(b => b.classList.toggle('active', b.dataset.panel === panel)); document.querySelectorAll('.settings-nav-btn').forEach(b => b.classList.toggle('active', b.dataset.panel === panel));
document.querySelectorAll('.settings-panel').forEach(p => p.classList.toggle('active', p.id === 'settings-panel-' + panel)); document.querySelectorAll('.settings-panel').forEach(p => p.classList.toggle('active', p.id === 'settings-panel-' + panel));
writeUrlState();
} }
function renderGoogleAccounts() { function renderGoogleAccounts() {

View File

@@ -1,2 +1,2 @@
// Increment APP_VERSION with every code change // Increment APP_VERSION with every code change
export const APP_VERSION = 'v54'; export const APP_VERSION = 'v55';