define(["sorttable", "virtual-dom", "helper"], function (SortTable, V, helper) { function getUptime(now, d) { if (d.flags.online && "uptime" in d.statistics) { return Math.round(d.statistics.uptime); } else if (!d.flags.online && "lastseen" in d) { return Math.round(-(now.unix() - d.lastseen.unix())); } } function showUptime(uptime) { var s = ""; uptime /= 3600; if (uptime !== undefined) { if (Math.abs(uptime) >= 24) { s = Math.round(uptime / 24) + "d"; } else { s = Math.round(uptime) + "h"; } } return s; } var headings = [{ name: "Knoten", sort: function (a, b) { var aname = typeof a.nodeinfo.hostname === "string" ? a.nodeinfo.hostname : a.nodeinfo.node_id; var bname = typeof b.nodeinfo.hostname === "string" ? b.nodeinfo.hostname : b.nodeinfo.node_id; if (typeof aname === "string" && typeof bname === "string") { return aname.localeCompare(bname); } return typeof aname === "string" ? 1 : typeof bname === "string" ? -1 : 0; }, reverse: false }, { name: "Uptime", sort: function (a, b) { return a.uptime - b.uptime; }, reverse: true }, { name: "#Links", sort: function (a, b) { return a.meshlinks - b.meshlinks; }, reverse: true }, { name: "Clients", sort: function (a, b) { return ("clients" in a.statistics ? a.statistics.clients : -1) - ("clients" in b.statistics ? b.statistics.clients : -1); }, reverse: true }]; return function (router) { function renderRow(d) { var td1Content = []; var aClass = ["hostname", d.flags.online ? "online" : "offline"]; td1Content.push(V.h("a", { className: aClass.join(" "), onclick: router.node(d), href: "#!n:" + d.nodeinfo.node_id }, d.nodeinfo.hostname)); if (helper.hasLocation(d)) { td1Content.push(V.h("span", {className: "icon ion-location"})); } var td1 = V.h("td", td1Content); var td2 = V.h("td", showUptime(d.uptime)); var td3 = V.h("td", d.meshlinks.toString()); var td4 = V.h("td", ("clients" in d.statistics ? d.statistics.clients : 0).toFixed(0)); return V.h("tr", [td1, td2, td3, td4]); } var table = new SortTable(headings, 0, renderRow); this.render = function (d) { var el = document.createElement("div"); d.appendChild(el); var h2 = document.createElement("h2"); h2.textContent = "Alle Knoten"; el.appendChild(h2); el.appendChild(table.el); }; this.setData = function (d) { var data = d.nodes.all.map(function (e) { var n = Object.create(e); n.uptime = getUptime(d.now, e) || 0; n.meshlinks = e.meshlinks || 0; return n; }); table.setData(data); }; }; });