Loader
This commit is contained in:
@@ -137,6 +137,17 @@ $categories = [
|
|||||||
<p class="s-res-meta"><span id="s-res-result-count"><?php echo $totalResultsCount; ?></span> Treffer für Ihre Suchanfrage "<?php echo htmlspecialchars($query); ?>"</p>
|
<p class="s-res-meta"><span id="s-res-result-count"><?php echo $totalResultsCount; ?></span> Treffer für Ihre Suchanfrage "<?php echo htmlspecialchars($query); ?>"</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<p
|
||||||
|
id="results-loading"
|
||||||
|
class="results-loading"
|
||||||
|
role="status"
|
||||||
|
aria-live="polite"
|
||||||
|
hidden
|
||||||
|
>
|
||||||
|
<span class="results-spinner" aria-hidden="true"></span>
|
||||||
|
Suchergebnisse werden geladen …
|
||||||
|
</p>
|
||||||
|
|
||||||
<!-- Ergebnisliste -->
|
<!-- Ergebnisliste -->
|
||||||
<div class="s-res-list">
|
<div class="s-res-list">
|
||||||
<?php if (!empty($results)): ?>
|
<?php if (!empty($results)): ?>
|
||||||
|
|||||||
@@ -113,6 +113,17 @@ $resultCount = count($results);
|
|||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<p
|
||||||
|
id="results-loading"
|
||||||
|
class="results-loading"
|
||||||
|
role="status"
|
||||||
|
aria-live="polite"
|
||||||
|
hidden
|
||||||
|
>
|
||||||
|
<span class="results-spinner" aria-hidden="true"></span>
|
||||||
|
Kategoriebeiträge werden geladen …
|
||||||
|
</p>
|
||||||
|
|
||||||
<!-- Ergebnisliste -->
|
<!-- Ergebnisliste -->
|
||||||
<div class="s-res-list">
|
<div class="s-res-list">
|
||||||
<?php if (!empty($results)): ?>
|
<?php if (!empty($results)): ?>
|
||||||
|
|||||||
@@ -271,4 +271,33 @@ CSS für die Suchergebnis-Seite
|
|||||||
align-items: flex-start;
|
align-items: flex-start;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
/* Ladeanzeige beim Nachladen von Such- und Kategorieergebnissen */
|
||||||
|
.results-loading {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 8px;
|
||||||
|
margin: 15px 0;
|
||||||
|
color: #4a5568;
|
||||||
|
font-size: 0.95rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.results-loading[hidden] {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.results-spinner {
|
||||||
|
width: 16px;
|
||||||
|
height: 16px;
|
||||||
|
flex-shrink: 0;
|
||||||
|
border: 2px solid #cbd5e1;
|
||||||
|
border-top-color: #3182ce;
|
||||||
|
border-radius: 50%;
|
||||||
|
animation: results-spinner-rotation 0.8s linear infinite;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes results-spinner-rotation {
|
||||||
|
to {
|
||||||
|
transform: rotate(360deg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
+23
-4
@@ -25,6 +25,7 @@
|
|||||||
|
|
||||||
let listContainer, sortRadios, categorySelect, limitSelect;
|
let listContainer, sortRadios, categorySelect, limitSelect;
|
||||||
let prevBtn, nextBtn, numbersContainer, jsNav, resultCountEl;
|
let prevBtn, nextBtn, numbersContainer, jsNav, resultCountEl;
|
||||||
|
let loadingElement;
|
||||||
|
|
||||||
function init() {
|
function init() {
|
||||||
listContainer = document.querySelector('.s-res-list');
|
listContainer = document.querySelector('.s-res-list');
|
||||||
@@ -38,23 +39,41 @@
|
|||||||
numbersContainer = document.getElementById('dynamic-page-numbers');
|
numbersContainer = document.getElementById('dynamic-page-numbers');
|
||||||
jsNav = document.getElementById('js-page-navigation');
|
jsNav = document.getElementById('js-page-navigation');
|
||||||
resultCountEl = document.getElementById('s-res-result-count');
|
resultCountEl = document.getElementById('s-res-result-count');
|
||||||
|
loadingElement = document.getElementById('results-loading');
|
||||||
|
|
||||||
const checkedRadio = document.querySelector('.sort-radio:checked');
|
const checkedRadio = document.querySelector('.sort-radio:checked');
|
||||||
state.sort = checkedRadio ? checkedRadio.value : 'alphabet';
|
state.sort = checkedRadio ? checkedRadio.value : 'alphabet';
|
||||||
state.category = categorySelect ? categorySelect.value : 'all';
|
state.category = categorySelect ? categorySelect.value : 'all';
|
||||||
state.itemsPerPage = limitSelect ? (parseInt(limitSelect.value, 10) || 10) : 10;
|
state.itemsPerPage = limitSelect ? (parseInt(limitSelect.value, 10) || 10) : 10;
|
||||||
|
|
||||||
|
if (loadingElement) {
|
||||||
|
loadingElement.hidden = false;
|
||||||
|
}
|
||||||
|
|
||||||
fetchFullDataset()
|
fetchFullDataset()
|
||||||
.then(function (data) {
|
.then(function (data) {
|
||||||
state.allItems = data.results || [];
|
state.allItems = data.results || [];
|
||||||
attachEvents();
|
attachEvents();
|
||||||
render();
|
render();
|
||||||
if (jsNav) jsNav.style.display = 'flex';
|
|
||||||
|
if (jsNav) {
|
||||||
|
jsNav.style.display = 'flex';
|
||||||
|
}
|
||||||
})
|
})
|
||||||
.catch(function (err) {
|
.catch(function (err) {
|
||||||
// JSON-Endpoint nicht erreichbar: die serverseitig gerenderte
|
/*
|
||||||
// (No-JS-)Ansicht bleibt sichtbar und funktioniert weiter.
|
* Falls das Nachladen nicht funktioniert, bleibt die bereits
|
||||||
console.error('Suchergebnisse konnten nicht nachgeladen werden:', err);
|
* serverseitig ausgegebene Ergebnisliste sichtbar.
|
||||||
|
*/
|
||||||
|
console.error(
|
||||||
|
'Suchergebnisse konnten nicht nachgeladen werden:',
|
||||||
|
err
|
||||||
|
);
|
||||||
|
})
|
||||||
|
.finally(function () {
|
||||||
|
if (loadingElement) {
|
||||||
|
loadingElement.hidden = true;
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+23
-4
@@ -21,6 +21,7 @@
|
|||||||
|
|
||||||
let listContainer, sortRadios, searchInput, limitSelect;
|
let listContainer, sortRadios, searchInput, limitSelect;
|
||||||
let prevBtn, nextBtn, numbersContainer, jsNav, resultCountEl;
|
let prevBtn, nextBtn, numbersContainer, jsNav, resultCountEl;
|
||||||
|
let loadingElement;
|
||||||
let searchDebounceTimer;
|
let searchDebounceTimer;
|
||||||
|
|
||||||
function init() {
|
function init() {
|
||||||
@@ -35,23 +36,41 @@
|
|||||||
numbersContainer = document.getElementById('dynamic-page-numbers');
|
numbersContainer = document.getElementById('dynamic-page-numbers');
|
||||||
jsNav = document.getElementById('js-page-navigation');
|
jsNav = document.getElementById('js-page-navigation');
|
||||||
resultCountEl = document.getElementById('s-res-result-count');
|
resultCountEl = document.getElementById('s-res-result-count');
|
||||||
|
loadingElement = document.getElementById('results-loading');
|
||||||
|
|
||||||
const checkedRadio = document.querySelector('.sort-radio:checked');
|
const checkedRadio = document.querySelector('.sort-radio:checked');
|
||||||
state.sort = checkedRadio ? checkedRadio.value : 'alphabet';
|
state.sort = checkedRadio ? checkedRadio.value : 'alphabet';
|
||||||
state.query = searchInput ? searchInput.value : '';
|
state.query = searchInput ? searchInput.value : '';
|
||||||
state.itemsPerPage = limitSelect ? (parseInt(limitSelect.value, 10) || 10) : 10;
|
state.itemsPerPage = limitSelect ? (parseInt(limitSelect.value, 10) || 10) : 10;
|
||||||
|
|
||||||
|
if (loadingElement) {
|
||||||
|
loadingElement.hidden = false;
|
||||||
|
}
|
||||||
|
|
||||||
fetchFullDataset()
|
fetchFullDataset()
|
||||||
.then(function (data) {
|
.then(function (data) {
|
||||||
state.allItems = data.results || [];
|
state.allItems = data.results || [];
|
||||||
attachEvents();
|
attachEvents();
|
||||||
render();
|
render();
|
||||||
if (jsNav) jsNav.style.display = 'flex';
|
|
||||||
|
if (jsNav) {
|
||||||
|
jsNav.style.display = 'flex';
|
||||||
|
}
|
||||||
})
|
})
|
||||||
.catch(function (err) {
|
.catch(function (err) {
|
||||||
// JSON-Endpoint nicht erreichbar: die serverseitig gerenderte
|
/*
|
||||||
// (No-JS-)Ansicht bleibt sichtbar und funktioniert weiter.
|
* Falls das Nachladen nicht funktioniert, bleibt die bereits
|
||||||
console.error('Kategorie-Beiträge konnten nicht nachgeladen werden:', err);
|
* serverseitig ausgegebene Kategorieansicht sichtbar.
|
||||||
|
*/
|
||||||
|
console.error(
|
||||||
|
'Kategorie-Beiträge konnten nicht nachgeladen werden:',
|
||||||
|
err
|
||||||
|
);
|
||||||
|
})
|
||||||
|
.finally(function () {
|
||||||
|
if (loadingElement) {
|
||||||
|
loadingElement.hidden = true;
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user