ing
This commit is contained in:
		
							parent
							
								
									3743509b7a
								
							
						
					
					
						commit
						bca899db76
					
				| @ -18,7 +18,8 @@ | ||||
|   <svg #discoveryTarget width="100%" height="100%"> | ||||
|     <g> | ||||
|       <g *ngFor="let link of links"> | ||||
|         <line class="link" [attr.x1]="link.source.x" [attr.y1]="link.source.y" [attr.x2]="link.target.x" [attr.y2]="link.target.y"></line> | ||||
|         <line class="link" [attr.sourceId]="link.source.id" [attr.targetId]="link.target.id" [attr.x1]="link.source.x" | ||||
|           [attr.y1]="link.source.y" [attr.x2]="link.target.x" [attr.y2]="link.target.y"></line> | ||||
|       </g> | ||||
|       <g *ngFor="let node of nodes"> | ||||
|         <g class="node-container" [attr.nodeId]="node.id" [attr.transform]="'translate(' + node.x + ',' + node.y + ')'" | ||||
|  | ||||
| @ -14,6 +14,7 @@ import { Node } from '../../../commons/model/node'; | ||||
| import { Link } from '../../../commons/model/link'; | ||||
| 
 | ||||
| import { RPCError } from '@overflow/rpc-js'; | ||||
| import { toMetaIPType, MetaIPTypeEnum, toMetaCryptoType, MetaCryptoTypeEnum } from '@overflow/model/meta'; | ||||
| 
 | ||||
| @Component({ | ||||
|   selector: 'app-pages-home', | ||||
| @ -39,6 +40,7 @@ export class HomePageComponent implements OnInit, OnDestroy { | ||||
|   showIntro = true; | ||||
|   selectedNode = null; | ||||
| 
 | ||||
|   private zoneNode: Node; | ||||
|   private nodes: Node[]; | ||||
|   private links: Link[]; | ||||
|   public simulation: d3.Simulation<Node, Link> | undefined; | ||||
| @ -125,28 +127,120 @@ export class HomePageComponent implements OnInit, OnDestroy { | ||||
|     this.nodes = []; | ||||
|     this.links = []; | ||||
| 
 | ||||
|     this.zoneNode = new Node('192.168.1.0/24'); | ||||
|     this.zoneNode.group = 'zone'; | ||||
|     this.zoneNode.target = this.zone; | ||||
|     this.zoneNode.fx = width / 2; | ||||
|     this.zoneNode.fy = height / 2; | ||||
|     this.zoneNode.r = 60; | ||||
| 
 | ||||
|     // const hostNode = new Node('192.168.1.1');
 | ||||
|     // hostNode.group = 'host';
 | ||||
|     // hostNode.target = {
 | ||||
|     //   metaIPType: toMetaIPType(MetaIPTypeEnum.V4),
 | ||||
|     //   name: 'Host1',
 | ||||
|     //   address: '192.168.1.1',
 | ||||
|     //   mac: '44:8a:5b:f1:f1:f3',
 | ||||
|     //   osType: 'UNKNOWN',
 | ||||
|     //   hostType: 'HOST',
 | ||||
|     //   hostVendor: 'UNKNOWN',
 | ||||
|     //   hostModel: 'UNKNOWN',
 | ||||
|     //   zone: this.zone,
 | ||||
|     // };
 | ||||
|     // hostNode.r = 40;
 | ||||
| 
 | ||||
|     // const hostNode2 = new Node('192.168.1.2');
 | ||||
|     // hostNode2.group = 'host';
 | ||||
|     // hostNode2.target = {
 | ||||
|     //   metaIPType: toMetaIPType(MetaIPTypeEnum.V4),
 | ||||
|     //   name: 'Host2',
 | ||||
|     //   address: '192.168.1.2',
 | ||||
|     //   mac: '44:8a:5b:f1:f1:f3',
 | ||||
|     //   osType: 'UNKNOWN',
 | ||||
|     //   hostType: 'HOST',
 | ||||
|     //   hostVendor: 'UNKNOWN',
 | ||||
|     //   hostModel: 'UNKNOWN',
 | ||||
|     //   zone: this.zone,
 | ||||
|     // };
 | ||||
|     // hostNode2.r = 40;
 | ||||
| 
 | ||||
|     // const hostNode3 = new Node('192.168.1.3');
 | ||||
|     // hostNode3.group = 'host';
 | ||||
|     // hostNode3.target = {
 | ||||
|     //   metaIPType: toMetaIPType(MetaIPTypeEnum.V4),
 | ||||
|     //   name: 'Host2',
 | ||||
|     //   address: '192.168.1.3',
 | ||||
|     //   mac: '44:8a:5b:f1:f1:f3',
 | ||||
|     //   osType: 'UNKNOWN',
 | ||||
|     //   hostType: 'HOST',
 | ||||
|     //   hostVendor: 'UNKNOWN',
 | ||||
|     //   hostModel: 'UNKNOWN',
 | ||||
|     //   zone: this.zone,
 | ||||
|     // };
 | ||||
|     // hostNode3.r = 40;
 | ||||
| 
 | ||||
|     // const serviceNode1 = new Node('192.168.1.1-10-HTTP');
 | ||||
|     // serviceNode1.target = {
 | ||||
|     //   metaCryptoType: toMetaCryptoType(MetaCryptoTypeEnum.NONE),
 | ||||
|     //   key: 'HTTP',
 | ||||
|     //   name: 'Apache',
 | ||||
|     //   serviceType: 'WEB',
 | ||||
|     //   serviceVendor: 'Apache',
 | ||||
|     //   serviceVersion: 'UNKNOWN',
 | ||||
| 
 | ||||
|     // };
 | ||||
|     // serviceNode1.group = 'service';
 | ||||
|     // serviceNode1.r = 30;
 | ||||
| 
 | ||||
|     // const serviceNode2 = new Node('192.168.1.1-20-HTTP');
 | ||||
|     // serviceNode2.target = {
 | ||||
|     //   metaCryptoType: toMetaCryptoType(MetaCryptoTypeEnum.NONE),
 | ||||
|     //   key: 'HTTP',
 | ||||
|     //   name: 'Apache',
 | ||||
|     //   serviceType: 'WEB',
 | ||||
|     //   serviceVendor: 'Apache',
 | ||||
|     //   serviceVersion: 'UNKNOWN',
 | ||||
| 
 | ||||
|     // };
 | ||||
|     // serviceNode2.group = 'service';
 | ||||
|     // serviceNode2.r = 30;
 | ||||
| 
 | ||||
|     // const serviceNode3 = new Node('192.168.1.1-30-HTTP');
 | ||||
|     // serviceNode3.target = {
 | ||||
|     //   metaCryptoType: toMetaCryptoType(MetaCryptoTypeEnum.NONE),
 | ||||
|     //   key: 'HTTP',
 | ||||
|     //   name: 'Apache',
 | ||||
|     //   serviceType: 'WEB',
 | ||||
|     //   serviceVendor: 'Apache',
 | ||||
|     //   serviceVersion: 'UNKNOWN',
 | ||||
| 
 | ||||
|     // };
 | ||||
|     // serviceNode3.group = 'service';
 | ||||
|     // serviceNode3.r = 30;
 | ||||
| 
 | ||||
| 
 | ||||
|     this.nodes.push( | ||||
|       { id: '192.168.1.0/24', group: 'zone', target: this.zone, fx: width / 2, fy: height / 2, r: 60 }, | ||||
|       // { id: '192.168.1.1', group: 'host', target: { address: '192.168.1.1', zone: this.zone, hostType: 'NAS' }, r: 40 },
 | ||||
|       // { id: '192.168.1.1' },
 | ||||
|       // { id: '192.168.1.2' },
 | ||||
|       this.zoneNode, | ||||
|       // hostNode,
 | ||||
|       // hostNode2,
 | ||||
|       // hostNode3,
 | ||||
|       // serviceNode1,
 | ||||
|       // serviceNode2,
 | ||||
|       // serviceNode3,
 | ||||
|     ); | ||||
| 
 | ||||
|     this.links.push( | ||||
|       // { source: this.getNode('192.168.1.0/24'), target: this.getNode('192.168.1.1') },
 | ||||
|       // { source: this.getNode('192.168.1.0/24'), target: this.getNode('192.168.1.2') }
 | ||||
|       // new Link(this.zoneNode, hostNode),
 | ||||
|       // new Link(this.zoneNode, hostNode2),
 | ||||
|       // new Link(this.zoneNode, hostNode3),
 | ||||
|       // new Link(hostNode, serviceNode1),
 | ||||
|       // new Link(hostNode, serviceNode2),
 | ||||
|       // new Link(hostNode, serviceNode3),
 | ||||
|     ); | ||||
| 
 | ||||
|     this.simulationRestart(); | ||||
|     this.simulationRestart(true); | ||||
| 
 | ||||
|     this.probeService.send('DiscoveryService.DiscoverHost', requesterID, this.zone, this.discoverHost); | ||||
| 
 | ||||
|     // this.probeService.send(
 | ||||
|     //   'DiscoveryService.DiscoverHost',
 | ||||
|     //   requesterID,
 | ||||
|     //   this.discoveryConfigService.getZone(),
 | ||||
|     //   this.discoveryConfigService.getDiscoverHost()
 | ||||
|     // );
 | ||||
|   } | ||||
| 
 | ||||
|   simulationInit() { | ||||
| @ -183,66 +277,31 @@ export class HomePageComponent implements OnInit, OnDestroy { | ||||
| 
 | ||||
|   simulationRestart(attachEvent: boolean = false) { | ||||
|     // Update and restart the simulation.
 | ||||
|     this.simulation | ||||
|       .nodes(this.nodes) | ||||
|       .force('link', d3.forceLink(this.links).distance(150)) | ||||
|       .alpha(1) | ||||
|       .restart() | ||||
|       ; | ||||
|     this.changeDetector.detectChanges(); | ||||
| 
 | ||||
|     if (attachEvent) { | ||||
|       const __this = this; | ||||
| 
 | ||||
|       //   function started(node: Node) {
 | ||||
|       //     /** Preventing propagation of dragstart to parent elements */
 | ||||
|       //     d3.event.sourceEvent.stopPropagation();
 | ||||
|       const nodeElements = d3.select(this.discoveryTargetRef.nativeElement).selectAll('.node-container'); | ||||
|       const linkElements = d3.select(this.discoveryTargetRef.nativeElement).selectAll('.link'); | ||||
| 
 | ||||
|       //     if (!d3.event.active) {
 | ||||
|       //       __this.simulation.alphaTarget(0.3).restart();
 | ||||
|       //     }
 | ||||
|       function getNodeFromElement(element: Element): Node | null { | ||||
|         const container = d3.select(element); | ||||
|         const nodeId = container.attr('nodeId'); | ||||
|         return __this.getNode(nodeId); | ||||
|       } | ||||
| 
 | ||||
|       //     d3.event.on('drag', dragged).on('end', ended);
 | ||||
| 
 | ||||
|       //     function dragged() {
 | ||||
|       //       if (undefined === node) {
 | ||||
|       //         return;
 | ||||
|       //       }
 | ||||
| 
 | ||||
|       //       node.fx = d3.event.x;
 | ||||
|       //       node.fy = d3.event.y;
 | ||||
|       //     }
 | ||||
| 
 | ||||
|       //     function ended() {
 | ||||
|       //       if (!d3.event.active) {
 | ||||
|       //         __this.simulation.alphaTarget(0);
 | ||||
|       //       }
 | ||||
| 
 | ||||
|       //       if (undefined === node) {
 | ||||
|       //         return;
 | ||||
|       //       }
 | ||||
|       //       node.fx = null;
 | ||||
|       //       node.fy = null;
 | ||||
|       //     }
 | ||||
|       //   }
 | ||||
| 
 | ||||
|       //   d3.select(this.discoveryTargetRef.nativeElement).selectAll('.node-container').call(d3.drag().on('start', started));
 | ||||
| 
 | ||||
|       // d3.select(this.discoveryTargetRef.nativeElement).selectAll('.node-container').call(
 | ||||
|       //   d3.drag()
 | ||||
|       //     .on('start', (node: Node, i: number) => {
 | ||||
|       //       __this.simulation.stop();
 | ||||
|       //     })
 | ||||
|       //     .on('drag', (node: Node, i: number) => {
 | ||||
|       //       node.fx += d3.event.dx;
 | ||||
|       //       node.fy += d3.event.dy;
 | ||||
|       //       node.x += d3.event.dx;
 | ||||
|       //       node.y += d3.event.dy;
 | ||||
|       //     })
 | ||||
|       //     .on('end', (node: Node, i: number) => {
 | ||||
|       //       __this.simulation.stop();
 | ||||
|       //     })
 | ||||
|       // );
 | ||||
| 
 | ||||
|       d3.select(this.discoveryTargetRef.nativeElement).selectAll('.node-container').call( | ||||
|       // drag
 | ||||
|       nodeElements.call( | ||||
|         d3.drag() | ||||
|           .on('start', function () { | ||||
|             const container = d3.select(this); | ||||
|             const nodeId = container.attr('nodeId'); | ||||
|             const node = __this.getNode(nodeId); | ||||
|             const node = getNodeFromElement(this); | ||||
| 
 | ||||
|             d3.event.sourceEvent.stopPropagation(); | ||||
| 
 | ||||
| @ -268,14 +327,49 @@ export class HomePageComponent implements OnInit, OnDestroy { | ||||
|           }) | ||||
|       ); | ||||
| 
 | ||||
|     } | ||||
|       nodeElements | ||||
|         .on('mouseover', function () { | ||||
|           const node = getNodeFromElement(this as Element); | ||||
|           if ('zone' === node.group) { | ||||
|             return; | ||||
|           } | ||||
|           nodeElements.style('opacity', function (): number { | ||||
|             const _node = getNodeFromElement(this as Element); | ||||
|             for (let i = 0; i < node.links.length; i++) { | ||||
|               const link = node.links[i]; | ||||
|               if (node === _node || link.source === _node || link.target === _node) { | ||||
|                 return 1; | ||||
|               } | ||||
|             } | ||||
|             return 0.3; | ||||
|           }); | ||||
|           linkElements.style('opacity', function (): number { | ||||
|             const linkElement = d3.select(this as Element); | ||||
|             const sourceId = linkElement.attr('sourceId'); | ||||
|             const targetId = linkElement.attr('targetId'); | ||||
| 
 | ||||
|     this.simulation | ||||
|       .nodes(this.nodes) | ||||
|       .force('link', d3.forceLink(this.links).distance(150)) | ||||
|       .alpha(1) | ||||
|       .restart() | ||||
|       ; | ||||
|             if (sourceId === node.id || targetId === node.id) { | ||||
|               return 1; | ||||
|             } | ||||
| 
 | ||||
|             return 0.3; | ||||
|           }); | ||||
|         }) | ||||
|         .on('mousedown', function () { | ||||
| 
 | ||||
|         }) | ||||
|         .on('mouseout', function () { | ||||
|           const node = getNodeFromElement(this as Element); | ||||
|           nodeElements.style('opacity', function (): number { | ||||
|             return 1; | ||||
|           }); | ||||
|           linkElements.style('opacity', function (): number { | ||||
|             return 1; | ||||
|           }); | ||||
|         }) | ||||
|         ; | ||||
| 
 | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   onTargetClick(node: Node) { | ||||
| @ -376,7 +470,6 @@ export class HomePageComponent implements OnInit, OnDestroy { | ||||
|     } | ||||
| 
 | ||||
|     const hostId = `${host.address}`; | ||||
|     const zoneNode = this.getNode('192.168.1.0/24'); | ||||
| 
 | ||||
|     let hostNode = this.getNode(hostId); | ||||
|     if (null !== hostNode) { | ||||
| @ -386,11 +479,11 @@ export class HomePageComponent implements OnInit, OnDestroy { | ||||
|       hostNode.target = host; | ||||
|       hostNode.group = 'host'; | ||||
|       hostNode.r = 40; | ||||
|       hostNode.x = zoneNode.x; | ||||
|       hostNode.y = zoneNode.y; | ||||
|       hostNode.x = this.zoneNode.x; | ||||
|       hostNode.y = this.zoneNode.y; | ||||
| 
 | ||||
|       this.nodes.push(hostNode); | ||||
|       this.links.push(new Link(zoneNode, hostNode)); | ||||
|       this.links.push(new Link(this.zoneNode, hostNode)); | ||||
|     } | ||||
| 
 | ||||
|     this.simulationRestart(); | ||||
|  | ||||
| @ -8,7 +8,13 @@ export class Link implements d3.SimulationLinkDatum<Node> { | ||||
| 
 | ||||
|   index?: number; | ||||
| 
 | ||||
|   constructor(source, target) { | ||||
|   constructor(source: Node, target: Node) { | ||||
|     target.addLink(this); | ||||
| 
 | ||||
|     if ('zone' !== source.group) { | ||||
|       source.addLink(this); | ||||
|     } | ||||
| 
 | ||||
|     this.source = source; | ||||
|     this.target = target; | ||||
|   } | ||||
|  | ||||
| @ -1,4 +1,5 @@ | ||||
| import * as d3 from 'd3'; | ||||
| import { Link } from './link'; | ||||
| 
 | ||||
| export class Node implements d3.SimulationNodeDatum { | ||||
|   /** | ||||
| @ -40,8 +41,15 @@ export class Node implements d3.SimulationNodeDatum { | ||||
| 
 | ||||
|   image?: string; | ||||
| 
 | ||||
|   links?: Link[]; | ||||
| 
 | ||||
|   constructor(id) { | ||||
|     this.id = id; | ||||
|     this.links = []; | ||||
|   } | ||||
| 
 | ||||
|   addLink(link: Link) { | ||||
|     this.links.push(link); | ||||
|   } | ||||
| 
 | ||||
| } | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user