proportions.js 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  1. define(["chroma-js", "virtual-dom", "numeral-intl", "filters/genericnode", "vercomp" ],
  2. function (Chroma, V, numeral, Filter, vercomp) {
  3. return function (config, filterManager) {
  4. var self = this
  5. var scale = Chroma.scale("YlGnBu").mode("lab")
  6. var statusTable = document.createElement("table")
  7. statusTable.classList.add("proportion")
  8. var fwTable = document.createElement("table")
  9. fwTable.classList.add("proportion")
  10. var hwTable = document.createElement("table")
  11. hwTable.classList.add("proportion")
  12. var geoTable = document.createElement("table")
  13. geoTable.classList.add("proportion")
  14. var autoTable = document.createElement("table")
  15. autoTable.classList.add("proportion")
  16. var gwTable = document.createElement("table")
  17. gwTable.classList.add("proportion")
  18. var siteTable = document.createElement("table")
  19. siteTable.classList.add("proportion")
  20. function showStatGlobal(o) {
  21. var content, caption
  22. if (o.thumbnail) {
  23. content = document.createElement("img")
  24. content.src = o.thumbnail
  25. }
  26. if (o.caption) {
  27. caption = o.caption
  28. if (!content)
  29. content = document.createTextNode(caption)
  30. }
  31. var p = document.createElement("p")
  32. if (o.href) {
  33. var link = document.createElement("a")
  34. link.target = "_blank"
  35. link.href = o.href
  36. link.appendChild(content)
  37. if (caption && o.thumbnail)
  38. link.title = caption
  39. p.appendChild(link)
  40. } else
  41. p.appendChild(content)
  42. return p
  43. }
  44. function count(nodes, key, f) {
  45. var dict = {}
  46. nodes.forEach( function (d) {
  47. var v = dictGet(d, key.slice(0))
  48. if (f !== undefined)
  49. v = f(v)
  50. if (v === null)
  51. return
  52. dict[v] = 1 + (v in dict ? dict[v] : 0)
  53. })
  54. return Object.keys(dict).map(function (d) { return [d, dict[d], key, f] })
  55. }
  56. function addFilter(filter) {
  57. return function () {
  58. filterManager.addFilter(filter)
  59. return false
  60. }
  61. }
  62. function fillTable(name, table, data) {
  63. if (!table.last)
  64. table.last = V.h("table")
  65. var max = 0
  66. data.forEach(function (d) {
  67. if (d[1] > max)
  68. max = d[1]
  69. })
  70. var items = data.map(function (d) {
  71. var v = d[1] / max
  72. var c1 = Chroma.contrast(scale(v), "white")
  73. var c2 = Chroma.contrast(scale(v), "black")
  74. var filter = new Filter(name, d[2], d[0], d[3])
  75. var a = V.h("a", { href: "#", onclick: addFilter(filter) }, d[0])
  76. var th = V.h("th", a)
  77. var td = V.h("td", V.h("span", {style: {
  78. width: Math.round(v * 100) + "%",
  79. backgroundColor: scale(v).hex(),
  80. color: c1 > c2 ? "white" : "black"
  81. }}, numeral(d[1]).format("0,0")))
  82. return V.h("tr", [th, td])
  83. })
  84. var tableNew = V.h("table", items)
  85. table = V.patch(table, V.diff(table.last, tableNew))
  86. table.last = tableNew
  87. }
  88. self.setData = function (data) {
  89. var onlineNodes = data.nodes.all.filter(online)
  90. var nodes = onlineNodes.concat(data.nodes.lost)
  91. var nodeDict = {}
  92. data.nodes.all.forEach(function (d) {
  93. nodeDict[d.nodeinfo.node_id] = d
  94. })
  95. var statusDict = count(nodes, ["flags", "online"], function (d) {
  96. return d ? "online" : "offline"
  97. })
  98. var fwDict = count(nodes, ["nodeinfo", "software", "firmware", "release"])
  99. var hwDict = count(nodes, ["nodeinfo", "hardware", "model"])
  100. var geoDict = count(nodes, ["nodeinfo", "location"], function (d) {
  101. return d ? "ja" : "nein"
  102. })
  103. var autoDict = count(nodes, ["nodeinfo", "software", "autoupdater"], function (d) {
  104. if (d === null)
  105. return null
  106. else if (d.enabled)
  107. return d.branch
  108. else
  109. return "(deaktiviert)"
  110. })
  111. var gwDict = count(nodes, ["statistics", "vpn_peers", "groups", "backbone", "peers"], function (d) {
  112. var peers = ""
  113. for ( var gw in d ) {
  114. if ( d[gw] !== null ) {
  115. if (peers !== "")
  116. peers += " & "
  117. peers += gw
  118. }
  119. }
  120. if (peers !== "")
  121. return peers
  122. else
  123. return null
  124. })
  125. var siteDict = count(nodes, ["nodeinfo", "system"], function (d) {
  126. if (d === null)
  127. return null
  128. else if ( d.site_name ) {
  129. var region = d.site_name.split(" - ")[1]
  130. if (region)
  131. return region
  132. else
  133. return d.site_name
  134. }
  135. else
  136. return null
  137. })
  138. fillTable("Status", statusTable, statusDict.sort(function (a, b) { return b[1] - a[1] }))
  139. fillTable("Firmware", fwTable, fwDict.sort(function (a, b) { return vercomp(b[0], a[0]) }))
  140. fillTable("Koordinaten", geoTable, geoDict.sort(function (a, b) { return b[1] - a[1] }))
  141. fillTable("Autom. Updates", autoTable, autoDict.sort(function (a, b) { return b[1] - a[1] }))
  142. fillTable("VPN-GW", gwTable, gwDict.sort(function (a, b) { return vercomp(a[0], b[0]) }))
  143. fillTable("Region", siteTable, siteDict.sort(function (a, b) { return b[1] - a[1] }))
  144. fillTable("Hardware", hwTable, hwDict.sort(function (a, b) { return b[1] - a[1] }))
  145. }
  146. self.render = function (el) {
  147. var h2
  148. h2 = document.createElement("h2")
  149. h2.textContent = "Status"
  150. el.appendChild(h2)
  151. el.appendChild(statusTable)
  152. h2 = document.createElement("h2")
  153. h2.textContent = "Firmwareversionen"
  154. el.appendChild(h2)
  155. el.appendChild(fwTable)
  156. h2 = document.createElement("h2")
  157. h2.textContent = "Auf der Karte sichtbar"
  158. el.appendChild(h2)
  159. el.appendChild(geoTable)
  160. h2 = document.createElement("h2")
  161. h2.textContent = "Autoupdater"
  162. el.appendChild(h2)
  163. el.appendChild(autoTable)
  164. h2 = document.createElement("h2")
  165. h2.textContent = "VPN-Gateway"
  166. el.appendChild(h2)
  167. el.appendChild(gwTable)
  168. h2 = document.createElement("h2")
  169. h2.textContent = "Region"
  170. el.appendChild(h2)
  171. el.appendChild(siteTable)
  172. h2 = document.createElement("h2")
  173. h2.textContent = "Hardwaremodelle"
  174. el.appendChild(h2)
  175. el.appendChild(hwTable)
  176. if (config.globalInfos)
  177. config.globalInfos.forEach( function (globalInfo) {
  178. h2 = document.createElement("h2")
  179. h2.textContent = globalInfo.name
  180. el.appendChild(h2)
  181. el.appendChild(showStatGlobal(globalInfo))
  182. })
  183. }
  184. return self
  185. }
  186. })