diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 7df048b3..25d5a0d5 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -249,6 +249,7 @@ import { PageNotFoundComponent } from './components/page-not-found/page-not-foun import { AlignHorizontallyActionComponent } from './components/project-map/context-menu/actions/align-horizontally/align-horizontally.component'; import { AlignVerticallyActionComponent } from './components/project-map/context-menu/actions/align_vertically/align-vertically.component'; import { ConfirmationBottomSheetComponent } from './components/projects/confirmation-bottomsheet/confirmation-bottomsheet.component'; +import { NotificationService } from './services/notification.service'; import { DeviceDetectorModule } from 'ngx-device-detector'; import { ConfigDialogComponent } from './components/project-map/context-menu/dialogs/config-dialog/config-dialog.component'; @@ -508,7 +509,8 @@ if (environment.production) { InfoService, ComputeService, TracengService, - PacketCaptureService + PacketCaptureService, + NotificationService ], entryComponents: [ AddServerDialogComponent, 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 f8c55011..1ac471d2 100644 --- a/src/app/components/project-map/project-map.component.spec.ts +++ b/src/app/components/project-map/project-map.component.spec.ts @@ -56,6 +56,7 @@ import { MockedActivatedRoute } from '../snapshots/list-of-snapshots/list-of-sna import { MapNodesDataSource, MapLinksDataSource, MapDrawingsDataSource, MapSymbolsDataSource } from '../../cartography/datasources/map-datasource'; import { EthernetLinkWidget } from '../../cartography/widgets/links/ethernet-link'; import { SerialLinkWidget } from '../../cartography/widgets/links/serial-link'; +import { NotificationService } from '../../services/notification.service'; export class MockedProgressService { public activate() {} @@ -298,7 +299,8 @@ describe('ProjectMapComponent', () => { { provide: MapLinksDataSource, useClass: LinksDataSource }, { provide: MapDrawingsDataSource, useClass: MapDrawingsDataSource }, { provide: MapSymbolsDataSource, useClass: MapSymbolsDataSource }, - { provide: MapSettingsService, useClass: MapSettingsService } + { provide: MapSettingsService, useClass: MapSettingsService }, + { provide: NotificationService } ], declarations: [ProjectMapComponent, ProjectMapMenuComponent, D3MapComponent, ...ANGULAR_MAP_DECLARATIONS], schemas: [NO_ERRORS_SCHEMA] diff --git a/src/app/components/project-map/project-map.component.ts b/src/app/components/project-map/project-map.component.ts index 4835ffb4..aef53430 100644 --- a/src/app/components/project-map/project-map.component.ts +++ b/src/app/components/project-map/project-map.component.ts @@ -63,6 +63,7 @@ import { EthernetLinkWidget } from '../../cartography/widgets/links/ethernet-lin import { SerialLinkWidget } from '../../cartography/widgets/links/serial-link'; import { NavigationDialogComponent } from '../projects/navigation-dialog/navigation-dialog.component'; import { ConfirmationBottomSheetComponent } from '../projects/confirmation-bottomsheet/confirmation-bottomsheet.component'; +import { NotificationService } from '../../services/notification.service'; @Component({ @@ -78,6 +79,7 @@ export class ProjectMapComponent implements OnInit, OnDestroy { public symbols: Symbol[] = []; public project: Project; public server: Server; + public projectws: WebSocket; public ws: WebSocket; public isProjectMapMenuVisible: boolean = false; public isConsoleVisible: boolean = true; @@ -146,7 +148,8 @@ export class ProjectMapComponent implements OnInit, OnDestroy { private mapSettingsService: MapSettingsService, private ethernetLinkWidget: EthernetLinkWidget, private serialLinkWidget: SerialLinkWidget, - private bottomSheet: MatBottomSheet + private bottomSheet: MatBottomSheet, + private notificationService: NotificationService ) {} ngOnInit() { @@ -311,25 +314,29 @@ export class ProjectMapComponent implements OnInit, OnDestroy { this.drawingsDataSource.set(drawings); this.setUpMapCallbacks(); - this.setUpWS(project); + this.setUpProjectWS(project); this.progressService.deactivate(); }); this.subscriptions.push(subscription); } - setUpWS(project: Project) { - this.ws = new WebSocket(this.projectService.notificationsPath(this.server, project.project_id)); + setUpProjectWS(project: Project) { + this.projectws = new WebSocket(this.projectService.notificationsPath(this.server, project.project_id)); - this.ws.onmessage = (event: MessageEvent) => { + this.projectws.onmessage = (event: MessageEvent) => { this.projectWebServiceHandler.handleMessage(JSON.parse(event.data)); }; - this.ws.onerror = (event: MessageEvent) => { + this.projectws.onerror = (event: MessageEvent) => { this.toasterService.error('Connection to host lost.'); }; } + setUpWS() { + this.ws = new WebSocket(this.notificationService.notificationsPath(this.server)); + } + setUpMapCallbacks() { if (!this.readonly) { this.toolsService.selectionToolActivation(true); @@ -802,8 +809,11 @@ export class ProjectMapComponent implements OnInit, OnDestroy { this.nodesDataSource.clear(); this.linksDataSource.clear(); - if (this.ws.OPEN) { - this.ws.close(); + if (this.projectws) { + if (this.projectws.OPEN) this.projectws.close(); + } + if (this.ws) { + if (this.ws.OPEN) this.ws.close(); } this.subscriptions.forEach((subscription: Subscription) => subscription.unsubscribe()); } diff --git a/src/app/components/projects/projects.component.spec.ts b/src/app/components/projects/projects.component.spec.ts index ba5fd7bd..602a3e41 100644 --- a/src/app/components/projects/projects.component.spec.ts +++ b/src/app/components/projects/projects.component.spec.ts @@ -22,6 +22,7 @@ import { ProjectsFilter } from '../../filters/projectsFilter.pipe'; import { ChooseNameDialogComponent } from './choose-name-dialog/choose-name-dialog.component'; import { BrowserDynamicTestingModule } from '@angular/platform-browser-dynamic/testing'; import { OverlayRef } from '@angular/cdk/overlay'; +import { ToasterService } from '../../services/toaster.service'; describe('ProjectsComponent', () => { let component: ProjectsComponent; @@ -53,6 +54,7 @@ describe('ProjectsComponent', () => { { provide: ServerService, useClass: MockedServerService }, { provide: ProjectService, useValue: mockedProjectService }, { provide: SettingsService, useClass: MockedSettingsService }, + { provide: ToasterService }, ProgressService ], declarations: [ProjectsComponent, ChooseNameDialogComponent, ProjectsFilter], diff --git a/src/app/components/projects/projects.component.ts b/src/app/components/projects/projects.component.ts index 0cdae130..da0bcc9a 100644 --- a/src/app/components/projects/projects.component.ts +++ b/src/app/components/projects/projects.component.ts @@ -19,6 +19,7 @@ import { AddBlankProjectDialogComponent } from './add-blank-project-dialog/add-b import { ChooseNameDialogComponent } from './choose-name-dialog/choose-name-dialog.component'; import { NavigationDialogComponent } from './navigation-dialog/navigation-dialog.component'; import { ConfirmationBottomSheetComponent } from './confirmation-bottomsheet/confirmation-bottomsheet.component'; +import { ToasterService } from '../../services/toaster.service'; @Component({ selector: 'app-projects', @@ -44,7 +45,8 @@ export class ProjectsComponent implements OnInit { private progressService: ProgressService, public dialog: MatDialog, private router: Router, - private bottomSheet: MatBottomSheet + private bottomSheet: MatBottomSheet, + private toasterService: ToasterService ) {} ngOnInit() { @@ -100,7 +102,11 @@ export class ProjectsComponent implements OnInit { () => { this.refresh(); }, - () => {}, + () => { + this.refresh(); + this.progressService.deactivate(); + this.toasterService.error('Project was deleted.'); + }, () => { this.progressService.deactivate(); } diff --git a/src/app/services/notification-settings.service.spec.ts b/src/app/services/notification-settings.service.spec.ts deleted file mode 100644 index e69de29b..00000000 diff --git a/src/app/services/notification.service.ts b/src/app/services/notification.service.ts new file mode 100644 index 00000000..c0c05985 --- /dev/null +++ b/src/app/services/notification.service.ts @@ -0,0 +1,12 @@ +import { Injectable } from '@angular/core'; +import { HttpServer } from './http-server.service'; +import { Server } from '../models/server'; + +@Injectable() +export class NotificationService { + constructor(private httpServer: HttpServer) {} + + notificationsPath(server: Server): string { + return `ws://${server.host}:${server.port}/v2/notifications/ws`; + } +}