'use strict'; var htmlRoot = document.getElementsByTagName('HTML')[0], //save states savePanelStateEnabled = true, //mobile operator on mobileOperator = function () { // Check user agent const userAgent = navigator.userAgent.toLowerCase(); const isMobileUserAgent = /iphone|ipad|ipod|android|blackberry|mini|windows\sce|palm/i.test(userAgent); // Check for touch support const isTouchDevice = 'ontouchstart' in window || navigator.maxTouchPoints > 0; // Check screen size (optional) const isSmallScreen = window.innerWidth <= 992; // Adjust the breakpoint as needed // Return true if any of the conditions are met return isMobileUserAgent || isTouchDevice || isSmallScreen; }, //filter filterClass = function (t, e) { return String(t).split(/[^\w-]+/).filter(function (t) { return e.test(t) }).join(' ') }, //load loadSettings = function () { var t = sessionStorage.getItem('layoutSettings') || '', e = t ? JSON.parse(t) : {}; // Load theme setting var savedTheme = e.theme || 'light'; htmlRoot.setAttribute('data-bs-theme', savedTheme); // Load theme style CSS file only if one was saved var themeStyle = e.themeStyle || ''; if (themeStyle) { loadThemeStyle(themeStyle); } return Object.assign({ htmlRoot: '', theme: savedTheme, themeStyle: themeStyle }, e) }, //save saveSettings = function () { // Save root HTML classes layoutSettings.htmlRoot = filterClass(htmlRoot.className, /^(set)-/i); // Save theme attribute layoutSettings.theme = htmlRoot.getAttribute('data-bs-theme') || 'light'; // Save theme style CSS path var themeStyleElement = document.getElementById('theme-style'); if (themeStyleElement && themeStyleElement.getAttribute('href')) { // Get complete href attribute layoutSettings.themeStyle = themeStyleElement.getAttribute('href'); console.log('Saved theme style:', layoutSettings.themeStyle); } else { layoutSettings.themeStyle = ''; console.log('No theme style to save'); } // Log the full settings object before saving console.log('Saving layout settings:', JSON.stringify(layoutSettings)); // Save to sessionStorage sessionStorage.setItem("layoutSettings", JSON.stringify(layoutSettings)); // Show saving indicator savingIndicator(); }, // reset resetSettings = function () { sessionStorage.setItem("layoutSettings", ""); // reset data-bs-theme htmlRoot.setAttribute('data-bs-theme', 'light'); // reset theme style element if it exists const themeStyleElement = document.getElementById('theme-style') if (themeStyleElement) { themeStyleElement.setAttribute('href', ''); } // refresh page window.location.reload(); }, //load theme style loadThemeStyle = function (themeStyle) { if (!themeStyle) return; // Don't do anything if the URL is empty if (!themeStyle.trim()) return; // Get existing theme style if it exists var existingThemeStyle = document.getElementById('theme-style'); if (existingThemeStyle) { // Update existing theme style's href existingThemeStyle.href = themeStyle; } else { // Create new theme style element if none exists var linkElement = document.createElement('link'); linkElement.id = 'theme-style'; // Use the standard ID linkElement.rel = 'stylesheet'; linkElement.media = 'screen'; linkElement.href = themeStyle; document.head.appendChild(linkElement); // Flag to indicate this was loaded from sessionStorage linkElement.setAttribute('data-loaded-from-storage', 'true'); } }, //get page id getPageIdentifier = function () { return window.location.pathname.split('/').pop() || 'index.html'; }, //save panel state savePanelState = function () { if (!savePanelStateEnabled) return; var state = []; var columns = document.querySelectorAll('.main-content > .row > [class^="col-"]'); columns.forEach(function (column, columnIndex) { var panels = column.querySelectorAll('.panel'); panels.forEach(function (panel, position) { var panelHeader = panel.querySelector('.panel-hdr'); // Save panel classes excluding 'panel' and 'panel-fullscreen' var panelClasses = panel.className.split(' ').filter(function (cls) { return cls !== 'panel' && cls !== 'panel-fullscreen'; }).join(' '); // Save header classes excluding 'panel-hdr' var headerClasses = panelHeader ? panelHeader.className.split(' ').filter(function (cls) { return cls !== 'panel-hdr'; }).join(' ') : ''; state.push({ id: panel.id, column: columnIndex, position: position, // Save position within column classes: panelClasses, headerClasses: headerClasses }); }); }); var pageId = getPageIdentifier(); var allStates = JSON.parse(sessionStorage.getItem('allPanelStates') || '{}'); allStates[pageId] = state; sessionStorage.setItem('allPanelStates', JSON.stringify(allStates)); savingIndicator(); }, loadPanelState = function () { var pageId = getPageIdentifier(); var allStates = JSON.parse(sessionStorage.getItem('allPanelStates') || '{}'); var savedState = allStates[pageId]; if (!savedState) return; // Use same selector as save function var columns = Array.from(document.querySelectorAll('.main-content > .row > [class^="col-"]')); // Store all existing panels in a map before removing them var panelMap = {}; columns.forEach(function (column) { var existingPanels = Array.from(column.querySelectorAll('.panel')); existingPanels.forEach(function (panel) { panelMap[panel.id] = panel; panel.remove(); }); }); // Sort state by column and position savedState.sort(function (a, b) { if (a.column === b.column) { return a.position - b.position; } return a.column - b.column; }); // Reinsert panels in correct order savedState.forEach(function (item) { var panel = panelMap[item.id]; if (panel && columns[item.column]) { // Update panel classes panel.className = 'panel ' + (item.classes || ''); // Update header classes var panelHeader = panel.querySelector('.panel-hdr'); if (panelHeader && item.headerClasses) { panelHeader.className = 'panel-hdr ' + item.headerClasses; } // Append to correct column columns[item.column].appendChild(panel); } }); }, // Reset panel state resetPanelState = function () { var pageId = getPageIdentifier(); var allStates = JSON.parse(sessionStorage.getItem('allPanelStates') || '{}'); delete allStates[pageId]; sessionStorage.setItem('allPanelStates', JSON.stringify(allStates)); //refresh page window.location.reload(); }, savingIndicator = function () { // Create or get the indicator element let indicator = document.getElementById('saving-indicator'); if (!indicator) { indicator = document.createElement('div'); indicator.id = 'saving-indicator'; document.body.appendChild(indicator); } // Show saving animation //indicator.textContent = ''; indicator.className = 'saving-indicator spinner-border show'; // After a brief delay, show success and hide setTimeout(() => { //indicator.textContent = ''; indicator.className = 'saving-indicator spinner-border show success'; setTimeout(() => { indicator.className = 'saving-indicator spinner-border success'; }, 500); }, 300); }, //load page layout settings layoutSettings = loadSettings(); layoutSettings.htmlRoot && (htmlRoot.className = layoutSettings.htmlRoot); // Load panel settings is triggered just before