From 544e77d82e8c54260cf99bcbb5d6790bf178e3b0 Mon Sep 17 00:00:00 2001 From: Piotr Pekala Date: Mon, 23 Sep 2019 04:51:49 -0700 Subject: [PATCH 1/2] Option to choose project name added --- src/app/app.module.ts | 7 ++-- .../choose-name-dialog.component.html | 12 +++++++ .../choose-name-dialog.component.scss | 3 ++ .../choose-name-dialog.component.ts | 36 +++++++++++++++++++ .../components/projects/projects.component.ts | 10 +++++- 5 files changed, 65 insertions(+), 3 deletions(-) create mode 100644 src/app/components/projects/choose-name-dialog/choose-name-dialog.component.html create mode 100644 src/app/components/projects/choose-name-dialog/choose-name-dialog.component.scss create mode 100644 src/app/components/projects/choose-name-dialog/choose-name-dialog.component.ts diff --git a/src/app/app.module.ts b/src/app/app.module.ts index c40c48ad..478483c2 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -235,6 +235,7 @@ import { TracengTemplatesComponent } from './components/preferences/traceng/trac import { TracengService } from './services/traceng.service'; import { TracengTemplateDetailsComponent } from './components/preferences/traceng/traceng-template-details/traceng-template-details.component'; import { QemuImageCreatorComponent } from './components/project-map/node-editors/configurator/qemu/qemu-image-creator/qemu-image-creator.component'; +import { ChooseNameDialogComponent } from './components/projects/choose-name-dialog/choose-name-dialog.component'; if (environment.production) { Raven.config('https://b2b1cfd9b043491eb6b566fd8acee358@sentry.io/842726', { @@ -396,7 +397,8 @@ if (environment.production) { TracengPreferencesComponent, TracengTemplatesComponent, TracengTemplateDetailsComponent, - QemuImageCreatorComponent + QemuImageCreatorComponent, + ChooseNameDialogComponent ], imports: [ BrowserModule, @@ -512,7 +514,8 @@ if (environment.production) { ConfiguratorDialogDockerComponent, ConfiguratorDialogNatComponent, ConfiguratorDialogTracengComponent, - QemuImageCreatorComponent + QemuImageCreatorComponent, + ChooseNameDialogComponent ], bootstrap: [AppComponent] }) diff --git a/src/app/components/projects/choose-name-dialog/choose-name-dialog.component.html b/src/app/components/projects/choose-name-dialog/choose-name-dialog.component.html new file mode 100644 index 00000000..8d9b0d73 --- /dev/null +++ b/src/app/components/projects/choose-name-dialog/choose-name-dialog.component.html @@ -0,0 +1,12 @@ +

Please choose name for exporting project

+ + + +
+ + +
diff --git a/src/app/components/projects/choose-name-dialog/choose-name-dialog.component.scss b/src/app/components/projects/choose-name-dialog/choose-name-dialog.component.scss new file mode 100644 index 00000000..9c2173c2 --- /dev/null +++ b/src/app/components/projects/choose-name-dialog/choose-name-dialog.component.scss @@ -0,0 +1,3 @@ +.form-field { + width: 100%; +} diff --git a/src/app/components/projects/choose-name-dialog/choose-name-dialog.component.ts b/src/app/components/projects/choose-name-dialog/choose-name-dialog.component.ts new file mode 100644 index 00000000..06cc3df3 --- /dev/null +++ b/src/app/components/projects/choose-name-dialog/choose-name-dialog.component.ts @@ -0,0 +1,36 @@ +import { Component, Input, OnInit } from '@angular/core'; +import { MatDialogRef } from '@angular/material'; +import { Server } from '../../../models/server'; +import { ProjectService } from '../../../services/project.service'; +import { Project } from '../../../models/project'; + + +@Component({ + selector: 'app-choose-name-dialog', + templateUrl: './choose-name-dialog.component.html', + styleUrls: ['./choose-name-dialog.component.scss'] +}) +export class ChooseNameDialogComponent implements OnInit { + @Input() server: Server; + @Input() project: Project + name: string; + + constructor( + public dialogRef: MatDialogRef, + private projectService: ProjectService + ) {} + + ngOnInit() { + this.name = this.project.name; + } + + onCloseClick() { + this.dialogRef.close(); + } + + onSaveClick() { + this.projectService.duplicate(this.server, this.project.project_id, this.name).subscribe(() => { + this.dialogRef.close(); + }); + } +} diff --git a/src/app/components/projects/projects.component.ts b/src/app/components/projects/projects.component.ts index 787fd60b..3eeb6d45 100644 --- a/src/app/components/projects/projects.component.ts +++ b/src/app/components/projects/projects.component.ts @@ -16,6 +16,7 @@ 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'; +import { ChooseNameDialogComponent } from './choose-name-dialog/choose-name-dialog.component'; @Component({ selector: 'app-projects', @@ -110,7 +111,14 @@ export class ProjectsComponent implements OnInit { } duplicate(project: Project) { - this.projectService.duplicate(this.server, project.project_id, project.name).subscribe(() => { + const dialogRef = this.dialog.open(ChooseNameDialogComponent, { + width: '400px', + autoFocus: false + }); + let instance = dialogRef.componentInstance; + instance.server = this.server; + instance.project = project; + dialogRef.afterClosed().subscribe(() => { this.refresh(); }); } From cdbf2e4eb2287ffd9fad7add9f7faef75b12ce5c Mon Sep 17 00:00:00 2001 From: Piotr Pekala Date: Mon, 23 Sep 2019 06:08:42 -0700 Subject: [PATCH 2/2] Unit tests updated --- .../projects/projects.component.spec.ts | 27 +++++++------------ .../components/projects/projects.component.ts | 2 +- 2 files changed, 11 insertions(+), 18 deletions(-) diff --git a/src/app/components/projects/projects.component.spec.ts b/src/app/components/projects/projects.component.spec.ts index 880c1798..57668115 100644 --- a/src/app/components/projects/projects.component.spec.ts +++ b/src/app/components/projects/projects.component.spec.ts @@ -1,5 +1,5 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { MatIconModule, MatSortModule, MatTableModule, MatTooltipModule, MatDialogModule, MatFormFieldModule, MatInputModule } from '@angular/material'; +import { MatIconModule, MatSortModule, MatTableModule, MatTooltipModule, MatDialogModule, MatFormFieldModule, MatInputModule, MatDialogRef } from '@angular/material'; import { RouterTestingModule } from '@angular/router/testing'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; @@ -19,6 +19,8 @@ import { Project } from '../../models/project'; import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { NO_ERRORS_SCHEMA } from '@angular/core'; import { ProjectsFilter } from '../../filters/projectsFilter.pipe'; +import { ChooseNameDialogComponent } from './choose-name-dialog/choose-name-dialog.component'; +import { BrowserDynamicTestingModule } from '@angular/platform-browser-dynamic/testing'; describe('ProjectsComponent', () => { let component: ProjectsComponent; @@ -51,9 +53,11 @@ describe('ProjectsComponent', () => { { provide: SettingsService, useClass: MockedSettingsService }, ProgressService ], - declarations: [ProjectsComponent, ProjectsFilter], + declarations: [ProjectsComponent, ChooseNameDialogComponent, ProjectsFilter], schemas: [NO_ERRORS_SCHEMA] - }).compileComponents(); + }) + .overrideModule(BrowserDynamicTestingModule, { set: { entryComponents: [ChooseNameDialogComponent] } }) + .compileComponents(); serverService = TestBed.get(ServerService); settingsService = TestBed.get(SettingsService); @@ -93,26 +97,15 @@ describe('ProjectsComponent', () => { expect(mockedProjectService.delete).toHaveBeenCalled(); }); - it('should call project service after duplicate action', () => { - spyOn(mockedProjectService, 'duplicate').and.returnValue(of()); + it('should call open dialog after duplicate action', () => { + spyOn(component.dialog, 'open').and.callThrough(); let project = new Project(); project.project_id = '1'; project.status = 'closed'; component.duplicate(project); - expect(mockedProjectService.duplicate).toHaveBeenCalled(); - }); - - it('should call refresh after duplicate action', () => { - spyOn(component, 'refresh'); - let project = new Project(); - project.project_id = '1'; - project.status = 'closed'; - - component.duplicate(project); - - expect(component.refresh).toHaveBeenCalled(); + expect(component.dialog.open).toHaveBeenCalled(); }); describe('ProjectComponent open', () => { diff --git a/src/app/components/projects/projects.component.ts b/src/app/components/projects/projects.component.ts index 3eeb6d45..e17c6c99 100644 --- a/src/app/components/projects/projects.component.ts +++ b/src/app/components/projects/projects.component.ts @@ -40,7 +40,7 @@ export class ProjectsComponent implements OnInit { private projectService: ProjectService, private settingsService: SettingsService, private progressService: ProgressService, - private dialog: MatDialog + public dialog: MatDialog ) {} ngOnInit() {