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);
}