/* Sage Modern UI Shell Theme & Layout Controller
Handles: theme switching (dark/light), sidebar collapse, localStorage persistence
*/
(function() {
'use strict';
var THEME_KEY = 'sage_ui_theme';
var SIDEBAR_KEY = 'sage_sidebar_collapsed';
// Initialize theme on page load
function initTheme() {
var saved = null;
try { saved = localStorage.getItem(THEME_KEY); } catch(e) {}
var theme = saved || 'dark';
document.documentElement.setAttribute('data-theme', theme);
updateThemeIcon(theme);
}
// Toggle between dark and light
function toggleTheme() {
var current = document.documentElement.getAttribute('data-theme') || 'dark';
var next = current === 'dark' ? 'light' : 'dark';
document.documentElement.setAttribute('data-theme', next);
try { localStorage.setItem(THEME_KEY, next); } catch(e) {}
updateThemeIcon(next);
}
// Update the theme toggle icon based on current theme
function updateThemeIcon(theme) {
var btn = document.getElementById('theme_toggle_btn');
if (!btn) return;
if (theme === 'light') {
// Show moon icon (switch to dark)
btn.innerHTML = '';
} else {
// Show sun icon (switch to light)
btn.innerHTML = '';
}
}
// Initialize sidebar state
function initSidebar() {
var collapsed = false;
try { collapsed = localStorage.getItem(SIDEBAR_KEY) === 'true'; } catch(e) {}
var sidebar = document.getElementById('sage_sidebar');
if (sidebar && collapsed) {
sidebar.classList.add('collapsed');
}
}
// Toggle sidebar collapse
function toggleSidebar() {
var sidebar = document.getElementById('sage_sidebar');
if (!sidebar) return;
sidebar.classList.toggle('collapsed');
var isCollapsed = sidebar.classList.contains('collapsed');
try { localStorage.setItem(SIDEBAR_KEY, isCollapsed); } catch(e) {}
// Update toggle icon
var btn = document.getElementById('sidebar_toggle_btn');
if (btn) {
if (isCollapsed) {
btn.innerHTML = '';
} else {
btn.innerHTML = '';
}
}
}
// Initialize SPA Router
function initRouter() {
if (typeof bricks === 'undefined' || !bricks.Router) {
console.log('[Shell] Router not available');
return;
}
bricks.Router.init({
targets: [
{ id: 'sage_main_content', param: 'page' }
]
});
}
// Reload global menu after login/logout
window.sageReloadMenu = async function() {
if (typeof bricks === 'undefined') return;
var sidebar = bricks.getWidgetById('sage_sidebar', bricks.app);
if (!sidebar) {
console.log('[Shell] sage_sidebar not found');
return;
}
// Clear existing children
sidebar.subwidgets.forEach(function(w) { w.destroy && w.destroy(); });
sidebar.subwidgets = [];
sidebar.el.innerHTML = '';
// Rebuild menu urlwidget
var menuUrl = bricks.app.baseUrl + '/global_menu.ui?_webbricks_=1';
var desc = {
"widgettype": "urlwidget",
"options": { "url": menuUrl }
};
try {
var w = await bricks.widgetBuild(desc, sidebar);
if (w) {
sidebar.addSubWidget(w);
console.log('[Shell] Menu reloaded');
}
} catch(e) {
console.log('[Shell] Menu reload error:', e);
}
};
// Run on DOM ready
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', function() {
initTheme();
initSidebar();
initRouter();
});
} else {
initTheme();
initSidebar();
initRouter();
}
// Expose global functions for bricks bind access
window.sageToggleTheme = toggleTheme;
window.sageToggleSidebar = toggleSidebar;
window.sageInitTheme = initTheme;
window.sageInitSidebar = initSidebar;
})();