1/* ------------------------------------------------------------------------------ 2 * 3 * # Template JS core 4 * 5 * Includes minimum required JS code for proper template functioning 6 * 7 * ---------------------------------------------------------------------------- */ 8 9 10// Setup module 11// ------------------------------ 12 13var App = function () { 14 15 16 // 17 // Setup module components 18 // 19 20 // Transitions 21 // ------------------------- 22 23 // Disable all transitions 24 var _transitionsDisabled = function() { 25 $('body').addClass('no-transitions'); 26 }; 27 28 // Enable all transitions 29 var _transitionsEnabled = function() { 30 $('body').removeClass('no-transitions'); 31 }; 32 33 34 // Sidebars 35 // ------------------------- 36 37 // 38 // On desktop 39 // 40 41 // Resize main sidebar 42 var _sidebarMainResize = function() { 43 44 // Flip 2nd level if menu overflows 45 // bottom edge of browser window 46 var revertBottomMenus = function() { 47 $('.sidebar-main').find('.nav-sidebar').children('.nav-item-submenu').hover(function() { 48 var totalHeight = 0, 49 $this = $(this), 50 navSubmenuClass = 'nav-group-sub', 51 navSubmenuReversedClass = 'nav-item-submenu-reversed'; 52 53 totalHeight += $this.find('.' + navSubmenuClass).filter(':visible').outerHeight(); 54 if($this.children('.' + navSubmenuClass).length) { 55 if(($this.children('.' + navSubmenuClass).offset().top + $this.find('.' + navSubmenuClass).filter(':visible').outerHeight()) > document.body.clientHeight) { 56 $this.addClass(navSubmenuReversedClass) 57 } 58 else { 59 $this.removeClass(navSubmenuReversedClass) 60 } 61 } 62 }); 63 } 64 65 // If sidebar is resized by default 66 if($('body').hasClass('sidebar-xs')) { 67 revertBottomMenus(); 68 } 69 70 // Toggle min sidebar class 71 $('.sidebar-main-toggle').on('click', function (e) { 72 e.preventDefault(); 73 74 $('body').toggleClass('sidebar-xs').removeClass('sidebar-mobile-main'); 75 revertBottomMenus(); 76 }); 77 }; 78 79 // Toggle main sidebar 80 var _sidebarMainToggle = function() { 81 $(document).on('click', '.sidebar-main-hide', function (e) { 82 e.preventDefault(); 83 $('body').toggleClass('sidebar-main-hidden'); 84 }); 85 }; 86 87 // Toggle secondary sidebar 88 var _sidebarSecondaryToggle = function() { 89 $(document).on('click', '.sidebar-secondary-toggle', function (e) { 90 e.preventDefault(); 91 $('body').toggleClass('sidebar-secondary-hidden'); 92 }); 93 }; 94 95 96 // Show right, resize main 97 var _sidebarRightMainToggle = function() { 98 $(document).on('click', '.sidebar-right-main-toggle', function (e) { 99 e.preventDefault(); 100 101 // Right sidebar visibility 102 $('body').toggleClass('sidebar-right-visible'); 103 104 // If visible 105 if ($('body').hasClass('sidebar-right-visible')) { 106 107 // Make main sidebar mini 108 $('body').addClass('sidebar-xs'); 109 110 // Hide children lists if they are opened, since sliding animation adds inline CSS 111 $('.sidebar-main .nav-sidebar').children('.nav-item').children('.nav-group-sub').css('display', ''); 112 } 113 else { 114 $('body').removeClass('sidebar-xs'); 115 } 116 }); 117 }; 118 119 // Show right, hide main 120 var _sidebarRightMainHide = function() { 121 $(document).on('click', '.sidebar-right-main-hide', function (e) { 122 e.preventDefault(); 123 124 // Opposite sidebar visibility 125 $('body').toggleClass('sidebar-right-visible'); 126 127 // If visible 128 if ($('body').hasClass('sidebar-right-visible')) { 129 $('body').addClass('sidebar-main-hidden'); 130 } 131 else { 132 $('body').removeClass('sidebar-main-hidden'); 133 } 134 }); 135 }; 136 137 // Toggle right sidebar 138 var _sidebarRightToggle = function() { 139 $(document).on('click', '.sidebar-right-toggle', function (e) { 140 e.preventDefault(); 141 142 $('body').toggleClass('sidebar-right-visible'); 143 }); 144 }; 145 146 // Show right, hide secondary 147 var _sidebarRightSecondaryToggle = function() { 148 $(document).on('click', '.sidebar-right-secondary-toggle', function (e) { 149 e.preventDefault(); 150 151 // Opposite sidebar visibility 152 $('body').toggleClass('sidebar-right-visible'); 153 154 // If visible 155 if ($('body').hasClass('sidebar-right-visible')) { 156 $('body').addClass('sidebar-secondary-hidden'); 157 } 158 else { 159 $('body').removeClass('sidebar-secondary-hidden'); 160 } 161 }); 162 }; 163 164 165 // Toggle content sidebar 166 var _sidebarComponentToggle = function() { 167 $(document).on('click', '.sidebar-component-toggle', function (e) { 168 e.preventDefault(); 169 $('body').toggleClass('sidebar-component-hidden'); 170 }); 171 }; 172 173 174 // 175 // On mobile 176 // 177 178 // Expand sidebar to full screen on mobile 179 var _sidebarMobileFullscreen = function() { 180 $('.sidebar-mobile-expand').on('click', function (e) { 181 e.preventDefault(); 182 var $sidebar = $(this).parents('.sidebar'), 183 sidebarFullscreenClass = 'sidebar-fullscreen' 184 185 if(!$sidebar.hasClass(sidebarFullscreenClass)) { 186 $sidebar.addClass(sidebarFullscreenClass); 187 } 188 else { 189 $sidebar.removeClass(sidebarFullscreenClass); 190 } 191 }); 192 }; 193 194 // Toggle main sidebar on mobile 195 var _sidebarMobileMainToggle = function() { 196 $('.sidebar-mobile-main-toggle').on('click', function(e) { 197 e.preventDefault(); 198 $('body').toggleClass('sidebar-mobile-main').removeClass('sidebar-mobile-secondary sidebar-mobile-right'); 199 200 if($('.sidebar-main').hasClass('sidebar-fullscreen')) { 201 $('.sidebar-main').removeClass('sidebar-fullscreen'); 202 } 203 }); 204 }; 205 206 // Toggle secondary sidebar on mobile 207 var _sidebarMobileSecondaryToggle = function() { 208 $('.sidebar-mobile-secondary-toggle').on('click', function (e) { 209 e.preventDefault(); 210 $('body').toggleClass('sidebar-mobile-secondary').removeClass('sidebar-mobile-main sidebar-mobile-right'); 211 212 // Fullscreen mode 213 if($('.sidebar-secondary').hasClass('sidebar-fullscreen')) { 214 $('.sidebar-secondary').removeClass('sidebar-fullscreen'); 215 } 216 }); 217 }; 218 219 // Toggle right sidebar on mobile 220 var _sidebarMobileRightToggle = function() { 221 $('.sidebar-mobile-right-toggle').on('click', function (e) { 222 e.preventDefault(); 223 $('body').toggleClass('sidebar-mobile-right').removeClass('sidebar-mobile-main sidebar-mobile-secondary'); 224 225 // Hide sidebar if in fullscreen mode on mobile 226 if($('.sidebar-right').hasClass('sidebar-fullscreen')) { 227 $('.sidebar-right').removeClass('sidebar-fullscreen'); 228 } 229 }); 230 }; 231 232 // Toggle component sidebar on mobile 233 var _sidebarMobileComponentToggle = function() { 234 $('.sidebar-mobile-component-toggle').on('click', function (e) { 235 e.preventDefault(); 236 $('body').toggleClass('sidebar-mobile-component'); 237 }); 238 }; 239 240 241 // Navigations 242 // ------------------------- 243 244 // Sidebar navigation 245 var _navigationSidebar = function() { 246 247 // Define default class names and options 248 var navClass = 'nav-sidebar', 249 navItemClass = 'nav-item', 250 navItemOpenClass = 'nav-item-open', 251 navLinkClass = 'nav-link', 252 navSubmenuClass = 'nav-group-sub', 253 navSlidingSpeed = 250; 254 255 // Configure collapsible functionality 256 $('.' + navClass).each(function() {
257 $(this).find('.' + navItemClass).has('.' + navSubmenuClass).children('.' + navItemClass + ' > ' + '.' + navLinkClass).not('.disabled').on('click', function (e) { 258 e.preventDefault(); 259 260 // Simplify stuff 261 var $target = $(this), 262 $navSidebarMini = $('.sidebar-xs').not('.sidebar-mobile-main').find('.sidebar-main .' + navClass).children('.' + navItemClass); 263 264 // Collapsible 265 if($target.parent('.' + navItemClass).hasClass(navItemOpenClass)) { 266 $target.parent('.' + navItemClass).not($navSidebarMini).removeClass(navItemOpenClass).children('.' + navSubmenuClass).slideUp(navSlidingSpeed); 267 } 268 else { 269 $target.parent('.' + navItemClass).not($navSidebarMini).addClass(navItemOpenClass).children('.' + navSubmenuClass).slideDown(navSlidingSpeed); 270 } 271 272 // Accordion 273 if ($target.parents('.' + navClass).data('nav-type') == 'accordion') { 274 $target.parent('.' + navItemClass).not($navSidebarMini).siblings(':has(.' + navSubmenuClass + ')').removeClass(navItemOpenClass).children('.' + navSubmenuClass).slideUp(navSlidingSpeed); 275 } 276 }); 277 }); 278 279 // Disable click in disabled navigation items 280 $(document).on('click', '.' + navClass + ' .disabled', function(e) { 281 e.preventDefault(); 282 }); 283 284 // Scrollspy navigation 285 $('.nav-scrollspy').find('.' + navItemClass).has('.' + navSubmenuClass).children('.' + navItemClass + ' > ' + '.' + navLinkClass).off('click'); 286 }; 287 288 // Navbar navigation 289 var _navigationNavbar = function() { 290 291 // Prevent dropdown from closing on click 292 $(document).on('click', '.dropdown-content', function(e) { 293 e.stopPropagation(); 294 }); 295 296 // Disabled links 297 $('.navbar-nav .disabled a, .nav-item-levels .disabled').on('click', function(e) { 298 e.preventDefault(); 299 e.stopPropagation(); 300 }); 301 302 // Show tabs inside dropdowns 303 $('.dropdown-content a[data-toggle="tab"]').on('click', function(e) { 304 $(this).tab('show'); 305 }); 306 }; 307 308 309 // Components 310 // ------------------------- 311 312 // Tooltip 313 var _componentTooltip = function() { 314 315 // Initialize 316 $('[data-popup="tooltip"]').tooltip(); 317 318 // Demo tooltips, remove in production 319 var demoTooltipSelector = '[data-popup="tooltip-demo"]'; 320 if($(demoTooltipSelector).is(':visible')) { 321 $(demoTooltipSelector).tooltip('show'); 322 setTimeout(function() { 323 $(demoTooltipSelector).tooltip('hide'); 324 }, 2000); 325 } 326 }; 327 328 // Popover 329 var _componentPopover = function() { 330 $('[data-popup="popover"]').popover(); 331 }; 332 333 334 // Card actions 335 // ------------------------- 336 337 // Reload card (uses BlockUI extension) 338 var _cardActionReload = function() { 339 $('.card [data-action=reload]:not(.disabled)').on('click', function (e) { 340 e.preventDefault(); 341 var $target = $(this), 342 block = $target.closest('.card'); 343 344 // Block card 345 $(block).block({ 346 message: '<i class="icon-spinner2 spinner"></i>', 347 overlayCSS: { 348 backgroundColor: '#fff', 349 opacity: 0.8, 350 cursor: 'wait', 351 'box-shadow': '0 0 0 1px #ddd' 352 }, 353 css: { 354 border: 0, 355 padding: 0, 356 backgroundColor: 'none' 357 } 358 }); 359 360 // For demo purposes 361 window.setTimeout(function () { 362 $(block).unblock(); 363 }, 2000); 364 }); 365 }; 366 367 // Collapse card 368 var _cardActionCollapse = function() { 369 var $cardCollapsedClass = $('.card-collapsed'); 370 371 // Hide if collapsed by default 372 $cardCollapsedClass.children('.card-header').nextAll().hide(); 373 374 // Rotate icon if collapsed by default 375 $cardCollapsedClass.find('[data-action=collapse]').addClass('rotate-180'); 376 377 // Collapse on click 378 $('.card [data-action=collapse]:not(.disabled)').on('click', function (e) { 379 var $target = $(this), 380 slidingSpeed = 150; 381 382 e.preventDefault(); 383 $target.parents('.card').toggleClass('card-collapsed'); 384 $target.toggleClass('rotate-180'); 385 $target.closest('.card').children('.card-header').nextAll().slideToggle(slidingSpeed); 386 }); 387 }; 388 389 // Remove card 390 var _cardActionRemove = function() { 391 $('.card [data-action=remove]').on('click', function (e) { 392 e.preventDefault(); 393 var $target = $(this), 394 slidingSpeed = 150; 395 396 // If not disabled 397 if(!$target.hasClass('disabled')) {
398 $target.closest('.card').slideUp({ 399 duration: slidingSpeed, 400 start: function() { 401 $target.addClass('d-block'); 402 }, 403 complete: function() { 404 $target.remove(); 405 } 406 }); 407 } 408 }); 409 }; 410 411 // Card fullscreen mode 412 var _cardActionFullscreen = function() { 413 $('.card [data-action=fullscreen]').on('click', function (e) { 414 e.preventDefault(); 415 416 // Define vars 417 var $target = $(this), 418 cardFullscreen = $target.closest('.card'), 419 overflowHiddenClass = 'overflow-hidden', 420 collapsedClass = 'collapsed-in-fullscreen', 421 fullscreenAttr = 'data-fullscreen'; 422 423 // Toggle classes on card 424 cardFullscreen.toggleClass('fixed-top h-100 rounded-0'); 425 426 // Configure 427 if (!cardFullscreen.hasClass('fixed-top')) { 428 $target.removeAttr(fullscreenAttr); 429 cardFullscreen.children('.' + collapsedClass).removeClass('show'); 430 $('body').removeClass(overflowHiddenClass); 431 $target.siblings('[data-action=move], [data-action=remove], [data-action=collapse]').removeClass('d-none'); 432 } 433 else { 434 $target.attr(fullscreenAttr, 'active'); 435 cardFullscreen.removeAttr('style').children('.collapse:not(.show)').addClass('show ' + collapsedClass); 436 $('body').addClass(overflowHiddenClass); 437 $target.siblings('[data-action=move], [data-action=remove], [data-action=collapse]').addClass('d-none'); 438 } 439 }); 440 }; 441 442 443 // Misc 444 // ------------------------- 445 446 // Dropdown submenus. Trigger on click 447 var _dropdownSubmenu = function() { 448 449 // All parent levels require .dropdown-toggle class 450 $('.dropdown-menu').find('.dropdown-submenu').not('.disabled').find('.dropdown-toggle').on('click', function(e) { 451 e.stopPropagation(); 452 e.preventDefault(); 453 454 // Remove "show" class in all siblings 455 $(this).parent().siblings().removeClass('show').find('.show').removeClass('show'); 456 457 // Toggle submenu 458 $(this).parent().toggleClass('show').children('.dropdown-menu').toggleClass('show'); 459 460 // Hide all levels when parent dropdown is closed 461 $(this).parents('.show').on('hidden.bs.dropdown', function(e) { 462 $('.dropdown-submenu .show, .dropdown-submenu.show').removeClass('show'); 463 }); 464 }); 465 }; 466 467 // Header elements toggler 468 var _headerElements = function() { 469 470 // Toggle visible state of header elements 471 $('.header-elements-toggle').on('click', function(e) { 472 e.preventDefault(); 473 $(this).parents('[class*=header-elements-]').find('.header-elements').toggleClass('d-none'); 474 }); 475 476 // Toggle visible state of footer elements 477 $('.footer-elements-toggle').on('click', function(e) { 478 e.preventDefault(); 479 $(this).parents('.card-footer').find('.footer-elements').toggleClass('d-none'); 480 }); 481 }; 482 483 484 // 485 // Return objects assigned to module 486 // 487 488 return { 489 490 // Disable transitions before page is fully loaded 491 initBeforeLoad: function() { 492 _transitionsDisabled(); 493 }, 494 495 // Enable transitions when page is fully loaded 496 initAfterLoad: function() { 497 _transitionsEnabled(); 498 }, 499 500 // Initialize all sidebars 501 initSidebars: function() { 502 503 // On desktop 504 _sidebarMainResize(); 505 _sidebarMainToggle(); 506 _sidebarSecondaryToggle(); 507 _sidebarRightMainToggle(); 508 _sidebarRightMainHide(); 509 _sidebarRightToggle(); 510 _sidebarRightSecondaryToggle(); 511 _sidebarComponentToggle(); 512 513 // On mobile 514 _sidebarMobileFullscreen();
515 _sidebarMobileMainToggle(); 516 _sidebarMobileSecondaryToggle(); 517 _sidebarMobileRightToggle(); 518 _sidebarMobileComponentToggle(); 519 }, 520 521 // Initialize all navigations 522 initNavigations: function() { 523 _navigationSidebar(); 524 _navigationNavbar(); 525 }, 526 527 // Initialize all components 528 initComponents: function() { 529 _componentTooltip(); 530 _componentPopover(); 531 }, 532 533 // Initialize all card actions 534 initCardActions: function() { 535 _cardActionReload(); 536 _cardActionCollapse(); 537 _cardActionRemove(); 538 _cardActionFullscreen(); 539 }, 540 541 // Dropdown submenu 542 initDropdownSubmenu: function() { 543 _dropdownSubmenu(); 544 }, 545 546 initHeaderElementsToggle: function() { 547 _headerElements(); 548 }, 549 550 // Initialize core 551 initCore: function() { 552 App.initSidebars(); 553 App.initNavigations(); 554 App.initComponents(); 555 App.initCardActions(); 556 App.initDropdownSubmenu(); 557 App.initHeaderElementsToggle(); 558 } 559 } 560}(); 561 562 563// Initialize module 564// ------------------------------ 565 566// When content is loaded 567document.addEventListener('DOMContentLoaded', function() { 568 App.initBeforeLoad(); 569 App.initCore(); 570}); 571 572// When page is fully loaded 573window.addEventListener('load', function() { 574 App.initAfterLoad(); 575});
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.