1( function( $ ) { 2 'use strict'; 3 4 /** 5 * JetMegaMenuClass 6 */ 7 class JetMegaMenuClass { 8 9 /** 10 * [constructor description] 11 * @return {[type]} [description] 12 */ 13 constructor( instance, options ) { 14 this.defaultSettings = { 15 menuId: '0', 16 menuUniqId: window.jetMenu.getUniqId(), 17 layout: 'horizontal', 18 subTrigger: 'item', // item, submarker 19 subEvent: 'click', // hover, click 20 rollUp: true, 21 breakpoint: 768, // Minimal menu width, when this plugin activates 22 mouseLeaveDelay: 500, 23 megaWidthType: 'container', 24 megaWidthSelector: '', 25 classes: { 26 instance: 'menu', 27 menuContainer: 'menu-container', 28 menuList: 'menu-list', 29 menuItem: 'menu-item', 30 menuItemLink: 'menu-item__link', 31 subMenuContainer: 'sub-menu', 32 subMenuList: 'sub-menu__list', 33 megaContainer: 'mega-container', 34 } 35 } 36 37 this.$instance = $( instance ); 38 this.settings = $.extend( this.defaultSettings, options ); 39 this.$window = $( window ); 40 this.$document = $( document ); 41 this.$body = $( 'body' ); 42 this.isRTL = this.$body.hasClass( 'rtl' ); 43 this.isDropdownState = false; 44 45 this.createInstance(); 46 } 47 48 createInstance() { 49 this.$menuList = $( `.${ this.settings.classes.menuList }`, this.$instance ); 50 this.$menuItems = $( `>.${ this.settings.classes.menuItem }:not(.${ this.settings.classes.menuItem }--roll-up)`, this.$menuList ); 51 this.$rollUpItem = $( `>.${ this.settings.classes.menuItem }--roll-up`, this.$menuList ); 52 53 this.menuItemsData = this.$menuItems.toArray().map( function( item ) { 54 return { 55 element: item, 56 outerWidth: $( item ).outerWidth( true ), 57 offsetLeft: $( item )[0].offsetLeft, 58 } 59 } ); 60 61 this.initWatcher( 50 ); 62 this.initEvents(); 63 this.maybeRollUpItems(); 64 this.rebuildSubContainers(); 65 this.watchTick(); 66 67 this.$instance.addClass( `${ this.settings.classes.instance }--inited` ); 68 this.$document.trigger( 'JetMegaMenuInited' ); 69 } 70 71 initEvents() { 72 let debounceTimer, 73 eventHandler = 'JetMegaMenu', 74 $itemTargetSelector = 'item' === this.settings.subTrigger ? `.${ this.settings.classes.menuItem } > .${ this.settings.classes.menuItem }__inner` : `.${ this.settings.classes.menuItem } > .${ this.settings.classes.menuItem }__inner .${ this.settings.classes.menuItem }__dropdown`; 75 76 switch ( this.settings.subEvent ) { 77 case 'hover': 78 this.$instance.on( `mouseenter.${ eventHandler }`, `.${ this.settings.classes.menuItem } > .${ this.settings.classes.menuItem }__inner`, { instance: this }, ( event ) => { 79 let $target = $( event.target ), 80 $menuItem = $target.parents( `.${ this.settings.classes.menuItem }` ), 81 $subContainer = $( `.${ this.settings.classes.subMenuContainer }:first, .${ this.settings.classes.megaContainer }:first`, $menuItem ), 82 templateId = $subContainer.data( 'template-id' ) || false; 83 84 $( `.${ this.settings.classes.menuItem }--hover`, this.$instance ).removeClass( `${ this.settings.classes.menuItem }--hover` ); 85 86 if ( $menuItem.hasClass( `${ this.settings.classes.menuItem }-has-children` ) ) { 87 $menuItem.addClass( `${ this.settings.classes.menuItem }--hover` ); 88 89 if ( templateId ) { 90 //instance.maybeTemplateLoad( templateId, subMenu ); 91 } 92 } 93 } ); 94 95 this.$instance.on( `mouseleave.${ eventHandler }`, `.${ this.settings.classes.menuItem } > .${ this.settings.classes.menuItem }__inner`, ( event ) => { /* Item Mouse Leave Event */ } ); 96 break; 97 98 case 'click': 99 100 this.$instance.on( `click.${ eventHandler }`, $itemTargetSelector, ( event ) => { 101 event.preventDefault(); 102 event.stopPropagation(); 103 104 let $currentTarget = $( event.currentTarget ), 105 $menuItem = $currentTarget.closest( `.${ this.settings.classes.menuItem }` ), 106 $siblingsItems = $menuItem.siblings(`.${ this.settings.classes.menuItem }-has-children` ), 107 $subContainer = $( `.${ this.settings.classes.subMenuContainer }:first, .${ this.settings.classes.megaContainer }`, $menuItem ), 108 templateId = $subContainer.data( 'template-id' ) || false; 109 110 if ( $siblingsItems.length ) { 111 $siblingsItems.removeClass( `${ this.settings.classes.menuItem }--hover` ); 112 $( `.${ this.settings.classes.menuItem }-has-children`, $siblingsItems ).removeClass( `${ this.settings.classes.menuItem }--hover` ); 113 } 114 115 if ( $menuItem.hasClass( `${ this.settings.classes.menuItem }-has-children` ) ) { 116 if ( ! $menuItem.hasClass( `${ this.settings.classes.menuItem }--hover` ) ) { 117 $menuItem.addClass( `${ this.settings.classes.menuItem }--hover` ); 118 } else { 119 $menuItem.removeClass( `${ this.settings.classes.menuItem }--hover` ); 120 } 121 122 if ( templateId ) { 123 //instance.maybeTemplateLoad( templateId, subMenu ); 124 } 125 } else { 126 127 } 128 } ); 129 break; 130 } 131 132 this.$instance.on( `mouseenter.${ eventHandler }`, `.${ this.settings.classes.subMenuContainer }, .${ this.settings.classes.megaContainer }`, ( event ) => { 133 clearTimeout( debounceTimer ); 134 } ); 135 136 this.$instance.on( `mouseenter.${ eventHandler }`, ( event ) => { 137 clearTimeout( debounceTimer ); 138 } ); 139 140 this.$instance.on( `mouseleave.${ eventHandler }`, ( event ) => { 141 debounceTimer = setTimeout( () => { 142 $( `.${ this.settings.classes.menuItem }--hover`, this.$instance ).removeClass( `${ this.settings.classes.menuItem }--hover` ); 143 }, this.settings.mouseLeaveDelay ); 144 } ); 145 146 this.$window.on( `orientationchange.${ eventHandler } resize.${ eventHandler }`, ( event ) => { 147 $( `.${ this.settings.classes.menuItem }`, this.$instance ).removeClass( `${ this.settings.classes.menuItem }--hover` ); 148 this.$instance.removeClass( `${ this.settings.classes.instance }--dropdown-open` ); 149 } ); 150 151 this.$document.on( `touchend.${ eventHandler }`, ( event ) => { 152 153 if ( $( event.target ).closest( `.${ this.settings.classes.menuItem }` ).length ) { 154 return; 155 } 156 157 $( `.${ this.settings.classes.menuItem }`, this.$instance ).removeClass( `${ this.settings.classes.menuItem }--hover` ); 158 } ); 159 160 this.$instance.on( 'watchTickEventResetRegularState', ( event ) => { 161 this.resetRegularState(); 162 163 if ( this.$rollUpItem[0] ) { 164 $( `.${ this.settings.classes.subMenuList }:first`, this.$rollUpItem ).empty(); 165 this.$rollUpItem[0].hidden = true; 166 } 167 168 for ( let index = 0; index < this.menuItemsData.length; index++ ) { 169 this.menuItemsData[ index ].element.hidden = false;
170 } 171 } ); 172 173 this.$instance.on( 'watchTickEventResetDropdownState', ( event ) => { 174 this.resetDropdownState(); 175 this.$instance.removeClass( `${ this.settings.classes.instance }--dropdown-open` ); 176 } ); 177 178 this.$instance.on( `click.${ eventHandler }`, `.${ this.settings.classes.instance }-toggle`, ( event ) => { 179 180 if ( ! this.$instance.hasClass( `${ this.settings.classes.instance }--dropdown-open` ) ) { 181 this.$instance.addClass( `${ this.settings.classes.instance }--dropdown-open` ); 182 } else { 183 this.$instance.removeClass( `${ this.settings.classes.instance }--dropdown-open` ); 184 } 185 } ); 186 187 } 188 189 /** 190 * Init watcher function. 191 * 192 * @param {number} Watcher debounce delay. 193 * @return {void} 194 */ 195 initWatcher( delay = 10 ) { 196 $( window ).off( `resize.JetMegaMenu${ this.settings['menuUniqId'] }` ).on( `resize.JetMegaMenu${ this.settings['menuUniqId'] } orientationchange.JetMegaMenu${ this.settings['menuUniqId'] }`, this.debounce( delay, this.watchTick.bind( this ) ) ); 197 this.$instance.trigger( 'containerResize' ); 198 } 199 200 /** 201 * Responsive menu watcher callback. 202 * 203 * @param {Object} Resize or Orientationchange event. 204 * @return {void} 205 */ 206 watchTick( event ) { 207 208 if ( this.isDropdown() ) { 209 210 if ( ! this.isDropdownState ) { 211 this.$instance.trigger( 'watchTickEventResetRegularState' ); 212 } 213 214 this.isDropdownState = true; 215 this.$instance.removeClass( `${ this.settings.classes.instance }--layout-horizontal ${ this.settings.classes.instance }--layout-vertical` ); 216 this.$instance.addClass( `${ this.settings.classes.instance }--layout-dropdown` ); 217 this.$instance.trigger( 'watchTickEventDropdown' ); 218 } else { 219 220 if ( this.isDropdownState ) { 221 this.$instance.trigger( 'watchTickEventResetDropdownState' ); 222 } 223 224 this.isDropdownState = false; 225 this.$instance.removeClass( `${ this.settings.classes.instance }--layout-dropdown` ); 226 this.$instance.addClass( `${ this.settings.classes.instance }--layout-${ this.settings.layout }` ); 227 this.$instance.trigger( `watchTickEventRegular` ); 228 this.$instance.trigger( `watchTickEventRegular--${ this.settings.layout }` ); 229 } 230 231 this.$instance.trigger( 'watchTickEvent' ); 232 } 233 234 /** 235 * Rollup rebuilding function. 236 * 237 * @return {void} 238 */ 239 maybeRollUpItems() { 240 this.$instance.on( 'watchTickEventRegular--horizontal', ( event ) => { 241 242 if ( ! this.settings.rollUp ) { 243 return false; 244 } 245 246 let mainMenuWidth = this.$instance.width(), 247 visibleItemsArray = [], 248 hiddenItemsArray = []; 249 250 for ( let index = 0; index < this.menuItemsData.length; index++ ) { 251 let itemData = this.menuItemsData[ index ], 252 nextItemData = this.menuItemsData[ index + 1 ] || false, 253 offsetLeft = nextItemData ? nextItemData.offsetLeft : itemData.offsetLeft + itemData.outerWidth, 254 item = itemData.element; 255 256 if ( offsetLeft + this.$rollUpItem.outerWidth( true ) > mainMenuWidth ) { 257 item.hidden = true; 258 hiddenItemsArray.push( item ); 259 } else { 260 item.hidden = false; 261 visibleItemsArray.push( item ); 262 } 263 } 264 265 $( `.${ this.settings.classes.subMenuList }:first`, this.$rollUpItem ).empty(); 266 for ( let hiddenMenuItem of hiddenItemsArray ) { 267 let $hiddenClone = $( hiddenMenuItem ).clone(); 268 269 $hiddenClone[0].hidden = false; 270 271 $( `>.${ this.settings.classes.menuItem }__inner >.${ this.settings.classes.menuItemLink }`, $hiddenClone ).toggleClass( `${ this.settings.classes.menuItemLink }--top-level ${ this.settings.classes.menuItemLink }--sub-level` ); 272 $( `.${ this.settings.classes.subMenuList }:first`, this.$rollUpItem ).append( $hiddenClone ); 273 } 274 275 this.$rollUpItem[0].hidden = hiddenItemsArray.length ? false : true; 276 277 this.$instance.trigger( 'rollUpItemsEvent' ); 278 } ) 279 } 280 281 /** 282 * Rebuild SubContainers function. 283 * 284 * @return {void} 285 */ 286 rebuildSubContainers() { 287 this.$instance.on( 'watchTickEventRegular--horizontal', ( event ) => { 288 let $megaMenuList = $( `.${ this.settings.classes.megaContainer }`, this.$instance ), 289 $subMenuList = $( `.${ this.settings.classes.subMenuContainer }`, this.$instance ), 290 subInverseClass = `${ this.settings.classes.subMenuContainer }--inverse`, 291 instanceWidth = this.$instance.width(), 292 instanceOffset = this.$instance.offset(); 293 294 $subMenuList.each( ( index, element ) => { 295 let $element = $( element ); 296 297 if ( this.isOffscreenX( element ) ) { 298 $element.addClass( subInverseClass ); 299 } else { 300 $element.removeClass( subInverseClass ); 301 } 302 } ); 303 304 switch( this.settings.megaWidthType ) { 305 case 'container': 306 $megaMenuList.each( ( index, element ) => { 307 let $element = $( element ), 308 $elementPosition = $element.data( 'position' ), 309 elementOffset = $element.offset(), 310 elementDeltaOffset = 'default' === $elementPosition ? ( instanceOffset.left - elementOffset.left ) : 0; 311 312 $element.css( { 313 '--jmm-submenu-width': `${ instanceWidth }px`, 314 '--jmm-submenu-delta-x-offset': `${ elementDeltaOffset }px` 315 } ); 316 } ); 317 318 break; 319 case 'selector': 320 let $customSelector = $( this.settings.megaWidthSelector ); 321 322 if ( $customSelector[0] ) { 323 let selectorWidth = $customSelector.width(), 324 selectorOffset = $customSelector.offset(); 325 326 $megaMenuList.each( ( index, element ) => { 327 let $element = $( element ), 328 $elementPosition = $element.data( 'position' ), 329 elementOffset = $element.offset(), 330 elementDeltaOffset = 'default' === $elementPosition ? ( selectorOffset.left - elementOffset.left ) : 0; 331 332 $element.css( { 333 '--jmm-submenu-width': `${ selectorWidth }px`, 334 '--jmm-submenu-delta-x-offset': `${ elementDeltaOffset }px` 335 } ); 336 } ); 337 338 } 339 340 break; 341 case 'items': 342 let $lastItem = $( `.${ this.settings.classes.menuItem }--top-level:not([hidden]):last`, this.$instance ), 343 $firstItem = $( `.${ this.settings.classes.menuItem }--top-level:not([hidden]):first`, this.$instance ), 344 lastItemBounding = $lastItem[0].getBoundingClientRect(), 345 firstItemBounding = $firstItem[0].getBoundingClientRect(), 346 itemsWidth = lastItemBounding.x + lastItemBounding.width - firstItemBounding.x; 347 348 $megaMenuList.each( ( index, element ) => { 349 let $element = $( element ), 350 $elementPosition = $element.data( 'position' ), 351 elementOffset = $element.offset(), 352 elementDeltaOffset = 'default' === $elementPosition ? ( instanceOffset.left - elementOffset.left ) : 0; 353 354 $element.css( { 355 '--jmm-submenu-width': `${ itemsWidth }px`, 356 '--jmm-submenu-delta-x-offset': `${ elementDeltaOffset }px` 357 } ); 358 } ); 359 break; 360 } 361 } ); 362
363 this.$instance.on( 'watchTickEventRegular--vertical', ( event ) => { 364 let $megaMenuList = $( `.${ this.settings.classes.megaContainer }`, this.$instance ), 365 $subMenuList = $( `.${ this.settings.classes.subMenuContainer }`, this.$instance ), 366 instanceWidth = this.$instance.width(), 367 instanceHeight = this.$instance.height(), 368 instanceOffset = this.$instance.offset(), 369 windowWidth = this.$window.outerWidth( true ), 370 subInverseClass = `${ this.settings.classes.subMenuContainer }--inverse`, 371 megaInverseClass = `${ this.settings.classes.megaContainer }--inverse`; 372 373 $subMenuList.each( ( index, element ) => { 374 let $element = $( element ); 375 376 if ( this.isOffscreenX( element ) ) { 377 $element.addClass( subInverseClass ); 378 } else { 379 $element.removeClass( subInverseClass ); 380 } 381 } ); 382 383 $megaMenuList.each( ( index, element ) => { 384 let $element = $( element ), 385 $elementPosition = $element.data( 'position' ), 386 $parentElement = $element.parent(), 387 elementOffset = $element.offset(), 388 elementDeltaOffsetX = ( instanceOffset.left - elementOffset.left ) + instanceWidth, 389 elementDeltaOffsetY = 'default' === $elementPosition ? ( instanceOffset.top - elementOffset.top ) : 0, 390 elementDeltaWidth = ( elementDeltaOffsetX + $element.width() ); 391 392 if ( $parentElement.hasClass(`${ this.settings.classes.menuItem }--top-level` ) ) { 393 $element.css( { 394 //'--jmm-submenu-width': `${ instanceWidth }px`, 395 '--jmm-submenu-min-height': `${ instanceHeight }px`, 396 //'--jmm-submenu-delta-x-offset': `${ elementDeltaOffsetX }px`, 397 '--jmm-submenu-delta-y-offset': `${ elementDeltaOffsetY }px` 398 } ); 399 } 400 401 if ( this.isOffscreenX( element ) ) { 402 $element.addClass( megaInverseClass ); 403 } else { 404 $element.removeClass( megaInverseClass ); 405 } 406 } ); 407 } ); 408 } 409 410 /** 411 * Reset Regular State 412 * 413 * @return {void} 414 */ 415 resetRegularState() {} 416 417 /** 418 * Reset Dropdown State 419 * 420 * @return {void} 421 */ 422 resetDropdownState() {} 423 424 /** 425 * Get mobile status. 426 * 427 * @return {boolean} Mobile Status 428 */ 429 isDropdown() { 430 return ( this.$window.width() < this.settings.breakpoint || 'dropdown' === this.settings.layout ) ? true : false; 431 } 432 433 /** 434 * 435 * @param element 436 * @returns {boolean} 437 */ 438 isOffscreenX( element ) { 439 let rect = element.getBoundingClientRect(); 440 441 return ( 442 rect.x < 0 || ( rect.x + rect.width ) > window.innerWidth 443 ); 444 } 445 446 /** 447 * Mobile and tablet check funcion. 448 * 449 * @return {boolean} Mobile Status 450 */ 451 mobileAndTabletcheck() { 452 let check = false; 453 454 (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 )|
454sy(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); 455 456 return check; 457 } 458 459 /** 460 * Debounce the function call 461 * 462 * @param {number} threshold The delay. 463 * @param {Function} callback The function. 464 */ 465 debounce( threshold, callback ) { 466 let timeout; 467 468 return function debounced( $event ) { 469 function delayed() { 470 callback.call( this, $event ); 471 timeout = null; 472 } 473 474 if ( timeout ) { 475 clearTimeout( timeout ); 476 } 477 478 timeout = setTimeout( delayed, threshold ); 479 }; 480 } 481 } 482 483 // jQuery plugin 484 $.fn.JetMegaMenu = function( options ) { 485 return this.each( function() { 486 let $this = $( this ), 487 pluginOptions = ( 'object' === typeof options ) ? options : {}; 488 489 if ( ! $this.data( 'JetMegaMenu' ) ) { 490 // create plugin instance (only if not exists) and expose the entire instance API 491 $this.data( 'JetMegaMenu', new JetMegaMenuClass( this, pluginOptions ) ); 492 } 493 } ); 494 }; 495} ( jQuery )); 496 497// JetMenu Public Scripts 498( function( $ ) { 499 'use strict'; 500 501 window.jetMenu = { 502 503 addedScripts: {}, 504 505 addedStyles: {}, 506 507 addedAssetsPromises: [], 508 509 initedMobileRenderInstance: [], 510 511 eventBus: new Vue(), 512 513 $body: $( 'body' ), 514 515 init: function() { 516 this.initLocationMenuRender(); 517 this.mobileVueComponents(); 518 this.initMobileRender(); 519 }, 520 521 initLocationMenuRender: function() { 522 523 let $megaMenu = $( '.jet-mega-menu--location-wp-nav' ); 524 525 if ( $megaMenu[0] ) { 526 let settings = $megaMenu.data( 'settings' ); 527 528 $megaMenu.JetMegaMenu( { 529 rollUp: settings.rollUp, 530 layout: settings.layout, 531 subTrigger: settings.subTrigger, 532 subEvent: settings.subEvent, 533 breakpoint: settings.breakpoint, 534 megaWidthType: settings.megaWidthType, 535 megaWidthSelector: settings.megaWidthSelector, 536 classes: { 537 instance: 'jet-mega-menu', 538 menuContainer: 'jet-mega-menu-container', 539 menuList: 'jet-mega-menu-list', 540 menuItem: 'jet-mega-menu-item', 541 menuItemLink: 'jet-mega-menu-item__link', 542 subMenuContainer: 'jet-mega-menu-sub-menu', 543 subMenuList: 'jet-mega-menu-sub-menu__list', 544 megaContainer: 'jet-mega-menu-mega-container', 545 } 546 } ); 547 } 548 549 }, 550 551 initMobileRender: function() { 552 553 let mobileMenuList = $( '.jet-mobile-menu--location-wp-nav' ); 554 555 if ( ! mobileMenuList[0] ) { 556 return false; 557 } 558 559 if ( 'true' === window.jetMenuPublicSettings.devMode ) { 560 Vue.config.devtools = true; 561 } 562 563 mobileMenuList.each( function() { 564 let $this = $( this ), 565 menuInstanceId = $this.attr( 'id' ), 566 menuId = $this.data( 'menu-id' ) || false, 567 menuOptions = $this.data( 'menu-options' ) || {}; 568 569 jetMenu.createMobileRenderInstance( menuInstanceId, menuId, menuOptions ); 570 } ); 571 }, 572 573 createMobileRenderInstance: function( menuInstanceId, menuId, menuOptions ) { 574 575 if ( jetMenu.initedMobileRenderInstance.includes( menuInstanceId ) ) { 576 return; 577 } 578 579 jetMenu.initedMobileRenderInstance.push( menuInstanceId ); 580 581 let mobileRenderInstance = new Vue( { 582 el: '#' + menuInstanceId, 583 data: { 584 uniqId: menuInstanceId, 585 menuOptions: menuOptions, 586 refsHtml: {}, 587 }, 588 mounted: function() { 589 let refsHtml = {}; 590 591 for ( var ref in this.$refs ) { 592 Object.assign( refsHtml, { [ ref ]: this.$refs[ ref ].innerHTML } ); 593 } 594 595 this.refsHtml = refsHtml; 596 } 597 } ); 598 }, 599 600 mobileVueComponents: function() { 601 602 Vue.component( 'mobile-menu-item', { 603 template: '#mobile-menu-item-template', 604 605 props: { 606 itemDataObject: Object, 607 depth: Number 608 }, 609 610 data: function() { 611 return ( { 612 ajaxRequest: null, 613 templateLoadStatus: false, 614 subDropdownVisible: false 615 } ) 616 }, 617 618 computed: { 619 620 itemClasses: function() { 621 let itemClasses = [ 622 'jet-mobile-menu__item', 623 'jet-menu-item-' + this.itemDataObject.itemId, 624 'jet-mobile-menu__item--sub-trigger-' + ( this.$root.menuOptions.subTrigger || 'item' ), 625 ]; 626
627 let customClasses = this.itemDataObject.classes; 628 629 if ( 0 !== customClasses.length ) { 630 itemClasses = itemClasses.concat( customClasses ); 631 } 632 633 if ( window.location.href === this.itemDataObject.url ) { 634 itemClasses.push( 'jet-mobile-menu__item--active' ); 635 } 636 637 return itemClasses; 638 }, 639 640 itemLinkClasses: function() { 641 let classes = [ 642 'mobile-link', 643 0 === this.depth ? 'mobile-top-level-link' : 'mobile-sub-level-link', 644 ]; 645 646 return classes; 647 }, 648 649 isСhildrenDefine: function() { 650 return this.itemDataObject.children ? true : false; 651 }, 652 653 isTemplateDefine: function() { 654 return false !== this.itemDataObject.elementorTemplateId ? true : false; 655 }, 656 657 isSub: function() { 658 return this.isСhildrenDefine || this.isTemplateDefine ? true : false; 659 }, 660 661 isTopLevel: function() { 662 return 0 === this.depth ? true : false; 663 }, 664 665 isDropdownLayout: function() { 666 return this.isSub && ! this.isTemplateDefine && 'dropdown' === this.$root.menuOptions.subOpenLayout; 667 }, 668 669 depthClass: function() { 670 return 0 === this.depth ? 'mobile-top-level-link' : 'mobile-sub-level-link'; 671 }, 672 673 dropdownIconHtml: function() { 674 let dropdownIcon = this.$root.refsHtml.dropdownIcon ? this.$root.refsHtml.dropdownIcon : '<span class="dashicons dashicons-arrow-right"></span>', 675 dropdownOpenedIcon = this.$root.refsHtml.dropdownOpenedIcon ? this.$root.refsHtml.dropdownOpenedIcon : '<span class="dashicons dashicons-arrow-down"></span>'; 676 677 if ( this.subDropdownVisible ) { 678 dropdownIcon = dropdownOpenedIcon; 679 } 680 681 return dropdownIcon; 682 }, 683 684 itemIconHtml: function() { 685 return this.itemDataObject.itemIcon; 686 }, 687 688 isIconVisible: function() { 689 let iconVisible = this.$root.menuOptions.itemIconVisible; 690 691 return ! iconVisible || '' === this.itemDataObject.itemIcon || ! this.itemDataObject.itemIcon ? false : true; 692 }, 693 694 isBadgeVisible: function() { 695 let badgeVisible = this.$root.menuOptions.itemBadgeVisible; 696 697 return false === badgeVisible || '' === this.itemDataObject.badgeText || ! this.itemDataObject.badgeText ? false : true; 698 }, 699 700 isDescVisible: function() { 701 let descVisible = this.$root.menuOptions.itemDescVisible; 702 703 return false === descVisible || '' === this.itemDataObject.description || ! this.itemDataObject.description ? false : true; 704 }, 705 706 loaderColor: function() { 707 return this.$root.menuOptions.loaderColor || '#3a3a3a'; 708 }, 709 }, 710 711 methods: { 712 itemSubHandler: function( event ) { 713 let target = event.target, 714 mobileLink = $( target ).closest( '.mobile-link' ); 715 716 if ( 'item' !== this.$root.menuOptions.subTrigger ) { 717 return; 718 } 719 720 if ( this.isSub && mobileLink ) { 721 event.preventDefault(); 722 } 723 724 if ( ! this.isSub && mobileLink && this.$root.menuOptions.closeAfterNavigate ) { 725 jetMenu.eventBus.$emit( 'closeMenu', { 726 menuUniqId: this.$root.menuOptions.menuUniqId, 727 } ); 728 } 729 730 this.switchToSub( event ); 731 }, 732 733 markerSubHandler: function( event ) { 734 735 if ( 'submarker' !== this.$root.menuOptions.subTrigger ) { 736 return; 737 } 738 739 this.switchToSub( event ); 740 }, 741 742 switchToSub: function( event ) { 743 744 if ( ! this.isSub ) { 745 return; 746 } 747 748 if ( ! this.isTemplateDefine ) { 749 750 if ( this.isDropdownLayout ) { 751 this.subDropdownVisible = !this.subDropdownVisible; 752 753 return; 754 } 755 756 jetMenu.eventBus.$emit( 'itemsSubSwitch', { 757 menuUniqId: this.$root.menuOptions.menuUniqId, 758 id: this.itemDataObject.id, 759 name: this.itemDataObject.name, 760 children: this.itemDataObject.children || false 761 } ); 762 763 } else { 764 765 if ( ! this.itemDataObject.elementorContent ) { 766 this.getElementorTemplate(); 767 } else { 768 769 jetMenu.eventBus.$emit( 'showTemplateContent', { 770 menuUniqId: this.$root.menuOptions.menuUniqId, 771 id: this.itemDataObject.id, 772 name: this.itemDataObject.name, 773 elementorContent: this.itemDataObject.elementorContent 774 } ); 775 } 776 } 777 }, 778 779 getElementorTemplate: function() { 780 var vueInstance = this; 781 782 vueInstance.ajaxRequest = $.ajax( { 783 type: 'GET', 784 url: window.jetMenuPublicSettings.templateApiUrl, 785 dataType: 'json', 786 data: { 787 'id': vueInstance.itemDataObject.elementorTemplateId, 788 'dev': window.jetMenuPublicSettings.devMode 789 }, 790 beforeSend: function( jqXHR, ajaxSettings ) { 791 792 if ( null !== vueInstance.ajaxRequest ) { 793 vueInstance.ajaxRequest.abort(); 794 } 795 796 vueInstance.templateLoadStatus = true; 797 798 jqXHR.setRequestHeader( 'X-WP-Nonce', window.jetMenuPublicSettings.restNonce ); 799 }, 800 success: function( responce, textStatus, jqXHR ) { 801 var templateContent = responce['template_content'], 802 templateScripts = responce['template_scripts'], 803 templateStyles = responce['template_styles']; 804 805 for ( var scriptHandler in templateScripts ) { 806 jetMenu.addedAssetsPromises.push( jetMenu.loadScriptAsync( scriptHandler, templateScripts[ scriptHandler ] ) ); 807 } 808 809 for ( var styleHandler in templateStyles ) { 810 jetMenu.addedAssetsPromises.push( jetMenu.loadStyle( styleHandler, templateStyles[ styleHandler ] ) ); 811 } 812 813 vueInstance.templateLoadStatus = false;
814 815 vueInstance.itemDataObject.elementorContent = templateContent; 816 817 jetMenu.eventBus.$emit( 'showTemplateContent', { 818 menuUniqId: vueInstance.$root.menuOptions.menuUniqId, 819 id: vueInstance.itemDataObject.id, 820 name: vueInstance.itemDataObject.name, 821 elementorContent: vueInstance.itemDataObject.elementorContent 822 } ); 823 } 824 } ); 825 } 826 } 827 828 }); 829 830 Vue.component( 'mobile-menu-list', { 831 template: '#mobile-menu-list-template', 832 props: { 833 depth: Number, 834 childrenObject: Object 835 } 836 } ); 837 838 Vue.component( 'mobile-menu', { 839 template: '#mobile-menu-template', 840 841 data: function() { 842 return ( { 843 menuOpen: false, 844 children: false, 845 itemsRawData: {}, 846 trail:[], 847 breadcrumbsData: [], 848 animation: 'items-next-animation', 849 ajaxRequest: null, 850 templateVisible: false, 851 instanceLoadStatus: false, 852 itemTemplateContent: false, 853 headerTemplate: this.$root.menuOptions['headerTemplate'] || 0, 854 headerContent: false, 855 headerTemplateVisible: false, 856 beforeTemplate: this.$root.menuOptions['beforeTemplate'] || 0, 857 beforeContent: false, 858 afterTemplate: this.$root.menuOptions['afterTemplate'] || 0, 859 afterContent: false, 860 ajaxPromises: [], 861 } ) 862 }, 863 864 mounted: function() { 865 let vueInstance = this; 866 867 if ( this.menuOpen ) { 868 jetMenu.$body.addClass( 'jet-mobile-menu-visible' ); 869 870 if ( 'slide-out' === this.$root.menuOptions.menuLayout ) { 871 jetMenu.$body.addClass( 'jet-menu-body-blocker' ); 872 } 873 } 874 875 this.ajaxPromises.push( 876 new Promise( function( resolve, reject ) { 877 $.ajax( { 878 type: 'GET', 879 url: window.jetMenuPublicSettings.menuItemsApiUrl, 880 dataType: 'json', 881 data: { 882 'menu_id': vueInstance.menuId, 883 'dev': window.jetMenuPublicSettings.devMode, 884 'lang': window.jetMenuPublicSettings.wpmlLanguageCode || false 885 }, 886 beforeSend: function( jqXHR, ajaxSettings ) { 887 jqXHR.setRequestHeader( 'X-WP-Nonce', window.jetMenuPublicSettings.restNonce ); 888 }, 889 success: function( responce, textStatus, jqXHR ) { 890 let responceData = responce.data.items; 891 892 vueInstance.itemsRawData = responceData; 893 894 resolve(); 895 } 896 } ); 897 } ) 898 ); 899 900 if ( 0 !== +this.headerTemplate ) { 901 this.ajaxPromises.push( 902 new Promise( function( resolve, reject ) { 903 $.ajax( { 904 type: 'GET', 905 url: window.jetMenuPublicSettings.templateApiUrl, 906 dataType: 'json', 907 data: { 908 'id': vueInstance.headerTemplate, 909 'dev': window.jetMenuPublicSettings.devMode 910 }, 911 beforeSend: function( jqXHR, ajaxSettings ) { 912 jqXHR.setRequestHeader( 'X-WP-Nonce', window.jetMenuPublicSettings.restNonce ); 913 }, 914 success: function( responce, textStatus, jqXHR ) { 915 let templateContent = responce['template_content'], 916 templateScripts = responce['template_scripts'], 917 templateStyles = responce['template_styles']; 918 919 for ( let scriptHandler in templateScripts ) { 920 jetMenu.addedAssetsPromises.push( jetMenu.loadScriptAsync( scriptHandler, templateScripts[ scriptHandler ] ) ); 921 } 922 923 for ( let styleHandler in templateStyles ) { 924 jetMenu.addedAssetsPromises.push( jetMenu.loadStyle( styleHandler, templateStyles[ styleHandler ] ) ); 925 } 926 927 vueInstance.headerContent = templateContent; 928 vueInstance.headerTemplateVisible = true; 929 930 resolve(); 931 } 932 } ); 933 } ) 934 ); 935 } 936 937 if ( 0 !== +this.beforeTemplate ) { 938 this.ajaxPromises.push( 939 new Promise( function( resolve, reject ) { 940 $.ajax( { 941 type: 'GET', 942 url: window.jetMenuPublicSettings.templateApiUrl, 943 dataType: 'json', 944 data: { 945 'id': vueInstance.beforeTemplate, 946 'dev': window.jetMenuPublicSettings.devMode 947 }, 948 beforeSend: function( jqXHR, ajaxSettings ) { 949 jqXHR.setRequestHeader( 'X-WP-Nonce', window.jetMenuPublicSettings.restNonce ); 950 }, 951 success: function( responce, textStatus, jqXHR ) { 952 let templateContent = responce['template_content'], 953 templateScripts = responce['template_scripts'], 954 templateStyles = responce['template_styles']; 955 956 for ( let scriptHandler in templateScripts ) { 957 jetMenu.addedAssetsPromises.push( jetMenu.loadScriptAsync( scriptHandler, templateScripts[ scriptHandler ] ) ); 958 } 959 960 for ( let styleHandler in templateStyles ) { 961 jetMenu.addedAssetsPromises.push( jetMenu.loadStyle( styleHandler, templateStyles[ styleHandler ] ) ); 962 } 963 964 vueInstance.beforeContent = templateContent; 965 966 resolve(); 967 } 968 } ); 969 } ) 970 ); 971 } 972 973 if ( 0 !== +this.afterTemplate ) { 974 this.ajaxPromises.push( 975 new Promise( function( resolve, reject ) { 976 $.ajax( { 977 type: 'GET', 978 url: window.jetMenuPublicSettings.templateApiUrl, 979 dataType: 'json', 980 data: { 981 'id': vueInstance.afterTemplate, 982 'dev': window.jetMenuPublicSettings.devMode 983 }, 984 beforeSend: function( jqXHR, ajaxSettings ) { 985 jqXHR.setRequestHeader( 'X-WP-Nonce', window.jetMenuPublicSettings.restNonce ); 986 }, 987 success: function( responce, textStatus, jqXHR ) { 988 let templateContent = responce['template_content'], 989 templateScripts = responce['template_scripts'], 990 templateStyles = responce['template_styles']; 991 992 for ( let scriptHandler in templateScripts ) { 993 jetMenu.addedAssetsPromises.push( jetMenu.loadScriptAsync( scriptHandler, templateScripts[ scriptHandler ] ) ); 994 } 995 996 for ( let styleHandler in templateStyles ) { 997 jetMenu.addedAssetsPromises.push( jetMenu.loadStyle( styleHandler, templateStyles[ styleHandler ] ) ); 998 } 999 1000 vueInstance.afterContent = templateContent; 1001 resolve(); 1002 } 1003 } ); 1004 } ) 1005 ); 1006 } 1007 1008 this.instanceLoadStatus = true; 1009 1010 Promise.all( this.ajaxPromises ).then( function() { 1011 vueInstance.instanceLoadStatus = false;
1012 }, function( reason ) { 1013 console.log( 'Script Loaded Error' ); 1014 } ); 1015 1016 jetMenu.eventBus.$on( 'itemsSubSwitch', function ( payLoad ) { 1017 1018 if ( vueInstance.$root.menuOptions.menuUniqId !== payLoad.menuUniqId ) { 1019 return; 1020 } 1021 1022 vueInstance.trail.push( payLoad.children ); 1023 vueInstance.children = payLoad.children; 1024 vueInstance.animation = 'items-next-animation'; 1025 vueInstance.breadcrumbsData.push( payLoad.name ); 1026 } ); 1027 1028 jetMenu.eventBus.$on( 'showTemplateContent', function ( payLoad ) { 1029 1030 if ( vueInstance.$root.menuOptions.menuUniqId !== payLoad.menuUniqId ) { 1031 return; 1032 } 1033 1034 vueInstance.itemTemplateContent = payLoad.elementorContent; 1035 vueInstance.templateVisible = true; 1036 vueInstance.breadcrumbsData.push( payLoad.name ); 1037 vueInstance.animation = 'items-next-animation'; 1038 1039 vueInstance.showTemplateContent(); 1040 } ); 1041 1042 jetMenu.eventBus.$on( 'closeMenu', function( payLoad ) { 1043 1044 if ( vueInstance.$root.menuOptions.menuUniqId !== payLoad.menuUniqId ) { 1045 return; 1046 } 1047 1048 vueInstance.closeMenu(); 1049 } ); 1050 1051 }, 1052 1053 watch: { 1054 menuOpen: function( curr, prev ) { 1055 1056 if ( curr ) { 1057 jetMenu.$body.addClass( 'jet-mobile-menu-visible' ); 1058 1059 if ( 'slide-out' === this.$root.menuOptions.menuLayout ) { 1060 jetMenu.$body.addClass( 'jet-menu-body-blocker' ); 1061 } 1062 1063 this.initTemplatesContent(); 1064 } 1065 1066 if ( ! curr ) { 1067 jetMenu.$body.removeClass( 'jet-mobile-menu-visible' ); 1068 1069 if ( 'slide-out' === this.$root.menuOptions.menuLayout ) { 1070 jetMenu.$body.removeClass( 'jet-menu-body-blocker' ); 1071 } 1072 1073 this.clearStates(); 1074 } 1075 } 1076 }, 1077 1078 computed: { 1079 instanceClass: function() { 1080 let classes = [ 1081 'jet-mobile-menu__instance', 1082 'jet-mobile-menu__instance--' + this.$root.menuOptions.menuLayout + '-layout', 1083 this.$root.menuOptions.menuPosition + '-container-position', 1084 ( this.$root.menuOptions.togglePosition || 'default' ) + '-toggle-position', 1085 ]; 1086 1087 return classes; 1088 }, 1089 1090 menuContainerVisible: function() { 1091 return this.menuOpen && !this.instanceLoadStatus; 1092 }, 1093 1094 menuId: function() { 1095 1096 if ( this.$root.menuOptions.mobileMenuId ) { 1097 return this.$root.menuOptions.mobileMenuId; 1098 } 1099 1100 return this.$root.menuOptions.menuId; 1101 }, 1102 1103 coverVisible: function() { 1104 1105 let avaliableForLayout = [ 1106 'slide-out' 1107 ]; 1108 1109 return avaliableForLayout.includes( this.$root.menuOptions.menuLayout ); 1110 }, 1111 1112 itemsList: function() { 1113 1114 if ( ! this.children ) { 1115 return this.itemsRawData; 1116 } 1117 1118 return this.children; 1119 }, 1120 1121 isClose: function() { 1122 let avaliableForLayout = [ 1123 'slide-out' 1124 ]; 1125 1126 return avaliableForLayout.includes( this.$root.menuOptions.menuLayout ); 1127 }, 1128 1129 isBack: function() { 1130 return this.children || this.templateVisible ? true : false; 1131 }, 1132 1133 isBreadcrumbs: function() { 1134 return this.$root.menuOptions.useBreadcrumb && 0 !== this.breadcrumbsData.length ? true : false; 1135 }, 1136 1137 breadcrumbsPathData: function() { 1138 1139 if ( 'minimal' === this.$root.$root.menuOptions.breadcrumbPath && 1 < this.breadcrumbsData.length ) { 1140 return this.breadcrumbsData.filter( ( item, index, breadcrumbsData ) => { 1141 return index === breadcrumbsData.length - 1; 1142 } ); 1143 } 1144 1145 return this.breadcrumbsData; 1146 }, 1147 1148 depth: function() { 1149 return this.trail.length; 1150 }, 1151 1152 containerPosition: function() { 1153 return this.$root.menuOptions.menuPosition; 1154 }, 1155 1156 showAnimation: function() { 1157 1158 let animation = false; 1159 1160 switch( this.$root.menuOptions.menuLayout ) { 1161 1162 case 'slide-out': 1163 animation = 'right' === this.containerPosition ? 'menu-container-left-animation' : 'menu-container-right-animation'; 1164 break; 1165 1166 case 'dropdown': 1167 animation = 'menu-container-dropdown-animation'; 1168 break; 1169 1170 case 'push': 1171 animation = 'menu-container-expand-animation'; 1172 break; 1173 } 1174 1175 return animation; 1176 }, 1177 1178 toggleClosedIcon: function() { 1179 return this.$root.refsHtml.toggleClosedIcon || ''; 1180 }, 1181 1182 toggleOpenedIcon: function() { 1183 return this.$root.refsHtml.toggleOpenedIcon || ''; 1184 }, 1185 1186 toggleText: function() { 1187 return '' !== this.$root.menuOptions.toggleText ? this.$root.menuOptions.toggleText : false;
1188 }, 1189 1190 closeIcon: function() { 1191 return this.$root.refsHtml.closeIcon || ''; 1192 }, 1193 1194 backIcon: function() { 1195 let backIcon = this.$root.refsHtml.backIcon || '', 1196 backText = '' !== this.$root.menuOptions.backText ? '<span>' + this.$root.menuOptions.backText + '</span>' : '', 1197 backHtml = backIcon + backText; 1198 1199 return backHtml; 1200 }, 1201 1202 backText: function() { 1203 return '' !== this.$root.menuOptions.backText ? this.$root.menuOptions.backText : false; 1204 }, 1205 1206 breadcrumbIcon: function() { 1207 return this.$root.refsHtml.breadcrumbIcon || ''; 1208 }, 1209 1210 loaderColor: function() { 1211 return this.$root.menuOptions.loaderColor || '#3a3a3a'; 1212 }, 1213 1214 toggleLoaderVisible: function() { 1215 return this.$root.menuOptions.toggleLoader && this.instanceLoadStatus && this.menuOpen ? true : false; 1216 }, 1217 1218 beforeTemplateVisible: function() { 1219 return this.beforeContent ? true : false; 1220 }, 1221 1222 afterTemplateVisible: function() { 1223 return this.afterContent ? true : false; 1224 } 1225 1226 }, 1227 1228 methods: { 1229 menuToggle: function() { 1230 this.menuOpen = ! this.menuOpen; 1231 }, 1232 1233 closeMenu: function() { 1234 this.menuOpen = false; 1235 }, 1236 1237 clearStates: function() { 1238 this.trail = []; 1239 this.children = false; 1240 this.breadcrumbsData = []; 1241 this.templateVisible = false; 1242 }, 1243 1244 goBack: function() { 1245 1246 this.animation = 'items-prev-animation'; 1247 1248 if ( ! this.templateVisible ) { 1249 this.$delete( this.trail, this.trail.length - 1 ); 1250 this.children = this.trail.slice(-1)[0] || false; 1251 } else { 1252 this.templateVisible = false; 1253 } 1254 1255 this.$delete(this.breadcrumbsData, this.breadcrumbsData.length - 1); 1256 }, 1257 1258 escapeKeyHandler: function() { 1259 1260 if ( this.isBack ) { 1261 this.goBack(); 1262 } else { 1263 this.closeMenu(); 1264 } 1265 }, 1266 1267 showTemplateContent: function() { 1268 let vueInstance = this; 1269 1270 this.$nextTick( function() { 1271 let $templateContainer = $( vueInstance.$refs['template-content'] ).find( '.jet-mobile-menu__template-content' ); 1272 1273 jetMenu.elementorContentRender( $templateContainer ); 1274 } ); 1275 }, 1276 1277 initTemplatesContent: function() { 1278 let vueInstance = this; 1279 1280 this.$nextTick( function() { 1281 1282 if ( vueInstance.headerContent ) { 1283 let $headerContainer = $( vueInstance.$refs['header-template-content'] ); 1284 1285 jetMenu.elementorContentRender( $headerContainer ); 1286 } 1287 1288 if ( vueInstance.beforeContent ) { 1289 let $beforeContainer = $( vueInstance.$refs['before-template-content'] ); 1290 1291 jetMenu.elementorContentRender( $beforeContainer ); 1292 } 1293 1294 if ( vueInstance.afterContent ) { 1295 let $afterContainer = $( vueInstance.$refs['after-template-content'] ); 1296 1297 jetMenu.elementorContentRender( $afterContainer ); 1298 } 1299 } ); 1300 }, 1301 1302 breadcrumbHandle: function( index ) { 1303 1304 if ( index === this.breadcrumbsData.length ) { 1305 return; 1306 } 1307 1308 if ( 'minimal' === this.$root.menuOptions.breadcrumbPath ) { 1309 this.goBack(); 1310 1311 return; 1312 } 1313 1314 this.animation = 'items-prev-animation'; 1315 this.trail = this.trail.slice( 0, index ); 1316 this.children = this.trail.slice( -1 )[0] || false; 1317 this.templateVisible = false; 1318 this.breadcrumbsData = this.breadcrumbsData.slice( 0, index ); 1319 } 1320 1321 } 1322 }); 1323 }, 1324 1325 loadScriptAsync: function( script, uri ) { 1326 1327 if ( jetMenu.addedScripts.hasOwnProperty( script ) ) { 1328 return script; 1329 } 1330 1331 jetMenu.addedScripts[ script ] = uri; 1332 1333 return new Promise( function( resolve, reject ) { 1334 var tag = document.createElement( 'script' ); 1335 1336 tag.src = uri; 1337 tag.async = true; 1338 tag.onload = function() { 1339 resolve( script ); 1340 }; 1341 1342 document.head.appendChild( tag ); 1343 } ); 1344 }, 1345 1346 loadStyle: function( style, uri ) { 1347 1348 if ( jetMenu.addedStyles.hasOwnProperty( style ) && jetMenu.addedStyles[ style ] === uri) { 1349 return style; 1350 } 1351 1352 jetMenu.addedStyles[ style ] = uri; 1353 1354 return new Promise( function( resolve, reject ) { 1355 var tag = document.createElement( 'link' ); 1356 1357 tag.id = style; 1358 tag.rel = 'stylesheet'; 1359 tag.href = uri; 1360 tag.type = 'text/css'; 1361 tag.media = 'all'; 1362 tag.onload = function() { 1363 resolve( style ); 1364 }; 1365 1366 document.head.appendChild( tag ); 1367 }); 1368 }, 1369 1370 elementorContentRender: function( $templateContainer, templateContent ) { 1371 let content = templateContent || false; 1372 1373 Promise.all( jetMenu.addedAssetsPromises ).then( function( value ) { 1374 1375 if ( templateContent ) { 1376 $templateContainer.html( templateContent ); 1377 } 1378 1379 // Before ajax frontend init 1380 $( window ).trigger( 'jet-menu/ajax/frontend-init/before', { 1381 $container: $templateContainer, 1382 content: content, 1383 } ); 1384 1385 jetMenu.elementorFrontendInit( $templateContainer ); 1386 1387 // Before ajax frontend init 1388 $( window ).trigger( 'jet-menu/ajax/frontend-init/after', { 1389 $container: $templateContainer, 1390 content: content, 1391 } ); 1392 }, function( reason ) { 1393 console.log( 'Script Loaded Error' ); 1394 }); 1395 }, 1396 1397 elementorFrontendInit: function( $templateContainer ) { 1398 1399 $templateContainer.find( 'div[data-element_type]' ).each( function() { 1400 var $this = $( this ), 1401 elementType = $this.data( 'element_type' ); 1402 1403 if ( ! elementType ) { 1404 return; 1405 } 1406 1407 try { 1408 if ( 'widget' === elementType ) { 1409 elementType = $this.data( 'widget_type' ); 1410 1411 if ( window.elementorFrontend && window.elementorFrontend.hooks ) { 1412 window.elementorFrontend.hooks.doAction( 'frontend/element_ready/widget', $this, $ ); 1413 } 1414 } 1415 1416 if ( window.elementorFrontend && window.elementorFrontend.hooks ) { 1417 window.elementorFrontend.hooks.doAction( 'frontend/element_ready/global', $this, $ ); 1418 window.elementorFrontend.hooks.doAction( 'frontend/element_ready/' + elementType, $this, $ ); 1419 } 1420 1421 } catch ( err ) { 1422 console.log(err); 1423 1424 $this.remove(); 1425 1426 return false;
1427 } 1428 } ); 1429 }, 1430 1431 getUniqId: function() { 1432 return Math.random().toString( 36 ).substr( 2, 9 ); 1433 }, 1434 1435 }; 1436 1437 jetMenu.init(); 1438 1439} ( 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.