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
171 lines (139 loc) • 5.08 kB
JavaScript
var AppBar = {
init: function( options, elem ) {
this.options = $.extend( {}, this.options, options );
this.elem = elem;
this.element = $(elem);
this._setOptionsFromDOM();
this._create();
return this;
},
options: {
expand: false,
expandPoint: null,
duration: 100,
onAppBarCreate: 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._createStructure();
this._createEvents();
Utils.exec(o.onAppBarCreate, [element]);
setImmediate(function(){
element.fire("appbarcreate");
});
},
_createStructure: function(){
var that = this, element = this.element, o = this.options;
var id = Utils.elementId("app-bar");
var hamburger, menu;
element.addClass("app-bar");
hamburger = element.find(".hamburger");
if (hamburger.length === 0) {
hamburger = $("<button>").attr("type", "button").addClass("hamburger menu-down");
for(var i = 0; i < 3; i++) {
$("<span>").addClass("line").appendTo(hamburger);
}
if (Colors.isLight(Utils.computedRgbToHex(Utils.getStyleOne(element, "background-color"))) === true) {
hamburger.addClass("dark");
}
}
element.prepend(hamburger);
menu = element.find(".app-bar-menu");
if (menu.length === 0) {
hamburger.css("display", "none");
} else {
Utils.addCssRule(Metro.sheet, ".app-bar-menu li", "list-style: none!important;"); // This special for IE11 and Edge
}
if( !!element.attr("id") === false ){
element.attr("id", id);
}
if (hamburger.css('display') === 'block') {
menu.hide().addClass("collapsed");
hamburger.removeClass("hidden");
} else {
hamburger.addClass("hidden");
}
if (o.expand === true) {
element.addClass("app-bar-expand");
hamburger.addClass("hidden");
} else {
if (Utils.isValue(o.expandPoint) && Utils.mediaExist(o.expandPoint)) {
element.addClass("app-bar-expand");
hamburger.addClass("hidden");
}
}
},
_createEvents: function(){
var that = this, element = this.element, o = this.options;
var menu = element.find(".app-bar-menu");
var hamburger = element.find(".hamburger");
element.on(Metro.events.click, ".hamburger", function(){
if (menu.length === 0) return ;
var collapsed = menu.hasClass("collapsed");
if (collapsed) {
that.open();
} else {
that.close();
}
});
$(window).on(Metro.events.resize+"-"+element.attr("id"), function(){
if (o.expand !== true) {
if (Utils.isValue(o.expandPoint) && Utils.mediaExist(o.expandPoint)) {
element.addClass("app-bar-expand");
} else {
element.removeClass("app-bar-expand");
}
}
if (menu.length === 0) return ;
if (hamburger.css('display') !== 'block') {
menu.show();
hamburger.addClass("hidden");
} else {
hamburger.removeClass("hidden");
if (hamburger.hasClass("active")) {
menu.show().removeClass("collapsed");
} else {
menu.hide().addClass("collapsed");
}
}
});
},
close: function(){
var that = this, element = this.element, o = this.options;
var menu = element.find(".app-bar-menu");
var hamburger = element.find(".hamburger");
menu.slideUp(o.duration, function(){
menu.addClass("collapsed");
hamburger.removeClass("active");
});
},
open: function(){
var that = this, element = this.element, o = this.options;
var menu = element.find(".app-bar-menu");
var hamburger = element.find(".hamburger");
menu.slideDown(o.duration, function(){
menu.removeClass("collapsed");
hamburger.addClass("active");
});
},
changeAttribute: function(attributeName){
},
destroy: function(){
var element = this.element;
element.off(Metro.events.click, ".hamburger");
$(window).off(Metro.events.resize+"-"+element.attr("id"));
}
};
Metro.plugin('appbar', AppBar);