299 lines
7.1 KiB
JavaScript
299 lines
7.1 KiB
JavaScript
|
|
/*
|
|
*
|
|
* sidebar sidebar
|
|
*
|
|
*/
|
|
!function($) {
|
|
"use strict";
|
|
|
|
var sidebar = function(element, options) {
|
|
this.options = options;
|
|
this.$sidebar = $(element);
|
|
this.$content = this.$sidebar.find('~ .content-wrap');
|
|
this.$nano = this.$sidebar.find(".nano");
|
|
this.$html = $('html');
|
|
this.$body = $('body');
|
|
this.$window = $(window);
|
|
|
|
// set in true when first time were clicked on toggle button
|
|
this.changed = false;
|
|
|
|
this.init();
|
|
};
|
|
|
|
sidebar.DEFAULTS = {
|
|
// duration od animations
|
|
duration: 300,
|
|
|
|
// set small sidebar when window width < resizeWnd
|
|
resizeWnd: 1000
|
|
};
|
|
|
|
sidebar.prototype.init = function() {
|
|
var _this = this;
|
|
|
|
// no transition enable
|
|
_this.$body.addClass('sidebar-notransition');
|
|
|
|
// init Nano Scroller
|
|
_this.$nano.nanoScroller({ preventPageScrolling: true });
|
|
|
|
// sidebar toggle
|
|
$('.sidebar-toggle').on( 'click', function(e) {
|
|
e.preventDefault();
|
|
_this.togglesidebar();
|
|
});
|
|
|
|
// hide sidebar when push content overlay
|
|
_this.$content.on( 'click', function() {
|
|
if( _this.isHideOnContentClick() ) {
|
|
_this.hidesidebar();
|
|
}
|
|
})
|
|
|
|
// toggle sub menus
|
|
_this.$sidebar.on('click', 'li a.sidebar-sub-toggle', function(e) {
|
|
e.preventDefault();
|
|
_this.toggleSub($(this));
|
|
});
|
|
|
|
if( _this.showType() == 'push' && _this.isShow()) {
|
|
_this.$body.css('overflow', 'hidden');
|
|
}
|
|
|
|
// init gesture swipes
|
|
if( _this.$sidebar.hasClass('sidebar-gestures') ) {
|
|
_this.useGestures();
|
|
}
|
|
|
|
// on window resize - set small sidebar
|
|
_this.$window.on('resize', function() {
|
|
_this.windowResize();
|
|
});
|
|
|
|
_this.windowResize();
|
|
|
|
// no transition disable
|
|
setTimeout(function() {
|
|
_this.$body.removeClass('sidebar-notransition');
|
|
}, 1);
|
|
}
|
|
|
|
sidebar.prototype.isShow = function() {
|
|
return !this.$body.hasClass('sidebar-hide');
|
|
}
|
|
|
|
// check show type
|
|
sidebar.prototype.showType = function() {
|
|
if(this.$sidebar.hasClass('sidebar-overlay')) return 'overlay';
|
|
if(this.$sidebar.hasClass('sidebar-push')) return 'push';
|
|
if(this.$sidebar.hasClass('sidebar-shrink')) return 'shrink';
|
|
};
|
|
|
|
|
|
// check if hide on content click
|
|
sidebar.prototype.isHideOnContentClick = function() {
|
|
return this.$sidebar.hasClass('sidebar-overlap-content');
|
|
}
|
|
|
|
// check if sidebar static position
|
|
sidebar.prototype.isStatic = function() {
|
|
return this.$sidebar.hasClass('sidebar-static');
|
|
}
|
|
|
|
|
|
sidebar.prototype.togglesidebar = function(type) {
|
|
var _this = this;
|
|
var show = !_this.isShow();
|
|
|
|
if(type) {
|
|
if(
|
|
(type=='show' && !show)
|
|
|| (type=='hide' && show)) {
|
|
return;
|
|
}
|
|
}
|
|
|
|
_this.options.changed = true;
|
|
|
|
if( show ) {
|
|
_this.showsidebar();
|
|
} else {
|
|
_this.hidesidebar();
|
|
}
|
|
}
|
|
|
|
sidebar.prototype.showsidebar = function() {
|
|
var _this = this;
|
|
|
|
_this.$body.removeClass('sidebar-hide');
|
|
|
|
if( _this.showType() == 'push'/* && !_this.isStatic() */) {
|
|
_this.$body.css('overflow', 'hidden');
|
|
}
|
|
|
|
setTimeout(function() {
|
|
// restore scroller on normal sidebar after end animation (300ms)
|
|
_this.$nano.nanoScroller();
|
|
|
|
// resize for charts reinit
|
|
_this.$window.resize();
|
|
}, _this.options.duration);
|
|
}
|
|
|
|
sidebar.prototype.hidesidebar = function() {
|
|
var _this = this;
|
|
|
|
_this.$body.addClass('sidebar-hide');
|
|
|
|
// destroy scroller on hidden sidebar
|
|
_this.$nano.nanoScroller({ destroy: true });
|
|
|
|
// resize for charts reinit
|
|
setTimeout(function() {
|
|
if( _this.showType() == 'push'/* && !_this.isStatic() */) {
|
|
_this.$body.css('overflow', 'visible');
|
|
}
|
|
_this.$window.resize();
|
|
}, _this.options.duration);
|
|
}
|
|
|
|
|
|
// toggle submenu [open or close]
|
|
sidebar.prototype.toggleSub = function(toggle) {
|
|
var _this = this;
|
|
|
|
var toggleParent = toggle.parent();
|
|
var subMenu = toggleParent.find('> ul');
|
|
var opened = toggleParent.hasClass('open');
|
|
|
|
if(!subMenu.length) {
|
|
return;
|
|
}
|
|
|
|
// close
|
|
if(opened) {
|
|
_this.closeSub(subMenu);
|
|
}
|
|
|
|
// open
|
|
else {
|
|
_this.openSub(subMenu, toggleParent);
|
|
}
|
|
}
|
|
|
|
// close submenus
|
|
sidebar.prototype.closeSub = function(subMenu) {
|
|
var _this = this;
|
|
|
|
subMenu.css('display', 'block').stop()
|
|
.slideUp(_this.options.duration, 'swing', function() {
|
|
// close child dropdowns
|
|
$(this).find('li a.sidebar-sub-toggle').next().attr('style', '');
|
|
|
|
// reinit nano scroller
|
|
_this.$nano.nanoScroller();
|
|
});
|
|
|
|
subMenu.parent().removeClass('open');
|
|
subMenu.find('li a.sidebar-sub-toggle').parent().removeClass('open');
|
|
}
|
|
|
|
// open submenus
|
|
sidebar.prototype.openSub = function(subMenu, toggleParent) {
|
|
var _this = this;
|
|
|
|
subMenu
|
|
.css('display', 'none').stop()
|
|
.slideDown(_this.options.duration, 'swing', function() {
|
|
// reinit nano scroller
|
|
_this.$nano.nanoScroller();
|
|
});
|
|
toggleParent.addClass('open');
|
|
|
|
_this.closeSub( toggleParent.siblings('.open').find('> ul') );
|
|
}
|
|
|
|
// use gestures for show / hide menu
|
|
sidebar.prototype.useGestures = function() {
|
|
var _this = this;
|
|
var touchStart = 0;
|
|
var startPoint = 0; // x position
|
|
var endPoint = 0; // x position
|
|
|
|
// on touch start
|
|
_this.$window.on('touchstart', function(e) {
|
|
startPoint = (e.originalEvent.touches?e.originalEvent.touches[0]:e).pageX;
|
|
endPoint = (e.originalEvent.touches?e.originalEvent.touches[0]:e).pageX;
|
|
touchStart = 1;
|
|
});
|
|
|
|
// on swipe start
|
|
_this.$window.on('touchmove', function(e) {
|
|
if( touchStart ) {
|
|
endPoint = (e.originalEvent.touches?e.originalEvent.touches[0]:e).pageX;
|
|
}
|
|
});
|
|
|
|
// on swipe end
|
|
_this.$window.on('touchend', function(e) {
|
|
if( touchStart ) {
|
|
var resultSwipe = startPoint - endPoint,
|
|
rtl = _this.$html.hasClass('rtl');
|
|
|
|
touchStart = 0;
|
|
|
|
// swipe min width 100px
|
|
if( Math.abs( resultSwipe ) < 100 ) {
|
|
return;
|
|
}
|
|
|
|
// change values if rtl
|
|
if( rtl ) {
|
|
resultSwipe *= -1;
|
|
startPoint = _this.$window.width() - startPoint;
|
|
}
|
|
|
|
// from left to right
|
|
if(resultSwipe < 0) {
|
|
// show only when touch started from left corner
|
|
if( startPoint < 40 ) {
|
|
_this.showsidebar();
|
|
}
|
|
}
|
|
|
|
// from right to left
|
|
else {
|
|
_this.hidesidebar();
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
// on resize window and on start
|
|
var resizeTimer;
|
|
sidebar.prototype.windowResize = function() {
|
|
var _this = this;
|
|
|
|
// if user currently changed size of sidebar, stop change it
|
|
if(!_this.options.changed) {
|
|
clearTimeout(resizeTimer);
|
|
resizeTimer = setTimeout(function() {
|
|
if(_this.$window.width() < _this.options.resizeWnd) {
|
|
_this.togglesidebar('hide');
|
|
}
|
|
}, 50);
|
|
}
|
|
};
|
|
|
|
|
|
|
|
|
|
// init
|
|
$('.sidebar').each(function() {
|
|
var options = $.extend({}, sidebar.DEFAULTS, $(this).data(), typeof option == 'object' && option);
|
|
var cursidebar = new sidebar(this, options);
|
|
});
|
|
|
|
}(jQuery); |