1(function () { 2 'use strict'; 3 4 if (window.__ADN_LOAD_MORE_READY__) { 5 return; 6 } 7 window.__ADN_LOAD_MORE_READY__ = true; 8 9 var config = window.ADNAjaxNewsTeasersLoadMore || {}; 10 var loadMoreAction = config.loadMoreAction || 'adn_ajax_news_teasers_load_more'; 11 var footerAction = config.footerAction || 'adn_ajax_news_teasers_load_more_footer'; 12 13 function getSectionConfig(section) { 14 return { 15 ajaxUrl: section.getAttribute('data-ajax-url') || (window.ADNAjaxNewsTeasers && window.ADNAjaxNewsTeasers.ajaxUrl) || '', 16 nonce: section.getAttribute('data-nonce') || (window.ADNAjaxNewsTeasers && window.ADNAjaxNewsTeasers.nonce) || '', 17 scopeMode: section.getAttribute('data-scope-mode') || 'all', 18 scopeCategories: section.getAttribute('data-scope-categories') || '' 19 }; 20 } 21 22 function getActiveCategory(section) { 23 var activeButton = section.querySelector('.ajax-news-filter__button.is-active'); 24 if (activeButton) { 25 return activeButton.getAttribute('data-category') || ''; 26 } 27 var select = section.querySelector('.ajax-news-filter__select'); 28 return select ? (select.value || '') : ''; 29 } 30 31 function getGrid(section) { 32 var results = section.querySelector('.ajax-news-results'); 33 var inner = results ? results.querySelector('.ajax-news-results-inner') : null; 34 return inner ? inner.querySelector('.ajax-news-grid') : null; 35 } 36 37 function getBatchSize(section) { 38 return parseInt(section.getAttribute('data-load-more-batch') || section.getAttribute('data-cards-count') || '6', 10); 39 } 40 41 function slugFromUrl(url) { 42 try { 43 var parts = new URL(url, window.location.origin).pathname.split('/').filter(Boolean); 44 return parts.length ? parts[parts.length - 1] : ''; 45 } catch (error) { 46 return ''; 47 } 48 } 49 50 function getVisibleSlugs(section) { 51 var slugs = []; 52 53 section.querySelectorAll('.ajax-news-featured-wrap a[href], .ajax-news-grid a[href]').forEach(function (link) { 54 var slug = link.getAttribute('data-post-slug') || slugFromUrl(link.href); 55 if (slug && slugs.indexOf(slug) === -1) { 56 slugs.push(slug); 57 } 58 }); 59 60 section.querySelectorAll('.ajax-news-card-wrap[data-post-slug]').forEach(function (card) { 61 var slug = card.getAttribute('data-post-slug') || ''; 62 if (slug && slugs.indexOf(slug) === -1) { 63 slugs.push(slug); 64 } 65 }); 66 67 return slugs; 68 } 69 70 function getVisibleIds(section) { 71 var ids = []; 72 section.querySelectorAll('[data-post-id]').forEach(function (el) { 73 var id = parseInt(el.getAttribute('data-post-id') || '0', 10); 74 if (id > 0 && ids.indexOf(id) === -1) { 75 ids.push(id); 76 } 77 }); 78 return ids; 79 } 80 81 function removeLoadMoreWrap(section) { 82 section.querySelectorAll('.ajax-news-load-more-wrap').forEach(function (wrap) { 83 wrap.remove(); 84 }); 85 } 86 87 function insertLoadMoreHtml(section, html) { 88 removeLoadMoreWrap(section); 89 if (!html) { 90 return; 91 } 92 var results = section.querySelector('.ajax-news-results'); 93 if (results) { 94 results.insertAdjacentHTML('beforeend', html); 95 } 96 } 97 98 function appendUniqueCards(section, grid, html) { 99 if (!html) { 100 return 0; 101 } 102 103 var knownSlugs = getVisibleSlugs(section); 104 var knownIds = getVisibleIds(section); 105 var template = document.createElement('template'); 106 template.innerHTML = html; 107 var added = 0; 108 109 template.content.querySelectorAll('.ajax-news-card-wrap').forEach(function (card) { 110 var link = card.querySelector('a[href]'); 111 var slug = card.getAttribute('data-post-slug') || (link ? slugFromUrl(link.href) : ''); 112 var id = parseInt(card.getAttribute('data-post-id') || '0', 10); 113 114 if (id > 0 && knownIds.indexOf(id) !== -1) { 115 return; 116 } 117 118 if (slug && knownSlugs.indexOf(slug) !== -1) { 119 return; 120 } 121 122 grid.appendChild(card); 123 124 if (id > 0) { 125 knownIds.push(id); 126 } 127 128 if (slug) { 129 knownSlugs.push(slug); 130 } 131 132 added += 1; 133 }); 134 135 return added; 136 } 137 138 function refreshLoadMoreButton(section) { 139 var sectionConfig = getSectionConfig(section); 140 if (!sectionConfig.ajaxUrl || !sectionConfig.nonce) { 141 return; 142 } 143 144 var formData = new FormData(); 145 formData.append('action', footerAction); 146 formData.append('nonce', sectionConfig.nonce); 147 formData.append('category', getActiveCategory(section)); 148 formData.append('scope_mode', sectionConfig.scopeMode); 149 formData.append('scope_categories', sectionConfig.scopeCategories); 150 formData.append('exclude_slugs', getVisibleSlugs(section).join(',')); 151 formData.append('exclude_ids', getVisibleIds(section).join(',')); 152 153 fetch(sectionConfig.ajaxUrl, { method: 'POST', credentials: 'same-origin', body: formData }) 154 .then(function (response) { 155 if (!response.ok) { 156 throw new Error('HTTP ' + response.status); 157 } 158 return response.json(); 159 }) 160 .then(function (data) { 161 if (data && data.success && data.data) { 162 insertLoadMoreHtml(section, data.data.html || ''); 163 } 164 }) 165 .catch(function (error) { 166 console.error('Load-More Footer Fehler:', error); 167 }); 168 } 169 170 function loadMore(section, wrap) { 171 if (!section || !wrap || section.classList.contains('is-loading') || section.__adnLoadMoreBusy) { 172 return; 173 } 174 175 var sectionConfig = getSectionConfig(section); 176 var button = wrap.querySelector('.ajax-news-load-more'); 177 var grid = getGrid(section); 178 179 if (!sectionConfig.ajaxUrl || !sectionConfig.nonce || !button || !grid) { 180 return; 181 } 182 183 var category = wrap.getAttribute('data-category') || getActiveCategory(section); 184 var excludeSlugs = getVisibleSlugs(section); 185 var excludeIds = getVisibleIds(section); 186 187 button.disabled = true; 188 section.__adnLoadMoreBusy = true; 189 section.classList.add('is-loading'); 190 191 var formData = new FormData(); 192 formData.append('action', loadMoreAction); 193 formData.append('nonce', sectionConfig.nonce); 194 formData.append('category', category); 195 formData.append('scope_mode', sectionConfig.scopeMode); 196 formData.append('scope_categories', sectionConfig.scopeCategories);
197 formData.append('count', String(getBatchSize(section))); 198 formData.append('exclude_slugs', excludeSlugs.join(',')); 199 formData.append('exclude_ids', excludeIds.join(',')); 200 201 fetch(sectionConfig.ajaxUrl, { method: 'POST', credentials: 'same-origin', body: formData }) 202 .then(function (response) { 203 if (!response.ok) { 204 throw new Error('HTTP ' + response.status); 205 } 206 return response.json(); 207 }) 208 .then(function (data) { 209 if (!(data && data.success && data.data)) { 210 throw new Error('Ungültige Antwort'); 211 } 212 213 var added = appendUniqueCards(section, grid, data.data.html || ''); 214 var batchSize = getBatchSize(section); 215 var loadedCount = parseInt(data.data.loaded, 10) || 0; 216 var hasMore = !!data.data.has_more; 217 218 if (added === 0 || loadedCount === 0 || loadedCount < batchSize) { 219 hasMore = false; 220 } 221 222 removeLoadMoreWrap(section); 223 224 if (hasMore) { 225 insertLoadMoreHtml( 226 section, 227 '<div class="ajax-news-load-more-wrap" data-category="' + category + '"><button type="button" class="ajax-news-load-more">Mehr laden</button></div>' 228 ); 229 } 230 }) 231 .catch(function (error) { 232 console.error('Load-More Fehler:', error); 233 }) 234 .finally(function () { 235 button.disabled = false; 236 section.__adnLoadMoreBusy = false; 237 section.classList.remove('is-loading'); 238 }); 239 } 240 241 function scheduleLoadMoreRefreshAfterFilter(section) { 242 var attempts = 0; 243 var timer = window.setInterval(function () { 244 attempts += 1; 245 if (section.classList.contains('is-loading')) { 246 if (attempts >= 100) { 247 window.clearInterval(timer); 248 } 249 return; 250 } 251 window.clearInterval(timer); 252 refreshLoadMoreButton(section); 253 }, 100); 254 } 255 256 document.addEventListener('click', function (event) { 257 var loadMoreButton = event.target.closest('.ajax-news-load-more'); 258 if (loadMoreButton) { 259 event.preventDefault(); 260 loadMore(loadMoreButton.closest('.ajax-news-section'), loadMoreButton.closest('.ajax-news-load-more-wrap')); 261 return; 262 } 263 264 var filterButton = event.target.closest('.ajax-news-filter__button'); 265 if (filterButton) { 266 var filterSection = filterButton.closest('.ajax-news-section'); 267 if (filterSection) { 268 scheduleLoadMoreRefreshAfterFilter(filterSection); 269 } 270 } 271 }, true); 272 273 document.addEventListener('change', function (event) { 274 var select = event.target.closest('.ajax-news-filter__select'); 275 if (select) { 276 var section = select.closest('.ajax-news-section'); 277 if (section) { 278 scheduleLoadMoreRefreshAfterFilter(section); 279 } 280 } 281 }, true); 282}());
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.