- /forecast : une ligne par jalon, tous projets, triée par risque (écart décroissant), filtrable, ancres ms-<owner>-<repo> pointées par le bloc jalon des cartes du dashboard ; débit par projet conservé en tableau compact. - /health : tableau trié par sévérité (pastille, zombies, goulot) ; page détail : sélecteur de projet (health.js). - Tri des tableaux mutualisé dans static/js/tablesort.js (dashboard, forecast, health).
39 lines
1.7 KiB
JavaScript
39 lines
1.7 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');
|
|
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); });
|
|
});
|
|
});
|
|
});
|
|
})();
|