mirror of
https://github.com/pi-hole/web.git
synced 2026-05-08 17:49:49 +01:00
Merge branch 'devel' into whitelist
This commit is contained in:
File diff suppressed because one or more lines are too long
+7
-7
@@ -11,14 +11,14 @@
|
||||
</footer>
|
||||
</div>
|
||||
<!-- ./wrapper -->
|
||||
<script src="js/jquery.min.js"></script>
|
||||
<script src="js/jquery-ui.min.js"></script>
|
||||
<script src="bootstrap/js/bootstrap.min.js" type="text/javascript"></script>
|
||||
<script src="js/app.min.js" type="text/javascript"></script>
|
||||
<script src="js/other/jquery.min.js"></script>
|
||||
<script src="js/other/jquery-ui.min.js"></script>
|
||||
<script src="bootstrap/js/bootstrap.min.js"></script>
|
||||
<script src="js/other/app.min.js"></script>
|
||||
|
||||
<script src="js/jquery.dataTables.min.js" type="text/javascript"></script>
|
||||
<script src="js/dataTables.bootstrap.min.js" type="text/javascript"></script>
|
||||
<script src="js/Chart.min.js"></script>
|
||||
<script src="js/other/jquery.dataTables.min.js"></script>
|
||||
<script src="js/other/dataTables.bootstrap.min.js"></script>
|
||||
<script src="js/other/Chart.min.js"></script>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+3
-3
@@ -2,6 +2,7 @@
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self' 'unsafe-eval'; style-src 'self' 'unsafe-inline'">
|
||||
<title>Pi-hole Admin Console</title>
|
||||
<!-- Tell the browser to be responsive to screen width -->
|
||||
<meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport">
|
||||
@@ -27,8 +28,8 @@
|
||||
</style>
|
||||
|
||||
<!--[if lt IE 9]>
|
||||
<script src="js/html5shiv.min.js"></script>
|
||||
<script src="js/respond.min.js"></script>
|
||||
<script src="js/other/html5shiv.min.js"></script>
|
||||
<script src="js/other/respond.min.js"></script>
|
||||
<![endif]-->
|
||||
</head>
|
||||
<body class="skin-blue sidebar-mini">
|
||||
@@ -83,7 +84,6 @@
|
||||
<input type="hidden" name="cmd" value="_s-xclick">
|
||||
<input type="hidden" name="hosted_button_id" value="3J2L3Z4DHW9UY">
|
||||
<input style="display: block; margin: 0 auto;" type="image" src="img/donate.gif" border="0" name="submit" alt="PayPal - The safer, easier way to pay online!">
|
||||
<img alt="" border="0" src="https://www.paypalobjects.com/en_US/i/scr/pixel.gif" width="1" height="1">
|
||||
</form>
|
||||
</div>
|
||||
</li>
|
||||
|
||||
@@ -1,15 +1,6 @@
|
||||
<?php
|
||||
require "header.html";
|
||||
?>
|
||||
<!-- JS Warning -->
|
||||
<div>
|
||||
<link rel="stylesheet" type="text/css" href="css/js-warn.css">
|
||||
<input type="checkbox" id="js-hide" />
|
||||
<div class="js-warn" id="js-warn-exit"><h1>Javascript Is Disabled</h1><p>Javascript seems to be disabled. This will break some site features.</p>
|
||||
<p>To enable Javascript click <a href="http://www.enable-javascript.com/" target="_blank">here</a></p><label for="js-hide">Close</label></div>
|
||||
<script>var jswarn = document.getElementById("js-warn-exit"); jswarn.parentNode.removeChild(jswarn);</script>
|
||||
</div>
|
||||
<!-- /JS Warning -->
|
||||
<!-- Small boxes (Stat box) -->
|
||||
<div class="row">
|
||||
<div class="col-lg-3 col-xs-6">
|
||||
@@ -194,195 +185,17 @@
|
||||
<!-- /.col -->
|
||||
</div>
|
||||
<!-- /.row -->
|
||||
<!-- JS Warning -->
|
||||
<div>
|
||||
<link rel="stylesheet" type="text/css" href="css/js-warn.css">
|
||||
<input type="checkbox" id="js-hide" />
|
||||
<div class="js-warn" id="js-warn-exit"><h1>Javascript Is Disabled</h1><p>Javascript seems to be disabled. This will break some site features.</p>
|
||||
<p>To enable Javascript click <a href="http://www.enable-javascript.com/" target="_blank">here</a></p><label for="js-hide">Close</label></div>
|
||||
</div>
|
||||
<!-- /JS Warning -->
|
||||
|
||||
<?php
|
||||
require "footer.php";
|
||||
?>
|
||||
|
||||
<script type="text/javascript">
|
||||
$(document).ready(function() {
|
||||
// Pull in data via AJAX
|
||||
|
||||
updateSummaryData();
|
||||
|
||||
updateQueriesOverTime();
|
||||
|
||||
updateQueryTypes();
|
||||
|
||||
updateTopClientsChart();
|
||||
|
||||
updateForwardDestinations();
|
||||
|
||||
updateTopLists();
|
||||
|
||||
// Create charts
|
||||
var chartData = {
|
||||
labels: [],
|
||||
datasets: [
|
||||
{
|
||||
label: "All Queries",
|
||||
fillColor: "rgba(220,220,220,0.5)",
|
||||
strokeColor: "rgba(0, 166, 90,.8)",
|
||||
pointColor: "rgba(0, 166, 90,.8)"
|
||||
},
|
||||
{
|
||||
label: "Ad Queries",
|
||||
fillColor: "rgba(0,192,239,0.5)",
|
||||
strokeColor: "rgba(0,192,239,1)",
|
||||
pointColor: "rgba(0,192,239,1)"
|
||||
}
|
||||
]
|
||||
};
|
||||
var isMobile = {
|
||||
Windows: function() {
|
||||
return /IEMobile/i.test(navigator.userAgent);
|
||||
},
|
||||
Android: function() {
|
||||
return /Android/i.test(navigator.userAgent);
|
||||
},
|
||||
BlackBerry: function() {
|
||||
return /BlackBerry/i.test(navigator.userAgent);
|
||||
},
|
||||
iOS: function() {
|
||||
return /iPhone|iPad|iPod/i.test(navigator.userAgent);
|
||||
},
|
||||
any: function() {
|
||||
return (isMobile.Android() || isMobile.BlackBerry() || isMobile.iOS() || isMobile.Windows());
|
||||
}
|
||||
};
|
||||
var animate = false;
|
||||
var ctx = document.getElementById("queryOverTimeChart").getContext("2d");
|
||||
timeLineChart = new Chart(ctx).Line(chartData,
|
||||
{
|
||||
pointDot : false,
|
||||
legendTemplate : "<ul class=\"<%=name.toLowerCase()%>-legend\"><% for (var i=0; i<datasets.length; i++){%><li><span style=\"background-color:<%=datasets[i].strokeColor%>\"></span><%if(datasets[i].label){%><%=datasets[i].label%><%}%></li><%}%></ul>",
|
||||
animation : animate
|
||||
}
|
||||
);
|
||||
|
||||
ctx = document.getElementById("queryTypeChart").getContext("2d");
|
||||
queryTypeChart = new Chart(ctx).Doughnut([],
|
||||
{
|
||||
legendTemplate : "<ul class=\"<%=name.toLowerCase()%>-legend\"><% for (var i=0; i<segments.length; i++){%><li><span style=\"background-color:<%=segments[i].strokeColor%>\"></span><%if(segments[i].label){%><%=segments[i].label%><%}%></li><%}%></ul>",
|
||||
animation : animate
|
||||
}
|
||||
);
|
||||
|
||||
ctx = document.getElementById("forwardDestinationChart").getContext("2d");
|
||||
forwardDestinationChart = new Chart(ctx).Doughnut([],
|
||||
{
|
||||
legendTemplate : "<ul class=\"<%=name.toLowerCase()%>-legend\"><% for (var i=0; i<segments.length; i++){%><li><span style=\"background-color:<%=segments[i].strokeColor%>\"></span><%if(segments[i].label){%><%=segments[i].label%><%}%></li><%}%></ul>",
|
||||
animation : animate
|
||||
}
|
||||
);
|
||||
});
|
||||
|
||||
// Functions to oupdate data in page
|
||||
|
||||
function updateSummaryData(runOnce) {
|
||||
$.getJSON("api.php?summary", function LoadSummaryData(data) {
|
||||
//$("h3.statistic").addClass("glow");
|
||||
if ($("h3#ads_blocked_today").text() != data.ads_blocked_today) {
|
||||
$("h3#ads_blocked_today").addClass("glow");
|
||||
}
|
||||
if ($("h3#dns_queries_today").text() != data.dns_queries_today) {
|
||||
$("h3#dns_queries_today").addClass("glow");
|
||||
}
|
||||
if ($("h3#ads_percentage_today").text() != data.ads_percentage_today) {
|
||||
$("h3#ads_percentage_today").addClass("glow");
|
||||
}
|
||||
|
||||
window.setTimeout(function(){
|
||||
$("h3#ads_blocked_today").text(data.ads_blocked_today);
|
||||
$("h3#dns_queries_today").text(data.dns_queries_today);
|
||||
$("h3#domains_being_blocked").text(data.domains_being_blocked);
|
||||
$("h3#ads_percentage_today").text(data.ads_percentage_today + "%");
|
||||
$("h3.statistic.glow").removeClass("glow")
|
||||
}, 500);
|
||||
}).done(function() {
|
||||
if (runOnce !== true) {
|
||||
setTimeout(updateSummaryData, 10000);
|
||||
}
|
||||
}).fail(function() {
|
||||
if (runOnce !== true) {
|
||||
setTimeout(updateSummaryData, (1000 * 60 * 5));
|
||||
}
|
||||
});;
|
||||
}
|
||||
|
||||
function updateQueriesOverTime() {
|
||||
$.getJSON("api.php?overTimeData", function(data) {
|
||||
for (hour in data.ads_over_time) {
|
||||
timeLineChart.addData([data.domains_over_time[hour], data.ads_over_time[hour]], hour + ":00");
|
||||
}
|
||||
$('#queries-over-time .overlay').remove();
|
||||
//$('#queries-over-time').append(timeLineChart.generateLegend());
|
||||
});
|
||||
}
|
||||
|
||||
function updateTopClientsChart() {
|
||||
$.getJSON("api.php?summaryRaw&getQuerySources", function(data) {
|
||||
var clienttable = $('#client-frequency').find('tbody:last');
|
||||
for (domain in data.top_sources) {
|
||||
clienttable.append('<tr> <td>' + domain +
|
||||
'</td> <td>' + data.top_sources[domain] + '</td> <td> <div class="progress progress-sm"> <div class="progress-bar progress-bar-blue" style="width: ' +
|
||||
data.top_sources[domain] / data.dns_queries_today * 100 + '%"></div> </div> </td> </tr> ');
|
||||
}
|
||||
|
||||
$('#client-frequency .overlay').remove();
|
||||
});
|
||||
}
|
||||
|
||||
function updateQueryTypes() {
|
||||
$.getJSON("api.php?getQueryTypes", function(data) {
|
||||
var colors = [];
|
||||
$.each($.AdminLTE.options.colors, function(key, value) { colors.push(value); });
|
||||
$.each(data, function(key , value) {
|
||||
queryTypeChart.addData({
|
||||
value: value,
|
||||
color: colors.shift(),
|
||||
label: key.substr(6,key.length - 7)
|
||||
});
|
||||
});
|
||||
$('#query-types .overlay').remove();
|
||||
//$('#query-types').append(queryTypeChart.generateLegend());
|
||||
});
|
||||
}
|
||||
|
||||
function updateForwardDestinations() {
|
||||
$.getJSON("api.php?getForwardDestinations", function(data) {
|
||||
var colors = [];
|
||||
$.each($.AdminLTE.options.colors, function(key, value) { colors.push(value); });
|
||||
$.each(data, function(key , value) {
|
||||
forwardDestinationChart.addData({
|
||||
value: value,
|
||||
color: colors.shift(),
|
||||
label: key
|
||||
});
|
||||
});
|
||||
$('#forward-destinations .overlay').remove();
|
||||
//$('#forward-destinations').append(forwardDestinationChart.generateLegend());
|
||||
});
|
||||
}
|
||||
|
||||
function updateTopLists() {
|
||||
$.getJSON("api.php?summaryRaw&topItems", function(data) {
|
||||
var domaintable = $('#domain-frequency').find('tbody:last');
|
||||
var adtable = $('#ad-frequency').find('tbody:last');
|
||||
|
||||
for (domain in data.top_queries) {
|
||||
domaintable.append('<tr> <td>' + domain +
|
||||
'</td> <td>' + data.top_queries[domain] + '</td> <td> <div class="progress progress-sm"> <div class="progress-bar progress-bar-green" style="width: ' +
|
||||
data.top_queries[domain] / data.dns_queries_today * 100 + '%"></div> </div> </td> </tr> ');
|
||||
}
|
||||
for (domain in data.top_ads) {
|
||||
adtable.append('<tr> <td>' + domain +
|
||||
'</td> <td>' + data.top_ads[domain] + '</td> <td> <div class="progress progress-sm"> <div class="progress-bar progress-bar-yellow" style="width: ' +
|
||||
data.top_ads[domain] / data.ads_blocked_today * 100 + '%"></div> </div> </td> </tr> ');
|
||||
}
|
||||
|
||||
$('#domain-frequency .overlay').remove();
|
||||
$('#ad-frequency .overlay').remove();
|
||||
});
|
||||
}
|
||||
</script>
|
||||
<script src="js/pihole/index.js"></script>
|
||||
|
||||
@@ -0,0 +1,189 @@
|
||||
// Remove JS warning
|
||||
var jswarn = document.getElementById("js-warn-exit");
|
||||
jswarn.parentNode.removeChild(jswarn);
|
||||
|
||||
$(document).ready(function() {
|
||||
// Pull in data via AJAX
|
||||
|
||||
updateSummaryData();
|
||||
|
||||
updateQueriesOverTime();
|
||||
|
||||
updateQueryTypes();
|
||||
|
||||
updateTopClientsChart();
|
||||
|
||||
updateForwardDestinations();
|
||||
|
||||
updateTopLists();
|
||||
|
||||
// Create charts
|
||||
var chartData = {
|
||||
labels: [],
|
||||
datasets: [
|
||||
{
|
||||
label: "All Queries",
|
||||
fillColor: "rgba(220,220,220,0.5)",
|
||||
strokeColor: "rgba(0, 166, 90,.8)",
|
||||
pointColor: "rgba(0, 166, 90,.8)"
|
||||
},
|
||||
{
|
||||
label: "Ad Queries",
|
||||
fillColor: "rgba(0,192,239,0.5)",
|
||||
strokeColor: "rgba(0,192,239,1)",
|
||||
pointColor: "rgba(0,192,239,1)"
|
||||
}
|
||||
]
|
||||
};
|
||||
var isMobile = {
|
||||
Windows: function() {
|
||||
return /IEMobile/i.test(navigator.userAgent);
|
||||
},
|
||||
Android: function() {
|
||||
return /Android/i.test(navigator.userAgent);
|
||||
},
|
||||
BlackBerry: function() {
|
||||
return /BlackBerry/i.test(navigator.userAgent);
|
||||
},
|
||||
iOS: function() {
|
||||
return /iPhone|iPad|iPod/i.test(navigator.userAgent);
|
||||
},
|
||||
any: function() {
|
||||
return (isMobile.Android() || isMobile.BlackBerry() || isMobile.iOS() || isMobile.Windows());
|
||||
}
|
||||
};
|
||||
var animate = false;
|
||||
var ctx = document.getElementById("queryOverTimeChart").getContext("2d");
|
||||
timeLineChart = new Chart(ctx).Line(chartData,
|
||||
{
|
||||
pointDot : false,
|
||||
legendTemplate : "<ul class=\"<%=name.toLowerCase()%>-legend\"><% for (var i=0; i<datasets.length; i++){%><li><span style=\"background-color:<%=datasets[i].strokeColor%>\"></span><%if(datasets[i].label){%><%=datasets[i].label%><%}%></li><%}%></ul>",
|
||||
animation : animate
|
||||
}
|
||||
);
|
||||
|
||||
ctx = document.getElementById("queryTypeChart").getContext("2d");
|
||||
queryTypeChart = new Chart(ctx).Doughnut([],
|
||||
{
|
||||
legendTemplate : "<ul class=\"<%=name.toLowerCase()%>-legend\"><% for (var i=0; i<segments.length; i++){%><li><span style=\"background-color:<%=segments[i].strokeColor%>\"></span><%if(segments[i].label){%><%=segments[i].label%><%}%></li><%}%></ul>",
|
||||
animation : animate
|
||||
}
|
||||
);
|
||||
|
||||
ctx = document.getElementById("forwardDestinationChart").getContext("2d");
|
||||
forwardDestinationChart = new Chart(ctx).Doughnut([],
|
||||
{
|
||||
legendTemplate : "<ul class=\"<%=name.toLowerCase()%>-legend\"><% for (var i=0; i<segments.length; i++){%><li><span style=\"background-color:<%=segments[i].strokeColor%>\"></span><%if(segments[i].label){%><%=segments[i].label%><%}%></li><%}%></ul>",
|
||||
animation : animate
|
||||
}
|
||||
);
|
||||
});
|
||||
|
||||
// Functions to oupdate data in page
|
||||
|
||||
function updateSummaryData(runOnce) {
|
||||
$.getJSON("api.php?summary", function LoadSummaryData(data) {
|
||||
//$("h3.statistic").addClass("glow");
|
||||
if ($("h3#ads_blocked_today").text() != data.ads_blocked_today) {
|
||||
$("h3#ads_blocked_today").addClass("glow");
|
||||
}
|
||||
if ($("h3#dns_queries_today").text() != data.dns_queries_today) {
|
||||
$("h3#dns_queries_today").addClass("glow");
|
||||
}
|
||||
if ($("h3#ads_percentage_today").text() != data.ads_percentage_today) {
|
||||
$("h3#ads_percentage_today").addClass("glow");
|
||||
}
|
||||
|
||||
window.setTimeout(function(){
|
||||
$("h3#ads_blocked_today").text(data.ads_blocked_today);
|
||||
$("h3#dns_queries_today").text(data.dns_queries_today);
|
||||
$("h3#domains_being_blocked").text(data.domains_being_blocked);
|
||||
$("h3#ads_percentage_today").text(data.ads_percentage_today + "%");
|
||||
$("h3.statistic.glow").removeClass("glow")
|
||||
}, 500);
|
||||
}).done(function() {
|
||||
if (runOnce !== true) {
|
||||
setTimeout(updateSummaryData, 10000);
|
||||
}
|
||||
}).fail(function() {
|
||||
if (runOnce !== true) {
|
||||
setTimeout(updateSummaryData, (1000 * 60 * 5));
|
||||
}
|
||||
});;
|
||||
}
|
||||
|
||||
function updateQueriesOverTime() {
|
||||
$.getJSON("api.php?overTimeData", function(data) {
|
||||
for (hour in data.ads_over_time) {
|
||||
timeLineChart.addData([data.domains_over_time[hour], data.ads_over_time[hour]], hour + ":00");
|
||||
}
|
||||
$('#queries-over-time .overlay').remove();
|
||||
//$('#queries-over-time').append(timeLineChart.generateLegend());
|
||||
});
|
||||
}
|
||||
|
||||
function updateTopClientsChart() {
|
||||
$.getJSON("api.php?summaryRaw&getQuerySources", function(data) {
|
||||
var clienttable = $('#client-frequency').find('tbody:last');
|
||||
for (domain in data.top_sources) {
|
||||
clienttable.append('<tr> <td>' + domain +
|
||||
'</td> <td>' + data.top_sources[domain] + '</td> <td> <div class="progress progress-sm"> <div class="progress-bar progress-bar-blue" style="width: ' +
|
||||
data.top_sources[domain] / data.dns_queries_today * 100 + '%"></div> </div> </td> </tr> ');
|
||||
}
|
||||
|
||||
$('#client-frequency .overlay').remove();
|
||||
});
|
||||
}
|
||||
|
||||
function updateQueryTypes() {
|
||||
$.getJSON("api.php?getQueryTypes", function(data) {
|
||||
var colors = [];
|
||||
$.each($.AdminLTE.options.colors, function(key, value) { colors.push(value); });
|
||||
$.each(data, function(key , value) {
|
||||
queryTypeChart.addData({
|
||||
value: value,
|
||||
color: colors.shift(),
|
||||
label: key.substr(6,key.length - 7)
|
||||
});
|
||||
});
|
||||
$('#query-types .overlay').remove();
|
||||
//$('#query-types').append(queryTypeChart.generateLegend());
|
||||
});
|
||||
}
|
||||
|
||||
function updateForwardDestinations() {
|
||||
$.getJSON("api.php?getForwardDestinations", function(data) {
|
||||
var colors = [];
|
||||
$.each($.AdminLTE.options.colors, function(key, value) { colors.push(value); });
|
||||
$.each(data, function(key , value) {
|
||||
forwardDestinationChart.addData({
|
||||
value: value,
|
||||
color: colors.shift(),
|
||||
label: key
|
||||
});
|
||||
});
|
||||
$('#forward-destinations .overlay').remove();
|
||||
//$('#forward-destinations').append(forwardDestinationChart.generateLegend());
|
||||
});
|
||||
}
|
||||
|
||||
function updateTopLists() {
|
||||
$.getJSON("api.php?summaryRaw&topItems", function(data) {
|
||||
var domaintable = $('#domain-frequency').find('tbody:last');
|
||||
var adtable = $('#ad-frequency').find('tbody:last');
|
||||
|
||||
for (domain in data.top_queries) {
|
||||
domaintable.append('<tr> <td>' + domain +
|
||||
'</td> <td>' + data.top_queries[domain] + '</td> <td> <div class="progress progress-sm"> <div class="progress-bar progress-bar-green" style="width: ' +
|
||||
data.top_queries[domain] / data.dns_queries_today * 100 + '%"></div> </div> </td> </tr> ');
|
||||
}
|
||||
for (domain in data.top_ads) {
|
||||
adtable.append('<tr> <td>' + domain +
|
||||
'</td> <td>' + data.top_ads[domain] + '</td> <td> <div class="progress progress-sm"> <div class="progress-bar progress-bar-yellow" style="width: ' +
|
||||
data.top_ads[domain] / data.ads_blocked_today * 100 + '%"></div> </div> </td> </tr> ');
|
||||
}
|
||||
|
||||
$('#domain-frequency .overlay').remove();
|
||||
$('#ad-frequency .overlay').remove();
|
||||
});
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
$(document).ready(function() {
|
||||
tableApi = $('#all-queries').DataTable( {
|
||||
"rowCallback": function( row, data, index ){
|
||||
if (data[4] == "Pi-holed") {
|
||||
$(row).css('color','red')
|
||||
}
|
||||
else{
|
||||
$(row).css('color','green')
|
||||
}
|
||||
|
||||
},
|
||||
"ajax": "api.php?getAllQueries",
|
||||
"autoWidth" : false,
|
||||
"order" : [[0, "desc"]],
|
||||
"columns": [
|
||||
{ "width" : "20%", "type": "date" },
|
||||
{ "width" : "10%" },
|
||||
{ "width" : "40%" },
|
||||
{ "width" : "15%" },
|
||||
{ "width" : "15%" }
|
||||
]
|
||||
})
|
||||
} );
|
||||
|
||||
function refreshData() {
|
||||
tableApi.ajax.url("api.php?getAllQueries").load();
|
||||
}
|
||||
+1
-29
@@ -49,32 +49,4 @@
|
||||
require "footer.php";
|
||||
?>
|
||||
|
||||
<script type="text/javascript">
|
||||
$(document).ready(function() {
|
||||
tableApi = $('#all-queries').DataTable( {
|
||||
"rowCallback": function( row, data, index ){
|
||||
if (data[4] == "Pi-holed") {
|
||||
$(row).css('color','red')
|
||||
}
|
||||
else{
|
||||
$(row).css('color','green')
|
||||
}
|
||||
|
||||
},
|
||||
"ajax": "api.php?getAllQueries",
|
||||
"autoWidth" : false,
|
||||
"order" : [[0, "desc"]],
|
||||
"columns": [
|
||||
{ "width" : "20%", "type": "date" },
|
||||
{ "width" : "10%" },
|
||||
{ "width" : "40%" },
|
||||
{ "width" : "15%" },
|
||||
{ "width" : "15%" }
|
||||
]
|
||||
})
|
||||
} );
|
||||
|
||||
function refreshData() {
|
||||
tableApi.ajax.url("api.php?getAllQueries").load();
|
||||
}
|
||||
</script>
|
||||
<script src="js/pihole/queries.js"></script>
|
||||
|
||||
Reference in New Issue
Block a user