Merge branch 'loader' into devNachCSRF

This commit is contained in:
2026-07-19 23:59:13 +02:00
8 changed files with 177 additions and 9 deletions
+38 -1
View File
@@ -11,7 +11,19 @@ document.addEventListener("DOMContentLoaded", function () {
const parentCommentInput = document.getElementById("parent-comment-id");
const replyInfo = document.getElementById("reply-info");
if (!form || !commentsList || !commentContent || !parentCommentInput) {
const submitButton = form
? form.querySelector('button[type="submit"]')
: null;
const loadingMessage = document.getElementById("comment-loading");
if (
!form
|| !commentsList
|| !commentContent
|| !parentCommentInput
|| !submitButton
) {
return;
}
@@ -53,6 +65,23 @@ document.addEventListener("DOMContentLoaded", function () {
form.addEventListener("submit", function (event) {
event.preventDefault();
/*
* Verhindert einen erneuten Submit, während der vorherige
* Kommentar noch gespeichert wird.
*/
if (submitButton.disabled) {
return;
}
const originalButtonText = submitButton.textContent;
submitButton.disabled = true;
submitButton.textContent = "Wird gesendet …";
if (loadingMessage) {
loadingMessage.hidden = false;
}
const formData = new FormData(form);
const parentCommentId = parentCommentInput.value;
@@ -293,6 +322,14 @@ document.addEventListener("DOMContentLoaded", function () {
.catch(function (error) {
console.error(error);
alert("Kommentar konnte nicht gesendet werden.");
})
.finally(function () {
submitButton.disabled = false;
submitButton.textContent = originalButtonText;
if (loadingMessage) {
loadingMessage.hidden = true;
}
});
});
+23 -4
View File
@@ -25,6 +25,7 @@
let listContainer, sortRadios, categorySelect, limitSelect;
let prevBtn, nextBtn, numbersContainer, jsNav, resultCountEl;
let loadingElement;
function init() {
listContainer = document.querySelector('.s-res-list');
@@ -38,23 +39,41 @@
numbersContainer = document.getElementById('dynamic-page-numbers');
jsNav = document.getElementById('js-page-navigation');
resultCountEl = document.getElementById('s-res-result-count');
loadingElement = document.getElementById('results-loading');
const checkedRadio = document.querySelector('.sort-radio:checked');
state.sort = checkedRadio ? checkedRadio.value : 'alphabet';
state.category = categorySelect ? categorySelect.value : 'all';
state.itemsPerPage = limitSelect ? (parseInt(limitSelect.value, 10) || 10) : 10;
if (loadingElement) {
loadingElement.hidden = false;
}
fetchFullDataset()
.then(function (data) {
state.allItems = data.results || [];
attachEvents();
render();
if (jsNav) jsNav.style.display = 'flex';
if (jsNav) {
jsNav.style.display = 'flex';
}
})
.catch(function (err) {
// JSON-Endpoint nicht erreichbar: die serverseitig gerenderte
// (No-JS-)Ansicht bleibt sichtbar und funktioniert weiter.
console.error('Suchergebnisse konnten nicht nachgeladen werden:', err);
/*
* Falls das Nachladen nicht funktioniert, bleibt die bereits
* serverseitig ausgegebene Ergebnisliste sichtbar.
*/
console.error(
'Suchergebnisse konnten nicht nachgeladen werden:',
err
);
})
.finally(function () {
if (loadingElement) {
loadingElement.hidden = true;
}
});
}
+23 -4
View File
@@ -21,6 +21,7 @@
let listContainer, sortRadios, searchInput, limitSelect;
let prevBtn, nextBtn, numbersContainer, jsNav, resultCountEl;
let loadingElement;
let searchDebounceTimer;
function init() {
@@ -35,23 +36,41 @@
numbersContainer = document.getElementById('dynamic-page-numbers');
jsNav = document.getElementById('js-page-navigation');
resultCountEl = document.getElementById('s-res-result-count');
loadingElement = document.getElementById('results-loading');
const checkedRadio = document.querySelector('.sort-radio:checked');
state.sort = checkedRadio ? checkedRadio.value : 'alphabet';
state.query = searchInput ? searchInput.value : '';
state.itemsPerPage = limitSelect ? (parseInt(limitSelect.value, 10) || 10) : 10;
if (loadingElement) {
loadingElement.hidden = false;
}
fetchFullDataset()
.then(function (data) {
state.allItems = data.results || [];
attachEvents();
render();
if (jsNav) jsNav.style.display = 'flex';
if (jsNav) {
jsNav.style.display = 'flex';
}
})
.catch(function (err) {
// JSON-Endpoint nicht erreichbar: die serverseitig gerenderte
// (No-JS-)Ansicht bleibt sichtbar und funktioniert weiter.
console.error('Kategorie-Beiträge konnten nicht nachgeladen werden:', err);
/*
* Falls das Nachladen nicht funktioniert, bleibt die bereits
* serverseitig ausgegebene Kategorieansicht sichtbar.
*/
console.error(
'Kategorie-Beiträge konnten nicht nachgeladen werden:',
err
);
})
.finally(function () {
if (loadingElement) {
loadingElement.hidden = true;
}
});
}