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
JavaScript
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);