]> git.proxmox.com Git - ceph.git/blob - ceph/src/pybind/mgr/dashboard/static/AdminLTE-2.3.7/dist/js/app.js
update sources to v12.1.0
[ceph.git] / 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));