1// 2// Global init of core components 3// 4 5// Init components 6var KTComponents = function () { 7 // Public methods 8 return { 9 init: function () { 10 KTApp.init(); 11 KTDrawer.init(); 12 KTMenu.init(); 13 KTScroll.init(); 14 KTSticky.init(); 15 KTSwapper.init(); 16 KTToggle.init(); 17 KTScrolltop.init(); 18 KTDialer.init(); 19 KTImageInput.init(); 20 KTPasswordMeter.init(); 21 } 22 } 23}(); 24 25// On document ready 26if (document.readyState === "loading") { 27 document.addEventListener("DOMContentLoaded", function () { 28 KTComponents.init(); 29 }); 30} else { 31 KTComponents.init(); 32} 33 34// Init page loader 35window.addEventListener("load", function () { 36 KTApp.hidePageLoading(); 37}); 38 39// Declare KTApp for Webpack support 40if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') { 41 window.KTComponents = module.exports = KTComponents; 42} 43"use strict"; 44 45// Class definition 46var KTApp = function () { 47 var initialized = false; 48 var select2FocusFixInitialized = false; 49 var countUpInitialized = false; 50 51 var createBootstrapTooltip = function (el, options) { 52 if (el.getAttribute("data-kt-initialized") === "1") { 53 return; 54 } 55 56 var delay = {}; 57 58 // Handle delay options 59 if (el.hasAttribute('data-bs-delay-hide')) { 60 delay['hide'] = el.getAttribute('data-bs-delay-hide'); 61 } 62 63 if (el.hasAttribute('data-bs-delay-show')) { 64 delay['show'] = el.getAttribute('data-bs-delay-show'); 65 } 66 67 if (delay) { 68 options['delay'] = delay; 69 } 70 71 // Check dismiss options 72 if (el.hasAttribute('data-bs-dismiss') && el.getAttribute('data-bs-dismiss') == 'click') { 73 options['dismiss'] = 'click'; 74 } 75 76 // Initialize popover 77 var tp = new bootstrap.Tooltip(el, options); 78 79 // Handle dismiss 80 if (options['dismiss'] && options['dismiss'] === 'click') { 81 // Hide popover on element click 82 el.addEventListener("click", function (e) { 83 el.blur(); 84 tp.hide(); 85 }); 86 } 87 88 el.setAttribute("data-kt-initialized", "1"); 89 90 return tp; 91 } 92 93 var createBootstrapTooltips = function () { 94 var tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]')); 95 96 var tooltipList = tooltipTriggerList.map(function (tooltipTriggerEl) { 97 createBootstrapTooltip(tooltipTriggerEl, {}); 98 }); 99 } 100 101 var createBootstrapPopover = function (el, options) { 102 if (el.getAttribute("data-kt-initialized") === "1") { 103 return; 104 } 105 106 var delay = {}; 107 108 // Handle delay options 109 if (el.hasAttribute('data-bs-delay-hide')) { 110 delay['hide'] = el.getAttribute('data-bs-delay-hide'); 111 } 112 113 if (el.hasAttribute('data-bs-delay-show')) { 114 delay['show'] = el.getAttribute('data-bs-delay-show'); 115 } 116 117 if (delay) { 118 options['delay'] = delay; 119 } 120 121 // Handle dismiss option 122 if (el.getAttribute('data-bs-dismiss') == 'true') { 123 options['dismiss'] = true; 124 } 125 126 if (options['dismiss'] === true) { 127 options['template'] = '<div class="popover" role="tooltip"><div class="popover-arrow"></div><span class="popover-dismiss btn btn-icon"></span><h3 class="popover-header"></h3><div class="popover-body"></div></div>' 128 } 129 130 // Initialize popover 131 var popover = new bootstrap.Popover(el, options); 132 133 // Handle dismiss click 134 if (options['dismiss'] === true) { 135 var dismissHandler = function (e) { 136 popover.hide(); 137 } 138 139 el.addEventListener('shown.bs.popover', function () { 140 var dismissEl = document.getElementById(el.getAttribute('aria-describedby')); 141 dismissEl.addEventListener('click', dismissHandler); 142 }); 143 144 el.addEventListener('hide.bs.popover', function () { 145 var dismissEl = document.getElementById(el.getAttribute('aria-describedby')); 146 dismissEl.removeEventListener('click', dismissHandler); 147 }); 148 } 149 150 el.setAttribute("data-kt-initialized", "1"); 151 152 return popover; 153 } 154 155 var createBootstrapPopovers = function () { 156 var popoverTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="popover"]')); 157 158 var popoverList = popoverTriggerList.map(function (popoverTriggerEl) { 159 createBootstrapPopover(popoverTriggerEl, {}); 160 }); 161 } 162 163 var createBootstrapToasts = function () { 164 var toastElList = [].slice.call(document.querySelectorAll('.toast')); 165 var toastList = toastElList.map(function (toastEl) { 166 if (toastEl.getAttribute("data-kt-initialized") === "1") { 167 return; 168 } 169 170 toastEl.setAttribute("data-kt-initialized", "1"); 171 172 return new bootstrap.Toast(toastEl, {}) 173 }); 174 } 175 176 var createButtons = function () { 177 var buttonsGroup = [].slice.call(document.querySelectorAll('[data-kt-buttons="true"]')); 178 179 buttonsGroup.map(function (group) { 180 if (group.getAttribute("data-kt-initialized") === "1") { 181 return; 182 } 183 184 var selector = group.hasAttribute('data-kt-buttons-target') ? group.getAttribute('data-kt-buttons-target') : '.btn'; 185 var activeButtons = [].slice.call(group.querySelectorAll(selector)); 186 187 // Toggle Handler 188 KTUtil.on(group, selector, 'click', function (e) { 189 activeButtons.map(function (button) { 190 button.classList.remove('active'); 191 }); 192 193 this.classList.add('active'); 194 }); 195 196 group.setAttribute("data-kt-initialized", "1"); 197 }); 198 } 199 200 var createDateRangePickers = function () { 201 // Check if jQuery included 202 if (typeof jQuery == 'undefined') { 203 return; 204 } 205 206 // Check if daterangepicker included 207 if (typeof $.fn.daterangepicker === 'undefined') { 208 return; 209 } 210 211 var elements = [].slice.call(document.querySelectorAll('[data-kt-daterangepicker="true"]')); 212 var start = moment().subtract(29, 'days'); 213 var end = moment(); 214 215 elements.map(function (element) { 216 if (element.getAttribute("data-kt-initialized") === "1") { 217 return; 218 } 219 220 var display = element.querySelector('div'); 221 var attrOpens = element.hasAttribute('data-kt-daterangepicker-opens') ? element.getAttribute('data-kt-daterangepicker-opens') : 'left'; 222 var range = element.getAttribute('data-kt-daterangepicker-range'); 223 224 var cb = function (start, end) { 225 var current = moment(); 226 227 if (display) { 228 if (current.isSame(start, "day") && current.isSame(end, "day")) { 229 display.innerHTML = start.format('D MMM YYYY'); 230 } else { 231 display.innerHTML = start.format('D MMM YYYY') + ' - ' + end.format('D MMM YYYY'); 232 } 233 } 234 } 235 236 if (range === "today") { 237 start = moment(); 238 end = moment(); 239 } 240 241 $(element).daterangepicker({ 242 startDate: start, 243 endDate: end, 244 opens: attrOpens, 245 ranges: { 246 'Today': [moment(), moment()], 247 'Yesterday': [moment().subtract(1, 'days'), moment().subtract(1, 'days')], 248 'Last 7 Days': [moment().subtract(6, 'days'), moment()], 249 'Last 30 Days': [moment().subtract(29, 'days'), moment()], 250 'This Month': [moment().startOf('month'), moment().endOf('month')], 251 'Last Month': [moment().subtract(1, 'month').startOf('month'), moment().subtract(1, 'month').endOf('month')] 252 } 253 }, cb); 254 255 cb(start, end); 256 257 element.setAttribute("data-kt-initialized", "1"); 258 }); 259 } 260 261 var createSelect2 = function () { 262 // Check if jQuery included 263 if (typeof jQuery == 'undefined') { 264 return; 265 } 266 267 // Check if select2 included 268 if (typeof $.fn.select2 === 'undefined') { 269 return; 270 } 271 272 var elements = [].slice.call(document.querySelectorAll('[data-control
272="select2"], [data-kt-select2="true"]')); 273 274 elements.map(function (element) { 275 if (element.getAttribute("data-kt-initialized") === "1") { 276 return; 277 } 278 279 var options = { 280 dir: document.body.getAttribute('direction') 281 }; 282 283 if (element.getAttribute('data-hide-search') == 'true') { 284 options.minimumResultsForSearch = Infinity; 285 } 286 287 $(element).select2(options); 288 289 // Handle Select2's KTMenu parent case 290 if (element.hasAttribute('data-dropdown-parent') && element.hasAttribute('multiple')) { 291 var parentEl = document.querySelector(element.getAttribute('data-dropdown-parent')); 292 293 if (parentEl && parentEl.hasAttribute("data-kt-menu")) { 294 var menu = KTMenu.getInstance(parentEl); 295 296 if (!menu) { 297 menu = new KTMenu(parentEl); 298 } 299 300 if (menu) { 301 $(element).on('select2:unselect', function (e) { 302 element.setAttribute("data-multiple-unselect", "1"); 303 }); 304 305 menu.on("kt.menu.dropdown.hide", function (item) { 306 if (element.getAttribute("data-multiple-unselect") === "1") { 307 element.removeAttribute("data-multiple-unselect"); 308 return false; 309 } 310 }); 311 } 312 } 313 } 314 315 element.setAttribute("data-kt-initialized", "1"); 316 }); 317 } 318 319 var createAutosize = function () { 320 if (typeof autosize === 'undefined') { 321 return; 322 } 323 324 var inputs = [].slice.call(document.querySelectorAll('[data-kt-autosize="true"]')); 325 326 inputs.map(function (input) { 327 if (input.getAttribute("data-kt-initialized") === "1") { 328 return; 329 } 330 331 autosize(input); 332 333 input.setAttribute("data-kt-initialized", "1"); 334 }); 335 } 336 337 var createCountUp = function () { 338 if (typeof countUp === 'undefined') { 339 return; 340 } 341 342 var elements = [].slice.call(document.querySelectorAll('[data-kt-countup="true"]:not(.counted)')); 343 344 elements.map(function (element) { 345 if (KTUtil.isInViewport(element) && KTUtil.visible(element)) { 346 if (element.getAttribute("data-kt-initialized") === "1") { 347 return; 348 } 349 350 var options = {}; 351 352 var value = element.getAttribute('data-kt-countup-value'); 353 value = parseFloat(value.replace(/,/g, "")); 354 355 if (element.hasAttribute('data-kt-countup-start-val')) { 356 options.startVal = parseFloat(element.getAttribute('data-kt-countup-start-val')); 357 } 358 359 if (element.hasAttribute('data-kt-countup-duration')) { 360 options.duration = parseInt(element.getAttribute('data-kt-countup-duration')); 361 } 362 363 if (element.hasAttribute('data-kt-countup-decimal-places')) { 364 options.decimalPlaces = parseInt(element.getAttribute('data-kt-countup-decimal-places')); 365 } 366 367 if (element.hasAttribute('data-kt-countup-prefix')) { 368 options.prefix = element.getAttribute('data-kt-countup-prefix'); 369 } 370 371 if (element.hasAttribute('data-kt-countup-separator')) { 372 options.separator = element.getAttribute('data-kt-countup-separator'); 373 } 374 375 if (element.hasAttribute('data-kt-countup-suffix')) { 376 options.suffix = element.getAttribute('data-kt-countup-suffix'); 377 } 378 379 var count = new countUp.CountUp(element, value, options); 380 381 count.start(); 382 383 element.classList.add('counted'); 384 385 element.setAttribute("data-kt-initialized", "1"); 386 } 387 }); 388 } 389 390 var createCountUpTabs = function () { 391 if (typeof countUp === 'undefined') { 392 return; 393 } 394 395 if (countUpInitialized === false) { 396 // Initial call 397 createCountUp(); 398 399 // Window scroll event handler 400 window.addEventListener('scroll', createCountUp); 401 } 402 403 // Tabs shown event handler 404 var tabs = [].slice.call(document.querySelectorAll('[data-kt-countup-tabs="true"][data-bs-toggle="tab"]')); 405 tabs.map(function (tab) { 406 if (tab.getAttribute("data-kt-initialized") === "1") { 407 return; 408 } 409 410 tab.addEventListener('shown.bs.tab', createCountUp); 411 412 tab.setAttribute("data-kt-initialized", "1"); 413 }); 414 415 countUpInitialized = true; 416 } 417 418 var createTinySliders = function () { 419 if (typeof tns === 'undefined') { 420 return; 421 } 422 423 // Sliders 424 const elements = Array.prototype.slice.call(document.querySelectorAll('[data-tns="true"]'), 0); 425 426 if (!elements && elements.length === 0) { 427 return; 428 } 429
430 elements.forEach(function (el) { 431 if (el.getAttribute("data-kt-initialized") === "1") { 432 return; 433 } 434 435 const obj = initTinySlider(el); 436 KTUtil.data(el).set('tns', tns); 437 438 el.setAttribute("data-kt-initialized", "1"); 439 }); 440 } 441 442 var initTinySlider = function (el) { 443 if (!el) { 444 return; 445 } 446 447 const tnsOptions = {}; 448 449 // Convert string boolean 450 const checkBool = function (val) { 451 if (val === 'true') { 452 return true; 453 } 454 if (val === 'false') { 455 return false; 456 } 457 return val; 458 }; 459 460 // get extra options via data attributes 461 el.getAttributeNames().forEach(function (attrName) { 462 // more options; https://github.com/ganlanyuan/tiny-slider#options 463 if ((/^data-tns-.*/g).test(attrName)) { 464 let optionName = attrName.replace('data-tns-', '').toLowerCase().replace(/(?:[\s-])\w/g, function (match) { 465 return match.replace('-', '').toUpperCase(); 466 }); 467 468 if (attrName === 'data-tns-responsive') { 469 // fix string with a valid json 470 const jsonStr = el.getAttribute(attrName).replace(/(\w+:)|(\w+ :)/g, function (matched) { 471 return '"' + matched.substring(0, matched.length - 1) + '":'; 472 }); 473 try { 474 // convert json string to object 475 tnsOptions[optionName] = JSON.parse(jsonStr); 476 } 477 catch (e) { 478 } 479 } 480 else { 481 tnsOptions[optionName] = checkBool(el.getAttribute(attrName)); 482 } 483 } 484 }); 485 486 const opt = Object.assign({}, { 487 container: el, 488 slideBy: 'page', 489 autoplay: true, 490 center: true, 491 autoplayButtonOutput: false, 492 }, tnsOptions); 493 494 if (el.closest('.tns')) { 495 KTUtil.addClass(el.closest('.tns'), 'tns-initiazlied'); 496 } 497 498 return tns(opt); 499 } 500 501 var initSmoothScroll = function () { 502 if (initialized === true) { 503 return; 504 } 505 506 if (typeof SmoothScroll === 'undefined') { 507 return; 508 } 509 510 new SmoothScroll('a[data-kt-scroll-toggle][href*="#"]', { 511 speed: 1000, 512 speedAsDuration: true, 513 offset: function (anchor, toggle) { 514 // Integer or Function returning an integer. How far to offset the scrolling anchor location in pixels 515 // This example is a function, but you could do something as simple as `offset: 25` 516 517 // An example returning different values based on whether the clicked link was in the header nav or not 518 if (anchor.hasAttribute('data-kt-scroll-offset')) { 519 var val = KTUtil.getResponsiveValue(anchor.getAttribute('data-kt-scroll-offset')); 520 521 return val; 522 } else { 523 return 0; 524 } 525 } 526 }); 527 } 528 529 var initCard = function () { 530 // Toggle Handler 531 KTUtil.on(document.body, '[data-kt-card-action="remove"]', 'click', function (e) { 532 e.preventDefault(); 533 534 const card = this.closest('.card'); 535 536 if (!card) { 537 return; 538 } 539 540 const confirmMessage = this.getAttribute("data-kt-card-confirm-message"); 541 const confirm = this.getAttribute("data-kt-card-confirm") === "true"; 542 543 if (confirm) { 544 // Show message popup. For more info check the plugin's official documentation: https://sweetalert2.github.io/ 545 Swal.fire({ 546 text: confirmMessage ? confirmMessage : "Are you sure to remove ?", 547 icon: "warning", 548 buttonsStyling: false, 549 confirmButtonText: "Confirm", 550 denyButtonText: "Cancel", 551 customClass: { 552 confirmButton: "btn btn-primary", 553 denyButton: "btn btn-danger" 554 } 555 }).then(function (result) { 556 if (result.isConfirmed) { 557 card.remove(); 558 } 559 }); 560 } else { 561 card.remove(); 562 } 563 }); 564 } 565 566 var initModal = function () { 567 var elements = Array.prototype.slice.call(document.querySelectorAll("[data-bs-stacked-modal]")); 568 569 if (elements && elements.length > 0) { 570 elements.forEach((element) => { 571 if (element.getAttribute("data-kt-initialized") === "1") { 572 return; 573 } 574 575 element.setAttribute("data-kt-initialized", "1"); 576 577 element.addEventListener("click", function (e) { 578 e.preventDefault(); 579 580 const modalEl = document.querySelector(this.getAttribute("data-bs-stacked-modal")); 581 582 if (modalEl) { 583 const modal = new bootstrap.Modal(modalEl, { backdrop: false }); 584 modal.show(); 585 } 586 }); 587 }); 588 } 589 } 590 591 var initCheck = function () { 592 if (initialized === true) { 593 return; 594 } 595 596 // Toggle Handler 597 KTUtil.on(document.body, '[data-kt-check="true"]', 'change', function (e) { 598 var check = this; 599 var targets = document.querySelectorAll(check.getAttribute('data-kt-check-target')); 600 601 KTUtil.each(targets, function (target) { 602 if (target.type == 'checkbox') { 603 target.checked = check.checked; 604 } else { 605 target.classList.toggle('active'); 606 } 607 }); 608 }); 609 } 610 611 var initBootstrapCollapse = function () { 612 if (initialized === true) { 613 return; 614 } 615 616 KTUtil.on(document.body, '.collapsible[data-bs-toggle="collapse"]', 'click', function (e) { 617 if (this.classList.contains('collapsed')) { 618 this.classList.remove('active'); 619 this.blur(); 620 } else { 621 this.classList.add('active'); 622 } 623 624 if (this.hasAttribute('data-kt-toggle-text')) { 625 var text = this.getAttribute('data-kt-toggle-text'); 626 var target = this.querySelector('[data-kt-toggle-text-target="true"]'); 627 var target = target ? target : this; 628 629 this.setAttribute('data-kt-toggle-text', target.innerText); 630 target.innerText = text; 631 } 632 }); 633 } 634 635 var initBootstrapRotate = function () { 636 if (initialized === true) { 637 return; 638 } 639 640 KTUtil.on(document.body, '[data-kt-rotate="true"]', 'click', function (e) { 641 if (this.classList.contains('active')) { 642 this.classList.remove('active'); 643 this.blur(); 644 } else { 645 this.classList.add('active'); 646 } 647 }); 648 } 649 650 var initLozad = function () { 651 // Check if lozad included 652 if (typeof lozad === 'undefined') { 653 return; 654 } 655 656 const observer = lozad(); // lazy loads elements with default selector as '.lozad' 657 observer.observe(); 658 } 659 660 var showPageLoading = function () { 661 document.body.classList.add('page-loading'); 662 document.body.setAttribute('data-kt-app-page-loading', "on"); 663 } 664 665 var hidePageLoading = function () { 666 // CSS3 Transitions only after page load(.page-loading or .app-page-loading class added to body tag and remove with JS on page load
666) 667 document.body.classList.remove('page-loading'); 668 document.body.removeAttribute('data-kt-app-page-loading'); 669 } 670 671 return { 672 init: function () { 673 initLozad(); 674 675 initSmoothScroll(); 676 677 initCard(); 678 679 initModal(); 680 681 initCheck(); 682 683 initBootstrapCollapse(); 684 685 initBootstrapRotate(); 686 687 createBootstrapTooltips(); 688 689 createBootstrapPopovers(); 690 691 createBootstrapToasts(); 692 693 createDateRangePickers(); 694 695 createButtons(); 696 697 createSelect2(); 698 699 createCountUp(); 700 701 createCountUpTabs(); 702 703 createAutosize(); 704 705 createTinySliders(); 706 707 initialized = true; 708 }, 709 710 initTinySlider: function (el) { 711 initTinySlider(el); 712 }, 713 714 showPageLoading: function () { 715 showPageLoading(); 716 }, 717 718 hidePageLoading: function () { 719 hidePageLoading(); 720 }, 721 722 createBootstrapPopover: function (el, options) { 723 return createBootstrapPopover(el, options); 724 }, 725 726 createBootstrapTooltip: function (el, options) { 727 return createBootstrapTooltip(el, options); 728 } 729 }; 730}(); 731 732// Declare KTApp for Webpack support 733if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') { 734 module.exports = KTApp; 735} 736"use strict"; 737 738// Class definition 739var KTBlockUI = function (element, options) { 740 ////////////////////////////// 741 // ** Private variables ** // 742 ////////////////////////////// 743 var the = this; 744 745 if (typeof element === "undefined" || element === null) { 746 return; 747 } 748 749 // Default options 750 var defaultOptions = { 751 zIndex: false, 752 overlayClass: '', 753 overflow: 'hidden', 754 message: '<span class="spinner-border text-primary"></span>' 755 }; 756 757 //////////////////////////// 758 // ** Private methods ** // 759 //////////////////////////// 760 761 var _construct = function () { 762 if (KTUtil.data(element).has('blockui')) { 763 the = KTUtil.data(element).get('blockui'); 764 } else { 765 _init(); 766 } 767 } 768 769 var _init = function () { 770 // Variables 771 the.options = KTUtil.deepExtend({}, defaultOptions, options); 772 the.element = element; 773 the.overlayElement = null; 774 the.blocked = false; 775 the.positionChanged = false; 776 the.overflowChanged = false; 777 778 // Bind Instance 779 KTUtil.data(the.element).set('blockui', the); 780 } 781 782 var _block = function () { 783 if (KTEventHandler.trigger(the.element, 'kt.blockui.block', the) === false) { 784 return; 785 } 786 787 var isPage = (the.element.tagName === 'BODY'); 788 789 var position = KTUtil.css(the.element, 'position'); 790 var overflow = KTUtil.css(the.element, 'overflow'); 791 var zIndex = isPage ? 10000 : 1; 792 793 if (the.options.zIndex > 0) { 794 zIndex = the.options.zIndex; 795 } else { 796 if (KTUtil.css(the.element, 'z-index') != 'auto') { 797 zIndex = KTUtil.css(the.element, 'z-index'); 798 } 799 } 800 801 the.element.classList.add('blockui'); 802 803 if (position === "absolute" || position === "relative" || position === "fixed") { 804 KTUtil.css(the.element, 'position', 'relative'); 805 the.positionChanged = true; 806 } 807 808 if (the.options.overflow === 'hidden' && overflow === 'visible') { 809 KTUtil.css(the.element, 'overflow', 'hidden'); 810 the.overflowChanged = true; 811 } 812 813 the.overlayElement = document.createElement('DIV'); 814 the.overlayElement.setAttribute('class', 'blockui-overlay ' + the.options.overlayClass); 815 816 the.overlayElement.innerHTML = the.options.message; 817 818 KTUtil.css(the.overlayElement, 'z-index', zIndex); 819 820 the.element.append(the.overlayElement); 821 the.blocked = true; 822 823 KTEventHandler.trigger(the.element, 'kt.blockui.after.blocked', the) 824 } 825 826 var _release = function () { 827 if (KTEventHandler.trigger(the.element, 'kt.blockui.release', the) === false) { 828 return; 829 } 830 831 the.element.classList.add('blockui'); 832 833 if (the.positionChanged) { 834 KTUtil.css(the.element, 'position', ''); 835 } 836 837 if (the.overflowChanged) { 838 KTUtil.css(the.element, 'overflow', ''); 839 } 840 841 if (the.overlayElement) { 842 KTUtil.remove(the.overlayElement); 843 } 844 845 the.blocked = false; 846 847 KTEventHandler.trigger(the.element, 'kt.blockui.released', the); 848 } 849 850 var _isBlocked = function () { 851 return the.blocked; 852 } 853 854 var _destroy = function () { 855 KTUtil.data(the.element).remove('blockui'); 856 } 857 858 // Construct class 859 _construct(); 860 861 /////////////////////// 862 // ** Public API ** // 863 /////////////////////// 864 865 // Plugin API 866 the.block = function () { 867 _block(); 868 } 869 870 the.release = function () { 871 _release(); 872 } 873 874 the.isBlocked = function () { 875 return _isBlocked(); 876 } 877 878 the.destroy = function () { 879 return _destroy(); 880 } 881 882 // Event API 883 the.on = function (name, handler) { 884 return KTEventHandler.on(the.element, name, handler); 885 } 886 887 the.one = function (name, handler) { 888 return KTEventHandler.one(the.element, name, handler); 889 } 890 891 the.off = function (name, handlerId) { 892 return KTEventHandler.off(the.element, name, handlerId); 893 } 894 895 the.trigger = function (name, event) { 896 return KTEventHandler.trigger(the.element, name, event, the, event); 897 } 898}; 899 900// Static methods 901KTBlockUI.getInstance = function (element) { 902 if (element !== null && KTUtil.data(element).has('blockui')) { 903 return KTUtil.data(element).get('blockui'); 904 } else { 905 return null; 906 } 907} 908 909// Webpack support 910if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') { 911 module.exports = KTBlockUI; 912} 913"use strict";
914// DOCS: https://javascript.info/cookie 915 916// Class definition 917var KTCookie = function () { 918 return { 919 // returns the cookie with the given name, 920 // or undefined if not found 921 get: function (name) { 922 var matches = document.cookie.match(new RegExp( 923 "(?:^|; )" + name.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g, '\\$1') + "=([^;]*)" 924 )); 925 926 return matches ? decodeURIComponent(matches[1]) : null; 927 }, 928 929 // Please note that a cookie value is encoded, 930 // so getCookie uses a built-in decodeURIComponent function to decode it. 931 set: function (name, value, options) { 932 if (typeof options === "undefined" || options === null) { 933 options = {}; 934 } 935 936 options = Object.assign({}, { 937 path: '/' 938 }, options); 939 940 if (options.expires instanceof Date) { 941 options.expires = options.expires.toUTCString(); 942 } 943 944 var updatedCookie = encodeURIComponent(name) + "=" + encodeURIComponent(value); 945 946 for (var optionKey in options) { 947 if (options.hasOwnProperty(optionKey) === false) { 948 continue; 949 } 950 951 updatedCookie += "; " + optionKey; 952 var optionValue = options[optionKey]; 953 954 if (optionValue !== true) { 955 updatedCookie += "=" + optionValue; 956 } 957 } 958 959 document.cookie = updatedCookie; 960 }, 961 962 // To remove a cookie, we can call it with a negative expiration date: 963 remove: function (name) { 964 this.set(name, "", { 965 'max-age': -1 966 }); 967 } 968 } 969}(); 970 971// Webpack support 972if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') { 973 module.exports = KTCookie; 974} 975 976"use strict"; 977 978// Class definition 979var KTDialer = function (element, options) { 980 //////////////////////////// 981 // ** Private variables ** // 982 //////////////////////////// 983 var the = this; 984 985 if (!element) { 986 return; 987 } 988 989 // Default options 990 var defaultOptions = { 991 min: null, 992 max: null, 993 step: 1, 994 currency: false, 995 decimals: 0, 996 prefix: "", 997 suffix: "" 998 }; 999 1000 //////////////////////////// 1001 // ** Private methods ** // 1002 //////////////////////////// 1003 1004 // Constructor 1005 var _construct = function () { 1006 if (KTUtil.data(element).has('dialer') === true) { 1007 the = KTUtil.data(element).get('dialer'); 1008 } else { 1009 _init(); 1010 } 1011 } 1012 1013 // Initialize 1014 var _init = function () { 1015 // Variables 1016 the.options = KTUtil.deepExtend({}, defaultOptions, options); 1017 1018 // Elements 1019 the.element = element; 1020 the.incElement = the.element.querySelector('[data-kt-dialer-control="increase"]'); 1021 the.decElement = the.element.querySelector('[data-kt-dialer-control="decrease"]'); 1022 the.inputElement = the.element.querySelector('input[type]'); 1023 1024 // Set Values 1025 if (_getOption('currency') === 'true') { 1026 the.options.currency = true; 1027 } 1028 1029 if (_getOption('decimals')) { 1030 the.options.decimals = parseInt(_getOption('decimals')); 1031 } 1032 1033 if (_getOption('prefix')) { 1034 the.options.prefix = _getOption('prefix'); 1035 } 1036 1037 if (_getOption('suffix')) { 1038 the.options.suffix = _getOption('suffix'); 1039 } 1040 1041 if (_getOption('step')) { 1042 the.options.step = parseFloat(_getOption('step')); 1043 } 1044 1045 if (_getOption('min')) { 1046 the.options.min = parseFloat(_getOption('min')); 1047 } 1048 1049 if (_getOption('max')) { 1050 the.options.max = parseFloat(_getOption('max')); 1051 } 1052 1053 the.value = parseFloat(the.inputElement.value.replace(/[^\d.]/g, '')); 1054 1055 _setValue(); 1056 1057 // Event Handlers 1058 _handlers(); 1059 1060 // Bind Instance 1061 KTUtil.data(the.element).set('dialer', the); 1062 } 1063 1064 // Handlers 1065 var _handlers = function () { 1066 KTUtil.addEvent(the.incElement, 'click', function (e) { 1067 e.preventDefault(); 1068 1069 _increase(); 1070 }); 1071 1072 KTUtil.addEvent(the.decElement, 'click', function (e) { 1073 e.preventDefault(); 1074 1075 _decrease(); 1076 }); 1077 1078 KTUtil.addEvent(the.inputElement, 'input', function (e) { 1079 e.preventDefault(); 1080 1081 _setValue(); 1082 }); 1083 } 1084 1085 // Event handlers 1086 var _increase = function () { 1087 // Trigger "after.dialer" event 1088 KTEventHandler.trigger(the.element, 'kt.dialer.increase', the); 1089 1090 the.inputElement.value = the.value + the.options.step; 1091 _setValue(); 1092 1093 // Trigger "before.dialer" event 1094 KTEventHandler.trigger(the.element, 'kt.dialer.increased', the); 1095 1096 return the; 1097 } 1098 1099 var _decrease = function () { 1100 // Trigger "after.dialer" event 1101 KTEventHandler.trigger(the.element, 'kt.dialer.decrease', the); 1102 1103 the.inputElement.value = the.value - the.options.step; 1104 1105 _setValue(); 1106 1107 // Trigger "before.dialer" event 1108 KTEventHandler.trigger(the.element, 'kt.dialer.decreased', the); 1109 1110 return the; 1111 } 1112 1113 // Set Input Value 1114 var _setValue = function (value) { 1115 // Trigger "after.dialer" event 1116 KTEventHandler.trigger(the.element, 'kt.dialer.change', the); 1117 1118 if (value !== undefined) { 1119 the.value = value; 1120 } else { 1121 the.value = _parse(the.inputElement.value); 1122 } 1123 1124 if (the.options.min !== null && the.value < the.options.min) { 1125 the.value = the.options.min; 1126 } 1127 1128 if (the.options.max !== null && the.value > the.options.max) { 1129 the.value = the.options.max; 1130 } 1131 1132 the.inputElement.value = _format(the.value); 1133 1134 // Trigger input change event 1135 the.inputElement.dispatchEvent(new Event('change')); 1136 1137 // Trigger "after.dialer" event 1138 KTEventHandler.trigger(the.element, 'kt.dialer.changed', the); 1139 } 1140 1141 var _parse = function (val) { 1142 val = val
1143 .replace(/[^0-9.-]/g, '') // remove chars except number, hyphen, point. 1144 .replace(/(\..*)\./g, '$1') // remove multiple points. 1145 .replace(/(?!^)-/g, '') // remove middle hyphen. 1146 .replace(/^0+(\d)/gm, '$1'); // remove multiple leading zeros. <-- I added this. 1147 1148 val = parseFloat(val); 1149 1150 if (isNaN(val)) { 1151 val = 0; 1152 } 1153 1154 return val; 1155 } 1156 1157 // Format 1158 var _format = function (val) { 1159 val = parseFloat(val).toFixed(the.options.decimals); 1160 1161 if (the.options.currency) { 1162 val = val.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ","); 1163 } 1164 1165 return the.options.prefix + val + the.options.suffix; 1166 } 1167 1168 // Get option 1169 var _getOption = function (name) { 1170 if (the.element.hasAttribute('data-kt-dialer-' + name) === true) { 1171 var attr = the.element.getAttribute('data-kt-dialer-' + name); 1172 var value = attr; 1173 1174 return value; 1175 } else { 1176 return null; 1177 } 1178 } 1179 1180 var _destroy = function () { 1181 KTUtil.data(the.element).remove('dialer'); 1182 } 1183 1184 // Construct class 1185 _construct(); 1186 1187 /////////////////////// 1188 // ** Public API ** // 1189 /////////////////////// 1190 1191 // Plugin API 1192 the.setMinValue = function (value) { 1193 the.options.min = value; 1194 } 1195 1196 the.setMaxValue = function (value) { 1197 the.options.max = value; 1198 } 1199 1200 the.setValue = function (value) { 1201 _setValue(value); 1202 } 1203 1204 the.getValue = function () { 1205 return the.inputElement.value; 1206 } 1207 1208 the.update = function () { 1209 _setValue(); 1210 } 1211 1212 the.increase = function () { 1213 return _increase(); 1214 } 1215 1216 the.decrease = function () { 1217 return _decrease(); 1218 } 1219 1220 the.getElement = function () { 1221 return the.element; 1222 } 1223 1224 the.destroy = function () { 1225 return _destroy(); 1226 } 1227 1228 // Event API 1229 the.on = function (name, handler) { 1230 return KTEventHandler.on(the.element, name, handler); 1231 } 1232 1233 the.one = function (name, handler) { 1234 return KTEventHandler.one(the.element, name, handler); 1235 } 1236 1237 the.off = function (name, handlerId) { 1238 return KTEventHandler.off(the.element, name, handlerId); 1239 } 1240 1241 the.trigger = function (name, event) { 1242 return KTEventHandler.trigger(the.element, name, event, the, event); 1243 } 1244}; 1245 1246// Static methods 1247KTDialer.getInstance = function (element) { 1248 if (element !== null && KTUtil.data(element).has('dialer')) { 1249 return KTUtil.data(element).get('dialer'); 1250 } else { 1251 return null; 1252 } 1253} 1254 1255// Create instances 1256KTDialer.createInstances = function (selector = '[data-kt-dialer="true"]') { 1257 // Get instances 1258 var elements = document.querySelectorAll(selector); 1259 1260 if (elements && elements.length > 0) { 1261 for (var i = 0, len = elements.length; i < len; i++) { 1262 new KTDialer(elements[i]); 1263 } 1264 } 1265} 1266 1267// Global initialization 1268KTDialer.init = function () { 1269 KTDialer.createInstances(); 1270}; 1271 1272// Webpack support 1273if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') { 1274 module.exports = KTDialer; 1275} 1276"use strict"; 1277 1278var KTDrawerHandlersInitialized = false; 1279 1280// Class definition 1281var KTDrawer = function (element, options) { 1282 ////////////////////////////// 1283 // ** Private variables ** // 1284 ////////////////////////////// 1285 var the = this; 1286 1287 if (typeof element === "undefined" || element === null) { 1288 return; 1289 } 1290 1291 // Default options 1292 var defaultOptions = { 1293 overlay: true, 1294 direction: 'end', 1295 baseClass: 'drawer', 1296 overlayClass: 'drawer-overlay' 1297 }; 1298 1299 //////////////////////////// 1300 // ** Private methods ** // 1301 //////////////////////////// 1302 1303 var _construct = function () { 1304 if (KTUtil.data(element).has('drawer')) { 1305 the = KTUtil.data(element).get('drawer'); 1306 } else { 1307 _init(); 1308 } 1309 } 1310 1311 var _init = function () { 1312 // Variables 1313 the.options = KTUtil.deepExtend({}, defaultOptions, options); 1314 the.uid = KTUtil.getUniqueId('drawer'); 1315 the.element = element; 1316 the.overlayElement = null; 1317 the.name = the.element.getAttribute('data-kt-drawer-name'); 1318 the.shown = false; 1319 the.lastWidth; 1320 the.lastHeight; 1321 the.toggleElement = null; 1322 1323 // Set initialized 1324 the.element.setAttribute('data-kt-drawer', 'true'); 1325 1326 // Event Handlers 1327 _handlers(); 1328 1329 // Update Instance 1330 _update(); 1331 1332 // Bind Instance 1333 KTUtil.data(the.element).set('drawer', the); 1334 } 1335 1336 var _handlers = function () { 1337 var togglers = _getOption('toggle'); 1338 var closers = _getOption('close'); 1339 1340 if (togglers !== null && togglers.length > 0) { 1341 KTUtil.on(document.body, togglers, 'click', function (e) { 1342 e.preventDefault(); 1343 1344 the.toggleElement = this; 1345 _toggle(); 1346 }); 1347 } 1348 1349 if (closers !== null && closers.length > 0) { 1350 KTUtil.on(document.body, closers, 'click', function (e) { 1351 e.preventDefault(); 1352 1353 the.closeElement = this; 1354 _hide(); 1355 }); 1356 } 1357 } 1358 1359 var _toggle = function () { 1360 if (KTEventHandler.trigger(the.element, 'kt.drawer.toggle', the) === false || _getOption("activate") === false) { 1361 return; 1362 } 1363 1364 if (the.shown === true) { 1365 _hide(); 1366 } else { 1367 _show(); 1368 } 1369 1370 KTEventHandler.trigger(the.element, 'kt.drawer.toggled', the); 1371 } 1372 1373 var _hide = function () { 1374 if (KTEventHandler.trigger(the.element, 'kt.drawer.hide', the) === false) { 1375 return; 1376 } 1377 1378 the.shown = false;
1379 1380 _deleteOverlay(); 1381 1382 document.body.removeAttribute('data-kt-drawer-' + the.name, 'on'); 1383 document.body.removeAttribute('data-kt-drawer'); 1384 1385 KTUtil.removeClass(the.element, the.options.baseClass + '-on'); 1386 1387 if (the.toggleElement !== null) { 1388 KTUtil.removeClass(the.toggleElement, 'active'); 1389 } 1390 1391 KTEventHandler.trigger(the.element, 'kt.drawer.after.hidden', the) === false 1392 } 1393 1394 var _show = function () { 1395 if (KTEventHandler.trigger(the.element, 'kt.drawer.show', the) === false) { 1396 return; 1397 } 1398 1399 the.shown = true; 1400 1401 _createOverlay(); 1402 document.body.setAttribute('data-kt-drawer-' + the.name, 'on'); 1403 document.body.setAttribute('data-kt-drawer', 'on'); 1404 1405 KTUtil.addClass(the.element, the.options.baseClass + '-on'); 1406 1407 if (the.toggleElement !== null) { 1408 KTUtil.addClass(the.toggleElement, 'active'); 1409 } 1410 1411 KTEventHandler.trigger(the.element, 'kt.drawer.shown', the); 1412 } 1413 1414 var _update = function () { 1415 var width = _getWidth(); 1416 var height = _getHeight(); 1417 var direction = _getOption('direction'); 1418 1419 var top = _getOption('top'); 1420 var bottom = _getOption('bottom'); 1421 var start = _getOption('start'); 1422 var end = _getOption('end'); 1423 1424 // Reset state
1425 if (KTUtil.hasClass(the.element, the.options.baseClass + '-on') === true && String(document.body.getAttribute('data-kt-drawer-' + the.name + '-')) === 'on') { 1426 the.shown = true; 1427 } else { 1428 the.shown = false; 1429 } 1430 1431 // Activate/deactivate 1432 if (_getOption('activate') === true) { 1433 KTUtil.addClass(the.element, the.options.baseClass); 1434 KTUtil.addClass(the.element, the.options.baseClass + '-' + direction); 1435 1436 if (width) { 1437 KTUtil.css(the.element, 'width', width, true); 1438 the.lastWidth = width; 1439 } 1440 1441 if (height) { 1442 KTUtil.css(the.element, 'height', height, true); 1443 the.lastHeight = height; 1444 } 1445 1446 if (top) { 1447 KTUtil.css(the.element, 'top', top); 1448 } 1449 1450 if (bottom) { 1451 KTUtil.css(the.element, 'bottom', bottom); 1452 } 1453 1454 if (start) { 1455 if (KTUtil.isRTL()) { 1456 KTUtil.css(the.element, 'right', start); 1457 } else { 1458 KTUtil.css(the.element, 'left', start); 1459 } 1460 } 1461 1462 if (end) { 1463 if (KTUtil.isRTL()) { 1464 KTUtil.css(the.element, 'left', end); 1465 } else { 1466 KTUtil.css(the.element, 'right', end); 1467 } 1468 } 1469 } else { 1470 KTUtil.removeClass(the.element, the.options.baseClass); 1471 KTUtil.removeClass(the.element, the.options.baseClass + '-' + direction); 1472 1473 KTUtil.css(the.element, 'width', ''); 1474 KTUtil.css(the.element, 'height', ''); 1475 1476 if (top) { 1477 KTUtil.css(the.element, 'top', ''); 1478 } 1479 1480 if (bottom) { 1481 KTUtil.css(the.element, 'bottom', ''); 1482 } 1483 1484 if (start) { 1485 if (KTUtil.isRTL()) { 1486 KTUtil.css(the.element, 'right', ''); 1487 } else { 1488 KTUtil.css(the.element, 'left', ''); 1489 } 1490 } 1491 1492 if (end) { 1493 if (KTUtil.isRTL()) { 1494 KTUtil.css(the.element, 'left', ''); 1495 } else { 1496 KTUtil.css(the.element, 'right', ''); 1497 } 1498 } 1499 1500 _hide(); 1501 } 1502 } 1503 1504 var _createOverlay = function () { 1505 if (_getOption('overlay') === true) { 1506 the.overlayElement = document.createElement('DIV'); 1507 1508 KTUtil.css(the.overlayElement, 'z-index', KTUtil.css(the.element, 'z-index') - 1); // update 1509 1510 document.body.append(the.overlayElement); 1511 1512 KTUtil.addClass(the.overlayElement, _getOption('overlay-class')); 1513 1514 KTUtil.addEvent(the.overlayElement, 'click', function (e) { 1515 e.preventDefault(); 1516 1517 if (_getOption('permanent') !== true) { 1518 _hide(); 1519 } 1520 }); 1521 } 1522 } 1523 1524 var _deleteOverlay = function () { 1525 if (the.overlayElement !== null) { 1526 KTUtil.remove(the.overlayElement); 1527 } 1528 } 1529 1530 var _getOption = function (name) { 1531 if (the.element.hasAttribute('data-kt-drawer-' + name) === true) { 1532 var attr = the.element.getAttribute('data-kt-drawer-' + name); 1533 var value = KTUtil.getResponsiveValue(attr); 1534 1535 if (value !== null && String(value) === 'true') { 1536 value = true; 1537 } else if (value !== null && String(value) === 'false') { 1538 value = false; 1539 } 1540 1541 return value; 1542 } else { 1543 var optionName = KTUtil.snakeToCamel(name); 1544 1545 if (the.options[optionName]) { 1546 return KTUtil.getResponsiveValue(the.options[optionName]); 1547 } else { 1548 return null; 1549 } 1550 } 1551 } 1552 1553 var _getWidth = function () { 1554 var width = _getOption('width'); 1555 1556 if (width === 'auto') { 1557 width = KTUtil.css(the.element, 'width'); 1558 } 1559 1560 return width; 1561 } 1562 1563 var _getHeight = function () { 1564 var height = _getOption('height'); 1565 1566 if (height === 'auto') { 1567 height = KTUtil.css(the.element, 'height'); 1568 } 1569 1570 return height; 1571 } 1572 1573 var _destroy = function () { 1574 KTUtil.data(the.element).remove('drawer'); 1575 } 1576 1577 // Construct class 1578 _construct(); 1579 1580 /////////////////////// 1581 // ** Public API ** // 1582 /////////////////////// 1583 1584 // Plugin API 1585 the.toggle = function () { 1586 return _toggle(); 1587 } 1588 1589 the.show = function () { 1590 return _show(); 1591 } 1592 1593 the.hide = function () { 1594 return _hide(); 1595 } 1596 1597 the.isShown = function () { 1598 return the.shown; 1599 } 1600 1601 the.update = function () { 1602 _update(); 1603 } 1604 1605 the.goElement = function () { 1606 return the.element; 1607 } 1608 1609 the.destroy = function () { 1610 return _destroy(); 1611 } 1612 1613 // Event API 1614 the.on = function (name, handler) { 1615 return KTEventHandler.on(the.element, name, handler); 1616 } 1617 1618 the.one = function (name, handler) { 1619 return KTEventHandler.one(the.element, name, handler); 1620 } 1621 1622 the.off = function (name, handlerId) { 1623 return KTEventHandler.off(the.element, name, handlerId); 1624 } 1625 1626 the.trigger = function (name, event) { 1627 return KTEventHandler.trigger(the.element, name, event, the, event); 1628 } 1629}; 1630 1631// Static methods 1632KTDrawer.getInstance = function (element) { 1633 if (element !== null && KTUtil.data(element).has('drawer')) { 1634 return KTUtil.data(element).get('drawer'); 1635 } else { 1636 return null; 1637 } 1638} 1639 1640// Hide all drawers and skip one if provided 1641KTDrawer.hideAll = function (skip = null, selector = '[data-kt-drawer="true"]') { 1642 var items = document.querySelectorAll(selector); 1643 1644 if (items && items.length > 0) { 1645 for (var i = 0, len = items.length; i < len; i++) { 1646 var item = items[i]; 1647 var drawer = KTDrawer.getInstance(item); 1648 1649 if (!drawer) { 1650 continue; 1651 } 1652 1653 if (skip) { 1654 if (item !== skip) { 1655 drawer.hide(); 1656 } 1657 } else { 1658 drawer.hide(); 1659 } 1660 } 1661 } 1662} 1663 1664// Update all drawers 1665KTDrawer.updateAll = function (selector = '[data-kt-drawer="true"]') { 1666 var items = document.querySelectorAll(selector); 1667 1668 if (items && items.length > 0) { 1669 for (var i = 0, len = items.length; i < len; i++) { 1670 var drawer = KTDrawer.getInstance(items[i]); 1671 1672 if (drawer) {
1673 drawer.update(); 1674 } 1675 } 1676 } 1677} 1678 1679// Create instances 1680KTDrawer.createInstances = function (selector = '[data-kt-drawer="true"]') { 1681 // Initialize Menus 1682 var elements = document.querySelectorAll(selector); 1683 1684 if (elements && elements.length > 0) { 1685 for (var i = 0, len = elements.length; i < len; i++) { 1686 new KTDrawer(elements[i]); 1687 } 1688 } 1689} 1690 1691// Toggle instances 1692KTDrawer.handleShow = function () { 1693 // External drawer toggle handler 1694 KTUtil.on(document.body, '[data-kt-drawer-show="true"][data-kt-drawer-target]', 'click', function (e) { 1695 e.preventDefault(); 1696 1697 var element = document.querySelector(this.getAttribute('data-kt-drawer-target')); 1698 1699 if (element) { 1700 KTDrawer.getInstance(element).show(); 1701 } 1702 }); 1703} 1704 1705// Handle escape key press 1706KTDrawer.handleEscapeKey = function () { 1707 document.addEventListener('keydown', (event) => { 1708 if (event.key === 'Escape') { 1709 //if esc key was not pressed in combination with ctrl or alt or shift 1710 const isNotCombinedKey = !(event.ctrlKey || event.altKey || event.shiftKey); 1711 if (isNotCombinedKey) { 1712 var elements = document.querySelectorAll('.drawer-on[data-kt-drawer="true"]:not([data-kt-drawer-escape="false"])'); 1713 var drawer; 1714 1715 if (elements && elements.length > 0) { 1716 for (var i = 0, len = elements.length; i < len; i++) { 1717 drawer = KTDrawer.getInstance(elements[i]); 1718 if (drawer.isShown()) { 1719 drawer.hide(); 1720 } 1721 } 1722 } 1723 } 1724 } 1725 }); 1726} 1727 1728// Dismiss instances 1729KTDrawer.handleDismiss = function () { 1730 // External drawer toggle handler 1731 KTUtil.on(document.body, '[data-kt-drawer-dismiss="true"]', 'click', function (e) { 1732 var element = this.closest('[data-kt-drawer="true"]'); 1733 1734 if (element) { 1735 var drawer = KTDrawer.getInstance(element); 1736 if (drawer.isShown()) { 1737 drawer.hide(); 1738 } 1739 } 1740 }); 1741} 1742 1743// Handle resize 1744KTDrawer.handleResize = function () { 1745 // Window resize Handling 1746 window.addEventListener('resize', function () { 1747 var timer; 1748 1749 KTUtil.throttle(timer, function () { 1750 // Locate and update drawer instances on window resize 1751 var elements = document.querySelectorAll('[data-kt-drawer="true"]'); 1752 1753 if (elements && elements.length > 0) { 1754 for (var i = 0, len = elements.length; i < len; i++) { 1755 var drawer = KTDrawer.getInstance(elements[i]); 1756 if (drawer) { 1757 drawer.update(); 1758 } 1759 } 1760 } 1761 }, 200); 1762 }); 1763} 1764 1765// Global initialization 1766KTDrawer.init = function () { 1767 KTDrawer.createInstances(); 1768 1769 if (KTDrawerHandlersInitialized === false) { 1770 KTDrawer.handleResize(); 1771 KTDrawer.handleShow(); 1772 KTDrawer.handleDismiss(); 1773 KTDrawer.handleEscapeKey(); 1774 1775 KTDrawerHandlersInitialized = true; 1776 } 1777}; 1778 1779// Webpack support 1780if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') { 1781 module.exports = KTDrawer; 1782} 1783"use strict"; 1784 1785// Class definition 1786var KTEventHandler = function () { 1787 //////////////////////////// 1788 // ** Private Variables ** // 1789 //////////////////////////// 1790 var _handlers = {}; 1791 1792 //////////////////////////// 1793 // ** Private Methods ** // 1794 //////////////////////////// 1795 var _triggerEvent = function (element, name, target) { 1796 var returnValue = true; 1797 var eventValue; 1798 1799 if (KTUtil.data(element).has(name) === true) { 1800 var handlerIds = KTUtil.data(element).get(name); 1801 var handlerId; 1802 1803 for (var i = 0; i < handlerIds.length; i++) { 1804 handlerId = handlerIds[i]; 1805 1806 if (_handlers[name] && _handlers[name][handlerId]) { 1807 var handler = _handlers[name][handlerId]; 1808 var value; 1809 1810 if (handler.name === name) { 1811 if (handler.one == true) { 1812 if (handler.fired == false) { 1813 _handlers[name][handlerId].fired = true; 1814 1815 eventValue = handler.callback.call(this, target); 1816 } 1817 } else { 1818 eventValue = handler.callback.call(this, target); 1819 } 1820 1821 if (eventValue === false) { 1822 returnValue = false;
1823 } 1824 } 1825 } 1826 } 1827 } 1828 1829 return returnValue; 1830 } 1831 1832 var _addEvent = function (element, name, callback, one) { 1833 var handlerId = KTUtil.getUniqueId('event'); 1834 var handlerIds = KTUtil.data(element).get(name); 1835 1836 if (!handlerIds) { 1837 handlerIds = []; 1838 } 1839 1840 handlerIds.push(handlerId); 1841 1842 KTUtil.data(element).set(name, handlerIds); 1843 1844 if (!_handlers[name]) { 1845 _handlers[name] = {}; 1846 } 1847 1848 _handlers[name][handlerId] = { 1849 name: name, 1850 callback: callback, 1851 one: one, 1852 fired: false 1853 }; 1854 1855 return handlerId; 1856 } 1857 1858 var _removeEvent = function (element, name, handlerId) { 1859 var handlerIds = KTUtil.data(element).get(name); 1860 var index = handlerIds && handlerIds.indexOf(handlerId); 1861 1862 if (index !== -1) { 1863 handlerIds.splice(index, 1); 1864 KTUtil.data(element).set(name, handlerIds); 1865 } 1866 1867 if (_handlers[name] && _handlers[name][handlerId]) { 1868 delete _handlers[name][handlerId]; 1869 } 1870 } 1871 1872 //////////////////////////// 1873 // ** Public Methods ** // 1874 //////////////////////////// 1875 return { 1876 trigger: function (element, name, target) { 1877 return _triggerEvent(element, name, target); 1878 }, 1879 1880 on: function (element, name, handler) { 1881 return _addEvent(element, name, handler); 1882 }, 1883 1884 one: function (element, name, handler) { 1885 return _addEvent(element, name, handler, true); 1886 }, 1887 1888 off: function (element, name, handlerId) { 1889 return _removeEvent(element, name, handlerId); 1890 }, 1891 1892 debug: function () { 1893 for (var b in _handlers) { 1894 if (_handlers.hasOwnProperty(b)) console.log(b); 1895 } 1896 } 1897 } 1898}(); 1899 1900// Webpack support 1901if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') { 1902 module.exports = KTEventHandler; 1903} 1904 1905"use strict"; 1906 1907// Class definition 1908var KTFeedback = function (options) { 1909 //////////////////////////// 1910 // ** Private Variables ** // 1911 //////////////////////////// 1912 var the = this; 1913 1914 // Default options 1915 var defaultOptions = { 1916 'width': 100, 1917 'placement': 'top-center', 1918 'content': '', 1919 'type': 'popup' 1920 }; 1921 1922 //////////////////////////// 1923 // ** Private methods ** // 1924 //////////////////////////// 1925 1926 var _construct = function () { 1927 _init(); 1928 } 1929 1930 var _init = function () { 1931 // Variables 1932 the.options = KTUtil.deepExtend({}, defaultOptions, options); 1933 the.uid = KTUtil.getUniqueId('feedback'); 1934 the.element; 1935 the.shown = false; 1936 1937 // Event Handlers 1938 _handlers(); 1939 1940 // Bind Instance 1941 KTUtil.data(the.element).set('feedback', the); 1942 } 1943 1944 var _handlers = function () { 1945 KTUtil.addEvent(the.element, 'click', function (e) { 1946 e.preventDefault(); 1947 1948 _go(); 1949 }); 1950 } 1951 1952 var _show = function () { 1953 if (KTEventHandler.trigger(the.element, 'kt.feedback.show', the) === false) { 1954 return; 1955 } 1956 1957 if (the.options.type === 'popup') { 1958 _showPopup(); 1959 } 1960 1961 KTEventHandler.trigger(the.element, 'kt.feedback.shown', the); 1962 1963 return the; 1964 } 1965 1966 var _hide = function () { 1967 if (KTEventHandler.trigger(the.element, 'kt.feedback.hide', the) === false) { 1968 return; 1969 } 1970 1971 if (the.options.type === 'popup') { 1972 _hidePopup(); 1973 } 1974 1975 the.shown = false; 1976 1977 KTEventHandler.trigger(the.element, 'kt.feedback.hidden', the); 1978 1979 return the; 1980 } 1981 1982 var _showPopup = function () { 1983 the.element = document.createElement("DIV"); 1984 1985 KTUtil.addClass(the.element, 'feedback feedback-popup'); 1986 KTUtil.setHTML(the.element, the.options.content); 1987 1988 if (the.options.placement == 'top-center') { 1989 _setPopupTopCenterPosition(); 1990 } 1991 1992 document.body.appendChild(the.element); 1993 1994 KTUtil.addClass(the.element, 'feedback-shown'); 1995 1996 the.shown = true; 1997 } 1998 1999 var _setPopupTopCenterPosition = function () { 2000 var width = KTUtil.getResponsiveValue(the.options.width); 2001 var height = KTUtil.css(the.element, 'height'); 2002 2003 KTUtil.addClass(the.element, 'feedback-top-center'); 2004 2005 KTUtil.css(the.element, 'width', width); 2006 KTUtil.css(the.element, 'left', '50%'); 2007 KTUtil.css(the.element, 'top', '-' + height); 2008 } 2009 2010 var _hidePopup = function () { 2011 the.element.remove(); 2012 } 2013 2014 var _destroy = function () { 2015 KTUtil.data(the.element).remove('feedback'); 2016 } 2017 2018 // Construct class 2019 _construct(); 2020 2021 /////////////////////// 2022 // ** Public API ** // 2023 /////////////////////// 2024 2025 // Plugin API 2026 the.show = function () { 2027 return _show(); 2028 } 2029 2030 the.hide = function () { 2031 return _hide(); 2032 } 2033 2034 the.isShown = function () { 2035 return the.shown; 2036 } 2037 2038 the.getElement = function () { 2039 return the.element; 2040 } 2041 2042 the.destroy = function () { 2043 return _destroy(); 2044 } 2045 2046 // Event API 2047 the.on = function (name, handler) { 2048 return KTEventHandler.on(the.element, name, handler); 2049 } 2050 2051 the.one = function (name, handler) { 2052 return KTEventHandler.one(the.element, name, handler); 2053 } 2054 2055 the.off = function (name, handlerId) { 2056 return KTEventHandler.off(the.element, name, handlerId); 2057 } 2058 2059 the.trigger = function (name, event) { 2060 return KTEventHandler.trigger(the.element, name, event, the, event); 2061 } 2062}; 2063 2064// Webpack support 2065if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') { 2066 module.exports = KTFeedback; 2067} 2068 2069"use strict"; 2070 2071// Class definition 2072var KTImageInput = function (element, options) { 2073 //////////////////////////// 2074 // ** Private Variables ** // 2075 //////////////////////////// 2076 var the = this; 2077 2078 if (typeof element === "undefined" || element === null) { 2079 return; 2080 } 2081 2082 // Default Options 2083 var defaultOptions = { 2084 2085 }; 2086 2087 //////////////////////////// 2088 // ** Private Methods ** // 2089 //////////////////////////// 2090 2091 var _construct = function () { 2092 if (KTUtil.data(element).has('image-input') === true) { 2093 the = KTUtil.data(element).get('image-input'); 2094 } else { 2095 _init(); 2096 } 2097 } 2098 2099 var _init = function () { 2100 // Variables 2101 the.options = KTUtil.deepExtend({}, defaultOptions, options); 2102 the.uid = KTUtil.getUniqueId('image-input'); 2103 2104 // Elements 2105 the.element = element; 2106 the.inputElement = KTUtil.find(element, 'input[type="file"]'); 2107 the.wrapperElement = KTUtil.find(element, '.image-input-wrapper'); 2108 the.cancelElement = KTUtil.find(element, '[data-kt-image-input-action="cancel"]'); 2109 the.removeElement = KTUtil.find(element, '[data-kt-image-input-action="remove"]'); 2110 the.hiddenElement = KTUtil.find(element, 'input[type="hidden"]'); 2111 the.src = KTUtil.css(the.wrapperElement, 'backgroundImage'); 2112 2113 // Set initialized 2114 the.element.setAttribute('data-kt-image-input', 'true'); 2115 2116 // Event Handlers 2117 _handlers(); 2118 2119 // Bind Instance 2120 KTUtil.data(the.element).set('image-input', the); 2121 } 2122 2123 // Init Event Handlers 2124 var _handlers = function () { 2125 KTUtil.addEvent(the.inputElement, 'change', _change); 2126 KTUtil.addEvent(the.cancelElement, 'click', _cancel); 2127 KTUtil.addEvent(the.removeElement, 'click', _remove); 2128 } 2129 2130 // Event Handlers 2131 var _change = function (e) { 2132 e.preventDefault(); 2133 2134 if (the.inputElement !== null && the.inputElement.files && the.inputElement.files[0]) { 2135 // Fire change event 2136 if (KTEventHandler.trigger(the.element, 'kt.imageinput.change', the) === false) { 2137 return; 2138 } 2139 2140 var reader = new FileReader(); 2141 2142 reader.onload = function (e) { 2143 KTUtil.css(the.wrapperElement, 'background-image', 'url(' + e.target.result + ')'); 2144 } 2145
2146 reader.readAsDataURL(the.inputElement.files[0]); 2147 2148 the.element.classList.add('image-input-changed'); 2149 the.element.classList.remove('image-input-empty'); 2150 2151 // Fire removed event 2152 KTEventHandler.trigger(the.element, 'kt.imageinput.changed', the); 2153 } 2154 } 2155 2156 var _cancel = function (e) { 2157 e.preventDefault(); 2158 2159 // Fire cancel event 2160 if (KTEventHandler.trigger(the.element, 'kt.imageinput.cancel', the) === false) { 2161 return; 2162 } 2163 2164 the.element.classList.remove('image-input-changed'); 2165 the.element.classList.remove('image-input-empty'); 2166 2167 if (the.src === 'none') { 2168 KTUtil.css(the.wrapperElement, 'background-image', ''); 2169 the.element.classList.add('image-input-empty'); 2170 } else { 2171 KTUtil.css(the.wrapperElement, 'background-image', the.src); 2172 } 2173 2174 the.inputElement.value = ""; 2175 2176 if (the.hiddenElement !== null) { 2177 the.hiddenElement.value = "0"; 2178 } 2179 2180 // Fire canceled event 2181 KTEventHandler.trigger(the.element, 'kt.imageinput.canceled', the); 2182 } 2183 2184 var _remove = function (e) { 2185 e.preventDefault(); 2186 2187 // Fire remove event 2188 if (KTEventHandler.trigger(the.element, 'kt.imageinput.remove', the) === false) { 2189 return; 2190 } 2191 2192 the.element.classList.remove('image-input-changed'); 2193 the.element.classList.add('image-input-empty'); 2194 2195 KTUtil.css(the.wrapperElement, 'background-image', "none"); 2196 the.inputElement.value = ""; 2197 2198 if (the.hiddenElement !== null) { 2199 the.hiddenElement.value = "1"; 2200 } 2201 2202 // Fire removed event 2203 KTEventHandler.trigger(the.element, 'kt.imageinput.removed', the); 2204 } 2205 2206 var _destroy = function () { 2207 KTUtil.data(the.element).remove('image-input'); 2208 } 2209 2210 // Construct Class 2211 _construct(); 2212 2213 /////////////////////// 2214 // ** Public API ** // 2215 /////////////////////// 2216 2217 // Plugin API 2218 the.getInputElement = function () { 2219 return the.inputElement; 2220 } 2221 2222 the.getElement = function () { 2223 return the.element; 2224 } 2225 2226 the.destroy = function () { 2227 return _destroy(); 2228 } 2229 2230 // Event API 2231 the.on = function (name, handler) { 2232 return KTEventHandler.on(the.element, name, handler); 2233 } 2234 2235 the.one = function (name, handler) { 2236 return KTEventHandler.one(the.element, name, handler); 2237 } 2238 2239 the.off = function (name, handlerId) { 2240 return KTEventHandler.off(the.element, name, handlerId); 2241 } 2242 2243 the.trigger = function (name, event) { 2244 return KTEventHandler.trigger(the.element, name, event, the, event); 2245 } 2246}; 2247 2248// Static methods 2249KTImageInput.getInstance = function (element) { 2250 if (element !== null && KTUtil.data(element).has('image-input')) { 2251 return KTUtil.data(element).get('image-input'); 2252 } else { 2253 return null; 2254 } 2255} 2256 2257// Create instances 2258KTImageInput.createInstances = function (selector = '[data-kt-image-input]') { 2259 // Initialize Menus 2260 var elements = document.querySelectorAll(selector); 2261 2262 if (elements && elements.length > 0) { 2263 for (var i = 0, len = elements.length; i < len; i++) { 2264 new KTImageInput(elements[i]); 2265 } 2266 } 2267} 2268 2269// Global initialization 2270KTImageInput.init = function () { 2271 KTImageInput.createInstances(); 2272}; 2273 2274// Webpack Support 2275if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') { 2276 module.exports = KTImageInput; 2277} 2278 2279"use strict"; 2280 2281var KTMenuHandlersInitialized = false; 2282 2283// Class definition 2284var KTMenu = function (element, options) { 2285 //////////////////////////// 2286 // ** Private Variables ** // 2287 //////////////////////////// 2288 var the = this; 2289 2290 if (typeof element === "undefined" || element === null) { 2291 return; 2292 } 2293 2294 // Default Options 2295 var defaultOptions = { 2296 dropdown: { 2297 hoverTimeout: 200, 2298 zindex: 107 2299 }, 2300 2301 accordion: { 2302 slideSpeed: 250, 2303 expand: false 2304 } 2305 }; 2306 2307 //////////////////////////// 2308 // ** Private Methods ** // 2309 //////////////////////////// 2310 2311 var _construct = function () { 2312 if (KTUtil.data(element).has('menu') === true) { 2313 the = KTUtil.data(element).get('menu'); 2314 } else { 2315 _init(); 2316 } 2317 } 2318 2319 var _init = function () { 2320 the.options = KTUtil.deepExtend({}, defaultOptions, options); 2321 the.uid = KTUtil.getUniqueId('menu'); 2322 the.element = element; 2323 the.triggerElement; 2324 the.disabled = false;
2325 2326 // Set initialized 2327 the.element.setAttribute('data-kt-menu', 'true'); 2328 2329 _setTriggerElement(); 2330 _update(); 2331 2332 KTUtil.data(the.element).set('menu', the); 2333 } 2334 2335 var _destroy = function () { // todo 2336 2337 } 2338 2339 // Event Handlers 2340 // Toggle handler 2341 var _click = function (element, e) { 2342 if (element.hasAttribute('href') && element.getAttribute("href") !== "#") { 2343 return; 2344 } 2345 2346 e.preventDefault(); 2347 2348 if (the.disabled === true) { 2349 return; 2350 } 2351 2352 var item = _getItemElement(element); 2353 2354 if (_getOptionFromElementAttribute(item, 'trigger') !== 'click') { 2355 return; 2356 } 2357 2358 if (_getOptionFromElementAttribute(item, 'toggle') === false) { 2359 _show(item); 2360 } else { 2361 _toggle(item); 2362 } 2363 } 2364 2365 // Link handler 2366 var _link = function (element, e) { 2367 if (the.disabled === true) { 2368 return; 2369 } 2370 2371 if (KTEventHandler.trigger(the.element, 'kt.menu.link.click', element) === false) { 2372 return; 2373 } 2374 2375 // Dismiss all shown dropdowns 2376 KTMenu.hideDropdowns(); 2377 2378 KTEventHandler.trigger(the.element, 'kt.menu.link.clicked', element); 2379 } 2380 2381 // Dismiss handler 2382 var _dismiss = function (element, e) { 2383 var item = _getItemElement(element); 2384 var items = _getItemChildElements(item); 2385 2386 if (item !== null && _getItemSubType(item) === 'dropdown') { 2387 _hide(item); // hide items dropdown 2388 // Hide all child elements as well 2389 2390 if (items.length > 0) { 2391 for (var i = 0, len = items.length; i < len; i++) { 2392 if (items[i] !== null && _getItemSubType(items[i]) === 'dropdown') { 2393 _hide(tems[i]); 2394 } 2395 } 2396 } 2397 } 2398 } 2399 2400 // Mouseover handle 2401 var _mouseover = function (element, e) { 2402 var item = _getItemElement(element); 2403 2404 if (the.disabled === true) { 2405 return; 2406 } 2407 2408 if (item === null) { 2409 return; 2410 } 2411 2412 if (_getOptionFromElementAttribute(item, 'trigger') !== 'hover') { 2413 return; 2414 } 2415 2416 if (KTUtil.data(item).get('hover') === '1') { 2417 clearTimeout(KTUtil.data(item).get('timeout')); 2418 KTUtil.data(item).remove('hover'); 2419 KTUtil.data(item).remove('timeout'); 2420 } 2421 2422 _show(item); 2423 } 2424 2425 // Mouseout handle 2426 var _mouseout = function (element, e) { 2427 var item = _getItemElement(element); 2428 2429 if (the.disabled === true) { 2430 return; 2431 } 2432 2433 if (item === null) { 2434 return; 2435 } 2436 2437 if (_getOptionFromElementAttribute(item, 'trigger') !== 'hover') { 2438 return; 2439 } 2440 2441 var timeout = setTimeout(function () { 2442 if (KTUtil.data(item).get('hover') === '1') { 2443 _hide(item); 2444 } 2445 }, the.options.dropdown.hoverTimeout); 2446 2447 KTUtil.data(item).set('hover', '1'); 2448 KTUtil.data(item).set('timeout', timeout); 2449 } 2450 2451 // Toggle item sub 2452 var _toggle = function (item) { 2453 if (!item) { 2454 item = the.triggerElement; 2455 } 2456 2457 if (_isItemSubShown(item) === true) { 2458 _hide(item); 2459 } else { 2460 _show(item); 2461 } 2462 } 2463 2464 // Show item sub 2465 var _show = function (item) { 2466 if (!item) { 2467 item = the.triggerElement; 2468 } 2469 2470 if (_isItemSubShown(item) === true) { 2471 return; 2472 } 2473 2474 if (_getItemSubType(item) === 'dropdown') { 2475 _showDropdown(item); // // show current dropdown 2476 } else if (_getItemSubType(item) === 'accordion') { 2477 _showAccordion(item); 2478 } 2479 2480 // Remember last submenu type 2481 KTUtil.data(item).set('type', _getItemSubType(item)); // updated 2482 } 2483 2484 // Hide item sub 2485 var _hide = function (item) { 2486 if (!item) { 2487 item = the.triggerElement; 2488 } 2489 2490 if (_isItemSubShown(item) === false) { 2491 return; 2492 } 2493 2494 if (_getItemSubType(item) === 'dropdown') { 2495 _hideDropdown(item); 2496 } else if (_getItemSubType(item) === 'accordion') { 2497 _hideAccordion(item); 2498 } 2499 } 2500 2501 // Reset item state classes if item sub type changed 2502 var _reset = function (item) { 2503 if (_hasItemSub(item) === false) { 2504 return; 2505 } 2506 2507 var sub = _getItemSubElement(item); 2508 2509 // Reset sub state if sub type is changed during the window resize 2510 if (KTUtil.data(item).has('type') && KTUtil.data(item).get('type') !== _getItemSubType(item)) { // updated 2511 KTUtil.removeClass(item, 'hover'); 2512 KTUtil.removeClass(item, 'show'); 2513 KTUtil.removeClass(sub, 'show'); 2514 } // updated 2515 } 2516 2517 // Update all item state classes if item sub type changed 2518 var _update = function () { 2519 var items = the.element.querySelectorAll('.menu-item[data-kt-menu-trigger]'); 2520 2521 if (items && items.length > 0) { 2522 for (var i = 0, len = items.length; i < len; i++) { 2523 _reset(items[i]); 2524 } 2525 } 2526 } 2527 2528 // Set external trigger element 2529 var _setTriggerElement = function () { 2530 var target = document.querySelector('[data-kt-menu-target="#' + the.element.getAttribute('id') + '"]'); 2531 2532 if (target !== null) { 2533 the.triggerElement = target; 2534 } else if (the.element.closest('[data-kt-menu-trigger]')) { 2535 the.triggerElement = the.element.closest('[data-kt-menu-trigger]'); 2536 } else if (the.element.parentNode && KTUtil.child(the.element.parentNode, '[data-kt-menu-trigger]')) { 2537 the.triggerElement = KTUtil.child(the.element.parentNode, '[data-kt-menu-trigger]'); 2538 } 2539 2540 if (the.triggerElement) { 2541 KTUtil.data(the.triggerElement).set('menu', the); 2542 } 2543 } 2544 2545 // Test if menu has external trigger element 2546 var _isTriggerElement = function (item) { 2547 return (the.triggerElement === item) ? true : false;
2548 } 2549 2550 // Test if item's sub is shown 2551 var _isItemSubShown = function (item) { 2552 var sub = _getItemSubElement(item); 2553 2554 if (sub !== null) { 2555 if (_getItemSubType(item) === 'dropdown') { 2556 if (KTUtil.hasClass(sub, 'show') === true && sub.hasAttribute('data-popper-placement') === true) { 2557 return true; 2558 } else { 2559 return false; 2560 } 2561 } else { 2562 return KTUtil.hasClass(item, 'show'); 2563 } 2564 } else { 2565 return false; 2566 } 2567 } 2568 2569 // Test if item dropdown is permanent 2570 var _isItemDropdownPermanent = function (item) { 2571 return _getOptionFromElementAttribute(item, 'permanent') === true ? true : false; 2572 } 2573 2574 // Test if item's parent is shown 2575 var _isItemParentShown = function (item) { 2576 return KTUtil.parents(item, '.menu-item.show').length > 0; 2577 } 2578 2579 // Test of it is item sub element 2580 var _isItemSubElement = function (item) { 2581 return KTUtil.hasClass(item, 'menu-sub'); 2582 } 2583 2584 // Test if item has sub 2585 var _hasItemSub = function (item) { 2586 return (KTUtil.hasClass(item, 'menu-item') && item.hasAttribute('data-kt-menu-trigger')); 2587 } 2588 2589 // Get link element 2590 var _getItemLinkElement = function (item) { 2591 return KTUtil.child(item, '.menu-link'); 2592 } 2593 2594 // Get toggle element 2595 var _getItemToggleElement = function (item) { 2596 if (the.triggerElement) { 2597 return the.triggerElement; 2598 } else { 2599 return _getItemLinkElement(item); 2600 } 2601 } 2602 2603 // Get item sub element 2604 var _getItemSubElement = function (item) { 2605 if (_isTriggerElement(item) === true) { 2606 return the.element; 2607 } if (item.classList.contains('menu-sub') === true) { 2608 return item; 2609 } else if (KTUtil.data(item).has('sub')) { 2610 return KTUtil.data(item).get('sub'); 2611 } else { 2612 return KTUtil.child(item, '.menu-sub'); 2613 } 2614 } 2615 2616 // Get item sub type 2617 var _getItemSubType = function (element) { 2618 var sub = _getItemSubElement(element); 2619 2620 if (sub && parseInt(KTUtil.css(sub, 'z-index')) > 0) { 2621 return "dropdown"; 2622 } else { 2623 return "accordion"; 2624 } 2625 } 2626 2627 // Get item element 2628 var _getItemElement = function (element) { 2629 var item, sub; 2630 2631 // Element is the external trigger element 2632 if (_isTriggerElement(element)) { 2633 return element; 2634 } 2635 2636 // Element has item toggler attribute 2637 if (element.hasAttribute('data-kt-menu-trigger')) { 2638 return element; 2639 } 2640 2641 // Element has item DOM reference in it's data storage 2642 if (KTUtil.data(element).has('item')) { 2643 return KTUtil.data(element).get('item'); 2644 } 2645 2646 // Item is parent of element 2647 if ((item = element.closest('.menu-item'))) { 2648 return item; 2649 } 2650 2651 // Element's parent has item DOM reference in it's data storage 2652 if ((sub = element.closest('.menu-sub'))) { 2653 if (KTUtil.data(sub).has('item') === true) { 2654 return KTUtil.data(sub).get('item') 2655 } 2656 } 2657 } 2658 2659 // Get item parent element 2660 var _getItemParentElement = function (item) { 2661 var sub = item.closest('.menu-sub'); 2662 var parentItem; 2663 2664 if (sub && KTUtil.data(sub).has('item')) { 2665 return KTUtil.data(sub).get('item'); 2666 } 2667 2668 if (sub && (parentItem = sub.closest('.menu-item[data-kt-menu-trigger]'))) { 2669 return parentItem; 2670 } 2671 2672 return null; 2673 } 2674 2675 // Get item parent elements 2676 var _getItemParentElements = function (item) { 2677 var parents = []; 2678 var parent; 2679 var i = 0; 2680 2681 do { 2682 parent = _getItemParentElement(item); 2683 2684 if (parent) { 2685 parents.push(parent); 2686 item = parent; 2687 } 2688 2689 i++; 2690 } while (parent !== null && i < 20); 2691 2692 if (the.triggerElement) { 2693 parents.unshift(the.triggerElement); 2694 } 2695 2696 return parents; 2697 } 2698 2699 // Get item child element 2700 var _getItemChildElement = function (item) { 2701 var selector = item; 2702 var element; 2703 2704 if (KTUtil.data(item).get('sub')) { 2705 selector = KTUtil.data(item).get('sub'); 2706 } 2707 2708 if (selector !== null) { 2709 //element = selector.querySelector('.show.menu-item[data-kt-menu-trigger]'); 2710 element = selector.querySelector('.menu-item[data-kt-menu-trigger]'); 2711 2712 if (element) { 2713 return element; 2714 } else { 2715 return null; 2716 } 2717 } else { 2718 return null; 2719 } 2720 } 2721 2722 // Get item child elements 2723 var _getItemChildElements = function (item) { 2724 var children = []; 2725 var child; 2726 var i = 0; 2727 2728 do { 2729 child = _getItemChildElement(item); 2730 2731 if (child) { 2732 children.push(child); 2733 item = child; 2734 } 2735 2736 i++; 2737 } while (child !== null && i < 20); 2738 2739 return children; 2740 } 2741 2742 // Show item dropdown 2743 var _showDropdown = function (item) { 2744 // Handle dropdown show event 2745 if (KTEventHandler.trigger(the.element, 'kt.menu.dropdown.show', item) === false) { 2746 return; 2747 } 2748 2749 // Hide all currently shown dropdowns except current one 2750 KTMenu.hideDropdowns(item); 2751 2752 var toggle = _isTriggerElement(item) ? item : _getItemLinkElement(item); 2753 var sub = _getItemSubElement(item); 2754 2755 var width = _getOptionFromElementAttribute(item, 'width'); 2756 var height = _getOptionFromElementAttribute(item, 'height'); 2757 2758 var zindex = the.options.dropdown.zindex; // update 2759 var parentZindex = KTUtil.getHighestZindex(item); // update 2760 2761 // Apply a new z-index if dropdown's toggle element or it's parent has greater z-index // update 2762 if (parentZindex !== null && parentZindex >= zindex) { 2763 zindex = parentZindex + 1; 2764 } 2765 2766 if (zindex > 0) { 2767 KTUtil.css(sub, 'z-index', zindex); 2768 } 2769 2770 if (width !== null) { 2771 KTUtil.css(sub, 'width', width); 2772 } 2773 2774 if (height !== null) { 2775 KTUtil.css(sub, 'height', height); 2776 } 2777 2778 KTUtil.css(sub, 'display', ''); 2779 KTUtil.css(sub, 'overflow', ''); 2780 2781 // Init popper(new) 2782 _initDropdownPopper(item, sub); 2783 2784 KTUtil.addClass(item, 'show'); 2785 KTUtil.addClass(item, 'menu-dropdown'); 2786 KTUtil.addClass(sub, 'show'); 2787 2788 // Append the sub the the root of the menu 2789 if (_getOptionFromElementAttribute(item, 'overflow') === true) { 2790 document.body.appendChild(sub); 2791 KTUtil.data(item).set('sub', sub); 2792 KTUtil.data(sub).set('item', item); 2793 KTUtil.data(sub).set('menu', the); 2794 } else { 2795 KTUtil.data(sub).set('item', item); 2796 } 2797 2798 // Handle dropdown shown event 2799 KTEventHandler.trigger(the.element, 'kt.menu.dropdown.shown', item); 2800 } 2801 2802 // Hide item dropdown 2803 var _hideDropdown = function (item) { 2804 // Handle dropdown hide event 2805 if (KTEventHandler.trigger(the.element, 'kt.menu.dropdown.hide', item) === false) { 2806 return; 2807 } 2808 2809 var sub = _getItemSubElement(item); 2810 2811 KTUtil.css(sub, 'z-index', ''); 2812 KTUtil.css(sub, 'width', ''); 2813 KTUtil.css(sub, 'height', ''); 2814 2815 KTUtil.removeClass(item, 'show'); 2816 KTUtil.removeClass(item, 'menu-dropdown'); 2817 KTUtil.removeClass(sub, 'show'); 2818 2819 // Append the sub back to it's parent 2820 if (_getOptionFromElementAttribute(item, 'overflow') === true) { 2821 if (item.classList.contains('menu-item')) { 2822 item.appendChild(sub); 2823 } else { 2824 KTUtil.insertAfter(the.element, item); 2825 } 2826 2827 KTUtil.data(item).remove('sub'); 2828 KTUtil.data(sub).remove('item'); 2829 KTUtil.data(sub).remove('menu'); 2830 } 2831 2832 // Destroy popper(new) 2833 _destroyDropdownPopper(item); 2834 2835 // Handle dropdown hidden event 2836 KTEventHandler.trigger(the.element, 'kt.menu.dropdown.hidden', item); 2837 } 2838 2839 // Init dropdown popper(new) 2840 var _initDropdownPopper = function (item, sub) { 2841 // Setup popper instance 2842 var reference; 2843 var attach = _getOptionFromElementAttribute(item, 'attach'); 2844 2845 if (attach) { 2846 if (attach === 'parent') { 2847 reference = item.parentNode; 2848 } else { 2849 reference = document.querySelector(attach); 2850 } 2851 } else { 2852 reference = item; 2853 } 2854 2855 var popper = Popper.createPopper(reference, sub, _getDropdownPopperConfig(item)); 2856 KTUtil.data(item).set('popper', popper); 2857 } 2858 2859 // Destroy dropdown popper(new) 2860 var _destroyDropdownPopper = function (item) { 2861 if (KTUtil.data(item).has('popper') === true) { 2862 KTUtil.data(item).get('popper').destroy(); 2863 KTUtil.data(item).remove('popper'); 2864 } 2865 } 2866 2867 // Prepare popper config for dropdown(see: https://popper.js.org/docs/v2/) 2868 var _getDropdownPopperConfig = function (item) { 2869 // Placement 2870 var placement = _getOptionFromElementAttribute(item, 'placement'); 2871 if (!placement) { 2872 placement = 'right'; 2873 } 2874 2875 // Offset 2876 var offsetValue = _getOptionFromElementAttribute(item, 'offset'); 2877 var offset = offsetValue ? offsetValue.split(",") : []; 2878 2879 if (offset.length === 2) { 2880 offset[0] = parseInt(offset[0]); 2881 offset[1] = parseInt(offset[1]); 2882 } 2883 2884 // Strategy 2885 var strategy = _getOptionFromElementAttribute(item, 'overflow') === true ? 'absolute' : 'fixed'; 2886 2887 var altAxis = _getOptionFromElementAttribute(item, 'flip') !== false ? true : false;
2888 2889 var popperConfig = { 2890 placement: placement, 2891 strategy: strategy, 2892 modifiers: [{ 2893 name: 'offset', 2894 options: { 2895 offset: offset 2896 } 2897 }, { 2898 name: 'preventOverflow', 2899 options: { 2900 altAxis: altAxis 2901 } 2902 }, { 2903 name: 'flip', 2904 options: { 2905 flipVariations: false 2906 } 2907 }] 2908 }; 2909 2910 return popperConfig; 2911 } 2912 2913 // Show item accordion 2914 var _showAccordion = function (item) { 2915 if (KTEventHandler.trigger(the.element, 'kt.menu.accordion.show', item) === false) { 2916 return; 2917 } 2918 2919 var sub = _getItemSubElement(item); 2920 var expand = the.options.accordion.expand; 2921 2922 if (_getOptionFromElementAttribute(item, 'expand') === true) { 2923 expand = true; 2924 } else if (_getOptionFromElementAttribute(item, 'expand') === false) { 2925 expand = false; 2926 } else if (_getOptionFromElementAttribute(the.element, 'expand') === true) { 2927 expand = true; 2928 } 2929 2930 if (expand === false) { 2931 _hideAccordions(item); 2932 } 2933 2934 if (KTUtil.data(item).has('popper') === true) { 2935 _hideDropdown(item); 2936 } 2937 2938 KTUtil.addClass(item, 'hover'); 2939 2940 KTUtil.addClass(item, 'showing'); 2941 2942 KTUtil.slideDown(sub, the.options.accordion.slideSpeed, function () { 2943 KTUtil.removeClass(item, 'showing'); 2944 KTUtil.addClass(item, 'show'); 2945 KTUtil.addClass(sub, 'show'); 2946 2947 KTEventHandler.trigger(the.element, 'kt.menu.accordion.shown', item); 2948 }); 2949 } 2950 2951 // Hide item accordion 2952 var _hideAccordion = function (item) { 2953 if (KTEventHandler.trigger(the.element, 'kt.menu.accordion.hide', item) === false) { 2954 return; 2955 } 2956 2957 var sub = _getItemSubElement(item); 2958 2959 KTUtil.addClass(item, 'hiding'); 2960 2961 KTUtil.slideUp(sub, the.options.accordion.slideSpeed, function () { 2962 KTUtil.removeClass(item, 'hiding'); 2963 KTUtil.removeClass(item, 'show'); 2964 KTUtil.removeClass(sub, 'show'); 2965 2966 KTUtil.removeClass(item, 'hover'); // update 2967 2968 KTEventHandler.trigger(the.element, 'kt.menu.accordion.hidden', item); 2969 }); 2970 } 2971 2972 var _setActiveLink = function (link) { 2973 var item = _getItemElement(link); 2974 2975 if (!item) { 2976 return; 2977 } 2978 2979 var parentItems = _getItemParentElements(item); 2980 var parentTabPane = link.closest('.tab-pane'); 2981 2982 var activeLinks = [].slice.call(the.element.querySelectorAll('.menu-link.active')); 2983 var activeParentItems = [].slice.call(the.element.querySelectorAll('.menu-item.here, .menu-item.show')); 2984 2985 if (_getItemSubType(item) === "accordion") { 2986 _showAccordion(item); 2987 } else { 2988 item.classList.add("here"); 2989 } 2990 2991 if (parentItems && parentItems.length > 0) { 2992 for (var i = 0, len = parentItems.length; i < len; i++) { 2993 var parentItem = parentItems[i]; 2994 2995 if (_getItemSubType(parentItem) === "accordion") { 2996 _showAccordion(parentItem); 2997 } else { 2998 parentItem.classList.add("here"); 2999 } 3000 } 3001 } 3002 3003 activeLinks.map(function (activeLink) { 3004 activeLink.classList.remove("active"); 3005 }); 3006 3007 activeParentItems.map(function (activeParentItem) { 3008 if (activeParentItem.contains(item) === false) { 3009 activeParentItem.classList.remove("here"); 3010 activeParentItem.classList.remove("show"); 3011 } 3012 }); 3013 3014 // Handle tab 3015 if (parentTabPane && bootstrap.Tab) { 3016 var tabEl = the.element.querySelector('[data-bs-target="#' + parentTabPane.getAttribute("id") + '"]'); 3017 var tab = new bootstrap.Tab(tabEl); 3018 3019 if (tab) { 3020 tab.show(); 3021 } 3022 } 3023 3024 link.classList.add("active"); 3025 } 3026 3027 var _getLinkByAttribute = function (value, name = "href") { 3028 var link = the.element.querySelector('.menu-link[' + name + '="' + value + '"]'); 3029 3030 if (link) { 3031 return link; 3032 } else { 3033 null; 3034 } 3035 } 3036 3037 // Hide all shown accordions of item 3038 var _hideAccordions = function (item) { 3039 var itemsToHide = KTUtil.findAll(the.element, '.show[data-kt-menu-trigger]'); 3040 var itemToHide; 3041 3042 if (itemsToHide && itemsToHide.length > 0) { 3043 for (var i = 0, len = itemsToHide.length; i < len; i++) { 3044 itemToHide = itemsToHide[i]; 3045 3046 if (_getItemSubType(itemToHide) === 'accordion' && itemToHide !== item && item.contains(itemToHide) === false && itemToHide.contains(item) === false) { 3047 _hideAccordion(itemToHide); 3048 } 3049 } 3050 } 3051 } 3052 3053 // Get item option(through html attributes) 3054 var _getOptionFromElementAttribute = function (item, name) { 3055 var attr; 3056 var value = null; 3057 3058 if (item && item.hasAttribute('data-kt-menu-' + name)) { 3059 attr = item.getAttribute('data-kt-menu-' + name); 3060 value = KTUtil.getResponsiveValue(attr); 3061 3062 if (value !== null && String(value) === 'true') { 3063 value = true; 3064 } else if (value !== null && String(value) === 'false') { 3065 value = false;
3066 } 3067 } 3068 3069 return value; 3070 } 3071 3072 var _destroy = function () { 3073 KTUtil.data(the.element).remove('menu'); 3074 } 3075 3076 // Construct Class 3077 _construct(); 3078 3079 /////////////////////// 3080 // ** Public API ** // 3081 /////////////////////// 3082 3083 // Event Handlers 3084 the.click = function (element, e) { 3085 return _click(element, e); 3086 } 3087 3088 the.link = function (element, e) { 3089 return _link(element, e); 3090 } 3091 3092 the.dismiss = function (element, e) { 3093 return _dismiss(element, e); 3094 } 3095 3096 the.mouseover = function (element, e) { 3097 return _mouseover(element, e); 3098 } 3099 3100 the.mouseout = function (element, e) { 3101 return _mouseout(element, e); 3102 } 3103 3104 // General Methods 3105 the.getItemTriggerType = function (item) { 3106 return _getOptionFromElementAttribute(item, 'trigger'); 3107 } 3108 3109 the.getItemSubType = function (element) { 3110 return _getItemSubType(element); 3111 } 3112 3113 the.show = function (item) { 3114 return _show(item); 3115 } 3116 3117 the.hide = function (item) { 3118 return _hide(item); 3119 } 3120 3121 the.toggle = function (item) { 3122 return _toggle(item); 3123 } 3124 3125 the.reset = function (item) { 3126 return _reset(item); 3127 } 3128 3129 the.update = function () { 3130 return _update(); 3131 } 3132 3133 the.getElement = function () { 3134 return the.element; 3135 } 3136 3137 the.setActiveLink = function (link) { 3138 return _setActiveLink(link); 3139 } 3140 3141 the.getLinkByAttribute = function (value, name = "href") { 3142 return _getLinkByAttribute(value, name); 3143 } 3144 3145 the.getItemLinkElement = function (item) { 3146 return _getItemLinkElement(item); 3147 } 3148 3149 the.getItemToggleElement = function (item) { 3150 return _getItemToggleElement(item); 3151 } 3152 3153 the.getItemSubElement = function (item) { 3154 return _getItemSubElement(item); 3155 } 3156 3157 the.getItemParentElements = function (item) { 3158 return _getItemParentElements(item); 3159 } 3160 3161 the.isItemSubShown = function (item) { 3162 return _isItemSubShown(item); 3163 } 3164 3165 the.isItemParentShown = function (item) { 3166 return _isItemParentShown(item); 3167 } 3168 3169 the.getTriggerElement = function () { 3170 return the.triggerElement; 3171 } 3172 3173 the.isItemDropdownPermanent = function (item) { 3174 return _isItemDropdownPermanent(item); 3175 } 3176 3177 the.destroy = function () { 3178 return _destroy(); 3179 } 3180 3181 the.disable = function () { 3182 the.disabled = true; 3183 } 3184 3185 the.enable = function () { 3186 the.disabled = false; 3187 } 3188 3189 // Accordion Mode Methods 3190 the.hideAccordions = function (item) { 3191 return _hideAccordions(item); 3192 } 3193 3194 // Event API 3195 the.on = function (name, handler) { 3196 return KTEventHandler.on(the.element, name, handler); 3197 } 3198 3199 the.one = function (name, handler) { 3200 return KTEventHandler.one(the.element, name, handler); 3201 } 3202 3203 the.off = function (name, handlerId) { 3204 return KTEventHandler.off(the.element, name, handlerId); 3205 } 3206}; 3207 3208// Get KTMenu instance by element 3209KTMenu.getInstance = function (element) { 3210 var menu; 3211 var item; 3212 3213 if (!element) { 3214 return null; 3215 } 3216 3217 // Element has menu DOM reference in it's DATA storage 3218 if (KTUtil.data(element).has('menu')) { 3219 return KTUtil.data(element).get('menu'); 3220 } 3221 3222 // Element has .menu parent 3223 if (menu = element.closest('.menu')) { 3224 if (KTUtil.data(menu).has('menu')) { 3225 return KTUtil.data(menu).get('menu'); 3226 } 3227 } 3228 3229 // Element has a parent with DOM reference to .menu in it's DATA storage 3230 if (KTUtil.hasClass(element, 'menu-link')) { 3231 var sub = element.closest('.menu-sub'); 3232 3233 if (KTUtil.data(sub).has('menu')) { 3234 return KTUtil.data(sub).get('menu'); 3235 } 3236 } 3237 3238 return null; 3239} 3240 3241// Hide all dropdowns and skip one if provided 3242KTMenu.hideDropdowns = function (skip) { 3243 var items = document.querySelectorAll('.show.menu-dropdown[data-kt-menu-trigger]'); 3244 3245 if (items && items.length > 0) { 3246 for (var i = 0, len = items.length; i < len; i++) { 3247 var item = items[i]; 3248 var menu = KTMenu.getInstance(item); 3249 3250 if (menu && menu.getItemSubType(item) === 'dropdown') { 3251 if (skip) { 3252 if (menu.getItemSubElement(item).contains(skip) === false && item.contains(skip) === false && item !== skip) { 3253 menu.hide(item); 3254 } 3255 } else { 3256 menu.hide(item); 3257 } 3258 } 3259 } 3260 } 3261} 3262 3263// Update all dropdowns popover instances 3264KTMenu.updateDropdowns = function () { 3265 var items = document.querySelectorAll('.show.menu-dropdown[data-kt-menu-trigger]'); 3266 3267 if (items && items.length > 0) { 3268 for (var i = 0, len = items.length; i < len; i++) { 3269 var item = items[i]; 3270 3271 if (KTUtil.data(item).has('popper')) { 3272 KTUtil.data(item).get('popper').forceUpdate(); 3273 } 3274 } 3275 } 3276} 3277 3278// Global handlers 3279KTMenu.initHandlers = function () { 3280 // Dropdown handler 3281 document.addEventListener("click", function (e) { 3282 var items = document.querySelectorAll('.show.menu-dropdown[data-kt-menu-trigger]:not([data-kt-menu-static="true"])'); 3283 var menu; 3284 var item; 3285 var sub; 3286 var menuObj; 3287 3288 if (items && items.length > 0) { 3289 for (var i = 0, len = items.length; i < len; i++) { 3290 item = items[i]; 3291 menuObj = KTMenu.getInstance(item); 3292 3293 if (menuObj && menuObj.getItemSubType(item) === 'dropdown') { 3294 menu = menuObj.getElement(); 3295 sub = menuObj.getItemSubElement(item); 3296 3297 if (item === e.target || item.contains(e.target)) { 3298 continue; 3299 } 3300 3301 if (sub === e.target || sub.contains(e.target)) { 3302 continue; 3303 } 3304 3305 menuObj.hide(item); 3306 } 3307 } 3308 } 3309 }); 3310 3311 // Sub toggle handler(updated) 3312 KTUtil.on(document.body, '.menu-item[data-kt-menu-trigger] > .menu-link, [data-kt-menu-trigger]:not(.menu-item):not([data-kt-menu-trigger="auto"])', 'click', function (e) { 3313 var menu = KTMenu.getInstance(this); 3314 3315 if (menu !== null) { 3316 return menu.click(this, e); 3317 } 3318 }); 3319 3320 // Link handler 3321 KTUtil.on(document.body, '.menu-item:not([data-kt-menu-trigger]) > .menu-link', 'click', function (e) { 3322 var menu = KTMenu.getInstance(this); 3323 3324 if (menu !== null) { 3325 return menu.link(this, e); 3326 } 3327 }); 3328 3329 // Dismiss handler 3330 KTUtil.on(document.body, '[data-kt-menu-dismiss="true"]', 'click', function (e) { 3331 var menu = KTMenu.getInstance(this); 3332 3333 if (menu !== null) { 3334 return menu.dismiss(this, e); 3335 } 3336 }); 3337 3338 // Mouseover handler 3339 KTUtil.on(document.body, '[data-kt-menu-trigger], .menu-sub', 'mouseover', function (e) { 3340 var menu = KTMenu.getInstance(this); 3341 3342 if (menu !== null && menu.getItemSubType(this) === 'dropdown') { 3343 return menu.mouseover(this, e); 3344 } 3345 }); 3346 3347 // Mouseout handler 3348 KTUtil.on(document.body, '[data-kt-menu-trigger], .menu-sub', 'mouseout', function (e) { 3349 var menu = KTMenu.getInstance(this); 3350 3351 if (menu !== null && menu.getItemSubType(this) === 'dropdown') { 3352 return menu.mouseout(this, e); 3353 } 3354 }); 3355 3356 // Resize handler 3357 window.addEventListener('resize', function () { 3358 var menu; 3359 var timer; 3360 3361 KTUtil.throttle(timer, function () { 3362 // Locate and update Offcanvas instances on window resize 3363 var elements = document.querySelectorAll('[data-kt-menu="true"]'); 3364 3365 if (elements && elements.length > 0) { 3366 for (var i = 0, len = elements.length; i < len; i++) { 3367 menu = KTMenu.getInstance(elements[i]); 3368 if (menu) {
3369 menu.update(); 3370 } 3371 } 3372 } 3373 }, 200); 3374 }); 3375} 3376 3377// Render menus by url 3378KTMenu.updateByLinkAttribute = function (value, name = "href") { 3379 // Set menu link active state by attribute value 3380 var elements = document.querySelectorAll('[data-kt-menu="true"]'); 3381 3382 if (elements && elements.length > 0) { 3383 for (var i = 0, len = elements.length; i < len; i++) { 3384 var menu = KTMenu.getInstance(elements[i]); 3385 3386 if (menu) { 3387 var link = menu.getLinkByAttribute(value, name); 3388 if (link) { 3389 menu.setActiveLink(link); 3390 } 3391 } 3392 } 3393 } 3394} 3395 3396// Global instances 3397KTMenu.createInstances = function (selector = '[data-kt-menu="true"]') { 3398 // Initialize menus 3399 var elements = document.querySelectorAll(selector); 3400 if (elements && elements.length > 0) { 3401 for (var i = 0, len = elements.length; i < len; i++) { 3402 new KTMenu(elements[i]); 3403 } 3404 } 3405} 3406 3407// Global initialization 3408KTMenu.init = function () { 3409 KTMenu.createInstances(); 3410 3411 if (KTMenuHandlersInitialized === false) { 3412 KTMenu.initHandlers(); 3413 3414 KTMenuHandlersInitialized = true; 3415 } 3416}; 3417 3418// Webpack support 3419if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') { 3420 module.exports = KTMenu; 3421} 3422 3423"use strict"; 3424 3425// Class definition 3426var KTPasswordMeter = function (element, options) { 3427 //////////////////////////// 3428 // ** Private variables ** // 3429 //////////////////////////// 3430 var the = this; 3431 3432 if (!element) { 3433 return; 3434 } 3435 3436 // Default Options 3437 var defaultOptions = { 3438 minLength: 8, 3439 checkUppercase: true, 3440 checkLowercase: true, 3441 checkDigit: true, 3442 checkChar: true, 3443 scoreHighlightClass: 'active' 3444 }; 3445 3446 //////////////////////////// 3447 // ** Private methods ** // 3448 //////////////////////////// 3449 3450 // Constructor 3451 var _construct = function () { 3452 if (KTUtil.data(element).has('password-meter') === true) { 3453 the = KTUtil.data(element).get('password-meter'); 3454 } else { 3455 _init(); 3456 } 3457 } 3458 3459 // Initialize 3460 var _init = function () { 3461 // Variables 3462 the.options = KTUtil.deepExtend({}, defaultOptions, options); 3463 the.score = 0; 3464 the.checkSteps = 5; 3465 3466 // Elements 3467 the.element = element; 3468 the.inputElement = the.element.querySelector('input[type]'); 3469 the.visibilityElement = the.element.querySelector('[data-kt-password-meter-control="visibility"]'); 3470 the.highlightElement = the.element.querySelector('[data-kt-password-meter-control="highlight"]'); 3471 3472 // Set initialized 3473 the.element.setAttribute('data-kt-password-meter', 'true'); 3474 3475 // Event Handlers 3476 _handlers(); 3477 3478 // Bind Instance 3479 KTUtil.data(the.element).set('password-meter', the); 3480 } 3481 3482 // Handlers 3483 var _handlers = function () { 3484 if (the.highlightElement) { 3485 the.inputElement.addEventListener('input', function () { 3486 _check(); 3487 }); 3488 } 3489 3490 if (the.visibilityElement) { 3491 the.visibilityElement.addEventListener('click', function () { 3492 _visibility(); 3493 }); 3494 } 3495 } 3496 3497 // Event handlers 3498 var _check = function () { 3499 var score = 0; 3500 var checkScore = _getCheckScore(); 3501 3502 if (_checkLength() === true) { 3503 score = score + checkScore; 3504 } 3505 3506 if (the.options.checkUppercase === true && _checkLowercase() === true) { 3507 score = score + checkScore; 3508 } 3509 3510 if (the.options.checkLowercase === true && _checkUppercase() === true) { 3511 score = score + checkScore; 3512 } 3513 3514 if (the.options.checkDigit === true && _checkDigit() === true) { 3515 score = score + checkScore; 3516 } 3517 3518 if (the.options.checkChar === true && _checkChar() === true) { 3519 score = score + checkScore; 3520 } 3521 3522 the.score = score; 3523 3524 _highlight(); 3525 } 3526 3527 var _checkLength = function () { 3528 return the.inputElement.value.length >= the.options.minLength; // 20 score 3529 } 3530 3531 var _checkLowercase = function () { 3532 return /[a-z]/.test(the.inputElement.value); // 20 score 3533 } 3534 3535 var _checkUppercase = function () { 3536 return /[A-Z]/.test(the.inputElement.value); // 20 score 3537 } 3538 3539 var _checkDigit = function () { 3540 return /[0-9]/.test(the.inputElement.value); // 20 score 3541 } 3542 3543 var _checkChar = function () { 3544 return /[~`!#@$%\^&*+=\-\[\]\\';,/{}|\\":<>\?]/g.test(the.inputElement.value); // 20 score 3545 } 3546 3547 var _getCheckScore = function () { 3548 var count = 1; 3549 3550 if (the.options.checkUppercase === true) { 3551 count++; 3552 } 3553 3554 if (the.options.checkLowercase === true) { 3555 count++; 3556 } 3557 3558 if (the.options.checkDigit === true) { 3559 count++; 3560 } 3561 3562 if (the.options.checkChar === true) { 3563 count++; 3564 } 3565 3566 the.checkSteps = count; 3567 3568 return 100 / the.checkSteps; 3569 } 3570 3571 var _highlight = function () { 3572 var items = [].slice.call(the.highlightElement.querySelectorAll('div')); 3573 var total = items.length; 3574 var index = 0; 3575 var checkScore = _getCheckScore();
3576 var score = _getScore(); 3577 3578 items.map(function (item) { 3579 index++; 3580 3581 if ((checkScore * index * (the.checkSteps / total)) <= score) { 3582 item.classList.add('active'); 3583 } else { 3584 item.classList.remove('active'); 3585 } 3586 }); 3587 } 3588 3589 var _visibility = function () { 3590 var visibleIcon = the.visibilityElement.querySelector(':scope > i:not(.d-none)'); 3591 var hiddenIcon = the.visibilityElement.querySelector(':scope > i.d-none'); 3592 3593 if (the.inputElement.getAttribute('type').toLowerCase() === 'password') { 3594 the.inputElement.setAttribute('type', 'text'); 3595 } else { 3596 the.inputElement.setAttribute('type', 'password'); 3597 } 3598 3599 visibleIcon.classList.add('d-none'); 3600 hiddenIcon.classList.remove('d-none'); 3601 3602 the.inputElement.focus(); 3603 } 3604 3605 var _reset = function () { 3606 the.score = 0; 3607 3608 _highlight(); 3609 } 3610 3611 // Gets current password score 3612 var _getScore = function () { 3613 return the.score; 3614 } 3615 3616 var _destroy = function () { 3617 KTUtil.data(the.element).remove('password-meter'); 3618 } 3619 3620 // Construct class 3621 _construct(); 3622 3623 /////////////////////// 3624 // ** Public API ** // 3625 /////////////////////// 3626 3627 // Plugin API 3628 the.check = function () { 3629 return _check(); 3630 } 3631 3632 the.getScore = function () { 3633 return _getScore(); 3634 } 3635 3636 the.reset = function () { 3637 return _reset(); 3638 } 3639 3640 the.destroy = function () { 3641 return _destroy(); 3642 } 3643}; 3644 3645// Static methods 3646KTPasswordMeter.getInstance = function (element) { 3647 if (element !== null && KTUtil.data(element).has('password-meter')) { 3648 return KTUtil.data(element).get('password-meter'); 3649 } else { 3650 return null; 3651 } 3652} 3653 3654// Create instances 3655KTPasswordMeter.createInstances = function (selector = '[data-kt-password-meter]') { 3656 // Get instances 3657 var elements = document.body.querySelectorAll(selector); 3658 3659 if (elements && elements.length > 0) { 3660 for (var i = 0, len = elements.length; i < len; i++) { 3661 // Initialize instances 3662 new KTPasswordMeter(elements[i]); 3663 } 3664 } 3665} 3666 3667// Global initialization 3668KTPasswordMeter.init = function () { 3669 KTPasswordMeter.createInstances(); 3670}; 3671 3672// Webpack support 3673if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') { 3674 module.exports = KTPasswordMeter; 3675} 3676"use strict"; 3677 3678var KTScrollHandlersInitialized = false; 3679 3680// Class definition 3681var KTScroll = function (element, options) { 3682 //////////////////////////// 3683 // ** Private Variables ** // 3684 //////////////////////////// 3685 var the = this; 3686 3687 if (!element) { 3688 return; 3689 } 3690 3691 // Default options 3692 var defaultOptions = { 3693 saveState: true 3694 }; 3695 3696 //////////////////////////// 3697 // ** Private Methods ** // 3698 //////////////////////////// 3699 3700 var _construct = function () { 3701 if (KTUtil.data(element).has('scroll')) { 3702 the = KTUtil.data(element).get('scroll'); 3703 } else { 3704 _init(); 3705 } 3706 } 3707 3708 var _init = function () { 3709 // Variables 3710 the.options = KTUtil.deepExtend({}, defaultOptions, options); 3711 3712 // Elements 3713 the.element = element; 3714 the.id = the.element.getAttribute('id'); 3715 3716 // Set initialized 3717 the.element.setAttribute('data-kt-scroll', 'true'); 3718 3719 // Update 3720 _update(); 3721 3722 // Bind Instance 3723 KTUtil.data(the.element).set('scroll', the); 3724 } 3725 3726 var _setupHeight = function () { 3727 var heightType = _getHeightType(); 3728 var height = _getHeight(); 3729 3730 // Set height 3731 if (height !== null && height.length > 0) { 3732 KTUtil.css(the.element, heightType, height); 3733 } else { 3734 KTUtil.css(the.element, heightType, ''); 3735 } 3736 } 3737 3738 var _setupState = function () { 3739 var namespace = _getStorageNamespace(); 3740 3741 if (_getOption('save-state') === true && the.id) { 3742 if (localStorage.getItem(namespace + the.id + 'st')) { 3743 var pos = parseInt(localStorage.getItem(namespace + the.id + 'st')); 3744 3745 if (pos > 0) { 3746 the.element.scroll({ 3747 top: pos, 3748 behavior: 'instant' 3749 }); 3750 } 3751 } 3752 } 3753 } 3754 3755 var _getStorageNamespace = function (postfix) { 3756 return document.body.hasAttribute("data-kt-name") ? document.body.getAttribute("data-kt-name") + "_" : ""; 3757 } 3758 3759 var _setupScrollHandler = function () { 3760 if (_getOption('save-state') === true && the.id) { 3761 the.element.addEventListener('scroll', _scrollHandler); 3762 } else { 3763 the.element.removeEventListener('scroll', _scrollHandler); 3764 } 3765 } 3766 3767 var _destroyScrollHandler = function () { 3768 the.element.removeEventListener('scroll', _scrollHandler); 3769 } 3770 3771 var _resetHeight = function () { 3772 KTUtil.css(the.element, _getHeightType(), ''); 3773 } 3774 3775 var _scrollHandler = function () { 3776 var namespace = _getStorageNamespace(); 3777 localStorage.setItem(namespace + the.id + 'st', the.element.scrollTop); 3778 } 3779 3780 var _update = function () { 3781 // Activate/deactivate 3782 if (_getOption('activate') === true || the.element.hasAttribute('data-kt-scroll-activate') === false) { 3783 _setupHeight(); 3784 _setupStretchHeight(); 3785 _setupScrollHandler(); 3786 _setupState(); 3787 } else { 3788 _resetHeight() 3789 _destroyScrollHandler(); 3790 } 3791 } 3792 3793 var _setupStretchHeight = function () { 3794 var stretch = _getOption('stretch'); 3795 3796 // Stretch 3797 if (stretch !== null) { 3798 var elements = document.querySelectorAll(stretch); 3799 3800 if (elements && elements.length == 2) { 3801 var element1 = elements[0]; 3802 var element2 = elements[1]; 3803 var diff = _getElementHeight(element2) - _getElementHeight(element1); 3804 3805 if (diff > 0) { 3806 var height = parseInt(KTUtil.css(the.element, _getHeightType())) + diff; 3807 3808 KTUtil.css(the.element, _getHeightType(), String(height) + 'px'); 3809 } 3810 } 3811 } 3812 } 3813 3814 var _getHeight = function () { 3815 var height = _getOption(_getHeightType()); 3816 3817 if (height instanceof Function) { 3818 return height.call(); 3819 } else if (height !== null && typeof height === 'string' && height.toLowerCase() === 'auto') { 3820 return _getAutoHeight(); 3821 } else { 3822 return height; 3823 } 3824 } 3825 3826 var _getAutoHeight = function () { 3827 var height = KTUtil.getViewPort().height; 3828 var dependencies = _getOption('dependencies'); 3829 var wrappers = _getOption('wrappers'); 3830 var offset = _getOption('offset'); 3831 3832 // Spacings 3833 height = height - _getElementSpacing(the.element); 3834 3835 // Height dependencies 3836 //console.log('Q:' + JSON.stringify(dependencies)); 3837 3838 if (dependencies !== null) { 3839 var elements = document.querySelectorAll(dependencies); 3840 3841 if (elements && elements.length > 0) { 3842 for (var i = 0, len = elements.length; i < len; i++) { 3843 if (KTUtil.visible(elements[i]) === false) { 3844 continue; 3845 } 3846 3847 height = height - _getElementHeight(elements[i]); 3848 } 3849 } 3850 } 3851 3852 // Wrappers 3853 if (wrappers !== null) { 3854 var elements = document.querySelectorAll(wrappers); 3855 if (elements && elements.length > 0) { 3856 for (var i = 0, len = elements.length; i < len; i++) { 3857 if (KTUtil.visible(elements[i]) === false) { 3858 continue; 3859 } 3860 3861 height = height - _getElementSpacing(elements[i]); 3862 } 3863 } 3864 } 3865 3866 // Custom offset 3867 if (offset !== null && typeof offset !== 'object') { 3868 height = height - parseInt(offset); 3869 } 3870 3871 return String(height) + 'px'; 3872 } 3873 3874 var _getElementHeight = function (element) { 3875 var height = 0; 3876 3877 if (element !== null) { 3878 height = height + parseInt(KTUtil.css(element, 'height')); 3879 height = height + parseInt(KTUtil.css(element, 'margin-top')); 3880 height = height + parseInt(KTUtil.css(element, 'margin-bottom')); 3881 3882 if (KTUtil.css(element, 'border-top')) { 3883 height = height + parseInt(KTUtil.css(element, 'border-top')); 3884 } 3885 3886 if (KTUtil.css(element, 'border-bottom')) { 3887 height = height + parseInt(KTUtil.css(element, 'border-bottom')); 3888 } 3889 } 3890 3891 return height; 3892 } 3893 3894 var _getElementSpacing = function (element) { 3895 var spacing = 0; 3896 3897 if (element !== null) { 3898 spacing = spacing + parseInt(KTUtil.css(element, 'margin-top')); 3899 spacing = spacing + parseInt(KTUtil.css(element, 'margin-bottom')); 3900 spacing = spacing + parseInt(KTUtil.css(element, 'padding-top')); 3901 spacing = spacing + parseInt(KTUtil.css(element, 'padding-bottom')); 3902 3903 if (KTUtil.css(element, 'border-top')) { 3904 spacing = spacing + parseInt(KTUtil.css(element, 'border-top')); 3905 } 3906 3907 if (KTUtil.css(element, 'border-bottom')) { 3908 spacing = spacing + parseInt(KTUtil.css(element, 'border-bottom')); 3909 } 3910 } 3911 3912 return spacing; 3913 } 3914 3915 var _getOption = function (name) { 3916 if (the.element.hasAttribute('data-kt-scroll-' + name) === true) { 3917 var attr = the.element.getAttribute('data-kt-scroll-' + name); 3918 3919 var value = KTUtil.getResponsiveValue(attr); 3920 3921 if (value !== null && String(value) === 'true') { 3922 value = true; 3923 } else if (value !== null && String(value) === 'false') { 3924 value = false;
3925 } 3926 3927 return value; 3928 } else { 3929 var optionName = KTUtil.snakeToCamel(name); 3930 3931 if (the.options[optionName]) { 3932 return KTUtil.getResponsiveValue(the.options[optionName]); 3933 } else { 3934 return null; 3935 } 3936 } 3937 } 3938 3939 var _getHeightType = function () { 3940 if (_getOption('height')) { 3941 return 'height'; 3942 } if (_getOption('min-height')) { 3943 return 'min-height'; 3944 } if (_getOption('max-height')) { 3945 return 'max-height'; 3946 } 3947 } 3948 3949 var _destroy = function () { 3950 KTUtil.data(the.element).remove('scroll'); 3951 } 3952 3953 // Construct Class 3954 _construct(); 3955 3956 /////////////////////// 3957 // ** Public API ** // 3958 /////////////////////// 3959 3960 the.update = function () { 3961 return _update(); 3962 } 3963 3964 the.getHeight = function () { 3965 return _getHeight(); 3966 } 3967 3968 the.getElement = function () { 3969 return the.element; 3970 } 3971 3972 the.destroy = function () { 3973 return _destroy(); 3974 } 3975}; 3976 3977// Static methods 3978KTScroll.getInstance = function (element) { 3979 if (element !== null && KTUtil.data(element).has('scroll')) { 3980 return KTUtil.data(element).get('scroll'); 3981 } else { 3982 return null; 3983 } 3984} 3985 3986// Create instances 3987KTScroll.createInstances = function (selector = '[data-kt-scroll="true"]') { 3988 // Initialize Menus 3989 var elements = document.body.querySelectorAll(selector); 3990 3991 if (elements && elements.length > 0) { 3992 for (var i = 0, len = elements.length; i < len; i++) { 3993 new KTScroll(elements[i]); 3994 } 3995 } 3996} 3997 3998// Window resize handling 3999KTScroll.handleResize = function () { 4000 window.addEventListener('resize', function () { 4001 var timer; 4002 4003 KTUtil.throttle(timer, function () { 4004 // Locate and update Offcanvas instances on window resize 4005 var elements = document.body.querySelectorAll('[data-kt-scroll="true"]'); 4006 4007 if (elements && elements.length > 0) { 4008 for (var i = 0, len = elements.length; i < len; i++) { 4009 var scroll = KTScroll.getInstance(elements[i]); 4010 if (scroll) { 4011 scroll.update(); 4012 } 4013 } 4014 } 4015 }, 200); 4016 }); 4017} 4018 4019// Global initialization 4020KTScroll.init = function () { 4021 KTScroll.createInstances(); 4022 4023 if (KTScrollHandlersInitialized === false) { 4024 KTScroll.handleResize(); 4025 4026 KTScrollHandlersInitialized = true; 4027 } 4028}; 4029 4030// Webpack Support 4031if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') { 4032 module.exports = KTScroll; 4033} 4034 4035"use strict"; 4036 4037// Class definition 4038var KTScrolltop = function (element, options) { 4039 //////////////////////////// 4040 // ** Private variables ** // 4041 //////////////////////////// 4042 var the = this; 4043 4044 if (typeof element === "undefined" || element === null) { 4045 return; 4046 } 4047 4048 // Default options 4049 var defaultOptions = { 4050 offset: 300, 4051 speed: 600 4052 }; 4053 4054 //////////////////////////// 4055 // ** Private methods ** // 4056 //////////////////////////// 4057 4058 var _construct = function () { 4059 if (KTUtil.data(element).has('scrolltop')) { 4060 the = KTUtil.data(element).get('scrolltop'); 4061 } else { 4062 _init(); 4063 } 4064 } 4065 4066 var _init = function () { 4067 // Variables 4068 the.options = KTUtil.deepExtend({}, defaultOptions, options); 4069 the.uid = KTUtil.getUniqueId('scrolltop'); 4070 the.element = element; 4071 4072 // Set initialized 4073 the.element.setAttribute('data-kt-scrolltop', 'true'); 4074 4075 // Event Handlers 4076 _handlers(); 4077 4078 // Bind Instance 4079 KTUtil.data(the.element).set('scrolltop', the); 4080 } 4081 4082 var _handlers = function () { 4083 var timer; 4084 4085 window.addEventListener('scroll', function () { 4086 KTUtil.throttle(timer, function () { 4087 _scroll(); 4088 }, 200); 4089 }); 4090 4091 KTUtil.addEvent(the.element, 'click', function (e) { 4092 e.preventDefault(); 4093 4094 _go(); 4095 }); 4096 } 4097 4098 var _scroll = function () { 4099 var offset = parseInt(_getOption('offset')); 4100 4101 var pos = KTUtil.getScrollTop(); // current vertical position 4102 4103 if (pos > offset) { 4104 if (document.body.hasAttribute('data-kt-scrolltop') === false) { 4105 document.body.setAttribute('data-kt-scrolltop', 'on'); 4106 } 4107 } else { 4108 if (document.body.hasAttribute('data-kt-scrolltop') === true) { 4109 document.body.removeAttribute('data-kt-scrolltop'); 4110 } 4111 } 4112 } 4113 4114 var _go = function () { 4115 var speed = parseInt(_getOption('speed')); 4116 4117 window.scrollTo({ top: 0, behavior: 'smooth' }); 4118 //KTUtil.scrollTop(0, speed); 4119 } 4120 4121 var _getOption = function (name) { 4122 if (the.element.hasAttribute('data-kt-scrolltop-' + name) === true) { 4123 var attr = the.element.getAttribute('data-kt-scrolltop-' + name); 4124 var value = KTUtil.getResponsiveValue(attr); 4125 4126 if (value !== null && String(value) === 'true') { 4127 value = true; 4128 } else if (value !== null && String(value) === 'false') { 4129 value = false;
4130 } 4131 4132 return value; 4133 } else { 4134 var optionName = KTUtil.snakeToCamel(name); 4135 4136 if (the.options[optionName]) { 4137 return KTUtil.getResponsiveValue(the.options[optionName]); 4138 } else { 4139 return null; 4140 } 4141 } 4142 } 4143 4144 var _destroy = function () { 4145 KTUtil.data(the.element).remove('scrolltop'); 4146 } 4147 4148 // Construct class 4149 _construct(); 4150 4151 /////////////////////// 4152 // ** Public API ** // 4153 /////////////////////// 4154 4155 // Plugin API 4156 the.go = function () { 4157 return _go(); 4158 } 4159 4160 the.getElement = function () { 4161 return the.element; 4162 } 4163 4164 the.destroy = function () { 4165 return _destroy(); 4166 } 4167}; 4168 4169// Static methods 4170KTScrolltop.getInstance = function (element) { 4171 if (element && KTUtil.data(element).has('scrolltop')) { 4172 return KTUtil.data(element).get('scrolltop'); 4173 } else { 4174 return null; 4175 } 4176} 4177 4178// Create instances 4179KTScrolltop.createInstances = function (selector = '[data-kt-scrolltop="true"]') { 4180 // Initialize Menus 4181 var elements = document.body.querySelectorAll(selector); 4182 4183 if (elements && elements.length > 0) { 4184 for (var i = 0, len = elements.length; i < len; i++) { 4185 new KTScrolltop(elements[i]); 4186 } 4187 } 4188} 4189 4190// Global initialization 4191KTScrolltop.init = function () { 4192 KTScrolltop.createInstances(); 4193}; 4194 4195// Webpack support 4196if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') { 4197 module.exports = KTScrolltop; 4198} 4199 4200"use strict"; 4201 4202// Class definition 4203var KTSearch = function (element, options) { 4204 //////////////////////////// 4205 // ** Private variables ** // 4206 //////////////////////////// 4207 var the = this; 4208 4209 if (!element) { 4210 return; 4211 } 4212 4213 // Default Options 4214 var defaultOptions = { 4215 minLength: 2, // Miniam text lenght to query search 4216 keypress: true, // Enable search on keypress 4217 enter: true, // Enable search on enter key press 4218 layout: 'menu', // Use 'menu' or 'inline' layout options to display search results 4219 responsive: null, // Pass integer value or bootstrap compatible breakpoint key(sm,md,lg,xl,xxl) to enable reponsive form mode for device width below the breakpoint value 4220 showOnFocus: true // Always show menu on input focus 4221 }; 4222 4223 //////////////////////////// 4224 // ** Private methods ** // 4225 //////////////////////////// 4226 4227 // Construct 4228 var _construct = function () { 4229 if (KTUtil.data(element).has('search') === true) { 4230 the = KTUtil.data(element).get('search'); 4231 } else { 4232 _init(); 4233 } 4234 } 4235 4236 // Init 4237 var _init = function () { 4238 // Variables 4239 the.options = KTUtil.deepExtend({}, defaultOptions, options); 4240 the.processing = false; 4241 4242 // Elements 4243 the.element = element; 4244 the.contentElement = _getElement('content'); 4245 the.formElement = _getElement('form'); 4246 the.inputElement = _getElement('input'); 4247 the.spinnerElement = _getElement('spinner'); 4248 the.clearElement = _getElement('clear'); 4249 the.toggleElement = _getElement('toggle'); 4250 the.submitElement = _getElement('submit'); 4251 the.toolbarElement = _getElement('toolbar'); 4252 the.minLength = parseInt(_getOption('min-length')); 4253 4254 the.resultsElement = _getElement('results'); 4255 the.suggestionElement = _getElement('suggestion'); 4256 the.emptyElement = _getElement('empty'); 4257 4258 // Set initialized 4259 the.element.setAttribute('data-kt-search', 'true'); 4260 4261 // Layout 4262 the.layout = _getOption('layout'); 4263 4264 // Menu 4265 if (the.layout === 'menu') { 4266 the.menuObject = new KTMenu(the.contentElement); 4267 } else { 4268 the.menuObject = null; 4269 } 4270 4271 // Update 4272 _update(); 4273 4274 // Event Handlers 4275 _handlers(); 4276 4277 // Bind Instance 4278 KTUtil.data(the.element).set('search', the); 4279 } 4280 4281 // Handlera 4282 var _handlers = function () { 4283 // Focus 4284 the.inputElement.addEventListener('focus', _focus); 4285 4286 // Blur 4287 the.inputElement.addEventListener('blur', _blur); 4288 4289 // Keypress 4290 if (_getOption('keypress') === true) { 4291 the.inputElement.addEventListener('input', _input); 4292 } 4293 4294 // Submit 4295 if (the.submitElement) { 4296 the.submitElement.addEventListener('click', _search); 4297 } 4298 4299 // Enter 4300 if (_getOption('enter') === true) { 4301 the.inputElement.addEventListener('keypress', _enter); 4302 } 4303 4304 // Clear 4305 if (the.clearElement) { 4306 the.clearElement.addEventListener('click', _clear); 4307 } 4308 4309 // Menu 4310 if (the.menuObject) { 4311 // Toggle menu 4312 if (the.toggleElement) { 4313 the.toggleElement.addEventListener('click', _show); 4314 4315 the.menuObject.on('kt.menu.dropdown.show', function (item) { 4316 if (KTUtil.visible(the.toggleElement)) { 4317 the.toggleElement.classList.add('active'); 4318 the.toggleElement.classList.add('show'); 4319 } 4320 }); 4321 4322 the.menuObject.on('kt.menu.dropdown.hide', function (item) { 4323 if (KTUtil.visible(the.toggleElement)) { 4324 the.toggleElement.classList.remove('active'); 4325 the.toggleElement.classList.remove('show'); 4326 } 4327 }); 4328 } 4329 4330 the.menuObject.on('kt.menu.dropdown.shown', function () { 4331 the.inputElement.focus(); 4332 }); 4333 } 4334 4335 // Window resize handling 4336 window.addEventListener('resize', function () { 4337 var timer; 4338 4339 KTUtil.throttle(timer, function () { 4340 _update(); 4341 }, 200); 4342 }); 4343 } 4344 4345 // Focus 4346 var _focus = function () { 4347 the.element.classList.add('focus'); 4348 4349 if (_getOption('show-on-focus') === true || the.inputElement.value.length >= the.minLength) { 4350 _show(); 4351 } 4352 } 4353 4354 // Blur 4355 var _blur = function () { 4356 the.element.classList.remove('focus'); 4357 } 4358 4359 // Enter 4360 var _enter = function (e) { 4361 var key = e.charCode || e.keyCode || 0; 4362 4363 if (key == 13) { 4364 e.preventDefault(); 4365 4366 _search(); 4367 } 4368 } 4369 4370 // Input 4371 var _input = function () { 4372 if (_getOption('min-length')) { 4373 if (the.inputElement.value.length >= the.minLength) { 4374 _search(); 4375 } else if (the.inputElement.value.length === 0) { 4376 _clear(); 4377 } 4378 } 4379 } 4380 4381 // Search 4382 var _search = function () { 4383 if (the.processing === false) { 4384 // Show search spinner 4385 if (the.spinnerElement) { 4386 the.spinnerElement.classList.remove("d-none"); 4387 } 4388 4389 // Hide search clear button 4390 if (the.clearElement) { 4391 the.clearElement.classList.add("d-none"); 4392 } 4393 4394 // Hide search toolbar 4395 if (the.toolbarElement && the.formElement.contains(the.toolbarElement)) { 4396 the.toolbarElement.classList.add("d-none"); 4397 } 4398 4399 // Focus input 4400 the.inputElement.focus(); 4401 4402 the.processing = true; 4403 KTEventHandler.trigger(the.element, 'kt.search.process', the); 4404 } 4405 } 4406 4407 // Complete 4408 var _complete = function () { 4409 if (the.spinnerElement) { 4410 the.spinnerElement.classList.add("d-none"); 4411 } 4412 4413 // Show search toolbar 4414 if (the.clearElement) { 4415 the.clearElement.classList.remove("d-none"); 4416 } 4417 4418 if (the.inputElement.value.length === 0) { 4419 _clear(); 4420 } 4421 4422 // Focus input 4423 the.inputElement.focus(); 4424 4425 _show(); 4426 4427 the.processing = false;
4428 } 4429 4430 // Clear 4431 var _clear = function () { 4432 if (KTEventHandler.trigger(the.element, 'kt.search.clear', the) === false) { 4433 return; 4434 } 4435 4436 // Clear and focus input 4437 the.inputElement.value = ""; 4438 the.inputElement.focus(); 4439 4440 // Hide clear icon 4441 if (the.clearElement) { 4442 the.clearElement.classList.add("d-none"); 4443 } 4444 4445 // Show search toolbar 4446 if (the.toolbarElement && the.formElement.contains(the.toolbarElement)) { 4447 the.toolbarElement.classList.remove("d-none"); 4448 } 4449 4450 // Hide menu 4451 if (_getOption('show-on-focus') === false) { 4452 _hide(); 4453 } 4454 4455 KTEventHandler.trigger(the.element, 'kt.search.cleared', the); 4456 } 4457 4458 // Update 4459 var _update = function () { 4460 // Handle responsive form 4461 if (the.layout === 'menu') { 4462 var responsiveFormMode = _getResponsiveFormMode(); 4463 4464 if (responsiveFormMode === 'on' && the.contentElement.contains(the.formElement) === false) { 4465 the.contentElement.prepend(the.formElement); 4466 the.formElement.classList.remove('d-none'); 4467 } else if (responsiveFormMode === 'off' && the.contentElement.contains(the.formElement) === true) { 4468 the.element.prepend(the.formElement); 4469 the.formElement.classList.add('d-none'); 4470 } 4471 } 4472 } 4473 4474 // Show menu 4475 var _show = function () { 4476 if (the.menuObject) { 4477 _update(); 4478 4479 the.menuObject.show(the.element); 4480 } 4481 } 4482 4483 // Hide menu 4484 var _hide = function () { 4485 if (the.menuObject) { 4486 _update(); 4487 4488 the.menuObject.hide(the.element); 4489 } 4490 } 4491 4492 // Get option 4493 var _getOption = function (name) { 4494 if (the.element.hasAttribute('data-kt-search-' + name) === true) { 4495 var attr = the.element.getAttribute('data-kt-search-' + name); 4496 var value = KTUtil.getResponsiveValue(attr); 4497 4498 if (value !== null && String(value) === 'true') { 4499 value = true; 4500 } else if (value !== null && String(value) === 'false') { 4501 value = false; 4502 } 4503 4504 return value; 4505 } else { 4506 var optionName = KTUtil.snakeToCamel(name); 4507 4508 if (the.options[optionName]) { 4509 return KTUtil.getResponsiveValue(the.options[optionName]); 4510 } else { 4511 return null; 4512 } 4513 } 4514 } 4515 4516 // Get element 4517 var _getElement = function (name) { 4518 return the.element.querySelector('[data-kt-search-element="' + name + '"]'); 4519 } 4520 4521 // Check if responsive form mode is enabled 4522 var _getResponsiveFormMode = function () { 4523 var responsive = _getOption('responsive'); 4524 var width = KTUtil.getViewPort().width; 4525 4526 if (!responsive) { 4527 return null; 4528 } 4529 4530 var breakpoint = KTUtil.getBreakpoint(responsive); 4531 4532 if (!breakpoint) { 4533 breakpoint = parseInt(responsive); 4534 } 4535 4536 if (width < breakpoint) { 4537 return "on"; 4538 } else { 4539 return "off"; 4540 } 4541 } 4542 4543 var _destroy = function () { 4544 KTUtil.data(the.element).remove('search'); 4545 } 4546 4547 // Construct class 4548 _construct(); 4549 4550 /////////////////////// 4551 // ** Public API ** // 4552 /////////////////////// 4553 4554 // Plugin API 4555 the.show = function () { 4556 return _show(); 4557 } 4558 4559 the.hide = function () { 4560 return _hide(); 4561 } 4562 4563 the.update = function () { 4564 return _update(); 4565 } 4566 4567 the.search = function () { 4568 return _search(); 4569 } 4570 4571 the.complete = function () { 4572 return _complete(); 4573 } 4574 4575 the.clear = function () { 4576 return _clear(); 4577 } 4578 4579 the.isProcessing = function () { 4580 return the.processing; 4581 } 4582 4583 the.getQuery = function () { 4584 return the.inputElement.value; 4585 } 4586 4587 the.getMenu = function () { 4588 return the.menuObject; 4589 } 4590 4591 the.getFormElement = function () { 4592 return the.formElement; 4593 } 4594 4595 the.getInputElement = function () { 4596 return the.inputElement; 4597 } 4598 4599 the.getContentElement = function () { 4600 return the.contentElement; 4601 } 4602 4603 the.getElement = function () { 4604 return the.element; 4605 } 4606 4607 the.destroy = function () { 4608 return _destroy(); 4609 } 4610 4611 // Event API 4612 the.on = function (name, handler) { 4613 return KTEventHandler.on(the.element, name, handler); 4614 } 4615 4616 the.one = function (name, handler) { 4617 return KTEventHandler.one(the.element, name, handler); 4618 } 4619 4620 the.off = function (name, handlerId) { 4621 return KTEventHandler.off(the.element, name, handlerId); 4622 } 4623}; 4624 4625// Static methods 4626KTSearch.getInstance = function (element) { 4627 if (element !== null && KTUtil.data(element).has('search')) { 4628 return KTUtil.data(element).get('search'); 4629 } else { 4630 return null; 4631 } 4632} 4633 4634// Webpack support 4635if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') { 4636 module.exports = KTSearch; 4637} 4638 4639"use strict"; 4640 4641// Class definition 4642var KTStepper = function (element, options) { 4643 ////////////////////////////// 4644 // ** Private variables ** // 4645 ////////////////////////////// 4646 var the = this; 4647 4648 if (typeof element === "undefined" || element === null) { 4649 return; 4650 } 4651 4652 // Default Options 4653 var defaultOptions = { 4654 startIndex: 1, 4655 animation: false, 4656 animationSpeed: '0.3s', 4657 animationNextClass: 'animate__animated animate__slideInRight animate__fast', 4658 animationPreviousClass: 'animate__animated animate__slideInLeft animate__fast' 4659 }; 4660 4661 //////////////////////////// 4662 // ** Private methods ** // 4663 //////////////////////////// 4664 4665 var _construct = function () { 4666 if (KTUtil.data(element).has('stepper') === true) { 4667 the = KTUtil.data(element).get('stepper'); 4668 } else { 4669 _init(); 4670 } 4671 } 4672 4673 var _init = function () { 4674 the.options = KTUtil.deepExtend({}, defaultOptions, options); 4675 the.uid = KTUtil.getUniqueId('stepper'); 4676 4677 the.element = element; 4678 4679 // Set initialized 4680 the.element.setAttribute('data-kt-stepper', 'true'); 4681 4682 // Elements 4683 the.steps = KTUtil.findAll(the.element, '[data-kt-stepper-element="nav"]'); 4684 the.btnNext = KTUtil.find(the.element, '[data-kt-stepper-action="next"]'); 4685 the.btnPrevious = KTUtil.find(the.element, '[data-kt-stepper-action="previous"]'); 4686 the.btnSubmit = KTUtil.find(the.element, '[data-kt-stepper-action="submit"]'); 4687 4688 // Variables 4689 the.totalStepsNumber = the.steps.length; 4690 the.passedStepIndex = 0; 4691 the.currentStepIndex = 1; 4692 the.clickedStepIndex = 0; 4693 4694 // Set Current Step 4695 if (the.options.startIndex > 1) { 4696 _goTo(the.options.startIndex); 4697 } 4698 4699 // Event listeners 4700 the.nextListener = function (e) { 4701 e.preventDefault(); 4702 4703 KTEventHandler.trigger(the.element, 'kt.stepper.next', the); 4704 }; 4705 4706 the.previousListener = function (e) { 4707 e.preventDefault(); 4708 4709 KTEventHandler.trigger(the.element, 'kt.stepper.previous', the); 4710 }; 4711 4712 if (the.element.getAttribute("data-kt-stepper-submit") === "true") { 4713 the.submitListener = function (e) { 4714 e.preventDefault(); 4715 4716 KTEventHandler.trigger(the.element, 'kt.stepper.submit', the); 4717 }; 4718 } 4719 4720 the.stepListener = function (e) { 4721 e.preventDefault(); 4722 4723 if (the.steps && the.steps.length > 0) { 4724 for (var i = 0, len = the.steps.length; i < len; i++) { 4725 if (the.steps[i] === this) { 4726 the.clickedStepIndex = i + 1; 4727 4728 KTEventHandler.trigger(the.element, 'kt.stepper.click', the); 4729 4730 return; 4731 } 4732 } 4733 } 4734 }; 4735 4736 // Event Handlers 4737 KTUtil.addEvent(the.btnNext, 'click', the.nextListener); 4738 4739 KTUtil.addEvent(the.btnPrevious, 'click', the.previousListener); 4740 4741 KTUtil.addEvent(the.btnSubmit, 'click', the.submitListener); 4742 4743 the.stepListenerId = KTUtil.on(the.element, '[data-kt-stepper-action="step"]', 'click', the.stepListener); 4744 4745 // Bind Instance 4746 KTUtil.data(the.element).set('stepper', the); 4747 } 4748 4749 var _goTo = function (index) { 4750 // Trigger "change" event 4751 KTEventHandler.trigger(the.element, 'kt.stepper.change', the); 4752 4753 // Skip if this step is already shown 4754 if (index === the.currentStepIndex || index > the.totalStepsNumber || index < 0) { 4755 return; 4756 } 4757 4758 // Validate step number 4759 index = parseInt(index); 4760 4761 // Set current step 4762 the.passedStepIndex = the.currentStepIndex; 4763 the.currentStepIndex = index; 4764 4765 // Refresh elements 4766 _refreshUI(); 4767 4768 // Trigger "changed" event 4769 KTEventHandler.trigger(the.element, 'kt.stepper.changed', the); 4770 4771 return the; 4772 } 4773 4774 var _goNext = function () { 4775 return _goTo(_getNextStepIndex()); 4776 } 4777 4778 var _goPrevious = function () { 4779 return _goTo(_getPreviousStepIndex()); 4780 } 4781 4782 var _goLast = function () { 4783 return _goTo(_getLastStepIndex()); 4784 } 4785 4786 var _goFirst = function () { 4787 return _goTo(_getFirstStepIndex()); 4788 } 4789 4790 var _refreshUI = function () { 4791 var state = ''; 4792 4793 if (_isLastStep()) { 4794 state = 'last'; 4795 } else if (_isFirstStep()) { 4796 state = 'first'; 4797 } else { 4798 state = 'between'; 4799 } 4800 4801 // Set state class 4802 KTUtil.removeClass(the.element, 'last'); 4803 KTUtil.removeClass(the.element, 'first'); 4804 KTUtil.removeClass(the.element, 'between'); 4805 4806 KTUtil.addClass(the.element, state); 4807 4808 // Step Items 4809 var elements = KTUtil.findAll(the.element, '[data-kt-stepper-element="nav"], [data-kt-stepper-element="content"], [data-kt-stepper-element="info"]'); 4810 4811 if (elements && elements.length > 0) { 4812 for (var i = 0, len = elements.length; i < len; i++) { 4813 var element = elements[i]; 4814 var index = KTUtil.index(element) + 1; 4815 4816 KTUtil.removeClass(element, 'current'); 4817 KTUtil.removeClass(element, 'completed'); 4818 KTUtil.removeClass(element, 'pending'); 4819 4820 if (index == the.currentStepIndex) { 4821 KTUtil.addClass(element, 'current'); 4822 4823 if (the.options.animation !== false && element.getAttribute('data-kt-stepper-element') == 'content') { 4824 KTUtil.css(element, 'animationDuration', the.options.animationSpeed); 4825 4826 var animation = _getStepDirection(the.passedStepIndex) === 'previous' ? the.options.animationPreviousClass : the.options.animationNextClass; 4827 KTUtil.animateClass(element, animation); 4828 } 4829 } else { 4830 if (index < the.currentStepIndex) { 4831 KTUtil.addClass(element, 'completed'); 4832 } else { 4833 KTUtil.addClass(element, 'pending'); 4834 } 4835 } 4836 } 4837 } 4838 } 4839 4840 var _isLastStep = function () { 4841 return the.currentStepIndex === the.totalStepsNumber; 4842 } 4843 4844 var _isFirstStep = function () { 4845 return the.currentStepIndex === 1; 4846 } 4847 4848 var _isBetweenStep = function () { 4849 return _isLastStep() === false && _isFirstStep() === false; 4850 } 4851 4852 var _getNextStepIndex = function () { 4853 if (the.totalStepsNumber >= (the.currentStepIndex + 1)) { 4854 return the.currentStepIndex + 1; 4855 } else { 4856 return the.totalStepsNumber; 4857 } 4858 } 4859 4860 var _getPreviousStepIndex = function () { 4861 if ((the.currentStepIndex - 1) > 1) { 4862 return the.currentStepIndex - 1; 4863 } else { 4864 return 1; 4865 } 4866 } 4867 4868 var _getFirstStepIndex = function () { 4869 return 1; 4870 } 4871 4872 var _getLastStepIndex = function () { 4873 return the.totalStepsNumber; 4874 } 4875 4876 var _getTotalStepsNumber = function () { 4877 return the.totalStepsNumber; 4878 } 4879 4880 var _getStepDirection = function (index) { 4881 if (index > the.currentStepIndex) { 4882 return 'next'; 4883 } else { 4884 return 'previous'; 4885 } 4886 } 4887 4888 var _getStepContent = function (index) { 4889 var content = KTUtil.findAll(the.element, '[data-kt-stepper-element="content"]'); 4890 4891 if (content[index - 1]) { 4892 return content[index - 1]; 4893 } else { 4894 return false;
4895 } 4896 } 4897 4898 var _destroy = function () { 4899 // Event Handlers 4900 KTUtil.removeEvent(the.btnNext, 'click', the.nextListener); 4901 4902 KTUtil.removeEvent(the.btnPrevious, 'click', the.previousListener); 4903 4904 KTUtil.off(the.element, 'click', the.stepListenerId); 4905 4906 KTUtil.data(the.element).remove('stepper'); 4907 } 4908 4909 // Construct Class 4910 _construct(); 4911 4912 /////////////////////// 4913 // ** Public API ** // 4914 /////////////////////// 4915 4916 // Plugin API 4917 the.getElement = function (index) { 4918 return the.element; 4919 } 4920 4921 the.goTo = function (index) { 4922 return _goTo(index); 4923 } 4924 4925 the.goPrevious = function () { 4926 return _goPrevious(); 4927 } 4928 4929 the.goNext = function () { 4930 return _goNext(); 4931 } 4932 4933 the.goFirst = function () { 4934 return _goFirst(); 4935 } 4936 4937 the.goLast = function () { 4938 return _goLast(); 4939 } 4940 4941 the.getCurrentStepIndex = function () { 4942 return the.currentStepIndex; 4943 } 4944 4945 the.getNextStepIndex = function () { 4946 return _getNextStepIndex(); 4947 } 4948 4949 the.getPassedStepIndex = function () { 4950 return the.passedStepIndex; 4951 } 4952 4953 the.getClickedStepIndex = function () { 4954 return the.clickedStepIndex; 4955 } 4956 4957 the.getPreviousStepIndex = function () { 4958 return _getPreviousStepIndex(); 4959 } 4960 4961 the.destroy = function () { 4962 return _destroy(); 4963 } 4964 4965 // Event API 4966 the.on = function (name, handler) { 4967 return KTEventHandler.on(the.element, name, handler); 4968 } 4969 4970 the.one = function (name, handler) { 4971 return KTEventHandler.one(the.element, name, handler); 4972 } 4973 4974 the.off = function (name, handlerId) { 4975 return KTEventHandler.off(the.element, name, handlerId); 4976 } 4977 4978 the.trigger = function (name, event) { 4979 return KTEventHandler.trigger(the.element, name, event, the, event); 4980 } 4981}; 4982 4983// Static methods 4984KTStepper.getInstance = function (element) { 4985 if (element !== null && KTUtil.data(element).has('stepper')) { 4986 return KTUtil.data(element).get('stepper'); 4987 } else { 4988 return null; 4989 } 4990} 4991 4992// Webpack support 4993if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') { 4994 module.exports = KTStepper; 4995} 4996 4997"use strict"; 4998 4999var KTStickyHandlersInitialized = false; 5000 5001// Class definition 5002var KTSticky = function (element, options) { 5003 //////////////////////////// 5004 // ** Private Variables ** // 5005 //////////////////////////// 5006 var the = this; 5007 5008 if (typeof element === "undefined" || element === null) { 5009 return; 5010 } 5011 5012 // Default Options 5013 var defaultOptions = { 5014 offset: 200, 5015 reverse: false, 5016 release: null, 5017 animation: true, 5018 animationSpeed: '0.3s', 5019 animationClass: 'animation-slide-in-down' 5020 }; 5021 //////////////////////////// 5022 // ** Private Methods ** // 5023 //////////////////////////// 5024 5025 var _construct = function () { 5026 if (KTUtil.data(element).has('sticky') === true) { 5027 the = KTUtil.data(element).get('sticky'); 5028 } else { 5029 _init(); 5030 } 5031 } 5032 5033 var _init = function () { 5034 the.element = element; 5035 the.options = KTUtil.deepExtend({}, defaultOptions, options); 5036 the.uid = KTUtil.getUniqueId('sticky'); 5037 the.name = the.element.getAttribute('data-kt-sticky-name'); 5038 the.attributeName = 'data-kt-sticky-' + the.name; 5039 the.attributeName2 = 'data-kt-' + the.name; 5040 the.eventTriggerState = true; 5041 the.lastScrollTop = 0; 5042 the.scrollHandler; 5043 5044 // Set initialized 5045 the.element.setAttribute('data-kt-sticky', 'true'); 5046 5047 // Event Handlers 5048 window.addEventListener('scroll', _scroll); 5049 5050 // Initial Launch 5051 _scroll(); 5052 5053 // Bind Instance 5054 KTUtil.data(the.element).set('sticky', the); 5055 } 5056 5057 var _scroll = function (e) { 5058 var offset = _getOption('offset'); 5059 var release = _getOption('release'); 5060 var reverse = _getOption('reverse'); 5061 var st; 5062 var attrName; 5063 var diff; 5064 5065 // Exit if false 5066 if (offset === false) { 5067 _disable(); 5068 return; 5069 } 5070 5071 offset = parseInt(offset); 5072 release = release ? document.querySelector(release) : null; 5073 5074 st = KTUtil.getScrollTop(); 5075 diff = document.documentElement.scrollHeight - window.innerHeight - KTUtil.getScrollTop(); 5076 5077 var proceed = (!release || (release.offsetTop - release.clientHeight) > st); 5078 5079 if (reverse === true) { // Release on reverse scroll mode 5080 if (st > offset && proceed) { 5081 if (document.body.hasAttribute(the.attributeName) === false) { 5082 5083 if (_enable() === false) { 5084 return; 5085 } 5086 5087 document.body.setAttribute(the.attributeName, 'on'); 5088 document.body.setAttribute(the.attributeName2, 'on'); 5089 the.element.setAttribute("data-kt-sticky-enabled", "true"); 5090 } 5091 5092 if (the.eventTriggerState === true) { 5093 KTEventHandler.trigger(the.element, 'kt.sticky.on', the); 5094 KTEventHandler.trigger(the.element, 'kt.sticky.change', the); 5095 5096 the.eventTriggerState = false;
5097 } 5098 } else { // Back scroll mode 5099 if (document.body.hasAttribute(the.attributeName) === true) { 5100 _disable(); 5101 document.body.removeAttribute(the.attributeName); 5102 document.body.removeAttribute(the.attributeName2); 5103 the.element.removeAttribute("data-kt-sticky-enabled"); 5104 } 5105 5106 if (the.eventTriggerState === false) { 5107 KTEventHandler.trigger(the.element, 'kt.sticky.off', the); 5108 KTEventHandler.trigger(the.element, 'kt.sticky.change', the); 5109 the.eventTriggerState = true; 5110 } 5111 } 5112 5113 the.lastScrollTop = st; 5114 } else { // Classic scroll mode 5115 if (st > offset && proceed) { 5116 if (document.body.hasAttribute(the.attributeName) === false) { 5117 5118 if (_enable() === false) { 5119 return; 5120 } 5121 5122 document.body.setAttribute(the.attributeName, 'on'); 5123 document.body.setAttribute(the.attributeName2, 'on'); 5124 the.element.setAttribute("data-kt-sticky-enabled", "true"); 5125 } 5126 5127 if (the.eventTriggerState === true) { 5128 KTEventHandler.trigger(the.element, 'kt.sticky.on', the); 5129 KTEventHandler.trigger(the.element, 'kt.sticky.change', the); 5130 the.eventTriggerState = false; 5131 } 5132 } else { // back scroll mode 5133 if (document.body.hasAttribute(the.attributeName) === true) { 5134 _disable(); 5135 document.body.removeAttribute(the.attributeName); 5136 document.body.removeAttribute(the.attributeName2); 5137 the.element.removeAttribute("data-kt-sticky-enabled"); 5138 } 5139 5140 if (the.eventTriggerState === false) { 5141 KTEventHandler.trigger(the.element, 'kt.sticky.off', the); 5142 KTEventHandler.trigger(the.element, 'kt.sticky.change', the); 5143 the.eventTriggerState = true; 5144 } 5145 } 5146 } 5147 5148 if (release) { 5149 if (release.offsetTop - release.clientHeight > st) { 5150 the.element.setAttribute('data-kt-sticky-released', 'true'); 5151 } else { 5152 the.element.removeAttribute('data-kt-sticky-released'); 5153 } 5154 } 5155 } 5156 5157 var _enable = function (update) { 5158 var top = _getOption('top'); 5159 top = top ? parseInt(top) : 0; 5160 5161 var left = _getOption('left'); 5162 var right = _getOption('right'); 5163 var width = _getOption('width'); 5164 var zindex = _getOption('zindex'); 5165 var dependencies = _getOption('dependencies'); 5166 var classes = _getOption('class'); 5167 5168 var height = _calculateHeight(); 5169 var heightOffset = _getOption('height-offset'); 5170 heightOffset = heightOffset ? parseInt(heightOffset) : 0; 5171 5172 if (height + heightOffset + top > KTUtil.getViewPort().height) { 5173 return false; 5174 } 5175 5176 if (update !== true && _getOption('animation') === true) { 5177 KTUtil.css(the.element, 'animationDuration', _getOption('animationSpeed')); 5178 KTUtil.animateClass(the.element, 'animation ' + _getOption('animationClass')); 5179 } 5180 5181 if (classes !== null) { 5182 KTUtil.addClass(the.element, classes); 5183 } 5184 5185 if (zindex !== null) { 5186 KTUtil.css(the.element, 'z-index', zindex); 5187 KTUtil.css(the.element, 'position', 'fixed'); 5188 } 5189 5190 if (top >= 0) { 5191 KTUtil.css(the.element, 'top', String(top) + 'px'); 5192 } 5193 5194 if (width !== null) { 5195 if (width['target']) { 5196 var targetElement = document.querySelector(width['target']); 5197 if (targetElement) { 5198 width = KTUtil.css(targetElement, 'width'); 5199 } 5200 } 5201 5202 KTUtil.css(the.element, 'width', width); 5203 } 5204 5205 if (left !== null) { 5206 if (String(left).toLowerCase() === 'auto') { 5207 var offsetLeft = KTUtil.offset(the.element).left; 5208 5209 if (offsetLeft >= 0) { 5210 KTUtil.css(the.element, 'left', String(offsetLeft) + 'px'); 5211 } 5212 } else { 5213 KTUtil.css(the.element, 'left', left); 5214 } 5215 } 5216 5217 if (right !== null) { 5218 KTUtil.css(the.element, 'right', right); 5219 } 5220 5221 // Height dependencies 5222 if (dependencies !== null) { 5223 var dependencyElements = document.querySelectorAll(dependencies); 5224 5225 if (dependencyElements && dependencyElements.length > 0) {
5226 for (var i = 0, len = dependencyElements.length; i < len; i++) { 5227 KTUtil.css(dependencyElements[i], 'padding-top', String(height) + 'px'); 5228 } 5229 } 5230 } 5231 } 5232 5233 var _disable = function () { 5234 KTUtil.css(the.element, 'top', ''); 5235 KTUtil.css(the.element, 'width', ''); 5236 KTUtil.css(the.element, 'left', ''); 5237 KTUtil.css(the.element, 'right', ''); 5238 KTUtil.css(the.element, 'z-index', ''); 5239 KTUtil.css(the.element, 'position', ''); 5240 5241 var dependencies = _getOption('dependencies'); 5242 var classes = _getOption('class'); 5243 5244 if (classes !== null) { 5245 KTUtil.removeClass(the.element, classes); 5246 } 5247 5248 // Height dependencies 5249 if (dependencies !== null) { 5250 var dependencyElements = document.querySelectorAll(dependencies); 5251 5252 if (dependencyElements && dependencyElements.length > 0) { 5253 for (var i = 0, len = dependencyElements.length; i < len; i++) { 5254 KTUtil.css(dependencyElements[i], 'padding-top', ''); 5255 } 5256 } 5257 } 5258 } 5259 5260 var _check = function () { 5261 5262 } 5263 5264 var _calculateHeight = function () { 5265 var height = parseFloat(KTUtil.css(the.element, 'height')); 5266 5267 height = height + parseFloat(KTUtil.css(the.element, 'margin-top')); 5268 height = height + parseFloat(KTUtil.css(the.element, 'margin-bottom')); 5269 5270 if (KTUtil.css(element, 'border-top')) { 5271 height = height + parseFloat(KTUtil.css(the.element, 'border-top')); 5272 } 5273 5274 if (KTUtil.css(element, 'border-bottom')) { 5275 height = height + parseFloat(KTUtil.css(the.element, 'border-bottom')); 5276 } 5277 5278 return height; 5279 } 5280 5281 var _getOption = function (name) { 5282 if (the.element.hasAttribute('data-kt-sticky-' + name) === true) { 5283 var attr = the.element.getAttribute('data-kt-sticky-' + name); 5284 var value = KTUtil.getResponsiveValue(attr); 5285 5286 if (value !== null && String(value) === 'true') { 5287 value = true; 5288 } else if (value !== null && String(value) === 'false') { 5289 value = false; 5290 } 5291 5292 return value; 5293 } else { 5294 var optionName = KTUtil.snakeToCamel(name); 5295 5296 if (the.options[optionName]) { 5297 return KTUtil.getResponsiveValue(the.options[optionName]); 5298 } else { 5299 return null; 5300 } 5301 } 5302 } 5303 5304 var _destroy = function () { 5305 window.removeEventListener('scroll', _scroll); 5306 KTUtil.data(the.element).remove('sticky'); 5307 } 5308 5309 // Construct Class 5310 _construct(); 5311 5312 /////////////////////// 5313 // ** Public API ** // 5314 /////////////////////// 5315 5316 // Methods 5317 the.update = function () { 5318 if (document.body.hasAttribute(the.attributeName) === true) { 5319 _disable(); 5320 document.body.removeAttribute(the.attributeName); 5321 document.body.removeAttribute(the.attributeName2); 5322 _enable(true); 5323 document.body.setAttribute(the.attributeName, 'on'); 5324 document.body.setAttribute(the.attributeName2, 'on'); 5325 } 5326 } 5327 5328 the.destroy = function () { 5329 return _destroy(); 5330 } 5331 5332 // Event API 5333 the.on = function (name, handler) { 5334 return KTEventHandler.on(the.element, name, handler); 5335 } 5336 5337 the.one = function (name, handler) { 5338 return KTEventHandler.one(the.element, name, handler); 5339 } 5340 5341 the.off = function (name, handlerId) { 5342 return KTEventHandler.off(the.element, name, handlerId); 5343 } 5344 5345 the.trigger = function (name, event) { 5346 return KTEventHandler.trigger(the.element, name, event, the, event); 5347 } 5348}; 5349 5350// Static methods 5351KTSticky.getInstance = function (element) { 5352 if (element !== null && KTUtil.data(element).has('sticky')) { 5353 return KTUtil.data(element).get('sticky'); 5354 } else { 5355 return null; 5356 } 5357} 5358 5359// Create instances 5360KTSticky.createInstances = function (selector = '[data-kt-sticky="true"]') { 5361 // Initialize Menus 5362 var elements = document.body.querySelectorAll(selector); 5363 var sticky; 5364 5365 if (elements && elements.length > 0) { 5366 for (var i = 0, len = elements.length; i < len; i++) { 5367 sticky = new KTSticky(elements[i]); 5368 } 5369 } 5370} 5371 5372// Window resize handler 5373KTSticky.handleResize = function () { 5374 window.addEventListener('resize', function () { 5375 var timer; 5376 5377 KTUtil.throttle(timer, function () { 5378 // Locate and update Offcanvas instances on window resize 5379 var elements = document.body.querySelectorAll('[data-kt-sticky="true"]'); 5380 5381 if (elements && elements.length > 0) { 5382 for (var i = 0, len = elements.length; i < len; i++) { 5383 var sticky = KTSticky.getInstance(elements[i]); 5384 if (sticky) { 5385 sticky.update(); 5386 } 5387 } 5388 } 5389 }, 200); 5390 }); 5391} 5392 5393// Global initialization 5394KTSticky.init = function () { 5395 KTSticky.createInstances(); 5396 5397 if (KTStickyHandlersInitialized === false) { 5398 KTSticky.handleResize(); 5399 KTStickyHandlersInitialized = true; 5400 } 5401}; 5402 5403// Webpack support 5404if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') { 5405 module.exports = KTSticky; 5406} 5407 5408"use strict"; 5409 5410var KTSwapperHandlersInitialized = false;
5411 5412// Class definition 5413var KTSwapper = function (element, options) { 5414 //////////////////////////// 5415 // ** Private Variables ** // 5416 //////////////////////////// 5417 var the = this; 5418 5419 if (typeof element === "undefined" || element === null) { 5420 return; 5421 } 5422 5423 // Default Options 5424 var defaultOptions = { 5425 mode: 'append' 5426 }; 5427 5428 //////////////////////////// 5429 // ** Private Methods ** // 5430 //////////////////////////// 5431 5432 var _construct = function () { 5433 if (KTUtil.data(element).has('swapper') === true) { 5434 the = KTUtil.data(element).get('swapper'); 5435 } else { 5436 _init(); 5437 } 5438 } 5439 5440 var _init = function () { 5441 the.element = element; 5442 the.options = KTUtil.deepExtend({}, defaultOptions, options); 5443 5444 // Set initialized 5445 the.element.setAttribute('data-kt-swapper', 'true'); 5446 5447 // Initial update 5448 _update(); 5449 5450 // Bind Instance 5451 KTUtil.data(the.element).set('swapper', the); 5452 } 5453 5454 var _update = function (e) { 5455 var parentSelector = _getOption('parent'); 5456 5457 var mode = _getOption('mode'); 5458 var parentElement = parentSelector ? document.querySelector(parentSelector) : null; 5459 5460 5461 if (parentElement && element.parentNode !== parentElement) { 5462 if (mode === 'prepend') { 5463 parentElement.prepend(element); 5464 } else if (mode === 'append') { 5465 parentElement.append(element); 5466 } 5467 } 5468 } 5469 5470 var _getOption = function (name) { 5471 if (the.element.hasAttribute('data-kt-swapper-' + name) === true) { 5472 var attr = the.element.getAttribute('data-kt-swapper-' + name); 5473 var value = KTUtil.getResponsiveValue(attr); 5474 5475 if (value !== null && String(value) === 'true') { 5476 value = true; 5477 } else if (value !== null && String(value) === 'false') { 5478 value = false; 5479 } 5480 5481 return value; 5482 } else { 5483 var optionName = KTUtil.snakeToCamel(name); 5484 5485 if (the.options[optionName]) { 5486 return KTUtil.getResponsiveValue(the.options[optionName]); 5487 } else { 5488 return null; 5489 } 5490 } 5491 } 5492 5493 var _destroy = function () { 5494 KTUtil.data(the.element).remove('swapper'); 5495 } 5496 5497 // Construct Class 5498 _construct(); 5499 5500 /////////////////////// 5501 // ** Public API ** // 5502 /////////////////////// 5503 5504 // Methods 5505 the.update = function () { 5506 _update(); 5507 } 5508 5509 the.destroy = function () { 5510 return _destroy(); 5511 } 5512 5513 // Event API 5514 the.on = function (name, handler) { 5515 return KTEventHandler.on(the.element, name, handler); 5516 } 5517 5518 the.one = function (name, handler) { 5519 return KTEventHandler.one(the.element, name, handler); 5520 } 5521 5522 the.off = function (name, handlerId) { 5523 return KTEventHandler.off(the.element, name, handlerId); 5524 } 5525 5526 the.trigger = function (name, event) { 5527 return KTEventHandler.trigger(the.element, name, event, the, event); 5528 } 5529}; 5530 5531// Static methods 5532KTSwapper.getInstance = function (element) { 5533 if (element !== null && KTUtil.data(element).has('swapper')) { 5534 return KTUtil.data(element).get('swapper'); 5535 } else { 5536 return null; 5537 } 5538} 5539 5540// Create instances 5541KTSwapper.createInstances = function (selector = '[data-kt-swapper="true"]') { 5542 // Initialize Menus 5543 var elements = document.querySelectorAll(selector); 5544 var swapper; 5545 5546 if (elements && elements.length > 0) { 5547 for (var i = 0, len = elements.length; i < len; i++) { 5548 swapper = new KTSwapper(elements[i]); 5549 } 5550 } 5551} 5552 5553// Window resize handler 5554KTSwapper.handleResize = function () { 5555 window.addEventListener('resize', function () { 5556 var timer; 5557 5558 KTUtil.throttle(timer, function () { 5559 // Locate and update Offcanvas instances on window resize 5560 var elements = document.querySelectorAll('[data-kt-swapper="true"]'); 5561 5562 if (elements && elements.length > 0) { 5563 for (var i = 0, len = elements.length; i < len; i++) { 5564 var swapper = KTSwapper.getInstance(elements[i]); 5565 if (swapper) { 5566 swapper.update(); 5567 } 5568 } 5569 } 5570 }, 200); 5571 }); 5572}; 5573 5574// Global initialization 5575KTSwapper.init = function () { 5576 KTSwapper.createInstances(); 5577 5578 if (KTSwapperHandlersInitialized === false) { 5579 KTSwapper.handleResize(); 5580 KTSwapperHandlersInitialized = true; 5581 } 5582}; 5583 5584// Webpack support 5585if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') { 5586 module.exports = KTSwapper; 5587} 5588 5589"use strict"; 5590 5591// Class definition 5592var KTToggle = function (element, options) { 5593 //////////////////////////// 5594 // ** Private variables ** // 5595 //////////////////////////// 5596 var the = this; 5597 5598 if (!element) { 5599 return; 5600 } 5601 5602 // Default Options 5603 var defaultOptions = { 5604 saveState: true 5605 }; 5606 5607 //////////////////////////// 5608 // ** Private methods ** // 5609 //////////////////////////// 5610 5611 var _construct = function () { 5612 if (KTUtil.data(element).has('toggle') === true) { 5613 the = KTUtil.data(element).get('toggle'); 5614 } else { 5615 _init(); 5616 } 5617 } 5618 5619 var _init = function () { 5620 // Variables 5621 the.options = KTUtil.deepExtend({}, defaultOptions, options); 5622 the.uid = KTUtil.getUniqueId('toggle'); 5623 5624 // Elements 5625 the.element = element; 5626 5627 the.target = document.querySelector(the.element.getAttribute('data-kt-toggle-target')) ? document.querySelector(the.element.getAttribute('data-kt-toggle-target')) : the.element; 5628 the.state = the.element.hasAttribute('data-kt-toggle-state') ? the.element.getAttribute('data-kt-toggle-state') : ''; 5629 the.mode = the.element.hasAttribute('data-kt-toggle-mode') ? the.element.getAttribute('data-kt-toggle-mode') : ''; 5630 the.attribute = 'data-kt-' + the.element.getAttribute('data-kt-toggle-name'); 5631 5632 // Event Handlers 5633 _handlers(); 5634 5635 // Bind Instance 5636 KTUtil.data(the.element).set('toggle', the); 5637 } 5638 5639 var _handlers = function () { 5640 KTUtil.addEvent(the.element, 'click', function (e) { 5641 e.preventDefault(); 5642 5643 if (the.mode !== '') { 5644 if (the.mode === 'off' && _isEnabled() === false) { 5645 _toggle(); 5646 } else if (the.mode === 'on' && _isEnabled() === true) { 5647 _toggle(); 5648 } 5649 } else { 5650 _toggle(); 5651 } 5652 }); 5653 } 5654 5655 // Event handlers 5656 var _toggle = function () { 5657 // Trigger "after.toggle" event 5658 KTEventHandler.trigger(the.element, 'kt.toggle.change', the); 5659 5660 if (_isEnabled()) { 5661 _disable(); 5662 } else { 5663 _enable(); 5664 } 5665 5666 // Trigger "before.toggle" event 5667 KTEventHandler.trigger(the.element, 'kt.toggle.changed', the); 5668 5669 return the; 5670 } 5671 5672 var _enable = function () { 5673 if (_isEnabled() === true) { 5674 return; 5675 } 5676 5677 KTEventHandler.trigger(the.element, 'kt.toggle.enable', the); 5678 5679 the.target.setAttribute(the.attribute, 'on'); 5680 5681 if (the.state.length > 0) { 5682 the.element.classList.add(the.state); 5683 } 5684 5685 if (typeof KTCookie !== 'undefined' && the.options.saveState === true) { 5686 KTCookie.set(the.attribute, 'on'); 5687 } 5688 5689 KTEventHandler.trigger(the.element, 'kt.toggle.enabled', the); 5690 5691 return the; 5692 } 5693 5694 var _disable = function () { 5695 if (_isEnabled() === false) { 5696 return; 5697 } 5698 5699 KTEventHandler.trigger(the.element, 'kt.toggle.disable', the); 5700 5701 the.target.removeAttribute(the.attribute); 5702 5703 if (the.state.length > 0) { 5704 the.element.classList.remove(the.state); 5705 } 5706 5707 if (typeof KTCookie !== 'undefined' && the.options.saveState === true) { 5708 KTCookie.remove(the.attribute); 5709 } 5710 5711 KTEventHandler.trigger(the.element, 'kt.toggle.disabled', the); 5712 5713 return the; 5714 } 5715 5716 var _isEnabled = function () { 5717 return (String(the.target.getAttribute(the.attribute)).toLowerCase() === 'on'); 5718 } 5719 5720 var _destroy = function () { 5721 KTUtil.data(the.element).remove('toggle'); 5722 } 5723 5724 // Construct class 5725 _construct(); 5726 5727 /////////////////////// 5728 // ** Public API ** // 5729 /////////////////////// 5730 5731 // Plugin API 5732 the.toggle = function () { 5733 return _toggle(); 5734 } 5735 5736 the.enable = function () { 5737 return _enable(); 5738 } 5739 5740 the.disable = function () { 5741 return _disable(); 5742 } 5743 5744 the.isEnabled = function () { 5745 return _isEnabled(); 5746 } 5747 5748 the.goElement = function () { 5749 return the.element; 5750 } 5751 5752 the.destroy = function () { 5753 return _destroy(); 5754 } 5755 5756 // Event API 5757 the.on = function (name, handler) { 5758 return KTEventHandler.on(the.element, name, handler); 5759 } 5760 5761 the.one = function (name, handler) { 5762 return KTEventHandler.one(the.element, name, handler); 5763 } 5764 5765 the.off = function (name, handlerId) { 5766 return KTEventHandler.off(the.element, name, handlerId); 5767 } 5768 5769 the.trigger = function (name, event) { 5770 return KTEventHandler.trigger(the.element, name, event, the, event); 5771 } 5772}; 5773 5774// Static methods 5775KTToggle.getInstance = function (element) { 5776 if (element !== null && KTUtil.data(element).has('toggle')) { 5777 return KTUtil.data(element).get('toggle'); 5778 } else { 5779 return null; 5780 } 5781} 5782 5783// Create instances 5784KTToggle.createInstances = function (selector = '[data-kt-toggle]') { 5785 // Get instances 5786 var elements = document.body.querySelectorAll(selector); 5787 5788 if (elements && elements.length > 0) { 5789 for (var i = 0, len = elements.length; i < len; i++) { 5790 // Initialize instances 5791 new KTToggle(elements[i]); 5792 } 5793 } 5794} 5795 5796// Global initialization 5797KTToggle.init = function () { 5798 KTToggle.createInstances(); 5799}; 5800 5801// Webpack support 5802if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') { 5803 module.exports = KTToggle; 5804} 5805"use strict"; 5806 5807/** 5808 * @class KTUtil base utilize class that privides helper functions 5809 */ 5810 5811// Polyfills 5812 5813// Element.matches() polyfill 5814if (!Element.prototype.matches) { 5815 Element.prototype.matches = function (s) { 5816 var matches = (this.document || this.ownerDocument).querySelectorAll(s), 5817 i = matches.length; 5818 while (--i >= 0 && matches.item(i) !== this) { } 5819 return i > -1; 5820 }; 5821} 5822 5823/** 5824 * Element.closest() polyfill 5825 * https://developer.mozilla.org/en-US/docs/Web/API/Element/closest#Polyfill 5826 */ 5827if (!Element.prototype.closest) { 5828 Element.prototype.closest = function (s) { 5829 var el = this; 5830 var ancestor = this; 5831 if (!document.documentElement.contains(el)) return null; 5832 do { 5833 if (ancestor.matches(s)) return ancestor; 5834 ancestor = ancestor.parentElement; 5835 } while (ancestor !== null); 5836 return null; 5837 }; 5838} 5839 5840/** 5841 * ChildNode.remove() polyfill 5842 * https://gomakethings.com/removing-an-element-from-the-dom-the-es6-way/ 5843 * @author Chris Ferdinandi 5844 * @license MIT 5845 */ 5846(function (elem) { 5847 for (var i = 0; i < elem.length; i++) { 5848 if (!window[elem[i]] || 'remove' in window[elem[i]].prototype) continue; 5849 window[elem[i]].prototype.remove = function () { 5850 this.parentNode.removeChild(this); 5851 }; 5852 } 5853})(['Element', 'CharacterData', 'DocumentType']); 5854 5855 5856// 5857// requestAnimationFrame polyfill by Erik Möller. 5858// With fixes from Paul Irish and Tino Zijdel 5859// 5860// http://paulirish.com/2011/requestanimationframe-for-smart-animating/ 5861// http://my.opera.com/emoller/blog/2011/12/20/requestanimationframe-for-smart-er-animating 5862// 5863// MIT license 5864// 5865(function () { 5866 var lastTime = 0; 5867 var vendors = ['webkit', 'moz']; 5868 for (var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) { 5869 window.requestAnimationFrame = window[vendors[x] + 'RequestAnimationFrame']; 5870 window.cancelAnimationFrame = 5871 window[vendors[x] + 'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame']; 5872 } 5873 5874 if (!window.requestAnimationFrame) 5875 window.requestAnimationFrame = function (callback) { 5876 var currTime = new Date().getTime(); 5877 var timeToCall = Math.max(0, 16 - (currTime - lastTime)); 5878 var id = window.setTimeout(function () { 5879 callback(currTime + timeToCall); 5880 }, timeToCall); 5881 lastTime = currTime + timeToCall; 5882 return id; 5883 }; 5884 5885 if (!window.cancelAnimationFrame) 5886 window.cancelAnimationFrame = function (id) { 5887 clearTimeout(id); 5888 }; 5889}()); 5890 5891// Source: https://github.com/jserz/js_piece/blob/master/DOM/ParentNode/prepend()/prepend().md 5892(function (arr) { 5893 arr.forEach(function (item) { 5894 if (item.hasOwnProperty('prepend')) { 5895 return; 5896 } 5897 Object.defineProperty(item, 'prepend', { 5898 configurable: true, 5899 enumerable: true, 5900 writable: true, 5901 value: function prepend() { 5902 var argArr = Array.prototype.slice.call(arguments), 5903 docFrag = document.createDocumentFragment(); 5904 5905 argArr.forEach(function (argItem) { 5906 var isNode = argItem instanceof Node; 5907 docFrag.appendChild(isNode ? argItem : document.createTextNode(String(argItem))); 5908 }); 5909 5910 this.insertBefore(docFrag, this.firstChild); 5911 } 5912 }); 5913 }); 5914})([Element.prototype, Document.prototype, DocumentFragment.prototype]); 5915 5916// getAttributeNames 5917if (Element.prototype.getAttributeNames == undefined) { 5918 Element.prototype.getAttributeNames = function () { 5919 var attributes = this.attributes; 5920 var length = attributes.length; 5921 var result = new Array(length); 5922 for (var i = 0; i < length; i++) { 5923 result[i] = attributes[i].name; 5924 } 5925 return result; 5926 }; 5927} 5928 5929// Global variables 5930window.KTUtilElementDataStore = {}; 5931window.KTUtilElementDataStoreID = 0; 5932window.KTUtilDelegatedEventHandlers = {}; 5933 5934var KTUtil = function () { 5935 var resizeHandlers = []; 5936 5937 /** 5938 * Handle window resize event with some 5939 * delay to attach event handlers upon resize complete 5940 */ 5941 var _windowResizeHandler = function () { 5942 var _runResizeHandlers = function () { 5943 // reinitialize other subscribed elements 5944 for (var i = 0; i < resizeHandlers.length; i++) { 5945 var each = resizeHandlers[i]; 5946 each.call(); 5947 } 5948 }; 5949 5950 var timer; 5951 5952 window.addEventListener('resize', function () { 5953 KTUtil.throttle(timer, function () { 5954 _runResizeHandlers(); 5955 }, 200); 5956 }); 5957 }; 5958 5959 return { 5960 /** 5961 * Class main initializer. 5962 * @param {object} settings. 5963 * @returns null 5964 */ 5965 //main function to initiate the theme 5966 init: function (settings) { 5967 _windowResizeHandler(); 5968 }, 5969 5970 /** 5971 * Adds window resize event handler. 5972 * @param {function} callback function. 5973 */ 5974 addResizeHandler: function (callback) { 5975 resizeHandlers.push(callback); 5976 }, 5977 5978 /** 5979 * Removes window resize event handler. 5980 * @param {function} callback function. 5981 */ 5982 removeResizeHandler: function (callback) { 5983 for (var i = 0; i < resizeHandlers.length; i++) { 5984 if (callback === resizeHandlers[i]) { 5985 delete resizeHandlers[i]; 5986 } 5987 } 5988 }, 5989 5990 /** 5991 * Trigger window resize handlers. 5992 */ 5993 runResizeHandlers: function () { 5994 _runResizeHandlers(); 5995 }, 5996 5997 resize: function () { 5998 if (typeof (Event) === 'function') { 5999 // modern browsers 6000 window.dispatchEvent(new Event('resize')); 6001 } else { 6002 // for IE and other old browsers 6003 // causes deprecation warning on modern browsers 6004 var evt = window.document.createEvent('UIEvents'); 6005 evt.initUIEvent('resize', true, false, window, 0); 6006 window.dispatchEvent(evt); 6007 } 6008 }, 6009 6010 /** 6011 * Get GET parameter value from URL. 6012 * @param {string} paramName Parameter name. 6013 * @returns {string} 6014 */ 6015 getURLParam: function (paramName) { 6016 var searchString = window.location.search.substring(1), 6017 i, val, params = searchString.split("&"); 6018 6019 for (i = 0; i < params.length; i++) { 6020 val = params[i].split("="); 6021 if (val[0] == paramName) { 6022 return unescape(val[1]); 6023 } 6024 } 6025 6026 return null; 6027 }, 6028 6029 /** 6030 * Checks whether current device is mobile touch. 6031 * @returns {boolean} 6032 */ 6033 isMobileDevice: function () {
6034 var test = (this.getViewPort().width < this.getBreakpoint('lg') ? true : false); 6035 6036 if (test === false) { 6037 // For use within normal web clients 6038 test = navigator.userAgent.match(/iPad/i) != null; 6039 } 6040 6041 return test; 6042 }, 6043 6044 /** 6045 * Checks whether current device is desktop. 6046 * @returns {boolean} 6047 */ 6048 isDesktopDevice: function () { 6049 return KTUtil.isMobileDevice() ? false : true; 6050 }, 6051 6052 /** 6053 * Gets browser window viewport size. Ref: 6054 * http://andylangton.co.uk/articles/javascript/get-viewport-size-javascript/ 6055 * @returns {object} 6056 */ 6057 getViewPort: function () { 6058 var e = window, 6059 a = 'inner'; 6060 if (!('innerWidth' in window)) { 6061 a = 'client'; 6062 e = document.documentElement || document.body; 6063 } 6064 6065 return { 6066 width: e[a + 'Width'], 6067 height: e[a + 'Height'] 6068 }; 6069 }, 6070 6071 /** 6072 * Checks whether given device mode is currently activated. 6073 * @param {string} mode Responsive mode name(e.g: desktop, 6074 * desktop-and-tablet, tablet, tablet-and-mobile, mobile) 6075 * @returns {boolean} 6076 */ 6077 isBreakpointUp: function (mode) { 6078 var width = this.getViewPort().width; 6079 var breakpoint = this.getBreakpoint(mode); 6080 6081 return (width >= breakpoint); 6082 }, 6083 6084 isBreakpointDown: function (mode) { 6085 var width = this.getViewPort().width; 6086 var breakpoint = this.getBreakpoint(mode); 6087 6088 return (width < breakpoint); 6089 }, 6090 6091 getViewportWidth: function () { 6092 return this.getViewPort().width; 6093 }, 6094 6095 /** 6096 * Generates unique ID for give prefix. 6097 * @param {string} prefix Prefix for generated ID 6098 * @returns {boolean} 6099 */ 6100 getUniqueId: function (prefix) { 6101 return prefix + Math.floor(Math.random() * (new Date()).getTime()); 6102 }, 6103 6104 /** 6105 * Gets window width for give breakpoint mode. 6106 * @param {string} mode Responsive mode name(e.g: xl, lg, md, sm) 6107 * @returns {number} 6108 */ 6109 getBreakpoint: function (breakpoint) { 6110 var value = this.getCssVariableValue('--bs-' + breakpoint); 6111 6112 if (value) { 6113 value = parseInt(value.trim()); 6114 } 6115 6116 return value; 6117 }, 6118 6119 /** 6120 * Checks whether object has property matchs given key path. 6121 * @param {object} obj Object contains values paired with given key path 6122 * @param {string} keys Keys path seperated with dots 6123 * @returns {object} 6124 */ 6125 isset: function (obj, keys) { 6126 var stone; 6127 6128 keys = keys || ''; 6129 6130 if (keys.indexOf('[') !== -1) { 6131 throw new Error('Unsupported object path notation.'); 6132 } 6133 6134 keys = keys.split('.'); 6135 6136 do { 6137 if (obj === undefined) { 6138 return false; 6139 } 6140 6141 stone = keys.shift(); 6142 6143 if (!obj.hasOwnProperty(stone)) { 6144 return false; 6145 } 6146 6147 obj = obj[stone]; 6148 6149 } while (keys.length); 6150 6151 return true; 6152 }, 6153 6154 /** 6155 * Gets highest z-index of the given element parents 6156 * @param {object} el jQuery element object 6157 * @returns {number} 6158 */ 6159 getHighestZindex: function (el) { 6160 var position, value; 6161 6162 while (el && el !== document) { 6163 // Ignore z-index if position is set to a value where z-index is ignored by the browser 6164 // This makes behavior of this function consistent across browsers 6165 // WebKit always returns auto if the element is positioned 6166 position = KTUtil.css(el, 'position'); 6167 6168 if (position === "absolute" || position === "relative" || position === "fixed") { 6169 // IE returns 0 when zIndex is not specified 6170 // other browsers return a string 6171 // we ignore the case of nested elements with an explicit value of 0 6172 // <div style="z-index: -10;"><div style="z-index: 0;"></div></div> 6173 value = parseInt(KTUtil.css(el, 'z-index')); 6174 6175 if (!isNaN(value) && value !== 0) { 6176 return value; 6177 } 6178 } 6179 6180 el = el.parentNode; 6181 } 6182 6183 return 1; 6184 }, 6185 6186 /** 6187 * Checks whether the element has any parent with fixed positionfreg 6188 * @param {object} el jQuery element object 6189 * @returns {boolean} 6190 */ 6191 hasFixedPositionedParent: function (el) { 6192 var position; 6193 6194 while (el && el !== document) { 6195 position = KTUtil.css(el, 'position'); 6196 6197 if (position === "fixed") { 6198 return true; 6199 } 6200 6201 el = el.parentNode; 6202 } 6203 6204 return false;
6205 }, 6206 6207 /** 6208 * Simulates delay 6209 */ 6210 sleep: function (milliseconds) { 6211 var start = new Date().getTime(); 6212 for (var i = 0; i < 1e7; i++) { 6213 if ((new Date().getTime() - start) > milliseconds) { 6214 break; 6215 } 6216 } 6217 }, 6218 6219 /** 6220 * Gets randomly generated integer value within given min and max range 6221 * @param {number} min Range start value 6222 * @param {number} max Range end value 6223 * @returns {number} 6224 */ 6225 getRandomInt: function (min, max) { 6226 return Math.floor(Math.random() * (max - min + 1)) + min; 6227 }, 6228 6229 /** 6230 * Checks whether Angular library is included 6231 * @returns {boolean} 6232 */ 6233 isAngularVersion: function () { 6234 return window.Zone !== undefined ? true : false; 6235 }, 6236 6237 // Deep extend: $.extend(true, {}, objA, objB); 6238 deepExtend: function (out) { 6239 out = out || {}; 6240 6241 for (var i = 1; i < arguments.length; i++) { 6242 var obj = arguments[i]; 6243 if (!obj) continue; 6244 6245 for (var key in obj) { 6246 if (!obj.hasOwnProperty(key)) { 6247 continue; 6248 } 6249 6250 // based on https://javascriptweblog.wordpress.com/2011/08/08/fixing-the-javascript-typeof-operator/ 6251 if (Object.prototype.toString.call(obj[key]) === '[object Object]') { 6252 out[key] = KTUtil.deepExtend(out[key], obj[key]); 6253 continue; 6254 } 6255 6256 out[key] = obj[key]; 6257 } 6258 } 6259 6260 return out; 6261 }, 6262 6263 // extend: $.extend({}, objA, objB); 6264 extend: function (out) { 6265 out = out || {}; 6266 6267 for (var i = 1; i < arguments.length; i++) { 6268 if (!arguments[i]) 6269 continue; 6270 6271 for (var key in arguments[i]) { 6272 if (arguments[i].hasOwnProperty(key)) 6273 out[key] = arguments[i][key]; 6274 } 6275 } 6276 6277 return out; 6278 }, 6279 6280 getBody: function () { 6281 return document.getElementsByTagName('body')[0]; 6282 }, 6283 6284 /** 6285 * Checks whether the element has given classes 6286 * @param {object} el jQuery element object 6287 * @param {string} Classes string 6288 * @returns {boolean} 6289 */ 6290 hasClasses: function (el, classes) { 6291 if (!el) { 6292 return; 6293 } 6294 6295 var classesArr = classes.split(" "); 6296 6297 for (var i = 0; i < classesArr.length; i++) { 6298 if (KTUtil.hasClass(el, KTUtil.trim(classesArr[i])) == false) { 6299 return false; 6300 } 6301 } 6302 6303 return true; 6304 }, 6305 6306 hasClass: function (el, className) { 6307 if (!el) { 6308 return; 6309 } 6310 6311 return el.classList ? el.classList.contains(className) : new RegExp('\\b' + className + '\\b').test(el.className); 6312 }, 6313 6314 addClass: function (el, className) { 6315 if (!el || typeof className === 'undefined') { 6316 return; 6317 } 6318 6319 var classNames = className.split(' '); 6320 6321 if (el.classList) { 6322 for (var i = 0; i < classNames.length; i++) { 6323 if (classNames[i] && classNames[i].length > 0) { 6324 el.classList.add(KTUtil.trim(classNames[i])); 6325 } 6326 } 6327 } else if (!KTUtil.hasClass(el, className)) { 6328 for (var x = 0; x < classNames.length; x++) { 6329 el.className += ' ' + KTUtil.trim(classNames[x]); 6330 } 6331 } 6332 }, 6333 6334 removeClass: function (el, className) { 6335 if (!el || typeof className === 'undefined') { 6336 return; 6337 } 6338 6339 var classNames = className.split(' '); 6340 6341 if (el.classList) { 6342 for (var i = 0; i < classNames.length; i++) { 6343 el.classList.remove(KTUtil.trim(classNames[i])); 6344 } 6345 } else if (KTUtil.hasClass(el, className)) { 6346 for (var x = 0; x < classNames.length; x++) { 6347 el.className = el.className.replace(new RegExp('\\b' + KTUtil.trim(classNames[x]) + '\\b', 'g'), ''); 6348 } 6349 } 6350 }, 6351 6352 triggerCustomEvent: function (el, eventName, data) { 6353 var event; 6354 if (window.CustomEvent) { 6355 event = new CustomEvent(eventName, { 6356 detail: data 6357 }); 6358 } else { 6359 event = document.createEvent('CustomEvent'); 6360 event.initCustomEvent(eventName, true, true, data); 6361 } 6362 6363 el.dispatchEvent(event); 6364 }, 6365 6366 triggerEvent: function (node, eventName) { 6367 // Make sure we use the ownerDocument from the provided node to avoid cross-window problems 6368 var doc; 6369 6370 if (node.ownerDocument) { 6371 doc = node.ownerDocument; 6372 } else if (node.nodeType == 9) { 6373 // the node may be the document itself, nodeType 9 = DOCUMENT_NODE 6374 doc = node; 6375 } else { 6376 throw new Error("Invalid node passed to fireEvent: " + node.id); 6377 } 6378
6379 if (node.dispatchEvent) { 6380 // Gecko-style approach (now the standard) takes more work 6381 var eventClass = ""; 6382 6383 // Different events have different event classes. 6384 // If this switch statement can't map an eventName to an eventClass, 6385 // the event firing is going to fail. 6386 switch (eventName) { 6387 case "click": // Dispatching of 'click' appears to not work correctly in Safari. Use 'mousedown' or 'mouseup' instead. 6388 case "mouseenter": 6389 case "mouseleave": 6390 case "mousedown": 6391 case "mouseup": 6392 eventClass = "MouseEvents"; 6393 break; 6394 6395 case "focus": 6396 case "change": 6397 case "blur": 6398 case "select": 6399 eventClass = "HTMLEvents"; 6400 break; 6401 6402 default: 6403 throw "fireEvent: Couldn't find an event class for event '" + eventName + "'."; 6404 break; 6405 } 6406 var event = doc.createEvent(eventClass); 6407 6408 var bubbles = eventName == "change" ? false : true; 6409 event.initEvent(eventName, bubbles, true); // All events created as bubbling and cancelable. 6410 6411 event.synthetic = true; // allow detection of synthetic events 6412 // The second parameter says go ahead with the default action 6413 node.dispatchEvent(event, true); 6414 } else if (node.fireEvent) { 6415 // IE-old school style 6416 var event = doc.createEventObject(); 6417 event.synthetic = true; // allow detection of synthetic events 6418 node.fireEvent("on" + eventName, event); 6419 } 6420 }, 6421 6422 index: function (el) { 6423 var c = el.parentNode.children, i = 0; 6424 for (; i < c.length; i++) 6425 if (c[i] == el) return i; 6426 }, 6427 6428 trim: function (string) { 6429 return string.trim(); 6430 }, 6431 6432 eventTriggered: function (e) { 6433 if (e.currentTarget.dataset.triggered) { 6434 return true; 6435 } else { 6436 e.currentTarget.dataset.triggered = true; 6437 6438 return false; 6439 } 6440 }, 6441 6442 remove: function (el) { 6443 if (el && el.parentNode) { 6444 el.parentNode.removeChild(el); 6445 } 6446 }, 6447 6448 find: function (parent, query) { 6449 if (parent !== null) { 6450 return parent.querySelector(query); 6451 } else { 6452 return null; 6453 } 6454 }, 6455 6456 findAll: function (parent, query) { 6457 if (parent !== null) { 6458 return parent.querySelectorAll(query); 6459 } else { 6460 return null; 6461 } 6462 }, 6463 6464 insertAfter: function (el, referenceNode) { 6465 return referenceNode.parentNode.insertBefore(el, referenceNode.nextSibling); 6466 }, 6467 6468 parents: function (elem, selector) { 6469 // Set up a parent array 6470 var parents = []; 6471 6472 // Push each parent element to the array 6473 for (; elem && elem !== document; elem = elem.parentNode) { 6474 if (selector) { 6475 if (elem.matches(selector)) { 6476 parents.push(elem); 6477 } 6478 continue; 6479 } 6480 parents.push(elem); 6481 } 6482 6483 // Return our parent array 6484 return parents; 6485 }, 6486 6487 children: function (el, selector, log) { 6488 if (!el || !el.childNodes) { 6489 return null; 6490 } 6491 6492 var result = [], 6493 i = 0, 6494 l = el.childNodes.length; 6495 6496 for (var i; i < l; ++i) { 6497 if (el.childNodes[i].nodeType == 1 && KTUtil.matches(el.childNodes[i], selector, log)) { 6498 result.push(el.childNodes[i]); 6499 } 6500 } 6501 6502 return result; 6503 }, 6504 6505 child: function (el, selector, log) { 6506 var children = KTUtil.children(el, selector, log); 6507 6508 return children ? children[0] : null; 6509 }, 6510 6511 matches: function (el, selector, log) { 6512 var p = Element.prototype; 6513 var f = p.matches || p.webkitMatchesSelector || p.mozMatchesSelector || p.msMatchesSelector || function (s) { 6514 return [].indexOf.call(document.querySelectorAll(s), this) !== -1; 6515 }; 6516 6517 if (el && el.tagName) { 6518 return f.call(el, selector); 6519 } else { 6520 return false; 6521 } 6522 }, 6523 6524 data: function (el) { 6525 return { 6526 set: function (name, data) { 6527 if (!el) { 6528 return; 6529 } 6530 6531 if (el.customDataTag === undefined) { 6532 window.KTUtilElementDataStoreID++; 6533 el.customDataTag = window.KTUtilElementDataStoreID; 6534 } 6535 6536 if (window.KTUtilElementDataStore[el.customDataTag] === undefined) { 6537 window.KTUtilElementDataStore[el.customDataTag] = {}; 6538 } 6539 6540 window.KTUtilElementDataStore[el.customDataTag][name] = data; 6541 }, 6542 6543 get: function (name) { 6544 if (!el) { 6545 return; 6546 } 6547 6548 if (el.customDataTag === undefined) { 6549 return null; 6550 } 6551 6552 return this.has(name) ? window.KTUtilElementDataStore[el.customDataTag][name] : null; 6553 }, 6554 6555 has: function (name) { 6556 if (!el) { 6557 return false;
6558 } 6559 6560 if (el.customDataTag === undefined) { 6561 return false; 6562 } 6563 6564 return (window.KTUtilElementDataStore[el.customDataTag] && window.KTUtilElementDataStore[el.customDataTag][name]) ? true : false; 6565 }, 6566 6567 remove: function (name) { 6568 if (el && this.has(name)) { 6569 delete window.KTUtilElementDataStore[el.customDataTag][name]; 6570 } 6571 } 6572 }; 6573 }, 6574 6575 outerWidth: function (el, margin) { 6576 var width; 6577 6578 if (margin === true) { 6579 width = parseFloat(el.offsetWidth); 6580 width += parseFloat(KTUtil.css(el, 'margin-left')) + parseFloat(KTUtil.css(el, 'margin-right')); 6581 6582 return parseFloat(width); 6583 } else { 6584 width = parseFloat(el.offsetWidth); 6585 6586 return width; 6587 } 6588 }, 6589 6590 offset: function (el) { 6591 var rect, win; 6592 6593 if (!el) { 6594 return; 6595 } 6596 6597 // Return zeros for disconnected and hidden (display: none) elements (gh-2310) 6598 // Support: IE <=11 only 6599 // Running getBoundingClientRect on a 6600 // disconnected node in IE throws an error 6601 6602 if (!el.getClientRects().length) { 6603 return { top: 0, left: 0 }; 6604 } 6605 6606 // Get document-relative position by adding viewport scroll to viewport-relative gBCR 6607 rect = el.getBoundingClientRect(); 6608 win = el.ownerDocument.defaultView; 6609 6610 return { 6611 top: rect.top + win.pageYOffset, 6612 left: rect.left + win.pageXOffset, 6613 right: window.innerWidth - (el.offsetLeft + el.offsetWidth) 6614 }; 6615 }, 6616 6617 height: function (el) { 6618 return KTUtil.css(el, 'height'); 6619 }, 6620 6621 outerHeight: function (el, withMargin) { 6622 var height = el.offsetHeight; 6623 var style; 6624 6625 if (typeof withMargin !== 'undefined' && withMargin === true) { 6626 style = getComputedStyle(el); 6627 height += parseInt(style.marginTop) + parseInt(style.marginBottom); 6628 6629 return height; 6630 } else { 6631 return height; 6632 } 6633 }, 6634 6635 visible: function (el) { 6636 return !(el.offsetWidth === 0 && el.offsetHeight === 0); 6637 }, 6638 6639 isVisibleInContainer: function (el, container, offset = 0) { 6640 const eleTop = el.offsetTop; 6641 const eleBottom = eleTop + el.clientHeight + offset; 6642 const containerTop = container.scrollTop; 6643 const containerBottom = containerTop + container.clientHeight; 6644 6645 // The element is fully visible in the container 6646 return ( 6647 (eleTop >= containerTop && eleBottom <= containerBottom) 6648 ); 6649 }, 6650 6651 getRelativeTopPosition: function (el, container) { 6652 return el.offsetTop - container.offsetTop; 6653 }, 6654 6655 attr: function (el, name, value) { 6656 if (el == undefined) { 6657 return; 6658 } 6659 6660 if (value !== undefined) { 6661 el.setAttribute(name, value); 6662 } else { 6663 return el.getAttribute(name); 6664 } 6665 }, 6666 6667 hasAttr: function (el, name) { 6668 if (el == undefined) { 6669 return; 6670 } 6671 6672 return el.getAttribute(name) ? true : false; 6673 }, 6674 6675 removeAttr: function (el, name) { 6676 if (el == undefined) { 6677 return; 6678 } 6679 6680 el.removeAttribute(name); 6681 }, 6682 6683 animate: function (from, to, duration, update, easing, done) { 6684 /** 6685 * TinyAnimate.easings 6686 * Adapted from jQuery Easing 6687 */ 6688 var easings = {}; 6689 var easing; 6690 6691 easings.linear = function (t, b, c, d) { 6692 return c * t / d + b; 6693 }; 6694 6695 easing = easings.linear; 6696 6697 // Early bail out if called incorrectly 6698 if (typeof from !== 'number' || 6699 typeof to !== 'number' || 6700 typeof duration !== 'number' || 6701 typeof update !== 'function') { 6702 return; 6703 } 6704 6705 // Create mock done() function if necessary 6706 if (typeof done !== 'function') { 6707 done = function () { }; 6708 } 6709 6710 // Pick implementation (requestAnimationFrame | setTimeout) 6711 var rAF = window.requestAnimationFrame || function (callback) { 6712 window.setTimeout(callback, 1000 / 50); 6713 }; 6714 6715 // Animation loop 6716 var canceled = false; 6717 var change = to - from; 6718 6719 function loop(timestamp) { 6720 var time = (timestamp || +new Date()) - start; 6721 6722 if (time >= 0) { 6723 update(easing(time, from, change, duration)); 6724 } 6725 if (time >= 0 && time >= duration) { 6726 update(to); 6727 done(); 6728 } else { 6729 rAF(loop); 6730 } 6731 } 6732 6733 update(from); 6734 6735 // Start animation loop 6736 var start = window.performance && window.performance.now ? window.performance.now() : +new Date(); 6737 6738 rAF(loop); 6739 }, 6740 6741 actualCss: function (el, prop, cache) { 6742 var css = ''; 6743 6744 if (el instanceof HTMLElement === false) { 6745 return; 6746 } 6747 6748 if (!el.getAttribute('kt-hidden-' + prop) || cache === false) { 6749 var value; 6750 6751 // the element is hidden so: 6752 // making the el block so we can meassure its height but still be hidden 6753 css = el.style.cssText; 6754 el.style.cssText = 'position: absolute; visibility: hidden; display: block;'; 6755 6756 if (prop == 'width') { 6757 value = el.offsetWidth; 6758 } else if (prop == 'height') { 6759 value = el.offsetHeight; 6760 } 6761 6762 el.style.cssText = css; 6763 6764 // store it in cache 6765 el.setAttribute('kt-hidden-' + prop, value); 6766 6767 return parseFloat(value); 6768 } else { 6769 // store it in cache 6770 return parseFloat(el.getAttribute('kt-hidden-' + prop)); 6771 } 6772 }, 6773 6774 actualHeight: function (el, cache) { 6775 return KTUtil.actualCss(el, 'height', cache); 6776 }, 6777 6778 actualWidth: function (el, cache) { 6779 return KTUtil.actualCss(el, 'width', cache); 6780 }, 6781 6782 getScroll: function (element, method) { 6783 // The passed in `method` value should be 'Top' or 'Left' 6784 method = 'scroll' + method; 6785 return (element == window || element == document) ? ( 6786 self[(method == 'scrollTop') ? 'pageYOffset' : 'pageXOffset'] || 6787 (browserSupportsBoxModel && document.documentElement[method]) || 6788 document.body[method] 6789 ) : element[method]; 6790 }, 6791 6792 css: function (el, styleProp, value, important) { 6793 if (!el) { 6794 return; 6795 } 6796 6797 if (value !== undefined) { 6798 if (important === true) { 6799 el.style.setProperty(styleProp, value, 'important'); 6800 } else { 6801 el.style[styleProp] = value; 6802 } 6803 } else { 6804 var defaultView = (el.ownerDocument || document).defaultView; 6805 6806 // W3C standard way: 6807 if (defaultView && defaultView.getComputedStyle) { 6808 // sanitize property name to css notation 6809 // (hyphen separated words eg. font-Size) 6810 styleProp = styleProp.replace(/([A-Z])/g, "-$1").toLowerCase(); 6811 6812 return defaultView.getComputedStyle(el, null).getPropertyValue(styleProp); 6813 } else if (el.currentStyle) { // IE 6814 // sanitize property name to camelCase 6815 styleProp = styleProp.replace(/\-(\w)/g, function (str, letter) { 6816 return letter.toUpperCase(); 6817 }); 6818 6819 value = el.currentStyle[styleProp]; 6820 6821 // convert other units to pixels on IE 6822 if (/^\d+(em|pt|%|ex)?$/i.test(value)) { 6823 return (function (value) { 6824 var oldLeft = el.style.left, oldRsLeft = el.runtimeStyle.left; 6825 6826 el.runtimeStyle.left = el.currentStyle.left; 6827 el.style.left = value || 0; 6828 value = el.style.pixelLeft + "px"; 6829 el.style.left = oldLeft; 6830 el.runtimeStyle.left = oldRsLeft; 6831 6832 return value; 6833 })(value); 6834 } 6835 6836 return value; 6837 } 6838 } 6839 }, 6840 6841 slide: function (el, dir, speed, callback, recalcMaxHeight) { 6842 if (!el || (dir == 'up' && KTUtil.visible(el) === false) || (dir == 'down' && KTUtil.visible(el) === true)) { 6843 return; 6844 } 6845 6846 speed = (speed ? speed : 600); 6847 var calcHeight = KTUtil.actualHeight(el); 6848 var calcPaddingTop = false;
6849 var calcPaddingBottom = false; 6850 6851 if (KTUtil.css(el, 'padding-top') && KTUtil.data(el).has('slide-padding-top') !== true) { 6852 KTUtil.data(el).set('slide-padding-top', KTUtil.css(el, 'padding-top')); 6853 } 6854 6855 if (KTUtil.css(el, 'padding-bottom') && KTUtil.data(el).has('slide-padding-bottom') !== true) { 6856 KTUtil.data(el).set('slide-padding-bottom', KTUtil.css(el, 'padding-bottom')); 6857 } 6858 6859 if (KTUtil.data(el).has('slide-padding-top')) { 6860 calcPaddingTop = parseInt(KTUtil.data(el).get('slide-padding-top')); 6861 } 6862 6863 if (KTUtil.data(el).has('slide-padding-bottom')) { 6864 calcPaddingBottom = parseInt(KTUtil.data(el).get('slide-padding-bottom')); 6865 } 6866 6867 if (dir == 'up') { // up 6868 el.style.cssText = 'display: block; overflow: hidden;'; 6869 6870 if (calcPaddingTop) { 6871 KTUtil.animate(0, calcPaddingTop, speed, function (value) { 6872 el.style.paddingTop = (calcPaddingTop - value) + 'px'; 6873 }, 'linear'); 6874 } 6875 6876 if (calcPaddingBottom) { 6877 KTUtil.animate(0, calcPaddingBottom, speed, function (value) { 6878 el.style.paddingBottom = (calcPaddingBottom - value) + 'px'; 6879 }, 'linear'); 6880 } 6881 6882 KTUtil.animate(0, calcHeight, speed, function (value) { 6883 el.style.height = (calcHeight - value) + 'px'; 6884 }, 'linear', function () { 6885 el.style.height = ''; 6886 el.style.display = 'none'; 6887 6888 if (typeof callback === 'function') { 6889 callback(); 6890 } 6891 }); 6892 6893 6894 } else if (dir == 'down') { // down 6895 el.style.cssText = 'display: block; overflow: hidden;'; 6896 6897 if (calcPaddingTop) { 6898 KTUtil.animate(0, calcPaddingTop, speed, function (value) {// 6899 el.style.paddingTop = value + 'px'; 6900 }, 'linear', function () { 6901 el.style.paddingTop = ''; 6902 }); 6903 } 6904 6905 if (calcPaddingBottom) { 6906 KTUtil.animate(0, calcPaddingBottom, speed, function (value) { 6907 el.style.paddingBottom = value + 'px'; 6908 }, 'linear', function () { 6909 el.style.paddingBottom = ''; 6910 }); 6911 } 6912 6913 KTUtil.animate(0, calcHeight, speed, function (value) { 6914 el.style.height = value + 'px'; 6915 }, 'linear', function () { 6916 el.style.height = ''; 6917 el.style.display = ''; 6918 el.style.overflow = ''; 6919 6920 if (typeof callback === 'function') { 6921 callback(); 6922 } 6923 }); 6924 } 6925 }, 6926 6927 slideUp: function (el, speed, callback) { 6928 KTUtil.slide(el, 'up', speed, callback); 6929 }, 6930 6931 slideDown: function (el, speed, callback) { 6932 KTUtil.slide(el, 'down', speed, callback); 6933 }, 6934 6935 show: function (el, display) { 6936 if (typeof el !== 'undefined') { 6937 el.style.display = (display ? display : 'block'); 6938 } 6939 }, 6940 6941 hide: function (el) { 6942 if (typeof el !== 'undefined') { 6943 el.style.display = 'none'; 6944 } 6945 }, 6946 6947 addEvent: function (el, type, handler, one) { 6948 if (typeof el !== 'undefined' && el !== null) { 6949 el.addEventListener(type, handler); 6950 } 6951 }, 6952 6953 removeEvent: function (el, type, handler) { 6954 if (el !== null) { 6955 el.removeEventListener(type, handler); 6956 } 6957 }, 6958 6959 on: function (element, selector, event, handler) { 6960 if (element === null) { 6961 return; 6962 } 6963 6964 var eventId = KTUtil.getUniqueId('event'); 6965 6966 window.KTUtilDelegatedEventHandlers[eventId] = function (e) { 6967 var targets = element.querySelectorAll(selector); 6968 var target = e.target; 6969 6970 while (target && target !== element) { 6971 for (var i = 0, j = targets.length; i < j; i++) { 6972 if (target === targets[i]) { 6973 handler.call(target, e); 6974 } 6975 } 6976 6977 target = target.parentNode; 6978 } 6979 } 6980 6981 KTUtil.addEvent(element, event, window.KTUtilDelegatedEventHandlers[eventId]); 6982 6983 return eventId; 6984 }, 6985 6986 off: function (element, event, eventId) { 6987 if (!element || !window.KTUtilDelegatedEventHandlers[eventId]) { 6988 return; 6989 } 6990 6991 KTUtil.removeEvent(element, event, window.KTUtilDelegatedEventHandlers[eventId]); 6992 6993 delete window.KTUtilDelegatedEventHandlers[eventId]; 6994 }, 6995 6996 one: function onetime(el, type, callback) { 6997 el.addEventListener(type, function callee(e) { 6998 // remove event 6999 if (e.target && e.target.removeEventListener) { 7000 e.target.removeEventListener(e.type, callee); 7001 } 7002
7003 // need to verify from https://themeforest.net/author_dashboard#comment_23615588 7004 if (el && el.removeEventListener) { 7005 e.currentTarget.removeEventListener(e.type, callee); 7006 } 7007 7008 // call handler 7009 return callback(e); 7010 }); 7011 }, 7012 7013 hash: function (str) { 7014 var hash = 0, 7015 i, chr; 7016 7017 if (str.length === 0) return hash; 7018 for (i = 0; i < str.length; i++) { 7019 chr = str.charCodeAt(i); 7020 hash = ((hash << 5) - hash) + chr; 7021 hash |= 0; // Convert to 32bit integer 7022 } 7023 7024 return hash; 7025 }, 7026 7027 animateClass: function (el, animationName, callback) { 7028 var animation; 7029 var animations = { 7030 animation: 'animationend', 7031 OAnimation: 'oAnimationEnd', 7032 MozAnimation: 'mozAnimationEnd', 7033 WebkitAnimation: 'webkitAnimationEnd', 7034 msAnimation: 'msAnimationEnd', 7035 }; 7036 7037 for (var t in animations) { 7038 if (el.style[t] !== undefined) { 7039 animation = animations[t]; 7040 } 7041 } 7042 7043 KTUtil.addClass(el, animationName); 7044 7045 KTUtil.one(el, animation, function () { 7046 KTUtil.removeClass(el, animationName); 7047 }); 7048 7049 if (callback) { 7050 KTUtil.one(el, animation, callback); 7051 } 7052 }, 7053 7054 transitionEnd: function (el, callback) { 7055 var transition; 7056 var transitions = { 7057 transition: 'transitionend', 7058 OTransition: 'oTransitionEnd', 7059 MozTransition: 'mozTransitionEnd', 7060 WebkitTransition: 'webkitTransitionEnd', 7061 msTransition: 'msTransitionEnd' 7062 }; 7063 7064 for (var t in transitions) { 7065 if (el.style[t] !== undefined) { 7066 transition = transitions[t]; 7067 } 7068 } 7069 7070 KTUtil.one(el, transition, callback); 7071 }, 7072 7073 animationEnd: function (el, callback) { 7074 var animation; 7075 var animations = { 7076 animation: 'animationend', 7077 OAnimation: 'oAnimationEnd', 7078 MozAnimation: 'mozAnimationEnd', 7079 WebkitAnimation: 'webkitAnimationEnd', 7080 msAnimation: 'msAnimationEnd' 7081 }; 7082 7083 for (var t in animations) { 7084 if (el.style[t] !== undefined) { 7085 animation = animations[t]; 7086 } 7087 } 7088 7089 KTUtil.one(el, animation, callback); 7090 }, 7091 7092 animateDelay: function (el, value) { 7093 var vendors = ['webkit-', 'moz-', 'ms-', 'o-', '']; 7094 for (var i = 0; i < vendors.length; i++) { 7095 KTUtil.css(el, vendors[i] + 'animation-delay', value); 7096 } 7097 }, 7098 7099 animateDuration: function (el, value) { 7100 var vendors = ['webkit-', 'moz-', 'ms-', 'o-', '']; 7101 for (var i = 0; i < vendors.length; i++) { 7102 KTUtil.css(el, vendors[i] + 'animation-duration', value); 7103 } 7104 }, 7105 7106 scrollTo: function (target, offset, duration) { 7107 var duration = duration ? duration : 500; 7108 var targetPos = target ? KTUtil.offset(target).top : 0; 7109 var scrollPos = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0; 7110 var from, to; 7111 7112 if (offset) { 7113 targetPos = targetPos - offset; 7114 } 7115 7116 from = scrollPos; 7117 to = targetPos; 7118 7119 KTUtil.animate(from, to, duration, function (value) { 7120 document.documentElement.scrollTop = value; 7121 document.body.parentNode.scrollTop = value; 7122 document.body.scrollTop = value; 7123 }); //, easing, done 7124 }, 7125 7126 scrollTop: function (offset, duration) { 7127 KTUtil.scrollTo(null, offset, duration); 7128 }, 7129 7130 isArray: function (obj) { 7131 return obj && Array.isArray(obj); 7132 }, 7133 7134 isEmpty: function (obj) { 7135 for (var prop in obj) { 7136 if (obj.hasOwnProperty(prop)) { 7137 return false; 7138 } 7139 } 7140 7141 return true; 7142 }, 7143 7144 numberString: function (nStr) { 7145 nStr += ''; 7146 var x = nStr.split('.'); 7147 var x1 = x[0]; 7148 var x2 = x.length > 1 ? '.' + x[1] : ''; 7149 var rgx = /(\d+)(\d{3})/; 7150 while (rgx.test(x1)) { 7151 x1 = x1.replace(rgx, '$1' + ',' + '$2'); 7152 } 7153 return x1 + x2; 7154 }, 7155 7156 isRTL: function () { 7157 return (document.querySelector('html').getAttribute("direction") === 'rtl'); 7158 }, 7159 7160 snakeToCamel: function (s) { 7161 return s.replace(/(\-\w)/g, function (m) { return m[1].toUpperCase(); }); 7162 }, 7163 7164 filterBoolean: function (val) { 7165 // Convert string boolean 7166 if (val === true || val === 'true') { 7167 return true; 7168 } 7169 7170 if (val === false || val === 'false') { 7171 return false;
7172 } 7173 7174 return val; 7175 }, 7176 7177 setHTML: function (el, html) { 7178 el.innerHTML = html; 7179 }, 7180 7181 getHTML: function (el) { 7182 if (el) { 7183 return el.innerHTML; 7184 } 7185 }, 7186 7187 getDocumentHeight: function () { 7188 var body = document.body; 7189 var html = document.documentElement; 7190 7191 return Math.max(body.scrollHeight, body.offsetHeight, html.clientHeight, html.scrollHeight, html.offsetHeight); 7192 }, 7193 7194 getScrollTop: function () { 7195 return (document.scrollingElement || document.documentElement).scrollTop; 7196 }, 7197 7198 colorLighten: function (color, amount) { 7199 const addLight = function (color, amount) { 7200 let cc = parseInt(color, 16) + amount; 7201 let c = (cc > 255) ? 255 : (cc); 7202 c = (c.toString(16).length > 1) ? c.toString(16) : `0${c.toString(16)}`; 7203 return c; 7204 } 7205 7206 color = (color.indexOf("#") >= 0) ? color.substring(1, color.length) : color; 7207 amount = parseInt((255 * amount) / 100); 7208 7209 return color = `#${addLight(color.substring(0, 2), amount)}${addLight(color.substring(2, 4), amount)}${addLight(color.substring(4, 6), amount)}`; 7210 }, 7211 7212 colorDarken: function (color, amount) { 7213 const subtractLight = function (color, amount) { 7214 let cc = parseInt(color, 16) - amount; 7215 let c = (cc < 0) ? 0 : (cc); 7216 c = (c.toString(16).length > 1) ? c.toString(16) : `0${c.toString(16)}`; 7217 7218 return c; 7219 } 7220 7221 color = (color.indexOf("#") >= 0) ? color.substring(1, color.length) : color; 7222 amount = parseInt((255 * amount) / 100); 7223 7224 return color = `#${subtractLight(color.substring(0, 2), amount)}${subtractLight(color.substring(2, 4), amount)}${subtractLight(color.substring(4, 6), amount)}`; 7225 }, 7226 7227 // Throttle function: Input as function which needs to be throttled and delay is the time interval in milliseconds 7228 throttle: function (timer, func, delay) { 7229 // If setTimeout is already scheduled, no need to do anything 7230 if (timer) { 7231 return; 7232 } 7233 7234 // Schedule a setTimeout after delay seconds 7235 timer = setTimeout(function () { 7236 func(); 7237 7238 // Once setTimeout function execution is finished, timerId = undefined so that in <br> 7239 // the next scroll event function execution can be scheduled by the setTimeout 7240 timer = undefined; 7241 }, delay); 7242 }, 7243 7244 // Debounce function: Input as function which needs to be debounced and delay is the debounced time in milliseconds 7245 debounce: function (timer, func, delay) { 7246 // Cancels the setTimeout method execution 7247 clearTimeout(timer) 7248 7249 // Executes the func after delay time. 7250 timer = setTimeout(func, delay); 7251 }, 7252 7253 parseJson: function (value) { 7254 if (typeof value === 'string') { 7255 value = value.replace(/'/g, "\""); 7256 7257 var jsonStr = value.replace(/(\w+:)|(\w+ :)/g, function (matched) { 7258 return '"' + matched.substring(0, matched.length - 1) + '":'; 7259 }); 7260 7261 try { 7262 value = JSON.parse(jsonStr); 7263 } catch (e) { } 7264 } 7265 7266 return value; 7267 }, 7268 7269 getResponsiveValue: function (value, defaultValue) { 7270 var width = this.getViewPort().width; 7271 var result = null; 7272 7273 value = KTUtil.parseJson(value); 7274 7275 if (typeof value === 'object') { 7276 var resultKey; 7277 var resultBreakpoint = -1; 7278 var breakpoint; 7279 7280 for (var key in value) { 7281 if (key === 'default') { 7282 breakpoint = 0; 7283 } else { 7284 breakpoint = this.getBreakpoint(key) ? this.getBreakpoint(key) : parseInt(key); 7285 } 7286 7287 if (breakpoint <= width && breakpoint > resultBreakpoint) { 7288 resultKey = key; 7289 resultBreakpoint = breakpoint; 7290 } 7291 } 7292 7293 if (resultKey) { 7294 result = value[resultKey]; 7295 } else { 7296 result = value; 7297 } 7298 } else { 7299 result = value; 7300 } 7301 7302 return result; 7303 }, 7304 7305 each: function (array, callback) { 7306 return [].slice.call(array).map(callback); 7307 }, 7308 7309 getSelectorMatchValue: function (value) { 7310 var result = null; 7311 value = KTUtil.parseJson(value); 7312 7313 if (typeof value === 'object') { 7314 // Match condition 7315 if (value['match'] !== undefined) { 7316 var selector = Object.keys(value['match'])[0]; 7317 value = Object.values(value['match'])[0]; 7318 7319 if (document.querySelector(selector) !== null) { 7320 result = value; 7321 } 7322 } 7323 } else { 7324 result = value; 7325 } 7326 7327 return result; 7328 }, 7329 7330 getConditionalValue: function (value) { 7331 var value = KTUtil.parseJson(value); 7332 var result = KTUtil.getResponsiveValue(value); 7333 7334 if (result !== null && result['match'] !== undefined) { 7335 result = KTUtil.getSelectorMatchValue(result); 7336 } 7337 7338 if (result === null && value !== null && value['default'] !== undefined) { 7339 result = value['default']; 7340 } 7341 7342 return result; 7343 }, 7344 7345 getCssVariableValue: function (variableName) { 7346 var hex = getComputedStyle(document.documentElement).getPropertyValue(variableName); 7347 if (hex && hex.length > 0) { 7348 hex = hex.trim(); 7349 } 7350 7351 return hex; 7352 }, 7353 7354 isInViewport: function (element) { 7355 var rect = element.getBoundingClientRect(); 7356 7357 return ( 7358 rect.top >= 0 && 7359 rect.left >= 0 && 7360 rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) && 7361 rect.right <= (window.innerWidth || document.documentElement.clientWidth) 7362 ); 7363 }, 7364 7365 isPartiallyInViewport: function (element) { 7366 let x = element.getBoundingClientRect().left; 7367 let y = element.getBoundingClientRect().top; 7368 let ww = Math.max(document.documentElement.clientWidth, window.innerWidth || 0); 7369 let hw = Math.max(document.documentElement.clientHeight, window.innerHeight || 0
7369); 7370 let w = element.clientWidth; 7371 let h = element.clientHeight; 7372 7373 return ( 7374 (y < hw && 7375 y + h > 0) && 7376 (x < ww && 7377 x + w > 0) 7378 ); 7379 }, 7380 7381 onDOMContentLoaded: function (callback) { 7382 if (document.readyState === 'loading') { 7383 document.addEventListener('DOMContentLoaded', callback); 7384 document.addEventListener('livewire:navigated', callback); 7385 } else { 7386 callback(); 7387 } 7388 }, 7389 7390 inIframe: function () { 7391 try { 7392 return window.self !== window.top; 7393 } catch (e) { 7394 return true; 7395 } 7396 }, 7397 7398 isHexColor(code) { 7399 return /^#[0-9A-F]{6}$/i.test(code); 7400 } 7401 } 7402}(); 7403 7404// Webpack support 7405if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') { 7406 module.exports = KTUtil; 7407} 7408"use strict"; 7409 7410// Class definition 7411var KTAppLayoutBuilder = function () { 7412 var form; 7413 var actionInput; 7414 var url; 7415 var previewButton; 7416 var exportButton; 7417 var resetButton; 7418 7419 var engage; 7420 var engageToggleOff; 7421 var engageToggleOn; 7422 var engagePrebuiltsModal; 7423 7424 var handleEngagePrebuilts = function () { 7425 if (engagePrebuiltsModal === null) { 7426 return; 7427 } 7428
7429 if (KTCookie.get("app_engage_prebuilts_modal_displayed") !== "1") { 7430 setTimeout(function () { 7431 const modal = new bootstrap.Modal(engagePrebuiltsModal); 7432 modal.show(); 7433 7434 const date = new Date(Date.now() + 30 * 24 * 60 * 60 * 1000); // 30 days from now 7435 KTCookie.set("app_engage_prebuilts_modal_displayed", "1", { expires: date }); 7436 }, 3000); 7437 } 7438 } 7439 7440 var handleEngagePrebuiltsViewMenu = function () { 7441 const selected = engagePrebuiltsModal.querySelector('[data-kt-element="selected"]'); 7442 const selectedTitle = engagePrebuiltsModal.querySelector('[data-kt-element="title"]'); 7443 const menu = engagePrebuiltsModal.querySelector('[data-kt-menu="true"]'); 7444 7445 // Toggle Handler 7446 KTUtil.on(engagePrebuiltsModal, '[data-kt-mode]', 'click', function (e) { 7447 const title = this.innerText; 7448 const mode = this.getAttribute("data-kt-mode"); 7449 const selectedLink = menu.querySelector('.menu-link.active'); 7450 const viewImage = document.querySelector('#kt_app_engage_prebuilts_view_image'); 7451 const viewText = document.querySelector('#kt_app_engage_prebuilts_view_text'); 7452 selectedTitle.innerText = title; 7453 7454 if (selectedLink) { 7455 selectedLink.classList.remove('active'); 7456 } 7457 7458 this.classList.add('active'); 7459 7460 if (mode === "image") { 7461 viewImage.classList.remove("d-none"); 7462 viewImage.classList.add("d-block"); 7463 viewText.classList.remove("d-block"); 7464 viewText.classList.add("d-none"); 7465 } else { 7466 viewText.classList.remove("d-none"); 7467 viewText.classList.add("d-block"); 7468 viewImage.classList.remove("d-block"); 7469 viewImage.classList.add("d-none"); 7470 } 7471 }); 7472 } 7473 7474 var handleEngageToggle = function () { 7475 engageToggleOff.addEventListener("click", function (e) { 7476 e.preventDefault(); 7477 7478 const date = new Date(Date.now() + 1 * 24 * 60 * 60 * 1000); // 1 days from now 7479 KTCookie.set("app_engage_hide", "1", { expires: date }); 7480 engage.classList.add('app-engage-hide'); 7481 }); 7482 7483 engageToggleOn.addEventListener("click", function (e) { 7484 e.preventDefault(); 7485 7486 KTCookie.remove("app_engage_hide"); 7487 engage.classList.remove('app-engage-hide'); 7488 }); 7489 } 7490 7491 var handlePreview = function () { 7492 previewButton.addEventListener("click", function (e) { 7493 e.preventDefault(); 7494 7495 // Set form action value 7496 actionInput.value = "preview"; 7497 7498 // Show progress 7499 previewButton.setAttribute("data-kt-indicator", "on"); 7500 7501 // Prepare form data 7502 var data = $(form).serialize(); 7503 7504 // Submit 7505 $.ajax({ 7506 type: "POST", 7507 dataType: "html", 7508 url: url, 7509 data: data, 7510 success: function (response, status, xhr) { 7511 if (history.scrollRestoration) { 7512 history.scrollRestoration = 'manual'; 7513 } 7514 location.reload(); 7515 return; 7516 7517 toastr.success( 7518 "Preview has been updated with current configured layout.", 7519 "Preview updated!", 7520 { timeOut: 0, extendedTimeOut: 0, closeButton: true, closeDuration: 0 } 7521 ); 7522 7523 setTimeout(function () { 7524 location.reload(); // reload page 7525 }, 1500); 7526 }, 7527 error: function (response) { 7528 toastr.error( 7529 "Please try it again later.", 7530 "Something went wrong!", 7531 { timeOut: 0, extendedTimeOut: 0, closeButton: true, closeDuration: 0 } 7532 ); 7533 }, 7534 complete: function () { 7535 previewButton.removeAttribute("data-kt-indicator"); 7536 } 7537 }); 7538 }); 7539 }; 7540 7541 var handleExport = function () { 7542 exportButton.addEventListener("click", function (e) { 7543 e.preventDefault(); 7544 7545 toastr.success( 7546 "Process has been started and it may take a while.", 7547 "Generating HTML!", 7548 { timeOut: 0, extendedTimeOut: 0, closeButton: true, closeDuration: 0 } 7549 ); 7550 7551 // Show progress 7552 exportButton.setAttribute("data-kt-indicator", "on"); 7553 7554 // Set form action value 7555 actionInput.value = "export"; 7556 7557 // Prepare form data 7558 var data = $(form).serialize(); 7559 7560 $.ajax({ 7561 type: "POST", 7562 dataType: "html", 7563 url: url, 7564 data: data, 7565 success: function (response, status, xhr) { 7566 var timer = setInterval(function () { 7567 $("<iframe/>").attr({ 7568 src: url + "?layout-builder[action]=export&download=1&output=" + response, 7569 style: "visibility:hidden;display:none", 7570 }).ready(function () { 7571 // Stop the timer 7572 clearInterval(timer); 7573 7574 exportButton.removeAttribute("data-kt-indicator"); 7575 }).appendTo("body"); 7576 }, 3000); 7577 }, 7578 error: function (response) { 7579 toastr.error( 7580 "Please try it again later.", 7581 "Something went wrong!", 7582 { timeOut: 0, extendedTimeOut: 0, closeButton: true, closeDuration: 0 } 7583 ); 7584 7585 exportButton.removeAttribute("data-kt-indicator"); 7586 }, 7587 }); 7588 }); 7589 }; 7590 7591 var handleReset = function () { 7592 resetButton.addEventListener("click", function (e) { 7593 e.preventDefault(); 7594 7595 // Show progress 7596 resetButton.setAttribute("data-kt-indicator", "on"); 7597 7598 // Set form action value 7599 actionInput.value = "reset"; 7600 7601 // Prepare form data 7602 var data = $(form).serialize(); 7603 7604 $.ajax({ 7605 type: "POST", 7606 dataType: "html", 7607 url: url, 7608 data: data, 7609 success: function (response, status, xhr) { 7610 if (history.scrollRestoration) { 7611 history.scrollRestoration = 'manual'; 7612 } 7613 7614 location.reload(); 7615 return; 7616 7617 toastr.success( 7618 "Preview has been successfully reset and the page will be reloaded.", 7619 "Reset Preview!", 7620 { timeOut: 0, extendedTimeOut: 0, closeButton: true, closeDuration: 0 } 7621 ); 7622 7623 setTimeout(function () { 7624 location.reload(); // reload page 7625 }, 1500); 7626 }, 7627 error: function (response) { 7628 toastr.error( 7629 "Please try it again later.", 7630 "Something went wrong!", 7631 { timeOut: 0, extendedTimeOut: 0, closeButton: true, closeDuration: 0 } 7632 ); 7633 }, 7634 complete: function () { 7635 resetButton.removeAttribute("data-kt-indicator"); 7636 }, 7637 }); 7638 }); 7639 }; 7640 7641 var handleThemeMode = function () { 7642 var checkLight = document.querySelector('#kt_layout_builder_theme_mode_light'); 7643 var checkDark = document.querySelector('#kt_layout_builder_theme_mode_dark'); 7644 var check = document.querySelector('#kt_layout_builder_theme_mode_' + KTThemeMode.getMode()); 7645 7646 if (checkLight) { 7647 checkLight.addEventListener("click", function () { 7648 this.checked = true; 7649 this.closest('[data-kt-buttons="true"]').querySelector('.form-check-image.active').classList.remove('active'); 7650 this.closest('.form-check-image').classList.add('active'); 7651 KTThemeMode.setMode('light'); 7652 }); 7653 } 7654 7655 if (checkDark) { 7656 checkDark.addEventListener("click", function () { 7657 this.checked = true; 7658 this.closest('[data-kt-buttons="true"]').querySelector('.form-check-image.active').classList.remove('active'); 7659 this.closest('.form-check-image').classList.add('active'); 7660 KTThemeMode.setMode('dark'); 7661 }); 7662 } 7663 7664 if (check) { 7665 check.closest('.form-check-image').classList.add('active'); 7666 check.checked = true; 7667 } 7668 } 7669 7670 return { 7671 // Public functions 7672 init: function () { 7673 engage = document.querySelector('#kt_app_engage'); 7674 engageToggleOn = document.querySelector('#kt_app_engage_toggle_on'); 7675 engageToggleOff = document.querySelector('#kt_app_engage_toggle_off'); 7676 engagePrebuiltsModal = document.querySelector('#kt_app_engage_prebuilts_modal'); 7677 7678 if (engage && engagePrebuiltsModal) { 7679 handleEngagePrebuilts(); 7680 handleEngagePrebuiltsViewMenu(); 7681 } 7682 7683 if (engage && engageToggleOn && engageToggleOff) { 7684 handleEngageToggle(); 7685 } 7686 7687 form = document.querySelector("#kt_app_layout_builder_form"); 7688 7689 if (!form) { 7690 return; 7691 } 7692 7693 url = form.getAttribute("action"); 7694 actionInput = document.querySelector("#kt_app_layout_builder_action"); 7695 previewButton = document.querySelector("#kt_app_layout_builder_preview"); 7696 exportButton = document.querySelector("#kt_app_layout_builder_export"); 7697 resetButton = document.querySelector("#kt_app_layout_builder_reset"); 7698 7699 if (previewButton) { 7700 handlePreview(); 7701 } 7702 7703 if (exportButton) { 7704 handleExport(); 7705 } 7706 7707 if (resetButton) { 7708 handleReset(); 7709 } 7710 7711 handleThemeMode(); 7712 } 7713 }; 7714}(); 7715 7716// On document ready 7717KTUtil.onDOMContentLoaded(function () { 7718 KTAppLayoutBuilder.init(); 7719}); 7720"use strict"; 7721 7722// Class definition 7723var KTLayoutSearch = function () { 7724 // Private variables 7725 var element; 7726 var formElement; 7727 var mainElement; 7728 var resultsElement; 7729 var wrapperElement; 7730 var emptyElement; 7731 7732 var preferencesElement; 7733 var preferencesShowElement; 7734 var preferencesDismissElement; 7735 7736 var advancedOptionsFormElement; 7737 var advancedOptionsFormShowElement; 7738 var advancedOptionsFormCancelElement; 7739 var advancedOptionsFormSearchElement; 7740 7741 var searchObject; 7742 7743 // Private functions 7744 var processs = function (search) { 7745 var timeout = setTimeout(function () { 7746 var number = KTUtil.getRandomInt(1, 3); 7747 7748 // Hide recently viewed 7749 mainElement.classList.add('d-none'); 7750 7751 if (number === 3) { 7752 // Hide results 7753 resultsElement.classList.add('d-none'); 7754 // Show empty message 7755 emptyElement.classList.remove('d-none'); 7756 } else { 7757 // Show results 7758 resultsElement.classList.remove('d-none'); 7759 // Hide empty message 7760 emptyElement.classList.add('d-none'); 7761 } 7762 7763 // Complete search 7764 search.complete(); 7765 }, 1500); 7766 } 7767 7768 var processsAjax = function (search) { 7769 // Hide recently viewed 7770 mainElement.classList.add('d-none'); 7771 7772 // Learn more: https://axios-http.com/docs/intro 7773 axios.post('/search.php', { 7774 query: searchObject.getQuery() 7775 }) 7776 .then(function (response) { 7777 // Populate results 7778 resultsElement.innerHTML = response; 7779 // Show results 7780 resultsElement.classList.remove('d-none'); 7781 // Hide empty message 7782 emptyElement.classList.add('d-none'); 7783 7784 // Complete search 7785 search.complete(); 7786 }) 7787 .catch(function (error) { 7788 // Hide results 7789 resultsElement.classList.add('d-none'); 7790 // Show empty message 7791 emptyElement.classList.remove('d-none'); 7792 7793 // Complete search 7794 search.complete(); 7795 }); 7796 } 7797 7798 var clear = function (search) { 7799 // Show recently viewed 7800 mainElement.classList.remove('d-none'); 7801 // Hide results 7802 resultsElement.classList.add('d-none'); 7803 // Hide empty message 7804 emptyElement.classList.add('d-none'); 7805 } 7806 7807 var handlePreferences = function () { 7808 // Preference show handler 7809 if (preferencesShowElement) { 7810 preferencesShowElement.addEventListener('click', function () { 7811 wrapperElement.classList.add('d-none'); 7812 preferencesElement.classList.remove('d-none'); 7813 }); 7814 } 7815 7816 // Preference dismiss handler 7817 if (preferencesDismissElement) { 7818 preferencesDismissElement.addEventListener('click', function () { 7819 wrapperElement.classList.remove('d-none'); 7820 preferencesElement.classList.add('d-none'); 7821 }); 7822 } 7823 } 7824 7825 var handleAdvancedOptionsForm = function () { 7826 // Show 7827 if (advancedOptionsFormShowElement) { 7828 advancedOptionsFormShowElement.addEventListener('click', function () { 7829 wrapperElement.classList.add('d-none'); 7830 advancedOptionsFormElement.classList.remove('d-none'); 7831 }); 7832 } 7833 7834 // Cancel 7835 if (advancedOptionsFormCancelElement) { 7836 advancedOptionsFormCancelElement.addEventListener('click', function () { 7837 wrapperElement.classList.remove('d-none'); 7838 advancedOptionsFormElement.classList.add('d-none'); 7839 }); 7840 } 7841 } 7842 7843 // Public methods 7844 return { 7845 init: function () { 7846 // Elements 7847 element = document.querySelector('#kt_header_search'); 7848 7849 if (!element) { 7850 return; 7851 } 7852 7853 wrapperElement = element.querySelector('[data-kt-search-element="wrapper"]'); 7854 formElement = element.querySelector('[data-kt-search-element="form"]'); 7855 mainElement = element.querySelector('[data-kt-search-element="main"]'); 7856 resultsElement = element.querySelector('[data-kt-search-element="results"]'); 7857 emptyElement = element.querySelector('[data-kt-search-element="empty"]'); 7858 7859 preferencesElement = element.querySelector('[data-kt-search-element="preferences"]'); 7860 preferencesShowElement = element.querySelector('[data-kt-search-element="preferences-show"]'); 7861 preferencesDismissElement = element.querySelector('[data-kt-search-element="preferences-dismiss"]'); 7862 7863 advancedOptionsFormElement = element.querySelector('[data-kt-search-element="advanced-options-form"]'); 7864 advancedOptionsFormShowElement = element.querySelector('[data-kt-search-element="advanced-options-form-show"]'); 7865 advancedOptionsFormCancelElement = element.querySelector('[data-kt-search-element="advanced-options-form-cancel"]'); 7866 advancedOptionsFormSearchElement = element.querySelector('[data-kt-search-element="advanced-options-form-search"]'); 7867 7868 // Initialize search handler 7869 searchObject = new KTSearch(element); 7870 7871 // Demo search handler 7872 searchObject.on('kt.search.process', processs); 7873 7874 // Ajax search handler 7875 //searchObject.on('kt.search.process', processsAjax); 7876 7877 // Clear handler 7878 searchObject.on('kt.search.clear', clear); 7879 7880 // Custom handlers 7881 if (preferencesElement) { 7882 handlePreferences(); 7883 } 7884 7885 if (advancedOptionsFormElement) { 7886 handleAdvancedOptionsForm(); 7887 } 7888 } 7889 }; 7890}(); 7891 7892// On document ready 7893KTUtil.onDOMContentLoaded(function () { 7894 KTLayoutSearch.init(); 7895}); 7896"use strict"; 7897 7898// Class definition 7899var KTThemeModeUser = function () { 7900 7901 var handleSubmit = function () { 7902 // Update chart on theme mode change 7903 KTThemeMode.on("kt.thememode.change", function () { 7904 var menuMode = KTThemeMode.getMenuMode(); 7905 var mode = KTThemeMode.getMode(); 7906 console.log("user selected theme mode:" + menuMode); 7907 console.log("theme mode:" + mode); 7908 7909 // Submit selected theme mode menu option via ajax and 7910 // store it in user profile and set the user opted theme mode via HTML attribute 7911 // <html data-theme-mode="light"> .... </html> 7912 }); 7913 } 7914 7915 return { 7916 init: function () { 7917 handleSubmit(); 7918 } 7919 }; 7920}(); 7921 7922// Initialize app on document ready 7923KTUtil.onDOMContentLoaded(function () { 7924 KTThemeModeUser.init(); 7925}); 7926 7927// Declare KTThemeModeUser for Webpack support 7928if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') { 7929 module.exports = KTThemeModeUser; 7930} 7931"use strict"; 7932 7933// Class definition 7934var KTThemeMode = function () { 7935 var menu; 7936 var callbacks = []; 7937 var the = this; 7938 7939 var getMode = function () { 7940 var mode; 7941 7942 if (document.documentElement.hasAttribute("data-bs-theme")) { 7943 return document.documentElement.getAttribute("data-bs-theme"); 7944 } else if (localStorage.getItem("data-bs-theme") !== null) { 7945 return localStorage.getItem("data-bs-theme"); 7946 } else if (getMenuMode() === "system") { 7947 return getSystemMode(); 7948 } 7949 7950 return "light"; 7951 } 7952 7953 var setMode = function (mode, menuMode) { 7954 var currentMode = getMode(); 7955 7956 // Reset mode if system mode was changed 7957 if (menuMode === 'system') { 7958 if (getSystemMode() !== mode) { 7959 mode = getSystemMode(); 7960 } 7961 } else if (mode !== menuMode) { 7962 menuMode = mode; 7963 } 7964 7965 // Read active menu mode value 7966 var activeMenuItem = menu ? menu.querySelector('[data-kt-element="mode"][data-kt-value="' + menuMode + '"]') : null; 7967 7968 // Enable switching state 7969 document.documentElement.setAttribute("data-kt-theme-mode-switching", "true"); 7970 7971 // Set mode to the target document.documentElement 7972 document.documentElement.setA
7972ttribute("data-bs-theme", mode); 7973 7974 // Disable switching state 7975 setTimeout(function () { 7976 document.documentElement.removeAttribute("data-kt-theme-mode-switching"); 7977 }, 300); 7978 7979 // Store mode value in storage 7980 localStorage.setItem("data-bs-theme", mode); 7981 7982 // Set active menu item 7983 if (activeMenuItem) { 7984 localStorage.setItem("data-bs-theme-mode", menuMode); 7985 setActiveMenuItem(activeMenuItem); 7986 } 7987 7988 if (mode !== currentMode) { 7989 KTEventHandler.trigger(document.documentElement, 'kt.thememode.change', the); 7990 } 7991 } 7992 7993 var getMenuMode = function () { 7994 if (!menu) { 7995 return null; 7996 } 7997 7998 var menuItem = menu ? menu.querySelector('.active[data-kt-element="mode"]') : null; 7999 8000 if (menuItem && menuItem.getAttribute('data-kt-value')) { 8001 return menuItem.getAttribute('data-kt-value'); 8002 } else if (document.documentElement.hasAttribute("data-bs-theme-mode")) { 8003 return document.documentElement.getAttribute("data-bs-theme-mode") 8004 } else if (localStorage.getItem("data-bs-theme-mode") !== null) { 8005 return localStorage.getItem("data-bs-theme-mode"); 8006 } else { 8007 return typeof defaultThemeMode !== "undefined" ? defaultThemeMode : "light"; 8008 } 8009 } 8010 8011 var getSystemMode = function () { 8012 return window.matchMedia('(prefers-color-scheme: dark)').matches ? "dark" : "light"; 8013 } 8014 8015 var initMode = function () { 8016 setMode(getMode(), getMenuMode()); 8017 KTEventHandler.trigger(document.documentElement, 'kt.thememode.init', the); 8018 } 8019 8020 var getActiveMenuItem = function () { 8021 return menu.querySelector('[data-kt-element="mode"][data-kt-value="' + getMenuMode() + '"]'); 8022 } 8023 8024 var setActiveMenuItem = function (item) { 8025 var menuMode = item.getAttribute("data-kt-value"); 8026 8027 var activeItem = menu.querySelector('.active[data-kt-element="mode"]'); 8028 8029 if (activeItem) { 8030 activeItem.classList.remove("active"); 8031 } 8032 8033 item.classList.add("active"); 8034 localStorage.setItem("data-bs-theme-mode", menuMode); 8035 } 8036 8037 var handleMenu = function () { 8038 var items = [].slice.call(menu.querySelectorAll('[data-kt-element="mode"]')); 8039 8040 items.map(function (item) { 8041 item.addEventListener("click", function (e) { 8042 e.preventDefault(); 8043 8044 var menuMode = item.getAttribute("data-kt-value"); 8045 var mode = menuMode; 8046 8047 if (menuMode === "system") { 8048 mode = getSystemMode(); 8049 } 8050 8051 setMode(mode, menuMode); 8052 }); 8053 }); 8054 } 8055 8056 return { 8057 init: function () { 8058 menu = document.querySelector('[data-kt-element="theme-mode-menu"]'); 8059 8060 initMode(); 8061 8062 if (menu) { 8063 handleMenu(); 8064 } 8065 }, 8066 8067 getMode: function () { 8068 return getMode(); 8069 }, 8070 8071 getMenuMode: function () { 8072 return getMenuMode(); 8073 }, 8074 8075 getSystemMode: function () { 8076 return getSystemMode(); 8077 }, 8078 8079 setMode: function (mode) { 8080 return setMode(mode) 8081 }, 8082 8083 on: function (name, handler) { 8084 return KTEventHandler.on(document.documentElement, name, handler); 8085 }, 8086 8087 off: function (name, handlerId) { 8088 return KTEventHandler.off(document.documentElement, name, handlerId); 8089 } 8090 }; 8091}(); 8092 8093// Initialize app on document ready 8094KTUtil.onDOMContentLoaded(function () { 8095 KTThemeMode.init(); 8096}); 8097 8098// Declare KTThemeMode for Webpack support 8099if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') { 8100 module.exports = KTThemeMode; 8101} 8102"use strict"; 8103 8104// Class definition 8105var KTAppSidebar = function () { 8106 // Private variables 8107 var toggle; 8108 var sidebar; 8109 var headerMenu; 8110 var menuDashboardsCollapse; 8111 var menuScroll; 8112 var toggle; 8113 8114 // Private functions 8115 // Handle sidebar minimize mode toggle 8116 var handleToggle = function () { 8117 var toggleObj = KTToggle.getInstance(toggle); 8118 var headerMenuObj = KTMenu.getInstance(headerMenu); 8119 8120 if (toggleObj === null) { 8121 return; 8122 } 8123 8124 // Add a class to prevent sidebar hover effect after toggle click 8125 toggleObj.on('kt.toggle.change', function () { 8126 // Set animation state 8127 sidebar.classList.add('animating'); 8128 8129 // Wait till animation finishes 8130 setTimeout(function () { 8131 // Remove animation state 8132 sidebar.classList.remove('animating'); 8133 }, 300); 8134 8135 // Prevent header menu dropdown display on hover 8136 if (headerMenuObj) { 8137 headerMenuObj.disable(); 8138 8139 // Timeout to enable header menu 8140 setTimeout(function () { 8141 headerMenuObj.enable(); 8142 }, 1000); 8143 } 8144 }); 8145 8146 // Store sidebar minimize state in cookie 8147 toggleObj.on('kt.toggle.changed', function () { 8148 // In server side check sidebar_minimize_state cookie 8149 // value and add data-kt-app-sidebar-minimize="on" 8150 // attribute to Body tag and "active" class to the toggle button 8151 var date = new Date(Date.now() + 30 * 24 * 60 * 60 * 1000); // 30 days from now 8152 8153 KTCookie.set("sidebar_minimize_state", toggleObj.isEnabled() ? "on" : "off", { expires: date }); 8154 }); 8155 } 8156 8157 // Handle dashboards menu items collapse mode 8158 var handleShowMore = function () { 8159 menuDashboardsCollapse.addEventListener('hide.bs.collapse', event => { 8160 menuScroll.scrollTo({ 8161 top: 0, 8162 behavior: 'instant' 8163 }); 8164 }); 8165 } 8166 8167 var handleMenuScroll = function () { 8168 var menuActiveItem = menuScroll.querySelector(".menu-link.active"); 8169 8170 if (!menuActiveItem) { 8171 return; 8172 } 8173 8174 if (KTUtil.isVisibleInContainer(menuActiveItem, menuScroll) === true) { 8175 return; 8176 } 8177 8178 menuScroll.scroll({ 8179 top: KTUtil.getRelativeTopPosition(menuActiveItem, menuScroll), 8180 behavior: 'smooth' 8181 }); 8182 } 8183 8184 // Public methods 8185 return { 8186 init: function () { 8187 // Elements 8188 sidebar = document.querySelector('#kt_app_sidebar'); 8189 toggle = document.querySelector('#kt_app_sidebar_toggle'); 8190 headerMenu = document.querySelector('#kt_app_header_menu'); 8191 menuDashboardsCollapse = document.querySelector('#kt_app_sidebar_menu_dashboards_collapse'); 8192 menuScroll = document.querySelector('#kt_app_sidebar_menu_scroll'); 8193 8194 if (sidebar === null) { 8195 return; 8196 } 8197 8198 if (toggle) { 8199 handleToggle(); 8200 } 8201 8202 if (menuScroll) { 8203 handleMenuScroll(); 8204 } 8205 8206 if (menuDashboardsCollapse) { 8207 handleShowMore(); 8208 } 8209 } 8210 }; 8211}(); 8212 8213// On document ready 8214KTUtil.onDOMContentLoaded(function () { 8215 KTAppSidebar.init(); 8216}); 8217"use strict"; 8218 8219// Class definition 8220var KTLayoutToolbar = function () { 8221 // Private variables 8222 var toolbar; 8223 8224 // Private functions 8225 var initForm = function () { 8226 var rangeSlider = document.querySelector("#kt_app_toolbar_slider"); 8227 var rangeSliderValueElement = document.querySelector("#kt_app_toolbar_slider_value"); 8228 8229 if (!rangeSlider) { 8230 return; 8231 } 8232 8233 noUiSlider.create(rangeSlider, { 8234 start: [5], 8235 connect: [true, false], 8236 step: 1, 8237 format: wNumb({ 8238 decimals: 1 8239 }), 8240 range: { 8241 min: [1], 8242 max: [10] 8243 } 8244 }); 8245 8246 rangeSlider.noUiSlider.on("update", function (values, handle) { 8247 rangeSliderValueElement.innerHTML = values[handle]; 8248 }); 8249 8250 var handle = rangeSlider.querySelector(".noUi-handle"); 8251 8252 handle.setAttribute("tabindex", 0); 8253 8254 handle.addEventListener("click", function () { 8255 this.focus(); 8256 }); 8257 8258 handle.addEventListener("keydown", function (event) { 8259 var value = Number(rangeSlider.noUiSlider.get()); 8260 8261 switch (event.which) { 8262 case 37: 8263 rangeSlider.noUiSlider.set(value - 1); 8264 break; 8265 case 39: 8266 rangeSlider.noUiSlider.set(value + 1); 8267 break; 8268 } 8269 }); 8270 } 8271 8272 // Public methods 8273 return { 8274 init: function () { 8275 // Elements 8276 toolbar = document.querySelector('#kt_app_toolbar'); 8277 8278 if (!toolbar) { 8279 return; 8280 } 8281 8282 initForm(); 8283 } 8284 }; 8285}(); 8286 8287// On document ready 8288KTUtil.onDOMContentLoaded(function () { 8289 KTLayoutToolbar.init(); 8290}); 8291
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.