From a1322f9b1c611f9fa588c01257df212a681e9bc7 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Mon, 22 Dec 2025 22:06:44 +0000 Subject: [PATCH] Refactor: Display all winners by year, not just current year Co-authored-by: mathieumoran1 --- public/control.html | 2 +- public/js/app_control.js | 74 +++++++++++++++++++++++++--------------- 2 files changed, 48 insertions(+), 28 deletions(-) diff --git a/public/control.html b/public/control.html index 5b2fbed..4705951 100644 --- a/public/control.html +++ b/public/control.html @@ -835,7 +835,7 @@
Gagnants actuels
-
La liste dépend de l’année sélectionnée.
+
Vue globale (toutes les années).
diff --git a/public/js/app_control.js b/public/js/app_control.js index b5ade3a..4839be4 100644 --- a/public/js/app_control.js +++ b/public/js/app_control.js @@ -986,22 +986,10 @@ window.onload = async function () { return winnersByYear.get(String(y)) || null; } - function renderWinnerCurrent() { - if (!winnerCurrentEl || !winnerYearSelect) return; - const y = parseYear(winnerYearSelect.value); - if (!y) { - winnerCurrentEl.textContent = '—'; - return; - } - const list = getWinnerForYear(y); + function sortWinnersForDisplay(list) { const winners = Array.isArray(list) ? list : []; - if (!winners.length) { - winnerCurrentEl.textContent = `${y}: (aucun gagnant)`; - return; - } - // Sort for stable display: points desc (null last), then name - const sorted = winners.slice().sort((a, b) => { + return winners.slice().sort((a, b) => { const ap = a?.points === null || a?.points === undefined ? null : Number(a.points); const bp = b?.points === null || b?.points === undefined ? null : Number(b.points); if (ap === null && bp !== null) return 1; @@ -1009,25 +997,57 @@ window.onload = async function () { if (ap !== null && bp !== null && ap !== bp) return bp - ap; return String(a?.name || '').localeCompare(String(b?.name || ''), 'fr', { sensitivity: 'base' }); }); + } - const rows = sorted.map((w) => { - const name = w?.name || '(utilisateur supprimé)'; - const pts = w?.points === null || w?.points === undefined ? null : Number(w.points); - const ptsLabel = pts === null || Number.isNaN(pts) ? '' : ` — ${pts} pts`; - const uid = String(w?.userId || ''); + function renderWinnerCurrent() { + if (!winnerCurrentEl) return; + + const years = Array.from(winnersByYear.keys()) + .map((k) => Number(k)) + .filter((n) => Number.isInteger(n)) + .sort((a, b) => b - a); + + if (!years.length) { + winnerCurrentEl.textContent = '—'; + return; + } + + const blocks = years.map((y) => { + const list = winnersByYear.get(String(y)) || []; + const sorted = sortWinnersForDisplay(list); + + if (!sorted.length) { + return ` +
+
${escapeHtml(String(y))}
+
(aucun gagnant)
+
+ `; + } + + const rows = sorted.map((w) => { + const name = escapeHtml(w?.name || '(utilisateur supprimé)'); + const pts = w?.points === null || w?.points === undefined ? null : Number(w.points); + const ptsLabel = pts === null || Number.isNaN(pts) ? '' : ` — ${escapeHtml(String(Math.round(pts)))} pts`; + const uid = escapeHtml(String(w?.userId || '').trim()); + return ( + `
` + + `
${name}${ptsLabel}
` + + `` + + `
` + ); + }).join(''); + + const tieLabel = sorted.length > 1 ? ' (égalité)' : ''; return ` -
-
${name}${ptsLabel}
- +
+
${escapeHtml(String(y))}${tieLabel}
+ ${rows}
`; }).join(''); - const tieLabel = sorted.length > 1 ? ' (égalité)' : ''; - winnerCurrentEl.innerHTML = ` -
${y}${tieLabel}
- ${rows} - `; + winnerCurrentEl.innerHTML = blocks; winnerCurrentEl.querySelectorAll('button[data-winner-remove-year][data-winner-remove-user]').forEach((btn) => { btn.addEventListener('click', async () => {