meshviewer/lib/proportions.js

180 lines
5.4 KiB
JavaScript
Raw Normal View History

2017-03-09 23:53:23 +00:00
define(['d3-interpolate', 'virtual-dom', 'filters/genericnode', 'helper'],
function (d3Interpolate, V, Filter, helper) {
'use strict';
2015-04-02 20:07:00 +00:00
return function (config, filterManager) {
var self = this;
2017-03-09 23:53:23 +00:00
var scale = d3Interpolate.interpolate('#770038', '#dc0067');
2015-03-30 00:58:47 +00:00
var statusTable = document.createElement('table');
statusTable.classList.add('proportion');
2017-02-18 23:15:36 +00:00
var fwTable = statusTable.cloneNode(false);
var hwTable = statusTable.cloneNode(false);
var geoTable = statusTable.cloneNode(false);
var autoTable = statusTable.cloneNode(false);
var siteTable = statusTable.cloneNode(false);
function showStatGlobal(o) {
2016-05-26 16:37:24 +00:00
return helper.showStat(o);
}
function count(nodes, key, f) {
var dict = {};
2015-03-30 00:58:47 +00:00
nodes.forEach(function (d) {
2016-05-26 16:37:24 +00:00
var v = helper.dictGet(d, key.slice(0));
2015-03-30 00:58:47 +00:00
if (f !== undefined) {
v = f(v);
}
2015-03-30 00:58:47 +00:00
if (v === null) {
return;
}
2015-03-30 00:58:47 +00:00
dict[v] = 1 + (v in dict ? dict[v] : 0);
});
2015-03-30 00:58:47 +00:00
return Object.keys(dict).map(function (d) {
return [d, dict[d], key, f];
});
}
2015-03-30 00:58:47 +00:00
function addFilter(filter) {
return function () {
filterManager.addFilter(filter);
return false;
};
}
function fillTable(name, table, data) {
if (!table.last) {
table.last = V.h('table');
}
2017-02-18 23:15:36 +00:00
var max = Math.max.apply(Math, data.map(function (o) {
return o[1];
}));
var items = data.map(function (d) {
var v = d[1] / max;
2017-01-28 14:33:13 +00:00
var filter = new Filter(_.t(name), d[2], d[0], d[3]);
2015-07-07 22:36:57 +00:00
var a = V.h('a', { href: '#', onclick: addFilter(filter) }, d[0]);
var th = V.h('th', a);
var td = V.h('td', V.h('span', {
style: {
width: Math.round(v * 100) + '%',
2017-03-09 23:53:23 +00:00
backgroundColor: scale(v),
color: 'white'
}
}, d[1].toFixed(0)));
2015-03-30 00:58:47 +00:00
return V.h('tr', [th, td]);
});
var tableNew = V.h('table', items);
table = V.patch(table, V.diff(table.last, tableNew));
table.last = tableNew;
}
self.setData = function setData(data) {
2016-05-26 16:37:24 +00:00
var onlineNodes = data.nodes.all.filter(helper.online);
var nodes = onlineNodes.concat(data.nodes.lost);
var nodeDict = {};
data.nodes.all.forEach(function (d) {
nodeDict[d.nodeinfo.node_id] = d;
});
var statusDict = count(nodes, ['flags', 'online'], function (d) {
return d ? 'online' : 'offline';
});
var fwDict = count(nodes, ['nodeinfo', 'software', 'firmware', 'release']);
var hwDict = count(nodes, ['nodeinfo', 'hardware', 'model']);
var geoDict = count(nodes, ['nodeinfo', 'location'], function (d) {
2017-01-28 14:33:13 +00:00
return d && d.longitude && d.latitude ? _.t('yes') : _.t('no');
});
var autoDict = count(nodes, ['nodeinfo', 'software', 'autoupdater'], function (d) {
if (d === null) {
return null;
} else if (d.enabled) {
return d.branch;
}
2017-01-28 14:33:13 +00:00
return _.t('node.deactivated');
});
var siteDict = count(nodes, ['nodeinfo', 'system', 'site_code'], function (d) {
var rt = d;
if (config.siteNames) {
config.siteNames.forEach(function (t) {
if (d === t.site) {
rt = t.name;
}
});
}
return rt;
});
2017-01-28 14:33:13 +00:00
fillTable('node.status', statusTable, statusDict.sort(function (a, b) {
return b[1] - a[1];
}));
2017-01-28 14:33:13 +00:00
fillTable('node.firmware', fwTable, fwDict.sort(function (a, b) {
2016-05-26 16:37:24 +00:00
if (b[0] < a[0]) {
return -1;
}
if (b[0] > a[0]) {
return 1;
}
return 0;
}));
2017-01-28 14:33:13 +00:00
fillTable('node.hardware', hwTable, hwDict.sort(function (a, b) {
return b[1] - a[1];
}));
2017-01-28 14:33:13 +00:00
fillTable('node.visible', geoTable, geoDict.sort(function (a, b) {
return b[1] - a[1];
}));
2017-01-28 14:33:13 +00:00
fillTable('node.update', autoTable, autoDict.sort(function (a, b) {
return b[1] - a[1];
}));
2017-01-28 14:33:13 +00:00
fillTable('node.site', siteTable, siteDict.sort(function (a, b) {
return b[1] - a[1];
}));
};
self.render = function render(el) {
var h2;
2017-01-28 14:33:13 +00:00
self.renderSingle(el, 'node.status', statusTable);
self.renderSingle(el, 'node.firmware', fwTable);
self.renderSingle(el, 'node.hardware', hwTable);
self.renderSingle(el, 'node.visible', geoTable);
self.renderSingle(el, 'node.update', autoTable);
self.renderSingle(el, 'node.site', siteTable);
if (config.globalInfos) {
config.globalInfos.forEach(function (globalInfo) {
h2 = document.createElement('h2');
h2.textContent = globalInfo.name;
el.appendChild(h2);
el.appendChild(showStatGlobal(globalInfo));
});
}
};
2015-03-30 00:58:47 +00:00
self.renderSingle = function renderSingle(el, heading, table) {
2017-02-18 23:15:36 +00:00
var h2 = document.createElement('h2');
h2.classList.add('proportion-header');
2017-01-28 14:33:13 +00:00
h2.textContent = _.t(heading);
h2.onclick = function onclick() {
2017-02-18 23:15:36 +00:00
table.classList.toggle('hide');
};
el.appendChild(h2);
el.appendChild(table);
};
return self;
};
});