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
105 lines (79 loc) • 2.96 kB
JavaScript
var ButtonGroup = {
init: function( options, elem ) {
this.options = $.extend( {}, this.options, options );
this.elem = elem;
this.element = $(elem);
this.active = null;
this._setOptionsFromDOM();
this._create();
return this;
},
options: {
targets: "button",
clsActive: "active",
requiredButton: false,
mode: Metro.groupMode.ONE,
onButtonClick: Metro.noop,
onButtonsGroupCreate: 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;
this._createGroup();
this._createEvents();
Utils.exec(o.onButtonsGroupCreate, [element]);
},
_createGroup: function(){
var that = this, element = this.element, o = this.options;
var cls, buttons, buttons_active, id = Utils.elementId("button-group");
if (element.attr("id") === undefined) {
element.attr("id", id);
}
element.addClass("button-group");
buttons = element.find( o.targets );
buttons_active = element.find( "." + o.clsActive );
if (o.mode === Metro.groupMode.ONE && buttons_active.length === 0 && o.requiredButton === true) {
$(buttons[0]).addClass(o.clsActive);
}
if (o.mode === Metro.groupMode.ONE && buttons_active.length > 1) {
buttons.removeClass(o.clsActive);
$(buttons[0]).addClass(o.clsActive);
}
element.find( "." + o.clsActive ).addClass("js-active");
},
_createEvents: function(){
var that = this, element = this.element, o = this.options;
element.on(Metro.events.click, o.targets, function(){
var el = $(this);
Utils.exec(o.onButtonClick, [el], this);
if (o.mode === Metro.groupMode.ONE && el.hasClass(o.clsActive)) {
return ;
}
if (o.mode === Metro.groupMode.ONE) {
element.find(o.targets).removeClass(o.clsActive).removeClass("js-active");
el.addClass(o.clsActive).addClass("js-active");
} else {
el.toggleClass(o.clsActive).toggleClass("js-active");
}
});
},
changeAttribute: function(attributeName){
},
destroy: function(){
var element = this.element, o = this.options;
element.off(Metro.events.click, o.targets);
element.find(o.targets).removeClass(o.clsActive).removeClass("js-active");
}
};
Metro.plugin('buttongroup', ButtonGroup);