/* Pi-hole: A black hole for Internet advertisements * (c) 2017 Pi-hole, LLC (https://pi-hole.net) * Network-wide ad blocking via your own hardware. * * This file is copyright under the latest version of the EUPL. * Please see LICENSE file for your rights under this license. */ /* global utils:false */ var table; var groups = []; var token = $("#token").text(); function getGroups() { $.post( "scripts/pi-hole/php/groups.php", { action: "get_groups", token: token }, function (data) { groups = data.data; initTable(); }, "json" ); } $(function () { $("#btnAdd").on("click", addAdlist); utils.setBsSelectDefaults(); getGroups(); }); function format(data) { // Generate human-friendly status string var statusText = "Unknown"; var numbers = true; if (data.status !== null) { switch (parseInt(data.status, 10)) { case 0: statusText = data.enabled === 0 ? "List is disabled and not checked" : "List was not downloaded so far"; numbers = false; break; case 1: statusText = 'List download was successful (OK)'; break; case 2: statusText = 'List unchanged upstream, Pi-hole used a local copy (OK)'; break; case 3: statusText = 'List unavailable, Pi-hole used a local copy (check list)'; break; case 4: statusText = 'List unavailable, there is no local copy of this list available on your Pi-hole (replace list)'; numbers = false; break; default: statusText = 'Unknown (' + parseInt(data.status, 10) + ")"; break; } } var invalidStyle = data.invalid_domains !== null && data.invalid_domains > 0 && numbers === true ? ' style="color:red; font-weight:bold;"' : ""; // Compile extra info for displaying return ( "" + '" + "
Health status of this list:' + statusText + '
This list was added to Pi-hole  ' + utils.datetimeRelative(data.date_added) + " (" + utils.datetime(data.date_added, false) + ')
Database entry was last modified  ' + utils.datetimeRelative(data.date_modified) + " (" + utils.datetime(data.date_modified, false) + ')
The list contents were last updated  ' + (data.date_updated > 0 ? utils.datetimeRelative(data.date_updated) + " (" + utils.datetime(data.date_updated) + ")" : "N/A") + '
Number of domains on this list:  ' + (data.number !== null && numbers === true ? parseInt(data.number, 10) : "N/A") + '
Number of invalid domains on this list:  " + (data.invalid_domains !== null && numbers === true ? parseInt(data.invalid_domains, 10) : "N/A") + '
Database ID of this list:' + data.id + "
" ); } function initTable() { table = $("#adlistsTable").DataTable({ ajax: { url: "scripts/pi-hole/php/groups.php", data: { action: "get_adlists", token: token }, type: "POST", }, order: [[0, "asc"]], columns: [ { data: "id", visible: false }, { data: "status", searchable: false, class: "details-control" }, { data: "address" }, { data: "enabled", searchable: false }, { data: "comment" }, { data: "groups", searchable: false }, { data: null, width: "80px", orderable: false }, ], columnDefs: [ { targets: [0, 2], orderable: false, }, { targets: "_all", render: $.fn.dataTable.render.text(), }, ], drawCallback: function () { $('button[id^="deleteAdlist_"]').on("click", deleteAdlist); // Remove visible dropdown to prevent orphaning $("body > .bootstrap-select.dropdown").remove(); }, rowCallback: function (row, data) { $(row).attr("data-id", data.id); var disabled = data.enabled === 0; var statusCode = 0, statusIcon; // If there is no status or the list is disabled, we keep // status 0 (== unknown) if (data.status !== null && disabled !== true) { statusCode = parseInt(data.status, 10); } switch (statusCode) { case 1: statusIcon = "fa-check"; break; case 2: statusIcon = "fa-history"; break; case 3: statusIcon = "fa-exclamation-circle"; break; case 4: statusIcon = "fa-times"; break; case 0: default: statusIcon = "fa-question-circle"; break; } // Append red exclamation-triangle when there are invalid lines on the list var extra = ""; if (data.invalid_domains !== null && data.invalid_domains > 0) { extra = ""; } $("td:eq(0)", row).addClass("list-status-" + statusCode); $("td:eq(0)", row).html( "" + extra ); if (data.address.startsWith("file://")) { // Local files cannot be downloaded from a distant client so don't show // a link to such a list here $("td:eq(1)", row).html( '' + data.address + "" ); } else { $("td:eq(1)", row).html( '' + data.address + "" ); } $("td:eq(2)", row).html( '" ); var statusEl = $("#status_" + data.id, row); statusEl.bootstrapToggle({ on: "Enabled", off: "Disabled", size: "small", onstyle: "success", width: "80px", }); statusEl.on("change", editAdlist); $("td:eq(3)", row).html(''); var commentEl = $("#comment_" + data.id, row); commentEl.val(utils.unescapeHtml(data.comment)); commentEl.on("change", editAdlist); $("td:eq(4)", row).empty(); $("td:eq(4)", row).append( '' ); var selectEl = $("#multiselect_" + data.id, row); // Add all known groups for (var i = 0; i < groups.length; i++) { var dataSub = ""; if (!groups[i].enabled) { dataSub = 'data-subtext="(disabled)"'; } selectEl.append( $("