From ddedce167192d5709c669b15a2b6f84e1f627997 Mon Sep 17 00:00:00 2001 From: Michael Kaufmann Date: Mon, 12 Sep 2022 21:52:32 +0200 Subject: [PATCH] more work on traffic and npm dependencies update Signed-off-by: Michael Kaufmann --- lib/Froxlor/PhpHelper.php | 38 +----------- lib/Froxlor/Traffic/Traffic.php | 50 ++++++++-------- package-lock.json | 74 ++++++++++++------------ package.json | 10 ++-- templates/Froxlor/src/js/main.js | 5 +- templates/Froxlor/user/traffic.html.twig | 55 +++++++++++++----- 6 files changed, 114 insertions(+), 118 deletions(-) diff --git a/lib/Froxlor/PhpHelper.php b/lib/Froxlor/PhpHelper.php index adfe9f78..82dc70a9 100644 --- a/lib/Froxlor/PhpHelper.php +++ b/lib/Froxlor/PhpHelper.php @@ -208,32 +208,12 @@ class PhpHelper } } - public static function loadConfigArrayDir() + public static function loadConfigArrayDir(...$configdirs) { - // we now use dynamic function parameters - // so we can read from more than one directory - // and still be valid for old calls - $numargs = func_num_args(); - if ($numargs <= 0) { + if (count($configdirs) <= 0) { return null; } - // variable that holds all dirs that will - // be parsed for inclusion - $configdirs = []; - // if one of the parameters is an array - // we assume that this is a list of - // setting-groups to be selected - $selection = null; - for ($x = 0; $x < $numargs; $x++) { - $arg = func_get_arg($x); - if (is_array($arg) && isset($arg[0])) { - $selection = $arg; - } else { - $configdirs[] = $arg; - } - } - $data = []; $data_files = []; $has_data = false; @@ -257,20 +237,6 @@ class PhpHelper } } - // if we have specific setting-groups - // to select, we'll handle this here - // (this is for multiserver-client settings) - $_data = []; - if ($selection != null && is_array($selection) && isset($selection[0])) { - $_data['groups'] = []; - foreach ($data['groups'] as $group => $data) { - if (in_array($group, $selection)) { - $_data['groups'][$group] = $data; - } - } - $data = $_data; - } - return $data; } diff --git a/lib/Froxlor/Traffic/Traffic.php b/lib/Froxlor/Traffic/Traffic.php index 48d4f525..e992334b 100644 --- a/lib/Froxlor/Traffic/Traffic.php +++ b/lib/Froxlor/Traffic/Traffic.php @@ -44,6 +44,7 @@ class Traffic $users = []; $years = []; $months = []; + $days = []; foreach ($trafficCollection['data']['list'] as $item) { // per user total $users[$item['customerid']]['loginname'] = $item['customer']['loginname']; @@ -52,15 +53,20 @@ class Traffic $users[$item['customerid']]['ftp'] += ($item['ftp_up'] + $item['ftp_down']); $users[$item['customerid']]['mail'] += $item['mail']; // per year - $years[$item['year']]['total']['total'] += ($item['http'] + $item['ftp_up'] + $item['ftp_down'] + $item['mail']); - $years[$item['year']]['total']['http'] += $item['http']; - $years[$item['year']]['total']['ftp'] += ($item['ftp_up'] + $item['ftp_down']); - $years[$item['year']]['total']['mail'] += $item['mail']; + $years[$item['year']]['total'] += ($item['http'] + $item['ftp_up'] + $item['ftp_down'] + $item['mail']); + $years[$item['year']]['http'] += $item['http']; + $years[$item['year']]['ftp'] += ($item['ftp_up'] + $item['ftp_down']); + $years[$item['year']]['mail'] += $item['mail']; // per month - $months[$item['year']][$item['month']]['total'] += ($item['http'] + $item['ftp_up'] + $item['ftp_down'] + $item['mail']); - $months[$item['year']][$item['month']]['http'] += $item['http']; - $months[$item['year']][$item['month']]['ftp'] += ($item['ftp_up'] + $item['ftp_down']); - $months[$item['year']][$item['month']]['mail'] += $item['mail']; + $months[$item['month'].'/'.$item['year']]['total'] += ($item['http'] + $item['ftp_up'] + $item['ftp_down'] + $item['mail']); + $months[$item['month'].'/'.$item['year']]['http'] += $item['http']; + $months[$item['month'].'/'.$item['year']]['ftp'] += ($item['ftp_up'] + $item['ftp_down']); + $months[$item['month'].'/'.$item['year']]['mail'] += $item['mail']; + // per day + $days[$item['day'].'.'.$item['month'].'.'.$item['year']]['total'] += ($item['http'] + $item['ftp_up'] + $item['ftp_down'] + $item['mail']); + $days[$item['day'].'.'.$item['month'].'.'.$item['year']]['http'] += $item['http']; + $days[$item['day'].'.'.$item['month'].'.'.$item['year']]['ftp'] += ($item['ftp_up'] + $item['ftp_down']); + $days[$item['day'].'.'.$item['month'].'.'.$item['year']]['mail'] += $item['mail']; } // calculate overview for given range from users @@ -73,7 +79,7 @@ class Traffic } // get all possible years for filter - $sel_stmt = Database::prepare("SELECT DISTINCT year FROM `".TABLE_PANEL_TRAFFIC."` WHERE 1 ORDER BY `year` DESC"); + $sel_stmt = Database::prepare("SELECT DISTINCT year FROM `" . TABLE_PANEL_TRAFFIC . "` WHERE 1 ORDER BY `year` DESC"); Database::pexecute($sel_stmt); $years_avail = $sel_stmt->fetchAll(\PDO::FETCH_ASSOC); @@ -82,6 +88,7 @@ class Traffic 'users' => $users, 'years' => $years, 'months' => $months, + 'days' => $days, 'range' => $range, 'years_avail' => $years_avail ]; @@ -93,25 +100,20 @@ class Traffic if (preg_match("/year:([0-9]{4})/", $range, $matches)) { $dateParams = ['year' => $matches[1]]; - } - elseif (preg_match("/months:([1-9]([0-9]+)?)/", $range, $matches)) { - $dt = (new \DateTime())->sub(new \DateInterval('P'.$matches[1].'M'))->format('U'); + } elseif (preg_match("/months:([1-9]([0-9]+)?)/", $range, $matches)) { + $dt = (new \DateTime())->sub(new \DateInterval('P' . $matches[1] . 'M'))->format('U'); $dateParams = ['date_from' => $dt]; - } - elseif (preg_match("/days:([1-9]([0-9]+)?)/", $range, $matches)) { - $dt = (new \DateTime())->sub(new \DateInterval('P'.$matches[1].'D'))->format('U'); + } elseif (preg_match("/days:([1-9]([0-9]+)?)/", $range, $matches)) { + $dt = (new \DateTime())->sub(new \DateInterval('P' . $matches[1] . 'D'))->format('U'); $dateParams = ['date_from' => $dt]; - } - elseif (preg_match("/hours:([1-9]([0-9]+)?)/", $range, $matches)) { - $dt = (new \DateTime())->sub(new \DateInterval('PT'.$matches[1].'H'))->format('U'); + } elseif (preg_match("/hours:([1-9]([0-9]+)?)/", $range, $matches)) { + $dt = (new \DateTime())->sub(new \DateInterval('PT' . $matches[1] . 'H'))->format('U'); $dateParams = ['date_from' => $dt]; - } - elseif (preg_match("/currentmonth/", $range, $matches)) { - $dt = (new \DateTime("first day of this month"))->setTime(0,0,0,1)->format('U'); + } elseif (preg_match("/currentmonth/", $range, $matches)) { + $dt = (new \DateTime("first day of this month"))->setTime(0, 0, 0, 1)->format('U'); $dateParams = ['date_from' => $dt]; - } - elseif (preg_match("/currentyear/", $range, $matches)) { - $dt = \DateTime::createFromFormat("d.m.Y", '01.01.'.date('Y'))->setTime(0,0,0,1)->format('U'); + } elseif (preg_match("/currentyear/", $range, $matches)) { + $dt = \DateTime::createFromFormat("d.m.Y", '01.01.' . date('Y'))->setTime(0, 0, 0, 1)->format('U'); $dateParams = ['date_from' => $dt]; } diff --git a/package-lock.json b/package-lock.json index cf8ffbec..313de3b7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,11 +5,11 @@ "packages": { "": { "dependencies": { - "@fortawesome/fontawesome-free": "^6.0.0", - "@popperjs/core": "^2.11.2", - "bootstrap": "^5.1.3", - "chart.js": "^3.7.1", - "jquery": "^3.6.0" + "@fortawesome/fontawesome-free": "^6.2.0", + "@popperjs/core": "^2.11.6", + "bootstrap": "^5.2.1", + "chart.js": "^3.9.1", + "jquery": "^3.6.1" }, "devDependencies": { "laravel-mix": "^6.0.42", @@ -2609,9 +2609,9 @@ } }, "node_modules/autoprefixer": { - "version": "10.4.8", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.8.tgz", - "integrity": "sha512-75Jr6Q/XpTqEf6D2ltS5uMewJIx5irCU1oBYJrWjFenq/m12WRRrz6g15L1EIoYvPLXTbEry7rDOwrcYNj77xw==", + "version": "10.4.9", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.9.tgz", + "integrity": "sha512-Uu67eduPEmOeA0vyJby5ghu1AAELCCNSsLAjK+lz6kYzNM5sqnBO36MqfsjhPjQF/BaJM5U/UuFYyl7PavY/wQ==", "dev": true, "funding": [ { @@ -2625,7 +2625,7 @@ ], "dependencies": { "browserslist": "^4.21.3", - "caniuse-lite": "^1.0.30001373", + "caniuse-lite": "^1.0.30001394", "fraction.js": "^4.2.0", "normalize-range": "^0.1.2", "picocolors": "^1.0.0", @@ -3103,9 +3103,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001393", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001393.tgz", - "integrity": "sha512-N/od11RX+Gsk+1qY/jbPa0R6zJupEa0lxeBG598EbrtblxVCTJsQwbRBm6+V+rxpc5lHKdsXb9RY83cZIPLseA==", + "version": "1.0.30001397", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001397.tgz", + "integrity": "sha512-SW9N2TbCdLf0eiNDRrrQXx2sOkaakNZbCjgNpPyMJJbiOrU5QzMIrXOVMRM1myBXTD5iTkdrtU/EguCrBocHlA==", "dev": true, "funding": [ { @@ -4061,9 +4061,9 @@ "dev": true }, "node_modules/electron-to-chromium": { - "version": "1.4.244", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.244.tgz", - "integrity": "sha512-E21saXLt2eTDaTxgUtiJtBUqanF9A32wZasAwDZ8gvrqXoxrBrbwtDCx7c/PQTLp81wj4X0OLDeoGQg7eMo3+w==", + "version": "1.4.247", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.247.tgz", + "integrity": "sha512-FLs6R4FQE+1JHM0hh3sfdxnYjKvJpHZyhQDjc2qFq/xFvmmRt/TATNToZhrcGUFzpF2XjeiuozrA8lI0PZmYYw==", "dev": true }, "node_modules/elliptic": { @@ -4383,9 +4383,9 @@ "dev": true }, "node_modules/fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -8448,9 +8448,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.7.tgz", - "integrity": "sha512-iN/XYesmZ2RmmWAiI4Z5rq0YqSiv0brj9Ce9CfhNE4xIW2h+MFxcgkxIzZ+ShkFPUkjU3gQ+3oypadD3RAMtrg==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.8.tgz", + "integrity": "sha512-GHg7C4M7oJSJYW/ED/5QOJ7nL/E0lwTOBGsOorA7jqHr8ExUhPfwAotIAmdSw/LWv3SMLSNpzTAgeLG9zaZKTA==", "dev": true, "funding": [ { @@ -11119,13 +11119,13 @@ } }, "autoprefixer": { - "version": "10.4.8", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.8.tgz", - "integrity": "sha512-75Jr6Q/XpTqEf6D2ltS5uMewJIx5irCU1oBYJrWjFenq/m12WRRrz6g15L1EIoYvPLXTbEry7rDOwrcYNj77xw==", + "version": "10.4.9", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.9.tgz", + "integrity": "sha512-Uu67eduPEmOeA0vyJby5ghu1AAELCCNSsLAjK+lz6kYzNM5sqnBO36MqfsjhPjQF/BaJM5U/UuFYyl7PavY/wQ==", "dev": true, "requires": { "browserslist": "^4.21.3", - "caniuse-lite": "^1.0.30001373", + "caniuse-lite": "^1.0.30001394", "fraction.js": "^4.2.0", "normalize-range": "^0.1.2", "picocolors": "^1.0.0", @@ -11497,9 +11497,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001393", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001393.tgz", - "integrity": "sha512-N/od11RX+Gsk+1qY/jbPa0R6zJupEa0lxeBG598EbrtblxVCTJsQwbRBm6+V+rxpc5lHKdsXb9RY83cZIPLseA==", + "version": "1.0.30001397", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001397.tgz", + "integrity": "sha512-SW9N2TbCdLf0eiNDRrrQXx2sOkaakNZbCjgNpPyMJJbiOrU5QzMIrXOVMRM1myBXTD5iTkdrtU/EguCrBocHlA==", "dev": true }, "chalk": { @@ -12229,9 +12229,9 @@ "dev": true }, "electron-to-chromium": { - "version": "1.4.244", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.244.tgz", - "integrity": "sha512-E21saXLt2eTDaTxgUtiJtBUqanF9A32wZasAwDZ8gvrqXoxrBrbwtDCx7c/PQTLp81wj4X0OLDeoGQg7eMo3+w==", + "version": "1.4.247", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.247.tgz", + "integrity": "sha512-FLs6R4FQE+1JHM0hh3sfdxnYjKvJpHZyhQDjc2qFq/xFvmmRt/TATNToZhrcGUFzpF2XjeiuozrA8lI0PZmYYw==", "dev": true }, "elliptic": { @@ -12489,9 +12489,9 @@ "dev": true }, "fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", "dev": true, "requires": { "@nodelib/fs.stat": "^2.0.2", @@ -15463,9 +15463,9 @@ "dev": true }, "update-browserslist-db": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.7.tgz", - "integrity": "sha512-iN/XYesmZ2RmmWAiI4Z5rq0YqSiv0brj9Ce9CfhNE4xIW2h+MFxcgkxIzZ+ShkFPUkjU3gQ+3oypadD3RAMtrg==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.8.tgz", + "integrity": "sha512-GHg7C4M7oJSJYW/ED/5QOJ7nL/E0lwTOBGsOorA7jqHr8ExUhPfwAotIAmdSw/LWv3SMLSNpzTAgeLG9zaZKTA==", "dev": true, "requires": { "escalade": "^3.1.1", diff --git a/package.json b/package.json index 0488798e..713c0cbe 100644 --- a/package.json +++ b/package.json @@ -16,10 +16,10 @@ "sass-loader": "^12.5.0" }, "dependencies": { - "@fortawesome/fontawesome-free": "^6.0.0", - "@popperjs/core": "^2.11.2", - "bootstrap": "^5.1.3", - "chart.js": "^3.7.1", - "jquery": "^3.6.0" + "@fortawesome/fontawesome-free": "^6.2.0", + "@popperjs/core": "^2.11.6", + "bootstrap": "^5.2.1", + "chart.js": "^3.9.1", + "jquery": "^3.6.1" } } diff --git a/templates/Froxlor/src/js/main.js b/templates/Froxlor/src/js/main.js index a7144a14..ef82a717 100644 --- a/templates/Froxlor/src/js/main.js +++ b/templates/Froxlor/src/js/main.js @@ -1,11 +1,12 @@ // import libs import 'bootstrap'; import '@fortawesome/fontawesome-free'; -import 'chart.js/dist/chart'; +import Chart from 'chart.js/auto'; -// set jquery & bootstrap +// set jquery & bootstrap & chart global.$ = require('jquery'); global.bootstrap = require('bootstrap'); +window.Chart = Chart; $(function () { window.$theme = 'Froxlor'; diff --git a/templates/Froxlor/user/traffic.html.twig b/templates/Froxlor/user/traffic.html.twig index ddb82f74..9e2facf3 100644 --- a/templates/Froxlor/user/traffic.html.twig +++ b/templates/Froxlor/user/traffic.html.twig @@ -4,7 +4,7 @@
- + {{ lng('admin.traffic') }}
{{ lng('admin.traffic_sub') }} @@ -194,14 +194,23 @@ const cChart = new Chart(document.getElementById('customersummary'), configC); - {% else %} + {% elseif not (range starts with 'hours') %} const labelsC = []; const dataValues = []; - {% for yr,year in years %} - labelsC.push('{{ yr }}'); - //dataValues.push({value: {{ year.total.total }}, formatted: '{{ year.total.total|formatBytes }}', year: '{{ yr }}'}); - {% endfor %} + {% if range starts with 'days' or range == 'currentmonth' %} + {% for d,dd in days %} + labelsC.push('{{ d }}'); + {% endfor %} + {% elseif range starts with 'months' or range starts with 'year' or range == 'currentyear' %} + {% for m,md in months %} + labelsC.push('{{ m }}'); + {% endfor %} + {% else %} + {% for yr,year in years %} + labelsC.push('{{ yr }}'); + {% endfor %} + {% endif %} const dataC = { labels: labelsC, @@ -209,32 +218,50 @@ { label: 'HTTP traffic', backgroundColor: 'rgb(255, 99, 132)', - data: [{% for yr,year in years %}{value: {{ year.total.http }}, formatted: '{{ year.total.http|formatBytes }}', year: '{{ yr }}'},{% endfor %}], + {% if range starts with 'days' or range == 'currentmonth' %} + data: [{% for d,dd in days %}{value: {{ dd.http }}, formatted: '{{ dd.http|formatBytes }}', axisv: '{{ d }}'},{% endfor %}], + {% elseif range starts with 'months' or range starts with 'year' or range == 'currentyear' %} + data: [{% for m,md in months %}{value: {{ md.http }}, formatted: '{{ md.http|formatBytes }}', axisv: '{{ m }}'},{% endfor %}], + {% else %} + data: [{% for yr,year in years %}{value: {{ year.http }}, formatted: '{{ year.http|formatBytes }}', axisv: '{{ yr }}'},{% endfor %}], + {% endif %} parsing: { - xAxisKey: 'year' + xAxisKey: 'axisv' } }, { label: 'FTP traffic', backgroundColor: 'rgb(200, 199, 132)', - data: [{% for yr,year in years %}{value: {{ year.total.ftp }}, formatted: '{{ year.total.ftp|formatBytes }}', year: '{{ yr }}'},{% endfor %}], + {% if range starts with 'days' or range == 'currentmonth' %} + data: [{% for y,yd in bydate %}{% for m,md in bydate[y] %}{% for d,dd in bydate[y][m] %}{value: {{ md.ftp }}, formatted: '{{ md.ftp|formatBytes }}', axisv: '{{ d }}.{{ m }}.{{ y }}'},{% endfor %}{% endfor %}{% endfor %}], + {% elseif range starts with 'months' or range starts with 'year' or range == 'currentyear' %} + data: [{% for y,yd in bydate %}{% for m,md in bydate[y] %}{value: {{ md.total.ftp }}, formatted: '{{ md.total.ftp|formatBytes }}', axisv: '{{ m }}/{{ y }}'},{% endfor %}{% endfor %}], + {% else %} + data: [{% for yr,year in bydate %}{value: {{ year.total.ftp }}, formatted: '{{ year.total.ftp|formatBytes }}', axisv: '{{ yr }}'},{% endfor %}], + {% endif %} parsing: { - xAxisKey: 'year' + xAxisKey: 'axisv' } }, { label: 'Mail traffic', backgroundColor: 'rgb(255, 99, 0)', - data: [{% for yr,year in years %}{value: {{ year.total.mail }}, formatted: '{{ year.total.mail|formatBytes }}', year: '{{ yr }}'},{% endfor %}], + {% if range starts with 'days' or range == 'currentmonth' %} + data: [{% for y,yd in bydate %}{% for m,md in bydate[y] %}{% for d,dd in bydate[y][m] %}{value: {{ md.mail }}, formatted: '{{ md.mail|formatBytes }}', axisv: '{{ d }}.{{ m }}.{{ y }}'},{% endfor %}{% endfor %}{% endfor %}], + {% elseif range starts with 'months' or range starts with 'year' or range == 'currentyear' %} + data: [{% for y,yd in bydate %}{% for m,md in bydate[y] %}{value: {{ md.total.mail }}, formatted: '{{ md.total.mail|formatBytes }}', axisv: '{{ m }}/{{ y }}'},{% endfor %}{% endfor %}], + {% else %} + data: [{% for yr,year in bydate %}{value: {{ year.total.mail }}, formatted: '{{ year.total.mail|formatBytes }}', axisv: '{{ yr }}'},{% endfor %}], + {% endif %} parsing: { - xAxisKey: 'year' + xAxisKey: 'axisv' } }, ] }; const configC = { - type: 'bar', + type: 'line', data: dataC, options: { parsing: { @@ -252,7 +279,7 @@ plugins: { title: { display: true, - text: 'All-time by year' + text: 'Specified by range' }, tooltip: { enabled: true,