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))
+ );
+ }
+}