mmenu-js
Version:
The best javascript plugin for app look-alike on- and off-canvas menus with sliding submenus for your website and webapp.
121 lines (100 loc) • 3.72 kB
text/typescript
import Mmenu from '../../core/oncanvas/mmenu.oncanvas';
import options from './_options';
import { extendShorthandOptions } from './_options';
import * as DOM from '../../_modules/dom';
import * as media from '../../_modules/matchmedia';
import { type, extend } from '../../_modules/helpers';
// Add the options.
Mmenu.options.iconbar = options;
export default function (this: Mmenu) {
let options = extendShorthandOptions(this.opts.iconbar);
this.opts.iconbar = extend(options, Mmenu.options.iconbar);
if (!options.use) {
return;
}
let iconbar: HTMLElement;
['top', 'bottom'].forEach((position, n) => {
let ctnt = options[position];
// Extend shorthand options
if (type(ctnt) != 'array') {
ctnt = [ctnt];
}
// Create node
const part = DOM.create('div.mm-iconbar__' + position);
// Add content
for (let c = 0, l = ctnt.length; c < l; c++) {
if (typeof ctnt[c] == 'string') {
part.innerHTML += ctnt[c];
} else {
part.append(ctnt[c]);
}
}
if (part.children.length) {
if (!iconbar) {
iconbar = DOM.create('div.mm-iconbar');
}
iconbar.append(part);
}
});
// Add to menu
if (iconbar) {
// Add the iconbar.
this.bind('initMenu:after', () => {
this.node.menu.prepend(iconbar);
});
// En-/disable the iconbar.
let classname = 'mm-menu_iconbar-' + options.position;
let enable = () => {
this.node.menu.classList.add(classname);
Mmenu.sr_aria(iconbar, 'hidden', false);
};
let disable = () => {
this.node.menu.classList.remove(classname);
Mmenu.sr_aria(iconbar, 'hidden', true);
};
if (typeof options.use == 'boolean') {
this.bind('initMenu:after', enable);
} else {
media.add(options.use, enable, disable);
}
// Tabs
if (options.type == 'tabs') {
iconbar.classList.add('mm-iconbar_tabs');
iconbar.addEventListener('click', (evnt) => {
const anchor = evnt.target as HTMLElement;
if (!anchor.matches('a')) {
return;
}
if (anchor.matches('.mm-iconbar__tab_selected')) {
evnt.stopImmediatePropagation();
return;
}
try {
const panel = this.node.menu.querySelector(
anchor.getAttribute('href')
)[0];
if (panel && panel.matches('.mm-panel')) {
evnt.preventDefault();
evnt.stopImmediatePropagation();
this.openPanel(panel, false);
}
} catch (err) {}
});
const selectTab = (panel: HTMLElement) => {
DOM.find(iconbar, 'a').forEach((anchor) => {
anchor.classList.remove('mm-iconbar__tab_selected');
});
var anchor = DOM.find(iconbar, '[href="#' + panel.id + '"]')[0];
if (anchor) {
anchor.classList.add('mm-iconbar__tab_selected');
} else {
let parent: HTMLElement = panel['mmParent'];
if (parent) {
selectTab(parent.closest('.mm-panel') as HTMLElement);
}
}
};
this.bind('openPanel:start', selectTab);
}
}
}