/* * Copyright 2015-2018 Jeeva Kandasamy (jkandasa@gmail.com) * and other contributors as indicated by the @author tags. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ myControllerModule.controller('TopologyController', function(alertService, $scope, MetricsFactory, $stateParams, $state, displayRestError, mchelper, CommonServices, $filter, TopologyService, $interval, mchelper) { //GUI page settings $scope.headerStringList = $filter('translate')('TOPOLOGY'); $scope.noItemsSystemMsg = $filter('translate')('NO_DATA_AVAILABLE'); $scope.noItemsSystemIcon = "pficon pficon-topology"; $scope.mchelper = mchelper; $scope.query = {}; //Update $stateParams if($stateParams.resourceType && $stateParams.resourceId){ $scope.query = {'resourceType': $stateParams.resourceType, 'resourceId': $stateParams.resourceId}; } $scope.query.realtime = true; var self = this; $scope.vs = null; var d3 = window.d3; $scope.data = {}; $scope.search = {}; $scope.topologyHeight; $scope.displayKinds= {}; $scope.kinds = { "Gateway": "#vertex-Gateway", "Node": "#vertex-Node", "Sensor": "#vertex-Sensor", "SensorVariable": "#vertex-SensorVariable" }; // Refresh topology $scope.refresh = function() { MetricsFactory.getTopologyData($scope.query, function(data){ $scope.data = data; //$scope.relations = data.relations; $scope.displayKinds = data.kinds; },function(error){ displayRestError.display(error); }); }; $scope.isEmpty = function(item){ return angular.equals({}, item); } $scope.checkboxModel = { value : false }; $scope.legendTooltip = "Click here to show/hide entities of this type"; $scope.show_hide_names = function() { var vertices = $scope.vs; if($scope.checkboxModel.value) { vertices.selectAll("tspan") .style("display", "block"); } else { vertices.selectAll("tspan") .style("display", "none"); } }; $scope.refresh(); var promise = $interval( $scope.refresh, mchelper.cfg.globalPageRefreshTime); $scope.$on('$destroy', function() { $interval.cancel(promise); }); $scope.$on("render", function(ev, vertices, added) { /* * We are passed two selections of elements: * vertices: All the elements * added: Just the ones that were added */ added.attr("class", function(d) { return self.getKindClass(d); }); added.append("circle") .attr("r", function(d) { return self.getDimensions(d).r}) .attr('class' , function(d) { return TopologyService.getItemStatusClass(d); }); added.append("title"); added.on("dblclick", function(d) { return self.dblclick(d);}); added.append("text") .attr("x", function(d) { return self.getDimensions(d).x}) .attr("y", function(d) { return self.getDimensions(d).y}) .style("font-family", function(d) {return self.getIcon(d).fname;}) .style("fill", function(d) { return self.getDimensions(d).fc}) .attr('font-size', function(d) { return self.getDimensions(d).fs +'px'} ) .text(function(d) {return self.getIcon(d).ucode;}) .append("tspan") .attr("x", 26) .attr("y", 24) .text(function(d) { return d.item.name }) .style("font-size", function(d) {return "12px"}).style("fill", function(d) {return "black"}) .style("font-family","FontAwesome") .style("display", function(d) {if ($scope.checkboxModel.value) {return "block"} else {return "none"}}); added.selectAll("title").text(function(d) { return TopologyService.tooltip(d).join("\n"); }); $scope.vs = vertices; /* Don't do default rendering */ ev.preventDefault(); }); self.class_name = function class_name(d) { var class_name = d.item.icon; return class_name; }; this.dblclick = function dblclick(d) { //window.location.assign(TopologyService.geturl(d)); switch(d.item.kind) { case "Gateway": $state.go("gatewaysDetail", {'id': d.item.id}); break; case "Node": $state.go("nodesDetail", {'id': d.item.id}); break; case "Sensor": $state.go("sensorsDetail", {'id': d.item.id}); break; case "SensorVariable": $state.go("sensorVariableEdit", {'id': d.item.id}); break; } }; self.getDimensions = function getDimensions(d) { switch (d.item.kind) { case "Gateway": return { x: 0, y: 11, r: 28, fs: 33, fc:'#663333'}; case "Node" : return { x: 0, y: 9, r: 21, fs: 27, fc:'#1186C1'}; case "Sensor" : return { x: 0.2, y: 8, r: 15, fs: 21, fc:'#9467bd'}; default : return { x: 0, y: 6, r: 12, fs:16, fc:'#ff7f0e'}; } }; self.getIcon = function(d) { switch (d.item.kind) { case "Gateway": return {ucode:'\uf1e6', fname:'FontAwesome'}; case "Node" : return {ucode:'\uf0e8', fname:'FontAwesome'}; case "Sensor" : return CommonServices.getSensorIconData(d.item.subType.en); default : return {ucode:'\uf005', fname:'FontAwesome'}; } }; self.getKindClass = function(d) { switch (d.item.kind) { case "Node": return 'McNode'; default : return d.item.kind; } }; $scope.searchNode = function() { var svg = TopologyService.getSVG(d3); var query = $scope.search.query; TopologyService.searchNode(svg, query); }; $scope.resetSearch = function() { TopologyService.resetSearch(d3); // Reset the search term in search input $scope.search.query = ""; }; var resized = function(){ var height = window.innerHeight - 265; if(height < 350){ $scope.topologyHeight = 350; }else{ $scope.topologyHeight = height; } } //set layout height resized(); });