diff --git a/public/js/quickmenu/events.js b/public/js/quickmenu/events.js
index 4711992..b71c7ca 100644
--- a/public/js/quickmenu/events.js
+++ b/public/js/quickmenu/events.js
@@ -58,15 +58,32 @@ export async function loadEvents() {
{ id: 5, img: "/images/items/runenhaufen.png", label: "Textzeile 5" },
];
+ // Täglichen Status vom Server laden
+ let completedToday = [];
+ try {
+ const statusRes = await fetch("/api/daily/status");
+ if (statusRes.ok) {
+ const statusData = await statusRes.json();
+ completedToday = statusData.completed || [];
+ }
+ } catch (e) {
+ console.error("Daily-Status laden fehlgeschlagen", e);
+ }
+
body.innerHTML = `
- ${events.map(ev => `
-
+ ${events.map(ev => {
+ const done = completedToday.includes(ev.id);
+ return `
+

+ ${done ? `
✓
` : ''}
${ev.label}
-
`).join("")}
+ ${done ? `
Bereits erledigt` : ''}
+
`;
+ }).join("")}
@@ -109,6 +126,9 @@ export async function loadEvents() {
/* ── Event-Karten ── */
body.querySelectorAll(".event-card").forEach(card => {
card.addEventListener("click", () => {
+ // Bereits erledigt → nicht anklickbar
+ if (card.dataset.done === "true") return;
+
if (card.dataset.type === "booster") {
eventsGrid.style.display = "none";
boosterUi.style.display = "flex";
@@ -126,6 +146,32 @@ export async function loadEvents() {
});
});
+ /* ── Daily als erledigt markieren (für nicht-Booster Events) ── */
+ async function markDailyComplete(eventId) {
+ try {
+ await fetch("/api/daily/complete", {
+ method: "POST",
+ headers: { "Content-Type": "application/json" },
+ body: JSON.stringify({ eventId }),
+ });
+ // Karte visuell als erledigt markieren
+ const card = body.querySelector(`.event-card[data-event-id="${eventId}"]`);
+ if (card) {
+ card.dataset.done = "true";
+ card.classList.add("event-done");
+ const wrap = card.querySelector(".event-card-img-wrap");
+ if (wrap && !wrap.querySelector(".event-done-overlay")) {
+ wrap.insertAdjacentHTML("beforeend", `✓
`);
+ }
+ if (!card.querySelector(".event-done-label")) {
+ card.insertAdjacentHTML("beforeend", `Bereits erledigt`);
+ }
+ }
+ } catch (e) {
+ console.error("Daily markieren fehlgeschlagen", e);
+ }
+ }
+
body.querySelector("#edp-close-btn").addEventListener("click", () => overlay.classList.remove("active"));
overlay.addEventListener("click", e => { if (e.target === overlay) overlay.classList.remove("active"); });
@@ -294,6 +340,9 @@ export async function loadEvents() {
console.error("Karten speichern fehlgeschlagen", e);
}
+ // Booster-Daily als erledigt markieren (event_id = 1)
+ await markDailyComplete(1);
+
allRevealed = true;
window.__boosterLocked = false; // äußere Modals wieder freigeben
body.querySelector("#booster-hint").textContent = "Alle Karten erhalten! ✓";
diff --git a/routes/daily.js b/routes/daily.js
new file mode 100644
index 0000000..b06b43a
--- /dev/null
+++ b/routes/daily.js
@@ -0,0 +1,63 @@
+const express = require("express");
+const router = express.Router();
+const db = require("../database/database");
+
+/* ================================
+ GET /api/daily/status
+ Gibt zurück welche Events der User heute schon erledigt hat
+ Response: { completed: [1, 3] } ← Array der erledigten event_ids
+================================ */
+router.get("/daily/status", async (req, res) => {
+ if (!req.session?.user) return res.status(401).json({ error: "Nicht eingeloggt" });
+
+ const userId = req.session.user.id;
+ try {
+ const [rows] = await db.query(
+ "SELECT event_id FROM daily_completions WHERE user_id = ?",
+ [userId]
+ );
+ res.json({ completed: rows.map(r => r.event_id) });
+ } catch (err) {
+ console.error(err);
+ res.status(500).json({ error: "DB Fehler" });
+ }
+});
+
+/* ================================
+ POST /api/daily/complete
+ Markiert ein Daily als erledigt
+ Body: { eventId: 1 }
+ Response: { success: true } oder { error: "bereits erledigt" }
+================================ */
+router.post("/daily/complete", async (req, res) => {
+ if (!req.session?.user) return res.status(401).json({ error: "Nicht eingeloggt" });
+
+ const userId = req.session.user.id;
+ const eventId = req.body?.eventId;
+
+ if (!eventId) return res.status(400).json({ error: "eventId fehlt" });
+
+ try {
+ // Prüfen ob heute schon erledigt
+ const [[existing]] = await db.query(
+ "SELECT id FROM daily_completions WHERE user_id = ? AND event_id = ?",
+ [userId, eventId]
+ );
+
+ if (existing) {
+ return res.status(409).json({ error: "bereits erledigt" });
+ }
+
+ await db.query(
+ "INSERT INTO daily_completions (user_id, event_id) VALUES (?, ?)",
+ [userId, eventId]
+ );
+
+ res.json({ success: true });
+ } catch (err) {
+ console.error(err);
+ res.status(500).json({ error: "DB Fehler" });
+ }
+});
+
+module.exports = router;