UNPKG

metro4

Version:

The front-end framework for Build responsive, mobile-first projects on the web with the first front-end component library in Metro Style

174 lines (141 loc) 5.38 kB
var Dropdown = { init: function( options, elem ) { this.options = $.extend( {}, this.options, options ); this.elem = elem; this.element = $(elem); this._toggle = null; this.displayOrigin = null; this._setOptionsFromDOM(); this._create(); Utils.exec(this.options.onDropdownCreate, [this.element]); return this; }, options: { effect: 'slide', toggleElement: null, noClose: false, duration: 100, onDrop: Metro.noop, onUp: Metro.noop, onDropdownCreate: Metro.noop }, _setOptionsFromDOM: function(){ var that = this, element = this.element, o = this.options; $.each(element.data(), function(key, value){ if (key in o) { try { o[key] = JSON.parse(value); } catch (e) { o[key] = value; } } }); }, _create: function(){ var that = this, element = this.element, o = this.options; var toggle, parent = element.parent(); var element_roles = Utils.isValue(element.attr("data-role")) ? Utils.strToArray(element.attr("data-role")) : []; toggle = o.toggleElement !== null ? $(o.toggleElement) : element.siblings('.dropdown-toggle').length > 0 ? element.siblings('.dropdown-toggle') : element.prev(); this.displayOrigin = element.css("display"); if (element.hasClass("v-menu")) { element.addClass("for-dropdown"); } element.css("display", "none"); if (element_roles.length === 0 || element_roles.indexOf("dropdown") === -1) { element_roles.push("dropdown"); element.attr("data-role", element_roles.join(", ")); } toggle.on(Metro.events.click, function(e){ parent.siblings(parent[0].tagName).removeClass("active-container"); $(".active-container").removeClass("active-container"); if (element.css('display') !== 'none' && !element.hasClass('keep-open')) { that._close(element); } else { $('[data-role=dropdown]').each(function(i, el){ if (!element.parents('[data-role=dropdown]').is(el) && !$(el).hasClass('keep-open') && $(el).css('display') !== 'none') { that._close(el); } }); if (element.hasClass('horizontal')) { element.css({ 'visibility': 'hidden', 'display': 'block' }); var children_width = 0; $.each(element.children('li'), function(){ children_width += $(this).outerWidth(true); }); element.css({ 'visibility': 'visible', 'display': 'none' }); element.css('width', children_width); } that._open(element); parent.addClass("active-container"); } e.preventDefault(); e.stopPropagation(); }); this._toggle = toggle; if (o.noClose === true) { element.addClass("keep-open").on(Metro.events.click, function (e) { //e.preventDefault(); e.stopPropagation(); }); } $(element).find('li.disabled a').on(Metro.events.click, function(e){ e.preventDefault(); }); }, _close: function(el){ if (Utils.isJQueryObject(el) === false) { el = $(el); } var dropdown = el.data("dropdown"); var toggle = dropdown._toggle; var options = dropdown.options; var func = options.effect === "slide" ? "slideUp" : "fadeOut"; toggle.removeClass('active-toggle').removeClass("active-control"); dropdown.element.parent().removeClass("active-container"); el[func](options.duration, function(){ el.trigger("onClose", null, el); }); Utils.exec(options.onUp, [el]); }, _open: function(el){ if (Utils.isJQueryObject(el) === false) { el = $(el); } var dropdown = el.data("dropdown"); var toggle = dropdown._toggle; var options = dropdown.options; var func = options.effect === "slide" ? "slideDown" : "fadeIn"; toggle.addClass('active-toggle').addClass("active-control"); el[func](options.duration, function(){ el.trigger("onOpen", null, el); }); Utils.exec(options.onDrop, [el]); }, close: function(){ this._close(this.element); }, open: function(){ this._open(this.element); }, changeAttribute: function(attributeName){ }, destroy: function(){ this._toggle.off(Metro.events.click); } }; $(document).on(Metro.events.click, function(e){ $('[data-role*=dropdown]').each(function(){ var el = $(this); if (el.css('display')==='block' && el.hasClass('keep-open') === false) { var dropdown = el.data('dropdown'); dropdown.close(); } }); }); Metro.plugin('dropdown', Dropdown);