From 0b61093dfffeaf7996a82ab185478a11b63cb5bb Mon Sep 17 00:00:00 2001 From: ziajka Date: Fri, 1 Dec 2017 14:07:19 +0100 Subject: [PATCH] Draw line menu --- src/app/app.module.ts | 2 + .../cartography/shared/models/node.model.ts | 3 +- .../shared/widgets/nodes.widget.ts | 26 ++++++++---- .../project-map/project-map.component.html | 12 +++++- src/app/project-map/project-map.component.ts | 19 +++++++++ src/app/shared/models/port.ts | 7 ++++ .../node-select-interface.component.html | 9 +++++ .../node-select-interface.component.scss | 3 ++ .../node-select-interface.component.spec.ts | 25 ++++++++++++ .../node-select-interface.component.ts | 40 +++++++++++++++++++ 10 files changed, 137 insertions(+), 9 deletions(-) create mode 100644 src/app/shared/models/port.ts create mode 100644 src/app/shared/node-select-interface/node-select-interface.component.html create mode 100644 src/app/shared/node-select-interface/node-select-interface.component.scss create mode 100644 src/app/shared/node-select-interface/node-select-interface.component.spec.ts create mode 100644 src/app/shared/node-select-interface/node-select-interface.component.ts diff --git a/src/app/app.module.ts b/src/app/app.module.ts index fed07caa..f57f45f1 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -46,6 +46,7 @@ import { StartNodeActionComponent } from './shared/node-context-menu/actions/sta import { StopNodeActionComponent } from './shared/node-context-menu/actions/stop-node-action/stop-node-action.component'; import { ApplianceComponent } from './appliance/appliance.component'; import { ApplianceListDialogComponent } from './appliance/appliance-list-dialog/appliance-list-dialog.component'; +import { NodeSelectInterfaceComponent } from './shared/node-select-interface/node-select-interface.component'; @NgModule({ @@ -64,6 +65,7 @@ import { ApplianceListDialogComponent } from './appliance/appliance-list-dialog/ StopNodeActionComponent, ApplianceComponent, ApplianceListDialogComponent, + NodeSelectInterfaceComponent, ], imports: [ NgbModule.forRoot(), diff --git a/src/app/cartography/shared/models/node.model.ts b/src/app/cartography/shared/models/node.model.ts index 12a3a6cb..ce68d27a 100644 --- a/src/app/cartography/shared/models/node.model.ts +++ b/src/app/cartography/shared/models/node.model.ts @@ -1,4 +1,5 @@ import {Label} from "./label.model"; +import {Port} from "../../../shared/models/port"; export class Node { command_line: string; @@ -15,7 +16,7 @@ export class Node { node_type: string; port_name_format: string; port_segment_size: number; - ports: number[]; + ports: Port[]; project_id: string; status: string; symbol: string; diff --git a/src/app/cartography/shared/widgets/nodes.widget.ts b/src/app/cartography/shared/widgets/nodes.widget.ts index ed52d6bd..44f6bc7b 100644 --- a/src/app/cartography/shared/widgets/nodes.widget.ts +++ b/src/app/cartography/shared/widgets/nodes.widget.ts @@ -10,6 +10,7 @@ export class NodesWidget implements Widget { private debug = false; private onContextMenuCallback: (event: any, node: Node) => void; + private onNodeClickedCallback: (event: any, node: Node) => void; private onNodeDraggedCallback: (event: any, node: Node) => void; private onNodeDraggingCallbacks: ((event: any, node: Node) => void)[] = []; @@ -21,6 +22,10 @@ export class NodesWidget implements Widget { this.onContextMenuCallback = onContextMenuCallback; } + public setOnNodeClickedCallback(onNodeClickedCallback: (event: any, node: Node) => void) { + this.onNodeClickedCallback = onNodeClickedCallback; + } + public setOnNodeDraggedCallback(onNodeDraggedCallback: (event: any, node: Node) => void) { this.onNodeDraggedCallback = onNodeDraggedCallback; } @@ -102,13 +107,20 @@ export class NodesWidget implements Widget { .attr('y', '0'); } - const node_merge = node.merge(node_enter) - .on("contextmenu", function (n: Node, i: number) { - event.preventDefault(); - if (self.onContextMenuCallback !== null) { - self.onContextMenuCallback(event, n); - } - }); + const node_merge = node + .merge(node_enter) + .on("contextmenu", function (n: Node, i: number) { + event.preventDefault(); + if (self.onContextMenuCallback !== null) { + self.onContextMenuCallback(event, n); + } + }) + .on('click', (n: Node) => { + if (self.onNodeClickedCallback) { + self.onNodeClickedCallback(event, n); + } + }); + this.revise(node_merge); diff --git a/src/app/project-map/project-map.component.html b/src/app/project-map/project-map.component.html index a279b224..eba729c7 100644 --- a/src/app/project-map/project-map.component.html +++ b/src/app/project-map/project-map.component.html @@ -19,6 +19,16 @@ + + + + + + + + diff --git a/src/app/shared/node-select-interface/node-select-interface.component.scss b/src/app/shared/node-select-interface/node-select-interface.component.scss new file mode 100644 index 00000000..6101a2b8 --- /dev/null +++ b/src/app/shared/node-select-interface/node-select-interface.component.scss @@ -0,0 +1,3 @@ +.context-menu { + position: absolute; +} diff --git a/src/app/shared/node-select-interface/node-select-interface.component.spec.ts b/src/app/shared/node-select-interface/node-select-interface.component.spec.ts new file mode 100644 index 00000000..57797a9a --- /dev/null +++ b/src/app/shared/node-select-interface/node-select-interface.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { NodeSelectInterfaceComponent } from './node-select-interface.component'; + +describe('NodeSelectInterfaceComponent', () => { + let component: NodeSelectInterfaceComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ NodeSelectInterfaceComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(NodeSelectInterfaceComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/shared/node-select-interface/node-select-interface.component.ts b/src/app/shared/node-select-interface/node-select-interface.component.ts new file mode 100644 index 00000000..b48db6f5 --- /dev/null +++ b/src/app/shared/node-select-interface/node-select-interface.component.ts @@ -0,0 +1,40 @@ +import {ChangeDetectorRef, Component, Input, OnInit, ViewChild} from '@angular/core'; +import {MatMenuTrigger} from "@angular/material"; +import {DomSanitizer} from "@angular/platform-browser"; +import {Node} from "../../cartography/shared/models/node.model"; + + +@Component({ + selector: 'app-node-select-interface', + templateUrl: './node-select-interface.component.html', + styleUrls: ['./node-select-interface.component.scss'] +}) +export class NodeSelectInterfaceComponent implements OnInit { + + @ViewChild(MatMenuTrigger) contextMenu: MatMenuTrigger; + + private topPosition; + private leftPosition; + private node: Node; + + constructor( + private sanitizer: DomSanitizer, + private changeDetector: ChangeDetectorRef) {} + + ngOnInit() { + this.setPosition(0, 0); + } + + public setPosition(top: number, left: number) { + this.topPosition = this.sanitizer.bypassSecurityTrustStyle(top + "px"); + this.leftPosition = this.sanitizer.bypassSecurityTrustStyle(left + "px"); + this.changeDetector.detectChanges(); + } + + public open(node: Node, top: number, left: number) { + this.node = node; + this.setPosition(top, left); + this.contextMenu.openMenu(); + } + +}