From 71e705ea64a9dc0cabc03f838dc63660b2f19aa0 Mon Sep 17 00:00:00 2001 From: Spark Date: Mon, 12 Oct 2026 14:54:24 -0400 Subject: [PATCH] =?UTF-8?q?fix(dashboard):=20tri=20par=20date=20des=20tabl?= =?UTF-8?q?eaux,=20tri/regroupement=20sur=20les=20=C3=89pingl=C3=A9s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - tablesort.js : parseFloat lisait l'année des dates ISO (2026) et mettait toutes les lignes à égalité — comparaison numérique seulement pour les valeurs entièrement numériques. - dashboard.js : pinned-grid rejoint les grilles triées et regroupées (son exclusion rendait les deux outils invisibles là où l'œil se pose) ; dates comparées via Date.parse. - data-first-dir=desc sur Dernière activité / Écart / Zombies. --- app/templates/dashboard.html | 2 +- app/templates/forecast.html | 2 +- app/templates/health.html | 2 +- static/js/dashboard.js | 16 +++++++++++++++- static/js/tablesort.js | 18 ++++++++++++++---- 5 files changed, 32 insertions(+), 8 deletions(-) diff --git a/app/templates/dashboard.html b/app/templates/dashboard.html index e1465bd..6f68984 100644 --- a/app/templates/dashboard.html +++ b/app/templates/dashboard.html @@ -197,7 +197,7 @@ En vol Prochain jalon Santé - Dernière activité + Dernière activité diff --git a/app/templates/forecast.html b/app/templates/forecast.html index 7712309..8bb3acd 100644 --- a/app/templates/forecast.html +++ b/app/templates/forecast.html @@ -33,7 +33,7 @@ Échéance Progression ETA - Écart + Écart Débit / sem. diff --git a/app/templates/health.html b/app/templates/health.html index 84cbb49..b4fc2e5 100644 --- a/app/templates/health.html +++ b/app/templates/health.html @@ -23,7 +23,7 @@ Santé Projet Ouvertes - 🧟 Zombies + 🧟 Zombies 🐌 Goulot diff --git a/static/js/dashboard.js b/static/js/dashboard.js index 9a0d1c1..377cb2d 100644 --- a/static/js/dashboard.js +++ b/static/js/dashboard.js @@ -21,7 +21,11 @@ /* ── Tri des grilles de cartes ─────────────────────────── */ var sortSelect = document.getElementById('dash-sort'); - var grids = ['grid-active', 'grid-inactive', 'grid-archived'] + // 0.20.1 : la grille des Épinglés est incluse — l'exclure + // (choix de la 0.18.0) donnait l'impression que le tri et le + // regroupement « ne faisaient rien », la section épinglée + // étant celle qu'on regarde en premier. + var grids = ['pinned-grid', 'grid-active', 'grid-inactive', 'grid-archived'] .map(function (id) { return document.getElementById(id); }) .filter(Boolean); @@ -38,6 +42,16 @@ if (mode === 'default' || !cards.length) return; cards.sort(function (a, b) { var ka = cardKey(a, mode), kb = cardKey(b, mode); + if (mode === 'updated' || mode === 'activity') { + // Comparaison en instants réels (les fuseaux des + // dates Gitea varient, -04:00/-05:00) ; une carte + // sans date coule en bas du tri décroissant. + var ta = Date.parse(ka), tb = Date.parse(kb); + if (isNaN(ta) && isNaN(tb)) return 0; + if (isNaN(ta)) return 1; + if (isNaN(tb)) return -1; + return tb - ta; + } if (ka < kb) return mode === 'name' ? -1 : 1; if (ka > kb) return mode === 'name' ? 1 : -1; return 0; diff --git a/static/js/tablesort.js b/static/js/tablesort.js index bfeb649..c4425c8 100644 --- a/static/js/tablesort.js +++ b/static/js/tablesort.js @@ -13,7 +13,12 @@ th.classList.add('sortable'); th.addEventListener('click', function () { var key = th.getAttribute('data-sort'); - var dir = th.getAttribute('data-dir') === 'asc' ? 'desc' : 'asc'; + // Premier clic : sens par défaut de la colonne + // (data-first-dir="desc" pour les dates d'activité — + // on veut le plus récent d'abord) ; ensuite on alterne. + var dir = th.getAttribute('data-dir') + ? (th.getAttribute('data-dir') === 'asc' ? 'desc' : 'asc') + : (th.getAttribute('data-first-dir') || 'asc'); table.querySelectorAll('th').forEach(function (h) { h.removeAttribute('data-dir'); }); @@ -22,10 +27,15 @@ rows.sort(function (a, b) { var va = a.getAttribute('data-' + key) || ''; var vb = b.getAttribute('data-' + key) || ''; - var na = parseFloat(va), nb = parseFloat(vb); var cmp; - if (!isNaN(na) && !isNaN(nb) && va !== '' && vb !== '') { - cmp = na - nb; + // Numérique SEULEMENT si la valeur entière est + // un nombre. L'ancien parseFloat lisait « 2026 » + // dans les dates ISO : toutes les lignes d'une + // même année se retrouvaient à égalité et le tri + // par date partait dans un ordre arbitraire + // (bug rapporté par Bruno, corrigé en 0.20.1). + if (/^-?\d+(\.\d+)?$/.test(va) && /^-?\d+(\.\d+)?$/.test(vb)) { + cmp = parseFloat(va) - parseFloat(vb); } else { cmp = va < vb ? -1 : (va > vb ? 1 : 0); }