diff --git a/src/app/app-routing.module.ts b/src/app/app-routing.module.ts index 2ba47f18..9483f6b0 100644 --- a/src/app/app-routing.module.ts +++ b/src/app/app-routing.module.ts @@ -11,9 +11,11 @@ import { InstalledSoftwareComponent } from './components/installed-software/inst const routes: Routes = [ - { path: '', component: DefaultLayoutComponent, + { + path: '', + component: DefaultLayoutComponent, children: [ - { path: '', redirectTo: 'servers', pathMatch: 'full'}, + { path: '', redirectTo: 'servers', pathMatch: 'full' }, { path: 'servers', component: ServersComponent }, { path: 'local', component: LocalServerComponent }, { path: 'server/:server_id/projects', component: ProjectsComponent }, @@ -21,12 +23,11 @@ const routes: Routes = [ { path: 'installed-software', component: InstalledSoftwareComponent }, ] }, - { path: 'server/:server_id/project/:project_id', component: ProjectMapComponent }, + { path: 'server/:server_id/project/:project_id', component: ProjectMapComponent } ]; - @NgModule({ - imports: [ RouterModule.forRoot(routes) ], - exports: [ RouterModule ] + imports: [RouterModule.forRoot(routes)], + exports: [RouterModule] }) export class AppRoutingModule {} diff --git a/src/app/app.component.html b/src/app/app.component.html index 90c6b646..0680b43f 100644 --- a/src/app/app.component.html +++ b/src/app/app.component.html @@ -1 +1 @@ - \ No newline at end of file + diff --git a/src/app/app.component.spec.ts b/src/app/app.component.spec.ts index cf7fcb42..96c4372f 100644 --- a/src/app/app.component.spec.ts +++ b/src/app/app.component.spec.ts @@ -2,13 +2,12 @@ import { TestBed, async, ComponentFixture } from '@angular/core/testing'; import { RouterTestingModule } from '@angular/router/testing'; import { AppComponent } from './app.component'; -import { MatIconModule } from "@angular/material"; -import { SettingsService } from "./services/settings.service"; -import { PersistenceService } from "angular-persistence"; -import { ElectronService, NgxElectronModule } from "ngx-electron"; +import { MatIconModule } from '@angular/material'; +import { SettingsService } from './services/settings.service'; +import { PersistenceService } from 'angular-persistence'; +import { ElectronService, NgxElectronModule } from 'ngx-electron'; import createSpyObj = jasmine.createSpyObj; - describe('AppComponent', () => { let component: AppComponent; let fixture: ComponentFixture; @@ -17,18 +16,9 @@ describe('AppComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ - declarations: [ - AppComponent - ], - imports: [ - RouterTestingModule, - MatIconModule, - NgxElectronModule - ], - providers: [ - SettingsService, - PersistenceService, - ] + declarations: [AppComponent], + imports: [RouterTestingModule, MatIconModule, NgxElectronModule], + providers: [SettingsService, PersistenceService] }).compileComponents(); electronService = TestBed.get(ElectronService); diff --git a/src/app/app.component.ts b/src/app/app.component.ts index 0dd59c5d..f1979599 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -1,30 +1,27 @@ import { Component, OnInit } from '@angular/core'; -import { MatIconRegistry } from "@angular/material"; -import { DomSanitizer } from "@angular/platform-browser"; -import { ElectronService } from "ngx-electron"; -import { SettingsService } from "./services/settings.service"; - +import { MatIconRegistry } from '@angular/material'; +import { DomSanitizer } from '@angular/platform-browser'; +import { ElectronService } from 'ngx-electron'; +import { SettingsService } from './services/settings.service'; @Component({ selector: 'app-root', templateUrl: './app.component.html', - styleUrls: [ - './app.component.css' - ] + styleUrls: ['./app.component.css'] }) export class AppComponent implements OnInit { - constructor( - iconReg: MatIconRegistry, - sanitizer: DomSanitizer, - private settingsService: SettingsService, - private electronService: ElectronService) { - - iconReg.addSvgIcon('gns3', sanitizer.bypassSecurityTrustResourceUrl('./assets/gns3_icon.svg')); + constructor( + iconReg: MatIconRegistry, + sanitizer: DomSanitizer, + private settingsService: SettingsService, + private electronService: ElectronService + ) { + iconReg.addSvgIcon('gns3', sanitizer.bypassSecurityTrustResourceUrl('./assets/gns3_icon.svg')); } ngOnInit(): void { if (this.electronService.isElectronApp) { - this.settingsService.subscribe((settings) => { + this.settingsService.subscribe(settings => { this.electronService.ipcRenderer.send('settings.changed', settings); }); } diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 745586f8..a526f82d 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -2,7 +2,7 @@ import * as Raven from 'raven-js'; import { BrowserModule } from '@angular/platform-browser'; import { NgModule, ErrorHandler } from '@angular/core'; import { FormsModule, ReactiveFormsModule } from '@angular/forms'; -import { CdkTableModule } from "@angular/cdk/table"; +import { CdkTableModule } from '@angular/cdk/table'; import { HttpClientModule } from '@angular/common/http'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; @@ -16,54 +16,55 @@ import { AppRoutingModule } from './app-routing.module'; import { VersionService } from './services/version.service'; import { ProjectService } from './services/project.service'; -import { SymbolService } from "./services/symbol.service"; -import { ServerService } from "./services/server.service"; -import { IndexedDbService } from "./services/indexed-db.service"; -import { HttpServer, ServerErrorHandler } from "./services/http-server.service"; -import { SnapshotService } from "./services/snapshot.service"; -import { ProgressDialogService } from "./common/progress-dialog/progress-dialog.service"; -import { NodeService } from "./services/node.service"; -import { TemplateService } from "./services/template.service"; -import { LinkService } from "./services/link.service"; +import { SymbolService } from './services/symbol.service'; +import { ServerService } from './services/server.service'; +import { IndexedDbService } from './services/indexed-db.service'; +import { HttpServer, ServerErrorHandler } from './services/http-server.service'; +import { SnapshotService } from './services/snapshot.service'; +import { ProgressDialogService } from './common/progress-dialog/progress-dialog.service'; +import { NodeService } from './services/node.service'; +import { TemplateService } from './services/template.service'; +import { LinkService } from './services/link.service'; import { ProjectsComponent } from './components/projects/projects.component'; import { AddBlankProjectDialogComponent } from './components/projects/add-blank-project-dialog/add-blank-project-dialog.component'; import { ImportProjectDialogComponent } from './components/projects/import-project-dialog/import-project-dialog.component'; -import { ConfirmationDialogComponent} from './components/projects/confirmation-dialog/confirmation-dialog.component'; +import { ConfirmationDialogComponent } from './components/projects/confirmation-dialog/confirmation-dialog.component'; import { DefaultLayoutComponent } from './layouts/default-layout/default-layout.component'; import { ProgressDialogComponent } from './common/progress-dialog/progress-dialog.component'; import { AppComponent } from './app.component'; import { ProjectMapComponent } from './components/project-map/project-map.component'; import { ServersComponent, AddServerDialogComponent } from './components/servers/servers.component'; -import { NodeContextMenuComponent } from './components/project-map/node-context-menu/node-context-menu.component'; -import { StartNodeActionComponent } from './components/project-map/node-context-menu/actions/start-node-action/start-node-action.component'; -import { StopNodeActionComponent } from './components/project-map/node-context-menu/actions/stop-node-action/stop-node-action.component'; +import { ContextMenuComponent } from './components/project-map/context-menu/context-menu.component'; +import { StartNodeActionComponent } from './components/project-map/context-menu/actions/start-node-action/start-node-action.component'; +import { StopNodeActionComponent } from './components/project-map/context-menu/actions/stop-node-action/stop-node-action.component'; import { TemplateComponent } from './components/template/template.component'; import { TemplateListDialogComponent } from './components/template/template-list-dialog/template-list-dialog.component'; import { CartographyModule } from './cartography/cartography.module'; import { ToasterService } from './services/toaster.service'; -import { ProjectWebServiceHandler } from "./handlers/project-web-service-handler"; -import { LinksDataSource } from "./cartography/datasources/links-datasource"; -import { NodesDataSource } from "./cartography/datasources/nodes-datasource"; -import { SymbolsDataSource } from "./cartography/datasources/symbols-datasource"; -import { SelectionManager } from "./cartography/managers/selection-manager"; -import { InRectangleHelper } from "./cartography/helpers/in-rectangle-helper"; -import { DrawingsDataSource } from "./cartography/datasources/drawings-datasource"; -import { MoveLayerDownActionComponent } from './components/project-map/node-context-menu/actions/move-layer-down-action/move-layer-down-action.component'; -import { MoveLayerUpActionComponent } from './components/project-map/node-context-menu/actions/move-layer-up-action/move-layer-up-action.component'; +import { ProjectWebServiceHandler } from './handlers/project-web-service-handler'; +import { LinksDataSource } from './cartography/datasources/links-datasource'; +import { NodesDataSource } from './cartography/datasources/nodes-datasource'; +import { SymbolsDataSource } from './cartography/datasources/symbols-datasource'; +import { SelectionManager } from './cartography/managers/selection-manager'; +import { InRectangleHelper } from './cartography/helpers/in-rectangle-helper'; +import { DrawingsDataSource } from './cartography/datasources/drawings-datasource'; +import { EditStyleActionComponent } from './components/project-map/context-menu/actions/edit-style-action/edit-style-action.component'; +import { MoveLayerDownActionComponent } from './components/project-map/context-menu/actions/move-layer-down-action/move-layer-down-action.component'; +import { MoveLayerUpActionComponent } from './components/project-map/context-menu/actions/move-layer-up-action/move-layer-up-action.component'; import { ProjectMapShortcutsComponent } from './components/project-map/project-map-shortcuts/project-map-shortcuts.component'; import { SettingsComponent } from './components/settings/settings.component'; -import { SettingsService } from "./services/settings.service"; +import { SettingsService } from './services/settings.service'; import { LocalServerComponent } from './components/local-server/local-server.component'; import { ProgressComponent } from './common/progress/progress.component'; -import { ProgressService } from "./common/progress/progress.service"; -import { version } from "./version"; -import { ToasterErrorHandler } from "./common/error-handlers/toaster-error-handler"; -import { environment } from "../environments/environment"; -import { RavenState } from "./common/error-handlers/raven-state-communicator"; -import { ServerDiscoveryComponent } from "./components/servers/server-discovery/server-discovery.component"; +import { ProgressService } from './common/progress/progress.service'; +import { version } from './version'; +import { ToasterErrorHandler } from './common/error-handlers/toaster-error-handler'; +import { environment } from '../environments/environment'; +import { RavenState } from './common/error-handlers/raven-state-communicator'; +import { ServerDiscoveryComponent } from './components/servers/server-discovery/server-discovery.component'; import { ServerDatabase } from './services/server.database'; import { CreateSnapshotDialogComponent } from './components/snapshots/create-snapshot-dialog/create-snapshot-dialog.component'; import { SnapshotsComponent } from './components/snapshots/snapshots.component'; @@ -88,19 +89,19 @@ import { TextAddedComponent } from './components/drawings-listeners/text-added/t import { DrawingAddedComponent } from './components/drawings-listeners/drawing-added/drawing-added.component'; import { InstallSoftwareComponent } from './components/installed-software/install-software/install-software.component'; +import { StyleEditorDialogComponent } from './components/project-map/drawings-editors/style-editor/style-editor.component'; +import { EditTextActionComponent } from './components/project-map/context-menu/actions/edit-text-action/edit-text-action.component'; +import { TextEditorDialogComponent } from './components/project-map/drawings-editors/text-editor/text-editor.component'; if (environment.production) { - Raven - .config('https://b2b1cfd9b043491eb6b566fd8acee358@sentry.io/842726', { - shouldSendCallback: () => { - return RavenState.shouldSend; - }, - release: version - }) - .install(); + Raven.config('https://b2b1cfd9b043491eb6b566fd8acee358@sentry.io/842726', { + shouldSendCallback: () => { + return RavenState.shouldSend; + }, + release: version + }).install(); } - @NgModule({ declarations: [ AppComponent, @@ -116,13 +117,15 @@ if (environment.production) { ConfirmationDialogComponent, DefaultLayoutComponent, ProgressDialogComponent, - NodeContextMenuComponent, + ContextMenuComponent, StartNodeActionComponent, StopNodeActionComponent, TemplateComponent, TemplateListDialogComponent, MoveLayerDownActionComponent, MoveLayerUpActionComponent, + EditStyleActionComponent, + EditTextActionComponent, ProjectMapShortcutsComponent, SettingsComponent, LocalServerComponent, @@ -140,7 +143,9 @@ if (environment.production) { DrawingDraggedComponent, LinkCreatedComponent, InterfaceLabelDraggedComponent, - InstallSoftwareComponent + InstallSoftwareComponent, + StyleEditorDialogComponent, + TextEditorDialogComponent ], imports: [ BrowserModule, @@ -195,8 +200,10 @@ if (environment.production) { TemplateListDialogComponent, AddBlankProjectDialogComponent, ImportProjectDialogComponent, - ConfirmationDialogComponent + ConfirmationDialogComponent, + StyleEditorDialogComponent, + TextEditorDialogComponent ], - bootstrap: [ AppComponent ] + bootstrap: [AppComponent] }) -export class AppModule { } +export class AppModule {} diff --git a/src/app/cartography/angular-map.imports.ts b/src/app/cartography/angular-map.imports.ts index b98e6247..e2a53e9f 100644 --- a/src/app/cartography/angular-map.imports.ts +++ b/src/app/cartography/angular-map.imports.ts @@ -11,18 +11,17 @@ import { InterfaceLabelComponent } from './components/experimental-map/interface import { DraggableComponent } from './components/experimental-map/draggable/draggable.component'; import { SelectionComponent } from './components/experimental-map/selection/selection.component'; - export const ANGULAR_MAP_DECLARATIONS = [ - NodeComponent, - LinkComponent, - StatusComponent, - DrawingComponent, - EllipseComponent, - ImageComponent, - LineComponent, - RectComponent, - TextComponent, - DraggableComponent, - SelectionComponent, - InterfaceLabelComponent + NodeComponent, + LinkComponent, + StatusComponent, + DrawingComponent, + EllipseComponent, + ImageComponent, + LineComponent, + RectComponent, + TextComponent, + DraggableComponent, + SelectionComponent, + InterfaceLabelComponent ]; diff --git a/src/app/cartography/cartography.module.ts b/src/app/cartography/cartography.module.ts index 59edfc34..4e218c3c 100644 --- a/src/app/cartography/cartography.module.ts +++ b/src/app/cartography/cartography.module.ts @@ -32,7 +32,12 @@ import { PortToMapPortConverter } from './converters/map/port-to-map-port-conver import { SymbolToMapSymbolConverter } from './converters/map/symbol-to-map-symbol-converter'; import { LinkNodeToMapLinkNodeConverter } from './converters/map/link-node-to-map-link-node-converter'; import { GraphDataManager } from './managers/graph-data-manager'; -import { MapNodesDataSource, MapLinksDataSource, MapDrawingsDataSource, MapSymbolsDataSource } from './datasources/map-datasource'; +import { + MapNodesDataSource, + MapLinksDataSource, + MapDrawingsDataSource, + MapSymbolsDataSource +} from './datasources/map-datasource'; import { LinksEventSource } from './events/links-event-source'; import { D3MapComponent } from './components/d3-map/d3-map.component'; import { ExperimentalMapComponent } from './components/experimental-map/experimental-map.component'; @@ -51,13 +56,8 @@ import { LineElementFactory } from './helpers/drawings-factory/line-element-fact import { TextEditorComponent } from './components/text-editor/text-editor.component'; import { DrawingAddingComponent } from './components/drawing-adding/drawing-adding.component'; - @NgModule({ - imports: [ - CommonModule, - MatMenuModule, - MatIconModule - ], + imports: [CommonModule, MatMenuModule, MatIconModule], declarations: [ D3MapComponent, ExperimentalMapComponent, @@ -113,6 +113,6 @@ import { DrawingAddingComponent } from './components/drawing-adding/drawing-addi StylesToFontConverter, ...D3_MAP_IMPORTS ], - exports: [ D3MapComponent, ExperimentalMapComponent ] + exports: [D3MapComponent, ExperimentalMapComponent] }) -export class CartographyModule { } +export class CartographyModule {} diff --git a/src/app/cartography/components/d3-map/d3-map.component.html b/src/app/cartography/components/d3-map/d3-map.component.html index 3f681a32..796f4e93 100644 --- a/src/app/cartography/components/d3-map/d3-map.component.html +++ b/src/app/cartography/components/d3-map/d3-map.component.html @@ -1,11 +1,5 @@ - - - - + + diff --git a/src/app/cartography/components/d3-map/d3-map.component.scss b/src/app/cartography/components/d3-map/d3-map.component.scss index 7fb7062f..c41075de 100644 --- a/src/app/cartography/components/d3-map/d3-map.component.scss +++ b/src/app/cartography/components/d3-map/d3-map.component.scss @@ -1,5 +1,3 @@ svg { display: block; } - - diff --git a/src/app/cartography/components/d3-map/d3-map.component.spec.ts b/src/app/cartography/components/d3-map/d3-map.component.spec.ts index ed5697fc..110f85cc 100644 --- a/src/app/cartography/components/d3-map/d3-map.component.spec.ts +++ b/src/app/cartography/components/d3-map/d3-map.component.spec.ts @@ -8,9 +8,8 @@ describe('D3MapComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ - declarations: [ D3MapComponent ] - }) - .compileComponents(); + declarations: [D3MapComponent] + }).compileComponents(); })); // beforeEach(() => { diff --git a/src/app/cartography/components/d3-map/d3-map.component.ts b/src/app/cartography/components/d3-map/d3-map.component.ts index 7052a279..4a26de88 100644 --- a/src/app/cartography/components/d3-map/d3-map.component.ts +++ b/src/app/cartography/components/d3-map/d3-map.component.ts @@ -1,11 +1,21 @@ import { - Component, ElementRef, HostListener, Input, OnChanges, OnDestroy, OnInit, SimpleChange, EventEmitter, Output, ViewChild + Component, + ElementRef, + HostListener, + Input, + OnChanges, + OnDestroy, + OnInit, + SimpleChange, + EventEmitter, + Output, + ViewChild } from '@angular/core'; import { Selection, select } from 'd3-selection'; -import { GraphLayout } from "../../widgets/graph-layout"; -import { Context } from "../../models/context"; -import { Size } from "../../models/size"; +import { GraphLayout } from '../../widgets/graph-layout'; +import { Context } from '../../models/context'; +import { Size } from '../../models/size'; import { Subscription } from 'rxjs'; import { InterfaceLabelWidget } from '../../widgets/interface-label'; import { SelectionTool } from '../../tools/selection-tool'; @@ -22,7 +32,6 @@ import { Server } from '../../../models/server'; import { ToolsService } from '../../../services/tools.service'; import { TextEditorComponent } from '../text-editor/text-editor.component'; - @Component({ selector: 'app-d3-map', templateUrl: './d3-map.component.html', @@ -50,7 +59,7 @@ export class D3MapComponent implements OnInit, OnChanges, OnDestroy { private drawLinkTool: boolean; protected settings = { - 'show_interface_labels': true + show_interface_labels: true }; constructor( @@ -65,11 +74,11 @@ export class D3MapComponent implements OnInit, OnChanges, OnDestroy { protected movingToolWidget: MovingTool, public graphLayout: GraphLayout, private toolsService: ToolsService - ) { + ) { this.parentNativeElement = element.nativeElement; } - @Input('show-interface-labels') + @Input('show-interface-labels') set showInterfaceLabels(value) { this.settings.show_interface_labels = value; this.interfaceLabelWidget.setEnabled(value); @@ -79,7 +88,7 @@ export class D3MapComponent implements OnInit, OnChanges, OnDestroy { @Input('readonly') set readonly(value) { this.mapSettings.isReadOnly = value; } - + ngOnChanges(changes: { [propKey: string]: SimpleChange }) { if ( (changes['width'] && !changes['width'].isFirstChange()) || @@ -142,7 +151,10 @@ export class D3MapComponent implements OnInit, OnChanges, OnDestroy { public createGraph(domElement: HTMLElement) { const rootElement = select(domElement); this.svg = rootElement.select('svg'); - this.graphLayout.connect(this.svg, this.context); + this.graphLayout.connect( + this.svg, + this.context + ); this.graphLayout.draw(this.svg, this.context); this.mapChangeDetectorRef.hasBeenDrawn = true; } diff --git a/src/app/cartography/components/draggable-selection/draggable-selection.component.spec.ts b/src/app/cartography/components/draggable-selection/draggable-selection.component.spec.ts index d9122328..53193ad5 100644 --- a/src/app/cartography/components/draggable-selection/draggable-selection.component.spec.ts +++ b/src/app/cartography/components/draggable-selection/draggable-selection.component.spec.ts @@ -22,7 +22,6 @@ import { MapLinkNode } from '../../models/map/map-link-node'; import { select } from 'd3-selection'; import { MapLink } from '../../models/map/map-link'; - describe('DraggableSelectionComponent', () => { let component: DraggableSelectionComponent; let fixture: ComponentFixture; @@ -62,7 +61,7 @@ describe('DraggableSelectionComponent', () => { interfaceLabelDragEventEmitter = new EventEmitter>(); interfaceLabelEndEventEmitter = new EventEmitter>(); - const nodesWidgetStub = { + const nodesWidgetStub = { redrawNode: () => {}, draggable: { start: nodesStartEventEmitter, @@ -71,7 +70,7 @@ describe('DraggableSelectionComponent', () => { } }; - const drawingsWidgetStub = { + const drawingsWidgetStub = { redrawDrawing: () => {}, draggable: { start: drawingsStartEventEmitter, @@ -80,7 +79,7 @@ describe('DraggableSelectionComponent', () => { } }; const linksWidgetStub = { - redrawLink: () => {}, + redrawLink: () => {} }; const labelWidgetStub = { @@ -91,7 +90,7 @@ describe('DraggableSelectionComponent', () => { end: labelEndEventEmitter } }; - + const interfaceLabelWidgetStub = { draggable: { start: interfaceLabelStartEventEmitter, @@ -101,14 +100,14 @@ describe('DraggableSelectionComponent', () => { }; const nodesEventSourceStub = { - dragged: { emit: () => {}}, - labelDragged: { emit: () => {}} + dragged: { emit: () => {} }, + labelDragged: { emit: () => {} } }; const drawingsEventSourceStub = { - dragged: { emit: () => {}} + dragged: { emit: () => {} } }; const linksEventSourceStub = { - interfaceDragged: { emit: () => {}} + interfaceDragged: { emit: () => {} } }; TestBed.configureTestingModule({ @@ -122,11 +121,10 @@ describe('DraggableSelectionComponent', () => { { provide: NodesEventSource, useValue: nodesEventSourceStub }, { provide: DrawingsEventSource, useValue: drawingsEventSourceStub }, { provide: GraphDataManager, useValue: mockedGraphDataManager }, - { provide: LinksEventSource, useValue: linksEventSourceStub }, + { provide: LinksEventSource, useValue: linksEventSourceStub } ], - declarations: [ DraggableSelectionComponent ] - }) - .compileComponents(); + declarations: [DraggableSelectionComponent] + }).compileComponents(); })); beforeEach(() => { @@ -151,7 +149,7 @@ describe('DraggableSelectionComponent', () => { linksWidgetStub = fixture.debugElement.injector.get(LinksWidget); selectionManagerStub = fixture.debugElement.injector.get(SelectionManager); node = new MapNode(); - node.id = "nodeid"; + node.id = 'nodeid'; node.x = 1; node.y = 2; }); @@ -237,7 +235,7 @@ describe('DraggableSelectionComponent', () => { drawingsWidgetStub = fixture.debugElement.injector.get(DrawingsWidget); selectionManagerStub = fixture.debugElement.injector.get(SelectionManager); drawing = new MapDrawing(); - drawing.id = "drawingid"; + drawing.id = 'drawingid'; drawing.x = 1; drawing.y = 2; }); @@ -297,7 +295,7 @@ describe('DraggableSelectionComponent', () => { labelWidgetStub = fixture.debugElement.injector.get(LabelWidget); selectionManagerStub = fixture.debugElement.injector.get(SelectionManager); label = new MapLabel(); - label.id = "labelid"; + label.id = 'labelid'; label.x = 1; label.y = 2; }); @@ -319,7 +317,7 @@ describe('DraggableSelectionComponent', () => { spyOn(labelWidgetStub, 'redrawLabel'); selectionManagerStub.setSelected([label]); const node = new MapNode(); - node.id = "nodeid"; + node.id = 'nodeid'; node.label = label; label.nodeId = node.id; @@ -339,7 +337,7 @@ describe('DraggableSelectionComponent', () => { it('should not update label position when dragging and parent is selected', fakeAsync(() => { spyOn(labelWidgetStub, 'redrawLabel'); const node = new MapNode(); - node.id = "nodeid"; + node.id = 'nodeid'; node.label = label; label.nodeId = node.id; @@ -357,7 +355,6 @@ describe('DraggableSelectionComponent', () => { expect(label.y).toEqual(2); })); - it('should emit event when label stopped dragging', fakeAsync(() => { const nodesEventSourceStub = fixture.debugElement.injector.get(NodesEventSource); const spyDragged = spyOn(nodesEventSourceStub.labelDragged, 'emit'); @@ -379,7 +376,7 @@ describe('DraggableSelectionComponent', () => { const nodesEventSourceStub = fixture.debugElement.injector.get(NodesEventSource); spyOn(nodesEventSourceStub.labelDragged, 'emit'); const node = new MapNode(); - node.id = "nodeid"; + node.id = 'nodeid'; label.nodeId = node.id; selectionManagerStub.setSelected([label, node]); @@ -407,7 +404,7 @@ describe('DraggableSelectionComponent', () => { linkNode.label = new MapLabel(); linkNode.label.x = 1; linkNode.label.y = 2; - linkNode.id = "linknodeid"; + linkNode.id = 'linknodeid'; }); it('should select interface label when started dragging', fakeAsync(() => { @@ -427,14 +424,14 @@ describe('DraggableSelectionComponent', () => { spyOn(linksWidgetStub, 'redrawLink'); selectionManagerStub.setSelected([linkNode]); const node = new MapNode(); - node.id = "nodeid"; + node.id = 'nodeid'; linkNode.nodeId = node.id; const secondLinkNode = new MapLinkNode(); secondLinkNode.label = new MapLabel(); secondLinkNode.label.x = 1; secondLinkNode.label.y = 2; - secondLinkNode.id = "secondlinknodeid"; + secondLinkNode.id = 'secondlinknodeid'; const link = new MapLink(); link.nodes = [linkNode, secondLinkNode]; @@ -456,14 +453,14 @@ describe('DraggableSelectionComponent', () => { spyOn(linksWidgetStub, 'redrawLink'); selectionManagerStub.setSelected([linkNode]); const node = new MapNode(); - node.id = "nodeid"; + node.id = 'nodeid'; linkNode.nodeId = node.id; const secondLinkNode = new MapLinkNode(); secondLinkNode.label = new MapLabel(); secondLinkNode.label.x = 1; secondLinkNode.label.y = 2; - secondLinkNode.id = "secondlinknodeid"; + secondLinkNode.id = 'secondlinknodeid'; const link = new MapLink(); link.nodes = [secondLinkNode, linkNode]; @@ -484,7 +481,7 @@ describe('DraggableSelectionComponent', () => { it('should not update interface label position when dragging and parent node is selected', fakeAsync(() => { spyOn(linksWidgetStub, 'redrawLink'); const node = new MapNode(); - node.id = "nodeid"; + node.id = 'nodeid'; linkNode.nodeId = node.id; selectionManagerStub.setSelected([linkNode, node]); @@ -493,7 +490,7 @@ describe('DraggableSelectionComponent', () => { secondLinkNode.label = new MapLabel(); secondLinkNode.label.x = 1; secondLinkNode.label.y = 2; - secondLinkNode.id = "secondlinknodeid"; + secondLinkNode.id = 'secondlinknodeid'; const link = new MapLink(); link.nodes = [linkNode, secondLinkNode]; @@ -533,7 +530,7 @@ describe('DraggableSelectionComponent', () => { spyOn(linksEventSourceStub.interfaceDragged, 'emit'); const node = new MapNode(); - node.id = "nodeid"; + node.id = 'nodeid'; linkNode.nodeId = node.id; selectionManagerStub.setSelected([linkNode, node]); diff --git a/src/app/cartography/components/draggable-selection/draggable-selection.component.ts b/src/app/cartography/components/draggable-selection/draggable-selection.component.ts index a37d6bef..37dce99b 100644 --- a/src/app/cartography/components/draggable-selection/draggable-selection.component.ts +++ b/src/app/cartography/components/draggable-selection/draggable-selection.component.ts @@ -27,7 +27,7 @@ export class DraggableSelectionComponent implements OnInit, OnDestroy { private start: Subscription; private drag: Subscription; private end: Subscription; - + @Input('svg') svg: SVGSVGElement; constructor( @@ -41,7 +41,7 @@ export class DraggableSelectionComponent implements OnInit, OnDestroy { private drawingsEventSource: DrawingsEventSource, private graphDataManager: GraphDataManager, private linksEventSource: LinksEventSource - ) { } + ) {} ngOnInit() { const svg = select(this.svg); @@ -54,25 +54,25 @@ export class DraggableSelectionComponent implements OnInit, OnDestroy { ).subscribe((evt: DraggableStart) => { const selected = this.selectionManager.getSelected(); if (evt.datum instanceof MapNode) { - if (selected.filter((item) => item instanceof MapNode && item.id === evt.datum.id).length === 0) { + if (selected.filter(item => item instanceof MapNode && item.id === evt.datum.id).length === 0) { this.selectionManager.setSelected([evt.datum]); } } if (evt.datum instanceof MapDrawing) { - if (selected.filter((item) => item instanceof MapDrawing && item.id === evt.datum.id).length === 0) { + if (selected.filter(item => item instanceof MapDrawing && item.id === evt.datum.id).length === 0) { this.selectionManager.setSelected([evt.datum]); } } if (evt.datum instanceof MapLabel) { - if (selected.filter((item) => item instanceof MapLabel && item.id === evt.datum.id).length === 0) { + if (selected.filter(item => item instanceof MapLabel && item.id === evt.datum.id).length === 0) { this.selectionManager.setSelected([evt.datum]); } } if (evt.datum instanceof MapLinkNode) { - if (selected.filter((item) => item instanceof MapLinkNode && item.id === evt.datum.id).length === 0) { + if (selected.filter(item => item instanceof MapLinkNode && item.id === evt.datum.id).length === 0) { this.selectionManager.setSelected([evt.datum]); } } @@ -85,7 +85,7 @@ export class DraggableSelectionComponent implements OnInit, OnDestroy { this.interfaceWidget.draggable.drag ).subscribe((evt: DraggableDrag) => { const selected = this.selectionManager.getSelected(); - const selectedNodes = selected.filter((item) => item instanceof MapNode); + const selectedNodes = selected.filter(item => item instanceof MapNode); // update nodes selectedNodes.forEach((node: MapNode) => { node.x += evt.dx; @@ -93,54 +93,66 @@ export class DraggableSelectionComponent implements OnInit, OnDestroy { this.nodesWidget.redrawNode(svg, node); - const links = this.graphDataManager.getLinks().filter( - (link) => (link.target !== undefined && link.target.id === node.id) || (link.source !== undefined && link.source.id === node.id)); - - links.forEach((link) => { + const links = this.graphDataManager + .getLinks() + .filter( + link => + (link.target !== undefined && link.target.id === node.id) || + (link.source !== undefined && link.source.id === node.id) + ); + + links.forEach(link => { this.linksWidget.redrawLink(svg, link); }); }); // update drawings - selected.filter((item) => item instanceof MapDrawing).forEach((drawing: MapDrawing) => { - drawing.x += evt.dx; - drawing.y += evt.dy; - this.drawingsWidget.redrawDrawing(svg, drawing); - }); + selected + .filter(item => item instanceof MapDrawing) + .forEach((drawing: MapDrawing) => { + drawing.x += evt.dx; + drawing.y += evt.dy; + this.drawingsWidget.redrawDrawing(svg, drawing); + }); // update labels - selected.filter((item) => item instanceof MapLabel).forEach((label: MapLabel) => { - const isParentNodeSelected = selectedNodes.filter((node) => node.id === label.nodeId).length > 0; - if (isParentNodeSelected) { - return; - } + selected + .filter(item => item instanceof MapLabel) + .forEach((label: MapLabel) => { + const isParentNodeSelected = selectedNodes.filter(node => node.id === label.nodeId).length > 0; + if (isParentNodeSelected) { + return; + } - const node = this.graphDataManager.getNodes().filter((node) => node.id === label.nodeId)[0]; - node.label.x += evt.dx; - node.label.y += evt.dy; - this.labelWidget.redrawLabel(svg, label); - }); + const node = this.graphDataManager.getNodes().filter(node => node.id === label.nodeId)[0]; + node.label.x += evt.dx; + node.label.y += evt.dy; + this.labelWidget.redrawLabel(svg, label); + }); // update interface labels - selected.filter((item) => item instanceof MapLinkNode).forEach((interfaceLabel: MapLinkNode) => { - const isParentNodeSelected = selectedNodes.filter((node) => node.id === interfaceLabel.nodeId).length > 0; - if (isParentNodeSelected) { - return; - } + selected + .filter(item => item instanceof MapLinkNode) + .forEach((interfaceLabel: MapLinkNode) => { + const isParentNodeSelected = selectedNodes.filter(node => node.id === interfaceLabel.nodeId).length > 0; + if (isParentNodeSelected) { + return; + } - const link = this.graphDataManager.getLinks().filter((link) => link.nodes[0].id === interfaceLabel.id || link.nodes[1].id === interfaceLabel.id)[0]; - if(link.nodes[0].id === interfaceLabel.id) { - link.nodes[0].label.x += evt.dx; - link.nodes[0].label.y += evt.dy; - } - if(link.nodes[1].id === interfaceLabel.id) { - link.nodes[1].label.x += evt.dx; - link.nodes[1].label.y += evt.dy; - } - - this.linksWidget.redrawLink(svg, link); - }); + const link = this.graphDataManager + .getLinks() + .filter(link => link.nodes[0].id === interfaceLabel.id || link.nodes[1].id === interfaceLabel.id)[0]; + if (link.nodes[0].id === interfaceLabel.id) { + link.nodes[0].label.x += evt.dx; + link.nodes[0].label.y += evt.dy; + } + if (link.nodes[1].id === interfaceLabel.id) { + link.nodes[1].label.x += evt.dx; + link.nodes[1].label.y += evt.dy; + } + this.linksWidget.redrawLink(svg, link); + }); }); this.end = merge( @@ -150,35 +162,39 @@ export class DraggableSelectionComponent implements OnInit, OnDestroy { this.interfaceWidget.draggable.end ).subscribe((evt: DraggableEnd) => { const selected = this.selectionManager.getSelected(); - const selectedNodes = selected.filter((item) => item instanceof MapNode); + const selectedNodes = selected.filter(item => item instanceof MapNode); selectedNodes.forEach((item: MapNode) => { this.nodesEventSource.dragged.emit(new DraggedDataEvent(item, evt.dx, evt.dy)); - }) - - selected.filter((item) => item instanceof MapDrawing).forEach((item: MapDrawing) => { - this.drawingsEventSource.dragged.emit(new DraggedDataEvent(item, evt.dx, evt.dy)); }); - selected.filter((item) => item instanceof MapLabel).forEach((label: MapLabel) => { - const isParentNodeSelected = selectedNodes.filter((node) => node.id === label.nodeId).length > 0; - if (isParentNodeSelected) { - return; - } + selected + .filter(item => item instanceof MapDrawing) + .forEach((item: MapDrawing) => { + this.drawingsEventSource.dragged.emit(new DraggedDataEvent(item, evt.dx, evt.dy)); + }); - this.nodesEventSource.labelDragged.emit(new DraggedDataEvent(label, evt.dx, evt.dy)); - }); + selected + .filter(item => item instanceof MapLabel) + .forEach((label: MapLabel) => { + const isParentNodeSelected = selectedNodes.filter(node => node.id === label.nodeId).length > 0; + if (isParentNodeSelected) { + return; + } - selected.filter((item) => item instanceof MapLinkNode).forEach((label: MapLinkNode) => { - const isParentNodeSelected = selectedNodes.filter((node) => node.id === label.nodeId).length > 0; - if (isParentNodeSelected) { - return; - } - this.linksEventSource.interfaceDragged.emit(new DraggedDataEvent(label, evt.dx, evt.dy)); - }); + this.nodesEventSource.labelDragged.emit(new DraggedDataEvent(label, evt.dx, evt.dy)); + }); + selected + .filter(item => item instanceof MapLinkNode) + .forEach((label: MapLinkNode) => { + const isParentNodeSelected = selectedNodes.filter(node => node.id === label.nodeId).length > 0; + if (isParentNodeSelected) { + return; + } + this.linksEventSource.interfaceDragged.emit(new DraggedDataEvent(label, evt.dx, evt.dy)); + }); }); - } ngOnDestroy() { @@ -186,5 +202,4 @@ export class DraggableSelectionComponent implements OnInit, OnDestroy { this.drag.unsubscribe(); this.end.unsubscribe(); } - } diff --git a/src/app/cartography/components/drawing-adding/drawing-adding.component.spec.ts b/src/app/cartography/components/drawing-adding/drawing-adding.component.spec.ts index c118ba96..f8854882 100644 --- a/src/app/cartography/components/drawing-adding/drawing-adding.component.spec.ts +++ b/src/app/cartography/components/drawing-adding/drawing-adding.component.spec.ts @@ -1,53 +1,48 @@ -import { DrawingAddingComponent } from "./drawing-adding.component"; +import { DrawingAddingComponent } from './drawing-adding.component'; import { ComponentFixture, TestBed, async } from '@angular/core/testing'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { DrawingsEventSource } from '../../events/drawings-event-source'; import { Context } from '../../models/context'; describe('DrawingAddingComponent', () => { - let component: DrawingAddingComponent; - let fixture: ComponentFixture; - let drawingsEventSource = new DrawingsEventSource(); + let component: DrawingAddingComponent; + let fixture: ComponentFixture; + let drawingsEventSource = new DrawingsEventSource(); - beforeEach(async(() => { - TestBed.configureTestingModule({ - imports: [ - NoopAnimationsModule - ], - providers: [ - { provide: DrawingsEventSource, useValue: drawingsEventSource }, - { provide: Context, useClass: Context } - ], - declarations: [ - DrawingAddingComponent - ] - }) - .compileComponents(); - })); + beforeEach(async(() => { + TestBed.configureTestingModule({ + imports: [NoopAnimationsModule], + providers: [ + { provide: DrawingsEventSource, useValue: drawingsEventSource }, + { provide: Context, useClass: Context } + ], + declarations: [DrawingAddingComponent] + }).compileComponents(); + })); - beforeEach(() => { - fixture = TestBed.createComponent(DrawingAddingComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); + beforeEach(() => { + fixture = TestBed.createComponent(DrawingAddingComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); - it('should create', () => { - expect(component).toBeTruthy(); - }); + it('should create', () => { + expect(component).toBeTruthy(); + }); - it('should deactivate listener when none of the available drawings is selected', () => { - spyOn(component, 'deactivate'); + it('should deactivate listener when none of the available drawings is selected', () => { + spyOn(component, 'deactivate'); - drawingsEventSource.selected.emit(""); + drawingsEventSource.selected.emit(''); - expect(component.deactivate).toHaveBeenCalled(); - }); + expect(component.deactivate).toHaveBeenCalled(); + }); - it('should activate listener when drawing is selected', () => { - spyOn(component, 'activate'); + it('should activate listener when drawing is selected', () => { + spyOn(component, 'activate'); - drawingsEventSource.selected.emit("rectangle"); + drawingsEventSource.selected.emit('rectangle'); - expect(component.activate).toHaveBeenCalled(); - }); + expect(component.activate).toHaveBeenCalled(); + }); }); diff --git a/src/app/cartography/components/drawing-adding/drawing-adding.component.ts b/src/app/cartography/components/drawing-adding/drawing-adding.component.ts index d10e625b..c4cb1e6c 100644 --- a/src/app/cartography/components/drawing-adding/drawing-adding.component.ts +++ b/src/app/cartography/components/drawing-adding/drawing-adding.component.ts @@ -1,51 +1,47 @@ -import { Component, Input, OnDestroy, OnInit } from "@angular/core"; +import { Component, Input, OnDestroy, OnInit } from '@angular/core'; import { Context } from '../../models/context'; import { DrawingsEventSource } from '../../events/drawings-event-source'; import { AddedDataEvent } from '../../events/event-source'; import { Subscription } from 'rxjs'; - @Component({ - selector: 'app-drawing-adding', - templateUrl: './drawing-adding.component.html', - styleUrls: ['./drawing-adding.component.scss'] + selector: 'app-drawing-adding', + templateUrl: './drawing-adding.component.html', + styleUrls: ['./drawing-adding.component.scss'] }) export class DrawingAddingComponent implements OnInit, OnDestroy { - @Input('svg') svg: SVGSVGElement; + @Input('svg') svg: SVGSVGElement; - private mapListener: Function; - private drawingSelected: Subscription; + private mapListener: Function; + private drawingSelected: Subscription; - constructor( - private drawingsEventSource: DrawingsEventSource, - private context: Context - ){} + constructor(private drawingsEventSource: DrawingsEventSource, private context: Context) {} - ngOnInit(){ - this.drawingSelected = this.drawingsEventSource.selected.subscribe((evt) => { - evt === "" ? this.deactivate() : this.activate(); - }); - } + ngOnInit() { + this.drawingSelected = this.drawingsEventSource.selected.subscribe(evt => { + evt === '' ? this.deactivate() : this.activate(); + }); + } - activate(){ - let listener = (event: MouseEvent) => { - let x = event.clientX - this.context.getZeroZeroTransformationPoint().x; - let y = event.clientY - this.context.getZeroZeroTransformationPoint().y; - - this.drawingsEventSource.pointToAddSelected.emit(new AddedDataEvent(x, y)); - this.deactivate(); - }; + activate() { + let listener = (event: MouseEvent) => { + let x = event.clientX - this.context.getZeroZeroTransformationPoint().x; + let y = event.clientY - this.context.getZeroZeroTransformationPoint().y; - this.deactivate(); - this.mapListener = listener; - this.svg.addEventListener('click', this.mapListener as EventListenerOrEventListenerObject); - } + this.drawingsEventSource.pointToAddSelected.emit(new AddedDataEvent(x, y)); + this.deactivate(); + }; - deactivate(){ - this.svg.removeEventListener('click', this.mapListener as EventListenerOrEventListenerObject); - } + this.deactivate(); + this.mapListener = listener; + this.svg.addEventListener('click', this.mapListener as EventListenerOrEventListenerObject); + } - ngOnDestroy(){ - this.drawingSelected.unsubscribe(); - } + deactivate() { + this.svg.removeEventListener('click', this.mapListener as EventListenerOrEventListenerObject); + } + + ngOnDestroy() { + this.drawingSelected.unsubscribe(); + } } diff --git a/src/app/cartography/components/drawing-resizing/drawing-resizing.component.spec.ts b/src/app/cartography/components/drawing-resizing/drawing-resizing.component.spec.ts index 4a073fbf..9b530960 100644 --- a/src/app/cartography/components/drawing-resizing/drawing-resizing.component.spec.ts +++ b/src/app/cartography/components/drawing-resizing/drawing-resizing.component.spec.ts @@ -1,6 +1,6 @@ import { ComponentFixture, TestBed, async } from '@angular/core/testing'; -import { DrawingResizingComponent } from './drawing-resizing.component' +import { DrawingResizingComponent } from './drawing-resizing.component'; import { DrawingsWidget } from '../../widgets/drawings'; import { DrawingsEventSource } from '../../events/drawings-event-source'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; @@ -9,65 +9,60 @@ import { ResizingEnd } from '../../events/resizing'; import { MapDrawing } from '../../models/map/map-drawing'; export class DrawingWidgetMock { - resizingFinished = new EventEmitter>(); - evt: any; - constructor(){} + resizingFinished = new EventEmitter>(); + evt: any; + constructor() {} - emitEvent(){ - const evt = new ResizingEnd(); - evt.x = 0; - evt.y = 0; - evt.width = 10; - evt.height = 10; - evt.datum = {} as MapDrawing; + emitEvent() { + const evt = new ResizingEnd(); + evt.x = 0; + evt.y = 0; + evt.width = 10; + evt.height = 10; + evt.datum = {} as MapDrawing; - this.resizingFinished.emit(evt); - } + this.resizingFinished.emit(evt); + } } describe('DrawingResizingComponent', () => { - let component: DrawingResizingComponent; - let fixture: ComponentFixture; - let drawingsWidgetMock = new DrawingWidgetMock; - let drawingsEventSource = new DrawingsEventSource; + let component: DrawingResizingComponent; + let fixture: ComponentFixture; + let drawingsWidgetMock = new DrawingWidgetMock(); + let drawingsEventSource = new DrawingsEventSource(); - beforeEach(async(() => { - TestBed.configureTestingModule({ - imports: [ - NoopAnimationsModule - ], - providers: [ - { provide: DrawingsWidget, useValue: drawingsWidgetMock }, - { provide: DrawingsEventSource, useValue: drawingsEventSource} - ], - declarations: [ - DrawingResizingComponent - ] - }) - .compileComponents(); - })); + beforeEach(async(() => { + TestBed.configureTestingModule({ + imports: [NoopAnimationsModule], + providers: [ + { provide: DrawingsWidget, useValue: drawingsWidgetMock }, + { provide: DrawingsEventSource, useValue: drawingsEventSource } + ], + declarations: [DrawingResizingComponent] + }).compileComponents(); + })); - beforeEach(() => { - fixture = TestBed.createComponent(DrawingResizingComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); + beforeEach(() => { + fixture = TestBed.createComponent(DrawingResizingComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); - it('should create', () => { - expect(component).toBeTruthy(); - }); + it('should create', () => { + expect(component).toBeTruthy(); + }); - it('should emit event after size changes', () => { - spyOn(drawingsEventSource.resized, 'emit'); - const evt = new ResizingEnd(); - evt.x = 0; - evt.y = 0; - evt.width = 10; - evt.height = 10; - evt.datum = {} as MapDrawing; + it('should emit event after size changes', () => { + spyOn(drawingsEventSource.resized, 'emit'); + const evt = new ResizingEnd(); + evt.x = 0; + evt.y = 0; + evt.width = 10; + evt.height = 10; + evt.datum = {} as MapDrawing; - drawingsWidgetMock.emitEvent(); + drawingsWidgetMock.emitEvent(); - expect(drawingsEventSource.resized.emit).toHaveBeenCalled(); - }); + expect(drawingsEventSource.resized.emit).toHaveBeenCalled(); + }); }); diff --git a/src/app/cartography/components/drawing-resizing/drawing-resizing.component.ts b/src/app/cartography/components/drawing-resizing/drawing-resizing.component.ts index 2004a565..05c654c1 100644 --- a/src/app/cartography/components/drawing-resizing/drawing-resizing.component.ts +++ b/src/app/cartography/components/drawing-resizing/drawing-resizing.component.ts @@ -6,27 +6,27 @@ import { MapDrawing } from '../../models/map/map-drawing'; import { ResizedDataEvent } from '../../events/event-source'; import { ResizingEnd } from '../../events/resizing'; - @Component({ - selector: 'app-drawing-resizing', - template: ``, - styleUrls: ['./drawing-resizing.component.scss'] + selector: 'app-drawing-resizing', + template: ` + + `, + styleUrls: ['./drawing-resizing.component.scss'] }) -export class DrawingResizingComponent implements OnInit, OnDestroy{ - resizingFinished: Subscription; +export class DrawingResizingComponent implements OnInit, OnDestroy { + resizingFinished: Subscription; - constructor( - private drawingsWidget: DrawingsWidget, - private drawingsEventSource: DrawingsEventSource - ) {} + constructor(private drawingsWidget: DrawingsWidget, private drawingsEventSource: DrawingsEventSource) {} - ngOnInit() { - this.resizingFinished = this.drawingsWidget.resizingFinished.subscribe((evt: ResizingEnd) => { - this.drawingsEventSource.resized.emit(new ResizedDataEvent(evt.datum, evt.x, evt.y, evt.width, evt.height)); - }); - } + ngOnInit() { + this.resizingFinished = this.drawingsWidget.resizingFinished.subscribe((evt: ResizingEnd) => { + this.drawingsEventSource.resized.emit( + new ResizedDataEvent(evt.datum, evt.x, evt.y, evt.width, evt.height) + ); + }); + } - ngOnDestroy() { - this.resizingFinished.unsubscribe(); - } + ngOnDestroy() { + this.resizingFinished.unsubscribe(); + } } diff --git a/src/app/cartography/components/experimental-map/draggable/draggable.component.spec.ts b/src/app/cartography/components/experimental-map/draggable/draggable.component.spec.ts index 84bfbb9c..5712ef99 100644 --- a/src/app/cartography/components/experimental-map/draggable/draggable.component.spec.ts +++ b/src/app/cartography/components/experimental-map/draggable/draggable.component.spec.ts @@ -8,9 +8,8 @@ describe('DraggableComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ - declarations: [ DraggableComponent ] - }) - .compileComponents(); + declarations: [DraggableComponent] + }).compileComponents(); })); beforeEach(() => { diff --git a/src/app/cartography/components/experimental-map/draggable/draggable.component.ts b/src/app/cartography/components/experimental-map/draggable/draggable.component.ts index e612b1eb..d1207a80 100644 --- a/src/app/cartography/components/experimental-map/draggable/draggable.component.ts +++ b/src/app/cartography/components/experimental-map/draggable/draggable.component.ts @@ -2,20 +2,15 @@ import { Component, OnInit, ElementRef, AfterViewInit, OnDestroy, Input, Output, import { Observable, Subscription } from 'rxjs'; import { Point } from '../../../models/point'; - export class DraggableDraggedEvent { - constructor( - public x: number, - public y: number, - public dx: number, - public dy: number - ) {} + constructor(public x: number, public y: number, public dx: number, public dy: number) {} } - @Component({ selector: '[app-draggable]', - template:``, + template: ` + + `, styleUrls: ['./draggable.component.scss'] }) export class DraggableComponent implements OnInit, AfterViewInit, OnDestroy { @@ -24,22 +19,21 @@ export class DraggableComponent implements OnInit, AfterViewInit, OnDestroy { @Output() dragged = new EventEmitter(); draggable: Subscription; - + private startX: number; private startY: number; private posX: number; private posY: number; - - constructor( - private elementRef: ElementRef - ) { } - ngOnInit() { - } + constructor(private elementRef: ElementRef) {} + + ngOnInit() {} ngAfterViewInit() { - const down = Observable.fromEvent(this.elementRef.nativeElement, 'mousedown').do((e: MouseEvent) => e.preventDefault()) + const down = Observable.fromEvent(this.elementRef.nativeElement, 'mousedown').do((e: MouseEvent) => + e.preventDefault() + ); down.subscribe((e: MouseEvent) => { this.posX = this.item.x; @@ -49,45 +43,39 @@ export class DraggableComponent implements OnInit, AfterViewInit, OnDestroy { this.startY = e.clientY; }); - const up = Observable - .fromEvent(document, 'mouseup') - .do((e: MouseEvent) => { - e.preventDefault(); - }); + const up = Observable.fromEvent(document, 'mouseup').do((e: MouseEvent) => { + e.preventDefault(); + }); - const mouseMove = Observable - .fromEvent(document, 'mousemove') - .do((e: MouseEvent) => e.stopPropagation()); + const mouseMove = Observable.fromEvent(document, 'mousemove').do((e: MouseEvent) => e.stopPropagation()); - const scrollWindow = Observable - .fromEvent(document, 'scroll') - .startWith({}); + const scrollWindow = Observable.fromEvent(document, 'scroll').startWith({}); const move = Observable.combineLatest(mouseMove, scrollWindow); const drag = down.mergeMap((md: MouseEvent) => { return move - .map(([mm, s]) => mm) - .do((mm: MouseEvent) => { - const x = this.startX - mm.clientX; - const y = this.startY - mm.clientY; + .map(([mm, s]) => mm) + .do((mm: MouseEvent) => { + const x = this.startX - mm.clientX; + const y = this.startY - mm.clientY; + + this.item.x = Math.round(this.posX - x); + this.item.y = Math.round(this.posY - y); + this.dragging.emit(new DraggableDraggedEvent(this.item.x, this.item.y, -x, -y)); + }) + .skipUntil( + up.take(1).do((e: MouseEvent) => { + const x = this.startX - e.clientX; + const y = this.startY - e.clientY; this.item.x = Math.round(this.posX - x); this.item.y = Math.round(this.posY - y); - this.dragging.emit(new DraggableDraggedEvent(this.item.x, this.item.y, -x, -y)); - }) - .skipUntil(up - .take(1) - .do((e: MouseEvent) => { - const x = this.startX - e.clientX; - const y = this.startY - e.clientY; - - this.item.x = Math.round(this.posX - x); - this.item.y = Math.round(this.posY - y); - this.dragged.emit(new DraggableDraggedEvent(this.item.x, this.item.y, -x, -y)); - })) - .take(1); + this.dragged.emit(new DraggableDraggedEvent(this.item.x, this.item.y, -x, -y)); + }) + ) + .take(1); }); this.draggable = drag.subscribe((e: MouseEvent) => { diff --git a/src/app/cartography/components/experimental-map/drawing/drawing.component.html b/src/app/cartography/components/experimental-map/drawing/drawing.component.html index abfcf9e2..d2248479 100644 --- a/src/app/cartography/components/experimental-map/drawing/drawing.component.html +++ b/src/app/cartography/components/experimental-map/drawing/drawing.component.html @@ -3,30 +3,15 @@ [attr.transform]="transformation" [app-draggable]="drawing" (dragging)="OnDragging($event)" - (dragged)="OnDragged($event)" + (dragged)="OnDragged($event)" > - + - + - + - + - - \ No newline at end of file + + diff --git a/src/app/cartography/components/experimental-map/drawing/drawing.component.spec.ts b/src/app/cartography/components/experimental-map/drawing/drawing.component.spec.ts index d0ab0a6f..4578bb54 100644 --- a/src/app/cartography/components/experimental-map/drawing/drawing.component.spec.ts +++ b/src/app/cartography/components/experimental-map/drawing/drawing.component.spec.ts @@ -8,9 +8,8 @@ describe('DrawingComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ - declarations: [ DrawingComponent ] - }) - .compileComponents(); + declarations: [DrawingComponent] + }).compileComponents(); })); beforeEach(() => { diff --git a/src/app/cartography/components/experimental-map/drawing/drawing.component.ts b/src/app/cartography/components/experimental-map/drawing/drawing.component.ts index e2bfc811..dfd9cc9f 100644 --- a/src/app/cartography/components/experimental-map/drawing/drawing.component.ts +++ b/src/app/cartography/components/experimental-map/drawing/drawing.component.ts @@ -16,12 +16,12 @@ import { DrawingsEventSource } from '../../../events/drawings-event-source'; }) export class DrawingComponent implements OnInit { @Input('app-drawing') drawing: MapDrawing; - + constructor( private svgToDrawingConverter: SvgToDrawingConverter, private drawingsEventSource: DrawingsEventSource, - private cd: ChangeDetectorRef, - ) { } + private cd: ChangeDetectorRef + ) {} ngOnInit() { try { @@ -39,7 +39,7 @@ export class DrawingComponent implements OnInit { OnDragged(evt) { this.cd.detectChanges(); - this.drawingsEventSource.dragged.emit(new DraggedDataEvent(this.drawing, evt.dx, evt.dy)) + this.drawingsEventSource.dragged.emit(new DraggedDataEvent(this.drawing, evt.dx, evt.dy)); } is(element, type: string) { @@ -47,19 +47,19 @@ export class DrawingComponent implements OnInit { return false; } - if (type === "ellipse") { + if (type === 'ellipse') { return element instanceof EllipseElement; } - if (type === "image") { + if (type === 'image') { return element instanceof ImageElement; } - if (type === "line") { + if (type === 'line') { return element instanceof LineElement; } - if (type === "rect") { + if (type === 'rect') { return element instanceof RectElement; } - if (type === "text") { + if (type === 'text') { return element instanceof TextElement; } return false; diff --git a/src/app/cartography/components/experimental-map/drawing/drawings/ellipse/ellipse.component.html b/src/app/cartography/components/experimental-map/drawing/drawings/ellipse/ellipse.component.html index 8c4a296b..64bae406 100644 --- a/src/app/cartography/components/experimental-map/drawing/drawings/ellipse/ellipse.component.html +++ b/src/app/cartography/components/experimental-map/drawing/drawings/ellipse/ellipse.component.html @@ -1,4 +1,4 @@ - { beforeEach(async(() => { TestBed.configureTestingModule({ - declarations: [ EllipseComponent ] - }) - .compileComponents(); + declarations: [EllipseComponent] + }).compileComponents(); })); beforeEach(() => { diff --git a/src/app/cartography/components/experimental-map/drawing/drawings/ellipse/ellipse.component.ts b/src/app/cartography/components/experimental-map/drawing/drawings/ellipse/ellipse.component.ts index c2bb0475..f1437436 100644 --- a/src/app/cartography/components/experimental-map/drawing/drawings/ellipse/ellipse.component.ts +++ b/src/app/cartography/components/experimental-map/drawing/drawings/ellipse/ellipse.component.ts @@ -9,30 +9,27 @@ import { QtDasharrayFixer } from '../../../../../helpers/qt-dasharray-fixer'; }) export class EllipseComponent implements OnInit { @Input('app-ellipse') ellipse: EllipseElement; - - constructor( - private qtDasharrayFixer: QtDasharrayFixer - ) { } - ngOnInit() { - } + constructor(private qtDasharrayFixer: QtDasharrayFixer) {} + + ngOnInit() {} get fill_opacity() { - if(isFinite(this.ellipse.fill_opacity)) { + if (isFinite(this.ellipse.fill_opacity)) { return this.ellipse.fill_opacity; } return null; } get stroke_width() { - if(isFinite(this.ellipse.stroke_width)) { + if (isFinite(this.ellipse.stroke_width)) { return this.ellipse.stroke_width; } - return null + return null; } get stroke_dasharray() { - if(this.ellipse.stroke_dasharray) { + if (this.ellipse.stroke_dasharray) { return this.qtDasharrayFixer.fix(this.ellipse.stroke_dasharray); } return null; diff --git a/src/app/cartography/components/experimental-map/drawing/drawings/image/image.component.html b/src/app/cartography/components/experimental-map/drawing/drawings/image/image.component.html index 6e36c391..2be30057 100644 --- a/src/app/cartography/components/experimental-map/drawing/drawings/image/image.component.html +++ b/src/app/cartography/components/experimental-map/drawing/drawings/image/image.component.html @@ -1,6 +1,6 @@ - \ No newline at end of file +/> diff --git a/src/app/cartography/components/experimental-map/drawing/drawings/image/image.component.spec.ts b/src/app/cartography/components/experimental-map/drawing/drawings/image/image.component.spec.ts index 6d8acaad..6ee6952c 100644 --- a/src/app/cartography/components/experimental-map/drawing/drawings/image/image.component.spec.ts +++ b/src/app/cartography/components/experimental-map/drawing/drawings/image/image.component.spec.ts @@ -8,9 +8,8 @@ describe('ImageComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ - declarations: [ ImageComponent ] - }) - .compileComponents(); + declarations: [ImageComponent] + }).compileComponents(); })); beforeEach(() => { diff --git a/src/app/cartography/components/experimental-map/drawing/drawings/image/image.component.ts b/src/app/cartography/components/experimental-map/drawing/drawings/image/image.component.ts index f151d5a2..5ddd968c 100644 --- a/src/app/cartography/components/experimental-map/drawing/drawings/image/image.component.ts +++ b/src/app/cartography/components/experimental-map/drawing/drawings/image/image.component.ts @@ -7,11 +7,9 @@ import { ImageElement } from '../../../../../models/drawings/image-element'; styleUrls: ['./image.component.scss'] }) export class ImageComponent implements OnInit { - @Input('app-image') image: ImageElement; - - constructor() { } - ngOnInit() { - } + constructor() {} + + ngOnInit() {} } diff --git a/src/app/cartography/components/experimental-map/drawing/drawings/line/line.component.html b/src/app/cartography/components/experimental-map/drawing/drawings/line/line.component.html index d32f4207..b9516daf 100644 --- a/src/app/cartography/components/experimental-map/drawing/drawings/line/line.component.html +++ b/src/app/cartography/components/experimental-map/drawing/drawings/line/line.component.html @@ -1,4 +1,4 @@ - \ No newline at end of file +/> diff --git a/src/app/cartography/components/experimental-map/drawing/drawings/line/line.component.spec.ts b/src/app/cartography/components/experimental-map/drawing/drawings/line/line.component.spec.ts index 64f2500f..3f83bf9e 100644 --- a/src/app/cartography/components/experimental-map/drawing/drawings/line/line.component.spec.ts +++ b/src/app/cartography/components/experimental-map/drawing/drawings/line/line.component.spec.ts @@ -8,9 +8,8 @@ describe('LineComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ - declarations: [ LineComponent ] - }) - .compileComponents(); + declarations: [LineComponent] + }).compileComponents(); })); beforeEach(() => { diff --git a/src/app/cartography/components/experimental-map/drawing/drawings/line/line.component.ts b/src/app/cartography/components/experimental-map/drawing/drawings/line/line.component.ts index a7f8fa06..ae6018b1 100644 --- a/src/app/cartography/components/experimental-map/drawing/drawings/line/line.component.ts +++ b/src/app/cartography/components/experimental-map/drawing/drawings/line/line.component.ts @@ -9,26 +9,22 @@ import { LineElement } from '../../../../../models/drawings/line-element'; }) export class LineComponent implements OnInit { @Input('app-line') line: LineElement; - - constructor( - private qtDasharrayFixer: QtDasharrayFixer - ) { } - ngOnInit() { - } + constructor(private qtDasharrayFixer: QtDasharrayFixer) {} + + ngOnInit() {} get stroke_width() { - if(isFinite(this.line.stroke_width)) { + if (isFinite(this.line.stroke_width)) { return this.line.stroke_width; } - return null - } - - get stroke_dasharray() { - if(this.line.stroke_dasharray) { - return this.qtDasharrayFixer.fix(this.line.stroke_dasharray); - } return null; } + get stroke_dasharray() { + if (this.line.stroke_dasharray) { + return this.qtDasharrayFixer.fix(this.line.stroke_dasharray); + } + return null; + } } diff --git a/src/app/cartography/components/experimental-map/drawing/drawings/rect/rect.component.html b/src/app/cartography/components/experimental-map/drawing/drawings/rect/rect.component.html index 1a0944f4..ed00003c 100644 --- a/src/app/cartography/components/experimental-map/drawing/drawings/rect/rect.component.html +++ b/src/app/cartography/components/experimental-map/drawing/drawings/rect/rect.component.html @@ -1,4 +1,4 @@ - \ No newline at end of file +/> diff --git a/src/app/cartography/components/experimental-map/drawing/drawings/rect/rect.component.spec.ts b/src/app/cartography/components/experimental-map/drawing/drawings/rect/rect.component.spec.ts index d7b1ea95..949ca269 100644 --- a/src/app/cartography/components/experimental-map/drawing/drawings/rect/rect.component.spec.ts +++ b/src/app/cartography/components/experimental-map/drawing/drawings/rect/rect.component.spec.ts @@ -8,9 +8,8 @@ describe('RectComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ - declarations: [ RectComponent ] - }) - .compileComponents(); + declarations: [RectComponent] + }).compileComponents(); })); beforeEach(() => { diff --git a/src/app/cartography/components/experimental-map/drawing/drawings/rect/rect.component.ts b/src/app/cartography/components/experimental-map/drawing/drawings/rect/rect.component.ts index 42878aab..4caa423f 100644 --- a/src/app/cartography/components/experimental-map/drawing/drawings/rect/rect.component.ts +++ b/src/app/cartography/components/experimental-map/drawing/drawings/rect/rect.component.ts @@ -10,32 +10,28 @@ import { QtDasharrayFixer } from '../../../../../helpers/qt-dasharray-fixer'; export class RectComponent implements OnInit { @Input('app-rect') rect: RectElement; - constructor( - private qtDasharrayFixer: QtDasharrayFixer - ) { } + constructor(private qtDasharrayFixer: QtDasharrayFixer) {} - ngOnInit() { - } + ngOnInit() {} get fill_opacity() { - if(isFinite(this.rect.fill_opacity)) { + if (isFinite(this.rect.fill_opacity)) { return this.rect.fill_opacity; } return null; } get stroke_width() { - if(isFinite(this.rect.stroke_width)) { + if (isFinite(this.rect.stroke_width)) { return this.rect.stroke_width; } - return null - } - - get stroke_dasharray() { - if(this.rect.stroke_dasharray) { - return this.qtDasharrayFixer.fix(this.rect.stroke_dasharray); - } return null; } + get stroke_dasharray() { + if (this.rect.stroke_dasharray) { + return this.qtDasharrayFixer.fix(this.rect.stroke_dasharray); + } + return null; + } } diff --git a/src/app/cartography/components/experimental-map/drawing/drawings/text/text.component.html b/src/app/cartography/components/experimental-map/drawing/drawings/text/text.component.html index a9f62c84..42f87e3d 100644 --- a/src/app/cartography/components/experimental-map/drawing/drawings/text/text.component.html +++ b/src/app/cartography/components/experimental-map/drawing/drawings/text/text.component.html @@ -1,14 +1,12 @@ - - {{line}} - \ No newline at end of file + + {{ line }} + + diff --git a/src/app/cartography/components/experimental-map/drawing/drawings/text/text.component.spec.ts b/src/app/cartography/components/experimental-map/drawing/drawings/text/text.component.spec.ts index 845e947d..87012b5c 100644 --- a/src/app/cartography/components/experimental-map/drawing/drawings/text/text.component.spec.ts +++ b/src/app/cartography/components/experimental-map/drawing/drawings/text/text.component.spec.ts @@ -8,9 +8,8 @@ describe('TextComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ - declarations: [ TextComponent ] - }) - .compileComponents(); + declarations: [TextComponent] + }).compileComponents(); })); beforeEach(() => { diff --git a/src/app/cartography/components/experimental-map/drawing/drawings/text/text.component.ts b/src/app/cartography/components/experimental-map/drawing/drawings/text/text.component.ts index be113d5b..c1f97e1c 100644 --- a/src/app/cartography/components/experimental-map/drawing/drawings/text/text.component.ts +++ b/src/app/cartography/components/experimental-map/drawing/drawings/text/text.component.ts @@ -12,17 +12,14 @@ export class TextComponent implements OnInit, DoCheck { static MARGIN = 4; @Input('app-text') text: TextElement; - + @ViewChild('text') textRef: ElementRef; lines: string[] = []; - transformation = ""; + transformation = ''; - constructor( - private fontFixer: FontFixer, - private sanitizer: DomSanitizer - ) { } + constructor(private fontFixer: FontFixer, private sanitizer: DomSanitizer) {} ngOnInit() { this.lines = this.getLines(this.text.text); @@ -31,7 +28,7 @@ export class TextComponent implements OnInit, DoCheck { ngDoCheck() { this.transformation = this.calculateTransformation(); } - + get style() { const font = this.fontFixer.fix(this.text); @@ -45,7 +42,7 @@ export class TextComponent implements OnInit, DoCheck { if (font.font_weight) { styles.push(`font-weight: ${this.text.font_weight}`); } - return this.sanitizer.bypassSecurityTrustStyle(styles.join("; ")); + return this.sanitizer.bypassSecurityTrustStyle(styles.join('; ')); } get textDecoration() { @@ -54,7 +51,7 @@ export class TextComponent implements OnInit, DoCheck { calculateTransformation() { const tspans = this.textRef.nativeElement.getElementsByTagName('tspan'); - if(tspans.length > 0) { + if (tspans.length > 0) { const height = this.textRef.nativeElement.getBBox().height / tspans.length; return `translate(${TextComponent.MARGIN}, ${height - TextComponent.MARGIN})`; } @@ -62,7 +59,6 @@ export class TextComponent implements OnInit, DoCheck { } getLines(text: string) { - return text.split(/\r?\n/) + return text.split(/\r?\n/); } - } diff --git a/src/app/cartography/components/experimental-map/experimental-map.component.html b/src/app/cartography/components/experimental-map/experimental-map.component.html index 2a918534..3d4571a6 100644 --- a/src/app/cartography/components/experimental-map/experimental-map.component.html +++ b/src/app/cartography/components/experimental-map/experimental-map.component.html @@ -1,41 +1,25 @@ - - - - - - - - - - + + + + - - - - - - + + + - - + + - - - - + + diff --git a/src/app/cartography/components/experimental-map/experimental-map.component.scss b/src/app/cartography/components/experimental-map/experimental-map.component.scss index 7fb7062f..c41075de 100644 --- a/src/app/cartography/components/experimental-map/experimental-map.component.scss +++ b/src/app/cartography/components/experimental-map/experimental-map.component.scss @@ -1,5 +1,3 @@ svg { display: block; } - - diff --git a/src/app/cartography/components/experimental-map/experimental-map.component.spec.ts b/src/app/cartography/components/experimental-map/experimental-map.component.spec.ts index 0d5db4bb..b22d98f9 100644 --- a/src/app/cartography/components/experimental-map/experimental-map.component.spec.ts +++ b/src/app/cartography/components/experimental-map/experimental-map.component.spec.ts @@ -23,4 +23,4 @@ // // expect(component).toBeTruthy(); // // }); // }); -// // \ No newline at end of file +// // diff --git a/src/app/cartography/components/experimental-map/experimental-map.component.ts b/src/app/cartography/components/experimental-map/experimental-map.component.ts index 21442474..d5b0708e 100644 --- a/src/app/cartography/components/experimental-map/experimental-map.component.ts +++ b/src/app/cartography/components/experimental-map/experimental-map.component.ts @@ -1,11 +1,20 @@ import { - Component, ElementRef, HostListener, Input, OnChanges, OnDestroy, OnInit, - SimpleChange, ChangeDetectionStrategy, ChangeDetectorRef, ViewChild + Component, + ElementRef, + HostListener, + Input, + OnChanges, + OnDestroy, + OnInit, + SimpleChange, + ChangeDetectionStrategy, + ChangeDetectorRef, + ViewChild } from '@angular/core'; -import { GraphLayout } from "../../widgets/graph-layout"; -import { Context } from "../../models/context"; -import { Size } from "../../models/size"; +import { GraphLayout } from '../../widgets/graph-layout'; +import { Context } from '../../models/context'; +import { Size } from '../../models/size'; import { Subscription } from 'rxjs'; import { MapChangeDetectorRef } from '../../services/map-change-detector-ref'; import { CanvasSizeDetector } from '../../helpers/canvas-size-detector'; @@ -16,7 +25,6 @@ import { Symbol } from '../../../models/symbol'; import { GraphDataManager } from '../../managers/graph-data-manager'; import { LayersManager } from '../../managers/layers-manager'; - @Component({ selector: 'app-experimental-map', templateUrl: './experimental-map.component.html', @@ -29,7 +37,7 @@ export class ExperimentalMapComponent implements OnInit, OnChanges, OnDestroy { @Input() drawings: Drawing[] = []; @Input() symbols: Symbol[] = []; // @Input() changed: EventEmitter; - + // @Input('node-updated') nodeUpdated: EventEmitter; @Input() width = 1500; @@ -40,7 +48,7 @@ export class ExperimentalMapComponent implements OnInit, OnChanges, OnDestroy { private changesDetected: Subscription; protected settings = { - 'show_interface_labels': true + show_interface_labels: true }; constructor( @@ -50,11 +58,10 @@ export class ExperimentalMapComponent implements OnInit, OnChanges, OnDestroy { private canvasSizeDetector: CanvasSizeDetector, private changeDetectorRef: ChangeDetectorRef, private layersManger: LayersManager, - public graphLayout: GraphLayout, - ) { - } + public graphLayout: GraphLayout + ) {} - @Input('show-interface-labels') + @Input('show-interface-labels') set showInterfaceLabels(value) { this.settings.show_interface_labels = value; this.mapChangeDetectorRef.detectChanges(); @@ -72,11 +79,9 @@ export class ExperimentalMapComponent implements OnInit, OnChanges, OnDestroy { @Input('draw-link-tool') drawLinkTool: boolean; - @Input('readonly') set readonly(value) { - } - - ngOnChanges(changes: { [propKey: string]: SimpleChange }) { - } + @Input('readonly') set readonly(value) {} + + ngOnChanges(changes: { [propKey: string]: SimpleChange }) {} ngOnInit() { // this.changeDetectorRef.detach(); @@ -90,7 +95,6 @@ export class ExperimentalMapComponent implements OnInit, OnChanges, OnDestroy { this.changeDetectorRef.detectChanges(); }); - // this.changedSubscription = this.changed.subscribe(() => { // this.changeDetectorRef.detectChanges(); // }); @@ -123,9 +127,6 @@ export class ExperimentalMapComponent implements OnInit, OnChanges, OnDestroy { return `translate(${xTrans}, ${yTrans}) scale(${kTrans})`; } - @HostListener('window:resize', ['$event']) - onResize(event) { - - } + onResize(event) {} } diff --git a/src/app/cartography/components/experimental-map/interface-label/interface-label.component.html b/src/app/cartography/components/experimental-map/interface-label/interface-label.component.html index 2a2317ad..e480134f 100644 --- a/src/app/cartography/components/experimental-map/interface-label/interface-label.component.html +++ b/src/app/cartography/components/experimental-map/interface-label/interface-label.component.html @@ -1,9 +1,4 @@ - + - + {{ text }} - diff --git a/src/app/cartography/components/experimental-map/interface-label/interface-label.component.spec.ts b/src/app/cartography/components/experimental-map/interface-label/interface-label.component.spec.ts index 1e121d81..93c68e13 100644 --- a/src/app/cartography/components/experimental-map/interface-label/interface-label.component.spec.ts +++ b/src/app/cartography/components/experimental-map/interface-label/interface-label.component.spec.ts @@ -8,9 +8,8 @@ describe('InterfaceLabelComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ - declarations: [ InterfaceLabelComponent ] - }) - .compileComponents(); + declarations: [InterfaceLabelComponent] + }).compileComponents(); })); beforeEach(() => { diff --git a/src/app/cartography/components/experimental-map/interface-label/interface-label.component.ts b/src/app/cartography/components/experimental-map/interface-label/interface-label.component.ts index d596cc3a..0a2c8921 100644 --- a/src/app/cartography/components/experimental-map/interface-label/interface-label.component.ts +++ b/src/app/cartography/components/experimental-map/interface-label/interface-label.component.ts @@ -13,15 +13,15 @@ export class InterfaceLabelComponent implements OnInit { @ViewChild('textSvg') textRef: ElementRef; private label = { - 'x': 0, - 'y': 0, - 'text': '', - 'style': '', - 'rotation': 0 + x: 0, + y: 0, + text: '', + style: '', + rotation: 0 }; borderSize = 5; - + textWidth = 0; textHeight = 0; @@ -30,10 +30,9 @@ export class InterfaceLabelComponent implements OnInit { private ref: ChangeDetectorRef, private sanitizer: DomSanitizer, private cssFixer: CssFixer - ) { } + ) {} - ngOnInit() { - } + ngOnInit() {} @Input('x') set x(value) { @@ -82,7 +81,7 @@ export class InterfaceLabelComponent implements OnInit { } get rectWidth() { - return this.textRef.nativeElement.getBBox().width + this.borderSize*2; + return this.textRef.nativeElement.getBBox().width + this.borderSize * 2; } get rectHeight() { diff --git a/src/app/cartography/components/experimental-map/link/link.component.html b/src/app/cartography/components/experimental-map/link/link.component.html index c9201b75..ec46886a 100644 --- a/src/app/cartography/components/experimental-map/link/link.component.html +++ b/src/app/cartography/components/experimental-map/link/link.component.html @@ -1,11 +1,12 @@ - - - - + - + - - \ No newline at end of file + diff --git a/src/app/cartography/components/experimental-map/link/link.component.spec.ts b/src/app/cartography/components/experimental-map/link/link.component.spec.ts index 3642d967..127cafff 100644 --- a/src/app/cartography/components/experimental-map/link/link.component.spec.ts +++ b/src/app/cartography/components/experimental-map/link/link.component.spec.ts @@ -8,9 +8,8 @@ describe('LinkComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ - declarations: [ LinkComponent ] - }) - .compileComponents(); + declarations: [LinkComponent] + }).compileComponents(); })); beforeEach(() => { diff --git a/src/app/cartography/components/experimental-map/link/link.component.ts b/src/app/cartography/components/experimental-map/link/link.component.ts index 8c0d8d60..f89139dc 100644 --- a/src/app/cartography/components/experimental-map/link/link.component.ts +++ b/src/app/cartography/components/experimental-map/link/link.component.ts @@ -1,7 +1,13 @@ import { - Component, OnInit, Input, ViewChild, - ElementRef, EventEmitter, ChangeDetectorRef, - OnDestroy } from '@angular/core'; + Component, + OnInit, + Input, + ViewChild, + ElementRef, + EventEmitter, + ChangeDetectorRef, + OnDestroy +} from '@angular/core'; import { Subscription } from 'rxjs'; import { LinkStrategy } from './strategies/link-strategy'; import { EthernetLinkStrategy } from './strategies/ethernet-link-strategy'; @@ -10,11 +16,10 @@ import { MultiLinkCalculatorHelper } from '../../../helpers/multi-link-calculato import { Node } from '../../../models/node'; import { MapLink } from '../../../models/map/map-link'; - @Component({ selector: '[app-link]', templateUrl: './link.component.html', - styleUrls: ['./link.component.scss'], + styleUrls: ['./link.component.scss'] }) export class LinkComponent implements OnInit, OnDestroy { @Input('app-link') link: MapLink; @@ -28,10 +33,7 @@ export class LinkComponent implements OnInit, OnDestroy { private nodeChangedSubscription: Subscription; - constructor( - private multiLinkCalculatorHelper: MultiLinkCalculatorHelper, - private ref: ChangeDetectorRef - ) {} + constructor(private multiLinkCalculatorHelper: MultiLinkCalculatorHelper, private ref: ChangeDetectorRef) {} ngOnInit() { this.ref.detectChanges(); @@ -54,12 +56,15 @@ export class LinkComponent implements OnInit, OnDestroy { } get transform() { - const translation = this.multiLinkCalculatorHelper.linkTranslation(this.link.distance, this.link.source, this.link.target); + const translation = this.multiLinkCalculatorHelper.linkTranslation( + this.link.distance, + this.link.source, + this.link.target + ); return `translate (${translation.dx}, ${translation.dy})`; } get d() { return this.strategy.d(this.link); } - } diff --git a/src/app/cartography/components/experimental-map/link/strategies/ethernet-link-strategy.ts b/src/app/cartography/components/experimental-map/link/strategies/ethernet-link-strategy.ts index f4767e72..a3df16a1 100644 --- a/src/app/cartography/components/experimental-map/link/strategies/ethernet-link-strategy.ts +++ b/src/app/cartography/components/experimental-map/link/strategies/ethernet-link-strategy.ts @@ -1,18 +1,17 @@ -import { LinkStrategy } from "./link-strategy"; -import { path } from "d3-path"; -import { MapLink } from "../../../../models/map/map-link"; - +import { LinkStrategy } from './link-strategy'; +import { path } from 'd3-path'; +import { MapLink } from '../../../../models/map/map-link'; export class EthernetLinkStrategy implements LinkStrategy { - public d(link: MapLink): string { - const points = [ - [link.source.x + link.source.width / 2., link.source.y + link.source.height / 2.], - [link.target.x + link.target.width / 2., link.target.y + link.target.height / 2.] - ]; - - const line_generator = path(); - line_generator.moveTo(points[0][0], points[0][1]); - line_generator.lineTo(points[1][0], points[1][1]); - return line_generator.toString(); - } -} \ No newline at end of file + public d(link: MapLink): string { + const points = [ + [link.source.x + link.source.width / 2, link.source.y + link.source.height / 2], + [link.target.x + link.target.width / 2, link.target.y + link.target.height / 2] + ]; + + const line_generator = path(); + line_generator.moveTo(points[0][0], points[0][1]); + line_generator.lineTo(points[1][0], points[1][1]); + return line_generator.toString(); + } +} diff --git a/src/app/cartography/components/experimental-map/link/strategies/link-strategy.ts b/src/app/cartography/components/experimental-map/link/strategies/link-strategy.ts index 511c9e7f..75f4dc13 100644 --- a/src/app/cartography/components/experimental-map/link/strategies/link-strategy.ts +++ b/src/app/cartography/components/experimental-map/link/strategies/link-strategy.ts @@ -1,5 +1,5 @@ -import { MapLink } from "../../../../models/map/map-link"; +import { MapLink } from '../../../../models/map/map-link'; export interface LinkStrategy { - d(link: MapLink): string; + d(link: MapLink): string; } diff --git a/src/app/cartography/components/experimental-map/link/strategies/serial-link-strategy.ts b/src/app/cartography/components/experimental-map/link/strategies/serial-link-strategy.ts index 9dd64d2d..4f0a04fe 100644 --- a/src/app/cartography/components/experimental-map/link/strategies/serial-link-strategy.ts +++ b/src/app/cartography/components/experimental-map/link/strategies/serial-link-strategy.ts @@ -1,55 +1,46 @@ -import { path } from "d3-path"; -import { LinkStrategy } from "./link-strategy"; -import { MapLink } from "../../../../models/map/map-link"; - +import { path } from 'd3-path'; +import { LinkStrategy } from './link-strategy'; +import { MapLink } from '../../../../models/map/map-link'; export class SerialLinkStrategy implements LinkStrategy { - private linkToPoints(link: MapLink) { - const source = { - 'x': link.source.x + link.source.width / 2, - 'y': link.source.y + link.source.height / 2 - }; - const target = { - 'x': link.target.x + link.target.width / 2, - 'y': link.target.y + link.target.height / 2 - }; - - const dx = target.x - source.x; - const dy = target.y - source.y; - - const vector_angle = Math.atan2(dy, dx); - const rot_angle = -Math.PI / 4.0; - const vect_rot = [ - Math.cos(vector_angle + rot_angle), - Math.sin(vector_angle + rot_angle) - ]; - - const angle_source: [number, number] = [ - source.x + dx / 2.0 + 15 * vect_rot[0], - source.y + dy / 2.0 + 15 * vect_rot[1] - ]; - - const angle_target: [number, number] = [ - target.x - dx / 2.0 - 15 * vect_rot[0], - target.y - dy / 2.0 - 15 * vect_rot[1] - ]; - - return [ - [source.x, source.y], - angle_source, - angle_target, - [target.x, target.y] - ]; - } - - d(link: MapLink): string { - const points = this.linkToPoints(link); - - const line_generator = path(); - line_generator.moveTo(points[0][0], points[0][1]); - line_generator.lineTo(points[1][0], points[1][1]); - line_generator.lineTo(points[2][0], points[2][1]); - line_generator.lineTo(points[3][0], points[3][1]); - return line_generator.toString(); - } + private linkToPoints(link: MapLink) { + const source = { + x: link.source.x + link.source.width / 2, + y: link.source.y + link.source.height / 2 + }; + const target = { + x: link.target.x + link.target.width / 2, + y: link.target.y + link.target.height / 2 + }; + + const dx = target.x - source.x; + const dy = target.y - source.y; + + const vector_angle = Math.atan2(dy, dx); + const rot_angle = -Math.PI / 4.0; + const vect_rot = [Math.cos(vector_angle + rot_angle), Math.sin(vector_angle + rot_angle)]; + + const angle_source: [number, number] = [ + source.x + dx / 2.0 + 15 * vect_rot[0], + source.y + dy / 2.0 + 15 * vect_rot[1] + ]; + + const angle_target: [number, number] = [ + target.x - dx / 2.0 - 15 * vect_rot[0], + target.y - dy / 2.0 - 15 * vect_rot[1] + ]; + + return [[source.x, source.y], angle_source, angle_target, [target.x, target.y]]; + } + + d(link: MapLink): string { + const points = this.linkToPoints(link); + + const line_generator = path(); + line_generator.moveTo(points[0][0], points[0][1]); + line_generator.lineTo(points[1][0], points[1][1]); + line_generator.lineTo(points[2][0], points[2][1]); + line_generator.lineTo(points[3][0], points[3][1]); + return line_generator.toString(); + } } diff --git a/src/app/cartography/components/experimental-map/node/node.component.html b/src/app/cartography/components/experimental-map/node/node.component.html index eabce9c7..6a3c7529 100644 --- a/src/app/cartography/components/experimental-map/node/node.component.html +++ b/src/app/cartography/components/experimental-map/node/node.component.html @@ -1,8 +1,5 @@ - - + - + {{ node.label.text }} - \ No newline at end of file + diff --git a/src/app/cartography/components/experimental-map/node/node.component.spec.ts b/src/app/cartography/components/experimental-map/node/node.component.spec.ts index 4902d2ec..76c09dc4 100644 --- a/src/app/cartography/components/experimental-map/node/node.component.spec.ts +++ b/src/app/cartography/components/experimental-map/node/node.component.spec.ts @@ -8,9 +8,8 @@ describe('NodeComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ - declarations: [ NodeComponent ] - }) - .compileComponents(); + declarations: [NodeComponent] + }).compileComponents(); })); beforeEach(() => { diff --git a/src/app/cartography/components/experimental-map/node/node.component.ts b/src/app/cartography/components/experimental-map/node/node.component.ts index 2abc52b2..896ec653 100644 --- a/src/app/cartography/components/experimental-map/node/node.component.ts +++ b/src/app/cartography/components/experimental-map/node/node.component.ts @@ -1,7 +1,17 @@ import { - Component, OnInit, Input, ElementRef, - ViewChild, ChangeDetectorRef, ChangeDetectionStrategy, Output, - EventEmitter, OnDestroy, OnChanges, AfterViewInit } from '@angular/core'; + Component, + OnInit, + Input, + ElementRef, + ViewChild, + ChangeDetectorRef, + ChangeDetectionStrategy, + Output, + EventEmitter, + OnDestroy, + OnChanges, + AfterViewInit +} from '@angular/core'; import { DomSanitizer } from '@angular/platform-browser'; import { Subscription } from 'rxjs'; import { CssFixer } from '../../../helpers/css-fixer'; @@ -26,9 +36,9 @@ export class NodeComponent implements OnInit, OnDestroy, OnChanges, AfterViewIni @Input('app-node') node: MapNode; @Input('symbols') symbols: Symbol[]; @Input('node-changed') nodeChanged: EventEmitter; - + // @Output() valueChange = new EventEmitter(); - + nodeChangedSubscription: Subscription; private labelHeight = 0; @@ -40,7 +50,7 @@ export class NodeComponent implements OnInit, OnDestroy, OnChanges, AfterViewIni protected element: ElementRef, private cd: ChangeDetectorRef, private nodesEventSource: NodesEventSource - ) { } + ) {} ngOnInit() { // this.nodeChangedSubscription = this.nodeChanged.subscribe((node: Node) => { @@ -72,10 +82,9 @@ export class NodeComponent implements OnInit, OnDestroy, OnChanges, AfterViewIni OnDragged(evt) { this.cd.detectChanges(); - this.nodesEventSource.dragged.emit(new DraggedDataEvent(this.node, evt.dx, evt.dy)) + this.nodesEventSource.dragged.emit(new DraggedDataEvent(this.node, evt.dx, evt.dy)); } - get symbol(): string { const symbol = this.symbols.find((s: Symbol) => s.symbol_id === this.node.symbol); if (symbol) { @@ -86,7 +95,6 @@ export class NodeComponent implements OnInit, OnDestroy, OnChanges, AfterViewIni } get label_style() { - let styles = this.cssFixer.fix(this.node.label.style); styles = this.fontFixer.fixStyles(styles); return this.sanitizer.bypassSecurityTrustStyle(styles); @@ -96,18 +104,18 @@ export class NodeComponent implements OnInit, OnDestroy, OnChanges, AfterViewIni if (this.node.label.x === null) { // center const bbox = this.label.nativeElement.getBBox(); - - return -bbox.width / 2.; + + return -bbox.width / 2; } return this.node.label.x + NodeComponent.NODE_LABEL_MARGIN; } get label_y(): number { this.labelHeight = this.getLabelHeight(); - + if (this.node.label.x === null) { // center - return - this.node.height / 2. - this.labelHeight ; + return -this.node.height / 2 - this.labelHeight; } return this.node.label.y + this.labelHeight - NodeComponent.NODE_LABEL_MARGIN; } diff --git a/src/app/cartography/components/experimental-map/selection/selection.component.html b/src/app/cartography/components/experimental-map/selection/selection.component.html index 8dee5ced..03d7ab0e 100644 --- a/src/app/cartography/components/experimental-map/selection/selection.component.html +++ b/src/app/cartography/components/experimental-map/selection/selection.component.html @@ -1,10 +1 @@ - - - - + diff --git a/src/app/cartography/components/experimental-map/selection/selection.component.spec.ts b/src/app/cartography/components/experimental-map/selection/selection.component.spec.ts index 111505c9..9cf81f57 100644 --- a/src/app/cartography/components/experimental-map/selection/selection.component.spec.ts +++ b/src/app/cartography/components/experimental-map/selection/selection.component.spec.ts @@ -8,9 +8,8 @@ describe('SelectionComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ - declarations: [ SelectionComponent ] - }) - .compileComponents(); + declarations: [SelectionComponent] + }).compileComponents(); })); beforeEach(() => { diff --git a/src/app/cartography/components/experimental-map/selection/selection.component.ts b/src/app/cartography/components/experimental-map/selection/selection.component.ts index d7327a5d..cc51bc47 100644 --- a/src/app/cartography/components/experimental-map/selection/selection.component.ts +++ b/src/app/cartography/components/experimental-map/selection/selection.component.ts @@ -9,7 +9,7 @@ import { Rectangle } from '../../../models/rectangle'; }) export class SelectionComponent implements OnInit, AfterViewInit { @Input('app-selection') svg: SVGSVGElement; - + private startX: number; private startY: number; @@ -20,25 +20,20 @@ export class SelectionComponent implements OnInit, AfterViewInit { visible = false; draggable: Subscription; - @Output('selected') rectangleSelected = new EventEmitter(); - constructor( - private ref: ChangeDetectorRef - ) { } - - ngOnInit() { - } + constructor(private ref: ChangeDetectorRef) {} + ngOnInit() {} ngAfterViewInit() { const down = Observable.fromEvent(this.svg, 'mousedown').do((e: MouseEvent) => e.preventDefault()); down.subscribe((e: MouseEvent) => { - if(e.target !== this.svg) { + if (e.target !== this.svg) { return; } - + this.started = true; this.startX = e.clientX + window.scrollX; this.startY = e.clientY + window.scrollY; @@ -48,51 +43,48 @@ export class SelectionComponent implements OnInit, AfterViewInit { this.ref.detectChanges(); }); - const up = Observable.fromEvent(document, 'mouseup') - .do((e: MouseEvent) => { + const up = Observable.fromEvent(document, 'mouseup').do((e: MouseEvent) => { e.preventDefault(); }); - const mouseMove = Observable.fromEvent(document, 'mousemove') - .do((e: MouseEvent) => e.stopPropagation()); + const mouseMove = Observable.fromEvent(document, 'mousemove').do((e: MouseEvent) => e.stopPropagation()); - const scrollWindow = Observable.fromEvent(document, 'scroll') - .startWith({}); + const scrollWindow = Observable.fromEvent(document, 'scroll').startWith({}); const move = Observable.combineLatest(mouseMove, scrollWindow); const drag = down.mergeMap((md: MouseEvent) => { return move - .map(([mm, s]) => mm) - .do((mm: MouseEvent) => { - if(!this.started) { + .map(([mm, s]) => mm) + .do((mm: MouseEvent) => { + if (!this.started) { + return; + } + this.visible = true; + this.width = mm.clientX - this.startX + window.scrollX; + this.height = mm.clientY - this.startY + window.scrollY; + + this.ref.detectChanges(); + + this.selectedEvent([this.startX, this.startY], [this.width, this.height]); + }) + .skipUntil( + up.take(1).do((e: MouseEvent) => { + if (!this.started) { return; } - this.visible = true; - this.width = mm.clientX - this.startX + window.scrollX; - this.height = mm.clientY - this.startY + window.scrollY; + this.visible = false; + this.started = false; + + this.width = e.clientX - this.startX + window.scrollX; + this.height = e.clientY - this.startY + window.scrollY; this.ref.detectChanges(); this.selectedEvent([this.startX, this.startY], [this.width, this.height]); }) - .skipUntil(up - .take(1) - .do((e: MouseEvent) => { - if(!this.started) { - return; - } - this.visible = false; - this.started = false; - - this.width = e.clientX - this.startX + window.scrollX; - this.height = e.clientY - this.startY + window.scrollY; - - this.ref.detectChanges(); - - this.selectedEvent([this.startX, this.startY], [this.width, this.height]); - })) - .take(1); + ) + .take(1); }); this.draggable = drag.subscribe((e: MouseEvent) => { @@ -109,7 +101,7 @@ export class SelectionComponent implements OnInit, AfterViewInit { } private rect(x: number, y: number, w: number, h: number) { - return "M" + [x, y] + " l" + [w, 0] + " l" + [0, h] + " l" + [-w, 0] + "z"; + return 'M' + [x, y] + ' l' + [w, 0] + ' l' + [0, h] + ' l' + [-w, 0] + 'z'; } private selectedEvent(start, end) { diff --git a/src/app/cartography/components/experimental-map/status/status.component.html b/src/app/cartography/components/experimental-map/status/status.component.html index cfcef840..332d537f 100644 --- a/src/app/cartography/components/experimental-map/status/status.component.html +++ b/src/app/cartography/components/experimental-map/status/status.component.html @@ -11,11 +11,11 @@ - \ No newline at end of file + diff --git a/src/app/cartography/components/experimental-map/status/status.component.spec.ts b/src/app/cartography/components/experimental-map/status/status.component.spec.ts index ddf4f677..d4f8f4a9 100644 --- a/src/app/cartography/components/experimental-map/status/status.component.spec.ts +++ b/src/app/cartography/components/experimental-map/status/status.component.spec.ts @@ -8,9 +8,8 @@ describe('StatusComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ - declarations: [ StatusComponent ] - }) - .compileComponents(); + declarations: [StatusComponent] + }).compileComponents(); })); beforeEach(() => { diff --git a/src/app/cartography/components/experimental-map/status/status.component.ts b/src/app/cartography/components/experimental-map/status/status.component.ts index 05d58efc..af2d9dab 100644 --- a/src/app/cartography/components/experimental-map/status/status.component.ts +++ b/src/app/cartography/components/experimental-map/status/status.component.ts @@ -1,27 +1,23 @@ import { Component, ElementRef, Input, ChangeDetectorRef } from '@angular/core'; - @Component({ selector: '[app-status]', templateUrl: './status.component.html', - styleUrls: ['./status.component.scss'], + styleUrls: ['./status.component.scss'] }) -export class StatusComponent { +export class StatusComponent { static STOPPED_STATUS_RECT_WIDTH = 10; data = { - 'status': '', - 'path': null, - 'direction': null, - 'd': null + status: '', + path: null, + direction: null, + d: null }; - constructor( - protected element: ElementRef, - private ref: ChangeDetectorRef - ) {} + constructor(protected element: ElementRef, private ref: ChangeDetectorRef) {} - @Input('app-status') + @Input('app-status') set status(value) { this.data.status = value; this.ref.markForCheck(); @@ -54,7 +50,7 @@ export class StatusComponent { get direction() { return this.data.direction; } - + get path() { return this.data.path; } @@ -79,5 +75,4 @@ export class StatusComponent { } return this.targetStatusPoint; } - } diff --git a/src/app/cartography/components/selection-control/selection-control.component.spec.ts b/src/app/cartography/components/selection-control/selection-control.component.spec.ts index af1fecd6..3299b5a3 100644 --- a/src/app/cartography/components/selection-control/selection-control.component.spec.ts +++ b/src/app/cartography/components/selection-control/selection-control.component.spec.ts @@ -16,23 +16,22 @@ describe('SelectionControlComponent', () => { let selectionEventSource: SelectionEventSource; beforeEach(() => { - const mockedGraphData = mock(GraphDataManager); const node_1 = new MapNode(); - node_1.id = "test1"; - node_1.name = "Node 1"; + node_1.id = 'test1'; + node_1.name = 'Node 1'; node_1.x = 150; node_1.y = 150; const node_2 = new MapNode(); - node_2.id = "test2"; - node_2.name = "Node 2"; + node_2.id = 'test2'; + node_2.name = 'Node 2'; node_2.x = 300; node_2.y = 300; const link_1 = new MapLink(); - link_1.id = "test1"; + link_1.id = 'test1'; when(mockedGraphData.getNodes()).thenReturn([node_1, node_2]); when(mockedGraphData.getLinks()).thenReturn([link_1]); @@ -50,7 +49,7 @@ describe('SelectionControlComponent', () => { afterEach(() => { component.ngOnDestroy(); - }) + }); it('should create', () => { expect(component).toBeTruthy(); diff --git a/src/app/cartography/components/selection-control/selection-control.component.ts b/src/app/cartography/components/selection-control/selection-control.component.ts index 81abb854..52ed1c6a 100644 --- a/src/app/cartography/components/selection-control/selection-control.component.ts +++ b/src/app/cartography/components/selection-control/selection-control.component.ts @@ -13,68 +13,74 @@ import { Rectangle } from '../../models/rectangle'; }) export class SelectionControlComponent implements OnInit, OnDestroy { private onSelection: Subscription; - + constructor( private selectionEventSource: SelectionEventSource, private graphDataManager: GraphDataManager, private inRectangleHelper: InRectangleHelper, private selectionManager: SelectionManager - ) { } + ) {} ngOnInit() { this.onSelection = this.selectionEventSource.selected.subscribe((rectangle: Rectangle) => { - const selectedNodes = this.graphDataManager.getNodes().filter((node) => { - return this.inRectangleHelper.inRectangle(rectangle, node.x, node.y) + const selectedNodes = this.graphDataManager.getNodes().filter(node => { + return this.inRectangleHelper.inRectangle(rectangle, node.x, node.y); }); - const selectedLinks = this.graphDataManager.getLinks().filter((link) => { - return this.inRectangleHelper.inRectangle(rectangle, link.x, link.y) + const selectedLinks = this.graphDataManager.getLinks().filter(link => { + return this.inRectangleHelper.inRectangle(rectangle, link.x, link.y); }); - - const selectedDrawings = this.graphDataManager.getDrawings().filter((drawing) => { - return this.inRectangleHelper.inRectangle(rectangle, drawing.x, drawing.y) + + const selectedDrawings = this.graphDataManager.getDrawings().filter(drawing => { + return this.inRectangleHelper.inRectangle(rectangle, drawing.x, drawing.y); }); - - const selectedLabels = this.graphDataManager.getNodes().filter((node) => { - if (node.label === undefined) { - return false; - } - const labelX = node.x + node.label.x; - const labelY = node.y + node.label.y; - return this.inRectangleHelper.inRectangle(rectangle, labelX, labelY); - }).map((node) => node.label); - const selectedInterfacesLabelsSources = this.graphDataManager.getLinks().filter((link) => { - if (link.source === undefined || link.nodes.length != 2 || link.nodes[0].label === undefined) { - return false; - } - const interfaceLabelX = link.source.x + link.nodes[0].label.x; - const interfaceLabelY = link.source.y + link.nodes[0].label.y; - return this.inRectangleHelper.inRectangle(rectangle, interfaceLabelX, interfaceLabelY); - }).map((link) => link.nodes[0]); + const selectedLabels = this.graphDataManager + .getNodes() + .filter(node => { + if (node.label === undefined) { + return false; + } + const labelX = node.x + node.label.x; + const labelY = node.y + node.label.y; + return this.inRectangleHelper.inRectangle(rectangle, labelX, labelY); + }) + .map(node => node.label); - const selectedInterfacesLabelsTargets = this.graphDataManager.getLinks().filter((link) => { - if (link.target === undefined || link.nodes.length != 2 || link.nodes[1].label === undefined) { - return false; - } - const interfaceLabelX = link.target.x + link.nodes[1].label.x; - const interfaceLabelY = link.target.y + link.nodes[1].label.y; - return this.inRectangleHelper.inRectangle(rectangle, interfaceLabelX, interfaceLabelY); - }).map((link) => link.nodes[1]); + const selectedInterfacesLabelsSources = this.graphDataManager + .getLinks() + .filter(link => { + if (link.source === undefined || link.nodes.length != 2 || link.nodes[0].label === undefined) { + return false; + } + const interfaceLabelX = link.source.x + link.nodes[0].label.x; + const interfaceLabelY = link.source.y + link.nodes[0].label.y; + return this.inRectangleHelper.inRectangle(rectangle, interfaceLabelX, interfaceLabelY); + }) + .map(link => link.nodes[0]); - const selectedInterfaces = [ - ...selectedInterfacesLabelsSources, - ...selectedInterfacesLabelsTargets, - ] + const selectedInterfacesLabelsTargets = this.graphDataManager + .getLinks() + .filter(link => { + if (link.target === undefined || link.nodes.length != 2 || link.nodes[1].label === undefined) { + return false; + } + const interfaceLabelX = link.target.x + link.nodes[1].label.x; + const interfaceLabelY = link.target.y + link.nodes[1].label.y; + return this.inRectangleHelper.inRectangle(rectangle, interfaceLabelX, interfaceLabelY); + }) + .map(link => link.nodes[1]); + + const selectedInterfaces = [...selectedInterfacesLabelsSources, ...selectedInterfacesLabelsTargets]; const selected = [ ...selectedNodes, ...selectedLinks, ...selectedDrawings, ...selectedLabels, - ...selectedInterfaces, + ...selectedInterfaces ]; - + this.selectionManager.setSelected(selected); }); } @@ -82,5 +88,4 @@ export class SelectionControlComponent implements OnInit, OnDestroy { ngOnDestroy() { this.onSelection.unsubscribe(); } - } diff --git a/src/app/cartography/components/selection-select/selection-select.component.spec.ts b/src/app/cartography/components/selection-select/selection-select.component.spec.ts index 3af1b594..4117b6cb 100644 --- a/src/app/cartography/components/selection-select/selection-select.component.spec.ts +++ b/src/app/cartography/components/selection-select/selection-select.component.spec.ts @@ -8,9 +8,8 @@ describe('SelectionSelectComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ - declarations: [ SelectionSelectComponent ] - }) - .compileComponents(); + declarations: [SelectionSelectComponent] + }).compileComponents(); })); beforeEach(() => { diff --git a/src/app/cartography/components/selection-select/selection-select.component.ts b/src/app/cartography/components/selection-select/selection-select.component.ts index fffba5d7..a1ca43e7 100644 --- a/src/app/cartography/components/selection-select/selection-select.component.ts +++ b/src/app/cartography/components/selection-select/selection-select.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit, OnDestroy } from '@angular/core'; +import { Component, Input, OnInit, OnDestroy } from '@angular/core'; import { Subscription } from 'rxjs'; import { SelectionManager } from '../../managers/selection-manager'; import { MapChangeDetectorRef } from '../../services/map-change-detector-ref'; @@ -11,11 +11,11 @@ import { MapChangeDetectorRef } from '../../services/map-change-detector-ref'; export class SelectionSelectComponent implements OnInit, OnDestroy { private onSelected: Subscription; private onUnselected: Subscription; - + constructor( - private selectionManager: SelectionManager, + private selectionManager: SelectionManager, private mapChangeDetectorRef: MapChangeDetectorRef - ) { } + ) {} ngOnInit() { this.onSelected = this.selectionManager.selected.subscribe(() => { @@ -30,5 +30,4 @@ export class SelectionSelectComponent implements OnInit, OnDestroy { this.onSelected.unsubscribe(); this.onUnselected.unsubscribe(); } - } diff --git a/src/app/cartography/components/text-editor/text-editor.component.html b/src/app/cartography/components/text-editor/text-editor.component.html index f5d81eb2..03bff3d8 100644 --- a/src/app/cartography/components/text-editor/text-editor.component.html +++ b/src/app/cartography/components/text-editor/text-editor.component.html @@ -1,6 +1,10 @@ -
- {{innerText}} +
+ {{ innerText }}
diff --git a/src/app/cartography/components/text-editor/text-editor.component.scss b/src/app/cartography/components/text-editor/text-editor.component.scss index 1b55f51f..575b3600 100644 --- a/src/app/cartography/components/text-editor/text-editor.component.scss +++ b/src/app/cartography/components/text-editor/text-editor.component.scss @@ -1,10 +1,10 @@ -.temporaryElement{ - padding-left: 4px; - width: fit-content; - position: absolute; - z-index: 99; - font-family: 'Noto Sans'; - font-size: 11pt; - font-weight: bold; - color: #000000; +.temporaryElement { + padding-left: 4px; + width: fit-content; + position: absolute; + z-index: 99; + font-family: 'Noto Sans'; + font-size: 11pt; + font-weight: bold; + color: #000000; } diff --git a/src/app/cartography/components/text-editor/text-editor.component.spec.ts b/src/app/cartography/components/text-editor/text-editor.component.spec.ts index 65ac5fdf..89c52c0b 100644 --- a/src/app/cartography/components/text-editor/text-editor.component.spec.ts +++ b/src/app/cartography/components/text-editor/text-editor.component.spec.ts @@ -1,4 +1,4 @@ -import { TextEditorComponent } from "./text-editor.component"; +import { TextEditorComponent } from './text-editor.component'; import { ComponentFixture, TestBed, async } from '@angular/core/testing'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { DrawingsEventSource } from '../../events/drawings-event-source'; @@ -7,34 +7,29 @@ import { Context } from '../../models/context'; import { Renderer2 } from '@angular/core'; describe('TemporaryTextElementComponent', () => { - let component: TextEditorComponent; - let fixture: ComponentFixture; + let component: TextEditorComponent; + let fixture: ComponentFixture; - beforeEach(async(() => { - TestBed.configureTestingModule({ - imports: [ - NoopAnimationsModule - ], - providers: [ - { provide: DrawingsEventSource, useClass: DrawingsEventSource }, - { provide: ToolsService, useClass: ToolsService }, - { provide: Context, useClass: Context }, - { provide: Renderer2, useClass: Renderer2 } - ], - declarations: [ - TextEditorComponent - ] - }) - .compileComponents(); - })); + beforeEach(async(() => { + TestBed.configureTestingModule({ + imports: [NoopAnimationsModule], + providers: [ + { provide: DrawingsEventSource, useClass: DrawingsEventSource }, + { provide: ToolsService, useClass: ToolsService }, + { provide: Context, useClass: Context }, + { provide: Renderer2, useClass: Renderer2 } + ], + declarations: [TextEditorComponent] + }).compileComponents(); + })); - beforeEach(() => { - fixture = TestBed.createComponent(TextEditorComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); + beforeEach(() => { + fixture = TestBed.createComponent(TextEditorComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); - it('should create', () => { - expect(component).toBeTruthy(); - }); + it('should create', () => { + expect(component).toBeTruthy(); + }); }); diff --git a/src/app/cartography/components/text-editor/text-editor.component.ts b/src/app/cartography/components/text-editor/text-editor.component.ts index ea674e9f..f8b9fa8e 100644 --- a/src/app/cartography/components/text-editor/text-editor.component.ts +++ b/src/app/cartography/components/text-editor/text-editor.component.ts @@ -1,4 +1,4 @@ -import { Component, ViewChild, ElementRef, OnInit, Input, EventEmitter, OnDestroy, Renderer2 } from "@angular/core"; +import { Component, ViewChild, ElementRef, OnInit, Input, EventEmitter, OnDestroy, Renderer2 } from '@angular/core'; import { DrawingsEventSource } from '../../events/drawings-event-source'; import { TextAddedDataEvent, TextEditedDataEvent } from '../../events/event-source'; import { ToolsService } from '../../../services/tools.service'; @@ -7,113 +7,134 @@ import { TextElement } from '../../models/drawings/text-element'; import { Context } from '../../models/context'; import { Subscription } from 'rxjs'; - @Component({ - selector: 'app-text-editor', - templateUrl: './text-editor.component.html', - styleUrls: ['./text-editor.component.scss'] + selector: 'app-text-editor', + templateUrl: './text-editor.component.html', + styleUrls: ['./text-editor.component.scss'] }) export class TextEditorComponent implements OnInit, OnDestroy { - @ViewChild('temporaryTextElement') temporaryTextElement: ElementRef; - @Input('svg') svg: SVGSVGElement; + @ViewChild('temporaryTextElement') temporaryTextElement: ElementRef; + @Input('svg') svg: SVGSVGElement; - private leftPosition: string = '0px'; - private topPosition: string = '0px'; - private innerText: string = ''; + leftPosition: string = '0px'; + topPosition: string = '0px'; + innerText: string = ''; - private editingDrawingId: string; - private editedElement: any; + private editingDrawingId: string; + private editedElement: any; - private mapListener: Function; - private textListener: Function; - private textAddingSubscription: Subscription; - public addingFinished = new EventEmitter(); - - constructor( - private drawingsEventSource: DrawingsEventSource, - private toolsService: ToolsService, - private context: Context, - private renderer: Renderer2 - ){} + private mapListener: Function; + private textListener: Function; + private textAddingSubscription: Subscription; + public addingFinished = new EventEmitter(); - ngOnInit(){ - this.textAddingSubscription = this.toolsService.isTextAddingToolActivated.subscribe((isActive: boolean) => { - isActive ? this.activateTextAdding() : this.deactivateTextAdding() - }); + constructor( + private drawingsEventSource: DrawingsEventSource, + private toolsService: ToolsService, + private context: Context, + private renderer: Renderer2 + ) {} - this.activateTextEditing(); - } + ngOnInit() { + this.textAddingSubscription = this.toolsService.isTextAddingToolActivated.subscribe((isActive: boolean) => { + isActive ? this.activateTextAdding() : this.deactivateTextAdding(); + }); - activateTextAdding(){ - let addTextListener = (event: MouseEvent) => { - this.leftPosition = event.clientX.toString() + 'px'; - this.topPosition = (event.clientY + window.pageYOffset).toString() + 'px'; - this.renderer.setStyle(this.temporaryTextElement.nativeElement, 'display', 'initial'); - this.temporaryTextElement.nativeElement.focus(); + this.activateTextEditing(); + } - let textListener = () => { - this.drawingsEventSource.textAdded.emit(new TextAddedDataEvent(this.temporaryTextElement.nativeElement.innerText.replace(/\n$/, ""), event.clientX, event.clientY)); - this.deactivateTextAdding(); - this.innerText = ''; - this.temporaryTextElement.nativeElement.removeEventListener("focusout", this.textListener); - this.renderer.setStyle(this.temporaryTextElement.nativeElement, 'display', 'none'); - } - this.textListener = textListener; - this.temporaryTextElement.nativeElement.addEventListener('focusout', this.textListener); - } + activateTextAdding() { + let addTextListener = (event: MouseEvent) => { + this.leftPosition = event.clientX.toString() + 'px'; + this.topPosition = (event.clientY + window.pageYOffset).toString() + 'px'; + this.renderer.setStyle(this.temporaryTextElement.nativeElement, 'display', 'initial'); + this.temporaryTextElement.nativeElement.focus(); + let textListener = () => { + this.drawingsEventSource.textAdded.emit( + new TextAddedDataEvent( + this.temporaryTextElement.nativeElement.innerText.replace(/\n$/, ''), + event.clientX, + event.clientY + ) + ); this.deactivateTextAdding(); - this.mapListener = addTextListener; - this.svg.addEventListener('click', this.mapListener as EventListenerOrEventListenerObject); - } + this.innerText = ''; + this.temporaryTextElement.nativeElement.innerText = ''; + this.temporaryTextElement.nativeElement.removeEventListener('focusout', this.textListener); + this.renderer.setStyle(this.temporaryTextElement.nativeElement, 'display', 'none'); + }; + this.textListener = textListener; + this.temporaryTextElement.nativeElement.addEventListener('focusout', this.textListener); + }; - deactivateTextAdding(){ - this.svg.removeEventListener('click', this.mapListener as EventListenerOrEventListenerObject); - } + this.deactivateTextAdding(); + this.mapListener = addTextListener; + this.svg.addEventListener('click', this.mapListener as EventListenerOrEventListenerObject); + } - activateTextEditing(){ - const rootElement = select(this.svg); + deactivateTextAdding() { + this.svg.removeEventListener('click', this.mapListener as EventListenerOrEventListenerObject); + } - rootElement.selectAll('text.text_element') - .on("dblclick", (elem, index, textElements) => { - this.renderer.setStyle(this.temporaryTextElement.nativeElement, 'display', 'initial'); - this.editedElement = elem; + activateTextEditing() { + const rootElement = select(this.svg); - select(textElements[index]) - .attr("visibility", "hidden"); + rootElement + .selectAll('text.text_element') + .on('dblclick', (elem, index, textElements) => { + this.renderer.setStyle(this.temporaryTextElement.nativeElement, 'display', 'initial'); + this.editedElement = elem; - select(textElements[index]) - .classed("editingMode", true); + select(textElements[index]).attr('visibility', 'hidden'); - this.editingDrawingId = textElements[index].parentElement.parentElement.getAttribute("drawing_id"); - var transformData = textElements[index].parentElement.getAttribute("transform").split(/\(|\)/); - var x = Number(transformData[1].split(/,/)[0]) + this.context.getZeroZeroTransformationPoint().x; - var y = Number(transformData[1].split(/,/)[1]) + this.context.getZeroZeroTransformationPoint().y; - this.leftPosition = x.toString() + 'px'; - this.topPosition = y.toString() + 'px'; - this.temporaryTextElement.nativeElement.innerText = elem.text; - - let listener = () => { - let innerText = this.temporaryTextElement.nativeElement.innerText; - this.drawingsEventSource.textEdited.emit(new TextEditedDataEvent(this.editingDrawingId, innerText.replace(/\n$/, ""), this.editedElement)); - - rootElement.selectAll('text.editingMode') - .attr("visibility", "visible") - .classed("editingMode", false); - - this.innerText = ''; - this.temporaryTextElement.nativeElement.innerText = ''; - this.temporaryTextElement.nativeElement.removeEventListener("focusout", this.textListener); + select(textElements[index]).classed('editingMode', true); - this.renderer.setStyle(this.temporaryTextElement.nativeElement, 'display', 'none'); - }; - this.textListener = listener; - this.temporaryTextElement.nativeElement.addEventListener("focusout", this.textListener); - this.temporaryTextElement.nativeElement.focus(); - }); - } + this.editingDrawingId = textElements[index].parentElement.parentElement.getAttribute('drawing_id'); + var transformData = textElements[index].parentElement.getAttribute('transform').split(/\(|\)/); + var x = Number(transformData[1].split(/,/)[0]) + this.context.getZeroZeroTransformationPoint().x; + var y = Number(transformData[1].split(/,/)[1]) + this.context.getZeroZeroTransformationPoint().y; + this.leftPosition = x.toString() + 'px'; + this.topPosition = y.toString() + 'px'; + this.temporaryTextElement.nativeElement.innerText = elem.text; - ngOnDestroy(){ - this.textAddingSubscription.unsubscribe(); - } + this.renderer.setStyle(this.temporaryTextElement.nativeElement, 'color', elem.fill); + this.renderer.setStyle(this.temporaryTextElement.nativeElement, 'font-family', elem.font_family); + this.renderer.setStyle(this.temporaryTextElement.nativeElement, 'font-size', `${elem.font_size}pt`); + this.renderer.setStyle(this.temporaryTextElement.nativeElement, 'font-weight', elem.font_weight); + + let listener = () => { + let innerText = this.temporaryTextElement.nativeElement.innerText; + this.drawingsEventSource.textEdited.emit( + new TextEditedDataEvent(this.editingDrawingId, innerText.replace(/\n$/, ''), this.editedElement) + ); + + rootElement + .selectAll('text.editingMode') + .attr('visibility', 'visible') + .classed('editingMode', false); + + this.innerText = ''; + this.temporaryTextElement.nativeElement.innerText = ''; + this.temporaryTextElement.nativeElement.removeEventListener('focusout', this.textListener); + + this.clearStyle(); + this.renderer.setStyle(this.temporaryTextElement.nativeElement, 'display', 'none'); + }; + this.textListener = listener; + this.temporaryTextElement.nativeElement.addEventListener('focusout', this.textListener); + this.temporaryTextElement.nativeElement.focus(); + }); + } + + ngOnDestroy() { + this.textAddingSubscription.unsubscribe(); + } + + clearStyle() { + this.renderer.setStyle(this.temporaryTextElement.nativeElement, 'color', '#000000'); + this.renderer.setStyle(this.temporaryTextElement.nativeElement, 'font-family', 'Noto Sans'); + this.renderer.setStyle(this.temporaryTextElement.nativeElement, 'font-size', '11pt'); + this.renderer.setStyle(this.temporaryTextElement.nativeElement, 'font-weight', 'bold'); + } } diff --git a/src/app/cartography/converters/converter.ts b/src/app/cartography/converters/converter.ts index 3bf7ea3e..17226eed 100644 --- a/src/app/cartography/converters/converter.ts +++ b/src/app/cartography/converters/converter.ts @@ -1,3 +1,3 @@ export interface Converter { - convert(obj: F): T; + convert(obj: F): T; } diff --git a/src/app/cartography/converters/map/drawing-to-map-drawing-converter.ts b/src/app/cartography/converters/map/drawing-to-map-drawing-converter.ts index 26a7af35..2c43cf80 100644 --- a/src/app/cartography/converters/map/drawing-to-map-drawing-converter.ts +++ b/src/app/cartography/converters/map/drawing-to-map-drawing-converter.ts @@ -1,15 +1,13 @@ -import { Injectable } from "@angular/core"; - -import { Converter } from "../converter"; -import { Drawing } from "../../models/drawing"; -import { MapDrawing } from "../../models/map/map-drawing"; +import { Injectable } from '@angular/core'; +import { Converter } from '../converter'; +import { Drawing } from '../../models/drawing'; +import { MapDrawing } from '../../models/map/map-drawing'; @Injectable() export class DrawingToMapDrawingConverter implements Converter { - constructor( - ) {} - + constructor() {} + convert(drawing: Drawing) { const mapDrawing = new MapDrawing(); mapDrawing.id = drawing.drawing_id; diff --git a/src/app/cartography/converters/map/label-to-map-label-converter.ts b/src/app/cartography/converters/map/label-to-map-label-converter.ts index 77a3b2e4..0d1f0095 100644 --- a/src/app/cartography/converters/map/label-to-map-label-converter.ts +++ b/src/app/cartography/converters/map/label-to-map-label-converter.ts @@ -1,13 +1,12 @@ -import { Injectable } from "@angular/core"; +import { Injectable } from '@angular/core'; -import { Converter } from "../converter"; -import { Label } from "../../models/label"; -import { MapLabel } from "../../models/map/map-label"; +import { Converter } from '../converter'; +import { Label } from '../../models/label'; +import { MapLabel } from '../../models/map/map-label'; import { FontBBoxCalculator } from '../../helpers/font-bbox-calculator'; import { CssFixer } from '../../helpers/css-fixer'; import { FontFixer } from '../../helpers/font-fixer'; - @Injectable() export class LabelToMapLabelConverter implements Converter { constructor( @@ -15,7 +14,7 @@ export class LabelToMapLabelConverter implements Converter { private cssFixer: CssFixer, private fontFixer: FontFixer ) {} - convert(label: Label, paramaters?: {[node_id: string]: string}) { + convert(label: Label, paramaters?: { [node_id: string]: string }) { const mapLabel = new MapLabel(); mapLabel.rotation = label.rotation; mapLabel.style = label.style; @@ -33,7 +32,7 @@ export class LabelToMapLabelConverter implements Converter { const fixedCss = this.cssFixer.fix(mapLabel.style); const fixedFont = this.fontFixer.fixStyles(fixedCss); const box = this.fontBBoxCalculator.calculate(mapLabel.text, fixedFont); - + if (mapLabel.x !== null) { mapLabel.x += 3; } diff --git a/src/app/cartography/converters/map/link-node-to-map-link-node-converter.ts b/src/app/cartography/converters/map/link-node-to-map-link-node-converter.ts index 794ccc16..66039723 100644 --- a/src/app/cartography/converters/map/link-node-to-map-link-node-converter.ts +++ b/src/app/cartography/converters/map/link-node-to-map-link-node-converter.ts @@ -1,29 +1,26 @@ -import { Injectable } from "@angular/core"; - -import { Converter } from "../converter"; -import { LabelToMapLabelConverter } from "./label-to-map-label-converter"; -import { LinkNode } from "../../../models/link-node"; -import { MapLinkNode } from "../../models/map/map-link-node"; +import { Injectable } from '@angular/core'; +import { Converter } from '../converter'; +import { LabelToMapLabelConverter } from './label-to-map-label-converter'; +import { LinkNode } from '../../../models/link-node'; +import { MapLinkNode } from '../../models/map/map-link-node'; @Injectable() export class LinkNodeToMapLinkNodeConverter implements Converter { - constructor( - private labelToMapLabel: LabelToMapLabelConverter, - ) {} - - convert(linkNode: LinkNode, paramaters?: {[link_id: string]: string}) { - const mapLinkNode = new MapLinkNode(); - mapLinkNode.nodeId = linkNode.node_id; - mapLinkNode.adapterNumber = linkNode.adapter_number; - mapLinkNode.portNumber = linkNode.port_number; - mapLinkNode.label = this.labelToMapLabel.convert(linkNode.label); + constructor(private labelToMapLabel: LabelToMapLabelConverter) {} - if (paramaters !== undefined) { - mapLinkNode.linkId = paramaters.link_id; - mapLinkNode.id = `${mapLinkNode.nodeId}-${mapLinkNode.linkId}`; - } + convert(linkNode: LinkNode, paramaters?: { [link_id: string]: string }) { + const mapLinkNode = new MapLinkNode(); + mapLinkNode.nodeId = linkNode.node_id; + mapLinkNode.adapterNumber = linkNode.adapter_number; + mapLinkNode.portNumber = linkNode.port_number; + mapLinkNode.label = this.labelToMapLabel.convert(linkNode.label); - return mapLinkNode; + if (paramaters !== undefined) { + mapLinkNode.linkId = paramaters.link_id; + mapLinkNode.id = `${mapLinkNode.nodeId}-${mapLinkNode.linkId}`; } + + return mapLinkNode; + } } diff --git a/src/app/cartography/converters/map/link-to-map-link-converter.ts b/src/app/cartography/converters/map/link-to-map-link-converter.ts index 71c052f4..c2946f08 100644 --- a/src/app/cartography/converters/map/link-to-map-link-converter.ts +++ b/src/app/cartography/converters/map/link-to-map-link-converter.ts @@ -1,26 +1,23 @@ -import { Injectable } from "@angular/core"; - -import { Converter } from "../converter"; -import { LinkNodeToMapLinkNodeConverter } from "./link-node-to-map-link-node-converter"; -import { Link } from "../../../models/link"; -import { MapLink } from "../../models/map/map-link"; +import { Injectable } from '@angular/core'; +import { Converter } from '../converter'; +import { LinkNodeToMapLinkNodeConverter } from './link-node-to-map-link-node-converter'; +import { Link } from '../../../models/link'; +import { MapLink } from '../../models/map/map-link'; @Injectable() export class LinkToMapLinkConverter implements Converter { - constructor( - private linkNodeToMapLinkNode: LinkNodeToMapLinkNodeConverter - ) {} - - convert(link: Link) { - const mapLink = new MapLink(); - mapLink.id = link.link_id; - mapLink.captureFileName = link.capture_file_name; - mapLink.captureFilePath = link.capture_file_path; - mapLink.capturing = link.capturing; - mapLink.linkType = link.link_type; - mapLink.nodes = link.nodes.map((linkNode) => this.linkNodeToMapLinkNode.convert(linkNode,{ link_id: link.link_id })); - mapLink.projectId = link.project_id; - return mapLink; - } + constructor(private linkNodeToMapLinkNode: LinkNodeToMapLinkNodeConverter) {} + + convert(link: Link) { + const mapLink = new MapLink(); + mapLink.id = link.link_id; + mapLink.captureFileName = link.capture_file_name; + mapLink.captureFilePath = link.capture_file_path; + mapLink.capturing = link.capturing; + mapLink.linkType = link.link_type; + mapLink.nodes = link.nodes.map(linkNode => this.linkNodeToMapLinkNode.convert(linkNode, { link_id: link.link_id })); + mapLink.projectId = link.project_id; + return mapLink; + } } diff --git a/src/app/cartography/converters/map/map-drawing-to-drawing-converter.ts b/src/app/cartography/converters/map/map-drawing-to-drawing-converter.ts index 04347c0e..01edbc61 100644 --- a/src/app/cartography/converters/map/map-drawing-to-drawing-converter.ts +++ b/src/app/cartography/converters/map/map-drawing-to-drawing-converter.ts @@ -1,24 +1,23 @@ -import { Injectable } from "@angular/core"; - -import { Converter } from "../converter"; -import { Drawing } from "../../models/drawing"; -import { MapDrawing } from "../../models/map/map-drawing"; +import { Injectable } from '@angular/core'; +import { Converter } from '../converter'; +import { Drawing } from '../../models/drawing'; +import { MapDrawing } from '../../models/map/map-drawing'; @Injectable() export class MapDrawingToDrawingConverter implements Converter { - constructor( - ) {} - - convert(mapDrawing: MapDrawing) { - const drawing = new Drawing(); - drawing.drawing_id = mapDrawing.id; - drawing.project_id = mapDrawing.projectId; - drawing.rotation = mapDrawing.rotation; - drawing.svg = mapDrawing.svg; - drawing.x = mapDrawing.x; - drawing.y = mapDrawing.y; - drawing.z = mapDrawing.z; - return drawing; - } + constructor() {} + + convert(mapDrawing: MapDrawing) { + const drawing = new Drawing(); + drawing.drawing_id = mapDrawing.id; + drawing.project_id = mapDrawing.projectId; + drawing.rotation = mapDrawing.rotation; + drawing.svg = mapDrawing.svg; + drawing.x = mapDrawing.x; + drawing.y = mapDrawing.y; + drawing.z = mapDrawing.z; + drawing.element = mapDrawing.element; + return drawing; + } } diff --git a/src/app/cartography/converters/map/map-drawing-to-svg-converter.ts b/src/app/cartography/converters/map/map-drawing-to-svg-converter.ts index 812c3a22..cc1cb9b4 100644 --- a/src/app/cartography/converters/map/map-drawing-to-svg-converter.ts +++ b/src/app/cartography/converters/map/map-drawing-to-svg-converter.ts @@ -7,25 +7,37 @@ import { EllipseElement } from '../../models/drawings/ellipse-element'; import { LineElement } from '../../models/drawings/line-element'; import { TextElement } from '../../models/drawings/text-element'; - @Injectable() export class MapDrawingToSvgConverter implements Converter { - constructor( - ) {} + constructor() {} - convert(mapDrawing: MapDrawing) { - let elem = ``; + convert(mapDrawing: MapDrawing) { + let elem = ``; - if (mapDrawing.element instanceof RectElement) { - elem = ``; - } else if (mapDrawing.element instanceof EllipseElement) { - elem = ``; - } else if (mapDrawing.element instanceof LineElement) { - elem = `` - } else if (mapDrawing.element instanceof TextElement) { - elem = `${mapDrawing.element.text}`; - } else return ""; + if (mapDrawing.element instanceof RectElement) { + elem = ``; + } else if (mapDrawing.element instanceof EllipseElement) { + elem = ``; + } else if (mapDrawing.element instanceof LineElement) { + elem = ``; + } else if (mapDrawing.element instanceof TextElement) { + elem = `${ + mapDrawing.element.text + }`; + } else return ''; - return `${elem}`; - } -} \ No newline at end of file + return `${elem}`; + } +} diff --git a/src/app/cartography/converters/map/map-label-to-label-converter.ts b/src/app/cartography/converters/map/map-label-to-label-converter.ts index 821eaa54..d6aea518 100644 --- a/src/app/cartography/converters/map/map-label-to-label-converter.ts +++ b/src/app/cartography/converters/map/map-label-to-label-converter.ts @@ -1,13 +1,12 @@ -import { Injectable } from "@angular/core"; +import { Injectable } from '@angular/core'; -import { Converter } from "../converter"; -import { Label } from "../../models/label"; -import { MapLabel } from "../../models/map/map-label"; +import { Converter } from '../converter'; +import { Label } from '../../models/label'; +import { MapLabel } from '../../models/map/map-label'; import { FontBBoxCalculator } from '../../helpers/font-bbox-calculator'; import { CssFixer } from '../../helpers/css-fixer'; import { FontFixer } from '../../helpers/font-fixer'; - @Injectable() export class MapLabelToLabelConverter implements Converter { constructor( diff --git a/src/app/cartography/converters/map/map-link-node-to-link-node-converter.ts b/src/app/cartography/converters/map/map-link-node-to-link-node-converter.ts index 1f8e5c98..7e2f739f 100644 --- a/src/app/cartography/converters/map/map-link-node-to-link-node-converter.ts +++ b/src/app/cartography/converters/map/map-link-node-to-link-node-converter.ts @@ -1,23 +1,20 @@ -import { Injectable } from "@angular/core"; - -import { Converter } from "../converter"; -import { MapLinkNode } from "../../models/map/map-link-node"; -import { MapLabelToLabelConverter } from "./map-label-to-label-converter"; -import { LinkNode } from "../../../models/link-node"; +import { Injectable } from '@angular/core'; +import { Converter } from '../converter'; +import { MapLinkNode } from '../../models/map/map-link-node'; +import { MapLabelToLabelConverter } from './map-label-to-label-converter'; +import { LinkNode } from '../../../models/link-node'; @Injectable() export class MapLinkNodeToLinkNodeConverter implements Converter { - constructor( - private mapLabelToLabel: MapLabelToLabelConverter - ) {} - - convert(mapLinkNode: MapLinkNode) { - const linkNode = new LinkNode(); - linkNode.node_id = mapLinkNode.nodeId; - linkNode.adapter_number = mapLinkNode.adapterNumber; - linkNode.port_number = mapLinkNode.portNumber; - linkNode.label = this.mapLabelToLabel.convert(mapLinkNode.label); - return linkNode; - } + constructor(private mapLabelToLabel: MapLabelToLabelConverter) {} + + convert(mapLinkNode: MapLinkNode) { + const linkNode = new LinkNode(); + linkNode.node_id = mapLinkNode.nodeId; + linkNode.adapter_number = mapLinkNode.adapterNumber; + linkNode.port_number = mapLinkNode.portNumber; + linkNode.label = this.mapLabelToLabel.convert(mapLinkNode.label); + return linkNode; + } } diff --git a/src/app/cartography/converters/map/map-link-to-link-converter.ts b/src/app/cartography/converters/map/map-link-to-link-converter.ts index b892d69f..e7db39dc 100644 --- a/src/app/cartography/converters/map/map-link-to-link-converter.ts +++ b/src/app/cartography/converters/map/map-link-to-link-converter.ts @@ -1,26 +1,23 @@ -import { Injectable } from "@angular/core"; - -import { Converter } from "../converter"; -import { MapLinkNodeToLinkNodeConverter } from "./map-link-node-to-link-node-converter"; -import { Link } from "../../../models/link"; -import { MapLink } from "../../models/map/map-link"; +import { Injectable } from '@angular/core'; +import { Converter } from '../converter'; +import { MapLinkNodeToLinkNodeConverter } from './map-link-node-to-link-node-converter'; +import { Link } from '../../../models/link'; +import { MapLink } from '../../models/map/map-link'; @Injectable() export class MapLinkToLinkConverter implements Converter { - constructor( - private mapLinkNodeToMapLinkNode: MapLinkNodeToLinkNodeConverter - ) {} + constructor(private mapLinkNodeToMapLinkNode: MapLinkNodeToLinkNodeConverter) {} - convert(mapLink: MapLink) { - const link = new Link(); - link.link_id = mapLink.id; - link.capture_file_name = mapLink.captureFileName; - link.capture_file_path = mapLink.captureFilePath; - link.capturing = mapLink.capturing; - link.link_type = mapLink.linkType; - link.nodes = mapLink.nodes.map((mapLinkNode) => this.mapLinkNodeToMapLinkNode.convert(mapLinkNode)); - link.project_id = mapLink.projectId; - return link; - } + convert(mapLink: MapLink) { + const link = new Link(); + link.link_id = mapLink.id; + link.capture_file_name = mapLink.captureFileName; + link.capture_file_path = mapLink.captureFilePath; + link.capturing = mapLink.capturing; + link.link_type = mapLink.linkType; + link.nodes = mapLink.nodes.map(mapLinkNode => this.mapLinkNodeToMapLinkNode.convert(mapLinkNode)); + link.project_id = mapLink.projectId; + return link; + } } diff --git a/src/app/cartography/converters/map/map-node-to-node-converter.ts b/src/app/cartography/converters/map/map-node-to-node-converter.ts index b2cadb27..492d466b 100644 --- a/src/app/cartography/converters/map/map-node-to-node-converter.ts +++ b/src/app/cartography/converters/map/map-node-to-node-converter.ts @@ -1,19 +1,15 @@ -import { Injectable } from "@angular/core"; - -import { Converter } from "../converter"; -import { MapNode } from "../../models/map/map-node"; -import { MapLabelToLabelConverter } from "./map-label-to-label-converter"; -import { MapPortToPortConverter } from "./map-port-to-port-converter"; -import { Node } from "../../models/node"; +import { Injectable } from '@angular/core'; +import { Converter } from '../converter'; +import { MapNode } from '../../models/map/map-node'; +import { MapLabelToLabelConverter } from './map-label-to-label-converter'; +import { MapPortToPortConverter } from './map-port-to-port-converter'; +import { Node } from '../../models/node'; @Injectable() export class MapNodeToNodeConverter implements Converter { - constructor( - private mapLabelToLabel: MapLabelToLabelConverter, - private mapPortToPort: MapPortToPortConverter - ) {} - + constructor(private mapLabelToLabel: MapLabelToLabelConverter, private mapPortToPort: MapPortToPortConverter) {} + convert(mapNode: MapNode) { const node = new Node(); node.node_id = mapNode.id; @@ -29,7 +25,7 @@ export class MapNodeToNodeConverter implements Converter { node.node_type = mapNode.nodeType; node.port_name_format = mapNode.portNameFormat; node.port_segment_size = mapNode.portSegmentSize; - node.ports = mapNode.ports ? mapNode.ports.map((mapPort) => this.mapPortToPort.convert(mapPort)) : []; + node.ports = mapNode.ports ? mapNode.ports.map(mapPort => this.mapPortToPort.convert(mapPort)) : []; node.project_id = mapNode.projectId; node.status = mapNode.status; node.symbol = mapNode.symbol; diff --git a/src/app/cartography/converters/map/map-port-to-port-converter.ts b/src/app/cartography/converters/map/map-port-to-port-converter.ts index 0d40fec3..aecd4fde 100644 --- a/src/app/cartography/converters/map/map-port-to-port-converter.ts +++ b/src/app/cartography/converters/map/map-port-to-port-converter.ts @@ -1,19 +1,18 @@ -import { Injectable } from "@angular/core"; - -import { Converter } from "../converter"; -import { Port } from "../../../models/port"; -import { MapPort } from "../../models/map/map-port"; +import { Injectable } from '@angular/core'; +import { Converter } from '../converter'; +import { Port } from '../../../models/port'; +import { MapPort } from '../../models/map/map-port'; @Injectable() export class MapPortToPortConverter implements Converter { - convert(mapPort: MapPort) { - const port = new Port(); - port.adapter_number = mapPort.adapterNumber; - port.link_type = mapPort.linkType; - port.name = mapPort.name; - port.port_number = mapPort.portNumber; - port.short_name = mapPort.shortName; - return port; - } + convert(mapPort: MapPort) { + const port = new Port(); + port.adapter_number = mapPort.adapterNumber; + port.link_type = mapPort.linkType; + port.name = mapPort.name; + port.port_number = mapPort.portNumber; + port.short_name = mapPort.shortName; + return port; + } } diff --git a/src/app/cartography/converters/map/map-symbol-to-symbol-converter.ts b/src/app/cartography/converters/map/map-symbol-to-symbol-converter.ts index d48152e1..9503e80b 100644 --- a/src/app/cartography/converters/map/map-symbol-to-symbol-converter.ts +++ b/src/app/cartography/converters/map/map-symbol-to-symbol-converter.ts @@ -1,18 +1,17 @@ -import { Injectable } from "@angular/core"; - -import { Converter } from "../converter"; -import { MapSymbol } from "../../models/map/map-symbol"; -import { Symbol } from "../../../models/symbol"; +import { Injectable } from '@angular/core'; +import { Converter } from '../converter'; +import { MapSymbol } from '../../models/map/map-symbol'; +import { Symbol } from '../../../models/symbol'; @Injectable() export class MapSymbolToSymbolConverter implements Converter { - convert(mapSymbol: MapSymbol) { - const symbol = new Symbol(); - symbol.symbol_id = mapSymbol.id; - symbol.builtin = mapSymbol.builtin; - symbol.filename = mapSymbol.filename; - symbol.raw = mapSymbol.raw; - return symbol; - } + convert(mapSymbol: MapSymbol) { + const symbol = new Symbol(); + symbol.symbol_id = mapSymbol.id; + symbol.builtin = mapSymbol.builtin; + symbol.filename = mapSymbol.filename; + symbol.raw = mapSymbol.raw; + return symbol; + } } diff --git a/src/app/cartography/converters/map/node-to-map-node-converter.ts b/src/app/cartography/converters/map/node-to-map-node-converter.ts index 5fa3e558..1a739069 100644 --- a/src/app/cartography/converters/map/node-to-map-node-converter.ts +++ b/src/app/cartography/converters/map/node-to-map-node-converter.ts @@ -1,15 +1,14 @@ -import { Injectable } from "@angular/core"; +import { Injectable } from '@angular/core'; -import { Converter } from "../converter"; -import { MapNode } from "../../models/map/map-node"; -import { Node } from "../../models/node"; -import { LabelToMapLabelConverter } from "./label-to-map-label-converter"; -import { PortToMapPortConverter } from "./port-to-map-port-converter"; +import { Converter } from '../converter'; +import { MapNode } from '../../models/map/map-node'; +import { Node } from '../../models/node'; +import { LabelToMapLabelConverter } from './label-to-map-label-converter'; +import { PortToMapPortConverter } from './port-to-map-port-converter'; import { FontBBoxCalculator } from '../../helpers/font-bbox-calculator'; import { CssFixer } from '../../helpers/css-fixer'; import { FontFixer } from '../../helpers/font-fixer'; - @Injectable() export class NodeToMapNodeConverter implements Converter { constructor( @@ -19,7 +18,7 @@ export class NodeToMapNodeConverter implements Converter { private cssFixer: CssFixer, private fontFixer: FontFixer ) {} - + convert(node: Node) { const mapNode = new MapNode(); mapNode.id = node.node_id; @@ -35,7 +34,7 @@ export class NodeToMapNodeConverter implements Converter { mapNode.nodeType = node.node_type; mapNode.portNameFormat = node.port_name_format; mapNode.portSegmentSize = node.port_segment_size; - mapNode.ports = node.ports.map((port) => this.portToMapPort.convert(port)); + mapNode.ports = node.ports.map(port => this.portToMapPort.convert(port)); mapNode.projectId = node.project_id; mapNode.status = node.status; mapNode.symbol = node.symbol; @@ -45,17 +44,16 @@ export class NodeToMapNodeConverter implements Converter { mapNode.y = node.y; mapNode.z = node.z; - if (mapNode.label !== undefined) { const fixedCss = this.cssFixer.fix(mapNode.label.style); const fixedFont = this.fontFixer.fixStyles(fixedCss); const box = this.fontBBoxCalculator.calculate(mapNode.label.text, fixedFont); if (node.label.x === null || node.label.y === null) { - mapNode.label.x = node.width / 2. - box.width / 2. + 3; + mapNode.label.x = node.width / 2 - box.width / 2 + 3; mapNode.label.y = -8; } } - return mapNode; + return mapNode; } } diff --git a/src/app/cartography/converters/map/port-to-map-port-converter.ts b/src/app/cartography/converters/map/port-to-map-port-converter.ts index 32fc12bc..8a348ae1 100644 --- a/src/app/cartography/converters/map/port-to-map-port-converter.ts +++ b/src/app/cartography/converters/map/port-to-map-port-converter.ts @@ -1,19 +1,18 @@ -import { Injectable } from "@angular/core"; - -import { Converter } from "../converter"; -import { Port } from "../../../models/port"; -import { MapPort } from "../../models/map/map-port"; +import { Injectable } from '@angular/core'; +import { Converter } from '../converter'; +import { Port } from '../../../models/port'; +import { MapPort } from '../../models/map/map-port'; @Injectable() export class PortToMapPortConverter implements Converter { - convert(port: Port) { - const mapPort = new MapPort(); - mapPort.adapterNumber = port.adapter_number; - mapPort.linkType = port.link_type; - mapPort.name = port.name; - mapPort.portNumber = port.port_number; - mapPort.shortName = port.short_name; - return mapPort; - } + convert(port: Port) { + const mapPort = new MapPort(); + mapPort.adapterNumber = port.adapter_number; + mapPort.linkType = port.link_type; + mapPort.name = port.name; + mapPort.portNumber = port.port_number; + mapPort.shortName = port.short_name; + return mapPort; + } } diff --git a/src/app/cartography/converters/map/symbol-to-map-symbol-converter.ts b/src/app/cartography/converters/map/symbol-to-map-symbol-converter.ts index c02f8964..46f1077d 100644 --- a/src/app/cartography/converters/map/symbol-to-map-symbol-converter.ts +++ b/src/app/cartography/converters/map/symbol-to-map-symbol-converter.ts @@ -1,18 +1,17 @@ -import { Injectable } from "@angular/core"; - -import { Converter } from "../converter"; -import { Symbol } from "../../../models/symbol"; -import { MapSymbol } from "../../models/map/map-symbol"; +import { Injectable } from '@angular/core'; +import { Converter } from '../converter'; +import { Symbol } from '../../../models/symbol'; +import { MapSymbol } from '../../models/map/map-symbol'; @Injectable() export class SymbolToMapSymbolConverter implements Converter { - convert(symbol: Symbol) { - const mapSymbol = new MapSymbol(); - mapSymbol.id = symbol.symbol_id; - mapSymbol.builtin = symbol.builtin; - mapSymbol.filename = symbol.filename; - mapSymbol.raw = symbol.raw; - return mapSymbol; - } + convert(symbol: Symbol) { + const mapSymbol = new MapSymbol(); + mapSymbol.id = symbol.symbol_id; + mapSymbol.builtin = symbol.builtin; + mapSymbol.filename = symbol.filename; + mapSymbol.raw = symbol.raw; + return mapSymbol; + } } diff --git a/src/app/cartography/converters/styles-to-font-converter.spec.ts b/src/app/cartography/converters/styles-to-font-converter.spec.ts index 5eda7947..8726a6b1 100644 --- a/src/app/cartography/converters/styles-to-font-converter.spec.ts +++ b/src/app/cartography/converters/styles-to-font-converter.spec.ts @@ -1,7 +1,6 @@ -import { Font } from "../models/font"; +import { Font } from '../models/font'; import { StylesToFontConverter } from './styles-to-font-converter'; - describe('StylesToFontConverter', () => { let converter: StylesToFontConverter; @@ -10,15 +9,14 @@ describe('StylesToFontConverter', () => { }); it('should parse fonts from styles', () => { - const styles = "font-family: TypeWriter; font-size: 10px; font-weight: bold"; + const styles = 'font-family: TypeWriter; font-size: 10px; font-weight: bold'; const expectedFont: Font = { - 'font_family': 'TypeWriter', - 'font_size': 10, - 'font_weight': 'bold' + font_family: 'TypeWriter', + font_size: 10, + font_weight: 'bold' }; expect(converter.convert(styles)).toEqual(expectedFont); }); - }); diff --git a/src/app/cartography/converters/styles-to-font-converter.ts b/src/app/cartography/converters/styles-to-font-converter.ts index 0c2f8826..8ca22442 100644 --- a/src/app/cartography/converters/styles-to-font-converter.ts +++ b/src/app/cartography/converters/styles-to-font-converter.ts @@ -1,41 +1,40 @@ import * as csstree from 'css-tree'; -import { Injectable } from "@angular/core"; +import { Injectable } from '@angular/core'; import { Converter } from './converter'; import { Font } from '../models/font'; - @Injectable() export class StylesToFontConverter implements Converter { convert(styles: string) { const font: Font = { - 'font_family': undefined, - 'font_size': undefined, - 'font_weight': undefined + font_family: undefined, + font_size: undefined, + font_weight: undefined }; const ast = csstree.parse(styles, { - 'context': 'declarationList' + context: 'declarationList' }); - ast.children.forEach((child) => { + ast.children.forEach(child => { if (child.property === 'font-size') { - child.value.children.forEach((value) => { + child.value.children.forEach(value => { if (value.type === 'Dimension') { font.font_size = parseInt(value.value); } }); } if (child.property === 'font-family') { - child.value.children.forEach((value) => { - if (value.type === "Identifier") { + child.value.children.forEach(value => { + if (value.type === 'Identifier') { font.font_family = value.name; } }); } if (child.property === 'font-weight') { - child.value.children.forEach((value) => { - if (value.type === "Identifier") { + child.value.children.forEach(value => { + if (value.type === 'Identifier') { font.font_weight = value.name; } }); diff --git a/src/app/cartography/d3-map.imports.ts b/src/app/cartography/d3-map.imports.ts index 25aa4e27..ee956b81 100644 --- a/src/app/cartography/d3-map.imports.ts +++ b/src/app/cartography/d3-map.imports.ts @@ -19,23 +19,23 @@ import { DrawingWidget } from './widgets/drawing'; import { LabelWidget } from './widgets/label'; export const D3_MAP_IMPORTS = [ - GraphLayout, - LinksWidget, - NodesWidget, - NodeWidget, - LabelWidget, - DrawingsWidget, - DrawingLineWidget, - SelectionTool, - MovingTool, - LayersWidget, - LinkWidget, - InterfaceStatusWidget, - InterfaceLabelWidget, - EllipseDrawingWidget, - ImageDrawingWidget, - LineDrawingWidget, - RectDrawingWidget, - TextDrawingWidget, - DrawingWidget + GraphLayout, + LinksWidget, + NodesWidget, + NodeWidget, + LabelWidget, + DrawingsWidget, + DrawingLineWidget, + SelectionTool, + MovingTool, + LayersWidget, + LinkWidget, + InterfaceStatusWidget, + InterfaceLabelWidget, + EllipseDrawingWidget, + ImageDrawingWidget, + LineDrawingWidget, + RectDrawingWidget, + TextDrawingWidget, + DrawingWidget ]; diff --git a/src/app/cartography/datasources/datasource.spec.ts b/src/app/cartography/datasources/datasource.spec.ts index 27588056..558b50dd 100644 --- a/src/app/cartography/datasources/datasource.spec.ts +++ b/src/app/cartography/datasources/datasource.spec.ts @@ -1,17 +1,15 @@ -import { DataSource } from "./datasource"; +import { DataSource } from './datasource'; class Item { constructor(public id: string, public property1?: string, public property2?: string) {} } - class TestDataSource extends DataSource { protected getItemKey(item: Item) { return item.id; - }; + } } - describe('TestDataSource', () => { let dataSource: TestDataSource; let data: Item[]; @@ -25,72 +23,65 @@ describe('TestDataSource', () => { describe('Item can be added', () => { beforeEach(() => { - dataSource.add(new Item("test1", "property1")); + dataSource.add(new Item('test1', 'property1')); }); it('item should be in data', () => { - expect(data).toEqual([new Item("test1", "property1")]); + expect(data).toEqual([new Item('test1', 'property1')]); }); }); - describe('Item can be added when key duplocates', () => { beforeEach(() => { - dataSource.add(new Item("test1", "property1")); - dataSource.add(new Item("test1", "property2")); + dataSource.add(new Item('test1', 'property1')); + dataSource.add(new Item('test1', 'property2')); }); it('item should be in data', () => { - expect(data).toEqual([new Item("test1", "property2")]); + expect(data).toEqual([new Item('test1', 'property2')]); }); }); describe('Items can be set', () => { beforeEach(() => { - dataSource.set([new Item("test1", "property1"), new Item("test2", "property2")]); + dataSource.set([new Item('test1', 'property1'), new Item('test2', 'property2')]); }); it('items should be in data', () => { - expect(data).toEqual([new Item("test1", "property1"), new Item("test2", "property2")]); + expect(data).toEqual([new Item('test1', 'property1'), new Item('test2', 'property2')]); }); }); describe('Items can be removed', () => { beforeEach(() => { - dataSource.set([new Item("test1", "property1"), new Item("test2", "property2")]); - dataSource.remove(new Item("test1", "property1")); + dataSource.set([new Item('test1', 'property1'), new Item('test2', 'property2')]); + dataSource.remove(new Item('test1', 'property1')); }); it('item should not be in data', () => { - expect(data).toEqual([new Item("test2", "property2")]); + expect(data).toEqual([new Item('test2', 'property2')]); }); }); describe('Item can be updated', () => { beforeEach(() => { - dataSource.set([new Item("test1", "property1", "another"), new Item("test2", "property2")]); - dataSource.update(new Item("test1", "property3")); + dataSource.set([new Item('test1', 'property1', 'another'), new Item('test2', 'property2')]); + dataSource.update(new Item('test1', 'property3')); }); it('item should be updated', () => { - expect(data).toEqual([ - new Item("test1", "property3"), - new Item("test2", "property2") - ]); + expect(data).toEqual([new Item('test1', 'property3'), new Item('test2', 'property2')]); }); - }); describe('Items should be cleared', () => { beforeEach(() => { - dataSource.set([new Item("test1", "property1", "another"), new Item("test2", "property2")]); + dataSource.set([new Item('test1', 'property1', 'another'), new Item('test2', 'property2')]); dataSource.clear(); }); it('items should be cleared', () => { expect(data).toEqual([]); }); - }); - }); diff --git a/src/app/cartography/datasources/datasource.ts b/src/app/cartography/datasources/datasource.ts index a51819a0..ce5aaf06 100644 --- a/src/app/cartography/datasources/datasource.ts +++ b/src/app/cartography/datasources/datasource.ts @@ -1,4 +1,4 @@ -import { BehaviorSubject, Subject } from "rxjs"; +import { BehaviorSubject, Subject } from 'rxjs'; export abstract class DataSource { protected data: T[] = []; @@ -20,19 +20,20 @@ export abstract class DataSource { } public set(data: T[]) { - data.forEach((item) => { + data.forEach(item => { const index = this.findIndex(item); if (index >= 0) { const updated = Object.assign(this.data[index], item); this.data[index] = updated; - } - else { + } else { this.data.push(item); } }); - - const toRemove = this.data.filter((item) => data.filter((i) => this.getItemKey(i) === this.getItemKey(item)).length === 0); - toRemove.forEach((item) => this.remove(item)); + + const toRemove = this.data.filter( + item => data.filter(i => this.getItemKey(i) === this.getItemKey(item)).length === 0 + ); + toRemove.forEach(item => this.remove(item)); this.dataChange.next(this.data); } diff --git a/src/app/cartography/datasources/drawings-datasource.spec.ts b/src/app/cartography/datasources/drawings-datasource.spec.ts index 8a5f4fb8..9404dfd6 100644 --- a/src/app/cartography/datasources/drawings-datasource.spec.ts +++ b/src/app/cartography/datasources/drawings-datasource.spec.ts @@ -1,6 +1,5 @@ -import { DrawingsDataSource } from "./drawings-datasource"; -import { Drawing } from "../models/drawing"; - +import { DrawingsDataSource } from './drawings-datasource'; +import { Drawing } from '../models/drawing'; describe('DrawingsDataSource', () => { let dataSource: DrawingsDataSource; @@ -16,18 +15,17 @@ describe('DrawingsDataSource', () => { describe('Drawing can be updated', () => { beforeEach(() => { const drawing = new Drawing(); - drawing.drawing_id = "1"; - drawing.project_id = "project1"; + drawing.drawing_id = '1'; + drawing.project_id = 'project1'; dataSource.add(drawing); - drawing.project_id = "project2"; + drawing.project_id = 'project2'; dataSource.update(drawing); }); it('project_id should change', () => { - expect(data[0].drawing_id).toEqual("1"); - expect(data[0].project_id).toEqual("project2"); + expect(data[0].drawing_id).toEqual('1'); + expect(data[0].project_id).toEqual('project2'); }); }); - }); diff --git a/src/app/cartography/datasources/drawings-datasource.ts b/src/app/cartography/datasources/drawings-datasource.ts index 1eae4e4b..a5f4c67f 100644 --- a/src/app/cartography/datasources/drawings-datasource.ts +++ b/src/app/cartography/datasources/drawings-datasource.ts @@ -1,8 +1,7 @@ -import { Injectable } from "@angular/core"; - -import { DataSource } from "./datasource"; -import { Drawing } from "../models/drawing"; +import { Injectable } from '@angular/core'; +import { DataSource } from './datasource'; +import { Drawing } from '../models/drawing'; @Injectable() export class DrawingsDataSource extends DataSource { diff --git a/src/app/cartography/datasources/links-datasource.spec.ts b/src/app/cartography/datasources/links-datasource.spec.ts index 54453716..107f49e6 100644 --- a/src/app/cartography/datasources/links-datasource.spec.ts +++ b/src/app/cartography/datasources/links-datasource.spec.ts @@ -1,6 +1,5 @@ -import { LinksDataSource } from "./links-datasource"; -import { Link } from "../../models/link"; - +import { LinksDataSource } from './links-datasource'; +import { Link } from '../../models/link'; describe('LinksDataSource', () => { let dataSource: LinksDataSource; @@ -16,18 +15,17 @@ describe('LinksDataSource', () => { describe('Link can be updated', () => { beforeEach(() => { const link = new Link(); - link.link_id = "1"; - link.project_id = "project-1"; + link.link_id = '1'; + link.project_id = 'project-1'; dataSource.add(link); - link.project_id = "project-2"; + link.project_id = 'project-2'; dataSource.update(link); }); it('project_id should change', () => { - expect(data[0].link_id).toEqual("1"); - expect(data[0].project_id).toEqual("project-2"); + expect(data[0].link_id).toEqual('1'); + expect(data[0].project_id).toEqual('project-2'); }); }); - }); diff --git a/src/app/cartography/datasources/links-datasource.ts b/src/app/cartography/datasources/links-datasource.ts index 0c743f11..ee626e19 100644 --- a/src/app/cartography/datasources/links-datasource.ts +++ b/src/app/cartography/datasources/links-datasource.ts @@ -1,8 +1,7 @@ -import { Injectable } from "@angular/core"; - -import { DataSource } from "./datasource"; -import { Link } from "../../models/link"; +import { Injectable } from '@angular/core'; +import { DataSource } from './datasource'; +import { Link } from '../../models/link'; @Injectable() export class LinksDataSource extends DataSource { diff --git a/src/app/cartography/datasources/map-datasource.ts b/src/app/cartography/datasources/map-datasource.ts index 21f9f31b..8fbe3466 100644 --- a/src/app/cartography/datasources/map-datasource.ts +++ b/src/app/cartography/datasources/map-datasource.ts @@ -1,9 +1,9 @@ -import { DataSource } from "./datasource"; -import { MapNode } from "../models/map/map-node"; -import { MapLink } from "../models/map/map-link"; -import { MapDrawing } from "../models/map/map-drawing"; -import { MapSymbol } from "../models/map/map-symbol"; -import { Injectable } from "@angular/core"; +import { DataSource } from './datasource'; +import { MapNode } from '../models/map/map-node'; +import { MapLink } from '../models/map/map-link'; +import { MapDrawing } from '../models/map/map-drawing'; +import { MapSymbol } from '../models/map/map-symbol'; +import { Injectable } from '@angular/core'; export interface Indexed { id: number | string; @@ -25,4 +25,4 @@ export class MapLinksDataSource extends MapDataSource {} export class MapDrawingsDataSource extends MapDataSource {} @Injectable() -export class MapSymbolsDataSource extends MapDataSource {} \ No newline at end of file +export class MapSymbolsDataSource extends MapDataSource {} diff --git a/src/app/cartography/datasources/nodes-datasource.spec.ts b/src/app/cartography/datasources/nodes-datasource.spec.ts index 98f3d74b..f0f87fee 100644 --- a/src/app/cartography/datasources/nodes-datasource.spec.ts +++ b/src/app/cartography/datasources/nodes-datasource.spec.ts @@ -1,6 +1,5 @@ -import { NodesDataSource } from "./nodes-datasource"; -import { Node } from "../models/node"; - +import { NodesDataSource } from './nodes-datasource'; +import { Node } from '../models/node'; describe('NodesDataSource', () => { let dataSource: NodesDataSource; @@ -16,18 +15,17 @@ describe('NodesDataSource', () => { describe('Node can be updated', () => { beforeEach(() => { const node = new Node(); - node.node_id = "1"; - node.name = "Node 1"; + node.node_id = '1'; + node.name = 'Node 1'; dataSource.add(node); - node.name = "Node 2"; + node.name = 'Node 2'; dataSource.update(node); }); it('name should change', () => { - expect(data[0].node_id).toEqual("1"); - expect(data[0].name).toEqual("Node 2"); + expect(data[0].node_id).toEqual('1'); + expect(data[0].name).toEqual('Node 2'); }); }); - }); diff --git a/src/app/cartography/datasources/nodes-datasource.ts b/src/app/cartography/datasources/nodes-datasource.ts index f6a5b785..d6277283 100644 --- a/src/app/cartography/datasources/nodes-datasource.ts +++ b/src/app/cartography/datasources/nodes-datasource.ts @@ -1,8 +1,7 @@ -import { Injectable } from "@angular/core"; - -import { Node } from "../models/node"; -import { DataSource } from "./datasource"; +import { Injectable } from '@angular/core'; +import { Node } from '../models/node'; +import { DataSource } from './datasource'; @Injectable() export class NodesDataSource extends DataSource { diff --git a/src/app/cartography/datasources/symbols-datasource.spec.ts b/src/app/cartography/datasources/symbols-datasource.spec.ts index c709b07a..f9d3d461 100644 --- a/src/app/cartography/datasources/symbols-datasource.spec.ts +++ b/src/app/cartography/datasources/symbols-datasource.spec.ts @@ -1,6 +1,5 @@ -import { SymbolsDataSource } from "./symbols-datasource"; -import { Symbol } from "../../models/symbol"; - +import { SymbolsDataSource } from './symbols-datasource'; +import { Symbol } from '../../models/symbol'; describe('SymbolsDataSource', () => { let dataSource: SymbolsDataSource; @@ -16,18 +15,17 @@ describe('SymbolsDataSource', () => { describe('Symbol can be updated', () => { beforeEach(() => { const symbol = new Symbol(); - symbol.symbol_id = "1"; - symbol.filename = "test-1"; + symbol.symbol_id = '1'; + symbol.filename = 'test-1'; dataSource.add(symbol); - symbol.filename = "test-2"; + symbol.filename = 'test-2'; dataSource.update(symbol); }); it('filename should change', () => { - expect(data[0].symbol_id).toEqual("1"); - expect(data[0].filename).toEqual("test-2"); + expect(data[0].symbol_id).toEqual('1'); + expect(data[0].filename).toEqual('test-2'); }); }); - }); diff --git a/src/app/cartography/datasources/symbols-datasource.ts b/src/app/cartography/datasources/symbols-datasource.ts index a00b9492..599b5eb5 100644 --- a/src/app/cartography/datasources/symbols-datasource.ts +++ b/src/app/cartography/datasources/symbols-datasource.ts @@ -1,8 +1,7 @@ -import { Injectable } from "@angular/core"; - -import { DataSource } from "./datasource"; -import { Symbol } from "../../models/symbol"; +import { Injectable } from '@angular/core'; +import { DataSource } from './datasource'; +import { Symbol } from '../../models/symbol'; @Injectable() export class SymbolsDataSource extends DataSource { diff --git a/src/app/cartography/events/draggable.ts b/src/app/cartography/events/draggable.ts index e06237a6..3d39ab13 100644 --- a/src/app/cartography/events/draggable.ts +++ b/src/app/cartography/events/draggable.ts @@ -1,6 +1,6 @@ -import { EventEmitter } from "@angular/core"; -import { drag, DraggedElementBaseType } from "d3-drag"; -import { event } from "d3-selection"; +import { EventEmitter } from '@angular/core'; +import { drag, DraggedElementBaseType } from 'd3-drag'; +import { event } from 'd3-selection'; class DraggableEvent { public x: number; @@ -10,25 +10,19 @@ class DraggableEvent { } export class DraggableStart extends DraggableEvent { - constructor( - public datum: T - ){ + constructor(public datum: T) { super(); } } export class DraggableDrag extends DraggableEvent { - constructor( - public datum: T - ){ + constructor(public datum: T) { super(); } } export class DraggableEnd extends DraggableEvent { - constructor( - public datum: T - ){ + constructor(public datum: T) { super(); } } @@ -73,4 +67,4 @@ export class Draggable { this.end.emit(evt); }); } -} \ No newline at end of file +} diff --git a/src/app/cartography/events/drawings-event-source.ts b/src/app/cartography/events/drawings-event-source.ts index f2b1f136..fa4d09f5 100644 --- a/src/app/cartography/events/drawings-event-source.ts +++ b/src/app/cartography/events/drawings-event-source.ts @@ -1,7 +1,12 @@ -import { Injectable, EventEmitter } from "@angular/core"; -import { DraggedDataEvent, ResizedDataEvent, TextAddedDataEvent, TextEditedDataEvent, AddedDataEvent } from "./event-source"; -import { MapDrawing } from "../models/map/map-drawing"; - +import { Injectable, EventEmitter } from '@angular/core'; +import { + DraggedDataEvent, + ResizedDataEvent, + TextAddedDataEvent, + TextEditedDataEvent, + AddedDataEvent +} from './event-source'; +import { MapDrawing } from '../models/map/map-drawing'; @Injectable() export class DrawingsEventSource { @@ -10,7 +15,7 @@ export class DrawingsEventSource { public selected = new EventEmitter(); public pointToAddSelected = new EventEmitter(); public saved = new EventEmitter(); - + public textAdded = new EventEmitter(); public textEdited = new EventEmitter(); public textSaved = new EventEmitter(); diff --git a/src/app/cartography/events/event-source.ts b/src/app/cartography/events/event-source.ts index 49b6751b..a54e4d5d 100644 --- a/src/app/cartography/events/event-source.ts +++ b/src/app/cartography/events/event-source.ts @@ -1,52 +1,32 @@ import { TextElement } from '../models/drawings/text-element'; +import { MapDrawing } from '../models/map/map-drawing'; export class DataEventSource { - constructor( - public datum: T, - public dx: number, - public dy: number - ) {} + constructor(public datum: T, public dx: number, public dy: number) {} } export class DraggedDataEvent extends DataEventSource {} export class ResizedDataEvent { - constructor( - public datum: T, - public x: number, - public y: number, - public width: number, - public height: number - ) {} + constructor(public datum: T, public x: number, public y: number, public width: number, public height: number) {} } export class AddedDataEvent { - constructor( - public x: number, - public y: number - ) {} + constructor(public x: number, public y: number) {} } export class ClickedDataEvent { - constructor( - public datum: T, - public x: number, - public y: number - ) {} + constructor(public datum: T, public x: number, public y: number) {} } export class TextAddedDataEvent { - constructor( - public savedText: string, - public x: number, - public y: number - ) {} + constructor(public savedText: string, public x: number, public y: number) {} } export class TextEditedDataEvent { - constructor( - public textDrawingId: string, - public editedText: string, - public textElement: TextElement - ) {} + constructor(public textDrawingId: string, public editedText: string, public textElement: TextElement) {} +} + +export class DrawingContextMenu { + constructor(public event: any, public drawing: MapDrawing) {} } diff --git a/src/app/cartography/events/links-event-source.ts b/src/app/cartography/events/links-event-source.ts index 71d091cd..df1f2981 100644 --- a/src/app/cartography/events/links-event-source.ts +++ b/src/app/cartography/events/links-event-source.ts @@ -1,8 +1,7 @@ -import { Injectable, EventEmitter } from "@angular/core"; -import { MapLinkCreated } from "./links"; -import { MapLinkNode } from "../models/map/map-link-node"; -import { DraggedDataEvent } from "./event-source"; - +import { Injectable, EventEmitter } from '@angular/core'; +import { MapLinkCreated } from './links'; +import { MapLinkNode } from '../models/map/map-link-node'; +import { DraggedDataEvent } from './event-source'; @Injectable() export class LinksEventSource { diff --git a/src/app/cartography/events/links.ts b/src/app/cartography/events/links.ts index a110be62..17dae648 100644 --- a/src/app/cartography/events/links.ts +++ b/src/app/cartography/events/links.ts @@ -1,12 +1,11 @@ -import { MapNode } from "../models/map/map-node"; -import { MapPort } from "../models/map/map-port"; - +import { MapNode } from '../models/map/map-node'; +import { MapPort } from '../models/map/map-port'; export class MapLinkCreated { constructor( - public sourceNode: MapNode, - public sourcePort: MapPort, - public targetNode: MapNode, - public targetPort: MapPort + public sourceNode: MapNode, + public sourcePort: MapPort, + public targetNode: MapNode, + public targetPort: MapPort ) {} } diff --git a/src/app/cartography/events/nodes-event-source.ts b/src/app/cartography/events/nodes-event-source.ts index 4f7d3c3e..02406606 100644 --- a/src/app/cartography/events/nodes-event-source.ts +++ b/src/app/cartography/events/nodes-event-source.ts @@ -1,8 +1,7 @@ -import { Injectable, EventEmitter } from "@angular/core"; -import { DraggedDataEvent, ClickedDataEvent } from "./event-source"; -import { MapNode } from "../models/map/map-node"; -import { MapLabel } from "../models/map/map-label"; - +import { Injectable, EventEmitter } from '@angular/core'; +import { DraggedDataEvent, ClickedDataEvent } from './event-source'; +import { MapNode } from '../models/map/map-node'; +import { MapLabel } from '../models/map/map-label'; @Injectable() export class NodesEventSource { diff --git a/src/app/cartography/events/nodes.ts b/src/app/cartography/events/nodes.ts index 9e98ac91..1ab79418 100644 --- a/src/app/cartography/events/nodes.ts +++ b/src/app/cartography/events/nodes.ts @@ -1,10 +1,7 @@ -import { MapNode } from "../models/map/map-node"; +import { MapNode } from '../models/map/map-node'; class NodeEvent { - constructor( - public event: any, - public node: MapNode - ) {} + constructor(public event: any, public node: MapNode) {} } export class NodeClicked extends NodeEvent {} diff --git a/src/app/cartography/events/resizing.ts b/src/app/cartography/events/resizing.ts index 7ce2cc1b..adb2f69a 100644 --- a/src/app/cartography/events/resizing.ts +++ b/src/app/cartography/events/resizing.ts @@ -1,7 +1,7 @@ export class ResizingEnd { - public datum: T; - public x: number; - public y: number; - public width: number; - public height: number; -} \ No newline at end of file + public datum: T; + public x: number; + public y: number; + public width: number; + public height: number; +} diff --git a/src/app/cartography/events/selection-event-source.ts b/src/app/cartography/events/selection-event-source.ts index c97aef44..0acc3c9e 100644 --- a/src/app/cartography/events/selection-event-source.ts +++ b/src/app/cartography/events/selection-event-source.ts @@ -1,9 +1,8 @@ -import { Injectable } from "@angular/core"; -import { Subject } from "rxjs"; -import { Rectangle } from "../models/rectangle"; - +import { Injectable } from '@angular/core'; +import { Subject } from 'rxjs'; +import { Rectangle } from '../models/rectangle'; @Injectable() export class SelectionEventSource { public selected = new Subject(); -} \ No newline at end of file +} diff --git a/src/app/cartography/helpers/canvas-size-detector.ts b/src/app/cartography/helpers/canvas-size-detector.ts index 0efa347a..3d1e71a3 100644 --- a/src/app/cartography/helpers/canvas-size-detector.ts +++ b/src/app/cartography/helpers/canvas-size-detector.ts @@ -1,18 +1,17 @@ -import { Injectable } from "@angular/core"; -import { Size } from "../models/size"; - +import { Injectable } from '@angular/core'; +import { Size } from '../models/size'; @Injectable() export class CanvasSizeDetector { - public getOptimalSize(minWidth: number, minHeight: number) { - let width = document.documentElement.clientWidth; - let height = document.documentElement.clientHeight; - if (minWidth > width) { - width = minWidth; - } - if (minHeight > height) { - height = minHeight; - } - return new Size(width, height); + public getOptimalSize(minWidth: number, minHeight: number) { + let width = document.documentElement.clientWidth; + let height = document.documentElement.clientHeight; + if (minWidth > width) { + width = minWidth; } -} \ No newline at end of file + if (minHeight > height) { + height = minHeight; + } + return new Size(width, height); + } +} diff --git a/src/app/cartography/helpers/css-fixer.spec.ts b/src/app/cartography/helpers/css-fixer.spec.ts index 6350c48b..1adf7d56 100644 --- a/src/app/cartography/helpers/css-fixer.spec.ts +++ b/src/app/cartography/helpers/css-fixer.spec.ts @@ -1,5 +1,4 @@ - -import { CssFixer } from "./css-fixer"; +import { CssFixer } from './css-fixer'; describe('CssFixer', () => { let fixer: CssFixer; @@ -9,22 +8,22 @@ describe('CssFixer', () => { }); it('should fix font-size', () => { - const css = "font-size: 10.0;"; - expect(fixer.fix(css)).toEqual("font-size:10.0pt"); + const css = 'font-size: 10.0;'; + expect(fixer.fix(css)).toEqual('font-size:10.0pt'); }); it('should not fix font-size when pt unit is defined', () => { - const css = "font-size: 10.0pt;"; - expect(fixer.fix(css)).toEqual("font-size:10.0pt"); + const css = 'font-size: 10.0pt;'; + expect(fixer.fix(css)).toEqual('font-size:10.0pt'); }); it('should not fix font-size when px unit is defined', () => { - const css = "font-size: 10.0px;"; - expect(fixer.fix(css)).toEqual("font-size:10.0px"); + const css = 'font-size: 10.0px;'; + expect(fixer.fix(css)).toEqual('font-size:10.0px'); }); it('should fix font-size with other attributes', () => { - const css = "font: Verdana; font-size: 10.0;"; - expect(fixer.fix(css)).toEqual("font:Verdana;font-size:10.0pt"); + const css = 'font: Verdana; font-size: 10.0;'; + expect(fixer.fix(css)).toEqual('font:Verdana;font-size:10.0pt'); }); }); diff --git a/src/app/cartography/helpers/css-fixer.ts b/src/app/cartography/helpers/css-fixer.ts index c5a8a226..15eb330d 100644 --- a/src/app/cartography/helpers/css-fixer.ts +++ b/src/app/cartography/helpers/css-fixer.ts @@ -1,23 +1,21 @@ import * as csstree from 'css-tree'; -import { Injectable } from "@angular/core"; - +import { Injectable } from '@angular/core'; @Injectable() export class CssFixer { - public fix(styles: string): string { const ast = csstree.parse(styles, { - 'context': 'declarationList' + context: 'declarationList' }); // fixes font-size when unit (pt|px) is not defined - ast.children.forEach((child) => { + ast.children.forEach(child => { if (child.property === 'font-size') { - child.value.children.forEach((value) => { + child.value.children.forEach(value => { if (value.type === 'Number') { const fontSize = value.value.toString(); - if (!(fontSize.indexOf("pt") >= 0 || fontSize.indexOf("px") >= 0)) { + if (!(fontSize.indexOf('pt') >= 0 || fontSize.indexOf('px') >= 0)) { value.value = `${fontSize}pt`; } } diff --git a/src/app/cartography/helpers/default-drawings-factory.ts b/src/app/cartography/helpers/default-drawings-factory.ts index 197f6d9e..036679b4 100644 --- a/src/app/cartography/helpers/default-drawings-factory.ts +++ b/src/app/cartography/helpers/default-drawings-factory.ts @@ -1,4 +1,4 @@ -import { Injectable } from "@angular/core"; +import { Injectable } from '@angular/core'; import { TextElementFactory } from './drawings-factory/text-element-factory'; import { EllipseElementFactory } from './drawings-factory/ellipse-element-factory'; import { RectangleElementFactory } from './drawings-factory/rectangle-element-factory'; @@ -8,29 +8,29 @@ import { MapDrawing } from '../models/map/map-drawing'; @Injectable() export class DefaultDrawingsFactory { - private factory: DrawingElementFactory; - private availableFactories: {[ key: string]: DrawingElementFactory}; + private factory: DrawingElementFactory; + private availableFactories: { [key: string]: DrawingElementFactory }; - constructor( - private textElementFactory: TextElementFactory, - private ellipseElementFactory: EllipseElementFactory, - private rectangleElementFactory: RectangleElementFactory, - private lineElementFactory: LineElementFactory - ){ - this.availableFactories = { - 'text': this.textElementFactory, - 'ellipse': this.ellipseElementFactory, - 'rectangle': this.rectangleElementFactory, - 'line': this.lineElementFactory - }; - } + constructor( + private textElementFactory: TextElementFactory, + private ellipseElementFactory: EllipseElementFactory, + private rectangleElementFactory: RectangleElementFactory, + private lineElementFactory: LineElementFactory + ) { + this.availableFactories = { + text: this.textElementFactory, + ellipse: this.ellipseElementFactory, + rectangle: this.rectangleElementFactory, + line: this.lineElementFactory + }; + } - getDrawingMock(drawingType: string){ - this.factory = this.availableFactories[drawingType]; + getDrawingMock(drawingType: string) { + this.factory = this.availableFactories[drawingType]; - let mapDrawing = new MapDrawing(); - mapDrawing.element = this.factory.getDrawingElement(); + let mapDrawing = new MapDrawing(); + mapDrawing.element = this.factory.getDrawingElement(); - return mapDrawing; - } + return mapDrawing; + } } diff --git a/src/app/cartography/helpers/drawings-factory/drawing-element-factory.ts b/src/app/cartography/helpers/drawings-factory/drawing-element-factory.ts index cfbe51cc..75022dfa 100644 --- a/src/app/cartography/helpers/drawings-factory/drawing-element-factory.ts +++ b/src/app/cartography/helpers/drawings-factory/drawing-element-factory.ts @@ -1,5 +1,5 @@ import { DrawingElement } from '../../models/drawings/drawing-element'; -export interface DrawingElementFactory{ - getDrawingElement(): DrawingElement; +export interface DrawingElementFactory { + getDrawingElement(): DrawingElement; } diff --git a/src/app/cartography/helpers/drawings-factory/ellipse-element-factory.ts b/src/app/cartography/helpers/drawings-factory/ellipse-element-factory.ts index 845ef462..b2b6b7e7 100644 --- a/src/app/cartography/helpers/drawings-factory/ellipse-element-factory.ts +++ b/src/app/cartography/helpers/drawings-factory/ellipse-element-factory.ts @@ -4,20 +4,19 @@ import { EllipseElement } from '../../models/drawings/ellipse-element'; import { Injectable } from '@angular/core'; @Injectable() -export class EllipseElementFactory implements DrawingElementFactory{ - - getDrawingElement(): DrawingElement{ - let ellipseElement = new EllipseElement(); - ellipseElement.fill = "#ffffff"; - ellipseElement.fill_opacity = 1.0; - ellipseElement.stroke = "#000000"; - ellipseElement.stroke_width = 2; - ellipseElement.cx = 100; - ellipseElement.cy = 100; - ellipseElement.rx = 100; - ellipseElement.ry = 100; - ellipseElement.width = 200; - ellipseElement.height = 200; - return ellipseElement; - } +export class EllipseElementFactory implements DrawingElementFactory { + getDrawingElement(): DrawingElement { + let ellipseElement = new EllipseElement(); + ellipseElement.fill = '#ffffff'; + ellipseElement.fill_opacity = 1.0; + ellipseElement.stroke = '#000000'; + ellipseElement.stroke_width = 2; + ellipseElement.cx = 100; + ellipseElement.cy = 100; + ellipseElement.rx = 100; + ellipseElement.ry = 100; + ellipseElement.width = 200; + ellipseElement.height = 200; + return ellipseElement; + } } diff --git a/src/app/cartography/helpers/drawings-factory/line-element-factory.ts b/src/app/cartography/helpers/drawings-factory/line-element-factory.ts index 3e176800..e5bf1fb7 100644 --- a/src/app/cartography/helpers/drawings-factory/line-element-factory.ts +++ b/src/app/cartography/helpers/drawings-factory/line-element-factory.ts @@ -4,18 +4,17 @@ import { LineElement } from '../../models/drawings/line-element'; import { Injectable } from '@angular/core'; @Injectable() -export class LineElementFactory implements DrawingElementFactory{ - - getDrawingElement(): DrawingElement{ - let lineElement = new LineElement(); - lineElement.stroke = "#000000"; - lineElement.stroke_width = 2; - lineElement.x1 = 0; - lineElement.x2 = 200; - lineElement.y1 = 0; - lineElement.y2 = 0; - lineElement.width = 100; - lineElement.height = 0; - return lineElement; - } +export class LineElementFactory implements DrawingElementFactory { + getDrawingElement(): DrawingElement { + let lineElement = new LineElement(); + lineElement.stroke = '#000000'; + lineElement.stroke_width = 2; + lineElement.x1 = 0; + lineElement.x2 = 200; + lineElement.y1 = 0; + lineElement.y2 = 0; + lineElement.width = 100; + lineElement.height = 0; + return lineElement; + } } diff --git a/src/app/cartography/helpers/drawings-factory/rectangle-element-factory.ts b/src/app/cartography/helpers/drawings-factory/rectangle-element-factory.ts index 1db569f9..96ea65fa 100644 --- a/src/app/cartography/helpers/drawings-factory/rectangle-element-factory.ts +++ b/src/app/cartography/helpers/drawings-factory/rectangle-element-factory.ts @@ -4,16 +4,15 @@ import { RectElement } from '../../models/drawings/rect-element'; import { Injectable } from '@angular/core'; @Injectable() -export class RectangleElementFactory implements DrawingElementFactory{ - - getDrawingElement() : DrawingElement { - let rectElement = new RectElement(); - rectElement.fill = "#ffffff"; - rectElement.fill_opacity = 1.0; - rectElement.stroke = "#000000"; - rectElement.stroke_width = 2; - rectElement.width = 200; - rectElement.height = 100; - return rectElement; - } +export class RectangleElementFactory implements DrawingElementFactory { + getDrawingElement(): DrawingElement { + let rectElement = new RectElement(); + rectElement.fill = '#ffffff'; + rectElement.fill_opacity = 1.0; + rectElement.stroke = '#000000'; + rectElement.stroke_width = 2; + rectElement.width = 200; + rectElement.height = 100; + return rectElement; + } } diff --git a/src/app/cartography/helpers/drawings-factory/text-element-factory.ts b/src/app/cartography/helpers/drawings-factory/text-element-factory.ts index 24aeb672..48449a3f 100644 --- a/src/app/cartography/helpers/drawings-factory/text-element-factory.ts +++ b/src/app/cartography/helpers/drawings-factory/text-element-factory.ts @@ -4,17 +4,16 @@ import { TextElement } from '../../models/drawings/text-element'; import { Injectable } from '@angular/core'; @Injectable() -export class TextElementFactory implements DrawingElementFactory{ - - getDrawingElement(): DrawingElement { - let textElement = new TextElement(); - textElement.height = 100; - textElement.width = 100; - textElement.fill = "#000000"; - textElement.fill_opacity = 0; - textElement.font_family = "Noto Sans"; - textElement.font_size = 11; - textElement.font_weight = "bold"; - return textElement; - } +export class TextElementFactory implements DrawingElementFactory { + getDrawingElement(): DrawingElement { + let textElement = new TextElement(); + textElement.height = 100; + textElement.width = 100; + textElement.fill = '#000000'; + textElement.fill_opacity = 0; + textElement.font_family = 'Noto Sans'; + textElement.font_size = 11; + textElement.font_weight = 'bold'; + return textElement; + } } diff --git a/src/app/cartography/helpers/font-bbox-calculator.spec.ts b/src/app/cartography/helpers/font-bbox-calculator.spec.ts index 42d295d0..aa608add 100644 --- a/src/app/cartography/helpers/font-bbox-calculator.spec.ts +++ b/src/app/cartography/helpers/font-bbox-calculator.spec.ts @@ -1,5 +1,4 @@ -import { FontBBoxCalculator } from "./font-bbox-calculator"; - +import { FontBBoxCalculator } from './font-bbox-calculator'; describe('FontBBoxCalculator', () => { let calculator: FontBBoxCalculator; @@ -9,14 +8,14 @@ describe('FontBBoxCalculator', () => { }); it('should calculate font width and height', () => { - const box = calculator.calculate("My text", "font-family:Arial; font-size: 12px; font-weight:bold"); + const box = calculator.calculate('My text', 'font-family:Arial; font-size: 12px; font-weight:bold'); expect(box.height).toEqual(14); expect(box.width).toEqual(41.34375); }); xit('should calculate font width and height for different font', () => { - const box = calculator.calculate("My text", "font-family:Tahoma; font-size: 14px; font-weight:bold"); + const box = calculator.calculate('My text', 'font-family:Tahoma; font-size: 14px; font-weight:bold'); expect(box.height).toEqual(15); expect(box.width).toEqual(46.25); diff --git a/src/app/cartography/helpers/font-bbox-calculator.ts b/src/app/cartography/helpers/font-bbox-calculator.ts index cf689e9b..69a6dee7 100644 --- a/src/app/cartography/helpers/font-bbox-calculator.ts +++ b/src/app/cartography/helpers/font-bbox-calculator.ts @@ -1,13 +1,13 @@ -import { Injectable } from "@angular/core"; +import { Injectable } from '@angular/core'; @Injectable() export class FontBBoxCalculator { calculate(text: string, styles: string) { - const element = document.createElement("text"); + const element = document.createElement('text'); element.innerText = text; - element.setAttribute("fill", "#00000"); - element.setAttribute("fill-opacity", "0"); - element.setAttribute("style", styles); + element.setAttribute('fill', '#00000'); + element.setAttribute('fill-opacity', '0'); + element.setAttribute('style', styles); document.documentElement.appendChild(element); const bbox = element.getBoundingClientRect(); document.documentElement.removeChild(element); @@ -15,6 +15,6 @@ export class FontBBoxCalculator { return { width: bbox.width, height: bbox.height - } + }; } -} \ No newline at end of file +} diff --git a/src/app/cartography/helpers/font-fixer.spec.ts b/src/app/cartography/helpers/font-fixer.spec.ts index bab7fa33..273b8756 100644 --- a/src/app/cartography/helpers/font-fixer.spec.ts +++ b/src/app/cartography/helpers/font-fixer.spec.ts @@ -1,6 +1,5 @@ -import { FontFixer } from "./font-fixer"; -import { Font } from "../models/font"; - +import { FontFixer } from './font-fixer'; +import { Font } from '../models/font'; describe('FontFixer', () => { let fixer: FontFixer; @@ -11,41 +10,41 @@ describe('FontFixer', () => { it('should fix TypeWriter font and 10px size', () => { const font: Font = { - 'font_family': 'TypeWriter', - 'font_size': 10, - 'font_weight': 'bold' + font_family: 'TypeWriter', + font_size: 10, + font_weight: 'bold' }; - expect(fixer.fix(font)).toEqual( { - 'font_family': 'Noto Sans', - 'font_size': 11, - 'font_weight': 'bold' + expect(fixer.fix(font)).toEqual({ + font_family: 'Noto Sans', + font_size: 11, + font_weight: 'bold' }); }); it('should not fix other fonts', () => { const font: Font = { - 'font_family': 'OtherFont', - 'font_size': 11, - 'font_weight': 'bold' + font_family: 'OtherFont', + font_size: 11, + font_weight: 'bold' }; - expect(fixer.fix(font)).toEqual( { - 'font_family': 'OtherFont', - 'font_size': 11, - 'font_weight': 'bold' + expect(fixer.fix(font)).toEqual({ + font_family: 'OtherFont', + font_size: 11, + font_weight: 'bold' }); }); it('should fix TypeWriter font and 10px size in styles', () => { - const styles = "font-family: TypeWriter; font-size: 10px; font-weight: bold"; + const styles = 'font-family: TypeWriter; font-size: 10px; font-weight: bold'; - expect(fixer.fixStyles(styles)).toEqual( 'font-family:Noto Sans;font-size:11px;font-weight:bold'); + expect(fixer.fixStyles(styles)).toEqual('font-family:Noto Sans;font-size:11px;font-weight:bold'); }); it('should fix TypeWriter font and 10px size in styles with quotes', () => { const styles = 'font-family: "TypeWriter"; font-size: 10px; font-weight: bold'; - expect(fixer.fixStyles(styles)).toEqual( 'font-family:Noto Sans;font-size:11px;font-weight:bold'); + expect(fixer.fixStyles(styles)).toEqual('font-family:Noto Sans;font-size:11px;font-weight:bold'); }); }); diff --git a/src/app/cartography/helpers/font-fixer.ts b/src/app/cartography/helpers/font-fixer.ts index b44545f3..0c3c0f2c 100644 --- a/src/app/cartography/helpers/font-fixer.ts +++ b/src/app/cartography/helpers/font-fixer.ts @@ -1,16 +1,15 @@ import * as csstree from 'css-tree'; -import { Injectable } from "@angular/core"; -import { Font } from "../models/font"; - +import { Injectable } from '@angular/core'; +import { Font } from '../models/font'; /** * GNS3 GUI doesn't update font when cannot find font in user system, this fixer fixes it */ @Injectable() export class FontFixer { - static DEFAULT_FONT = "TypeWriter"; + static DEFAULT_FONT = 'TypeWriter'; static DEFAULT_SIZE = 10; - static REPLACE_BY_FONT = "Noto Sans"; + static REPLACE_BY_FONT = 'Noto Sans'; static REPLACE_BY_SIZE = 11; public fix(font: Font): Font { @@ -22,17 +21,17 @@ export class FontFixer { } public fixStyles(styles: string) { - const ast = csstree.parse(styles, { - 'context': 'declarationList' + const ast = csstree.parse(styles, { + context: 'declarationList' }); let fontFamilyPointer = null; let fontSizePointer = null; let isByIdentifier = true; - ast.children.forEach((child) => { + ast.children.forEach(child => { if (child.property === 'font-family') { - child.value.children.forEach((value) => { + child.value.children.forEach(value => { if (value.type === 'Identifier') { fontFamilyPointer = value; } @@ -43,7 +42,7 @@ export class FontFixer { }); } if (child.property === 'font-size') { - child.value.children.forEach((value) => { + child.value.children.forEach(value => { if (value.type === 'Dimension') { fontSizePointer = value; } @@ -62,8 +61,8 @@ export class FontFixer { } const fixedFont = this.fix({ - 'font_family': fontFamilyValue.split('"').join(''), - 'font_size': parseInt(fontSizeValue, 10), + font_family: fontFamilyValue.split('"').join(''), + font_size: parseInt(fontSizeValue, 10) } as Font); if (isByIdentifier) { diff --git a/src/app/cartography/helpers/in-rectangle-helper.spec.ts b/src/app/cartography/helpers/in-rectangle-helper.spec.ts index 0eed6901..06414819 100644 --- a/src/app/cartography/helpers/in-rectangle-helper.spec.ts +++ b/src/app/cartography/helpers/in-rectangle-helper.spec.ts @@ -1,7 +1,5 @@ -import { InRectangleHelper } from "./in-rectangle-helper"; -import { Rectangle } from "../models/rectangle"; - - +import { InRectangleHelper } from './in-rectangle-helper'; +import { Rectangle } from '../models/rectangle'; describe('InRectangleHelper', () => { let inRectangleHelper: InRectangleHelper; diff --git a/src/app/cartography/helpers/in-rectangle-helper.ts b/src/app/cartography/helpers/in-rectangle-helper.ts index a4d732b2..98c86239 100644 --- a/src/app/cartography/helpers/in-rectangle-helper.ts +++ b/src/app/cartography/helpers/in-rectangle-helper.ts @@ -1,12 +1,12 @@ -import { Injectable } from "@angular/core"; - -import { Rectangle } from "../models/rectangle"; +import { Injectable } from '@angular/core'; +import { Rectangle } from '../models/rectangle'; @Injectable() export class InRectangleHelper { public inRectangle(rectangle: Rectangle, x: number, y: number): boolean { - return (rectangle.x <= x && x < (rectangle.x + rectangle.width) - && rectangle.y <= y && y < (rectangle.y + rectangle.height)); + return ( + rectangle.x <= x && x < rectangle.x + rectangle.width && rectangle.y <= y && y < rectangle.y + rectangle.height + ); } } diff --git a/src/app/cartography/helpers/multi-link-calculator-helper.ts b/src/app/cartography/helpers/multi-link-calculator-helper.ts index d519bfa0..11c5c99e 100644 --- a/src/app/cartography/helpers/multi-link-calculator-helper.ts +++ b/src/app/cartography/helpers/multi-link-calculator-helper.ts @@ -1,6 +1,5 @@ -import { Injectable } from "@angular/core"; -import { MapLink } from "../models/map/map-link"; - +import { Injectable } from '@angular/core'; +import { MapLink } from '../models/map/map-link'; @Injectable() export class MultiLinkCalculatorHelper { @@ -8,9 +7,9 @@ export class MultiLinkCalculatorHelper { public linkTranslation( distance: number, - point0: {x: number, y: number}, - point1: {x: number, y: number}): {dx: number, dy: number} { - + point0: { x: number; y: number }, + point1: { x: number; y: number } + ): { dx: number; dy: number } { const x1_x0 = point1.x - point0.x; const y1_y0 = point1.y - point0.y; let x2_x0; @@ -20,7 +19,7 @@ export class MultiLinkCalculatorHelper { x2_x0 = 0; y2_y0 = distance; } else { - const angle = Math.atan((x1_x0) / (y1_y0)); + const angle = Math.atan(x1_x0 / y1_y0); x2_x0 = -distance * Math.cos(angle); y2_y0 = distance * Math.sin(angle); } @@ -35,14 +34,14 @@ export class MultiLinkCalculatorHelper { links.forEach((l: MapLink, i: number) => { const sid = l.source.id; const tid = l.target.id; - const key = (sid < tid ? sid + "," + tid : tid + "," + sid); + const key = sid < tid ? sid + ',' + tid : tid + ',' + sid; let idx = 1; if (!(key in links_from_nodes)) { links_from_nodes[key] = [i]; } else { idx = links_from_nodes[key].push(i); } - l.distance = (idx % 2 === 0 ? idx * this.LINK_WIDTH : (-idx + 1) * this.LINK_WIDTH); + l.distance = idx % 2 === 0 ? idx * this.LINK_WIDTH : (-idx + 1) * this.LINK_WIDTH; }); } } diff --git a/src/app/cartography/helpers/qt-dasharray-fixer.spec.ts b/src/app/cartography/helpers/qt-dasharray-fixer.spec.ts index 60cabad5..68c488d8 100644 --- a/src/app/cartography/helpers/qt-dasharray-fixer.spec.ts +++ b/src/app/cartography/helpers/qt-dasharray-fixer.spec.ts @@ -1,5 +1,4 @@ -import { QtDasharrayFixer } from "./qt-dasharray-fixer"; - +import { QtDasharrayFixer } from './qt-dasharray-fixer'; describe('QtDashArrayFixer', () => { let fixer: QtDasharrayFixer; diff --git a/src/app/cartography/helpers/qt-dasharray-fixer.ts b/src/app/cartography/helpers/qt-dasharray-fixer.ts index 7f204fe2..54f1ced6 100644 --- a/src/app/cartography/helpers/qt-dasharray-fixer.ts +++ b/src/app/cartography/helpers/qt-dasharray-fixer.ts @@ -1,5 +1,5 @@ -import { Injectable } from "@angular/core"; -import { Font } from "../models/font"; +import { Injectable } from '@angular/core'; +import { Font } from '../models/font'; /** * GNS3 GUI performs mapping from QT styles to SVG dasharray, but styles don't match diff --git a/src/app/cartography/helpers/svg-to-drawing-converter.spec.ts b/src/app/cartography/helpers/svg-to-drawing-converter.spec.ts index faf21bf8..05f00655 100644 --- a/src/app/cartography/helpers/svg-to-drawing-converter.spec.ts +++ b/src/app/cartography/helpers/svg-to-drawing-converter.spec.ts @@ -1,6 +1,5 @@ -import { SvgToDrawingConverter } from "./svg-to-drawing-converter"; -import { TextElement } from "../models/drawings/text-element"; - +import { SvgToDrawingConverter } from './svg-to-drawing-converter'; +import { TextElement } from '../models/drawings/text-element'; describe('SvgToDrawingHelper', () => { let svgToDrawingConverter: SvgToDrawingConverter; @@ -10,19 +9,20 @@ describe('SvgToDrawingHelper', () => { }); it('should raise Error on empty string', () => { - expect(() => svgToDrawingConverter.convert("")).toThrowError(Error); + expect(() => svgToDrawingConverter.convert('')).toThrowError(Error); }); it('should raise Error on no children', () => { - expect(() => svgToDrawingConverter.convert("")).toThrowError(Error); + expect(() => svgToDrawingConverter.convert('')).toThrowError(Error); }); it('should raise Error on unknown parser', () => { - expect(() => svgToDrawingConverter.convert("")).toThrowError(Error); + expect(() => svgToDrawingConverter.convert('')).toThrowError(Error); }); it('should parse width and height if defined', () => { - const svg = '' + + const svg = + '' + '' + 'Line' + '' + diff --git a/src/app/cartography/helpers/svg-to-drawing-converter.ts b/src/app/cartography/helpers/svg-to-drawing-converter.ts index 8653c0c0..27b70568 100644 --- a/src/app/cartography/helpers/svg-to-drawing-converter.ts +++ b/src/app/cartography/helpers/svg-to-drawing-converter.ts @@ -1,12 +1,11 @@ -import { Injectable } from "@angular/core"; -import { DrawingElement } from "../models/drawings/drawing-element"; -import { SvgConverter } from "./svg-to-drawing-converter/svg-converter"; -import { TextConverter } from "./svg-to-drawing-converter/text-converter"; -import { ImageConverter } from "./svg-to-drawing-converter/image-converter"; -import { RectConverter } from "./svg-to-drawing-converter/rect-converter"; -import { LineConverter } from "./svg-to-drawing-converter/line-converter"; -import { EllipseConverter } from "./svg-to-drawing-converter/ellipse-converter"; - +import { Injectable } from '@angular/core'; +import { DrawingElement } from '../models/drawings/drawing-element'; +import { SvgConverter } from './svg-to-drawing-converter/svg-converter'; +import { TextConverter } from './svg-to-drawing-converter/text-converter'; +import { ImageConverter } from './svg-to-drawing-converter/image-converter'; +import { RectConverter } from './svg-to-drawing-converter/rect-converter'; +import { LineConverter } from './svg-to-drawing-converter/line-converter'; +import { EllipseConverter } from './svg-to-drawing-converter/ellipse-converter'; @Injectable() export class SvgToDrawingConverter { @@ -16,11 +15,11 @@ export class SvgToDrawingConverter { constructor() { this.parser = new DOMParser(); this.elementParsers = { - 'text': new TextConverter(), - 'image': new ImageConverter(), - 'rect': new RectConverter(), - 'line': new LineConverter(), - 'ellipse': new EllipseConverter() + text: new TextConverter(), + image: new ImageConverter(), + rect: new RectConverter(), + line: new LineConverter(), + ellipse: new EllipseConverter() }; } @@ -60,6 +59,4 @@ export class SvgToDrawingConverter { return drawing; } - - } diff --git a/src/app/cartography/helpers/svg-to-drawing-converter/ellipse-converter.spec.ts b/src/app/cartography/helpers/svg-to-drawing-converter/ellipse-converter.spec.ts index fd720c7e..133ec4fd 100644 --- a/src/app/cartography/helpers/svg-to-drawing-converter/ellipse-converter.spec.ts +++ b/src/app/cartography/helpers/svg-to-drawing-converter/ellipse-converter.spec.ts @@ -1,5 +1,4 @@ -import { EllipseConverter } from "./ellipse-converter"; - +import { EllipseConverter } from './ellipse-converter'; describe('EllipseConverter', () => { let ellipseConverter: EllipseConverter; @@ -9,23 +8,23 @@ describe('EllipseConverter', () => { }); it('should parse attributes', () => { - const element = document.createElement("ellipse"); - element.setAttribute("fill", "#ffffff"); - element.setAttribute("fill-opacity", "1.0"); - element.setAttribute("stroke", "#000000"); - element.setAttribute("stroke-width", "2"); - element.setAttribute("stroke-dasharray", "5,25,25"); - element.setAttribute("cx", "63"); - element.setAttribute("cy", "59"); - element.setAttribute("rx", "63"); - element.setAttribute("ry", "59"); + const element = document.createElement('ellipse'); + element.setAttribute('fill', '#ffffff'); + element.setAttribute('fill-opacity', '1.0'); + element.setAttribute('stroke', '#000000'); + element.setAttribute('stroke-width', '2'); + element.setAttribute('stroke-dasharray', '5,25,25'); + element.setAttribute('cx', '63'); + element.setAttribute('cy', '59'); + element.setAttribute('rx', '63'); + element.setAttribute('ry', '59'); const drawing = ellipseConverter.convert(element); - expect(drawing.fill).toEqual("#ffffff"); + expect(drawing.fill).toEqual('#ffffff'); expect(drawing.fill_opacity).toEqual(1.0); - expect(drawing.stroke).toEqual("#000000"); + expect(drawing.stroke).toEqual('#000000'); expect(drawing.stroke_width).toEqual(2.0); - expect(drawing.stroke_dasharray).toEqual("5,25,25"); + expect(drawing.stroke_dasharray).toEqual('5,25,25'); expect(drawing.cx).toEqual(63); expect(drawing.cy).toEqual(59); expect(drawing.rx).toEqual(63); @@ -33,7 +32,7 @@ describe('EllipseConverter', () => { }); it('should parse with no attributes', () => { - const element = document.createElement("ellipse"); + const element = document.createElement('ellipse'); const drawing = ellipseConverter.convert(element); expect(drawing.fill).toBeUndefined(); diff --git a/src/app/cartography/helpers/svg-to-drawing-converter/ellipse-converter.ts b/src/app/cartography/helpers/svg-to-drawing-converter/ellipse-converter.ts index f6015d88..b72ba356 100644 --- a/src/app/cartography/helpers/svg-to-drawing-converter/ellipse-converter.ts +++ b/src/app/cartography/helpers/svg-to-drawing-converter/ellipse-converter.ts @@ -1,32 +1,31 @@ -import { SvgConverter } from "./svg-converter"; -import { EllipseElement } from "../../models/drawings/ellipse-element"; - +import { SvgConverter } from './svg-converter'; +import { EllipseElement } from '../../models/drawings/ellipse-element'; export class EllipseConverter implements SvgConverter { convert(element: Element): EllipseElement { const drawing = new EllipseElement(); - const fill = element.attributes.getNamedItem("fill"); + const fill = element.attributes.getNamedItem('fill'); if (fill) { drawing.fill = fill.value; } - const fill_opacity = element.attributes.getNamedItem("fill-opacity"); + const fill_opacity = element.attributes.getNamedItem('fill-opacity'); if (fill) { drawing.fill_opacity = parseFloat(fill_opacity.value); } - const stroke = element.attributes.getNamedItem("stroke"); + const stroke = element.attributes.getNamedItem('stroke'); if (stroke) { drawing.stroke = stroke.value; } - const stroke_width = element.attributes.getNamedItem("stroke-width"); + const stroke_width = element.attributes.getNamedItem('stroke-width'); if (stroke) { drawing.stroke_width = parseInt(stroke_width.value, 10); } - const stroke_dasharray = element.attributes.getNamedItem("stroke-dasharray"); + const stroke_dasharray = element.attributes.getNamedItem('stroke-dasharray'); if (stroke_dasharray) { drawing.stroke_dasharray = stroke_dasharray.value; } diff --git a/src/app/cartography/helpers/svg-to-drawing-converter/image-converter.spec.ts b/src/app/cartography/helpers/svg-to-drawing-converter/image-converter.spec.ts index 3eda821b..78669c36 100644 --- a/src/app/cartography/helpers/svg-to-drawing-converter/image-converter.spec.ts +++ b/src/app/cartography/helpers/svg-to-drawing-converter/image-converter.spec.ts @@ -1,5 +1,4 @@ -import { ImageConverter } from "./image-converter"; - +import { ImageConverter } from './image-converter'; describe('ImageConverter', () => { let imageConverter: ImageConverter; @@ -9,19 +8,19 @@ describe('ImageConverter', () => { }); it('should parse attributes', () => { - const element = document.createElement("image"); - element.setAttribute("xlink:href", "data:image/png"); - element.setAttribute("width", "100px"); - element.setAttribute("height", "200px"); + const element = document.createElement('image'); + element.setAttribute('xlink:href', 'data:image/png'); + element.setAttribute('width', '100px'); + element.setAttribute('height', '200px'); const drawing = imageConverter.convert(element); - expect(drawing.data).toEqual("data:image/png"); + expect(drawing.data).toEqual('data:image/png'); expect(drawing.width).toEqual(100); expect(drawing.height).toEqual(200); }); it('should parse with no attributes', () => { - const element = document.createElement("image"); + const element = document.createElement('image'); const drawing = imageConverter.convert(element); expect(drawing.data).toBeUndefined(); diff --git a/src/app/cartography/helpers/svg-to-drawing-converter/image-converter.ts b/src/app/cartography/helpers/svg-to-drawing-converter/image-converter.ts index fab3c54f..e3412146 100644 --- a/src/app/cartography/helpers/svg-to-drawing-converter/image-converter.ts +++ b/src/app/cartography/helpers/svg-to-drawing-converter/image-converter.ts @@ -1,12 +1,11 @@ -import { SvgConverter } from "./svg-converter"; -import { ImageElement } from "../../models/drawings/image-element"; - +import { SvgConverter } from './svg-converter'; +import { ImageElement } from '../../models/drawings/image-element'; export class ImageConverter implements SvgConverter { convert(element: Element): ImageElement { const drawing = new ImageElement(); - const data = element.attributes.getNamedItem("xlink:href"); + const data = element.attributes.getNamedItem('xlink:href'); if (data) { drawing.data = data.value; } diff --git a/src/app/cartography/helpers/svg-to-drawing-converter/line-converter.spec.ts b/src/app/cartography/helpers/svg-to-drawing-converter/line-converter.spec.ts index 44efb31b..c72090b3 100644 --- a/src/app/cartography/helpers/svg-to-drawing-converter/line-converter.spec.ts +++ b/src/app/cartography/helpers/svg-to-drawing-converter/line-converter.spec.ts @@ -1,5 +1,4 @@ -import { LineConverter } from "./line-converter"; - +import { LineConverter } from './line-converter'; describe('LineConverter', () => { let lineConverter: LineConverter; @@ -9,19 +8,19 @@ describe('LineConverter', () => { }); it('should parse attributes', () => { - const element = document.createElement("line"); - element.setAttribute("stroke", "#000000"); - element.setAttribute("stroke-width", "2"); - element.setAttribute("stroke-dasharray", "5,25,25"); - element.setAttribute("x1", "10.10"); - element.setAttribute("x2", "20"); - element.setAttribute("y1", "30"); - element.setAttribute("y2", "40"); + const element = document.createElement('line'); + element.setAttribute('stroke', '#000000'); + element.setAttribute('stroke-width', '2'); + element.setAttribute('stroke-dasharray', '5,25,25'); + element.setAttribute('x1', '10.10'); + element.setAttribute('x2', '20'); + element.setAttribute('y1', '30'); + element.setAttribute('y2', '40'); const drawing = lineConverter.convert(element); - expect(drawing.stroke).toEqual("#000000"); + expect(drawing.stroke).toEqual('#000000'); expect(drawing.stroke_width).toEqual(2.0); - expect(drawing.stroke_dasharray).toEqual("5,25,25"); + expect(drawing.stroke_dasharray).toEqual('5,25,25'); expect(drawing.x1).toEqual(10); expect(drawing.x2).toEqual(20); expect(drawing.y1).toEqual(30); @@ -29,7 +28,7 @@ describe('LineConverter', () => { }); it('should parse with no attributes', () => { - const element = document.createElement("line"); + const element = document.createElement('line'); const drawing = lineConverter.convert(element); expect(drawing.stroke).toBeUndefined(); @@ -40,5 +39,4 @@ describe('LineConverter', () => { expect(drawing.y1).toBeUndefined(); expect(drawing.y2).toBeUndefined(); }); - }); diff --git a/src/app/cartography/helpers/svg-to-drawing-converter/line-converter.ts b/src/app/cartography/helpers/svg-to-drawing-converter/line-converter.ts index de3502e2..19c1a792 100644 --- a/src/app/cartography/helpers/svg-to-drawing-converter/line-converter.ts +++ b/src/app/cartography/helpers/svg-to-drawing-converter/line-converter.ts @@ -1,22 +1,21 @@ -import { SvgConverter } from "./svg-converter"; -import { LineElement } from "../../models/drawings/line-element"; - +import { SvgConverter } from './svg-converter'; +import { LineElement } from '../../models/drawings/line-element'; export class LineConverter implements SvgConverter { convert(element: Element): LineElement { const drawing = new LineElement(); - const stroke = element.attributes.getNamedItem("stroke"); + const stroke = element.attributes.getNamedItem('stroke'); if (stroke) { drawing.stroke = stroke.value; } - const stroke_width = element.attributes.getNamedItem("stroke-width"); + const stroke_width = element.attributes.getNamedItem('stroke-width'); if (stroke) { drawing.stroke_width = parseInt(stroke_width.value, 10); } - const stroke_dasharray = element.attributes.getNamedItem("stroke-dasharray"); + const stroke_dasharray = element.attributes.getNamedItem('stroke-dasharray'); if (stroke_dasharray) { drawing.stroke_dasharray = stroke_dasharray.value; } diff --git a/src/app/cartography/helpers/svg-to-drawing-converter/rect-converter.spec.ts b/src/app/cartography/helpers/svg-to-drawing-converter/rect-converter.spec.ts index a88fb53f..c66ceb5b 100644 --- a/src/app/cartography/helpers/svg-to-drawing-converter/rect-converter.spec.ts +++ b/src/app/cartography/helpers/svg-to-drawing-converter/rect-converter.spec.ts @@ -1,5 +1,4 @@ -import { RectConverter } from "./rect-converter"; - +import { RectConverter } from './rect-converter'; describe('RectConverter', () => { let rectConverter: RectConverter; @@ -9,27 +8,27 @@ describe('RectConverter', () => { }); it('should parse attributes', () => { - const element = document.createElement("rect"); - element.setAttribute("fill", "#ffffff"); - element.setAttribute("fill-opacity", "0.7"); - element.setAttribute("stroke", "#000000"); - element.setAttribute("stroke-width", "2"); - element.setAttribute("stroke-dasharray", "5,25,25"); + const element = document.createElement('rect'); + element.setAttribute('fill', '#ffffff'); + element.setAttribute('fill-opacity', '0.7'); + element.setAttribute('stroke', '#000000'); + element.setAttribute('stroke-width', '2'); + element.setAttribute('stroke-dasharray', '5,25,25'); - element.setAttribute("width", "100px"); - element.setAttribute("height", "200px"); + element.setAttribute('width', '100px'); + element.setAttribute('height', '200px'); const drawing = rectConverter.convert(element); - expect(drawing.fill).toEqual("#ffffff"); + expect(drawing.fill).toEqual('#ffffff'); expect(drawing.fill_opacity).toEqual(0.7); - expect(drawing.stroke).toEqual("#000000"); - expect(drawing.stroke_dasharray).toEqual("5,25,25"); + expect(drawing.stroke).toEqual('#000000'); + expect(drawing.stroke_dasharray).toEqual('5,25,25'); expect(drawing.width).toEqual(100); expect(drawing.height).toEqual(200); }); it('should parse with no attributes', () => { - const element = document.createElement("rect"); + const element = document.createElement('rect'); const drawing = rectConverter.convert(element); expect(drawing.fill).toBeUndefined(); diff --git a/src/app/cartography/helpers/svg-to-drawing-converter/rect-converter.ts b/src/app/cartography/helpers/svg-to-drawing-converter/rect-converter.ts index 5e913070..7682202c 100644 --- a/src/app/cartography/helpers/svg-to-drawing-converter/rect-converter.ts +++ b/src/app/cartography/helpers/svg-to-drawing-converter/rect-converter.ts @@ -1,32 +1,31 @@ -import { SvgConverter } from "./svg-converter"; -import { RectElement } from "../../models/drawings/rect-element"; - +import { SvgConverter } from './svg-converter'; +import { RectElement } from '../../models/drawings/rect-element'; export class RectConverter implements SvgConverter { convert(element: Element): RectElement { const drawing = new RectElement(); - const fill = element.attributes.getNamedItem("fill"); + const fill = element.attributes.getNamedItem('fill'); if (fill) { drawing.fill = fill.value; } - const fill_opacity = element.attributes.getNamedItem("fill-opacity"); + const fill_opacity = element.attributes.getNamedItem('fill-opacity'); if (fill) { drawing.fill_opacity = parseFloat(fill_opacity.value); } - const stroke = element.attributes.getNamedItem("stroke"); + const stroke = element.attributes.getNamedItem('stroke'); if (stroke) { drawing.stroke = stroke.value; } - const stroke_width = element.attributes.getNamedItem("stroke-width"); + const stroke_width = element.attributes.getNamedItem('stroke-width'); if (stroke) { drawing.stroke_width = parseInt(stroke_width.value, 10); } - const stroke_dasharray = element.attributes.getNamedItem("stroke-dasharray"); + const stroke_dasharray = element.attributes.getNamedItem('stroke-dasharray'); if (stroke_dasharray) { drawing.stroke_dasharray = stroke_dasharray.value; } diff --git a/src/app/cartography/helpers/svg-to-drawing-converter/svg-converter.ts b/src/app/cartography/helpers/svg-to-drawing-converter/svg-converter.ts index 9f8dd057..d6459727 100644 --- a/src/app/cartography/helpers/svg-to-drawing-converter/svg-converter.ts +++ b/src/app/cartography/helpers/svg-to-drawing-converter/svg-converter.ts @@ -1,4 +1,4 @@ -import { DrawingElement } from "../../models/drawings/drawing-element"; +import { DrawingElement } from '../../models/drawings/drawing-element'; export interface SvgConverter { convert(element: Element): DrawingElement; diff --git a/src/app/cartography/helpers/svg-to-drawing-converter/text-converter.spec.ts b/src/app/cartography/helpers/svg-to-drawing-converter/text-converter.spec.ts index da9632b0..b2bed333 100644 --- a/src/app/cartography/helpers/svg-to-drawing-converter/text-converter.spec.ts +++ b/src/app/cartography/helpers/svg-to-drawing-converter/text-converter.spec.ts @@ -1,5 +1,4 @@ -import { TextConverter } from "./text-converter"; - +import { TextConverter } from './text-converter'; describe('TextConverter', () => { let textConverter: TextConverter; @@ -9,30 +8,30 @@ describe('TextConverter', () => { }); it('should parse attributes', () => { - const element = document.createElement("text"); - element.innerText = "Text"; - element.setAttribute("fill", "#00000"); - element.setAttribute("fill-opacity", "1.0"); - element.setAttribute("font-family", "TypeWriter"); - element.setAttribute("font-size", "10.0"); - element.setAttribute("font-weight", "bold"); - element.setAttribute("text-decoration", "line-through"); + const element = document.createElement('text'); + element.innerText = 'Text'; + element.setAttribute('fill', '#00000'); + element.setAttribute('fill-opacity', '1.0'); + element.setAttribute('font-family', 'TypeWriter'); + element.setAttribute('font-size', '10.0'); + element.setAttribute('font-weight', 'bold'); + element.setAttribute('text-decoration', 'line-through'); const drawing = textConverter.convert(element); - expect(drawing.text).toEqual("Text"); - expect(drawing.fill).toEqual("#00000"); + expect(drawing.text).toEqual('Text'); + expect(drawing.fill).toEqual('#00000'); expect(drawing.fill_opacity).toEqual(1.0); - expect(drawing.font_family).toEqual("TypeWriter"); + expect(drawing.font_family).toEqual('TypeWriter'); expect(drawing.font_size).toEqual(10.0); - expect(drawing.font_weight).toEqual("bold"); - expect(drawing.text_decoration).toEqual("line-through"); + expect(drawing.font_weight).toEqual('bold'); + expect(drawing.text_decoration).toEqual('line-through'); }); it('should parse with no attributes', () => { - const element = document.createElement("text"); + const element = document.createElement('text'); const drawing = textConverter.convert(element); - expect(drawing.text).toEqual(""); + expect(drawing.text).toEqual(''); expect(drawing.fill).toBeUndefined(); expect(drawing.fill_opacity).toBeUndefined(); expect(drawing.font_family).toBeUndefined(); diff --git a/src/app/cartography/helpers/svg-to-drawing-converter/text-converter.ts b/src/app/cartography/helpers/svg-to-drawing-converter/text-converter.ts index 69232e29..7900a2bf 100644 --- a/src/app/cartography/helpers/svg-to-drawing-converter/text-converter.ts +++ b/src/app/cartography/helpers/svg-to-drawing-converter/text-converter.ts @@ -1,6 +1,5 @@ -import { SvgConverter } from "./svg-converter"; -import { TextElement } from "../../models/drawings/text-element"; - +import { SvgConverter } from './svg-converter'; +import { TextElement } from '../../models/drawings/text-element'; export class TextConverter implements SvgConverter { convert(element: Element): TextElement { @@ -38,7 +37,6 @@ export class TextConverter implements SvgConverter { drawing.text_decoration = text_decoration.value; } - return drawing; } } diff --git a/src/app/cartography/managers/graph-data-manager.spec.ts b/src/app/cartography/managers/graph-data-manager.spec.ts index fa4d4dd1..057e0852 100644 --- a/src/app/cartography/managers/graph-data-manager.spec.ts +++ b/src/app/cartography/managers/graph-data-manager.spec.ts @@ -30,9 +30,9 @@ export class MockedGraphDataManager { public setSymbols(value) { this.symbols = value; - } + } public getSymbols() { return this.symbols; } -} \ No newline at end of file +} diff --git a/src/app/cartography/managers/graph-data-manager.ts b/src/app/cartography/managers/graph-data-manager.ts index 2b7e5621..fdf0a786 100644 --- a/src/app/cartography/managers/graph-data-manager.ts +++ b/src/app/cartography/managers/graph-data-manager.ts @@ -1,17 +1,22 @@ -import { Injectable } from "@angular/core"; -import { Node } from "../models/node"; -import { NodeToMapNodeConverter } from "../converters/map/node-to-map-node-converter"; -import { LinkToMapLinkConverter } from "../converters/map/link-to-map-link-converter"; -import { DrawingToMapDrawingConverter } from "../converters/map/drawing-to-map-drawing-converter"; -import { SymbolToMapSymbolConverter } from "../converters/map/symbol-to-map-symbol-converter"; -import { MapNode } from "../models/map/map-node"; -import { MapLink } from "../models/map/map-link"; -import { Link } from "../../models/link"; -import { Drawing } from "../models/drawing"; -import { Symbol } from "../../models/symbol"; -import { LayersManager } from "./layers-manager"; -import { MapNodesDataSource, MapLinksDataSource, MapDrawingsDataSource, MapSymbolsDataSource } from "../datasources/map-datasource"; -import { MultiLinkCalculatorHelper } from "../helpers/multi-link-calculator-helper"; +import { Injectable } from '@angular/core'; +import { Node } from '../models/node'; +import { NodeToMapNodeConverter } from '../converters/map/node-to-map-node-converter'; +import { LinkToMapLinkConverter } from '../converters/map/link-to-map-link-converter'; +import { DrawingToMapDrawingConverter } from '../converters/map/drawing-to-map-drawing-converter'; +import { SymbolToMapSymbolConverter } from '../converters/map/symbol-to-map-symbol-converter'; +import { MapNode } from '../models/map/map-node'; +import { MapLink } from '../models/map/map-link'; +import { Link } from '../../models/link'; +import { Drawing } from '../models/drawing'; +import { Symbol } from '../../models/symbol'; +import { LayersManager } from './layers-manager'; +import { + MapNodesDataSource, + MapLinksDataSource, + MapDrawingsDataSource, + MapSymbolsDataSource +} from '../datasources/map-datasource'; +import { MultiLinkCalculatorHelper } from '../helpers/multi-link-calculator-helper'; @Injectable() export class GraphDataManager { @@ -29,7 +34,7 @@ export class GraphDataManager { ) {} public setNodes(nodes: Node[]) { - const mapNodes = nodes.map((n) => this.nodeToMapNode.convert(n)); + const mapNodes = nodes.map(n => this.nodeToMapNode.convert(n)); this.mapNodesDataSource.set(mapNodes); this.assignDataToLinks(); @@ -37,7 +42,7 @@ export class GraphDataManager { } public setLinks(links: Link[]) { - const mapLinks = links.map((l) => this.linkToMapLink.convert(l)); + const mapLinks = links.map(l => this.linkToMapLink.convert(l)); this.mapLinksDataSource.set(mapLinks); this.assignDataToLinks(); @@ -45,14 +50,14 @@ export class GraphDataManager { } public setDrawings(drawings: Drawing[]) { - const mapDrawings = drawings.map((d) => this.drawingToMapDrawing.convert(d)); + const mapDrawings = drawings.map(d => this.drawingToMapDrawing.convert(d)); this.mapDrawingsDataSource.set(mapDrawings); this.onDataUpdate(); } public setSymbols(symbols: Symbol[]) { - const mapSymbols = symbols.map((s) => this.symbolToMapSymbol.convert(s)); + const mapSymbols = symbols.map(s => this.symbolToMapSymbol.convert(s)); this.mapSymbolsDataSource.set(mapSymbols); } @@ -103,5 +108,4 @@ export class GraphDataManager { this.multiLinkCalculator.assignDataToLinks(this.getLinks()); } - -} \ No newline at end of file +} diff --git a/src/app/cartography/managers/layers-manager.spec.ts b/src/app/cartography/managers/layers-manager.spec.ts index 5a1571a1..8da09cd6 100644 --- a/src/app/cartography/managers/layers-manager.spec.ts +++ b/src/app/cartography/managers/layers-manager.spec.ts @@ -1,8 +1,7 @@ -import { LayersManager } from "./layers-manager"; -import { MapDrawing } from "../models/map/map-drawing"; -import { MapLink } from "../models/map/map-link"; -import { MapNode } from "../models/map/map-node"; - +import { LayersManager } from './layers-manager'; +import { MapDrawing } from '../models/map/map-drawing'; +import { MapLink } from '../models/map/map-link'; +import { MapNode } from '../models/map/map-node'; describe('LayersManager', () => { let manager: LayersManager; diff --git a/src/app/cartography/managers/layers-manager.ts b/src/app/cartography/managers/layers-manager.ts index 773160cf..b359489f 100644 --- a/src/app/cartography/managers/layers-manager.ts +++ b/src/app/cartography/managers/layers-manager.ts @@ -1,11 +1,10 @@ -import { Injectable } from "@angular/core"; - -import { Layer } from "../models/layer"; -import { Dictionary } from "../models/types"; -import { MapNode } from "../models/map/map-node"; -import { MapDrawing } from "../models/map/map-drawing"; -import { MapLink } from "../models/map/map-link"; +import { Injectable } from '@angular/core'; +import { Layer } from '../models/layer'; +import { Dictionary } from '../models/types'; +import { MapNode } from '../models/map/map-node'; +import { MapDrawing } from '../models/map/map-drawing'; +import { MapLink } from '../models/map/map-link'; @Injectable() export class LayersManager { @@ -16,27 +15,27 @@ export class LayersManager { } public getLayersList(): Layer[] { - return Object.keys(this.layers).sort((a: string, b: string) => { - return Number(a) - Number(b); - }).map((key: string) => { - return this.layers[key]; - }); + return Object.keys(this.layers) + .sort((a: string, b: string) => { + return Number(a) - Number(b); + }) + .map((key: string) => { + return this.layers[key]; + }); } public setNodes(nodes: MapNode[]) { - nodes - .forEach((node: MapNode) => { - const layer = this.getLayerForKey(node.z.toString()); - layer.nodes.push(node); - }); + nodes.forEach((node: MapNode) => { + const layer = this.getLayerForKey(node.z.toString()); + layer.nodes.push(node); + }); } public setDrawings(drawings: MapDrawing[]) { - drawings - .forEach((drawing: MapDrawing) => { - const layer = this.getLayerForKey(drawing.z.toString()); - layer.drawings.push(drawing); - }); + drawings.forEach((drawing: MapDrawing) => { + const layer = this.getLayerForKey(drawing.z.toString()); + layer.drawings.push(drawing); + }); } public setLinks(links: MapLink[]) { @@ -60,5 +59,4 @@ export class LayersManager { } return this.layers[key]; } - } diff --git a/src/app/cartography/managers/map-settings-manager.ts b/src/app/cartography/managers/map-settings-manager.ts index b0cc4ffb..2c07ba5b 100644 --- a/src/app/cartography/managers/map-settings-manager.ts +++ b/src/app/cartography/managers/map-settings-manager.ts @@ -1,7 +1,6 @@ -import { Injectable } from "@angular/core"; - +import { Injectable } from '@angular/core'; @Injectable() export class MapSettingsManager { public isReadOnly = false; -} \ No newline at end of file +} diff --git a/src/app/cartography/managers/selection-manager.spec.ts b/src/app/cartography/managers/selection-manager.spec.ts index e2963a8c..25cef09a 100644 --- a/src/app/cartography/managers/selection-manager.spec.ts +++ b/src/app/cartography/managers/selection-manager.spec.ts @@ -1,5 +1,5 @@ -import { MapNode } from "../models/map/map-node"; -import { SelectionManager } from "./selection-manager"; +import { MapNode } from '../models/map/map-node'; +import { SelectionManager } from './selection-manager'; export class SelectionManagerMock { public items = []; @@ -17,13 +17,11 @@ describe('SelectionManager', () => { beforeEach(() => { manager = new SelectionManager(); }); - it('nodes should be manually selected', () => { const node = new MapNode(); - node.id = "test1"; + node.id = 'test1'; manager.setSelected([node]); expect(manager.getSelected().length).toEqual(1); }); - }); diff --git a/src/app/cartography/managers/selection-manager.ts b/src/app/cartography/managers/selection-manager.ts index b5cda11f..a25e18a3 100644 --- a/src/app/cartography/managers/selection-manager.ts +++ b/src/app/cartography/managers/selection-manager.ts @@ -1,11 +1,10 @@ -import { Injectable, EventEmitter } from "@angular/core"; - -import { Indexed } from "../datasources/map-datasource"; +import { Injectable, EventEmitter } from '@angular/core'; +import { Indexed } from '../datasources/map-datasource'; @Injectable() export class SelectionManager { - private selection: {[id:string]: any} = {}; + private selection: { [id: string]: any } = {}; public selected = new EventEmitter(); public unselected = new EventEmitter(); @@ -13,20 +12,24 @@ export class SelectionManager { public setSelected(items: Indexed[]) { const dictItems = this.convertToKeyDict(items); - const selected = Object.keys(dictItems).filter((key) => { - return !this.isSelectedByKey(key); - }).map(key => dictItems[key]); + const selected = Object.keys(dictItems) + .filter(key => { + return !this.isSelectedByKey(key); + }) + .map(key => dictItems[key]); - const unselected = Object.keys(this.selection).filter((key) => { - return !(key in dictItems); - }).map((key) => this.selection[key]); + const unselected = Object.keys(this.selection) + .filter(key => { + return !(key in dictItems); + }) + .map(key => this.selection[key]); this.selection = dictItems; - if (selected.length > 0) { + if (selected.length > 0) { this.selected.emit(selected); } - + if (unselected.length > 0) { this.unselected.emit(unselected); } @@ -52,7 +55,7 @@ export class SelectionManager { private convertToKeyDict(items: Indexed[]) { const dict = {}; - items.forEach((item) => { + items.forEach(item => { dict[this.getKey(item)] = item; }); return dict; diff --git a/src/app/cartography/models/context.ts b/src/app/cartography/models/context.ts index c3a07008..ae90fac1 100644 --- a/src/app/cartography/models/context.ts +++ b/src/app/cartography/models/context.ts @@ -1,13 +1,9 @@ -import { Size } from "./size"; -import { Point } from "./point"; -import { Injectable } from "@angular/core"; +import { Size } from './size'; +import { Point } from './point'; +import { Injectable } from '@angular/core'; export class Transformation { - constructor( - public x: number, - public y: number, - public k: number - ) {} + constructor(public x: number, public y: number, public k: number) {} } @Injectable() @@ -15,7 +11,7 @@ export class Context { public transformation: Transformation; public size: Size; public centerZeroZeroPoint = true; - + constructor() { this.size = new Size(0, 0); this.transformation = new Transformation(0, 0, 1); @@ -23,7 +19,7 @@ export class Context { public getZeroZeroTransformationPoint() { if (this.centerZeroZeroPoint) { - return new Point(this.size.width / 2., this.size.height / 2.); + return new Point(this.size.width / 2, this.size.height / 2); } return new Point(0, 0); } diff --git a/src/app/cartography/models/drawing-line.ts b/src/app/cartography/models/drawing-line.ts index 57c03631..74b0f3c3 100644 --- a/src/app/cartography/models/drawing-line.ts +++ b/src/app/cartography/models/drawing-line.ts @@ -1,4 +1,4 @@ -import {Point} from "./point"; +import { Point } from './point'; export class DrawingLine { start: Point; diff --git a/src/app/cartography/models/drawing.ts b/src/app/cartography/models/drawing.ts index e31f9c62..984617c5 100644 --- a/src/app/cartography/models/drawing.ts +++ b/src/app/cartography/models/drawing.ts @@ -1,4 +1,4 @@ -import { DrawingElement } from "./drawings/drawing-element"; +import { DrawingElement } from './drawings/drawing-element'; export class Drawing { drawing_id: string; diff --git a/src/app/cartography/models/drawings/ellipse-element.ts b/src/app/cartography/models/drawings/ellipse-element.ts index f7ce4df2..172ce373 100644 --- a/src/app/cartography/models/drawings/ellipse-element.ts +++ b/src/app/cartography/models/drawings/ellipse-element.ts @@ -1,5 +1,4 @@ -import { DrawingElement } from "./drawing-element"; - +import { DrawingElement } from './drawing-element'; export class EllipseElement implements DrawingElement { height: number; diff --git a/src/app/cartography/models/drawings/image-element.ts b/src/app/cartography/models/drawings/image-element.ts index 154e147b..7a383ea1 100644 --- a/src/app/cartography/models/drawings/image-element.ts +++ b/src/app/cartography/models/drawings/image-element.ts @@ -1,5 +1,4 @@ -import { DrawingElement } from "./drawing-element"; - +import { DrawingElement } from './drawing-element'; export class ImageElement implements DrawingElement { height: number; diff --git a/src/app/cartography/models/drawings/line-element.ts b/src/app/cartography/models/drawings/line-element.ts index 936ab56c..9105da3d 100644 --- a/src/app/cartography/models/drawings/line-element.ts +++ b/src/app/cartography/models/drawings/line-element.ts @@ -1,5 +1,4 @@ -import { DrawingElement } from "./drawing-element"; - +import { DrawingElement } from './drawing-element'; export class LineElement implements DrawingElement { height: number; diff --git a/src/app/cartography/models/drawings/rect-element.ts b/src/app/cartography/models/drawings/rect-element.ts index 4f086bf8..661e5ea4 100644 --- a/src/app/cartography/models/drawings/rect-element.ts +++ b/src/app/cartography/models/drawings/rect-element.ts @@ -1,5 +1,4 @@ -import { DrawingElement } from "./drawing-element"; - +import { DrawingElement } from './drawing-element'; export class RectElement implements DrawingElement { height: number; diff --git a/src/app/cartography/models/drawings/text-element.ts b/src/app/cartography/models/drawings/text-element.ts index fdde23b2..79c9c7f3 100644 --- a/src/app/cartography/models/drawings/text-element.ts +++ b/src/app/cartography/models/drawings/text-element.ts @@ -1,6 +1,5 @@ -import { DrawingElement } from "./drawing-element"; -import { Font } from "../font"; - +import { DrawingElement } from './drawing-element'; +import { Font } from '../font'; export class TextElement implements DrawingElement, Font { height: number; diff --git a/src/app/cartography/models/layer.ts b/src/app/cartography/models/layer.ts index fd0cc162..88c55487 100644 --- a/src/app/cartography/models/layer.ts +++ b/src/app/cartography/models/layer.ts @@ -1,6 +1,6 @@ -import { MapNode } from "./map/map-node"; -import { MapDrawing } from "./map/map-drawing"; -import { MapLink } from "./map/map-link"; +import { MapNode } from './map/map-node'; +import { MapDrawing } from './map/map-drawing'; +import { MapLink } from './map/map-link'; export class Layer { constructor( @@ -8,6 +8,5 @@ export class Layer { public nodes: MapNode[] = [], public drawings: MapDrawing[] = [], public links: MapLink[] = [] - ) { - } + ) {} } diff --git a/src/app/cartography/models/link-status.ts b/src/app/cartography/models/link-status.ts index c144d229..b1bd66a6 100644 --- a/src/app/cartography/models/link-status.ts +++ b/src/app/cartography/models/link-status.ts @@ -1,7 +1,3 @@ export class LinkStatus { - public constructor( - public x: number, - public y: number, - public status: string - ) {} + public constructor(public x: number, public y: number, public status: string) {} } diff --git a/src/app/cartography/models/map/map-drawing.ts b/src/app/cartography/models/map/map-drawing.ts index 4363165f..685fee93 100644 --- a/src/app/cartography/models/map/map-drawing.ts +++ b/src/app/cartography/models/map/map-drawing.ts @@ -1,13 +1,13 @@ -import { DrawingElement } from "../drawings/drawing-element"; -import { Indexed } from "../../datasources/map-datasource"; +import { DrawingElement } from '../drawings/drawing-element'; +import { Indexed } from '../../datasources/map-datasource'; export class MapDrawing implements Indexed { - id: string; - projectId: string; - rotation: number; - svg: string; - x: number; - y: number; - z: number; - element: DrawingElement; // @todo; apply converters + id: string; + projectId: string; + rotation: number; + svg: string; + x: number; + y: number; + z: number; + element: DrawingElement; // @todo; apply converters } diff --git a/src/app/cartography/models/map/map-label.ts b/src/app/cartography/models/map/map-label.ts index a42dd193..397cad74 100644 --- a/src/app/cartography/models/map/map-label.ts +++ b/src/app/cartography/models/map/map-label.ts @@ -1,4 +1,4 @@ -import { Indexed } from "../../datasources/map-datasource"; +import { Indexed } from '../../datasources/map-datasource'; export class MapLabel implements Indexed { id: string; diff --git a/src/app/cartography/models/map/map-link-node.ts b/src/app/cartography/models/map/map-link-node.ts index 9cf37ade..577a2d6b 100644 --- a/src/app/cartography/models/map/map-link-node.ts +++ b/src/app/cartography/models/map/map-link-node.ts @@ -1,5 +1,5 @@ -import { MapLabel } from "./map-label"; -import { Indexed } from "../../datasources/map-datasource"; +import { MapLabel } from './map-label'; +import { Indexed } from '../../datasources/map-datasource'; export class MapLinkNode implements Indexed { id: string; diff --git a/src/app/cartography/models/map/map-link.ts b/src/app/cartography/models/map/map-link.ts index 97dd1c31..0a0fb3a8 100644 --- a/src/app/cartography/models/map/map-link.ts +++ b/src/app/cartography/models/map/map-link.ts @@ -1,22 +1,22 @@ -import { MapLinkNode } from "./map-link-node"; -import { MapNode } from "./map-node"; -import { Indexed } from "../../datasources/map-datasource"; +import { MapLinkNode } from './map-link-node'; +import { MapNode } from './map-node'; +import { Indexed } from '../../datasources/map-datasource'; export class MapLink implements Indexed { - id: string; - captureFileName: string; - captureFilePath: string; - capturing: boolean; - linkType: string; - nodes: MapLinkNode[]; - projectId: string; + id: string; + captureFileName: string; + captureFilePath: string; + capturing: boolean; + linkType: string; + nodes: MapLinkNode[]; + projectId: string; - distance: number; // this is not from server - length: number; // this is not from server - source: MapNode; // this is not from server - target: MapNode; // this is not from server + distance: number; // this is not from server + length: number; // this is not from server + source: MapNode; // this is not from server + target: MapNode; // this is not from server - isSelected = false; // this is not from server - x: number; // this is not from server - y: number; // this is not from server + isSelected = false; // this is not from server + x: number; // this is not from server + y: number; // this is not from server } diff --git a/src/app/cartography/models/map/map-node.ts b/src/app/cartography/models/map/map-node.ts index fba913b1..ae08ccf7 100644 --- a/src/app/cartography/models/map/map-node.ts +++ b/src/app/cartography/models/map/map-node.ts @@ -1,29 +1,29 @@ -import { MapLabel } from "./map-label"; -import { MapPort } from "./map-port"; -import { Indexed } from "../../datasources/map-datasource"; +import { MapLabel } from './map-label'; +import { MapPort } from './map-port'; +import { Indexed } from '../../datasources/map-datasource'; export class MapNode implements Indexed { - id: string; - commandLine: string; - computeId: string; - console: number; - consoleHost: string; - consoleType: string; - firstPortName: string; - height: number; - label: MapLabel; - name: string; - nodeDirectory: string; - nodeType: string; - portNameFormat: string; - portSegmentSize: number; - ports: MapPort[]; - projectId: string; - status: string; - symbol: string; - symbolUrl: string; - width: number; - x: number; - y: number; - z: number; + id: string; + commandLine: string; + computeId: string; + console: number; + consoleHost: string; + consoleType: string; + firstPortName: string; + height: number; + label: MapLabel; + name: string; + nodeDirectory: string; + nodeType: string; + portNameFormat: string; + portSegmentSize: number; + ports: MapPort[]; + projectId: string; + status: string; + symbol: string; + symbolUrl: string; + width: number; + x: number; + y: number; + z: number; } diff --git a/src/app/cartography/models/map/map-port.ts b/src/app/cartography/models/map/map-port.ts index 36959fb9..13ba5b07 100644 --- a/src/app/cartography/models/map/map-port.ts +++ b/src/app/cartography/models/map/map-port.ts @@ -1,7 +1,7 @@ export class MapPort { - adapterNumber: number; - linkType: string; - name: string; - portNumber: number; - shortName: string; + adapterNumber: number; + linkType: string; + name: string; + portNumber: number; + shortName: string; } diff --git a/src/app/cartography/models/map/map-symbol.ts b/src/app/cartography/models/map/map-symbol.ts index a766153d..9eb9e973 100644 --- a/src/app/cartography/models/map/map-symbol.ts +++ b/src/app/cartography/models/map/map-symbol.ts @@ -1,8 +1,8 @@ -import { Indexed } from "../../datasources/map-datasource"; +import { Indexed } from '../../datasources/map-datasource'; export class MapSymbol implements Indexed { - id: string; - builtin: boolean; - filename: string; - raw: string; + id: string; + builtin: boolean; + filename: string; + raw: string; } diff --git a/src/app/cartography/models/node.ts b/src/app/cartography/models/node.ts index fa8ed8d8..5caf995f 100644 --- a/src/app/cartography/models/node.ts +++ b/src/app/cartography/models/node.ts @@ -1,6 +1,5 @@ -import { Label } from "./label"; -import { Port } from "../../models/port"; - +import { Label } from './label'; +import { Port } from '../../models/port'; export class Node { command_line: string; diff --git a/src/app/cartography/models/point.ts b/src/app/cartography/models/point.ts index 6250d93a..382ec3e3 100644 --- a/src/app/cartography/models/point.ts +++ b/src/app/cartography/models/point.ts @@ -1,6 +1,3 @@ export class Point { - constructor( - public x?: number, - public y?: number - ) {} + constructor(public x?: number, public y?: number) {} } diff --git a/src/app/cartography/models/rectangle.ts b/src/app/cartography/models/rectangle.ts index 1fb5349a..cd8b6fec 100644 --- a/src/app/cartography/models/rectangle.ts +++ b/src/app/cartography/models/rectangle.ts @@ -1,8 +1,3 @@ export class Rectangle { - constructor( - public x?: number, - public y?: number, - public width?: number, - public height?: number - ) {} + constructor(public x?: number, public y?: number, public width?: number, public height?: number) {} } diff --git a/src/app/cartography/models/size.ts b/src/app/cartography/models/size.ts index d9cce857..dbcd7f3e 100644 --- a/src/app/cartography/models/size.ts +++ b/src/app/cartography/models/size.ts @@ -1,5 +1,3 @@ export class Size { - constructor( - public width: number, - public height: number) {} + constructor(public width: number, public height: number) {} } diff --git a/src/app/cartography/models/types.ts b/src/app/cartography/models/types.ts index b360a228..00e22f9a 100644 --- a/src/app/cartography/models/types.ts +++ b/src/app/cartography/models/types.ts @@ -1,7 +1,7 @@ -import {BaseType, Selection} from "d3-selection"; +import { BaseType, Selection } from 'd3-selection'; export type SVGSelection = Selection; export interface Dictionary { - [Key: string]: T; + [Key: string]: T; } diff --git a/src/app/cartography/services/map-change-detector-ref.spec.ts b/src/app/cartography/services/map-change-detector-ref.spec.ts index 1da428ef..91acbc9a 100644 --- a/src/app/cartography/services/map-change-detector-ref.spec.ts +++ b/src/app/cartography/services/map-change-detector-ref.spec.ts @@ -1,4 +1,4 @@ -import { MapChangeDetectorRef } from "./map-change-detector-ref"; +import { MapChangeDetectorRef } from './map-change-detector-ref'; describe('MapChangeDetectorRef', () => { let detector: MapChangeDetectorRef; @@ -7,9 +7,9 @@ describe('MapChangeDetectorRef', () => { detector = new MapChangeDetectorRef(); }); - it("should emit event", () => { + it('should emit event', () => { spyOn(detector.changesDetected, 'emit'); detector.detectChanges(); expect(detector.changesDetected.emit).toHaveBeenCalledWith(true); - }) + }); }); diff --git a/src/app/cartography/services/map-change-detector-ref.ts b/src/app/cartography/services/map-change-detector-ref.ts index 2d1fbce7..5137c342 100644 --- a/src/app/cartography/services/map-change-detector-ref.ts +++ b/src/app/cartography/services/map-change-detector-ref.ts @@ -1,5 +1,4 @@ -import { Injectable, EventEmitter } from "@angular/core"; - +import { Injectable, EventEmitter } from '@angular/core'; @Injectable() export class MapChangeDetectorRef { diff --git a/src/app/cartography/testing.ts b/src/app/cartography/testing.ts index 83915b70..a8bfefe6 100644 --- a/src/app/cartography/testing.ts +++ b/src/app/cartography/testing.ts @@ -1,5 +1,4 @@ -import { select, Selection } from "d3-selection"; - +import { select, Selection } from 'd3-selection'; export class TestSVGCanvas { public svg: Selection; @@ -11,16 +10,16 @@ export class TestSVGCanvas { public create() { this.svg = select('body') - .append('svg') - .attr('width', 1000) - .attr('height', 1000); + .append('svg') + .attr('width', 1000) + .attr('height', 1000); - this.canvas = this.svg - .append('g') - .attr('class', 'canvas'); + this.canvas = this.svg.append('g').attr('class', 'canvas'); } public destroy() { - select('body').selectAll('svg').remove(); + select('body') + .selectAll('svg') + .remove(); } } diff --git a/src/app/cartography/tool.ts b/src/app/cartography/tool.ts index adf76cfb..4503b3db 100644 --- a/src/app/cartography/tool.ts +++ b/src/app/cartography/tool.ts @@ -1,4 +1,4 @@ -import { SVGSelection } from "./models/types"; +import { SVGSelection } from './models/types'; export interface Tool { connect(selection: SVGSelection); diff --git a/src/app/cartography/tools/moving-tool.spec.ts b/src/app/cartography/tools/moving-tool.spec.ts index 96bd2a9f..fa74340c 100644 --- a/src/app/cartography/tools/moving-tool.spec.ts +++ b/src/app/cartography/tools/moving-tool.spec.ts @@ -1,9 +1,8 @@ -import { Context } from "../models/context"; -import { SVGSelection } from "../models/types"; -import { MovingTool } from "./moving-tool"; -import { TestSVGCanvas } from "../testing"; -import { Size } from "../models/size"; - +import { Context } from '../models/context'; +import { SVGSelection } from '../models/types'; +import { MovingTool } from './moving-tool'; +import { TestSVGCanvas } from '../testing'; +import { Size } from '../models/size'; describe('MovingTool', () => { let tool: MovingTool; @@ -35,13 +34,17 @@ describe('MovingTool', () => { beforeEach(() => { svg.svg.node().dispatchEvent( new MouseEvent('mousedown', { - clientX: 100, clientY: 100, relatedTarget: svg.svg.node(), - screenY: 1024, screenX: 1024, view: window + clientX: 100, + clientY: 100, + relatedTarget: svg.svg.node(), + screenY: 1024, + screenX: 1024, + view: window }) ); - window.dispatchEvent(new MouseEvent('mousemove', {clientX: 200, clientY: 200})); - window.dispatchEvent(new MouseEvent('mouseup', {clientX: 200, clientY: 200, view: window})); + window.dispatchEvent(new MouseEvent('mousemove', { clientX: 200, clientY: 200 })); + window.dispatchEvent(new MouseEvent('mouseup', { clientX: 200, clientY: 200, view: window })); }); it('canvas should transformed', () => { @@ -62,13 +65,17 @@ describe('MovingTool', () => { svg.svg.node().dispatchEvent( new MouseEvent('mousedown', { - clientX: 100, clientY: 100, relatedTarget: svg.svg.node(), - screenY: 1024, screenX: 1024, view: window + clientX: 100, + clientY: 100, + relatedTarget: svg.svg.node(), + screenY: 1024, + screenX: 1024, + view: window }) ); - window.dispatchEvent(new MouseEvent('mousemove', {clientX: 200, clientY: 200})); - window.dispatchEvent(new MouseEvent('mouseup', {clientX: 200, clientY: 200, view: window})); + window.dispatchEvent(new MouseEvent('mousemove', { clientX: 200, clientY: 200 })); + window.dispatchEvent(new MouseEvent('mouseup', { clientX: 200, clientY: 200, view: window })); }); it('canvas should transformed', () => { @@ -82,7 +89,6 @@ describe('MovingTool', () => { }); }); - describe('MovingTool can be deactivated', () => { beforeEach(() => { tool.setEnabled(false); @@ -90,12 +96,16 @@ describe('MovingTool', () => { svg.svg.node().dispatchEvent( new MouseEvent('mousedown', { - clientX: 100, clientY: 100, relatedTarget: svg.svg.node(), - screenY: 1024, screenX: 1024, view: window + clientX: 100, + clientY: 100, + relatedTarget: svg.svg.node(), + screenY: 1024, + screenX: 1024, + view: window }) ); - window.dispatchEvent(new MouseEvent('mousemove', {clientX: 200, clientY: 200})); + window.dispatchEvent(new MouseEvent('mousemove', { clientX: 200, clientY: 200 })); }); it('canvas cannot be transformed', () => { diff --git a/src/app/cartography/tools/moving-tool.ts b/src/app/cartography/tools/moving-tool.ts index 4fea8586..63b544d9 100644 --- a/src/app/cartography/tools/moving-tool.ts +++ b/src/app/cartography/tools/moving-tool.ts @@ -1,11 +1,10 @@ -import { Injectable } from "@angular/core"; +import { Injectable } from '@angular/core'; -import { D3ZoomEvent, zoom, ZoomBehavior} from "d3-zoom"; -import { event } from "d3-selection"; - -import { SVGSelection} from "../models/types"; -import { Context} from "../models/context"; +import { D3ZoomEvent, zoom, ZoomBehavior } from 'd3-zoom'; +import { event } from 'd3-selection'; +import { SVGSelection } from '../models/types'; +import { Context } from '../models/context'; @Injectable() export class MovingTool { @@ -13,20 +12,16 @@ export class MovingTool { private enabled = false; private needsDeactivate = false; private needsActivate = false; - - constructor( - private context: Context - ) { - this.zoom = zoom() - .scaleExtent([1 / 2, 8]); + + constructor(private context: Context) { + this.zoom = zoom().scaleExtent([1 / 2, 8]); } public setEnabled(enabled) { if (this.enabled != enabled) { if (enabled) { this.needsActivate = true; - } - else { + } else { this.needsDeactivate = true; } } @@ -34,11 +29,11 @@ export class MovingTool { } public draw(selection: SVGSelection, context: Context) { - if(this.needsActivate) { + if (this.needsActivate) { this.activate(selection); this.needsActivate = false; } - if(this.needsDeactivate) { + if (this.needsDeactivate) { this.deactivate(selection); this.needsDeactivate = false; } @@ -48,12 +43,9 @@ export class MovingTool { const self = this; const onZoom = function(this: SVGSVGElement) { - - const canvas = selection.select("g.canvas"); + const canvas = selection.select('g.canvas'); const e: D3ZoomEvent = event; - canvas.attr( - 'transform', - () => { + canvas.attr('transform', () => { self.context.transformation.x = e.transform.x; self.context.transformation.y = e.transform.y; self.context.transformation.k = e.transform.k; diff --git a/src/app/cartography/tools/selection-tool.spec.ts b/src/app/cartography/tools/selection-tool.spec.ts index 4e2efc59..bda014e5 100644 --- a/src/app/cartography/tools/selection-tool.spec.ts +++ b/src/app/cartography/tools/selection-tool.spec.ts @@ -1,10 +1,9 @@ -import { SelectionTool } from "./selection-tool"; -import { Context } from "../models/context"; -import { SVGSelection } from "../models/types"; -import { Rectangle } from "../models/rectangle"; -import { TestSVGCanvas } from "../testing"; -import { SelectionEventSource } from "../events/selection-event-source"; - +import { SelectionTool } from './selection-tool'; +import { Context } from '../models/context'; +import { SVGSelection } from '../models/types'; +import { Rectangle } from '../models/rectangle'; +import { TestSVGCanvas } from '../testing'; +import { SelectionEventSource } from '../events/selection-event-source'; describe('SelectionTool', () => { let tool: SelectionTool; @@ -28,7 +27,7 @@ describe('SelectionTool', () => { tool.setEnabled(true); tool.draw(svg.svg, context); - + selection_line_tool = svg.svg.select('g.selection-line-tool'); path_selection = selection_line_tool.select('path.selection'); }); @@ -45,31 +44,31 @@ describe('SelectionTool', () => { describe('SelectionTool can handle start of selection', () => { beforeEach(() => { - svg.svg.node().dispatchEvent(new MouseEvent('mousedown', {clientX: 100, clientY: 100})); + svg.svg.node().dispatchEvent(new MouseEvent('mousedown', { clientX: 100, clientY: 100 })); }); it('path should be visible and have parameters', () => { - expect(path_selection.attr('visibility')).toEqual('visible'); - expect(path_selection.attr('d')).toEqual('M100,108 l0,0 l0,0 l0,0z'); + expect(path_selection.attr('visibility')).toEqual('visible'); + expect(path_selection.attr('d')).toEqual('M100,108 l0,0 l0,0 l0,0z'); }); }); describe('SelectionTool can handle move of selection', () => { beforeEach(() => { - svg.svg.node().dispatchEvent(new MouseEvent('mousedown', {clientX: 100, clientY: 100})); - window.dispatchEvent(new MouseEvent('mousemove', {clientX: 300, clientY: 300})); + svg.svg.node().dispatchEvent(new MouseEvent('mousedown', { clientX: 100, clientY: 100 })); + window.dispatchEvent(new MouseEvent('mousemove', { clientX: 300, clientY: 300 })); }); it('path should have got changed parameters', () => { - expect(path_selection.attr('d')).toEqual('M100,108 l200,0 l0,200 l-200,0z'); + expect(path_selection.attr('d')).toEqual('M100,108 l200,0 l0,200 l-200,0z'); }); }); describe('SelectionTool can handle end of selection', () => { beforeEach(() => { - svg.svg.node().dispatchEvent(new MouseEvent('mousedown', {clientX: 100, clientY: 100})); - window.dispatchEvent(new MouseEvent('mousemove', {clientX: 200, clientY: 200})); - window.dispatchEvent(new MouseEvent('mouseup', {clientX: 200, clientY: 200})); + svg.svg.node().dispatchEvent(new MouseEvent('mousedown', { clientX: 100, clientY: 100 })); + window.dispatchEvent(new MouseEvent('mousemove', { clientX: 200, clientY: 200 })); + window.dispatchEvent(new MouseEvent('mouseup', { clientX: 200, clientY: 200 })); }); it('path should be hidden', () => { @@ -82,8 +81,8 @@ describe('SelectionTool', () => { describe('SelectionTool can deselect after click outside', () => { beforeEach(() => { - svg.svg.node().dispatchEvent(new MouseEvent('mousedown', {clientX: 300, clientY: 300})); - window.dispatchEvent(new MouseEvent('mouseup', {clientX: 300, clientY: 300})); + svg.svg.node().dispatchEvent(new MouseEvent('mousedown', { clientX: 300, clientY: 300 })); + window.dispatchEvent(new MouseEvent('mouseup', { clientX: 300, clientY: 300 })); }); it('rectangle should be selected', () => { @@ -94,9 +93,9 @@ describe('SelectionTool', () => { describe('SelectionTool can handle end of selection in reverse direction', () => { beforeEach(() => { - svg.svg.node().dispatchEvent(new MouseEvent('mousedown', {clientX: 200, clientY: 200})); - window.dispatchEvent(new MouseEvent('mousemove', {clientX: 100, clientY: 100})); - window.dispatchEvent(new MouseEvent('mouseup', {clientX: 100, clientY: 100})); + svg.svg.node().dispatchEvent(new MouseEvent('mousedown', { clientX: 200, clientY: 200 })); + window.dispatchEvent(new MouseEvent('mousemove', { clientX: 100, clientY: 100 })); + window.dispatchEvent(new MouseEvent('mouseup', { clientX: 100, clientY: 100 })); }); it('rectangle should be selected', () => { @@ -108,12 +107,12 @@ describe('SelectionTool', () => { beforeEach(() => { tool.setEnabled(false); tool.draw(svg.svg, context); - - svg.svg.node().dispatchEvent(new MouseEvent('mousedown', {clientX: 100, clientY: 100})); + + svg.svg.node().dispatchEvent(new MouseEvent('mousedown', { clientX: 100, clientY: 100 })); }); it('path should be still hiden', () => { - expect(path_selection.attr('visibility')).toEqual('hidden'); + expect(path_selection.attr('visibility')).toEqual('hidden'); }); }); @@ -121,11 +120,11 @@ describe('SelectionTool', () => { beforeEach(() => { context.transformation.x = 100; context.transformation.y = 100; - svg.svg.node().dispatchEvent(new MouseEvent('mousedown', {clientX: 100, clientY: 100})); + svg.svg.node().dispatchEvent(new MouseEvent('mousedown', { clientX: 100, clientY: 100 })); }); it('path should have d adjusted for transformation', () => { - expect(path_selection.attr('d')).toEqual('M0,8 l0,0 l0,0 l0,0z'); + expect(path_selection.attr('d')).toEqual('M0,8 l0,0 l0,0 l0,0z'); }); }); }); diff --git a/src/app/cartography/tools/selection-tool.ts b/src/app/cartography/tools/selection-tool.ts index 228a1a53..2c6e12cf 100644 --- a/src/app/cartography/tools/selection-tool.ts +++ b/src/app/cartography/tools/selection-tool.ts @@ -1,35 +1,50 @@ -import { Injectable } from "@angular/core"; -import { mouse, select } from "d3-selection"; -import { Subject } from "rxjs"; - -import { SVGSelection } from "../models/types"; -import { Context } from "../models/context"; -import { Rectangle } from "../models/rectangle"; -import { SelectionEventSource } from "../events/selection-event-source"; +import { Injectable, EventEmitter } from '@angular/core'; +import { mouse, select, event } from 'd3-selection'; +import { Subject } from 'rxjs'; +import { SVGSelection } from '../models/types'; +import { Context } from '../models/context'; +import { Rectangle } from '../models/rectangle'; +import { SelectionEventSource } from '../events/selection-event-source'; @Injectable() export class SelectionTool { static readonly SELECTABLE_CLASS = '.selectable'; public rectangleSelected = new Subject(); + public contextMenuOpened = new EventEmitter(); private path; private enabled = false; public constructor( - private context: Context, + private context: Context, private selectionEventSource: SelectionEventSource ) {} + public disableContextMenu(){ + + } + public setEnabled(enabled) { this.enabled = enabled; + this.contextMenuOpened.emit(true); } private activate(selection) { const self = this; - selection.on("mousedown", function() { + selection.on('mousedown', function() { + // prevent deselection on right click + if (event.button == 2) { + selection.on('contextmenu', () => { + event.preventDefault(); + }); + + self.contextMenuOpened.emit(event); + return; + } + const subject = select(window); const parent = this.parentElement; @@ -37,20 +52,17 @@ export class SelectionTool { self.startSelection(start); // clear selection - selection - .selectAll(SelectionTool.SELECTABLE_CLASS) - .classed("selected", false); + selection.selectAll(SelectionTool.SELECTABLE_CLASS).classed('selected', false); subject - .on("mousemove.selection", function() { + .on('mousemove.selection', function() { const end = self.transformation(mouse(parent)); self.moveSelection(start, end); - }).on("mouseup.selection", function() { + }) + .on('mouseup.selection', function() { const end = self.transformation(mouse(parent)); self.endSelection(start, end); - subject - .on("mousemove.selection", null) - .on("mouseup.selection", null); + subject.on('mousemove.selection', null).on('mouseup.selection', null); }); }); } @@ -60,45 +72,40 @@ export class SelectionTool { } public draw(selection: SVGSelection, context: Context) { - const canvas = selection.select("g.canvas"); + const canvas = selection.select('g.canvas'); - if (!canvas.select("g.selection-line-tool").node()) { + if (!canvas.select('g.selection-line-tool').node()) { const g = canvas.append('g'); - g.attr("class", "selection-line-tool"); + g.attr('class', 'selection-line-tool'); - this.path = g.append("path"); - this.path - .attr("class", "selection") - .attr("visibility", "hidden"); + this.path = g.append('path'); + this.path.attr('class', 'selection').attr('visibility', 'hidden'); } - const tool = canvas.select("g.selection-line-tool"); + const tool = canvas.select('g.selection-line-tool'); const status = tool.attr('status'); - - if(status !== 'activated' && this.enabled) { + if (status !== 'activated' && this.enabled) { this.activate(selection); tool.attr('activated'); } - if(status !== 'deactivated' && !this.enabled) { + if (status !== 'deactivated' && !this.enabled) { this.deactivate(selection); tool.attr('deactivated'); } } private startSelection(start) { - this.path - .attr("d", this.rect(start[0], start[1], 0, 0)) - .attr("visibility", "visible"); + this.path.attr('d', this.rect(start[0], start[1], 0, 0)).attr('visibility', 'visible'); } private moveSelection(start, move) { - this.path.attr("d", this.rect(start[0], start[1], move[0] - start[0], move[1] - start[1])); + this.path.attr('d', this.rect(start[0], start[1], move[0] - start[0], move[1] - start[1])); this.selectedEvent(start, move); } private endSelection(start, end) { - this.path.attr("visibility", "hidden"); + this.path.attr('visibility', 'hidden'); this.selectedEvent(start, end); } @@ -111,7 +118,7 @@ export class SelectionTool { } private rect(x: number, y: number, w: number, h: number) { - return "M" + [x, y] + " l" + [w, 0] + " l" + [0, h] + " l" + [-w, 0] + "z"; + return 'M' + [x, y] + ' l' + [w, 0] + ' l' + [0, h] + ' l' + [-w, 0] + 'z'; } private transformation(point) { @@ -121,6 +128,4 @@ export class SelectionTool { point[1] - transformation_point.y - this.context.transformation.y ]; } - - } diff --git a/src/app/cartography/widgets/drawing-line.ts b/src/app/cartography/widgets/drawing-line.ts index c4ed8430..5f7f85bd 100644 --- a/src/app/cartography/widgets/drawing-line.ts +++ b/src/app/cartography/widgets/drawing-line.ts @@ -1,13 +1,12 @@ -import { Injectable } from "@angular/core"; +import { Injectable } from '@angular/core'; -import { line } from "d3-shape"; -import { mouse } from "d3-selection"; - -import { DrawingLine } from "../models/drawing-line"; -import { SVGSelection } from "../models/types"; -import { Point } from "../models/point"; -import { Context } from "../models/context"; +import { line } from 'd3-shape'; +import { mouse } from 'd3-selection'; +import { DrawingLine } from '../models/drawing-line'; +import { SVGSelection } from '../models/types'; +import { Point } from '../models/point'; +import { Context } from '../models/context'; @Injectable() export class DrawingLineWidget { @@ -15,7 +14,7 @@ export class DrawingLineWidget { private selection: SVGSelection; private drawing = false; private data = {}; - + public start(x: number, y: number, data: {}) { const self = this; @@ -52,37 +51,32 @@ export class DrawingLineWidget { } public draw(selection: SVGSelection, context: Context) { - const canvas = this.selection.select("g.canvas"); - if (!canvas.select("g.drawing-line-tool").node()) { - canvas.append('g').attr("class", "drawing-line-tool"); + const canvas = this.selection.select('g.canvas'); + if (!canvas.select('g.drawing-line-tool').node()) { + canvas.append('g').attr('class', 'drawing-line-tool'); } let link_data = []; if (this.drawing) { - link_data = [[ - [this.drawingLine.start.x, this.drawingLine.start.y], - [this.drawingLine.end.x, this.drawingLine.end.y] - ]]; + link_data = [ + [[this.drawingLine.start.x, this.drawingLine.start.y], [this.drawingLine.end.x, this.drawingLine.end.y]] + ]; } const value_line = line(); const drawing_line_tool = this.selection.select('g.drawing-line-tool'); - const tool = drawing_line_tool - .selectAll('path') - .data(link_data); + const tool = drawing_line_tool.selectAll('path').data(link_data); - const enter = tool - .enter() - .append('path'); + const enter = tool.enter().append('path'); tool .merge(enter) - .attr('d', value_line) - .attr('stroke', '#000') - .attr('stroke-width', '2'); + .attr('d', value_line) + .attr('stroke', '#000') + .attr('stroke-width', '2'); tool.exit().remove(); } diff --git a/src/app/cartography/widgets/drawing.ts b/src/app/cartography/widgets/drawing.ts index 307a826c..0b8808ab 100644 --- a/src/app/cartography/widgets/drawing.ts +++ b/src/app/cartography/widgets/drawing.ts @@ -1,22 +1,22 @@ -import { Injectable } from "@angular/core"; +import { Injectable } from '@angular/core'; -import { Widget } from "./widget"; -import { SVGSelection } from "../models/types"; -import { DrawingShapeWidget } from "./drawings/drawing-shape-widget"; -import { TextDrawingWidget } from "./drawings/text-drawing"; -import { ImageDrawingWidget } from "./drawings/image-drawing"; -import { RectDrawingWidget } from "./drawings/rect-drawing"; -import { LineDrawingWidget } from "./drawings/line-drawing"; -import { EllipseDrawingWidget } from "./drawings/ellipse-drawing"; -import { MapDrawing } from "../models/map/map-drawing"; -import { SelectionManager } from "../managers/selection-manager"; -import { LineElement } from "../models/drawings/line-element"; -import { EllipseElement } from "../models/drawings/ellipse-element"; +import { Widget } from './widget'; +import { SVGSelection } from '../models/types'; +import { DrawingShapeWidget } from './drawings/drawing-shape-widget'; +import { TextDrawingWidget } from './drawings/text-drawing'; +import { ImageDrawingWidget } from './drawings/image-drawing'; +import { RectDrawingWidget } from './drawings/rect-drawing'; +import { LineDrawingWidget } from './drawings/line-drawing'; +import { EllipseDrawingWidget } from './drawings/ellipse-drawing'; +import { MapDrawing } from '../models/map/map-drawing'; +import { SelectionManager } from '../managers/selection-manager'; +import { LineElement } from '../models/drawings/line-element'; +import { EllipseElement } from '../models/drawings/ellipse-element'; @Injectable() export class DrawingWidget implements Widget { private drawingWidgets: DrawingShapeWidget[] = []; - + constructor( private textDrawingWidget: TextDrawingWidget, private imageDrawingWidget: ImageDrawingWidget, @@ -35,88 +35,109 @@ export class DrawingWidget implements Widget { } public draw(view: SVGSelection) { - const drawing_body = view.selectAll("g.drawing_body") - .data((l:MapDrawing) => [l]); + const drawing_body = view.selectAll('g.drawing_body').data((l: MapDrawing) => [l]); - const drawing_body_enter = drawing_body.enter() + const drawing_body_enter = drawing_body + .enter() .append('g') - .attr("class", "drawing_body") + .attr('class', 'drawing_body'); - const drawing_body_merge = drawing_body.merge(drawing_body_enter) - .attr('transform', (d: MapDrawing) => { - return `translate(${d.x},${d.y}) rotate(${d.rotation})`; - }); - - this.drawingWidgets.forEach((widget) => { + const drawing_body_merge = drawing_body.merge(drawing_body_enter).attr('transform', (d: MapDrawing) => { + return `translate(${d.x},${d.y}) rotate(${d.rotation})`; + }); + + this.drawingWidgets.forEach(widget => { widget.draw(drawing_body_merge); }); drawing_body_merge .select('line.top') - .attr('stroke', 'transparent') - .attr('stroke-width', '8px') - .attr('x1', (drawing) => drawing.element instanceof EllipseElement ? drawing.element.cx - (drawing.element.width/10) : '0') - .attr('x2', (drawing) => drawing.element instanceof EllipseElement ? drawing.element.cx + (drawing.element.width/10) : drawing.element.width) - .attr('y1', '0') - .attr('y2', '0') - .attr('draggable', 'true') - .attr("cursor", "ns-resize"); + .attr('stroke', 'transparent') + .attr('stroke-width', '8px') + .attr('x1', drawing => + drawing.element instanceof EllipseElement ? drawing.element.cx - drawing.element.width / 10 : '0' + ) + .attr('x2', drawing => + drawing.element instanceof EllipseElement + ? drawing.element.cx + drawing.element.width / 10 + : drawing.element.width + ) + .attr('y1', '0') + .attr('y2', '0') + .attr('draggable', 'true') + .attr('cursor', 'ns-resize'); drawing_body_merge .select('line.bottom') - .attr('stroke', 'transparent') - .attr('stroke-width', '8px') - .attr('x1', (drawing) => drawing.element instanceof EllipseElement ? drawing.element.cx - (drawing.element.width/10) : '0') - .attr('x2', (drawing) => drawing.element instanceof EllipseElement ? drawing.element.cx + (drawing.element.width/10) : drawing.element.width) - .attr('y1', (drawing) => drawing.element.height) - .attr('y2', (drawing) => drawing.element.height) - .attr('draggable', 'true') - .attr("cursor", "ns-resize"); + .attr('stroke', 'transparent') + .attr('stroke-width', '8px') + .attr('x1', drawing => + drawing.element instanceof EllipseElement ? drawing.element.cx - drawing.element.width / 10 : '0' + ) + .attr('x2', drawing => + drawing.element instanceof EllipseElement + ? drawing.element.cx + drawing.element.width / 10 + : drawing.element.width + ) + .attr('y1', drawing => drawing.element.height) + .attr('y2', drawing => drawing.element.height) + .attr('draggable', 'true') + .attr('cursor', 'ns-resize'); drawing_body_merge .select('line.right') - .attr('stroke', 'transparent') - .attr('stroke-width', '8px') - .attr('x1', '0') - .attr('x2', '0') - .attr('y1', (drawing) => drawing.element instanceof EllipseElement ? drawing.element.cy - (drawing.element.height/10) : '0') - .attr('y2', (drawing) => drawing.element instanceof EllipseElement ? drawing.element.cy + (drawing.element.height/10) : drawing.element.height) - .attr('draggable', 'true') - .attr("cursor", "ew-resize"); + .attr('stroke', 'transparent') + .attr('stroke-width', '8px') + .attr('x1', '0') + .attr('x2', '0') + .attr('y1', drawing => + drawing.element instanceof EllipseElement ? drawing.element.cy - drawing.element.height / 10 : '0' + ) + .attr('y2', drawing => + drawing.element instanceof EllipseElement + ? drawing.element.cy + drawing.element.height / 10 + : drawing.element.height + ) + .attr('draggable', 'true') + .attr('cursor', 'ew-resize'); drawing_body_merge .select('line.left') - .attr('stroke', 'transparent') - .attr('stroke-width', '8px') - .attr('x1', (drawing) => drawing.element.width) - .attr('x2', (drawing) => drawing.element.width) - .attr('y1', (drawing) => drawing.element instanceof EllipseElement ? drawing.element.cy - (drawing.element.height/10) : '0') - .attr('y2', (drawing) => drawing.element instanceof EllipseElement ? drawing.element.cy + (drawing.element.height/10) : drawing.element.height) - .attr('draggable', 'true') - .attr("cursor", "ew-resize"); + .attr('stroke', 'transparent') + .attr('stroke-width', '8px') + .attr('x1', drawing => drawing.element.width) + .attr('x2', drawing => drawing.element.width) + .attr('y1', drawing => + drawing.element instanceof EllipseElement ? drawing.element.cy - drawing.element.height / 10 : '0' + ) + .attr('y2', drawing => + drawing.element instanceof EllipseElement + ? drawing.element.cy + drawing.element.height / 10 + : drawing.element.height + ) + .attr('draggable', 'true') + .attr('cursor', 'ew-resize'); drawing_body_merge .select('circle.left') - .attr('draggable', 'true') - .attr('fill', 'transparent') - .attr('stroke', 'transparent') - .attr('cx', (drawing) => (drawing.element as LineElement).x1) - .attr('cy', (drawing) => (drawing.element as LineElement).y1) - .attr('r', 10) - .attr("cursor", "move"); + .attr('draggable', 'true') + .attr('fill', 'transparent') + .attr('stroke', 'transparent') + .attr('cx', drawing => (drawing.element as LineElement).x1) + .attr('cy', drawing => (drawing.element as LineElement).y1) + .attr('r', 10) + .attr('cursor', 'move'); drawing_body_merge .select('circle.right') - .attr('draggable', 'true') - .attr('fill', 'transparent') - .attr('stroke', 'transparent') - .attr('cx', (drawing) => (drawing.element as LineElement).x2) - .attr('cy', (drawing) => (drawing.element as LineElement).y2) - .attr('r', 10) - .attr("cursor", "move"); - - drawing_body_merge - .classed('drawing_selected', (n: MapDrawing) => this.selectionManager.isSelected(n)); + .attr('draggable', 'true') + .attr('fill', 'transparent') + .attr('stroke', 'transparent') + .attr('cx', drawing => (drawing.element as LineElement).x2) + .attr('cy', drawing => (drawing.element as LineElement).y2) + .attr('r', 10) + .attr('cursor', 'move'); + drawing_body_merge.classed('drawing_selected', (n: MapDrawing) => this.selectionManager.isSelected(n)); } } diff --git a/src/app/cartography/widgets/drawings.backup.ts b/src/app/cartography/widgets/drawings.backup.ts index c5bd6205..5ecb032b 100644 --- a/src/app/cartography/widgets/drawings.backup.ts +++ b/src/app/cartography/widgets/drawings.backup.ts @@ -1,20 +1,19 @@ -import { Injectable, EventEmitter } from "@angular/core"; - -import { Widget } from "./widget"; -import { SVGSelection } from "../models/types"; -import { Layer } from "../models/layer"; -import { SvgToDrawingConverter } from "../helpers/svg-to-drawing-converter"; -import { Draggable, DraggableDrag, DraggableStart, DraggableEnd } from "../events/draggable"; -import { DrawingWidget } from "./drawing"; -import { drag, D3DragEvent } from "d3-drag"; -import { event } from "d3-selection"; -import { MapDrawing } from "../models/map/map-drawing"; -import { Context } from "../models/context"; -import { EllipseElement } from "../models/drawings/ellipse-element"; -import { ResizingEnd } from "../events/resizing"; -import { LineElement } from "../models/drawings/line-element"; -import { MapSettingsManager } from "../managers/map-settings-manager"; +import { Injectable, EventEmitter } from '@angular/core'; +import { Widget } from './widget'; +import { SVGSelection } from '../models/types'; +import { Layer } from '../models/layer'; +import { SvgToDrawingConverter } from '../helpers/svg-to-drawing-converter'; +import { Draggable, DraggableDrag, DraggableStart, DraggableEnd } from '../events/draggable'; +import { DrawingWidget } from './drawing'; +import { drag, D3DragEvent } from 'd3-drag'; +import { event } from 'd3-selection'; +import { MapDrawing } from '../models/map/map-drawing'; +import { Context } from '../models/context'; +import { EllipseElement } from '../models/drawings/ellipse-element'; +import { ResizingEnd } from '../events/resizing'; +import { LineElement } from '../models/drawings/line-element'; +import { MapSettingsManager } from '../managers/map-settings-manager'; @Injectable() export class DrawingsWidget implements Widget { @@ -26,7 +25,7 @@ export class DrawingsWidget implements Widget { // public onDrawingClicked = new EventEmitter(); // public onDrawingDragged = new EventEmitter(); // public onDrawingDragging = new EventEmitter(); - + constructor( private drawingWidget: DrawingWidget, private svgToDrawingConverter: SvgToDrawingConverter, @@ -41,9 +40,8 @@ export class DrawingsWidget implements Widget { } public draw(view: SVGSelection) { - const drawing = view - .selectAll("g.drawing") - .data((layer: Layer) => { + const drawing = view.selectAll('g.drawing').data( + (layer: Layer) => { layer.drawings.forEach((d: MapDrawing) => { try { d.element = this.svgToDrawingConverter.convert(d.svg); @@ -52,22 +50,23 @@ export class DrawingsWidget implements Widget { } }); return layer.drawings; - }, (l: MapDrawing) => { + }, + (l: MapDrawing) => { return l.id; - }); + } + ); - const drawing_enter = drawing.enter() + const drawing_enter = drawing + .enter() .append('g') - .attr('class', 'drawing') - .attr('drawing_id', (l: MapDrawing) => l.id) + .attr('class', 'drawing') + .attr('drawing_id', (l: MapDrawing) => l.id); const merge = drawing.merge(drawing_enter); this.drawingWidget.draw(merge); - drawing - .exit() - .remove(); + drawing.exit().remove(); if (!this.mapSettings.isReadOnly) { this.draggable.call(merge); @@ -81,24 +80,24 @@ export class DrawingsWidget implements Widget { let startEvent; let bottom = drag() .on('start', (datum: MapDrawing) => { - document.body.style.cursor = "ns-resize"; - topEdge = datum.y; - console.log("started"); + document.body.style.cursor = 'ns-resize'; + topEdge = datum.y; + console.log('started'); y = event.sourceEvent.clientY - this.context.getZeroZeroTransformationPoint().y; // startEvent = event; }) .on('drag', (datum: MapDrawing) => { const evt = event; - dy = y - (evt.sourceEvent.clientY - this.context.getZeroZeroTransformationPoint().y); + dy = y - (evt.sourceEvent.clientY - this.context.getZeroZeroTransformationPoint().y); y = event.sourceEvent.clientY - this.context.getZeroZeroTransformationPoint().y; let height = datum.element.height - dy; - if(height < 0) { + if (height < 0) { // height = datum.y - startEvent.y; datum.y += height; height = topEdge - datum.y; // console.log(topEdge - datum.y); } - console.log("Height", height); + console.log('Height', height); datum.element.height = height; // datum.element.height -= dy; @@ -116,7 +115,7 @@ export class DrawingsWidget implements Widget { // console.log(datum.element.height); // } else { // datum.element.height += evt.dy; - + // if (datum.element instanceof EllipseElement){ // (datum.element as EllipseElement).cy = (datum.element as EllipseElement).cy + evt.dy/2 < 0 ? 1 : (datum.element as EllipseElement).cy += evt.dy/2; // (datum.element as EllipseElement).ry = (datum.element as EllipseElement).ry + evt.dy/2 < 0 ? 1 : (datum.element as EllipseElement).ry += evt.dy/2; @@ -125,7 +124,7 @@ export class DrawingsWidget implements Widget { // } else { // dy = y - (evt.sourceEvent.clientY - this.context.getZeroZeroTransformationPoint().y); // y = evt.sourceEvent.clientY - this.context.getZeroZeroTransformationPoint().y; - + // if ((datum.element.height + dy) < 0){ // isReflectedVertical = false; // y = topEdge; @@ -145,7 +144,7 @@ export class DrawingsWidget implements Widget { this.redrawDrawing(view, datum); }) .on('end', (datum: MapDrawing) => { - document.body.style.cursor = "initial"; + document.body.style.cursor = 'initial'; this.resizingFinished.emit(this.createResizingEvent(datum)); }); @@ -153,16 +152,16 @@ export class DrawingsWidget implements Widget { .on('start', (datum: MapDrawing) => { y = event.sourceEvent.clientY - this.context.getZeroZeroTransformationPoint().y; bottomEdge = y + datum.element.height; - document.body.style.cursor = "ns-resize"; + document.body.style.cursor = 'ns-resize'; }) .on('drag', (datum: MapDrawing) => { const evt = event; if (!isReflectedVertical) { - dy = y - (evt.sourceEvent.clientY - this.context.getZeroZeroTransformationPoint().y); + dy = y - (evt.sourceEvent.clientY - this.context.getZeroZeroTransformationPoint().y); y = evt.sourceEvent.clientY - this.context.getZeroZeroTransformationPoint().y; - if ((datum.element.height + dy) < 0){ + if (datum.element.height + dy < 0) { y = bottomEdge; isReflectedVertical = true; datum.element.height = Math.abs(datum.element.height + evt.dy); @@ -170,21 +169,33 @@ export class DrawingsWidget implements Widget { datum.y = evt.sourceEvent.clientY - this.context.getZeroZeroTransformationPoint().y; datum.element.height += dy; if (datum.element instanceof EllipseElement) { - (datum.element as EllipseElement).cy = (datum.element as EllipseElement).cy + dy/2 < 0 ? 1 : (datum.element as EllipseElement).cy += dy/2; - (datum.element as EllipseElement).ry = (datum.element as EllipseElement).ry + dy/2 < 0 ? 1 : (datum.element as EllipseElement).ry += dy/2; + (datum.element as EllipseElement).cy = + (datum.element as EllipseElement).cy + dy / 2 < 0 + ? 1 + : ((datum.element as EllipseElement).cy += dy / 2); + (datum.element as EllipseElement).ry = + (datum.element as EllipseElement).ry + dy / 2 < 0 + ? 1 + : ((datum.element as EllipseElement).ry += dy / 2); } } } else { - if ((datum.element.height + evt.dy) < 0) { + if (datum.element.height + evt.dy < 0) { isReflectedVertical = false; y = bottomEdge; datum.element.height = Math.abs(datum.element.height + evt.dy); } else { datum.element.height += evt.dy; - if (datum.element instanceof EllipseElement){ - (datum.element as EllipseElement).cy = (datum.element as EllipseElement).cy + evt.dy/2 < 0 ? 1 : (datum.element as EllipseElement).cy += evt.dy/2; - (datum.element as EllipseElement).ry = (datum.element as EllipseElement).ry + evt.dy/2 < 0 ? 1 : (datum.element as EllipseElement).ry += evt.dy/2; + if (datum.element instanceof EllipseElement) { + (datum.element as EllipseElement).cy = + (datum.element as EllipseElement).cy + evt.dy / 2 < 0 + ? 1 + : ((datum.element as EllipseElement).cy += evt.dy / 2); + (datum.element as EllipseElement).ry = + (datum.element as EllipseElement).ry + evt.dy / 2 < 0 + ? 1 + : ((datum.element as EllipseElement).ry += evt.dy / 2); } } } @@ -192,7 +203,7 @@ export class DrawingsWidget implements Widget { this.redrawDrawing(view, datum); }) .on('end', (datum: MapDrawing) => { - document.body.style.cursor = "initial"; + document.body.style.cursor = 'initial'; this.resizingFinished.emit(this.createResizingEvent(datum)); }); @@ -205,7 +216,7 @@ export class DrawingsWidget implements Widget { .on('start', (datum: MapDrawing) => { x = event.sourceEvent.clientX - this.context.getZeroZeroTransformationPoint().x; leftEdge = x + datum.element.width; - document.body.style.cursor = "ew-resize"; + document.body.style.cursor = 'ew-resize'; }) .on('drag', (datum: MapDrawing) => { const evt = event; @@ -214,7 +225,7 @@ export class DrawingsWidget implements Widget { dx = x - (evt.sourceEvent.clientX - this.context.getZeroZeroTransformationPoint().x); x = evt.sourceEvent.clientX - this.context.getZeroZeroTransformationPoint().x; - if ((datum.element.width + dx) < 0) { + if (datum.element.width + dx < 0) { x = leftEdge; isReflectedHorizontal = true; datum.element.width = Math.abs(datum.element.width + evt.dx); @@ -222,56 +233,74 @@ export class DrawingsWidget implements Widget { datum.x = evt.sourceEvent.clientX - this.context.getZeroZeroTransformationPoint().x; datum.element.width += dx; if (datum.element instanceof EllipseElement) { - (datum.element as EllipseElement).cx = (datum.element as EllipseElement).cx + dx/2 < 0 ? 1 : (datum.element as EllipseElement).cx += dx/2; - (datum.element as EllipseElement).rx = (datum.element as EllipseElement).rx + dx/2 < 0 ? 1 : (datum.element as EllipseElement).rx += dx/2; + (datum.element as EllipseElement).cx = + (datum.element as EllipseElement).cx + dx / 2 < 0 + ? 1 + : ((datum.element as EllipseElement).cx += dx / 2); + (datum.element as EllipseElement).rx = + (datum.element as EllipseElement).rx + dx / 2 < 0 + ? 1 + : ((datum.element as EllipseElement).rx += dx / 2); } } } else { - if ((datum.element.width + evt.dx) < 0) { + if (datum.element.width + evt.dx < 0) { x = leftEdge; isReflectedHorizontal = false; datum.element.width = Math.abs(datum.element.width + evt.dx); } else { - if (datum.element instanceof EllipseElement){ - (datum.element as EllipseElement).cx = (datum.element as EllipseElement).cx + evt.dx/2 < 0 ? 1 : (datum.element as EllipseElement).cx += evt.dx/2; - (datum.element as EllipseElement).rx = (datum.element as EllipseElement).rx + evt.dx/2 < 0 ? 1 : (datum.element as EllipseElement).rx += evt.dx/2; + if (datum.element instanceof EllipseElement) { + (datum.element as EllipseElement).cx = + (datum.element as EllipseElement).cx + evt.dx / 2 < 0 + ? 1 + : ((datum.element as EllipseElement).cx += evt.dx / 2); + (datum.element as EllipseElement).rx = + (datum.element as EllipseElement).rx + evt.dx / 2 < 0 + ? 1 + : ((datum.element as EllipseElement).rx += evt.dx / 2); } - datum.element.width = (datum.element.width + evt.dx) < 0 ? 1 : datum.element.width += evt.dx; + datum.element.width = datum.element.width + evt.dx < 0 ? 1 : (datum.element.width += evt.dx); } } this.redrawDrawing(view, datum); }) .on('end', (datum: MapDrawing) => { - document.body.style.cursor = "initial"; + document.body.style.cursor = 'initial'; this.resizingFinished.emit(this.createResizingEvent(datum)); }); let left = drag() .on('start', (datum: MapDrawing) => { - document.body.style.cursor = "ew-resize"; + document.body.style.cursor = 'ew-resize'; rightEdge = datum.x; }) .on('drag', (datum: MapDrawing) => { const evt = event; if (!isReflectedHorizontal) { - if ((datum.element.width + evt.dx) < 0) { + if (datum.element.width + evt.dx < 0) { x = rightEdge; isReflectedHorizontal = true; datum.element.width = Math.abs(datum.element.width + evt.dx); } else { - if (datum.element instanceof EllipseElement){ - (datum.element as EllipseElement).cx = (datum.element as EllipseElement).cx + evt.dx/2 < 0 ? 1 : (datum.element as EllipseElement).cx += evt.dx/2; - (datum.element as EllipseElement).rx = (datum.element as EllipseElement).rx + evt.dx/2 < 0 ? 1 : (datum.element as EllipseElement).rx += evt.dx/2; + if (datum.element instanceof EllipseElement) { + (datum.element as EllipseElement).cx = + (datum.element as EllipseElement).cx + evt.dx / 2 < 0 + ? 1 + : ((datum.element as EllipseElement).cx += evt.dx / 2); + (datum.element as EllipseElement).rx = + (datum.element as EllipseElement).rx + evt.dx / 2 < 0 + ? 1 + : ((datum.element as EllipseElement).rx += evt.dx / 2); } - datum.element.width = (datum.element.width + evt.dx) < 0 ? 1 : datum.element.width += evt.dx; + datum.element.width = datum.element.width + evt.dx < 0 ? 1 : (datum.element.width += evt.dx); } } else { dx = x - (evt.sourceEvent.clientX - this.context.getZeroZeroTransformationPoint().x); x = evt.sourceEvent.clientX - this.context.getZeroZeroTransformationPoint().x; - if ((datum.element.width + dx) < 0) { + if (datum.element.width + dx < 0) { x = rightEdge; isReflectedHorizontal = false; datum.element.width = Math.abs(datum.element.width + evt.dx); @@ -279,8 +308,14 @@ export class DrawingsWidget implements Widget { datum.x = evt.sourceEvent.clientX - this.context.getZeroZeroTransformationPoint().x; datum.element.width += dx; if (datum.element instanceof EllipseElement) { - (datum.element as EllipseElement).cx = (datum.element as EllipseElement).cx + dx/2 < 0 ? 1 : (datum.element as EllipseElement).cx += dx/2; - (datum.element as EllipseElement).rx = (datum.element as EllipseElement).rx + dx/2 < 0 ? 1 : (datum.element as EllipseElement).rx += dx/2; + (datum.element as EllipseElement).cx = + (datum.element as EllipseElement).cx + dx / 2 < 0 + ? 1 + : ((datum.element as EllipseElement).cx += dx / 2); + (datum.element as EllipseElement).rx = + (datum.element as EllipseElement).rx + dx / 2 < 0 + ? 1 + : ((datum.element as EllipseElement).rx += dx / 2); } } } @@ -288,13 +323,13 @@ export class DrawingsWidget implements Widget { this.redrawDrawing(view, datum); }) .on('end', (datum: MapDrawing) => { - document.body.style.cursor = "initial"; + document.body.style.cursor = 'initial'; this.resizingFinished.emit(this.createResizingEvent(datum)); }); let circleMoveRight = drag() .on('start', () => { - document.body.style.cursor = "move"; + document.body.style.cursor = 'move'; }) .on('drag', (datum: MapDrawing) => { const evt = event; @@ -305,13 +340,13 @@ export class DrawingsWidget implements Widget { this.redrawDrawing(view, datum); }) .on('end', (datum: MapDrawing) => { - document.body.style.cursor = "initial"; + document.body.style.cursor = 'initial'; this.resizingFinished.emit(this.createResizingEvent(datum)); }); let circleMoveLeft = drag() .on('start', () => { - document.body.style.cursor = "move"; + document.body.style.cursor = 'move'; }) .on('drag', (datum: MapDrawing) => { const evt = event; @@ -322,39 +357,27 @@ export class DrawingsWidget implements Widget { this.redrawDrawing(view, datum); }) .on('end', (datum: MapDrawing) => { - document.body.style.cursor = "initial"; + document.body.style.cursor = 'initial'; this.resizingFinished.emit(this.createResizingEvent(datum)); }); - merge - .select('line.bottom') - .call(bottom); + merge.select('line.bottom').call(bottom); - merge - .select('line.top') - .call(top); + merge.select('line.top').call(top); - merge - .select('line.right') - .call(right); + merge.select('line.right').call(right); - merge - .select('line.left') - .call(left); + merge.select('line.left').call(left); - merge - .select('circle.right') - .call(circleMoveRight) + merge.select('circle.right').call(circleMoveRight); - merge - .select('circle.left') - .call(circleMoveLeft) + merge.select('circle.left').call(circleMoveLeft); } - private createResizingEvent(datum: MapDrawing){ + private createResizingEvent(datum: MapDrawing) { const evt = new ResizingEnd(); evt.x = datum.x; - evt.y = datum. y; + evt.y = datum.y; evt.width = datum.element.width; evt.height = datum.element.height; evt.datum = datum; @@ -364,5 +387,4 @@ export class DrawingsWidget implements Widget { private selectDrawing(view: SVGSelection, drawing: MapDrawing) { return view.selectAll(`g.drawing[drawing_id="${drawing.id}"]`); } - } diff --git a/src/app/cartography/widgets/drawings.ts b/src/app/cartography/widgets/drawings.ts index 96a1f1e5..819bb828 100644 --- a/src/app/cartography/widgets/drawings.ts +++ b/src/app/cartography/widgets/drawings.ts @@ -1,32 +1,33 @@ -import { Injectable, EventEmitter } from "@angular/core"; - -import { Widget } from "./widget"; -import { SVGSelection } from "../models/types"; -import { Layer } from "../models/layer"; -import { SvgToDrawingConverter } from "../helpers/svg-to-drawing-converter"; -import { Draggable, DraggableDrag, DraggableStart, DraggableEnd } from "../events/draggable"; -import { DrawingWidget } from "./drawing"; -import { drag, D3DragEvent } from "d3-drag"; -import { event } from "d3-selection"; -import { MapDrawing } from "../models/map/map-drawing"; -import { Context } from "../models/context"; -import { EllipseElement } from "../models/drawings/ellipse-element"; -import { ResizingEnd } from "../events/resizing"; -import { LineElement } from "../models/drawings/line-element"; -import { MapSettingsManager } from "../managers/map-settings-manager"; +import { Injectable, EventEmitter } from '@angular/core'; +import { Widget } from './widget'; +import { SVGSelection } from '../models/types'; +import { Layer } from '../models/layer'; +import { SvgToDrawingConverter } from '../helpers/svg-to-drawing-converter'; +import { Draggable, DraggableDrag, DraggableStart, DraggableEnd } from '../events/draggable'; +import { DrawingWidget } from './drawing'; +import { drag, D3DragEvent } from 'd3-drag'; +import { event } from 'd3-selection'; +import { MapDrawing } from '../models/map/map-drawing'; +import { Context } from '../models/context'; +import { EllipseElement } from '../models/drawings/ellipse-element'; +import { ResizingEnd } from '../events/resizing'; +import { LineElement } from '../models/drawings/line-element'; +import { MapSettingsManager } from '../managers/map-settings-manager'; +import { DrawingContextMenu } from '../events/event-source'; @Injectable() export class DrawingsWidget implements Widget { public draggable = new Draggable(); public draggingEnabled = false; public resizingFinished = new EventEmitter>(); + public onContextMenu = new EventEmitter(); // public onContextMenu = new EventEmitter(); // public onDrawingClicked = new EventEmitter(); // public onDrawingDragged = new EventEmitter(); // public onDrawingDragging = new EventEmitter(); - + constructor( private drawingWidget: DrawingWidget, private svgToDrawingConverter: SvgToDrawingConverter, @@ -41,9 +42,8 @@ export class DrawingsWidget implements Widget { } public draw(view: SVGSelection) { - const drawing = view - .selectAll("g.drawing") - .data((layer: Layer) => { + const drawing = view.selectAll('g.drawing').data( + (layer: Layer) => { layer.drawings.forEach((d: MapDrawing) => { try { d.element = this.svgToDrawingConverter.convert(d.svg); @@ -52,22 +52,27 @@ export class DrawingsWidget implements Widget { } }); return layer.drawings; - }, (l: MapDrawing) => { + }, + (l: MapDrawing) => { return l.id; - }); + } + ); - const drawing_enter = drawing.enter() + const drawing_enter = drawing + .enter() .append('g') - .attr('class', 'drawing') - .attr('drawing_id', (l: MapDrawing) => l.id) + .attr('class', 'drawing') + .attr('drawing_id', (l: MapDrawing) => l.id) + .on('contextmenu', (l: MapDrawing) => { + event.preventDefault(); + this.onContextMenu.emit(new DrawingContextMenu(event, l)); + }); const merge = drawing.merge(drawing_enter); this.drawingWidget.draw(merge); - drawing - .exit() - .remove(); + drawing.exit().remove(); if (!this.mapSettings.isReadOnly) { this.draggable.call(merge); @@ -80,30 +85,36 @@ export class DrawingsWidget implements Widget { let isReflectedVertical: boolean = false; let bottom = drag() .on('start', (datum: MapDrawing) => { - document.body.style.cursor = "ns-resize"; - topEdge = datum.y; + document.body.style.cursor = 'ns-resize'; + topEdge = datum.y; }) .on('drag', (datum: MapDrawing) => { const evt = event; if (!isReflectedVertical) { - if ((datum.element.height + evt.dy) < 0) { + if (datum.element.height + evt.dy < 0) { isReflectedVertical = true; y = topEdge; datum.element.height = Math.abs(datum.element.height + evt.dy); } else { datum.element.height += evt.dy; - - if (datum.element instanceof EllipseElement){ - (datum.element as EllipseElement).cy = (datum.element as EllipseElement).cy + evt.dy/2 < 0 ? 1 : (datum.element as EllipseElement).cy += evt.dy/2; - (datum.element as EllipseElement).ry = (datum.element as EllipseElement).ry + evt.dy/2 < 0 ? 1 : (datum.element as EllipseElement).ry += evt.dy/2; + + if (datum.element instanceof EllipseElement) { + (datum.element as EllipseElement).cy = + (datum.element as EllipseElement).cy + evt.dy / 2 < 0 + ? 1 + : ((datum.element as EllipseElement).cy += evt.dy / 2); + (datum.element as EllipseElement).ry = + (datum.element as EllipseElement).ry + evt.dy / 2 < 0 + ? 1 + : ((datum.element as EllipseElement).ry += evt.dy / 2); } } } else { - dy = y - (evt.sourceEvent.clientY - this.context.getZeroZeroTransformationPoint().y); + dy = y - (evt.sourceEvent.clientY - this.context.getZeroZeroTransformationPoint().y); y = evt.sourceEvent.clientY - this.context.getZeroZeroTransformationPoint().y; - - if ((datum.element.height + dy) < 0){ + + if (datum.element.height + dy < 0) { isReflectedVertical = false; y = topEdge; datum.element.height = Math.abs(datum.element.height + evt.dy); @@ -111,8 +122,14 @@ export class DrawingsWidget implements Widget { datum.y = evt.sourceEvent.clientY - this.context.getZeroZeroTransformationPoint().y; datum.element.height += dy; if (datum.element instanceof EllipseElement) { - (datum.element as EllipseElement).cy = (datum.element as EllipseElement).cy + dy/2 < 0 ? 1 : (datum.element as EllipseElement).cy += dy/2; - (datum.element as EllipseElement).ry = (datum.element as EllipseElement).ry + dy/2 < 0 ? 1 : (datum.element as EllipseElement).ry += dy/2; + (datum.element as EllipseElement).cy = + (datum.element as EllipseElement).cy + dy / 2 < 0 + ? 1 + : ((datum.element as EllipseElement).cy += dy / 2); + (datum.element as EllipseElement).ry = + (datum.element as EllipseElement).ry + dy / 2 < 0 + ? 1 + : ((datum.element as EllipseElement).ry += dy / 2); } } } @@ -120,7 +137,7 @@ export class DrawingsWidget implements Widget { this.redrawDrawing(view, datum); }) .on('end', (datum: MapDrawing) => { - document.body.style.cursor = "initial"; + document.body.style.cursor = 'initial'; this.resizingFinished.emit(this.createResizingEvent(datum)); }); @@ -128,16 +145,16 @@ export class DrawingsWidget implements Widget { .on('start', (datum: MapDrawing) => { y = event.sourceEvent.clientY - this.context.getZeroZeroTransformationPoint().y; bottomEdge = y + datum.element.height; - document.body.style.cursor = "ns-resize"; + document.body.style.cursor = 'ns-resize'; }) .on('drag', (datum: MapDrawing) => { const evt = event; if (!isReflectedVertical) { - dy = y - (evt.sourceEvent.clientY - this.context.getZeroZeroTransformationPoint().y); + dy = y - (evt.sourceEvent.clientY - this.context.getZeroZeroTransformationPoint().y); y = evt.sourceEvent.clientY - this.context.getZeroZeroTransformationPoint().y; - if ((datum.element.height + dy) < 0){ + if (datum.element.height + dy < 0) { y = bottomEdge; isReflectedVertical = true; datum.element.height = Math.abs(datum.element.height + evt.dy); @@ -145,21 +162,33 @@ export class DrawingsWidget implements Widget { datum.y = evt.sourceEvent.clientY - this.context.getZeroZeroTransformationPoint().y; datum.element.height += dy; if (datum.element instanceof EllipseElement) { - (datum.element as EllipseElement).cy = (datum.element as EllipseElement).cy + dy/2 < 0 ? 1 : (datum.element as EllipseElement).cy += dy/2; - (datum.element as EllipseElement).ry = (datum.element as EllipseElement).ry + dy/2 < 0 ? 1 : (datum.element as EllipseElement).ry += dy/2; + (datum.element as EllipseElement).cy = + (datum.element as EllipseElement).cy + dy / 2 < 0 + ? 1 + : ((datum.element as EllipseElement).cy += dy / 2); + (datum.element as EllipseElement).ry = + (datum.element as EllipseElement).ry + dy / 2 < 0 + ? 1 + : ((datum.element as EllipseElement).ry += dy / 2); } } } else { - if ((datum.element.height + evt.dy) < 0) { + if (datum.element.height + evt.dy < 0) { isReflectedVertical = false; y = bottomEdge; datum.element.height = Math.abs(datum.element.height + evt.dy); } else { datum.element.height += evt.dy; - if (datum.element instanceof EllipseElement){ - (datum.element as EllipseElement).cy = (datum.element as EllipseElement).cy + evt.dy/2 < 0 ? 1 : (datum.element as EllipseElement).cy += evt.dy/2; - (datum.element as EllipseElement).ry = (datum.element as EllipseElement).ry + evt.dy/2 < 0 ? 1 : (datum.element as EllipseElement).ry += evt.dy/2; + if (datum.element instanceof EllipseElement) { + (datum.element as EllipseElement).cy = + (datum.element as EllipseElement).cy + evt.dy / 2 < 0 + ? 1 + : ((datum.element as EllipseElement).cy += evt.dy / 2); + (datum.element as EllipseElement).ry = + (datum.element as EllipseElement).ry + evt.dy / 2 < 0 + ? 1 + : ((datum.element as EllipseElement).ry += evt.dy / 2); } } } @@ -167,7 +196,7 @@ export class DrawingsWidget implements Widget { this.redrawDrawing(view, datum); }) .on('end', (datum: MapDrawing) => { - document.body.style.cursor = "initial"; + document.body.style.cursor = 'initial'; this.resizingFinished.emit(this.createResizingEvent(datum)); }); @@ -180,7 +209,7 @@ export class DrawingsWidget implements Widget { .on('start', (datum: MapDrawing) => { x = event.sourceEvent.clientX - this.context.getZeroZeroTransformationPoint().x; leftEdge = x + datum.element.width; - document.body.style.cursor = "ew-resize"; + document.body.style.cursor = 'ew-resize'; }) .on('drag', (datum: MapDrawing) => { const evt = event; @@ -189,7 +218,7 @@ export class DrawingsWidget implements Widget { dx = x - (evt.sourceEvent.clientX - this.context.getZeroZeroTransformationPoint().x); x = evt.sourceEvent.clientX - this.context.getZeroZeroTransformationPoint().x; - if ((datum.element.width + dx) < 0) { + if (datum.element.width + dx < 0) { x = leftEdge; isReflectedHorizontal = true; datum.element.width = Math.abs(datum.element.width + evt.dx); @@ -197,56 +226,74 @@ export class DrawingsWidget implements Widget { datum.x = evt.sourceEvent.clientX - this.context.getZeroZeroTransformationPoint().x; datum.element.width += dx; if (datum.element instanceof EllipseElement) { - (datum.element as EllipseElement).cx = (datum.element as EllipseElement).cx + dx/2 < 0 ? 1 : (datum.element as EllipseElement).cx += dx/2; - (datum.element as EllipseElement).rx = (datum.element as EllipseElement).rx + dx/2 < 0 ? 1 : (datum.element as EllipseElement).rx += dx/2; + (datum.element as EllipseElement).cx = + (datum.element as EllipseElement).cx + dx / 2 < 0 + ? 1 + : ((datum.element as EllipseElement).cx += dx / 2); + (datum.element as EllipseElement).rx = + (datum.element as EllipseElement).rx + dx / 2 < 0 + ? 1 + : ((datum.element as EllipseElement).rx += dx / 2); } } } else { - if ((datum.element.width + evt.dx) < 0) { + if (datum.element.width + evt.dx < 0) { x = leftEdge; isReflectedHorizontal = false; datum.element.width = Math.abs(datum.element.width + evt.dx); } else { - if (datum.element instanceof EllipseElement){ - (datum.element as EllipseElement).cx = (datum.element as EllipseElement).cx + evt.dx/2 < 0 ? 1 : (datum.element as EllipseElement).cx += evt.dx/2; - (datum.element as EllipseElement).rx = (datum.element as EllipseElement).rx + evt.dx/2 < 0 ? 1 : (datum.element as EllipseElement).rx += evt.dx/2; + if (datum.element instanceof EllipseElement) { + (datum.element as EllipseElement).cx = + (datum.element as EllipseElement).cx + evt.dx / 2 < 0 + ? 1 + : ((datum.element as EllipseElement).cx += evt.dx / 2); + (datum.element as EllipseElement).rx = + (datum.element as EllipseElement).rx + evt.dx / 2 < 0 + ? 1 + : ((datum.element as EllipseElement).rx += evt.dx / 2); } - datum.element.width = (datum.element.width + evt.dx) < 0 ? 1 : datum.element.width += evt.dx; + datum.element.width = datum.element.width + evt.dx < 0 ? 1 : (datum.element.width += evt.dx); } } this.redrawDrawing(view, datum); }) .on('end', (datum: MapDrawing) => { - document.body.style.cursor = "initial"; + document.body.style.cursor = 'initial'; this.resizingFinished.emit(this.createResizingEvent(datum)); }); let left = drag() .on('start', (datum: MapDrawing) => { - document.body.style.cursor = "ew-resize"; + document.body.style.cursor = 'ew-resize'; rightEdge = datum.x; }) .on('drag', (datum: MapDrawing) => { const evt = event; if (!isReflectedHorizontal) { - if ((datum.element.width + evt.dx) < 0) { + if (datum.element.width + evt.dx < 0) { x = rightEdge; isReflectedHorizontal = true; datum.element.width = Math.abs(datum.element.width + evt.dx); } else { - if (datum.element instanceof EllipseElement){ - (datum.element as EllipseElement).cx = (datum.element as EllipseElement).cx + evt.dx/2 < 0 ? 1 : (datum.element as EllipseElement).cx += evt.dx/2; - (datum.element as EllipseElement).rx = (datum.element as EllipseElement).rx + evt.dx/2 < 0 ? 1 : (datum.element as EllipseElement).rx += evt.dx/2; + if (datum.element instanceof EllipseElement) { + (datum.element as EllipseElement).cx = + (datum.element as EllipseElement).cx + evt.dx / 2 < 0 + ? 1 + : ((datum.element as EllipseElement).cx += evt.dx / 2); + (datum.element as EllipseElement).rx = + (datum.element as EllipseElement).rx + evt.dx / 2 < 0 + ? 1 + : ((datum.element as EllipseElement).rx += evt.dx / 2); } - datum.element.width = (datum.element.width + evt.dx) < 0 ? 1 : datum.element.width += evt.dx; + datum.element.width = datum.element.width + evt.dx < 0 ? 1 : (datum.element.width += evt.dx); } } else { dx = x - (evt.sourceEvent.clientX - this.context.getZeroZeroTransformationPoint().x); x = evt.sourceEvent.clientX - this.context.getZeroZeroTransformationPoint().x; - if ((datum.element.width + dx) < 0) { + if (datum.element.width + dx < 0) { x = rightEdge; isReflectedHorizontal = false; datum.element.width = Math.abs(datum.element.width + evt.dx); @@ -254,8 +301,14 @@ export class DrawingsWidget implements Widget { datum.x = evt.sourceEvent.clientX - this.context.getZeroZeroTransformationPoint().x; datum.element.width += dx; if (datum.element instanceof EllipseElement) { - (datum.element as EllipseElement).cx = (datum.element as EllipseElement).cx + dx/2 < 0 ? 1 : (datum.element as EllipseElement).cx += dx/2; - (datum.element as EllipseElement).rx = (datum.element as EllipseElement).rx + dx/2 < 0 ? 1 : (datum.element as EllipseElement).rx += dx/2; + (datum.element as EllipseElement).cx = + (datum.element as EllipseElement).cx + dx / 2 < 0 + ? 1 + : ((datum.element as EllipseElement).cx += dx / 2); + (datum.element as EllipseElement).rx = + (datum.element as EllipseElement).rx + dx / 2 < 0 + ? 1 + : ((datum.element as EllipseElement).rx += dx / 2); } } } @@ -263,13 +316,13 @@ export class DrawingsWidget implements Widget { this.redrawDrawing(view, datum); }) .on('end', (datum: MapDrawing) => { - document.body.style.cursor = "initial"; + document.body.style.cursor = 'initial'; this.resizingFinished.emit(this.createResizingEvent(datum)); }); let circleMoveRight = drag() .on('start', () => { - document.body.style.cursor = "move"; + document.body.style.cursor = 'move'; }) .on('drag', (datum: MapDrawing) => { const evt = event; @@ -280,13 +333,13 @@ export class DrawingsWidget implements Widget { this.redrawDrawing(view, datum); }) .on('end', (datum: MapDrawing) => { - document.body.style.cursor = "initial"; + document.body.style.cursor = 'initial'; this.resizingFinished.emit(this.createResizingEvent(datum)); }); let circleMoveLeft = drag() .on('start', () => { - document.body.style.cursor = "move"; + document.body.style.cursor = 'move'; }) .on('drag', (datum: MapDrawing) => { const evt = event; @@ -297,39 +350,27 @@ export class DrawingsWidget implements Widget { this.redrawDrawing(view, datum); }) .on('end', (datum: MapDrawing) => { - document.body.style.cursor = "initial"; + document.body.style.cursor = 'initial'; this.resizingFinished.emit(this.createResizingEvent(datum)); }); - merge - .select('line.bottom') - .call(bottom); + merge.select('line.bottom').call(bottom); - merge - .select('line.top') - .call(top); + merge.select('line.top').call(top); - merge - .select('line.right') - .call(right); + merge.select('line.right').call(right); - merge - .select('line.left') - .call(left); + merge.select('line.left').call(left); - merge - .select('circle.right') - .call(circleMoveRight) + merge.select('circle.right').call(circleMoveRight); - merge - .select('circle.left') - .call(circleMoveLeft) + merge.select('circle.left').call(circleMoveLeft); } - private createResizingEvent(datum: MapDrawing){ + private createResizingEvent(datum: MapDrawing) { const evt = new ResizingEnd(); evt.x = datum.x; - evt.y = datum. y; + evt.y = datum.y; evt.width = datum.element.width; evt.height = datum.element.height; evt.datum = datum; @@ -339,5 +380,4 @@ export class DrawingsWidget implements Widget { private selectDrawing(view: SVGSelection, drawing: MapDrawing) { return view.selectAll(`g.drawing[drawing_id="${drawing.id}"]`); } - } diff --git a/src/app/cartography/widgets/drawings/drawing-shape-widget.ts b/src/app/cartography/widgets/drawings/drawing-shape-widget.ts index f18a0950..96e49bef 100644 --- a/src/app/cartography/widgets/drawings/drawing-shape-widget.ts +++ b/src/app/cartography/widgets/drawings/drawing-shape-widget.ts @@ -1,4 +1,4 @@ -import { SVGSelection } from "../../models/types"; +import { SVGSelection } from '../../models/types'; export interface DrawingShapeWidget { draw(view: SVGSelection); diff --git a/src/app/cartography/widgets/drawings/ellipse-drawing.spec.ts b/src/app/cartography/widgets/drawings/ellipse-drawing.spec.ts index 1f7ec018..82a2918f 100644 --- a/src/app/cartography/widgets/drawings/ellipse-drawing.spec.ts +++ b/src/app/cartography/widgets/drawings/ellipse-drawing.spec.ts @@ -1,16 +1,14 @@ -import { TestSVGCanvas } from "../../testing"; -import { EllipseElement } from "../../models/drawings/ellipse-element"; -import { QtDasharrayFixer } from "../../helpers/qt-dasharray-fixer"; -import { MapDrawing } from "../../models/map/map-drawing"; -import { EllipseDrawingWidget } from "./ellipse-drawing"; - +import { TestSVGCanvas } from '../../testing'; +import { EllipseElement } from '../../models/drawings/ellipse-element'; +import { QtDasharrayFixer } from '../../helpers/qt-dasharray-fixer'; +import { MapDrawing } from '../../models/map/map-drawing'; +import { EllipseDrawingWidget } from './ellipse-drawing'; describe('EllipseDrawingWidget', () => { let svg: TestSVGCanvas; let widget: EllipseDrawingWidget; let drawing: MapDrawing; - beforeEach(() => { svg = new TestSVGCanvas(); drawing = new MapDrawing(); @@ -23,11 +21,11 @@ describe('EllipseDrawingWidget', () => { it('should draw ellipse drawing', () => { const ellipse = new EllipseElement(); - ellipse.fill = "#FFFFFFF"; + ellipse.fill = '#FFFFFFF'; ellipse.fill_opacity = 2.0; - ellipse.stroke = "#000000"; + ellipse.stroke = '#000000'; ellipse.stroke_width = 2.0; - ellipse.stroke_dasharray = "5,25,25"; + ellipse.stroke_dasharray = '5,25,25'; ellipse.cx = 10; ellipse.cy = 20; ellipse.rx = 30; @@ -35,7 +33,10 @@ describe('EllipseDrawingWidget', () => { drawing.element = ellipse; const drawings = svg.canvas.selectAll('g.drawing').data([drawing]); - const drawings_enter = drawings.enter().append('g').classed('drawing', true); + const drawings_enter = drawings + .enter() + .append('g') + .classed('drawing', true); const drawings_merge = drawings.merge(drawings_enter); widget.draw(drawings_merge); diff --git a/src/app/cartography/widgets/drawings/ellipse-drawing.ts b/src/app/cartography/widgets/drawings/ellipse-drawing.ts index 762fff99..8fce84d2 100644 --- a/src/app/cartography/widgets/drawings/ellipse-drawing.ts +++ b/src/app/cartography/widgets/drawings/ellipse-drawing.ts @@ -1,63 +1,60 @@ -import { Injectable } from "@angular/core"; - -import { SVGSelection } from "../../models/types"; -import { EllipseElement } from "../../models/drawings/ellipse-element"; -import { DrawingShapeWidget } from "./drawing-shape-widget"; -import { QtDasharrayFixer } from "../../helpers/qt-dasharray-fixer"; -import { MapDrawing } from "../../models/map/map-drawing"; +import { Injectable } from '@angular/core'; +import { SVGSelection } from '../../models/types'; +import { EllipseElement } from '../../models/drawings/ellipse-element'; +import { DrawingShapeWidget } from './drawing-shape-widget'; +import { QtDasharrayFixer } from '../../helpers/qt-dasharray-fixer'; +import { MapDrawing } from '../../models/map/map-drawing'; @Injectable() export class EllipseDrawingWidget implements DrawingShapeWidget { - - constructor( - private qtDasharrayFixer: QtDasharrayFixer - ) {} + constructor(private qtDasharrayFixer: QtDasharrayFixer) {} public draw(view: SVGSelection) { const drawing = view .selectAll('ellipse.ellipse_element') - .data((d: MapDrawing) => { - return (d.element && d.element instanceof EllipseElement) ? [d.element] : []; - }); + .data((d: MapDrawing) => { + return d.element && d.element instanceof EllipseElement ? [d.element] : []; + }); - drawing.enter() + drawing + .enter() .append('line') - .attr("class", "top"); + .attr('class', 'top'); - drawing.enter() + drawing + .enter() .append('line') - .attr("class", "bottom"); + .attr('class', 'bottom'); - drawing.enter() + drawing + .enter() .append('line') - .attr("class", "right"); + .attr('class', 'right'); - drawing.enter() + drawing + .enter() .append('line') - .attr("class", "left"); + .attr('class', 'left'); const drawing_enter = drawing .enter() - .append('ellipse') - .attr('class', 'ellipse_element noselect'); + .append('ellipse') + .attr('class', 'ellipse_element noselect'); const merge = drawing.merge(drawing_enter); merge - .attr('fill', (ellipse) => ellipse.fill) - .attr('fill-opacity', (ellipse) => ellipse.fill_opacity) - .attr('stroke', (ellipse) => ellipse.stroke) - .attr('stroke-width', (ellipse) => ellipse.stroke_width) - .attr('stroke-dasharray', (ellipse) => this.qtDasharrayFixer.fix(ellipse.stroke_dasharray)) - .attr('cx', (ellipse) => ellipse.cx) - .attr('cy', (ellipse) => ellipse.cy) - .attr('rx', (ellipse) => ellipse.rx) - .attr('ry', (ellipse) => ellipse.ry); - - drawing - .exit() - .remove(); + .attr('fill', ellipse => ellipse.fill) + .attr('fill-opacity', ellipse => ellipse.fill_opacity) + .attr('stroke', ellipse => ellipse.stroke) + .attr('stroke-width', ellipse => ellipse.stroke_width) + .attr('stroke-dasharray', ellipse => this.qtDasharrayFixer.fix(ellipse.stroke_dasharray)) + .attr('cx', ellipse => ellipse.cx) + .attr('cy', ellipse => ellipse.cy) + .attr('rx', ellipse => ellipse.rx) + .attr('ry', ellipse => ellipse.ry); + drawing.exit().remove(); } } diff --git a/src/app/cartography/widgets/drawings/image-drawing.spec.ts b/src/app/cartography/widgets/drawings/image-drawing.spec.ts index 7fc19d2c..119d0d25 100644 --- a/src/app/cartography/widgets/drawings/image-drawing.spec.ts +++ b/src/app/cartography/widgets/drawings/image-drawing.spec.ts @@ -1,15 +1,13 @@ -import { TestSVGCanvas } from "../../testing"; -import { ImageDrawingWidget } from "./image-drawing"; -import { ImageElement } from "../../models/drawings/image-element"; -import { MapDrawing } from "../../models/map/map-drawing"; - +import { TestSVGCanvas } from '../../testing'; +import { ImageDrawingWidget } from './image-drawing'; +import { ImageElement } from '../../models/drawings/image-element'; +import { MapDrawing } from '../../models/map/map-drawing'; describe('ImageDrawingWidget', () => { let svg: TestSVGCanvas; let widget: ImageDrawingWidget; let drawing: MapDrawing; - beforeEach(() => { svg = new TestSVGCanvas(); drawing = new MapDrawing(); @@ -24,11 +22,14 @@ describe('ImageDrawingWidget', () => { const image = new ImageElement(); image.width = 100; image.height = 200; - image.data = "data:image/svg+xml;base64,DATA"; + image.data = 'data:image/svg+xml;base64,DATA'; drawing.element = image; const drawings = svg.canvas.selectAll('g.drawing').data([drawing]); - const drawings_enter = drawings.enter().append('g').classed('drawing', true); + const drawings_enter = drawings + .enter() + .append('g') + .classed('drawing', true); const drawings_merge = drawings.merge(drawings_enter); widget.draw(drawings_merge); diff --git a/src/app/cartography/widgets/drawings/image-drawing.ts b/src/app/cartography/widgets/drawings/image-drawing.ts index 6d1a8a2c..0cf94b72 100644 --- a/src/app/cartography/widgets/drawings/image-drawing.ts +++ b/src/app/cartography/widgets/drawings/image-drawing.ts @@ -1,35 +1,29 @@ -import { Injectable } from "@angular/core"; - -import { SVGSelection } from "../../models/types"; -import { ImageElement } from "../../models/drawings/image-element"; -import { DrawingShapeWidget } from "./drawing-shape-widget"; -import { MapDrawing } from "../../models/map/map-drawing"; +import { Injectable } from '@angular/core'; +import { SVGSelection } from '../../models/types'; +import { ImageElement } from '../../models/drawings/image-element'; +import { DrawingShapeWidget } from './drawing-shape-widget'; +import { MapDrawing } from '../../models/map/map-drawing'; @Injectable() export class ImageDrawingWidget implements DrawingShapeWidget { public draw(view: SVGSelection) { - const drawing = view - .selectAll('image.image_element') - .data((d: MapDrawing) => { - return (d.element && d.element instanceof ImageElement) ? [d.element] : []; - }); + const drawing = view.selectAll('image.image_element').data((d: MapDrawing) => { + return d.element && d.element instanceof ImageElement ? [d.element] : []; + }); const drawing_enter = drawing .enter() - .append('image') - .attr('class', 'image_element noselect'); + .append('image') + .attr('class', 'image_element noselect'); const merge = drawing.merge(drawing_enter); merge .attr('xlink:href', (image: ImageElement) => image.data) - .attr('width', (image) => image.width) - .attr('height', (image) => image.height); - - drawing - .exit() - .remove(); + .attr('width', image => image.width) + .attr('height', image => image.height); + drawing.exit().remove(); } } diff --git a/src/app/cartography/widgets/drawings/line-drawing.spec.ts b/src/app/cartography/widgets/drawings/line-drawing.spec.ts index c4830190..32f673a6 100644 --- a/src/app/cartography/widgets/drawings/line-drawing.spec.ts +++ b/src/app/cartography/widgets/drawings/line-drawing.spec.ts @@ -1,16 +1,14 @@ -import { TestSVGCanvas } from "../../testing"; -import { LineDrawingWidget } from "./line-drawing"; -import { LineElement } from "../../models/drawings/line-element"; -import { QtDasharrayFixer } from "../../helpers/qt-dasharray-fixer"; -import { MapDrawing } from "../../models/map/map-drawing"; - +import { TestSVGCanvas } from '../../testing'; +import { LineDrawingWidget } from './line-drawing'; +import { LineElement } from '../../models/drawings/line-element'; +import { QtDasharrayFixer } from '../../helpers/qt-dasharray-fixer'; +import { MapDrawing } from '../../models/map/map-drawing'; describe('LineDrawingWidget', () => { let svg: TestSVGCanvas; let widget: LineDrawingWidget; let drawing: MapDrawing; - beforeEach(() => { svg = new TestSVGCanvas(); drawing = new MapDrawing(); @@ -23,9 +21,9 @@ describe('LineDrawingWidget', () => { it('should draw line drawing', () => { const line = new LineElement(); - line.stroke = "#000000"; + line.stroke = '#000000'; line.stroke_width = 2.0; - line.stroke_dasharray = "5,25,25"; + line.stroke_dasharray = '5,25,25'; line.x1 = 10; line.x2 = 20; line.y1 = 30; @@ -33,7 +31,10 @@ describe('LineDrawingWidget', () => { drawing.element = line; const drawings = svg.canvas.selectAll('g.drawing').data([drawing]); - const drawings_enter = drawings.enter().append('g').classed('drawing', true); + const drawings_enter = drawings + .enter() + .append('g') + .classed('drawing', true); const drawings_merge = drawings.merge(drawings_enter); widget.draw(drawings_merge); diff --git a/src/app/cartography/widgets/drawings/line-drawing.ts b/src/app/cartography/widgets/drawings/line-drawing.ts index 280156db..c642d9c8 100644 --- a/src/app/cartography/widgets/drawings/line-drawing.ts +++ b/src/app/cartography/widgets/drawings/line-drawing.ts @@ -1,52 +1,46 @@ -import { Injectable } from "@angular/core"; - -import { SVGSelection } from "../../models/types"; -import { LineElement } from "../../models/drawings/line-element"; -import { DrawingShapeWidget } from "./drawing-shape-widget"; -import { QtDasharrayFixer } from "../../helpers/qt-dasharray-fixer"; -import { MapDrawing } from "../../models/map/map-drawing"; +import { Injectable } from '@angular/core'; +import { SVGSelection } from '../../models/types'; +import { LineElement } from '../../models/drawings/line-element'; +import { DrawingShapeWidget } from './drawing-shape-widget'; +import { QtDasharrayFixer } from '../../helpers/qt-dasharray-fixer'; +import { MapDrawing } from '../../models/map/map-drawing'; @Injectable() export class LineDrawingWidget implements DrawingShapeWidget { - - constructor( - private qtDasharrayFixer: QtDasharrayFixer - ) {} + constructor(private qtDasharrayFixer: QtDasharrayFixer) {} public draw(view: SVGSelection) { - const drawing = view - .selectAll('line.line_element') - .data((d: MapDrawing) => { - return (d.element && d.element instanceof LineElement) ? [d.element] : []; - }); + const drawing = view.selectAll('line.line_element').data((d: MapDrawing) => { + return d.element && d.element instanceof LineElement ? [d.element] : []; + }); - drawing.enter() - .append('circle') - .attr('class', 'right'); + drawing + .enter() + .append('circle') + .attr('class', 'right'); - drawing.enter() - .append('circle') - .attr('class', 'left'); - - const drawing_enter = drawing.enter() - .append('line') - .attr('class', 'line_element noselect'); + drawing + .enter() + .append('circle') + .attr('class', 'left'); + + const drawing_enter = drawing + .enter() + .append('line') + .attr('class', 'line_element noselect'); const merge = drawing.merge(drawing_enter); merge - .attr('stroke', (line) => line.stroke) - .attr('stroke-width', (line) => line.stroke_width) - .attr('stroke-dasharray', (line) => this.qtDasharrayFixer.fix(line.stroke_dasharray)) - .attr('x1', (line) => line.x1) - .attr('x2', (line) => line.x2) - .attr('y1', (line) => line.y1) - .attr('y2', (line) => line.y2); - - drawing - .exit() - .remove(); + .attr('stroke', line => line.stroke) + .attr('stroke-width', line => line.stroke_width) + .attr('stroke-dasharray', line => this.qtDasharrayFixer.fix(line.stroke_dasharray)) + .attr('x1', line => line.x1) + .attr('x2', line => line.x2) + .attr('y1', line => line.y1) + .attr('y2', line => line.y2); + drawing.exit().remove(); } } diff --git a/src/app/cartography/widgets/drawings/rect-drawing.spec.ts b/src/app/cartography/widgets/drawings/rect-drawing.spec.ts index f90d02ad..2e14ad1b 100644 --- a/src/app/cartography/widgets/drawings/rect-drawing.spec.ts +++ b/src/app/cartography/widgets/drawings/rect-drawing.spec.ts @@ -1,16 +1,14 @@ -import { TestSVGCanvas } from "../../testing"; -import { RectDrawingWidget } from "./rect-drawing"; -import { RectElement } from "../../models/drawings/rect-element"; -import { QtDasharrayFixer } from "../../helpers/qt-dasharray-fixer"; -import { MapDrawing } from "../../models/map/map-drawing"; - +import { TestSVGCanvas } from '../../testing'; +import { RectDrawingWidget } from './rect-drawing'; +import { RectElement } from '../../models/drawings/rect-element'; +import { QtDasharrayFixer } from '../../helpers/qt-dasharray-fixer'; +import { MapDrawing } from '../../models/map/map-drawing'; describe('RectDrawingWidget', () => { let svg: TestSVGCanvas; let widget: RectDrawingWidget; let drawing: MapDrawing; - beforeEach(() => { svg = new TestSVGCanvas(); drawing = new MapDrawing(); @@ -23,17 +21,20 @@ describe('RectDrawingWidget', () => { it('should draw rect drawing', () => { const rect = new RectElement(); - rect.fill = "#FFFFFF"; + rect.fill = '#FFFFFF'; rect.fill_opacity = 1.0; - rect.stroke = "#000000"; + rect.stroke = '#000000'; rect.stroke_width = 2.0; - rect.stroke_dasharray = "5,25,25"; + rect.stroke_dasharray = '5,25,25'; rect.width = 100; rect.height = 200; drawing.element = rect; const drawings = svg.canvas.selectAll('g.drawing').data([drawing]); - const drawings_enter = drawings.enter().append('g').classed('drawing', true); + const drawings_enter = drawings + .enter() + .append('g') + .classed('drawing', true); const drawings_merge = drawings.merge(drawings_enter); widget.draw(drawings_merge); diff --git a/src/app/cartography/widgets/drawings/rect-drawing.ts b/src/app/cartography/widgets/drawings/rect-drawing.ts index ef3e0895..1661d1c1 100644 --- a/src/app/cartography/widgets/drawings/rect-drawing.ts +++ b/src/app/cartography/widgets/drawings/rect-drawing.ts @@ -1,61 +1,56 @@ -import { Injectable } from "@angular/core"; - -import { SVGSelection } from "../../models/types"; -import { RectElement } from "../../models/drawings/rect-element"; -import { DrawingShapeWidget } from "./drawing-shape-widget"; -import { QtDasharrayFixer } from "../../helpers/qt-dasharray-fixer"; -import { MapDrawing } from "../../models/map/map-drawing"; +import { Injectable } from '@angular/core'; +import { SVGSelection } from '../../models/types'; +import { RectElement } from '../../models/drawings/rect-element'; +import { DrawingShapeWidget } from './drawing-shape-widget'; +import { QtDasharrayFixer } from '../../helpers/qt-dasharray-fixer'; +import { MapDrawing } from '../../models/map/map-drawing'; @Injectable() export class RectDrawingWidget implements DrawingShapeWidget { - - constructor( - private qtDasharrayFixer: QtDasharrayFixer - ) {} + constructor(private qtDasharrayFixer: QtDasharrayFixer) {} public draw(view: SVGSelection) { - const drawing = view - .selectAll('rect.rect_element') - .data((d: MapDrawing) => { - return (d.element && d.element instanceof RectElement) ? [d.element] : []; - }); + const drawing = view.selectAll('rect.rect_element').data((d: MapDrawing) => { + return d.element && d.element instanceof RectElement ? [d.element] : []; + }); - drawing.enter() + drawing + .enter() .append('line') - .attr("class", "top"); + .attr('class', 'top'); - drawing.enter() + drawing + .enter() .append('line') - .attr("class", "bottom"); + .attr('class', 'bottom'); - drawing.enter() + drawing + .enter() .append('line') - .attr("class", "right"); + .attr('class', 'right'); - drawing.enter() + drawing + .enter() .append('line') - .attr("class", "left"); - + .attr('class', 'left'); + const drawing_enter = drawing .enter() - .append('rect') - .attr('class', 'rect_element noselect'); + .append('rect') + .attr('class', 'rect_element noselect'); const merge = drawing.merge(drawing_enter); merge - .attr('fill', (rect) => rect.fill) - .attr('fill-opacity', (rect) => rect.fill_opacity) - .attr('stroke', (rect) => rect.stroke) - .attr('stroke-width', (rect) => rect.stroke_width) - .attr('stroke-dasharray', (rect) => this.qtDasharrayFixer.fix(rect.stroke_dasharray)) - .attr('width', (rect) => rect.width) - .attr('height', (rect) => rect.height); - - drawing - .exit() - .remove(); + .attr('fill', rect => rect.fill) + .attr('fill-opacity', rect => rect.fill_opacity) + .attr('stroke', rect => rect.stroke) + .attr('stroke-width', rect => rect.stroke_width) + .attr('stroke-dasharray', rect => this.qtDasharrayFixer.fix(rect.stroke_dasharray)) + .attr('width', rect => rect.width) + .attr('height', rect => rect.height); + drawing.exit().remove(); } } diff --git a/src/app/cartography/widgets/drawings/text-drawing.spec.ts b/src/app/cartography/widgets/drawings/text-drawing.spec.ts index c99a87e2..3425b36d 100644 --- a/src/app/cartography/widgets/drawings/text-drawing.spec.ts +++ b/src/app/cartography/widgets/drawings/text-drawing.spec.ts @@ -1,15 +1,14 @@ -import { TestSVGCanvas } from "../../testing"; -import { TextDrawingWidget } from "./text-drawing"; -import { TextElement } from "../../models/drawings/text-element"; -import { FontFixer } from "../../helpers/font-fixer"; -import { MapDrawing } from "../../models/map/map-drawing"; +import { TestSVGCanvas } from '../../testing'; +import { TextDrawingWidget } from './text-drawing'; +import { TextElement } from '../../models/drawings/text-element'; +import { FontFixer } from '../../helpers/font-fixer'; +import { MapDrawing } from '../../models/map/map-drawing'; describe('TextDrawingWidget', () => { let svg: TestSVGCanvas; let widget: TextDrawingWidget; let drawing: MapDrawing; - beforeEach(() => { svg = new TestSVGCanvas(); drawing = new MapDrawing(); @@ -22,18 +21,21 @@ describe('TextDrawingWidget', () => { it('should draw text drawing', () => { const text = new TextElement(); - text.text = "THIS IS TEXT"; - text.fill = "#000000"; + text.text = 'THIS IS TEXT'; + text.fill = '#000000'; text.fill_opacity = 1.0; - text.font_family = "TypeWriter"; + text.font_family = 'TypeWriter'; text.font_size = 10.0; - text.font_weight = "bold"; - text.text_decoration = "line-through"; + text.font_weight = 'bold'; + text.text_decoration = 'line-through'; drawing.element = text; const drawings = svg.canvas.selectAll('g.drawing').data([drawing]); - const drawings_enter = drawings.enter().append('g').classed('drawing', true); + const drawings_enter = drawings + .enter() + .append('g') + .classed('drawing', true); const drawings_merge = drawings.merge(drawings_enter); widget.draw(drawings_merge); @@ -42,18 +44,21 @@ describe('TextDrawingWidget', () => { expect(drew.size()).toEqual(1); const text_element = drew.nodes()[0]; expect(text_element.innerHTML).toEqual('THIS IS TEXT'); - expect(text_element.getAttribute('fill')).toEqual("#000000"); + expect(text_element.getAttribute('fill')).toEqual('#000000'); expect(text_element.getAttribute('style')).toEqual('font-family: "Noto Sans"; font-size: 11pt; font-weight: bold'); - expect(text_element.getAttribute('text-decoration')).toEqual("line-through"); + expect(text_element.getAttribute('text-decoration')).toEqual('line-through'); }); it('should draw multiline text', () => { const text = new TextElement(); - text.text = 'THIS' + "\n" + 'IS TEXT'; + text.text = 'THIS' + '\n' + 'IS TEXT'; drawing.element = text; const drawings = svg.canvas.selectAll('g.drawing').data([drawing]); - const drawings_enter = drawings.enter().append('g').classed('drawing', true); + const drawings_enter = drawings + .enter() + .append('g') + .classed('drawing', true); const drawings_merge = drawings.merge(drawings_enter); widget.draw(drawings_merge); @@ -76,7 +81,10 @@ describe('TextDrawingWidget', () => { drawing.element = text; const drawings = svg.canvas.selectAll('g.drawing').data([drawing]); - const drawings_enter = drawings.enter().append('g').classed('drawing', true); + const drawings_enter = drawings + .enter() + .append('g') + .classed('drawing', true); const drawings_merge = drawings.merge(drawings_enter); widget.draw(drawings_merge); @@ -86,8 +94,5 @@ describe('TextDrawingWidget', () => { expect(drew.nodes()[0].innerHTML).toEqual(' Text with whitespaces'); expect(drew.nodes()[0].getAttribute('space')).toEqual('preserve'); - }); - - }); diff --git a/src/app/cartography/widgets/drawings/text-drawing.ts b/src/app/cartography/widgets/drawings/text-drawing.ts index 377b96a3..09bac88c 100644 --- a/src/app/cartography/widgets/drawings/text-drawing.ts +++ b/src/app/cartography/widgets/drawings/text-drawing.ts @@ -1,33 +1,27 @@ -import { Injectable } from "@angular/core"; - -import { SVGSelection } from "../../models/types"; -import { TextElement } from "../../models/drawings/text-element"; -import { DrawingShapeWidget } from "./drawing-shape-widget"; -import { FontFixer } from "../../helpers/font-fixer"; -import { select } from "d3-selection"; -import { MapDrawing } from "../../models/map/map-drawing"; +import { Injectable } from '@angular/core'; +import { SVGSelection } from '../../models/types'; +import { TextElement } from '../../models/drawings/text-element'; +import { DrawingShapeWidget } from './drawing-shape-widget'; +import { FontFixer } from '../../helpers/font-fixer'; +import { select } from 'd3-selection'; +import { MapDrawing } from '../../models/map/map-drawing'; @Injectable() export class TextDrawingWidget implements DrawingShapeWidget { static MARGIN = 4; - constructor( - private fontFixer: FontFixer - ) {} + constructor(private fontFixer: FontFixer) {} public draw(view: SVGSelection) { - - const drawing = view - .selectAll('text.text_element') - .data((d: MapDrawing) => { - return (d.element && d.element instanceof TextElement) ? [d.element] : []; - }); + const drawing = view.selectAll('text.text_element').data((d: MapDrawing) => { + return d.element && d.element instanceof TextElement ? [d.element] : []; + }); const drawing_enter = drawing .enter() - .append('text') - .attr('class', 'text_element noselect'); + .append('text') + .attr('class', 'text_element noselect'); const merge = drawing.merge(drawing_enter); merge @@ -44,44 +38,36 @@ export class TextDrawingWidget implements DrawingShapeWidget { if (font.font_weight) { styles.push(`font-weight: ${text.font_weight}`); } - return styles.join("; "); + return styles.join('; '); }) - .attr('fill', (text) => text.fill) - .attr('text-decoration', (text) => text.text_decoration); + .attr('fill', text => text.fill) + .attr('text-decoration', text => text.text_decoration); - const lines = merge.selectAll('tspan') - .data((text: TextElement) => { - return text.text.split(/\r?\n/); - }); + const lines = merge.selectAll('tspan').data((text: TextElement) => { + return text.text.split(/\r?\n/); + }); - const lines_enter = lines - .enter() - .append('tspan'); + const lines_enter = lines.enter().append('tspan'); const lines_merge = lines.merge(lines_enter); lines_merge - .text((line) => line) - .attr('xml:space', 'preserve') - .attr('x', 0) - .attr("dy", (line, i) => i === 0 ? '0em' : '1.4em'); + .text(line => line) + .attr('xml:space', 'preserve') + .attr('x', 0) + .attr('dy', (line, i) => (i === 0 ? '0em' : '1.4em')); - lines - .exit() - .remove(); + lines.exit().remove(); - merge.attr('transform', function (this: SVGTextElement) { - // SVG calculates y pos by the /bottom/ of the first tspan, hence we need to make some - // approx and make it matching to GUI - const tspan = select(this).selectAll('tspan'); - const height = this.getBBox().height / tspan.size(); - //return `translate(0, ${height})`; - return `translate(${TextDrawingWidget.MARGIN}, ${height - TextDrawingWidget.MARGIN})`; + merge.attr('transform', function(this: SVGTextElement) { + // SVG calculates y pos by the /bottom/ of the first tspan, hence we need to make some + // approx and make it matching to GUI + const tspan = select(this).selectAll('tspan'); + const height = this.getBBox().height / tspan.size(); + //return `translate(0, ${height})`; + return `translate(${TextDrawingWidget.MARGIN}, ${height - TextDrawingWidget.MARGIN})`; }); - drawing - .exit() - .remove(); - + drawing.exit().remove(); } } diff --git a/src/app/cartography/widgets/graph-layout.ts b/src/app/cartography/widgets/graph-layout.ts index a559853a..ab100626 100644 --- a/src/app/cartography/widgets/graph-layout.ts +++ b/src/app/cartography/widgets/graph-layout.ts @@ -1,14 +1,13 @@ -import { Context } from "../models/context"; -import { NodesWidget } from "./nodes"; -import { Widget } from "./widget"; -import { SVGSelection } from "../models/types"; -import { DrawingLineWidget } from "./drawing-line"; -import { SelectionTool } from "../tools/selection-tool"; -import { MovingTool } from "../tools/moving-tool"; -import { LayersWidget } from "./layers"; -import { LayersManager } from "../managers/layers-manager"; -import { Injectable } from "@angular/core"; - +import { Context } from '../models/context'; +import { NodesWidget } from './nodes'; +import { Widget } from './widget'; +import { SVGSelection } from '../models/types'; +import { DrawingLineWidget } from './drawing-line'; +import { SelectionTool } from '../tools/selection-tool'; +import { MovingTool } from '../tools/moving-tool'; +import { LayersWidget } from './layers'; +import { LayersManager } from '../managers/layers-manager'; +import { Injectable } from '@angular/core'; @Injectable() export class GraphLayout implements Widget { @@ -19,8 +18,7 @@ export class GraphLayout implements Widget { private movingTool: MovingTool, private layersWidget: LayersWidget, private layersManager: LayersManager - ) { - } + ) {} public getNodesWidget() { return this.nodesWidget; @@ -35,32 +33,28 @@ export class GraphLayout implements Widget { } connect(view: SVGSelection, context: Context) { - this.drawingLineTool.connect(view, context); + this.drawingLineTool.connect( + view, + context + ); } draw(view: SVGSelection, context: Context) { - view - .attr('width', context.size.width) - .attr('height', context.size.height); + view.attr('width', context.size.width).attr('height', context.size.height); - const canvas = view - .selectAll('g.canvas') - .data([context]); + const canvas = view.selectAll('g.canvas').data([context]); - const canvasEnter = canvas.enter() + const canvasEnter = canvas + .enter() .append('g') .attr('class', 'canvas'); - canvas - .merge(canvasEnter) - .attr( - 'transform', - (ctx: Context) => { - const xTrans = ctx.getZeroZeroTransformationPoint().x + ctx.transformation.x; - const yTrans = ctx.getZeroZeroTransformationPoint().y + ctx.transformation.y; - const kTrans = ctx.transformation.k; - return `translate(${xTrans}, ${yTrans}) scale(${kTrans})`; - }); + canvas.merge(canvasEnter).attr('transform', (ctx: Context) => { + const xTrans = ctx.getZeroZeroTransformationPoint().x + ctx.transformation.x; + const yTrans = ctx.getZeroZeroTransformationPoint().y + ctx.transformation.y; + const kTrans = ctx.transformation.k; + return `translate(${xTrans}, ${yTrans}) scale(${kTrans})`; + }); this.layersWidget.draw(canvas, this.layersManager.getLayersList()); diff --git a/src/app/cartography/widgets/interface-label.spec.ts b/src/app/cartography/widgets/interface-label.spec.ts index 9d1147e2..180f25aa 100644 --- a/src/app/cartography/widgets/interface-label.spec.ts +++ b/src/app/cartography/widgets/interface-label.spec.ts @@ -1,16 +1,15 @@ -import { Selection } from "d3-selection"; - -import { TestSVGCanvas } from "../testing"; -import { InterfaceLabelWidget } from "./interface-label"; -import { CssFixer } from "../helpers/css-fixer"; -import { MapNode } from "../models/map/map-node"; -import { MapLink } from "../models/map/map-link"; -import { MapLinkNode } from "../models/map/map-link-node"; -import { MapLabel } from "../models/map/map-label"; -import { FontFixer } from "../helpers/font-fixer"; -import { SelectionManager } from "../managers/selection-manager"; -import { MapSettingsManager } from "../managers/map-settings-manager"; +import { Selection } from 'd3-selection'; +import { TestSVGCanvas } from '../testing'; +import { InterfaceLabelWidget } from './interface-label'; +import { CssFixer } from '../helpers/css-fixer'; +import { MapNode } from '../models/map/map-node'; +import { MapLink } from '../models/map/map-link'; +import { MapLinkNode } from '../models/map/map-link-node'; +import { MapLabel } from '../models/map/map-label'; +import { FontFixer } from '../helpers/font-fixer'; +import { SelectionManager } from '../managers/selection-manager'; +import { MapSettingsManager } from '../managers/map-settings-manager'; describe('InterfaceLabelsWidget', () => { let svg: TestSVGCanvas; @@ -23,52 +22,48 @@ describe('InterfaceLabelsWidget', () => { svg = new TestSVGCanvas(); const node_1 = new MapNode(); - node_1.id = "1"; + node_1.id = '1'; node_1.x = 100; node_1.y = 200; const node_2 = new MapNode(); - node_2.id = "2"; + node_2.id = '2'; node_2.x = 300; node_2.y = 400; const link_node_1 = new MapLinkNode(); link_node_1.label = new MapLabel(); link_node_1.label.rotation = 5; - link_node_1.label.text = "Interface 1"; + link_node_1.label.text = 'Interface 1'; link_node_1.label.x = 10; link_node_1.label.y = 20; - link_node_1.label.style = "font-size: 12px"; + link_node_1.label.style = 'font-size: 12px'; const link_node_2 = new MapLinkNode(); link_node_2.label = new MapLabel(); link_node_2.label.rotation = 0; - link_node_2.label.text = "Interface 2"; + link_node_2.label.text = 'Interface 2'; link_node_2.label.x = -30; link_node_2.label.y = -40; - link_node_2.label.style = ""; + link_node_2.label.style = ''; const link_1 = new MapLink(); - link_1.id = "link1"; + link_1.id = 'link1'; link_1.source = node_1; link_1.target = node_2; link_1.nodes = [link_node_1, link_node_2]; - link_1.linkType = "ethernet"; + link_1.linkType = 'ethernet'; links = [link_1]; - const linksSelection = svg.canvas - .selectAll('g.link') - .data(links); + const linksSelection = svg.canvas.selectAll('g.link').data(links); linksEnter = linksSelection .enter() - .append('g') - .attr('class', 'link'); + .append('g') + .attr('class', 'link'); - linksSelection - .exit() - .remove(); + linksSelection.exit().remove(); mapSettings = new MapSettingsManager(); widget = new InterfaceLabelWidget(new CssFixer(), new FontFixer(), new SelectionManager(), mapSettings); @@ -100,7 +95,6 @@ describe('InterfaceLabelsWidget', () => { const targetIntefaceText = targetInterface.children[1] as Element; expect(targetIntefaceText.attributes.getNamedItem('class').value).toEqual('interface_label noselect'); expect(targetIntefaceText.attributes.getNamedItem('style').value).toEqual(''); - }); it('should not draw interface labels when disabled', () => { @@ -122,4 +116,3 @@ describe('InterfaceLabelsWidget', () => { // expect(sourceInterface.getAttribute('class')).toContain('selected'); // }); }); - diff --git a/src/app/cartography/widgets/interface-label.ts b/src/app/cartography/widgets/interface-label.ts index 19a3c185..2e49c60f 100644 --- a/src/app/cartography/widgets/interface-label.ts +++ b/src/app/cartography/widgets/interface-label.ts @@ -1,15 +1,15 @@ -import { Injectable } from "@angular/core"; +import { Injectable } from '@angular/core'; -import { SVGSelection } from "../models/types"; -import { CssFixer } from "../helpers/css-fixer"; -import { select } from "d3-selection"; -import { MapLink } from "../models/map/map-link"; -import { FontFixer } from "../helpers/font-fixer"; -import { SelectionManager } from "../managers/selection-manager"; -import { MapLinkNode } from "../models/map/map-link-node"; -import { MapNode } from "../models/map/map-node"; -import { Draggable } from "../events/draggable"; -import { MapSettingsManager } from "../managers/map-settings-manager"; +import { SVGSelection } from '../models/types'; +import { CssFixer } from '../helpers/css-fixer'; +import { select } from 'd3-selection'; +import { MapLink } from '../models/map/map-link'; +import { FontFixer } from '../helpers/font-fixer'; +import { SelectionManager } from '../managers/selection-manager'; +import { MapLinkNode } from '../models/map/map-link-node'; +import { MapNode } from '../models/map/map-node'; +import { Draggable } from '../events/draggable'; +import { MapSettingsManager } from '../managers/map-settings-manager'; @Injectable() export class InterfaceLabelWidget { @@ -23,8 +23,7 @@ export class InterfaceLabelWidget { private fontFixer: FontFixer, private selectionManager: SelectionManager, private mapSettings: MapSettingsManager - ) { - } + ) {} public setEnabled(enabled) { this.enabled = enabled; @@ -33,18 +32,15 @@ export class InterfaceLabelWidget { draw(selection: SVGSelection) { const link_node_position = selection .selectAll('g.link_node_position') - .data((link: MapLink) => [ - [link.source, link.nodes[0]], - [link.target, link.nodes[1]] - ]); + .data((link: MapLink) => [[link.source, link.nodes[0]], [link.target, link.nodes[1]]]); const enter_link_node_position = link_node_position .enter() - .append('g') - .classed('link_node_position', true); + .append('g') + .classed('link_node_position', true); const merge_link_node_position = link_node_position.merge(enter_link_node_position); - + merge_link_node_position.attr('transform', (nodeAndMapLinkNode: [MapNode, MapLinkNode]) => { return `translate(${nodeAndMapLinkNode[0].x}, ${nodeAndMapLinkNode[0].y})`; }); @@ -60,48 +56,44 @@ export class InterfaceLabelWidget { const enter = labels .enter() - .append('g') - .classed('interface_label_container', true); + .append('g') + .classed('interface_label_container', true); // create surrounding rect - enter - .append('rect') - .attr('class', 'interface_label_selection'); + enter.append('rect').attr('class', 'interface_label_selection'); // create label enter .append('text') - .attr('class', 'interface_label noselect') - .attr('interface_label_id', (i: MapLinkNode) => `${i.id}`) + .attr('class', 'interface_label noselect') + .attr('interface_label_id', (i: MapLinkNode) => `${i.id}`); - const merge = labels - .merge(enter); + const merge = labels.merge(enter); // update label merge .select('text.interface_label') - .text((l: MapLinkNode) => l.label.text) - .attr('style', (l: MapLinkNode) => { - let styles = this.cssFixer.fix(l.label.style); - styles = this.fontFixer.fixStyles(styles); - return styles; - }) - .attr('x', (l: MapLinkNode) => l.label.x) - .attr('y', (l: MapLinkNode) => l.label.y) - .attr('transform', (l: MapLinkNode) => { - return `rotate(${l.label.rotation}, ${l.label.x}, ${l.label.y})`; - }) - + .text((l: MapLinkNode) => l.label.text) + .attr('style', (l: MapLinkNode) => { + let styles = this.cssFixer.fix(l.label.style); + styles = this.fontFixer.fixStyles(styles); + return styles; + }) + .attr('x', (l: MapLinkNode) => l.label.x) + .attr('y', (l: MapLinkNode) => l.label.y) + .attr('transform', (l: MapLinkNode) => { + return `rotate(${l.label.rotation}, ${l.label.x}, ${l.label.y})`; + }); // update surrounding rect merge .select('rect.interface_label_selection') - .attr('visibility', (l: MapLinkNode) => this.selectionManager.isSelected(l) ? 'visible' : 'hidden') + .attr('visibility', (l: MapLinkNode) => (this.selectionManager.isSelected(l) ? 'visible' : 'hidden')) .attr('stroke', 'black') .attr('stroke-dasharray', '3,3') .attr('stroke-width', '0.5') .attr('fill', 'none') - .each(function (this: SVGRectElement, l: MapLinkNode) { + .each(function(this: SVGRectElement, l: MapLinkNode) { const current = select(this); const textLabel = merge.select(`text[interface_label_id="${l.id}"]`); const bbox = textLabel.node().getBBox(); @@ -114,11 +106,9 @@ export class InterfaceLabelWidget { current.attr('transform', `rotate(${l.label.rotation}, ${bbox.x - border}, ${bbox.y - border})`); }); - labels - .exit() - .remove(); + labels.exit().remove(); - if(!this.mapSettings.isReadOnly) { + if (!this.mapSettings.isReadOnly) { this.draggable.call(merge); } } diff --git a/src/app/cartography/widgets/interface-status.ts b/src/app/cartography/widgets/interface-status.ts index a38bcebd..119ec6b7 100644 --- a/src/app/cartography/widgets/interface-status.ts +++ b/src/app/cartography/widgets/interface-status.ts @@ -1,76 +1,67 @@ -import { Injectable } from "@angular/core"; +import { Injectable } from '@angular/core'; -import { select } from "d3-selection"; - -import { Widget } from "./widget"; -import { SVGSelection } from "../models/types"; -import { LinkStatus } from "../models/link-status"; -import { MapLink } from "../models/map/map-link"; +import { select } from 'd3-selection'; +import { Widget } from './widget'; +import { SVGSelection } from '../models/types'; +import { LinkStatus } from '../models/link-status'; +import { MapLink } from '../models/map/map-link'; @Injectable() export class InterfaceStatusWidget implements Widget { constructor() {} public draw(view: SVGSelection) { - view.each(function (this: SVGGElement, l: MapLink) { + view.each(function(this: SVGGElement, l: MapLink) { const link_group = select(this); const link_path = link_group.select('path'); const start_point: SVGPoint = link_path.node().getPointAtLength(45); const end_point: SVGPoint = link_path.node().getPointAtLength(link_path.node().getTotalLength() - 45); - + let statuses = []; - + if (link_path.node().getTotalLength() > 2 * 45 + 10) { statuses = [ new LinkStatus(start_point.x, start_point.y, l.source.status), new LinkStatus(end_point.x, end_point.y, l.target.status) ]; } - + const status_started = link_group .selectAll('circle.status_started') - .data(statuses.filter((link_status: LinkStatus) => link_status.status === 'started')); - - const status_started_enter = status_started - .enter() - .append('circle'); - + .data(statuses.filter((link_status: LinkStatus) => link_status.status === 'started')); + + const status_started_enter = status_started.enter().append('circle'); + status_started .merge(status_started_enter) - .attr('class', 'status_started') - .attr('cx', (ls: LinkStatus) => ls.x) - .attr('cy', (ls: LinkStatus) => ls.y) - .attr('r', 6) - .attr('fill', '#2ecc71'); - - status_started - .exit() - .remove(); - + .attr('class', 'status_started') + .attr('cx', (ls: LinkStatus) => ls.x) + .attr('cy', (ls: LinkStatus) => ls.y) + .attr('r', 6) + .attr('fill', '#2ecc71'); + + status_started.exit().remove(); + const status_stopped = link_group .selectAll('rect.status_stopped') - .data(statuses.filter((link_status: LinkStatus) => link_status.status === 'stopped')); - - const status_stopped_enter = status_stopped - .enter() - .append('rect'); - + .data(statuses.filter((link_status: LinkStatus) => link_status.status === 'stopped')); + + const status_stopped_enter = status_stopped.enter().append('rect'); + const STOPPED_STATUS_RECT_WIDTH = 10; - + status_stopped .merge(status_stopped_enter) - .attr('class', 'status_stopped') - .attr('x', (ls: LinkStatus) => ls.x - STOPPED_STATUS_RECT_WIDTH / 2.) - .attr('y', (ls: LinkStatus) => ls.y - STOPPED_STATUS_RECT_WIDTH / 2.) - .attr('width', STOPPED_STATUS_RECT_WIDTH) - .attr('height', STOPPED_STATUS_RECT_WIDTH) - .attr('fill', 'red'); - - status_stopped - .exit() - .remove(); + .attr('class', 'status_stopped') + .attr('x', (ls: LinkStatus) => ls.x - STOPPED_STATUS_RECT_WIDTH / 2) + .attr('y', (ls: LinkStatus) => ls.y - STOPPED_STATUS_RECT_WIDTH / 2) + .attr('width', STOPPED_STATUS_RECT_WIDTH) + .attr('height', STOPPED_STATUS_RECT_WIDTH) + .attr('fill', 'red'); + + status_stopped.exit().remove(); }); } } diff --git a/src/app/cartography/widgets/label.ts b/src/app/cartography/widgets/label.ts index 5cd8eb2b..a28793e6 100644 --- a/src/app/cartography/widgets/label.ts +++ b/src/app/cartography/widgets/label.ts @@ -1,21 +1,20 @@ -import { Injectable } from "@angular/core"; - -import { Widget } from "./widget"; -import { SVGSelection } from "../models/types"; -import { CssFixer } from "../helpers/css-fixer"; -import { FontFixer } from "../helpers/font-fixer"; -import { select } from "d3-selection"; -import { MapNode } from "../models/map/map-node"; -import { SelectionManager } from "../managers/selection-manager"; -import { Draggable } from "../events/draggable"; -import { MapLabel } from "../models/map/map-label"; -import { MapSettingsManager } from "../managers/map-settings-manager"; +import { Injectable } from '@angular/core'; +import { Widget } from './widget'; +import { SVGSelection } from '../models/types'; +import { CssFixer } from '../helpers/css-fixer'; +import { FontFixer } from '../helpers/font-fixer'; +import { select } from 'd3-selection'; +import { MapNode } from '../models/map/map-node'; +import { SelectionManager } from '../managers/selection-manager'; +import { Draggable } from '../events/draggable'; +import { MapLabel } from '../models/map/map-label'; +import { MapSettingsManager } from '../managers/map-settings-manager'; @Injectable() export class LabelWidget implements Widget { public draggable = new Draggable(); - + static NODE_LABEL_MARGIN = 3; constructor( @@ -30,73 +29,65 @@ export class LabelWidget implements Widget { } public draw(view: SVGSelection) { - const label_view = view - .selectAll("g.label_container") - .data((node: MapNode) => { - return [node.label]; - }); + const label_view = view.selectAll('g.label_container').data((node: MapNode) => { + return [node.label]; + }); - const label_enter = label_view.enter() + const label_enter = label_view + .enter() .append('g') - .attr('class', 'label_container') - .attr('label_id', (label: MapLabel) => label.id) + .attr('class', 'label_container') + .attr('label_id', (label: MapLabel) => label.id); const merge = label_view.merge(label_enter); this.drawLabel(merge); - label_view - .exit() - .remove(); + label_view.exit().remove(); - if(!this.mapSettings.isReadOnly) { + if (!this.mapSettings.isReadOnly) { this.draggable.call(label_view); } } - private drawLabel(view: SVGSelection) { - const label_body = view.selectAll("g.label_body") - .data((label) => [label]); + const label_body = view.selectAll('g.label_body').data(label => [label]); - const label_body_enter = label_body.enter() + const label_body_enter = label_body + .enter() .append('g') - .attr("class", "label_body"); + .attr('class', 'label_body'); // add label of node - label_body_enter - .append('text') - .attr('class', 'label'); + label_body_enter.append('text').attr('class', 'label'); - label_body_enter - .append('rect') - .attr('class', 'label_selection'); + label_body_enter.append('rect').attr('class', 'label_selection'); - const label_body_merge = label_body.merge(label_body_enter) + const label_body_merge = label_body.merge(label_body_enter); label_body_merge .select('text.label') - .attr('label_id', (label: MapLabel) => label.id) - .attr('style', (label: MapLabel) => { - let styles = this.cssFixer.fix(label.style); - styles = this.fontFixer.fixStyles(styles); - return styles; - }) - .text((label: MapLabel) => label.text) - .attr('x', (label: MapLabel) => label.x) - .attr('y', (label: MapLabel) => label.y) - .attr('transform', (label: MapLabel) => { - return `rotate(${label.rotation}, ${label.x}, ${label.y})`; - }) + .attr('label_id', (label: MapLabel) => label.id) + .attr('style', (label: MapLabel) => { + let styles = this.cssFixer.fix(label.style); + styles = this.fontFixer.fixStyles(styles); + return styles; + }) + .text((label: MapLabel) => label.text) + .attr('x', (label: MapLabel) => label.x) + .attr('y', (label: MapLabel) => label.y) + .attr('transform', (label: MapLabel) => { + return `rotate(${label.rotation}, ${label.x}, ${label.y})`; + }); - label_body_merge - .select('rect.label_selection') - .attr('visibility', (l: MapLabel) => this.selectionManager.isSelected(l) ? 'visible' : 'hidden') + label_body_merge + .select('rect.label_selection') + .attr('visibility', (l: MapLabel) => (this.selectionManager.isSelected(l) ? 'visible' : 'hidden')) .attr('stroke', 'black') .attr('stroke-dasharray', '3,3') .attr('stroke-width', '0.5') .attr('fill', 'none') - .each(function (this: SVGRectElement, label: MapLabel) { + .each(function(this: SVGRectElement, label: MapLabel) { const current = select(this); const textLabel = label_body_merge.select(`text[label_id="${label.id}"]`); const bbox = textLabel.node().getBBox(); @@ -113,5 +104,4 @@ export class LabelWidget implements Widget { private selectLabel(view: SVGSelection, label: MapLabel) { return view.selectAll(`g.label_container[label_id="${label.id}"]`); } - } diff --git a/src/app/cartography/widgets/layers.spec.ts b/src/app/cartography/widgets/layers.spec.ts index eea47908..4dfdf830 100644 --- a/src/app/cartography/widgets/layers.spec.ts +++ b/src/app/cartography/widgets/layers.spec.ts @@ -1,12 +1,11 @@ -import { instance, mock, when, verify } from "ts-mockito"; - -import { TestSVGCanvas } from "../testing"; -import { LayersWidget } from "./layers"; -import { Layer } from "../models/layer"; -import { LinksWidget } from "./links"; -import { NodesWidget } from "./nodes"; -import { DrawingsWidget } from "./drawings"; +import { instance, mock, when, verify } from 'ts-mockito'; +import { TestSVGCanvas } from '../testing'; +import { LayersWidget } from './layers'; +import { Layer } from '../models/layer'; +import { LinksWidget } from './links'; +import { NodesWidget } from './nodes'; +import { DrawingsWidget } from './drawings'; describe('LayersWidget', () => { let svg: TestSVGCanvas; @@ -75,5 +74,4 @@ describe('LayersWidget', () => { expect(drew.nodes()[0].getAttribute('data-index')).toEqual('3'); expect(drew.nodes()[1].getAttribute('data-index')).toEqual('2'); }); - }); diff --git a/src/app/cartography/widgets/layers.ts b/src/app/cartography/widgets/layers.ts index 963d1d01..f706db96 100644 --- a/src/app/cartography/widgets/layers.ts +++ b/src/app/cartography/widgets/layers.ts @@ -1,13 +1,12 @@ -import { Injectable } from "@angular/core"; - -import { Widget } from "./widget"; -import { SVGSelection } from "../models/types"; -import { GraphLayout } from "./graph-layout"; -import { Layer } from "../models/layer"; -import { LinksWidget } from "./links"; -import { NodesWidget } from "./nodes"; -import { DrawingsWidget } from "./drawings"; +import { Injectable } from '@angular/core'; +import { Widget } from './widget'; +import { SVGSelection } from '../models/types'; +import { GraphLayout } from './graph-layout'; +import { Layer } from '../models/layer'; +import { LinksWidget } from './links'; +import { NodesWidget } from './nodes'; +import { DrawingsWidget } from './drawings'; @Injectable() export class LayersWidget implements Widget { @@ -18,54 +17,38 @@ export class LayersWidget implements Widget { ) {} public draw(view: SVGSelection, layers: Layer[]) { - - const layers_selection = view - .selectAll('g.layer') - .data(layers, (layer: Layer) => { - return layer.index.toString(); - }); + const layers_selection = view.selectAll('g.layer').data(layers, (layer: Layer) => { + return layer.index.toString(); + }); const layers_enter = layers_selection .enter() - .append('g') - .attr('class', 'layer'); + .append('g') + .attr('class', 'layer'); // add container for links - layers_enter - .append('g') - .attr('class', 'links'); + layers_enter.append('g').attr('class', 'links'); // add container for nodes - layers_enter - .append('g') - .attr('class', 'nodes'); + layers_enter.append('g').attr('class', 'nodes'); // add container for drawings - layers_enter - .append('g') - .attr('class', 'drawings'); + layers_enter.append('g').attr('class', 'drawings'); const merge = layers_selection.merge(layers_enter); - merge - .attr('data-index', (layer: Layer) => layer.index); + merge.attr('data-index', (layer: Layer) => layer.index); - const links_container = merge - .select('g.links'); + const links_container = merge.select('g.links'); - const nodes_container = merge - .select('g.nodes'); + const nodes_container = merge.select('g.nodes'); - const drawings_container = merge - .select('g.drawings'); + const drawings_container = merge.select('g.drawings'); - layers_selection - .exit() - .remove(); + layers_selection.exit().remove(); this.linksWidget.draw(links_container); this.nodesWidget.draw(nodes_container); this.drawingsWidget.draw(drawings_container); - } } diff --git a/src/app/cartography/widgets/link.ts b/src/app/cartography/widgets/link.ts index b7557fbd..1c88c5ec 100644 --- a/src/app/cartography/widgets/link.ts +++ b/src/app/cartography/widgets/link.ts @@ -1,19 +1,17 @@ -import { Injectable } from "@angular/core"; - -import { Widget } from "./widget"; -import { SVGSelection } from "../models/types"; -import { SerialLinkWidget } from "./links/serial-link"; -import { EthernetLinkWidget } from "./links/ethernet-link"; -import { MultiLinkCalculatorHelper } from "../helpers/multi-link-calculator-helper"; -import { InterfaceLabelWidget } from "./interface-label"; -import { InterfaceStatusWidget } from "./interface-status"; -import { MapLink } from "../models/map/map-link"; -import { SelectionManager } from "../managers/selection-manager"; +import { Injectable } from '@angular/core'; +import { Widget } from './widget'; +import { SVGSelection } from '../models/types'; +import { SerialLinkWidget } from './links/serial-link'; +import { EthernetLinkWidget } from './links/ethernet-link'; +import { MultiLinkCalculatorHelper } from '../helpers/multi-link-calculator-helper'; +import { InterfaceLabelWidget } from './interface-label'; +import { InterfaceStatusWidget } from './interface-status'; +import { MapLink } from '../models/map/map-link'; +import { SelectionManager } from '../managers/selection-manager'; @Injectable() export class LinkWidget implements Widget { - constructor( private multiLinkCalculatorHelper: MultiLinkCalculatorHelper, private interfaceLabelWidget: InterfaceLabelWidget, @@ -22,18 +20,17 @@ export class LinkWidget implements Widget { ) {} public draw(view: SVGSelection) { - const link_body = view.selectAll("g.link_body") - .data((l) => [l]); + const link_body = view.selectAll('g.link_body').data(l => [l]); - const link_body_enter = link_body.enter() + const link_body_enter = link_body + .enter() .append('g') - .attr("class", "link_body"); + .attr('class', 'link_body'); - const link_body_merge = link_body.merge(link_body_enter) - .attr('transform', (link) => { - const translation = this.multiLinkCalculatorHelper.linkTranslation(link.distance, link.source, link.target); - return `translate (${translation.dx}, ${translation.dy})`; - }); + const link_body_merge = link_body.merge(link_body_enter).attr('transform', link => { + const translation = this.multiLinkCalculatorHelper.linkTranslation(link.distance, link.source, link.target); + return `translate (${translation.dx}, ${translation.dy})`; + }); const serial_link_widget = new SerialLinkWidget(); serial_link_widget.draw(link_body_merge); @@ -43,10 +40,9 @@ export class LinkWidget implements Widget { link_body_merge .select('path') - .classed('selected', (l: MapLink) => this.selectionManager.isSelected(l)); + .classed('selected', (l: MapLink) => this.selectionManager.isSelected(l)); this.interfaceLabelWidget.draw(link_body_merge); this.interfaceStatusWidget.draw(link_body_merge); - } } diff --git a/src/app/cartography/widgets/links.spec.ts b/src/app/cartography/widgets/links.spec.ts index 08ce74ce..1b8c3e72 100644 --- a/src/app/cartography/widgets/links.spec.ts +++ b/src/app/cartography/widgets/links.spec.ts @@ -1,15 +1,13 @@ -import { instance, mock } from "ts-mockito"; -import { Selection } from "d3-selection"; - - -import { TestSVGCanvas } from "../testing"; -import { Layer } from "../models/layer"; -import { LinksWidget } from "./links"; -import { LinkWidget } from "./link"; -import { MultiLinkCalculatorHelper } from "../helpers/multi-link-calculator-helper"; -import { MapNode } from "../models/map/map-node"; -import { MapLink } from "../models/map/map-link"; +import { instance, mock } from 'ts-mockito'; +import { Selection } from 'd3-selection'; +import { TestSVGCanvas } from '../testing'; +import { Layer } from '../models/layer'; +import { LinksWidget } from './links'; +import { LinkWidget } from './link'; +import { MultiLinkCalculatorHelper } from '../helpers/multi-link-calculator-helper'; +import { MapNode } from '../models/map/map-node'; +import { MapLink } from '../models/map/map-link'; describe('LinksWidget', () => { let svg: TestSVGCanvas; @@ -24,20 +22,20 @@ describe('LinksWidget', () => { widget = new LinksWidget(new MultiLinkCalculatorHelper(), linkWidget); const node_1 = new MapNode(); - node_1.id = "1"; + node_1.id = '1'; node_1.x = 10; node_1.y = 10; const node_2 = new MapNode(); - node_2.id = "2"; + node_2.id = '2'; node_2.x = 100; node_2.y = 100; const link_1 = new MapLink(); - link_1.id = "link1"; + link_1.id = 'link1'; link_1.source = node_1; link_1.target = node_2; - link_1.linkType = "ethernet"; + link_1.linkType = 'ethernet'; layer = new Layer(); layer.index = 1; @@ -46,18 +44,14 @@ describe('LinksWidget', () => { const layers = [layer]; - const layersSelection = svg.canvas - .selectAll('g.layer') - .data(layers); + const layersSelection = svg.canvas.selectAll('g.layer').data(layers); layersEnter = layersSelection - .enter() - .append('g') - .attr('class', 'layer'); + .enter() + .append('g') + .attr('class', 'layer'); - layersSelection - .exit() - .remove(); + layersSelection.exit().remove(); }); afterEach(() => { @@ -73,5 +67,4 @@ describe('LinksWidget', () => { expect(linkNode.getAttribute('map-source')).toEqual('1'); expect(linkNode.getAttribute('map-target')).toEqual('2'); }); - }); diff --git a/src/app/cartography/widgets/links.ts b/src/app/cartography/widgets/links.ts index 0544dcac..9283ce8b 100644 --- a/src/app/cartography/widgets/links.ts +++ b/src/app/cartography/widgets/links.ts @@ -1,54 +1,50 @@ -import { Injectable } from "@angular/core"; +import { Injectable } from '@angular/core'; -import { Widget } from "./widget"; -import { SVGSelection } from "../models/types"; -import { MultiLinkCalculatorHelper } from "../helpers/multi-link-calculator-helper"; -import { Layer } from "../models/layer"; -import { LinkWidget } from "./link"; -import { MapLink } from "../models/map/map-link"; +import { Widget } from './widget'; +import { SVGSelection } from '../models/types'; +import { MultiLinkCalculatorHelper } from '../helpers/multi-link-calculator-helper'; +import { Layer } from '../models/layer'; +import { LinkWidget } from './link'; +import { MapLink } from '../models/map/map-link'; @Injectable() export class LinksWidget implements Widget { - constructor( - private multiLinkCalculatorHelper: MultiLinkCalculatorHelper, - private linkWidget: LinkWidget - ) { - } + constructor(private multiLinkCalculatorHelper: MultiLinkCalculatorHelper, private linkWidget: LinkWidget) {} public redrawLink(view: SVGSelection, link: MapLink) { this.linkWidget.draw(this.selectLink(view, link)); } public draw(view: SVGSelection) { - const link = view - .selectAll("g.link") - .data((layer: Layer) => { + const link = view.selectAll('g.link').data( + (layer: Layer) => { if (layer.links) { const layer_links = layer.links.filter((l: MapLink) => { - return l.target && l.source; + return l.target && l.source; }); this.multiLinkCalculatorHelper.assignDataToLinks(layer_links); return layer_links; } return []; - }, (l: MapLink) => { + }, + (l: MapLink) => { return l.id; - }); + } + ); - const link_enter = link.enter() + const link_enter = link + .enter() .append('g') - .attr('class', 'link') - .attr('link_id', (l: MapLink) => l.id) - .attr('map-source', (l: MapLink) => l.source.id) - .attr('map-target', (l: MapLink) => l.target.id); + .attr('class', 'link') + .attr('link_id', (l: MapLink) => l.id) + .attr('map-source', (l: MapLink) => l.source.id) + .attr('map-target', (l: MapLink) => l.target.id); const merge = link.merge(link_enter); this.linkWidget.draw(merge); - link - .exit() - .remove(); + link.exit().remove(); } private selectLink(view: SVGSelection, link: MapLink) { diff --git a/src/app/cartography/widgets/links/ethernet-link.ts b/src/app/cartography/widgets/links/ethernet-link.ts index d8a3b977..2638c128 100644 --- a/src/app/cartography/widgets/links/ethernet-link.ts +++ b/src/app/cartography/widgets/links/ethernet-link.ts @@ -1,52 +1,43 @@ -import { path } from "d3-path"; +import { path } from 'd3-path'; -import { Widget } from "../widget"; -import { SVGSelection } from "../../models/types"; -import { MapLink } from "../../models/map/map-link"; +import { Widget } from '../widget'; +import { SVGSelection } from '../../models/types'; +import { MapLink } from '../../models/map/map-link'; class EthernetLinkPath { - constructor( - public source: [number, number], - public target: [number, number] - ) { - } + constructor(public source: [number, number], public target: [number, number]) {} } export class EthernetLinkWidget implements Widget { private linktoEthernetLink(link: MapLink) { return new EthernetLinkPath( - [link.source.x + link.source.width / 2., link.source.y + link.source.height / 2.], - [link.target.x + link.target.width / 2., link.target.y + link.target.height / 2.] + [link.source.x + link.source.width / 2, link.source.y + link.source.height / 2], + [link.target.x + link.target.width / 2, link.target.y + link.target.height / 2] ); } public draw(view: SVGSelection) { + const link = view.selectAll('path.ethernet_link').data(l => { + if (l.linkType === 'ethernet') { + return [this.linktoEthernetLink(l)]; + } + return []; + }); - const link = view - .selectAll('path.ethernet_link') - .data((l) => { - if (l.linkType === 'ethernet') { - return [this.linktoEthernetLink(l)]; - } - return []; - }); - - const link_enter = link.enter() + const link_enter = link + .enter() .append('path') - .attr('class', 'ethernet_link'); + .attr('class', 'ethernet_link'); - link_enter - .attr('stroke', '#000') - .attr('stroke-width', '2'); + link_enter.attr('stroke', '#000').attr('stroke-width', '2'); const link_merge = link.merge(link_enter); - link_merge - .attr('d', (ethernet) => { - const line_generator = path(); - line_generator.moveTo(ethernet.source[0], ethernet.source[1]); - line_generator.lineTo(ethernet.target[0], ethernet.target[1]); - return line_generator.toString(); - }); + link_merge.attr('d', ethernet => { + const line_generator = path(); + line_generator.moveTo(ethernet.source[0], ethernet.source[1]); + line_generator.lineTo(ethernet.target[0], ethernet.target[1]); + return line_generator.toString(); + }); } } diff --git a/src/app/cartography/widgets/links/serial-link.ts b/src/app/cartography/widgets/links/serial-link.ts index f684d4ae..768ccbc0 100644 --- a/src/app/cartography/widgets/links/serial-link.ts +++ b/src/app/cartography/widgets/links/serial-link.ts @@ -1,9 +1,8 @@ -import { path } from "d3-path"; - -import { Widget } from "../widget"; -import { SVGSelection } from "../../models/types"; -import { MapLink } from "../../models/map/map-link"; +import { path } from 'd3-path'; +import { Widget } from '../widget'; +import { SVGSelection } from '../../models/types'; +import { MapLink } from '../../models/map/map-link'; class SerialLinkPath { constructor( @@ -11,21 +10,18 @@ class SerialLinkPath { public source_angle: [number, number], public target_angle: [number, number], public target: [number, number] - ) { - } + ) {} } - export class SerialLinkWidget implements Widget { - private linkToSerialLink(link: MapLink) { const source = { - 'x': link.source.x + link.source.width / 2, - 'y': link.source.y + link.source.height / 2 + x: link.source.x + link.source.width / 2, + y: link.source.y + link.source.height / 2 }; const target = { - 'x': link.target.x + link.target.width / 2, - 'y': link.target.y + link.target.height / 2 + x: link.target.x + link.target.width / 2, + y: link.target.y + link.target.height / 2 }; const dx = target.x - source.x; @@ -33,10 +29,7 @@ export class SerialLinkWidget implements Widget { const vector_angle = Math.atan2(dy, dx); const rot_angle = -Math.PI / 4.0; - const vect_rot = [ - Math.cos(vector_angle + rot_angle), - Math.sin(vector_angle + rot_angle) - ]; + const vect_rot = [Math.cos(vector_angle + rot_angle), Math.sin(vector_angle + rot_angle)]; const angle_source: [number, number] = [ source.x + dx / 2.0 + 15 * vect_rot[0], @@ -48,28 +41,21 @@ export class SerialLinkWidget implements Widget { target.y - dy / 2.0 - 15 * vect_rot[1] ]; - return new SerialLinkPath( - [source.x, source.y], - angle_source, - angle_target, - [target.x, target.y] - ); + return new SerialLinkPath([source.x, source.y], angle_source, angle_target, [target.x, target.y]); } public draw(view: SVGSelection) { + const link = view.selectAll('path.serial_link').data(l => { + if (l.linkType === 'serial') { + return [this.linkToSerialLink(l)]; + } + return []; + }); - const link = view - .selectAll('path.serial_link') - .data((l) => { - if (l.linkType === 'serial') { - return [this.linkToSerialLink(l)]; - } - return []; - }); - - const link_enter = link.enter() + const link_enter = link + .enter() .append('path') - .attr('class', 'serial_link'); + .attr('class', 'serial_link'); link_enter .attr('stroke', '#B22222') @@ -78,15 +64,13 @@ export class SerialLinkWidget implements Widget { const link_merge = link.merge(link_enter); - link_merge - .attr('d', (serial) => { - const line_generator = path(); - line_generator.moveTo(serial.source[0], serial.source[1]); - line_generator.lineTo(serial.source_angle[0], serial.source_angle[1]); - line_generator.lineTo(serial.target_angle[0], serial.target_angle[1]); - line_generator.lineTo(serial.target[0], serial.target[1]); - return line_generator.toString(); - }); + link_merge.attr('d', serial => { + const line_generator = path(); + line_generator.moveTo(serial.source[0], serial.source[1]); + line_generator.lineTo(serial.source_angle[0], serial.source_angle[1]); + line_generator.lineTo(serial.target_angle[0], serial.target_angle[1]); + line_generator.lineTo(serial.target[0], serial.target[1]); + return line_generator.toString(); + }); } - } diff --git a/src/app/cartography/widgets/node.spec.ts b/src/app/cartography/widgets/node.spec.ts index 5f2dfa2e..2f09f543 100644 --- a/src/app/cartography/widgets/node.spec.ts +++ b/src/app/cartography/widgets/node.spec.ts @@ -1,14 +1,12 @@ - -import { TestSVGCanvas } from "../testing"; -import { CssFixer } from "../helpers/css-fixer"; -import { FontFixer } from "../helpers/font-fixer"; -import { NodeWidget } from "./node"; -import { MapNode } from "../models/map/map-node"; -import { MapLabel } from "../models/map/map-label"; -import { MockedGraphDataManager } from "../managers/graph-data-manager.spec"; -import { GraphDataManager } from "../managers/graph-data-manager"; -import { SelectionManager } from "../managers/selection-manager"; - +import { TestSVGCanvas } from '../testing'; +import { CssFixer } from '../helpers/css-fixer'; +import { FontFixer } from '../helpers/font-fixer'; +import { NodeWidget } from './node'; +import { MapNode } from '../models/map/map-node'; +import { MapLabel } from '../models/map/map-label'; +import { MockedGraphDataManager } from '../managers/graph-data-manager.spec'; +import { GraphDataManager } from '../managers/graph-data-manager'; +import { SelectionManager } from '../managers/selection-manager'; describe('NodesWidget', () => { let svg: TestSVGCanvas; @@ -39,13 +37,17 @@ describe('NodesWidget', () => { drewNode.dispatchEvent( new MouseEvent('mousedown', { - clientX: 150, clientY: 250, relatedTarget: drewNode, - screenY: 1024, screenX: 1024, view: window + clientX: 150, + clientY: 250, + relatedTarget: drewNode, + screenY: 1024, + screenX: 1024, + view: window }) ); - window.dispatchEvent(new MouseEvent('mousemove', {clientX: 300, clientY: 300})); - window.dispatchEvent(new MouseEvent('mouseup', {clientX: 300, clientY: 300, view: window})); + window.dispatchEvent(new MouseEvent('mousemove', { clientX: 300, clientY: 300 })); + window.dispatchEvent(new MouseEvent('mouseup', { clientX: 300, clientY: 300, view: window })); }; beforeEach(() => { @@ -76,6 +78,5 @@ describe('NodesWidget', () => { // expect(node.x).toEqual(100); // expect(node.y).toEqual(200); // }); - }); }); diff --git a/src/app/cartography/widgets/node.ts b/src/app/cartography/widgets/node.ts index 25ebcf20..89016a84 100644 --- a/src/app/cartography/widgets/node.ts +++ b/src/app/cartography/widgets/node.ts @@ -1,17 +1,16 @@ -import { Injectable, EventEmitter } from "@angular/core"; +import { Injectable, EventEmitter } from '@angular/core'; -import { Widget } from "./widget"; -import { SVGSelection } from "../models/types"; -import { NodeContextMenu, NodeClicked } from "../events/nodes"; -import { select, event } from "d3-selection"; -import { MapNode } from "../models/map/map-node"; -import { GraphDataManager } from "../managers/graph-data-manager"; -import { SelectionManager } from "../managers/selection-manager"; -import { LabelWidget } from "./label"; +import { Widget } from './widget'; +import { SVGSelection } from '../models/types'; +import { NodeContextMenu, NodeClicked } from '../events/nodes'; +import { select, event } from 'd3-selection'; +import { MapNode } from '../models/map/map-node'; +import { GraphDataManager } from '../managers/graph-data-manager'; +import { SelectionManager } from '../managers/selection-manager'; +import { LabelWidget } from './label'; import { NodesEventSource } from '../events/nodes-event-source'; import { ClickedDataEvent } from '../events/event-source'; - @Injectable() export class NodeWidget implements Widget { public onContextMenu = new EventEmitter(); @@ -21,53 +20,51 @@ export class NodeWidget implements Widget { private graphDataManager: GraphDataManager, private selectionManager: SelectionManager, private labelWidget: LabelWidget, - private nodesEventSource: NodesEventSource, + private nodesEventSource: NodesEventSource ) {} public draw(view: SVGSelection) { const self = this; - const node_body = view.selectAll("g.node_body") - .data((n) => [n]); + const node_body = view.selectAll('g.node_body').data(n => [n]); - const node_body_enter = node_body.enter() + const node_body_enter = node_body + .enter() .append('g') - .attr("class", "node_body"); + .attr('class', 'node_body'); - node_body_enter - .append('image'); - + node_body_enter.append('image'); - const node_body_merge = node_body.merge(node_body_enter) - .classed('selected', (n: MapNode) => this.selectionManager.isSelected(n)) - .on("contextmenu", function (n: MapNode, i: number) { - event.preventDefault(); - self.onContextMenu.emit(new NodeContextMenu(event, n)); - }) - .on('click', (node: MapNode) => { - this.nodesEventSource.clicked.emit(new ClickedDataEvent(node, event.clientX, event.clientY)) - }); + const node_body_merge = node_body + .merge(node_body_enter) + .classed('selected', (n: MapNode) => this.selectionManager.isSelected(n)) + .on('contextmenu', function(n: MapNode, i: number) { + event.preventDefault(); + self.onContextMenu.emit(new NodeContextMenu(event, n)); + }) + .on('click', (node: MapNode) => { + this.nodesEventSource.clicked.emit(new ClickedDataEvent(node, event.clientX, event.clientY)); + }); // update image of node node_body_merge - .select('image') - .attr('xnode:href', (n: MapNode) => n.symbolUrl) - .attr('width', (n: MapNode) => n.width) - .attr('height', (n: MapNode) => n.height) - .attr('x', (n: MapNode) => 0) - .attr('y', (n: MapNode) => 0) - .on('mouseover', function (this, n: MapNode) { - select(this).attr("class", "over"); - }) - .on('mouseout', function (this, n: MapNode) { - select(this).attr("class", ""); - }); - - node_body_merge - .attr('transform', (n: MapNode) => { - return `translate(${n.x},${n.y})`; + .select('image') + .attr('xnode:href', (n: MapNode) => n.symbolUrl) + .attr('width', (n: MapNode) => n.width) + .attr('height', (n: MapNode) => n.height) + .attr('x', (n: MapNode) => 0) + .attr('y', (n: MapNode) => 0) + .on('mouseover', function(this, n: MapNode) { + select(this).attr('class', 'over'); + }) + .on('mouseout', function(this, n: MapNode) { + select(this).attr('class', ''); }); + node_body_merge.attr('transform', (n: MapNode) => { + return `translate(${n.x},${n.y})`; + }); + this.labelWidget.draw(node_body_merge); } } diff --git a/src/app/cartography/widgets/nodes.spec.ts b/src/app/cartography/widgets/nodes.spec.ts index 77fe84e4..8d0983c2 100644 --- a/src/app/cartography/widgets/nodes.spec.ts +++ b/src/app/cartography/widgets/nodes.spec.ts @@ -1,10 +1,8 @@ - -import { TestSVGCanvas } from "../testing"; -import { NodesWidget } from "./nodes"; -import { NodeWidget } from "./node"; -import { instance, mock } from "ts-mockito"; -import { MapSettingsManager } from "../managers/map-settings-manager"; - +import { TestSVGCanvas } from '../testing'; +import { NodesWidget } from './nodes'; +import { NodeWidget } from './node'; +import { instance, mock } from 'ts-mockito'; +import { MapSettingsManager } from '../managers/map-settings-manager'; describe('NodesWidget', () => { let svg: TestSVGCanvas; @@ -20,5 +18,4 @@ describe('NodesWidget', () => { afterEach(() => { svg.destroy(); }); - }); diff --git a/src/app/cartography/widgets/nodes.ts b/src/app/cartography/widgets/nodes.ts index 60dd0ab7..45b18831 100644 --- a/src/app/cartography/widgets/nodes.ts +++ b/src/app/cartography/widgets/nodes.ts @@ -1,13 +1,12 @@ -import { Injectable } from "@angular/core"; - -import { Widget } from "./widget"; -import { SVGSelection } from "../models/types"; -import { Layer } from "../models/layer"; -import { NodeWidget } from "./node"; -import { Draggable } from "../events/draggable"; -import { MapNode } from "../models/map/map-node"; -import { MapSettingsManager } from "../managers/map-settings-manager"; +import { Injectable } from '@angular/core'; +import { Widget } from './widget'; +import { SVGSelection } from '../models/types'; +import { Layer } from '../models/layer'; +import { NodeWidget } from './node'; +import { Draggable } from '../events/draggable'; +import { MapNode } from '../models/map/map-node'; +import { MapSettingsManager } from '../managers/map-settings-manager'; @Injectable() export class NodesWidget implements Widget { @@ -15,40 +14,36 @@ export class NodesWidget implements Widget { public draggable = new Draggable(); - constructor( - private nodeWidget: NodeWidget, - private mapSettings: MapSettingsManager - ) { - } + constructor(private nodeWidget: NodeWidget, private mapSettings: MapSettingsManager) {} public redrawNode(view: SVGSelection, node: MapNode) { this.nodeWidget.draw(this.selectNode(view, node)); } public draw(view: SVGSelection) { - const node = view - .selectAll("g.node") - .data((layer: Layer) => { + const node = view.selectAll('g.node').data( + (layer: Layer) => { if (layer.nodes) { return layer.nodes; } return []; - }, (n: MapNode) => { + }, + (n: MapNode) => { return n.id; - }); + } + ); - const node_enter = node.enter() + const node_enter = node + .enter() .append('g') - .attr('class', 'node') - .attr('node_id', (n: MapNode) => n.id) + .attr('class', 'node') + .attr('node_id', (n: MapNode) => n.id); const merge = node.merge(node_enter); - + this.nodeWidget.draw(merge); - node - .exit() - .remove(); + node.exit().remove(); if (!this.mapSettings.isReadOnly) { this.draggable.call(merge); @@ -58,5 +53,4 @@ export class NodesWidget implements Widget { private selectNode(view: SVGSelection, node: MapNode) { return view.selectAll(`g.node[node_id="${node.id}"]`); } - } diff --git a/src/app/cartography/widgets/widget.ts b/src/app/cartography/widgets/widget.ts index 63d2950b..06843a43 100644 --- a/src/app/cartography/widgets/widget.ts +++ b/src/app/cartography/widgets/widget.ts @@ -1,4 +1,3 @@ - export interface Widget { draw(view: any, datum: any): void; } diff --git a/src/app/common/error-handlers/raven-error-handler.spec.ts b/src/app/common/error-handlers/raven-error-handler.spec.ts index a229b3d0..a751793a 100644 --- a/src/app/common/error-handlers/raven-error-handler.spec.ts +++ b/src/app/common/error-handlers/raven-error-handler.spec.ts @@ -1,10 +1,9 @@ import { TestBed } from '@angular/core/testing'; -import { PersistenceService } from "angular-persistence"; - -import { SettingsService } from "../../services/settings.service"; -import { RavenErrorHandler } from "./raven-error-handler"; -import { environment } from "../../../environments/environment"; +import { PersistenceService } from 'angular-persistence'; +import { SettingsService } from '../../services/settings.service'; +import { RavenErrorHandler } from './raven-error-handler'; +import { environment } from '../../../environments/environment'; describe('RavenErrorHandler', () => { let handler: RavenErrorHandler; diff --git a/src/app/common/error-handlers/raven-error-handler.ts b/src/app/common/error-handlers/raven-error-handler.ts index 005fb537..ccb5885a 100644 --- a/src/app/common/error-handlers/raven-error-handler.ts +++ b/src/app/common/error-handlers/raven-error-handler.ts @@ -1,9 +1,8 @@ -import { ErrorHandler, Inject, Injector } from "@angular/core"; - -import { SettingsService } from "../../services/settings.service"; -import { environment } from "../../../environments/environment"; -import { RavenState } from "./raven-state-communicator"; +import { ErrorHandler, Inject, Injector } from '@angular/core'; +import { SettingsService } from '../../services/settings.service'; +import { environment } from '../../../environments/environment'; +import { RavenState } from './raven-state-communicator'; export class RavenErrorHandler implements ErrorHandler { constructor(@Inject(Injector) protected injector: Injector) {} diff --git a/src/app/common/error-handlers/raven-state-communicator.ts b/src/app/common/error-handlers/raven-state-communicator.ts index 7a099177..700f810b 100644 --- a/src/app/common/error-handlers/raven-state-communicator.ts +++ b/src/app/common/error-handlers/raven-state-communicator.ts @@ -1,5 +1,5 @@ export class RavenStateCommunicator { public shouldSend = true; -}; +} export var RavenState = new RavenStateCommunicator(); diff --git a/src/app/common/error-handlers/toaster-error-handler.spec.ts b/src/app/common/error-handlers/toaster-error-handler.spec.ts index 10fbb578..f8eade1b 100644 --- a/src/app/common/error-handlers/toaster-error-handler.spec.ts +++ b/src/app/common/error-handlers/toaster-error-handler.spec.ts @@ -1,11 +1,10 @@ import { TestBed } from '@angular/core/testing'; -import { ToasterService } from "../../services/toaster.service"; -import { MockedToasterService } from "../../services/toaster.service.spec"; -import { ToasterErrorHandler } from "./toaster-error-handler"; -import { RavenErrorHandler } from "./raven-error-handler"; -import { SettingsService } from "../../services/settings.service"; -import { MockedSettingsService } from "../../services/settings.service.spec"; - +import { ToasterService } from '../../services/toaster.service'; +import { MockedToasterService } from '../../services/toaster.service.spec'; +import { ToasterErrorHandler } from './toaster-error-handler'; +import { RavenErrorHandler } from './raven-error-handler'; +import { SettingsService } from '../../services/settings.service'; +import { MockedSettingsService } from '../../services/settings.service.spec'; describe('ToasterErrorHandler', () => { let handler: ToasterErrorHandler; @@ -17,7 +16,7 @@ describe('ToasterErrorHandler', () => { { provide: ToasterService, useClass: MockedToasterService }, { provide: SettingsService, useClass: MockedSettingsService }, RavenErrorHandler, - ToasterErrorHandler, + ToasterErrorHandler ] }); @@ -25,9 +24,8 @@ describe('ToasterErrorHandler', () => { toasterService = TestBed.get(ToasterService); }); - it('should call toaster with error message', () => { - handler.handleError(new Error("message")); - expect(toasterService.errors).toEqual(["message"]); + handler.handleError(new Error('message')); + expect(toasterService.errors).toEqual(['message']); }); }); diff --git a/src/app/common/error-handlers/toaster-error-handler.ts b/src/app/common/error-handlers/toaster-error-handler.ts index a1d0d71b..6c18220d 100644 --- a/src/app/common/error-handlers/toaster-error-handler.ts +++ b/src/app/common/error-handlers/toaster-error-handler.ts @@ -1,14 +1,11 @@ -import { RavenErrorHandler } from "./raven-error-handler"; -import { ToasterService } from "../../services/toaster.service"; - +import { RavenErrorHandler } from './raven-error-handler'; +import { ToasterService } from '../../services/toaster.service'; export class ToasterErrorHandler extends RavenErrorHandler { - handleError(err: any): void { super.handleError(err); const toasterService = this.injector.get(ToasterService); toasterService.error(err.message); } - } diff --git a/src/app/common/progress-dialog/progress-dialog.component.html b/src/app/common/progress-dialog/progress-dialog.component.html index 792da427..2ab59ad4 100644 --- a/src/app/common/progress-dialog/progress-dialog.component.html +++ b/src/app/common/progress-dialog/progress-dialog.component.html @@ -1,11 +1,3 @@

Operation in progress

-
- - -
-
- -
+
+
diff --git a/src/app/common/progress-dialog/progress-dialog.component.spec.ts b/src/app/common/progress-dialog/progress-dialog.component.spec.ts index acaacb08..c1694de4 100644 --- a/src/app/common/progress-dialog/progress-dialog.component.spec.ts +++ b/src/app/common/progress-dialog/progress-dialog.component.spec.ts @@ -8,9 +8,8 @@ describe('ProgressDialogComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ - declarations: [ ProgressDialogComponent ] - }) - .compileComponents(); + declarations: [ProgressDialogComponent] + }).compileComponents(); })); beforeEach(() => { diff --git a/src/app/common/progress-dialog/progress-dialog.component.ts b/src/app/common/progress-dialog/progress-dialog.component.ts index 6785d938..21a9d918 100644 --- a/src/app/common/progress-dialog/progress-dialog.component.ts +++ b/src/app/common/progress-dialog/progress-dialog.component.ts @@ -1,6 +1,5 @@ -import {Component, Inject, OnInit} from '@angular/core'; -import {MAT_DIALOG_DATA, MatDialogRef} from "@angular/material"; - +import { Component, Inject, OnInit } from '@angular/core'; +import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material'; @Component({ selector: 'app-progress-dialog', @@ -12,17 +11,11 @@ export class ProgressDialogComponent implements OnInit { public value: 50; - constructor( - public dialogRef: MatDialogRef, - @Inject(MAT_DIALOG_DATA) public data: any) { - } - + constructor(public dialogRef: MatDialogRef, @Inject(MAT_DIALOG_DATA) public data: any) {} onCancelClick(): void { this.dialogRef.close(ProgressDialogComponent.CANCELLED); } - ngOnInit() { - } - + ngOnInit() {} } diff --git a/src/app/common/progress-dialog/progress-dialog.service.ts b/src/app/common/progress-dialog/progress-dialog.service.ts index 3905c108..07b757dc 100644 --- a/src/app/common/progress-dialog/progress-dialog.service.ts +++ b/src/app/common/progress-dialog/progress-dialog.service.ts @@ -1,15 +1,14 @@ import { Injectable } from '@angular/core'; -import {MatDialog} from "@angular/material"; -import {ProgressDialogComponent} from "./progress-dialog.component"; +import { MatDialog } from '@angular/material'; +import { ProgressDialogComponent } from './progress-dialog.component'; @Injectable() export class ProgressDialogService { - - constructor(private dialog: MatDialog) { } + constructor(private dialog: MatDialog) {} public open() { const ref = this.dialog.open(ProgressDialogComponent, { - width: '250px', + width: '250px' }); return ref; } diff --git a/src/app/common/progress/progress.component.html b/src/app/common/progress/progress.component.html index 9778c6d6..cbd3a439 100644 --- a/src/app/common/progress/progress.component.html +++ b/src/app/common/progress/progress.component.html @@ -1,20 +1,11 @@
-
- - -
+
error_outline
Error occurred: {{ error.message }}
- - + +
- - diff --git a/src/app/common/progress/progress.component.scss b/src/app/common/progress/progress.component.scss index ec3a3ecf..da093ac5 100644 --- a/src/app/common/progress/progress.component.scss +++ b/src/app/common/progress/progress.component.scss @@ -1,16 +1,17 @@ .overlay { - position: fixed; - width: 100%; - height: 100%; - top: 0; - left: 0; - right: 0; - bottom: 0; - background-color: rgba(0,0,0,0.5); - z-index: 1000; + position: fixed; + width: 100%; + height: 100%; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: rgba(0, 0, 0, 0.5); + z-index: 1000; } -.loading-spinner, .error-state { +.loading-spinner, +.error-state { position: fixed; top: 50%; left: 50%; diff --git a/src/app/common/progress/progress.component.spec.ts b/src/app/common/progress/progress.component.spec.ts index 2e92c114..18ad6b6c 100644 --- a/src/app/common/progress/progress.component.spec.ts +++ b/src/app/common/progress/progress.component.spec.ts @@ -1,12 +1,11 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { ProgressComponent } from './progress.component'; -import { MatIconModule, MatProgressSpinnerModule } from "@angular/material"; -import { ProgressService } from "./progress.service"; -import { RouterTestingModule } from "@angular/router/testing"; -import { Router } from "@angular/router"; -import { BehaviorSubject } from "rxjs"; - +import { MatIconModule, MatProgressSpinnerModule } from '@angular/material'; +import { ProgressService } from './progress.service'; +import { RouterTestingModule } from '@angular/router/testing'; +import { Router } from '@angular/router'; +import { BehaviorSubject } from 'rxjs'; class MockedRouter { events: BehaviorSubject; @@ -16,7 +15,6 @@ class MockedRouter { } } - describe('ProgressComponent', () => { let component: ProgressComponent; let fixture: ComponentFixture; @@ -25,18 +23,10 @@ describe('ProgressComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ - imports: [ - RouterTestingModule, - MatProgressSpinnerModule, - MatIconModule - ], - providers: [ - ProgressService, - { provide: Router, useClass: MockedRouter} - ], - declarations: [ ProgressComponent ] - }) - .compileComponents(); + imports: [RouterTestingModule, MatProgressSpinnerModule, MatIconModule], + providers: [ProgressService, { provide: Router, useClass: MockedRouter }], + declarations: [ProgressComponent] + }).compileComponents(); progressService = TestBed.get(ProgressService); router = TestBed.get(Router); @@ -53,26 +43,26 @@ describe('ProgressComponent', () => { expect(component.visible).toEqual(false); }); - it( 'should change visibility when activated', () => { + it('should change visibility when activated', () => { progressService.activate(); expect(component.visible).toEqual(true); }); - it( 'should change visibility when deactivated', () => { + it('should change visibility when deactivated', () => { component.visible = true; progressService.deactivate(); expect(component.visible).toEqual(false); }); - it( 'should set error state when error defined', () => { - const error = new Error("test"); + it('should set error state when error defined', () => { + const error = new Error('test'); progressService.setError(error); expect(component.error).toEqual(error); }); - it( 'should clear error when changes route', () => { - const error = new Error("test"); + it('should clear error when changes route', () => { + const error = new Error('test'); component.error = error; spyOn(progressService, 'clear'); @@ -81,5 +71,4 @@ describe('ProgressComponent', () => { expect(progressService.clear).toHaveBeenCalled(); }); - }); diff --git a/src/app/common/progress/progress.component.ts b/src/app/common/progress/progress.component.ts index 07a44cb4..92a864eb 100644 --- a/src/app/common/progress/progress.component.ts +++ b/src/app/common/progress/progress.component.ts @@ -1,7 +1,7 @@ import { Component, OnDestroy, OnInit } from '@angular/core'; -import { ProgressService } from "./progress.service"; -import { Router } from "@angular/router"; -import { Subscription } from "rxjs"; +import { ProgressService } from './progress.service'; +import { Router } from '@angular/router'; +import { Subscription } from 'rxjs'; @Component({ selector: 'app-progress', @@ -13,13 +13,10 @@ export class ProgressComponent implements OnInit, OnDestroy { error: Error; routerSubscription: Subscription; - constructor( - private progressService: ProgressService, - private router: Router, - ) { } + constructor(private progressService: ProgressService, private router: Router) {} ngOnInit() { - this.progressService.state.subscribe((state) => { + this.progressService.state.subscribe(state => { this.visible = state.visible; // only set error state once; ignore next "correct" states diff --git a/src/app/common/progress/progress.service.spec.ts b/src/app/common/progress/progress.service.spec.ts index 530216ff..80a30d5b 100644 --- a/src/app/common/progress/progress.service.spec.ts +++ b/src/app/common/progress/progress.service.spec.ts @@ -2,7 +2,6 @@ import { TestBed, inject } from '@angular/core/testing'; import { ProgressService, State } from './progress.service'; - describe('ProgressService', () => { let progressService: ProgressService; diff --git a/src/app/common/progress/progress.service.ts b/src/app/common/progress/progress.service.ts index 7e3c1049..b0e72cbc 100644 --- a/src/app/common/progress/progress.service.ts +++ b/src/app/common/progress/progress.service.ts @@ -1,7 +1,6 @@ import { Injectable } from '@angular/core'; -import { BehaviorSubject } from "rxjs"; - +import { BehaviorSubject } from 'rxjs'; export class State { public visible: boolean; @@ -36,5 +35,4 @@ export class ProgressService { public deactivate() { this.state.next(new State(false)); } - } diff --git a/src/app/components/drawings-listeners/drawing-added/drawing-added.component.spec.ts b/src/app/components/drawings-listeners/drawing-added/drawing-added.component.spec.ts index a09958cc..311c9bae 100644 --- a/src/app/components/drawings-listeners/drawing-added/drawing-added.component.spec.ts +++ b/src/app/components/drawings-listeners/drawing-added/drawing-added.component.spec.ts @@ -1,4 +1,4 @@ -import { DrawingAddedComponent } from "./drawing-added.component"; +import { DrawingAddedComponent } from './drawing-added.component'; import { ComponentFixture, TestBed, async } from '@angular/core/testing'; import { DrawingService } from '../../../services/drawing.service'; import { DrawingsDataSource } from '../../../cartography/datasources/drawings-datasource'; @@ -15,48 +15,49 @@ import { AddedDataEvent } from '../../../cartography/events/event-source'; import { Observable } from 'rxjs'; describe('DrawingAddedComponent', () => { - let component: DrawingAddedComponent; - let fixture: ComponentFixture; - let mockedDrawingService = new MockedDrawingService; - let mockedDrawingsDataSource = new MockedDrawingsDataSource; - let mockedDrawingsEventSource = new DrawingsEventSource; - let mockedDrawingsFactory = new DefaultDrawingsFactory(new TextElementFactory, - new EllipseElementFactory, new RectangleElementFactory, new LineElementFactory); + let component: DrawingAddedComponent; + let fixture: ComponentFixture; + let mockedDrawingService = new MockedDrawingService(); + let mockedDrawingsDataSource = new MockedDrawingsDataSource(); + let mockedDrawingsEventSource = new DrawingsEventSource(); + let mockedDrawingsFactory = new DefaultDrawingsFactory( + new TextElementFactory(), + new EllipseElementFactory(), + new RectangleElementFactory(), + new LineElementFactory() + ); - beforeEach(async(() => { - TestBed.configureTestingModule({ - providers: [ - { provide: DrawingService, useValue: mockedDrawingService }, - { provide: DrawingsDataSource, useValue: mockedDrawingsDataSource }, - { provide: DrawingsEventSource, useValue: mockedDrawingsEventSource }, - { provide: DefaultDrawingsFactory, useValue: mockedDrawingsFactory }, - { provide: MapDrawingToSvgConverter, useClass: MapDrawingToSvgConverter } - ], - declarations: [ - DrawingAddedComponent - ] - }) - .compileComponents(); - })); + beforeEach(async(() => { + TestBed.configureTestingModule({ + providers: [ + { provide: DrawingService, useValue: mockedDrawingService }, + { provide: DrawingsDataSource, useValue: mockedDrawingsDataSource }, + { provide: DrawingsEventSource, useValue: mockedDrawingsEventSource }, + { provide: DefaultDrawingsFactory, useValue: mockedDrawingsFactory }, + { provide: MapDrawingToSvgConverter, useClass: MapDrawingToSvgConverter } + ], + declarations: [DrawingAddedComponent] + }).compileComponents(); + })); - beforeEach(() => { - fixture = TestBed.createComponent(DrawingAddedComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); + beforeEach(() => { + fixture = TestBed.createComponent(DrawingAddedComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); - it('should create', () => { - expect(component).toBeTruthy(); - }); + it('should create', () => { + expect(component).toBeTruthy(); + }); - it('should call drawing service when point to add drawing selected', () => { - component.project = { project_id: "sampleId" } as Project; - component.selectedDrawing = "rectangle"; - const pointToAddSelectedDataEvent = new AddedDataEvent(0, 0); - spyOn(mockedDrawingService, 'add').and.returnValue( Observable.of({})); + it('should call drawing service when point to add drawing selected', () => { + component.project = { project_id: 'sampleId' } as Project; + component.selectedDrawing = 'rectangle'; + const pointToAddSelectedDataEvent = new AddedDataEvent(0, 0); + spyOn(mockedDrawingService, 'add').and.returnValue(Observable.of({})); - mockedDrawingsEventSource.pointToAddSelected.emit(pointToAddSelectedDataEvent); + mockedDrawingsEventSource.pointToAddSelected.emit(pointToAddSelectedDataEvent); - expect(mockedDrawingService.add).toHaveBeenCalled(); - }); + expect(mockedDrawingService.add).toHaveBeenCalled(); + }); }); diff --git a/src/app/components/drawings-listeners/drawing-added/drawing-added.component.ts b/src/app/components/drawings-listeners/drawing-added/drawing-added.component.ts index 8a6d6948..6a0601bc 100644 --- a/src/app/components/drawings-listeners/drawing-added/drawing-added.component.ts +++ b/src/app/components/drawings-listeners/drawing-added/drawing-added.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit, OnDestroy, Input, Output, EventEmitter, SimpleChange } from "@angular/core"; +import { Component, OnInit, OnDestroy, Input, Output, EventEmitter, SimpleChange } from '@angular/core'; import { DrawingsDataSource } from '../../../cartography/datasources/drawings-datasource'; import { DrawingsEventSource } from '../../../cartography/events/drawings-event-source'; import { DefaultDrawingsFactory } from '../../../cartography/helpers/default-drawings-factory'; @@ -10,54 +10,53 @@ import { Drawing } from '../../../cartography/models/drawing'; import { MapDrawingToSvgConverter } from '../../../cartography/converters/map/map-drawing-to-svg-converter'; import { AddedDataEvent } from '../../../cartography/events/event-source'; - @Component({ - selector: 'app-drawing-added', - templateUrl: './drawing-added.component.html', - styleUrls: ['./drawing-added.component.css'] + selector: 'app-drawing-added', + templateUrl: './drawing-added.component.html', + styleUrls: ['./drawing-added.component.css'] }) -export class DrawingAddedComponent implements OnInit, OnDestroy{ - @Input() server: Server; - @Input() project: Project; - @Input() selectedDrawing: string; - @Output() drawingSaved = new EventEmitter(); - private pointToAddSelected: Subscription; +export class DrawingAddedComponent implements OnInit, OnDestroy { + @Input() server: Server; + @Input() project: Project; + @Input() selectedDrawing: string; + @Output() drawingSaved = new EventEmitter(); + private pointToAddSelected: Subscription; - constructor( - private drawingService: DrawingService, - private drawingsDataSource: DrawingsDataSource, - private drawingsEventSource: DrawingsEventSource, - private drawingsFactory: DefaultDrawingsFactory, - private mapDrawingToSvgConverter: MapDrawingToSvgConverter - ){} + constructor( + private drawingService: DrawingService, + private drawingsDataSource: DrawingsDataSource, + private drawingsEventSource: DrawingsEventSource, + private drawingsFactory: DefaultDrawingsFactory, + private mapDrawingToSvgConverter: MapDrawingToSvgConverter + ) {} - ngOnInit(){ - this.pointToAddSelected = this.drawingsEventSource.pointToAddSelected.subscribe((evt) => this.onDrawingSaved(evt)); + ngOnInit() { + this.pointToAddSelected = this.drawingsEventSource.pointToAddSelected.subscribe(evt => this.onDrawingSaved(evt)); + } + + ngOnChanges(changes: { [propKey: string]: SimpleChange }) { + if (changes['selectedDrawing'] && !changes['selectedDrawing'].isFirstChange()) { + this.selectedDrawing = changes['selectedDrawing'].currentValue; + + if (this.selectedDrawing !== 'text') { + this.drawingsEventSource.selected.emit(this.selectedDrawing); + } } + } - ngOnChanges(changes: { [propKey: string]: SimpleChange }) { - if(changes['selectedDrawing'] && !changes['selectedDrawing'].isFirstChange()){ - this.selectedDrawing = changes['selectedDrawing'].currentValue; - - if(this.selectedDrawing!=="text"){ - this.drawingsEventSource.selected.emit(this.selectedDrawing); - } - } - } + onDrawingSaved(evt: AddedDataEvent) { + let drawing = this.drawingsFactory.getDrawingMock(this.selectedDrawing); + let svgText = this.mapDrawingToSvgConverter.convert(drawing); - onDrawingSaved(evt: AddedDataEvent){ - let drawing = this.drawingsFactory.getDrawingMock(this.selectedDrawing); - let svgText = this.mapDrawingToSvgConverter.convert(drawing); + this.drawingService + .add(this.server, this.project.project_id, evt.x, evt.y, svgText) + .subscribe((serverDrawing: Drawing) => { + this.drawingsDataSource.add(serverDrawing); + this.drawingSaved.emit(true); + }); + } - this.drawingService - .add(this.server, this.project.project_id, evt.x, evt.y, svgText) - .subscribe((serverDrawing: Drawing) => { - this.drawingsDataSource.add(serverDrawing); - this.drawingSaved.emit(true); - }); - } - - ngOnDestroy(){ - this.pointToAddSelected.unsubscribe(); - } + ngOnDestroy() { + this.pointToAddSelected.unsubscribe(); + } } diff --git a/src/app/components/drawings-listeners/drawing-dragged/drawing-dragged.component.spec.ts b/src/app/components/drawings-listeners/drawing-dragged/drawing-dragged.component.spec.ts index a9c29328..867f27aa 100644 --- a/src/app/components/drawings-listeners/drawing-dragged/drawing-dragged.component.spec.ts +++ b/src/app/components/drawings-listeners/drawing-dragged/drawing-dragged.component.spec.ts @@ -1,4 +1,4 @@ -import { DrawingDraggedComponent } from "./drawing-dragged.component"; +import { DrawingDraggedComponent } from './drawing-dragged.component'; import { ComponentFixture, async, TestBed } from '@angular/core/testing'; import { DrawingService } from '../../../services/drawing.service'; import { MockedDrawingService, MockedDrawingsDataSource } from '../../project-map/project-map.component.spec'; @@ -10,56 +10,53 @@ import { DrawingElement } from '../../../cartography/models/drawings/drawing-ele import { Observable } from 'rxjs'; describe('DrawingDraggedComponent', () => { - let component: DrawingDraggedComponent; - let fixture: ComponentFixture; - let mockedDrawingService = new MockedDrawingService; - let mockedDrawingsDataSource = new MockedDrawingsDataSource; - let mockedDrawingsEventSource = new DrawingsEventSource; + let component: DrawingDraggedComponent; + let fixture: ComponentFixture; + let mockedDrawingService = new MockedDrawingService(); + let mockedDrawingsDataSource = new MockedDrawingsDataSource(); + let mockedDrawingsEventSource = new DrawingsEventSource(); - beforeEach(async(() => { - TestBed.configureTestingModule({ - providers: [ - { provide: DrawingService, useValue: mockedDrawingService }, - { provide: DrawingsDataSource, useValue: mockedDrawingsDataSource }, - { provide: DrawingsEventSource, useValue: mockedDrawingsEventSource } - ], - declarations: [ - DrawingDraggedComponent - ] - }) - .compileComponents(); - })); + beforeEach(async(() => { + TestBed.configureTestingModule({ + providers: [ + { provide: DrawingService, useValue: mockedDrawingService }, + { provide: DrawingsDataSource, useValue: mockedDrawingsDataSource }, + { provide: DrawingsEventSource, useValue: mockedDrawingsEventSource } + ], + declarations: [DrawingDraggedComponent] + }).compileComponents(); + })); - beforeEach(() => { - fixture = TestBed.createComponent(DrawingDraggedComponent); - component = fixture.componentInstance; - }); + beforeEach(() => { + fixture = TestBed.createComponent(DrawingDraggedComponent); + component = fixture.componentInstance; + }); - it('should create', () => { - expect(component).toBeTruthy(); - }); + it('should create', () => { + expect(component).toBeTruthy(); + }); - it('should call drawing service when drawing is dragged', () => { - fixture.detectChanges(); - const mapDrawingElement: DrawingElement = { - width: 100, - height: 100 - }; - const mapDrawing: MapDrawing = { - id: "sampleId", - projectId: "sampleprojectId", - rotation: 0, - svg: "sampleSvg", - x: 0, - y: 0, - z: 0, - element: mapDrawingElement - }; - const drawingDraggedDataEvent = new DraggedDataEvent(mapDrawing, 0, 0); - spyOn(mockedDrawingService, 'updatePosition').and.returnValue( Observable.of({})); + it('should call drawing service when drawing is dragged', () => { + fixture.detectChanges(); + const mapDrawingElement: DrawingElement = { + width: 100, + height: 100 + }; + const mapDrawing: MapDrawing = { + id: 'sampleId', + projectId: 'sampleprojectId', + rotation: 0, + svg: 'sampleSvg', + x: 0, + y: 0, + z: 0, + element: mapDrawingElement + }; + const drawingDraggedDataEvent = new DraggedDataEvent(mapDrawing, 0, 0); + spyOn(mockedDrawingService, 'updatePosition').and.returnValue(Observable.of({})); - mockedDrawingsEventSource.dragged.emit(drawingDraggedDataEvent); + mockedDrawingsEventSource.dragged.emit(drawingDraggedDataEvent); - expect(mockedDrawingService.updatePosition).toHaveBeenCalled(); - }); + expect(mockedDrawingService.updatePosition).toHaveBeenCalled(); + }); }); diff --git a/src/app/components/drawings-listeners/drawing-dragged/drawing-dragged.component.ts b/src/app/components/drawings-listeners/drawing-dragged/drawing-dragged.component.ts index 4e1eafba..14dccf64 100644 --- a/src/app/components/drawings-listeners/drawing-dragged/drawing-dragged.component.ts +++ b/src/app/components/drawings-listeners/drawing-dragged/drawing-dragged.component.ts @@ -1,4 +1,4 @@ -import { Component, Input, OnInit, OnDestroy } from "@angular/core"; +import { Component, Input, OnInit, OnDestroy } from '@angular/core'; import { Subscription } from 'rxjs'; import { DrawingsDataSource } from '../../../cartography/datasources/drawings-datasource'; import { Server } from '../../../models/server'; @@ -8,39 +8,38 @@ import { MapDrawing } from '../../../cartography/models/map/map-drawing'; import { Drawing } from '../../../cartography/models/drawing'; import { DrawingsEventSource } from '../../../cartography/events/drawings-event-source'; - @Component({ - selector: 'app-drawing-dragged', - templateUrl: './drawing-dragged.component.html', - styleUrls: ['./drawing-dragged.component.css'] + selector: 'app-drawing-dragged', + templateUrl: './drawing-dragged.component.html', + styleUrls: ['./drawing-dragged.component.css'] }) -export class DrawingDraggedComponent implements OnInit, OnDestroy{ - @Input() server: Server; - private drawingDragged: Subscription; +export class DrawingDraggedComponent implements OnInit, OnDestroy { + @Input() server: Server; + private drawingDragged: Subscription; - constructor( - private drawingService: DrawingService, - private drawingsDataSource: DrawingsDataSource, - private drawingsEventSource: DrawingsEventSource - ){} + constructor( + private drawingService: DrawingService, + private drawingsDataSource: DrawingsDataSource, + private drawingsEventSource: DrawingsEventSource + ) {} - ngOnInit(){ - this.drawingDragged = this.drawingsEventSource.dragged.subscribe((evt) => this.onDrawingDragged(evt)); - } + ngOnInit() { + this.drawingDragged = this.drawingsEventSource.dragged.subscribe(evt => this.onDrawingDragged(evt)); + } - onDrawingDragged(draggedEvent: DraggedDataEvent) { - const drawing = this.drawingsDataSource.get(draggedEvent.datum.id); - drawing.x += draggedEvent.dx; - drawing.y += draggedEvent.dy; - - this.drawingService - .updatePosition(this.server, drawing, drawing.x, drawing.y) - .subscribe((serverDrawing: Drawing) => { - this.drawingsDataSource.update(serverDrawing); - }); - } - - ngOnDestroy(){ - this.drawingDragged.unsubscribe(); - } + onDrawingDragged(draggedEvent: DraggedDataEvent) { + const drawing = this.drawingsDataSource.get(draggedEvent.datum.id); + drawing.x += draggedEvent.dx; + drawing.y += draggedEvent.dy; + + this.drawingService + .updatePosition(this.server, drawing, drawing.x, drawing.y) + .subscribe((serverDrawing: Drawing) => { + this.drawingsDataSource.update(serverDrawing); + }); + } + + ngOnDestroy() { + this.drawingDragged.unsubscribe(); + } } diff --git a/src/app/components/drawings-listeners/drawing-resized/drawing-resized.component.spec.ts b/src/app/components/drawings-listeners/drawing-resized/drawing-resized.component.spec.ts index 76d97ce9..8ccc22f2 100644 --- a/src/app/components/drawings-listeners/drawing-resized/drawing-resized.component.spec.ts +++ b/src/app/components/drawings-listeners/drawing-resized/drawing-resized.component.spec.ts @@ -1,4 +1,4 @@ -import { DrawingResizedComponent } from "./drawing-resized.component"; +import { DrawingResizedComponent } from './drawing-resized.component'; import { ComponentFixture, TestBed, async } from '@angular/core/testing'; import { DrawingService } from '../../../services/drawing.service'; import { MockedDrawingService, MockedDrawingsDataSource } from '../../project-map/project-map.component.spec'; @@ -11,58 +11,55 @@ import { DrawingElement } from '../../../cartography/models/drawings/drawing-ele import { Observable } from 'rxjs'; describe('DrawingResizedComponent', () => { - let component: DrawingResizedComponent; - let fixture: ComponentFixture; - let mockedDrawingService = new MockedDrawingService; - let mockedDrawingsDataSource = new MockedDrawingsDataSource; - let mockedDrawingsEventSource = new DrawingsEventSource; - let mockedMapDrawingToSvgConverter = new MapDrawingToSvgConverter; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - providers: [ - { provide: DrawingService, useValue: mockedDrawingService }, - { provide: DrawingsDataSource, useValue: mockedDrawingsDataSource }, - { provide: DrawingsEventSource, useValue: mockedDrawingsEventSource }, - { provide: MapDrawingToSvgConverter, useValue: mockedMapDrawingToSvgConverter } - ], - declarations: [ - DrawingResizedComponent - ] - }) - .compileComponents(); - })); + let component: DrawingResizedComponent; + let fixture: ComponentFixture; + let mockedDrawingService = new MockedDrawingService(); + let mockedDrawingsDataSource = new MockedDrawingsDataSource(); + let mockedDrawingsEventSource = new DrawingsEventSource(); + let mockedMapDrawingToSvgConverter = new MapDrawingToSvgConverter(); - beforeEach(() => { - fixture = TestBed.createComponent(DrawingResizedComponent); - component = fixture.componentInstance; - }); + beforeEach(async(() => { + TestBed.configureTestingModule({ + providers: [ + { provide: DrawingService, useValue: mockedDrawingService }, + { provide: DrawingsDataSource, useValue: mockedDrawingsDataSource }, + { provide: DrawingsEventSource, useValue: mockedDrawingsEventSource }, + { provide: MapDrawingToSvgConverter, useValue: mockedMapDrawingToSvgConverter } + ], + declarations: [DrawingResizedComponent] + }).compileComponents(); + })); - it('should create', () => { - expect(component).toBeTruthy(); - }); + beforeEach(() => { + fixture = TestBed.createComponent(DrawingResizedComponent); + component = fixture.componentInstance; + }); - it('should call drawing service when drawing is resized', () => { - fixture.detectChanges(); - const mapDrawingElement: DrawingElement = { - width: 100, - height: 100 - }; - const mapDrawing: MapDrawing = { - id: "sampleId", - projectId: "sampleprojectId", - rotation: 0, - svg: "sampleSvg", - x: 0, - y: 0, - z: 0, - element: mapDrawingElement - }; - const drawingResizedDataEvent = new ResizedDataEvent(mapDrawing, 0, 0, 100, 100); - spyOn(mockedDrawingService, 'updateSizeAndPosition').and.returnValue( Observable.of({})); + it('should create', () => { + expect(component).toBeTruthy(); + }); - mockedDrawingsEventSource.resized.emit(drawingResizedDataEvent); + it('should call drawing service when drawing is resized', () => { + fixture.detectChanges(); + const mapDrawingElement: DrawingElement = { + width: 100, + height: 100 + }; + const mapDrawing: MapDrawing = { + id: 'sampleId', + projectId: 'sampleprojectId', + rotation: 0, + svg: 'sampleSvg', + x: 0, + y: 0, + z: 0, + element: mapDrawingElement + }; + const drawingResizedDataEvent = new ResizedDataEvent(mapDrawing, 0, 0, 100, 100); + spyOn(mockedDrawingService, 'updateSizeAndPosition').and.returnValue(Observable.of({})); - expect(mockedDrawingService.updateSizeAndPosition).toHaveBeenCalled(); - }); + mockedDrawingsEventSource.resized.emit(drawingResizedDataEvent); + + expect(mockedDrawingService.updateSizeAndPosition).toHaveBeenCalled(); + }); }); diff --git a/src/app/components/drawings-listeners/drawing-resized/drawing-resized.component.ts b/src/app/components/drawings-listeners/drawing-resized/drawing-resized.component.ts index 1dfadff3..8b5541d8 100644 --- a/src/app/components/drawings-listeners/drawing-resized/drawing-resized.component.ts +++ b/src/app/components/drawings-listeners/drawing-resized/drawing-resized.component.ts @@ -1,4 +1,4 @@ -import { Component, Input, OnInit, OnDestroy } from "@angular/core"; +import { Component, Input, OnInit, OnDestroy } from '@angular/core'; import { DrawingService } from '../../../services/drawing.service'; import { DrawingsDataSource } from '../../../cartography/datasources/drawings-datasource'; import { DrawingsEventSource } from '../../../cartography/events/drawings-event-source'; @@ -9,39 +9,38 @@ import { MapDrawing } from '../../../cartography/models/map/map-drawing'; import { Drawing } from '../../../cartography/models/drawing'; import { Subscription } from 'rxjs'; - @Component({ - selector: 'app-drawing-resized', - templateUrl: './drawing-resized.component.html', - styleUrls: ['./drawing-resized.component.css'] + selector: 'app-drawing-resized', + templateUrl: './drawing-resized.component.html', + styleUrls: ['./drawing-resized.component.css'] }) -export class DrawingResizedComponent implements OnInit, OnDestroy{ - @Input() server: Server; - private drawingResized: Subscription; +export class DrawingResizedComponent implements OnInit, OnDestroy { + @Input() server: Server; + private drawingResized: Subscription; - constructor( - private drawingService: DrawingService, - private drawingsDataSource: DrawingsDataSource, - private drawingsEventSource: DrawingsEventSource, - private mapDrawingToSvgConverter: MapDrawingToSvgConverter - ){} + constructor( + private drawingService: DrawingService, + private drawingsDataSource: DrawingsDataSource, + private drawingsEventSource: DrawingsEventSource, + private mapDrawingToSvgConverter: MapDrawingToSvgConverter + ) {} - ngOnInit(){ - this.drawingResized = this.drawingsEventSource.resized.subscribe((evt) => this.onDrawingResized(evt)) - } + ngOnInit() { + this.drawingResized = this.drawingsEventSource.resized.subscribe(evt => this.onDrawingResized(evt)); + } - onDrawingResized(resizedEvent: ResizedDataEvent) { - const drawing = this.drawingsDataSource.get(resizedEvent.datum.id); - let svgString = this.mapDrawingToSvgConverter.convert(resizedEvent.datum); - - this.drawingService - .updateSizeAndPosition(this.server, drawing, resizedEvent.x, resizedEvent.y, svgString) - .subscribe((serverDrawing: Drawing) => { - this.drawingsDataSource.update(serverDrawing); - }); - } + onDrawingResized(resizedEvent: ResizedDataEvent) { + const drawing = this.drawingsDataSource.get(resizedEvent.datum.id); + let svgString = this.mapDrawingToSvgConverter.convert(resizedEvent.datum); - ngOnDestroy(){ - this.drawingResized.unsubscribe(); - } + this.drawingService + .updateSizeAndPosition(this.server, drawing, resizedEvent.x, resizedEvent.y, svgString) + .subscribe((serverDrawing: Drawing) => { + this.drawingsDataSource.update(serverDrawing); + }); + } + + ngOnDestroy() { + this.drawingResized.unsubscribe(); + } } diff --git a/src/app/components/drawings-listeners/interface-label-dragged/interface-label-dragged.component.spec.ts b/src/app/components/drawings-listeners/interface-label-dragged/interface-label-dragged.component.spec.ts index 552c54c1..8a80972a 100644 --- a/src/app/components/drawings-listeners/interface-label-dragged/interface-label-dragged.component.spec.ts +++ b/src/app/components/drawings-listeners/interface-label-dragged/interface-label-dragged.component.spec.ts @@ -1,4 +1,4 @@ -import { InterfaceLabelDraggedComponent } from "./interface-label-dragged.component"; +import { InterfaceLabelDraggedComponent } from './interface-label-dragged.component'; import { ComponentFixture, async, TestBed } from '@angular/core/testing'; import { MockedLinkService } from '../../project-map/project-map.component.spec'; import { LinksEventSource } from '../../../cartography/events/links-event-source'; @@ -12,69 +12,66 @@ import { Link } from '../../../models/link'; import { Label } from '../../../cartography/models/label'; describe('InterfaceLabelDraggedComponent', () => { - let component: InterfaceLabelDraggedComponent; - let fixture: ComponentFixture; - let mockedLinkService = new MockedLinkService; - let mockedLinksEventSource = new LinksEventSource; - let mockedLinksDataSource = new LinksDataSource; + let component: InterfaceLabelDraggedComponent; + let fixture: ComponentFixture; + let mockedLinkService = new MockedLinkService(); + let mockedLinksEventSource = new LinksEventSource(); + let mockedLinksDataSource = new LinksDataSource(); - beforeEach(async(() => { - TestBed.configureTestingModule({ - providers: [ - { provide: LinkService, useValue: mockedLinkService }, - { provide: LinksDataSource, useValue: mockedLinksDataSource }, - { provide: LinksEventSource, useValue: mockedLinksEventSource } - ], - declarations: [ - InterfaceLabelDraggedComponent - ] - }) - .compileComponents(); - })); + beforeEach(async(() => { + TestBed.configureTestingModule({ + providers: [ + { provide: LinkService, useValue: mockedLinkService }, + { provide: LinksDataSource, useValue: mockedLinksDataSource }, + { provide: LinksEventSource, useValue: mockedLinksEventSource } + ], + declarations: [InterfaceLabelDraggedComponent] + }).compileComponents(); + })); - beforeEach(() => { - fixture = TestBed.createComponent(InterfaceLabelDraggedComponent); - component = fixture.componentInstance; - }); + beforeEach(() => { + fixture = TestBed.createComponent(InterfaceLabelDraggedComponent); + component = fixture.componentInstance; + }); - it('should create', () => { - expect(component).toBeTruthy(); - }); + it('should create', () => { + expect(component).toBeTruthy(); + }); - it('should call link service when interface label dragged', () => { - fixture.detectChanges(); - const mapLinkNode: MapLinkNode = { - id: 'sampleId', - nodeId: 'sampleNodeId', - linkId: 'sampleLinkId', - adapterNumber: 0, - portNumber: 0, - label: {} as MapLabel - }; - const interfaceLabelDraggedDataEvent = new DraggedDataEvent(mapLinkNode, 0, 0); + it('should call link service when interface label dragged', () => { + fixture.detectChanges(); + const mapLinkNode: MapLinkNode = { + id: 'sampleId', + nodeId: 'sampleNodeId', + linkId: 'sampleLinkId', + adapterNumber: 0, + portNumber: 0, + label: {} as MapLabel + }; + const interfaceLabelDraggedDataEvent = new DraggedDataEvent(mapLinkNode, 0, 0); - let link: Link = {} as Link; - link.nodes = [ - { - node_id: "1", - adapter_number: 0, - port_number: 0, - label: {} as Label - }, - { - node_id: "2", - adapter_number: 0, - port_number: 0, - label: {} as Label - } - ]; - mockedLinksDataSource = TestBed.get(LinksDataSource); + let link: Link = {} as Link; + link.nodes = [ + { + node_id: '1', + adapter_number: 0, + port_number: 0, + label: {} as Label + }, + { + node_id: '2', + adapter_number: 0, + port_number: 0, + label: {} as Label + } + ]; + mockedLinksDataSource = TestBed.get(LinksDataSource); - spyOn(mockedLinksDataSource, 'get').and.returnValue(link); - spyOn(mockedLinkService, 'updateNodes').and.returnValue( Observable.of({})); + spyOn(mockedLinksDataSource, 'get').and.returnValue(link); + spyOn(mockedLinkService, 'updateNodes').and.returnValue(Observable.of({})); - mockedLinksEventSource.interfaceDragged.emit(interfaceLabelDraggedDataEvent); + mockedLinksEventSource.interfaceDragged.emit(interfaceLabelDraggedDataEvent); - expect(mockedLinkService.updateNodes).toHaveBeenCalled(); - }); + expect(mockedLinkService.updateNodes).toHaveBeenCalled(); + }); }); diff --git a/src/app/components/drawings-listeners/interface-label-dragged/interface-label-dragged.component.ts b/src/app/components/drawings-listeners/interface-label-dragged/interface-label-dragged.component.ts index e053ca1d..733a8059 100644 --- a/src/app/components/drawings-listeners/interface-label-dragged/interface-label-dragged.component.ts +++ b/src/app/components/drawings-listeners/interface-label-dragged/interface-label-dragged.component.ts @@ -1,4 +1,4 @@ -import { Component, Input } from "@angular/core"; +import { Component, Input } from '@angular/core'; import { Server } from '../../../models/server'; import { LinksDataSource } from '../../../cartography/datasources/links-datasource'; import { LinkService } from '../../../services/link.service'; @@ -8,45 +8,42 @@ import { Link } from '../../../models/link'; import { Subscription } from 'rxjs'; import { LinksEventSource } from '../../../cartography/events/links-event-source'; - @Component({ - selector: 'app-interface-label-dragged', - templateUrl: './interface-label-dragged.component.html', - styleUrls: ['./interface-label-dragged.component.css'] + selector: 'app-interface-label-dragged', + templateUrl: './interface-label-dragged.component.html', + styleUrls: ['./interface-label-dragged.component.css'] }) -export class InterfaceLabelDraggedComponent{ - @Input() server: Server; - private interfaceDragged: Subscription; +export class InterfaceLabelDraggedComponent { + @Input() server: Server; + private interfaceDragged: Subscription; - constructor( - private linkService: LinkService, - private linksDataSource: LinksDataSource, - private linksEventSource: LinksEventSource - ){} + constructor( + private linkService: LinkService, + private linksDataSource: LinksDataSource, + private linksEventSource: LinksEventSource + ) {} - ngOnInit(){ - this.interfaceDragged = this.linksEventSource.interfaceDragged.subscribe((evt) => this.onInterfaceLabelDragged(evt)); + ngOnInit() { + this.interfaceDragged = this.linksEventSource.interfaceDragged.subscribe(evt => this.onInterfaceLabelDragged(evt)); + } + + onInterfaceLabelDragged(draggedEvent: DraggedDataEvent) { + const link = this.linksDataSource.get(draggedEvent.datum.linkId); + if (link.nodes[0].node_id === draggedEvent.datum.nodeId) { + link.nodes[0].label.x += draggedEvent.dx; + link.nodes[0].label.y += draggedEvent.dy; + } + if (link.nodes[1].node_id === draggedEvent.datum.nodeId) { + link.nodes[1].label.x += draggedEvent.dx; + link.nodes[1].label.y += draggedEvent.dy; } - onInterfaceLabelDragged(draggedEvent: DraggedDataEvent) { - const link = this.linksDataSource.get(draggedEvent.datum.linkId); - if (link.nodes[0].node_id === draggedEvent.datum.nodeId) { - link.nodes[0].label.x += draggedEvent.dx; - link.nodes[0].label.y += draggedEvent.dy; - } - if (link.nodes[1].node_id === draggedEvent.datum.nodeId) { - link.nodes[1].label.x += draggedEvent.dx; - link.nodes[1].label.y += draggedEvent.dy; - } - - this.linkService - .updateNodes(this.server, link, link.nodes) - .subscribe((serverLink: Link) => { - this.linksDataSource.update(serverLink); - }); - } + this.linkService.updateNodes(this.server, link, link.nodes).subscribe((serverLink: Link) => { + this.linksDataSource.update(serverLink); + }); + } - ngOnDestroy(){ - this.interfaceDragged.unsubscribe(); - } + ngOnDestroy() { + this.interfaceDragged.unsubscribe(); + } } diff --git a/src/app/components/drawings-listeners/link-created/link-created.component.spec.ts b/src/app/components/drawings-listeners/link-created/link-created.component.spec.ts index 1f589830..7645b271 100644 --- a/src/app/components/drawings-listeners/link-created/link-created.component.spec.ts +++ b/src/app/components/drawings-listeners/link-created/link-created.component.spec.ts @@ -1,4 +1,4 @@ -import { LinkCreatedComponent } from "./link-created.component"; +import { LinkCreatedComponent } from './link-created.component'; import { ComponentFixture, async, TestBed } from '@angular/core/testing'; import { ProjectService } from '../../../services/project.service'; import { MockedProjectService } from '../../../services/project.service.spec'; @@ -20,82 +20,81 @@ import { Observable } from 'rxjs'; import { Project } from '../../../models/project'; describe('LinkCreatedComponent', () => { - let component: LinkCreatedComponent; - let fixture: ComponentFixture; - let mockedLinkService = new MockedLinkService; - let mockedMapNodeToNodeConverter: MapNodeToNodeConverter = - new MapNodeToNodeConverter(new MapLabelToLabelConverter(new FontBBoxCalculator, new CssFixer, new FontFixer), new MapPortToPortConverter); - let mockedLinksEventSource = new LinksEventSource; - let project = new Project(); + let component: LinkCreatedComponent; + let fixture: ComponentFixture; + let mockedLinkService = new MockedLinkService(); + let mockedMapNodeToNodeConverter: MapNodeToNodeConverter = new MapNodeToNodeConverter( + new MapLabelToLabelConverter(new FontBBoxCalculator(), new CssFixer(), new FontFixer()), + new MapPortToPortConverter() + ); + let mockedLinksEventSource = new LinksEventSource(); + let project = new Project(); - beforeEach(async(() => { - TestBed.configureTestingModule({ - providers: [ - { provide: ProjectService, useClass: MockedProjectService }, - { provide: LinkService, useValue: mockedLinkService }, - { provide: LinksDataSource, useClass: LinksDataSource }, - { provide: LinksEventSource, useValue: mockedLinksEventSource }, - { provide: MapNodeToNodeConverter, useValue: mockedMapNodeToNodeConverter }, - { provide: MapPortToPortConverter, useClass: MapPortToPortConverter } - ], - declarations: [ - LinkCreatedComponent - ] - }) - .compileComponents(); - })); + beforeEach(async(() => { + TestBed.configureTestingModule({ + providers: [ + { provide: ProjectService, useClass: MockedProjectService }, + { provide: LinkService, useValue: mockedLinkService }, + { provide: LinksDataSource, useClass: LinksDataSource }, + { provide: LinksEventSource, useValue: mockedLinksEventSource }, + { provide: MapNodeToNodeConverter, useValue: mockedMapNodeToNodeConverter }, + { provide: MapPortToPortConverter, useClass: MapPortToPortConverter } + ], + declarations: [LinkCreatedComponent] + }).compileComponents(); + })); - beforeEach(() => { - fixture = TestBed.createComponent(LinkCreatedComponent); - component = fixture.componentInstance; + beforeEach(() => { + fixture = TestBed.createComponent(LinkCreatedComponent); + component = fixture.componentInstance; - project.project_id = "sampleId"; - component.project = project; - }); + project.project_id = 'sampleId'; + component.project = project; + }); - it('should create', () => { - expect(component).toBeTruthy(); - }); + it('should create', () => { + expect(component).toBeTruthy(); + }); - it('should call link service when link created', () => { - fixture.detectChanges(); - const mapNode: MapNode = { - id: 'sampleId', - commandLine: 'sampleCommandLine', - computeId: 'sampleComputeId', - console: 0, - consoleHost: 'sampleConsoleHost', - consoleType: 'sampleConsoleType', - firstPortName: 'sampleFirstPortName', - height: 0, - label: {} as MapLabel, - name: "sampleName", - nodeDirectory: "sampleNodeDirectory", - nodeType: "sampleNodeType", - portNameFormat: "samplePortNameFormat", - portSegmentSize: 0, - ports: [], - projectId: "sampleProjectId", - status: "sampleStatus", - symbol: "sampleSymbol", - symbolUrl: "sampleUrl", - width: 0, - x: 0, - y: 0, - z: 0 - }; - const mapPort: MapPort = { - adapterNumber: 1, - linkType: 'sampleLinkType', - name: 'sampleName', - portNumber: 1, - shortName: 'sampleShortName' - }; - const linkCreatedDataEvent = new MapLinkCreated(mapNode, mapPort, mapNode, mapPort); - spyOn(mockedLinkService, 'createLink').and.returnValue( Observable.of({})); + it('should call link service when link created', () => { + fixture.detectChanges(); + const mapNode: MapNode = { + id: 'sampleId', + commandLine: 'sampleCommandLine', + computeId: 'sampleComputeId', + console: 0, + consoleHost: 'sampleConsoleHost', + consoleType: 'sampleConsoleType', + firstPortName: 'sampleFirstPortName', + height: 0, + label: {} as MapLabel, + name: 'sampleName', + nodeDirectory: 'sampleNodeDirectory', + nodeType: 'sampleNodeType', + portNameFormat: 'samplePortNameFormat', + portSegmentSize: 0, + ports: [], + projectId: 'sampleProjectId', + status: 'sampleStatus', + symbol: 'sampleSymbol', + symbolUrl: 'sampleUrl', + width: 0, + x: 0, + y: 0, + z: 0 + }; + const mapPort: MapPort = { + adapterNumber: 1, + linkType: 'sampleLinkType', + name: 'sampleName', + portNumber: 1, + shortName: 'sampleShortName' + }; + const linkCreatedDataEvent = new MapLinkCreated(mapNode, mapPort, mapNode, mapPort); + spyOn(mockedLinkService, 'createLink').and.returnValue(Observable.of({})); - mockedLinksEventSource.created.emit(linkCreatedDataEvent); + mockedLinksEventSource.created.emit(linkCreatedDataEvent); - expect(mockedLinkService.createLink).toHaveBeenCalled(); - }); + expect(mockedLinkService.createLink).toHaveBeenCalled(); + }); }); diff --git a/src/app/components/drawings-listeners/link-created/link-created.component.ts b/src/app/components/drawings-listeners/link-created/link-created.component.ts index 69dc6e1b..9cd7e2f0 100644 --- a/src/app/components/drawings-listeners/link-created/link-created.component.ts +++ b/src/app/components/drawings-listeners/link-created/link-created.component.ts @@ -1,4 +1,4 @@ -import { Component, OnDestroy, Input, OnInit } from "@angular/core"; +import { Component, OnDestroy, Input, OnInit } from '@angular/core'; import { Server } from '../../../models/server'; import { LinkService } from '../../../services/link.service'; import { ProjectService } from '../../../services/project.service'; @@ -8,49 +8,46 @@ import { LinksDataSource } from '../../../cartography/datasources/links-datasour import { Subscription } from 'rxjs'; import { Project } from '../../../models/project'; import { MapLinkCreated } from '../../../cartography/events/links'; -import { Link } from "../../../models/link"; +import { Link } from '../../../models/link'; import { LinksEventSource } from '../../../cartography/events/links-event-source'; - @Component({ - selector: 'app-link-created', - templateUrl: './link-created.component.html', - styleUrls: ['./link-created.component.css'] + selector: 'app-link-created', + templateUrl: './link-created.component.html', + styleUrls: ['./link-created.component.css'] }) -export class LinkCreatedComponent implements OnInit, OnDestroy{ - @Input() server: Server; - @Input() project: Project; - private linkCreated: Subscription; +export class LinkCreatedComponent implements OnInit, OnDestroy { + @Input() server: Server; + @Input() project: Project; + private linkCreated: Subscription; - constructor( - private projectService: ProjectService, - private linkService: LinkService, - private linksDataSource: LinksDataSource, - private linksEventSource: LinksEventSource, - private mapNodeToNode: MapNodeToNodeConverter, - private mapPortToPort: MapPortToPortConverter - ){} + constructor( + private projectService: ProjectService, + private linkService: LinkService, + private linksDataSource: LinksDataSource, + private linksEventSource: LinksEventSource, + private mapNodeToNode: MapNodeToNodeConverter, + private mapPortToPort: MapPortToPortConverter + ) {} - ngOnInit(){ - this.linkCreated = this.linksEventSource.created.subscribe((evt) => this.onLinkCreated(evt)); - } + ngOnInit() { + this.linkCreated = this.linksEventSource.created.subscribe(evt => this.onLinkCreated(evt)); + } - onLinkCreated(linkCreated: MapLinkCreated) { - const sourceNode = this.mapNodeToNode.convert(linkCreated.sourceNode); - const sourcePort = this.mapPortToPort.convert(linkCreated.sourcePort); - const targetNode = this.mapNodeToNode.convert(linkCreated.targetNode); - const targetPort = this.mapPortToPort.convert(linkCreated.targetPort); - - this.linkService - .createLink(this.server, sourceNode, sourcePort, targetNode, targetPort) - .subscribe(() => { - this.projectService.links(this.server, this.project.project_id).subscribe((links: Link[]) => { - this.linksDataSource.set(links); - }); - }); - } + onLinkCreated(linkCreated: MapLinkCreated) { + const sourceNode = this.mapNodeToNode.convert(linkCreated.sourceNode); + const sourcePort = this.mapPortToPort.convert(linkCreated.sourcePort); + const targetNode = this.mapNodeToNode.convert(linkCreated.targetNode); + const targetPort = this.mapPortToPort.convert(linkCreated.targetPort); - ngOnDestroy(){ - this.linkCreated.unsubscribe(); - } + this.linkService.createLink(this.server, sourceNode, sourcePort, targetNode, targetPort).subscribe(() => { + this.projectService.links(this.server, this.project.project_id).subscribe((links: Link[]) => { + this.linksDataSource.set(links); + }); + }); + } + + ngOnDestroy() { + this.linkCreated.unsubscribe(); + } } diff --git a/src/app/components/drawings-listeners/node-dragged/node-dragged.component.spec.ts b/src/app/components/drawings-listeners/node-dragged/node-dragged.component.spec.ts index 1d9cfdad..c613eaf5 100644 --- a/src/app/components/drawings-listeners/node-dragged/node-dragged.component.spec.ts +++ b/src/app/components/drawings-listeners/node-dragged/node-dragged.component.spec.ts @@ -1,4 +1,4 @@ -import { NodeDraggedComponent } from "./node-dragged.component"; +import { NodeDraggedComponent } from './node-dragged.component'; import { ComponentFixture, async, TestBed } from '@angular/core/testing'; import { NodesDataSource } from '../../../cartography/datasources/nodes-datasource'; import { NodeService } from '../../../services/node.service'; @@ -10,67 +10,64 @@ import { MapLabel } from '../../../cartography/models/map/map-label'; import { Observable } from 'rxjs'; describe('NodeDraggedComponent', () => { - let component: NodeDraggedComponent; - let fixture: ComponentFixture; - let mockedNodesDataSource = new MockedNodesDataSource; - let mockedNodeService = new MockedNodeService; - let mockedNodesEventSource = new NodesEventSource; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - providers: [ - { provide: NodesDataSource, useValue: mockedNodesDataSource }, - { provide: NodeService, useValue: mockedNodeService }, - { provide: NodesEventSource, useValue: mockedNodesEventSource } - ], - declarations: [ - NodeDraggedComponent - ] - }) - .compileComponents(); - })); + let component: NodeDraggedComponent; + let fixture: ComponentFixture; + let mockedNodesDataSource = new MockedNodesDataSource(); + let mockedNodeService = new MockedNodeService(); + let mockedNodesEventSource = new NodesEventSource(); - beforeEach(() => { - fixture = TestBed.createComponent(NodeDraggedComponent); - component = fixture.componentInstance; - }); + beforeEach(async(() => { + TestBed.configureTestingModule({ + providers: [ + { provide: NodesDataSource, useValue: mockedNodesDataSource }, + { provide: NodeService, useValue: mockedNodeService }, + { provide: NodesEventSource, useValue: mockedNodesEventSource } + ], + declarations: [NodeDraggedComponent] + }).compileComponents(); + })); - it('should create', () => { - expect(component).toBeTruthy(); - }); + beforeEach(() => { + fixture = TestBed.createComponent(NodeDraggedComponent); + component = fixture.componentInstance; + }); - it('should call node service when node dragged', () => { - fixture.detectChanges(); - const mapNode: MapNode = { - id: 'sampleId', - commandLine: 'sampleCommandLine', - computeId: 'sampleComputeId', - console: 0, - consoleHost: 'sampleConsoleHost', - consoleType: 'sampleConsoleType', - firstPortName: 'sampleFirstPortName', - height: 0, - label: {} as MapLabel, - name: "sampleName", - nodeDirectory: "sampleNodeDirectory", - nodeType: "sampleNodeType", - portNameFormat: "samplePortNameFormat", - portSegmentSize: 0, - ports: [], - projectId: "sampleProjectId", - status: "sampleStatus", - symbol: "sampleSymbol", - symbolUrl: "sampleUrl", - width: 0, - x: 0, - y: 0, - z: 0 - }; - const draggedDataEvent = new DraggedDataEvent(mapNode, 0, 0); - spyOn(mockedNodeService, 'updatePosition').and.returnValue( Observable.of({})); + it('should create', () => { + expect(component).toBeTruthy(); + }); - mockedNodesEventSource.dragged.emit(draggedDataEvent); + it('should call node service when node dragged', () => { + fixture.detectChanges(); + const mapNode: MapNode = { + id: 'sampleId', + commandLine: 'sampleCommandLine', + computeId: 'sampleComputeId', + console: 0, + consoleHost: 'sampleConsoleHost', + consoleType: 'sampleConsoleType', + firstPortName: 'sampleFirstPortName', + height: 0, + label: {} as MapLabel, + name: 'sampleName', + nodeDirectory: 'sampleNodeDirectory', + nodeType: 'sampleNodeType', + portNameFormat: 'samplePortNameFormat', + portSegmentSize: 0, + ports: [], + projectId: 'sampleProjectId', + status: 'sampleStatus', + symbol: 'sampleSymbol', + symbolUrl: 'sampleUrl', + width: 0, + x: 0, + y: 0, + z: 0 + }; + const draggedDataEvent = new DraggedDataEvent(mapNode, 0, 0); + spyOn(mockedNodeService, 'updatePosition').and.returnValue(Observable.of({})); - expect(mockedNodeService.updatePosition).toHaveBeenCalled(); - }); + mockedNodesEventSource.dragged.emit(draggedDataEvent); + + expect(mockedNodeService.updatePosition).toHaveBeenCalled(); + }); }); diff --git a/src/app/components/drawings-listeners/node-dragged/node-dragged.component.ts b/src/app/components/drawings-listeners/node-dragged/node-dragged.component.ts index 08ecf2b2..8c976075 100644 --- a/src/app/components/drawings-listeners/node-dragged/node-dragged.component.ts +++ b/src/app/components/drawings-listeners/node-dragged/node-dragged.component.ts @@ -1,4 +1,4 @@ -import { Component, Input, OnInit, OnDestroy } from "@angular/core"; +import { Component, Input, OnInit, OnDestroy } from '@angular/core'; import { NodesDataSource } from '../../../cartography/datasources/nodes-datasource'; import { NodeService } from '../../../services/node.service'; import { DraggedDataEvent } from '../../../cartography/events/event-source'; @@ -8,39 +8,36 @@ import { NodesEventSource } from '../../../cartography/events/nodes-event-source import { MapNode } from '../../../cartography/models/map/map-node'; import { Subscription } from 'rxjs'; - @Component({ - selector: 'app-node-dragged', - templateUrl: './node-dragged.component.html', - styleUrls: ['./node-dragged.component.css'] + selector: 'app-node-dragged', + templateUrl: './node-dragged.component.html', + styleUrls: ['./node-dragged.component.css'] }) -export class NodeDraggedComponent implements OnInit, OnDestroy{ - @Input() server: Server; - private nodeDragged: Subscription; +export class NodeDraggedComponent implements OnInit, OnDestroy { + @Input() server: Server; + private nodeDragged: Subscription; - constructor( - private nodesDataSource: NodesDataSource, - private nodeService: NodeService, - private nodesEventSource: NodesEventSource - ){} + constructor( + private nodesDataSource: NodesDataSource, + private nodeService: NodeService, + private nodesEventSource: NodesEventSource + ) {} - ngOnInit(){ - this.nodeDragged = this.nodesEventSource.dragged.subscribe((evt) => this.onNodeDragged(evt)); - } + ngOnInit() { + this.nodeDragged = this.nodesEventSource.dragged.subscribe(evt => this.onNodeDragged(evt)); + } - onNodeDragged(draggedEvent: DraggedDataEvent) { - const node = this.nodesDataSource.get(draggedEvent.datum.id); - node.x += draggedEvent.dx; - node.y += draggedEvent.dy; - - this.nodeService - .updatePosition(this.server, node, node.x, node.y) - .subscribe((serverNode: Node) => { - this.nodesDataSource.update(serverNode); - }); - } + onNodeDragged(draggedEvent: DraggedDataEvent) { + const node = this.nodesDataSource.get(draggedEvent.datum.id); + node.x += draggedEvent.dx; + node.y += draggedEvent.dy; - ngOnDestroy(){ - this.nodeDragged.unsubscribe(); - } + this.nodeService.updatePosition(this.server, node, node.x, node.y).subscribe((serverNode: Node) => { + this.nodesDataSource.update(serverNode); + }); + } + + ngOnDestroy() { + this.nodeDragged.unsubscribe(); + } } diff --git a/src/app/components/drawings-listeners/node-label-dragged/node-label-dragged.component.spec.ts b/src/app/components/drawings-listeners/node-label-dragged/node-label-dragged.component.spec.ts index 70ea5ea1..01cd59fd 100644 --- a/src/app/components/drawings-listeners/node-label-dragged/node-label-dragged.component.spec.ts +++ b/src/app/components/drawings-listeners/node-label-dragged/node-label-dragged.component.spec.ts @@ -1,4 +1,4 @@ -import { NodeLabelDraggedComponent } from "./node-label-dragged.component"; +import { NodeLabelDraggedComponent } from './node-label-dragged.component'; import { ComponentFixture, TestBed, async } from '@angular/core/testing'; import { NodesDataSource } from '../../../cartography/datasources/nodes-datasource'; import { NodeService } from '../../../services/node.service'; @@ -13,59 +13,56 @@ import { MapLabel } from '../../../cartography/models/map/map-label'; import { Observable } from 'rxjs'; describe('NodeLabelDraggedComponent', () => { - let component: NodeLabelDraggedComponent; - let fixture: ComponentFixture; - let mockedNodesDataSource = new MockedNodesDataSource; - let mockedNodeService = new MockedNodeService; - let mockedNodesEventSource = new NodesEventSource; - let mapLabelToLabelConverter = new MapLabelToLabelConverter( - new FontBBoxCalculator, - new CssFixer, - new FontFixer - ); + let component: NodeLabelDraggedComponent; + let fixture: ComponentFixture; + let mockedNodesDataSource = new MockedNodesDataSource(); + let mockedNodeService = new MockedNodeService(); + let mockedNodesEventSource = new NodesEventSource(); + let mapLabelToLabelConverter = new MapLabelToLabelConverter( + new FontBBoxCalculator(), + new CssFixer(), + new FontFixer() + ); - beforeEach(async(() => { - TestBed.configureTestingModule({ - providers: [ - { provide: NodesDataSource, useValue: mockedNodesDataSource }, - { provide: NodeService, useValue: mockedNodeService }, - { provide: NodesEventSource, useValue: mockedNodesEventSource }, - { provide: MapLabelToLabelConverter, useValue: mapLabelToLabelConverter } - ], - declarations: [ - NodeLabelDraggedComponent - ] - }) - .compileComponents(); - })); + beforeEach(async(() => { + TestBed.configureTestingModule({ + providers: [ + { provide: NodesDataSource, useValue: mockedNodesDataSource }, + { provide: NodeService, useValue: mockedNodeService }, + { provide: NodesEventSource, useValue: mockedNodesEventSource }, + { provide: MapLabelToLabelConverter, useValue: mapLabelToLabelConverter } + ], + declarations: [NodeLabelDraggedComponent] + }).compileComponents(); + })); - beforeEach(() => { - fixture = TestBed.createComponent(NodeLabelDraggedComponent); - component = fixture.componentInstance; - }); + beforeEach(() => { + fixture = TestBed.createComponent(NodeLabelDraggedComponent); + component = fixture.componentInstance; + }); - it('should create', () => { - expect(component).toBeTruthy(); - }); + it('should create', () => { + expect(component).toBeTruthy(); + }); - it('should call node service when node label dragged', () => { - fixture.detectChanges(); - const mapLabel: MapLabel = { - id: "sample id", - rotation: 0, - style: "sample style", - text: "sample text", - x: 0, - y: 0, - originalX: 0, - originalY: 0, - nodeId: "node id" - }; - const nodeDraggedDataEvent = new DraggedDataEvent(mapLabel, 0, 0); - spyOn(mockedNodeService, 'updateLabel').and.returnValue( Observable.of({})); + it('should call node service when node label dragged', () => { + fixture.detectChanges(); + const mapLabel: MapLabel = { + id: 'sample id', + rotation: 0, + style: 'sample style', + text: 'sample text', + x: 0, + y: 0, + originalX: 0, + originalY: 0, + nodeId: 'node id' + }; + const nodeDraggedDataEvent = new DraggedDataEvent(mapLabel, 0, 0); + spyOn(mockedNodeService, 'updateLabel').and.returnValue(Observable.of({})); - mockedNodesEventSource.labelDragged.emit(nodeDraggedDataEvent); + mockedNodesEventSource.labelDragged.emit(nodeDraggedDataEvent); - expect(mockedNodeService.updateLabel).toHaveBeenCalled(); - }); + expect(mockedNodeService.updateLabel).toHaveBeenCalled(); + }); }); diff --git a/src/app/components/drawings-listeners/node-label-dragged/node-label-dragged.component.ts b/src/app/components/drawings-listeners/node-label-dragged/node-label-dragged.component.ts index c1a528d7..9e906004 100644 --- a/src/app/components/drawings-listeners/node-label-dragged/node-label-dragged.component.ts +++ b/src/app/components/drawings-listeners/node-label-dragged/node-label-dragged.component.ts @@ -1,4 +1,4 @@ -import { Component, Input, OnInit, OnDestroy } from "@angular/core"; +import { Component, Input, OnInit, OnDestroy } from '@angular/core'; import { NodesDataSource } from '../../../cartography/datasources/nodes-datasource'; import { NodesEventSource } from '../../../cartography/events/nodes-event-source'; import { NodeService } from '../../../services/node.service'; @@ -9,44 +9,41 @@ import { Subscription } from 'rxjs'; import { DraggedDataEvent } from '../../../cartography/events/event-source'; import { MapLabel } from '../../../cartography/models/map/map-label'; - @Component({ - selector: 'app-node-label-dragged', - templateUrl: './node-label-dragged.component.html', - styleUrls: ['./node-label-dragged.component.css'] + selector: 'app-node-label-dragged', + templateUrl: './node-label-dragged.component.html', + styleUrls: ['./node-label-dragged.component.css'] }) -export class NodeLabelDraggedComponent implements OnInit, OnDestroy{ - @Input() server: Server; - private nodeLabelDragged: Subscription; +export class NodeLabelDraggedComponent implements OnInit, OnDestroy { + @Input() server: Server; + private nodeLabelDragged: Subscription; - constructor( - private nodesDataSource: NodesDataSource, - private nodeService: NodeService, - private nodesEventSource: NodesEventSource, - private mapLabelToLabel: MapLabelToLabelConverter - ){} + constructor( + private nodesDataSource: NodesDataSource, + private nodeService: NodeService, + private nodesEventSource: NodesEventSource, + private mapLabelToLabel: MapLabelToLabelConverter + ) {} - ngOnInit(){ - this.nodeLabelDragged = this.nodesEventSource.labelDragged.subscribe((evt) => this.onNodeLabelDragged(evt)); - } + ngOnInit() { + this.nodeLabelDragged = this.nodesEventSource.labelDragged.subscribe(evt => this.onNodeLabelDragged(evt)); + } - onNodeLabelDragged(draggedEvent: DraggedDataEvent) { - const node = this.nodesDataSource.get(draggedEvent.datum.nodeId); - const mapLabel = draggedEvent.datum; - mapLabel.x += draggedEvent.dx; - mapLabel.y += draggedEvent.dy; - - const label = this.mapLabelToLabel.convert(mapLabel); - node.label = label; - - this.nodeService - .updateLabel(this.server, node, node.label) - .subscribe((serverNode: Node) => { - this.nodesDataSource.update(serverNode); - }); - } - - ngOnDestroy(){ - this.nodeLabelDragged.unsubscribe(); - } + onNodeLabelDragged(draggedEvent: DraggedDataEvent) { + const node = this.nodesDataSource.get(draggedEvent.datum.nodeId); + const mapLabel = draggedEvent.datum; + mapLabel.x += draggedEvent.dx; + mapLabel.y += draggedEvent.dy; + + const label = this.mapLabelToLabel.convert(mapLabel); + node.label = label; + + this.nodeService.updateLabel(this.server, node, node.label).subscribe((serverNode: Node) => { + this.nodesDataSource.update(serverNode); + }); + } + + ngOnDestroy() { + this.nodeLabelDragged.unsubscribe(); + } } diff --git a/src/app/components/drawings-listeners/text-added/text-added.component.spec.ts b/src/app/components/drawings-listeners/text-added/text-added.component.spec.ts index d3f0a355..5f991ae8 100644 --- a/src/app/components/drawings-listeners/text-added/text-added.component.spec.ts +++ b/src/app/components/drawings-listeners/text-added/text-added.component.spec.ts @@ -1,4 +1,4 @@ -import { TextAddedComponent } from "./text-added.component"; +import { TextAddedComponent } from './text-added.component'; import { ComponentFixture, async, TestBed } from '@angular/core/testing'; import { DrawingService } from '../../../services/drawing.service'; import { DrawingsDataSource } from '../../../cartography/datasources/drawings-datasource'; @@ -16,48 +16,49 @@ import { LineElementFactory } from '../../../cartography/helpers/drawings-factor import { Project } from '../../../models/project'; describe('TextAddedComponent', () => { - let component: TextAddedComponent; - let fixture: ComponentFixture; - let mockedDrawingService = new MockedDrawingService; - let mockedDrawingsDataSource = new MockedDrawingsDataSource; - let mockedDrawingsEventSource = new DrawingsEventSource; - let mockedDrawingsFactory = new DefaultDrawingsFactory(new TextElementFactory, - new EllipseElementFactory, new RectangleElementFactory, new LineElementFactory); + let component: TextAddedComponent; + let fixture: ComponentFixture; + let mockedDrawingService = new MockedDrawingService(); + let mockedDrawingsDataSource = new MockedDrawingsDataSource(); + let mockedDrawingsEventSource = new DrawingsEventSource(); + let mockedDrawingsFactory = new DefaultDrawingsFactory( + new TextElementFactory(), + new EllipseElementFactory(), + new RectangleElementFactory(), + new LineElementFactory() + ); - beforeEach(async(() => { - TestBed.configureTestingModule({ - providers: [ - { provide: DrawingService, useValue: mockedDrawingService }, - { provide: DrawingsDataSource, useValue: mockedDrawingsDataSource }, - { provide: DrawingsEventSource, useValue: mockedDrawingsEventSource }, - { provide: DefaultDrawingsFactory, useValue: mockedDrawingsFactory }, - { provide: MapDrawingToSvgConverter, useClass: MapDrawingToSvgConverter }, - { provide: Context, useClass: Context} - ], - declarations: [ - TextAddedComponent - ] - }) - .compileComponents(); - })); + beforeEach(async(() => { + TestBed.configureTestingModule({ + providers: [ + { provide: DrawingService, useValue: mockedDrawingService }, + { provide: DrawingsDataSource, useValue: mockedDrawingsDataSource }, + { provide: DrawingsEventSource, useValue: mockedDrawingsEventSource }, + { provide: DefaultDrawingsFactory, useValue: mockedDrawingsFactory }, + { provide: MapDrawingToSvgConverter, useClass: MapDrawingToSvgConverter }, + { provide: Context, useClass: Context } + ], + declarations: [TextAddedComponent] + }).compileComponents(); + })); - beforeEach(() => { - fixture = TestBed.createComponent(TextAddedComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); + beforeEach(() => { + fixture = TestBed.createComponent(TextAddedComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); - it('should create', () => { - expect(component).toBeTruthy(); - }); + it('should create', () => { + expect(component).toBeTruthy(); + }); - it('should call drawing service when text added', () => { - component.project = { project_id: "sampleId" } as Project; - const textAddedDataEvent = new TextAddedDataEvent("savedText", 0 ,0); - spyOn(mockedDrawingService, 'add').and.returnValue( Observable.of({})); + it('should call drawing service when text added', () => { + component.project = { project_id: 'sampleId' } as Project; + const textAddedDataEvent = new TextAddedDataEvent('savedText', 0, 0); + spyOn(mockedDrawingService, 'add').and.returnValue(Observable.of({})); - mockedDrawingsEventSource.textAdded.emit(textAddedDataEvent); + mockedDrawingsEventSource.textAdded.emit(textAddedDataEvent); - expect(mockedDrawingService.add).toHaveBeenCalled(); - }); + expect(mockedDrawingService.add).toHaveBeenCalled(); + }); }); diff --git a/src/app/components/drawings-listeners/text-added/text-added.component.ts b/src/app/components/drawings-listeners/text-added/text-added.component.ts index 2f0ca3bf..c5e6a655 100644 --- a/src/app/components/drawings-listeners/text-added/text-added.component.ts +++ b/src/app/components/drawings-listeners/text-added/text-added.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit, OnDestroy, Input, Output, EventEmitter } from "@angular/core"; +import { Component, OnInit, OnDestroy, Input, Output, EventEmitter } from '@angular/core'; import { Subscription } from 'rxjs'; import { DrawingService } from '../../../services/drawing.service'; import { DrawingsDataSource } from '../../../cartography/datasources/drawings-datasource'; @@ -12,45 +12,50 @@ import { Project } from '../../../models/project'; import { Drawing } from '../../../cartography/models/drawing'; import { Context } from '../../../cartography/models/context'; - @Component({ - selector: 'app-text-added', - templateUrl: './text-added.component.html', - styleUrls: ['./text-added.component.css'] + selector: 'app-text-added', + templateUrl: './text-added.component.html', + styleUrls: ['./text-added.component.css'] }) -export class TextAddedComponent implements OnInit, OnDestroy{ - @Input() server: Server; - @Input() project: Project; - @Output() drawingSaved = new EventEmitter(); - private textAdded: Subscription; +export class TextAddedComponent implements OnInit, OnDestroy { + @Input() server: Server; + @Input() project: Project; + @Output() drawingSaved = new EventEmitter(); + private textAdded: Subscription; - constructor( - private drawingService: DrawingService, - private drawingsDataSource: DrawingsDataSource, - private drawingsEventSource: DrawingsEventSource, - private drawingsFactory: DefaultDrawingsFactory, - private mapDrawingToSvgConverter: MapDrawingToSvgConverter, - private context: Context - ){} - - ngOnInit(){ - this.textAdded = this.drawingsEventSource.textAdded.subscribe((evt) => this.onTextAdded(evt)); - } + constructor( + private drawingService: DrawingService, + private drawingsDataSource: DrawingsDataSource, + private drawingsEventSource: DrawingsEventSource, + private drawingsFactory: DefaultDrawingsFactory, + private mapDrawingToSvgConverter: MapDrawingToSvgConverter, + private context: Context + ) {} - onTextAdded(evt: TextAddedDataEvent){ - let drawing = this.drawingsFactory.getDrawingMock("text"); - (drawing.element as TextElement).text = evt.savedText; - let svgText = this.mapDrawingToSvgConverter.convert(drawing); + ngOnInit() { + this.textAdded = this.drawingsEventSource.textAdded.subscribe(evt => this.onTextAdded(evt)); + } - this.drawingService - .add(this.server, this.project.project_id, evt.x - this.context.getZeroZeroTransformationPoint().x, evt.y - this.context.getZeroZeroTransformationPoint().y, svgText) - .subscribe((serverDrawing: Drawing) => { - this.drawingsDataSource.add(serverDrawing); - this.drawingSaved.emit(true); - }); - } + onTextAdded(evt: TextAddedDataEvent) { + let drawing = this.drawingsFactory.getDrawingMock('text'); + (drawing.element as TextElement).text = evt.savedText; + let svgText = this.mapDrawingToSvgConverter.convert(drawing); - ngOnDestroy(){ - this.textAdded.unsubscribe(); - } + this.drawingService + .add( + this.server, + this.project.project_id, + evt.x - this.context.getZeroZeroTransformationPoint().x, + evt.y - this.context.getZeroZeroTransformationPoint().y, + svgText + ) + .subscribe((serverDrawing: Drawing) => { + this.drawingsDataSource.add(serverDrawing); + this.drawingSaved.emit(true); + }); + } + + ngOnDestroy() { + this.textAdded.unsubscribe(); + } } diff --git a/src/app/components/drawings-listeners/text-edited/text-edited.component.spec.ts b/src/app/components/drawings-listeners/text-edited/text-edited.component.spec.ts index 68c1781a..1bd9304e 100644 --- a/src/app/components/drawings-listeners/text-edited/text-edited.component.spec.ts +++ b/src/app/components/drawings-listeners/text-edited/text-edited.component.spec.ts @@ -1,4 +1,4 @@ -import { TextEditedComponent } from "./text-edited.component"; +import { TextEditedComponent } from './text-edited.component'; import { ComponentFixture, TestBed, async } from '@angular/core/testing'; import { DrawingService } from '../../../services/drawing.service'; import { DrawingsDataSource } from '../../../cartography/datasources/drawings-datasource'; @@ -10,54 +10,51 @@ import { TextElement } from '../../../cartography/models/drawings/text-element'; import { MockedDrawingService, MockedDrawingsDataSource } from '../../project-map/project-map.component.spec'; describe('TextEditedComponent', () => { - let component: TextEditedComponent; - let fixture: ComponentFixture; - let mockedDrawingService = new MockedDrawingService; - let mockedDrawingsDataSource = new MockedDrawingsDataSource; - let mockedDrawingsEventSource = new DrawingsEventSource; + let component: TextEditedComponent; + let fixture: ComponentFixture; + let mockedDrawingService = new MockedDrawingService(); + let mockedDrawingsDataSource = new MockedDrawingsDataSource(); + let mockedDrawingsEventSource = new DrawingsEventSource(); - beforeEach(async(() => { - TestBed.configureTestingModule({ - providers: [ - { provide: DrawingService, useValue: mockedDrawingService }, - { provide: DrawingsDataSource, useValue: mockedDrawingsDataSource }, - { provide: DrawingsEventSource, useValue: mockedDrawingsEventSource }, - { provide: MapDrawingToSvgConverter, useClass: MapDrawingToSvgConverter } - ], - declarations: [ - TextEditedComponent - ] - }) - .compileComponents(); - })); + beforeEach(async(() => { + TestBed.configureTestingModule({ + providers: [ + { provide: DrawingService, useValue: mockedDrawingService }, + { provide: DrawingsDataSource, useValue: mockedDrawingsDataSource }, + { provide: DrawingsEventSource, useValue: mockedDrawingsEventSource }, + { provide: MapDrawingToSvgConverter, useClass: MapDrawingToSvgConverter } + ], + declarations: [TextEditedComponent] + }).compileComponents(); + })); - beforeEach(() => { - fixture = TestBed.createComponent(TextEditedComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); + beforeEach(() => { + fixture = TestBed.createComponent(TextEditedComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); - it('should create', () => { - expect(component).toBeTruthy(); - }); + it('should create', () => { + expect(component).toBeTruthy(); + }); - it('should call drawing service when text edited', () => { - const textElement: TextElement = { - height: 100, - width: 100, - text: "sample text", - fill: "fill", - fill_opacity: 100, - font_family: "font", - font_size: 100, - font_weight: "bold", - text_decoration: "sample decoration" - }; - const textEditedDataEvent = new TextEditedDataEvent("id", "edited text", textElement); - spyOn(mockedDrawingService, 'updateText').and.returnValue( Observable.of({})); + it('should call drawing service when text edited', () => { + const textElement: TextElement = { + height: 100, + width: 100, + text: 'sample text', + fill: 'fill', + fill_opacity: 100, + font_family: 'font', + font_size: 100, + font_weight: 'bold', + text_decoration: 'sample decoration' + }; + const textEditedDataEvent = new TextEditedDataEvent('id', 'edited text', textElement); + spyOn(mockedDrawingService, 'updateText').and.returnValue(Observable.of({})); - mockedDrawingsEventSource.textEdited.emit(textEditedDataEvent); + mockedDrawingsEventSource.textEdited.emit(textEditedDataEvent); - expect(mockedDrawingService.updateText).toHaveBeenCalled(); - }); + expect(mockedDrawingService.updateText).toHaveBeenCalled(); + }); }); diff --git a/src/app/components/drawings-listeners/text-edited/text-edited.component.ts b/src/app/components/drawings-listeners/text-edited/text-edited.component.ts index 0044c1ab..bc20fc6f 100644 --- a/src/app/components/drawings-listeners/text-edited/text-edited.component.ts +++ b/src/app/components/drawings-listeners/text-edited/text-edited.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit, OnDestroy, Input } from "@angular/core"; +import { Component, OnInit, OnDestroy, Input } from '@angular/core'; import { TextEditedDataEvent } from '../../../cartography/events/event-source'; import { MapDrawing } from '../../../cartography/models/map/map-drawing'; import { TextElement } from '../../../cartography/models/drawings/text-element'; @@ -10,44 +10,41 @@ import { DrawingsDataSource } from '../../../cartography/datasources/drawings-da import { DrawingsEventSource } from '../../../cartography/events/drawings-event-source'; import { MapDrawingToSvgConverter } from '../../../cartography/converters/map/map-drawing-to-svg-converter'; - @Component({ - selector: 'app-text-edited', - templateUrl: './text-edited.component.html', - styleUrls: ['./text-edited.component.css'] + selector: 'app-text-edited', + templateUrl: './text-edited.component.html', + styleUrls: ['./text-edited.component.css'] }) -export class TextEditedComponent implements OnInit, OnDestroy{ - @Input() server: Server; - private textEdited: Subscription; +export class TextEditedComponent implements OnInit, OnDestroy { + @Input() server: Server; + private textEdited: Subscription; - constructor( - private drawingService: DrawingService, - private drawingsDataSource: DrawingsDataSource, - private drawingsEventSource: DrawingsEventSource, - private mapDrawingToSvgConverter: MapDrawingToSvgConverter - ){} + constructor( + private drawingService: DrawingService, + private drawingsDataSource: DrawingsDataSource, + private drawingsEventSource: DrawingsEventSource, + private mapDrawingToSvgConverter: MapDrawingToSvgConverter + ) {} - ngOnInit(){ - this.textEdited = this.drawingsEventSource.textEdited.subscribe((evt) => this.onTextEdited(evt)); - } + ngOnInit() { + this.textEdited = this.drawingsEventSource.textEdited.subscribe(evt => this.onTextEdited(evt)); + } - onTextEdited(evt: TextEditedDataEvent){ - let mapDrawing: MapDrawing = new MapDrawing(); - mapDrawing.element = evt.textElement; - (mapDrawing.element as TextElement).text = evt.editedText; - let svgString = this.mapDrawingToSvgConverter.convert(mapDrawing); - - let drawing = this.drawingsDataSource.get(evt.textDrawingId); - - this.drawingService - .updateText(this.server, drawing, svgString) - .subscribe((serverDrawing: Drawing) => { - this.drawingsDataSource.update(serverDrawing); - this.drawingsEventSource.textSaved.emit(true); - }); - } + onTextEdited(evt: TextEditedDataEvent) { + let mapDrawing: MapDrawing = new MapDrawing(); + mapDrawing.element = evt.textElement; + (mapDrawing.element as TextElement).text = evt.editedText; + let svgString = this.mapDrawingToSvgConverter.convert(mapDrawing); - ngOnDestroy(){ - this.textEdited.unsubscribe(); - } + let drawing = this.drawingsDataSource.get(evt.textDrawingId); + + this.drawingService.updateText(this.server, drawing, svgString).subscribe((serverDrawing: Drawing) => { + this.drawingsDataSource.update(serverDrawing); + this.drawingsEventSource.textSaved.emit(true); + }); + } + + ngOnDestroy() { + this.textEdited.unsubscribe(); + } } diff --git a/src/app/components/local-server/local-server.component.spec.ts b/src/app/components/local-server/local-server.component.spec.ts index bf1a88b4..c53057db 100644 --- a/src/app/components/local-server/local-server.component.spec.ts +++ b/src/app/components/local-server/local-server.component.spec.ts @@ -1,11 +1,10 @@ import { async, ComponentFixture, fakeAsync, TestBed, tick } from '@angular/core/testing'; -import { Router } from "@angular/router"; +import { Router } from '@angular/router'; import { LocalServerComponent } from './local-server.component'; -import { ServerService } from "../../services/server.service"; -import { MockedServerService } from "../../services/server.service.spec"; -import { Server } from "../../models/server"; - +import { ServerService } from '../../services/server.service'; +import { MockedServerService } from '../../services/server.service.spec'; +import { Server } from '../../models/server'; describe('LocalServerComponent', () => { let component: LocalServerComponent; @@ -13,7 +12,6 @@ describe('LocalServerComponent', () => { let router: any; let serverService: any; - beforeEach(async(() => { router = { navigate: jasmine.createSpy('navigate') @@ -26,13 +24,9 @@ describe('LocalServerComponent', () => { spyOn(serverService, 'getLocalServer').and.returnValue(Promise.resolve(server)); TestBed.configureTestingModule({ - providers: [ - { provide: Router, useValue: router }, - { provide: ServerService, useValue: serverService } - ], - declarations: [ LocalServerComponent ] - }) - .compileComponents(); + providers: [{ provide: Router, useValue: router }, { provide: ServerService, useValue: serverService }], + declarations: [LocalServerComponent] + }).compileComponents(); fixture = TestBed.createComponent(LocalServerComponent); component = fixture.componentInstance; diff --git a/src/app/components/local-server/local-server.component.ts b/src/app/components/local-server/local-server.component.ts index b0c56966..9f201b5a 100644 --- a/src/app/components/local-server/local-server.component.ts +++ b/src/app/components/local-server/local-server.component.ts @@ -1,9 +1,8 @@ import { Component, OnInit } from '@angular/core'; -import { Router } from "@angular/router"; - -import { ServerService } from "../../services/server.service"; -import { Server } from "../../models/server"; +import { Router } from '@angular/router'; +import { ServerService } from '../../services/server.service'; +import { Server } from '../../models/server'; @Component({ selector: 'app-local-server', @@ -11,15 +10,11 @@ import { Server } from "../../models/server"; styleUrls: ['./local-server.component.scss'] }) export class LocalServerComponent implements OnInit { - - constructor(private router: Router, - private serverService: ServerService) { } + constructor(private router: Router, private serverService: ServerService) {} ngOnInit() { - this.serverService.getLocalServer(location.hostname, parseInt(location.port, 10)) - .then((server: Server) => { - this.router.navigate(['/server', server.id, 'projects']); - }); + this.serverService.getLocalServer(location.hostname, parseInt(location.port, 10)).then((server: Server) => { + this.router.navigate(['/server', server.id, 'projects']); + }); } - } diff --git a/src/app/components/project-map/context-menu/actions/edit-style-action/edit-style-action.component.html b/src/app/components/project-map/context-menu/actions/edit-style-action/edit-style-action.component.html new file mode 100644 index 00000000..9e6258d3 --- /dev/null +++ b/src/app/components/project-map/context-menu/actions/edit-style-action/edit-style-action.component.html @@ -0,0 +1,4 @@ + diff --git a/src/app/components/project-map/context-menu/actions/edit-style-action/edit-style-action.component.spec.ts b/src/app/components/project-map/context-menu/actions/edit-style-action/edit-style-action.component.spec.ts new file mode 100644 index 00000000..e69de29b diff --git a/src/app/components/project-map/context-menu/actions/edit-style-action/edit-style-action.component.ts b/src/app/components/project-map/context-menu/actions/edit-style-action/edit-style-action.component.ts new file mode 100644 index 00000000..5234c05b --- /dev/null +++ b/src/app/components/project-map/context-menu/actions/edit-style-action/edit-style-action.component.ts @@ -0,0 +1,30 @@ +import { Component, OnInit, Input } from '@angular/core'; +import { Drawing } from '../../../../../cartography/models/drawing'; +import { Server } from '../../../../../models/server'; +import { MatDialog } from '@angular/material'; +import { Project } from '../../../../../models/project'; +import { StyleEditorDialogComponent } from '../../../drawings-editors/style-editor/style-editor.component'; + +@Component({ + selector: 'app-edit-style-action', + templateUrl: './edit-style-action.component.html' +}) +export class EditStyleActionComponent implements OnInit { + @Input() server: Server; + @Input() project: Project; + @Input() drawing: Drawing; + + constructor(private dialog: MatDialog) {} + + ngOnInit() {} + + editStyle() { + const dialogRef = this.dialog.open(StyleEditorDialogComponent, { + width: '300px' + }); + let instance = dialogRef.componentInstance; + instance.server = this.server; + instance.project = this.project; + instance.drawing = this.drawing; + } +} diff --git a/src/app/components/project-map/context-menu/actions/edit-text-action/edit-text-action.component.html b/src/app/components/project-map/context-menu/actions/edit-text-action/edit-text-action.component.html new file mode 100644 index 00000000..47739ff2 --- /dev/null +++ b/src/app/components/project-map/context-menu/actions/edit-text-action/edit-text-action.component.html @@ -0,0 +1,4 @@ + diff --git a/src/app/components/project-map/context-menu/actions/edit-text-action/edit-text-action.component.spec.ts b/src/app/components/project-map/context-menu/actions/edit-text-action/edit-text-action.component.spec.ts new file mode 100644 index 00000000..e69de29b diff --git a/src/app/components/project-map/context-menu/actions/edit-text-action/edit-text-action.component.ts b/src/app/components/project-map/context-menu/actions/edit-text-action/edit-text-action.component.ts new file mode 100644 index 00000000..cc2f0720 --- /dev/null +++ b/src/app/components/project-map/context-menu/actions/edit-text-action/edit-text-action.component.ts @@ -0,0 +1,30 @@ +import { Component, OnInit, Input } from '@angular/core'; +import { Server } from '../../../../../models/server'; +import { Project } from '../../../../../models/project'; +import { Drawing } from '../../../../../cartography/models/drawing'; +import { MatDialog } from '@angular/material'; +import { TextEditorDialogComponent } from '../../../drawings-editors/text-editor/text-editor.component'; + +@Component({ + selector: 'app-edit-text-action', + templateUrl: './edit-text-action.component.html' +}) +export class EditTextActionComponent implements OnInit { + @Input() server: Server; + @Input() project: Project; + @Input() drawing: Drawing; + + constructor(private dialog: MatDialog) {} + + ngOnInit() {} + + editText() { + const dialogRef = this.dialog.open(TextEditorDialogComponent, { + width: '300px' + }); + let instance = dialogRef.componentInstance; + instance.server = this.server; + instance.project = this.project; + instance.drawing = this.drawing; + } +} diff --git a/src/app/components/project-map/node-context-menu/actions/move-layer-down-action/move-layer-down-action.component.html b/src/app/components/project-map/context-menu/actions/move-layer-down-action/move-layer-down-action.component.html similarity index 100% rename from src/app/components/project-map/node-context-menu/actions/move-layer-down-action/move-layer-down-action.component.html rename to src/app/components/project-map/context-menu/actions/move-layer-down-action/move-layer-down-action.component.html diff --git a/src/app/components/project-map/node-context-menu/actions/move-layer-down-action/move-layer-down-action.component.spec.ts b/src/app/components/project-map/context-menu/actions/move-layer-down-action/move-layer-down-action.component.spec.ts similarity index 88% rename from src/app/components/project-map/node-context-menu/actions/move-layer-down-action/move-layer-down-action.component.spec.ts rename to src/app/components/project-map/context-menu/actions/move-layer-down-action/move-layer-down-action.component.spec.ts index 515d559d..434844d4 100644 --- a/src/app/components/project-map/node-context-menu/actions/move-layer-down-action/move-layer-down-action.component.spec.ts +++ b/src/app/components/project-map/context-menu/actions/move-layer-down-action/move-layer-down-action.component.spec.ts @@ -8,9 +8,8 @@ describe('MoveLayerDownActionComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ - declarations: [ MoveLayerDownActionComponent ] - }) - .compileComponents(); + declarations: [MoveLayerDownActionComponent] + }).compileComponents(); })); // beforeEach(() => { diff --git a/src/app/components/project-map/context-menu/actions/move-layer-down-action/move-layer-down-action.component.ts b/src/app/components/project-map/context-menu/actions/move-layer-down-action/move-layer-down-action.component.ts new file mode 100644 index 00000000..9453629c --- /dev/null +++ b/src/app/components/project-map/context-menu/actions/move-layer-down-action/move-layer-down-action.component.ts @@ -0,0 +1,43 @@ +import { Component, OnInit, Input } from '@angular/core'; +import { Server } from '../../../../../models/server'; +import { Node } from '../../../../../cartography/models/node'; +import { NodesDataSource } from '../../../../../cartography/datasources/nodes-datasource'; +import { NodeService } from '../../../../../services/node.service'; +import { Drawing } from '../../../../../cartography/models/drawing'; +import { DrawingsDataSource } from '../../../../../cartography/datasources/drawings-datasource'; +import { DrawingService } from '../../../../../services/drawing.service'; + +@Component({ + selector: 'app-move-layer-down-action', + templateUrl: './move-layer-down-action.component.html' +}) +export class MoveLayerDownActionComponent implements OnInit { + @Input() server: Server; + @Input() nodes: Node[]; + @Input() drawings: Drawing[]; + + constructor( + private nodesDataSource: NodesDataSource, + private drawingsDataSource: DrawingsDataSource, + private nodeService: NodeService, + private drawingService: DrawingService + ) {} + + ngOnInit() {} + + moveLayerDown() { + this.nodes.forEach((node) => { + node.z--; + this.nodesDataSource.update(node); + + this.nodeService.update(this.server, node).subscribe((node: Node) => {}); + }); + + this.drawings.forEach((drawing) => { + drawing.z--; + this.drawingsDataSource.update(drawing); + + this.drawingService.update(this.server, drawing).subscribe((drawing: Drawing) => {}); + }); + } +} diff --git a/src/app/components/project-map/node-context-menu/actions/move-layer-up-action/move-layer-up-action.component.html b/src/app/components/project-map/context-menu/actions/move-layer-up-action/move-layer-up-action.component.html similarity index 100% rename from src/app/components/project-map/node-context-menu/actions/move-layer-up-action/move-layer-up-action.component.html rename to src/app/components/project-map/context-menu/actions/move-layer-up-action/move-layer-up-action.component.html diff --git a/src/app/components/project-map/node-context-menu/actions/move-layer-up-action/move-layer-up-action.component.spec.ts b/src/app/components/project-map/context-menu/actions/move-layer-up-action/move-layer-up-action.component.spec.ts similarity index 88% rename from src/app/components/project-map/node-context-menu/actions/move-layer-up-action/move-layer-up-action.component.spec.ts rename to src/app/components/project-map/context-menu/actions/move-layer-up-action/move-layer-up-action.component.spec.ts index 096242f5..26111dd4 100644 --- a/src/app/components/project-map/node-context-menu/actions/move-layer-up-action/move-layer-up-action.component.spec.ts +++ b/src/app/components/project-map/context-menu/actions/move-layer-up-action/move-layer-up-action.component.spec.ts @@ -8,9 +8,8 @@ describe('MoveLayerUpActionComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ - declarations: [ MoveLayerUpActionComponent ] - }) - .compileComponents(); + declarations: [MoveLayerUpActionComponent] + }).compileComponents(); })); // beforeEach(() => { diff --git a/src/app/components/project-map/context-menu/actions/move-layer-up-action/move-layer-up-action.component.ts b/src/app/components/project-map/context-menu/actions/move-layer-up-action/move-layer-up-action.component.ts new file mode 100644 index 00000000..587cfc9b --- /dev/null +++ b/src/app/components/project-map/context-menu/actions/move-layer-up-action/move-layer-up-action.component.ts @@ -0,0 +1,43 @@ +import { Component, OnInit, Input } from '@angular/core'; +import { Server } from '../../../../../models/server'; +import { Node } from '../../../../../cartography/models/node'; +import { NodesDataSource } from '../../../../../cartography/datasources/nodes-datasource'; +import { NodeService } from '../../../../../services/node.service'; +import { Drawing } from '../../../../../cartography/models/drawing'; +import { DrawingsDataSource } from '../../../../../cartography/datasources/drawings-datasource'; +import { DrawingService } from '../../../../../services/drawing.service'; + +@Component({ + selector: 'app-move-layer-up-action', + templateUrl: './move-layer-up-action.component.html' +}) +export class MoveLayerUpActionComponent implements OnInit { + @Input() server: Server; + @Input() nodes: Node[]; + @Input() drawings: Drawing[]; + + constructor( + private nodesDataSource: NodesDataSource, + private drawingsDataSource: DrawingsDataSource, + private nodeService: NodeService, + private drawingService: DrawingService + ) {} + + ngOnInit() {} + + moveLayerUp() { + this.nodes.forEach((node) => { + node.z++; + this.nodesDataSource.update(node); + + this.nodeService.update(this.server, node).subscribe((node: Node) => {}); + }); + + this.drawings.forEach((drawing) => { + drawing.z++; + this.drawingsDataSource.update(drawing); + + this.drawingService.update(this.server, drawing).subscribe((drawing: Drawing) => {}); + }); + } +} diff --git a/src/app/components/project-map/context-menu/actions/start-node-action/start-node-action.component.html b/src/app/components/project-map/context-menu/actions/start-node-action/start-node-action.component.html new file mode 100644 index 00000000..cbcad82f --- /dev/null +++ b/src/app/components/project-map/context-menu/actions/start-node-action/start-node-action.component.html @@ -0,0 +1,4 @@ + diff --git a/src/app/components/project-map/node-context-menu/actions/start-node-action/start-node-action.component.spec.ts b/src/app/components/project-map/context-menu/actions/start-node-action/start-node-action.component.spec.ts similarity index 88% rename from src/app/components/project-map/node-context-menu/actions/start-node-action/start-node-action.component.spec.ts rename to src/app/components/project-map/context-menu/actions/start-node-action/start-node-action.component.spec.ts index 553ce247..917075b1 100644 --- a/src/app/components/project-map/node-context-menu/actions/start-node-action/start-node-action.component.spec.ts +++ b/src/app/components/project-map/context-menu/actions/start-node-action/start-node-action.component.spec.ts @@ -8,9 +8,8 @@ describe('StartNodeActionComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ - declarations: [ StartNodeActionComponent ] - }) - .compileComponents(); + declarations: [StartNodeActionComponent] + }).compileComponents(); })); beforeEach(() => { diff --git a/src/app/components/project-map/context-menu/actions/start-node-action/start-node-action.component.ts b/src/app/components/project-map/context-menu/actions/start-node-action/start-node-action.component.ts new file mode 100644 index 00000000..80247bae --- /dev/null +++ b/src/app/components/project-map/context-menu/actions/start-node-action/start-node-action.component.ts @@ -0,0 +1,30 @@ +import { Component, Input, OnInit } from '@angular/core'; +import { Server } from '../../../../../models/server'; +import { NodeService } from '../../../../../services/node.service'; +import { Node } from '../../../../../cartography/models/node'; + +@Component({ + selector: 'app-start-node-action', + templateUrl: './start-node-action.component.html' +}) +export class StartNodeActionComponent implements OnInit { + @Input() server: Server; + @Input() nodes: Node[]; + isNodeWithStoppedStatus: boolean; + + constructor(private nodeService: NodeService) {} + + ngOnInit() { + this.nodes.forEach((node) => { + if (node.status === 'stopped') { + this.isNodeWithStoppedStatus = true; + } + }); + } + + startNodes() { + this.nodes.forEach((node) => { + this.nodeService.start(this.server, node).subscribe((n: Node) => {}); + }); + } +} diff --git a/src/app/components/project-map/context-menu/actions/stop-node-action/stop-node-action.component.html b/src/app/components/project-map/context-menu/actions/stop-node-action/stop-node-action.component.html new file mode 100644 index 00000000..22df2cb1 --- /dev/null +++ b/src/app/components/project-map/context-menu/actions/stop-node-action/stop-node-action.component.html @@ -0,0 +1,4 @@ + diff --git a/src/app/components/project-map/node-context-menu/actions/stop-node-action/stop-node-action.component.spec.ts b/src/app/components/project-map/context-menu/actions/stop-node-action/stop-node-action.component.spec.ts similarity index 88% rename from src/app/components/project-map/node-context-menu/actions/stop-node-action/stop-node-action.component.spec.ts rename to src/app/components/project-map/context-menu/actions/stop-node-action/stop-node-action.component.spec.ts index e93ce879..c49c6157 100644 --- a/src/app/components/project-map/node-context-menu/actions/stop-node-action/stop-node-action.component.spec.ts +++ b/src/app/components/project-map/context-menu/actions/stop-node-action/stop-node-action.component.spec.ts @@ -8,9 +8,8 @@ describe('StopNodeActionComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ - declarations: [ StopNodeActionComponent ] - }) - .compileComponents(); + declarations: [StopNodeActionComponent] + }).compileComponents(); })); beforeEach(() => { diff --git a/src/app/components/project-map/context-menu/actions/stop-node-action/stop-node-action.component.ts b/src/app/components/project-map/context-menu/actions/stop-node-action/stop-node-action.component.ts new file mode 100644 index 00000000..36fd1a64 --- /dev/null +++ b/src/app/components/project-map/context-menu/actions/stop-node-action/stop-node-action.component.ts @@ -0,0 +1,30 @@ +import { Component, Input, OnInit } from '@angular/core'; +import { Server } from '../../../../../models/server'; +import { NodeService } from '../../../../../services/node.service'; +import { Node } from '../../../../../cartography/models/node'; + +@Component({ + selector: 'app-stop-node-action', + templateUrl: './stop-node-action.component.html' +}) +export class StopNodeActionComponent implements OnInit { + @Input() server: Server; + @Input() nodes: Node[]; + isNodeWithStartedStatus: boolean; + + constructor(private nodeService: NodeService) {} + + ngOnInit() { + this.nodes.forEach((node) => { + if (node.status === 'started') { + this.isNodeWithStartedStatus = true; + } + }); + } + + stopNodes() { + this.nodes.forEach((node) => { + this.nodeService.stop(this.server, node).subscribe((n: Node) => {}); + }); + } +} diff --git a/src/app/components/project-map/context-menu/context-menu.component.html b/src/app/components/project-map/context-menu/context-menu.component.html new file mode 100644 index 00000000..3146bbbc --- /dev/null +++ b/src/app/components/project-map/context-menu/context-menu.component.html @@ -0,0 +1,30 @@ +
+ + + + + + + + + +
diff --git a/src/app/components/project-map/node-context-menu/node-context-menu.component.scss b/src/app/components/project-map/context-menu/context-menu.component.scss similarity index 100% rename from src/app/components/project-map/node-context-menu/node-context-menu.component.scss rename to src/app/components/project-map/context-menu/context-menu.component.scss diff --git a/src/app/components/project-map/context-menu/context-menu.component.spec.ts b/src/app/components/project-map/context-menu/context-menu.component.spec.ts new file mode 100644 index 00000000..30c60aef --- /dev/null +++ b/src/app/components/project-map/context-menu/context-menu.component.spec.ts @@ -0,0 +1,77 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { ContextMenuComponent } from './context-menu.component'; +import { BrowserModule } from '@angular/platform-browser'; +import { ChangeDetectorRef, NO_ERRORS_SCHEMA } from '@angular/core'; +import { ProjectService } from '../../../services/project.service'; +import { MockedProjectService } from '../../projects/add-blank-project-dialog/add-blank-project-dialog.component.spec'; +import { MatMenuModule, MatMenuTrigger } from '@angular/material'; +import { Drawing } from '../../../cartography/models/drawing'; +import { RectElement } from '../../../cartography/models/drawings/rect-element'; +import { TextElement } from '../../../cartography/models/drawings/text-element'; + +describe('ContextMenuComponent', () => { + let component: ContextMenuComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + imports: [MatMenuModule, BrowserModule], + providers: [ + { provide: ChangeDetectorRef }, + { provide: ProjectService, useClass: MockedProjectService } + ], + declarations: [ContextMenuComponent], + schemas: [NO_ERRORS_SCHEMA] + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ContextMenuComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); + + it('should reset capabilities while opening menu for node', () => { + component.contextMenu = { openMenu() {} } as MatMenuTrigger; + var spy = spyOn(component, 'resetCapabilities'); + + component.openMenuForNode(null, 0, 0); + + expect(spy.calls.any()).toBeTruthy(); + }); + + it('should reset capabilities while opening menu for drawing', () => { + component.contextMenu = { openMenu() {} } as MatMenuTrigger; + let drawing = {} as Drawing; + drawing.element = new RectElement(); + var spy = spyOn(component, 'resetCapabilities'); + spyOn(component, 'setPosition').and.callFake(() => {}); + component.openMenuForDrawing(drawing, 0, 0); + + expect(spy.calls.any()).toBeTruthy(); + }); + + it('should set correct flag while drawing is text element', () => { + component.contextMenu = { openMenu() {} } as MatMenuTrigger; + let drawing = {} as Drawing; + drawing.element = new TextElement(); + var spy = spyOn(component, 'resetCapabilities'); + spyOn(component, 'setPosition').and.callFake(() => {}); + component.openMenuForDrawing(drawing, 0, 0); + + expect(spy.calls.any()).toBeTruthy(); + }); + + it('should reset capabilities while opening menu for list of elements', () => { + component.contextMenu = { openMenu() {} } as MatMenuTrigger; + var spy = spyOn(component, 'resetCapabilities'); + spyOn(component, 'setPosition').and.callFake(() => {}); + component.openMenuForListOfElements([], [], [], 0, 0); + + expect(spy.calls.any()).toBeTruthy(); + }); +}); diff --git a/src/app/components/project-map/context-menu/context-menu.component.ts b/src/app/components/project-map/context-menu/context-menu.component.ts new file mode 100644 index 00000000..45da4d2f --- /dev/null +++ b/src/app/components/project-map/context-menu/context-menu.component.ts @@ -0,0 +1,94 @@ +import { ChangeDetectorRef, Component, Input, OnInit, ViewChild } from '@angular/core'; +import { MatMenuTrigger } from '@angular/material'; +import { DomSanitizer } from '@angular/platform-browser'; +import { Node } from '../../../cartography/models/node'; +import { Server } from '../../../models/server'; +import { Project } from '../../../models/project'; +import { ProjectService } from '../../../services/project.service'; +import { Drawing } from '../../../cartography/models/drawing'; +import { TextElement } from '../../../cartography/models/drawings/text-element'; +import { Label } from '../../../cartography/models/label'; + + +@Component({ + selector: 'app-context-menu', + templateUrl: './context-menu.component.html', + styleUrls: ['./context-menu.component.scss'] +}) +export class ContextMenuComponent implements OnInit { + @Input() project: Project; + @Input() server: Server; + + @ViewChild(MatMenuTrigger) contextMenu: MatMenuTrigger; + + topPosition; + leftPosition; + + drawings: Drawing[] = []; + nodes: Node[] = []; + labels: Label[] = []; + + hasTextCapabilities: boolean = false; + + constructor( + private sanitizer: DomSanitizer, + private changeDetector: ChangeDetectorRef, + public projectService: ProjectService + ) {} + + 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 openMenuForDrawing(drawing: Drawing, top: number, left: number) { + this.resetCapabilities(); + this.hasTextCapabilities = drawing.element instanceof TextElement; + + this.drawings = [drawing]; + this.setPosition(top, left); + + this.contextMenu.openMenu(); + } + + public openMenuForNode(node: Node, top: number, left: number) { + this.resetCapabilities(); + + this.nodes = [node]; + this.setPosition(top, left); + + this.contextMenu.openMenu(); + } + + public openMenuForLabel(label: Label, top: number, left: number) { + this.resetCapabilities(); + + this.labels = [label]; + this.setPosition(top, left); + + this.contextMenu.openMenu(); + } + + public openMenuForListOfElements(drawings: Drawing[], nodes: Node[], labels: Label[], top: number, left: number) { + this.resetCapabilities(); + + this.drawings = drawings; + this.nodes = nodes; + this.labels = labels; + this.setPosition(top, left); + + this.contextMenu.openMenu(); + } + + private resetCapabilities() { + this.drawings = []; + this.nodes = []; + this.labels = []; + this.hasTextCapabilities = false; + } +} diff --git a/src/app/components/project-map/draw-link-tool/draw-link-tool.component.html b/src/app/components/project-map/draw-link-tool/draw-link-tool.component.html index 16188157..9bbaf0d3 100644 --- a/src/app/components/project-map/draw-link-tool/draw-link-tool.component.html +++ b/src/app/components/project-map/draw-link-tool/draw-link-tool.component.html @@ -1 +1 @@ - \ No newline at end of file + diff --git a/src/app/components/project-map/draw-link-tool/draw-link-tool.component.spec.ts b/src/app/components/project-map/draw-link-tool/draw-link-tool.component.spec.ts index d75619ca..5978e4d7 100644 --- a/src/app/components/project-map/draw-link-tool/draw-link-tool.component.spec.ts +++ b/src/app/components/project-map/draw-link-tool/draw-link-tool.component.spec.ts @@ -8,9 +8,8 @@ describe('DrawLinkToolComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ - declarations: [ DrawLinkToolComponent ] - }) - .compileComponents(); + declarations: [DrawLinkToolComponent] + }).compileComponents(); })); beforeEach(() => { diff --git a/src/app/components/project-map/draw-link-tool/draw-link-tool.component.ts b/src/app/components/project-map/draw-link-tool/draw-link-tool.component.ts index 880ff7ce..55cab9cf 100644 --- a/src/app/components/project-map/draw-link-tool/draw-link-tool.component.ts +++ b/src/app/components/project-map/draw-link-tool/draw-link-tool.component.ts @@ -8,7 +8,6 @@ import { MapNode } from '../../../cartography/models/map/map-node'; import { MapPort } from '../../../cartography/models/map/map-port'; import { MapLinkCreated } from '../../../cartography/events/links'; - @Component({ selector: 'app-draw-link-tool', templateUrl: './draw-link-tool.component.html', @@ -16,22 +15,18 @@ import { MapLinkCreated } from '../../../cartography/events/links'; }) export class DrawLinkToolComponent implements OnInit, OnDestroy { @ViewChild(NodeSelectInterfaceComponent) nodeSelectInterfaceMenu: NodeSelectInterfaceComponent; - + private nodeClicked$: Subscription; constructor( private drawingLineTool: DrawingLineWidget, private nodesEventSource: NodesEventSource, private linksEventSource: LinksEventSource - ) { } + ) {} ngOnInit() { - this.nodeClicked$ = this.nodesEventSource.clicked.subscribe((clickedEvent) => { - this.nodeSelectInterfaceMenu.open( - clickedEvent.datum, - clickedEvent.y, - clickedEvent.x - ); + this.nodeClicked$ = this.nodesEventSource.clicked.subscribe(clickedEvent => { + this.nodeSelectInterfaceMenu.open(clickedEvent.datum, clickedEvent.y, clickedEvent.x); }); } @@ -49,9 +44,9 @@ export class DrawLinkToolComponent implements OnInit, OnDestroy { const data = this.drawingLineTool.stop(); this.linksEventSource.created.emit(new MapLinkCreated(data['node'], data['port'], node, port)); } else { - this.drawingLineTool.start(node.x + node.width / 2., node.y + node.height / 2., { - 'node': node, - 'port': port + this.drawingLineTool.start(node.x + node.width / 2, node.y + node.height / 2, { + node: node, + port: port }); } } diff --git a/src/app/components/project-map/drawings-editors/style-editor/style-editor.component.html b/src/app/components/project-map/drawings-editors/style-editor/style-editor.component.html new file mode 100644 index 00000000..62f53a10 --- /dev/null +++ b/src/app/components/project-map/drawings-editors/style-editor/style-editor.component.html @@ -0,0 +1,28 @@ +

Style editor

+ + + +
+ + +
diff --git a/src/app/components/project-map/drawings-editors/style-editor/style-editor.component.scss b/src/app/components/project-map/drawings-editors/style-editor/style-editor.component.scss new file mode 100644 index 00000000..cc9d349b --- /dev/null +++ b/src/app/components/project-map/drawings-editors/style-editor/style-editor.component.scss @@ -0,0 +1,49 @@ +.item { + height: 25px; + font-size: 10pt; + margin-bottom: 10px; +} + +.item-name { + margin-bottom: 10px; +} + +.item-value { + width: 100%; + margin-bottom: 10px; +} + +.input-color { + padding: 0px; + border-width: 0px; + width: 100%; + background-color: transparent; + outline: none; +} + +input:focus { + outline: none; +} + +input[type="color"] { + -webkit-appearance: none; + border: none; + height: 25px; +} + +input[type="color"]::-webkit-color-swatch-wrapper { + padding: 0; +} + +input[type="color"]::-webkit-color-swatch { + border: none; +} + +.modal-form-container { + display: flex; + flex-direction: column; +} + +.modal-form-container > * { + width: 100%; +} diff --git a/src/app/components/project-map/drawings-editors/style-editor/style-editor.component.spec.ts b/src/app/components/project-map/drawings-editors/style-editor/style-editor.component.spec.ts new file mode 100644 index 00000000..e69de29b diff --git a/src/app/components/project-map/drawings-editors/style-editor/style-editor.component.ts b/src/app/components/project-map/drawings-editors/style-editor/style-editor.component.ts new file mode 100644 index 00000000..06d3f1cb --- /dev/null +++ b/src/app/components/project-map/drawings-editors/style-editor/style-editor.component.ts @@ -0,0 +1,84 @@ +import { Component, OnInit } from '@angular/core'; +import { Server } from '../../../../models/server'; +import { Project } from '../../../../models/project'; +import { Drawing } from '../../../../cartography/models/drawing'; +import { MatDialogRef } from '@angular/material'; +import { DrawingToMapDrawingConverter } from '../../../../cartography/converters/map/drawing-to-map-drawing-converter'; +import { MapDrawingToSvgConverter } from '../../../../cartography/converters/map/map-drawing-to-svg-converter'; +import { DrawingService } from '../../../../services/drawing.service'; +import { DrawingsDataSource } from '../../../../cartography/datasources/drawings-datasource'; +import { EllipseElement } from '../../../../cartography/models/drawings/ellipse-element'; +import { LineElement } from '../../../../cartography/models/drawings/line-element'; +import { RectElement } from '../../../../cartography/models/drawings/rect-element'; + +@Component({ + selector: 'app-style-editor', + templateUrl: './style-editor.component.html', + styleUrls: ['./style-editor.component.scss'] +}) +export class StyleEditorDialogComponent implements OnInit { + server: Server; + project: Project; + drawing: Drawing; + element: ElementData; + rotation: string; + + constructor( + public dialogRef: MatDialogRef, + private drawingToMapDrawingConverter: DrawingToMapDrawingConverter, + private mapDrawingToSvgConverter: MapDrawingToSvgConverter, + private drawingService: DrawingService, + private drawingsDataSource: DrawingsDataSource + ) {} + + ngOnInit() { + this.element = new ElementData(); + this.rotation = this.drawing.rotation.toString(); + + if (this.drawing.element instanceof RectElement || this.drawing.element instanceof EllipseElement) { + this.element.fill = this.drawing.element.fill; + this.element.stroke = this.drawing.element.stroke; + this.element.stroke_dasharray = this.drawing.element.stroke_dasharray; + this.element.stroke_width = this.drawing.element.stroke_width; + } else if (this.drawing.element instanceof LineElement) { + this.element.stroke = this.drawing.element.stroke; + this.element.stroke_dasharray = this.drawing.element.stroke_dasharray; + this.element.stroke_width = this.drawing.element.stroke_width; + } + } + + onNoClick() { + this.dialogRef.close(); + } + + onYesClick() { + this.drawing.rotation = +this.rotation; + if (this.drawing.element instanceof RectElement || this.drawing.element instanceof EllipseElement) { + this.drawing.element.fill = this.element.fill; + this.drawing.element.stroke = this.element.stroke; + this.drawing.element.stroke_dasharray = this.element.stroke_dasharray; + this.drawing.element.stroke_width = this.element.stroke_width; + } else if (this.drawing.element instanceof LineElement) { + this.drawing.element.stroke = this.element.stroke; + this.drawing.element.stroke_dasharray = this.element.stroke_dasharray; + this.drawing.element.stroke_width = this.element.stroke_width; + } + + let mapDrawing = this.drawingToMapDrawingConverter.convert(this.drawing); + mapDrawing.element = this.drawing.element; + + this.drawing.svg = this.mapDrawingToSvgConverter.convert(mapDrawing); + + this.drawingService.update(this.server, this.drawing).subscribe((serverDrawing: Drawing) => { + this.drawingsDataSource.update(serverDrawing); + this.dialogRef.close(); + }); + } +} + +export class ElementData { + fill: string; + stroke: string; + stroke_width: number; + stroke_dasharray: string; +} diff --git a/src/app/components/project-map/drawings-editors/text-editor/text-editor.component.html b/src/app/components/project-map/drawings-editors/text-editor/text-editor.component.html new file mode 100644 index 00000000..97348473 --- /dev/null +++ b/src/app/components/project-map/drawings-editors/text-editor/text-editor.component.html @@ -0,0 +1,18 @@ +

Text editor

+ + + +
+ + +
diff --git a/src/app/components/project-map/drawings-editors/text-editor/text-editor.component.scss b/src/app/components/project-map/drawings-editors/text-editor/text-editor.component.scss new file mode 100644 index 00000000..fa95b1f1 --- /dev/null +++ b/src/app/components/project-map/drawings-editors/text-editor/text-editor.component.scss @@ -0,0 +1,54 @@ +.item { + height: 25px; + font-size: 10pt; + margin-bottom: 10px; +} + +.item-name { + margin-bottom: 10px; +} + +.item-value { + width: 100%; + margin-bottom: 10px; +} + +.input-color { + padding: 0px; + border-width: 0px; + width: 100%; + background-color: transparent; + outline: none; +} + +input:focus { + outline: none; +} + +input[type="color"] { + -webkit-appearance: none; + border: none; + height: 25px; +} + +input[type="color"]::-webkit-color-swatch-wrapper { + padding: 0; +} + +input[type="color"]::-webkit-color-swatch { + border: none; +} + +.text { + width: 100%; + height: 150px; +} + +.modal-form-container { + display: flex; + flex-direction: column; +} + +.modal-form-container > * { + width: 100%; +} diff --git a/src/app/components/project-map/drawings-editors/text-editor/text-editor.component.spec.ts b/src/app/components/project-map/drawings-editors/text-editor/text-editor.component.spec.ts new file mode 100644 index 00000000..e69de29b diff --git a/src/app/components/project-map/drawings-editors/text-editor/text-editor.component.ts b/src/app/components/project-map/drawings-editors/text-editor/text-editor.component.ts new file mode 100644 index 00000000..389259c1 --- /dev/null +++ b/src/app/components/project-map/drawings-editors/text-editor/text-editor.component.ts @@ -0,0 +1,67 @@ +import { Component, OnInit, ViewChild, ElementRef, Renderer2 } from '@angular/core'; +import { Project } from '../../../../models/project'; +import { Drawing } from '../../../../cartography/models/drawing'; +import { Server } from '../../../../models/server'; +import { MatDialogRef } from '@angular/material'; +import { DrawingToMapDrawingConverter } from '../../../../cartography/converters/map/drawing-to-map-drawing-converter'; +import { MapDrawingToSvgConverter } from '../../../../cartography/converters/map/map-drawing-to-svg-converter'; +import { DrawingService } from '../../../../services/drawing.service'; +import { DrawingsDataSource } from '../../../../cartography/datasources/drawings-datasource'; +import { TextElement } from '../../../../cartography/models/drawings/text-element'; + +@Component({ + selector: 'app-text-editor', + templateUrl: './text-editor.component.html', + styleUrls: ['./text-editor.component.scss'] +}) +export class TextEditorDialogComponent implements OnInit { + @ViewChild('textArea') textArea: ElementRef; + + server: Server; + project: Project; + drawing: Drawing; + element: TextElement; + rotation: string; + + constructor( + private dialogRef: MatDialogRef, + private drawingToMapDrawingConverter: DrawingToMapDrawingConverter, + private mapDrawingToSvgConverter: MapDrawingToSvgConverter, + private drawingService: DrawingService, + private drawingsDataSource: DrawingsDataSource, + private renderer: Renderer2 + ) {} + + ngOnInit() { + this.rotation = this.drawing.rotation.toString(); + + this.element = this.drawing.element as TextElement; + this.renderer.setStyle(this.textArea.nativeElement, 'color', this.element.fill); + this.renderer.setStyle(this.textArea.nativeElement, 'font-family', this.element.font_family); + this.renderer.setStyle(this.textArea.nativeElement, 'font-size', `${this.element.font_size}pt`); + this.renderer.setStyle(this.textArea.nativeElement, 'font-weight', this.element.font_weight); + } + + onNoClick() { + this.dialogRef.close(); + } + + onYesClick() { + this.drawing.rotation = +this.rotation; + this.drawing.element = this.element; + + let mapDrawing = this.drawingToMapDrawingConverter.convert(this.drawing); + mapDrawing.element = this.drawing.element; + + this.drawing.svg = this.mapDrawingToSvgConverter.convert(mapDrawing); + + this.drawingService.update(this.server, this.drawing).subscribe((serverDrawing: Drawing) => { + this.drawingsDataSource.update(serverDrawing); + this.dialogRef.close(); + }); + } + + changeTextColor(changedColor) { + this.renderer.setStyle(this.textArea.nativeElement, 'color', changedColor); + } +} diff --git a/src/app/components/project-map/node-context-menu/actions/move-layer-down-action/move-layer-down-action.component.ts b/src/app/components/project-map/node-context-menu/actions/move-layer-down-action/move-layer-down-action.component.ts deleted file mode 100644 index 709e080e..00000000 --- a/src/app/components/project-map/node-context-menu/actions/move-layer-down-action/move-layer-down-action.component.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { Component, OnInit, Input } from '@angular/core'; -import { Server } from '../../../../../models/server'; -import { Node } from '../../../../../cartography/models/node'; -import { NodesDataSource } from '../../../../../cartography/datasources/nodes-datasource'; -import { NodeService } from '../../../../../services/node.service'; - -@Component({ - selector: 'app-move-layer-down-action', - templateUrl: './move-layer-down-action.component.html' -}) -export class MoveLayerDownActionComponent implements OnInit { - @Input() server: Server; - @Input() node: Node; - - constructor( - private nodesDataSource: NodesDataSource, - private nodeService: NodeService - ) { } - - ngOnInit() {} - - moveLayerDown() { - this.node.z--; - this.nodesDataSource.update(this.node); - this.nodeService - .update(this.server, this.node) - .subscribe((node: Node) => {}); - } -} diff --git a/src/app/components/project-map/node-context-menu/actions/move-layer-up-action/move-layer-up-action.component.ts b/src/app/components/project-map/node-context-menu/actions/move-layer-up-action/move-layer-up-action.component.ts deleted file mode 100644 index 5e51e937..00000000 --- a/src/app/components/project-map/node-context-menu/actions/move-layer-up-action/move-layer-up-action.component.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { Component, OnInit, Input } from '@angular/core'; -import { Server } from '../../../../../models/server'; -import { Node } from '../../../../../cartography/models/node'; -import { NodesDataSource } from '../../../../../cartography/datasources/nodes-datasource'; -import { NodeService } from '../../../../../services/node.service'; - -@Component({ - selector: 'app-move-layer-up-action', - templateUrl: './move-layer-up-action.component.html' -}) -export class MoveLayerUpActionComponent implements OnInit { - @Input() server: Server; - @Input() node: Node; - - constructor( - private nodesDataSource: NodesDataSource, - private nodeService: NodeService - ) { } - - ngOnInit() {} - - moveLayerUp() { - this.node.z++; - this.nodesDataSource.update(this.node); - this.nodeService - .update(this.server, this.node) - .subscribe((node: Node) => {}); - } -} diff --git a/src/app/components/project-map/node-context-menu/actions/start-node-action/start-node-action.component.html b/src/app/components/project-map/node-context-menu/actions/start-node-action/start-node-action.component.html deleted file mode 100644 index f3acc224..00000000 --- a/src/app/components/project-map/node-context-menu/actions/start-node-action/start-node-action.component.html +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/src/app/components/project-map/node-context-menu/actions/start-node-action/start-node-action.component.ts b/src/app/components/project-map/node-context-menu/actions/start-node-action/start-node-action.component.ts deleted file mode 100644 index cd8b6911..00000000 --- a/src/app/components/project-map/node-context-menu/actions/start-node-action/start-node-action.component.ts +++ /dev/null @@ -1,27 +0,0 @@ -import {Component, Input, OnInit} from '@angular/core'; -import {Server} from "../../../../../models/server"; -import {NodeService} from "../../../../../services/node.service"; -import {Node} from "../../../../../cartography/models/node"; - - -@Component({ - selector: 'app-start-node-action', - templateUrl: './start-node-action.component.html', -}) -export class StartNodeActionComponent implements OnInit { - @Input() server: Server; - @Input() node: Node; - - constructor(private nodeService: NodeService) { } - - ngOnInit() {} - - startNode() { - this.nodeService - .start(this.server, this.node) - .subscribe((n: Node) => { - - }); - } - -} diff --git a/src/app/components/project-map/node-context-menu/actions/stop-node-action/stop-node-action.component.html b/src/app/components/project-map/node-context-menu/actions/stop-node-action/stop-node-action.component.html deleted file mode 100644 index 47f4016e..00000000 --- a/src/app/components/project-map/node-context-menu/actions/stop-node-action/stop-node-action.component.html +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/src/app/components/project-map/node-context-menu/actions/stop-node-action/stop-node-action.component.ts b/src/app/components/project-map/node-context-menu/actions/stop-node-action/stop-node-action.component.ts deleted file mode 100644 index 2edd306b..00000000 --- a/src/app/components/project-map/node-context-menu/actions/stop-node-action/stop-node-action.component.ts +++ /dev/null @@ -1,27 +0,0 @@ -import {Component, Input, OnInit} from '@angular/core'; -import {Server} from "../../../../../models/server"; -import {NodeService} from "../../../../../services/node.service"; -import {Node} from "../../../../../cartography/models/node"; - - -@Component({ - selector: 'app-stop-node-action', - templateUrl: './stop-node-action.component.html' -}) -export class StopNodeActionComponent implements OnInit { - @Input() server: Server; - @Input() node: Node; - - constructor(private nodeService: NodeService) { } - - ngOnInit() { - } - - stopNode() { - this.nodeService - .stop(this.server, this.node) - .subscribe((n: Node) => { - - }); - } -} diff --git a/src/app/components/project-map/node-context-menu/node-context-menu.component.html b/src/app/components/project-map/node-context-menu/node-context-menu.component.html deleted file mode 100644 index f6822c71..00000000 --- a/src/app/components/project-map/node-context-menu/node-context-menu.component.html +++ /dev/null @@ -1,9 +0,0 @@ -
- - - - - - - -
diff --git a/src/app/components/project-map/node-context-menu/node-context-menu.component.spec.ts b/src/app/components/project-map/node-context-menu/node-context-menu.component.spec.ts deleted file mode 100644 index e7d14829..00000000 --- a/src/app/components/project-map/node-context-menu/node-context-menu.component.spec.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; - -import { NodeContextMenuComponent } from './node-context-menu.component'; - -describe('NodeContextMenuComponent', () => { - let component: NodeContextMenuComponent; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - declarations: [ NodeContextMenuComponent ] - }) - .compileComponents(); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(NodeContextMenuComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - // it('should create', () => { - // expect(component).toBeTruthy(); - // }); -}); diff --git a/src/app/components/project-map/node-context-menu/node-context-menu.component.ts b/src/app/components/project-map/node-context-menu/node-context-menu.component.ts deleted file mode 100644 index ba89c12d..00000000 --- a/src/app/components/project-map/node-context-menu/node-context-menu.component.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { ChangeDetectorRef, Component, Input, OnInit, ViewChild } from '@angular/core'; -import { MatMenuTrigger } from "@angular/material"; -import { DomSanitizer } from "@angular/platform-browser"; -import { Node } from "../../../cartography/models/node"; -import { Server } from "../../../models/server"; -import { Project } from "../../../models/project"; -import { ProjectService } from "../../../services/project.service"; - - -@Component({ - selector: 'app-node-context-menu', - templateUrl: './node-context-menu.component.html', - styleUrls: ['./node-context-menu.component.scss'] -}) -export class NodeContextMenuComponent implements OnInit { - @Input() project: Project; - @Input() server: Server; - - @ViewChild(MatMenuTrigger) contextMenu: MatMenuTrigger; - - topPosition; - leftPosition; - node: Node; - - constructor( - private sanitizer: DomSanitizer, - private changeDetector: ChangeDetectorRef, - protected projectService: ProjectService) {} - - 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(); - } - -} diff --git a/src/app/components/project-map/node-select-interface/node-select-interface.component.html b/src/app/components/project-map/node-select-interface/node-select-interface.component.html index 8900bba8..b4321348 100644 --- a/src/app/components/project-map/node-select-interface/node-select-interface.component.html +++ b/src/app/components/project-map/node-select-interface/node-select-interface.component.html @@ -1,9 +1,9 @@
- +
diff --git a/src/app/components/project-map/node-select-interface/node-select-interface.component.spec.ts b/src/app/components/project-map/node-select-interface/node-select-interface.component.spec.ts index 0cbf962f..9a7116ff 100644 --- a/src/app/components/project-map/node-select-interface/node-select-interface.component.spec.ts +++ b/src/app/components/project-map/node-select-interface/node-select-interface.component.spec.ts @@ -8,9 +8,8 @@ describe('NodeSelectInterfaceComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ - declarations: [ NodeSelectInterfaceComponent ] - }) - .compileComponents(); + declarations: [NodeSelectInterfaceComponent] + }).compileComponents(); })); beforeEach(() => { diff --git a/src/app/components/project-map/node-select-interface/node-select-interface.component.ts b/src/app/components/project-map/node-select-interface/node-select-interface.component.ts index 708874c5..fd5daace 100644 --- a/src/app/components/project-map/node-select-interface/node-select-interface.component.ts +++ b/src/app/components/project-map/node-select-interface/node-select-interface.component.ts @@ -1,9 +1,8 @@ -import {ChangeDetectorRef, Component, EventEmitter, Input, OnInit, Output, ViewChild} from '@angular/core'; -import {MatMenuTrigger} from "@angular/material"; -import {DomSanitizer} from "@angular/platform-browser"; -import {Node} from "../../../cartography/models/node"; -import {Port} from "../../../models/port"; - +import { ChangeDetectorRef, Component, EventEmitter, Input, OnInit, Output, ViewChild } from '@angular/core'; +import { MatMenuTrigger } from '@angular/material'; +import { DomSanitizer } from '@angular/platform-browser'; +import { Node } from '../../../cartography/models/node'; +import { Port } from '../../../models/port'; @Component({ selector: 'app-node-select-interface', @@ -19,17 +18,15 @@ export class NodeSelectInterfaceComponent implements OnInit { protected leftPosition; public node: Node; - constructor( - private sanitizer: DomSanitizer, - private changeDetector: ChangeDetectorRef) {} + 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.topPosition = this.sanitizer.bypassSecurityTrustStyle(top + 'px'); + this.leftPosition = this.sanitizer.bypassSecurityTrustStyle(left + 'px'); this.changeDetector.detectChanges(); } @@ -41,8 +38,8 @@ export class NodeSelectInterfaceComponent implements OnInit { public chooseInterface(port: Port) { this.onChooseInterface.emit({ - 'node': this.node, - 'port': port + node: this.node, + port: port }); } } diff --git a/src/app/components/project-map/project-map-shortcuts/project-map-shortcuts.component.spec.ts b/src/app/components/project-map/project-map-shortcuts/project-map-shortcuts.component.spec.ts index 61a1cc1f..2db8b5f7 100644 --- a/src/app/components/project-map/project-map-shortcuts/project-map-shortcuts.component.spec.ts +++ b/src/app/components/project-map/project-map-shortcuts/project-map-shortcuts.component.spec.ts @@ -1,23 +1,23 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { HttpClientTestingModule } from "@angular/common/http/testing"; -import { inject } from "@angular/core/testing"; +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { inject } from '@angular/core/testing'; -import { mock, instance, capture, when, anything } from "ts-mockito"; -import { HotkeyModule, HotkeysService, Hotkey } from "angular2-hotkeys"; -import { of } from "rxjs"; +import { mock, instance, capture, when, anything } from 'ts-mockito'; +import { HotkeyModule, HotkeysService, Hotkey } from 'angular2-hotkeys'; +import { of } from 'rxjs'; import { ProjectMapShortcutsComponent } from './project-map-shortcuts.component'; -import { ToasterService, } from "../../../services/toaster.service"; -import { NodeService } from "../../../services/node.service"; -import { HttpServer } from "../../../services/http-server.service"; -import { SelectionManager } from "../../../cartography/managers/selection-manager"; -import { Server } from "../../../models/server"; -import { Project } from "../../../models/project"; -import { ProjectService } from "../../../services/project.service"; -import { MockedProjectService } from "../../../services/project.service.spec"; -import { SettingsService } from "../../../services/settings.service"; -import { MockedToasterService } from "../../../services/toaster.service.spec"; -import { mapTo } from "rxjs/internal/operators"; +import { ToasterService } from '../../../services/toaster.service'; +import { NodeService } from '../../../services/node.service'; +import { HttpServer } from '../../../services/http-server.service'; +import { SelectionManager } from '../../../cartography/managers/selection-manager'; +import { Server } from '../../../models/server'; +import { Project } from '../../../models/project'; +import { ProjectService } from '../../../services/project.service'; +import { MockedProjectService } from '../../../services/project.service.spec'; +import { SettingsService } from '../../../services/settings.service'; +import { MockedToasterService } from '../../../services/toaster.service.spec'; +import { mapTo } from 'rxjs/internal/operators'; import { MapNodeToNodeConverter } from '../../../cartography/converters/map/map-node-to-node-converter'; import { MapNode } from '../../../cartography/models/map/map-node'; import { MapLabelToLabelConverter } from '../../../cartography/converters/map/map-label-to-label-converter'; @@ -27,7 +27,6 @@ import { FontBBoxCalculator } from '../../../cartography/helpers/font-bbox-calcu import { CssFixer } from '../../../cartography/helpers/css-fixer'; import { FontFixer } from '../../../cartography/helpers/font-fixer'; - describe('ProjectMapShortcutsComponent', () => { let component: ProjectMapShortcutsComponent; let fixture: ComponentFixture; @@ -45,17 +44,14 @@ describe('ProjectMapShortcutsComponent', () => { hotkeyServiceMock = mock(HotkeysService); hotkeyServiceInstanceMock = instance(hotkeyServiceMock); TestBed.configureTestingModule({ - imports: [ - HotkeyModule.forRoot(), - HttpClientTestingModule - ], + imports: [HotkeyModule.forRoot(), HttpClientTestingModule], providers: [ HttpServer, { provide: NodeService, useFactory: () => instance(nodeServiceMock) }, { provide: HotkeysService, useFactory: () => hotkeyServiceInstanceMock }, { provide: ToasterService, useClass: MockedToasterService }, { provide: ProjectService, useClass: MockedProjectService }, - { provide: SelectionManager, useValue: instance(selectionManagerMock)}, + { provide: SelectionManager, useValue: instance(selectionManagerMock) }, SettingsService, MapNodeToNodeConverter, MapLabelToLabelConverter, @@ -65,9 +61,8 @@ describe('ProjectMapShortcutsComponent', () => { CssFixer, FontFixer ], - declarations: [ ProjectMapShortcutsComponent ] - }) - .compileComponents(); + declarations: [ProjectMapShortcutsComponent] + }).compileComponents(); })); beforeEach(() => { @@ -83,14 +78,14 @@ describe('ProjectMapShortcutsComponent', () => { it('should bind delete key', () => { component.ngOnInit(); const [hotkey] = capture(hotkeyServiceMock.add).last(); - expect((hotkey as Hotkey).combo).toEqual([ 'del' ]); + expect((hotkey as Hotkey).combo).toEqual(['del']); expect((hotkey as Hotkey).callback).toBeDefined(); }); it('should remove binding', () => { component.ngOnDestroy(); const [hotkey] = capture(hotkeyServiceMock.remove).last(); - expect((hotkey as Hotkey).combo).toEqual([ 'del' ]); + expect((hotkey as Hotkey).combo).toEqual(['del']); }); describe('onDeleteHandler', () => { @@ -98,8 +93,7 @@ describe('ProjectMapShortcutsComponent', () => { const server = new Server(); const project = new Project(); - when(nodeServiceMock.delete(server, anything())) - .thenReturn(of(new Node()).pipe(mapTo(null))); + when(nodeServiceMock.delete(server, anything())).thenReturn(of(new Node()).pipe(mapTo(null))); component.project = project; component.server = server; @@ -108,7 +102,7 @@ describe('ProjectMapShortcutsComponent', () => { it('should handle delete', inject([ToasterService], (toaster: MockedToasterService) => { component.project.readonly = false; component.onDeleteHandler(null); - expect(toaster.successes).toEqual(["Node has been deleted"]); + expect(toaster.successes).toEqual(['Node has been deleted']); })); it('should not delete when project in readonly mode', inject([ToasterService], (toaster: MockedToasterService) => { @@ -117,5 +111,4 @@ describe('ProjectMapShortcutsComponent', () => { expect(toaster.successes).toEqual([]); })); }); - }); diff --git a/src/app/components/project-map/project-map-shortcuts/project-map-shortcuts.component.ts b/src/app/components/project-map/project-map-shortcuts/project-map-shortcuts.component.ts index ab372d90..9c47bfa3 100644 --- a/src/app/components/project-map/project-map-shortcuts/project-map-shortcuts.component.ts +++ b/src/app/components/project-map/project-map-shortcuts/project-map-shortcuts.component.ts @@ -5,12 +5,11 @@ import { SelectionManager } from '../../../cartography/managers/selection-manage import { NodeService } from '../../../services/node.service'; import { Server } from '../../../models/server'; import { ToasterService } from '../../../services/toaster.service'; -import { Project } from "../../../models/project"; -import { ProjectService } from "../../../services/project.service"; +import { Project } from '../../../models/project'; +import { ProjectService } from '../../../services/project.service'; import { MapNode } from '../../../cartography/models/map/map-node'; import { MapNodeToNodeConverter } from '../../../cartography/converters/map/map-node-to-node-converter'; - @Component({ selector: 'app-project-map-shortcuts', template: '' @@ -28,7 +27,7 @@ export class ProjectMapShortcutsComponent implements OnInit, OnDestroy { private projectService: ProjectService, private mapNodeToNode: MapNodeToNodeConverter, private selectionManager: SelectionManager - ) { } + ) {} ngOnInit() { const self = this; @@ -42,12 +41,14 @@ export class ProjectMapShortcutsComponent implements OnInit, OnDestroy { if (!this.projectService.isReadOnly(this.project)) { const selected = this.selectionManager.getSelected(); - selected.filter((item) => item instanceof MapNode).forEach((item: MapNode) => { - const node = this.mapNodeToNode.convert(item); - this.nodesService.delete(this.server, node).subscribe(data => { - this.toaster.success("Node has been deleted"); + selected + .filter(item => item instanceof MapNode) + .forEach((item: MapNode) => { + const node = this.mapNodeToNode.convert(item); + this.nodesService.delete(this.server, node).subscribe(data => { + this.toaster.success('Node has been deleted'); + }); }); - }); } return false; } diff --git a/src/app/components/project-map/project-map.component.html b/src/app/components/project-map/project-map.component.html index ef924b61..60b1f51e 100644 --- a/src/app/components/project-map/project-map.component.html +++ b/src/app/components/project-map/project-map.component.html @@ -32,11 +32,8 @@
- - + @@ -51,86 +48,92 @@ - +
- - Show interface labels + + Show interface labels
- - - - - + + - - + + -
-
- +
+
- - +
- - + @@ -138,7 +141,8 @@ [server]="server" [project]="project" [selectedDrawing]="selectedDrawing" - (drawingSaved)="onDrawingSaved()"> + (drawingSaved)="onDrawingSaved()" +> @@ -146,9 +150,5 @@ - - + diff --git a/src/app/components/project-map/project-map.component.scss b/src/app/components/project-map/project-map.component.scss index 4b4565ab..034018b2 100644 --- a/src/app/components/project-map/project-map.component.scss +++ b/src/app/components/project-map/project-map.component.scss @@ -1,9 +1,12 @@ -app-root, app-project-map, .project-map, app-map { +app-root, +app-project-map, +.project-map, +app-map { width: auto; } svg.map { - background-color: #F0F0F0; + background-color: #f0f0f0; } g.node:hover { @@ -23,12 +26,12 @@ g.node:hover { background: transparent; top: 20px; left: 92px; - background:#263238; + background: #263238; height: 72px; padding-top: 16px; .arrow-button { - outline: 0!important; + outline: 0 !important; } } @@ -41,7 +44,7 @@ g.node:hover { background: transparent; top: 20px; left: 92px; - background:#263238; + background: #263238; height: 72px; padding-top: 16px; padding-bottom: 16px; @@ -52,12 +55,12 @@ g.node:hover { box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19); .menu-button { - outline: 0!important; + outline: 0 !important; transition: 0.5s; margin-bottom: 16px; width: 40px; - margin-right: 12px!important; - margin-left: 12px!important; + margin-right: 12px !important; + margin-left: 12px !important; background: #263238; padding: 0; border: none; @@ -65,14 +68,14 @@ g.node:hover { } .arrow-button { - outline: 0!important; + outline: 0 !important; transition: 0.5s; margin-bottom: 16px; } } .extended { - width: 296px!important; + width: 296px !important; height: 100%; overflow: hidden; } @@ -100,23 +103,25 @@ g.node:hover { position: absolute; top: 50%; width: 100px; - margin-left:-50px; + margin-left: -50px; margin-top: -50px; left: 50%; } line.selected { - stroke: #0097a7!important; + stroke: #0097a7 !important; } -svg.map image:hover, svg.map image.chosen, g.selected { +svg.map image:hover, +svg.map image.chosen, +g.selected { -webkit-filter: grayscale(100%); -moz-filter: grayscale(100%); -ms-filter: grayscale(100%); -o-filter: grayscale(100%); filter: grayscale(100%); filter: gray; - filter: url("#grayscale"); /* Chrome doesn't support CSS filters on SVG */ + filter: url('#grayscale'); /* Chrome doesn't support CSS filters on SVG */ } path.selected { @@ -130,14 +135,13 @@ path.selected { .selection-line-tool .selection { fill: #7ccbe1; - stroke: #66aec2 ; + stroke: #66aec2; fill-opacity: 0.3; stroke-opacity: 0.7; stroke-width: 1; stroke-dasharray: 5, 5; } - g.node text, .noselect { -webkit-touch-callout: none; @@ -152,13 +156,12 @@ g.node text, .project-toolbar button { outline: 0; border: none; - -moz-outline-style: none + -moz-outline-style: none; } .options-item { padding-left: 15px; padding-right: 15px; - } .context-menu-items .mat-menu-item { @@ -175,4 +178,4 @@ g.node text, .context-menu-items .mat-menu-item:focus { background: none; -} \ No newline at end of file +} diff --git a/src/app/components/project-map/project-map.component.spec.ts b/src/app/components/project-map/project-map.component.spec.ts index e026dcdb..25874c7c 100644 --- a/src/app/components/project-map/project-map.component.spec.ts +++ b/src/app/components/project-map/project-map.component.spec.ts @@ -31,6 +31,11 @@ import { of } from 'rxjs'; import { Server } from '../../models/server'; import { Node } from '../../cartography/models/node'; import { ToolsService } from '../../services/tools.service'; +import { DrawingsWidget } from '../../cartography/widgets/drawings'; +import { MapDrawingToDrawingConverter } from '../../cartography/converters/map/map-drawing-to-drawing-converter'; +import { MapLabelToLabelConverter } from '../../cartography/converters/map/map-label-to-label-converter'; +import { SelectionManager } from '../../cartography/managers/selection-manager'; +import { SelectionTool } from '../../cartography/tools/selection-tool'; export class MockedProgressService { public activate() {} @@ -53,23 +58,23 @@ export class MockedDrawingService { public drawing = {} as Drawing; constructor() {} - add(_server: Server, _project_id:string, _x: number, _y:number, _svg: string) { + add(_server: Server, _project_id: string, _x: number, _y: number, _svg: string) { return of(this.drawing); } - updatePosition(_server: Server, _drawing: Drawing, _x: number, _y: number){ + updatePosition(_server: Server, _drawing: Drawing, _x: number, _y: number) { return of(this.drawing); } - updateSizeAndPosition(_server: Server, _drawing: Drawing, _x: number, _y: number, _svg: string){ + updateSizeAndPosition(_server: Server, _drawing: Drawing, _x: number, _y: number, _svg: string) { return of(this.drawing); } - update(_server: Server, _drawing: Drawing){ + update(_server: Server, _drawing: Drawing) { return of(this.drawing); } - delete(_server: Server, _drawing: Drawing){ + delete(_server: Server, _drawing: Drawing) { return of(this.drawing); } @@ -85,7 +90,7 @@ export class MockedLinkService { return of({}); } - updateNodes(){ + updateNodes() { return of({}); } } @@ -93,63 +98,62 @@ export class MockedLinkService { export class MockedDrawingsDataSource { add() {} - get() { return of({})} + get() { + return of({}); + } - update() { return of({})} + update() { + return of({}); + } } export class MockedNodesDataSource { add() {} - get() { return of({})} + get() { + return of({}); + } - update() { return of({})} + update() { + return of({}); + } } describe('ProjectMapComponent', () => { let component: ProjectMapComponent; let fixture: ComponentFixture; - let drawingService = new MockedDrawingService; - let drawingsDataSource = new MockedDrawingsDataSource; + let drawingService = new MockedDrawingService(); + let drawingsDataSource = new MockedDrawingsDataSource(); beforeEach(async(() => { TestBed.configureTestingModule({ - imports: [ - MatIconModule, - MatToolbarModule, - MatMenuModule, - MatCheckboxModule, - CommonModule, - NoopAnimationsModule - ], + imports: [MatIconModule, MatToolbarModule, MatMenuModule, MatCheckboxModule, CommonModule, NoopAnimationsModule], providers: [ { provide: ActivatedRoute }, { provide: ServerService, useClass: MockedServerService }, { provide: ProjectService, useClass: MockedProjectService }, { provide: NodeService }, { provide: LinkService }, - { provide: DrawingService, useValue: drawingService}, + { provide: DrawingService, useValue: drawingService }, { provide: ProgressService, useClass: MockedProgressService }, { provide: ProjectWebServiceHandler }, { provide: MapChangeDetectorRef }, { provide: NodeWidget }, + { provide: DrawingsWidget }, { provide: MapNodeToNodeConverter }, + { provide: MapDrawingToDrawingConverter }, + { provide: MapLabelToLabelConverter }, { provide: NodesDataSource }, { provide: LinksDataSource }, - { provide: DrawingsDataSource, useValue: drawingsDataSource}, + { provide: DrawingsDataSource, useValue: drawingsDataSource }, { provide: SettingsService, useClass: MockedSettingsService }, - { provide: ToolsService } + { provide: ToolsService }, + { provide: SelectionManager }, + { provide: SelectionTool } ], - declarations: [ - ProjectMapComponent, - D3MapComponent, - ...ANGULAR_MAP_DECLARATIONS - ], - schemas: [ - NO_ERRORS_SCHEMA - ] - }) - .compileComponents(); + declarations: [ProjectMapComponent, D3MapComponent, ...ANGULAR_MAP_DECLARATIONS], + schemas: [NO_ERRORS_SCHEMA] + }).compileComponents(); })); beforeEach(() => { @@ -163,7 +167,9 @@ describe('ProjectMapComponent', () => { it('should hide draw tools when hide menu is called', () => { var dummyElement = document.createElement('map'); - document.getElementsByClassName = jasmine.createSpy('HTML element').and.callFake(() => { return ([dummyElement])}); + document.getElementsByClassName = jasmine.createSpy('HTML element').and.callFake(() => { + return [dummyElement]; + }); spyOn(component, 'resetDrawToolChoice'); component.hideMenu(); diff --git a/src/app/components/project-map/project-map.component.ts b/src/app/components/project-map/project-map.component.ts index 542cee36..06a79792 100644 --- a/src/app/components/project-map/project-map.component.ts +++ b/src/app/components/project-map/project-map.component.ts @@ -2,40 +2,50 @@ import { Component, OnDestroy, OnInit, ViewChild, ViewEncapsulation } from '@ang import { ActivatedRoute, ParamMap } from '@angular/router'; import { Observable, Subject, Subscription, from } from 'rxjs'; -import { webSocket } from "rxjs/webSocket"; -import { map, mergeMap } from "rxjs/operators"; +import { webSocket } from 'rxjs/webSocket'; +import { map, mergeMap } from 'rxjs/operators'; import { Project } from '../../models/project'; import { Node } from '../../cartography/models/node'; -import { Link } from "../../models/link"; -import { ServerService } from "../../services/server.service"; +import { Link } from '../../models/link'; +import { ServerService } from '../../services/server.service'; import { ProjectService } from '../../services/project.service'; -import { Server } from "../../models/server"; -import { Drawing } from "../../cartography/models/drawing"; -import { NodeContextMenuComponent } from "./node-context-menu/node-context-menu.component"; -import { Template } from "../../models/template"; -import { NodeService } from "../../services/node.service"; -import { Symbol } from "../../models/symbol"; -import { NodesDataSource } from "../../cartography/datasources/nodes-datasource"; -import { LinksDataSource } from "../../cartography/datasources/links-datasource"; -import { ProjectWebServiceHandler } from "../../handlers/project-web-service-handler"; -import { DrawingsDataSource } from "../../cartography/datasources/drawings-datasource"; -import { ProgressService } from "../../common/progress/progress.service"; +import { Server } from '../../models/server'; +import { Drawing } from '../../cartography/models/drawing'; +import { ContextMenuComponent } from './context-menu/context-menu.component'; +import { Template } from '../../models/template'; +import { NodeService } from '../../services/node.service'; +import { Symbol } from '../../models/symbol'; +import { NodesDataSource } from '../../cartography/datasources/nodes-datasource'; +import { LinksDataSource } from '../../cartography/datasources/links-datasource'; +import { ProjectWebServiceHandler } from '../../handlers/project-web-service-handler'; +import { DrawingsDataSource } from '../../cartography/datasources/drawings-datasource'; +import { ProgressService } from '../../common/progress/progress.service'; import { MapChangeDetectorRef } from '../../cartography/services/map-change-detector-ref'; import { NodeContextMenu } from '../../cartography/events/nodes'; import { NodeWidget } from '../../cartography/widgets/node'; +import { DrawingsWidget } from '../../cartography/widgets/drawings'; import { DrawingService } from '../../services/drawing.service'; import { MapNodeToNodeConverter } from '../../cartography/converters/map/map-node-to-node-converter'; import { SettingsService, Settings } from '../../services/settings.service'; import { D3MapComponent } from '../../cartography/components/d3-map/d3-map.component'; import { ToolsService } from '../../services/tools.service'; +import { DrawingContextMenu } from '../../cartography/events/event-source'; +import { MapDrawingToDrawingConverter } from '../../cartography/converters/map/map-drawing-to-drawing-converter'; +import { SelectionManager } from '../../cartography/managers/selection-manager'; +import { SelectionTool } from '../../cartography/tools/selection-tool'; +import { MapDrawing } from '../../cartography/models/map/map-drawing'; +import { MapLabel } from '../../cartography/models/map/map-label'; +import { Label } from '../../cartography/models/label'; +import { MapNode } from '../../cartography/models/map/map-node'; +import { MapLabelToLabelConverter } from '../../cartography/converters/map/map-label-to-label-converter'; @Component({ selector: 'app-project-map', encapsulation: ViewEncapsulation.None, templateUrl: './project-map.component.html', - styleUrls: ['./project-map.component.scss'], + styleUrls: ['./project-map.component.scss'] }) export class ProjectMapComponent implements OnInit, OnDestroy { public nodes: Node[] = []; @@ -48,25 +58,25 @@ export class ProjectMapComponent implements OnInit, OnDestroy { private ws: Subject; tools = { - 'selection': true, - 'moving': false, - 'draw_link': false, - 'text_editing': true + selection: true, + moving: false, + draw_link: false, + text_editing: true }; protected settings: Settings; protected drawTools = { - 'isRectangleChosen': false, - 'isEllipseChosen': false, - 'isLineChosen': false, - 'isTextChosen': false, - 'visibility': false + isRectangleChosen: false, + isEllipseChosen: false, + isLineChosen: false, + isTextChosen: false, + visibility: false }; private inReadOnlyMode = false; - @ViewChild(NodeContextMenuComponent) nodeContextMenu: NodeContextMenuComponent; + @ViewChild(ContextMenuComponent) contextMenu: ContextMenuComponent; @ViewChild(D3MapComponent) mapChild: D3MapComponent; private subscriptions: Subscription[] = []; @@ -81,48 +91,59 @@ export class ProjectMapComponent implements OnInit, OnDestroy { private projectWebServiceHandler: ProjectWebServiceHandler, private mapChangeDetectorRef: MapChangeDetectorRef, private nodeWidget: NodeWidget, + private drawingsWidget: DrawingsWidget, private mapNodeToNode: MapNodeToNodeConverter, + private mapDrawingToDrawing: MapDrawingToDrawingConverter, + private mapLabelToLabel: MapLabelToLabelConverter, private nodesDataSource: NodesDataSource, private linksDataSource: LinksDataSource, private drawingsDataSource: DrawingsDataSource, private settingsService: SettingsService, - private toolsService: ToolsService + private toolsService: ToolsService, + private selectionManager: SelectionManager, + private selectionTool: SelectionTool ) {} ngOnInit() { this.settings = this.settingsService.getAll(); - + this.progressService.activate(); const routeSub = this.route.paramMap.subscribe((paramMap: ParamMap) => { const server_id = parseInt(paramMap.get('server_id'), 10); - from(this.serverService.get(server_id)).pipe( - mergeMap((server: Server) => { - this.server = server; - return this.projectService.get(server, paramMap.get('project_id')).pipe(map((project) => { - return project; - })); - }), - mergeMap((project: Project) => { - this.project = project; + from(this.serverService.get(server_id)) + .pipe( + mergeMap((server: Server) => { + this.server = server; + return this.projectService.get(server, paramMap.get('project_id')).pipe( + map(project => { + return project; + }) + ); + }), + mergeMap((project: Project) => { + this.project = project; - if (this.project.status === 'opened') { - return new Observable((observer) => { - observer.next(this.project); - }); - } else { - return this.projectService.open( - this.server, this.project.project_id); + if (this.project.status === 'opened') { + return new Observable(observer => { + observer.next(this.project); + }); + } else { + return this.projectService.open(this.server, this.project.project_id); + } + }) + ) + .subscribe( + (project: Project) => { + this.onProjectLoad(project); + }, + error => { + this.progressService.setError(error); + }, + () => { + this.progressService.deactivate(); } - }) - ) - .subscribe((project: Project) => { - this.onProjectLoad(project); - }, (error) => { - this.progressService.setError(error); - }, () => { - this.progressService.deactivate(); - }); + ); }); this.subscriptions.push(routeSub); @@ -180,41 +201,62 @@ export class ProjectMapComponent implements OnInit, OnDestroy { } setUpWS(project: Project) { - this.ws = webSocket( - this.projectService.notificationsPath(this.server, project.project_id)); + this.ws = webSocket(this.projectService.notificationsPath(this.server, project.project_id)); - this.subscriptions.push( - this.projectWebServiceHandler.connect(this.ws) - ); + this.subscriptions.push(this.projectWebServiceHandler.connect(this.ws)); } setUpMapCallbacks() { - const onContextMenu = this.nodeWidget.onContextMenu.subscribe((eventNode: NodeContextMenu) => { + if (!this.readonly) { + this.toolsService.selectionToolActivation(true); + } + + const onNodeContextMenu = this.nodeWidget.onContextMenu.subscribe((eventNode: NodeContextMenu) => { const node = this.mapNodeToNode.convert(eventNode.node); - this.nodeContextMenu.open( - node, - eventNode.event.clientY, - eventNode.event.clientX - ); + this.contextMenu.openMenuForNode(node, eventNode.event.clientY, eventNode.event.clientX); }); + const onDrawingContextMenu = this.drawingsWidget.onContextMenu.subscribe((eventDrawing: DrawingContextMenu) => { + const drawing = this.mapDrawingToDrawing.convert(eventDrawing.drawing); + this.contextMenu.openMenuForDrawing(drawing, eventDrawing.event.clientY, eventDrawing.event.clientX); + }); + + const onContextMenu = this.selectionTool.contextMenuOpened.subscribe((event) => { + const selectedItems = this.selectionManager.getSelected(); + if (selectedItems.length === 0 || !(event instanceof MouseEvent)) return; + + let drawings: Drawing[] = []; + let nodes: Node[] = []; + let labels: Label[] = []; + + selectedItems.forEach((elem) => { + if (elem instanceof MapDrawing) { + drawings.push(this.mapDrawingToDrawing.convert(elem)); + } else if (elem instanceof MapNode) { + nodes.push(this.mapNodeToNode.convert(elem)); + } else if (elem instanceof MapLabel) { + labels.push(this.mapLabelToLabel.convert(elem)); + } + }); + + this.contextMenu.openMenuForListOfElements(drawings, nodes, labels, event.clientY, event.clientX); + }); + + this.subscriptions.push(onNodeContextMenu); + this.subscriptions.push(onDrawingContextMenu); this.subscriptions.push(onContextMenu); this.mapChangeDetectorRef.detectChanges(); } onNodeCreation(template: Template) { - this.nodeService - .createFromTemplate(this.server, this.project, template, 0, 0, 'local') - .subscribe(() => { - this.projectService - .nodes(this.server, this.project.project_id) - .subscribe((nodes: Node[]) => { - this.nodesDataSource.set(nodes); - }); - }); + this.nodeService.createFromTemplate(this.server, this.project, template, 0, 0, 'local').subscribe(() => { + this.projectService.nodes(this.server, this.project.project_id).subscribe((nodes: Node[]) => { + this.nodesDataSource.set(nodes); + }); + }); } - public onDrawingSaved(){ + public onDrawingSaved() { this.resetDrawToolChoice(); } @@ -253,25 +295,25 @@ export class ProjectMapComponent implements OnInit, OnDestroy { public addDrawing(selectedObject: string) { switch (selectedObject) { - case "rectangle": + case 'rectangle': this.drawTools.isTextChosen = false; this.drawTools.isEllipseChosen = false; this.drawTools.isRectangleChosen = !this.drawTools.isRectangleChosen; this.drawTools.isLineChosen = false; break; - case "ellipse": + case 'ellipse': this.drawTools.isTextChosen = false; this.drawTools.isEllipseChosen = !this.drawTools.isEllipseChosen; this.drawTools.isRectangleChosen = false; this.drawTools.isLineChosen = false; break; - case "line": + case 'line': this.drawTools.isTextChosen = false; this.drawTools.isEllipseChosen = false; this.drawTools.isRectangleChosen = false; this.drawTools.isLineChosen = !this.drawTools.isLineChosen; break; - case "text": + case 'text': this.drawTools.isTextChosen = !this.drawTools.isTextChosen; this.drawTools.isEllipseChosen = false; this.drawTools.isRectangleChosen = false; @@ -280,7 +322,7 @@ export class ProjectMapComponent implements OnInit, OnDestroy { break; } - this.selectedDrawing = this.selectedDrawing === selectedObject ? "" : selectedObject; + this.selectedDrawing = this.selectedDrawing === selectedObject ? '' : selectedObject; } public resetDrawToolChoice() { @@ -288,20 +330,17 @@ export class ProjectMapComponent implements OnInit, OnDestroy { this.drawTools.isEllipseChosen = false; this.drawTools.isLineChosen = false; this.drawTools.isTextChosen = false; - this.selectedDrawing = ""; + this.selectedDrawing = ''; this.toolsService.textAddingToolActivation(this.drawTools.isTextChosen); } - public hideMenu(){ + public hideMenu() { this.resetDrawToolChoice(); this.drawTools.visibility = false; } public showMenu() { - setTimeout(() => { - this.drawTools.visibility = true; - }, - 200); + this.drawTools.visibility = true; } public ngOnDestroy() { @@ -314,5 +353,4 @@ export class ProjectMapComponent implements OnInit, OnDestroy { } this.subscriptions.forEach((subscription: Subscription) => subscription.unsubscribe()); } - } diff --git a/src/app/components/projects/add-blank-project-dialog/add-blank-project-dialog.component.html b/src/app/components/projects/add-blank-project-dialog/add-blank-project-dialog.component.html index 83c83b24..a2e0b14b 100644 --- a/src/app/components/projects/add-blank-project-dialog/add-blank-project-dialog.component.html +++ b/src/app/components/projects/add-blank-project-dialog/add-blank-project-dialog.component.html @@ -1,12 +1,22 @@

Create new project

- - - Project name is required - Project name is incorrect - -
- - -
+ + + Project name is required + Project name is incorrect + +
+ + +
diff --git a/src/app/components/projects/add-blank-project-dialog/add-blank-project-dialog.component.spec.ts b/src/app/components/projects/add-blank-project-dialog/add-blank-project-dialog.component.spec.ts index 800718e0..22ee843e 100644 --- a/src/app/components/projects/add-blank-project-dialog/add-blank-project-dialog.component.spec.ts +++ b/src/app/components/projects/add-blank-project-dialog/add-blank-project-dialog.component.spec.ts @@ -1,8 +1,15 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { AddBlankProjectDialogComponent } from "./add-blank-project-dialog.component"; -import { Server } from "../../../models/server"; +import { AddBlankProjectDialogComponent } from './add-blank-project-dialog.component'; +import { Server } from '../../../models/server'; import { ReactiveFormsModule, FormsModule } from '@angular/forms'; -import { MatDialogModule, MatInputModule, MatFormFieldModule, MatDialogRef, MAT_DIALOG_DATA, MatSnackBarModule } from '@angular/material'; +import { + MatDialogModule, + MatInputModule, + MatFormFieldModule, + MatDialogRef, + MAT_DIALOG_DATA, + MatSnackBarModule +} from '@angular/material'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { ProjectService } from '../../../services/project.service'; import { ToasterService } from '../../../services/toaster.service'; @@ -11,122 +18,127 @@ import { Project } from '../../../models/project'; import { Router } from '@angular/router'; export class MockedProjectService { - public projects: Project[] = [{ - auto_close: false, - auto_open: false, - auto_start: false, - filename: "blank", - name: "blank", - path: "", - project_id: "", - scene_height: 100, - scene_width: 100, - status: "opened", - readonly: false, - show_interface_labels: false, - show_layers: false, - show_grid: false, - snap_to_grid: false, - }]; - - list() { - return of(this.projects); + public projects: Project[] = [ + { + auto_close: false, + auto_open: false, + auto_start: false, + filename: 'blank', + name: 'blank', + path: '', + project_id: '', + scene_height: 100, + scene_width: 100, + status: 'opened', + readonly: false, + show_interface_labels: false, + show_layers: false, + show_grid: false, + snap_to_grid: false } + ]; - add(){ - return of(this.projects.pop); - } + list() { + return of(this.projects); + } + + add() { + return of(this.projects.pop); + } + + isReadOnly(project: Project){ + return false; + } } describe('AddBlankProjectDialogComponent', () => { - let component: AddBlankProjectDialogComponent; - let fixture: ComponentFixture; - let server: Server; - let router = { - navigate: jasmine.createSpy('navigate') - }; - let toaster = { - success: jasmine.createSpy('success') - }; - let dialogRef = { - close: jasmine.createSpy('close') - }; + let component: AddBlankProjectDialogComponent; + let fixture: ComponentFixture; + let server: Server; + let router = { + navigate: jasmine.createSpy('navigate') + }; + let toaster = { + success: jasmine.createSpy('success') + }; + let dialogRef = { + close: jasmine.createSpy('close') + }; - beforeEach(async(() => { - TestBed.configureTestingModule({ - imports: [ - MatDialogModule, - MatFormFieldModule, - MatInputModule, - NoopAnimationsModule, - FormsModule, - ReactiveFormsModule, - MatSnackBarModule - ], - providers: [ - { provide: MatDialogRef, useValue: dialogRef }, - { provide: MAT_DIALOG_DATA }, - { provide: ProjectService, useClass: MockedProjectService }, - { provide: ToasterService, useValue: toaster }, - { provide: Router, useValue: router } - ], - declarations : [AddBlankProjectDialogComponent] - }) - .compileComponents(); + beforeEach(async(() => { + TestBed.configureTestingModule({ + imports: [ + MatDialogModule, + MatFormFieldModule, + MatInputModule, + NoopAnimationsModule, + FormsModule, + ReactiveFormsModule, + MatSnackBarModule + ], + providers: [ + { provide: MatDialogRef, useValue: dialogRef }, + { provide: MAT_DIALOG_DATA }, + { provide: ProjectService, useClass: MockedProjectService }, + { provide: ToasterService, useValue: toaster }, + { provide: Router, useValue: router } + ], + declarations: [AddBlankProjectDialogComponent] + }).compileComponents(); - server = new Server(); - server.ip = "localhost"; - server.port = 80; - })); + server = new Server(); + server.ip = 'localhost'; + server.port = 80; + })); - beforeEach(() => { - fixture = TestBed.createComponent(AddBlankProjectDialogComponent); - component = fixture.componentInstance; - component.server = server; - component.projectNameForm.controls['projectName'].setValue("ValidName"); - fixture.detectChanges(); - }) + beforeEach(() => { + fixture = TestBed.createComponent(AddBlankProjectDialogComponent); + component = fixture.componentInstance; + component.server = server; + component.projectNameForm.controls['projectName'].setValue('ValidName'); + fixture.detectChanges(); + }); - it('should be created', () => { - expect(fixture).toBeDefined(); - expect(component).toBeTruthy(); - }); + it('should be created', () => { + expect(fixture).toBeDefined(); + expect(component).toBeTruthy(); + }); - it('should call adding project when name is valid', () => { - spyOn(component, "addProject"); + it('should call adding project when name is valid', () => { + spyOn(component, 'addProject'); - component.onAddClick(); + component.onAddClick(); - expect(component.addProject).toHaveBeenCalled(); - }); + expect(component.addProject).toHaveBeenCalled(); + }); - it('should sanitize file name input', () => { - component.projectNameForm.controls['projectName'].setValue("[][]"); - fixture.detectChanges(); - spyOn(component, "addProject"); + it('should sanitize file name input', () => { + component.projectNameForm.controls['projectName'].setValue('[][]'); + fixture.detectChanges(); + spyOn(component, 'addProject'); - component.onAddClick(); + component.onAddClick(); - expect(component.addProject).not.toHaveBeenCalled(); - expect(component.projectNameForm.valid).toBeFalsy(); - }); + expect(component.addProject).not.toHaveBeenCalled(); + expect(component.projectNameForm.valid).toBeFalsy(); + }); - it('should open confirmation dialog if project with the same exists', () => { - component.projectNameForm.controls['projectName'].setValue("blank"); - spyOn(component, "openConfirmationDialog"); + it('should open confirmation dialog if project with the same exists', () => { + component.projectNameForm.controls['projectName'].setValue('blank'); + spyOn(component, 'openConfirmationDialog'); - component.onAddClick(); + component.onAddClick(); - expect(component.openConfirmationDialog).toHaveBeenCalled(); - }); + expect(component.openConfirmationDialog).toHaveBeenCalled(); + }); - it('should redirect to newly created project', () => { - component.projectNameForm.controls['projectName'].setValue("validName"); - - component.addProject(); + it('should redirect to newly created project', () => { + component.projectNameForm.controls['projectName'].setValue('validName'); - expect(dialogRef.close).toHaveBeenCalled(); - expect(toaster.success).toHaveBeenCalled(); - expect(router.navigate).toHaveBeenCalled(); - }); + component.addProject(); + + expect(dialogRef.close).toHaveBeenCalled(); + expect(toaster.success).toHaveBeenCalled(); + expect(router.navigate).toHaveBeenCalled(); + }); }); diff --git a/src/app/components/projects/add-blank-project-dialog/add-blank-project-dialog.component.ts b/src/app/components/projects/add-blank-project-dialog/add-blank-project-dialog.component.ts index ca41ece5..8d899e70 100644 --- a/src/app/components/projects/add-blank-project-dialog/add-blank-project-dialog.component.ts +++ b/src/app/components/projects/add-blank-project-dialog/add-blank-project-dialog.component.ts @@ -11,82 +11,82 @@ import { ProjectNameValidator } from '../models/projectNameValidator'; import { ToasterService } from '../../../services/toaster.service'; @Component({ - selector: 'app-add-blank-project-dialog', - templateUrl: './add-blank-project-dialog.component.html', - styleUrls: ['./add-blank-project-dialog.component.css'], - providers: [ProjectNameValidator] + selector: 'app-add-blank-project-dialog', + templateUrl: './add-blank-project-dialog.component.html', + styleUrls: ['./add-blank-project-dialog.component.css'], + providers: [ProjectNameValidator] }) export class AddBlankProjectDialogComponent implements OnInit { - server: Server; - projectNameForm: FormGroup; + server: Server; + projectNameForm: FormGroup; - constructor( - public dialogRef: MatDialogRef, - private router: Router, - private dialog: MatDialog, - private projectService: ProjectService, - private toasterService: ToasterService, - private formBuilder: FormBuilder, - private projectNameValidator: ProjectNameValidator) { - this.projectNameForm = this.formBuilder.group({ - projectName: new FormControl(null, [Validators.required, projectNameValidator.get]) - }); - } + constructor( + public dialogRef: MatDialogRef, + private router: Router, + private dialog: MatDialog, + private projectService: ProjectService, + private toasterService: ToasterService, + private formBuilder: FormBuilder, + private projectNameValidator: ProjectNameValidator + ) { + this.projectNameForm = this.formBuilder.group({ + projectName: new FormControl(null, [Validators.required, projectNameValidator.get]) + }); + } - ngOnInit() {} + ngOnInit() {} - get form() { - return this.projectNameForm.controls; + get form() { + return this.projectNameForm.controls; + } + + onAddClick(): void { + if (this.projectNameForm.invalid) { + return; } + this.projectService.list(this.server).subscribe((projects: Project[]) => { + const projectName = this.projectNameForm.controls['projectName'].value; + let existingProject = projects.find(project => project.name === projectName); - onAddClick() : void{ - if (this.projectNameForm.invalid){ - return; - } - this.projectService - .list(this.server) - .subscribe((projects: Project[]) => { - const projectName = this.projectNameForm.controls['projectName'].value; - let existingProject = projects.find(project => project.name === projectName); + if (existingProject) { + this.openConfirmationDialog(existingProject); + } else { + this.addProject(); + } + }); + } - if (existingProject){ - this.openConfirmationDialog(existingProject); - } else { - this.addProject(); - } - }); - } + onNoClick(): void { + this.dialogRef.close(); + } - onNoClick() : void{ + addProject(): void { + this.projectService + .add(this.server, this.projectNameForm.controls['projectName'].value, uuid()) + .subscribe((project: Project) => { this.dialogRef.close(); - } + this.toasterService.success(`Project ${project.name} added`); + this.router.navigate(['/server', this.server.id, 'project', project.project_id]); + }); + } - addProject() : void{ - this.projectService.add(this.server, this.projectNameForm.controls['projectName'].value, uuid()) - .subscribe((project: Project) => { - this.dialogRef.close(); - this.toasterService.success(`Project ${project.name} added`) - this.router.navigate(['/server', this.server.id, 'project', project.project_id]); - }); - } + openConfirmationDialog(existingProject: Project) { + const dialogRef = this.dialog.open(ConfirmationDialogComponent, { + width: '300px', + height: '150px', + data: { + existingProject: existingProject + } + }); - openConfirmationDialog(existingProject: Project) { - const dialogRef = this.dialog.open(ConfirmationDialogComponent, { - width: '300px', - height: '150px', - data: { - 'existingProject': existingProject - } + dialogRef.afterClosed().subscribe((answer: boolean) => { + if (answer) { + this.projectService.close(this.server, existingProject.project_id).subscribe(() => { + this.projectService.delete(this.server, existingProject.project_id).subscribe(() => { + this.addProject(); + }); }); - - dialogRef.afterClosed().subscribe((answer: boolean) => { - if (answer) { - this.projectService.close(this.server, existingProject.project_id).subscribe(() => { - this.projectService.delete(this.server, existingProject.project_id).subscribe(() => { - this.addProject(); - }); - }); - } - }); - } + } + }); + } } diff --git a/src/app/components/projects/confirmation-dialog/confirmation-dialog.component.html b/src/app/components/projects/confirmation-dialog/confirmation-dialog.component.html index 34ebc2b1..87a2d1cc 100644 --- a/src/app/components/projects/confirmation-dialog/confirmation-dialog.component.html +++ b/src/app/components/projects/confirmation-dialog/confirmation-dialog.component.html @@ -1,8 +1,8 @@ -{{confirmationMessage}} +{{ confirmationMessage }}
- - + +
-
- -
\ No newline at end of file +
diff --git a/src/app/components/projects/confirmation-dialog/confirmation-dialog.component.spec.ts b/src/app/components/projects/confirmation-dialog/confirmation-dialog.component.spec.ts index e548d4c5..c319c34b 100644 --- a/src/app/components/projects/confirmation-dialog/confirmation-dialog.component.spec.ts +++ b/src/app/components/projects/confirmation-dialog/confirmation-dialog.component.spec.ts @@ -1,6 +1,6 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { MatDialogModule, MatDialog } from "@angular/material"; -import { NoopAnimationsModule } from "@angular/platform-browser/animations"; +import { MatDialogModule, MatDialog } from '@angular/material'; +import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { Component, NgModule } from '@angular/core'; import { Project } from '../../../models/project'; import { ConfirmationDialogComponent } from './confirmation-dialog.component'; @@ -12,31 +12,34 @@ describe('ConfirmationDialogComponent', () => { let noop: ComponentFixture; let existingProject: Project = { - auto_close: false, - auto_open: false, - auto_start: false, - filename: "blank", - name: "blank", - path: "", - project_id: "", - scene_height: 100, - scene_width: 100, - status: "", - readonly: false, - show_interface_labels: false, - show_layers: false, - show_grid: false, - snap_to_grid: false, + auto_close: false, + auto_open: false, + auto_start: false, + filename: 'blank', + name: 'blank', + path: '', + project_id: '', + scene_height: 100, + scene_width: 100, + status: '', + readonly: false, + show_interface_labels: false, + show_layers: false, + show_grid: false, + snap_to_grid: false }; - + beforeEach(() => { TestBed.configureTestingModule({ - imports: [ DialogTestModule ], + imports: [DialogTestModule], providers: [ - { provide: OverlayContainer, useFactory: () => { - overlayContainerElement = document.createElement('div'); - return { getContainerElement: () => overlayContainerElement }; - }} + { + provide: OverlayContainer, + useFactory: () => { + overlayContainerElement = document.createElement('div'); + return { getContainerElement: () => overlayContainerElement }; + } + } ] }); @@ -46,41 +49,41 @@ describe('ConfirmationDialogComponent', () => { }); it('should show correct message if project is open', () => { - existingProject.status = "opened"; - const config = { - data: { - 'existingProject' : existingProject - } + existingProject.status = 'opened'; + const config = { + data: { + existingProject: existingProject + } }; dialog.open(ConfirmationDialogComponent, config); noop.detectChanges(); const message = overlayContainerElement.querySelector('span'); - expect(message.textContent).toBe("Project blank is open. You can not overwrite it."); + expect(message.textContent).toBe('Project blank is open. You can not overwrite it.'); }); it('should show correct message if project is closed', () => { - existingProject.status = "closed"; - const config = { - data: { - 'existingProject' : existingProject - } + existingProject.status = 'closed'; + const config = { + data: { + existingProject: existingProject + } }; dialog.open(ConfirmationDialogComponent, config); noop.detectChanges(); const message = overlayContainerElement.querySelector('span'); - expect(message.textContent).toBe("Project blank already exist, overwrite it?"); + expect(message.textContent).toBe('Project blank already exist, overwrite it?'); }); it('should return false after closing when project is open', () => { - existingProject.status = "opened"; - const config = { - data: { - 'existingProject' : existingProject - } + existingProject.status = 'opened'; + const config = { + data: { + existingProject: existingProject + } }; let dialogRef = dialog.open(ConfirmationDialogComponent, config); @@ -93,11 +96,11 @@ describe('ConfirmationDialogComponent', () => { }); it('should return true after choosing overriding', () => { - existingProject.status = "closed"; - const config = { - data: { - 'existingProject' : existingProject - } + existingProject.status = 'closed'; + const config = { + data: { + existingProject: existingProject + } }; let dialogRef = dialog.open(ConfirmationDialogComponent, config); @@ -111,21 +114,16 @@ describe('ConfirmationDialogComponent', () => { }); @Component({ - template: '' + template: '' }) class NoopComponent {} -const TEST_DIRECTIVES = [ - ConfirmationDialogComponent, - NoopComponent -]; +const TEST_DIRECTIVES = [ConfirmationDialogComponent, NoopComponent]; @NgModule({ - imports: [MatDialogModule, NoopAnimationsModule], - exports: TEST_DIRECTIVES, - declarations: TEST_DIRECTIVES, - entryComponents: [ - ConfirmationDialogComponent - ], + imports: [MatDialogModule, NoopAnimationsModule], + exports: TEST_DIRECTIVES, + declarations: TEST_DIRECTIVES, + entryComponents: [ConfirmationDialogComponent] }) -class DialogTestModule { } +class DialogTestModule {} diff --git a/src/app/components/projects/confirmation-dialog/confirmation-dialog.component.ts b/src/app/components/projects/confirmation-dialog/confirmation-dialog.component.ts index 645b53e7..41edff00 100644 --- a/src/app/components/projects/confirmation-dialog/confirmation-dialog.component.ts +++ b/src/app/components/projects/confirmation-dialog/confirmation-dialog.component.ts @@ -1,37 +1,34 @@ import { Component, OnInit, Inject } from '@angular/core'; -import { MatDialogRef, MAT_DIALOG_DATA } from "@angular/material"; +import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material'; import { Project } from '../../../models/project'; @Component({ - selector: 'app-import-project-dialog', - templateUrl: 'confirmation-dialog.component.html', - styleUrls: ['confirmation-dialog.component.css'] + selector: 'app-import-project-dialog', + templateUrl: 'confirmation-dialog.component.html', + styleUrls: ['confirmation-dialog.component.css'] }) export class ConfirmationDialogComponent implements OnInit { - private existingProject : Project; - public confirmationMessage : string; - public isOpen : boolean; - constructor( - public dialogRef: MatDialogRef, - @Inject(MAT_DIALOG_DATA) public data: any - ){ - this.existingProject = data['existingProject'] - } + private existingProject: Project; + public confirmationMessage: string; + public isOpen: boolean; + constructor(public dialogRef: MatDialogRef, @Inject(MAT_DIALOG_DATA) public data: any) { + this.existingProject = data['existingProject']; + } - ngOnInit(){ - if(this.existingProject.status === "opened"){ - this.confirmationMessage = `Project ${this.existingProject.name} is open. You can not overwrite it.` - this.isOpen = true; - } else { - this.confirmationMessage = `Project ${this.existingProject.name} already exist, overwrite it?` - } + ngOnInit() { + if (this.existingProject.status === 'opened') { + this.confirmationMessage = `Project ${this.existingProject.name} is open. You can not overwrite it.`; + this.isOpen = true; + } else { + this.confirmationMessage = `Project ${this.existingProject.name} already exist, overwrite it?`; } + } - onNoClick() : void { - this.dialogRef.close(false); - } + onNoClick(): void { + this.dialogRef.close(false); + } - onYesClick() : void { - this.dialogRef.close(true); - } + onYesClick(): void { + this.dialogRef.close(true); + } } diff --git a/src/app/components/projects/import-project-dialog/import-project-dialog.component.css b/src/app/components/projects/import-project-dialog/import-project-dialog.component.css index 6d26582e..5485afaa 100644 --- a/src/app/components/projects/import-project-dialog/import-project-dialog.component.css +++ b/src/app/components/projects/import-project-dialog/import-project-dialog.component.css @@ -3,9 +3,9 @@ } .file-button{ - height: 50px; - width: 20%; - margin-top: 10px; + width: 100%; + margin-top: 5px; + margin-bottom: 10px; padding: 0px; } @@ -15,8 +15,7 @@ } .file-name-form-field { - margin-left: 5%; - width: 65%; + width: 100%; } .delete-button { diff --git a/src/app/components/projects/import-project-dialog/import-project-dialog.component.html b/src/app/components/projects/import-project-dialog/import-project-dialog.component.html index e9eedd0b..f06b11fa 100644 --- a/src/app/components/projects/import-project-dialog/import-project-dialog.component.html +++ b/src/app/components/projects/import-project-dialog/import-project-dialog.component.html @@ -1,30 +1,66 @@

Import project

- + - - Project name is required - Project name is incorrect + + Project name is required + Project name is incorrect
- +
-
+
- {{resultMessage}} + {{ resultMessage }}
- +
diff --git a/src/app/components/projects/import-project-dialog/import-project-dialog.component.spec.ts b/src/app/components/projects/import-project-dialog/import-project-dialog.component.spec.ts index 9840cdeb..528c0549 100644 --- a/src/app/components/projects/import-project-dialog/import-project-dialog.component.spec.ts +++ b/src/app/components/projects/import-project-dialog/import-project-dialog.component.spec.ts @@ -1,10 +1,20 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { ImportProjectDialogComponent } from "./import-project-dialog.component"; -import { Server } from "../../../models/server"; -import { MatInputModule, MatIconModule, MatSortModule, MatTableModule, MatTooltipModule, MatDialogModule, MatFormFieldModule, MatDialogRef, MAT_DIALOG_DATA } from "@angular/material"; -import { RouterTestingModule } from "@angular/router/testing"; -import { NoopAnimationsModule } from "@angular/platform-browser/animations"; -import { FileUploadModule, FileSelectDirective, FileItem, ParsedResponseHeaders } from "ng2-file-upload"; +import { ImportProjectDialogComponent } from './import-project-dialog.component'; +import { Server } from '../../../models/server'; +import { + MatInputModule, + MatIconModule, + MatSortModule, + MatTableModule, + MatTooltipModule, + MatDialogModule, + MatFormFieldModule, + MatDialogRef, + MAT_DIALOG_DATA +} from '@angular/material'; +import { RouterTestingModule } from '@angular/router/testing'; +import { NoopAnimationsModule } from '@angular/platform-browser/animations'; +import { FileUploadModule, FileSelectDirective, FileItem, ParsedResponseHeaders } from 'ng2-file-upload'; import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { DebugElement } from '@angular/core'; import { By } from '@angular/platform-browser'; @@ -13,211 +23,214 @@ import { of } from 'rxjs/internal/observable/of'; import { Project } from '../../../models/project'; export class MockedProjectService { - public projects: Project[] = [{ - auto_close: false, - auto_open: false, - auto_start: false, - filename: "blank", - name: "blank", - path: "", - project_id: "", - scene_height: 100, - scene_width: 100, - status: "opened", - readonly: false, - show_interface_labels: false, - show_layers: false, - show_grid: false, - snap_to_grid: false, - }]; - - list() { - return of(this.projects); + public projects: Project[] = [ + { + auto_close: false, + auto_open: false, + auto_start: false, + filename: 'blank', + name: 'blank', + path: '', + project_id: '', + scene_height: 100, + scene_width: 100, + status: 'opened', + readonly: false, + show_interface_labels: false, + show_layers: false, + show_grid: false, + snap_to_grid: false } + ]; + + list() { + return of(this.projects); + } } describe('ImportProjectDialogComponent', () => { - let component: ImportProjectDialogComponent; - let fixture: ComponentFixture; - let server: Server; - let debugElement: DebugElement; - let fileSelectDirective: FileSelectDirective; + let component: ImportProjectDialogComponent; + let fixture: ComponentFixture; + let server: Server; + let debugElement: DebugElement; + let fileSelectDirective: FileSelectDirective; - beforeEach(async(() => { - TestBed.configureTestingModule({ - imports: [ - MatTableModule, - MatTooltipModule, - MatIconModule, - MatSortModule, - MatDialogModule, - MatFormFieldModule, - MatInputModule, - NoopAnimationsModule, - FileUploadModule, - FormsModule, - ReactiveFormsModule, - RouterTestingModule.withRoutes([]), - ], - providers: [ - { provide: MatDialogRef }, - { provide: MAT_DIALOG_DATA }, - { provide: ProjectService, useClass: MockedProjectService} - ], - declarations : [ImportProjectDialogComponent] - }) - .compileComponents(); + beforeEach(async(() => { + TestBed.configureTestingModule({ + imports: [ + MatTableModule, + MatTooltipModule, + MatIconModule, + MatSortModule, + MatDialogModule, + MatFormFieldModule, + MatInputModule, + NoopAnimationsModule, + FileUploadModule, + FormsModule, + ReactiveFormsModule, + RouterTestingModule.withRoutes([]) + ], + providers: [ + { provide: MatDialogRef }, + { provide: MAT_DIALOG_DATA }, + { provide: ProjectService, useClass: MockedProjectService } + ], + declarations: [ImportProjectDialogComponent] + }).compileComponents(); - server = new Server(); - server.ip = "localhost"; - server.port = 80; - })); + server = new Server(); + server.ip = 'localhost'; + server.port = 80; + })); - beforeEach(() => { - fixture = TestBed.createComponent(ImportProjectDialogComponent); - debugElement = fixture.debugElement; - component = fixture.componentInstance; - component.server = server; - component.projectNameForm.controls['projectName'].setValue("ValidName"); - fixture.detectChanges(); + beforeEach(() => { + fixture = TestBed.createComponent(ImportProjectDialogComponent); + debugElement = fixture.debugElement; + component = fixture.componentInstance; + component.server = server; + component.projectNameForm.controls['projectName'].setValue('ValidName'); + fixture.detectChanges(); - debugElement = fixture.debugElement.query(By.directive(FileSelectDirective)); - fileSelectDirective = debugElement.injector.get(FileSelectDirective) as FileSelectDirective; - component.uploader.onErrorItem = () => {}; - }); + debugElement = fixture.debugElement.query(By.directive(FileSelectDirective)); + fileSelectDirective = debugElement.injector.get(FileSelectDirective) as FileSelectDirective; + component.uploader.onErrorItem = () => {}; + }); - it('should be created', () => { - expect(fixture).toBeDefined(); - expect(component).toBeTruthy(); - }); + it('should be created', () => { + expect(fixture).toBeDefined(); + expect(component).toBeTruthy(); + }); - it('should set file uploader', () => { - expect(fileSelectDirective).toBeDefined(); - expect(fileSelectDirective.uploader).toBe(component.uploader); - }); + it('should set file uploader', () => { + expect(fileSelectDirective).toBeDefined(); + expect(fileSelectDirective.uploader).toBe(component.uploader); + }); - it('should handle file adding', () => { - spyOn(fileSelectDirective.uploader, 'addToQueue'); - - fileSelectDirective.onChange(); - - const expectedArguments = [ debugElement.nativeElement.files, - fileSelectDirective.getOptions(), - fileSelectDirective.getFilters() ]; - expect(fileSelectDirective.uploader.addToQueue).toHaveBeenCalledWith(...expectedArguments); - }); + it('should handle file adding', () => { + spyOn(fileSelectDirective.uploader, 'addToQueue'); - it('should call uploading item', () => { - spyOn(fileSelectDirective.uploader, 'uploadItem'); + fileSelectDirective.onChange(); - component.onImportClick(); + const expectedArguments = [ + debugElement.nativeElement.files, + fileSelectDirective.getOptions(), + fileSelectDirective.getFilters() + ]; + expect(fileSelectDirective.uploader.addToQueue).toHaveBeenCalledWith(...expectedArguments); + }); - expect(fileSelectDirective.uploader.uploadItem).toHaveBeenCalled(); - }); + it('should call uploading item', () => { + spyOn(fileSelectDirective.uploader, 'uploadItem'); - it('should call uploading item with correct arguments', () => { - let fileItem = new FileItem(fileSelectDirective.uploader,new File([],"fileName"),{}); - fileSelectDirective.uploader.queue.push(fileItem); - spyOn(fileSelectDirective.uploader, 'uploadItem'); + component.onImportClick(); - component.onImportClick(); + expect(fileSelectDirective.uploader.uploadItem).toHaveBeenCalled(); + }); - expect(fileSelectDirective.uploader.uploadItem).toHaveBeenCalledWith(fileItem); - }); + it('should call uploading item with correct arguments', () => { + let fileItem = new FileItem(fileSelectDirective.uploader, new File([], 'fileName'), {}); + fileSelectDirective.uploader.queue.push(fileItem); + spyOn(fileSelectDirective.uploader, 'uploadItem'); - it('should handle file change event', () => { - let input = fixture.debugElement.query(By.css('input[type=file]')).nativeElement; - spyOn(component, 'uploadProjectFile'); + component.onImportClick(); - input.dispatchEvent(new Event('change')); + expect(fileSelectDirective.uploader.uploadItem).toHaveBeenCalledWith(fileItem); + }); - expect(component.uploadProjectFile).toHaveBeenCalled(); - }); + it('should handle file change event', () => { + let input = fixture.debugElement.query(By.css('input[type=file]')).nativeElement; + spyOn(component, 'uploadProjectFile'); - it('should clear queue after calling delete', () => { - fileSelectDirective.uploader.queue.push(new FileItem(fileSelectDirective.uploader,new File([],"fileName"),{})); - spyOn(fileSelectDirective.uploader.queue, "pop"); - - component.onDeleteClick(); + input.dispatchEvent(new Event('change')); - expect(fileSelectDirective.uploader.queue.pop).toHaveBeenCalled(); - expect(fileSelectDirective.uploader.queue[0]).toBeNull; - }); + expect(component.uploadProjectFile).toHaveBeenCalled(); + }); - it('should prepare correct upload path for file', () => { - fileSelectDirective.uploader.queue.push(new FileItem(fileSelectDirective.uploader,new File([],"fileName"),{})); - component.projectNameForm.controls['projectName'].setValue("newProject"); + it('should clear queue after calling delete', () => { + fileSelectDirective.uploader.queue.push(new FileItem(fileSelectDirective.uploader, new File([], 'fileName'), {})); + spyOn(fileSelectDirective.uploader.queue, 'pop'); - component.onImportClick(); + component.onDeleteClick(); - expect(fileSelectDirective.uploader.queue[0].url).toContain("localhost:80"); - expect(fileSelectDirective.uploader.queue[0].url).toContain("newProject"); - }); + expect(fileSelectDirective.uploader.queue.pop).toHaveBeenCalled(); + expect(fileSelectDirective.uploader.queue[0]).toBeNull; + }); - it('should navigate to progress view after clicking import', () => { - let fileItem = new FileItem(fileSelectDirective.uploader, new File([],"fileName"),{}); - fileSelectDirective.uploader.queue.push(fileItem); + it('should prepare correct upload path for file', () => { + fileSelectDirective.uploader.queue.push(new FileItem(fileSelectDirective.uploader, new File([], 'fileName'), {})); + component.projectNameForm.controls['projectName'].setValue('newProject'); - component.onImportClick(); + component.onImportClick(); - expect(component.isFirstStepCompleted).toBe(true); - }); + expect(fileSelectDirective.uploader.queue[0].url).toContain('localhost:80'); + expect(fileSelectDirective.uploader.queue[0].url).toContain('newProject'); + }); - it('should detect if file input is empty', () => { - component.projectNameForm.controls['projectName'].setValue(""); - fixture.detectChanges(); - spyOn(fileSelectDirective.uploader, 'uploadItem'); + it('should navigate to progress view after clicking import', () => { + let fileItem = new FileItem(fileSelectDirective.uploader, new File([], 'fileName'), {}); + fileSelectDirective.uploader.queue.push(fileItem); - component.onImportClick(); + component.onImportClick(); - expect(fileSelectDirective.uploader.uploadItem).not.toHaveBeenCalled(); - expect(component.projectNameForm.valid).toBeFalsy(); - }); + expect(component.isFirstStepCompleted).toBe(true); + }); - it('should sanitize file name input', () => { - component.projectNameForm.controls['projectName'].setValue("[][]"); - fixture.detectChanges(); - spyOn(fileSelectDirective.uploader, 'uploadItem'); + it('should detect if file input is empty', () => { + component.projectNameForm.controls['projectName'].setValue(''); + fixture.detectChanges(); + spyOn(fileSelectDirective.uploader, 'uploadItem'); - component.onImportClick(); + component.onImportClick(); - expect(fileSelectDirective.uploader.uploadItem).not.toHaveBeenCalled(); - expect(component.projectNameForm.valid).toBeFalsy(); - }); + expect(fileSelectDirective.uploader.uploadItem).not.toHaveBeenCalled(); + expect(component.projectNameForm.valid).toBeFalsy(); + }); - it('should open confirmation dialog if project with the same exists', () => { - component.projectNameForm.controls['projectName'].setValue("blank"); - spyOn(component, "openConfirmationDialog"); + it('should sanitize file name input', () => { + component.projectNameForm.controls['projectName'].setValue('[][]'); + fixture.detectChanges(); + spyOn(fileSelectDirective.uploader, 'uploadItem'); - component.onImportClick(); + component.onImportClick(); - expect(component.openConfirmationDialog).toHaveBeenCalled(); - }); + expect(fileSelectDirective.uploader.uploadItem).not.toHaveBeenCalled(); + expect(component.projectNameForm.valid).toBeFalsy(); + }); - it('should show delete button after selecting project', () => { - let fileItem = new FileItem(fileSelectDirective.uploader, new File([],"fileName"),{}); - fileSelectDirective.uploader.queue.push(fileItem); - let event = { - target: { - files: [ {name : "uploadedFile"} ] - } - }; - component.uploadProjectFile(event); + it('should open confirmation dialog if project with the same exists', () => { + component.projectNameForm.controls['projectName'].setValue('blank'); + spyOn(component, 'openConfirmationDialog'); - expect(component.isDeleteVisible).toBe(true); - }); + component.onImportClick(); - it('should hide delete button after deselecting project', () => { - let fileItem = new FileItem(fileSelectDirective.uploader, new File([],"fileName"),{}); - fileSelectDirective.uploader.queue.push(fileItem); - let event = { - target: { - files: [ {name : "uploadedFile"} ] - } - }; - component.uploadProjectFile(event); - component.onDeleteClick(); + expect(component.openConfirmationDialog).toHaveBeenCalled(); + }); - expect(component.isDeleteVisible).toBe(false); - }); + it('should show delete button after selecting project', () => { + let fileItem = new FileItem(fileSelectDirective.uploader, new File([], 'fileName'), {}); + fileSelectDirective.uploader.queue.push(fileItem); + let event = { + target: { + files: [{ name: 'uploadedFile' }] + } + }; + component.uploadProjectFile(event); + + expect(component.isDeleteVisible).toBe(true); + }); + + it('should hide delete button after deselecting project', () => { + let fileItem = new FileItem(fileSelectDirective.uploader, new File([], 'fileName'), {}); + fileSelectDirective.uploader.queue.push(fileItem); + let event = { + target: { + files: [{ name: 'uploadedFile' }] + } + }; + component.uploadProjectFile(event); + component.onDeleteClick(); + + expect(component.isDeleteVisible).toBe(false); + }); }); diff --git a/src/app/components/projects/import-project-dialog/import-project-dialog.component.ts b/src/app/components/projects/import-project-dialog/import-project-dialog.component.ts index 67daa81e..f8165314 100644 --- a/src/app/components/projects/import-project-dialog/import-project-dialog.component.ts +++ b/src/app/components/projects/import-project-dialog/import-project-dialog.component.ts @@ -1,5 +1,5 @@ import { Component, OnInit, Inject } from '@angular/core'; -import { MatDialogRef, MAT_DIALOG_DATA, MatDialog } from "@angular/material"; +import { MatDialogRef, MAT_DIALOG_DATA, MatDialog } from '@angular/material'; import { FileUploader, ParsedResponseHeaders, FileItem } from 'ng2-file-upload'; import { Server } from '../../../models/server'; import { v4 as uuid } from 'uuid'; @@ -11,127 +11,133 @@ import { ServerResponse } from '../../../models/serverResponse'; import { ProjectNameValidator } from '../models/projectNameValidator'; @Component({ - selector: 'app-import-project-dialog', - templateUrl: 'import-project-dialog.component.html', - styleUrls: ['import-project-dialog.component.css'], - providers: [ProjectNameValidator] + selector: 'app-import-project-dialog', + templateUrl: 'import-project-dialog.component.html', + styleUrls: ['import-project-dialog.component.css'], + providers: [ProjectNameValidator] }) export class ImportProjectDialogComponent implements OnInit { - uploader: FileUploader; - server : Server; - isImportEnabled : boolean = false; - isFinishEnabled : boolean = false; - isDeleteVisible : boolean = false; - resultMessage : string = "The project is being imported... Please wait"; - projectNameForm: FormGroup; - submitted: boolean = false; - isFirstStepCompleted: boolean = false; - - constructor( - private dialog: MatDialog, - public dialogRef: MatDialogRef, - @Inject(MAT_DIALOG_DATA) public data: any, - private formBuilder: FormBuilder, - private projectService: ProjectService, - private projectNameValidator: ProjectNameValidator){ - this.projectNameForm = this.formBuilder.group({ - projectName: new FormControl(null, [Validators.required, projectNameValidator.get]) + uploader: FileUploader; + server: Server; + isImportEnabled: boolean = false; + isFinishEnabled: boolean = false; + isDeleteVisible: boolean = false; + resultMessage: string = 'The project is being imported... Please wait'; + projectNameForm: FormGroup; + submitted: boolean = false; + isFirstStepCompleted: boolean = false; + + constructor( + private dialog: MatDialog, + public dialogRef: MatDialogRef, + @Inject(MAT_DIALOG_DATA) public data: any, + private formBuilder: FormBuilder, + private projectService: ProjectService, + private projectNameValidator: ProjectNameValidator + ) { + this.projectNameForm = this.formBuilder.group({ + projectName: new FormControl(null, [Validators.required, projectNameValidator.get]) + }); + } + + ngOnInit() { + this.uploader = new FileUploader({}); + this.uploader.onAfterAddingFile = file => { + file.withCredentials = false; + }; + + this.uploader.onErrorItem = (item: FileItem, response: string, status: number, headers: ParsedResponseHeaders) => { + let serverResponse: ServerResponse = JSON.parse(response); + this.resultMessage = 'An error occured: ' + serverResponse.message; + this.isFinishEnabled = true; + }; + + this.uploader.onCompleteItem = ( + item: FileItem, + response: string, + status: number, + headers: ParsedResponseHeaders + ) => { + this.resultMessage = 'Project was imported succesfully!'; + this.isFinishEnabled = true; + }; + } + + get form() { + return this.projectNameForm.controls; + } + + uploadProjectFile(event): void { + this.projectNameForm.controls['projectName'].setValue(event.target.files[0].name.split('.')[0]); + this.isImportEnabled = true; + this.isDeleteVisible = true; + } + + onImportClick(): void { + if (this.projectNameForm.invalid) { + this.submitted = true; + } else { + this.projectService.list(this.server).subscribe((projects: Project[]) => { + const projectName = this.projectNameForm.controls['projectName'].value; + let existingProject = projects.find(project => project.name === projectName); + + if (existingProject) { + this.openConfirmationDialog(existingProject); + } else { + this.importProject(); + } + }); + } + } + + importProject() { + const url = this.prepareUploadPath(); + this.uploader.queue.forEach(elem => (elem.url = url)); + + this.isFirstStepCompleted = true; + + const itemToUpload = this.uploader.queue[0]; + this.uploader.uploadItem(itemToUpload); + } + + openConfirmationDialog(existingProject: Project) { + const dialogRef = this.dialog.open(ConfirmationDialogComponent, { + width: '300px', + height: '150px', + data: { + existingProject: existingProject + } + }); + + dialogRef.afterClosed().subscribe((answer: boolean) => { + if (answer) { + this.projectService.close(this.server, existingProject.project_id).subscribe(() => { + this.projectService.delete(this.server, existingProject.project_id).subscribe(() => { + this.importProject(); }); - } - - ngOnInit(){ - this.uploader = new FileUploader({}); - this.uploader.onAfterAddingFile = (file) => { file.withCredentials = false; }; - - this.uploader.onErrorItem = (item: FileItem, response: string, status: number, headers: ParsedResponseHeaders) => { - let serverResponse : ServerResponse = JSON.parse(response); - this.resultMessage = "An error occured: " + serverResponse.message; - this.isFinishEnabled = true; - }; - - this.uploader.onCompleteItem = (item: FileItem, response: string, status: number, headers: ParsedResponseHeaders) => { - this.resultMessage = "Project was imported succesfully!"; - this.isFinishEnabled = true; - }; - } - - get form() { - return this.projectNameForm.controls; - } - - uploadProjectFile(event) : void{ - this.projectNameForm.controls['projectName'].setValue(event.target.files[0].name.split(".")[0]); - this.isImportEnabled = true; - this.isDeleteVisible = true; - } - - onImportClick() : void{ - if (this.projectNameForm.invalid){ - this.submitted = true; - } else { - this.projectService - .list(this.server) - .subscribe((projects: Project[]) => { - const projectName = this.projectNameForm.controls['projectName'].value; - let existingProject = projects.find(project => project.name === projectName); - - if (existingProject){ - this.openConfirmationDialog(existingProject); - } else { - this.importProject(); - } }); } - } + }); + } - importProject(){ - const url = this.prepareUploadPath(); - this.uploader.queue.forEach(elem => elem.url = url); + onNoClick(): void { + this.uploader.cancelAll(); + this.dialogRef.close(); + } - this.isFirstStepCompleted = true; + onFinishClick(): void { + this.dialogRef.close(); + } - const itemToUpload = this.uploader.queue[0]; - this.uploader.uploadItem(itemToUpload); - } + onDeleteClick(): void { + this.uploader.queue.pop(); + this.isImportEnabled = false; + this.isDeleteVisible = false; + this.projectNameForm.controls['projectName'].setValue(''); + } - openConfirmationDialog(existingProject: Project) { - const dialogRef = this.dialog.open(ConfirmationDialogComponent, { - width: '300px', - height: '150px', - data: { - 'existingProject': existingProject - } - }); - - dialogRef.afterClosed().subscribe((answer: boolean) => { - if (answer) { - this.projectService.close(this.server, existingProject.project_id).subscribe(() => { - this.projectService.delete(this.server, existingProject.project_id).subscribe(() => { - this.importProject(); - }); - }); - } - }); - } - - onNoClick() : void{ - this.uploader.cancelAll(); - this.dialogRef.close(); - } - - onFinishClick() : void{ - this.dialogRef.close(); - } - - onDeleteClick() : void{ - this.uploader.queue.pop(); - this.isImportEnabled = false; - this.isDeleteVisible = false; - this.projectNameForm.controls['projectName'].setValue(""); - } - - prepareUploadPath() : string{ - const projectName = this.projectNameForm.controls['projectName'].value; - return `http://${this.server.ip}:${this.server.port}/v2/projects/${uuid()}/import?name=${projectName}`; - } + prepareUploadPath(): string { + const projectName = this.projectNameForm.controls['projectName'].value; + return `http://${this.server.ip}:${this.server.port}/v2/projects/${uuid()}/import?name=${projectName}`; + } } diff --git a/src/app/components/projects/models/projectNameValidator.ts b/src/app/components/projects/models/projectNameValidator.ts index 38725ac8..6bf3efc3 100644 --- a/src/app/components/projects/models/projectNameValidator.ts +++ b/src/app/components/projects/models/projectNameValidator.ts @@ -1,14 +1,14 @@ -import { Injectable } from "@angular/core"; +import { Injectable } from '@angular/core'; @Injectable() export class ProjectNameValidator { - get(projectName) { - var pattern = new RegExp(/[~`!#$%\^&*+=\[\]\\';,/{}|\\":<>\?]/); + get(projectName) { + var pattern = new RegExp(/[~`!#$%\^&*+=\[\]\\';,/{}|\\":<>\?]/); - if(!pattern.test(projectName.value)) { - return null; - } - - return { invalidName: true } + if (!pattern.test(projectName.value)) { + return null; } -} \ No newline at end of file + + return { invalidName: true }; + } +} diff --git a/src/app/components/projects/projects.component.html b/src/app/components/projects/projects.component.html index 28b7b962..9518a1df 100644 --- a/src/app/components/projects/projects.component.html +++ b/src/app/components/projects/projects.component.html @@ -2,19 +2,35 @@

Projects

- - + +
-
- Name - {{row.name}} + {{ row.name }} @@ -28,13 +44,13 @@ pause - + - +
diff --git a/src/app/components/projects/projects.component.spec.ts b/src/app/components/projects/projects.component.spec.ts index 24bcf1bd..976b948a 100644 --- a/src/app/components/projects/projects.component.spec.ts +++ b/src/app/components/projects/projects.component.spec.ts @@ -1,22 +1,21 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { MatIconModule, MatSortModule, MatTableModule, MatTooltipModule, MatDialogModule } from "@angular/material"; -import { RouterTestingModule } from "@angular/router/testing"; -import { NoopAnimationsModule } from "@angular/platform-browser/animations"; +import { MatIconModule, MatSortModule, MatTableModule, MatTooltipModule, MatDialogModule } from '@angular/material'; +import { RouterTestingModule } from '@angular/router/testing'; +import { NoopAnimationsModule } from '@angular/platform-browser/animations'; -import { Observable, of } from "rxjs"; +import { Observable, of } from 'rxjs'; import { ProjectsComponent } from './projects.component'; -import { ServerService } from "../../services/server.service"; -import { MockedServerService } from "../../services/server.service.spec"; -import { ProjectService } from "../../services/project.service"; -import { MockedProjectService } from "../../services/project.service.spec"; -import { SettingsService } from "../../services/settings.service"; -import { MockedSettingsService } from "../../services/settings.service.spec"; -import { ProgressService } from "../../common/progress/progress.service"; -import { Server } from "../../models/server"; -import { Settings } from "../../services/settings.service"; -import { Project } from "../../models/project"; - +import { ServerService } from '../../services/server.service'; +import { MockedServerService } from '../../services/server.service.spec'; +import { ProjectService } from '../../services/project.service'; +import { MockedProjectService } from '../../services/project.service.spec'; +import { SettingsService } from '../../services/settings.service'; +import { MockedSettingsService } from '../../services/settings.service.spec'; +import { ProgressService } from '../../common/progress/progress.service'; +import { Server } from '../../models/server'; +import { Settings } from '../../services/settings.service'; +import { Project } from '../../models/project'; describe('ProjectsComponent', () => { let component: ProjectsComponent; @@ -36,7 +35,7 @@ describe('ProjectsComponent', () => { MatSortModule, MatDialogModule, NoopAnimationsModule, - RouterTestingModule.withRoutes([]), + RouterTestingModule.withRoutes([]) ], providers: [ { provide: ServerService, useClass: MockedServerService }, @@ -44,9 +43,8 @@ describe('ProjectsComponent', () => { { provide: SettingsService, useClass: MockedSettingsService }, ProgressService ], - declarations: [ ProjectsComponent ] - }) - .compileComponents(); + declarations: [ProjectsComponent] + }).compileComponents(); serverService = TestBed.get(ServerService); settingsService = TestBed.get(SettingsService); @@ -76,20 +74,18 @@ describe('ProjectsComponent', () => { expect(component).toBeTruthy(); }); - describe('ProjectComponent open', () => { let project: Project; beforeEach(() => { project = new Project(); - project.project_id = "1"; + project.project_id = '1'; spyOn(projectService, 'open').and.returnValue(of(project)); component.server = server; }); - it('should open project', () => { component.open(project); expect(projectService.open).toHaveBeenCalledWith(server, project.project_id); @@ -104,14 +100,13 @@ describe('ProjectsComponent', () => { beforeEach(() => { project = new Project(); - project.project_id = "1"; + project.project_id = '1'; spyOn(projectService, 'close').and.returnValue(of(project)); component.server = server; }); - it('should close project', () => { component.close(project); expect(projectService.close).toHaveBeenCalledWith(server, project.project_id); diff --git a/src/app/components/projects/projects.component.ts b/src/app/components/projects/projects.component.ts index fc8bead2..f6ae4fbb 100644 --- a/src/app/components/projects/projects.component.ts +++ b/src/app/components/projects/projects.component.ts @@ -1,18 +1,18 @@ import { Component, OnInit, ViewChild } from '@angular/core'; import { ActivatedRoute, ParamMap } from '@angular/router'; -import { MatSort, MatSortable, MatDialog } from "@angular/material"; +import { MatSort, MatSortable, MatDialog } from '@angular/material'; -import { DataSource } from "@angular/cdk/collections"; +import { DataSource } from '@angular/cdk/collections'; -import { map, switchMap } from "rxjs//operators"; -import { BehaviorSubject, Observable, merge } from "rxjs"; +import { map, switchMap } from 'rxjs//operators'; +import { BehaviorSubject, Observable, merge } from 'rxjs'; -import { Project } from "../../models/project"; -import { ProjectService } from "../../services/project.service"; -import { Server } from "../../models/server"; -import { ServerService } from "../../services/server.service"; -import { SettingsService, Settings } from "../../services/settings.service"; -import { ProgressService } from "../../common/progress/progress.service"; +import { Project } from '../../models/project'; +import { ProjectService } from '../../services/project.service'; +import { Server } from '../../models/server'; +import { ServerService } from '../../services/server.service'; +import { SettingsService, Settings } from '../../services/settings.service'; +import { ProgressService } from '../../common/progress/progress.service'; import { ImportProjectDialogComponent } from './import-project-dialog/import-project-dialog.component'; import { AddBlankProjectDialogComponent } from './add-blank-project-dialog/add-blank-project-dialog.component'; @@ -31,22 +31,20 @@ export class ProjectsComponent implements OnInit { @ViewChild(MatSort) sort: MatSort; - constructor(private route: ActivatedRoute, - private serverService: ServerService, - private projectService: ProjectService, - private settingsService: SettingsService, - private progressService: ProgressService, - private dialog: MatDialog - ) { - - } + constructor( + private route: ActivatedRoute, + private serverService: ServerService, + private projectService: ProjectService, + private settingsService: SettingsService, + private progressService: ProgressService, + private dialog: MatDialog + ) {} ngOnInit() { this.sort.sort({ - id: 'name', - start: 'asc' - } - ); + id: 'name', + start: 'asc' + }); this.dataSource = new ProjectDataSource(this.projectDatabase, this.sort); this.route.paramMap @@ -65,13 +63,14 @@ export class ProjectsComponent implements OnInit { } refresh() { - this.projectService - .list(this.server) - .subscribe((projects: Project[]) => { + this.projectService.list(this.server).subscribe( + (projects: Project[]) => { this.projectDatabase.addProjects(projects); - }, (error) => { + }, + error => { this.progressService.setError(error); - }); + } + ); } delete(project: Project) { @@ -83,37 +82,45 @@ export class ProjectsComponent implements OnInit { open(project: Project) { this.progressService.activate(); - this.projectService.open(this.server, project.project_id).subscribe(() => { - this.refresh(); - }, () => {}, () => { - this.progressService.deactivate(); - }); + this.projectService.open(this.server, project.project_id).subscribe( + () => { + this.refresh(); + }, + () => {}, + () => { + this.progressService.deactivate(); + } + ); } close(project: Project) { this.progressService.activate(); - this.projectService.close(this.server, project.project_id).subscribe(() => { - this.refresh(); - }, () => {}, () => { - this.progressService.deactivate(); - }); + this.projectService.close(this.server, project.project_id).subscribe( + () => { + this.refresh(); + }, + () => {}, + () => { + this.progressService.deactivate(); + } + ); } - addBlankProject(){ + addBlankProject() { const dialogRef = this.dialog.open(AddBlankProjectDialogComponent, { - width: '550px', - }) + width: '400px' + }); let instance = dialogRef.componentInstance; instance.server = this.server; } - importProject(){ + importProject() { const dialogRef = this.dialog.open(ImportProjectDialogComponent, { - width: '550px', + width: '400px' }); let instance = dialogRef.componentInstance; - instance.server = this.server; + instance.server = this.server; dialogRef.afterClosed().subscribe(() => { this.refresh(); @@ -121,7 +128,6 @@ export class ProjectsComponent implements OnInit { } } - export class ProjectDatabase { dataChange: BehaviorSubject = new BehaviorSubject([]); @@ -142,35 +148,32 @@ export class ProjectDatabase { } } -export class ProjectDataSource extends DataSource { - +export class ProjectDataSource extends DataSource { constructor(private projectDatabase: ProjectDatabase, private sort: MatSort) { super(); } connect(): Observable { - const displayDataChanges = [ - this.projectDatabase.dataChange, - this.sort.sortChange, - ]; + const displayDataChanges = [this.projectDatabase.dataChange, this.sort.sortChange]; - return merge(...displayDataChanges).pipe(map(() => { - if (!this.sort.active || this.sort.direction === '') { - return this.projectDatabase.data; - } + return merge(...displayDataChanges).pipe( + map(() => { + if (!this.sort.active || this.sort.direction === '') { + return this.projectDatabase.data; + } - return this.projectDatabase.data.sort((a, b) => { - const propertyA = a[this.sort.active]; - const propertyB = b[this.sort.active]; + return this.projectDatabase.data.sort((a, b) => { + const propertyA = a[this.sort.active]; + const propertyB = b[this.sort.active]; - const valueA = isNaN(+propertyA) ? propertyA : +propertyA; - const valueB = isNaN(+propertyB) ? propertyB : +propertyB; + const valueA = isNaN(+propertyA) ? propertyA : +propertyA; + const valueB = isNaN(+propertyB) ? propertyB : +propertyB; - return (valueA < valueB ? -1 : 1) * (this.sort.direction === 'asc' ? 1 : -1); - }); - })); + return (valueA < valueB ? -1 : 1) * (this.sort.direction === 'asc' ? 1 : -1); + }); + }) + ); } disconnect() {} - } diff --git a/src/app/components/servers/add-server-dialog.html b/src/app/components/servers/add-server-dialog.html index 59e0925a..e4ee5378 100644 --- a/src/app/components/servers/add-server-dialog.html +++ b/src/app/components/servers/add-server-dialog.html @@ -1,30 +1,21 @@

Add server

- - - - - - - - - + + + - - {{ auth.name }} - + {{ auth.name }} - + - + -
diff --git a/src/app/components/servers/server-discovery/server-discovery.component.html b/src/app/components/servers/server-discovery/server-discovery.component.html index 82ed0fc7..95343b8f 100644 --- a/src/app/components/servers/server-discovery/server-discovery.component.html +++ b/src/app/components/servers/server-discovery/server-discovery.component.html @@ -1,6 +1,7 @@ - We've discovered GNS3 server on {{ discoveredServer.ip }}:{{ discoveredServer.port }}, would you like to add to the list? + We've discovered GNS3 server on {{ discoveredServer.ip }}:{{ discoveredServer.port }}, would you like to add to the list? @@ -8,4 +9,4 @@ - \ No newline at end of file + diff --git a/src/app/components/servers/server-discovery/server-discovery.component.spec.ts b/src/app/components/servers/server-discovery/server-discovery.component.spec.ts index 2ef13261..4a9fdf43 100644 --- a/src/app/components/servers/server-discovery/server-discovery.component.spec.ts +++ b/src/app/components/servers/server-discovery/server-discovery.component.spec.ts @@ -1,37 +1,35 @@ -import {async, ComponentFixture, fakeAsync, TestBed, tick} from '@angular/core/testing'; -import { MatCardModule, MatDividerModule } from "@angular/material"; +import { async, ComponentFixture, fakeAsync, TestBed, tick } from '@angular/core/testing'; +import { MatCardModule, MatDividerModule } from '@angular/material'; -import { Observable } from "rxjs/Rx"; +import { Observable } from 'rxjs/Rx'; import { ServerDiscoveryComponent } from './server-discovery.component'; -import { VersionService } from "../../../services/version.service"; -import { MockedVersionService } from "../../../services/version.service.spec"; -import { Version } from "../../../models/version"; -import { Server } from "../../../models/server"; +import { VersionService } from '../../../services/version.service'; +import { MockedVersionService } from '../../../services/version.service.spec'; +import { Version } from '../../../models/version'; +import { Server } from '../../../models/server'; import { ServerService } from '../../../services/server.service'; import { MockedServerService } from '../../../services/server.service.spec'; import { ServerDatabase } from '../../../services/server.database'; - describe('ServerDiscoveryComponent', () => { let component: ServerDiscoveryComponent; let fixture: ComponentFixture; let mockedVersionService: MockedVersionService; let mockedServerService: MockedServerService; - + beforeEach(async(() => { mockedServerService = new MockedServerService(); mockedVersionService = new MockedVersionService(); TestBed.configureTestingModule({ - imports: [ MatCardModule, MatDividerModule ], + imports: [MatCardModule, MatDividerModule], providers: [ { provide: VersionService, useFactory: () => mockedVersionService }, { provide: ServerService, useFactory: () => mockedServerService }, ServerDatabase ], - declarations: [ ServerDiscoveryComponent ] - }) - .compileComponents(); + declarations: [ServerDiscoveryComponent] + }).compileComponents(); })); beforeEach(() => { @@ -51,73 +49,75 @@ describe('ServerDiscoveryComponent', () => { describe('isAvailable', () => { it('should return server object when server is available', () => { - const version = new Version(); - version.version = "2.1.8"; + const version = new Version(); + version.version = '2.1.8'; - const getVersionSpy = spyOn(mockedVersionService, 'get') - .and.returnValue(Observable.of(version)); + const getVersionSpy = spyOn(mockedVersionService, 'get').and.returnValue(Observable.of(version)); - component.isServerAvailable('127.0.0.1', 3080).subscribe((s) => { - expect(s.ip).toEqual('127.0.0.1'); - expect(s.port).toEqual(3080); - }); + component.isServerAvailable('127.0.0.1', 3080).subscribe(s => { + expect(s.ip).toEqual('127.0.0.1'); + expect(s.port).toEqual(3080); + }); - const server = new Server(); - server.ip = '127.0.0.1'; - server.port = 3080; + const server = new Server(); + server.ip = '127.0.0.1'; + server.port = 3080; - expect(getVersionSpy).toHaveBeenCalledWith(server); + expect(getVersionSpy).toHaveBeenCalledWith(server); }); it('should throw error once server is not available', () => { - const server = new Server(); - server.ip = '127.0.0.1'; - server.port = 3080; + const server = new Server(); + server.ip = '127.0.0.1'; + server.port = 3080; - const getVersionSpy = spyOn(mockedVersionService, 'get') - .and.returnValue(Observable.throwError(new Error("server is unavailable"))); - let hasExecuted = false; + const getVersionSpy = spyOn(mockedVersionService, 'get').and.returnValue( + Observable.throwError(new Error('server is unavailable')) + ); + let hasExecuted = false; - component.isServerAvailable('127.0.0.1', 3080).subscribe((ver) => {}, (err) => { + component.isServerAvailable('127.0.0.1', 3080).subscribe( + ver => {}, + err => { hasExecuted = true; expect(err.toString()).toEqual('Error: server is unavailable'); - }); + } + ); - expect(getVersionSpy).toHaveBeenCalledWith(server); - expect(hasExecuted).toBeTruthy(); + expect(getVersionSpy).toHaveBeenCalledWith(server); + expect(hasExecuted).toBeTruthy(); }); }); - describe("discovery", () => { - it('should discovery all servers available', (done) => { - const version = new Version(); - version.version = "2.1.8"; + describe('discovery', () => { + it('should discovery all servers available', done => { + const version = new Version(); + version.version = '2.1.8'; - spyOn(component, 'isServerAvailable').and.callFake((ip, port) => { - const server = new Server(); - server.ip = ip; - server.port = port; - return Observable.of(server); - }); - - component.discovery().subscribe((discovered) => { - expect(discovered[0].ip).toEqual('127.0.0.1'); - expect(discovered[0].port).toEqual(3080); - - expect(discovered.length).toEqual(1); - - done(); - }); + spyOn(component, 'isServerAvailable').and.callFake((ip, port) => { + const server = new Server(); + server.ip = ip; + server.port = port; + return Observable.of(server); }); + + component.discovery().subscribe(discovered => { + expect(discovered[0].ip).toEqual('127.0.0.1'); + expect(discovered[0].port).toEqual(3080); + + expect(discovered.length).toEqual(1); + + done(); + }); + }); }); - describe("discoverFirstAvailableServer", () => { + describe('discoverFirstAvailableServer', () => { let server: Server; beforeEach(function() { server = new Server(); - server.ip = '199.111.111.1', - server.port = 3333; + (server.ip = '199.111.111.1'), (server.port = 3333); spyOn(component, 'discovery').and.callFake(() => { return Observable.of([server]); @@ -133,7 +133,7 @@ describe('ServerDiscoveryComponent', () => { })); it('should get first server from discovered and with already added', fakeAsync(() => { - mockedServerService.servers.push(server) + mockedServerService.servers.push(server); expect(component.discoveredServer).toBeUndefined(); component.discoverFirstAvailableServer(); @@ -142,17 +142,16 @@ describe('ServerDiscoveryComponent', () => { })); }); - describe("accepting and ignoring found server", () => { + describe('accepting and ignoring found server', () => { let server: Server; beforeEach(() => { server = new Server(); - server.ip = '199.111.111.1', - server.port = 3333; + (server.ip = '199.111.111.1'), (server.port = 3333); component.discoveredServer = server; }); - describe("accept", () => { - it("should add new server", fakeAsync(() => { + describe('accept', () => { + it('should add new server', fakeAsync(() => { component.accept(server); tick(); expect(component.discoveredServer).toBeNull(); @@ -160,14 +159,13 @@ describe('ServerDiscoveryComponent', () => { expect(mockedServerService.servers[0].name).toEqual('199.111.111.1'); })); }); - - describe("ignore", () => { - it("should reject server", fakeAsync(() => { + + describe('ignore', () => { + it('should reject server', fakeAsync(() => { component.ignore(server); tick(); expect(component.discoveredServer).toBeNull(); })); }); }); - }); diff --git a/src/app/components/servers/server-discovery/server-discovery.component.ts b/src/app/components/servers/server-discovery/server-discovery.component.ts index fc32ee74..9e5965a3 100644 --- a/src/app/components/servers/server-discovery/server-discovery.component.ts +++ b/src/app/components/servers/server-discovery/server-discovery.component.ts @@ -1,23 +1,23 @@ import { Component, OnInit } from '@angular/core'; -import { Observable } from "rxjs/Rx"; -import { map } from "rxjs//operators"; +import { Observable } from 'rxjs/Rx'; +import { map } from 'rxjs//operators'; -import { Server } from "../../../models/server"; -import { VersionService } from "../../../services/version.service"; -import { Version } from "../../../models/version"; +import { Server } from '../../../models/server'; +import { VersionService } from '../../../services/version.service'; +import { Version } from '../../../models/version'; import { forkJoin } from 'rxjs'; import { ServerService } from '../../../services/server.service'; import { ServerDatabase } from '../../../services/server.database'; - @Component({ selector: 'app-server-discovery', templateUrl: './server-discovery.component.html', styleUrls: ['./server-discovery.component.scss'] }) export class ServerDiscoveryComponent implements OnInit { - private defaultServers = [{ + private defaultServers = [ + { ip: '127.0.0.1', port: 3080 } @@ -40,12 +40,12 @@ export class ServerDiscoveryComponent implements OnInit { Observable.fromPromise(this.serverService.findAll()).pipe(map((s: Server[]) => s)), this.discovery() ).subscribe(([local, discovered]) => { - local.forEach((added) => { - discovered = discovered.filter((server) => { + local.forEach(added => { + discovered = discovered.filter(server => { return !(server.ip == added.ip && server.port == added.port); }); }); - if(discovered.length > 0) { + if (discovered.length > 0) { this.discoveredServer = discovered.shift(); } }); @@ -54,15 +54,17 @@ export class ServerDiscoveryComponent implements OnInit { discovery(): Observable { const queries: Observable[] = []; - this.defaultServers.forEach((testServer) => { - queries.push(this.isServerAvailable(testServer.ip, testServer.port).catch((err) => { - return Observable.of(null); - })); + this.defaultServers.forEach(testServer => { + queries.push( + this.isServerAvailable(testServer.ip, testServer.port).catch(err => { + return Observable.of(null); + }) + ); }); - return new Observable((observer) => { - forkJoin(queries).subscribe((discoveredServers) => { - observer.next(discoveredServers.filter((s) => s != null)); + return new Observable(observer => { + forkJoin(queries).subscribe(discoveredServers => { + observer.next(discoveredServers.filter(s => s != null)); observer.complete(); }); }); @@ -80,7 +82,7 @@ export class ServerDiscoveryComponent implements OnInit { } accept(server: Server) { - if(server.name == null) { + if (server.name == null) { server.name = server.ip; } diff --git a/src/app/components/servers/servers.component.html b/src/app/components/servers/servers.component.html index 238a45f6..2a6d868e 100644 --- a/src/app/components/servers/servers.component.html +++ b/src/app/components/servers/servers.component.html @@ -1,36 +1,35 @@
-
-

Servers

-
+

Servers

- ID - {{row.id}} + {{ row.id }} Name - {{row.name}} + + {{ row.name }} IP - {{row.ip}} + {{ row.ip }} Port - {{row.port}} + {{ row.port }} Actions - + @@ -38,12 +37,10 @@ - +
-
- -
+
diff --git a/src/app/components/servers/servers.component.spec.ts b/src/app/components/servers/servers.component.spec.ts index e0072c75..a0c628c5 100644 --- a/src/app/components/servers/servers.component.spec.ts +++ b/src/app/components/servers/servers.component.spec.ts @@ -8,9 +8,8 @@ describe('ServersComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ - declarations: [ ServersComponent ] - }) - .compileComponents(); + declarations: [ServersComponent] + }).compileComponents(); })); beforeEach(() => { @@ -18,5 +17,4 @@ describe('ServersComponent', () => { component = fixture.componentInstance; fixture.detectChanges(); }); - }); diff --git a/src/app/components/servers/servers.component.ts b/src/app/components/servers/servers.component.ts index dc3dd2f8..3bce6ae0 100644 --- a/src/app/components/servers/servers.component.ts +++ b/src/app/components/servers/servers.component.ts @@ -1,16 +1,14 @@ import { Component, Inject, OnInit } from '@angular/core'; -import { DataSource } from "@angular/cdk/collections"; +import { DataSource } from '@angular/cdk/collections'; import { MatDialog, MatDialogRef, MAT_DIALOG_DATA } from '@angular/material'; -import { Observable, merge } from "rxjs"; -import { map } from "rxjs/operators"; +import { Observable, merge } from 'rxjs'; +import { map } from 'rxjs/operators'; -import { Server } from "../../models/server"; -import { ServerService } from "../../services/server.service"; +import { Server } from '../../models/server'; +import { ServerService } from '../../services/server.service'; import { ServerDatabase } from '../../services/server.database'; - - @Component({ selector: 'app-server-list', templateUrl: './servers.component.html', @@ -23,7 +21,8 @@ export class ServersComponent implements OnInit { constructor( private dialog: MatDialog, private serverService: ServerService, - private serverDatabase: ServerDatabase) {} + private serverDatabase: ServerDatabase + ) {} ngOnInit() { this.serverService.findAll().then((servers: Server[]) => { @@ -35,7 +34,7 @@ export class ServersComponent implements OnInit { createModal() { const dialogRef = this.dialog.open(AddServerDialogComponent, { - width: '350px', + width: '350px' }); dialogRef.afterClosed().subscribe(server => { @@ -52,25 +51,18 @@ export class ServersComponent implements OnInit { this.serverDatabase.remove(server); }); } - } @Component({ selector: 'app-add-server-dialog', - templateUrl: 'add-server-dialog.html', + templateUrl: 'add-server-dialog.html' }) export class AddServerDialogComponent implements OnInit { server: Server = new Server(); - authorizations = [ - {'key': 'none', name: 'No authorization'}, - {'key': 'basic', name: 'Basic authorization'} - ]; + authorizations = [{ key: 'none', name: 'No authorization' }, { key: 'basic', name: 'Basic authorization' }]; - constructor( - public dialogRef: MatDialogRef, - @Inject(MAT_DIALOG_DATA) public data: any) { - } + constructor(public dialogRef: MatDialogRef, @Inject(MAT_DIALOG_DATA) public data: any) {} ngOnInit() { this.server.authorization = 'none'; @@ -83,10 +75,9 @@ export class AddServerDialogComponent implements OnInit { onNoClick(): void { this.dialogRef.close(); } - } -export class ServerDataSource extends DataSource { +export class ServerDataSource extends DataSource { constructor(private serverDatabase: ServerDatabase) { super(); } @@ -94,10 +85,10 @@ export class ServerDataSource extends DataSource { connect(): Observable { return merge(this.serverDatabase.dataChange).pipe( map(() => { - return this.serverDatabase.data; - })); + return this.serverDatabase.data; + }) + ); } disconnect() {} - } diff --git a/src/app/components/settings/settings.component.html b/src/app/components/settings/settings.component.html index 43f08e88..364c0996 100644 --- a/src/app/components/settings/settings.component.html +++ b/src/app/components/settings/settings.component.html @@ -1,39 +1,36 @@
-
-

Settings

-
+

Settings

- - Local settings - - - Customize your local settings - + Local settings + Customize your local settings
- Send anonymous crash reports + Send anonymous crash reports
- Enable experimental features (WARNING: IT CAN BREAK YOU LABS!) + Enable experimental features (WARNING: IT CAN BREAK YOU LABS!)
- Enable experimental Angular Map (WARNING: IT CAN BREAK YOU LABS!) + Enable experimental Angular Map (WARNING: IT CAN BREAK YOU LABS!)
-
-
- -
+
diff --git a/src/app/components/settings/settings.component.spec.ts b/src/app/components/settings/settings.component.spec.ts index 1229b8f7..3b0c7f31 100644 --- a/src/app/components/settings/settings.component.spec.ts +++ b/src/app/components/settings/settings.component.spec.ts @@ -1,15 +1,14 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { MatCheckboxModule, MatExpansionModule } from "@angular/material"; -import { FormsModule } from "@angular/forms"; -import { BrowserAnimationsModule } from "@angular/platform-browser/animations"; +import { MatCheckboxModule, MatExpansionModule } from '@angular/material'; +import { FormsModule } from '@angular/forms'; +import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; -import { PersistenceModule } from "angular-persistence"; +import { PersistenceModule } from 'angular-persistence'; import { SettingsComponent } from './settings.component'; -import { SettingsService } from "../../services/settings.service"; -import { ToasterService } from "../../services/toaster.service"; -import { MockedToasterService } from "../../services/toaster.service.spec"; - +import { SettingsService } from '../../services/settings.service'; +import { ToasterService } from '../../services/toaster.service'; +import { MockedToasterService } from '../../services/toaster.service.spec'; describe('SettingsComponent', () => { let component: SettingsComponent; @@ -18,16 +17,10 @@ describe('SettingsComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ - imports: [ - MatExpansionModule, MatCheckboxModule, FormsModule, - PersistenceModule, BrowserAnimationsModule ], - providers: [ - SettingsService, - { provide: ToasterService, useClass: MockedToasterService } - ], - declarations: [ SettingsComponent ] - }) - .compileComponents(); + imports: [MatExpansionModule, MatCheckboxModule, FormsModule, PersistenceModule, BrowserAnimationsModule], + providers: [SettingsService, { provide: ToasterService, useClass: MockedToasterService }], + declarations: [SettingsComponent] + }).compileComponents(); settingsService = TestBed.get(SettingsService); })); @@ -44,9 +37,9 @@ describe('SettingsComponent', () => { it('should get and save new settings', () => { const settings = { - 'crash_reports': true, - 'experimental_features': true, - 'angular_map': false + crash_reports: true, + experimental_features: true, + angular_map: false }; const getAll = spyOn(settingsService, 'getAll').and.returnValue(settings); const setAll = spyOn(settingsService, 'setAll'); @@ -57,6 +50,4 @@ describe('SettingsComponent', () => { component.save(); expect(setAll).toHaveBeenCalledWith(settings); }); - - }); diff --git a/src/app/components/settings/settings.component.ts b/src/app/components/settings/settings.component.ts index 42592856..638799d7 100644 --- a/src/app/components/settings/settings.component.ts +++ b/src/app/components/settings/settings.component.ts @@ -1,6 +1,6 @@ import { Component, OnInit } from '@angular/core'; -import { SettingsService } from "../../services/settings.service"; -import { ToasterService } from "../../services/toaster.service"; +import { SettingsService } from '../../services/settings.service'; +import { ToasterService } from '../../services/toaster.service'; @Component({ selector: 'app-settings', @@ -10,10 +10,7 @@ import { ToasterService } from "../../services/toaster.service"; export class SettingsComponent implements OnInit { settings = { ...SettingsService.DEFAULTS }; - constructor( - private settingsService: SettingsService, - private toaster: ToasterService - ) { } + constructor(private settingsService: SettingsService, private toaster: ToasterService) {} ngOnInit() { this.settings = this.settingsService.getAll(); @@ -21,6 +18,6 @@ export class SettingsComponent implements OnInit { save() { this.settingsService.setAll(this.settings); - this.toaster.success("Settings have been saved."); + this.toaster.success('Settings have been saved.'); } } diff --git a/src/app/components/snapshots/create-snapshot-dialog/create-snapshot-dialog.component.html b/src/app/components/snapshots/create-snapshot-dialog/create-snapshot-dialog.component.html index 7d716f28..f81fdfac 100644 --- a/src/app/components/snapshots/create-snapshot-dialog/create-snapshot-dialog.component.html +++ b/src/app/components/snapshots/create-snapshot-dialog/create-snapshot-dialog.component.html @@ -1,8 +1,6 @@

Create snapshot

- - - +
diff --git a/src/app/components/snapshots/create-snapshot-dialog/create-snapshot-dialog.component.spec.ts b/src/app/components/snapshots/create-snapshot-dialog/create-snapshot-dialog.component.spec.ts index 4f74deef..a981589e 100644 --- a/src/app/components/snapshots/create-snapshot-dialog/create-snapshot-dialog.component.spec.ts +++ b/src/app/components/snapshots/create-snapshot-dialog/create-snapshot-dialog.component.spec.ts @@ -8,9 +8,8 @@ describe('CreateSnapshotDialogComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ - declarations: [ CreateSnapshotDialogComponent ] - }) - .compileComponents(); + declarations: [CreateSnapshotDialogComponent] + }).compileComponents(); })); beforeEach(() => { diff --git a/src/app/components/snapshots/create-snapshot-dialog/create-snapshot-dialog.component.ts b/src/app/components/snapshots/create-snapshot-dialog/create-snapshot-dialog.component.ts index 5dfa1f10..ed415f68 100644 --- a/src/app/components/snapshots/create-snapshot-dialog/create-snapshot-dialog.component.ts +++ b/src/app/components/snapshots/create-snapshot-dialog/create-snapshot-dialog.component.ts @@ -8,13 +8,12 @@ import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material'; styleUrls: ['./create-snapshot-dialog.component.scss'] }) export class CreateSnapshotDialogComponent { - snapshot: Snapshot = new Snapshot(); constructor( public dialogRef: MatDialogRef, - @Inject(MAT_DIALOG_DATA) public data: any) { - } + @Inject(MAT_DIALOG_DATA) public data: any + ) {} onAddClick(): void { this.dialogRef.close(this.snapshot); diff --git a/src/app/components/snapshots/snapshot-menu-item/snapshot-menu-item.component.html b/src/app/components/snapshots/snapshot-menu-item/snapshot-menu-item.component.html index 6988f3d5..4329f35e 100644 --- a/src/app/components/snapshots/snapshot-menu-item/snapshot-menu-item.component.html +++ b/src/app/components/snapshots/snapshot-menu-item/snapshot-menu-item.component.html @@ -1,3 +1 @@ - \ No newline at end of file + diff --git a/src/app/components/snapshots/snapshot-menu-item/snapshot-menu-item.component.spec.ts b/src/app/components/snapshots/snapshot-menu-item/snapshot-menu-item.component.spec.ts index 080642af..92eec731 100644 --- a/src/app/components/snapshots/snapshot-menu-item/snapshot-menu-item.component.spec.ts +++ b/src/app/components/snapshots/snapshot-menu-item/snapshot-menu-item.component.spec.ts @@ -8,9 +8,8 @@ describe('SnapshotMenuItemComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ - declarations: [ SnapshotMenuItemComponent ] - }) - .compileComponents(); + declarations: [SnapshotMenuItemComponent] + }).compileComponents(); })); beforeEach(() => { diff --git a/src/app/components/snapshots/snapshot-menu-item/snapshot-menu-item.component.ts b/src/app/components/snapshots/snapshot-menu-item/snapshot-menu-item.component.ts index af8b5a57..d2dc6a93 100644 --- a/src/app/components/snapshots/snapshot-menu-item/snapshot-menu-item.component.ts +++ b/src/app/components/snapshots/snapshot-menu-item/snapshot-menu-item.component.ts @@ -24,13 +24,13 @@ export class SnapshotMenuItemComponent implements OnInit { private snapshotService: SnapshotService, private progressDialogService: ProgressDialogService, private toaster: ToasterService - ) { } + ) {} ngOnInit() {} public createSnapshotModal() { const dialogRef = this.dialog.open(CreateSnapshotDialogComponent, { - width: '250px', + width: '250px' }); dialogRef.afterClosed().subscribe(snapshot => { @@ -39,16 +39,19 @@ export class SnapshotMenuItemComponent implements OnInit { const progress = this.progressDialogService.open(); - const subscription = creation.subscribe((created_snapshot: Snapshot) => { - this.toaster.success(`Snapshot '${snapshot.name}' has been created.`); - progress.close(); - }, (response) => { - const error = response.json(); - this.toaster.error(`Cannot create snapshot: ${error.message}`); - progress.close(); - }); + const subscription = creation.subscribe( + (created_snapshot: Snapshot) => { + this.toaster.success(`Snapshot '${snapshot.name}' has been created.`); + progress.close(); + }, + response => { + const error = response.json(); + this.toaster.error(`Cannot create snapshot: ${error.message}`); + progress.close(); + } + ); - progress.afterClosed().subscribe((result) => { + progress.afterClosed().subscribe(result => { if (result === ProgressDialogComponent.CANCELLED) { subscription.unsubscribe(); } @@ -56,5 +59,4 @@ export class SnapshotMenuItemComponent implements OnInit { } }); } - } diff --git a/src/app/components/snapshots/snapshots.component.html b/src/app/components/snapshots/snapshots.component.html index 0c1a8811..fc5228ca 100644 --- a/src/app/components/snapshots/snapshots.component.html +++ b/src/app/components/snapshots/snapshots.component.html @@ -1,3 +1 @@ -

- snapshots works! -

+

snapshots works!

diff --git a/src/app/components/snapshots/snapshots.component.spec.ts b/src/app/components/snapshots/snapshots.component.spec.ts index 2b0da917..1e49c3d8 100644 --- a/src/app/components/snapshots/snapshots.component.spec.ts +++ b/src/app/components/snapshots/snapshots.component.spec.ts @@ -8,9 +8,8 @@ describe('SnapshotsComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ - declarations: [ SnapshotsComponent ] - }) - .compileComponents(); + declarations: [SnapshotsComponent] + }).compileComponents(); })); beforeEach(() => { diff --git a/src/app/components/snapshots/snapshots.component.ts b/src/app/components/snapshots/snapshots.component.ts index c7a9988f..bf0984e9 100644 --- a/src/app/components/snapshots/snapshots.component.ts +++ b/src/app/components/snapshots/snapshots.component.ts @@ -6,10 +6,7 @@ import { Component, OnInit } from '@angular/core'; styleUrls: ['./snapshots.component.scss'] }) export class SnapshotsComponent implements OnInit { + constructor() {} - constructor() { } - - ngOnInit() { - } - + ngOnInit() {} } diff --git a/src/app/components/template/template-list-dialog/template-list-dialog.component.html b/src/app/components/template/template-list-dialog/template-list-dialog.component.html index 6358698c..8507169d 100644 --- a/src/app/components/template/template-list-dialog/template-list-dialog.component.html +++ b/src/app/components/template/template-list-dialog/template-list-dialog.component.html @@ -1,20 +1,21 @@
-
- - - -
+
+ + + +
- + + + Name + + {{ row.name }} + + - - Name - {{row.name}} - - - - - + + +
diff --git a/src/app/components/template/template-list-dialog/template-list-dialog.component.scss b/src/app/components/template/template-list-dialog/template-list-dialog.component.scss index 2ac0f059..e10f6d10 100644 --- a/src/app/components/template/template-list-dialog/template-list-dialog.component.scss +++ b/src/app/components/template/template-list-dialog/template-list-dialog.component.scss @@ -7,7 +7,6 @@ justify-content: space-between; } - .mat-table { overflow: auto; max-height: 400px; diff --git a/src/app/components/template/template-list-dialog/template-list-dialog.component.spec.ts b/src/app/components/template/template-list-dialog/template-list-dialog.component.spec.ts index 335c8371..2d15ef12 100644 --- a/src/app/components/template/template-list-dialog/template-list-dialog.component.spec.ts +++ b/src/app/components/template/template-list-dialog/template-list-dialog.component.spec.ts @@ -8,9 +8,8 @@ describe('TemplateListDialogComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ - declarations: [ TemplateListDialogComponent ] - }) - .compileComponents(); + declarations: [TemplateListDialogComponent] + }).compileComponents(); })); beforeEach(() => { diff --git a/src/app/components/template/template-list-dialog/template-list-dialog.component.ts b/src/app/components/template/template-list-dialog/template-list-dialog.component.ts index 565bf35d..03853288 100644 --- a/src/app/components/template/template-list-dialog/template-list-dialog.component.ts +++ b/src/app/components/template/template-list-dialog/template-list-dialog.component.ts @@ -1,14 +1,13 @@ import { Component, ElementRef, Inject, OnInit, ViewChild } from '@angular/core'; -import { MAT_DIALOG_DATA, MatDialogRef } from "@angular/material"; -import { DataSource } from "@angular/cdk/collections"; +import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material'; +import { DataSource } from '@angular/cdk/collections'; -import { Observable, BehaviorSubject, fromEvent, merge } from "rxjs"; -import { debounceTime, distinctUntilChanged, map } from "rxjs/operators"; - -import { Server } from "../../../models/server"; -import { TemplateService } from "../../../services/template.service"; -import { Template } from "../../../models/template"; +import { Observable, BehaviorSubject, fromEvent, merge } from 'rxjs'; +import { debounceTime, distinctUntilChanged, map } from 'rxjs/operators'; +import { Server } from '../../../models/server'; +import { TemplateService } from '../../../services/template.service'; +import { Template } from '../../../models/template'; @Component({ selector: 'app-template-list-dialog', @@ -26,7 +25,8 @@ export class TemplateListDialogComponent implements OnInit { constructor( public dialogRef: MatDialogRef, private templateService: TemplateService, - @Inject(MAT_DIALOG_DATA) public data: any) { + @Inject(MAT_DIALOG_DATA) public data: any + ) { this.server = data['server']; } @@ -34,15 +34,17 @@ export class TemplateListDialogComponent implements OnInit { this.templateDatabase = new TemplateDatabase(this.server, this.templateService); this.dataSource = new TemplateDataSource(this.templateDatabase); - fromEvent(this.filter.nativeElement, 'keyup').pipe( - debounceTime(150), - distinctUntilChanged() - ) - .subscribe(() => { - if (!this.dataSource) { return; } - this.dataSource.filter = this.filter.nativeElement.value; - }); - + fromEvent(this.filter.nativeElement, 'keyup') + .pipe( + debounceTime(150), + distinctUntilChanged() + ) + .subscribe(() => { + if (!this.dataSource) { + return; + } + this.dataSource.filter = this.filter.nativeElement.value; + }); } onNoClick(): void { @@ -52,10 +54,8 @@ export class TemplateListDialogComponent implements OnInit { addNode(template: Template): void { this.dialogRef.close(template); } - } - export class TemplateDatabase { dataChange: BehaviorSubject = new BehaviorSubject([]); @@ -64,39 +64,38 @@ export class TemplateDatabase { } constructor(private server: Server, private templateService: TemplateService) { - this.templateService - .list(this.server) - .subscribe((templates) => { - this.dataChange.next(templates); - }); + this.templateService.list(this.server).subscribe(templates => { + this.dataChange.next(templates); + }); } +} -}; - -export class TemplateDataSource extends DataSource