work on forcegraph reload
This commit is contained in:
		
							parent
							
								
									0490455ccf
								
							
						
					
					
						commit
						d6e0587c55
					
				@ -1,13 +1,13 @@
 | 
			
		||||
define(["d3"], function (d3) {
 | 
			
		||||
   return function (config, linkScale, sidebar, router) {
 | 
			
		||||
    var self = this
 | 
			
		||||
    var nodes, links
 | 
			
		||||
    var svg, vis, link, node
 | 
			
		||||
    var nodesDict, linksDict
 | 
			
		||||
    var zoomBehavior
 | 
			
		||||
    var force
 | 
			
		||||
    var el
 | 
			
		||||
    var doAnimation = false
 | 
			
		||||
    var intNodes = []
 | 
			
		||||
 | 
			
		||||
    var LINK_DISTANCE = 70
 | 
			
		||||
 | 
			
		||||
@ -19,18 +19,18 @@ define(["d3"], function (d3) {
 | 
			
		||||
      if (!localStorageTest())
 | 
			
		||||
        return
 | 
			
		||||
 | 
			
		||||
      var save = nodes.map( function (d) {
 | 
			
		||||
        return { id: d.id, x: d.x, y: d.y }
 | 
			
		||||
      var save = intNodes.map( function (d) {
 | 
			
		||||
        return { id: d.o.id, x: d.x, y: d.y }
 | 
			
		||||
      })
 | 
			
		||||
 | 
			
		||||
      localStorage.setItem("graph/nodeposition", JSON.stringify(save))
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    function nodeName(d) {
 | 
			
		||||
      if (d.node && d.node.nodeinfo)
 | 
			
		||||
        return d.node.nodeinfo.hostname
 | 
			
		||||
      if (d.o.node && d.o.node.nodeinfo)
 | 
			
		||||
        return d.o.node.nodeinfo.hostname
 | 
			
		||||
      else
 | 
			
		||||
        return d.id
 | 
			
		||||
        return d.o.id
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    function dragstart(d) {
 | 
			
		||||
@ -132,7 +132,7 @@ define(["d3"], function (d3) {
 | 
			
		||||
              .gravity(0.05)
 | 
			
		||||
              .linkDistance(LINK_DISTANCE)
 | 
			
		||||
              .linkStrength(function (d) {
 | 
			
		||||
                return 1 / d.tq
 | 
			
		||||
                return 1 / d.o.tq
 | 
			
		||||
              })
 | 
			
		||||
              .on("tick", tickEvent)
 | 
			
		||||
              .on("end", savePositions)
 | 
			
		||||
@ -145,25 +145,45 @@ define(["d3"], function (d3) {
 | 
			
		||||
                          .on("dragend", dragend)
 | 
			
		||||
 | 
			
		||||
    self.setData = function (data) {
 | 
			
		||||
      var nodePositions = {}
 | 
			
		||||
      var oldNodes = {}
 | 
			
		||||
 | 
			
		||||
      if (localStorageTest()) {
 | 
			
		||||
        var save = JSON.parse(localStorage.getItem("graph/nodeposition"))
 | 
			
		||||
 | 
			
		||||
        if (save)
 | 
			
		||||
          save.forEach( function (d) {
 | 
			
		||||
            nodePositions[d.id] = d
 | 
			
		||||
      intNodes.forEach( function (d) {
 | 
			
		||||
        oldNodes[d.o.id] = d
 | 
			
		||||
      })
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      links = data.graph.links.filter( function (d) {
 | 
			
		||||
      intNodes = data.graph.nodes.map( function (d) {
 | 
			
		||||
        var e
 | 
			
		||||
        if (d.id in oldNodes)
 | 
			
		||||
          e = oldNodes[d.id]
 | 
			
		||||
        else
 | 
			
		||||
          e = {}
 | 
			
		||||
 | 
			
		||||
        e.o = d
 | 
			
		||||
 | 
			
		||||
        return e
 | 
			
		||||
      })
 | 
			
		||||
 | 
			
		||||
      var newNodesDict = {}
 | 
			
		||||
 | 
			
		||||
      intNodes.forEach( function (d) {
 | 
			
		||||
        newNodesDict[d.o.id] = d
 | 
			
		||||
      })
 | 
			
		||||
 | 
			
		||||
      var intLinks = data.graph.links.filter( function (d) {
 | 
			
		||||
        return !d.vpn
 | 
			
		||||
      }).map( function (d) {
 | 
			
		||||
        var source = newNodesDict[d.source.id]
 | 
			
		||||
        var target = newNodesDict[d.target.id]
 | 
			
		||||
 | 
			
		||||
        return {o: d, source: source, target: target}
 | 
			
		||||
      })
 | 
			
		||||
 | 
			
		||||
      link = vis.select("g.links")
 | 
			
		||||
                .selectAll("g.link")
 | 
			
		||||
                .data(links, function (d) { return d.id })
 | 
			
		||||
 | 
			
		||||
      link.exit().remove()
 | 
			
		||||
 | 
			
		||||
      var linkEnter = link.enter().append("g")
 | 
			
		||||
                          .attr("class", "link")
 | 
			
		||||
                          .on("click", function (d) {
 | 
			
		||||
@ -175,34 +195,34 @@ define(["d3"], function (d3) {
 | 
			
		||||
               .append("title")
 | 
			
		||||
 | 
			
		||||
      link.selectAll("line")
 | 
			
		||||
          .style("stroke", function (d) { return linkScale(d.tq) })
 | 
			
		||||
          .style("stroke", function (d) { return linkScale(d.o.tq).hex() })
 | 
			
		||||
 | 
			
		||||
      link.selectAll("title").text(showTq)
 | 
			
		||||
      link.selectAll("title").text(function (d) { return showTq(d.o) })
 | 
			
		||||
 | 
			
		||||
      linksDict = {}
 | 
			
		||||
 | 
			
		||||
      link.each( function (d) {
 | 
			
		||||
        if (d.source.node && d.target.node)
 | 
			
		||||
          linksDict[d.id] = d
 | 
			
		||||
        if (d.o.source.node && d.o.target.node)
 | 
			
		||||
          linksDict[d.o.id] = d
 | 
			
		||||
      })
 | 
			
		||||
 | 
			
		||||
      nodes = data.graph.nodes
 | 
			
		||||
 | 
			
		||||
      node = vis.select("g.nodes")
 | 
			
		||||
                .selectAll(".node")
 | 
			
		||||
                .data(nodes, function(d) { return d.id })
 | 
			
		||||
                .data(intNodes, function(d) { return d.o.id })
 | 
			
		||||
 | 
			
		||||
      node.exit().remove()
 | 
			
		||||
 | 
			
		||||
      var nodeEnter = node.enter().append("circle")
 | 
			
		||||
                          .attr("r", 8)
 | 
			
		||||
                          .on("click", function (d) {
 | 
			
		||||
                            if (!d3.event.defaultPrevented)
 | 
			
		||||
                              router.node(d.node)()
 | 
			
		||||
                              router.node(d.o.node)()
 | 
			
		||||
                          })
 | 
			
		||||
                          .call(draggableNode)
 | 
			
		||||
 | 
			
		||||
      node.attr("class", function (d) {
 | 
			
		||||
        var s = ["node"]
 | 
			
		||||
        if (!d.node)
 | 
			
		||||
        if (!d.o.node)
 | 
			
		||||
          s.push("unknown")
 | 
			
		||||
 | 
			
		||||
        return s.join(" ")
 | 
			
		||||
@ -211,26 +231,40 @@ define(["d3"], function (d3) {
 | 
			
		||||
      nodesDict = {}
 | 
			
		||||
 | 
			
		||||
      node.each( function (d) {
 | 
			
		||||
        if (d.node)
 | 
			
		||||
          nodesDict[d.node.nodeinfo.node_id] = d
 | 
			
		||||
        if (d.o.node)
 | 
			
		||||
          nodesDict[d.o.node.nodeinfo.node_id] = d
 | 
			
		||||
      })
 | 
			
		||||
 | 
			
		||||
      nodeEnter.append("title")
 | 
			
		||||
 | 
			
		||||
      if (localStorageTest()) {
 | 
			
		||||
        var save = JSON.parse(localStorage.getItem("graph/nodeposition"))
 | 
			
		||||
 | 
			
		||||
        if (save) {
 | 
			
		||||
          var nodePositions = {}
 | 
			
		||||
          save.forEach( function (d) {
 | 
			
		||||
            nodePositions[d.id] = d
 | 
			
		||||
          })
 | 
			
		||||
 | 
			
		||||
          nodeEnter.each( function (d) {
 | 
			
		||||
        if (nodePositions[d.id]) {
 | 
			
		||||
          d.x = nodePositions[d.id].x
 | 
			
		||||
          d.y = nodePositions[d.id].y
 | 
			
		||||
            if (nodePositions[d.o.id]) {
 | 
			
		||||
              d.x = nodePositions[d.o.id].x
 | 
			
		||||
              d.y = nodePositions[d.o.id].y
 | 
			
		||||
            }
 | 
			
		||||
          })
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      node.selectAll("title").text(nodeName)
 | 
			
		||||
 | 
			
		||||
      var diameter = graphDiameter(nodes)
 | 
			
		||||
      var diameter = graphDiameter(intNodes)
 | 
			
		||||
 | 
			
		||||
      force.nodes(nodes)
 | 
			
		||||
           .links(links)
 | 
			
		||||
      force.nodes(intNodes)
 | 
			
		||||
           .links(intLinks)
 | 
			
		||||
           .size([diameter, diameter])
 | 
			
		||||
           .start()
 | 
			
		||||
 | 
			
		||||
      if (node.enter().size() + link.enter().size() > 0)
 | 
			
		||||
        force.start()
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    self.resetView = function () {
 | 
			
		||||
@ -245,7 +279,7 @@ define(["d3"], function (d3) {
 | 
			
		||||
    self.gotoNode = function (d) {
 | 
			
		||||
      link.classed("highlight", false)
 | 
			
		||||
      node.classed("highlight", function (e) {
 | 
			
		||||
        return e.node === d && d !== undefined
 | 
			
		||||
        return e.o.node === d && d !== undefined
 | 
			
		||||
      })
 | 
			
		||||
 | 
			
		||||
      var n = nodesDict[d.nodeinfo.node_id]
 | 
			
		||||
@ -259,7 +293,7 @@ define(["d3"], function (d3) {
 | 
			
		||||
    self.gotoLink = function (d) {
 | 
			
		||||
      node.classed("highlight", false)
 | 
			
		||||
      link.classed("highlight", function (e) {
 | 
			
		||||
        return e === d && d !== undefined
 | 
			
		||||
        return e.o === d && d !== undefined
 | 
			
		||||
      })
 | 
			
		||||
 | 
			
		||||
      var l = linksDict[d.id]
 | 
			
		||||
 | 
			
		||||
@ -1,8 +1,8 @@
 | 
			
		||||
define(["tablesort", "virtual-dom", "tablesort.numeric"],
 | 
			
		||||
  function (Tablesort, V) {
 | 
			
		||||
define(["virtual-dom"],
 | 
			
		||||
  function (V) {
 | 
			
		||||
  return function(linkScale, router) {
 | 
			
		||||
    var self = this
 | 
			
		||||
    var el, tbody, sort
 | 
			
		||||
    var el, tbody
 | 
			
		||||
 | 
			
		||||
    self.render = function (d)  {
 | 
			
		||||
      el = document.createElement("div")
 | 
			
		||||
@ -34,7 +34,6 @@ define(["tablesort", "virtual-dom", "tablesort.numeric"],
 | 
			
		||||
 | 
			
		||||
        var th3 = document.createElement("th")
 | 
			
		||||
        th3.textContent = "Entfernung"
 | 
			
		||||
        th3.classList.add("sort-default")
 | 
			
		||||
        tr.appendChild(th3)
 | 
			
		||||
 | 
			
		||||
        thead.appendChild(tr)
 | 
			
		||||
@ -43,11 +42,16 @@ define(["tablesort", "virtual-dom", "tablesort.numeric"],
 | 
			
		||||
        tbody = document.createElement("tbody")
 | 
			
		||||
        tbody.last = V.h("tbody")
 | 
			
		||||
        table.appendChild(tbody)
 | 
			
		||||
 | 
			
		||||
        sort = new Tablesort(table)
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      var items = data.graph.links.map( function (d) {
 | 
			
		||||
      var links = data.graph.links.slice(0).sort( function (a, b) {
 | 
			
		||||
        a = a.distance === undefined ? -1 : a.distance
 | 
			
		||||
        b = b.distance === undefined ? -1 : b.distance
 | 
			
		||||
 | 
			
		||||
        return b - a
 | 
			
		||||
      })
 | 
			
		||||
 | 
			
		||||
      var items = links.map( function (d) {
 | 
			
		||||
        var name = d.source.node.nodeinfo.hostname + " – " + d.target.node.nodeinfo.hostname
 | 
			
		||||
        var td1Content = [V.h("a", {href: "#", onclick: router.link(d)}, name)]
 | 
			
		||||
 | 
			
		||||
@ -55,10 +59,8 @@ define(["tablesort", "virtual-dom", "tablesort.numeric"],
 | 
			
		||||
          td1Content.push(" (VPN)")
 | 
			
		||||
 | 
			
		||||
        var td1 = V.h("td", td1Content)
 | 
			
		||||
        var td2 = V.h("td", {style: {color: linkScale(d.tq)}}, showTq(d))
 | 
			
		||||
        var td3 = V.h("td", {attributes: {
 | 
			
		||||
                              "data-sort": d.distance !== undefined ? -d.distance : 1
 | 
			
		||||
                            }}, showDistance(d))
 | 
			
		||||
        var td2 = V.h("td", {style: {color: linkScale(d.tq).hex()}}, showTq(d))
 | 
			
		||||
        var td3 = V.h("td", showDistance(d))
 | 
			
		||||
 | 
			
		||||
        return V.h("tr", [td1, td2, td3])
 | 
			
		||||
      })
 | 
			
		||||
@ -66,7 +68,6 @@ define(["tablesort", "virtual-dom", "tablesort.numeric"],
 | 
			
		||||
      var tbodyNew = V.h("tbody", items)
 | 
			
		||||
      tbody = V.patch(tbody, V.diff(tbody.last, tbodyNew))
 | 
			
		||||
      tbody.last = tbodyNew
 | 
			
		||||
      sort.refresh()
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										14
									
								
								lib/main.js
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								lib/main.js
									
									
									
									
									
								
							@ -88,14 +88,24 @@ function (config, moment, Router, L, GUI, numeral) {
 | 
			
		||||
    var urls = [ config.dataPath + "nodes.json",
 | 
			
		||||
                 config.dataPath + "graph.json"
 | 
			
		||||
               ]
 | 
			
		||||
 | 
			
		||||
    Promise.all(urls.map(getJSON))
 | 
			
		||||
    function update() {
 | 
			
		||||
      return Promise.all(urls.map(getJSON))
 | 
			
		||||
                    .then(handleData)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    update()
 | 
			
		||||
      .then(function (d) {
 | 
			
		||||
        var gui = new GUI(config, router)
 | 
			
		||||
        gui.setData(d)
 | 
			
		||||
        router.setData(d)
 | 
			
		||||
        router.start()
 | 
			
		||||
 | 
			
		||||
        window.setInterval(function () {
 | 
			
		||||
          update().then(function (d) {
 | 
			
		||||
            gui.setData(d)
 | 
			
		||||
            router.setData(d)
 | 
			
		||||
          })
 | 
			
		||||
        }, 60000)
 | 
			
		||||
      })
 | 
			
		||||
      .catch(function (e) {
 | 
			
		||||
        console.log(e)
 | 
			
		||||
 | 
			
		||||
@ -1,5 +1,5 @@
 | 
			
		||||
define(["tablesort", "virtual-dom", "tablesort.numeric"],
 | 
			
		||||
  function (Tablesort, V) {
 | 
			
		||||
define(["virtual-dom"],
 | 
			
		||||
  function (V) {
 | 
			
		||||
  return function(router) {
 | 
			
		||||
    function showUptime(now, d) {
 | 
			
		||||
      var uptime
 | 
			
		||||
@ -20,7 +20,7 @@ define(["tablesort", "virtual-dom", "tablesort.numeric"],
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    var self = this
 | 
			
		||||
    var el, tbody, sort
 | 
			
		||||
    var el, tbody
 | 
			
		||||
 | 
			
		||||
    self.render = function (d) {
 | 
			
		||||
      el = document.createElement("div")
 | 
			
		||||
@ -44,7 +44,6 @@ define(["tablesort", "virtual-dom", "tablesort.numeric"],
 | 
			
		||||
        var tr = document.createElement("tr")
 | 
			
		||||
        var th1 = document.createElement("th")
 | 
			
		||||
        th1.textContent = "Knoten"
 | 
			
		||||
        th1.classList.add("sort-default")
 | 
			
		||||
        tr.appendChild(th1)
 | 
			
		||||
 | 
			
		||||
        var th2 = document.createElement("th")
 | 
			
		||||
@ -61,12 +60,13 @@ define(["tablesort", "virtual-dom", "tablesort.numeric"],
 | 
			
		||||
        tbody = document.createElement("tbody")
 | 
			
		||||
        tbody.last = V.h("tbody")
 | 
			
		||||
        table.appendChild(tbody)
 | 
			
		||||
 | 
			
		||||
        sort = new Tablesort(table)
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      var nodes = data.nodes.all.slice(0).sort( function (a, b) {
 | 
			
		||||
        return a.nodeinfo.hostname.localeCompare(b.nodeinfo.hostname)
 | 
			
		||||
      })
 | 
			
		||||
 | 
			
		||||
      var items = data.nodes.all.map( function (d) {
 | 
			
		||||
      var items = nodes.map( function (d) {
 | 
			
		||||
        var td1Content = []
 | 
			
		||||
        var aClass = ["hostname", d.flags.online ? "online" : "offline"]
 | 
			
		||||
 | 
			
		||||
@ -81,7 +81,7 @@ define(["tablesort", "virtual-dom", "tablesort.numeric"],
 | 
			
		||||
        var uptime = showUptime(data.now, d)
 | 
			
		||||
 | 
			
		||||
        var td1 = V.h("td", td1Content)
 | 
			
		||||
        var td2 = V.h("td", {attributes: { "data-sort": uptime.sort }}, uptime.v)
 | 
			
		||||
        var td2 = V.h("td", uptime.v)
 | 
			
		||||
        var td3 = V.h("td", "clients" in d.statistics ? d.statistics.clients : "")
 | 
			
		||||
 | 
			
		||||
        return V.h("tr", [td1, td2, td3])
 | 
			
		||||
@ -90,7 +90,6 @@ define(["tablesort", "virtual-dom", "tablesort.numeric"],
 | 
			
		||||
      var tbodyNew = V.h("tbody", items)
 | 
			
		||||
      tbody = V.patch(tbody, V.diff(tbody.last, tbodyNew))
 | 
			
		||||
      tbody.last = tbodyNew
 | 
			
		||||
      sort.refresh()
 | 
			
		||||
   }
 | 
			
		||||
  }
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user