Files
TDI-Dashboard/static/js/iscrizioni.js
T
2026-05-12 18:27:01 +02:00

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;
});
});
})();