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

136 lines (108 loc) 3.6 kB
var Collapse = { init: function( options, elem ) { this.options = $.extend( {}, this.options, options ); this.elem = elem; this.element = $(elem); this.toggle = null; this._setOptionsFromDOM(); this._create(); Utils.exec(this.options.onCollapseCreate, [this.element]); return this; }, options: { collapsed: false, toggleElement: false, duration: METRO_ANIMATION_DURATION, onExpand: Metro.noop, onCollapse: Metro.noop, onCollapseCreate: 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; toggle = o.toggleElement !== false ? $(o.toggleElement) : element.siblings('.collapse-toggle').length > 0 ? element.siblings('.collapse-toggle') : element.siblings('a:nth-child(1)'); if (o.collapsed === true || element.attr("collapsed") === true) { element.hide(0); } toggle.on(Metro.events.click, function(e){ if (element.css('display') === 'block' && !element.hasClass('keep-open')) { that._close(element); } else { that._open(element); } if (["INPUT"].indexOf(e.target.tagName) === -1) { e.preventDefault(); } e.stopPropagation(); }); this.toggle = toggle; }, _close: function(el){ if (Utils.isJQueryObject(el) === false) { el = $(el); } var dropdown = el.data("collapse"); var options = dropdown.options; this.toggle.removeClass("active-toggle"); el.slideUp(options.duration, function(){ el.trigger("onCollapse", null, el); el.data("collapsed", true); el.addClass("collapsed"); Utils.exec(options.onCollapse, [el]); }); }, _open: function(el){ if (Utils.isJQueryObject(el) === false) { el = $(el); } var dropdown = el.data("collapse"); var options = dropdown.options; this.toggle.addClass("active-toggle"); el.slideDown(options.duration, function(){ el.trigger("onExpand", null, el); el.data("collapsed", false); el.removeClass("collapsed"); Utils.exec(options.onExpand, [el]); }); }, collapse: function(){ this._close(this.element); }, expand: function(){ this._open(this.element); }, isCollapsed: function(){ return this.element.data("collapsed"); }, toggleState: function(){ var element = this.element; if (element.attr("collapsed") === true || element.data("collapsed") === true) { this.collapse(); } else { this.expand(); } }, changeAttribute: function(attributeName){ switch (attributeName) { case "collapsed": case "data-collapsed": this.toggleState(); break; } }, destroy: function(){ this.toggle.off(Metro.events.click); this.element.show(); } }; Metro.plugin('collapse', Collapse);