summaryrefslogtreecommitdiffstats
path: root/modules-available/runmode/templates/machine-selector.html
diff options
context:
space:
mode:
authorSimon Rettberg2017-07-06 13:11:54 +0200
committerSimon Rettberg2017-07-06 13:11:54 +0200
commitff6e86e8e5db2728d3b34c10f561cfdb533afa87 (patch)
treebc9d492397689a4e95473840a5023972aa97af95 /modules-available/runmode/templates/machine-selector.html
parent[summernote] Make auto-loading dep (diff)
downloadslx-admin-ff6e86e8e5db2728d3b34c10f561cfdb533afa87.tar.gz
slx-admin-ff6e86e8e5db2728d3b34c10f561cfdb533afa87.tar.xz
slx-admin-ff6e86e8e5db2728d3b34c10f561cfdb533afa87.zip
[runmode] New module for managing special boot modes of clients
Diffstat (limited to 'modules-available/runmode/templates/machine-selector.html')
-rw-r--r--modules-available/runmode/templates/machine-selector.html127
1 files changed, 127 insertions, 0 deletions
diff --git a/modules-available/runmode/templates/machine-selector.html b/modules-available/runmode/templates/machine-selector.html
new file mode 100644
index 00000000..95b255b5
--- /dev/null
+++ b/modules-available/runmode/templates/machine-selector.html
@@ -0,0 +1,127 @@
+<h1>{{lang_assignRunmodeToMachine}}</h1>
+<h2>{{moduleName}} // {{modeName}}</h2>
+<p>{{lang_assignMachineIntroText}}</p>
+
+<div class="hidden">
+ {{#machines}}
+ <div id="qex-{{machineuuid}}">{{hostname}}</div>
+ {{/machines}}
+</div>
+
+<h4>{{lang_addNewMachines}}</h4>
+<form method="post" action="?do=runmode">
+ <input type="hidden" name="token" value="{{token}}">
+ <input type="hidden" name="action" value="save-mode">
+ <input type="hidden" name="module" value="{{module}}" id="i-module">
+ <input type="hidden" name="modeid" value="{{modeid}}" id="i-modeid">
+ <select id="machine-sel" name="machines[]" multiple>
+ </select>
+ <div class="buttonbar">
+ <button type="submit" class="btn btn-primary">{{lang_save}}</button>
+ </div>
+</form>
+
+<script type="application/javascript"><!--
+
+const MODULE = document.getElementById('i-module').value;
+const MODE_ID = document.getElementById('i-modeid').value;
+
+function makeCombinedField(machineArray) {
+ machineArray.forEach(function (v, i, a) {
+ machineArray[i].combined = (v.machineuuid + " " + v.hostname + " " + v.clientip + " " + v.macaddr + " " + v.macaddr.replace(/-/g, ':')).toLocaleLowerCase();
+ machineArray[i].isUsed = v.module && v.module.length && (v.module !== MODULE || v.modeid !== MODE_ID);
+ });
+ return machineArray;
+}
+
+var queryCache = {};
+
+
+function filterCache(key, query) {
+ return queryCache[key].filter(function (el) {
+ return -1 !== el.combined.indexOf(query);
+ });
+}
+
+function loadMachines(query, callback) {
+ if (query.length < 2) {
+ callback();
+ return;
+ }
+ query = query.toLocaleLowerCase();
+ // See if we have a previous query in our cache that is a superset for this one
+ for (var k in queryCache) {
+ if (query.indexOf(k) !== -1) {
+ callback(filterCache(k, query));
+ return;
+ }
+ }
+ $.ajax({
+ url: '?do=runmode&action=getmachines&query=' + encodeURIComponent(query),
+ type: 'GET',
+ dataType: 'json',
+ error: function () {
+ callback();
+ },
+ success: function (json) {
+ var machines = makeCombinedField(json.machines);
+ // Server cuts off at 100, so only cache if it contains less entries, as
+ // the new, more specific query could return previously removed results.
+ if (machines.length < 100) {
+ queryCache[query] = machines;
+ }
+ callback(machines);
+ }
+ });
+}
+
+function renderMachineOption(item, escape) {
+ var extraClass = '';
+ var usedRow = '';
+ if (item.isUsed) {
+ usedRow = '<tr class="mode"><td>Mode:</td><td>' + escape(item.module + ' // ' + item.modeid) + '</td></tr>';
+ extraClass = 'used';
+ }
+ item.hostname || (item.hostname = item.clientip);
+ return '<div class="machine-entry ' + extraClass +'">'
+ + ' <div class="machine-body">'
+ + ' <div class="machine-entry-header"> ' + escape(item.hostname) + '</div>'
+ + ' <table>'
+ + '<tr><td>UUID:</td> <td>' + escape(item.machineuuid) + '</td></tr>'
+ + '<tr><td>MAC: </td> <td>' + escape(item.macaddr) + '</td></tr>'
+ + '<tr><td>IP: </td> <td>' + escape(item.clientip) + '</td></tr>'
+ + usedRow
+ + ' </table>'
+ + ' </div>'
+ + '</div>';
+}
+
+function renderMachineSelected(item, escape) {
+ item.hostname || (item.hostname = item.clientip);
+ var extra = '';
+ if (item.isUsed) {
+ extra = '<span class="glyphicon glyphicon-warning-sign text-danger"></span> '
+ }
+ return '<div>' + extra + escape(item.hostname) + '<div class="small">' + escape(item.clientip + ' - ' + item.macaddr) + '</div>'
+ + '</div>';
+}
+
+document.addEventListener('DOMContentLoaded', function () {
+ var old = {{{machines}}} || [];
+ var $box = $('#machine-sel').selectize({
+ options: old,
+ items: old.map(function(x) { return x.machineuuid; }),
+ plugins: ["remove_button"],
+ valueField: 'machineuuid',
+ searchField: "combined",
+ openOnFocus: false,
+ create: false,
+ render: {option: renderMachineOption, item: renderMachineSelected},
+ load: loadMachines,
+ maxItems: null,
+ sortField: 'hostname',
+ sortDirection: 'asc'
+ });
+});
+
+//--></script> \ No newline at end of file