(function(){ var search = document.getElementById('log-search'); var typeChecks = document.querySelectorAll('.type-filter'); var pnContainer = document.getElementById('filter-process-names'); var dateFrom = document.getElementById('filter-date-from'); var dateTo = document.getElementById('filter-date-to'); var filterBtn = document.getElementById('filter-date-btn'); var STORAGE_KEY = 'logs_pn_filter'; var STORAGE_KEY_DATE = 'logs_date_filter'; var STORAGE_KEY_ACTIVE = 'logs_date_active'; function toIsoDate(d) { return d.toISOString().slice(0, 10); } // ── Restore / default date range ────────────────────────────────────────── function loadSavedDates() { try { return JSON.parse(sessionStorage.getItem(STORAGE_KEY_DATE) || 'null'); } catch(e) { return null; } } function saveDates() { try { sessionStorage.setItem(STORAGE_KEY_DATE, JSON.stringify({ from: dateFrom ? dateFrom.value : '', to: dateTo ? dateTo.value : '', })); sessionStorage.setItem(STORAGE_KEY_ACTIVE, '1'); } catch(e) {} } var dateActive = (function() { try { return sessionStorage.getItem(STORAGE_KEY_ACTIVE) === '1'; } catch(e) { return false; } })(); var savedDates = loadSavedDates(); if (savedDates) { if (dateFrom) dateFrom.value = savedDates.from || ''; if (dateTo) dateTo.value = savedDates.to || ''; } else { var today = new Date(); var twoWeeksAgo = new Date(today); twoWeeksAgo.setDate(today.getDate() - 14); if (dateFrom) dateFrom.value = toIsoDate(twoWeeksAgo); if (dateTo) dateTo.value = toIsoDate(today); } // ── Process-name checkboxes (built from table rows) ─────────────────────── var names = []; document.querySelectorAll('tbody tr[data-process-name]').forEach(function(tr) { var n = tr.getAttribute('data-process-name'); if (n && names.indexOf(n) === -1) names.push(n); }); names.sort(); function loadSaved() { try { return JSON.parse(sessionStorage.getItem(STORAGE_KEY) || '{}'); } catch(e) { return {}; } } function saveState() { var state = {}; Object.keys(pnChecks).forEach(function(n){ state[n] = pnChecks[n].checked; }); try { sessionStorage.setItem(STORAGE_KEY, JSON.stringify(state)); } catch(e) {} } var pnChecks = {}; var saved = loadSaved(); if (pnContainer) { names.forEach(function(name) { var lbl = document.createElement('label'); var chk = document.createElement('input'); chk.type = 'checkbox'; chk.checked = (saved[name] !== undefined) ? saved[name] : true; chk.addEventListener('change', function(){ saveState(); applyFilter(); }); pnChecks[name] = chk; lbl.appendChild(chk); lbl.appendChild(document.createTextNode(' ' + name)); pnContainer.appendChild(lbl); }); } // ── Table row filter (type + search + date + process_name) ──────────────── function applyFilter() { var q = search ? search.value.toLowerCase() : ''; var from = dateActive && dateFrom ? dateFrom.value : ''; var to = dateActive && dateTo ? dateTo.value : ''; var active = {}; typeChecks.forEach(function(c){ if (c.checked) active[c.value] = 1; }); document.querySelectorAll('tbody tr').forEach(function(tr) { var type = tr.dataset.type || ''; var pn = tr.getAttribute('data-process-name') || ''; var text = tr.textContent.toLowerCase(); var date = tr.getAttribute('data-date') || ''; var dateOk = (!from || date >= from) && (!to || date <= to); var pnOk = pnChecks[pn] ? pnChecks[pn].checked : true; tr.style.display = (active[type] && pnOk && text.indexOf(q) >= 0 && dateOk) ? '' : 'none'; }); } // ── Filter button — saves dates then applies filter ─────────────────────── if (filterBtn) { filterBtn.addEventListener('click', function() { dateActive = true; saveDates(); applyFilter(); }); } if (search) search.addEventListener('input', applyFilter); typeChecks.forEach(function(c){ c.addEventListener('change', applyFilter); }); // Initial apply applyFilter(); })();