mirror of
https://github.com/pi-hole/web.git
synced 2024-12-06 19:36:21 +01:00
Merge remote-tracking branch 'upstream/devel' into feat/avoid-window-open
Signed-off-by: Paul Mannarino <paul.mannarino@gmail.com>
This commit is contained in:
@@ -30,7 +30,7 @@ The Web interface is enabled by default when you install Pi-hole.
|
||||
|
||||
There are several ways to [access the dashboard](https://discourse.pi-hole.net/t/how-do-i-access-pi-holes-dashboard-admin-interface/3168):
|
||||
|
||||
1. `http://<IP_ADDPRESS_OF_YOUR_PI_HOLE>/admin/`
|
||||
1. `http://<IP_ADDRESS_OF_YOUR_PI_HOLE>/admin/`
|
||||
2. `http:/pi.hole/admin/` (when using Pi-hole as your DNS server)
|
||||
3. `http://pi.hole/` (when using Pi-hole as your DNS server)
|
||||
|
||||
@@ -46,7 +46,7 @@ Once logged in (forgot your password?), you can view your network stats to see t
|
||||
|
||||
## Pi-hole is free, but powered by your support
|
||||
|
||||
There are many reoccurring costs involved with maintaining free, open source, and privacy respecting software; expenses which [our volunteer developers](https://github.com/orgs/pi-hole/people) pitch in to cover out-of-pocket. This is just one example of how strongly we feel about our software, as well as the importance of keeping it maintained.
|
||||
There are many reoccurring costs involved with maintaining free, open source, and privacy-respecting software; expenses which [our volunteer developers](https://github.com/orgs/pi-hole/people) pitch in to cover out-of-pocket. This is just one example of how strongly we feel about our software, as well as the importance of keeping it maintained.
|
||||
|
||||
Make no mistake: **your support is absolutely vital to help keep us innovating!**
|
||||
|
||||
@@ -73,7 +73,7 @@ If you'd rather not [donate](https://pi-hole.net/donate/) (_which is okay!_), th
|
||||
|
||||
We welcome _everyone_ to contribute to issue reports, suggest new features, and create pull requests.
|
||||
|
||||
If you have something to add - anything from a typo through to a whole new feature, we're happy to check it out! Just make sure to fill out our template when submitting your request; the questions that it asks will help the volunteers quickly understand what you're aiming to achieve.
|
||||
If you have something to add - anything from a typo through to a whole new feature - we're happy to check it out! Just make sure to fill out our template when submitting your request; the questions that it asks will help the volunteers quickly understand what you're aiming to achieve.
|
||||
|
||||
### Presentations about Pi-hole
|
||||
|
||||
|
||||
@@ -7,6 +7,9 @@
|
||||
* Please see LICENSE file for your rights under this license. */
|
||||
require "scripts/pi-hole/php/header.php";
|
||||
?>
|
||||
<!-- Sourceing CSS colors from stylesheet to be used in JS code -->
|
||||
<span class="graphs-grid"></span>
|
||||
<span class="graphs-ticks"></span>
|
||||
|
||||
<div class="page-header">
|
||||
<h1>Compute graphical statistics from the Pi-hole query database</h1>
|
||||
|
||||
+32
-27
@@ -22,6 +22,12 @@
|
||||
</h3>
|
||||
</div>
|
||||
<div class="box-body">
|
||||
<div class="alert alert-info reload-box">
|
||||
<div>
|
||||
<span><i class="fa fa-exclamation-circle"></i> New options selected. Please reload the data or choose another time range.</span>
|
||||
<button type="button" class="btn btn-primary bt-reload">Reload Data</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="form-group col-md-12">
|
||||
<div class="input-group">
|
||||
@@ -32,38 +38,37 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
<label>Query status:</label>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="col-md-3">
|
||||
<div><input type="checkbox" id="type_forwarded" checked><label for="type_forwarded">Permitted: forwarded</label><br></div>
|
||||
<div><input type="checkbox" id="type_cached" checked><label for="type_cached">Permitted: cached</label></div>
|
||||
<div><input type="checkbox" id="type_retried" checked><label for="type_retried">Permitted: retried</label></div>
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<div><input type="checkbox" id="type_gravity" checked><label for="type_gravity">Blocked: gravity</label><br></div>
|
||||
<div><input type="checkbox" id="type_external" checked><label for="type_external">Blocked: external</label></div>
|
||||
<div><input type="checkbox" id="type_dbbusy" checked><label for="type_dbbusy">Blocked: database busy</label></div>
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<div><input type="checkbox" id="type_blacklist" checked><label for="type_blacklist">Blocked: exact blacklist</label><br></div>
|
||||
<div><input type="checkbox" id="type_regex" checked><label for="type_regex">Blocked: regex blacklist</label></div>
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<div><input type="checkbox" id="type_gravity_CNAME" checked><label for="type_gravity_CNAME">Blocked: gravity (CNAME)</label><br></div>
|
||||
<div><input type="checkbox" id="type_blacklist_CNAME" checked><label for="type_blacklist_CNAME">Blocked: exact blacklist (CNAME)</label><br></div>
|
||||
<div><input type="checkbox" id="type_regex_CNAME" checked><label for="type_regex_CNAME">Blocked: regex blacklist (CNAME)</label></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
<label>Query status:</label>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="col-md-3">
|
||||
<div><input type="checkbox" id="type_forwarded" checked><label for="type_forwarded">Permitted: forwarded</label><br></div>
|
||||
<div><input type="checkbox" id="type_cached" checked><label for="type_cached">Permitted: cached</label></div>
|
||||
<div><input type="checkbox" id="type_retried" checked><label for="type_retried">Permitted: retried</label></div>
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<div><input type="checkbox" id="type_gravity" checked><label for="type_gravity">Blocked: gravity</label><br></div>
|
||||
<div><input type="checkbox" id="type_external" checked><label for="type_external">Blocked: external</label></div>
|
||||
<div><input type="checkbox" id="type_dbbusy" checked><label for="type_dbbusy">Blocked: database busy</label></div>
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<div><input type="checkbox" id="type_blacklist" checked><label for="type_blacklist">Blocked: exact blacklist</label><br></div>
|
||||
<div><input type="checkbox" id="type_regex" checked><label for="type_regex">Blocked: regex blacklist</label></div>
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<div><input type="checkbox" id="type_gravity_CNAME" checked><label for="type_gravity_CNAME">Blocked: gravity (CNAME)</label><br></div>
|
||||
<div><input type="checkbox" id="type_blacklist_CNAME" checked><label for="type_blacklist_CNAME">Blocked: exact blacklist (CNAME)</label><br></div>
|
||||
<div><input type="checkbox" id="type_regex_CNAME" checked><label for="type_regex_CNAME">Blocked: regex blacklist (CNAME)</label></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="timeoutWarning" class="alert alert-warning alert-dismissible fade in" role="alert" hidden>
|
||||
Depending on how large of a range you specified, the request may time out while Pi-hole tries to retrieve all the data.<br/><span id="err"></span>
|
||||
</div>
|
||||
|
||||
@@ -35,6 +35,7 @@
|
||||
</tr>
|
||||
</thead>
|
||||
</table>
|
||||
<p>Note: If errors are shown, you can <a href="debug.php">generate a debug log</a>, which will do a thorough Pi-hole evaluation.</p>
|
||||
</div>
|
||||
<!-- /.box-body -->
|
||||
</div>
|
||||
|
||||
@@ -8,12 +8,6 @@
|
||||
require "scripts/pi-hole/php/header.php";
|
||||
?>
|
||||
|
||||
<!-- Sourceing CSS colors from stylesheet to be used in JS code -->
|
||||
<span class="queries-permitted"></span>
|
||||
<span class="queries-blocked"></span>
|
||||
<span class="graphs-grid"></span>
|
||||
<span class="graphs-ticks"></span>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
<div class="box" id="network-details">
|
||||
|
||||
Generated
+911
-970
File diff suppressed because it is too large
Load Diff
+7
-7
@@ -20,15 +20,15 @@
|
||||
"prettier:fix": "prettier --write \"style/*.css\" \"style/themes/*.css\" \"scripts/pi-hole/**/*.js\"",
|
||||
"xo": "xo",
|
||||
"xo:fix": "npm run xo -- --fix",
|
||||
"test": "npm run xo"
|
||||
"test": "npm run prettier:check && npm run xo"
|
||||
},
|
||||
"devDependencies": {
|
||||
"autoprefixer": "^10.3.7",
|
||||
"eslint-plugin-compat": "^3.13.0",
|
||||
"postcss": "^8.3.9",
|
||||
"postcss-cli": "^9.0.1",
|
||||
"prettier": "2.4.1",
|
||||
"xo": "^0.45.0"
|
||||
"autoprefixer": "^10.4.0",
|
||||
"eslint-plugin-compat": "^4.0.0",
|
||||
"postcss": "^8.3.11",
|
||||
"postcss-cli": "^9.0.2",
|
||||
"prettier": "2.5.0",
|
||||
"xo": "^0.46.4"
|
||||
},
|
||||
"browserslist": [
|
||||
"defaults",
|
||||
|
||||
@@ -75,15 +75,6 @@ else
|
||||
$showall = true;
|
||||
}
|
||||
|
||||
if(isset($setupVars["API_PRIVACY_MODE"]))
|
||||
{
|
||||
if($setupVars["API_PRIVACY_MODE"])
|
||||
{
|
||||
// Overwrite string from above
|
||||
$showing .= ", privacy mode enabled";
|
||||
}
|
||||
}
|
||||
|
||||
if(strlen($showing) > 0)
|
||||
{
|
||||
$showing = "(".$showing.")";
|
||||
|
||||
+9
-20
@@ -15,27 +15,16 @@
|
||||
<div class="col-md-12">
|
||||
<div class="box">
|
||||
<div class="box-body">
|
||||
<!-- Domain Input <992px -->
|
||||
<div class="visible-xs-block visible-sm-block">
|
||||
<div class="input-group-block">
|
||||
<input id="domain_1" type="url" class="form-control" placeholder="Domain to look for (example.com or sub.example.com)" autocomplete="off" spellcheck="false" autocapitalize="none" autocorrect="off" style="margin-bottom: 5px">
|
||||
<input id="quiet" type="hidden" value="no">
|
||||
<div class="text-center" style="display: block; width: 100%">
|
||||
<button type="button" id="btnSearch_1" class="btn btn-default">Search partial match</button>
|
||||
<button type="button" id="btnSearchExact_1" class="btn btn-default">Search exact match</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- Domain Input >=992px -->
|
||||
<div class="visible-md-block visible-lg-block">
|
||||
<div class="input-group">
|
||||
<input id="domain_2" type="url" class="form-control" placeholder="Domain to look for (example.com or sub.example.com)" autocomplete="off" spellcheck="false" autocapitalize="none" autocorrect="off">
|
||||
<span class="input-group-btn">
|
||||
<button type="button" id="btnSearch_2" class="btn btn-default">Search partial match</button>
|
||||
<button type="button" id="btnSearchExact_2" class="btn btn-default">Search exact match</button>
|
||||
</span>
|
||||
</div>
|
||||
<!-- domain-search-block - Single search field mobile/desktop -->
|
||||
<div id="domain-search-block" class="input-group">
|
||||
<input id="domain" type="url" class="form-control" placeholder="Domain to look for (example.com or sub.example.com)" autocomplete="off" spellcheck="false" autocapitalize="none" autocorrect="off">
|
||||
<input id="quiet" type="hidden" value="no">
|
||||
<span class="input-group-btn">
|
||||
<button type="button" id="btnSearch" class="btn btn-default">Search partial match</button>
|
||||
<button type="button" id="btnSearchExact" class="btn btn-default">Search exact match</button>
|
||||
</span>
|
||||
</div>
|
||||
<!-- /domain-search-block -->
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -64,6 +64,10 @@ $(function () {
|
||||
);
|
||||
},
|
||||
},
|
||||
{
|
||||
targets: "_all",
|
||||
render: $.fn.dataTable.render.text(),
|
||||
},
|
||||
],
|
||||
lengthMenu: [
|
||||
[10, 25, 50, 100, -1],
|
||||
@@ -71,6 +75,7 @@ $(function () {
|
||||
],
|
||||
order: [[0, "asc"]],
|
||||
stateSave: true,
|
||||
stateDuration: 0,
|
||||
stateSaveCallback: function (settings, data) {
|
||||
utils.stateSaveCallback("LocalCNAMETable", data);
|
||||
},
|
||||
@@ -81,6 +86,7 @@ $(function () {
|
||||
$(".deleteCustomCNAME").on("click", deleteCustomCNAME);
|
||||
},
|
||||
});
|
||||
|
||||
// Disable autocorrect in the search box
|
||||
var input = document.querySelector("input[type=search]");
|
||||
input.setAttribute("autocomplete", "off");
|
||||
|
||||
@@ -64,6 +64,10 @@ $(function () {
|
||||
);
|
||||
},
|
||||
},
|
||||
{
|
||||
targets: "_all",
|
||||
render: $.fn.dataTable.render.text(),
|
||||
},
|
||||
],
|
||||
lengthMenu: [
|
||||
[10, 25, 50, 100, -1],
|
||||
@@ -71,6 +75,7 @@ $(function () {
|
||||
],
|
||||
order: [[0, "asc"]],
|
||||
stateSave: true,
|
||||
stateDuration: 0,
|
||||
stateSaveCallback: function (settings, data) {
|
||||
utils.stateSaveCallback("LocalDNSTable", data);
|
||||
},
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
|
||||
/* global utils:false, Chart:false, moment:false */
|
||||
|
||||
var start__ = moment().subtract(6, "days");
|
||||
var start__ = moment().subtract(7, "days");
|
||||
var from = moment(start__).utc().valueOf() / 1000;
|
||||
var end__ = moment();
|
||||
var until = moment(end__).utc().valueOf() / 1000;
|
||||
@@ -15,6 +15,12 @@ var interval = 0;
|
||||
|
||||
var dateformat = "MMMM Do YYYY, HH:mm";
|
||||
|
||||
// get the database min timestamp
|
||||
var mintimestamp;
|
||||
$.getJSON("api_db.php?getMinTimestamp", function (ts) {
|
||||
mintimestamp = ts.mintimestamp * 1000 || 0; // return the timestamp in milliseconds or zero (in case of NaN)
|
||||
});
|
||||
|
||||
$(function () {
|
||||
$("#querytime").daterangepicker(
|
||||
{
|
||||
@@ -30,15 +36,15 @@ $(function () {
|
||||
moment().subtract(1, "days").startOf("day"),
|
||||
moment().subtract(1, "days").endOf("day"),
|
||||
],
|
||||
"Last 7 Days": [moment().subtract(6, "days"), moment()],
|
||||
"Last 30 Days": [moment().subtract(29, "days"), moment()],
|
||||
"Last 7 Days": [moment().subtract(7, "days"), moment()],
|
||||
"Last 30 Days": [moment().subtract(30, "days"), moment()],
|
||||
"This Month": [moment().startOf("month"), moment()],
|
||||
"Last Month": [
|
||||
moment().subtract(1, "month").startOf("month"),
|
||||
moment().subtract(1, "month").endOf("month"),
|
||||
],
|
||||
"This Year": [moment().startOf("year"), moment()],
|
||||
"All Time": [moment(0), moment()],
|
||||
"All Time": [moment(mintimestamp), moment()],
|
||||
},
|
||||
opens: "center",
|
||||
showDropdowns: true,
|
||||
@@ -69,19 +75,21 @@ function updateQueriesOverTime() {
|
||||
// Default displaying axis scaling
|
||||
timeLineChart.options.scales.xAxes[0].time.unit = "hour";
|
||||
|
||||
if (num * interval >= 6 * 29 * 24 * 60 * 60) {
|
||||
// If the requested data is more than 3 months, set ticks interval to quarterly
|
||||
// Xaxis scaling based on selected daterange
|
||||
if (num * interval > 4 * 365 * 24 * 60 * 60) {
|
||||
// If the requested data is more than 4 years, set ticks interval to year
|
||||
timeLineChart.options.scales.xAxes[0].time.unit = "year";
|
||||
} else if (num * interval >= 366 * 24 * 60 * 60) {
|
||||
// If the requested data is more than 1 year, set ticks interval to quarter
|
||||
timeLineChart.options.scales.xAxes[0].time.unit = "quarter";
|
||||
} else if (num * interval >= 3 * 29 * 24 * 60 * 60) {
|
||||
} else if (num * interval >= 92 * 24 * 60 * 60) {
|
||||
// If the requested data is more than 3 months, set ticks interval to months
|
||||
timeLineChart.options.scales.xAxes[0].time.unit = "month";
|
||||
}
|
||||
|
||||
if (num * interval >= 29 * 24 * 60 * 60) {
|
||||
// If the requested data is more than 1 month, set ticks interval to weeks
|
||||
} else if (num * interval >= 31 * 24 * 60 * 60) {
|
||||
// If the requested data is 1 month or more, set ticks interval to weeks
|
||||
timeLineChart.options.scales.xAxes[0].time.unit = "week";
|
||||
} else if (num * interval >= 6 * 24 * 60 * 60) {
|
||||
// If the requested data is more than 1 week, set ticks interval to days
|
||||
} else if (num * interval > 3 * 24 * 60 * 60) {
|
||||
// If the requested data is more than 3 days (72 hours), set ticks interval to days
|
||||
timeLineChart.options.scales.xAxes[0].time.unit = "day";
|
||||
}
|
||||
|
||||
@@ -152,6 +160,9 @@ $(function () {
|
||||
var ctx = document.getElementById("queryOverTimeChart").getContext("2d");
|
||||
var blockedColor = "#999";
|
||||
var permittedColor = "#00a65a";
|
||||
var gridColor = $(".graphs-grid").css("background-color");
|
||||
var ticksColor = $(".graphs-ticks").css("color");
|
||||
|
||||
timeLineChart = new Chart(ctx, {
|
||||
type: utils.getGraphType(),
|
||||
data: {
|
||||
@@ -286,10 +297,17 @@ $(function () {
|
||||
day: "MMM DD",
|
||||
week: "MMM DD",
|
||||
month: "MMM",
|
||||
quarter: "MMM",
|
||||
year: "YYYY MMM",
|
||||
quarter: "YYYY MMM",
|
||||
year: "YYYY",
|
||||
},
|
||||
},
|
||||
gridLines: {
|
||||
color: gridColor,
|
||||
zeroLineColor: gridColor,
|
||||
},
|
||||
ticks: {
|
||||
fontColor: ticksColor,
|
||||
},
|
||||
},
|
||||
],
|
||||
yAxes: [
|
||||
@@ -297,6 +315,10 @@ $(function () {
|
||||
stacked: true,
|
||||
ticks: {
|
||||
beginAtZero: true,
|
||||
fontColor: ticksColor,
|
||||
},
|
||||
gridLines: {
|
||||
color: gridColor,
|
||||
},
|
||||
},
|
||||
],
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
|
||||
/* global utils:false, moment:false */
|
||||
|
||||
var start__ = moment().subtract(6, "days");
|
||||
var start__ = moment().subtract(7, "days");
|
||||
var from = moment(start__).utc().valueOf() / 1000;
|
||||
var end__ = moment();
|
||||
var until = moment(end__).utc().valueOf() / 1000;
|
||||
@@ -32,8 +32,8 @@ $(function () {
|
||||
moment().subtract(1, "days").startOf("day"),
|
||||
moment().subtract(1, "days").endOf("day"),
|
||||
],
|
||||
"Last 7 Days": [moment().subtract(6, "days"), moment()],
|
||||
"Last 30 Days": [moment().subtract(29, "days"), moment()],
|
||||
"Last 7 Days": [moment().subtract(7, "days"), moment()],
|
||||
"Last 30 Days": [moment().subtract(30, "days"), moment()],
|
||||
"This Month": [moment().startOf("month"), moment()],
|
||||
"Last Month": [
|
||||
moment().subtract(1, "month").startOf("month"),
|
||||
@@ -140,7 +140,7 @@ function updateTopDomainsChart() {
|
||||
percentage.toFixed(1) +
|
||||
"% of " +
|
||||
sum +
|
||||
'"> <div class="progress-bar queries-blocked" style="width: ' +
|
||||
'"> <div class="progress-bar queries-permitted" style="width: ' +
|
||||
percentage +
|
||||
'%"></div> </div> </td> </tr> '
|
||||
);
|
||||
@@ -187,7 +187,7 @@ function updateTopAdsChart() {
|
||||
percentage.toFixed(1) +
|
||||
"% of " +
|
||||
sum +
|
||||
'"> <div class="progress-bar queries-permitted" style="width: ' +
|
||||
'"> <div class="progress-bar queries-blocked" style="width: ' +
|
||||
percentage +
|
||||
'%"></div> </div> </td> </tr> '
|
||||
);
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
|
||||
/* global moment:false, utils:false */
|
||||
|
||||
var start__ = moment().subtract(6, "days");
|
||||
var start__ = moment().subtract(7, "days");
|
||||
var from = moment(start__).utc().valueOf() / 1000;
|
||||
var end__ = moment();
|
||||
var until = moment(end__).utc().valueOf() / 1000;
|
||||
@@ -15,6 +15,8 @@ var instantquery = false;
|
||||
var daterange;
|
||||
|
||||
var timeoutWarning = $("#timeoutWarning");
|
||||
var reloadBox = $(".reload-box");
|
||||
var datepickerManuallySelected = false;
|
||||
|
||||
var dateformat = "MMMM Do YYYY, HH:mm";
|
||||
|
||||
@@ -50,8 +52,8 @@ $(function () {
|
||||
moment().subtract(1, "days").startOf("day"),
|
||||
moment().subtract(1, "days").endOf("day"),
|
||||
],
|
||||
"Last 7 Days": [moment().subtract(6, "days"), moment()],
|
||||
"Last 30 Days": [moment().subtract(29, "days"), moment()],
|
||||
"Last 7 Days": [moment().subtract(7, "days"), moment()],
|
||||
"Last 30 Days": [moment().subtract(30, "days"), moment()],
|
||||
"This Month": [moment().startOf("month"), moment()],
|
||||
"Last Month": [
|
||||
moment().subtract(1, "month").startOf("month"),
|
||||
@@ -175,6 +177,7 @@ var reloadCallback = function () {
|
||||
|
||||
function refreshTableData() {
|
||||
timeoutWarning.show();
|
||||
reloadBox.hide();
|
||||
var APIstring = "api_db.php?getAllQueries&from=" + from + "&until=" + until;
|
||||
// Check if query type filtering is enabled
|
||||
var queryType = getQueryTypes();
|
||||
@@ -340,8 +343,8 @@ $(function () {
|
||||
},
|
||||
},
|
||||
{ width: "10%" },
|
||||
{ width: "40%", render: $.fn.dataTable.render.text() },
|
||||
{ width: "20%", type: "ip-address", render: $.fn.dataTable.render.text() },
|
||||
{ width: "40%" },
|
||||
{ width: "20%", type: "ip-address" },
|
||||
{ width: "10%" },
|
||||
{ width: "5%" },
|
||||
],
|
||||
@@ -355,6 +358,10 @@ $(function () {
|
||||
data: null,
|
||||
defaultContent: "",
|
||||
},
|
||||
{
|
||||
targets: "_all",
|
||||
render: $.fn.dataTable.render.text(),
|
||||
},
|
||||
],
|
||||
initComplete: reloadCallback,
|
||||
});
|
||||
@@ -374,5 +381,16 @@ $(function () {
|
||||
|
||||
$("#querytime").on("apply.daterangepicker", function (ev, picker) {
|
||||
$(this).val(picker.startDate.format(dateformat) + " to " + picker.endDate.format(dateformat));
|
||||
datepickerManuallySelected = true;
|
||||
refreshTableData();
|
||||
});
|
||||
|
||||
$("input[id^=type]").change(function () {
|
||||
if (datepickerManuallySelected) {
|
||||
reloadBox.show();
|
||||
}
|
||||
});
|
||||
|
||||
$(".bt-reload").click(function () {
|
||||
refreshTableData();
|
||||
});
|
||||
|
||||
@@ -137,8 +137,12 @@ function initCheckboxRadioStyle() {
|
||||
|
||||
function applyCheckboxRadioStyle(style) {
|
||||
boxsheet.attr("href", getCheckboxURL(style));
|
||||
// Get all radio/checkboxes for theming, with the exception of the two radio buttons on the custom disable timer
|
||||
var sel = $("input[type='radio'],input[type='checkbox']").not("#selSec").not("#selMin");
|
||||
// Get all radio/checkboxes for theming, with the exception of the two radio buttons on the custom disable timer,
|
||||
// as well as every element with an id that starts with "status_"
|
||||
var sel = $("input[type='radio'],input[type='checkbox']")
|
||||
.not("#selSec")
|
||||
.not("#selMin")
|
||||
.not("[id^=status_]");
|
||||
sel.parent().removeClass();
|
||||
sel.parent().addClass("icheck-" + style);
|
||||
}
|
||||
|
||||
@@ -124,6 +124,16 @@ function initTable() {
|
||||
{ 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
|
||||
@@ -289,6 +299,7 @@ function initTable() {
|
||||
[10, 25, 50, 100, "All"],
|
||||
],
|
||||
stateSave: true,
|
||||
stateDuration: 0,
|
||||
stateSaveCallback: function (settings, data) {
|
||||
utils.stateSaveCallback("groups-adlists-table", data);
|
||||
},
|
||||
|
||||
@@ -97,6 +97,12 @@ function initTable() {
|
||||
{ data: "groups", searchable: false },
|
||||
{ data: "name", width: "80px", orderable: false },
|
||||
],
|
||||
columnDefs: [
|
||||
{
|
||||
targets: "_all",
|
||||
render: $.fn.dataTable.render.text(),
|
||||
},
|
||||
],
|
||||
drawCallback: function () {
|
||||
$('button[id^="deleteClient_"]').on("click", deleteClient);
|
||||
// Remove visible dropdown to prevent orphaning
|
||||
@@ -217,6 +223,7 @@ function initTable() {
|
||||
[10, 25, 50, 100, "All"],
|
||||
],
|
||||
stateSave: true,
|
||||
stateDuration: 0,
|
||||
stateSaveCallback: function (settings, data) {
|
||||
utils.stateSaveCallback("groups-clients-table", data);
|
||||
},
|
||||
|
||||
@@ -76,6 +76,12 @@ function initTable() {
|
||||
{ data: "groups", searchable: false, visible: showtype === "all" },
|
||||
{ data: null, width: "80px", orderable: false },
|
||||
],
|
||||
columnDefs: [
|
||||
{
|
||||
targets: "_all",
|
||||
render: $.fn.dataTable.render.text(),
|
||||
},
|
||||
],
|
||||
drawCallback: function () {
|
||||
$('button[id^="deleteDomain_"]').on("click", deleteDomain);
|
||||
// Remove visible dropdown to prevent orphaning
|
||||
@@ -246,6 +252,7 @@ function initTable() {
|
||||
[10, 25, 50, 100, "All"],
|
||||
],
|
||||
stateSave: true,
|
||||
stateDuration: 0,
|
||||
stateSaveCallback: function (settings, data) {
|
||||
utils.stateSaveCallback("groups-domains-table", data);
|
||||
},
|
||||
|
||||
@@ -27,6 +27,12 @@ $(function () {
|
||||
{ data: "description" },
|
||||
{ data: null, width: "60px", orderable: false },
|
||||
],
|
||||
columnDefs: [
|
||||
{
|
||||
targets: "_all",
|
||||
render: $.fn.dataTable.render.text(),
|
||||
},
|
||||
],
|
||||
drawCallback: function () {
|
||||
$('button[id^="deleteGroup_"]').on("click", deleteGroup);
|
||||
},
|
||||
@@ -86,6 +92,7 @@ $(function () {
|
||||
[10, 25, 50, 100, "All"],
|
||||
],
|
||||
stateSave: true,
|
||||
stateDuration: 0,
|
||||
stateSaveCallback: function (settings, data) {
|
||||
utils.stateSaveCallback("groups-table", data);
|
||||
},
|
||||
|
||||
@@ -919,6 +919,7 @@ $(function () {
|
||||
},
|
||||
gridLines: {
|
||||
color: gridColor,
|
||||
zeroLineColor: gridColor,
|
||||
},
|
||||
ticks: {
|
||||
fontColor: ticksColor,
|
||||
@@ -997,6 +998,7 @@ $(function () {
|
||||
},
|
||||
gridLines: {
|
||||
color: gridColor,
|
||||
zeroLineColor: gridColor,
|
||||
},
|
||||
ticks: {
|
||||
fontColor: ticksColor,
|
||||
|
||||
@@ -88,6 +88,40 @@ function renderMessage(data, type, row) {
|
||||
" seconds)"
|
||||
);
|
||||
|
||||
case "DNSMASQ_WARN":
|
||||
return "Warning in <code>dnsmasq</code> core:<pre>" + row.message + "</pre>";
|
||||
|
||||
case "LOAD":
|
||||
return (
|
||||
"Long-term load (15min avg) larger than number of processors: <strong>" +
|
||||
parseFloat(row.blob1).toFixed(1) +
|
||||
" > " +
|
||||
parseInt(row.blob2, 10) +
|
||||
"</strong><br>This may slow down DNS resolution and can cause bottlenecks."
|
||||
);
|
||||
|
||||
case "SHMEM":
|
||||
return (
|
||||
"RAM shortage (<code>" +
|
||||
utils.escapeHtml(row.message) +
|
||||
"</code>) ahead: <strong>" +
|
||||
parseInt(row.blob1, 10) +
|
||||
"% used</strong><pre>" +
|
||||
utils.escapeHtml(row.blob2) +
|
||||
"</pre>"
|
||||
);
|
||||
|
||||
case "DISK":
|
||||
return (
|
||||
"Disk shortage (<code>" +
|
||||
utils.escapeHtml(row.message) +
|
||||
"</code>) ahead: <strong>" +
|
||||
parseInt(row.blob1, 10) +
|
||||
"% used</strong><pre>" +
|
||||
utils.escapeHtml(row.blob2) +
|
||||
"</pre>"
|
||||
);
|
||||
|
||||
default:
|
||||
return "Unknown message type<pre>" + JSON.stringify(row) + "</pre>";
|
||||
}
|
||||
@@ -114,6 +148,12 @@ $(function () {
|
||||
{ data: "blob5", visible: false },
|
||||
{ data: null, width: "80px", orderable: false },
|
||||
],
|
||||
columnDefs: [
|
||||
{
|
||||
targets: "_all",
|
||||
render: $.fn.dataTable.render.text(),
|
||||
},
|
||||
],
|
||||
drawCallback: function () {
|
||||
$('button[id^="deleteMessage_"]').on("click", deleteMessage);
|
||||
// Remove visible dropdown to prevent orphaning
|
||||
@@ -141,6 +181,7 @@ $(function () {
|
||||
emptyTable: "No issues found.",
|
||||
},
|
||||
stateSave: true,
|
||||
stateDuration: 0,
|
||||
stateSaveCallback: function (settings, data) {
|
||||
utils.stateSaveCallback("messages-table", data);
|
||||
},
|
||||
|
||||
@@ -236,10 +236,10 @@ $(function () {
|
||||
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() },
|
||||
{ data: "name", width: "15%", render: $.fn.dataTable.render.text() },
|
||||
{ data: "ip", type: "ip-address", width: "10%" },
|
||||
{ data: "hwaddr", width: "10%" },
|
||||
{ data: "interface", width: "4%" },
|
||||
{ data: "name", width: "15%" },
|
||||
{
|
||||
data: "firstSeen",
|
||||
width: "8%",
|
||||
@@ -266,6 +266,7 @@ $(function () {
|
||||
{ data: "", width: "6%", orderable: false },
|
||||
{ data: "", width: "6%", orderable: false },
|
||||
],
|
||||
|
||||
drawCallback: function () {
|
||||
$('button[id^="deleteNetworkEntry_"]').on("click", deleteNetworkEntry);
|
||||
// Remove visible dropdown to prevent orphaning
|
||||
@@ -276,6 +277,7 @@ $(function () {
|
||||
[10, 25, 50, 100, "All"],
|
||||
],
|
||||
stateSave: true,
|
||||
stateDuration: 0,
|
||||
stateSaveCallback: function (settings, data) {
|
||||
utils.stateSaveCallback("network_table", data);
|
||||
},
|
||||
@@ -288,6 +290,10 @@ $(function () {
|
||||
data: null,
|
||||
defaultContent: "",
|
||||
},
|
||||
{
|
||||
targets: "_all",
|
||||
render: $.fn.dataTable.render.text(),
|
||||
},
|
||||
],
|
||||
});
|
||||
// Disable autocorrect in the search box
|
||||
|
||||
@@ -183,7 +183,7 @@ $(function () {
|
||||
case "10":
|
||||
fieldtext =
|
||||
"<span class='text-red'>Blocked <br class='hidden-lg'>(regex blacklist, CNAME)</span>";
|
||||
|
||||
blocked = true;
|
||||
if (data.length > 9 && data[9] > 0) {
|
||||
regexLink = true;
|
||||
}
|
||||
@@ -323,8 +323,8 @@ $(function () {
|
||||
},
|
||||
},
|
||||
{ width: "4%" },
|
||||
{ width: "36%", render: $.fn.dataTable.render.text() },
|
||||
{ width: "8%", type: "ip-address", render: $.fn.dataTable.render.text() },
|
||||
{ width: "36%" },
|
||||
{ width: "8%", type: "ip-address" },
|
||||
{ width: "14%", orderData: 4 },
|
||||
{ width: "8%", orderData: 5 },
|
||||
{ width: "10%", orderData: 4 },
|
||||
@@ -334,6 +334,7 @@ $(function () {
|
||||
[10, 25, 50, 100, "All"],
|
||||
],
|
||||
stateSave: true,
|
||||
stateDuration: 0,
|
||||
stateSaveCallback: function (settings, data) {
|
||||
utils.stateSaveCallback("query_log_table", data);
|
||||
},
|
||||
@@ -346,6 +347,10 @@ $(function () {
|
||||
data: null,
|
||||
defaultContent: "",
|
||||
},
|
||||
{
|
||||
targets: "_all",
|
||||
render: $.fn.dataTable.render.text(),
|
||||
},
|
||||
],
|
||||
initComplete: function () {
|
||||
var api = this.api();
|
||||
|
||||
@@ -88,7 +88,7 @@ function eventsource() {
|
||||
}
|
||||
|
||||
// Handle enter key
|
||||
$("#domain_1, #domain_2").keypress(function (e) {
|
||||
$("#domain").keypress(function (e) {
|
||||
if (e.which === 13) {
|
||||
// Enter was pressed, and the input has focus
|
||||
exact = "";
|
||||
|
||||
@@ -216,13 +216,20 @@ $(function () {
|
||||
if (document.getElementById("DHCPLeasesTable")) {
|
||||
leasetable = $("#DHCPLeasesTable").DataTable({
|
||||
dom: "<'row'<'col-sm-12'tr>><'row'<'col-sm-6'i><'col-sm-6'f>>",
|
||||
columnDefs: [{ bSortable: false, orderable: false, targets: -1 }],
|
||||
columnDefs: [
|
||||
{ bSortable: false, orderable: false, targets: -1 },
|
||||
{
|
||||
targets: [0, 1, 2],
|
||||
render: $.fn.dataTable.render.text(),
|
||||
},
|
||||
],
|
||||
paging: false,
|
||||
scrollCollapse: true,
|
||||
scrollY: "200px",
|
||||
scrollX: true,
|
||||
order: [[2, "asc"]],
|
||||
stateSave: true,
|
||||
stateDuration: 0,
|
||||
stateSaveCallback: function (settings, data) {
|
||||
utils.stateSaveCallback("activeDhcpLeaseTable", data);
|
||||
},
|
||||
@@ -235,7 +242,13 @@ $(function () {
|
||||
if (document.getElementById("DHCPStaticLeasesTable")) {
|
||||
staticleasetable = $("#DHCPStaticLeasesTable").DataTable({
|
||||
dom: "<'row'<'col-sm-12'tr>><'row'<'col-sm-12'i>>",
|
||||
columnDefs: [{ bSortable: false, orderable: false, targets: -1 }],
|
||||
columnDefs: [
|
||||
{ bSortable: false, orderable: false, targets: -1 },
|
||||
{
|
||||
targets: [0, 1, 2],
|
||||
render: $.fn.dataTable.render.text(),
|
||||
},
|
||||
],
|
||||
paging: false,
|
||||
scrollCollapse: true,
|
||||
scrollY: "200px",
|
||||
|
||||
@@ -187,6 +187,10 @@
|
||||
<meta name="theme-color" content="#272c30">
|
||||
<?php } elseif ($theme == "default-darker") { ?>
|
||||
<meta name="theme-color" content="#2e6786">
|
||||
<?php } elseif ($theme == "lcars") { ?>
|
||||
<meta name="theme-color" content="#4488FF">
|
||||
<link rel="stylesheet" href="style/vendor/fonts/ubuntu-mono/ubuntu-mono.css?v=<?=$cacheVer?>">
|
||||
<link rel="stylesheet" href="style/vendor/fonts/antonio/antonio.css?v=<?=$cacheVer?>">
|
||||
<?php } ?>
|
||||
|
||||
<?php if ($darkmode) { ?>
|
||||
@@ -259,7 +263,7 @@ if($auth) {
|
||||
<ul class="nav navbar-nav">
|
||||
<li id="pihole-diagnosis" class="hidden">
|
||||
<a href="messages.php">
|
||||
<i class="fa fa-exclamation-triangle"></i>
|
||||
<i class="fa fa-exclamation-triangle fa-2x icon-bounce"></i>
|
||||
<span class="label label-warning" id="pihole-diagnosis-count"></span>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
@@ -209,10 +209,19 @@ function addStaticDHCPLease($mac, $ip, $hostname) {
|
||||
{
|
||||
foreach(["v4_1", "v4_2", "v6_1", "v6_2"] as $type)
|
||||
{
|
||||
if(@array_key_exists("DNSserver".str_replace(".","_",$value[$type]),$_POST))
|
||||
{
|
||||
array_push($DNSservers,$value[$type]);
|
||||
}
|
||||
// Skip if this IP type does not
|
||||
// exist (e.g. IPv4-only or only
|
||||
// one IPv6 address upstream
|
||||
// server)
|
||||
if(!array_key_exists($type, $value))
|
||||
continue;
|
||||
|
||||
// If server exists and is set
|
||||
// (POST), we add it to the
|
||||
// array of DNS servers
|
||||
$server = str_replace(".", "_", $value[$type]);
|
||||
if(array_key_exists("DNSserver".$server, $_POST))
|
||||
array_push($DNSservers, $value[$type]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -439,26 +448,12 @@ function addStaticDHCPLease($mac, $ip, $hostname) {
|
||||
if(isset($_POST["querylog-permitted"]) && isset($_POST["querylog-blocked"]))
|
||||
{
|
||||
pihole_execute("-a setquerylog all");
|
||||
if(!isset($_POST["privacyMode"]))
|
||||
{
|
||||
$success .= "All entries will be shown in Query Log";
|
||||
}
|
||||
else
|
||||
{
|
||||
$success .= "Only blocked entries will be shown in Query Log";
|
||||
}
|
||||
$success .= "All entries will be shown in Query Log";
|
||||
}
|
||||
elseif(isset($_POST["querylog-permitted"]))
|
||||
{
|
||||
pihole_execute("-a setquerylog permittedonly");
|
||||
if(!isset($_POST["privacyMode"]))
|
||||
{
|
||||
$success .= "Only permitted will be shown in Query Log";
|
||||
}
|
||||
else
|
||||
{
|
||||
$success .= "No entries will be shown in Query Log";
|
||||
}
|
||||
$success .= "Only permitted will be shown in Query Log";
|
||||
}
|
||||
elseif(isset($_POST["querylog-blocked"]))
|
||||
{
|
||||
@@ -471,17 +466,6 @@ function addStaticDHCPLease($mac, $ip, $hostname) {
|
||||
$success .= "No entries will be shown in Query Log";
|
||||
}
|
||||
|
||||
|
||||
if(isset($_POST["privacyMode"]))
|
||||
{
|
||||
pihole_execute("-a privacymode true");
|
||||
$success .= " (privacy mode enabled)";
|
||||
}
|
||||
else
|
||||
{
|
||||
pihole_execute("-a privacymode false");
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case "webUI":
|
||||
|
||||
@@ -18,6 +18,8 @@ $available_themes["default-dark"] = array("Pi-hole midnight theme (dark)", true,
|
||||
$available_themes["default-darker"] = array("Pi-hole deep-midnight theme (dark)", true, "default-darker");
|
||||
// Option to have the theme go with the device dark mode setting, always set the background to black to avoid flashing
|
||||
$available_themes["default-auto"] = array("Pi-hole auto theme (light/dark)", true, "default-auto");
|
||||
$available_themes["lcars"] = array("Star Trek LCARS theme (dark)", true, "lcars");
|
||||
|
||||
|
||||
$webtheme = "";
|
||||
// Try to load theme settings from setupVars.conf
|
||||
|
||||
+2
-9
@@ -185,13 +185,6 @@ if (isset($setupVars["API_QUERY_LOG_SHOW"])) {
|
||||
$queryLog = "all";
|
||||
}
|
||||
|
||||
// Privacy Mode
|
||||
if (isset($setupVars["API_PRIVACY_MODE"])) {
|
||||
$privacyMode = $setupVars["API_PRIVACY_MODE"];
|
||||
} else {
|
||||
$privacyMode = false;
|
||||
}
|
||||
|
||||
?>
|
||||
|
||||
<?php
|
||||
@@ -931,7 +924,7 @@ if (isset($_GET['tab']) && in_array($_GET['tab'], array("sysadmin", "dns", "piho
|
||||
whereas an even wider network of 10.0.0.1 - 10.255.255.255 results in <code>10.0.0.0/8</code>.
|
||||
Setting up IPv6 ranges is exactly similar to setting up IPv4 here and fully supported.
|
||||
Feel free to reach out to us on our
|
||||
<a href="https://discourse.pi-hole.net" target="_blank">Discourse forum</a>
|
||||
<a href="https://discourse.pi-hole.net" rel="noopener" target="_blank">Discourse forum</a>
|
||||
in case you need any assistance setting up local host name resolution for your particular system.</p>
|
||||
<p>You can also specify a local domain name (like <code>fritz.box</code>) to ensure queries to
|
||||
devices ending in your local domain name will not leave your network, however, this is optional.
|
||||
@@ -947,7 +940,7 @@ if (isset($_GET['tab']) && in_array($_GET['tab'], array("sysadmin", "dns", "piho
|
||||
<div class="input-group">
|
||||
<table class="table table-bordered">
|
||||
<tr>
|
||||
<th>Local network in <a href="https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing" target="_blank">CIDR notation</a></th>
|
||||
<th>Local network in <a href="https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing" rel="noopener" target="_blank">CIDR notation</a></th>
|
||||
<th>IP address of your DHCP server (router)</th>
|
||||
<th>Local domain name (optional)</th>
|
||||
</tr>
|
||||
|
||||
+65
-1
@@ -339,7 +339,7 @@
|
||||
/*** Icons grow on hover, but remain centered ***/
|
||||
.small-box:hover .icon {
|
||||
font-size: 90px; /* keep the same font-size, to avoid shifting the position */
|
||||
transform: scale(106%);
|
||||
transform: scale(1.06);
|
||||
}
|
||||
|
||||
.list-status-0 {
|
||||
@@ -378,6 +378,70 @@ td.details-control {
|
||||
background-color: rgb(70, 149, 74, 0.1);
|
||||
}
|
||||
|
||||
.reload-box {
|
||||
display: none;
|
||||
}
|
||||
.reload-box div {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
}
|
||||
.reload-box span {
|
||||
padding-right: 20px;
|
||||
}
|
||||
|
||||
@media screen and (max-width: 991px) {
|
||||
#domain-search-block {
|
||||
display: block;
|
||||
}
|
||||
#domain {
|
||||
margin: 5px 0;
|
||||
}
|
||||
#domain-search-block .input-group-btn {
|
||||
margin: 5px 0;
|
||||
text-align: center;
|
||||
}
|
||||
#domain-search-block .input-group-btn button {
|
||||
margin: 0 2px;
|
||||
border-radius: 3px;
|
||||
}
|
||||
}
|
||||
|
||||
/* Fix the icon position (login password field) */
|
||||
.form-control-feedback {
|
||||
right: 12px;
|
||||
}
|
||||
|
||||
.icon-bounce {
|
||||
display: inline-block;
|
||||
position: relative;
|
||||
animation: icon-bounce 1.5s infinite linear;
|
||||
}
|
||||
|
||||
@keyframes icon-bounce {
|
||||
0%,
|
||||
20%,
|
||||
50%,
|
||||
70%,
|
||||
90%,
|
||||
100% {
|
||||
transform: translateY(0);
|
||||
}
|
||||
40% {
|
||||
transform: translateY(-15px);
|
||||
}
|
||||
60% {
|
||||
transform: translateY(-8px);
|
||||
}
|
||||
80% {
|
||||
transform: translateY(-4px);
|
||||
}
|
||||
}
|
||||
|
||||
.navbar-nav {
|
||||
height: 50px;
|
||||
}
|
||||
|
||||
.eyeConWrapper {
|
||||
font-size: 17px;
|
||||
}
|
||||
|
||||
@@ -95,9 +95,11 @@ h4 {
|
||||
border-left: 3px solid transparent;
|
||||
}
|
||||
.sidebar-menu > li:hover > a,
|
||||
.sidebar-menu > li > a:focus,
|
||||
.sidebar-menu > li.active > a {
|
||||
color: #fff;
|
||||
background-color: #22272a;
|
||||
border-color: #3c8dbc;
|
||||
}
|
||||
.sidebar-menu > li > .treeview-menu {
|
||||
margin: 0 1px;
|
||||
@@ -113,7 +115,8 @@ h4 {
|
||||
color: #949fa8;
|
||||
}
|
||||
.treeview-menu > li.active > a,
|
||||
.treeview-menu > li > a:hover {
|
||||
.treeview-menu > li > a:hover,
|
||||
.treeview-menu > li > a:focus {
|
||||
color: #fff;
|
||||
}
|
||||
.sidebar-form {
|
||||
@@ -275,6 +278,9 @@ h4 {
|
||||
.nav-tabs-custom > .nav-tabs > li > a {
|
||||
color: #bec5cb;
|
||||
}
|
||||
.nav-tabs-custom > .nav-tabs > li > a:focus {
|
||||
background: #404850;
|
||||
}
|
||||
.list-group {
|
||||
color: #bec5cb;
|
||||
background-color: #272c30;
|
||||
|
||||
+143
-392
File diff suppressed because one or more lines are too long
@@ -71,6 +71,7 @@
|
||||
border-left: 3px solid transparent;
|
||||
}
|
||||
.sidebar-menu > li:hover > a,
|
||||
.sidebar-menu > li > a:focus,
|
||||
.sidebar-menu > li.active > a {
|
||||
color: #fff;
|
||||
background-color: #1e282c;
|
||||
@@ -90,7 +91,8 @@
|
||||
color: #8aa4af;
|
||||
}
|
||||
.treeview-menu > li.active > a,
|
||||
.treeview-menu > li > a:hover {
|
||||
.treeview-menu > li > a:hover,
|
||||
.treeview-menu > li > a:focus {
|
||||
color: #fff;
|
||||
}
|
||||
.sidebar-form {
|
||||
@@ -128,6 +130,10 @@
|
||||
border-bottom-right-radius: 2px;
|
||||
border-bottom-left-radius: 0;
|
||||
}
|
||||
.nav-tabs-custom > .nav-tabs > li > a:focus {
|
||||
color: #60a4cc;
|
||||
}
|
||||
|
||||
.layout-top-nav .main-header > .logo {
|
||||
background-color: #3c8dbc;
|
||||
color: #fff;
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+32
@@ -0,0 +1,32 @@
|
||||
/* antonio-100 - latin-ext_latin */
|
||||
@font-face {
|
||||
font-family: 'Antonio';
|
||||
font-style: normal;
|
||||
font-weight: 100;
|
||||
font-display: swap;
|
||||
src: local('Antonio Light'),
|
||||
url('antonio-v1-latin-ext_latin-100.woff2') format('woff2'), /* Super Modern Browsers */
|
||||
url('antonio-v1-latin-ext_latin-100.woff') format('woff') /* Modern Browsers */
|
||||
}
|
||||
|
||||
/* antonio-regular - latin-ext_latin */
|
||||
@font-face {
|
||||
font-family: 'Antonio';
|
||||
font-style: normal;
|
||||
font-weight: 400;
|
||||
font-display: swap;
|
||||
src: local('Antonio'),
|
||||
url('antonio-v1-latin-ext_latin-regular.woff2') format('woff2'), /* Super Modern Browsers */
|
||||
url('antonio-v1-latin-ext_latin-regular.woff') format('woff') /* Modern Browsers */
|
||||
}
|
||||
|
||||
/* antonio-700 - latin-ext_latin */
|
||||
@font-face {
|
||||
font-family: 'Antonio';
|
||||
font-style: normal;
|
||||
font-weight: 700;
|
||||
font-display: swap;
|
||||
src: local('Antonio Bold'),
|
||||
url('antonio-v1-latin-ext_latin-700.woff2') format('woff2'), /* Super Modern Browsers */
|
||||
url('antonio-v1-latin-ext_latin-700.woff') format('woff') /* Modern Browsers */
|
||||
}
|
||||
Binary file not shown.
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+43
@@ -0,0 +1,43 @@
|
||||
/* ubuntu-mono-regular - latin-ext_latin */
|
||||
@font-face {
|
||||
font-family: 'Ubuntu Mono';
|
||||
font-style: normal;
|
||||
font-weight: 400;
|
||||
font-display: swap;
|
||||
src: local(''),
|
||||
url('ubuntu-mono-v10-latin-ext_latin-regular.woff2') format('woff2'), /* Super Modern Browsers */
|
||||
url('ubuntu-mono-v10-latin-ext_latin-regular.woff') format('woff') /* Modern Browsers */
|
||||
}
|
||||
|
||||
/* ubuntu-mono-italic - latin-ext_latin */
|
||||
@font-face {
|
||||
font-family: 'Ubuntu Mono';
|
||||
font-style: italic;
|
||||
font-weight: 400;
|
||||
font-display: swap;
|
||||
src: local(''),
|
||||
url('ubuntu-mono-v10-latin-ext_latin-italic.woff2') format('woff2'), /* Super Modern Browsers */
|
||||
url('ubuntu-mono-v10-latin-ext_latin-italic.woff') format('woff') /* Modern Browsers */
|
||||
}
|
||||
|
||||
/* ubuntu-mono-700 - latin-ext_latin */
|
||||
@font-face {
|
||||
font-family: 'Ubuntu Mono';
|
||||
font-style: normal;
|
||||
font-weight: 700;
|
||||
font-display: swap;
|
||||
src: local(''),
|
||||
url('ubuntu-mono-v10-latin-ext_latin-700.woff2') format('woff2'), /* Super Modern Browsers */
|
||||
url('ubuntu-mono-v10-latin-ext_latin-700.woff') format('woff') /* Modern Browsers */
|
||||
}
|
||||
|
||||
/* ubuntu-mono-700italic - latin-ext_latin */
|
||||
@font-face {
|
||||
font-family: 'Ubuntu Mono';
|
||||
font-style: italic;
|
||||
font-weight: 700;
|
||||
font-display: swap;
|
||||
src: local(''),
|
||||
url('ubuntu-mono-v10-latin-ext_latin-700italic.woff2') format('woff2'), /* Super Modern Browsers */
|
||||
url('ubuntu-mono-v10-latin-ext_latin-700italic.woff') format('woff') /* Modern Browsers */
|
||||
}
|
||||
Reference in New Issue
Block a user