18 if (isset(
$_GET[
'reset']) && (
$_GET[
'reset'] == 1))
20 if (
$db->truncateTable(
"stats") ===
true){
21 alert::draw(
"success",
"$lang[STATS_RESET]",
"$lang[STATS_RESET_SUCCESS]",
"", 2400);
24 alert::draw(
"danger",
"$lang[STATS_RESET]",
"$lang[STATS_RESET_FAILED]",
"", 2400);
30 <!-- SlimScroll 1.3.0 -->
31 <script src=
"../system/engines/AdminLTE/plugins/slimScroll/jquery.slimscroll.min.js"></script>
32 <!-- ChartJS 1.0.1 -->
33 <script src=
"../system/engines/AdminLTE/plugins/chartjs/Chart.min.js"></script>
34 <!-- <script src=
"https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.4.0/Chart.min.js"></script> -->
36 .tab-content>.tab-pane {
41 .tab-content>.tab-pane.active {
51 if (!isset($stats) || (empty($stats)))
53 @require_once
'../system/classes/stats.php';
58 if (isset(
$_GET[
'interval']))
59 { $defaultInterval =
$_GET[
'interval']; }
60 else if (isset($_POST[
'interval']))
61 { $defaultInterval = $_POST[
'interval']; }
64 { $defaultInterval = 1; }
67 if (isset(
$_GET[
'period']))
68 { $defaultPeriod =
$_GET[
'period']; }
69 else if (isset($_POST[
'period']))
70 { $defaultPeriod = $_POST[
'period']; }
73 { $defaultPeriod =
"DAY"; }
78 $data = $stats->getStatsArray(
$db, $defaultInterval, $defaultPeriod);
82 <!-- Content Wrapper. Contains page content -->
83 <div class=\"content-wrapper\" id=\"content-FX\">
84 <!-- Content Header (Page header) -->
85 <section class=\"content-header\">";
87 echo backend::getTitle(
$lang[
'STATS'],
$lang[
'STATS_SUBTEXT']);
88 echo
"<ol class=\"breadcrumb\">
89 <li><a href=\"index.php\" title=\"$lang[DASHBOARD]\"><i class=\"fa fa-dashboard\"></i> $lang[DASHBOARD]</a></li>
90 <li class=\"active\"><a href=\"index.php?page=yawk-stats\" title=\"$lang[STATS]\"> $lang[STATS]</a></li>
91 <li><a href=\"index.php?page=yawk-stats&interval=1&period=DAY\" title=\"$lang[LAST24H]\"> $lang[LAST24H]</a></li>
95 <section class=\"content\">";
102 <div
class=
"box-body">
103 <form action=
"index.php?page=stats" method=
"post" class=
"form-inline">
104 <div
class=
"col-md-4">
105 <?php echo
"<h4><i class=\"fa fa-line-chart\"></i> $lang[STATS]</h4>"; ?>
107 <div
class=
"col-md-8">
109 <label
for=
"interval"><?php echo
$lang[
'SHOW_DATA_OF']; ?>&
nbsp;</label>
110 <select
id=
"interval" name=
"interval" class=
"form-control">
112 if (isset($_POST[
'interval']))
114 echo
"<option value=\"$_POST[interval]\" selected aria-selected=\"true\">$_POST[interval]</option>";
117 <option value=
"0">---</option>
119 for (
$i = 1;
$i <= 365;
$i++) {
120 echo
"<option value=\"$i\">$i</option>";
124 <label
for=
"period"></label>
125 <select
id=
"period" name=
"period" class=
"form-control">
127 if (isset($_POST[
'period']) && (isset($_POST[
'period'])))
131 switch ($_POST[
'period']) {
133 if ($_POST[
'interval'] > 1)
134 { $description =
$lang[
'SECONDS']; }
136 { $description =
$lang[
'SECOND']; }
139 if ($_POST[
'interval'] > 1)
140 { $description =
$lang[
'MINUTES']; }
142 { $description =
$lang[
'MINUTE']; }
145 if ($_POST[
'interval'] > 1)
146 { $description =
$lang[
'HOURS']; }
148 { $description =
$lang[
'HOUR']; }
151 if ($_POST[
'interval'] > 1)
152 { $description =
$lang[
'DAYS']; }
154 { $description =
$lang[
'DAY']; }
157 if ($_POST[
'interval'] > 1)
158 { $description =
$lang[
'WEEKS']; }
160 { $description =
$lang[
'WEEK']; }
163 if ($_POST[
'interval'] > 1)
164 { $description =
$lang[
'MONTHS']; }
166 { $description =
$lang[
'MONTH']; }
169 if ($_POST[
'interval'] > 1)
170 { $description =
$lang[
'YEARS']; }
172 { $description =
$lang[
'YEAR']; }
175 echo
"<option value=\"$_POST[period]\" selected aria-selected=\"true\">$description</option>";
178 <option value=
"ALL">---</option>
179 <option value=
"SECONDS"><?php echo
$lang[
'SECONDS']; ?></option>
180 <option value=
"MINUTE"><?php echo
$lang[
'MINUTES']; ?></option>
181 <option value=
"HOUR"><?php echo
$lang[
'HOURS']; ?></option>
182 <option value=
"DAY"><?php echo
$lang[
'DAYS']; ?></option>
183 <option value=
"WEEK"><?php echo
$lang[
'WEEKS']; ?></option>
184 <option value=
"MONTH"><?php echo
$lang[
'MONTHS']; ?></option>
185 <option value=
"YEAR"><?php echo
$lang[
'YEARS']; ?></option>
187 <button
type=
"submit" id=
"refresh" name=
"refresh" class=
"btn btn-success" title=
"<?php echo $lang['REFRESH_STATS']; ?>"><
i class=
"glyphicon glyphicon-refresh"></
i>&
nbsp; <?php echo
"$lang[STATS]"; ?></button>
190 echo
"<a class=\"btn btn-default pull-right\" role=\"dialog\" data-confirm=\"$lang[STATS_RESET_CONFIRM]\"
191 title=\"$lang[STATS_DELETE]\" href=\"index.php?page=stats&reset=1\"> <i class=\"fa fa-trash-o\"></i> </a>"; ?>
198 <div
class=
"box-body">
200 <ul
class=
"nav nav-tabs">
201 <li
class=
"active"><
a data-toggle=
"tab" href=
"#home"><
i class=
"fa fa-pie-chart"></
i> &
nbsp;<?php echo
$lang[
'OVERVIEW']; ?></
a></li>
202 <li><
a data-toggle=
"tab" href=
"#devices"><
i class=
"fa fa-tablet"></
i> &
nbsp;<?php echo
$lang[
'DEVICES']; ?></
a></li>
203 <li><
a data-toggle=
"tab" href=
"#browser"><
i class=
"fa fa-firefox"></
i> &
nbsp;<?php echo
$lang[
'BROWSER']; ?></
a></li>
204 <li><
a data-toggle=
"tab" href=
"#users"><
i class=
"fa fa-users"></
i> &
nbsp;<?php echo
$lang[
'USERS']; ?></
a></li>
205 <li><
a data-toggle=
"tab" href=
"#os"><
i class=
"fa fa-windows"></
i> &
nbsp;<?php echo
$lang[
'OPERATING_SYSTEMS']; ?></
a></li>
206 <li><
a data-toggle=
"tab" href=
"#pages"><
i class=
"fa fa-file"></
i> &
nbsp;<?php echo
$lang[
'PAGES']; ?></
a></li>
209 <div
class=
"tab-content">
210 <div
id=
"home" class=
"tab-pane fade in active">
211 <h3><
i class=
"fa fa-pie-chart"></
i>&
nbsp;<?php echo
$lang[
'OVERVIEW']; ?></h3>
212 <div
class=
"col-md-8">
214 <?php $stats->drawOverviewBox(
$lang); ?>
219 <?php $stats->getDaysOfMonthBox(
$lang); ?>
221 <div
class=
"col-md-4">
227 <div
id=
"devices" class=
"tab-pane">
228 <h3><
i class=
"fa fa-tablet"></
i> &
nbsp;<?php echo
$lang[
'DEVICES']; ?></h3>
229 <div
class=
"col-md-8">
230 <!-- device
type box -->
232 <!-- /device
type box -->
234 <div
class=
"col-md-4">
235 <!-- device
type box -->
237 <!-- /device
type box -->
240 <div
id=
"browser" class=
"tab-pane fade in">
241 <h3><
i class=
"fa fa-firefox"></
i> &
nbsp;<?php echo
$lang[
'BROWSER']; ?></h3>
242 <div
class=
"col-md-6">
247 <div
class=
"col-md-6">
251 <div
id=
"users" class=
"tab-pane fade in">
252 <h3><
i class=
"fa fa-users"></
i> &
nbsp;<?php echo
$lang[
'USERS']; ?></h3>
253 <div
class=
"col-md-6">
255 <?php $stats->drawLoginBox(
$db,
$lang); ?>
258 <div
class=
"col-md-6">
259 <!-- latest users box -->
260 <?php dashboard::drawLatestUsers(
$db, 8,
$lang); ?>
261 <!-- / latest users box -->
264 <div
id=
"os" class=
"tab-pane fade in">
265 <h3><
i class=
"fa fa-windows"></
i> &
nbsp;<?php echo
$lang[
'OPERATING_SYSTEMS']; ?></h3>
266 <div
class=
"col-md-12">
267 <!-- device
type box -->
269 <!-- /device
type box -->
272 <div
id=
"pages" class=
"tab-pane fade in">
273 <h3><
i class=
"fa fa-file"></
i> &
nbsp;<?php echo
$lang[
'PAGES']; ?></h3>
281 <script
type=
"text/javascript">
283 $(document).
ready(
function() {
284 let getUrlParameter =
function getUrlParameter(sParam) {
285 let sPageURL = decodeURIComponent(
window.location.search.substring(1)),
286 sURLVariables = sPageURL.split(
'&'),
290 for (
i = 0;
i < sURLVariables.length;
i++) {
291 sParameterName = sURLVariables[
i].split(
'=');
293 if (sParameterName[0] === sParam) {
294 return sParameterName[1] ===
undefined ?
true : sParameterName[1];
300 let periodSelect = $(
"#period" );
302 let intervalSelect = $(
"#interval" );
304 let submitBtn = $(
"#refresh" );
323 $(submitBtn).
on(
'click',
function() {
325 var currentPeriodSelectValue = $(
"#period option:selected" ).val();
327 var currentIntervalSelectValue = $(
"#interval option:selected" ).val();
329 localStorage.setItem(
'periodSelect', currentPeriodSelectValue);
330 localStorage.setItem(
'intervalSelect', currentIntervalSelectValue);
334 lastPeriodSelectValue = localStorage.getItem(
'periodSelect');
335 lastIntervalSelectValue = localStorage.getItem(
'intervalSelect');
337 $(periodSelect).val(lastPeriodSelectValue);
338 $(intervalSelect).val(lastIntervalSelectValue);
362 var ctx = document.getElementById(
"myChart").getContext(
'2d');
363 var myChart =
new Chart(ctx, {
366 labels: [
"Red",
"Blue",
"Yellow",
"Green",
"Purple",
"Orange"],
369 data: [12, 19, 3, 5, 2, 3],
371 'rgba(255, 99, 132, 0.2)',
372 'rgba(54, 162, 235, 0.2)',
373 'rgba(255, 206, 86, 0.2)',
374 'rgba(75, 192, 192, 0.2)',
375 'rgba(153, 102, 255, 0.2)',
376 'rgba(255, 159, 64, 0.2)'
379 'rgba(255,99,132,1)',
380 'rgba(54, 162, 235, 1)',
381 'rgba(255, 206, 86, 1)',
382 'rgba(75, 192, 192, 1)',
383 'rgba(153, 102, 255, 1)',
384 'rgba(255, 159, 64, 1)'
print $lang['FILEMAN_UPLOAD']
Dashboard class serves a few useful functions for the admin backend.
Throws a fancy Bootstrap Alert (success, info, warning or danger)
Backend class serves a few useful functions for the admin backend.
Mysqli database class; returns db connection object.
The language class - support multilingual backend.
Statistics - get and set user and page stats.
return window window jQBrowser a &&a browser
<!-- backend language -->< h3 >< i class="fa fa-language"></i > & nbsp
document ready(function() { $('a[data-confirm]').click(function(ev) { modal='#dataConfirmModal';var href=$(this).attr('href');var title=$(this).attr('title');var icon=$(this).attr('data-icon');if(!icon) { icon='fa fa-trash-o';} if(!$(modal).length) { $('body').append('< div id="dataConfirmModal" class="modal fade" role="dialog" aria-labelledby="dataConfirmLabel" aria-hidden="true">< div class="modal-dialog">< div class="modal-content">< div class="modal-header">< button type="button" class="close" data-dismiss="modal" aria-hidden="true">< i class="fa fa-times"></i ></button >< br >< div class="col-md-1">< h3 class="modal-title">< i class="'+icon+'"></i ></h3 ></div >< div class="col-md-11">< h3 class="modal-title" id="dataConfirmLabel">'+title+'</h3 ></div ></h3 ></div >< div class="modal-body"></div >< div class="modal-footer">< button type="button" class="btn btn-default" data-dismiss="modal" aria-hidden="true">Abbrechen</button >< a type="button" class="btn btn-danger" id="dataConfirmOK">< i class="'+icon+'"></i > L öschen</a ></div ></div ></div ></div >');} $(modal).find('.modal-body').text($(this).attr('data-confirm'));$('#dataConfirmOK').attr('href', href);$(modal).modal({show:true});return false;});$('#terminateUser').click(function() { var terminate=window.confirm("ACHTUNG!\nDas wird Deinen Account permanent deaktivieren.\n"+"Bist Du Dir sicher, dass Du das tun willst?");if(terminate===true) { var terminateUser=window.confirm("Bist Du Dir wirklich ganz sicher?\n"+"Diese Aktion kann nicht rueckgaengig gemacht werden.");if(terminateUser===true) { $.get('system/templates/YaWK-bootstrap3/js/terminate-user.php', function(data) { if(data==="true") { setTimeout("window.location='logout.html'", 0);} else { alert("Fehler: "+data);} });} } });function dismissNotifications() { $.ajax({ url:'js/dismiss-notifications.php', type:'POST', success:function(data) { if(!data) { alert('Something went wrong!');return false;} } });$("#bell-label").fadeOut();$('#notification-header').html('You have 0 notifications');$('#notification-menu').fadeOut();} $("#dismiss").click(function() { dismissNotifications();});function disableButtons(delay) { $('#loginButton').removeClass().addClass('btn btn-success disabled').attr('id', 'LOGIN_FORBIDDEN');$('#resetPasswordButton').removeClass().addClass('btn btn-danger disabled');setTimeout(function() { $('#LOGIN_FORBIDDEN').attr('id', 'loginButton').removeClass().addClass('btn btn-success');$('#resetPasswordButton').removeClass().addClass('btn btn-danger');}, delay);} $("#loginButton").click(function(){ if($('#loginButton').length > 0) { if($('#loginButton').hasClass('btn') &&$('#loginButton').hasClass('btn-success') &&$('#loginButton').hasClass('disabled')) { } else { $("#loginForm").submit();disableButtons(10000);} } else if($('#LOGIN_FORBIDDEN').length > 0) { if($('#LOGIN_FORBIDDEN').hasClass('btn') &&$('#LOGIN_FORBIDDEN').hasClass('btn-success') &&$('#LOGIN_FORBIDDEN').hasClass('disabled')) { } else { } } });$("#blockedBtn").hover(function() { $("#blockedBtn").hide();$("#askBtn").fadeIn(820);});})