From be7bbfc28ba2327a0e70245521425bdb1c1e762e Mon Sep 17 00:00:00 2001 From: patrickzerhusen Date: Mon, 27 Apr 2026 15:17:17 +0200 Subject: [PATCH] comment section in moderation portal --- public/admin.php | 141 ++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 140 insertions(+), 1 deletion(-) diff --git a/public/admin.php b/public/admin.php index ce77702..7a17530 100644 --- a/public/admin.php +++ b/public/admin.php @@ -57,6 +57,7 @@ $stmt = $pdo->prepare("SELECT * FROM municipalities WHERE slug = :slug"); $stmt->execute([':slug' => getenv('MUNICIPALITY_SLUG')]); $municipality = $stmt->fetch(); + // Loads News for Moderation $stmt = $pdo->prepare(" SELECT news_id, title, content, author_name, published_at, created_at @@ -67,6 +68,20 @@ $stmt = $pdo->prepare(" $stmt->execute([':mid' => $municipality['municipality_id']]); $news_items = $stmt->fetchAll(); + +// Loads Comments with Contribution for Moderation +$stmt = $pdo->prepare(" + SELECT cm.comment_id, cm.contribution_id, cm.author_name, cm.browser_id, cm.content, cm.created_at, + co.title AS contribution_title + FROM comments cm + JOIN contributions co ON cm.contribution_id = co.contribution_id + WHERE co.municipality_id = :mid + ORDER BY cm.created_at DESC +"); +$stmt->execute([':mid' => $municipality['municipality_id']]); +$all_comments = $stmt->fetchAll(); + + // Shows Login Page if not authenticated if ($page === 'login' || !is_admin()) { show_login_page($municipality, $login_error ?? null); @@ -159,6 +174,9 @@ $counts['total'] = count($all_contributions); + @@ -322,6 +340,73 @@ $counts['total'] = count($all_contributions); + + + + + + @@ -621,7 +706,7 @@ $counts['total'] = count($all_contributions); // ============================================================= - // Edit Contribution (Title and Description) + // Edit Contribution // ============================================================= function editContribution(contributionId, currentTitle, currentDescription) { @@ -847,6 +932,60 @@ $counts['total'] = count($all_contributions); }); } + + // ============================================================= + // Sort Comments + // ============================================================= + + function sortCommentRows(sortBy) { + const container = document.getElementById('comments-mod-container'); + const rows = Array.from(container.querySelectorAll('.comment-mod-row')); + + rows.sort(function (a, b) { + if (sortBy === 'date-desc') { + return new Date(b.dataset.date) - new Date(a.dataset.date); + } else if (sortBy === 'date-asc') { + return new Date(a.dataset.date) - new Date(b.dataset.date); + } else if (sortBy === 'contribution') { + return a.dataset.contribution.localeCompare(b.dataset.contribution); + } + return 0; + }); + + rows.forEach(function (row) { container.appendChild(row); }); + } + + + // ============================================================= + // Delete Comments + // ============================================================= + + function deleteModComment(commentId) { + Swal.fire({ + title: 'Kommentar löschen?', + text: 'Diese Aktion kann nicht rückgängig gemacht werden.', + icon: 'warning', + showCancelButton: true, + confirmButtonText: 'Löschen', + cancelButtonText: 'Abbrechen', + confirmButtonColor: '#c62828' + }).then(function (result) { + if (!result.isConfirmed) return; + + apiCall({ + action: 'delete_comment', + comment_id: commentId + }).then(function (response) { + if (response.error) { + Swal.fire('Fehler', response.error, 'error'); + return; + } + Swal.fire('Gelöscht!', 'Kommentar wurde entfernt.', 'success') + .then(function () { location.reload(); }); + }); + }); + } +