Files
Kontrollverlust/web/js/entry.js
T
irrlicht cb3da3bb24 Soft-Delete: Beiträge als [deleted] erhalten statt löschen
- entry.deleted; entrySelect LEFT JOIN + COALESCE(username)
- POST /entry/{pid}/delete: deleted=1, Inhalt/Bild/Autor geleert, Zeile bleibt
- Konto-Löschung soft-deletet die eigenen Beiträge (statt hartem DELETE),
  damit fremde Antworten nicht verwaisen
- Frontend: [deleted]-Platzhalter im Feed, Löschen-Button auf Focus-Seite
- notes/migrations.md: ALTER TABLE deleted

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-03 13:21:42 +02:00

67 lines
2.0 KiB
JavaScript

"use strict";
// pid aus dem Pfad /e/<pid>.
const pid = location.pathname.split("/")[2] || "";
document.getElementById("reply-form").addEventListener("submit", async (e) => {
e.preventDefault();
const fd = new FormData(e.target);
fd.append("reply_to", pid);
const res = await api.post("/entry/create", fd);
if (res.ok) {
e.target.reset();
document.getElementById("reply-msg").textContent = "";
load();
} else {
document.getElementById("reply-msg").textContent =
res.data.error || "Antwort fehlgeschlagen.";
}
});
async function load() {
const data = await api.get(`/entry/${pid}/thread`);
const focus = document.getElementById("focus");
if (data.error) {
focus.textContent = "Beitrag nicht gefunden";
return;
}
// Ahnenkette (Root zuerst), dann der fokussierte Beitrag.
const ancestors = document.getElementById("ancestors");
ancestors.innerHTML = "";
data.ancestors.forEach((a) => ancestors.appendChild(renderEntry(a)));
focus.innerHTML = "";
focus.appendChild(renderEntry(data.entry));
// Eingeloggt? Reply-Box zeigen; eigener, nicht gelöschter Beitrag -> Löschen-Button.
const me = await api.get("/user/info");
document.getElementById("reply-box").hidden = !me.uid;
if (me.uid === data.entry.uid && !data.entry.deleted) {
const btn = document.createElement("button");
btn.textContent = "Löschen";
btn.addEventListener("click", async () => {
if (!confirm("Beitrag wirklich löschen?")) return;
const res = await api.post(`/entry/${pid}/delete`, new FormData());
if (res.ok) load();
else alert(res.data.error || "Löschen fehlgeschlagen.");
});
focus.appendChild(btn);
}
// Direkte Antworten.
const replies = document.getElementById("replies");
replies.innerHTML = "";
if (!data.replies.length) {
const p = document.createElement("p");
p.className = "muted";
p.textContent = "Noch keine Antworten.";
replies.appendChild(p);
} else {
data.replies.forEach((e) => replies.appendChild(renderEntry(e)));
}
}
load();