summaryrefslogtreecommitdiffstats
path: root/modules-available/statistics/templates
diff options
context:
space:
mode:
Diffstat (limited to 'modules-available/statistics/templates')
-rw-r--r--modules-available/statistics/templates/clientlist.html304
-rw-r--r--modules-available/statistics/templates/cpumodels.html35
-rw-r--r--modules-available/statistics/templates/filterbox.html322
-rw-r--r--modules-available/statistics/templates/hints-cpu-legacy.html28
-rw-r--r--modules-available/statistics/templates/hints-hdd-grow.html67
-rw-r--r--modules-available/statistics/templates/hints-nic-speed.html32
-rw-r--r--modules-available/statistics/templates/hints-ram-underclocked.html49
-rw-r--r--modules-available/statistics/templates/hints-ram-upgrade.html32
-rw-r--r--modules-available/statistics/templates/id44.html27
-rw-r--r--modules-available/statistics/templates/js-pciquery.html24
-rw-r--r--modules-available/statistics/templates/kvmstate.html27
-rw-r--r--modules-available/statistics/templates/machine-hdds.html76
-rw-r--r--modules-available/statistics/templates/machine-main.html219
-rw-r--r--modules-available/statistics/templates/memory.html27
-rw-r--r--modules-available/statistics/templates/summary.html50
15 files changed, 805 insertions, 514 deletions
diff --git a/modules-available/statistics/templates/clientlist.html b/modules-available/statistics/templates/clientlist.html
index 47be4dd0..fcb98774 100644
--- a/modules-available/statistics/templates/clientlist.html
+++ b/modules-available/statistics/templates/clientlist.html
@@ -1,46 +1,23 @@
+<div class="slx-right">
+ {{{roomsvg}}}
+ {{#sidebar}}
+ <div class="infobox">{{.}}</div>
+ {{/sidebar}}
+</div>
+
<h2>{{lang_clientList}} ({{rowCount}})</h2>
+<button class="btn btn-default" type="button" data-toggle="modal"
+ data-target="#column-selector">{{lang_selectColumns}}</button>
+
+<div class="clearfix"></div>
<form method="post" action="?do=statistics" id="list-form">
<input type="hidden" name="token" value="{{token}}">
<input type="hidden" name="redirect" value="?{{redirect}}">
-<table class="stupidtable table table-condensed table-striped">
+<table id="client-list" class="stupidtable table table-condensed table-striped">
<thead>
- <tr>
- <td></td>
- <td></td>
- <td class="text-right">
- <button type="button" class="btn btn-default btn-xs" onclick="popupFilter('lastseen')">
- <span class="glyphicon glyphicon-filter"></span>
- </button>
- </td>
- <td>
- <button type="button" class="btn btn-default btn-xs" onclick="popupFilter('kvmstate')">
- <span class="glyphicon glyphicon-filter"></span>
- </button>
- </td>
- <td class="text-right">
- <button type="button" class="btn btn-default btn-xs" onclick="popupFilter('gbram')">
- <span class="glyphicon glyphicon-filter"></span>
- </button>
- </td>
- <td class="text-right">
- <button type="button" class="btn btn-default btn-xs" onclick="popupFilter('hddgb')">
- <span class="glyphicon glyphicon-filter"></span>
- </button>
- </td>
- <td>
- <button type="button" class="btn btn-default btn-xs" onclick="popupFilter('realcores')">
- <span class="glyphicon glyphicon-filter"></span>
- </button>
- </td>
- <td>
- <button type="button" class="btn btn-default btn-xs" onclick="popupFilter('location')">
- <span class="glyphicon glyphicon-filter"></span>
- </button>
- </td>
- </tr>
- <tr>
+ <tr id="thead">
<th data-sort="string">
<div class="checkbox checkbox-inline">
<input type="checkbox" id="toggle-all">
@@ -48,13 +25,15 @@
</div>
{{lang_machine}}
</th>
- <th data-sort="ipv4">{{lang_address}}</th>
- <th data-sort="int" class="text-right">{{lang_lastSeen}}</th>
- <th data-sort="string">{{lang_kvmSupport}}</th>
- <th data-sort="int" class="text-right">{{lang_gbRam}}</th>
- <th data-sort="int" class="text-right">{{lang_tmpGb}}</th>
- <th data-sort="int">{{lang_cpuModel}}</th>
- <th data-sort="string">{{lang_location}}</th>
+ <th data-sort="ipv4" data-column="clientip">{{lang_address}}</th>
+ <th data-sort="int" data-column="nicspeed" class="text-right">{{lang_nicSpeed}}</th>
+ <th data-sort="int" data-column="lastseen" class="text-right">{{lang_lastSeen}}</th>
+ <th data-sort="string" data-column="kvmstate">{{lang_kvmSupport}}</th>
+ <th data-sort="int" data-column="gbram" class="text-right">{{lang_gbRam}}</th>
+ <th data-sort="int" data-column="hddgb" class="text-right">{{lang_tmpGb}}</th>
+ <th data-sort="int" data-column="persistentgb" class="text-right">{{lang_persistentPart}}</th>
+ <th data-sort="int" data-column="realcores">{{lang_cpuModel}}</th>
+ <th data-sort="string" data-column="location">{{lang_location}}</th>
</tr>
</thead>
<tbody>
@@ -98,31 +77,57 @@
{{/link_details}}
<div class="small uuid">{{machineuuid}}</div>
{{#rmmodule}}
- <div class="small">{{lang_runMode}}:
+ <div class="small">{{lang_configuredRunMode}}:
<a class="slx-bold" href="?do=runmode&amp;module={{rmmodule}}">{{moduleName}}</a> / {{modeName}}
</div>
{{/rmmodule}}
+ {{#wrongRunMode}}
+ <div class="small text-danger">
+ {{lang_clientInDifferentRunmode}}: {{currentrunmode}}
+ {{^currentrunmode}}
+ {{lang_bootedWithoutAnyRunmode}}
+ {{/currentrunmode}}
+ </div>
+ {{/wrongRunMode}}
+ {{#currentuser}}
+ <div class="small">
+ {{lang_user}}:
+ <b>{{currentuser}}</b>
+ </div>
+ {{/currentuser}}
</td>
<td data-sort-value="{{clientip}}">
- <b><a href="?do=Statistics&amp;show=list&amp;filters=subnet={{subnet}}">{{subnet}}</a>{{lastoctet}}</b>
+ <b><a href="?do=statistics&amp;show=list&amp;filters=clientip={{subnet}}/24">{{subnet}}.</a>{{lastoctet}}</b>
<div class="mac text-nowrap">{{macaddr}}</div>
<div class="hidden ip">{{clientip}}</div>
</td>
+ <td data-sort-value="{{nic-speed}}" class="text-right">
+ {{nic-speed_s}}&thinsp;MBit/s
+ </td>
<td data-sort-value="{{lastseen_int}}" class="text-right text-nowrap">{{lastseen}}</td>
<td class="{{kvmclass}}">{{kvmstate}}</td>
- <td data-sort-value="{{gbram}}" class="text-right {{ramclass}}">{{gbram}}&thinsp;GiB</td>
- <td data-sort-value="{{gbtmp}}" class="text-right {{hddclass}}">
+ <td data-sort-value="{{mbram}}" class="text-right {{ramclass}}">{{gbram}}&thinsp;GiB</td>
+ <td data-sort-value="{{id44mb}}" class="text-right {{hddclass}}">
{{gbtmp}}&thinsp;GiB
{{#badsectors}}<div><span data-toggle="tooltip" title="{{lang_reallocatedSectors}}" data-placement="left">
<span class="glyphicon glyphicon-exclamation-sign"></span>
{{badsectors}}
</span></div>{{/badsectors}}
- {{#nohdd}}<div>
+ {{^hddcount}}<div>
<span class="glyphicon glyphicon-hdd red"></span>
- </div>{{/nohdd}}
+ </div>{{/hddcount}}
+ {{#hddcount}}<div>
+ <span class="badge">
+ <span class="glyphicon glyphicon-hdd"></span>
+ {{hddcount}}
+ </span>
+ </div>{{/hddcount}}
+ </td>
+ <td data-sort-value="{{id45mb}}" class="text-right">
+ {{gbpersist}}&thinsp;GiB
</td>
<td data-sort-value="{{realcores}}">{{lang_realCores}}: {{realcores}}<div class="small">{{cpumodel}}</div></td>
- <td data-sort-value="{{locationname}}">{{locationname}}</td>
+ <td data-sort-value="{{location.sort}}">{{location.name}}</td>
</tr>
{{/rows}}
</tbody>
@@ -132,8 +137,9 @@
<span class="glyphicon glyphicon-refresh"></span>
{{lang_reset}}
</button>
- <span class="dropdown">
- <button class="btn btn-default dropdown-toggle btn-machine-action" type="button" id="dropdownMenu1" data-toggle="dropdown" aria-haspopup="true">
+ <div class="btn-group dropup">
+ <button class="btn btn-default dropdown-toggle btn-machine-action" type="button" id="dropdownMenu1"
+ data-toggle="dropdown" aria-haspopup="true">
<span class="glyphicon glyphicon-list"></span>
{{lang_listDropdown}}
<span class="caret"></span>
@@ -155,42 +161,81 @@
data-target="#mac-list">
{{lang_uuid}}
</a></li>
+ <hr style="margin: 0px">
+ <li><a href="#" class="list-btn" data-what="hostname ip mac uuid" data-toggle="modal"
+ data-target="#mac-list">
+ {{lang_fullInfo}}
+ </a></li>
</ul>
- </span>
+ </div>
{{#rebootcontrol}}
- {{#canShutdown}}
- <button type="submit" name="action" value="shutdownmachines" class="btn btn-danger btn-machine-action"
- data-confirm="{{lang_shutdownConfirm}}" data-title="{{lang_shutdown}}">
- <span class="glyphicon glyphicon-off"></span>
- {{lang_shutdown}}
- </button>
- {{/canShutdown}}
- {{#canReboot}}
- <button type="submit" name="action" value="rebootmachines" class="btn btn-warning btn-machine-action"
- data-confirm="#confirm-reboot">
- <span class="glyphicon glyphicon-repeat"></span>
- {{lang_reboot}}
+ <div class="btn-group dropup">
+ <button class="btn btn-default dropdown-toggle btn-machine-action" type="button" id="dropdownMenu2"
+ data-toggle="dropdown" aria-haspopup="true">
+ <span class="glyphicon glyphicon-list"></span>
+ {{lang_remoteActions}}
+ <span class="caret"></span>
</button>
- {{/canReboot}}
- {{#canWol}}
- <button type="submit" name="action" value="wol" class="btn btn-primary btn-machine-action">
- <span class="glyphicon glyphicon-bell"></span>
- {{lang_wakeOnLan}}
- </button>
- {{/canWol}}
- {{#canExec}}
- <button type="submit" name="action" value="prepare-exec" class="btn btn-primary btn-machine-action">
- <span class="glyphicon glyphicon-play"></span>
- {{lang_remoteExec}}
- </button>
- {{/canExec}}
+ <div class="dropdown-menu" style="padding:0" aria-labelledby="dropdownMenu2">
+ <div class="btn-group-vertical">
+ {{#canShutdown}}
+ <button type="submit" name="action" value="shutdownmachines" class="btn btn-danger btn-machine-action"
+ data-confirm="{{lang_shutdownConfirm}}" data-title="{{lang_shutdown}}">
+ <span class="glyphicon glyphicon-off"></span>
+ {{lang_shutdown}}
+ </button>
+ {{/canShutdown}}
+ {{#canReboot}}
+ <button type="submit" name="action" value="rebootmachines" class="btn btn-warning btn-machine-action"
+ data-confirm="#confirm-reboot">
+ <span class="glyphicon glyphicon-repeat"></span>
+ {{lang_reboot}}
+ </button>
+ {{/canReboot}}
+ {{#canWol}}
+ <button type="submit" name="action" value="wol" class="btn btn-primary btn-machine-action">
+ <span class="glyphicon glyphicon-bell"></span>
+ {{lang_wakeOnLan}}
+ </button>
+ {{/canWol}}
+ {{#canExec}}
+ <button type="submit" name="action" value="prepare-exec" class="btn btn-primary btn-machine-action">
+ <span class="glyphicon glyphicon-play"></span>
+ {{lang_remoteExec}}
+ </button>
+ {{/canExec}}
+ {{#canBenchmark}}
+ <button type="submit" name="action" value="benchmark" class="btn btn-primary btn-machine-action">
+ <span class="glyphicon glyphicon-dashboard"></span>
+ {{lang_remoteSpeedcheck}}
+ </button>
+ {{/canBenchmark}}
+ </div>
+ </div>
+ </div>
{{/rebootcontrol}}
{{#canDelete}}
+ <div class="btn-group dropup">
<button type="submit" name="action" value="delmachines" class="btn btn-danger btn-machine-action"
data-confirm="{{lang_sureDeletePermanent}}">
<span class="glyphicon glyphicon-trash"></span>
{{lang_delete}}
</button>
+ <button type="button" class="btn btn-danger btn-machine-action dropdown-toggle"
+ data-toggle="dropdown" aria-haspopup="true">
+ <span class="caret"></span>
+ <span class="sr-only">Toggle Dropdown</span>
+ </button>
+ <div class="dropdown-menu" style="padding:0">
+ <div class="btn-group-vertical">
+ <button type="submit" name="action" value="clear-machines" class="btn btn-danger btn-machine-action"
+ data-confirm="{{lang_sureClearIp}}">
+ <span class="glyphicon glyphicon-refresh"></span>
+ {{lang_resetClearIp}}
+ </button>
+ </div>
+ </div>
+ </div>
{{/canDelete}}
</div>
<div class="hidden" id="confirm-reboot">
@@ -217,8 +262,25 @@
</div>
</div>
+<div class="modal" id="column-selector" tabindex="-1" role="dialog">
+ <div class="modal-dialog" role="document">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal">&times;</button>
+ </div>
+ <div class="modal-body"></div>
+ <div class="modal-footer">
+ <button type="button" class="btn btn-default"
+ data-dismiss="modal">{{lang_close}}</button>
+ </div>
+ </div>
+ </div>
+</div>
+
<script type="application/javascript"><!--
+var lookupTable = {};
+
document.addEventListener("DOMContentLoaded", function () {
var $buttons = $('.btn-machine-action');
var $fn = function () {
@@ -226,6 +288,23 @@ document.addEventListener("DOMContentLoaded", function () {
};
var $boxes = $('.machine-checkbox');
$boxes.change($fn);
+
+ // Shift click selection for the checkboxes
+ var lastChecked = null;
+ $boxes.click(function(e) {
+ if (!lastChecked) {
+ lastChecked = this;
+ return;
+ }
+ if (e.shiftKey) {
+ $boxes = $('.machine-checkbox');
+ const start = $boxes.index(this);
+ const end = $boxes.index(lastChecked);
+ $boxes.slice(Math.min(start, end), Math.max(start, end) + 1).prop('checked', lastChecked.checked);
+ }
+ lastChecked = this;
+ });
+
$("button[type=reset]").click(function() { setTimeout($fn, 1); });
if (window && window.opera && window.opera.version && Number(window.opera.version()) < 13) {
$(document).ready(function () {
@@ -242,17 +321,76 @@ document.addEventListener("DOMContentLoaded", function () {
$fn();
});
$('.list-btn').click(function() {
- var what = $(this).data('what');
+ var what = $(this).data('what').split(" ");
var $el = $('#mac-list-content');
$el.empty();
var result = '';
- var num = $('.machine').has('input[type=checkbox]:checked').find('.' + what).each(function() {
- var text = this.innerText;
- if (what === 'mac') text = text.replace(/-/g, ':');
- result += text + "\n";
+ var num = $('.machine').has('input[type=checkbox]:checked').each(function(index, element) {
+ what.forEach(function (w) {
+ $(element).find('.' + w).each(function() {
+ var text = this.innerText;
+ if (w === 'mac') text = text.replace(/-/g, ':');
+ result += text + "\t";
+ });
+ });
+ result += "\n";
}).length;
$el.text(result).prop('rows', Math.min(24, Math.max(5, num)));
});
+ // Generate list for column selection
+ var $cs = $('#column-selector .modal-body');
+ var $filters = $('<tr>');
+ $('#client-list > thead').prepend($filters);
+ var idx = 0;
+ $cs.empty();
+ $('#client-list > thead > tr#thead > th').each(function() {
+ idx++;
+ var $th = $(this);
+ var $td = $('<td>');
+ $filters.append($td);
+ var column = $th.data('column');
+ if (!column)
+ return;
+ $cs.append($('<div class="checkbox">')
+ .append($('<input id="shc-' + column + '" type="checkbox" onclick="toggleColumn(this, \'' + column + '\')" checked="checked">'))
+ .append($('<label for="shc-' + column + '">').text($th.text())));
+ $td.append($('<button type="button" class="btn btn-default btn-xs" onclick="popupFilter(\'' + column + '\')">'
+ + '<span class="glyphicon glyphicon-filter"></span></button>'));
+ lookupTable[column] = idx;
+ });
+ // Load previous visibility settings
+ var colConf;
+ if (window.localStorage && (colConf = window.localStorage.getItem('cl-col-conf'))) {
+ colConf = JSON.parse(colConf);
+ if (colConf) {
+ for (var k in colConf) {
+ if (k.substring(0, 4) === 'shc-' && colConf[k]) {
+ var $cb = $('#' + k);
+ if ($cb.prop('checked')) {
+ $cb.click();
+ }
+ }
+ }
+ }
+ }
});
+function toggleColumn(e, column)
+{
+ var $el = $(e);
+ if (!(column in lookupTable))
+ return;
+ var idx = lookupTable[column];
+ $('#client-list tr > td:nth-child(' + idx + '), #client-list tr > th:nth-child(' + idx + ')')
+ .css('display', $el.is(':checked') ? '' : 'none');
+ var data = {};
+ $('#column-selector .modal-body .checkbox input').each(function() {
+ var $el = $(this);
+ if (!$el.is(':checked')) {
+ data[$el[0].id] = 1;
+ }
+ });
+ window.localStorage.setItem('cl-col-conf', JSON.stringify(data));
+}
+
//--></script>
diff --git a/modules-available/statistics/templates/cpumodels.html b/modules-available/statistics/templates/cpumodels.html
index d89a5b2f..e133bec6 100644
--- a/modules-available/statistics/templates/cpumodels.html
+++ b/modules-available/statistics/templates/cpumodels.html
@@ -10,20 +10,20 @@
<thead>
<tr>
<th data-sort="string">{{lang_modelName}}</th>
- <th data-sort="int" class="text-right text-nowrap">{{lang_cpuCores}}</th>
- <th data-sort="int" class="text-right text-nowrap">{{lang_modelCount}}</th>
+ <th data-sort="int" class="slx-smallcol text-right">{{lang_cpuCores}}</th>
+ <th data-sort="int" class="slx-smallcol text-right">{{lang_modelCount}}</th>
</tr>
</thead>
<tbody>
{{#rows}}
- <tr id="{{id}}" class="{{collapse}}">
+ <tr id="sysmdl-{{idx}}" class="{{collapse}}">
<td data-sort-value="{{systemmodel}}" class="text-left text-nowrap filter-col" data-filter-col="systemmodel">
- <table style="width:100%; table-layout: fixed;"><tr><td style="overflow:hidden;text-overflow: ellipsis;">
- <a class="filter-val" data-filter-val="{{systemmodel}}" href="?do=Statistics&amp;show=summary&amp;filters={{query}}~,~systemmodel={{urlsystemmodel}}">{{systemmodel}}</a>
+ <table class="slx-ellipsis"><tr><td>
+ <a class="filter-val" data-filter-val="{{systemmodel}}" href="#">{{systemmodel}}</a>
</td></tr></table>
</td>
<td data-sort-value="{{cores}}" class="text-right filter-col" data-filter-col="realcores">
- <a class="filter-val" data-filter-val="{{cores}}" href="?do=Statistics&amp;show=summary&amp;filters={{query}}~,~realcores={{cores}}">{{cores}}</a>
+ <a class="filter-val" data-filter-val="{{cores}}" href="#">{{cores}}</a>
</td>
<td class="text-right">{{count}}</td>
</tr>
@@ -40,28 +40,7 @@
</tbody>
</table>
</div>
- <div class="col-md-4">
- <canvas id="cpumodelchart" style="width:100%;height:380px"></canvas>
- <script type="text/javascript">
- document.addEventListener("DOMContentLoaded", function() {
- var data = {{{json}}};
- var sel = false;
- new Chart(document.getElementById('cpumodelchart').getContext('2d')).Pie(data, {
- animation: false,
- tooltipTemplate: "<%if (label){%><%=label%><%}%>",
- customTooltips: function(tooltip) {
- if (sel !== false) sel.removeClass('slx-bold');
- if (!tooltip) {
- sel = false;
- return;
- }
- sel = $('#' + tooltip.text);
- sel.addClass('slx-bold');
- }
- });
- }, false);
- </script>
- </div>
+ <div class="col-md-4 auto-chart" data-chart="{{json}}" data-chart-dest="#sysmdl-"></div>
</div>
</div>
</div>
diff --git a/modules-available/statistics/templates/filterbox.html b/modules-available/statistics/templates/filterbox.html
index 07aa7320..f62c4d7c 100644
--- a/modules-available/statistics/templates/filterbox.html
+++ b/modules-available/statistics/templates/filterbox.html
@@ -1,201 +1,104 @@
-<div id="modal-add-filter" class="modal fade" role="dialog" style="position: absolute">
- <div class="modal-dialog" role="document">
- <div class="modal-content">
- <div class="modal-header">
- <b>{{lang_add_filter}}</b>
- </div>
- <form class="form-inline center" onsubmit="$('#add-btn').click(); return false">
- <div class="modal-body">
- <div class="form-group">
- <select id="columnSelect" name="column" class="form-control col-4-xs"> </select>
- </div>
- <div class="form-group">
- <select id="operatorSelect" name="operator" class="form-control col-4-xs"> </select>
- </div>
- <div class="form-group">
- <input name="argument" id="argumentInput" class="form-control col-4-xs">
- <select name="argument" id="argumentSelect" class="form-control col-4-xs"> </select>
- </div>
+<a href="#top" class="btn btn-default to-top-btn"><span class="glyphicon glyphicon-menu-up"></span></a>
+<h1>{{lang_moduleHeading}}</h1>
+
+<form id="query-form" method="GET" action="?do=statistics" role="form">
+ <input type="hidden" name="show" value="{{show}}">
+ <input type="hidden" name="do" value="statistics">
+ <div class="btn-group pull-right">
+ <button type="submit" hidden><!-- first button, so hitting enter in the form fields doesn't jump to summary -->
+ <button class="btn btn-default {{summaryButtonClass}}" type="submit" name="show" value="summary"
+ {{perms.view.summary.disabled}}>
+ <span class="glyphicon glyphicon-stats"></span>
+ {{lang_showVisualization}}
+ </button>
+ <button class="btn btn-default {{listButtonClass}}" type="submit" name="show" value="list"
+ {{perms.view.list.disabled}}>
+ <span class="glyphicon glyphicon-list"></span>
+ {{lang_showList}}
+ </button>
+ </div>
+
+ <h3>{{lang_labelFilter}}</h3>
+ <div class="filter-list">
+ {{#columns}}
+ <div class="{{collapse}} row filter-row" id="filter-{{key}}">
+ <div class="col-sm-4 col-xs-12">
+ <div class="checkbox checkbox-inline text-nowrap">
+ <input id="check-{{key}}" type="checkbox" name="filter[{{key}}]" value="1" class="filter-enable"
+ {{checked}}>
+ <label for="check-{{key}}">{{name}}</label>
</div>
- <div class="modal-footer">
- <button type="button" class="btn btn-default" data-dismiss="modal">{{lang_cancel}}</button>
- <button id="add-btn" type="button" class="btn btn-success" onclick="addFilterFromForm()">
- <span class="glyphicon glyphicon-plus"></span>
- {{lang_add}}
- </button>
- </div>
- </form>
+ </div>
+ <div class="col-sm-2 col-xs-3">
+ <select name="op[{{key}}]" class="form-control enable-check op">
+ {{#op}}
+ <option {{selected}}>{{op}}</option>
+ {{/op}}
+ </select>
+ </div>
+ <div class="col-sm-6 col-xs-9">
+ {{#input}}
+ <input name="arg[{{key}}]" type="{{.}}" class="form-control enable-check {{inputclass}} arg"
+ value="{{currentvalue}}" placeholder="{{placeholder}}">
+ {{/input}}
+ {{#enum}}
+ <select name="arg[{{key}}]" class="form-control enable-check arg">
+ {{#values}}
+ <option value="{{key}}" {{disabled}} {{selected}}>{{value}}</option>
+ {{/values}}
+ </select>
+ {{/enum}}
+ </div>
</div>
+ <div class="clearfix"></div><!-- fixes jumping around of items on firefox -->
+ {{/columns}}
</div>
-</div>
-
-<a href="#top" class="btn btn-default to-top-btn"><span class="glyphicon glyphicon-menu-up"></span></a>
-
-
-<div class="col-md-12">
- <!-- use GET here, to avoid the "resend form?" confirmation, and anyway this is stateless, so GET makes more sense -->
- <form id="queryForm" method="GET" action="?do=Statistics" class="" role="form">
- <input type="hidden" name="show" value="{{show}}">
- <button type="submit" hidden></button>
-
-
- <div class="btn-group pull-right">
- <button class="btn btn-default {{statButtonClass}}" type="submit" name="show" value="summary" {{perms.view.summary.disabled}}>
- <span class="glyphicon glyphicon-stats"></span>
- {{lang_showVisualization}}
+ <div class="row">
+ <div class="col-md-12 col-sm-10 col-xs-12">
+ <button type="submit" class="btn btn-primary pull-right">
+ <span class="glyphicon glyphicon-ok"></span>
+ {{lang_apply}}
</button>
- <button class="btn btn-default {{listButtonClass}}" type="submit" name="show" value="list" {{perms.view.list.disabled}}>
- <span class="glyphicon glyphicon-list"></span>
- {{lang_showList}}
+ <button type="button" class="btn btn-default" id="filter-expand">
+ <span class="glyphicon glyphicon-arrow-down"></span>
+ {{lang_more}}
</button>
</div>
- <h1>{{lang_moduleHeading}}</h1>
-
- <br/>
-
- <input type="hidden" name="do" value="statistics">
- <input type="hidden" name="sortColumn" id="sortColumn" value="{{sortColumn}}"/>
- <input type="hidden" name="sortDirection" id="sortDirection" value="{{sortDirection}}"/>
-
- <label for="filterInput">{{lang_labelFilter}}</label>
- <div class="row">
- <div class="col-md-12">
- <div class="input-group">
- <input type="text" name="filters" class="" id="filterInput"/>
- <span class="input-group-btn" style=" width: 1%; padding-bottom: 5px;">
- <button type="button" class="btn btn-success" onclick="popupFilter(null)">
- <span class="glyphicon glyphicon-plus"></span>
- {{lang_add_filter}}
- </button>
- </span>
- </div>
- </div>
- </div>
-
- <br/>
- </form>
-</div>
+ </div>
+ <div class="clearfix slx-space"></div>
+</form>
<script type="application/javascript"><!--
-var filterSelectize;
-
-var slxFilterNames = {
- machineuuid: '{{lang_uuid}}',
- macaddr: '{{lang_macAddr}}',
- firstseen: '{{lang_firstSeen}}',
- lastseen: '{{lang_lastSeen}}',
- lastboot: '{{lang_lastBoot}}',
- logintime: '{{lang_lastLogin}}',
- realcores: '{{lang_cores}}',
- systemmodel: '{{lang_model}}',
- cpumodel: '{{lang_cpuModel}}',
- hddgb: '{{lang_tmpGb}}',
- gbram: '{{lang_gbRam}}',
- kvmstate: '{{lang_kvmSupport}}',
- badsectors: '{{lang_reallocatedSectors}}',
- clientip: '{{lang_ip}}',
- state: '{{lang_usageState}}',
- location: '{{lang_location}}',
- currentuser: '{{lang_currentUser}}',
- subnet: '{{lang_subnet}}',
- runtime: '{{lang_runtimeHours}}',
- hostname: '{{lang_hostname}}',
- live_swapfree: '{{lang_swapFree}}',
- live_memfree: '{{lang_memFree}}',
- live_tmpfree: '{{lang_tmpFree}}'
-};
-
-slxLocations = {{{locations}}};
-
-var slxFilterDel = '{{delimiter}}';
-var $modal, $queryForm;
-
-
document.addEventListener("DOMContentLoaded", function () {
- /* some objects */
- var $columnSelect = $('#columnSelect');
- $modal = $('#modal-add-filter');
- $queryForm = $('#queryForm');
-
- var columns= {{{columns}}};
+ $('.is-date').datepicker({format : 'yyyy-mm-dd'});
- /* add options to column select */
- for (var key in columns) {
- $columnSelect.append($('<option>', {
- value: key, text: (slxFilterNames[key] ? slxFilterNames[key] : key) }));
- };
-
-
- /* initialize selectize */
- filterSelectize = $('#filterInput').selectize({
- delimiter: slxFilterDel,
- persist: false,
- plugins: ['remove_button'],
- create: function(input) {
- return {value: input, text: input}
- },
- onChange: function() {
- // if (initComplete && !$('#filterInput').is(':focus')) {
- // reload();
- // }
- },
- onItemRemove: function(value) {
- refresh();
- }
- })[0].selectize;
- /* add query */
- var str = "{{{query}}}";
- var eExp = /^(\w+)\s*([=><!~]+)\s*(.*)$/;
- str.split(slxFilterDel).forEach(function(v) {
- if (v.trim().length === 0)
- return;
- var match = eExp.exec(v);
- if (match && match.length === 4) {
- addFilter(match[1], match[2], match[3]);
- } else {
- filterSelectize.addOption({value: v, text: v});
- filterSelectize.addItem(v);
- }
+ $('#filter-expand').click(function() {
+ $('#query-form .filter-row.collapse').show();
+ $(this).remove();
});
- $('#columnSelect').on('change', function() {
- $('#operatorSelect option').remove();
- var col = $('#columnSelect').val();
- var opS = $('#operatorSelect');
- columns[col]['op'].sort(myOpSort);
- columns[col]['op'].forEach(function (v) {
- $(opS).append($('<option>', {
- value: v, text: v
- }));
+ // Cosmetic - less clutter in URL
+ $('#query-form').submit(function(e) {
+ $(this).find('.filter-row').each(function() {
+ var $row = $(this);
+ if ($row.find('.filter-enable').prop('checked'))
+ return;
+ $row.find('input, select').prop('name', '');
});
- /* also set the type of the input */
- if (columns[col]['type'] === 'date') {
- $('#argumentInput').datepicker({format : 'yyyy-mm-dd'});
- $('#argumentSelect').hide();
- } else if(columns[col]['type'] === 'enum') {
- $('#argumentSelect').empty();
- $('#argumentInput').hide();
- $('#argumentSelect').show();
- columns[col]['values'].forEach(function (v) {
- var t = v;
- var disabled = (col === 'location');
- if (col === 'location' && slxLocations['L' + v]) {
- t = slxLocations['L' + v].pad + ' ' + slxLocations['L' + v].name;
- disabled = slxLocations['L' + v].disabled;
- }
- $('#argumentSelect').append($('<option>', { value: v, text: t, disabled: disabled }));
- });
- } else {
- $('#argumentInput').datepicker('remove');
- $('#argumentSelect option').remove();
- $('#argumentInput').show();
- $('#argumentSelect').hide();
- }
});
+ var check = function() {
+ $(this).closest('.filter-row').find('.filter-enable:visible').prop('checked', true);
+ };
+
+ // This sucks - we need to wait a bit otherwise datepicker triggers change
+ setTimeout(function() {
+ $('.enable-check').change(check).keypress(check);
+ }, 100);
+
$('.filter-col').each(function(idx, elem) {
var e = $(elem);
var col = e.data('filter-col');
@@ -203,66 +106,23 @@ document.addEventListener("DOMContentLoaded", function () {
e.find('.filter-val').each(function(idx, elem) {
var e = $(elem);
var val = e.data('filter-val');
- if (!val) return;
+ var op = e.data('filter-op');
+ if (!op) op = '=';
+ if (val === null || val === undefined) return;
e.click(function(ev) {
ev.preventDefault();
- addFilter(col, '=', val);
+ addFilter(col, op, val);
refresh();
});
});
});
-}, false);
-
-function popupFilter(field) {
- if (field != null) {
- $('#columnSelect').val(field);
- }
- $('#columnSelect').change();
- $modal.modal('show');
-}
-
-function addFilterFromForm() {
- var argument1 = $('#argumentInput').val();
- var argument2 = $('#argumentSelect').val();
- var argument = argument1 ? argument1 : argument2;
- var col = $('#columnSelect').val();
- var op = $('#operatorSelect').val();
-
- addFilter(col, op, argument);
- refresh(); // TODO: AJAX
-}
-
-function addFilter(col, op, argument) {
- var filterValue = col + ' ' + op + ' ' + argument;
- var filterText = filterValue;
- var displayArgument = argument;
- if (col === 'location' && slxLocations['L' + argument]) {
- displayArgument = slxLocations['L' + argument].name;
- }
- if (slxFilterNames[col]) {
- filterText = slxFilterNames[col] + ' ' + op + ' ' + displayArgument;
- }
- filterSelectize.addOption({value: filterValue, text: filterText});
- filterSelectize.addItem(filterValue);
-}
-
-function toggleSort(field) {
- $('#sort').val(field + ' ' + order);
- refresh();
-}
-
-/* equal sign should always be first, the rest doesn't matter*/
-function myOpSort(a,b) {
- if (a === '=') { return -1; }
- else if (a === b) {return 0}
- else { return 1;}
+ $('.auto-chart').each(function() {
+ makePieChart($(this));
+ });
-}
+}, false);
-function refresh() {
- $queryForm.submit(); /* TODO: use AJAX */
-}
// --></script>
diff --git a/modules-available/statistics/templates/hints-cpu-legacy.html b/modules-available/statistics/templates/hints-cpu-legacy.html
new file mode 100644
index 00000000..44a5b166
--- /dev/null
+++ b/modules-available/statistics/templates/hints-cpu-legacy.html
@@ -0,0 +1,28 @@
+<h2>{{lang_legacyCpuVmx}}</h2>
+
+<p>{{lang_legacyCpuVmxText}}</p>
+
+<table class="table">
+ <thead>
+ <tr>
+ <th>{{lang_machine}}</th>
+ <th>{{lang_cpuModel}}</th>
+ </tr>
+ </thead>
+ <tbody>
+ {{#list}}
+ <tr>
+ <td>
+ <span class="glyphicon {{icon}}"></span>
+ <a class="slx-bold" href="?do=statistics&amp;uuid={{machineuuid}}">
+ {{hostname}}{{^hostname}}{{clientip}}{{/hostname}}
+ </a>
+ <div class="small">{{machineuuid}}</div>
+ </td>
+ <td class="text-nowrap">
+ {{cpumodel}}
+ </td>
+ </tr>
+ {{/list}}
+ </tbody>
+</table> \ No newline at end of file
diff --git a/modules-available/statistics/templates/hints-hdd-grow.html b/modules-available/statistics/templates/hints-hdd-grow.html
new file mode 100644
index 00000000..b7c5bff4
--- /dev/null
+++ b/modules-available/statistics/templates/hints-hdd-grow.html
@@ -0,0 +1,67 @@
+<h2>{{lang_hddUnused}}</h2>
+
+<p>{{lang_hddUnusedId44}}</p>
+
+<table class="table">
+ <thead>
+ <tr>
+ <th>{{lang_machine}}</th>
+ <th>{{lang_unused}}</th>
+ <th>{{lang_id44size}}</th>
+ </tr>
+ </thead>
+ <tbody>
+ {{#id44}}
+ <tr>
+ <td>
+ <span class="glyphicon {{icon}}"></span>
+ <a class="slx-bold" href="?do=statistics&amp;uuid={{machineuuid}}">
+ {{hostname}}{{^hostname}}{{clientip}}{{/hostname}}
+ </a>
+ <div class="small">{{machineuuid}}</div>
+ </td>
+ <td>
+ {{unused_s}}
+ </td>
+ <td>
+ {{id44mb_s}}
+ </td>
+ </tr>
+ {{/id44}}
+ </tbody>
+</table>
+
+<p>{{lang_hddUnusedId45}}</p>
+
+<table class="table">
+ <thead>
+ <tr>
+ <th>{{lang_machine}}</th>
+ <th>{{lang_unused}}</th>
+ <th>{{lang_id45size}}</th>
+ <th>{{lang_id44size}}</th>
+ </tr>
+ </thead>
+ <tbody>
+ {{#id45}}
+ <tr>
+ <td>
+ <span class="glyphicon {{icon}}"></span>
+ <a class="slx-bold" href="?do=statistics&amp;uuid={{machineuuid}}">
+ {{hostname}}{{^hostname}}{{clientip}}{{/hostname}}
+ </a>
+ <div class="small">{{machineuuid}}</div>
+ </td>
+ <td>
+ {{unused_s}}
+ </td>
+ <td>
+ {{id45mb_s}}
+ </td>
+ <td>
+ {{id44mb_s}}
+ </td>
+ </tr>
+ {{/id45}}
+ </tbody>
+</table>
diff --git a/modules-available/statistics/templates/hints-nic-speed.html b/modules-available/statistics/templates/hints-nic-speed.html
new file mode 100644
index 00000000..963213cd
--- /dev/null
+++ b/modules-available/statistics/templates/hints-nic-speed.html
@@ -0,0 +1,32 @@
+<h2>{{lang_nicSlowSpeed}}</h2>
+
+<p>{{lang_nicSlowSpeedText}}</p>
+
+<table class="table">
+ <thead>
+ <tr>
+ <th>{{lang_machine}}</th>
+ <th>{{lang_nicSpeed}}</th>
+ <th>{{lang_nicDuplex}}</th>
+ </tr>
+ </thead>
+ <tbody>
+ {{#list}}
+ <tr>
+ <td>
+ <span class="glyphicon {{icon}}"></span>
+ <a class="slx-bold" href="?do=statistics&amp;uuid={{machineuuid}}">
+ {{hostname}}{{^hostname}}{{clientip}}{{/hostname}}
+ </a>
+ <div class="small">{{machineuuid}}</div>
+ </td>
+ <td class="text-nowrap">
+ {{nic-speed}}&thinsp;{{lang_MbitPerSecond}}
+ </td>
+ <td>
+ {{nic-duplex}}
+ </td>
+ </tr>
+ {{/list}}
+ </tbody>
+</table> \ No newline at end of file
diff --git a/modules-available/statistics/templates/hints-ram-underclocked.html b/modules-available/statistics/templates/hints-ram-underclocked.html
new file mode 100644
index 00000000..35bdd857
--- /dev/null
+++ b/modules-available/statistics/templates/hints-ram-underclocked.html
@@ -0,0 +1,49 @@
+<h2>{{lang_ramUnderclocked}}</h2>
+
+<p>{{lang_ramUnderclockedText}}</p>
+
+<table class="table">
+ <thead>
+ <tr>
+ <th>{{lang_machine}}</th>
+ <th>{{lang_type}}</th>
+ <th>{{lang_speedCurrent}}</th>
+ <th>{{lang_speedDesign}}</th>
+ <th>{{lang_manufacturer}}</th>
+ <th>{{lang_serialNo}}</th>
+ <th></th>
+ </tr>
+ </thead>
+ <tbody>
+ {{#list}}
+ <tr>
+ <td>
+ <span class="glyphicon {{icon}}"></span>
+ <a class="slx-bold" href="?do=statistics&amp;uuid={{machineuuid}}">
+ {{hostname}}{{^hostname}}{{clientip}}{{/hostname}}
+ </a>
+ <div class="small">{{machineuuid}}</div>
+ </td>
+ <td class="text-nowrap">
+ {{Type}} {{Form Factor}}
+ <div>{{Size}}</div>
+ </td>
+ <td class="text-nowrap">
+ {{Configured Memory Speed}}
+ </td>
+ <td class="text-nowrap">
+ {{Speed}}
+ </td>
+ <td class="text-nowrap">
+ {{Manufacturer}}
+ </td>
+ <td>
+ {{Serial Number}}
+ </td>
+ <td class="text-right">
+ <span class="badge">{{group_count}}</span>
+ </td>
+ </tr>
+ {{/list}}
+ </tbody>
+</table>
diff --git a/modules-available/statistics/templates/hints-ram-upgrade.html b/modules-available/statistics/templates/hints-ram-upgrade.html
new file mode 100644
index 00000000..7b60d419
--- /dev/null
+++ b/modules-available/statistics/templates/hints-ram-upgrade.html
@@ -0,0 +1,32 @@
+<h2>{{lang_ramUpgrade}}</h2>
+
+<p>{{lang_ramUpgradeText}}</p>
+
+<table class="table">
+ <thead>
+ <tr>
+ <th>{{lang_machine}}</th>
+ <th>{{lang_installedCountMax}}</th>
+ <th>{{lang_ramSizeCurrentMax}}</th>
+ </tr>
+ </thead>
+ <tbody>
+ {{#list}}
+ <tr>
+ <td>
+ <span class="glyphicon {{icon}}"></span>
+ <a class="slx-bold" href="?do=statistics&amp;uuid={{machineuuid}}">
+ {{hostname}}{{^hostname}}{{clientip}}{{/hostname}}
+ </a>
+ <div class="small">{{machineuuid}}</div>
+ </td>
+ <td class="{{count_class}}">
+ {{Memory Slot Occupied}} / {{Memory Slot Count}}
+ </td>
+ <td class="{{size_class}}">
+ {{Memory Installed Capacity}} / {{Memory Maximum Capacity}}
+ </td>
+ </tr>
+ {{/list}}
+ </tbody>
+</table> \ No newline at end of file
diff --git a/modules-available/statistics/templates/id44.html b/modules-available/statistics/templates/id44.html
index de1c71ad..7851ba87 100644
--- a/modules-available/statistics/templates/id44.html
+++ b/modules-available/statistics/templates/id44.html
@@ -15,9 +15,9 @@
</thead>
<tbody>
{{#rows}}
- <tr id="tmpid{{gb}}" class="{{class}} {{collapse}}">
+ <tr id="id44-{{idx}}" class="{{class}} {{collapse}}">
<td data-sort-value="{{gb}}" class="text-left text-nowrap">
- <a class="filter-val" data-filter-val="{{gb}}" href="?do=Statistics&amp;show=summary&amp;filters={{query}}~,~hddgb={{gb}}">{{gb}}&thinsp;GiB</a>
+ <a class="filter-val" data-filter-val="{{gb}}" data-filter-op="~" href="#">{{gb}}&thinsp;GiB</a>
</td>
<td class="text-right">{{count}}</td>
</tr>
@@ -34,28 +34,7 @@
</tbody>
</table>
</div>
- <div class="col-sm-6">
- <canvas id="temppartchart" style="width:100%;height:250px"></canvas>
- <script type="text/javascript">
- document.addEventListener("DOMContentLoaded", function() {
- var data = {{{json}}};
- var sel = false;
- new Chart(document.getElementById('temppartchart').getContext('2d')).Pie(data, {
- animation: false,
- tooltipTemplate: "<%if (label){%><%=label%><%}%>",
- customTooltips: function(tooltip) {
- if (sel !== false) sel.removeClass('slx-bold');
- if (!tooltip) {
- sel = false;
- return;
- }
- sel = $('#tmpid' + String(tooltip.text));
- sel.addClass('slx-bold');
- }
- });
- }, false);
- </script>
- </div>
+ <div class="col-sm-6 auto-chart" data-chart="{{json}}" data-chart-dest="#id44-"></div>
</div>
</div>
</div>
diff --git a/modules-available/statistics/templates/js-pciquery.html b/modules-available/statistics/templates/js-pciquery.html
new file mode 100644
index 00000000..5d4df867
--- /dev/null
+++ b/modules-available/statistics/templates/js-pciquery.html
@@ -0,0 +1,24 @@
+<script>
+ document.addEventListener('DOMContentLoaded', function() {
+ var missing = {{{missing_ids}}};
+ var doQuery = function() {
+ if (missing && missing.length > 0) {
+ $.ajax({
+ url: '?do=statistics', dataType: "json", method: "POST", data: {
+ token: TOKEN,
+ action: 'json-lookup',
+ list: missing.splice(0, 10) // Query 10 at a time max
+ }
+ }).done(function (data) {
+ if (!data)
+ return;
+ for (var k in data) {
+ $('.query-' + k.replace(':', '-')).text(data[k]);
+ }
+ doQuery();
+ });
+ }
+ }
+ doQuery();
+ });
+</script> \ No newline at end of file
diff --git a/modules-available/statistics/templates/kvmstate.html b/modules-available/statistics/templates/kvmstate.html
index efa3bad3..b3c65733 100644
--- a/modules-available/statistics/templates/kvmstate.html
+++ b/modules-available/statistics/templates/kvmstate.html
@@ -15,9 +15,9 @@
</thead>
<tbody>
{{#rows}}
- <tr id="kvm{{kvmstate}}">
+ <tr id="kvm-{{idx}}">
<td data-sort-value="{{kvmstate}}" class="text-left text-nowrap">
- <a class="filter-val" data-filter-val="{{kvmstate}}" href="?do=Statistics&amp;show=summary&amp;filters={{query}}~,~kvmstate={{kvmstate}}">{{kvmstate}}</a>
+ <a class="filter-val" data-filter-val="{{kvmstate}}" href="#">{{kvmstate}}</a>
</td>
<td class="text-right">{{count}}</td>
</tr>
@@ -25,28 +25,7 @@
</tbody>
</table>
</div>
- <div class="col-sm-6">
- <canvas id="kvmchart" style="width:100%;height:250px"></canvas>
- <script type="text/javascript">
- document.addEventListener("DOMContentLoaded", function() {
- var data = {{{json}}};
- var sel = false;
- new Chart(document.getElementById('kvmchart').getContext('2d')).Pie(data, {
- animation: false,
- tooltipTemplate: "<%if (label){%><%=label%><%}%>",
- customTooltips: function(tooltip) {
- if (sel !== false) sel.removeClass('slx-bold');
- if (!tooltip) {
- sel = false;
- return;
- }
- sel = $('#kvm' + tooltip.text);
- sel.addClass('slx-bold');
- }
- });
- }, false);
- </script>
- </div>
+ <div class="col-sm-6 auto-chart" data-chart="{{json}}" data-chart-dest="#kvm-"></div>
</div>
</div>
</div>
diff --git a/modules-available/statistics/templates/machine-hdds.html b/modules-available/statistics/templates/machine-hdds.html
index b839dfca..57786510 100644
--- a/modules-available/statistics/templates/machine-hdds.html
+++ b/modules-available/statistics/templates/machine-hdds.html
@@ -4,21 +4,27 @@
<div class="col-md-6">
<div class="panel panel-default">
<div class="panel-heading">
- <b>{{s_ModelFamily}}</b> {{dev}}
+ <b>{{model_family}}{{^model_family}}{{model}}{{/model_family}}</b> {{dev}}
</div>
<div class="panel-body">
- {{#s_DeviceModel}}
- <div>{{lang_modelNo}}: {{s_DeviceModel}}, {{lang_serialNo}}: {{s_SerialNumber}}</div>
- {{/s_DeviceModel}}
- {{#s_ReallocatedSectorCt}}
- <div class="red">{{lang_reallocatedSectors}}: {{s_ReallocatedSectorCt}}</div>
- {{/s_ReallocatedSectorCt}}
- {{#s_CurrentPendingSector}}
- <div class="red">{{lang_pendingSectors}}: {{s_CurrentPendingSector}}</div>
- {{/s_CurrentPendingSector}}
- {{#s_PowerOnHours}}
- <div>{{lang_powerOnTime}}: {{s_PowerOnHours}}&thinsp;{{lang_hours}} ({{PowerOnTime}})</div>
- {{/s_PowerOnHours}}
+ {{#model}}
+ <div>{{lang_modelNo}}: {{model}}, {{lang_serialNo}}: {{serial_number}}</div>
+ {{/model}}
+ {{#smart_status_failed}}
+ <div class="red">{{lang_smartSelfTestFailed}}</div>
+ {{/smart_status_failed}}
+ {{#attr_5.raw}}
+ <div class="red">{{lang_reallocatedSectors}}: {{attr_5.raw}}</div>
+ {{/attr_5.raw}}
+ {{#attr_197.raw}}
+ <div class="red">{{lang_pendingSectors}}: {{attr_197.raw}}</div>
+ {{/attr_197.raw}}
+ {{#PowerOnTime}}
+ <div>{{lang_powerOnTime}}: {{PowerOnTime}}</div>
+ {{/PowerOnTime}}
+ {{#media_errors}}
+ <div class="red">{{lang_mediaIntegrityErrors}}: {{media_errors}}</div>
+ {{/media_errors}}
<div class="row">
<div class="col-sm-7">
<table class="table table-condensed table-striped table-responsive">
@@ -28,40 +34,32 @@
<th>{{lang_partType}}</th>
</tr>
{{#partitions}}
- <tr id="{{id}}">
- <td>{{name}}</td>
- <td class="text-right text-nowrap">{{size}}&thinsp;GiB</td>
- <td>{{type}}</td>
+ <tr id="part-{{hddidx}}-{{idx}}">
+ <td>{{index}}</td>
+ <td class="text-right text-nowrap">{{size_s}}</td>
+ <td class="text-nowrap">
+ <table class="slx-ellipsis"><tr><td>{{name}}</td></tr></table>
+ </td>
</tr>
{{/partitions}}
</table>
- <div class="slx-bold">{{lang_total}}: {{size}}&thinsp;GiB</div>
+ <div class="slx-bold">{{lang_total}}: {{size_s}}</div>
+ {{#unused_s}}
+ <div class="slx-bold">{{lang_unused}}: {{unused_s}}</div>
+ {{/unused_s}}
</div>
- <div class="col-sm-5">
- <canvas id="{{devid}}-chart" style="width:100%;height:250px"></canvas>
- <script type="text/javascript">
- document.addEventListener("DOMContentLoaded", function() {
- var data = {{{json}}};
- var sel = false;
- new Chart(document.getElementById('{{devid}}-chart').getContext('2d')).Pie(data, {
- animation: false,
- tooltipTemplate: "<%if (label){%><%=label%><%}%>",
- customTooltips: function(tooltip) {
- if (sel !== false) sel.removeClass('info');
- if (!tooltip) {
- sel = false;
- return;
- }
- sel = $('#' + tooltip.text);
- sel.addClass('info');
- }
- });
- }, false);
- </script>
+ <div class="col-sm-5 auto-chart" data-chart="{{json}}" data-chart-dest="#part-{{hddidx}}-">
</div>
</div>
</div>
</div>
</div>
{{/hdds}}
+ <script type="text/javascript">
+ document.addEventListener("DOMContentLoaded", function() {
+ $('.auto-chart').each(function() {
+ makePieChart($(this));
+ });
+ });
+ </script>
</div> \ No newline at end of file
diff --git a/modules-available/statistics/templates/machine-main.html b/modules-available/statistics/templates/machine-main.html
index 8c5668f2..be32f9c7 100644
--- a/modules-available/statistics/templates/machine-main.html
+++ b/modules-available/statistics/templates/machine-main.html
@@ -29,6 +29,12 @@
<td class="text-nowrap">{{lang_ip}}</td>
<td>{{clientip}}</td>
</tr>
+ {{#nic-speed}}
+ <tr>
+ <td class="text-nowrap">{{lang_nicSpeed}}</td>
+ <td>{{nic-speed}}&thinsp;MBit/s, {{lang_duplex}}: {{nic-duplex}}</td>
+ </tr>
+ {{/nic-speed}}
{{#hostname}}
<tr>
<td class="text-nowrap">{{lang_hostname}}</td>
@@ -41,7 +47,17 @@
</tr>
<tr>
<td class="text-nowrap">{{lang_lastBoot}}</td>
- <td>{{lastboot_s}}</td>
+ <td>
+ {{lastboot_s}}
+ {{#minilinux}}
+ <div>
+ {{lang_baseSystem}}: {{minilinux}}
+ {{#boottime_s}}
+ (<span title="{{lang_boottimeTooltip}}">{{boottime_s}}</span>)
+ {{/boottime_s}}
+ </div>
+ {{/minilinux}}
+ </td>
</tr>
<tr>
<td class="text-nowrap">{{lang_lastSeen}}</td>
@@ -88,42 +104,61 @@
</td>
</tr>
{{/modeid}}
- {{#hasroomplan}}
+ {{#roomsvg}}
<tr>
<td class="text-nowrap">
{{lang_roomplan}}
</td>
<td>
+ <div>
+ {{{roomsvg}}}
+ </div>
<a href="?do=roomplanner&amp;locationid={{locationid}}" target="_blank"
- onclick="window.open(this.href, '_blank', 'toolbar=0,scrollbars,resizable');return false">
- <img src="api.php?do=roomplanner&amp;show=svg&amp;locationid={{locationid}}&amp;machineuuid={{machineuuid}}&amp;fallback=1"/>
+ onclick="window.open(this.href, '_blank', 'toolbar=0,scrollbars,resizable');return false">
+ {{lang_edit}}
</a>
</td>
</tr>
- {{/hasroomplan}}
+ {{/roomsvg}}
{{#rebootcontrol}}
<tr>
<td class="text-nowrap">
- {{lang_reboot}}/{{lang_shutdown}}
+ {{lang_remoteActions}}
</td>
<td>
<form method="post" action="?do=statistics">
<input type="hidden" name="token" value="{{token}}">
<input type="hidden" name="uuid" value="{{machineuuid}}">
- {{#canShutdown}}
- <button type="button" class="btn btn-sm btn-danger btn-machine-action" data-toggle="modal"
- data-target="#shutdown-confirm">
- <span class="glyphicon glyphicon-off"></span>
- {{lang_shutdown}}
+ <div class="slx-smallspace">
+ {{#canShutdown}}
+ <button type="button" class="btn btn-sm btn-danger btn-machine-action" data-toggle="modal"
+ data-target="#shutdown-confirm">
+ <span class="glyphicon glyphicon-off"></span>
+ {{lang_shutdown}}
+ </button>
+ {{/canShutdown}}
+ {{#canReboot}}
+ <button type="button" class="btn btn-sm btn-warning btn-machine-action" data-toggle="modal"
+ data-target="#reboot-confirm">
+ <span class="glyphicon glyphicon-repeat"></span>
+ {{lang_reboot}}
+ </button>
+ {{/canReboot}}
+ </div>
+ <div>
+ {{#canWol}}
+ <button type="submit" name="action" value="wol" class="btn btn-sm btn-primary btn-machine-action">
+ <span class="glyphicon glyphicon-bell"></span>
+ {{lang_wakeOnLan}}
</button>
- {{/canShutdown}}
- {{#canReboot}}
- <button type="button" class="btn btn-sm btn-warning btn-machine-action" data-toggle="modal"
- data-target="#reboot-confirm">
- <span class="glyphicon glyphicon-repeat"></span>
- {{lang_reboot}}
+ {{/canWol}}
+ {{#canExec}}
+ <button type="submit" name="action" value="prepare-exec" class="btn btn-sm btn-primary btn-machine-action">
+ <span class="glyphicon glyphicon-play"></span>
+ {{lang_remoteExec}}
</button>
- {{/canReboot}}
+ {{/canExec}}
+ </div>
<div class="modal fade" id="reboot-confirm" tabindex="-1" role="dialog">
<div class="modal-dialog" role="document">
<div class="modal-content">
@@ -182,7 +217,7 @@
{{lang_configVars}}
</td>
<td>
- <a class="btn btn-sm btn-default" href="?do=baseconfig&amp;module=statistics&amp;machineuuid={{machineuuid}}">
+ <a class="btn btn-sm btn-default" href="?do=baseconfig&amp;module=statistics&amp;machineuuid={{machineuuid}}&amp;redirect={{qstr_urlencode}}">
<span class="glyphicon glyphicon-edit"></span>
{{lang_edit}} ({{overriddenVars}})
</a>
@@ -203,23 +238,44 @@
<tr>
<td class="text-nowrap">{{lang_cpuModel}}</td>
<td>
- {{cpumodel}}
- {{#Sockets}}
+ <a href="?do=statistics&amp;show=list&amp;filter[cpumodel]=1&amp;op[cpumodel]=%3D&amp;arg[cpumodel]={{cpumodel}}">
+ {{cpumodel}}
+ </a>
+ {{#cpu-sockets}}
<div class="small">
- {{lang_sockets}}: {{Sockets}}, {{lang_cores}}: {{Realcores}}, {{lang_virtualCores}}: {{Virtualcores}}
+ {{lang_sockets}}: {{cpu-sockets}}, {{lang_cores}}: {{cpu-cores}}, {{lang_virtualCores}}: {{cpu-threads}}
</div>
- {{/Sockets}}
+ {{/cpu-sockets}}
+ {{#live_cpuload_s}}
+ <div class="meter">
+ <div class="text left">{{lang_cpuload}}</div>
+ <div class="text right">{{live_cpuload_s}}</div>
+ <div class="bar" style="width:{{live_cpuidle}}%"></div>
+ </div>
+ {{/live_cpuload_s}}
+ {{#live_cputemp}}
+ <div class="meter">
+ <div class="text left">{{lang_cputemp}}</div>
+ <div class="text right">{{live_cputemp}}&thinsp;°C</div>
+ <div class="bar" style="width:{{live_cputemppercent}}%"></div>
+ </div>
+ {{/live_cputemp}}
</td>
</tr>
<tr>
<td class="text-nowrap">{{lang_pcmodel}}</td>
- <td>{{pcmodel}} ({{pcmanufacturer}})</td>
+ <td>
+ {{#system.Product Name}}
+ <a href="?do=statistics&amp;show=list&amp;filter[systemmodel]=1&amp;op[systemmodel]=%3D&amp;arg[systemmodel]={{system.Product Name}}+({{system.Manufacturer}})">
+ {{system.Product Name}} ({{system.Manufacturer}})
+ </a>
+ {{/system.Product Name}}
+ </td>
</tr>
<tr>
<td class="text-nowrap">{{lang_mobomodel}}</td>
- <td>{{mobomodel}} ({{mobomanufacturer}})</td>
+ <td>{{mainboard.Product Name}} ({{mainboard.Manufacturer}})</td>
</tr>
- {{#biosdate}}
<tr>
<td class="text-nowrap">
<div>{{lang_biosVersion}}</div>
@@ -227,19 +283,23 @@
</td>
<td class="text-nowrap">
<div id="bios-panel" class="pull-right"style="max-width:30%">{{{bioshtml}}}</div>
- <div>{{biosversion}} (<b>{{biosrevision}}</b>)</div>
- <div>{{biosdate}}</div>
+ <div>{{bios.Version}} (<b>{{bios.BIOS Revision}}</b>)</div>
+ <div>{{bios.Release Date}}</div>
</td>
</tr>
- {{/biosdate}}
<tr class="{{ramclass}}">
<td class="text-nowrap">{{lang_ram}}</td>
<td>
<div>
{{gbram}}&thinsp;GiB
- {{#maxram}}({{lang_maximumAbbrev}} {{maxram}}){{/maxram}}
- {{ramtype}}
+ {{#Memory Maximum Capacity}}
+ / {{lang_maximumAbbrev}} {{Memory Maximum Capacity}}
+ {{/Memory Maximum Capacity}}
+ {{#Memory Slot Count}}
+ ({{Memory Slot Count}} {{lang_slots}})
+ {{/Memory Slot Count}}
</div>
+ <div>{{ramtype}}</div>
{{#live_memsize}}
<div class="meter">
<div class="text left">{{lang_ram}}</div>
@@ -256,31 +316,72 @@
{{/live_swapsize}}
</td>
</tr>
- {{#extram}}
<tr>
- <td class="text-nowrap">{{lang_ramSlots}}</td>
- <td>
- {{ramslotcount}}:
- {{#ramslot}}
- [ <span title="{{manuf}}">{{size}}</span> ]
- {{/ramslot}}
+ <td colspan="2">
+ <table class="table-responsive slx-table text-nowrap">
+ <thead>
+ <tr class="small">
+ <td>{{lang_slot}}</td>
+ <td></td>
+ <td>{{lang_speed}}</td>
+ <td>{{lang_manufacturer}}</td>
+ <td>{{lang_serialNo}}</td>
+ </tr>
+ </thead>
+ {{#ram}}
+ {{#Speed}}
+ <tr>
+ <td>
+ {{Locator}},
+ {{Bank Locator}}
+ {{^Bank Locator}}{{#Set}}Set {{Set}}{{/Set}}{{/Bank Locator}}
+ </td>
+ <td class="slx-bold">{{Size}}</td>
+ <td>{{#Configured Memory Speed}}{{Configured Memory Speed}} / {{/Configured Memory Speed}}{{Speed}}</td>
+ <td>{{Manufacturer}}</td>
+ <td>{{Serial Number}}</td>
+ </tr>
+ {{/Speed}}
+ {{/ram}}
+ </table>
</td>
</tr>
- {{/extram}}
<tr class="{{hddclass}}">
- <td class="text-nowrap">{{lang_tempPart}}</td>
+ <td class="text-nowrap">{{lang_tempPartID}}
+ <div class="text-muted">
+ {{lang_tempPart}}
+ </div>
+ </td>
<td>
<div>
{{gbtmp}}&thinsp;GiB
</div>
{{#live_tmpsize}}
- <div class="meter">
- <div class="text right">{{live_tmpfree_s}} {{lang_free}}</div>
- <div class="bar" style="width:{{live_tmppercent}}%"></div>
- </div>
+ <div class="meter">
+ <div class="text right">{{live_tmpfree_s}} {{lang_free}}</div>
+ <div class="bar" style="width:{{live_tmppercent}}%"></div>
+ </div>
{{/live_tmpsize}}
</td>
</tr>
+ <tr>
+ <td class="text-nowrap">{{lang_persistentPartID}}
+ <div class="text-muted">
+ {{lang_persistentPart}}
+ </div>
+ </td>
+ <td>
+ <div>
+ {{gbid45}}&thinsp;GiB
+ </div>
+ {{#live_id45size}}
+ <div class="meter">
+ <div class="text right">{{live_id45free_s}} {{lang_free}}</div>
+ <div class="bar" style="width:{{live_id45percent}}%"></div>
+ </div>
+ {{/live_id45size}}
+ </td>
+ </tr>
<tr class="{{kvmclass}}">
<td class="text-nowrap">{{lang_64bitSupport}}</td>
<td>{{kvmstate}}</td>
@@ -326,16 +427,28 @@
</table>
<h4>{{lang_devices}}</h4>
{{#lspci1}}
- <div><span class="{{lookupClass}}">{{class}}</span></div>
+ <div><span>{{class_s}}</span></div>
{{#entries}}
- <div class="small">&emsp;└ <span class="{{lookupVen}}">{{ven}}</span> <span class="{{lookupDev}}">{{dev}}</span></div>
+ <div class="small">
+ &emsp;└
+ <span class="badge">{{pt}}</span>
+ <span{{^vendor_s}} class="query-{{vendor}}"{{/vendor_s}}>{{vendor_s}}</span>
+ <span{{^device_s}} class="query-{{vendor}}-{{device}}"{{/device_s}}>{{device_s}}</span>
+ <a href="?do=passthrough&amp;show=hwlist#{{vendor}}-{{device}}">[{{vendor}}:{{device}}]</a>
+ </div>
{{/entries}}
{{/lspci1}}
<div id="lspci" class="collapse">
{{#lspci2}}
- <div><span class="{{lookupClass}}">{{class}}</span></div>
+ <div><span>{{class_s}}</span></div>
{{#entries}}
- <div class="small">&emsp;└ <span class="{{lookupVen}}">{{ven}}</span> <span class="{{lookupDev}}">{{dev}}</span></div>
+ <div class="small">
+ &emsp;└
+ <span class="badge">{{pt}}</span>
+ <span{{^vendor_s}} class="query-{{vendor}}"{{/vendor_s}}>{{vendor_s}}</span>
+ <span{{^device_s}} class="query-{{vendor}}-{{device}}"{{/device_s}}>{{device_s}}</span>
+ <a href="?do=passthrough&amp;show=hwlist#{{vendor}}-{{device}}">[{{vendor}}:{{device}}]</a>
+ </div>
{{/entries}}
{{/lspci2}}
</div>
@@ -344,13 +457,3 @@
</div>
</div>
</div>
-<script type="application/javascript"><!--
-document.addEventListener("DOMContentLoaded", function () {
- $('span.do-lookup').each(function () {
- $(this).load('?do=statistics&lookup=' + $(this).text());
- });
- {{#biosurl}}
- $('#bios-panel').load('{{{biosurl}}}');
- {{/biosurl}}
-}, false);
-// --></script>
diff --git a/modules-available/statistics/templates/memory.html b/modules-available/statistics/templates/memory.html
index cfb86062..0ccbca98 100644
--- a/modules-available/statistics/templates/memory.html
+++ b/modules-available/statistics/templates/memory.html
@@ -15,9 +15,9 @@
</thead>
<tbody>
{{#rows}}
- <tr id="ramid{{gb}}" class="{{class}} {{collapse}}">
+ <tr id="ram-{{idx}}" class="{{class}} {{collapse}}">
<td class="text-left text-nowrap" data-sort-value="{{gb}}">
- <a class="filter-val" data-filter-val="{{gb}}" href="?do=Statistics&amp;show=summary&amp;filters={{query}}~,~gbram={{gb}}">{{gb}}&thinsp;GiB</a>
+ <a class="filter-val" data-filter-val="{{gb}}" data-filter-op="~" href="#">{{gb}}&thinsp;GiB</a>
</td>
<td class="text-right">{{count}}</td>
</tr>
@@ -34,28 +34,7 @@
</tbody>
</table>
</div>
- <div class="col-sm-6">
- <canvas id="ramsizechart" style="width:100%;height:250px"></canvas>
- <script type="text/javascript">
- document.addEventListener("DOMContentLoaded", function() {
- var data = {{{json}}};
- var sel = false;
- new Chart(document.getElementById('ramsizechart').getContext('2d')).Pie(data, {
- animation: false,
- tooltipTemplate: "<%if (label){%><%=label%><%}%>",
- customTooltips: function(tooltip) {
- if (sel !== false) sel.removeClass('slx-bold');
- if (!tooltip) {
- sel = false;
- return;
- }
- sel = $('#ramid' + tooltip.text);
- sel.addClass('slx-bold');
- }
- });
- }, false);
- </script>
- </div>
+ <div class="col-sm-6 auto-chart" data-chart="{{json}}" data-chart-dest="#ram-"></div>
</div>
</div>
</div>
diff --git a/modules-available/statistics/templates/summary.html b/modules-available/statistics/templates/summary.html
index 3ede7bc5..751a9bed 100644
--- a/modules-available/statistics/templates/summary.html
+++ b/modules-available/statistics/templates/summary.html
@@ -23,17 +23,61 @@
</div>
</div>
<div>
+ {{#json}}
<canvas id="usagehist" style="width:100%;height:150px"></canvas>
<script type="text/javascript">
document.addEventListener("DOMContentLoaded", function() {
+
+ var markings = {{{markings}}};
+ var markMax = Math.max(...markings) * 3;
+ var showLegend = markMax > 0;
+ if (markMax < 8) markMax = 8;
+
+ var oldDraw = Chart.prototype._drawDatasets;
+
+ Chart.prototype._drawDatasets = function () {
+ if (this.chartArea) {
+ var ctx = this.ctx;
+ var chartArea = this.chartArea;
+
+ var meta = this.getDatasetMeta(0);
+
+ ctx.save();
+ var end = Math.min(meta.data.length, markings.length) - 1;
+ for (var i = 0; i < end; ++i) {
+ var start = meta.data[i].x;
+ var stop = meta.data[i+1].x;
+ ctx.fillStyle = 'rgba(16, 64, 255, ' + (!!markings[i] * .05 + markings[i] / markMax) + ')';
+ ctx.fillRect(start, chartArea.top, stop - start, chartArea.bottom - chartArea.top);
+ }
+ ctx.restore();
+ }
+
+ // Perform regular chart draw
+ oldDraw.call(this);
+ };
+
var data = {{{json}}};
var sel = false;
- new Chart(document.getElementById('usagehist').getContext('2d')).Line(data, {
+ new Chart(document.getElementById('usagehist').getContext('2d'), {type: 'line', data: data, options: {
+ responsive: true,
animation: false,
- pointHitDetectionRadius: 5
- });
+ pointRadius: 0,
+ pointHitRadius: 6,
+ interaction: { mode: 'index' },
+ plugins: {
+ subtitle: {
+ display: showLegend,
+ text: '{{lang_graphLectureTitle}}',
+ position: 'bottom',
+ },
+ legend: {position: 'left' },
+ }
+ }});
+
}, false);
</script>
+ {{/json}}
</div>
</div>