Fix some bugs when testing opensds ansible
[stor4nfv.git] / src / ceph / src / pybind / mgr / dashboard / static / AdminLTE-2.3.7 / dist / js / app.js
1 /*! AdminLTE app.js
2  * ================
3  * Main JS application file for AdminLTE v2. This file
4  * should be included in all pages. It controls some layout
5  * options and implements exclusive AdminLTE plugins.
6  *
7  * @Author  Almsaeed Studio
8  * @Support <http://www.almsaeedstudio.com>
9  * @Email   <abdullah@almsaeedstudio.com>
10  * @version 2.3.7
11  * @license MIT <http://opensource.org/licenses/MIT>
12  */
13
14 //Make sure jQuery has been loaded before app.js
15 if (typeof jQuery === "undefined") {
16   throw new Error("AdminLTE requires jQuery");
17 }
18
19 /* AdminLTE
20  *
21  * @type Object
22  * @description $.AdminLTE is the main object for the template's app.
23  *              It's used for implementing functions and options related
24  *              to the template. Keeping everything wrapped in an object
25  *              prevents conflict with other plugins and is a better
26  *              way to organize our code.
27  */
28 $.AdminLTE = {};
29
30 /* --------------------
31  * - AdminLTE Options -
32  * --------------------
33  * Modify these options to suit your implementation
34  */
35 $.AdminLTE.options = {
36   //Add slimscroll to navbar menus
37   //This requires you to load the slimscroll plugin
38   //in every page before app.js
39   navbarMenuSlimscroll: true,
40   navbarMenuSlimscrollWidth: "3px", //The width of the scroll bar
41   navbarMenuHeight: "200px", //The height of the inner menu
42   //General animation speed for JS animated elements such as box collapse/expand and
43   //sidebar treeview slide up/down. This options accepts an integer as milliseconds,
44   //'fast', 'normal', or 'slow'
45   animationSpeed: 500,
46   //Sidebar push menu toggle button selector
47   sidebarToggleSelector: "[data-toggle='offcanvas']",
48   //Activate sidebar push menu
49   sidebarPushMenu: true,
50   //Activate sidebar slimscroll if the fixed layout is set (requires SlimScroll Plugin)
51   sidebarSlimScroll: true,
52   //Enable sidebar expand on hover effect for sidebar mini
53   //This option is forced to true if both the fixed layout and sidebar mini
54   //are used together
55   sidebarExpandOnHover: false,
56   //BoxRefresh Plugin
57   enableBoxRefresh: true,
58   //Bootstrap.js tooltip
59   enableBSToppltip: true,
60   BSTooltipSelector: "[data-toggle='tooltip']",
61   //Enable Fast Click. Fastclick.js creates a more
62   //native touch experience with touch devices. If you
63   //choose to enable the plugin, make sure you load the script
64   //before AdminLTE's app.js
65   enableFastclick: false,
66   //Control Sidebar Options
67   enableControlSidebar: true,
68   controlSidebarOptions: {
69     //Which button should trigger the open/close event
70     toggleBtnSelector: "[data-toggle='control-sidebar']",
71     //The sidebar selector
72     selector: ".control-sidebar",
73     //Enable slide over content
74     slide: true
75   },
76   //Box Widget Plugin. Enable this plugin
77   //to allow boxes to be collapsed and/or removed
78   enableBoxWidget: true,
79   //Box Widget plugin options
80   boxWidgetOptions: {
81     boxWidgetIcons: {
82       //Collapse icon
83       collapse: 'fa-minus',
84       //Open icon
85       open: 'fa-plus',
86       //Remove icon
87       remove: 'fa-times'
88     },
89     boxWidgetSelectors: {
90       //Remove button selector
91       remove: '[data-widget="remove"]',
92       //Collapse button selector
93       collapse: '[data-widget="collapse"]'
94     }
95   },
96   //Direct Chat plugin options
97   directChat: {
98     //Enable direct chat by default
99     enable: true,
100     //The button to open and close the chat contacts pane
101     contactToggleSelector: '[data-widget="chat-pane-toggle"]'
102   },
103   //Define the set of colors to use globally around the website
104   colors: {
105     lightBlue: "#3c8dbc",
106     red: "#f56954",
107     green: "#00a65a",
108     aqua: "#00c0ef",
109     yellow: "#f39c12",
110     blue: "#0073b7",
111     navy: "#001F3F",
112     teal: "#39CCCC",
113     olive: "#3D9970",
114     lime: "#01FF70",
115     orange: "#FF851B",
116     fuchsia: "#F012BE",
117     purple: "#8E24AA",
118     maroon: "#D81B60",
119     black: "#222222",
120     gray: "#d2d6de"
121   },
122   //The standard screen sizes that bootstrap uses.
123   //If you change these in the variables.less file, change
124   //them here too.
125   screenSizes: {
126     xs: 480,
127     sm: 768,
128     md: 992,
129     lg: 1200
130   }
131 };
132
133 /* ------------------
134  * - Implementation -
135  * ------------------
136  * The next block of code implements AdminLTE's
137  * functions and plugins as specified by the
138  * options above.
139  */
140 $(function () {
141   "use strict";
142
143   //Fix for IE page transitions
144   $("body").removeClass("hold-transition");
145
146   //Extend options if external options exist
147   if (typeof AdminLTEOptions !== "undefined") {
148     $.extend(true,
149       $.AdminLTE.options,
150       AdminLTEOptions);
151   }
152
153   //Easy access to options
154   var o = $.AdminLTE.options;
155
156   //Set up the object
157   _init();
158
159   //Activate the layout maker
160   $.AdminLTE.layout.activate();
161
162   //Enable sidebar tree view controls
163   $.AdminLTE.tree('.sidebar');
164
165   //Enable control sidebar
166   if (o.enableControlSidebar) {
167     $.AdminLTE.controlSidebar.activate();
168   }
169
170   //Add slimscroll to navbar dropdown
171   if (o.navbarMenuSlimscroll && typeof $.fn.slimscroll != 'undefined') {
172     $(".navbar .menu").slimscroll({
173       height: o.navbarMenuHeight,
174       alwaysVisible: false,
175       size: o.navbarMenuSlimscrollWidth
176     }).css("width", "100%");
177   }
178
179   //Activate sidebar push menu
180   if (o.sidebarPushMenu) {
181     $.AdminLTE.pushMenu.activate(o.sidebarToggleSelector);
182   }
183
184   //Activate Bootstrap tooltip
185   if (o.enableBSToppltip) {
186     $('body').tooltip({
187       selector: o.BSTooltipSelector
188     });
189   }
190
191   //Activate box widget
192   if (o.enableBoxWidget) {
193     $.AdminLTE.boxWidget.activate();
194   }
195
196   //Activate fast click
197   if (o.enableFastclick && typeof FastClick != 'undefined') {
198     FastClick.attach(document.body);
199   }
200
201   //Activate direct chat widget
202   if (o.directChat.enable) {
203     $(document).on('click', o.directChat.contactToggleSelector, function () {
204       var box = $(this).parents('.direct-chat').first();
205       box.toggleClass('direct-chat-contacts-open');
206     });
207   }
208
209   /*
210    * INITIALIZE BUTTON TOGGLE
211    * ------------------------
212    */
213   $('.btn-group[data-toggle="btn-toggle"]').each(function () {
214     var group = $(this);
215     $(this).find(".btn").on('click', function (e) {
216       group.find(".btn.active").removeClass("active");
217       $(this).addClass("active");
218       e.preventDefault();
219     });
220
221   });
222 });
223
224 /* ----------------------------------
225  * - Initialize the AdminLTE Object -
226  * ----------------------------------
227  * All AdminLTE functions are implemented below.
228  */
229 function _init() {
230   'use strict';
231   /* Layout
232    * ======
233    * Fixes the layout height in case min-height fails.
234    *
235    * @type Object
236    * @usage $.AdminLTE.layout.activate()
237    *        $.AdminLTE.layout.fix()
238    *        $.AdminLTE.layout.fixSidebar()
239    */
240   $.AdminLTE.layout = {
241     activate: function () {
242       var _this = this;
243       _this.fix();
244       _this.fixSidebar();
245       $(window, ".wrapper").resize(function () {
246         _this.fix();
247         _this.fixSidebar();
248       });
249     },
250     fix: function () {
251       //Get window height and the wrapper height
252       var neg = $('.main-header').outerHeight() + $('.main-footer').outerHeight();
253       var window_height = $(window).height();
254       var sidebar_height = $(".sidebar").height();
255       //Set the min-height of the content and sidebar based on the
256       //the height of the document.
257       if ($("body").hasClass("fixed")) {
258         $(".content-wrapper, .right-side").css('min-height', window_height - $('.main-footer').outerHeight());
259       } else {
260         var postSetWidth;
261         if (window_height >= sidebar_height) {
262           $(".content-wrapper, .right-side").css('min-height', window_height - neg);
263           postSetWidth = window_height - neg;
264         } else {
265           $(".content-wrapper, .right-side").css('min-height', sidebar_height);
266           postSetWidth = sidebar_height;
267         }
268
269         //Fix for the control sidebar height
270         var controlSidebar = $($.AdminLTE.options.controlSidebarOptions.selector);
271         if (typeof controlSidebar !== "undefined") {
272           if (controlSidebar.height() > postSetWidth)
273             $(".content-wrapper, .right-side").css('min-height', controlSidebar.height());
274         }
275
276       }
277     },
278     fixSidebar: function () {
279       //Make sure the body tag has the .fixed class
280       if (!$("body").hasClass("fixed")) {
281         if (typeof $.fn.slimScroll != 'undefined') {
282           $(".sidebar").slimScroll({destroy: true}).height("auto");
283         }
284         return;
285       } else if (typeof $.fn.slimScroll == 'undefined' && window.console) {
286         window.console.error("Error: the fixed layout requires the slimscroll plugin!");
287       }
288       //Enable slimscroll for fixed layout
289       if ($.AdminLTE.options.sidebarSlimScroll) {
290         if (typeof $.fn.slimScroll != 'undefined') {
291           //Destroy if it exists
292           $(".sidebar").slimScroll({destroy: true}).height("auto");
293           //Add slimscroll
294           $(".sidebar").slimscroll({
295             height: ($(window).height() - $(".main-header").height()) + "px",
296             color: "rgba(0,0,0,0.2)",
297             size: "3px"
298           });
299         }
300       }
301     }
302   };
303
304   /* PushMenu()
305    * ==========
306    * Adds the push menu functionality to the sidebar.
307    *
308    * @type Function
309    * @usage: $.AdminLTE.pushMenu("[data-toggle='offcanvas']")
310    */
311   $.AdminLTE.pushMenu = {
312     activate: function (toggleBtn) {
313       //Get the screen sizes
314       var screenSizes = $.AdminLTE.options.screenSizes;
315
316       //Enable sidebar toggle
317       $(document).on('click', toggleBtn, function (e) {
318         e.preventDefault();
319
320         //Enable sidebar push menu
321         if ($(window).width() > (screenSizes.sm - 1)) {
322           if ($("body").hasClass('sidebar-collapse')) {
323             $("body").removeClass('sidebar-collapse').trigger('expanded.pushMenu');
324           } else {
325             $("body").addClass('sidebar-collapse').trigger('collapsed.pushMenu');
326           }
327         }
328         //Handle sidebar push menu for small screens
329         else {
330           if ($("body").hasClass('sidebar-open')) {
331             $("body").removeClass('sidebar-open').removeClass('sidebar-collapse').trigger('collapsed.pushMenu');
332           } else {
333             $("body").addClass('sidebar-open').trigger('expanded.pushMenu');
334           }
335         }
336       });
337
338       $(".content-wrapper").click(function () {
339         //Enable hide menu when clicking on the content-wrapper on small screens
340         if ($(window).width() <= (screenSizes.sm - 1) && $("body").hasClass("sidebar-open")) {
341           $("body").removeClass('sidebar-open');
342         }
343       });
344
345       //Enable expand on hover for sidebar mini
346       if ($.AdminLTE.options.sidebarExpandOnHover
347         || ($('body').hasClass('fixed')
348         && $('body').hasClass('sidebar-mini'))) {
349         this.expandOnHover();
350       }
351     },
352     expandOnHover: function () {
353       var _this = this;
354       var screenWidth = $.AdminLTE.options.screenSizes.sm - 1;
355       //Expand sidebar on hover
356       $('.main-sidebar').hover(function () {
357         if ($('body').hasClass('sidebar-mini')
358           && $("body").hasClass('sidebar-collapse')
359           && $(window).width() > screenWidth) {
360           _this.expand();
361         }
362       }, function () {
363         if ($('body').hasClass('sidebar-mini')
364           && $('body').hasClass('sidebar-expanded-on-hover')
365           && $(window).width() > screenWidth) {
366           _this.collapse();
367         }
368       });
369     },
370     expand: function () {
371       $("body").removeClass('sidebar-collapse').addClass('sidebar-expanded-on-hover');
372     },
373     collapse: function () {
374       if ($('body').hasClass('sidebar-expanded-on-hover')) {
375         $('body').removeClass('sidebar-expanded-on-hover').addClass('sidebar-collapse');
376       }
377     }
378   };
379
380   /* Tree()
381    * ======
382    * Converts the sidebar into a multilevel
383    * tree view menu.
384    *
385    * @type Function
386    * @Usage: $.AdminLTE.tree('.sidebar')
387    */
388   $.AdminLTE.tree = function (menu) {
389     var _this = this;
390     var animationSpeed = $.AdminLTE.options.animationSpeed;
391     $(document).off('click', menu + ' li a')
392       .on('click', menu + ' li a', function (e) {
393         //Get the clicked link and the next element
394         var $this = $(this);
395         var checkElement = $this.next();
396
397         //Check if the next element is a menu and is visible
398         if ((checkElement.is('.treeview-menu')) && (checkElement.is(':visible')) && (!$('body').hasClass('sidebar-collapse'))) {
399           //Close the menu
400           checkElement.slideUp(animationSpeed, function () {
401             checkElement.removeClass('menu-open');
402             //Fix the layout in case the sidebar stretches over the height of the window
403             //_this.layout.fix();
404           });
405           checkElement.parent("li").removeClass("active");
406         }
407         //If the menu is not visible
408         else if ((checkElement.is('.treeview-menu')) && (!checkElement.is(':visible'))) {
409           //Get the parent menu
410           var parent = $this.parents('ul').first();
411           //Close all open menus within the parent
412           var ul = parent.find('ul:visible').slideUp(animationSpeed);
413           //Remove the menu-open class from the parent
414           ul.removeClass('menu-open');
415           //Get the parent li
416           var parent_li = $this.parent("li");
417
418           //Open the target menu and add the menu-open class
419           checkElement.slideDown(animationSpeed, function () {
420             //Add the class active to the parent li
421             checkElement.addClass('menu-open');
422             parent.find('li.active').removeClass('active');
423             parent_li.addClass('active');
424             //Fix the layout in case the sidebar stretches over the height of the window
425             _this.layout.fix();
426           });
427         }
428         //if this isn't a link, prevent the page from being redirected
429         if (checkElement.is('.treeview-menu')) {
430           e.preventDefault();
431         }
432       });
433   };
434
435   /* ControlSidebar
436    * ==============
437    * Adds functionality to the right sidebar
438    *
439    * @type Object
440    * @usage $.AdminLTE.controlSidebar.activate(options)
441    */
442   $.AdminLTE.controlSidebar = {
443     //instantiate the object
444     activate: function () {
445       //Get the object
446       var _this = this;
447       //Update options
448       var o = $.AdminLTE.options.controlSidebarOptions;
449       //Get the sidebar
450       var sidebar = $(o.selector);
451       //The toggle button
452       var btn = $(o.toggleBtnSelector);
453
454       //Listen to the click event
455       btn.on('click', function (e) {
456         e.preventDefault();
457         //If the sidebar is not open
458         if (!sidebar.hasClass('control-sidebar-open')
459           && !$('body').hasClass('control-sidebar-open')) {
460           //Open the sidebar
461           _this.open(sidebar, o.slide);
462         } else {
463           _this.close(sidebar, o.slide);
464         }
465       });
466
467       //If the body has a boxed layout, fix the sidebar bg position
468       var bg = $(".control-sidebar-bg");
469       _this._fix(bg);
470
471       //If the body has a fixed layout, make the control sidebar fixed
472       if ($('body').hasClass('fixed')) {
473         _this._fixForFixed(sidebar);
474       } else {
475         //If the content height is less than the sidebar's height, force max height
476         if ($('.content-wrapper, .right-side').height() < sidebar.height()) {
477           _this._fixForContent(sidebar);
478         }
479       }
480     },
481     //Open the control sidebar
482     open: function (sidebar, slide) {
483       //Slide over content
484       if (slide) {
485         sidebar.addClass('control-sidebar-open');
486       } else {
487         //Push the content by adding the open class to the body instead
488         //of the sidebar itself
489         $('body').addClass('control-sidebar-open');
490       }
491     },
492     //Close the control sidebar
493     close: function (sidebar, slide) {
494       if (slide) {
495         sidebar.removeClass('control-sidebar-open');
496       } else {
497         $('body').removeClass('control-sidebar-open');
498       }
499     },
500     _fix: function (sidebar) {
501       var _this = this;
502       if ($("body").hasClass('layout-boxed')) {
503         sidebar.css('position', 'absolute');
504         sidebar.height($(".wrapper").height());
505         if (_this.hasBindedResize) {
506           return;
507         }
508         $(window).resize(function () {
509           _this._fix(sidebar);
510         });
511         _this.hasBindedResize = true;
512       } else {
513         sidebar.css({
514           'position': 'fixed',
515           'height': 'auto'
516         });
517       }
518     },
519     _fixForFixed: function (sidebar) {
520       sidebar.css({
521         'position': 'fixed',
522         'max-height': '100%',
523         'overflow': 'auto',
524         'padding-bottom': '50px'
525       });
526     },
527     _fixForContent: function (sidebar) {
528       $(".content-wrapper, .right-side").css('min-height', sidebar.height());
529     }
530   };
531
532   /* BoxWidget
533    * =========
534    * BoxWidget is a plugin to handle collapsing and
535    * removing boxes from the screen.
536    *
537    * @type Object
538    * @usage $.AdminLTE.boxWidget.activate()
539    *        Set all your options in the main $.AdminLTE.options object
540    */
541   $.AdminLTE.boxWidget = {
542     selectors: $.AdminLTE.options.boxWidgetOptions.boxWidgetSelectors,
543     icons: $.AdminLTE.options.boxWidgetOptions.boxWidgetIcons,
544     animationSpeed: $.AdminLTE.options.animationSpeed,
545     activate: function (_box) {
546       var _this = this;
547       if (!_box) {
548         _box = document; // activate all boxes per default
549       }
550       //Listen for collapse event triggers
551       $(_box).on('click', _this.selectors.collapse, function (e) {
552         e.preventDefault();
553         _this.collapse($(this));
554       });
555
556       //Listen for remove event triggers
557       $(_box).on('click', _this.selectors.remove, function (e) {
558         e.preventDefault();
559         _this.remove($(this));
560       });
561     },
562     collapse: function (element) {
563       var _this = this;
564       //Find the box parent
565       var box = element.parents(".box").first();
566       //Find the body and the footer
567       var box_content = box.find("> .box-body, > .box-footer, > form  >.box-body, > form > .box-footer");
568       if (!box.hasClass("collapsed-box")) {
569         //Convert minus into plus
570         element.children(":first")
571           .removeClass(_this.icons.collapse)
572           .addClass(_this.icons.open);
573         //Hide the content
574         box_content.slideUp(_this.animationSpeed, function () {
575           box.addClass("collapsed-box");
576         });
577       } else {
578         //Convert plus into minus
579         element.children(":first")
580           .removeClass(_this.icons.open)
581           .addClass(_this.icons.collapse);
582         //Show the content
583         box_content.slideDown(_this.animationSpeed, function () {
584           box.removeClass("collapsed-box");
585         });
586       }
587     },
588     remove: function (element) {
589       //Find the box parent
590       var box = element.parents(".box").first();
591       box.slideUp(this.animationSpeed);
592     }
593   };
594 }
595
596 /* ------------------
597  * - Custom Plugins -
598  * ------------------
599  * All custom plugins are defined below.
600  */
601
602 /*
603  * BOX REFRESH BUTTON
604  * ------------------
605  * This is a custom plugin to use with the component BOX. It allows you to add
606  * a refresh button to the box. It converts the box's state to a loading state.
607  *
608  * @type plugin
609  * @usage $("#box-widget").boxRefresh( options );
610  */
611 (function ($) {
612
613   "use strict";
614
615   $.fn.boxRefresh = function (options) {
616
617     // Render options
618     var settings = $.extend({
619       //Refresh button selector
620       trigger: ".refresh-btn",
621       //File source to be loaded (e.g: ajax/src.php)
622       source: "",
623       //Callbacks
624       onLoadStart: function (box) {
625         return box;
626       }, //Right after the button has been clicked
627       onLoadDone: function (box) {
628         return box;
629       } //When the source has been loaded
630
631     }, options);
632
633     //The overlay
634     var overlay = $('<div class="overlay"><div class="fa fa-refresh fa-spin"></div></div>');
635
636     return this.each(function () {
637       //if a source is specified
638       if (settings.source === "") {
639         if (window.console) {
640           window.console.log("Please specify a source first - boxRefresh()");
641         }
642         return;
643       }
644       //the box
645       var box = $(this);
646       //the button
647       var rBtn = box.find(settings.trigger).first();
648
649       //On trigger click
650       rBtn.on('click', function (e) {
651         e.preventDefault();
652         //Add loading overlay
653         start(box);
654
655         //Perform ajax call
656         box.find(".box-body").load(settings.source, function () {
657           done(box);
658         });
659       });
660     });
661
662     function start(box) {
663       //Add overlay and loading img
664       box.append(overlay);
665
666       settings.onLoadStart.call(box);
667     }
668
669     function done(box) {
670       //Remove overlay and loading img
671       box.find(overlay).remove();
672
673       settings.onLoadDone.call(box);
674     }
675
676   };
677
678 })(jQuery);
679
680 /*
681  * EXPLICIT BOX CONTROLS
682  * -----------------------
683  * This is a custom plugin to use with the component BOX. It allows you to activate
684  * a box inserted in the DOM after the app.js was loaded, toggle and remove box.
685  *
686  * @type plugin
687  * @usage $("#box-widget").activateBox();
688  * @usage $("#box-widget").toggleBox();
689  * @usage $("#box-widget").removeBox();
690  */
691 (function ($) {
692
693   'use strict';
694
695   $.fn.activateBox = function () {
696     $.AdminLTE.boxWidget.activate(this);
697   };
698
699   $.fn.toggleBox = function () {
700     var button = $($.AdminLTE.boxWidget.selectors.collapse, this);
701     $.AdminLTE.boxWidget.collapse(button);
702   };
703
704   $.fn.removeBox = function () {
705     var button = $($.AdminLTE.boxWidget.selectors.remove, this);
706     $.AdminLTE.boxWidget.remove(button);
707   };
708
709 })(jQuery);
710
711 /*
712  * TODO LIST CUSTOM PLUGIN
713  * -----------------------
714  * This plugin depends on iCheck plugin for checkbox and radio inputs
715  *
716  * @type plugin
717  * @usage $("#todo-widget").todolist( options );
718  */
719 (function ($) {
720
721   'use strict';
722
723   $.fn.todolist = function (options) {
724     // Render options
725     var settings = $.extend({
726       //When the user checks the input
727       onCheck: function (ele) {
728         return ele;
729       },
730       //When the user unchecks the input
731       onUncheck: function (ele) {
732         return ele;
733       }
734     }, options);
735
736     return this.each(function () {
737
738       if (typeof $.fn.iCheck != 'undefined') {
739         $('input', this).on('ifChecked', function () {
740           var ele = $(this).parents("li").first();
741           ele.toggleClass("done");
742           settings.onCheck.call(ele);
743         });
744
745         $('input', this).on('ifUnchecked', function () {
746           var ele = $(this).parents("li").first();
747           ele.toggleClass("done");
748           settings.onUncheck.call(ele);
749         });
750       } else {
751         $('input', this).on('change', function () {
752           var ele = $(this).parents("li").first();
753           ele.toggleClass("done");
754           if ($('input', ele).is(":checked")) {
755             settings.onCheck.call(ele);
756           } else {
757             settings.onUncheck.call(ele);
758           }
759         });
760       }
761     });
762   };
763 }(jQuery));