Drawing logical layer
diff --git a/views/ngXosViews/diagnostic/src/js/logicTopology.js b/views/ngXosViews/diagnostic/src/js/logicTopology.js
index 0a9215e..b689b89 100644
--- a/views/ngXosViews/diagnostic/src/js/logicTopology.js
+++ b/views/ngXosViews/diagnostic/src/js/logicTopology.js
@@ -18,7 +18,7 @@
$scope.$watch(() => this.subscribers, (subscribers) => {
if(subscribers){
- LogicTopologyHelper.handleSubscribers(svg, subscribers);
+ LogicTopologyHelper.addSubscribers(svg, angular.copy(subscribers));
}
});
@@ -37,6 +37,7 @@
}
handleSvg($element[0]);
+ LogicTopologyHelper.drawTree(svg);
}
};
});
diff --git a/views/ngXosViews/diagnostic/src/js/logicTopologyHelper.js b/views/ngXosViews/diagnostic/src/js/logicTopologyHelper.js
index a15b017..56d1f56 100644
--- a/views/ngXosViews/diagnostic/src/js/logicTopologyHelper.js
+++ b/views/ngXosViews/diagnostic/src/js/logicTopologyHelper.js
@@ -100,6 +100,153 @@
createSubscriber(container, subscriber, hStep, vStep * (i + 1));
})
}
+
+ var diagonal, nodes, links, i = 0, svgWidth, svgHeight, layout;
+
+ const baseData = {
+ name: 'Router',
+ type: 'router',
+ children: [
+ {
+ name: 'WAN',
+ type: 'network',
+ children: [
+ {
+ name: 'Rack',
+ type: 'rack',
+ children: [
+ {
+ name: 'LAN',
+ type: 'network',
+ children: [] //subscribers goes here
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ };
+
+ const computeLayout = (data) => {
+ let nodes = layout.nodes(data);
+
+ // Normalize for fixed-depth.
+ nodes.forEach(function(d) {
+ // position the child node horizontally
+ const step = ((svgWidth - (serviceTopologyConfig.widthMargin * 2)) / 7);
+ d.y = (6 - d.depth) * step;
+ });
+
+ let links = layout.links(nodes);
+ console.log(nodes.length, links.length);
+ return [nodes, links];
+ };
+
+ const drawNodes = (svg, nodes) => {
+ // Update the nodes…
+ var node = svg.selectAll('g.node')
+ .data(nodes, d => {return d.id || (d.id = `tree-${i++}`)});
+
+ // Enter any new nodes at the parent's previous position.
+ var nodeEnter = node.enter().append('g')
+ .attr({
+ class: d => `node ${d.type}`,
+ transform: `translate(${svgWidth / 2}, ${svgHeight / 2})`
+ });
+
+ nodeEnter.append('circle')
+ .attr('r', 10)
+ .style('fill', d => d._children ? 'lightsteelblue' : '#fff');
+
+ nodeEnter.append('text')
+ .attr({
+ x: d => d.children ? serviceTopologyConfig.circle.selectedRadius + 3 : -serviceTopologyConfig.circle.selectedRadius - 3,
+ dy: '.35em',
+ transform: d => {
+ if (d.children && d.parent){
+ if(d.parent.x < d.x){
+ return 'rotate(-30)';
+ }
+ return 'rotate(30)';
+ }
+ },
+ 'text-anchor': d => d.children ? 'start' : 'end'
+ })
+ .text(d => d.name);
+
+ // Transition nodes to their new position.
+ var nodeUpdate = node.transition()
+ .duration(serviceTopologyConfig.duration)
+ .attr({
+ 'transform': d => `translate(${d.y},${d.x})`
+ });
+
+ // TODO handle node remove
+ };
+
+ const drawLinks = (svg, links) => {
+
+ diagonal = d3.svg.diagonal()
+ .projection(d => [d.y, d.x]);
+
+ // Update the links…
+ var link = svg.selectAll('path.link')
+ .data(links, d => {
+ return d.target.id
+ });
+
+ // Enter any new links at the parent's previous position.
+ link.enter().insert('path', 'g')
+ .attr('class', d => `link ${d.target.type}`)
+ .attr('d', function(d) {
+ var o = {x: svgHeight / 2, y: svgWidth / 2};
+ return diagonal({source: o, target: o});
+ });
+
+ // Transition links to their new position.
+ link.transition()
+ .duration(serviceTopologyConfig.duration)
+ .attr('d', diagonal);
+ };
+
+ this.drawTree = (svg) => {
+
+
+ svgWidth = svg.node().getBoundingClientRect().width;
+ svgHeight = svg.node().getBoundingClientRect().height;
+
+ const width = svgWidth - (serviceTopologyConfig.widthMargin * 2);
+ const height = svgHeight - (serviceTopologyConfig.heightMargin * 2);
+
+ layout = d3.layout.tree()
+ .size([height, width]);
+
+ // Compute the new tree layout.
+ [nodes, links] = computeLayout(baseData);
+
+ drawNodes(svg, nodes);
+ drawLinks(svg, links);
+
+ };
+
+ this.addSubscribers = (svg, subscribers) => {
+
+ console.log(subscribers);
+
+ subscribers.map((subscriber) => {
+ subscriber.children = subscriber.devices;
+ });
+
+ // add subscriber to data tree
+ baseData.children[0].children[0].children[0].children = subscribers;
+
+ console.log(baseData);
+
+ [nodes, links] = computeLayout(baseData);
+
+ drawNodes(svg, nodes);
+ drawLinks(svg, links);
+ }
});
}());
\ No newline at end of file
diff --git a/views/ngXosViews/diagnostic/src/js/rest_services.js b/views/ngXosViews/diagnostic/src/js/rest_services.js
index beeb4fe..be523da 100644
--- a/views/ngXosViews/diagnostic/src/js/rest_services.js
+++ b/views/ngXosViews/diagnostic/src/js/rest_services.js
@@ -41,8 +41,6 @@
return subscriber;
});
- // faking to have 2 subscriber
- res.data.push(res.data[0]);
deferred.resolve(res.data);
})
diff --git a/views/ngXosViews/diagnostic/src/js/serviceTopology.js b/views/ngXosViews/diagnostic/src/js/serviceTopology.js
index 820b3a9..0587cb0 100644
--- a/views/ngXosViews/diagnostic/src/js/serviceTopology.js
+++ b/views/ngXosViews/diagnostic/src/js/serviceTopology.js
@@ -47,7 +47,7 @@
root.x0 = height / 2;
root.y0 = width / 2;
- ServiceTopologyHelper.drawLegend(svg);
+ // ServiceTopologyHelper.drawLegend(svg);
ServiceTopologyHelper.updateTree(treeContainer, treeLayout, root);
};