mustard: Aggiunti controlli per gestione in massa delle notifiche.
* web/mustard/js/notifs.js.php: Aggiunte funzioni per cancellare e marcare come lette che operano su liste di notifiche. * web/mustard/notifs.php: Quando riceve una POST con un body JSON esegue un'azione su liste di notifiche. * web/mustard/notifsh.php: Le notifiche non vengono più cancellate dal DB ma vengono marcate "deleted". * web/mustard/theme.css: Aggiunta classe "deleted".
This commit is contained in:
parent
1a66024907
commit
df9782ab1e
4 changed files with 109 additions and 19 deletions
|
@ -47,7 +47,7 @@ function markdeleted(notif) {
|
||||||
xhr.send();
|
xhr.send();
|
||||||
xhr.onload = function () {
|
xhr.onload = function () {
|
||||||
if (xhr.response['deleted']) {
|
if (xhr.response['deleted']) {
|
||||||
notif.remove();
|
notif.classList.add("deleted");
|
||||||
} else {
|
} else {
|
||||||
alert("Il server non ha potuto cancellare la notifica '" + notif.text + "'");
|
alert("Il server non ha potuto cancellare la notifica '" + notif.text + "'");
|
||||||
}
|
}
|
||||||
|
@ -57,13 +57,58 @@ function markdeleted(notif) {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
function applyAllSelected(fun) {
|
function readSelected() {
|
||||||
let notifs = document.querySelectorAll("div#notifs-list > div");
|
let selected = getSelectedNotifs()
|
||||||
notifs.forEach(function (notif) {
|
let request = {
|
||||||
let checkbox = notif.querySelector("input.seen-checkbox");
|
"act": "massread",
|
||||||
if (checkbox.checked) {
|
"ids": selected.map(div => div.id.replace(/^notif-([0-9]+)$/, '$1'))
|
||||||
fun(notif);
|
}
|
||||||
}});
|
let xhr = new XMLHttpRequest();
|
||||||
|
xhr.open('POST', 'notifs.php');
|
||||||
|
xhr.setRequestHeader('Content-type','application/json');
|
||||||
|
xhr.responseType = 'json';
|
||||||
|
xhr.send(JSON.stringify(request));
|
||||||
|
xhr.onload = function () {
|
||||||
|
if (xhr.response['done']) {
|
||||||
|
selected.forEach(notif => {
|
||||||
|
notif.classList.remove("unseen");
|
||||||
|
notif.classList.add("seen");
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
alert("Il server non ha potuto completare la richiesta:\n" + xhr.response["error"]);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
xhr.onerror = function () {
|
||||||
|
alert('La richiesta è fallita.');
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function deleteSelected() {
|
||||||
|
let selected = getSelectedNotifs()
|
||||||
|
let request = {
|
||||||
|
"act": "massdelete",
|
||||||
|
"ids": selected.map(div => div.id.replace(/^notif-([0-9]+)$/, '$1'))
|
||||||
|
}
|
||||||
|
let xhr = new XMLHttpRequest();
|
||||||
|
xhr.open('POST', 'notifs.php');
|
||||||
|
xhr.setRequestHeader('Content-type','application/json');
|
||||||
|
xhr.responseType = 'json';
|
||||||
|
xhr.send(JSON.stringify(request));
|
||||||
|
xhr.onload = function () {
|
||||||
|
if (xhr.response['done']) {
|
||||||
|
selected.forEach(notif => notif.classList.add("deleted"));
|
||||||
|
} else {
|
||||||
|
alert("Il server non ha potuto completare la richiesta:\n" + xhr.response["error"]);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
xhr.onerror = function () {
|
||||||
|
alert('La richiesta è fallita.');
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function getSelectedNotifs() {
|
||||||
|
let notifs = Array.from(document.querySelectorAll("div.notif"));
|
||||||
|
return notifs.filter(notif => notif.querySelector("input.seen-checkbox").checked)
|
||||||
}
|
}
|
||||||
|
|
||||||
lmt =<?php echo($notifs['lastmicrotime']); ?>;
|
lmt =<?php echo($notifs['lastmicrotime']); ?>;
|
||||||
|
|
|
@ -20,6 +20,51 @@ function hspech($str)
|
||||||
return (htmlspecialchars($str, ENT_QUOTES | ENT_HTML5, 'UTF-8'));
|
return (htmlspecialchars($str, ENT_QUOTES | ENT_HTML5, 'UTF-8'));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function are_valid_ids($ids)
|
||||||
|
{
|
||||||
|
if (count($ids) <= 0) return false;
|
||||||
|
foreach ($ids as $id) {
|
||||||
|
if (!(preg_match('/^[0-9]+$/', $id) === 1)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($_SERVER['REQUEST_METHOD'] === 'POST' && $_SERVER["CONTENT_TYPE"] === "application/json") {
|
||||||
|
$response = array(
|
||||||
|
"done" => true,
|
||||||
|
"error" => ""
|
||||||
|
);
|
||||||
|
$body = json_decode(file_get_contents('php://input'), true);
|
||||||
|
if (array_key_exists('act', $body) &&
|
||||||
|
array_key_exists('ids', $body) &&
|
||||||
|
are_valid_ids($body["ids"])) {
|
||||||
|
switch ($body['act']) {
|
||||||
|
case "massread":
|
||||||
|
mysqli_query($link, 'UPDATE Notifications SET Seen=1 WHERE ID in (' . implode(", ", $body["ids"]) . ')')
|
||||||
|
or muoribene(mysqli_error($link), true);
|
||||||
|
break;
|
||||||
|
case "massdelete":
|
||||||
|
mysqli_query($link, 'UPDATE Notifications SET Deleted=1 WHERE ID in (' . implode(", ", $body["ids"]) . ')')
|
||||||
|
or muoribene(mysqli_error($link), true);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
http_response_code(400);
|
||||||
|
$response["done"] = false;
|
||||||
|
$response["error"] = "Unknown act.";
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
http_response_code(400);
|
||||||
|
$response["done"] = false;
|
||||||
|
$response["error"] = "Bad request.";
|
||||||
|
}
|
||||||
|
echo(json_encode($response));
|
||||||
|
mysqli_close($link);
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
$dbg .= $dlang . '<br>' . N;
|
$dbg .= $dlang . '<br>' . N;
|
||||||
$dbg .= '<pre>' . print_r($_GET, 1) . '</pre>';
|
$dbg .= '<pre>' . print_r($_GET, 1) . '</pre>';
|
||||||
|
|
||||||
|
@ -115,20 +160,17 @@ if ($filtordon) {
|
||||||
<div id="notifs-grid">
|
<div id="notifs-grid">
|
||||||
<div id="notifs-list-controls">
|
<div id="notifs-list-controls">
|
||||||
<input id="global-selector" type="checkbox" onclick="toggleState(this)">
|
<input id="global-selector" type="checkbox" onclick="toggleState(this)">
|
||||||
<button class="control-btn" onclick="applyAllSelected(markread)"><i class="fa fa-envelope-open-o"
|
<button class="control-btn" onclick="readSelected()">
|
||||||
aria-hidden="true"></i>
|
<i class="fa fa-envelope-open-o" aria-hidden="true"></i>
|
||||||
</button>
|
</button>
|
||||||
<button class="control-btn" onclick="applyAllSelected(markdeleted)"><i class="fa fa-trash-o"
|
<button class="control-btn" onclick="deleteSelected()">
|
||||||
aria-hidden="true"></i>
|
<i class="fa fa-trash-o" aria-hidden="true"></i>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
<h1 class="control-btn">CIAONEE</h1>
|
<h1 class="control-btn">CIAONEE</h1>
|
||||||
<div id="notifs-list">
|
<div id="notifs-list">
|
||||||
<?php
|
<?php
|
||||||
if ($account['Level'] != 'guest') {
|
if ($account['Level'] != 'guest') {
|
||||||
// Questi valori sono un po' a (n|c)aso,
|
|
||||||
// dovrebbero avere senso ma non ho
|
|
||||||
// indagato troppo
|
|
||||||
$sev_classes = array(
|
$sev_classes = array(
|
||||||
1 => "sev-normal",
|
1 => "sev-normal",
|
||||||
2 => "sev-warning",
|
2 => "sev-warning",
|
||||||
|
@ -139,8 +181,7 @@ if ($filtordon) {
|
||||||
1 => "seen"
|
1 => "seen"
|
||||||
);
|
);
|
||||||
foreach ($notifs['notifs'] as $n) {
|
foreach ($notifs['notifs'] as $n) {
|
||||||
echo("<div id=\"notif-" . $n["ID"] .
|
echo("<div id=\"notif-" . $n["ID"] . "\" class=\"" . "notif " . $sev_classes[$n["Severity"]] . " " . $seen_class[$n["Seen"]] . "\">" .
|
||||||
"\" class=\"" . "notif " . $sev_classes[$n["Severity"]] . " " . $seen_class[$n["Seen"]] . "\">" .
|
|
||||||
"<input type=\"checkbox\" class=\"seen-checkbox\" onclick='notifSelect(this)'>" .
|
"<input type=\"checkbox\" class=\"seen-checkbox\" onclick='notifSelect(this)'>" .
|
||||||
"<button type='button' onclick='markread(this.parentElement)'><i class=\"fa fa-envelope-open-o\" aria-hidden=\"true\"></i></button>" .
|
"<button type='button' onclick='markread(this.parentElement)'><i class=\"fa fa-envelope-open-o\" aria-hidden=\"true\"></i></button>" .
|
||||||
"<button type='button' onclick='markdeleted(this.parentElement)'><i class=\"fa fa-trash-o\" aria-hidden=\"true\"></i></button>" .
|
"<button type='button' onclick='markdeleted(this.parentElement)'><i class=\"fa fa-trash-o\" aria-hidden=\"true\"></i></button>" .
|
||||||
|
|
|
@ -19,7 +19,7 @@ if (array_key_exists('act', $_GET) && $_GET['act'] == 'markread' && array_key_ex
|
||||||
echo('{"hmunseen":' . mysqli_num_rows($res) . '}' . N);
|
echo('{"hmunseen":' . mysqli_num_rows($res) . '}' . N);
|
||||||
} elseif (array_key_exists('act', $_GET) && $_GET['act'] == 'delete' && array_key_exists('id', $_GET) && preg_match('/^[0-9]+$/', $_GET['id']) === 1) {
|
} elseif (array_key_exists('act', $_GET) && $_GET['act'] == 'delete' && array_key_exists('id', $_GET) && preg_match('/^[0-9]+$/', $_GET['id']) === 1) {
|
||||||
$_GET['id'] += 0;
|
$_GET['id'] += 0;
|
||||||
mysqli_query($link, 'DELETE FROM Notifications WHERE ID=' . $_GET['id'])
|
mysqli_query($link, 'UPDATE Notifications SET Deleted=1 WHERE ID=' . $_GET['id'])
|
||||||
or muoribene(mysqli_error($link), true);
|
or muoribene(mysqli_error($link), true);
|
||||||
echo('{"deleted":' . true . '}' . N);
|
echo('{"deleted":' . true . '}' . N);
|
||||||
} elseif (array_key_exists('act', $_GET) && $_GET['act'] == 'loadchunk' && array_key_exists('chunk', $_GET) && preg_match('/^[0-9]+$/', $_GET['chunk']) === 1) {
|
} elseif (array_key_exists('act', $_GET) && $_GET['act'] == 'loadchunk' && array_key_exists('chunk', $_GET) && preg_match('/^[0-9]+$/', $_GET['chunk']) === 1) {
|
||||||
|
|
|
@ -872,6 +872,10 @@ div.notif button {
|
||||||
float: right;
|
float: right;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
div.deleted {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
div.sev-warning {
|
div.sev-warning {
|
||||||
background-color: #FFEEAA;
|
background-color: #FFEEAA;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue