From 19e5f1d522431dd7228c89e81bcc6e62529e06f6 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Sun, 21 Dec 2025 19:16:13 +0000 Subject: [PATCH] Refactor: Use select for active year and clean year data Co-authored-by: mathieumoran1 --- public/control.html | 4 +-- public/js/app_control.js | 53 ++++++++++++++++++++++++++++++++++------ 2 files changed, 48 insertions(+), 9 deletions(-) diff --git a/public/control.html b/public/control.html index 96fb469..cb0ee31 100644 --- a/public/control.html +++ b/public/control.html @@ -93,8 +93,8 @@

- -
Ex: mets 2025 → tout le monde voit les stats/films 2025.
+ +
La liste est basée sur les années présentes dans les films.
diff --git a/public/js/app_control.js b/public/js/app_control.js index 71a7b26..62722d4 100644 --- a/public/js/app_control.js +++ b/public/js/app_control.js @@ -542,6 +542,10 @@ window.onload = async function () { try { const yearsRes = await fetch('/api/movies/years'); const years = yearsRes.ok ? await yearsRes.json() : []; + const cleanedYears = (Array.isArray(years) ? years : []) + .map((y) => Number(y)) + .filter((y) => Number.isInteger(y) && y >= 1900 && y <= 3000) + .sort((a, b) => b - a); // Rebuild manage dropdown from scratch (so removed years disappear) const previousSelection = manageYearSelect.value; @@ -551,19 +555,19 @@ window.onload = async function () { allOpt.textContent = 'Toutes'; manageYearSelect.appendChild(allOpt); - years.forEach((y) => { + cleanedYears.forEach((y) => { const opt = document.createElement('option'); opt.value = String(y); opt.textContent = String(y); manageYearSelect.appendChild(opt); }); - const stillExists = years.map(String).includes(previousSelection); + const stillExists = cleanedYears.map(String).includes(previousSelection); manageYearSelect.value = stillExists ? previousSelection : ''; // Prefer defaulting UI to active year (if selection is empty/invalid). const hasSelection = !!manageYearSelect.value; - if (!hasSelection && activeYear && years.map(String).includes(String(activeYear))) { + if (!hasSelection && activeYear && cleanedYears.map(String).includes(String(activeYear))) { manageYearSelect.value = String(activeYear); } @@ -571,8 +575,44 @@ window.onload = async function () { if (!yearInput.value) { if (activeYear) { yearInput.value = String(activeYear); - } else if (years.length > 0) { - yearInput.value = String(years[0]); + } else if (cleanedYears.length > 0) { + yearInput.value = String(cleanedYears[0]); + } + } + + // Rebuild active-year dropdown from distinct movie years + if (activeYearInput && saveActiveYearBtn) { + const previousActiveSelection = String(activeYearInput.value || ''); + activeYearInput.innerHTML = ''; + + if (cleanedYears.length === 0) { + const opt = document.createElement('option'); + opt.value = ''; + opt.textContent = 'Aucune année (ajoute un film)'; + opt.disabled = true; + opt.selected = true; + activeYearInput.appendChild(opt); + activeYearInput.disabled = true; + saveActiveYearBtn.disabled = true; + } else { + cleanedYears.forEach((y) => { + const opt = document.createElement('option'); + opt.value = String(y); + opt.textContent = String(y); + activeYearInput.appendChild(opt); + }); + + // Keep current selection if still valid, else use activeYear, else latest. + const desired = + (previousActiveSelection && cleanedYears.map(String).includes(previousActiveSelection)) + ? previousActiveSelection + : (activeYear && cleanedYears.map(String).includes(String(activeYear))) + ? String(activeYear) + : String(cleanedYears[0]); + + activeYearInput.disabled = false; + saveActiveYearBtn.disabled = false; + activeYearInput.value = desired; } } } catch (_) { @@ -860,8 +900,7 @@ window.onload = async function () { // Initial load activeYear = await fetchActiveYear(); - if (activeYearInput && activeYear) { - activeYearInput.value = String(activeYear); + if (activeYear) { document.title = `Pool Oscars ${activeYear} - Admin`; } -- 2.54.0