From 6fafcf508c22ab6731d3bc035f6153f5640533d2 Mon Sep 17 00:00:00 2001 From: paul Date: Tue, 19 May 2020 20:01:34 +0200 Subject: [PATCH] mustard: notifs: Aggiunto filtro per la lista delle notifiche. * web/mustard/notifs.php: Aggiunta la plancia e il popup da instances.php e funzioni JS per manipolare e filtrare la lista delle notifiche. --- web/mustard/notifs.php | 156 ++++++++++++++++++++++++++++++++++++++--- 1 file changed, 148 insertions(+), 8 deletions(-) diff --git a/web/mustard/notifs.php b/web/mustard/notifs.php index 3152e8a..08787c4 100644 --- a/web/mustard/notifs.php +++ b/web/mustard/notifs.php @@ -86,7 +86,6 @@ if ($filtordon) { $filtordimgon = 'imgs/cerca_on.svg'; } ?> - @@ -125,10 +124,8 @@ if ($filtordon) { function setBtnsVisibility(state) { let controls = document.querySelector("#notifs-list-controls"); - let btns = Array(controls.querySelector("#read-btn"), controls.querySelector("#delete-btn")); - btns.forEach(function (btn) { - btn.style.visibility = state; - }); + controls.querySelector("#read-btn").style.visibility = state; + controls.querySelector("#delete-btn").style.visibility = state; } function toggleState(check) { @@ -152,6 +149,126 @@ if ($filtordon) { } } + function showFilterPanel() { + let plancia = document.querySelector("#plancia"); + if (plancia.style.display !== "block") { + if (plancia.childElementCount <= 3) { + addAfter(plancia.firstElementChild); + } + plancia.style.display = "block"; + } + } + + function getFilters() { + return Array.from(document.querySelectorAll("#plancia .notifs-criterion")); + } + + function newFilter() { + return "
" + + " " + + " " + + " " + + " " + + " " + + " " + + " " + + " " + + "
"; + } + + function addAfter(elem) { + let filters = getFilters(); + if (filters.length < 7) { + elem.insertAdjacentHTML('afterend', newFilter()); + filters = getFilters(); + if (filters.length > 1) { + let select = elem.querySelector("#operation"); + if (select.disabled) { + select.disabled = false; + } + } + filters[filters.length - 1].querySelector("#operation").disabled = true; + } + } + + function removeFilter(elem) { + let filters = getFilters(); + if (filters.length > 1) { + elem.remove(); + filters = getFilters(); + filters[filters.length - 1].querySelector("#operation").disabled = true; + } + } + + function clearFilters() { + let filtered = document.querySelectorAll(".filtered"); + filtered.forEach(f => f.classList.remove("filtered")) + getFilters().forEach(f => f.remove()); + document.querySelector("#plancia").style.display = "none"; + } + + function makeDateFilter(criterion) { + let start = criterion.querySelector("#start-date").value; + let stop = criterion.querySelector("#stop-date").value; + start = (start === '') ? new Date(0) : new Date(start); + stop = (stop === '') ? new Date() : new Date(stop); + return date => (date <= stop) && (date >= start); + } + + function makeSeverityFilter(criterion) { + let select = criterion.querySelector("#severity"); + let severity = select.options[select.selectedIndex].value; + if (severity === "-1") { + return x => true; + } + return x => x === severity; + } + + function makeFilterFunction(criterion) { + let dateFilter = makeDateFilter(criterion); + let severityFilter = makeSeverityFilter(criterion); + return notif => { + let microtime = new Date(parseFloat(notif.dataset.microtime) * 1000); + let severity = notif.dataset.severity; + return dateFilter(microtime) && severityFilter(severity); + } + } + + function applyFilters() { + let filters = getFilters(); + let notifs = getAliveNotifs(); + let filterFunctions = filters.map(makeFilterFunction); + let fun = x => filterFunctions[0](x); + + for (let i = 0; i < filters.length - 1; i++) { + // Questo hack serve per evitare che la chiamata + // al filtro sia interpretata come ricorsione. + let filter = fun; + if (filters[i].querySelector("#operation").value === "0") { + fun = x => (filter(x) && filterFunctions[i + 1](x)); + } else { + fun = x => (filter(x) || filterFunctions[i + 1](x)); + } + } + + notifs.forEach(notif => { + if (!fun(notif)) { + notif.classList.add("filtered"); + } + }); + document.querySelector("#plancia").style.display = "none"; + } + // --> @@ -167,6 +284,8 @@ if ($filtordon) {
Notifiche
+ ' . N); ?>
@@ -193,7 +312,9 @@ if ($filtordon) { 1 => "deleted" ); foreach ($notifs['notifs'] as $n) { - echo("
" . + echo("
" . "" . "" . "" . @@ -203,6 +324,14 @@ if ($filtordon) { } ?>
+ +
+ +
+ +
+ +
+