/** * 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- ; cliquer un * 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); }); }); }); }); })();