- 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.
49 lines
2.4 KiB
JavaScript
49 lines
2.4 KiB
JavaScript
/**
|
|
* Kanbante — tri des tableaux « pilotage » (.proj-table), partagé
|
|
* entre le dashboard, /forecast et /health (0.19.0).
|
|
* Tri client par colonne : les lignes portent leurs valeurs dans
|
|
* des attributs data-<clé> ; cliquer un <th data-sort="clé">
|
|
* trie dans un sens puis dans l'autre.
|
|
*/
|
|
(function () {
|
|
document.querySelectorAll('.proj-table').forEach(function (table) {
|
|
var tbody = table.querySelector('tbody');
|
|
if (!tbody) return;
|
|
table.querySelectorAll('th[data-sort]').forEach(function (th) {
|
|
th.classList.add('sortable');
|
|
th.addEventListener('click', function () {
|
|
var key = th.getAttribute('data-sort');
|
|
// 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');
|
|
});
|
|
th.setAttribute('data-dir', dir);
|
|
var rows = Array.prototype.slice.call(tbody.querySelectorAll('tr'));
|
|
rows.sort(function (a, b) {
|
|
var va = a.getAttribute('data-' + key) || '';
|
|
var vb = b.getAttribute('data-' + key) || '';
|
|
var cmp;
|
|
// 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);
|
|
}
|
|
return dir === 'asc' ? cmp : -cmp;
|
|
});
|
|
rows.forEach(function (r) { tbody.appendChild(r); });
|
|
});
|
|
});
|
|
});
|
|
})();
|