hopglass/lib/proportions.js

250 lines
7.5 KiB
JavaScript
Raw Normal View History

2015-07-08 00:36:57 +02:00
define(["chroma-js", "virtual-dom", "numeral-intl", "filters/genericnode", "vercomp" ],
function (Chroma, V, numeral, Filter, vercomp) {
2015-04-02 22:07:00 +02:00
2015-07-08 00:36:57 +02:00
return function (config, filterManager) {
2015-03-30 02:58:47 +02:00
var self = this
var scale = Chroma.scale("YlGnBu").mode("lab")
var statusTable = document.createElement("table")
statusTable.classList.add("proportion")
var fwTable = document.createElement("table")
fwTable.classList.add("proportion")
var hwTable = document.createElement("table")
hwTable.classList.add("proportion")
var geoTable = document.createElement("table")
geoTable.classList.add("proportion")
var autoTable = document.createElement("table")
autoTable.classList.add("proportion")
2015-12-28 18:06:20 +01:00
var uplinkTable = document.createElement("table")
uplinkTable.classList.add("proportion")
2016-11-19 10:57:30 +01:00
var gwNodesTable = document.createElement("table")
gwNodesTable.classList.add("proportion")
var gwClientsTable = document.createElement("table")
gwClientsTable.classList.add("proportion")
var siteTable = document.createElement("table")
siteTable.classList.add("proportion")
function showStatGlobal(o) {
2016-03-16 20:40:08 +01:00
return showStat(o)
}
function count(nodes, key, f) {
2015-03-30 02:58:47 +02:00
var dict = {}
nodes.forEach( function (d) {
var v = dictGet(d, key.slice(0))
if (f !== undefined)
v = f(v)
if (v === null)
return
2015-03-30 02:58:47 +02:00
dict[v] = 1 + (v in dict ? dict[v] : 0)
})
2015-07-08 00:36:57 +02:00
return Object.keys(dict).map(function (d) { return [d, dict[d], key, f] })
2015-03-30 02:58:47 +02:00
}
function countClients(nodes, key, f) {
var dict = {}
nodes.forEach( function (d) {
var v = dictGet(d, key.slice(0))
if (f !== undefined)
v = f(v)
if (v === null)
return
dict[v] = d.statistics.clients + (v in dict ? dict[v] : 0)
})
return Object.keys(dict).map(function (d) { return [d, dict[d], key, f] })
}
2015-07-08 00:36:57 +02:00
function addFilter(filter) {
return function () {
filterManager.addFilter(filter)
return false
}
}
function fillTable(name, table, data) {
2015-04-02 22:07:00 +02:00
if (!table.last)
table.last = V.h("table")
2015-03-30 02:58:47 +02:00
var max = 0
data.forEach(function (d) {
if (d[1] > max)
max = d[1]
})
2015-04-02 22:07:00 +02:00
var items = data.map(function (d) {
2015-03-30 02:58:47 +02:00
var v = d[1] / max
var c1 = Chroma.contrast(scale(v), "white")
var c2 = Chroma.contrast(scale(v), "black")
2015-04-02 22:07:00 +02:00
2015-07-08 00:36:57 +02:00
var filter = new Filter(name, d[2], d[0], d[3])
var a = V.h("a", { href: "#", onclick: addFilter(filter) }, d[0])
var th = V.h("th", a)
2015-04-02 22:07:00 +02:00
var td = V.h("td", V.h("span", {style: {
width: Math.round(v * 100) + "%",
backgroundColor: scale(v).hex(),
color: c1 > c2 ? "white" : "black"
}}, numeral(d[1]).format("0,0")))
return V.h("tr", [th, td])
2015-03-30 02:58:47 +02:00
})
2015-04-02 22:07:00 +02:00
var tableNew = V.h("table", items)
table = V.patch(table, V.diff(table.last, tableNew))
table.last = tableNew
2015-03-30 02:58:47 +02:00
}
self.setData = function (data) {
2015-03-30 03:12:30 +02:00
var onlineNodes = data.nodes.all.filter(online)
var nodes = onlineNodes.concat(data.nodes.lost)
var nodeDict = {}
2016-11-19 10:57:30 +01:00
data.graph.nodes.forEach(function (d) {
nodeDict[d.id.substr(0, 8)] = d
2015-03-30 03:12:30 +02:00
})
2015-03-30 02:58:47 +02:00
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"], function (d) {
if (d) {
d = d.replace(/\(r\)|\(tm\)/gi, "").replace(/AMD |Intel |TP-Link | CPU| Processor/g, "")
if (d.indexOf("@") > 0) d = d.substring(0, d.indexOf("@"))
}
return d
})
2015-06-19 20:24:41 +02:00
var geoDict = count(nodes, ["nodeinfo", "location"], function (d) {
return d && d.longitude && d.latitude ? "ja" : "nein"
2015-06-19 20:24:41 +02:00
})
var autoDict = count(nodes, ["nodeinfo", "software", "autoupdater"], function (d) {
if (d === null)
2015-03-30 02:58:47 +02:00
return null
else if (d.enabled)
2015-03-30 02:58:47 +02:00
return d.branch
else
return "(deaktiviert)"
2015-03-30 02:58:47 +02:00
})
2015-12-28 18:06:20 +01:00
var uplinkDict = count(nodes, ["flags", "uplink"], function (d) {
return d ? "ja" : "nein"
})
2015-03-30 02:58:47 +02:00
var gwNodesDict = count(onlineNodes, ["statistics", "gateway"], function (d) {
if (d === null)
return null
if (d.node)
return d.node.nodeinfo.hostname
if (d.id)
return d.id
2016-11-19 10:57:30 +01:00
var n = nodeDict[d.substr(0, 8)]
if (!n)
return d
var name = dictGet(n, ["node", "nodeinfo", "hostname"])
if (name)
return name
return d
})
var gwClientsDict = countClients(onlineNodes, ["statistics", "gateway"], function (d) {
if (d === null)
return null
if (d.node)
return d.node.nodeinfo.hostname
if (d.id)
return d.id
2016-11-19 10:57:30 +01:00
var n = nodeDict[d.substr(0, 8)]
if (!n)
return d
var name = dictGet(n, ["node", "nodeinfo", "hostname"])
if (name)
return name
return d
})
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
})
2015-07-08 00:36:57 +02:00
fillTable("Status", statusTable, statusDict.sort(function (a, b) { return b[1] - a[1] }))
fillTable("Firmware", fwTable, fwDict.sort(function (a, b) { return vercomp(b[0], a[0]) }))
fillTable("Hardware", hwTable, hwDict.sort(function (a, b) { return b[1] - a[1] }))
fillTable("Koordinaten", geoTable, geoDict.sort(function (a, b) { return b[1] - a[1] }))
2015-12-28 18:06:20 +01:00
fillTable("Uplink", uplinkTable, uplinkDict.sort(function (a, b) { return b[1] - a[1] }))
fillTable("Autom. Updates", autoTable, autoDict.sort(function (a, b) { return b[1] - a[1] }))
fillTable("Gateway", gwNodesTable, gwNodesDict.sort(function (a, b) { return b[1] - a[1] }))
fillTable("Gateway", gwClientsTable, gwClientsDict.sort(function (a, b) { return b[1] - a[1] }))
fillTable("Site", siteTable, siteDict.sort(function (a, b) { return b[1] - a[1] }))
2015-03-30 02:58:47 +02:00
}
2015-03-30 02:58:47 +02:00
self.render = function (el) {
var h2
self.renderSingle(el, "Status", statusTable)
self.renderSingle(el, "Nodes an Gateway", gwNodesTable)
self.renderSingle(el, "Clients an Gateway", gwClientsTable)
self.renderSingle(el, "Firmwareversionen", fwTable)
self.renderSingle(el, "Uplink", uplinkTable)
self.renderSingle(el, "Hardwaremodelle", hwTable)
self.renderSingle(el, "Auf der Karte sichtbar", geoTable)
self.renderSingle(el, "Autoupdater", autoTable)
self.renderSingle(el, "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 02:58:47 +02:00
self.renderSingle = function (el, heading, table) {
var h2
h2 = document.createElement("h2")
h2.textContent = heading
h2.onclick = function () {
table.classList.toggle("hidden")
}
el.appendChild(h2)
el.appendChild(table)
}
return self
2015-03-30 02:58:47 +02:00
}
})