214 lines
6.9 KiB
JavaScript
214 lines
6.9 KiB
JavaScript
export default function menuInit() {
|
|
const header = document.querySelector('#main-header');
|
|
|
|
// Search module
|
|
const searchModule = header.querySelector('.search-module');
|
|
const searchModuleToggle = header.querySelector('#search-module-toggle');
|
|
|
|
// Mobile Menu
|
|
const mobileMenuToggle = header.querySelector('#mobile-menu-toggle');
|
|
|
|
/* -----------------------------------------------------------
|
|
HANDLE SUBMENUS
|
|
-----------------------------------------------------------*/
|
|
// SubmenusToggles
|
|
const submenuToggles = header.querySelectorAll('.menu-item__submenu-toggle');
|
|
const submenuCloseBtns = header.querySelectorAll('.menu-item__submenu-close');
|
|
|
|
function isSubmenuOpen() {
|
|
return header.querySelector('sub-menu-open') !== null;
|
|
}
|
|
|
|
function openSubmenu(buttonToggle) {
|
|
let isExpanded = buttonToggle.getAttribute('aria-expanded') === 'true';
|
|
buttonToggle.setAttribute('aria-expanded', !isExpanded);
|
|
buttonToggle.parentElement.querySelector('.sub-menu').classList.toggle('sub-menu--open');
|
|
buttonToggle.parentElement.querySelector('.sub-menu').classList.toggle('sub-menu--closed');
|
|
}
|
|
function closeSubmenus() {
|
|
const openSubmenus = header.querySelectorAll('.sub-menu--open');
|
|
openSubmenus.forEach((submenu) => {
|
|
submenu.classList.remove('sub-menu--open');
|
|
submenu.classList.add('sub-menu--closed');
|
|
submenu.parentElement
|
|
.querySelector('.menu-item__submenu-toggle')
|
|
.setAttribute('aria-expanded', 'false');
|
|
});
|
|
}
|
|
|
|
function handleSubmenuToggle(buttonToggle) {
|
|
let isExpanded = buttonToggle.getAttribute('aria-expanded') === 'true';
|
|
if (!isExpanded) {
|
|
closeSubmenus();
|
|
openSubmenu(buttonToggle);
|
|
} else {
|
|
closeSubmenus();
|
|
}
|
|
}
|
|
|
|
function closeCurrentSubmenu(buttonClose) {
|
|
console.log('close submenu');
|
|
console.log(buttonClose.parentElement);
|
|
const currentOpenedSubmenu = buttonClose.parentElement;
|
|
|
|
currentOpenedSubmenu.classList.remove('sub-menu--open');
|
|
currentOpenedSubmenu.classList.add('sub-menu--closed');
|
|
currentOpenedSubmenu.parentElement
|
|
.querySelector('.menu-item__submenu-toggle')
|
|
.setAttribute('aria-expanded', 'false');
|
|
}
|
|
// SUBMENU TOGGGLES open/close
|
|
submenuToggles.forEach((button) => {
|
|
button.addEventListener('click', () => {
|
|
if (isSearchOpen() === true) {
|
|
closeSearch();
|
|
}
|
|
handleSubmenuToggle(button);
|
|
// closeSearch();
|
|
});
|
|
});
|
|
|
|
submenuCloseBtns.forEach((button) => {
|
|
button.addEventListener('click', () => closeCurrentSubmenu(button));
|
|
});
|
|
|
|
/* -----------------------------------------------------------
|
|
HANDLE SEARCH
|
|
-----------------------------------------------------------*/
|
|
function isSearchOpen() {
|
|
// IF CLOSED
|
|
if (
|
|
searchModule.getAttribute('mobile-closed') != null &&
|
|
searchModule.getAttribute('aria-hidden') != null &&
|
|
searchModule.getAttribute('mobile-opened') === null
|
|
) {
|
|
return false;
|
|
}
|
|
|
|
// IF OPENED
|
|
if (
|
|
searchModule.getAttribute('mobile-opened') != null &&
|
|
searchModule.getAttribute('mobile-closed') === null &&
|
|
searchModule.getAttribute('aria-hidden') === null
|
|
) {
|
|
return true;
|
|
}
|
|
// IF TRANSITIONNING OR PROBLEM
|
|
return null;
|
|
}
|
|
function openSearch() {
|
|
searchModuleToggle.setAttribute('aria-expanded', '');
|
|
searchModule.setAttribute('mobile-opened', '');
|
|
searchModule.removeAttribute('mobile-closed');
|
|
setTimeout(() => {
|
|
searchModule.removeAttribute('aria-hidden');
|
|
}, 400);
|
|
}
|
|
function closeSearch() {
|
|
searchModule.setAttribute('aria-hidden', '');
|
|
searchModule.removeAttribute('mobile-opened', '');
|
|
|
|
searchModule.setAttribute('mobile-closing', '');
|
|
|
|
searchModule.addEventListener(
|
|
'animationend',
|
|
() => {
|
|
searchModule.setAttribute('mobile-closed', '');
|
|
searchModule.removeAttribute('mobile-closing', '');
|
|
},
|
|
{ once: true }
|
|
);
|
|
// setTimeout(() => {
|
|
// searchModule.setAttribute('mobile-closed', '');
|
|
// searchModule.removeAttribute('mobile-opened', '');
|
|
// }, 50);
|
|
|
|
searchModuleToggle.toggleAttribute('aria-expanded');
|
|
}
|
|
|
|
// SEARCH TOGGLE open/close
|
|
searchModuleToggle.addEventListener('click', function (e) {
|
|
closeSubmenus();
|
|
|
|
// SEARCH IS CLOSED --> OPEN IT
|
|
if (isSearchOpen() === false) {
|
|
openSearch();
|
|
return;
|
|
}
|
|
|
|
// SEARCH IS OPEN --> CLOSE IT
|
|
if (isSearchOpen() === true) {
|
|
closeSearch();
|
|
}
|
|
});
|
|
|
|
/* -----------------------------------------------------------
|
|
HANDLE MOBILE
|
|
-----------------------------------------------------------*/
|
|
const renovateurNavListContainer = header.querySelector('.menu-renovateur__navlist-container');
|
|
const HomegradeNavListContainer = header.querySelector('.menu-homegrade');
|
|
|
|
function openMenu(menuContainer) {
|
|
// header.removeAttribute('closed', '');
|
|
// header.setAttribute('opened', '');
|
|
// header.removeAttribute('aria-hidden', '');
|
|
// header.setAttribute('opening', '');
|
|
|
|
// RENOVATEUR
|
|
menuContainer.removeAttribute('closed', '');
|
|
menuContainer.setAttribute('opened', '');
|
|
menuContainer.removeAttribute('aria-hidden', '');
|
|
menuContainer.setAttribute('opening', '');
|
|
|
|
menuContainer.addEventListener(
|
|
'animationend',
|
|
() => {
|
|
menuContainer.removeAttribute('opening', '');
|
|
},
|
|
{ once: true }
|
|
);
|
|
}
|
|
function closeMenu(menuContainer) {
|
|
// header.removeAttribute('opened');
|
|
// header.setAttribute('aria-hidden', '');
|
|
// header.setAttribute('closing', '');
|
|
|
|
menuContainer.removeAttribute('opened');
|
|
menuContainer.setAttribute('aria-hidden', '');
|
|
menuContainer.setAttribute('closing', '');
|
|
|
|
menuContainer.addEventListener(
|
|
'animationend',
|
|
() => {
|
|
menuContainer.setAttribute('closed', '');
|
|
menuContainer.removeAttribute('closing', '');
|
|
},
|
|
{ once: true }
|
|
);
|
|
}
|
|
mobileMenuToggle.addEventListener('click', function (e) {
|
|
const isNavOpened = renovateurNavListContainer.hasAttribute('opened');
|
|
|
|
// Button Text Content
|
|
const textContent = mobileMenuToggle.querySelector('span.text-content');
|
|
const dataTextOpen = mobileMenuToggle.getAttribute('data-text-open');
|
|
const dataTextClose = mobileMenuToggle.getAttribute('data-text-close');
|
|
|
|
// Change Text button
|
|
textContent.textContent = isNavOpened ? dataTextOpen : dataTextClose;
|
|
|
|
// Toggle Aria-expanded
|
|
mobileMenuToggle.toggleAttribute('aria-expanded');
|
|
|
|
// Handle Visibility
|
|
if (isNavOpened) {
|
|
closeMenu(renovateurNavListContainer);
|
|
closeMenu(HomegradeNavListContainer);
|
|
}
|
|
if (!isNavOpened) {
|
|
openMenu(renovateurNavListContainer);
|
|
openMenu(HomegradeNavListContainer);
|
|
}
|
|
});
|
|
}
|