diff --git a/app/templates/patching_import.html b/app/templates/patching_import.html
index 81a2363..dff1e81 100644
--- a/app/templates/patching_import.html
+++ b/app/templates/patching_import.html
@@ -108,8 +108,9 @@
{# Filtres client-side #}
-
-
+
@@ -133,7 +134,9 @@
|
- Asset |
+
+ Asset ↕
+ |
Env |
Domaine |
OS |
@@ -172,13 +175,15 @@
const selCount = document.getElementById('selection-count');
const btnPre = document.getElementById('btn-prepatch');
const btnPatch = document.getElementById('btn-patch');
- const fAsset = document.getElementById('filter-asset');
const fInter = document.getElementById('filter-intervenant');
const fEnv = document.getElementById('filter-env');
const fReset = document.getElementById('filter-reset');
const fCount = document.getElementById('filter-count');
+ const thAsset = document.getElementById('th-asset');
+ const thAssetArrow = document.getElementById('th-asset-arrow');
let currentRows = [];
+ let sortAsset = 0; // 0 = ordre fichier, 1 = asc, -1 = desc
function escapeHTML(s){
if (s === null || s === undefined) return '';
@@ -199,17 +204,13 @@
}
function applyFilters(){
- const fa = (fAsset.value || '').toLowerCase().trim();
- const fi = (fInter.value || '').toLowerCase().trim();
+ const fi = (fInter.value || '').trim();
const fe = (fEnv.value || '').trim();
let visibleCount = 0;
tbody.querySelectorAll('tr').forEach(tr => {
- const a = (tr.dataset.asset || '').toLowerCase();
- const i = (tr.dataset.intervenant || '').toLowerCase();
+ const i = tr.dataset.intervenant || '';
const e = tr.dataset.env || '';
- const ok = (!fa || a.includes(fa))
- && (!fi || i.includes(fi))
- && (!fe || e === fe);
+ const ok = (!fi || i === fi) && (!fe || e === fe);
if (ok) { tr.classList.remove('row-hidden'); tr.style.display=''; visibleCount++; }
else { tr.classList.add('row-hidden'); tr.style.display='none'; }
});
@@ -217,11 +218,16 @@
refreshSelection();
}
- function rebuildEnvOptions(rows){
- const envs = Array.from(new Set(rows.map(r => r.environnement).filter(x => x))).sort();
- const cur = fEnv.value;
- fEnv.innerHTML = ''
- + envs.map(e => '').join('');
+ function rebuildSelectOptions(sel, values, placeholder){
+ const cur = sel.value;
+ const opts = Array.from(new Set(values.filter(x => x))).sort((a,b) => a.localeCompare(b, 'fr', {sensitivity:'base'}));
+ sel.innerHTML = ''
+ + opts.map(v => '').join('');
+ }
+
+ function updateSortArrow(){
+ thAssetArrow.textContent = sortAsset === 1 ? '▲' : (sortAsset === -1 ? '▼' : '↕');
+ thAssetArrow.classList.toggle('opacity-50', sortAsset === 0);
}
async function loadSheet(name){
@@ -237,8 +243,25 @@
empty.style.display='none'; wrap.style.display='';
summary.textContent = j.count + ' lignes';
currentRows = j.rows;
- rebuildEnvOptions(currentRows);
- tbody.innerHTML = j.rows.map(r => {
+ rebuildSelectOptions(fInter, currentRows.map(r => r.intervenant), '— Tous intervenants —');
+ rebuildSelectOptions(fEnv, currentRows.map(r => r.environnement), '— Tous environnements —');
+ sortAsset = 0;
+ updateSortArrow();
+ renderTable();
+ }
+
+ function renderTable(){
+ let rows = currentRows.slice();
+ if (sortAsset !== 0) {
+ rows.sort((a, b) => {
+ const av = (a.asset_name || '').toLowerCase();
+ const bv = (b.asset_name || '').toLowerCase();
+ if (av < bv) return -sortAsset;
+ if (av > bv) return sortAsset;
+ return 0;
+ });
+ }
+ tbody.innerHTML = rows.map(r => {
const linkSrv = r.server_id
? '' + escapeHTML(r.resolved_hostname || r.asset_name) + ''
: '' + escapeHTML(r.asset_name || '') + ' ⚠';
@@ -280,11 +303,17 @@
selAll.addEventListener('change', () => toggleAll(selAll.checked));
selAllHead.addEventListener('change', () => toggleAll(selAllHead.checked));
- [fAsset, fInter, fEnv].forEach(el => el.addEventListener('input', applyFilters));
- fEnv.addEventListener('change', applyFilters);
+ [fInter, fEnv].forEach(el => el.addEventListener('change', applyFilters));
fReset.addEventListener('click', () => {
- fAsset.value = ''; fInter.value = ''; fEnv.value = '';
- applyFilters();
+ fInter.value = ''; fEnv.value = '';
+ sortAsset = 0;
+ updateSortArrow();
+ renderTable();
+ });
+ thAsset.addEventListener('click', () => {
+ sortAsset = sortAsset === 1 ? -1 : (sortAsset === -1 ? 0 : 1);
+ updateSortArrow();
+ renderTable();
});
btnPre.addEventListener('click', () => {