framework7
Version:
Full featured mobile HTML framework for building iOS & Android apps
72 lines (69 loc) • 2.04 kB
JavaScript
import $ from 'dom7';
const Menu = {
open(el = '.menu-item-dropdown') {
const app = this;
if (!el) return;
const $el = $(el).closest('.menu-item-dropdown');
if (!$el.length) return;
const $menuEl = $el.closest('.menu').eq(0);
if ($menuEl.length) {
const zIndex = $menuEl.css('z-index');
const originalZIndex = $menuEl[0].style.zIndex;
$menuEl.css('z-index', parseInt(zIndex || 0, 0) + 1);
$menuEl[0].f7MenuZIndex = originalZIndex;
}
$el.eq(0).addClass('menu-item-dropdown-opened').trigger('menu:opened');
app.emit('menuOpened', $el.eq(0)[0]);
},
close(el = '.menu-item-dropdown-opened') {
const app = this;
if (!el) return;
const $el = $(el).closest('.menu-item-dropdown-opened');
if (!$el.length) return;
const $menuEl = $el.closest('.menu').eq(0);
if ($menuEl.length) {
const zIndex = $menuEl[0].f7MenuZIndex;
$menuEl.css('z-index', zIndex);
delete $menuEl[0].f7MenuZIndex;
}
$el.eq(0).removeClass('menu-item-dropdown-opened').trigger('menu:closed');
app.emit('menuClosed', $el.eq(0)[0]);
},
};
export default {
name: 'menu',
create() {
const app = this;
app.menu = {
open: Menu.open.bind(app),
close: Menu.close.bind(app),
};
},
on: {
click(e) {
const app = this;
const openedMenus = $('.menu-item-dropdown-opened');
if (!openedMenus.length) return;
openedMenus.each((index, el) => {
if (!$(e.target).closest('.menu-item-dropdown-opened').length) {
app.menu.close(el);
}
});
},
},
clicks: {
'.menu-item-dropdown': function onClick($clickedEl, dataset, e) {
const app = this;
if ($clickedEl.hasClass('menu-item-dropdown-opened')) {
if ($(e.target).closest('.menu-dropdown').length) return;
app.menu.close($clickedEl);
} else {
app.menu.open($clickedEl);
}
},
'.menu-close': function onClick() {
const app = this;
app.menu.close();
},
},
};