Files
dbois/public/js/vendor/Plugin/menu.js
T
2017-12-14 10:17:13 +01:00

225 lines
6.6 KiB
JavaScript
Executable File

(function (global, factory) {
if (typeof define === "function" && define.amd) {
define('/Plugin/menu', ['exports', 'Plugin'], factory);
} else if (typeof exports !== "undefined") {
factory(exports, require('Plugin'));
} else {
var mod = {
exports: {}
};
factory(mod.exports, global.Plugin);
global.PluginMenu = mod.exports;
}
})(this, function (exports, _Plugin2) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _Plugin3 = babelHelpers.interopRequireDefault(_Plugin2);
var NAME = 'menu';
var Menu = function (_Plugin) {
babelHelpers.inherits(Menu, _Plugin);
function Menu() {
var _ref;
babelHelpers.classCallCheck(this, Menu);
for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
var _this = babelHelpers.possibleConstructorReturn(this, (_ref = Menu.__proto__ || Object.getPrototypeOf(Menu)).call.apply(_ref, [this].concat(args)));
_this.folded = true;
_this.foldAlt = true;
_this.outerHeight = 0;
return _this;
}
babelHelpers.createClass(Menu, [{
key: 'getName',
value: function getName() {
return NAME;
}
}, {
key: 'render',
value: function render() {
this.bindEvents();
this.$el.data('menuApi', this);
}
}, {
key: 'bindEvents',
value: function bindEvents() {
var self = this;
this.$el.on('mouseenter.site.menu', '.site-menu-item', function () {
var $item = $(this);
if (self.folded === true && $item.is('.has-sub') && $item.parent('.site-menu').length > 0) {
var $sub = $item.children('.site-menu-sub');
self.position($item, $sub);
}
$item.addClass('hover');
}).on('mouseleave.site.menu', '.site-menu-item', function () {
var $item = $(this);
if (self.folded === true && $item.is('.has-sub') && $item.parent('.site-menu').length > 0) {
$item.children('.site-menu-sub').css('max-height', '');
$item.removeClass('open');
}
$item.removeClass('hover');
}).on('deactive.site.menu', '.site-menu-item.active', function (e) {
$(this).removeClass('active');
e.stopPropagation();
}).on('active.site.menu', '.site-menu-item', function (e) {
$(this).addClass('active');
e.stopPropagation();
}).on('open.site.menu', '.site-menu-item', function (e) {
var $item = $(this);
self.expand($item, function () {
$item.addClass('open');
});
if (self.options.accordion) {
$item.siblings('.open').trigger('close.site.menu');
}
e.stopPropagation();
}).on('close.site.menu', '.site-menu-item.open', function (e) {
var $item = $(this);
self.collapse($item, function () {
$item.removeClass('open');
});
e.stopPropagation();
}).on('click.site.menu ', '.site-menu-item', function (e) {
var $item = $(this);
if ($item.is('.has-sub') && $(e.target).closest('.site-menu-item').is(this)) {
if ($item.is('.open')) {
$item.trigger('close.site.menu');
} else {
$item.trigger('open.site.menu');
}
} else if (!$item.is('.active')) {
$item.siblings('.active').trigger('deactive.site.menu');
$item.trigger('active.site.menu');
}
e.stopPropagation();
}).on('tap.site.menu', '> .site-menu-item > a', function () {
var link = $(this).attr('href');
if (link) {
window.location = link;
}
}).on('touchend.site.menu', '> .site-menu-item > a', function () {
var $item = $(this).parent('.site-menu-item');
if (self.folded === true) {
if ($item.is('.has-sub') && $item.parent('.site-menu').length > 0) {
$item.siblings('.hover').removeClass('hover');
if ($item.is('.hover')) {
$item.removeClass('hover');
} else {
$item.addClass('hover');
}
}
}
}).on('scroll.site.menu', '.site-menu-sub', function (e) {
e.stopPropagation();
});
}
}, {
key: 'collapse',
value: function collapse($item, callback) {
var self = this;
var $sub = $item.children('.site-menu-sub');
$sub.show().slideUp(this.options.speed, function () {
$(this).css('display', '');
$(this).find('> .site-menu-item').removeClass('is-shown');
if (callback) {
callback();
}
self.$el.trigger('collapsed.site.menu');
});
}
}, {
key: 'expand',
value: function expand($item, callback) {
var self = this;
var $sub = $item.children('.site-menu-sub');
var $children = $sub.children('.site-menu-item').addClass('is-hidden');
$sub.hide().slideDown(this.options.speed, function () {
$(this).css('display', '');
if (callback) {
callback();
}
self.$el.trigger('expanded.site.menu');
});
setTimeout(function () {
$children.addClass('is-shown');
$children.removeClass('is-hidden');
}, 0);
}
}, {
key: 'refresh',
value: function refresh() {
this.$el.find('.open').filter(':not(.active)').removeClass('open');
}
}, {
key: 'position',
value: function position($item, $dropdown) {
var itemHeight = $item.find('> a').outerHeight(),
menubarHeight = this.outerHeight,
offsetTop = $item.position().top;
$dropdown.removeClass('site-menu-sub-up').css('max-height', '');
if (offsetTop > menubarHeight / 2) {
$dropdown.addClass('site-menu-sub-up');
if (this.foldAlt) {
offsetTop -= itemHeight;
}
$dropdown.css('max-height', offsetTop + itemHeight);
} else {
if (this.foldAlt) {
offsetTop += itemHeight;
}
$dropdown.removeClass('site-menu-sub-up');
$dropdown.css('max-height', menubarHeight - offsetTop);
}
}
}], [{
key: 'getDefaults',
value: function getDefaults() {
return {
speed: 250,
accordion: true
};
}
}]);
return Menu;
}(_Plugin3.default);
_Plugin3.default.register(NAME, Menu);
exports.default = Menu;
});