From 84d53985ee589426578131d39c37624c092cbb5f Mon Sep 17 00:00:00 2001 From: yubiuser Date: Fri, 1 Oct 2021 19:18:23 +0200 Subject: [PATCH 1/2] Add delete button to network table Signed-off-by: yubiuser Fix styling Signed-off-by: yubiuser Fix xo Signed-off-by: yubiuser Use data.id Signed-off-by: yubiuser Sort by last seen Signed-off-by: yubiuser Use data.id instead of data.ip Signed-off-by: yubiuser --- network.php | 4 ++++ scripts/pi-hole/js/network.js | 23 +++++++++++++++++++++-- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/network.php b/network.php index 1a21cc87..4dc66cce 100644 --- a/network.php +++ b/network.php @@ -25,6 +25,7 @@ + @@ -33,10 +34,12 @@ + + @@ -45,6 +48,7 @@ +
ID IP address Hardware address InterfaceLast Query Number of queries Uses Pi-holeAction
ID IP address Hardware address InterfaceLast Query Number of queries Uses Pi-holeAction
diff --git a/scripts/pi-hole/js/network.js b/scripts/pi-hole/js/network.js index 53c6bdac..03f38cc3 100644 --- a/scripts/pi-hole/js/network.js +++ b/scripts/pi-hole/js/network.js @@ -59,6 +59,8 @@ function parseColor(input) { } } +function deleteNetworkEntry() {} + $(function () { tableApi = $("#network-entries").DataTable({ rowCallback: function (row, data) { @@ -170,6 +172,16 @@ $(function () { if (data.hwaddr.startsWith("ip-")) { $("td:eq(1)", row).text("N/A"); } + + // Add delete button + $(row).attr("data-id", data.id); + var button = + '"; + $("td:eq(8)", row).html(button); }, dom: "<'row'<'col-sm-12'f>>" + @@ -179,8 +191,9 @@ $(function () { ajax: { url: API_STRING, error: handleAjaxError, dataSrc: "network" }, autoWidth: false, processing: true, - order: [[5, "desc"]], + order: [[6, "desc"]], columns: [ + { data: "id", visible: false }, { data: "ip", type: "ip-address", width: "10%", render: $.fn.dataTable.render.text() }, { data: "hwaddr", width: "10%", render: $.fn.dataTable.render.text() }, { data: "interface", width: "4%", render: $.fn.dataTable.render.text() }, @@ -209,7 +222,13 @@ $(function () { }, { data: "numQueries", width: "9%", render: $.fn.dataTable.render.text() }, { data: "", width: "6%", orderable: false }, + { data: "", width: "6%", orderable: false }, ], + drawCallback: function () { + $('button[id^="deleteNetworkEntry_"]').on("click", deleteNetworkEntry); + // Remove visible dropdown to prevent orphaning + $("body > .bootstrap-select.dropdown").remove(); + }, lengthMenu: [ [10, 25, 50, 100, -1], [10, 25, 50, 100, "All"], @@ -223,7 +242,7 @@ $(function () { }, columnDefs: [ { - targets: -1, + targets: [-1, -2], data: null, defaultContent: "", }, From 98ee67efed12780e7caaa53c89e49264607a9f3a Mon Sep 17 00:00:00 2001 From: yubiuser Date: Mon, 11 Oct 2021 14:17:49 +0200 Subject: [PATCH 2/2] Add delete function Signed-off-by: yubiuser --- scripts/pi-hole/js/network.js | 44 +++++++++++++++++- scripts/pi-hole/php/network.php | 82 +++++++++++++++++++++++++++++++++ 2 files changed, 125 insertions(+), 1 deletion(-) create mode 100644 scripts/pi-hole/php/network.php diff --git a/scripts/pi-hole/js/network.js b/scripts/pi-hole/js/network.js index 03f38cc3..f68b16b3 100644 --- a/scripts/pi-hole/js/network.js +++ b/scripts/pi-hole/js/network.js @@ -8,6 +8,7 @@ /* global utils:false */ var tableApi; +var token = $("#token").text(); var API_STRING = "api_db.php?network"; @@ -59,7 +60,48 @@ function parseColor(input) { } } -function deleteNetworkEntry() {} +function deleteNetworkEntry() { + var tr = $(this).closest("tr"); + var id = tr.attr("data-id"); + + utils.disableAll(); + utils.showAlert("info", "", "Deleting network table entry with ID " + parseInt(id, 10), "..."); + $.ajax({ + url: "scripts/pi-hole/php/network.php", + method: "post", + dataType: "json", + data: { action: "delete_network_entry", id: id, token: token }, + success: function (response) { + utils.enableAll(); + if (response.success) { + utils.showAlert( + "success", + "far fa-trash-alt", + "Successfully deleted network table entry # ", + id + ); + tableApi.row(tr).remove().draw(false).ajax.reload(null, false); + } else { + utils.showAlert( + "error", + "", + "Error while network table entry with ID " + id, + response.message + ); + } + }, + error: function (jqXHR, exception) { + utils.enableAll(); + utils.showAlert( + "error", + "", + "Error while deleting network table entry with ID " + id, + jqXHR.responseText + ); + console.log(exception); // eslint-disable-line no-console + }, + }); +} $(function () { tableApi = $("#network-entries").DataTable({ diff --git a/scripts/pi-hole/php/network.php b/scripts/pi-hole/php/network.php new file mode 100644 index 00000000..4709d283 --- /dev/null +++ b/scripts/pi-hole/php/network.php @@ -0,0 +1,82 @@ + + true, 'message' => $message)); +} + +function JSON_error($message = null) +{ + header('Content-type: application/json'); + $response = array('success' => false, 'message' => $message); + if (isset($_POST['action'])) { + array_push($response, array('action' => $_POST['action'])); + } + echo json_encode($response); +} + +if ($_POST['action'] == 'delete_network_entry' && isset($_POST['id'])) { +// Delete netwwork and network_addresses table entry identified by ID + try { + + $stmt = $db->prepare('DELETE FROM network_addresses WHERE network_id=:id'); + if (!$stmt) { + throw new Exception('While preparing message statement: ' . $db->lastErrorMsg()); + } + + if (!$stmt->bindValue(':id', intval($_POST['id']), SQLITE3_INTEGER)) { + throw new Exception('While binding id to message statement: ' . $db->lastErrorMsg()); + } + + if (!$stmt->execute()) { + throw new Exception('While executing message statement: ' . $db->lastErrorMsg()); + } + + $stmt = $db->prepare('DELETE FROM network WHERE id=:id'); + if (!$stmt) { + throw new Exception('While preparing message statement: ' . $db->lastErrorMsg()); + } + + if (!$stmt->bindValue(':id', intval($_POST['id']), SQLITE3_INTEGER)) { + throw new Exception('While binding id to message statement: ' . $db->lastErrorMsg()); + } + + if (!$stmt->execute()) { + throw new Exception('While executing message statement: ' . $db->lastErrorMsg()); + } + + $reload = true; + JSON_success(); + } catch (\Exception $ex) { + JSON_error($ex->getMessage()); + } +} else { + log_and_die('Requested action not supported!'); +}