1(function($) { 2 'use strict'; 3 4 $(document).ready(function() { 5 // Alle Filter-Checkboxen initial deaktivieren 6 disableAllFilterCheckboxes(); 7 8 // Lazy Load: Nicht geladene Kategorien automatisch nachladen 9 loadPendingCategories(); 10 11 // Handle "Load more results" button click 12 $(document).on('click', '.load-more-results', function(e) { 13 e.preventDefault(); 14 15 var $button = $(this); 16 var tag = $button.data('tag'); 17 var page = $button.data('page'); 18 var $facet = $button.closest('.facet[data-tag="' + tag + '"]'); 19 var $resultContainer = $facet.find('.result-container'); 20 var $resultsContainer = $('#kesearch_results'); 21 var searchword = $resultsContainer.data('searchword') || ''; 22 var loadingText = $resultsContainer.data('loading-text') || 'Loading...'; 23 var errorText = $resultsContainer.data('error-text') || 'Error loading results'; 24 25 // Disable button and show loading state 26 $button.prop('disabled', true); 27 var originalText = $button.text(); 28 $button.text(loadingText); 29 30 // Make Ajax request 31 $.ajax({ 32 url: window.location.pathname + '?type=1759771881', 33 type: 'GET', 34 dataType: 'json', 35 data: { 36 'tx_kesearch_pi1[tag]': tag, 37 'tx_kesearch_pi1[page]': page, 38 'tx_kesearch_pi1[sword]': searchword 39 }, 40 success: function(response) { 41 if (response.error) { 42 console.error('Error loading more results:', response.error); 43 alert(errorText); 44 return; 45 } 46 47 // Append new results 48 $resultContainer.append(response.html); 49 50 // Update button state 51 if (response.hasMore) { 52 // More results available, update page number 53 $button.data('page', response.page + 1); 54 $button.prop('disabled', false); 55 $button.text(originalText); 56 } else { 57 // No more results, remove button 58 $button.closest('.load-more-wrapper').remove(); 59 } 60 }, 61 error: function(xhr, status, error) { 62 console.error('Ajax error:', status, error); 63 alert(errorText); 64 $button.prop('disabled', false); 65 $button.text(originalText); 66 } 67 }); 68 }); 69 }); 70 71 /** 72 * Deaktiviert alle Filter-Checkboxen beim Start der Suche 73 */ 74 function disableAllFilterCheckboxes() { 75 $('.filters input[data-facet]').each(function() { 76 var $checkbox = $(this); 77 $checkbox.prop('disabled', true); 78 $checkbox.prop('checked', false); 79 var $label = $('label[for="' + $checkbox.attr('id') + '"]'); 80 $label.addClass('disabled'); 81 }); 82 } 83 84 /** 85 * Lädt alle Kategorien, die noch nicht geladen wurden 86 */ 87 function loadPendingCategories() { 88 var $resultsContainer = $('#kesearch_results'); 89 var searchword = $resultsContainer.data('searchword') || ''; 90 var $pendingFacets = $('.facet[data-loaded="false"]'); 91 92 if ($pendingFacets.length === 0) { 93 return; 94 } 95 96 if (searchword === '') { 97 $('.facet[data-loaded="false"]').hide(); 98 return; 99 } 100 101 showSpinner(); 102 103 // Kategorien sequenziell laden (um Server nicht zu überlasten) 104 var loadNext = function(index) { 105 if (index >= $pendingFacets.length) { 106 hideSpinner(); 107 // Prüfen ob in allen Kategorien keine Treffer gefunden wurden 108 if ($('.facet:visible').length === 0) { 109 $resultsContainer.find('.no-results-message').show(); 110 } 111 return; 112 } 113 114 var $facet = $($pendingFacets[index]); 115 var tag = $facet.data('tag'); 116 117 loadCategory(tag, searchword, $facet, function() { 118 // Nächste Kategorie laden 119 loadNext(index + 1); 120 }); 121 }; 122
123 // Starte mit der ersten nicht geladenen Kategorie 124 loadNext(0); 125 } 126 127 /** 128 * Lädt eine einzelne Kategorie per AJAX 129 */ 130 function loadCategory(tag, searchword, $facet, callback) { 131 var $resultContainer = $facet.find('.result-container'); 132 var $resultsContainer = $('#kesearch_results'); 133 var errorText = $resultsContainer.data('error-text') || 'Error loading results'; 134 var loadMoreText = $resultsContainer.data('load-more-text') || 'Load more'; 135 136 $.ajax({ 137 url: window.location.pathname + '?type=1759771882', 138 type: 'GET', 139 dataType: 'json', 140 data: { 141 'tx_kesearch_pi1[tag]': tag, 142 'tx_kesearch_pi1[sword]': searchword 143 }, 144 success: function(response) { 145 if (response.error) { 146 console.error('Error loading category:', response.error); 147 $facet.remove(); 148 if (callback) callback(); 149 return; 150 } 151 152 if (!response.hasResults) { 153 // Keine Ergebnisse - Facet entfernen (bleibt unsichtbar) 154 $facet.remove(); 155 } else { 156 // Ergebnisse einfügen 157 $resultContainer.html(response.html); 158 $facet.attr('data-loaded', 'true'); 159 160 // "Mehr laden" Button hinzufügen falls nötig 161 if (response.hasMore) { 162 var $loadMoreWrapper = $('<div class="load-more-wrapper">' + 163 '<button class="btn btn-primary load-more-results" data-tag="' + tag + '" data-page="2">' + 164 loadMoreText + 165 '</button></div>'); 166 $facet.append($loadMoreWrapper); 167 } 168 169 // Facet anzeigen (war initial versteckt) 170 $facet.show(); 171 172 // Checkbox aktivieren und anhaken 173 enableFilterCheckbox(response.tag); 174 } 175 176 if (callback) callback(); 177 }, 178 error: function(xhr, status, error) { 179 console.error('Ajax error:', status, error); 180 $facet.remove(); 181 if (callback) callback(); 182 } 183 }); 184 } 185 186 /** 187 * Aktiviert die Filter-Checkbox für einen Bereich mit Ergebnissen 188 * Berücksichtigt die Produkt-Bereiche (productsautomation, productslightning, etc.) 189 * die alle von der Checkbox mit data-facet="products" gesteuert werden 190 */ 191 function showSpinner() { 192 $('.searchlistProcessing').show(); 193 } 194 195 function hideSpinner() { 196 $('.searchlistProcessing').hide(); 197 } 198 199 function enableFilterCheckbox(tag) { 200 // Produkt-Bereiche werden von der "products" Checkbox gesteuert 201 var facetName = tag.startsWith('products') ? 'products' : tag; 202 203 var $checkbox = $('.filters input[data-facet="' + facetName + '"]'); 204 if ($checkbox.length) { 205 $checkbox.prop('disabled', false); 206 // $checkbox.prop('checked', true); 207 var $label = $('label[for="' + $checkbox.attr('id') + '"]'); 208 $label.removeClass('disabled'); 209 } 210 } 211})(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.