proportions.js 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. define(["chartjs", "chroma-js"], function (ChartJS, Chroma) {
  2. return function () {
  3. var self = this
  4. var fwTable, hwTable, autoTable
  5. var scale = Chroma.scale("YlGnBu").mode("lab")
  6. function count(nodes, key, def, f) {
  7. var dict = {}
  8. nodes.forEach( function (d) {
  9. var v = dictGet(d, key.slice(0))
  10. if (f !== undefined)
  11. v = f(v)
  12. if (v === null)
  13. v = def
  14. dict[v] = 1 + (v in dict ? dict[v] : 0)
  15. })
  16. return Object.keys(dict).map(function (d) { return [d, dict[d]] })
  17. }
  18. function fillTable(table, data) {
  19. var max = 0
  20. data.forEach(function (d) {
  21. if (d[1] > max)
  22. max = d[1]
  23. })
  24. data.forEach(function (d) {
  25. var v = d[1] / max
  26. var row = document.createElement("tr")
  27. var th = document.createElement("th")
  28. var td = document.createElement("td")
  29. var span = document.createElement("span")
  30. th.textContent = d[0]
  31. span.style.width = Math.round(v * 100) + "%"
  32. span.style.backgroundColor = scale(v).hex()
  33. var c1 = Chroma.contrast(scale(v), "white")
  34. var c2 = Chroma.contrast(scale(v), "black")
  35. span.style.color = c1 > c2 ? "white" : "black"
  36. span.textContent = d[1]
  37. td.appendChild(span)
  38. row.appendChild(th)
  39. row.appendChild(td)
  40. table.appendChild(row)
  41. })
  42. }
  43. self.setData = function (data) {
  44. var nodes = data.nodes.all.filter(online).concat(data.nodes.lost)
  45. var fwDict = count(nodes, ["nodeinfo", "software", "firmware", "release"], "n/a")
  46. var hwDict = count(nodes, ["nodeinfo", "hardware", "model"], "n/a")
  47. var autoDict = count(nodes, ["nodeinfo", "software", "autoupdater"], "deaktiviert", function (d) {
  48. if (d === null || !d.enabled)
  49. return null
  50. else
  51. return d.branch
  52. })
  53. fillTable(fwTable, fwDict.sort(function (a, b) { return b[1] - a[1] }))
  54. fillTable(hwTable, hwDict.sort(function (a, b) { return b[1] - a[1] }))
  55. fillTable(autoTable, autoDict.sort(function (a, b) { return b[1] - a[1] }))
  56. }
  57. self.render = function (el) {
  58. var h2
  59. h2 = document.createElement("h2")
  60. h2.textContent = "Firmwareversionen"
  61. el.appendChild(h2)
  62. fwTable = document.createElement("table")
  63. fwTable.classList.add("proportion")
  64. el.appendChild(fwTable)
  65. h2 = document.createElement("h2")
  66. h2.textContent = "Hardwaremodelle"
  67. el.appendChild(h2)
  68. hwTable = document.createElement("table")
  69. hwTable.classList.add("proportion")
  70. el.appendChild(hwTable)
  71. h2 = document.createElement("h2")
  72. h2.textContent = "Autoupdater"
  73. el.appendChild(h2)
  74. autoTable = document.createElement("table")
  75. autoTable.classList.add("proportion")
  76. el.appendChild(autoTable)
  77. }
  78. return self
  79. }
  80. })