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 9a318994..719798ab 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 @@ -12,9 +12,12 @@ Project name is required - Project name is incorrect + Project with this name exists
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 d8d34e84..9546be51 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 @@ -16,6 +16,7 @@ import { ToasterService } from '../../../services/toaster.service'; import { of } from 'rxjs/internal/observable/of'; import { Project } from '../../../models/project'; import { Router } from '@angular/router'; +import { projectNameAsyncValidator } from '../../../validators/project-name-async-validator'; export class MockedProjectService { public projects: Project[] = [ @@ -98,7 +99,6 @@ describe('AddBlankProjectDialogComponent', () => { fixture = TestBed.createComponent(AddBlankProjectDialogComponent); component = fixture.componentInstance; component.server = server; - component.projectNameForm.controls['projectName'].setValue('ValidName'); fixture.detectChanges(); }); @@ -109,6 +109,7 @@ describe('AddBlankProjectDialogComponent', () => { it('should call adding project when name is valid', () => { spyOn(component, 'addProject'); + component.projectNameForm.controls['projectName'].setValue('ValidName'); component.onAddClick(); 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 dd264420..efb3894d 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 @@ -9,6 +9,7 @@ import { v4 as uuid } from 'uuid'; import { ConfirmationDialogComponent } from '../confirmation-dialog/confirmation-dialog.component'; import { ProjectNameValidator } from '../models/projectNameValidator'; import { ToasterService } from '../../../services/toaster.service'; +import { projectNameAsyncValidator } from '../../../validators/project-name-async-validator'; @Component({ @@ -31,14 +32,14 @@ export class AddBlankProjectDialogComponent implements OnInit { private toasterService: ToasterService, private formBuilder: FormBuilder, private projectNameValidator: ProjectNameValidator - ) { + ) {} + + ngOnInit() { this.projectNameForm = this.formBuilder.group({ - projectName: new FormControl(null, [Validators.required, projectNameValidator.get]) + projectName: new FormControl(null, [Validators.required, this.projectNameValidator.get], [projectNameAsyncValidator(this.server, this.projectService)]) }); } - ngOnInit() {} - get form() { return this.projectNameForm.controls; } diff --git a/src/app/validators/project-name-async-validator.ts b/src/app/validators/project-name-async-validator.ts new file mode 100644 index 00000000..6d3f1e2d --- /dev/null +++ b/src/app/validators/project-name-async-validator.ts @@ -0,0 +1,14 @@ +import { ProjectService } from '../services/project.service'; +import { FormControl } from '@angular/forms'; +import { timer } from 'rxjs'; +import { map, switchMap } from 'rxjs/operators'; +import { Server } from '../models/server'; + +export const projectNameAsyncValidator = (server: Server, projectService: ProjectService) => { + return (control: FormControl) => { + return timer(500).pipe( + switchMap(() => projectService.list(server)), + map(response => (response.find(n => n.name === control.value) ? {projectExist: true} : null)) + ); + } +}