// events page — list + title edit + detach-and-delete // depends on: app.js let eventOffset = 0; let currentEvent = null; async function loadEvents() { const data = await api(`/admin/api/events?limit=${PAGE}&offset=${eventOffset}`); const tbody = document.getElementById("eventTable"); tbody.innerHTML = data.rows.map(r => ` ${r.id} ${escapeHtml(r.title)} ${r.article_count} ${r.created_at ? r.created_at.slice(0, 16) : "—"} `).join(""); const total = data.total; document.getElementById("ePageInfo").textContent = `${eventOffset + 1}–${Math.min(eventOffset + PAGE, total)} of ${total.toLocaleString()}`; document.getElementById("ePrevBtn").disabled = eventOffset === 0; document.getElementById("eNextBtn").disabled = eventOffset + PAGE >= total; } function openEvent(id, title) { currentEvent = { id, title }; document.getElementById("em-title").value = title; document.getElementById("eventOverlay").classList.add("open"); } document.addEventListener("DOMContentLoaded", () => { document.getElementById("ePrevBtn").onclick = () => { eventOffset = Math.max(0, eventOffset - PAGE); loadEvents(); }; document.getElementById("eNextBtn").onclick = () => { eventOffset += PAGE; loadEvents(); }; document.getElementById("eCancelBtn").onclick = () => document.getElementById("eventOverlay").classList.remove("open"); document.getElementById("eSaveBtn").onclick = async () => { if (!currentEvent) return; try { await api(`/admin/api/events/${currentEvent.id}`, { method: "PATCH", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ title: document.getElementById("em-title").value }), }); document.getElementById("eventOverlay").classList.remove("open"); toast("Saved"); loadEvents(); } catch (e) { toast("Save failed", true); } }; document.getElementById("eDeleteBtn").onclick = async () => { if (!currentEvent) return; if (!confirm(`Delete event #${currentEvent.id}? Articles will be detached but not deleted.`)) return; try { await api(`/admin/api/events/${currentEvent.id}`, { method: "DELETE" }); document.getElementById("eventOverlay").classList.remove("open"); toast("Event deleted"); loadEvents(); loadGlobalStats(); } catch (e) { toast("Delete failed", true); } }; loadEvents(); });