1function initializeSwiper(options, element) { 2 const asyncSwiper = elementorFrontend.utils.swiper; 3 4 new asyncSwiper(element, options) 5 .then((newSwiperInstance) => { 6 mySwiper = newSwiperInstance; 7 }) 8 .catch((error) => console.log(error)); 9} 10 11// Cannot initialize Swiper when hidden. This happens when it is inside a tab that is not the first. 12const manageAutoplayInsideTab = (tabWrapper, options, elementSwiper) => { 13 if (!tabWrapper.hidden) { 14 // it's in the first tab. 15 initializeSwiper(options, elementSwiper); 16 } 17 var observer = new MutationObserver(function (_, observer) { 18 if (!tabWrapper.hidden) { 19 initializeSwiper(options, elementSwiper); 20 } 21 }); 22 var observerConfig = { 23 attributes: true, 24 attributeFilter: ["hidden"], 25 }; 26 observer.observe(tabWrapper, observerConfig); 27}; 28 29(function ($) { 30 var WidgetDyncontel_ACFRepeaterHandler = function ($scope, $) { 31 let accordion = function () { 32 let wrapper = $scope.find(".accordion"); 33 let accordionStart = elementSettings.dce_acf_repeater_accordion_start; 34 let closeOtherSections = elementSettings.dce_acf_repeater_accordion_close; 35 let speed = elementSettings.accordion_speed?.size || 300; 36 37 const buttons = wrapper.find('.accordion-button'); 38 const contents = wrapper.find('.acc_content'); 39 40 buttons.each(function(index) { 41 const $button = $(this); 42 const $content = $($button.attr('aria-controls') ? '#' + $button.attr('aria-controls') : ''); 43 const section = $button.closest('.acc_section'); 44 45 let shouldBeActive = false; 46 47 if (accordionStart === 'first' && index === 0) { 48 shouldBeActive = true; 49 } else if (accordionStart === 'custom') { 50 const customIndex = elementSettings.accordion_start_custom || 1; 51 shouldBeActive = (index + 1) === customIndex; 52 } else if (accordionStart === 'all') { 53 shouldBeActive = true; 54 } 55 56 if (shouldBeActive) { 57 $button.attr('aria-expanded', 'true'); 58 $content.attr('aria-hidden', 'false').show(); 59 section.addClass('acc_active'); 60 } else { 61 $button.attr('aria-expanded', 'false'); 62 $content.attr('aria-hidden', 'true').hide(); 63 section.removeClass('acc_active'); 64 } 65 }); 66 67 buttons.on('click', function(e) { 68 e.preventDefault(); 69 const $button = $(this); 70 const $content = $($button.attr('aria-controls') ? '#' + $button.attr('aria-controls') : ''); 71 const section = $button.closest('.acc_section'); 72 const isExpanded = $button.attr('aria-expanded') === 'true'; 73 74 if (closeOtherSections && !isExpanded) { 75 buttons.not($button).each(function() { 76 const $otherButton = $(this); 77 const $otherContent = $($otherButton.attr('aria-controls') ? '#' + $otherButton.attr('aria-controls') : ''); 78 const otherSection = $otherButton.closest('.acc_section'); 79 80 $otherButton.attr('aria-expanded', 'false'); 81 $otherContent.attr('aria-hidden', 'true').slideUp(speed); 82 otherSection.removeClass('acc_active'); 83 }); 84 } 85 86 if (isExpanded) { 87 $button.attr('aria-expanded', 'false'); 88 $content.attr('aria-hidden', 'true').slideUp(speed); 89 section.removeClass('acc_active'); 90 } else { 91 $button.attr('aria-expanded', 'true'); 92 $content.attr('aria-hidden', 'false').slideDown(speed); 93 section.addClass('acc_active'); 94 } 95 }); 96 }; 97 98 let elementSettings = dceGetElementSettings($scope); 99 var $block_acfgallery = ".dce-acf-repeater"; 100 101 if (elementSettings.dce_acf_repeater_format == "accordion") { 102 let wrapper = $scope.find("ul.dce-acf-repeater-wrapper"); 103 let accordionStart = elementSettings.dce_acf_repeater_accordion_start; 104 let activeIndex; 105 106 if (accordionStart === "none") { 107 activeIndex = false; 108 } else if (accordionStart === "first") { 109 activeIndex = 1; 110 } else if (accordionStart === "custom") { 111 activeIndex = elementSettings.accordion_start_custom || 1; 112 } else { 113 let elements = $scope.find("ul.dce-acf-repeater-wrapper .dce-acf-repeater-item").length; 114 activeIndex = []; 115 for (let i = 0; i <= elements; i++) { 116 activeIndex[i] = i; 117 } 118 } 119 120 let accordionJs = function ( 121 wrapper, 122 closeOtherSections, 123 speed, 124 activeIndex, 125 ) { 126 wrapper.accordionjs({ 127 // Allow self close.(data-close-able) 128 closeAble: true, 129 130 // Close other sections.(data-close-other) 131 closeOther: Boolean(closeOtherSections), 132 133 // Animation Speed.(data-slide-speed) 134 slideSpeed: speed, 135 136 // The section open on first init. A number from 1 to X or false.(data-active-index) 137 activeIndex: activeIndex, 138 139 openSection: function(section) { 140 $(section).find('.acc_button').attr('aria-expanded', 'true'); 141 $(section).find('.acc_content').attr('aria-hidden', 'false'); 142 }, 143 144 beforeOpenSection: function(section) { 145 if (Boolean(closeOtherSections)) { 146 wrapper.find('.acc_button').attr('aria-expanded', 'false'); 147 wrapper.find('.acc_content').attr('aria-hidden', 'true'); 148 } 149 }, 150 151 closeSection: function(section) { 152 $(section).find('.acc_button').attr('aria-expanded', 'false'); 153 $(section).find('.acc_content').attr('aria-hidden', 'true'); 154 } 155 }); 156 }; 157 158 accordionJs( 159 wrapper, 160 elementSettings.dce_acf_repeater_accordion_close, 161 elementSettings.accordion_speed.size || 300, 162 activeIndex 163 ); 164 } 165 166 if (elementSettings.dce_acf_repeater_format == "masonry") { 167 var $grid_dce_repeater = $scope.find($block_acfgallery).masonry({ 168 // options 169 itemSelector: ".dce-acf-repeater-item", 170 }); 171 // ---------- [ imagesLoaded ] --------- 172 $grid_dce_repeater.imagesLoaded().progress(function () { 173 $grid_dce_repeater.masonry("layout"); 174 }); 175 } else if (elementSettings.dce_acf_repeater_format == "justified") { 176 $scope 177 .find(".justified-grid") 178 .imagesLoaded() 179 .progress(function () {}); 180 181 $scope.find(".justified-grid").justifiedGallery({ 182 rowHeight: 183 Number(elementSettings.justified_rowHeight.size) || 170, 184 maxRowHeight: -1, 185 selector: "figure, div:not(.spinner)", 186 imgSelector: "> img, > a > img, > div > a > img, > div > img", 187 margins: Number(elementSettings.justified_margin.size) || 0, 188 lastRow: elementSettings.justified_lastRow, 189 }); 190 } else if ( 191 elementSettings.dce_acf_repeater_format == "slider_carousel" 192 ) { 193 var elementSwiper = $scope.find( 194 ".dce-acf-repeater-slider_carousel", 195 ); 196 var id_scope = $scope.attr("data-id"); 197 var id_post = $scope.closest(".elementor").attr("data-post-id"); 198 var counter_id = $scope 199 .find(".dce-acf-repeater-slider_carousel") 200 .attr("counter-id"); 201 var loopEnabled = Boolean(elementSettings.loop); 202 var slideInitNum = 0; 203 var slidesPerView = Number(elementSettings.slidesPerView); 204 205 // Prevent text selection on navigation buttons 206 let nextElement = $scope.find(".swiper-button-next")[0]; 207 let prevElement = $scope.find(".swiper-button-prev")[0]; 208 if (nextElement) { 209 nextElement.addEventListener('mousedown', function(e) { 210 e.preventDefault(); 211 }); 212 // Keyboard accessibility for navigation buttons 213 nextElement.addEventListener('keydown', function(e) { 214 if (e.key === 'Enter' || e.key === ' ') { 215 e.preventDefault(); 216 nextElement.click(); 217 } 218 }); 219 } 220 if (prevElement) { 221 prevElement.addEventListener('mousedown', function(e) { 222 e.preventDefault(); 223 }); 224 // Keyboard accessibility for navigation buttons 225 prevElement.addEventListener('keydown', function(e) { 226 if (e.key === 'Enter' || e.key === ' ') { 227 e.preventDefault(); 228 prevElement.click(); 229 } 230 }); 231 } 232 233 var swiperOptions = { 234 // Optional parameters 235 direction: "horizontal", 236 initialSlide: slideInitNum, 237 speed: Number(elementSettings.speed_slider) || 300, 238 autoHeight: Boolean(elementSettings.autoHeight), //false, // Set to true and slider wrapper will adopt its height to the height of the currently active slide 239 roundLengths: Boolean(elementSettings.roundLengths), //false, // Set to true to round values of slides width and height to prevent blurry texts onusual resolution screens (if you have such) 240 effect: elementSettings.effects || "slide", 241 slidesPerView: slidesPerView || "auto", 242 slidesPerGroup: Number(elementSettings.slidesPerGroup) || 1, // Set numbers of slides to define and enable group sliding. Useful to use with slidesPerView > 1 243 spaceBetween: Number(elementSettings.spaceBetween) || 0, // 30, 244 slidesOffsetBefore: 0, // Add (in px) additional slide offset in the beginning of the container (before all slides) 245 slidesOffsetAfter: 0, // Add (in px) additional slide offset in the end of the container (after all slides) 246 slidesPerColumn: Number(elementSettings.slidesColumn) || 1, // 1, // Number of slides per column, for multirow layout 247 slidesPerColumnFill: "row", // Could be 'column' or 'row'. Defines how slides should fill rows, by column or by row 248 centerInsufficientSlides: 249 elementSettings.centerInsufficientSlides === "yes", 250 watchOverflow: true, 251 centeredSlides: elementSettings.centeredSlides2 === "yes", 252 grabCursor: Boolean(elementSettings.grabCursor), 253 freeMode: Boolean(elementSettings.freeMode), 254 freeModeMomentum: Boolean(elementSettings.freeModeMomentum), 255 freeModeMomentumRatio: 256 Number(elementSettings.freeModeMomentumRatio) || 1, 257 freeModeMomentumVelocityRatio: 258 Number(elementSettings.freeModeMomentumVelocityRatio) || 1, 259 freeModeMomentumBounce: Boolean( 260 elementSettings.freeModeMomentumBounce, 261 ), 262 freeModeMomentumBounceRatio: Number(elementSettings.speed) || 1, 263 freeModeMinimumVelocity: Number(elementSettings.speed) || 0.02, 264 freeModeSticky: Boolean(elementSettings.freeModeSticky), 265 loop: loopEnabled, 266 navigation: { 267 nextEl: nextElement, 268 prevEl: prevElement, 269 }, 270 pagination: { 271 el: id_post 272 ? ".dce-elementor-post-" +
273 id_post + 274 " .elementor-element-" + 275 id_scope + 276 " .pagination-" + 277 counter_id 278 : ".pagination-" + counter_id, //'.swiper-pagination', //'.pagination-acfslider-'+id_scope, 279 clickable: true, 280 type: String(elementSettings.pagination_type) || "bullets", 281 dynamicBullets: true, 282 renderFraction: function (currentClass, totalClass) { 283 return ( 284 '<span class="' + 285 currentClass + 286 '"></span>' + 287 '<span class="separator">' + 288 String(elementSettings.fraction_separator) + 289 "</span>" + 290 '<span class="' + 291 totalClass + 292 '"></span>' 293 ); 294 }, 295 }, 296 mousewheel: elementSettings.mousewheelControl 297 ? { 298 releaseOnEdges: true, 299 } 300 : false, 301 keyboard: { 302 enabled: Boolean(elementSettings.keyboardControl), 303 }, 304 305 on: { 306 init: function () { 307 $("body").attr( 308 "data-carousel-" + id_scope, 309 this.realIndex, 310 ); 311 }, 312 slideChange: function (e) { 313 $("body").attr( 314 "data-carousel-" + id_scope, 315 this.realIndex, 316 ); 317 }, 318 }, 319 }; 320 if (elementSettings.useAutoplay) { 321 //default 322 swiperOptions = $.extend(swiperOptions, { autoplay: true }); 323 324 var autoplayDelay = Number(elementSettings.autoplay); 325 if (!autoplayDelay) { 326 autoplayDelay = 3000; 327 } else { 328 autoplayDelay = Number(elementSettings.autoplay); 329 } 330 swiperOptions = $.extend(swiperOptions, { 331 autoplay: { 332 delay: autoplayDelay, 333 disableOnInteraction: Boolean( 334 elementSettings.autoplayDisableOnInteraction, 335 ), 336 stopOnLastSlide: Boolean( 337 elementSettings.autoplayStopOnLast, 338 ), 339 }, 340 }); 341 } 342 343 // Responsive Params 344 swiperOptions.breakpoints = dynamicooo.makeSwiperBreakpoints( 345 { 346 slidesPerView: { 347 elementor_key: "slidesPerView", 348 default_value: "auto", 349 }, 350 slidesPerGroup: { 351 elementor_key: "slidesPerGroup", 352 default_value: 1, 353 }, 354 spaceBetween: { 355 elementor_key: "spaceBetween", 356 default_value: 1, 357 }, 358 slidesPerColumn: { 359 elementor_key: "slidesColumn", 360 default_value: 1, 361 }, 362 }, 363 elementSettings, 364 ); 365 366 { 367 let isCarousel = 368 elementSettings.dce_acf_repeater_format == 369 "slider_carousel"; 370 if (!isCarousel) { 371 initializeSwiper(swiperOptions, elementSwiper); 372 } else { 373 let elementorTab = elementSwiper.closest( 374 ".elementor-tab-content", 375 ); 376 if (elementorTab.length && elementSettings.useAutoplay) { 377 // we are inside a tab, autoplay needs to be updated. 378 manageAutoplayInsideTab( 379 elementorTab, 380 swiperOptions, 381 elementSwiper, 382 ); 383 } else { 384 initializeSwiper(swiperOptions, elementSwiper); 385 } 386 } 387 } 388 } // end if SliderCarousel 389 390 // DataTables initialization 391 if (elementSettings.dce_acf_repeater_format === "table" && elementSettings.dce_acf_repeater_datatables) { 392 let initializeDataTables = function() { 393 var $table = $scope.find('table.dce-datatable'); 394 395 // Safety checks before initializing DataTables 396 if ($table.length === 0) { 397 return; 398 } 399 400 // Check if table has valid structure 401 var $thead = $table.find('thead'); 402 var $tbody = $table.find('tbody'); 403 var $rows = $tbody.find('tr'); 404 405 if ($rows.length === 0) { 406 return; 407 } 408 409 410 411 // Get configuration from elementSettings 412 var config = { 413 autofill: elementSettings.dce_acf_repeater_style_table_data_autofill || false, 414 buttons: elementSettings.dce_acf_repeater_style_table_data_buttons || false, 415 colreorder: elementSettings.dce_acf_repeater_style_table_data_colreorder || false, 416 fixedcolumns: elementSettings.dce_acf_repeater_style_table_data_fixedcolumns || false, 417 fixedheader: elementSettings.dce_acf_repeater_style_table_data_fixedheader || false, 418 keytable: elementSettings.dce_acf_repeater_style_table_data_keytable || false, 419 responsive: elementSettings.dce_acf_repeater_style_table_data_responsive || false, 420 rowgroup: elementSettings.dce_acf_repeater_style_table_data_rowgroup || false, 421 rowreorder: elementSettings.dce_acf_repeater_style_table_data_rowreorder || false, 422 scroller: elementSettings.dce_acf_repeater_style_table_data_scroller || false, 423 scroller_y: elementSettings.dce_acf_repeater_style_table_data_scroller_y || false, 424 select: elementSettings.dce_acf_repeater_style_table_data_select || false, 425 // UI Options 426 search: elementSettings.dce_acf_repeater_style_table_data_search || false, 427 pagination: elementSettings.dce_acf_repeater_style_table_data_pagination || false, 428 info: elementSettings.dce_acf_repeater_style_table_data_info || false, 429 lengthMenu: elementSettings.dce_acf_repeater_style_table_data_length_menu || false, 430 ordering: elementSettings.dce_acf_repeater_style_table_data_ordering || false 431 }; 432 433 // Build DataTables options 434 var options = { 435 order: [], 436 autoWidth: false, 437 columnDefs: [ 438 { targets: '_all', defaultContent: '' } 439 ], 440 // UI Options 441 searching: config.search, 442 paging: config.pagination, 443 info: config.info,
444 lengthChange: config.lengthMenu, 445 ordering: config.ordering 446 }; 447 448 // Add language URL from separate i18n files 449 if (typeof window.getDataTablesLanguageUrl === 'function') { 450 var language = $('html').attr('lang') || 'en'; 451 var languageUrl = window.getDataTablesLanguageUrl(language); 452 453 if (languageUrl) { 454 options.language = { 455 url: languageUrl 456 }; 457 } 458 } 459 460 // Apply conditional options based on configuration 461 if (config.autofill) { 462 options.autoFill = true; 463 } 464 465 if (config.buttons) { 466 options.dom = 'Bfrtip'; 467 options.buttons = [ 468 'copyHtml5', 469 'excelHtml5', 470 'csvHtml5', 471 'pdfHtml5' 472 ]; 473 } 474 475 if (config.colreorder) { 476 options.colReorder = true; 477 } 478 479 if (config.fixedcolumns) { 480 options.fixedColumns = true; 481 } 482 483 if (config.fixedheader) { 484 options.fixedHeader = true; 485 } 486 487 if (config.keytable) { 488 options.keys = true; 489 } 490 491 if (config.responsive) { 492 options.responsive = true; 493 } 494 495 if (config.rowgroup) { 496 options.rowGroup = { 497 dataSrc: 'group' 498 }; 499 } 500 501 if (config.rowreorder) { 502 options.rowReorder = true; 503 } 504 505 if (config.scroller) { 506 options.scroller = true; 507 options.scrollX = true; 508 if (config.scroller_y) { 509 options.scrollY = 200; 510 } 511 options.paging = true; // Scroller requires paging 512 options.deferRender = true; 513 } 514 515 if (config.select) { 516 options.select = true; 517 } 518 519 // Initialize DataTables 520 $table.DataTable(options); 521 }; 522 523 // Initialize DataTables 524 initializeDataTables(); 525 } 526 527 if (elementSettings.enabled_wow) { 528 var wow = new WOW({ 529 boxClass: 'wow', 530 animateClass: 'animated', 531 offset: 0, 532 mobile: true, 533 live: true, 534 scrollContainer: null 535 }); 536 wow.init(); 537 } 538 }; 539 540 $(window).on("elementor/frontend/init", function () { 541 elementorFrontend.hooks.addAction( 542 "frontend/element_ready/dce-acf-repeater-v2.default", 543 WidgetDyncontel_ACFRepeaterHandler, 544 ); 545 }); 546})(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.