ultimatepos/resources/plugins/AdminLTE/js/AdminLTE-app.js

817 lines
27 KiB
JavaScript
Vendored

/*! AdminLTE app.js
* ================
* Main JS application file for AdminLTE v2. This file
* should be included in all pages. It controls some layout
* options and implements exclusive AdminLTE plugins.
*
* @Author Almsaeed Studio
* @Support <http://www.almsaeedstudio.com>
* @Email <abdullah@almsaeedstudio.com>
* @version 2.3.8
* @license MIT <http://opensource.org/licenses/MIT>
*/
//Make sure jQuery has been loaded before app.js
if (typeof jQuery === 'undefined') {
throw new Error('AdminLTE requires jQuery');
}
/* AdminLTE
*
* @type Object
* @description $.AdminLTE is the main object for the template's app.
* It's used for implementing functions and options related
* to the template. Keeping everything wrapped in an object
* prevents conflict with other plugins and is a better
* way to organize our code.
*/
$.AdminLTE = {};
/* --------------------
* - AdminLTE Options -
* --------------------
* Modify these options to suit your implementation
*/
$.AdminLTE.options = {
//Add slimscroll to navbar menus
//This requires you to load the slimscroll plugin
//in every page before app.js
navbarMenuSlimscroll: true,
navbarMenuSlimscrollWidth: '3px', //The width of the scroll bar
navbarMenuHeight: '200px', //The height of the inner menu
//General animation speed for JS animated elements such as box collapse/expand and
//sidebar treeview slide up/down. This options accepts an integer as milliseconds,
//'fast', 'normal', or 'slow'
animationSpeed: 500,
//Sidebar push menu toggle button selector
sidebarToggleSelector: "[data-toggle='offcanvas']",
//Activate sidebar push menu
sidebarPushMenu: true,
//Activate sidebar slimscroll if the fixed layout is set (requires SlimScroll Plugin)
sidebarSlimScroll: true,
//Enable sidebar expand on hover effect for sidebar mini
//This option is forced to true if both the fixed layout and sidebar mini
//are used together
sidebarExpandOnHover: false,
//BoxRefresh Plugin
enableBoxRefresh: true,
//Bootstrap.js tooltip
enableBSToppltip: true,
BSTooltipSelector: "[data-toggle='tooltip']",
//Enable Fast Click. Fastclick.js creates a more
//native touch experience with touch devices. If you
//choose to enable the plugin, make sure you load the script
//before AdminLTE's app.js
enableFastclick: false,
//Control Sidebar Tree views
enableControlTreeView: true,
//Control Sidebar Options
enableControlSidebar: true,
controlSidebarOptions: {
//Which button should trigger the open/close event
toggleBtnSelector: "[data-toggle='control-sidebar']",
//The sidebar selector
selector: '.control-sidebar',
//Enable slide over content
slide: true,
},
//Box Widget Plugin. Enable this plugin
//to allow boxes to be collapsed and/or removed
enableBoxWidget: true,
//Box Widget plugin options
boxWidgetOptions: {
boxWidgetIcons: {
//Collapse icon
collapse: 'fa-minus',
//Open icon
open: 'fa-plus',
//Remove icon
remove: 'fa-times',
},
boxWidgetSelectors: {
//Remove button selector
remove: '[data-widget="remove"]',
//Collapse button selector
collapse: '[data-widget="collapse"]',
},
},
//Direct Chat plugin options
directChat: {
//Enable direct chat by default
enable: true,
//The button to open and close the chat contacts pane
contactToggleSelector: '[data-widget="chat-pane-toggle"]',
},
//Define the set of colors to use globally around the website
colors: {
lightBlue: '#3c8dbc',
red: '#f56954',
green: '#00a65a',
aqua: '#00c0ef',
yellow: '#f39c12',
blue: '#0073b7',
navy: '#001F3F',
teal: '#39CCCC',
olive: '#3D9970',
lime: '#01FF70',
orange: '#FF851B',
fuchsia: '#F012BE',
purple: '#8E24AA',
maroon: '#D81B60',
black: '#222222',
gray: '#d2d6de',
},
//The standard screen sizes that bootstrap uses.
//If you change these in the variables.less file, change
//them here too.
screenSizes: {
xs: 480,
sm: 768,
md: 992,
lg: 1200,
},
};
/* ------------------
* - Implementation -
* ------------------
* The next block of code implements AdminLTE's
* functions and plugins as specified by the
* options above.
*/
$(function() {
'use strict';
//Fix for IE page transitions
$('body').removeClass('hold-transition');
//Extend options if external options exist
if (typeof AdminLTEOptions !== 'undefined') {
$.extend(true, $.AdminLTE.options, AdminLTEOptions);
}
//Easy access to options
var o = $.AdminLTE.options;
//Set up the object
_init();
//Activate the layout maker
$.AdminLTE.layout.activate();
//Enable sidebar tree view controls
if (o.enableControlTreeView) {
$.AdminLTE.tree('.sidebar');
}
//Enable control sidebar
if (o.enableControlSidebar) {
$.AdminLTE.controlSidebar.activate();
}
//Add slimscroll to navbar dropdown
if (o.navbarMenuSlimscroll && typeof $.fn.slimscroll != 'undefined') {
$('.navbar .menu')
.slimscroll({
height: o.navbarMenuHeight,
alwaysVisible: false,
size: o.navbarMenuSlimscrollWidth,
})
.css('width', '100%');
}
//Activate sidebar push menu
if (o.sidebarPushMenu) {
$.AdminLTE.pushMenu.activate(o.sidebarToggleSelector);
}
//Activate Bootstrap tooltip
if (o.enableBSToppltip) {
$('body').tooltip({
selector: o.BSTooltipSelector,
container: 'body',
});
}
//Activate box widget
if (o.enableBoxWidget) {
$.AdminLTE.boxWidget.activate();
}
//Activate fast click
if (o.enableFastclick && typeof FastClick != 'undefined') {
FastClick.attach(document.body);
}
//Activate direct chat widget
if (o.directChat.enable) {
$(document).on('click', o.directChat.contactToggleSelector, function() {
var box = $(this)
.parents('.direct-chat')
.first();
box.toggleClass('direct-chat-contacts-open');
});
}
/*
* INITIALIZE BUTTON TOGGLE
* ------------------------
*/
$('.btn-group[data-toggle="btn-toggle"]').each(function() {
var group = $(this);
$(this)
.find('.btn')
.on('click', function(e) {
group.find('.btn.active').removeClass('active');
$(this).addClass('active');
e.preventDefault();
});
});
});
/* ----------------------------------
* - Initialize the AdminLTE Object -
* ----------------------------------
* All AdminLTE functions are implemented below.
*/
function _init() {
'use strict';
/* Layout
* ======
* Fixes the layout height in case min-height fails.
*
* @type Object
* @usage $.AdminLTE.layout.activate()
* $.AdminLTE.layout.fix()
* $.AdminLTE.layout.fixSidebar()
*/
$.AdminLTE.layout = {
activate: function() {
var _this = this;
_this.fix();
_this.fixSidebar();
$('body, html, .wrapper').css('height', 'auto');
$(window, '.wrapper').resize(function() {
_this.fix();
_this.fixSidebar();
});
},
fix: function() {
// Remove overflow from .wrapper if layout-boxed exists
$('.layout-boxed > .wrapper').css('overflow', 'hidden');
//Get window height and the wrapper height
var footer_height = $('.main-footer').outerHeight() || 0;
var neg = $('.main-header').outerHeight() + footer_height;
var window_height = $(window).height();
var sidebar_height = $('.sidebar').height() || 0;
//Set the min-height of the content and sidebar based on the
//the height of the document.
if ($('body').hasClass('fixed')) {
$('.content-wrapper, .right-side').css('min-height', window_height - footer_height);
} else {
var postSetWidth;
if (window_height >= sidebar_height) {
$('.content-wrapper, .right-side').css('min-height', window_height - neg);
postSetWidth = window_height - neg;
} else {
$('.content-wrapper, .right-side').css('min-height', sidebar_height);
postSetWidth = sidebar_height;
}
//Fix for the control sidebar height
var controlSidebar = $($.AdminLTE.options.controlSidebarOptions.selector);
if (typeof controlSidebar !== 'undefined') {
if (controlSidebar.height() > postSetWidth)
$('.content-wrapper, .right-side').css(
'min-height',
controlSidebar.height()
);
}
}
},
fixSidebar: function() {
//Make sure the body tag has the .fixed class
if (!$('body').hasClass('fixed')) {
if (typeof $.fn.slimScroll != 'undefined') {
$('.sidebar')
.slimScroll({ destroy: true })
.height('auto');
}
return;
} else if (typeof $.fn.slimScroll == 'undefined' && window.console) {
window.console.error('Error: the fixed layout requires the slimscroll plugin!');
}
//Enable slimscroll for fixed layout
if ($.AdminLTE.options.sidebarSlimScroll) {
if (typeof $.fn.slimScroll != 'undefined') {
//Destroy if it exists
$('.sidebar')
.slimScroll({ destroy: true })
.height('auto');
//Add slimscroll
$('.sidebar').slimScroll({
height: $(window).height() - $('.main-header').height() + 'px',
color: 'rgba(0,0,0,0.2)',
size: '3px',
});
}
}
},
};
/* PushMenu()
* ==========
* Adds the push menu functionality to the sidebar.
*
* @type Function
* @usage: $.AdminLTE.pushMenu("[data-toggle='offcanvas']")
*/
$.AdminLTE.pushMenu = {
activate: function(toggleBtn) {
//Get the screen sizes
var screenSizes = $.AdminLTE.options.screenSizes;
//Enable sidebar toggle
$(document).on('click', toggleBtn, function(e) {
e.preventDefault();
//Enable sidebar push menu
if ($(window).width() > screenSizes.sm - 1) {
if ($('body').hasClass('sidebar-collapse')) {
$('body')
.removeClass('sidebar-collapse')
.trigger('expanded.pushMenu');
} else {
$('body')
.addClass('sidebar-collapse')
.trigger('collapsed.pushMenu');
}
}
//Handle sidebar push menu for small screens
else {
if ($('body').hasClass('sidebar-open')) {
$('body')
.removeClass('sidebar-open')
.removeClass('sidebar-collapse')
.trigger('collapsed.pushMenu');
} else {
$('body')
.addClass('sidebar-open')
.trigger('expanded.pushMenu');
}
}
});
$('.content-wrapper').click(function() {
//Enable hide menu when clicking on the content-wrapper on small screens
if ($(window).width() <= screenSizes.sm - 1 && $('body').hasClass('sidebar-open')) {
$('body').removeClass('sidebar-open');
}
});
//Enable expand on hover for sidebar mini
if (
$.AdminLTE.options.sidebarExpandOnHover ||
($('body').hasClass('fixed') && $('body').hasClass('sidebar-mini'))
) {
this.expandOnHover();
}
},
expandOnHover: function() {
var _this = this;
var screenWidth = $.AdminLTE.options.screenSizes.sm - 1;
//Expand sidebar on hover
$('.main-sidebar').hover(
function() {
if (
$('body').hasClass('sidebar-mini') &&
$('body').hasClass('sidebar-collapse') &&
$(window).width() > screenWidth
) {
_this.expand();
}
},
function() {
if (
$('body').hasClass('sidebar-mini') &&
$('body').hasClass('sidebar-expanded-on-hover') &&
$(window).width() > screenWidth
) {
_this.collapse();
}
}
);
},
expand: function() {
$('body')
.removeClass('sidebar-collapse')
.addClass('sidebar-expanded-on-hover');
},
collapse: function() {
if ($('body').hasClass('sidebar-expanded-on-hover')) {
$('body')
.removeClass('sidebar-expanded-on-hover')
.addClass('sidebar-collapse');
}
},
};
/* Tree()
* ======
* Converts the sidebar into a multilevel
* tree view menu.
*
* @type Function
* @Usage: $.AdminLTE.tree('.sidebar')
*/
$.AdminLTE.tree = function(menu) {
var _this = this;
var animationSpeed = $.AdminLTE.options.animationSpeed;
$(document)
.off('click', menu + ' li a')
.on('click', menu + ' li a', function(e) {
//Get the clicked link and the next element
var $this = $(this);
var checkElement = $this.next();
//Check if the next element is a menu and is visible
if (
checkElement.is('.treeview-menu') &&
checkElement.is(':visible') &&
!$('body').hasClass('sidebar-collapse')
) {
//Close the menu
checkElement.slideUp(animationSpeed, function() {
checkElement.removeClass('menu-open');
//Fix the layout in case the sidebar stretches over the height of the window
//_this.layout.fix();
});
checkElement.parent('li').removeClass('active');
}
//If the menu is not visible
else if (checkElement.is('.treeview-menu') && !checkElement.is(':visible')) {
//Get the parent menu
var parent = $this.parents('ul').first();
//Close all open menus within the parent
var ul = parent.find('ul:visible').slideUp(animationSpeed);
//Remove the menu-open class from the parent
ul.removeClass('menu-open');
//Get the parent li
var parent_li = $this.parent('li');
//Open the target menu and add the menu-open class
checkElement.slideDown(animationSpeed, function() {
//Add the class active to the parent li
checkElement.addClass('menu-open');
parent.find('li.active').removeClass('active');
parent_li.addClass('active');
//Fix the layout in case the sidebar stretches over the height of the window
_this.layout.fix();
});
}
//if this isn't a link, prevent the page from being redirected
if (checkElement.is('.treeview-menu')) {
e.preventDefault();
}
});
};
/* ControlSidebar
* ==============
* Adds functionality to the right sidebar
*
* @type Object
* @usage $.AdminLTE.controlSidebar.activate(options)
*/
$.AdminLTE.controlSidebar = {
//instantiate the object
activate: function() {
//Get the object
var _this = this;
//Update options
var o = $.AdminLTE.options.controlSidebarOptions;
//Get the sidebar
var sidebar = $(o.selector);
//The toggle button
var btn = $(o.toggleBtnSelector);
//Listen to the click event
btn.on('click', function(e) {
e.preventDefault();
//If the sidebar is not open
if (
!sidebar.hasClass('control-sidebar-open') &&
!$('body').hasClass('control-sidebar-open')
) {
//Open the sidebar
_this.open(sidebar, o.slide);
} else {
_this.close(sidebar, o.slide);
}
});
//If the body has a boxed layout, fix the sidebar bg position
var bg = $('.control-sidebar-bg');
_this._fix(bg);
//If the body has a fixed layout, make the control sidebar fixed
if ($('body').hasClass('fixed')) {
_this._fixForFixed(sidebar);
} else {
//If the content height is less than the sidebar's height, force max height
if ($('.content-wrapper, .right-side').height() < sidebar.height()) {
_this._fixForContent(sidebar);
}
}
},
//Open the control sidebar
open: function(sidebar, slide) {
//Slide over content
if (slide) {
sidebar.addClass('control-sidebar-open');
} else {
//Push the content by adding the open class to the body instead
//of the sidebar itself
$('body').addClass('control-sidebar-open');
}
},
//Close the control sidebar
close: function(sidebar, slide) {
if (slide) {
sidebar.removeClass('control-sidebar-open');
} else {
$('body').removeClass('control-sidebar-open');
}
},
_fix: function(sidebar) {
var _this = this;
if ($('body').hasClass('layout-boxed')) {
sidebar.css('position', 'absolute');
sidebar.height($('.wrapper').height());
if (_this.hasBindedResize) {
return;
}
$(window).resize(function() {
_this._fix(sidebar);
});
_this.hasBindedResize = true;
} else {
sidebar.css({
position: 'fixed',
height: 'auto',
});
}
},
_fixForFixed: function(sidebar) {
sidebar.css({
position: 'fixed',
'max-height': '100%',
overflow: 'auto',
'padding-bottom': '50px',
});
},
_fixForContent: function(sidebar) {
$('.content-wrapper, .right-side').css('min-height', sidebar.height());
},
};
/* BoxWidget
* =========
* BoxWidget is a plugin to handle collapsing and
* removing boxes from the screen.
*
* @type Object
* @usage $.AdminLTE.boxWidget.activate()
* Set all your options in the main $.AdminLTE.options object
*/
$.AdminLTE.boxWidget = {
selectors: $.AdminLTE.options.boxWidgetOptions.boxWidgetSelectors,
icons: $.AdminLTE.options.boxWidgetOptions.boxWidgetIcons,
animationSpeed: $.AdminLTE.options.animationSpeed,
activate: function(_box) {
var _this = this;
if (!_box) {
_box = document; // activate all boxes per default
}
//Listen for collapse event triggers
$(_box).on('click', _this.selectors.collapse, function(e) {
e.preventDefault();
_this.collapse($(this));
});
//Listen for remove event triggers
$(_box).on('click', _this.selectors.remove, function(e) {
e.preventDefault();
_this.remove($(this));
});
},
collapse: function(element) {
var _this = this;
//Find the box parent
var box = element.parents('.box').first();
//Find the body and the footer
var box_content = box.find(
'> .box-body, > .box-footer, > form >.box-body, > form > .box-footer'
);
if (!box.hasClass('collapsed-box')) {
//Convert minus into plus
element
.children(':first')
.removeClass(_this.icons.collapse)
.addClass(_this.icons.open);
//Hide the content
box_content.slideUp(_this.animationSpeed, function() {
box.addClass('collapsed-box');
});
} else {
//Convert plus into minus
element
.children(':first')
.removeClass(_this.icons.open)
.addClass(_this.icons.collapse);
//Show the content
box_content.slideDown(_this.animationSpeed, function() {
box.removeClass('collapsed-box');
});
}
},
remove: function(element) {
//Find the box parent
var box = element.parents('.box').first();
box.slideUp(this.animationSpeed);
},
};
}
/* ------------------
* - Custom Plugins -
* ------------------
* All custom plugins are defined below.
*/
/*
* BOX REFRESH BUTTON
* ------------------
* This is a custom plugin to use with the component BOX. It allows you to add
* a refresh button to the box. It converts the box's state to a loading state.
*
* @type plugin
* @usage $("#box-widget").boxRefresh( options );
*/
(function($) {
'use strict';
$.fn.boxRefresh = function(options) {
// Render options
var settings = $.extend(
{
//Refresh button selector
trigger: '.refresh-btn',
//File source to be loaded (e.g: ajax/src.php)
source: '',
//Callbacks
onLoadStart: function(box) {
return box;
}, //Right after the button has been clicked
onLoadDone: function(box) {
return box;
}, //When the source has been loaded
},
options
);
//The overlay
var overlay = $('<div class="overlay"><div class="fa fa-refresh fa-spin"></div></div>');
return this.each(function() {
//if a source is specified
if (settings.source === '') {
if (window.console) {
window.console.log('Please specify a source first - boxRefresh()');
}
return;
}
//the box
var box = $(this);
//the button
var rBtn = box.find(settings.trigger).first();
//On trigger click
rBtn.on('click', function(e) {
e.preventDefault();
//Add loading overlay
start(box);
//Perform ajax call
box.find('.box-body').load(settings.source, function() {
done(box);
});
});
});
function start(box) {
//Add overlay and loading img
box.append(overlay);
settings.onLoadStart.call(box);
}
function done(box) {
//Remove overlay and loading img
box.find(overlay).remove();
settings.onLoadDone.call(box);
}
};
})(jQuery);
/*
* EXPLICIT BOX CONTROLS
* -----------------------
* This is a custom plugin to use with the component BOX. It allows you to activate
* a box inserted in the DOM after the app.js was loaded, toggle and remove box.
*
* @type plugin
* @usage $("#box-widget").activateBox();
* @usage $("#box-widget").toggleBox();
* @usage $("#box-widget").removeBox();
*/
(function($) {
'use strict';
$.fn.activateBox = function() {
$.AdminLTE.boxWidget.activate(this);
};
$.fn.toggleBox = function() {
var button = $($.AdminLTE.boxWidget.selectors.collapse, this);
$.AdminLTE.boxWidget.collapse(button);
};
$.fn.removeBox = function() {
var button = $($.AdminLTE.boxWidget.selectors.remove, this);
$.AdminLTE.boxWidget.remove(button);
};
})(jQuery);
/*
* TODO LIST CUSTOM PLUGIN
* -----------------------
* This plugin depends on iCheck plugin for checkbox and radio inputs
*
* @type plugin
* @usage $("#todo-widget").todolist( options );
*/
(function($) {
'use strict';
$.fn.todolist = function(options) {
// Render options
var settings = $.extend(
{
//When the user checks the input
onCheck: function(ele) {
return ele;
},
//When the user unchecks the input
onUncheck: function(ele) {
return ele;
},
},
options
);
return this.each(function() {
if (typeof $.fn.iCheck != 'undefined') {
$('input', this).on('ifChecked', function() {
var ele = $(this)
.parents('li')
.first();
ele.toggleClass('done');
settings.onCheck.call(ele);
});
$('input', this).on('ifUnchecked', function() {
var ele = $(this)
.parents('li')
.first();
ele.toggleClass('done');
settings.onUncheck.call(ele);
});
} else {
$('input', this).on('change', function() {
var ele = $(this)
.parents('li')
.first();
ele.toggleClass('done');
if ($('input', ele).is(':checked')) {
settings.onCheck.call(ele);
} else {
settings.onUncheck.call(ele);
}
});
}
});
};
})(jQuery);