1(function ($) { 2 var WidgetElements_ViewsHandler = function ($scope, $) { 3 var id_scope = $scope.attr("data-id"); 4 var elementSettings = dceGetElementSettings($scope); 5 var widgetId = $scope.data('id'); 6 7 // Handle slideshow format with Swiper 8 if (elementSettings.dce_views_style_format === "slideshow") { 9 // Variables for Slideshow 10 let swiper_class = '.swiper'; 11 var elementSwiper = $scope.find(swiper_class); 12 var speed = elementSettings.transition_speed; 13 var disableOnInteraction = Boolean(elementSettings.pause_on_interaction) || false; 14 var loop = false; 15 16 if ("yes" === elementSettings.infinite) { 17 loop = true; 18 } 19 20 var id_post = $scope.attr("data-post-id"); 21 22 var viewsSwiperOptions = { 23 autoHeight: true, 24 speed: speed, 25 loop: loop, 26 }; 27 28 // Responsive Parameters 29 viewsSwiperOptions.breakpoints = dynamicooo.makeSwiperBreakpoints( 30 { 31 slidesPerView: { 32 elementor_key: "slides_to_show", 33 default_value: "auto", 34 }, 35 slidesPerGroup: { 36 elementor_key: "slides_to_scroll", 37 default_value: 1, 38 }, 39 spaceBetween: { 40 elementor_key: "spaceBetween", 41 default_value: 0, 42 }, 43 }, 44 elementSettings, 45 ); 46 47 // Navigation 48 if (elementSettings.navigation != "none") { 49 if ( 50 elementSettings.navigation == "both" || 51 elementSettings.navigation == "arrows" 52 ) { 53 // Prevent text selection on navigation buttons 54 let nextSelector = id_post 55 ? ".elementor-element-" + 56 id_scope + 57 '[data-post-id="' + 58 id_post + 59 '"] .elementor-swiper-button-next' 60 : ".elementor-swiper-button-next"; 61 let prevSelector = id_post 62 ? ".elementor-element-" + 63 id_scope + 64 '[data-post-id="' + 65 id_post + 66 '"] .elementor-swiper-button-prev' 67 : ".elementor-swiper-button-prev"; 68 69 let nextElement = $scope.find(nextSelector)[0]; 70 let prevElement = $scope.find(prevSelector)[0]; 71 72 if (nextElement) { 73 nextElement.addEventListener('mousedown', function(e) { 74 e.preventDefault(); 75 }); 76 // Keyboard accessibility for navigation buttons 77 nextElement.addEventListener('keydown', function(e) { 78 if (e.key === 'Enter' || e.key === ' ') { 79 e.preventDefault(); 80 nextElement.click(); 81 } 82 }); 83 } 84 if (prevElement) { 85 prevElement.addEventListener('mousedown', function(e) { 86 e.preventDefault(); 87 }); 88 // Keyboard accessibility for navigation buttons 89 prevElement.addEventListener('keydown', function(e) { 90 if (e.key === 'Enter' || e.key === ' ') { 91 e.preventDefault(); 92 prevElement.click(); 93 } 94 }); 95 } 96 97 viewsSwiperOptions = $.extend(viewsSwiperOptions, { 98 navigation: { 99 nextEl: nextSelector, 100 prevEl: prevSelector, 101 }, 102 }); 103 } 104 105 if ( 106 elementSettings.navigation == "both" || 107 elementSettings.navigation == "dots" 108 ) { 109 viewsSwiperOptions = $.extend(viewsSwiperOptions, { 110 pagination: { 111 el: id_post 112 ? ".elementor-element-" + 113 id_scope + 114 '[data-post-id="' + 115 id_post + 116 '"] .swiper-pagination' 117 : ".swiper-pagination", 118 type: "bullets", 119 clickable: true, 120 }, 121 }); 122 } 123 } 124 125 // Autoplay 126 if (elementSettings.autoplay) { 127 viewsSwiperOptions = $.extend(viewsSwiperOptions, { 128 autoplay: { 129 autoplay: true, 130 delay: elementSettings.autoplay_speed, 131 disableOnInteraction: disableOnInteraction, 132 }, 133 }); 134 } 135 136 const asyncSwiper = elementorFrontend.utils.swiper; 137 138 new asyncSwiper(elementSwiper, viewsSwiperOptions) 139 .then((newSwiperInstance) => { 140 viewsSwiper = newSwiperInstance; 141 }) 142 .catch((error) => console.log(error)); 143 144 // Pause on hover 145 if (elementSettings.autoplay && elementSettings.pause_on_hover) { 146 $(elementSwiper).on({ 147 mouseenter: function () { 148 viewsSwiper.autoplay.stop(); 149 }, 150 mouseleave: function () { 151 viewsSwiper.autoplay.start(); 152 }, 153 }); 154 } 155 156 return; // Exit early for slideshow format 157 } 158 159 // Handle table format with DataTables 160 if (elementSettings.dce_views_style_format === "table" && elementSettings.dce_views_style_table_data) { 161 var $table = $scope.find('table.dce-datatable'); 162 163 var options = { 164 order: [], 165 ordering: true 166 }; 167 168 // Add language URL from separate i18n files 169 if (typeof window.getDataTablesLanguageUrl === 'function') { 170 var language = $('html').attr('lang') || 'en'; 171 var languageUrl = window.getDataTablesLanguageUrl(language); 172 173 if (languageUrl) { 174 options.language = { 175 url: languageUrl 176 }; 177 } 178 } 179 180 if (elementSettings.dce_views_style_table_data_autofill) { 181 options.autoFill = true; 182 } 183 184 if (elementSettings.dce_views_style_table_data_buttons) { 185 options.dom = 'Bfrtip'; 186 options.buttons = [ 187 'copyHtml5', 188 'excelHtml5', 189 'csvHtml5', 190 'pdfHtml5' 191 ]; 192 } 193 194 if (elementSettings.dce_views_style_table_data_colreorder) { 195 options.colReorder = true; 196 } 197 198 if (elementSettings.dce_views_style_table_data_fixedcolumns) { 199 options.fixedColumns = true; 200 } 201 202 if (elementSettings.dce_views_style_table_data_fixedheader) { 203 options.fixedHeader = true; 204 } 205 206 if (elementSettings.dce_views_style_table_data_keytable) { 207 options.keys = true; 208 } 209 210 if (elementSettings.dce_views_style_table_data_responsive) { 211 options.responsive = true; 212 } 213 214 if (elementSettings.dce_views_style_table_data_rowgroup) { 215 options.rowGroup = { 216 dataSrc: 'group' 217 }; 218 } 219 220 if (elementSettings.dce_views_style_table_data_rowreorder) { 221 options.rowReorder = true; 222 } 223 224 if (elementSettings.dce_views_style_table_data_scroller) { 225 options.scroller = true; 226 options.scrollX = true; 227 if (elementSettings.dce_views_style_table_data_scroller_y) { 228 options.scrollY = 200; 229 } 230 options.paging = true; 231 options.deferRender = true; 232 } else { 233 options.paging = false;
234 } 235 236 if (elementSettings.dce_views_style_table_data_select) { 237 options.select = true; 238 } 239 240 $table.DataTable(options); 241 } 242 243 // Handle AJAX Exposed Form 244 if (elementSettings.dce_views_where_form_ajax) { 245 246 // Update results function 247 function updateResults() { 248 var resultContainer = '.elementor-element-' + widgetId + ' .dce-view-results-wrapper'; 249 var sortContainer = '.elementor-element-' + widgetId + ' .dce-view-exposed-sort-wrapper'; 250 var paginationContainer = '.elementor-element-' + widgetId + ' .dce-view-posts-pagination-wrapper'; 251 var filtersContainer = '.elementor-element-' + widgetId + ' .dce-view-form-filters-wrapper'; 252 253 jQuery(resultContainer).html('<div class="dce-preloader" style="text-align: center;"><i class="fa fa-cog fa-spin fa-3x fa-fw"></i><span class="sr-only">Loading...</span></div>'); 254 255 jQuery.get('?' + jQuery('#dce-view-form-' + widgetId).serialize(), function(data) { 256 jQuery(resultContainer).html(jQuery(data).find(resultContainer).html()); 257 jQuery(sortContainer).html(jQuery(data).find(sortContainer).html()); 258 259 if (jQuery(data).find(paginationContainer).length) { 260 jQuery(paginationContainer).html(jQuery(data).find(paginationContainer).html()); 261 } else { 262 jQuery(paginationContainer).html(''); 263 } 264 265 jQuery(filtersContainer).html(jQuery(data).find(filtersContainer).html()); 266 jQuery(document).trigger('dce/views/exposedform/after'); 267 }); 268 } 269 270 // Form submit handler 271 $scope.find('.dce-view-form').on('submit', function() { 272 updateResults(); 273 return false; 274 }); 275 276 // On change handler if enabled 277 if (elementSettings.dce_views_where_form_ajax_onchange) { 278 // Text inputs: use 'input' for real-time updates 279 $scope.find('.dce-view-form input:not([type=checkbox]):not([type=radio]):not([type=reset])').on('input', function() { 280 updateResults(); 281 }); 282 283 // Select, checkbox, radio: use 'change' 284 $scope.find('.dce-view-form select, .dce-view-form input[type=checkbox], .dce-view-form input[type=radio]').on('change', function() { 285 updateResults(); 286 }); 287 288 $scope.find('.dce-view-form input[type=reset]').on('click', function() { 289 setTimeout(updateResults, 100); 290 }); 291 } 292 } 293 294 // Handle AJAX Pagination 295 if (elementSettings.dce_views_pagination_ajax) { 296 $scope.on('click', '.dce-posts-pagination a', function(e) { 297 e.preventDefault(); // Ensure default action is prevented 298 299 var widgetContainer = '.elementor-element-' + widgetId + ' .dce-view-results-wrapper'; 300 var paginationContainer = '.elementor-element-' + widgetId + ' .dce-view-posts-pagination-wrapper'; 301 302 jQuery(widgetContainer).html('<div class="dce-preloader" style="text-align: center;"><i class="fa fa-cog fa-spin fa-3x fa-fw"></i><span class="sr-only">Loading...</span></div>'); 303 304 jQuery.get(jQuery(this).attr('href'), function(data) { 305 if (jQuery(data).find(widgetContainer).length) { 306 jQuery(widgetContainer).html(jQuery(data).find(widgetContainer).html()); 307 } 308 309 if (jQuery(data).find(paginationContainer).length) { 310 jQuery(paginationContainer).html(jQuery(data).find(paginationContainer).html()); 311 } 312 }); 313 314 return false; 315 }); 316 } 317 318 // Handle Infinite Scroll 319 if (elementSettings.dce_views_pagination_type === 'infinite_scroll' && !elementorFrontend.isEditMode()) { 320 var infiniteOptions = { 321 path: '.elementor-element-' + widgetId + ' .pagination__next', 322 append: '.elementor-element-' + widgetId + ' .dce-view-archive .dce-view-single-wrapper', 323 hideNav: '.elementor-element-' + widgetId + ' .dce-posts-navigation', 324 status: '.elementor-element-' + widgetId + ' .scroller-status', 325 debug: true 326 }; 327 328 if (elementSettings.dce_views_limit_scroll_button) { 329 infiniteOptions.button = '.elementor-element-' + widgetId + ' .view-more-button'; 330 infiniteOptions.scrollThreshold = false; 331 } 332 333 $scope.find('.dce-view-archive').infiniteScroll(infiniteOptions); 334 335 // Handle events (InfiniteScroll only handles p.infinite-scroll-last, not div) 336 $scope.find('.dce-view-archive') 337 .on('last.infiniteScroll', function(event, response, path) { 338 jQuery(this).find('.infinite-scroll-last').fadeIn(); 339 }) 340 .on('request.infiniteScroll', function(event, path) { 341 jQuery(this).find('.infinite-scroll-request').show(); 342 }) 343 .on('append.infiniteScroll', function(event, response, path, items) { 344 jQuery(this).find('.infinite-scroll-request').hide(); 345 }); 346 } 347 348 // Handle AJAX Filter 349 if (elementSettings.dce_views_where_form_ajax) { 350 $scope.on('click', '.dce-view-form-filter a', function() { 351 var field_container = '.elementor-element-' + widgetId + ' .dce-view-form-wrapper .elementor-field-group-' + jQuery(this).data('field'); 352 jQuery(field_container).find('input').val(''); 353 jQuery(field_container).find('select').val('');
354 jQuery(field_container).find('input:checked').prop('checked', false); 355 jQuery(field_container).find('input,select').trigger('change'); 356 return false; 357 }); 358 } 359 }; 360 361 $(window).on("elementor/frontend/init", function () { 362 elementorFrontend.hooks.addAction( 363 "frontend/element_ready/dce-views.default", 364 WidgetElements_ViewsHandler, 365 ); 366 }); 367})(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.