mirror of
https://github.com/GSA/notifications-admin.git
synced 2026-02-06 11:23:48 -05:00
58 lines
1.9 KiB
JavaScript
58 lines
1.9 KiB
JavaScript
document.addEventListener('DOMContentLoaded', () => {
|
|
const sidenavItems = document.querySelectorAll('.usa-sidenav__item > .parent-link');
|
|
let lastPath = window.location.pathname;
|
|
let debounceTimeout = null;
|
|
|
|
sidenavItems.forEach((link) => {
|
|
const parentItem = link.parentElement;
|
|
const sublist = parentItem.querySelector('.usa-sidenav__sublist');
|
|
const targetHref = link.getAttribute('href');
|
|
|
|
// initialize the menu to open the correct submenu based on the current route
|
|
if (window.location.pathname.startsWith(targetHref)) {
|
|
parentItem.classList.add('open');
|
|
link.setAttribute('aria-expanded', 'true');
|
|
}
|
|
|
|
link.addEventListener('click', (event) => {
|
|
const currentPath = window.location.pathname;
|
|
|
|
// prevent default behavior only if navigating to the same route
|
|
if (currentPath === targetHref) {
|
|
event.preventDefault();
|
|
return;
|
|
}
|
|
|
|
if (sublist && !parentItem.classList.contains('open')) {
|
|
// debounce the menu update to avoid flickering
|
|
clearTimeout(debounceTimeout);
|
|
debounceTimeout = setTimeout(() => {
|
|
parentItem.classList.add('open');
|
|
link.setAttribute('aria-expanded', 'true');
|
|
}, 50);
|
|
}
|
|
});
|
|
});
|
|
|
|
// handle browser back/forward navigation
|
|
window.addEventListener('popstate', () => {
|
|
const currentPath = window.location.pathname;
|
|
|
|
// sync menu state
|
|
sidenavItems.forEach((link) => {
|
|
const parentItem = link.parentElement;
|
|
const targetHref = link.getAttribute('href');
|
|
|
|
if (currentPath.startsWith(targetHref)) {
|
|
parentItem.classList.add('open');
|
|
link.setAttribute('aria-expanded', 'true');
|
|
} else {
|
|
parentItem.classList.remove('open');
|
|
link.setAttribute('aria-expanded', 'false');
|
|
}
|
|
});
|
|
|
|
lastPath = currentPath;
|
|
});
|
|
});
|