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
158 lines (123 loc) • 4.26 kB
JavaScript
var NavigationView = {
init: function( options, elem ) {
this.options = $.extend( {}, this.options, options );
this.elem = elem;
this.element = $(elem);
this.pane = null;
this.content = null;
this.paneToggle = null;
this._setOptionsFromDOM();
this._create();
return this;
},
options: {
compact: "md",
expanded: "lg",
toggle: null,
onNavigationViewCreate: 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._createView();
this._createEvents();
Utils.exec(o.onNavigationViewCreate, [element]);
},
_calcMenuHeight: function(){
var element = this.element, pane, menu;
var elements_height = 0;
pane = element.children(".navview-pane");
if (pane.length === 0) {
return;
}
menu = pane.children(".navview-menu");
if (menu.length === 0) {
return ;
}
$.each(menu.prevAll(), function(){
elements_height += $(this).outerHeight(true);
});
$.each(menu.nextAll(), function(){
elements_height += $(this).outerHeight(true);
});
menu.css({
height: "calc(100% - "+(elements_height + 20)+"px)"
});
},
_createView: function(){
var that = this, element = this.element, o = this.options;
var pane, content, toggle, menu;
element
.addClass("navview")
.addClass(o.compact !== false ? "compact-"+o.compact : "")
.addClass(o.expanded !== false ? "expanded-"+o.expanded : "");
pane = element.children(".navview-pane");
content = element.children(".navview-content");
toggle = $(o.toggle);
this._calcMenuHeight();
this.pane = pane.length > 0 ? pane : null;
this.content = content.length > 0 ? content : null;
this.paneToggle = toggle.length > 0 ? toggle : null;
},
_createEvents: function(){
var that = this, element = this.element, o = this.options;
var pane = this.pane, content = this.content;
element.on(Metro.events.click, ".pull-button, .holder", function(e){
var pane_compact = pane.width() < 280;
var target = $(this);
var input;
if (target.hasClass("holder")) {
input = target.parent().find("input");
setTimeout(function(){
input.focus();
}, 200);
}
if (that.pane.hasClass("open")) {
that.close();
return ;
}
if ((pane_compact || element.hasClass("expand")) && !element.hasClass("compacted")) {
element.toggleClass("expand");
return ;
}
if (element.hasClass("compacted") || !pane_compact) {
element.toggleClass("compacted");
return ;
}
return true;
});
if (this.paneToggle !== null) {
this.paneToggle.on(Metro.events.click, function(){
that.pane.toggleClass("open");
})
}
$(window).on(Metro.events.resize+ "-navview", function(){
element.removeClass("expand");
that.pane.removeClass("open");
if ($(this).width() <= Metro.media_sizes[String(o.compact).toUpperCase()]) {
element.removeClass("compacted");
}
that._calcMenuHeight();
})
},
open: function(){
this.pane.addClass("open");
},
close: function(){
this.pane.removeClass("open");
},
changeAttribute: function(attributeName){
}
};
Metro.plugin('navview', NavigationView);