209 lines
7.3 KiB
JavaScript
209 lines
7.3 KiB
JavaScript
(function () {
|
|
|
|
var COLS = ['sorgente', 'azienda', 'sessione', 'corso', 'data',
|
|
'ftp', 'bc', 'iscrizione', 'odv', 'sharepoint', 'report', 'email'];
|
|
var STEP_COLS = ['ftp', 'bc', 'iscrizione', 'odv', 'sharepoint', 'report', 'email'];
|
|
var BADGE_CLS = { done: 'ok', processing: 'proc', pending: 'warn', error: 'err', skipped: 'info' };
|
|
|
|
// Sorgente top-level checkboxes
|
|
var sorgSet = [];
|
|
var seenSorg = {};
|
|
document.querySelectorAll('tbody tr[data-sorgente]').forEach(function (tr) {
|
|
var v = tr.getAttribute('data-sorgente');
|
|
if (v && !seenSorg[v]) { seenSorg[v] = true; sorgSet.push(v); }
|
|
});
|
|
|
|
var sorgWrap = document.getElementById('filter-sorgente');
|
|
sorgSet.forEach(function (s) {
|
|
var chk = document.createElement('input');
|
|
chk.type = 'checkbox';
|
|
chk.setAttribute('data-sorgente', s);
|
|
chk.checked = true;
|
|
var lbl = document.createElement('label');
|
|
lbl.append(chk, ' ' + s);
|
|
sorgWrap.appendChild(lbl);
|
|
});
|
|
if (!sorgSet.length) {
|
|
var w = document.getElementById('filter-sorgente-wrap');
|
|
if (w) w.style.display = 'none';
|
|
}
|
|
|
|
// Reset button in .isc-header
|
|
var resetBtn = document.createElement('button');
|
|
resetBtn.className = 'btn-reset-cf';
|
|
resetBtn.innerHTML = '✕ Reset filtri e ordine';
|
|
var iscHeader = document.querySelector('.isc-header');
|
|
if (iscHeader) iscHeader.insertBefore(resetBtn, document.getElementById('btn-toggle-filters') || null);
|
|
|
|
var tbody = document.querySelector('tbody');
|
|
var origOrder = tbody ? [].slice.call(tbody.querySelectorAll('tr')) : [];
|
|
|
|
// Default sort indicator: id DESC (matches SQL ORDER BY)
|
|
var hashTh = document.querySelector('thead th:first-child');
|
|
if (hashTh) hashTh.classList.add('sort-desc');
|
|
|
|
// Build unique value lists and initial state
|
|
var colUniq = {};
|
|
var colState = {};
|
|
var colPanels = {};
|
|
|
|
COLS.forEach(function (col) {
|
|
var seen = {}, vals = [];
|
|
document.querySelectorAll('tbody tr').forEach(function (tr) {
|
|
var v = tr.getAttribute('data-' + col);
|
|
if (v !== null && !seen[v]) { seen[v] = true; vals.push(v); }
|
|
});
|
|
colUniq[col] = vals.sort();
|
|
colState[col] = null;
|
|
});
|
|
|
|
// Build a filter panel per ⚙ button
|
|
document.querySelectorAll('.col-filter-btn').forEach(function (btn) {
|
|
var col = btn.getAttribute('data-col');
|
|
var isStep = STEP_COLS.indexOf(col) !== -1;
|
|
|
|
var panel = document.createElement('div');
|
|
panel.className = 'col-filter-panel';
|
|
|
|
var allChk = document.createElement('input');
|
|
allChk.type = 'checkbox';
|
|
allChk.checked = true;
|
|
var allLbl = document.createElement('label');
|
|
allLbl.className = 'cfp-all';
|
|
allLbl.append(allChk, ' (Tutti)');
|
|
panel.appendChild(allLbl);
|
|
|
|
var sep = document.createElement('div');
|
|
sep.className = 'cfp-sep';
|
|
panel.appendChild(sep);
|
|
|
|
colUniq[col].forEach(function (v) {
|
|
var chk = document.createElement('input');
|
|
chk.type = 'checkbox';
|
|
chk.checked = true;
|
|
chk.setAttribute('data-cfval', v);
|
|
var lbl = document.createElement('label');
|
|
lbl.appendChild(chk);
|
|
if (isStep && BADGE_CLS[v]) {
|
|
var bdg = document.createElement('span');
|
|
bdg.className = 'badge ' + BADGE_CLS[v];
|
|
bdg.textContent = v || '(vuoto)';
|
|
lbl.appendChild(bdg);
|
|
} else {
|
|
lbl.appendChild(document.createTextNode(' ' + (v || '(vuoto)')));
|
|
}
|
|
panel.appendChild(lbl);
|
|
});
|
|
|
|
document.body.appendChild(panel);
|
|
colPanels[col] = { panel: panel, allChk: allChk, btn: btn };
|
|
|
|
allChk.addEventListener('change', function () {
|
|
panel.querySelectorAll('input[data-cfval]').forEach(function (c) { c.checked = allChk.checked; });
|
|
syncColState(col);
|
|
applyFilter();
|
|
});
|
|
|
|
panel.addEventListener('change', function (e) {
|
|
if (!e.target.hasAttribute('data-cfval')) return;
|
|
var allOn = true;
|
|
panel.querySelectorAll('input[data-cfval]').forEach(function (c) { if (!c.checked) allOn = false; });
|
|
allChk.checked = allOn;
|
|
syncColState(col);
|
|
applyFilter();
|
|
});
|
|
|
|
btn.addEventListener('click', function (e) {
|
|
e.stopPropagation();
|
|
var wasOpen = panel.classList.contains('open');
|
|
closeAllPanels();
|
|
if (!wasOpen) {
|
|
var rect = btn.getBoundingClientRect();
|
|
panel.style.left = rect.left + 'px';
|
|
panel.style.top = (rect.bottom + 4) + 'px';
|
|
panel.classList.add('open');
|
|
var ph = panel.offsetHeight;
|
|
if (rect.bottom + 4 + ph > window.innerHeight) {
|
|
panel.style.top = (rect.top - ph - 4) + 'px';
|
|
}
|
|
}
|
|
});
|
|
|
|
panel.addEventListener('click', function (e) { e.stopPropagation(); });
|
|
});
|
|
|
|
function syncColState(col) {
|
|
var p = colPanels[col];
|
|
if (!p) return;
|
|
var checked = [];
|
|
p.panel.querySelectorAll('input[data-cfval]').forEach(function (c) {
|
|
if (c.checked) checked.push(c.getAttribute('data-cfval'));
|
|
});
|
|
var allOn = checked.length === (colUniq[col] || []).length;
|
|
colState[col] = allOn ? null : checked;
|
|
p.btn.classList.toggle('active', !allOn);
|
|
}
|
|
|
|
function closeAllPanels() {
|
|
document.querySelectorAll('.col-filter-panel.open').forEach(function (p) {
|
|
p.classList.remove('open');
|
|
});
|
|
}
|
|
|
|
document.addEventListener('click', closeAllPanels);
|
|
window.addEventListener('scroll', closeAllPanels, true);
|
|
|
|
resetBtn.addEventListener('click', function () {
|
|
COLS.forEach(function (col) {
|
|
var p = colPanels[col];
|
|
if (!p) return;
|
|
p.allChk.checked = true;
|
|
p.panel.querySelectorAll('input[data-cfval]').forEach(function (c) { c.checked = true; });
|
|
syncColState(col);
|
|
});
|
|
if (tbody) origOrder.forEach(function (r) { tbody.appendChild(r); });
|
|
document.querySelectorAll('thead th').forEach(function (th) { th.classList.remove('sort-asc', 'sort-desc'); });
|
|
if (hashTh) hashTh.classList.add('sort-desc');
|
|
applyFilter();
|
|
});
|
|
|
|
function applyFilter() {
|
|
var search = (document.getElementById('isc-search').value || '').trim().toLowerCase();
|
|
|
|
var checkedSorgs = null;
|
|
if (sorgSet.length) {
|
|
checkedSorgs = new Set();
|
|
document.querySelectorAll('#filter-sorgente input[type="checkbox"]').forEach(function (chk) {
|
|
if (chk.checked) checkedSorgs.add(chk.getAttribute('data-sorgente'));
|
|
});
|
|
}
|
|
|
|
document.querySelectorAll('tbody tr[data-status]').forEach(function (tr) {
|
|
var sorg = tr.getAttribute('data-sorgente') || '';
|
|
var show = checkedSorgs === null || !sorg || checkedSorgs.has(sorg);
|
|
if (show && search) show = tr.textContent.toLowerCase().indexOf(search) !== -1;
|
|
for (var i = 0; show && i < COLS.length; i++) {
|
|
var state = colState[COLS[i]];
|
|
if (state && state.indexOf(tr.getAttribute('data-' + COLS[i]) || '') === -1) show = false;
|
|
}
|
|
tr.style.display = show ? '' : 'none';
|
|
});
|
|
}
|
|
|
|
document.getElementById('isc-search').addEventListener('input', applyFilter);
|
|
if (sorgWrap) sorgWrap.addEventListener('change', applyFilter);
|
|
|
|
// Corso expand buttons
|
|
document.querySelectorAll('.btn-expand').forEach(function (btn) {
|
|
btn.addEventListener('click', function (e) {
|
|
e.stopPropagation();
|
|
var short = btn.closest('.txt-short');
|
|
var full = short ? short.nextElementSibling : null;
|
|
if (!full) return;
|
|
short.hidden = true;
|
|
full.hidden = false;
|
|
});
|
|
});
|
|
|
|
})();
|