1 define(['app/yangvisualizer/yangvisualizer.module', 'app/yangvisualizer/yangvisualizer.services', 'common/sigmatopology/sigma.directive'], function(yangvisualizer) {
3 yangvisualizer.register.controller('yangvisualizerCtrl', ['$scope', '$rootScope', '$http', 'YangConfigRestangular','visualizerUtils', 'DesignVisualizerFactory', 'yvConstants',
4 function ($scope, $rootScope, $http, Restangular, visualizerUtils, DesignVisualizerFactory, yvConstants) {
5 $rootScope['section_logo'] = 'logo_yangvis';
7 $scope.currentPath = './assets/views/yangvisualizerCtrl';
8 $scope.topologyData = { nodes: [], edges: []};
9 $scope.currentTopologyNode = {};
10 $scope.filteredNodes = [];
11 $scope.selectedProperty = null;
12 $scope.selectedNode = null;
13 $scope.isSelectedSpecificType = false;
14 $scope.childrenNodes = {
18 $scope.parentNodes = {
26 $scope.triggerResizeSigma = false;
29 $scope.sliderValue = 4;
30 $scope.sliderSettings = yvConstants.sliderSettings;
31 $scope.clickedNodesHistory = [];
33 var lastSelectedNode = null,
37 var processingNodesCallback = function() {
41 msg: 'PROCESSING_NODES'
45 var processingNodesSuccessCallback = function() {
48 msg: 'PROCESSING_NODES_SUCCESS'
52 var processingNodesErrorCallback = function(e) {
55 msg: 'PROCESSING_NODES_ERROR',
60 var expandNodeFunc = function(expandNode, mlts){
62 expandNode.expand = false;
63 expandNode.size = expandNode.node.parent !== null ? 7 : 20;
64 expandNode.label = expandNode.label.substring(expandNode.label.indexOf(']') + 2);
65 expandNode.node.children.forEach(function(child){
66 var topoData = visualizerUtils.getTopologyData(child, mlts, false, expandNode.lvl),
70 nodeCounter = nodeCounter + topoData.nodes.length;
72 topoData.nodes.forEach(function(node){
74 node.x = (expandNode.x + (Math.floor(Math.random() * topoData.nodes.length * 5) + 2)) * position;
75 node.y = (expandNode.y + (Math.floor(Math.random() * topoData.nodes.length * 5) + 2)) * position;
76 node.size = node.node.children.length && node.expand ? 12 : 7;
77 node.parent = child.graphId;
78 $scope.sigma.graph.addNode(node);
81 edge = visualizerUtils.getEdge(expandNode.node, child);
82 $scope.sigma.graph.addEdge(edge);
84 topoData.links.forEach(function(edge){
85 $scope.sigma.graph.addEdge(edge);
93 slowDown: getSlowDownNumFun(nodeCounter)
96 $scope.sigma.startForceAtlas2(configAtlas);
97 $scope.setColorScheme(null, $scope.selectedProperty);
101 var collapseNodeFunc = function(collapseNode){
102 var nodes = $scope.sigma.graph.nodes(),
103 nodeChildren = visualizerUtils.getAllChildrenArray(collapseNode);
106 if ( nodeChildren.nodesArray.length ) {
107 nodeChildren.nodesArray.forEach(function(id){
108 $scope.sigma.graph.dropNode(id);
110 collapseNode.expand = true;
111 collapseNode.label = '['+ nodeChildren.numOfChildren + '] ' + (collapseNode.label.length > 20 ? collapseNode.label.substring(0, 17) + '...' : collapseNode.label);
112 collapseNode.size = collapseNode.node.parent !== null ? 12 : 20;
113 collapseNode.labelToShow = collapseNode.label;
119 slowDown: getSlowDownNumFun($scope.sigma.graph.nodes().length)
121 $scope.sigma.startForceAtlas2(configAtlas);
126 $scope.selectedNodeColor = null;
128 var selectNode = function(node) {
130 edges = $scope.sigma.graph.edges();
131 if ( lastSelectedNode ) {
132 visualizerUtils.clearEdgeColors();
133 lastSelectedNode.color = $scope.selectedNodeColor ? $scope.selectedNodeColor : lastSelectedNode.color;
136 $scope.selectedNodeColor = selNode.color;
137 selNode.color = '#ffffff';
138 lastSelectedNode = selNode;
139 $scope.selectedNode = selNode.node;
140 $scope.childrenNodes.list = selNode.node.children.length ? selNode.node.children : [];
141 $scope.parentNodes.list = visualizerUtils.getParentNodes(selNode.node);
142 visualizerUtils.updateSelectedEdgesColors(edges, selNode);
143 selNode.size = selNode.size === 100 ? 100 : selNode.node.parent !== null ? 10 : 20;
144 $scope.sigma.refresh();
148 var setCameraToNode = function(node){
149 $scope.sigma.camera.goTo({
150 x: node['read_cam0:x'],
151 y: node['read_cam0:y']
156 $scope.topologyCustfunc = function(sigmaIstance, getSlowDownNum, dragListener, resize){
158 if ( resize && lastSelectedNode !== null ) {
159 lastSelectedNode = visualizerUtils.setDefaultSigmaValues(sigmaIstance, lastSelectedNode);
162 DesignVisualizerFactory.setMainClass();
164 $scope.sigma = sigmaIstance;
165 getSlowDownNumFun = getSlowDownNum;
167 sigmaIstance.bind('clickStage', function(e){
168 sigmaIstance.killForceAtlas2();
171 sigmaIstance.bind('clickNode', function(e) {
172 selectNode(e.data.node);
173 $scope.clickedNodesHistory = [e.data.node.id];
177 sigmaIstance.bind('doubleClickNode', function(e){
178 var selNode = e.data.node;
180 $scope.sigma.killForceAtlas2();
183 setTimeout(function(){
184 if ( selNode.expand ) {
185 expandNodeFunc(selNode, $scope.sliderValue);
187 collapseNodeFunc(selNode);
193 sigmaIstance.bind('overNode', function(e){
194 var node = e.data.node;
196 if ( node.labelToShow === null ) {
197 node.labelToShow = node.label;
199 node.label = node.node.label;
200 sigmaIstance.refresh();
203 sigmaIstance.bind('outNode', function(e){
204 var node = e.data.node;
206 if ( node.labelToShow !== null ) {
207 if ( !node.expand && node.labelToShow.indexOf(']') ) {
208 node.label = node.labelToShow.substring(node.labelToShow.indexOf(']') + 1);
210 node.label = node.labelToShow;
215 node.labelToShow = null;
216 sigmaIstance.refresh();
220 if ( $scope.selectedProperty ){
221 $scope.setColorScheme(null, $scope.selectedProperty);
226 var updateSliderSettings = function(){
227 $scope.sliderSettings.to = visualizerUtils.getMaxNodeLvl($scope.currentTopologyNode);
228 $scope.sliderValue = 4;
232 $scope.loadController = function(){
234 processingNodesCallback();
236 visualizerUtils.getAllnodes(function(allNodes){
237 $scope.filteredNodes = allNodes.filter(function(node){
238 return node.nodeType === 1;
241 $scope.currentTopologyNode = $scope.filteredNodes[0];
242 updateSliderSettings();
243 $scope.$broadcast('YV_MODEL_CHANGE');
245 processingNodesSuccessCallback();
246 $scope.topologyData = visualizerUtils.getTopologyData($scope.currentTopologyNode, $scope.sliderValue);
248 processingNodesErrorCallback(e);
254 $scope.updateTopologyData = function(mlts, modelChanged){
255 if ( modelChanged ) {
256 updateSliderSettings();
259 $scope.topologyData = visualizerUtils.getTopologyData($scope.currentTopologyNode, mlts !== null ? mlts : $scope.sliderValue, true);
260 $scope.selectedNode = null;
261 $scope.childrenNodes.list = [];
262 $scope.parentNodes.list = [];
263 lastSelectedNode = null;
264 $scope.expandedNodes = !modelChanged ? $scope.expandedNodes : false;
266 $scope.clickedNodesHistory = [];
268 if ( modelChanged ) {
269 $scope.selectedProperty = null;
270 $('.yangVisualizerWrapper div.viewNav li span').removeClass('active').parent().eq(0).find('span').addClass('active');
271 $scope.$broadcast('YV_MODEL_CHANGE');
274 $scope.isSelectedSpecificType = false;
277 $scope.triggerExpanded = function(nodes,cbk){
278 if($('#graph-container').hasClass('col-md-12')){
279 $('#graph-container').removeClass('col-md-12').addClass('col-md-6');
281 $('#graph-container').removeClass('col-md-6').addClass('col-md-12');
284 nodes.show = !nodes.show;
286 if ( angular.isFunction(cbk) ){
291 $scope.setColorScheme = function(e,property){
292 $scope.selectedProperty = property !== 'default' ? property : null;
295 $('.yangVisualizerWrapper div.viewNav li span').removeClass('active');
296 $(e.target).addClass('active');
299 $scope.legend = visualizerUtils.setNodesColor(property, $scope.sigma.graph.nodes(), $scope.currentTopologyNode);
300 $scope.sigma.refresh();
303 $scope.clickLegend = function(value, key){
305 if($scope.selectedProperty !== 'default'){
306 var wasChanged = false;
308 $scope.sigma.graph.nodes().forEach(function(node){
309 if(node.node[$scope.selectedProperty] === key){
319 $scope.isSelectedSpecificType = false;
321 $scope.isSelectedSpecificType = true;
324 $scope.sigma.refresh();
328 $scope.resetSize = function(){
329 $scope.sigma.graph.nodes().forEach(function(node){
330 node.size = node.parent === null ? 20 : node.expand ? 12 : 7;
333 $scope.isSelectedSpecificType = false;
334 $scope.sigma.refresh();
337 $scope.triggerResize = function(){
338 $scope.triggerResizeSigma = !$scope.triggerResizeSigma;
341 var selectGraphNode = function(node) {
343 setCameraToNode(node);
346 $scope.zoomToNode = function(id){
347 var nodeToZoom = visualizerUtils.getNodeById($scope.sigma.graph.nodes(), id);
348 $scope.sigma.killForceAtlas2();
350 $scope.clickedNodesHistory.push(id);
353 selectGraphNode(nodeToZoom);
357 $scope.backToNode = function(){
358 $scope.clickedNodesHistory.pop();
360 if ( $scope.clickedNodesHistory.length ){
361 var nodeId = $scope.clickedNodesHistory[$scope.clickedNodesHistory.length - 1],
362 nodeObjToBack = visualizerUtils.getNodeById($scope.sigma.graph.nodes(), nodeId);
364 if ( nodeObjToBack ) {
365 selectGraphNode(nodeObjToBack);
370 $scope.expandedNodes = false;
371 $scope.expandAllNodes = function(){
373 if ( !$scope.expandedNodes ) {
374 $scope.updateTopologyData(Infinity);
376 $scope.updateTopologyData(null);
379 $scope.expandedNodes = !$scope.expandedNodes;
382 $scope.$on('YV_UPDATE_TOPODATA',function(event, data){
383 $scope.topologyData = data.topoData;
384 $scope.sliderValue = data.sv;
385 console.log('data', data);
388 $scope.$on('YV_UPDATE_CTN', function(event, slider){
389 visualizerUtils.getTopologyData($scope.currentTopologyNode, slider, true);
392 $scope.loadController();
395 processingNodesErrorCallback: processingNodesErrorCallback,
396 processingNodesSuccessCallback: processingNodesSuccessCallback,
397 processingNodesCallback: processingNodesCallback,
398 lastSelectedNode: lastSelectedNode,
399 expandNodeFunc: expandNodeFunc,
400 collapseNodeFunc: collapseNodeFunc
405 yangvisualizer.register.controller('layoutCtrl',['$scope', '$rootScope','VizualiserLayoutFactory', function($scope, $rootScope, VizualiserLayoutFactory){
407 $scope.modelLayout = null;
414 $scope.setLayout = function(node){
415 $scope.modelLayout = VizualiserLayoutFactory.loadLayout($scope.currentTopologyNode);
416 console.log('$scope.modelLayout', $scope.modelLayout);
419 $scope.saveLayout = function(){
420 $scope.modelLayout = VizualiserLayoutFactory.saveLayout($scope.currentTopologyNode, $scope.sigma, $scope.sliderValue, $scope.selectedNodeColor);
421 console.log('$scope.modelLayout', $scope.modelLayout);
424 $scope.loadLayout = function(){
425 $scope.$emit('YV_UPDATE_CTN', $scope.modelLayout['slider-value']);
426 var topologyData = VizualiserLayoutFactory.getTopoData($scope.currentTopologyNode, $scope.modelLayout);
427 $scope.$emit('YV_UPDATE_TOPODATA', { topoData: topologyData, sv: $scope.modelLayout['slider-value'] });
430 $scope.resetLayout = function(){
431 $scope.sigma.startForceAtlas2(configAtlas);
434 $scope.$on('YV_MODEL_CHANGE', function(){