1( function( $ ) { 2 'use strict'; 3 4 var JetMenuPlugin = function( element, options ) { 5 6 this.defaultSettings = { 7 enabled: false, 8 mouseLeaveDelay: 500, 9 openSubType: 'click', // hover, click 10 ajaxLoad: true, 11 megaWidthType: 'container', 12 megaWidthSelector: '', 13 mainMenuSelector: '.jet-menu', 14 menuItemSelector: '.jet-menu-item', 15 moreMenuContent: '···', 16 rollUpDelta: 0, 17 } 18 19 this.settings = $.extend( this.defaultSettings, options ); 20 21 this.$window = $( window ); 22 23 this.$document = $( document ); 24 25 this.$element = $( element ); 26 27 this.$instance = $( this.settings.mainMenuSelector, this.$element ); 28 29 this.$menuItems = $( '>' + this.settings.menuItemSelector, this.$instance ); 30 31 this.menuItemsData = this.$menuItems.toArray().map( ( item ) => { 32 return { 33 element: item, 34 outerWidth: $( item ).outerWidth( true ) + this.settings.rollUpDelta, 35 } 36 } ); 37 38 this.$moreItemsInstance = null; 39 40 this.hiddenItemsArray = []; 41 42 this.createMenuInstance(); 43 44 this.$instance.trigger( 'jetMenuCreated' ); 45 46 return this; 47 } 48 49 JetMenuPlugin.prototype = { 50 constructor: JetMenuPlugin, 51 52 self: this, 53 54 createMenuInstance: function() { 55 var self = this, 56 mainMenuWidth, 57 totalVisibleItemsWidth = 0; 58 59 this.subMenuRebuild(); 60 this.subMegaMenuRebuild(); 61 62 // Add available items list 63 if ( ! tools.isEmpty( this.settings.moreMenuContent ) && self.settings.enabled ) { 64 self.$instance.append( '<li class="jet-menu-item jet-menu-item-has-children jet-simple-menu-item jet-responsive-menu-available-items" hidden><a href="#" class="top-level-link"><div class="jet-menu-item-wrapper">' + this.settings.moreMenuContent + '</div></a><ul class="jet-sub-menu"></ul></li>' ); 65 self.$moreItemsInstance = $( '> .jet-responsive-menu-available-items', this.$instance ); 66 self.$moreItemsInstance.attr( { 'hidden': 'hidden' } ); 67 } 68 69 this.rebuildItems(); 70 71 this.$instance.trigger( 'rebuildItems' ); // subMenu position rebuild 72 73 this.subMenuHandler(); 74 75 this.watch(); 76 }, 77 78 /** 79 * SubMenu items Handler. 80 * 81 * @return {void} 82 */ 83 subMenuHandler: function() { 84 var self = this, 85 transitionend = 'transitionend oTransitionEnd webkitTransitionEnd', 86 prevClickedItem = null, 87 menuItem, 88 menuItemParents, 89 timer; 90 91 switch ( this.settings.openSubType ) { 92 case 'hover': 93 this.$instance.on( 'mouseenter', '.jet-menu-item > a', { instance: this }, mouseEnterHandler ); 94 this.$instance.on( 'mouseleave', '.jet-menu-item > a', mouseLeaveHandler ); 95 break; 96 97 case 'click': 98 this.$instance.on( 'click', '.jet-menu-item > a', { instance: this }, clickHandler ); 99 break; 100 } 101 102 this.$instance.on( 'mouseenter', '.jet-sub-menu, .jet-sub-mega-menu', mouseEnterSubMenuHandler ); 103 this.$instance.on( 'mouseenter', mouseEnterInstanceHandler ); 104 this.$instance.on( 'mouseleave', mouseLeaveInstanceHandler ); 105 106 function clickHandler( event ) { 107 var $this, 108 $siblingsItems, 109 $link, 110 $currentTarget, 111 subMenu, 112 templateId, 113 instance = event.data.instance; 114 115 event.preventDefault(); 116 event.stopPropagation(); 117 118 $currentTarget = $( event.currentTarget ); 119 $this = $currentTarget.closest('.jet-menu-item'); 120 $siblingsItems = $this.siblings( '.jet-menu-item.jet-menu-item-has-children' ); 121 $link = $( '> a', $this ); 122 subMenu = $( '.jet-sub-menu:first, .jet-sub-mega-menu', $this ); 123 templateId = subMenu.data( 'template-id' ) || false; 124 125 if ( $siblingsItems[0] ) { 126 $siblingsItems.removeClass( 'jet-menu-hover' ); 127 $( 'jet-menu-item-has-children', $siblingsItems ).removeClass( 'jet-menu-hover' ); 128 } 129 130 if ( ! $( '.jet-sub-menu, .jet-sub-mega-menu', $this )[0] || $this.hasClass('jet-menu-hover') ) { 131 let itemLink = $link.attr( 'href' ) || '#', 132 target = $link.attr( 'target' ) || '_self'; 133 134 window.open( itemLink, target ); 135 136 return false; 137 } 138 139 if ( subMenu[0] ) { 140 $this.addClass( 'jet-menu-hover' ); 141 142 if ( templateId ) { 143 instance.maybeTemplateLoad( templateId, subMenu ); 144 } 145 } 146 } 147 148 function mouseEnterHandler( event ) { 149 var subMenu, 150 templateId, 151 instance; 152 153 menuItem = $( event.target ).parents( '.jet-menu-item' ); 154 subMenu = menuItem.children( '.jet-sub-menu, .jet-sub-mega-menu' ).first(); 155 templateId = subMenu.data( 'template-id' ) || false; 156 instance = event.data.instance; 157 158 $( '.jet-menu-hover', this.$instance ).removeClass( 'jet-menu-hover' ); 159 160 if ( subMenu[0] ) { 161 menuItem.addClass( 'jet-menu-hover' ); 162 163 if ( templateId ) { 164 instance.maybeTemplateLoad( templateId, subMenu ); 165 } 166 } 167 } 168 169 function mouseLeaveHandler( event ) { 170 // Item Mouse Leave Event 171 } 172 173 function mouseEnterSubMenuHandler( event ) { 174 clearTimeout( timer ); 175 } 176 177 function mouseEnterInstanceHandler( event ) { 178 clearTimeout( timer ); 179 } 180 181 function mouseLeaveInstanceHandler( event ) { 182 timer = setTimeout( function() { 183 $( '.jet-menu-hover', this.$instance ).removeClass( 'jet-menu-hover' ); 184 }, self.settings.mouseLeaveDelay ); 185 } 186 187 var windowWidth = $( window ).width(); 188 189 self.$window.on( 'orientationchange resize', function( event ) { 190
191 // Do not trigger a change if the viewport hasn't actually changed. Scrolling on iOS will trigger a resize. 192 if ( $( window ).width() === windowWidth ) { 193 return; 194 } 195 196 windowWidth = $( window ).width(); 197 198 self.$instance.find( '.jet-menu-item' ).removeClass( 'jet-menu-hover' ); 199 } ); 200 201 self.$document.on( 'touchend', function( event ) { 202 203 if ( $( event.target ).closest( '.jet-menu-item' ).length ) { 204 return; 205 } 206 207 self.$instance.find( '.jet-menu-item' ).removeClass( 'jet-menu-hover' ); 208 } ); 209 210 }, 211 212 maybeTemplateLoad: function( templateId, $templateContainer ) { 213 214 if ( ! this.settings.ajaxLoad ) { 215 return; 216 } 217 218 if ( $templateContainer.hasClass( 'template-loaded' ) ) { 219 return; 220 } 221 222 $.ajax( { 223 type: 'GET', 224 url: window.jetMenuPublicSettings.templateApiUrl, 225 dataType: 'json', 226 data: { 227 'id': templateId, 228 'dev': window.jetMenuPublicSettings.devMode 229 }, 230 beforeSend: function( jqXHR, ajaxSettings ) { 231 jqXHR.setRequestHeader( 'X-WP-Nonce', window.jetMenuPublicSettings.restNonce ); 232 }, 233 success: function( responce, textStatus, jqXHR ) { 234 var templateContent = responce['template_content'], 235 templateScripts = responce['template_scripts'], 236 templateStyles = responce['template_styles']; 237 238 for ( var scriptHandler in templateScripts ) { 239 jetMenu.addedAssetsPromises.push( jetMenu.loadScriptAsync( scriptHandler, templateScripts[ scriptHandler ] ) ); 240 } 241 242 for ( var styleHandler in templateStyles ) { 243 jetMenu.addedAssetsPromises.push( jetMenu.loadStyle( styleHandler, templateStyles[ styleHandler ] ) ); 244 } 245 246 $templateContainer.addClass( 'template-loaded' ); 247 248 jetMenu.elementorContentRender( $templateContainer, templateContent ); 249 } 250 } ); 251 }, 252 253 /** 254 * Responsive menu watcher function. 255 * 256 * @param {number} Watcher debounce delay. 257 * @return {void} 258 */ 259 watch: function( delay ) { 260 var delay = delay || 10; 261 262 $( window ).on( 'resize.jetResponsiveMenu orientationchange.jetResponsiveMenu load.jetResponsiveMenu', this.debounce( delay, this.watcher.bind( this ) ) ); 263 this.$instance.trigger( 'containerResize' ); 264 }, 265 266 /** 267 * Responsive menu watcher callback. 268 * 269 * @param {Object} Resize or Orientationchange event. 270 * @return {void} 271 */ 272 watcher: function( event ) { 273 this.rebuildItems(); 274 //this.$instance.trigger( 'rebuildItems' ); // subMenu position rebuild 275 this.$instance.trigger( 'containerResize' ); 276 }, 277 278 /** 279 * Responsive Menu rebuilding function. 280 * 281 * @return {void} 282 */ 283 rebuildItems: function() { 284 285 if ( ! this.settings.enabled ) { 286 return false; 287 } 288 289 var self = this, 290 mainMenuWidth = this.$instance.width(), 291 correctedMenuWidth = this.$instance.width() - self.$moreItemsInstance.outerWidth( true ), 292 iterationVisibleItemsWidth = 0, 293 iterationHiddenItemsWidth = this.getVisibleItemsWidth(), 294 visibleItemsArray = [], 295 hiddenItemsArray = []; 296 297 self.$menuItems.each( function() { 298 var $this = $( this ); 299 300 iterationVisibleItemsWidth += $this.outerWidth( true ); 301 302 if ( iterationVisibleItemsWidth > correctedMenuWidth && ! tools.inArray( this, hiddenItemsArray ) ) { 303 hiddenItemsArray.push( this ); 304 } else { 305 visibleItemsArray.push( this ); 306 } 307 308 } ); 309 310 hiddenItemsArray.forEach( function( item ) { 311 var $item = $( item ); 312 313 $item.attr( { 'hidden': 'hidden' } ); 314 } ); 315 316 visibleItemsArray.forEach( function( item, index ) { 317 var $item = $( item ); 318 319 $item.removeAttr( 'hidden' ); 320 } ); 321 322 $( '> .jet-sub-menu', self.$moreItemsInstance ).empty(); 323 324 hiddenItemsArray.forEach( function( item ) { 325 var $clone = $( item ).clone(); 326 327 // Remove sub-mega-menu content 328 $( '.jet-sub-mega-menu', $clone ).remove(); 329 330 $clone.addClass( 'jet-sub-menu-item' ); 331 332 $clone.removeAttr( 'hidden' ); 333 334 $( '> .top-level-link', $clone ).toggleClass( 'top-level-link sub-level-link' ); 335 336 $( '> .jet-sub-menu', self.$moreItemsInstance ).append( $clone ); 337 } ); 338 339 if ( 0 == hiddenItemsArray.length ) { 340 self.$moreItemsInstance.attr( { 'hidden': 'hidden' } ); 341 self.$moreItemsInstance.addClass( 'jet-empty' ); 342 } else { 343 self.$moreItemsInstance.removeAttr( 'hidden' ); 344 self.$moreItemsInstance.removeClass( 'jet-empty' ); 345 } 346 347 self.hiddenItemsArray = hiddenItemsArray; 348 }, 349 350 /*rebuildItems() { 351 352 if ( ! this.settings.enabled ) { 353 return false;
354 } 355 356 var self = this, 357 mainMenuWidth = this.$instance.width(), 358 iterationVisibleItemsWidth = 0, 359 visibleItemsArray = [], 360 hiddenItemsArray = []; 361 362 $( '> .jet-sub-menu', self.$moreItemsInstance ).empty(); 363 364 for ( let menuItem of self.menuItemsData ) { 365 let element = menuItem.element; 366 367 iterationVisibleItemsWidth += menuItem.outerWidth; 368 369 if ( iterationVisibleItemsWidth > mainMenuWidth ) { 370 element.hidden = true; 371 hiddenItemsArray.push( element ); 372 } else { 373 element.hidden = false; 374 visibleItemsArray.push( element ); 375 } 376 } 377 378 for ( let hiddenMenuItem of hiddenItemsArray ) { 379 let $hiddenClone = $( hiddenMenuItem ).clone(); 380 381 $hiddenClone[0].hidden = false; 382 383 // Remove sub-mega-menu content 384 $( '.jet-sub-mega-menu', $hiddenClone ).remove(); 385 $( '> .top-level-link', $hiddenClone ).toggleClass( 'top-level-link sub-level-link' ); 386 $hiddenClone.addClass( 'jet-sub-menu-item' ); 387 $( '> .jet-sub-menu', self.$moreItemsInstance ).append( $hiddenClone ); 388 } 389 390 this.$moreItemsInstance[0].hidden = hiddenItemsArray.length ? false : true; 391 392 this.$instance.trigger( 'rebuildItems' ); 393 },*/ 394 395 /** 396 * Sub Menu rebuilding function. 397 * 398 * @return {void} 399 */ 400 subMenuRebuild: function() { 401 var self = this, 402 initSubMenuPosition = false; 403 404 this.$instance.on( 'rebuildItems', function() { 405 var $subMenuList = $( '.jet-sub-menu', self.$instance ), 406 maxWidth = self.$window.outerWidth( true ), 407 isRTL = $( 'body' ).hasClass( 'rtl' ); 408 409 if ( ! $subMenuList[0] ) { 410 return; 411 } 412 413 if ( initSubMenuPosition ) { 414 $subMenuList.removeClass( 'inverse-side' ); 415 initSubMenuPosition = false; 416 } 417 418 $subMenuList.each( function() { 419 var $this = $( this ), 420 subMenuOffset = $this.offset().left, 421 subMenuPos = subMenuOffset + $this.outerWidth( true ); 422 423 if ( ! isRTL ) { 424 if ( subMenuPos >= maxWidth ) { 425 $this.addClass( 'inverse-side' ); 426 $this.find( '.jet-sub-menu' ).addClass( 'inverse-side' ); 427 428 initSubMenuPosition = true; 429 } else if ( subMenuOffset < 0 ) { 430 $this.removeClass( 'inverse-side' ); 431 $this.find( '.jet-sub-menu' ).removeClass( 'inverse-side' ); 432 } 433 } else { 434 if ( subMenuOffset < 0 ) { 435 $this.addClass( 'inverse-side' ); 436 $this.find( '.jet-sub-menu' ).addClass( 'inverse-side' ); 437 438 initSubMenuPosition = true; 439 } else if ( subMenuPos >= maxWidth ) { 440 $this.removeClass( 'inverse-side' ); 441 $this.find( '.jet-sub-menu' ).removeClass( 'inverse-side' ); 442 } 443 } 444 445 } ); 446 } ); 447 }, 448 449 /** 450 * Sub Mega Menu rebuilding function. 451 * 452 * @return {void} 453 */ 454 subMegaMenuRebuild: function() { 455 var self = this; 456 457 this.$instance.on( 'containerResize', function() { 458 var $megaMenuList = $( '.jet-sub-mega-menu', self.$instance ), 459 maxWidth = $( 'body' ).outerWidth( true ); 460 461 switch( self.settings.megaWidthType ) { 462 case 'items': 463 var visibleItemsWidth = self.getVisibleItemsWidth(), 464 firstOffset = $( '> .jet-menu-item:first', self.$instance ).position().left; 465 466 $megaMenuList.css( { 467 'width': visibleItemsWidth + 'px', 468 'left': firstOffset 469 } ); 470 break; 471 case 'selector': 472 var customSelector = $( self.settings.megaWidthSelector ), 473 instanceOffset = null, 474 customSelectorOffset = null; 475 476 if ( customSelector[0] ) { 477 instanceOffset = self.$instance.offset().left; 478 customSelectorOffset = customSelector.offset().left; 479 480 $megaMenuList.css( { 481 'width': customSelector.outerWidth(), 482 'left': (customSelectorOffset - instanceOffset ) + 'px' 483 } ); 484 } 485 486 break; 487 } 488 489 if ( $megaMenuList[0] ) { 490 $megaMenuList.css( { 491 'maxWidth': '' 492 } ); 493 494 $megaMenuList.each( function() { 495 var $this = $( this ), 496 megaMenuOffsetLeft = $this.offset().left, 497 megaMenuOffsetRight = megaMenuOffsetLeft + $this.outerWidth( true ); 498 499 if ( megaMenuOffsetRight >= maxWidth ) { 500 $this.css( { 501 'maxWidth': maxWidth - megaMenuOffsetLeft 502 } ); 503 } 504 } ); 505 } 506 } ); 507 }, 508 509 /** 510 * Get visible items total width 511 * 512 * @return {int} 513 */ 514 getVisibleItemsWidth: function() { 515 var totalVisibleItemsWidth = 0; 516 517 this.$menuItems.each( function() { 518 var $this = $( this ); 519 520 if ( ! $this.hasAttr( 'hidden' ) ) { 521 totalVisibleItemsWidth += $this.outerWidth( true ); 522 } 523 } ); 524 525 return totalVisibleItemsWidth; 526 }, 527 528 /** 529 * Mobile and tablet check funcion. 530 * 531 * @return {boolean} Mobile Status 532 */ 533 mobileAndTabletcheck: function() { 534 var check = false;
535 536 (function(a){if(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino|android|ipad|playbook|silk/i.test(a)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0,4))) check = true;})(navigator.userAgent||navigator.vendor||window.opera); 537 538 return check; 539 }, 540 541 /** 542 * Debounce the function call 543 * 544 * @param {number} threshold The delay. 545 * @param {Function} callback The function. 546 */ 547 debounce: function ( threshold, callback ) { 548 var timeout; 549 550 return function debounced( $event ) { 551 function delayed() { 552 callback.call( this, $event ); 553 timeout = null; 554 } 555 556 if ( timeout ) { 557 clearTimeout( timeout ); 558 } 559 560 timeout = setTimeout( delayed, threshold ); 561 }; 562 } 563 } 564 565 /* 566 * Js tools 567 */ 568 var tools = { 569 isEmpty: function( value ) { 570 return ( ( false === value ) || ( '' === value ) || ( null === value ) || ( undefined === value )); 571 }, 572 573 isEmptyObject: function( value ) { 574 return ( true === this.isEmpty( value ) ) || ( 0 === value.length ); 575 }, 576 577 isString: function(value) { 578 return ( ( 'string' === typeof value ) || ( value instanceof String ) ); 579 }, 580 581 isArray: function( value ) { 582 return $.isArray( value ); 583 }, 584 585 inArray: function( value, array ) { 586 return ( $.inArray( value, array ) !== -1); 587 } 588 }; 589 590 /* 591 * Jq tools 592 */ 593 $.fn.hasAttr = function( name ) { 594 return this.attr( name ) !== undefined; 595 }; 596 597 // jQuery plugin 598 $.fn.JetMenuPlugin = function( options ) { 599 return this.each( function() { 600 var $this = $( this ), 601 pluginOptions = ( 'object' === typeof options ) ? options : {}; 602 603 if ( ! $this.data( 'JetMenuPlugin' ) ) { 604 605 // create plugin instance (only if not exists) and expose the entire instance API 606 $this.data( 'JetMenuPlugin', new JetMenuPlugin( this, pluginOptions ) ); 607 } 608 } ); 609 }; 610 611}( jQuery ) ); 612 613( function( $ ) { 614 'use strict'; 615 616 window.jetMenu = { 617 618 addedScripts: {}, 619 620 addedStyles: {}, 621 622 addedAssetsPromises: [], 623 624 initedMobileMenuInstance: [], 625 626 eventBus: new Vue(), 627 628 $body: $( 'body' ), 629 630 init: function() { 631 this.initDesktopMenu(); 632 this.mobileVueComponents(); 633 this.initMobileMenu(); 634 }, 635 636 initDesktopMenu: function() { 637 var rollUp = false, 638 jetMenuMouseleaveDelay = 500, 639 jetMenuMegaWidthType = 'container', 640 jetMenuMegaWidthSelector = '', 641 jetMenuMegaOpenSubType = 'hover', 642 jetMenuMegaAjax = false;
643 644 if ( window.jetMenuPublicSettings && window.jetMenuPublicSettings.menuSettings ) { 645 rollUp = ( 'true' === jetMenuPublicSettings.menuSettings.jetMenuRollUp ) ? true : false; 646 jetMenuMouseleaveDelay = jetMenuPublicSettings.menuSettings.jetMenuMouseleaveDelay || 500; 647 jetMenuMegaWidthType = jetMenuPublicSettings.menuSettings.jetMenuMegaWidthType || 'container'; 648 jetMenuMegaWidthSelector = jetMenuPublicSettings.menuSettings.jetMenuMegaWidthSelector || ''; 649 jetMenuMegaOpenSubType = jetMenuPublicSettings.menuSettings.jetMenuMegaOpenSubType || 'hover'; 650 jetMenuMegaAjax = ( 'true' === jetMenuPublicSettings.menuSettings.jetMenuMegaAjax ) ? true : false; 651 } 652 653 $( '.jet-menu-container' ).JetMenuPlugin( { 654 enabled: rollUp, 655 mouseLeaveDelay: +jetMenuMouseleaveDelay, 656 megaWidthType: jetMenuMegaWidthType, 657 megaWidthSelector: jetMenuMegaWidthSelector, 658 openSubType: jetMenuMegaOpenSubType, 659 ajaxLoad: jetMenuMegaAjax, 660 } ); 661 662 }, 663 664 initMobileMenu: function() { 665 666 let mobileMenuList = $( '.jet-mobile-menu-single' ); 667 668 if ( ! mobileMenuList[0] ) { 669 return false; 670 } 671 672 if ( 'true' === window.jetMenuPublicSettings.devMode ) { 673 Vue.config.devtools = true; 674 } 675 676 mobileMenuList.each( function() { 677 let $this = $( this ), 678 menuInstanceId = $this.attr( 'id' ), 679 menuId = $this.data( 'menu-id' ) || false, 680 menuOptions = $this.data( 'menu-options' ) || {}; 681 682 jetMenu.createMobileMenuInstance( menuInstanceId, menuId, menuOptions ); 683 } ); 684 }, 685 686 createMobileMenuInstance: function( menuInstanceId, menuId, menuOptions ) { 687 688 if ( jetMenu.initedMobileMenuInstance.includes( menuInstanceId ) ) { 689 return; 690 } 691 692 jetMenu.initedMobileMenuInstance.push( menuInstanceId ); 693 694 let mobileMenuInstance = new Vue( { 695 el: '#' + menuInstanceId, 696 data: { 697 'uniqId': menuInstanceId, 698 'menuOptions': menuOptions, 699 } 700 } ); 701 }, 702 703 mobileVueComponents: function() { 704 705 Vue.component( 'mobile-menu-item', { 706 template: '#mobile-menu-item-template', 707 708 props: { 709 itemDataObject: Object, 710 depth: Number, 711 menuOptions: Object 712 }, 713 714 data: function() { 715 return ( { 716 ajaxRequest: null, 717 templateLoadStatus: false, 718 subDropdownVisible: false 719 } ) 720 }, 721 722 computed: { 723 724 itemClasses: function() { 725 let itemClasses = [ 726 'jet-mobile-menu__item', 727 'jet-menu-item-' + this.itemDataObject.itemId, 728 'jet-mobile-menu__item--sub-trigger-' + ( this.menuOptions.subTrigger || 'item' ), 729 ]; 730 731 let customClasses = this.itemDataObject.classes; 732 733 if ( 0 !== customClasses.length ) { 734 itemClasses = itemClasses.concat( customClasses ); 735 } 736 737 if ( window.location.href === this.itemDataObject.url ) { 738 itemClasses.push( 'jet-mobile-menu__item--active' ); 739 } 740 741 return itemClasses; 742 }, 743 744 itemLinkClasses: function() { 745 let classes = [ 746 'mobile-link', 747 0 === this.depth ? 'mobile-top-level-link' : 'mobile-sub-level-link', 748 ]; 749 750 return classes; 751 }, 752 753 isСhildrenDefine: function() { 754 return this.itemDataObject.children ? true : false; 755 }, 756 757 isTemplateDefine: function() { 758 return false !== this.itemDataObject.elementorTemplateId ? true : false; 759 }, 760 761 isSub: function() { 762 return this.isСhildrenDefine || this.isTemplateDefine ? true : false; 763 }, 764 765 isTopLevel: function() { 766 return 0 === this.depth ? true : false; 767 }, 768 769 isDropdownLayout: function() { 770 return this.isSub && ! this.isTemplateDefine && 'dropdown' === this.menuOptions.subOpenLayout; 771 }, 772 773 depthClass: function() { 774 return 0 === this.depth ? 'mobile-top-level-link' : 'mobile-sub-level-link'; 775 }, 776 777 dropdownIconHtml: function() { 778 let dropdownIcon = '' !== this.menuOptions.dropdownIcon ? this.menuOptions.dropdownIcon : '<i class="fas fa-angle-right"></i>', 779 dropdownOpenedIcon = '' !== this.menuOptions.dropdownOpenedIcon ? this.menuOptions.dropdownOpenedIcon : '<i class="fas fa-angle-down"></i>'; 780 781 if ( this.subDropdownVisible ) { 782 dropdownIcon = dropdownOpenedIcon; 783 } 784 785 return dropdownIcon; 786 }, 787 788 itemIconHtml: function() { 789 return this.itemDataObject.itemIcon; 790 }, 791 792 isIconVisible: function() { 793 let iconVisible = this.menuOptions['itemIconVisible'] || 'true'; 794
795 return 'false' === iconVisible || '' === this.itemDataObject.itemIcon || ! this.itemDataObject.itemIcon ? false : true; 796 }, 797 798 isBadgeVisible: function() { 799 let badgeVisible = this.menuOptions['itemBadgeVisible'] || 'true'; 800 801 return 'false' === badgeVisible || '' === this.itemDataObject.badgeText || ! this.itemDataObject.badgeText ? false : true; 802 }, 803 804 isDescVisible: function() { 805 let descVisible = this.menuOptions['itemDescVisible'] || 'false'; 806 807 return 'false' === descVisible || '' === this.itemDataObject.description || ! this.itemDataObject.description ? false : true; 808 }, 809 810 loaderColor: function() { 811 return this.menuOptions.loaderColor || '#3a3a3a'; 812 }, 813 }, 814 815 methods: { 816 itemSubHandler: function( event ) { 817 let target = event.target, 818 mobileLink = $( target ).closest( '.mobile-link' ); 819 820 if ( 'item' !== this.menuOptions.subTrigger ) { 821 return; 822 } 823 824 if ( this.isSub && mobileLink ) { 825 event.preventDefault(); 826 } 827 828 if ( ! this.isSub && mobileLink && this.menuOptions.closeAfterNavigate ) { 829 jetMenu.eventBus.$emit( 'closeMenu', { 830 menuUniqId: this.menuOptions.menuUniqId, 831 } ); 832 } 833 834 this.switchToSub( event ); 835 }, 836 837 markerSubHandler: function( event ) { 838 839 if ( 'submarker' !== this.menuOptions.subTrigger ) { 840 return; 841 } 842 843 this.switchToSub( event ); 844 }, 845 846 switchToSub: function( event ) { 847 848 if ( ! this.isSub ) { 849 return; 850 } 851 852 if ( ! this.isTemplateDefine ) { 853 854 if ( this.isDropdownLayout ) { 855 this.subDropdownVisible = !this.subDropdownVisible; 856 857 return; 858 } 859 860 jetMenu.eventBus.$emit( 'itemsSubSwitch', { 861 menuUniqId: this.menuOptions.menuUniqId, 862 id: this.itemDataObject.id, 863 name: this.itemDataObject.name, 864 children: this.itemDataObject.children || false 865 } ); 866 867 } else { 868 869 if ( ! this.itemDataObject.elementorContent ) { 870 this.getElementorTemplate(); 871 } else { 872 873 jetMenu.eventBus.$emit( 'showTemplateContent', { 874 menuUniqId: this.menuOptions.menuUniqId, 875 id: this.itemDataObject.id, 876 name: this.itemDataObject.name, 877 elementorContent: this.itemDataObject.elementorContent 878 } ); 879 } 880 } 881 }, 882 883 getElementorTemplate: function() { 884 var vueInstance = this; 885 886 vueInstance.ajaxRequest = $.ajax( { 887 type: 'GET', 888 url: window.jetMenuPublicSettings.templateApiUrl, 889 dataType: 'json', 890 data: { 891 'id': vueInstance.itemDataObject.elementorTemplateId, 892 'dev': window.jetMenuPublicSettings.devMode 893 }, 894 beforeSend: function( jqXHR, ajaxSettings ) { 895 896 if ( null !== vueInstance.ajaxRequest ) { 897 vueInstance.ajaxRequest.abort(); 898 } 899 900 vueInstance.templateLoadStatus = true; 901 902 jqXHR.setRequestHeader( 'X-WP-Nonce', window.jetMenuPublicSettings.restNonce ); 903 }, 904 success: function( responce, textStatus, jqXHR ) { 905 var templateContent = responce['template_content'], 906 templateScripts = responce['template_scripts'], 907 templateStyles = responce['template_styles']; 908 909 for ( var scriptHandler in templateScripts ) { 910 jetMenu.addedAssetsPromises.push( jetMenu.loadScriptAsync( scriptHandler, templateScripts[ scriptHandler ] ) ); 911 } 912 913 for ( var styleHandler in templateStyles ) { 914 jetMenu.addedAssetsPromises.push( jetMenu.loadStyle( styleHandler, templateStyles[ styleHandler ] ) ); 915 } 916 917 vueInstance.templateLoadStatus = false; 918 919 vueInstance.itemDataObject.elementorContent = templateContent; 920 921 jetMenu.eventBus.$emit( 'showTemplateContent', { 922 menuUniqId: vueInstance.menuOptions.menuUniqId, 923 id: vueInstance.itemDataObject.id, 924 name: vueInstance.itemDataObject.name, 925 elementorContent: vueInstance.itemDataObject.elementorContent 926 } ); 927 } 928 } ); 929 } 930 } 931 932 }); 933 934 Vue.component( 'mobile-menu-list', { 935 template: '#mobile-menu-list-template', 936 937 props: { 938 depth: Number, 939 childrenObject: Object, 940 menuOptions: Object 941 } 942 943 }); 944 945 Vue.component( 'mobile-menu', { 946 template: '#mobile-menu-template', 947 948 props: { 949 menuOptions: { 950 type: Object, 951 default: {} 952 }, 953 }, 954 955 data: function() { 956 return ( { 957 menuOpen: false, 958 children: false, 959 itemsRawData: {}, 960 trail:[], 961 breadcrumbsData:[], 962 animation: 'items-next-animation', 963 ajaxRequest: null, 964 templateVisible: false, 965 instanceLoadStatus: false, 966 itemTemplateContent: false, 967 968 headerTemplate: this.menuOptions['headerTemplate'] || 0, 969 headerContent: false, 970 headerTemplateVisible: false, 971 beforeTemplate: this.menuOptions['beforeTemplate'] || 0, 972 beforeContent: false, 973 afterTemplate: this.menuOptions['afterTemplate'] || 0, 974 afterContent: false, 975 976 ajaxPromises: [] 977 } ) 978 }, 979 980 mounted: function() { 981 let vueInstance = this; 982 983 if ( this.menuOpen ) { 984 jetMenu.$body.addClass( 'jet-mobile-menu-visible' ); 985 986 if ( 'slide-out' === this.menuOptions.menuLayout ) { 987 jetMenu.$body.addClass( 'jet-menu-body-blocker' ); 988 } 989 } 990 991 this.ajaxPromises.push( 992 new Promise( function( resolve, reject ) { 993 $.ajax( { 994 type: 'GET', 995 url: window.jetMenuPublicSettings.menuItemsApiUrl, 996 dataType: 'json', 997 data: { 998 'menu_id': vueInstance.menuId, 999 'dev': window.jetMenuPublicSettings.devMode, 1000 'lang': window.jetMenuPublicSettings.wpmlLanguageCode || false 1001 }, 1002 beforeSend: function( jqXHR, ajaxSettings ) { 1003 jqXHR.setRequestHeader( 'X-WP-Nonce', window.jetMenuPublicSettings.restNonce ); 1004 }, 1005 success: function( responce, textStatus, jqXHR ) { 1006 let responceData = responce.data.items; 1007 1008 vueInstance.itemsRawData = responceData; 1009 1010 resolve(); 1011 } 1012 } ); 1013 } ) 1014 ); 1015 1016 if ( 0 !== +this.headerTemplate ) { 1017 this.ajaxPromises.push( 1018 new Promise( function( resolve, reject ) { 1019 $.ajax( { 1020 type: 'GET', 1021 url: window.jetMenuPublicSettings.templateApiUrl, 1022 dataType: 'json', 1023 data: { 1024 'id': vueInstance.headerTemplate, 1025 'dev': window.jetMenuPublicSettings.devMode 1026 }, 1027 beforeSend: function( jqXHR, ajaxSettings ) { 1028 jqXHR.setRequestHeader( 'X-WP-Nonce', window.jetMenuPublicSettings.restNonce ); 1029 }, 1030 success: function( responce, textStatus, jqXHR ) { 1031 let templateContent = responce['template_content'], 1032 templateScripts = responce['template_scripts'], 1033 templateStyles = responce['template_styles']; 1034 1035 for ( let scriptHandler in templateScripts ) { 1036 jetMenu.addedAssetsPromises.push( jetMenu.loadScriptAsync( scriptHandler, templateScripts[ scriptHandler ] ) ); 1037 } 1038 1039 for ( let styleHandler in templateStyles ) { 1040 jetMenu.addedAssetsPromises.push( jetMenu.loadStyle( styleHandler, templateStyles[ styleHandler ] ) ); 1041 } 1042 1043 vueInstance.headerContent = templateContent; 1044 vueInstance.headerTemplateVisible = true; 1045 1046 resolve(); 1047 } 1048 } ); 1049 } ) 1050 ); 1051 } 1052 1053 if ( 0 !== +this.beforeTemplate ) { 1054 this.ajaxPromises.push( 1055 new Promise( function( resolve, reject ) { 1056 $.ajax( { 1057 type: 'GET', 1058 url: window.jetMenuPublicSettings.templateApiUrl, 1059 dataType: 'json', 1060 data: { 1061 'id': vueInstance.beforeTemplate, 1062 'dev': window.jetMenuPublicSettings.devMode 1063 }, 1064 beforeSend: function( jqXHR, ajaxSettings ) { 1065 jqXHR.setRequestHeader( 'X-WP-Nonce', window.jetMenuPublicSettings.restNonce ); 1066 }, 1067 success: function( responce, textStatus, jqXHR ) { 1068 let templateContent = responce['template_content'], 1069 templateScripts = responce['template_scripts'], 1070 templateStyles = responce['template_styles']; 1071 1072 for ( let scriptHandler in templateScripts ) { 1073 jetMenu.addedAssetsPromises.push( jetMenu.loadScriptAsync( scriptHandler, templateScripts[ scriptHandler ] ) ); 1074 } 1075 1076 for ( let styleHandler in templateStyles ) { 1077 jetMenu.addedAssetsPromises.push( jetMenu.loadStyle( styleHandler, templateStyles[ styleHandler ] ) ); 1078 } 1079 1080 vueInstance.beforeContent = templateContent; 1081 1082 resolve(); 1083 } 1084 } ); 1085 } ) 1086 ); 1087 } 1088 1089 if ( 0 !== +this.afterTemplate ) { 1090 this.ajaxPromises.push( 1091 new Promise( function( resolve, reject ) { 1092 $.ajax( { 1093 type: 'GET', 1094 url: window.jetMenuPublicSettings.templateApiUrl, 1095 dataType: 'json', 1096 data: { 1097 'id': vueInstance.afterTemplate, 1098 'dev': window.jetMenuPublicSettings.devMode 1099 }, 1100 beforeSend: function( jqXHR, ajaxSettings ) { 1101 jqXHR.setRequestHeader( 'X-WP-Nonce', window.jetMenuPublicSettings.restNonce ); 1102 }, 1103 success: function( responce, textStatus, jqXHR ) { 1104 let templateContent = responce['template_content'], 1105 templateScripts = responce['template_scripts'], 1106 templateStyles = responce['template_styles']; 1107 1108 for ( let scriptHandler in templateScripts ) { 1109 jetMenu.addedAssetsPromises.push( jetMenu.loadScriptAsync( scriptHandler, templateScripts[ scriptHandler ] ) ); 1110 } 1111 1112 for ( let styleHandler in templateStyles ) { 1113 jetMenu.addedAssetsPromises.push( jetMenu.loadStyle( styleHandler, templateStyles[ styleHandler ] ) ); 1114 } 1115 1116 vueInstance.afterContent = templateContent; 1117 resolve(); 1118 } 1119 } ); 1120 } ) 1121 ); 1122 } 1123 1124 this.instanceLoadStatus = true; 1125 1126 Promise.all( this.ajaxPromises ).then( function() { 1127 vueInstance.instanceLoadStatus = false;
1128 }, function( reason ) { 1129 console.log( 'Script Loaded Error' ); 1130 } ); 1131 1132 jetMenu.eventBus.$on( 'itemsSubSwitch', function ( payLoad ) { 1133 1134 if ( vueInstance.menuOptions.menuUniqId !== payLoad.menuUniqId ) { 1135 return; 1136 } 1137 1138 vueInstance.trail.push( payLoad.children ); 1139 vueInstance.children = payLoad.children; 1140 vueInstance.breadcrumbsData.push( payLoad.name ); 1141 vueInstance.animation = 'items-next-animation'; 1142 } ); 1143 1144 jetMenu.eventBus.$on( 'showTemplateContent', function ( payLoad ) { 1145 1146 if ( vueInstance.menuOptions.menuUniqId !== payLoad.menuUniqId ) { 1147 return; 1148 } 1149 1150 vueInstance.itemTemplateContent = payLoad.elementorContent; 1151 vueInstance.templateVisible = true; 1152 vueInstance.breadcrumbsData.push( payLoad.name ); 1153 vueInstance.animation = 'items-next-animation'; 1154 1155 vueInstance.showTemplateContent(); 1156 } ); 1157 1158 jetMenu.eventBus.$on( 'closeMenu', function( payLoad ) { 1159 1160 if ( vueInstance.menuOptions.menuUniqId !== payLoad.menuUniqId ) { 1161 return; 1162 } 1163 1164 vueInstance.closeMenu(); 1165 } ); 1166 1167 }, 1168 1169 watch: { 1170 menuOpen: function( curr, prev ) { 1171 1172 if ( curr ) { 1173 jetMenu.$body.addClass( 'jet-mobile-menu-visible' ); 1174 1175 if ( 'slide-out' === this.menuOptions.menuLayout ) { 1176 jetMenu.$body.addClass( 'jet-menu-body-blocker' ); 1177 } 1178 1179 this.initTemplatesContent(); 1180 } 1181 1182 if ( ! curr ) { 1183 jetMenu.$body.removeClass( 'jet-mobile-menu-visible' ); 1184 1185 if ( 'slide-out' === this.menuOptions.menuLayout ) { 1186 jetMenu.$body.removeClass( 'jet-menu-body-blocker' ); 1187 } 1188 1189 this.clearStates(); 1190 } 1191 } 1192 }, 1193 1194 computed: { 1195 instanceClass: function() { 1196 let classes = [ 1197 'jet-mobile-menu__instance', 1198 'jet-mobile-menu__instance--' + this.menuOptions.menuLayout + '-layout', 1199 this.menuOptions.menuPosition + '-container-position', 1200 ( this.menuOptions.togglePosition || 'default' ) + '-toggle-position', 1201 ]; 1202 1203 return classes; 1204 }, 1205 1206 menuContainerVisible: function() { 1207 return this.menuOpen && !this.instanceLoadStatus; 1208 }, 1209 1210 menuId: function() { 1211 1212 if ( this.menuOptions.mobileMenuId ) { 1213 return this.menuOptions.mobileMenuId; 1214 } 1215 1216 return this.menuOptions.menuId; 1217 }, 1218 1219 coverVisible: function() { 1220 1221 let avaliableForLayout = [ 1222 'slide-out' 1223 ]; 1224 1225 return avaliableForLayout.includes( this.menuOptions.menuLayout ); 1226 }, 1227 1228 itemsList: function() { 1229 1230 if ( ! this.children ) { 1231 return this.itemsRawData; 1232 } 1233 1234 return this.children; 1235 }, 1236 1237 isClose: function() { 1238 let avaliableForLayout = [ 1239 'slide-out' 1240 ]; 1241 1242 return avaliableForLayout.includes( this.menuOptions.menuLayout ); 1243 }, 1244 1245 isBack: function() { 1246 return this.children || this.templateVisible ? true : false; 1247 }, 1248 1249 isBreadcrumbs: function() { 1250 return this.menuOptions.useBreadcrumb && 0 !== this.breadcrumbsData.length ? true : false; 1251 }, 1252 1253 depth: function() { 1254 return this.trail.length; 1255 }, 1256 1257 containerPosition: function() { 1258 return this.menuOptions['menuPosition']; 1259 }, 1260 1261 showAnimation: function() { 1262 1263 let animation = false; 1264 1265 switch( this.menuOptions.menuLayout ) { 1266 1267 case 'slide-out': 1268 animation = 'right' === this.containerPosition ? 'menu-container-left-animation' : 'menu-container-right-animation'; 1269 break; 1270 1271 case 'dropdown': 1272 animation = 'menu-container-dropdown-animation'; 1273 break; 1274 1275 case 'push': 1276 animation = 'menu-container-expand-animation'; 1277 break; 1278 } 1279 1280 return animation; 1281 }, 1282 1283 toggleClosedIcon: function() { 1284 return '' !== this.menuOptions.toggleClosedIcon ? this.menuOptions.toggleClosedIcon : '<i class="fas fa-bars"></i>'; 1285 }, 1286 1287 toggleOpenedIcon: function() { 1288 return '' !== this.menuOptions.toggleOpenedIcon ? this.menuOptions.toggleOpenedIcon : '<i class="fas fa-times"></i>'; 1289 }, 1290 1291 toggleText: function() { 1292 return '' !== this.menuOptions.toggleText ? this.menuOptions.toggleText : false;
1293 }, 1294 1295 closeIcon: function() { 1296 return '' !== this.menuOptions.closeIcon ? this.menuOptions.closeIcon : '<i class="fas fa-times"></i>'; 1297 }, 1298 1299 backIcon: function() { 1300 let backIcon = '' !== this.menuOptions.backIcon ? this.menuOptions.backIcon : '<i class="fas fa-arrow-left"></i>', 1301 backText = '' !== this.menuOptions.backText ? '<span>' + this.menuOptions.backText + '</span>' : '', 1302 backHtml = backIcon + backText; 1303 1304 return backHtml; 1305 }, 1306 1307 backText: function() { 1308 return '' !== this.menuOptions.backText ? this.menuOptions.backText : false; 1309 }, 1310 1311 breadcrumbIcon: function() { 1312 return '' !== this.menuOptions.breadcrumbIcon ? this.menuOptions.breadcrumbIcon : '<i class="fas fa-angle-rightt"></i>'; 1313 }, 1314 1315 loaderColor: function() { 1316 return this.menuOptions.loaderColor || '#3a3a3a'; 1317 }, 1318 1319 toggleLoaderVisible: function() { 1320 return this.menuOptions.toggleLoader && this.instanceLoadStatus && this.menuOpen ? true : false; 1321 }, 1322 1323 beforeTemplateVisible: function() { 1324 return this.beforeContent ? true : false; 1325 }, 1326 1327 afterTemplateVisible: function() { 1328 return this.afterContent ? true : false; 1329 } 1330 1331 }, 1332 1333 methods: { 1334 menuToggle: function() { 1335 this.menuOpen = ! this.menuOpen; 1336 }, 1337 1338 closeMenu: function() { 1339 this.menuOpen = false; 1340 }, 1341 1342 clearStates: function() { 1343 this.trail = []; 1344 this.children = false; 1345 this.breadcrumbsData = []; 1346 this.templateVisible = false; 1347 }, 1348 1349 goBack: function() { 1350 1351 this.animation = 'items-prev-animation'; 1352 1353 if ( ! this.templateVisible ) { 1354 this.$delete( this.trail, this.trail.length - 1 ); 1355 this.children = this.trail.slice(-1)[0] || false; 1356 } else { 1357 this.templateVisible = false; 1358 } 1359 1360 this.$delete(this.breadcrumbsData, this.breadcrumbsData.length - 1); 1361 }, 1362 1363 escapeKeyHandler: function() { 1364 1365 if ( this.isBack ) { 1366 this.goBack(); 1367 } else { 1368 this.closeMenu(); 1369 } 1370 }, 1371 1372 showTemplateContent: function() { 1373 let vueInstance = this; 1374 1375 this.$nextTick( function() { 1376 let $templateContainer = $( vueInstance.$refs['template-content'] ).find( '.jet-mobile-menu__template-content' ); 1377 1378 jetMenu.elementorContentRender( $templateContainer ); 1379 } ); 1380 }, 1381 1382 initTemplatesContent: function() { 1383 let vueInstance = this; 1384 1385 this.$nextTick( function() { 1386 1387 if ( vueInstance.headerContent ) { 1388 let $headerContainer = $( vueInstance.$refs['header-template-content'] ); 1389 1390 jetMenu.elementorContentRender( $headerContainer ); 1391 } 1392 1393 if ( vueInstance.beforeContent ) { 1394 let $beforeContainer = $( vueInstance.$refs['before-template-content'] ); 1395 1396 jetMenu.elementorContentRender( $beforeContainer ); 1397 } 1398 1399 if ( vueInstance.afterContent ) { 1400 let $afterContainer = $( vueInstance.$refs['after-template-content'] ); 1401 1402 jetMenu.elementorContentRender( $afterContainer ); 1403 } 1404 } ); 1405 }, 1406 1407 breadcrumbHandle: function( index ) { 1408 1409 if ( index === this.breadcrumbsData.length ) { 1410 return; 1411 } 1412 1413 this.animation = 'items-prev-animation'; 1414 1415 this.trail = this.trail.slice( 0, index ); 1416 this.children = this.trail.slice( -1 )[0] || false; 1417 this.templateVisible = false; 1418 this.breadcrumbsData = this.breadcrumbsData.slice( 0, index ); 1419 } 1420 1421 } 1422 }); 1423 }, 1424 1425 loadScriptAsync: function( script, uri ) { 1426 1427 if ( jetMenu.addedScripts.hasOwnProperty( script ) ) { 1428 return script; 1429 } 1430 1431 jetMenu.addedScripts[ script ] = uri; 1432 1433 return new Promise( function( resolve, reject ) { 1434 var tag = document.createElement( 'script' ); 1435 1436 tag.src = uri; 1437 tag.async = true; 1438 tag.onload = function() { 1439 resolve( script ); 1440 }; 1441 1442 document.head.appendChild( tag ); 1443 } ); 1444 }, 1445 1446 loadStyle: function( style, uri ) { 1447 1448 if ( jetMenu.addedStyles.hasOwnProperty( style ) && jetMenu.addedStyles[ style ] === uri) { 1449 return style; 1450 } 1451 1452 jetMenu.addedStyles[ style ] = uri; 1453 1454 return new Promise( function( resolve, reject ) { 1455 var tag = document.createElement( 'link' ); 1456 1457 tag.id = style; 1458 tag.rel = 'stylesheet'; 1459 tag.href = uri; 1460 tag.type = 'text/css'; 1461 tag.media = 'all'; 1462 tag.onload = function() { 1463 resolve( style ); 1464 }; 1465 1466 document.head.appendChild( tag ); 1467 }); 1468 }, 1469 1470 elementorContentRender: function( $templateContainer, templateContent ) { 1471 let content = templateContent || false; 1472 1473 Promise.all( jetMenu.addedAssetsPromises ).then( function( value ) { 1474 1475 if ( templateContent ) { 1476 $templateContainer.html( templateContent ); 1477 } 1478 1479 // Before ajax frontend init 1480 $( window ).trigger( 'jet-menu/ajax/frontend-init/before', { 1481 $container: $templateContainer, 1482 content: content, 1483 } ); 1484 1485 jetMenu.elementorFrontendInit( $templateContainer ); 1486 1487 // Before ajax frontend init 1488 $( window ).trigger( 'jet-menu/ajax/frontend-init/after', { 1489 $container: $templateContainer, 1490 content: content, 1491 } ); 1492 }, function( reason ) { 1493 console.log( 'Script Loaded Error' ); 1494 }); 1495 }, 1496 1497 elementorFrontendInit: function( $templateContainer ) { 1498 1499 $templateContainer.find( 'div[data-element_type]' ).each( function() { 1500 var $this = $( this ), 1501 elementType = $this.data( 'element_type' ); 1502 1503 if ( ! elementType ) { 1504 return; 1505 } 1506 1507 try { 1508 if ( 'widget' === elementType ) { 1509 elementType = $this.data( 'widget_type' ); 1510 1511 if ( window.elementorFrontend && window.elementorFrontend.hooks ) { 1512 window.elementorFrontend.hooks.doAction( 'frontend/element_ready/widget', $this, $ ); 1513 } 1514 } 1515 1516 if ( window.elementorFrontend && window.elementorFrontend.hooks ) { 1517 window.elementorFrontend.hooks.doAction( 'frontend/element_ready/global', $this, $ ); 1518 window.elementorFrontend.hooks.doAction( 'frontend/element_ready/' + elementType, $this, $ ); 1519 } 1520 1521 } catch ( err ) { 1522 console.log(err); 1523 1524 $this.remove(); 1525 1526 return false;
1527 } 1528 } ); 1529 } 1530 1531 }; 1532 1533 jetMenu.init(); 1534 1535} ( jQuery ) );
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.