import { $, api, esc, sortByName, showError, renderHeader, toIso, fromIso, formatDate, getMe, setMe, } from './common.js'; renderHeader('kalender'); let members = []; let events = []; let me = getMe(); const todayIso = toIso(new Date()); let selectedDay = todayIso; let viewMonth = fromIso(todayIso); viewMonth.setDate(1); const memberName = (id) => members.find((m) => m.id === id)?.name ?? '(gelöscht)'; // ---------- "Ich bin" ---------- function renderMe() { if (me && !members.some((m) => m.id === me)) me = null; $('#me-select').innerHTML = '' + sortByName(members).map((m) => ``).join(''); $('#me-hint').hidden = !!me; $('#event-form button[type=submit]').disabled = !me; } $('#me-select').addEventListener('change', (e) => { me = e.target.value || null; setMe(me); renderAll(); }); // ---------- Monatsansicht ---------- function renderCalendar() { const title = viewMonth.toLocaleDateString('de-DE', { month: 'long', year: 'numeric' }); $('#month-title').textContent = title; // Raster beginnt am Montag vor (oder am) Monatsersten const start = new Date(viewMonth); start.setDate(1 - ((start.getDay() + 6) % 7)); const byDate = new Map(); for (const ev of events) { if (!byDate.has(ev.date)) byDate.set(ev.date, []); byDate.get(ev.date).push(ev); } let html = ['Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa', 'So'].map((d) => `
An diesem Tag ist noch kein Spieltag eingetragen.
'; } function renderUpcoming() { const upcoming = events.filter((e) => e.date >= todayIso); $('#upcoming').innerHTML = upcoming.length ? upcoming.map(eventHtml).join('') : 'Keine kommenden Spieltage.
'; } document.addEventListener('click', async (e) => { const btn = e.target.closest('[data-action]'); if (!btn) return; const { action, id } = btn.dataset; try { if (action === 'join') await api('PUT', `/events/${id}/attendees/${me}`); if (action === 'leave') await api('DELETE', `/events/${id}/attendees/${me}`); if (action === 'delete') { const ev = events.find((x) => x.id === id); if (!confirm(`Spieltag „${ev.title}“ am ${formatDate(ev.date)} wirklich löschen?`)) return; await api('DELETE', `/events/${id}`); } await load(); } catch (err) { showError(err); } }); $('#event-form').addEventListener('submit', async (e) => { e.preventDefault(); try { await api('POST', '/events', { date: selectedDay, title: $('#event-title').value, note: $('#event-note').value, createdBy: me, }); e.target.reset(); await load(); } catch (err) { showError(err); } }); // ---------- Laden ---------- function renderAll() { renderMe(); renderCalendar(); renderDay(); renderUpcoming(); } async function load() { [members, events] = await Promise.all([api('GET', '/members'), api('GET', '/events')]); renderAll(); } load().catch(showError);