(() => { const layout = document.querySelector('.layout-body'); if (!layout) return; const enabled = layout.dataset.sidebarEnabled === '1'; const collapsible = layout.dataset.sidebarCollapsible === '1'; const defaultState = layout.dataset.sidebarDefault || 'collapsed'; const toggles = document.querySelectorAll('[data-sidebar-toggle]'); if (!enabled || !collapsible) { toggles.forEach((t) => t.remove()); return; } const saved = localStorage.getItem('sidebar-state'); const initial = saved || defaultState; if (initial === 'open') { layout.classList.add('sidebar-open'); } else { layout.classList.remove('sidebar-open'); } toggles.forEach((toggle) => { toggle.addEventListener('click', () => { layout.classList.toggle('sidebar-open'); localStorage.setItem('sidebar-state', layout.classList.contains('sidebar-open') ? 'open' : 'collapsed'); }); }); })(); (() => { const openBtn = document.querySelector('[data-debug-open]'); const modal = document.getElementById('debug-modal'); if (!openBtn || !modal) return; const listEl = document.getElementById('debug-log-list'); const contentEl = document.getElementById('debug-log-content'); const closeEls = modal.querySelectorAll('[data-debug-close]'); const open = () => { modal.classList.add('is-open'); modal.setAttribute('aria-hidden', 'false'); loadList(); startRefresh(); }; const close = () => { modal.classList.remove('is-open'); modal.setAttribute('aria-hidden', 'true'); if (refreshTimer) { clearInterval(refreshTimer); refreshTimer = null; } }; let activeFile = null; let refreshTimer = null; const loadList = async () => { try { const res = await fetch('/debug?list=1', { cache: 'no-store' }); const files = await res.json(); listEl.innerHTML = ''; files.forEach((f) => { const a = document.createElement('a'); a.href = '#'; a.textContent = f; a.addEventListener('click', (e) => { e.preventDefault(); loadFile(f); }); const li = document.createElement('li'); li.appendChild(a); listEl.appendChild(li); }); if (files.includes('oidc_login.log')) { loadFile('oidc_login.log'); } } catch (e) {} }; const loadFile = async (name) => { activeFile = name; try { const res = await fetch(`/debug?raw=1&file=${encodeURIComponent(name)}&tail=200`, { cache: 'no-store' }); const text = await res.text(); contentEl.textContent = formatLog(text); } catch (e) {} }; const formatLog = (text) => { const lines = text.split(/\\r?\\n/).filter(Boolean); const pretty = lines.map((line) => { try { const obj = JSON.parse(line); return JSON.stringify(obj, null, 2); } catch (e) { return line; } }); return pretty.join('\\n\\n'); }; const startRefresh = () => { if (refreshTimer) clearInterval(refreshTimer); refreshTimer = setInterval(() => { if (activeFile) loadFile(activeFile); }, 3000); }; openBtn.addEventListener('click', open); closeEls.forEach((el) => el.addEventListener('click', close)); if (modal.classList.contains('is-open')) { startRefresh(); } })();