| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564 | /*! 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   <support@almsaeedstudio.com> * @version 2.1.0 * @license MIT <http://opensource.org/licenses/MIT> */'use strict';//Make sure jQuery has been loaded before app.jsif (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  //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,  //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: true,  //Box Widget Plugin. Enable this plugin  //to allow boxes to be collapsed and/or removed  enableBoxWidget: true,  //Box Widget plugin options  boxWidgetOptions: {    boxWidgetIcons: {      //The icon that triggers the collapse event      collapse: 'fa fa-minus',      //The icon that trigger the opening event      open: 'fa fa-plus',      //The icon that triggers the removing event      remove: 'fa 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 () {  //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  $.AdminLTE.tree('.sidebar');  //Add slimscroll to navbar dropdown  if (o.navbarMenuSlimscroll && typeof $.fn.slimscroll != 'undefined') {    $(".navbar .menu").slimscroll({      height: "200px",      alwaysVisible: false,      size: "3px"    }).css("width", "100%");  }  //Activate sidebar push menu  if (o.sidebarPushMenu) {    $.AdminLTE.pushMenu(o.sidebarToggleSelector);  }  //Activate Bootstrap tooltip  if (o.enableBSToppltip) {    $(o.BSTooltipSelector).tooltip();  }  //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) {    $(o.directChat.contactToggleSelector).click(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").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() {  /* 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();      $(window, ".wrapper").resize(function () {        _this.fix();        _this.fixSidebar();      });    },    fix: function () {      //Get window height and the wrapper height      var neg = $('.main-header').outerHeight() + $('.main-footer').outerHeight();      var window_height = $(window).height();      var sidebar_height = $(".sidebar").height();      //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 - $('.main-footer').outerHeight());      } else {        if (window_height >= sidebar_height) {          $(".content-wrapper, .right-side").css('min-height', window_height - neg);        } else {          $(".content-wrapper, .right-side").css('min-height', sidebar_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' && console) {        console.error("Error: the fixed layout requires the slimscroll plugin!");      }      //Enable slimscroll for fixed layout      if ($.AdminLTE.options.sidebarSlimScroll) {        if (typeof $.fn.slimScroll != 'undefined') {          //Distroy 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 = function (toggleBtn) {    //Get the screen sizes    var screenSizes = this.options.screenSizes;    //Enable sidebar toggle    $(toggleBtn).click(function (e) {      e.preventDefault();      //Enable sidebar push menu      if ($(window).width() > (screenSizes.sm - 1)) {        $("body").toggleClass('sidebar-collapse');      }      //Handle sidebar push menu for small screens      else {        if ($("body").hasClass('sidebar-open')) {          $("body").removeClass('sidebar-open');          $("body").removeClass('sidebar-collapse')        } else {          $("body").addClass('sidebar-open');        }      }    });    $(".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');      }    });  };  /* Tree()   * ======   * Converts the sidebar into a multilevel   * tree view menu.   *   * @type Function   * @Usage: $.AdminLTE.tree('.sidebar')   */  $.AdminLTE.tree = function (menu) {    var _this = this;    $("li a", $(menu)).click(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'))) {        //Close the menu        checkElement.slideUp('normal', 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('normal');        //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('normal', 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   * ==============   * Control the all of the control sidebar transitions   *    * @type Object   * @usage $.Admin.controlSidebar.activate(options)   */  $.AdminLTE.controlSidebar = {    //Default settings    defaults: {      toggleBtnSelector: "[data-toggle='control-sidebar']",      selector: ".control-sidebar",      slide: false,      animationSpeed: 300    },    //Initiate the object    activate: function (options) {      var settings = $.extend({}, options, this.defaults);    },    //Close the control sidebar    close: function () {          },    //Open the control sidebar    open: function () {          },    //If the slide option is set, this    //function is used to open the sidebar    slideIn: function() {          },    //The complement funtion to slideIn    slideOut: function () {}  };  /* BoxWidget   * =========   * BoxWidget is plugin to handle collapsing and   * removing boxes from the screen.   *   * @type Object   * @usage $.AdminLTE.boxWidget.activate()   *        Set all of your option in the main $.AdminLTE.options object   */  $.AdminLTE.boxWidget = {    activate: function () {      var o = $.AdminLTE.options;      var _this = this;      //Listen for collapse event triggers      $(o.boxWidgetOptions.boxWidgetSelectors.collapse).click(function (e) {        e.preventDefault();        _this.collapse($(this));      });      //Listen for remove event triggers      $(o.boxWidgetOptions.boxWidgetSelectors.remove).click(function (e) {        e.preventDefault();        _this.remove($(this));      });    },    collapse: function (element) {      //Find the box parent      var box = element.parents(".box").first();      //Find the body and the footer      var bf = box.find(".box-body, .box-footer");      if (!box.hasClass("collapsed-box")) {        //Convert minus into plus        element.children(".fa-minus").removeClass("fa-minus").addClass("fa-plus");        bf.slideUp(300, function () {          box.addClass("collapsed-box");        });      } else {        //Convert plus into minus        element.children(".fa-plus").removeClass("fa-plus").addClass("fa-minus");        bf.slideDown(300, function () {          box.removeClass("collapsed-box");        });      }    },    remove: function (element) {      //Find the box parent      var box = element.parents(".box").first();      box.slideUp();    },    options: $.AdminLTE.options.boxWidgetOptions  };}/* ------------------ * - Custom Plugins - * ------------------ * All custom plugins are defined below. *//* * BOX REFRESH BUTTON * ------------------ * This is a custom plugin to use with the compenet 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 ($) {  $.fn.boxRefresh = function (options) {    // Render options    var settings = $.extend({      //Refressh button selector      trigger: ".refresh-btn",      //File source to be loaded (e.g: ajax/src.php)      source: "",      //Callbacks      onLoadStart: function (box) {      }, //Right after the button has been clicked      onLoadDone: function (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 (console) {          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.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);/* * TODO LIST CUSTOM PLUGIN * ----------------------- * This plugin depends on iCheck plugin for checkbox and radio inputs * * @type plugin * @usage $("#todo-widget").todolist( options ); */(function ($) {  $.fn.todolist = function (options) {    // Render options    var settings = $.extend({      //When the user checks the input      onCheck: function (ele) {      },      //When the user unchecks the input      onUncheck: function (ele) {      }    }, options);    return this.each(function () {      if (typeof $.fn.iCheck != 'undefined') {        $('input', this).on('ifChecked', function (event) {          var ele = $(this).parents("li").first();          ele.toggleClass("done");          settings.onCheck.call(ele);        });        $('input', this).on('ifUnchecked', function (event) {          var ele = $(this).parents("li").first();          ele.toggleClass("done");          settings.onUncheck.call(ele);        });      } else {        $('input', this).on('change', function (event) {          var ele = $(this).parents("li").first();          ele.toggleClass("done");          settings.onCheck.call(ele);        });      }    });  };}(jQuery));
 |