import Ember from 'ember'; import Util from 'ui/utils/util'; import ThrottledResize from 'ui/mixins/throttled-resize'; import { activeIcon } from 'ui/service/model'; export default Ember.View.extend(ThrottledResize,{ classNames: ['environment-graph'], graphZoom: null, graphInner: null, graphOuter: null, graphRender: null, graph: null, didInsertElement: function() { this._super(); var elem = $('
').appendTo('BODY'); this.set('graphElem', elem[0]); Ember.run.later(this,'initGraph',100); }, onResize: function() { $('#environment-svg').css('top', $('MAIN').position().top + 55 + 'px'); if ( this.get('graph') ) { this.renderGraph(); } }, initGraph: function() { var outer = d3.select("#environment-svg svg"); var inner = outer.select("g"); var zoom = d3.behavior.zoom().on("zoom", function() { inner.attr("transform", "translate(" + d3.event.translate + ")" + "scale(" + d3.event.scale + ")"); }); outer.call(zoom); var g = new dagreD3.graphlib.Graph().setGraph({ rankdir: "TB", nodesep: 50, ranksep: 50, marginx: 30, marginy: 30 }); var render = new dagreD3.render(); this.setProperties({ graphZoom: zoom, graphOuter: outer, graphInner: inner, graphRender: render, graph: g }); this.updateGraph(); }, crosslinkServices: function() { // Add services that are cross-linked from another environment var out = []; var unremovedServices = this.get('context.model.services').filter(function(service) { return ['removed','purging','purged'].indexOf(service.get('state')) === -1; }); unremovedServices.forEach((service) => { var externals = (service.get('consumedServicesWithNames')||[]).filter((linked) => { return linked.get('service.environmentId') !== this.get('context.model.id'); }).map((linked) => { return linked.get('service'); }); out.pushObjects(externals); }); return out; }.property('context.model.services.@each.consumedServicesUpdated'), updateGraph: function() { var g = this.get('graph'); var services = this.get('context.model.services'); var unremovedServices = services.filter(function(service) { return ['removed','purging','purged'].indexOf(service.get('state')) === -1; }); var unexpectedNodes = g.nodes(); var unexpectedEdges = g.edges(); var expectedServices = unremovedServices.slice(); expectedServices.pushObjects(this.get('crosslinkServices')); expectedServices.forEach((service) => { var serviceId = service.get('id'); var color = (service.get('state') === 'active' ? 'green' : (service.get('state') === 'inactive' ? 'red' : 'yellow')); var instances = service.get('instances.length')||'No'; var isCrossLink = service.get('environmentId') !== this.get('context.model.id'); var envName = ''; if ( isCrossLink ) { envName = service.get('displayEnvironment') + '/'; } var html = '' + '