{"version":3,"file":"assets/js/toggle.js","mappings":"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","sources":["webpack:///./javascript/components/toggle.ts"],"sourcesContent":["export default class Toggle {\n onlyOpen = 'data-open';\n\n onlyClose = 'data-close';\n\n openClass = 'opened';\n\n activeClass = 'active';\n\n timer: number = null;\n\n constructor(toggleElements: NodeListOf) {\n /**\n * ESS-2667 - some scenarios doesn't track accordion buttons\n * so we need to filter them out to make sure that we are\n * adding event listener only to accordion buttons\n */\n const accordionButtons = Array.from(toggleElements).filter((element) => element.classList.contains('accordion-button'));\n const nonAccordionButtons = Array.from(toggleElements).filter((element) => !element.classList.contains('accordion-button'));\n\n accordionButtons.forEach((element) => {\n element.addEventListener('click', this.handler.bind(this));\n const triggerWrapper = this.getTriggerWrapper(element as HTMLElement);\n const contentId = triggerWrapper.dataset.toggleid.split(' ');\n const content = this.getContentId(contentId);\n if (content.classList.contains('accordion-content-wrap')) {\n this.setAccesabilityForAccordion(content);\n }\n });\n\n nonAccordionButtons.forEach((element) => {\n element.addEventListener('click', this.handler.bind(this));\n });\n\n this.hashHandler();\n }\n\n getContentId = (contentId: string[]) => document.getElementById(contentId[0]) as HTMLDivElement;\n\n getTriggerWrapper = (trigger: HTMLElement) => trigger.closest('.js-toggle-wrap') as HTMLDivElement;\n\n handler(ev: Event) {\n const trigger = (ev.currentTarget) as HTMLElement;\n const isBurgerMenu = trigger.classList.contains('js-burger-menu');\n const triggerWrapper = this.getTriggerWrapper(trigger);\n const contentId = triggerWrapper.dataset.toggleid.split(' ');\n const content = this.getContentId(contentId);\n\n if (isBurgerMenu && triggerWrapper.classList.contains('active')) {\n const megaMenuList = trigger.dataset.idList.split(' ');\n if (megaMenuList) {\n megaMenuList.forEach((idName) => {\n const element = document.getElementById(idName);\n element.classList.remove('opened');\n });\n triggerWrapper.classList.remove('active');\n return;\n }\n return;\n }\n\n if (content) {\n const isCloseOnly = trigger.getAttribute(this.onlyClose)\n || trigger.hasAttribute(this.onlyClose);\n const isOpenOnly = trigger.getAttribute(this.onlyOpen)\n || trigger.hasAttribute(this.onlyOpen);\n\n // Only to open element by ID provided from trigger\n if (isOpenOnly) {\n this.onlyOpenElement(content, triggerWrapper);\n return;\n }\n\n // Only to close opened elements by ID provided from trigger\n if (isCloseOnly) {\n /*\n remove all active class from triggers\n example laguage region selector\n */\n if (isCloseOnly === 'all') {\n const toggleWrap = document.querySelectorAll(`.js-toggle-wrap[data-toggleId=\"${contentId}\"]`);\n // Accesaibility focus to back element\n const backFocusElement = document.querySelectorAll(`.js-toggle[data-mega-menu=\"${contentId}\"]`);\n if (backFocusElement.length) {\n (backFocusElement[0] as HTMLElement).focus();\n }\n\n Array.from(toggleWrap).forEach((element) => {\n element.classList.remove(this.activeClass);\n });\n }\n\n /**\n * if there is more content close them all\n * example navigation and mega menu relation on mobile devices\n */\n if (contentId.length > 1) {\n this.closeAllOpenedById(contentId);\n return;\n }\n\n content.classList.remove(this.openClass);\n triggerWrapper.classList.remove(this.activeClass);\n\n return;\n }\n content.classList.toggle(this.openClass);\n triggerWrapper.classList.toggle(this.activeClass);\n this.accesaibilityHandler(trigger, content);\n this.accordionAccesabilityHandler(content);\n }\n }\n\n /**\n * Close all opened elements by provided id from close trigger\n * @param contentId - array of opened elements\n * @returns\n */\n closeAllOpenedById(contentId: string[]) {\n return contentId.forEach((id) => {\n const toggleWrap = document.querySelectorAll(`.js-toggle-wrap[data-toggleId=\"${id}\"]`);\n Array.from(toggleWrap).forEach((element) => element.classList.remove(this.activeClass));\n const targetElement = document.getElementById(id);\n targetElement.classList.remove(this.openClass);\n });\n }\n\n /**\n * Open content by provided id from trigger\n * @param content html element to open\n * @param triggerWrapper trigger\n */\n onlyOpenElement(content: HTMLDivElement, triggerWrapper: HTMLDivElement) {\n content.classList.add(this.openClass);\n triggerWrapper.classList.add(this.activeClass);\n }\n\n /**\n * Automaticly opens accordion or dropdown if there is # in url\n * Notes: #{name} and html element id=\"toggle-{name}\" needs to be same\n */\n hashHandler() {\n const hash = window.location.hash.slice(1);\n window.clearTimeout(this.timer);\n if (hash) {\n const hashElem = document.querySelector(`#toggle-${hash}`);\n if (hashElem) {\n const jsToggleWrap = hashElem.parentElement;\n if (jsToggleWrap.classList.contains('js-toggle-wrap')) {\n this.timer = window.setTimeout(() => {\n if (jsToggleWrap.classList.contains('js-toggle-wrap')) {\n const navbar = document.querySelector('.js-fixed.navbar') as HTMLElement | null;\n const yAxes = jsToggleWrap.getBoundingClientRect().top\n + window.pageYOffset - navbar.offsetHeight;\n\n window.scrollTo({ top: yAxes, behavior: 'smooth' });\n const nested = jsToggleWrap.parentElement.closest('.js-toggle-wrap');\n if (nested) {\n nested.classList.add('active');\n }\n jsToggleWrap.classList.add('active');\n }\n }, 1000);\n }\n }\n }\n }\n\n /**\n * Set aria-expanded and aria-hidden attributes\n * @param trigger elemetn that is clicked\n * @param content target element to open or close\n */\n accesaibilityHandler(trigger: HTMLElement, content: HTMLDivElement) {\n const isExpanded = trigger.getAttribute('aria-expanded') === 'true';\n trigger.setAttribute('aria-expanded', String(!isExpanded));\n\n const isHidden = content.getAttribute('aria-hidden') === 'true';\n content.setAttribute('aria-hidden', String(!isHidden));\n }\n\n /**\n * Set tabindex to -1 if element is hidden\n * @param content target element to open or close\n */\n accordionAccesabilityHandler(content: HTMLElement) {\n const isAccordionContent = content.classList.contains('accordion-content-wrap');\n if (isAccordionContent) {\n const isOpened = content.classList.contains(this.openClass);\n const accesabilityElements = content.querySelectorAll('a, button');\n if (isOpened) {\n Array.from(accesabilityElements).forEach((element) => {\n element.setAttribute('tabindex', '0');\n });\n }\n\n if (!isOpened) {\n if (content.classList.contains('accordion-content-wrap')) {\n content.setAttribute('aria-hidden', 'true');\n }\n this.preventTabForHiddenElements(accesabilityElements);\n }\n }\n }\n\n setAccesabilityForAccordion(content: HTMLElement) {\n const accesabilityElements = content.querySelectorAll('a, button');\n this.preventTabForHiddenElements(accesabilityElements);\n }\n\n preventTabForHiddenElements(accesabilityElements: NodeListOf) {\n Array.from(accesabilityElements).forEach((element) => {\n element.setAttribute('tabindex', '-1');\n });\n }\n}\n"],"names":["Toggle","constructor","toggleElements","onlyOpen","onlyClose","openClass","activeClass","timer","getContentId","contentId","document","getElementById","getTriggerWrapper","trigger","closest","accordionButtons","Array","from","filter","element","classList","contains","nonAccordionButtons","forEach","addEventListener","this","handler","bind","dataset","toggleid","split","content","setAccesabilityForAccordion","hashHandler","ev","isBurgerMenu","triggerWrapper","megaMenuList","idList","idName","remove","isCloseOnly","getAttribute","hasAttribute","onlyOpenElement","toggleWrap","querySelectorAll","backFocusElement","length","focus","closeAllOpenedById","toggle","accesaibilityHandler","accordionAccesabilityHandler","id","add","hash","window","location","slice","clearTimeout","hashElem","querySelector","jsToggleWrap","parentElement","setTimeout","navbar","yAxes","getBoundingClientRect","top","pageYOffset","offsetHeight","scrollTo","behavior","nested","isExpanded","setAttribute","String","isHidden","isOpened","accesabilityElements","preventTabForHiddenElements"],"sourceRoot":""}