You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
141 lines
4.0 KiB
141 lines
4.0 KiB
(function () { |
|
'use strict'; |
|
|
|
var shell = document.querySelector('[data-app-shell]'); |
|
if (!shell) { |
|
return; |
|
} |
|
|
|
var sidebar = shell.querySelector('[data-app-sidebar]'); |
|
var sheet = shell.querySelector('[data-nav-sheet]'); |
|
var backdrop = shell.querySelector('[data-nav-backdrop]'); |
|
var storageKey = 'geonet-console-sidebar-collapsed'; |
|
var groupStorageKey = 'geonet-console-nav-groups'; |
|
|
|
function readJson(key, fallback) { |
|
try { |
|
var raw = localStorage.getItem(key); |
|
return raw ? JSON.parse(raw) : fallback; |
|
} catch (e) { |
|
return fallback; |
|
} |
|
} |
|
|
|
function writeJson(key, value) { |
|
try { |
|
localStorage.setItem(key, JSON.stringify(value)); |
|
} catch (e) {} |
|
} |
|
|
|
function setSidebarCollapsed(collapsed) { |
|
shell.classList.toggle('is-sidebar-collapsed', collapsed); |
|
if (sidebar) { |
|
sidebar.setAttribute('aria-expanded', collapsed ? 'false' : 'true'); |
|
} |
|
try { |
|
localStorage.setItem(storageKey, collapsed ? '1' : '0'); |
|
} catch (e) {} |
|
} |
|
|
|
function isDesktop() { |
|
return window.matchMedia('(min-width: 1024px)').matches; |
|
} |
|
|
|
function openMobileNav() { |
|
shell.classList.add('is-nav-open'); |
|
if (sheet) { |
|
sheet.hidden = false; |
|
} |
|
if (backdrop) { |
|
backdrop.hidden = false; |
|
} |
|
document.body.classList.add('app-nav-open'); |
|
} |
|
|
|
function closeMobileNav() { |
|
shell.classList.remove('is-nav-open'); |
|
if (sheet) { |
|
sheet.hidden = true; |
|
} |
|
if (backdrop) { |
|
backdrop.hidden = true; |
|
} |
|
document.body.classList.remove('app-nav-open'); |
|
} |
|
|
|
function toggleGroup(groupEl, open) { |
|
if (!groupEl) { |
|
return; |
|
} |
|
|
|
var shouldOpen = typeof open === 'boolean' ? open : !groupEl.hasAttribute('data-open'); |
|
if (shouldOpen) { |
|
groupEl.setAttribute('data-open', ''); |
|
} else { |
|
groupEl.removeAttribute('data-open'); |
|
} |
|
|
|
var btn = groupEl.querySelector('[data-nav-group-toggle]'); |
|
if (btn) { |
|
btn.setAttribute('aria-expanded', shouldOpen ? 'true' : 'false'); |
|
} |
|
|
|
var saved = readJson(groupStorageKey, {}); |
|
saved[groupEl.getAttribute('data-nav-group')] = shouldOpen; |
|
writeJson(groupStorageKey, saved); |
|
} |
|
|
|
if (localStorage.getItem(storageKey) === '1' && isDesktop()) { |
|
setSidebarCollapsed(true); |
|
} |
|
|
|
var savedGroups = readJson(groupStorageKey, {}); |
|
shell.querySelectorAll('[data-nav-group]').forEach(function (groupEl) { |
|
var id = groupEl.getAttribute('data-nav-group'); |
|
if (Object.prototype.hasOwnProperty.call(savedGroups, id)) { |
|
toggleGroup(groupEl, !!savedGroups[id]); |
|
} |
|
}); |
|
|
|
shell.querySelectorAll('[data-sidebar-toggle]').forEach(function (btn) { |
|
btn.addEventListener('click', function () { |
|
setSidebarCollapsed(!shell.classList.contains('is-sidebar-collapsed')); |
|
}); |
|
}); |
|
|
|
shell.querySelectorAll('[data-nav-group-toggle]').forEach(function (btn) { |
|
btn.addEventListener('click', function () { |
|
toggleGroup(btn.closest('[data-nav-group]')); |
|
}); |
|
}); |
|
|
|
shell.querySelectorAll('[data-nav-open]').forEach(function (btn) { |
|
btn.addEventListener('click', function () { |
|
if (isDesktop()) { |
|
setSidebarCollapsed(false); |
|
return; |
|
} |
|
openMobileNav(); |
|
}); |
|
}); |
|
|
|
shell.querySelectorAll('[data-nav-close]').forEach(function (btn) { |
|
btn.addEventListener('click', closeMobileNav); |
|
}); |
|
|
|
if (backdrop) { |
|
backdrop.addEventListener('click', closeMobileNav); |
|
} |
|
|
|
document.addEventListener('keydown', function (event) { |
|
if (event.key === 'Escape') { |
|
closeMobileNav(); |
|
} |
|
}); |
|
|
|
window.addEventListener('resize', function () { |
|
if (isDesktop()) { |
|
closeMobileNav(); |
|
} |
|
}); |
|
})();
|
|
|