/** * 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'); var dir = th.getAttribute('data-dir') === 'asc' ? 'desc' : '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 na = parseFloat(va), nb = parseFloat(vb); var cmp; if (!isNaN(na) && !isNaN(nb) && va !== '' && vb !== '') { cmp = na - nb; } else { cmp = va < vb ? -1 : (va > vb ? 1 : 0); } return dir === 'asc' ? cmp : -cmp; }); rows.forEach(function (r) { tbody.appendChild(r); }); }); }); }); })();