const CARDS_PER_PAGE = 12; let currentGroupId = null; let currentPage = 1; export async function loadCardDeck() { const body = document.getElementById("qm-body-carddeck"); if (!body) return; body.innerHTML = renderShell(); try { const res = await fetch("/api/card-groups"); if (!res.ok) throw new Error("API Fehler"); const groups = await res.json(); renderTabs(groups); if (groups.length) { currentGroupId = groups[0].id; await loadCards(); } } catch (err) { console.error("Gruppen Fehler:", err); } } /* ── Grundstruktur ──────────────────────────── */ function renderShell() { return `
`; } /* ── Tabs aus DB ────────────────────────────── */ function renderTabs(groups) { const container = document.getElementById("kd-tabs"); if (!container) return; container.innerHTML = groups.map((g, i) => { const color = g.color || "#6b4b2a"; return ` `; }).join(""); container.querySelectorAll(".kd-tab").forEach((btn) => { btn.addEventListener("click", async () => { const color = btn.style.borderColor; container.querySelectorAll(".kd-tab").forEach((b) => { b.classList.remove("kd-tab-active"); b.style.background = ""; }); btn.classList.add("kd-tab-active"); btn.style.background = `${color}33`; currentGroupId = parseInt(btn.dataset.group); currentPage = 1; await loadCards(); }); }); } /* ── Karten laden ───────────────────────────── */ async function loadCards() { const grid = document.getElementById("kd-grid"); const pagination = document.getElementById("kd-pagination"); if (!grid) return; grid.innerHTML = `
Lade Karten...
`; pagination.innerHTML = ""; try { const res = await fetch(`/api/cards?group_id=${currentGroupId}&page=${currentPage}&limit=${CARDS_PER_PAGE}`); if (!res.ok) throw new Error("API Fehler"); const data = await res.json(); renderGrid(grid, data.cards); renderPagination(pagination, data.totalPages, data.total); } catch { grid.innerHTML = `
Noch keine Karten für diese Gruppe vorhanden.
`; } } /* ── Grid ───────────────────────────────────── */ function renderGrid(grid, cards) { if (!cards || !cards.length) { grid.innerHTML = `
Noch keine Karten für diese Gruppe vorhanden.
`; return; } grid.innerHTML = cards.map((c) => `
${c.name} ${c.attack != null ? `${c.attack}` : ""} ${c.defense != null ? `${c.defense}` : ""}
${c.name}
`).join(""); } /* ── Pagination ─────────────────────────────── */ function renderPagination(pagination, totalPages, total) { if (totalPages <= 1) return; pagination.innerHTML = ` ${Array.from({ length: totalPages }, (_, i) => i + 1).map((p) => ` `).join("")} ${total} Karten `; document.getElementById("kd-prev")?.addEventListener("click", async () => { if (currentPage > 1) { currentPage--; await loadCards(); } }); document.getElementById("kd-next")?.addEventListener("click", async () => { if (currentPage < totalPages) { currentPage++; await loadCards(); } }); pagination.querySelectorAll("[data-page]").forEach((btn) => { btn.addEventListener("click", async () => { currentPage = parseInt(btn.dataset.page); await loadCards(); }); }); }