{"version":3,"sources":["../src/constant.ts","../src/index.ts"],"names":["Default","parentTrigger","subMenu","toggle","triggerElement","ClassNames","MetisMenu","element","options","this","document","querySelector","cacheEl","config","__assign","cacheConfig","disposed","ulArr","listenerOb","init","prototype","update","dispose","_i","_a","length","lo","key","hasOwnProperty","el","removeEventListener","on","event","fn","addEventListener","off","emit","eventDetail","shouldBubble","evt","CustomEvent","bubbles","detail","createEvent","initCustomEvent","dispatchEvent","slice","call","querySelectorAll","ul","li","parentNode","classList","add","contains","show","hide","a","getAttribute","setAttribute","aClick","clickEvent","bind","listener","push","ev","currentTarget","tagName","preventDefault","_this","isTransitioning","complete","remove","style","height","setTransitioning","shownElement","eleParentSiblins","children","filter","c","eleParentSiblins_1","sibUl","scrollHeight","showElement","hideElement","hiddenElement","getBoundingClientRect","offsetHeight"],"mappings":"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","sourcesContent":["import { IMMClassNames, IMMOptions } from \"./interface\";\n\nexport type MetisMenuEvents =\n | \"show.metisMenu\"\n | \"shown.metisMenu\"\n | \"hide.metisMenu\"\n | \"hidden.metisMenu\";\n\nexport const Default: IMMOptions = {\n parentTrigger: \"li\",\n subMenu: \"ul\",\n toggle: true,\n triggerElement: \"a\"\n};\n\nexport const ClassNames: IMMClassNames = {\n activeClass: \"active\",\n collapseClass: \"collapse\",\n collapseInClass: \"in\",\n collapsingClass: \"collapsing\"\n};\n","import { ClassNames, Default, MetisMenuEvents } from \"./constant\";\nimport { IMMOptions } from \"./interface\";\n\nclass MetisMenu {\n public config: IMMOptions;\n public element: HTMLElement;\n private isTransitioning: boolean;\n private disposed: boolean;\n private ulArr: any[];\n private cacheEl: HTMLElement;\n private cacheConfig: IMMOptions;\n private listenerOb: any[];\n\n /**\n * Creates an instance of OnoffCanvas.\n *\n * @constructor\n * @param {HTMLElement | string} element\n * @param {IMMOptions} [options]\n * @memberof MetisMenu\n */\n\n constructor(element: HTMLElement | string, options?: IMMOptions) {\n this.element =\n typeof element === \"string\" ? document.querySelector(element) : element;\n this.cacheEl = this.element;\n this.config = { ...Default, ...options };\n this.cacheConfig = this.config;\n this.disposed = false;\n this.ulArr = [];\n this.listenerOb = [];\n this.init();\n }\n\n public update() {\n this.disposed = false;\n this.element = this.cacheEl;\n this.config = this.cacheConfig;\n this.init();\n }\n\n public dispose() {\n for (const lo of this.listenerOb) {\n for (const key in lo) {\n if (lo.hasOwnProperty(key)) {\n const el = lo[key];\n el[1].removeEventListener(el[0], el[2]);\n }\n }\n }\n this.ulArr = [];\n this.listenerOb = [];\n this.config = null;\n this.element = null;\n this.disposed = true;\n }\n\n public on(event: MetisMenuEvents, fn: EventListenerOrEventListenerObject) {\n this.element.addEventListener(event, fn, false);\n return this;\n }\n\n public off(event: MetisMenuEvents, fn: EventListenerOrEventListenerObject) {\n this.element.removeEventListener(event, fn);\n return this;\n }\n\n private emit(\n event: MetisMenuEvents,\n eventDetail: object,\n shouldBubble = false\n ) {\n let evt;\n if (typeof CustomEvent === \"function\") {\n evt = new CustomEvent(event, {\n bubbles: shouldBubble,\n detail: eventDetail\n });\n } else {\n evt = document.createEvent(\"CustomEvent\");\n evt.initCustomEvent(event, shouldBubble, false, eventDetail);\n }\n this.element.dispatchEvent(evt);\n return this;\n }\n\n private init(): void {\n this.ulArr = [].slice.call(\n this.element.querySelectorAll(this.config.subMenu)\n );\n for (const ul of this.ulArr) {\n const li = ul.parentNode;\n ul.classList.add(ClassNames.collapseClass);\n\n if (li.classList.contains(ClassNames.activeClass)) {\n this.show(ul);\n } else {\n this.hide(ul);\n }\n const a = li.querySelector(this.config.triggerElement);\n if (a.getAttribute(\"aria-disabled\") === \"true\") {\n return;\n }\n\n a.setAttribute(\"aria-expanded\", \"false\");\n const listenerOb = {\n aClick: [\"click\", a, this.clickEvent.bind(this)]\n };\n\n for (const key in listenerOb) {\n if (listenerOb.hasOwnProperty(key)) {\n const listener = listenerOb[key];\n listener[1].addEventListener(listener[0], listener[2]);\n }\n }\n this.listenerOb.push(listenerOb);\n }\n }\n\n private clickEvent(ev?) {\n if (!this.disposed) {\n if (ev.currentTarget.tagName === \"A\") {\n ev.preventDefault();\n }\n\n const li = ev.currentTarget.parentNode;\n const ul = li.querySelector(this.config.subMenu);\n this.toggle(ul);\n }\n }\n\n private toggle(ul) {\n if (ul.parentNode.classList.contains(ClassNames.activeClass)) {\n this.hide(ul);\n } else {\n this.show(ul);\n }\n }\n\n private show(ul) {\n if (\n this.isTransitioning ||\n ul.classList.contains(ClassNames.collapseInClass)\n ) {\n return;\n }\n const complete = () => {\n ul.classList.remove(ClassNames.collapsingClass);\n ul.style.height = \"\";\n ul.removeEventListener(\"transitionend\", complete);\n this.setTransitioning(false);\n this.emit(\"shown.metisMenu\", {\n shownElement: ul\n });\n };\n\n const li = ul.parentNode;\n li.classList.add(ClassNames.activeClass);\n\n const a = li.querySelector(this.config.triggerElement);\n a.setAttribute(\"aria-expanded\", \"true\");\n\n ul.style.height = \"0px\";\n ul.classList.remove(ClassNames.collapseClass);\n ul.classList.remove(ClassNames.collapseInClass);\n ul.classList.add(ClassNames.collapsingClass);\n const eleParentSiblins = [].slice\n .call(li.parentNode.children)\n .filter(c => c !== li);\n if (this.config.toggle && eleParentSiblins.length > 0) {\n for (const sibli of eleParentSiblins) {\n const sibUl = sibli.querySelector(this.config.subMenu);\n if (sibUl !== null) {\n this.hide(sibUl);\n }\n }\n }\n\n this.setTransitioning(true);\n\n ul.classList.add(ClassNames.collapseClass);\n ul.classList.add(ClassNames.collapseInClass);\n ul.style.height = ul.scrollHeight + \"px\";\n this.emit(\"show.metisMenu\", {\n showElement: ul\n });\n ul.addEventListener(\"transitionend\", complete);\n }\n\n private hide(ul) {\n if (\n this.isTransitioning ||\n !ul.classList.contains(ClassNames.collapseInClass)\n ) {\n return;\n }\n this.emit(\"hide.metisMenu\", {\n hideElement: ul\n });\n\n const li = ul.parentNode;\n li.classList.remove(ClassNames.activeClass);\n\n const complete = () => {\n ul.classList.remove(ClassNames.collapsingClass);\n ul.classList.add(ClassNames.collapseClass);\n ul.removeEventListener(\"transitionend\", complete);\n this.setTransitioning(false);\n this.emit(\"hidden.metisMenu\", {\n hiddenElement: ul\n });\n };\n\n ul.style.height = ul.getBoundingClientRect().height + \"px\";\n ul.style.height = ul.offsetHeight + \"px\";\n\n ul.classList.add(ClassNames.collapsingClass);\n ul.classList.remove(ClassNames.collapseClass);\n ul.classList.remove(ClassNames.collapseInClass);\n this.setTransitioning(true);\n\n ul.addEventListener(\"transitionend\", complete);\n\n ul.style.height = \"0px\";\n\n const a = li.querySelector(this.config.triggerElement);\n a.setAttribute(\"aria-expanded\", \"false\");\n }\n\n private setTransitioning(isTransitioning) {\n this.isTransitioning = isTransitioning;\n }\n}\n\nexport default MetisMenu;\n"]}