import { $, api, esc, showError, renderHeader, renderFooter, isAdmin } from './common.js'; renderHeader('statistik'); renderFooter(); let stats = []; let canEdit = false; // Admin und laufendes Jahr function detail(s) { if (!s.manual) return ''; const sign = s.manual > 0 ? '+' : '−'; return `${s.calendar} aus Kalender ${sign} ${Math.abs(s.manual)} manuell`; } function render() { $('#stats-empty').hidden = stats.length > 0; $('#stats-edit-hint').hidden = !canEdit; // Gleiche Anzahl → gleicher Platz const rank = (s) => 1 + stats.filter((x) => x.total > s.total).length; const max = Math.max(1, ...stats.map((s) => s.total)); $('#stats-list').innerHTML = stats.map((s) => `
  • ${rank(s)}. ${esc(s.name)} ${detail(s)} ${canEdit ? ` ` : ''} ${s.total} ${canEdit ? ` ` : ''}
  • `).join(''); } $('#stats-list').addEventListener('click', async (e) => { const { step, id } = e.target.closest('[data-step]')?.dataset ?? {}; if (!step) return; const s = stats.find((x) => x.id === id); try { const { manual } = await api('PUT', `/members/${id}/plays-manual`, { manual: Math.max(s.manual, -s.calendar) + Number(step) }); s.manual = manual; s.total = Math.max(0, s.calendar + manual); stats.sort((a, b) => b.total - a.total || a.name.localeCompare(b.name, 'de')); render(); } catch (err) { showError(err); } }); let admin = false; async function load(year) { const data = await api('GET', `/stats${year ? `?year=${year}` : ''}`); stats = data.entries; canEdit = admin && data.live; $('#stats-year').innerHTML = data.years .map((y, i) => ``).join(''); $('#stats-info').textContent = data.live ? `Laufendes Jahr: Spiel-Events seit dem 1. Januar ${data.year}, bei denen jemand zugesagt hat.` : `Endstand ${data.year}, gespeichert am ${new Date(data.savedAt).toLocaleDateString('de-DE')}.`; render(); } $('#stats-year').addEventListener('change', (e) => load(e.target.value).catch(showError)); isAdmin() .then((yes) => { admin = yes; return load(); }) .catch(showError);