1/** 2 * SPDX-FileCopyrightText: (c) 2000 Liferay, Inc. https://liferay.com 3 * SPDX-License-Identifier: LGPL-2.1-or-later OR LicenseRef-Liferay-DXP-EULA-2.0.0-2023-06 4 */ 5+function ($) { 6 var doc = $(document); 7 var listenerAdded = false; // Make sure we only add one resize listener to the page, 8 // no matter how many components we have 9 10 var addResizeListener = function addResizeListener() { 11 if (!listenerAdded) { 12 $(window).on('resize', debounce(function () { 13 doc.trigger('screenChange.lexicon.sidenav'); 14 }, 150)); 15 listenerAdded = true; 16 } 17 }; 18 19 var debounce = function debounce(fn, delay) { 20 var id; 21 return function () { 22 var instance = this; 23 var args = arguments; 24 25 var later = function later() { 26 id = null; 27 fn.apply(instance, args); 28 }; 29 30 clearTimeout(id); 31 id = setTimeout(later, delay); 32 }; 33 }; 34 35 var getBreakpointRegion = function getBreakpointRegion() { 36 var screenXs = 480; 37 var screenSm = 768; 38 var screenMd = 992; 39 var screenLg = 1200; 40 var windowWidth = window.innerWidth; 41 var region = ''; 42 43 if (windowWidth >= screenLg) { 44 region = 'lg'; 45 } else if (windowWidth >= screenMd) { 46 region = 'md'; 47 } else if (windowWidth >= screenSm) { 48 region = 'sm'; 49 } else if (windowWidth >= screenXs) { 50 region = 'xs'; 51 } else { 52 region = 'xxs'; 53 } 54 55 return region; 56 }; 57 58 var guid = function () { 59 var counter = 0; 60 return function (toggler, ns) { 61 var strId = toggler.attr('id'); 62 63 if (!strId) { 64 strId = ns + counter++; 65 toggler.attr('id', strId); 66 } 67 68 return strId; 69 }; 70 }(); 71 72 var toInt = function toInt(str) { 73 return parseInt(str, 10) || 0; 74 }; 75 76 var SideNavigation = function SideNavigation(toggler, options) { 77 this.init(toggler, options); 78 }; 79 80 SideNavigation.TRANSITION_DURATION = 500; 81 SideNavigation.prototype = { 82 _bindUI: function _bindUI() { 83 var instance = this; 84 85 if (!instance.useDataAttribute) { 86 addResizeListener(); 87 88 instance._onScreenChange(); 89 } 90 91 if (instance.options.useDelegate) { 92 instance._onDelegateClickTrigger(); 93 } else { 94 instance._onClickTrigger(); 95 } 96 97 instance._onClickSidenavClose(); 98 }, 99 _focusElement: function _focusElement(el) { 100 // ios 8 fixed element disappears when trying to scroll 101 el.focus(); 102 }, 103 _getSidenavWidth: function _getSidenavWidth() { 104 var instance = this; 105 var options = instance.options; 106 var widthOriginal = options.widthOriginal; 107 var width = widthOriginal; 108 var winWidth = window.innerWidth; 109 110 if (winWidth < widthOriginal + 40) { 111 width = winWidth - 40; 112 } 113 114 return width; 115 }, 116 _getSimpleSidenavType: function _getSimpleSidenavType() { 117 var instance = this; 118 var options = instance.options; 119 120 var desktop = instance._isDesktop(); 121 122 var type = options.type; 123 var typeMobile = options.typeMobile; 124 125 if (desktop && type === 'fixed-push') { 126 return 'desktop-fixed-push'; 127 } else if (!desktop && typeMobile === 'fixed-push') { 128 return 'mobile-fixed-push'; 129 } 130 131 return 'fixed'; 132 }, 133 _isDesktop: function _isDesktop() { 134 return window.innerWidth >= this.options.breakpoint; 135 }, 136 _isSidenavRight: function _isSidenavRight() { 137 var instance = this; 138 var options = instance.options; 139 var container = $(options.container); 140 var isSidenavRight = container.hasClass('sidenav-right'); 141 return isSidenavRight; 142 }, 143 _isSimpleSidenavClosed: function _isSimpleSidenavClosed() { 144 var instance = this; 145 var options = instance.options; 146 var openClass = options.openClass; 147 var container = $(options.container); 148 return !container.hasClass(openClass); 149 }, 150 _loadUrl: function _loadUrl(sidenav, url, eventTarget) { 151 var instance = this; 152 var urlLoaded = sidenav.data('url-loaded'); 153 var readyState = urlLoaded ? urlLoaded.readyState : 0; 154 eventTarget = eventTarget || sidenav; 155 var sidebarBody = sidenav.find('.sidebar-body').first(); 156 157 if (!readyState && sidebarBody.length && (typeof url === 'string' || $.isPlainObject(url))) { 158 sidebarBody.append('<div class="sidenav-loading">' + instance.options.loadingIndicatorTPL + '</div>'); 159 urlLoaded = $.ajax(url).done(function (response) { 160 sidebarBody.append(response); 161 eventTarget.trigger('urlLoaded.lexicon.sidenav'); 162 sidebarBody.find('.sidenav-loading').remove(); 163 }); 164 sidenav.data('url-loaded', urlLoaded); 165 } 166 167 return urlLoaded; 168 }, 169 _onClickSidenavClose: function _onClickSidenavClose() { 170 var instance = this; 171 var options = instance.options; 172 var containerSelector = options.container; 173 var closeButton = $(containerSelector).find('.sidenav-close').first(); 174 var closeButtonSelector = '#' + guid(closeButton, 'generatedLexiconSidenavCloseId'); 175 var dataCloseButtonSelector = 'lexicon.' + closeButtonSelector; 176 177 if (!doc.data(dataCloseButtonSelector)) { 178 doc.data(dataCloseButtonSelector, 'true'); 179 doc.on('click.close.lexicon.sidenav', closeButtonSelector, function (event) { 180 event.preventDefault();
181 instance.toggle(); 182 }); 183 } 184 185 instance.closeButtonSelector = closeButtonSelector; 186 instance.dataCloseButtonSelector = dataCloseButtonSelector; 187 }, 188 _onClickTrigger: function _onClickTrigger() { 189 var instance = this; 190 var el = instance.toggler; 191 el.on('click.lexicon.sidenav', function () { 192 instance.toggle(); 193 }); 194 }, 195 _onDelegateClickTrigger: function _onDelegateClickTrigger() { 196 var instance = this; 197 var toggler = instance.toggler; 198 var togglerSelector = '#' + guid(toggler, 'generatedLexiconSidenavTogglerId'); 199 var dataTogglerSelector = 'lexicon.' + togglerSelector; 200 201 if (!doc.data(dataTogglerSelector)) { 202 doc.data(dataTogglerSelector, 'true'); 203 doc.on('click.lexicon.sidenav', togglerSelector, function (event) { 204 instance.toggle(); 205 event.preventDefault(); 206 }); 207 } 208 209 instance.togglerSelector = togglerSelector; 210 instance.dataTogglerSelector = dataTogglerSelector; 211 }, 212 _onScreenChange: function _onScreenChange() { 213 var instance = this; 214 var options = instance.options; 215 var container = $(options.container); 216 var toggler = instance.toggler; 217 218 var screenStartDesktop = instance._setScreenSize(); 219 220 doc.on('screenChange.lexicon.sidenav', function () { 221 var desktop = instance._setScreenSize(); 222 223 var sidenavRight = instance._isSidenavRight(); 224 225 var type = desktop ? options.type : options.typeMobile; 226 var fixedMenu = type === 'fixed' || type === 'fixed-push'; 227 var menu = container.find('.sidenav-menu').first(); 228 var menuWidth; 229 var originalMenuWidth = options.widthOriginal; 230 var positionDirection = options.rtl ? 'left' : 'right'; 231 container.toggleClass('sidenav-fixed', fixedMenu); 232 233 if (!desktop && screenStartDesktop || desktop && !screenStartDesktop) { 234 instance.hideSidenav(); 235 instance.clearStyle(['min-height', 'height']); 236 container.addClass('closed').removeClass('open'); 237 toggler.removeClass('active').removeClass('open'); 238 screenStartDesktop = false; 239 240 if (desktop) { 241 if (sidenavRight) { 242 menu.css(positionDirection, originalMenuWidth).css('width', originalMenuWidth); 243 } 244 245 screenStartDesktop = true; 246 } 247 } 248 249 var closed = container.hasClass('closed'); 250 251 if (!desktop) { 252 menuWidth = originalMenuWidth; 253 254 if (window.innerWidth <= originalMenuWidth) { 255 menuWidth = window.innerWidth - options.gutter - 25; 256 } 257 258 if (sidenavRight) { 259 if (closed) { 260 menu.css(positionDirection, menuWidth); 261 } 262 263 menu.css('width', menuWidth); 264 } 265 266 screenStartDesktop = false; 267 } 268 269 if (!closed) { 270 instance.clearStyle(['min-height', 'height']); 271 instance.showSidenav(); 272 instance.setHeight(); 273 } 274 }); 275 }, 276 _onSidenavTransitionEnd: function _onSidenavTransitionEnd(el, fn) { 277 var instance = this; 278 var transitionEnd = 'bsTransitionEnd'; 279 280 var complete = function complete() { 281 el.removeClass('sidenav-transition'); 282 283 if (fn) { 284 fn(); 285 } 286 }; 287 288 if (!bootstrap.Util.supportsTransitionEnd()) { 289 complete.call(instance); 290 } else { 291 el.one(transitionEnd, function () { 292 complete(); 293 }).emulateTransitionEnd(SideNavigation.TRANSITION_DURATION); 294 } 295 }, 296 _renderNav: function _renderNav() { 297 var instance = this; 298 var options = instance.options; 299 var container = $(options.container); 300 var slider = container.find(options.navigation).first(); 301 var menu = slider.find('.sidenav-menu').first(); 302 var closed = container.hasClass('closed'); 303 304 var sidenavRight = instance._isSidenavRight(); 305 306 var width = instance._getSidenavWidth(); 307 308 if (closed) { 309 menu.css('width', width); 310 311 if (sidenavRight) { 312 var positionDirection = options.rtl ? 'left' : 'right'; 313 menu.css(positionDirection, width); 314 } 315 } else { 316 instance.showSidenav(); 317 instance.setHeight(); 318 } 319 320 container.removeClass('sidenav-js-fouc'); 321 }, 322 _renderUI: function _renderUI() { 323 var instance = this; 324 var options = instance.options; 325 var container = $(options.container); 326 var toggler = instance.toggler; 327 var mobile = instance.mobile; 328 var type = mobile ? options.typeMobile : options.type; 329 330 if (!instance.useDataAttribute) { 331 if (mobile) { 332 container.addClass('closed').removeClass('open'); 333 toggler.removeClass('active').removeClass('open'); 334 } 335 336 if (options.position === 'right') { 337 container.addClass('sidenav-right'); 338 } 339 340 if (type !== 'relative') { 341 container.addClass('sidenav-fixed'); 342 } 343 344 instance._renderNav(); 345 } 346 347 container.css('display', ''); // Force Reflow for IE11 Browser Bug 348 }, 349 _setScreenSize: function _setScreenSize() { 350 var instance = this;
351 var screenSize = getBreakpointRegion(); 352 var desktop = screenSize === 'sm' || screenSize === 'md' || screenSize === 'lg'; 353 instance.mobile = !desktop; 354 instance.desktop = desktop; 355 return desktop; 356 }, 357 clearStyle: function clearStyle(attribute) { 358 var instance = this; 359 var options = instance.options; 360 var container = $(options.container); 361 var content = container.find(options.content).first(); 362 var navigation = container.find(options.navigation).first(); 363 var menu = container.find('.sidenav-menu').first(); 364 var els = content.add(navigation).add(menu); 365 366 if (Array.isArray(attribute)) { 367 for (var i = 0; i < attribute.length; i++) { 368 els.css(attribute[i], ''); 369 } 370 } else { 371 els.css(attribute, ''); 372 } 373 }, 374 destroy: function destroy() { 375 var instance = this; 376 var options = instance.options; 377 var container = $(instance.options.container); // Detach sidenav close 378 379 doc.off('click.close.lexicon.sidenav', instance.closeButtonSelector); 380 doc.data(instance.dataCloseButtonSelector, null); // Detach toggler 381 382 if (options.useDelegate) { 383 doc.off('click.lexicon.sidenav', instance.togglerSelector); 384 doc.data(instance.dataTogglerSelector, null); 385 } else { 386 container.off('click.lexicon.sidenav'); 387 } // Remove Side Navigation 388 389 390 container.data('lexicon.sidenav', null); 391 }, 392 hide: function hide() { 393 var instance = this; 394 395 if (instance.useDataAttribute) { 396 instance.hideSimpleSidenav(); 397 } else { 398 instance.toggleNavigation(false); 399 } 400 }, 401 hideSidenav: function hideSidenav() { 402 var instance = this; 403 var options = instance.options; 404 var container = $(options.container); 405 var content = container.find(options.content).first(); 406 var navigation = container.find(options.navigation).first(); 407 var menu = navigation.find('.sidenav-menu').first(); 408 409 var sidenavRight = instance._isSidenavRight(); 410 411 var positionDirection = options.rtl ? 'right' : 'left'; 412 413 if (sidenavRight) { 414 positionDirection = options.rtl ? 'left' : 'right'; 415 } 416 417 var paddingDirection = 'padding-' + positionDirection; 418 content.css(paddingDirection, '').css(positionDirection, ''); 419 navigation.css('width', ''); 420 421 if (sidenavRight) { 422 menu.css(positionDirection, instance._getSidenavWidth()); 423 } 424 }, 425 hideSimpleSidenav: function hideSimpleSidenav() { 426 var instance = this; 427 var options = instance.options; 428 429 var simpleSidenavClosed = instance._isSimpleSidenavClosed(); 430 431 if (!simpleSidenavClosed) { 432 var content = $(options.content).first(); 433 var sidenav = $(options.container); 434 var closedClass = options.closedClass; 435 var openClass = options.openClass; 436 var toggler = instance.toggler; 437 var target = toggler.attr('href') || toggler.attr('data-target'); 438 sidenav.trigger({ 439 toggler: $(instance.togglerSelector), 440 type: 'closedStart.lexicon.sidenav' 441 }); 442 443 instance._onSidenavTransitionEnd(content, function () { 444 sidenav.removeClass('sidenav-transition'); 445 toggler.removeClass('sidenav-transition'); 446 sidenav.trigger({ 447 toggler: $(instance.togglerSelector), 448 type: 'closed.lexicon.sidenav' 449 }); 450 }); 451 452 if (content.hasClass(openClass)) { 453 content.addClass('sidenav-transition').addClass(closedClass).removeClass(openClass); 454 } 455 456 sidenav.addClass('sidenav-transition'); 457 toggler.addClass('sidenav-transition'); 458 sidenav.addClass(closedClass).removeClass(openClass); 459 $('[data-target="' + target + '"]').removeClass(openClass).removeClass('active'); 460 $('[href="' + target + '"]').removeClass(openClass).removeClass('active'); 461 } 462 }, 463 init: function init(toggler, options) { 464 var instance = this; 465 var useDataAttribute = toggler.data('toggle') === 'sidenav'; 466 options = $.extend({}, $.fn.sideNavigation.defaults, options); 467 options.breakpoint = toInt(options.breakpoint); 468 options.container = options.container || toggler.data('target') || toggler.attr('href'); 469 options.gutter = toInt(options.gutter); 470 options.heightType = options.heightType || (options.equalHeight ? 'equalHeight' : false); 471 options.rtl = doc.attr('dir') === 'rtl'; 472 options.width = toInt(options.width); 473 options.widthOriginal = options.width; // instantiate using data attribute 474 475 if (useDataAttribute) { 476 options.closedClass = toggler.data('closed-class') || 'closed'; 477 options.content = toggler.data('content'); 478 options.equalHeight = false; // equalHeight option is deprecated 479 480 options.loadingIndicatorTPL = toggler.data('loading-indicator-tpl') || options.loadingIndicatorTPL; 481 options.openClass = toggler.data('open-class') || 'open'; 482 options.toggler = toggler; 483 options.type = toggler.data('type'); 484 options.typeMobile = toggler.data('type-mobile'); 485 options.url = toggler.data('url'); 486 options.useDelegate = toggler.data('use-delegate'); 487 options.width = ''; 488 489 if (options.useDelegate === undefined) { 490 options.useDelegate = true; 491 } 492 } 493 494 instance.toggler = toggler; 495 instance.options = options; 496 instance.useDataAttribute = useDataAttribute; 497 498 instance._bindUI(); 499 500 instance._renderUI(); 501 }, 502 setEqualHeight: function setEqualHeight() { 503 var instance = this; 504 var options = instance.options; 505 var container = $(options.container); 506 var content = options.content; 507 var navigation = options.navigation; 508 var type = instance.mobile ? options.typeMobile : options.type; 509 510 if (type !== 'fixed' && type !== 'fixed-push') { 511 var contentNode = container.find(content).first(); 512 var navNode = container.find(navigation).first(); 513 var sideNavMenuNode = container.find('.sidenav-menu').first(); 514 var tallest = Math.max(contentNode.outerHeight(), navNode.outerHeight()); 515 contentNode.css('min-height', tallest); 516 navNode.css({ 517 height: '100%', 518 'min-height': tallest 519 }); 520 sideNavMenuNode.css({ 521 height: '100%', 522 'min-height': tallest 523 }); 524 } 525 }, 526 setFullHeight: function setFullHeight() { 527 var instance = this; 528 var options = instance.options; 529 var container = $(options.container); 530 var navigation = options.navigation; 531 var type = instance.mobile ? options.typeMobile : options.type; 532 533 if (type === 'relative') { 534 var navNode = container.find(navigation).first(); 535 var sidenavMenuNode = container.find('.sidenav-menu').first(); 536 var minHeight = doc.innerHeight() - navNode.offset().top; 537
538 if (sidenavMenuNode.innerHeight() + navNode.offset().top > doc.innerHeight()) { 539 minHeight = sidenavMenuNode.innerHeight(); 540 } 541 542 navNode.css({ 543 height: '100%', 544 'min-height': minHeight 545 }); 546 sidenavMenuNode.css({ 547 height: '100%', 548 'min-height': minHeight 549 }); 550 } 551 }, 552 setHeight: function setHeight() { 553 var instance = this; 554 var options = instance.options; 555 556 if (options.heightType === 'equalHeight') { 557 instance.setEqualHeight(); 558 } else if (options.heightType === 'fullHeight') { 559 instance.setFullHeight(); 560 } 561 }, 562 show: function show() { 563 var instance = this; 564 565 if (instance.useDataAttribute) { 566 instance.showSimpleSidenav(); 567 } else { 568 instance.toggleNavigation(true); 569 } 570 }, 571 showSidenav: function showSidenav() { 572 var instance = this; 573 var mobile = instance.mobile; 574 var options = instance.options; 575 var container = $(options.container); 576 var content = container.find(options.content).first(); 577 var navigation = container.find(options.navigation).first(); 578 var menu = navigation.find('.sidenav-menu').first(); 579 580 var sidenavRight = instance._isSidenavRight(); 581 582 var width = instance._getSidenavWidth(); 583 584 var offset = width + options.gutter; 585 var url = options.url; 586 587 if (url) { 588 container.one('urlLoaded.lexicon.sidenav', function () { 589 instance.setHeight(); 590 }); 591 592 instance._loadUrl(menu, url, container); 593 } 594 595 navigation.css('width', width); 596 menu.css('width', width); 597 var positionDirection = options.rtl ? 'right' : 'left'; 598 599 if (sidenavRight) { 600 positionDirection = options.rtl ? 'left' : 'right'; 601 } 602 603 var paddingDirection = 'padding-' + positionDirection; 604 var pushContentCssProperty = mobile ? positionDirection : paddingDirection; 605 var type = mobile ? options.typeMobile : options.type; 606 607 if (type !== 'fixed') { 608 var navigationStartX = container.hasClass('open') ? navigation.offset().left - options.gutter : navigation.offset().left - offset; 609 var contentStartX = content.offset().left; 610 var contentWidth = content.innerWidth(); 611 var padding = ''; 612 613 if (options.rtl && sidenavRight || !options.rtl && options.position === 'left') { 614 navigationStartX = navigation.offset().left + offset; 615 616 if (navigationStartX > contentStartX) { 617 padding = navigationStartX - contentStartX; 618 } 619 } else if (options.rtl && options.position === 'left' || !options.rtl && sidenavRight) { 620 if (navigationStartX < contentStartX + contentWidth) { 621 padding = contentStartX + contentWidth - navigationStartX; 622 623 if (padding >= offset) { 624 padding = offset; 625 } 626 } 627 } 628 629 content.css(pushContentCssProperty, padding); 630 } 631 }, 632 showSimpleSidenav: function showSimpleSidenav() { 633 var instance = this; 634 var options = instance.options; 635 636 var simpleSidenavClosed = instance._isSimpleSidenavClosed(); 637 638 if (simpleSidenavClosed) { 639 var content = $(options.content).first(); 640 var sidenav = $(options.container); 641 var closedClass = options.closedClass; 642 var openClass = options.openClass; 643 var toggler = options.toggler; 644 var url = toggler.data('url'); 645 646 if (url) { 647 instance._loadUrl(sidenav, url); 648 } 649 650 sidenav.trigger({ 651 toggler: $(instance.togglerSelector), 652 type: 'openStart.lexicon.sidenav' 653 }); 654 655 instance._onSidenavTransitionEnd(content, function () { 656 sidenav.removeClass('sidenav-transition'); 657 toggler.removeClass('sidenav-transition'); 658 sidenav.trigger({ 659 toggler: $(instance.togglerSelector), 660 type: 'open.lexicon.sidenav' 661 }); 662 }); 663 664 content.addClass('sidenav-transition').addClass(openClass).removeClass(closedClass); 665 sidenav.addClass('sidenav-transition'); 666 toggler.addClass('sidenav-transition'); 667 sidenav.addClass(openClass).removeClass(closedClass); 668 toggler.addClass('active').addClass(openClass); 669 } 670 },
671 toggle: function toggle() { 672 var instance = this; 673 674 if (instance.useDataAttribute) { 675 instance.toggleSimpleSidenav(); 676 } else { 677 instance.toggleNavigation(); 678 } 679 }, 680 toggleNavigation: function toggleNavigation(force) { 681 var instance = this; 682 var options = instance.options; 683 var container = $(options.container); 684 var menu = container.find('.sidenav-menu').first(); 685 var toggler = instance.toggler; 686 var width = options.width; 687 var closed = $.type(force) === 'boolean' ? force : container.hasClass('closed'); 688 689 var sidenavRight = instance._isSidenavRight(); 690 691 var widthMethod = closed ? 'showSidenav' : 'hideSidenav'; 692 693 if (closed) { 694 container.trigger({ 695 toggler: toggler, 696 type: 'openStart.lexicon.sidenav' 697 }); 698 } else { 699 container.trigger({ 700 toggler: toggler, 701 type: 'closedStart.lexicon.sidenav' 702 }); 703 } 704 705 instance._onSidenavTransitionEnd(container, function () { 706 var menu = container.find('.sidenav-menu').first(); 707 708 if (container.hasClass('closed')) { 709 instance.clearStyle(['min-height', 'height']); 710 toggler.removeClass('open').removeClass('sidenav-transition'); 711 container.trigger({ 712 toggler: toggler, 713 type: 'closed.lexicon.sidenav' 714 }); 715 } else { 716 toggler.addClass('open').removeClass('sidenav-transition'); 717 container.trigger({ 718 toggler: toggler, 719 type: 'open.lexicon.sidenav' 720 }); 721 } 722 723 if (instance.mobile) { 724 instance._focusElement(menu); 725 } 726 }); 727 728 if (closed) { 729 instance.setHeight(); 730 menu.css('width', width); 731 var positionDirection = options.rtl ? 'left' : 'right'; 732 733 if (sidenavRight) { 734 menu.css(positionDirection, ''); 735 } 736 } 737 738 container.addClass('sidenav-transition'); 739 toggler.addClass('sidenav-transition'); 740 instance[widthMethod](container); 741 container.toggleClass('closed', !closed).toggleClass('open', closed); 742 toggler.toggleClass('active', closed).toggleClass('open', closed); 743 }, 744 toggleSimpleSidenav: function toggleSimpleSidenav() { 745 var instance = this; 746 747 var simpleSidenavClosed = instance._isSimpleSidenavClosed(); 748 749 if (simpleSidenavClosed) { 750 instance.showSimpleSidenav(); 751 } else { 752 instance.hideSimpleSidenav(); 753 } 754 }, 755 visible: function visible() { 756 var instance = this; 757 var closed; 758 759 if (instance.useDataAttribute) { 760 closed = instance._isSimpleSidenavClosed(); 761 } else { 762 var container = $(instance.options.container); 763 closed = container.hasClass('sidenav-transition') ? !container.hasClass('closed') : container.hasClass('closed'); 764 } 765 766 return !closed; 767 } 768 }; 769 var old = $.fn.sideNavigation; 770 771 var initialize = function initialize(toggler, options, selector) { 772 var data = toggler.data('lexicon.sidenav'); 773 774 if (!data) { 775 if (!options) { 776 options = {}; 777 } 778 779 options.selector = selector; 780 data = new SideNavigation(toggler, options); 781 toggler.data('lexicon.sidenav', data); 782 } 783 784 return data; 785 }; 786 787 var Plugin = function Plugin(options) { 788 var instance = this; 789 var selector = instance.selector; 790 var retVal = instance; 791 var methodCall = typeof options === 'string'; 792 var returnInstance = options === 'instance'; 793 var args = $.makeArray(arguments).slice(1); 794 795 if (methodCall) { 796 this.each(function () { 797 var $this = $(this); 798 var data = $this.data('lexicon.sidenav'); 799 800 if (data) { 801 if (returnInstance) { 802 retVal = data; 803 return false; 804 } 805 806 var methodRetVal; 807 808 if ($.isFunction(data[options]) && options.indexOf('_') !== 0) { 809 methodRetVal = data[options].apply(data, args); 810 } 811 812 if (methodRetVal !== data && methodRetVal !== undefined) { 813 if (methodRetVal.jquery) { 814 retVal = retVal.pushStack(methodRetVal.get()); 815 } else { 816 retVal = methodRetVal; 817 } 818 819 return false;
820 } 821 } else if (returnInstance) { 822 retVal = null; 823 return false; 824 } 825 }); 826 } else { 827 this.each(function () { 828 initialize($(this), options, selector); 829 }); 830 } 831 832 return retVal; 833 }; 834 835 Plugin.noConflict = function () { 836 $.fn.sideNavigation = old; 837 return this; 838 }; 839 /** 840 * Plugin options 841 * @property {String|Number} breakpoint The window width that defines the desktop size. 842 * @property {String} content The class or ID of the content container. 843 * @property {String} container The class or ID of the sidenav container. 844 * @property {String|Number} gutter The space between the sidenav-slider and the sidenav-content. 845 * @property {String|Boolean} equalHeight The height of content and navigation should be equal. This is deprecated. 846 * @property {String} heightType Calculates the height of sidenav when type is relative. Possible values: `fullHeight`, `equalHeight` 847 * @property {String} navigation The class or ID of the navigation container. 848 * @property {String} position The position of the sidenav-slider. Possible values: left, right 849 * @property {String} type The type of sidenav in desktop. Possible values: relative, fixed, fixed-push 850 * @property {String} typeMobile The type of sidenav in mobile. Possible values: relative, fixed, fixed-push 851 * @property {String|Boolean} useDelegate The type of reference to use on the toggler event handler. Value false, directly binds click to the toggler. 852 * @property {String|Object} url The URL or $.ajax config object to fetch the content to inject into .sidebar-body 853 * @property {String|Number} width The width of the side navigation. 854 */ 855 856 857 Plugin.defaults = { 858 breakpoint: 768, 859 content: '.sidenav-content', 860 equalHeight: true, 861 // equalHeight option is deprecated, use heightType instead 862 gutter: '0px', 863 heightType: null, 864 loadingIndicatorTPL: '<div class="loading-animation loading-animation-md"></div>', 865 navigation: '.sidenav-menu-slider', 866 position: 'left', 867 type: 'relative', 868 typeMobile: 'relative', 869 url: null, 870 useDelegate: true, 871 width: '225px' 872 }; 873 Plugin.Constructor = SideNavigation; 874 $.fn.sideNavigation = Plugin; 875 $(function () { 876 var sidenav = $('[data-toggle="sidenav"]'); 877 Plugin.call(sidenav); 878 }); 879}(jQuery); 880//# sourceMappingURL=side_navigation.js.map
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.