diff --git a/src/app/dialogs/library/library.dialog.html b/src/app/dialogs/library/library.dialog.html index 6cce48c10..580987b8c 100644 --- a/src/app/dialogs/library/library.dialog.html +++ b/src/app/dialogs/library/library.dialog.html @@ -12,6 +12,7 @@ [formControl]="form.controls['title']" /> + {{ 'LIBRARY.HINTS.SITE_TITLE_EXISTS' | translate }} {{ 'LIBRARY.ERRORS.DESCRIPTION_TOO_LONG' | translate }} diff --git a/src/app/dialogs/library/library.dialog.scss b/src/app/dialogs/library/library.dialog.scss index 50bd2f7f5..370c3bc42 100644 --- a/src/app/dialogs/library/library.dialog.scss +++ b/src/app/dialogs/library/library.dialog.scss @@ -12,6 +12,10 @@ width: 100%; } +mat-form-field { + padding-top: 20px; +} + .actions-buttons { display: flex; flex-direction: row; diff --git a/src/app/dialogs/library/library.dialog.ts b/src/app/dialogs/library/library.dialog.ts index 2c74736bf..3918d2c98 100644 --- a/src/app/dialogs/library/library.dialog.ts +++ b/src/app/dialogs/library/library.dialog.ts @@ -15,28 +15,38 @@ * limitations under the License. */ -import { Observable } from 'rxjs'; -import { Component, OnInit, Output, EventEmitter } from '@angular/core'; +import { Observable, Subject } from 'rxjs'; +import { + Component, + OnInit, + Output, + EventEmitter, + OnDestroy +} from '@angular/core'; import { FormBuilder, FormGroup, Validators } from '@angular/forms'; import { MatDialogRef } from '@angular/material'; -import { SiteBody, SiteEntry } from 'alfresco-js-api'; +import { SiteBody, SiteEntry, SitePaging } from 'alfresco-js-api'; import { ContentApiService } from '../../services/content-api.service'; import { SiteIdValidator, forbidSpecialCharacters } from './form.validators'; -import { debounceTime } from 'rxjs/operators'; +import { AlfrescoApiService } from '@alfresco/adf-core'; +import { debounceTime, mergeMap, takeUntil } from 'rxjs/operators'; @Component({ selector: 'app-library-dialog', styleUrls: ['./library.dialog.scss'], templateUrl: './library.dialog.html' }) -export class LibraryDialogComponent implements OnInit { +export class LibraryDialogComponent implements OnInit, OnDestroy { @Output() error: EventEmitter = new EventEmitter(); @Output() success: EventEmitter = new EventEmitter(); + onDestroy$: Subject = new Subject(); + createTitle = 'LIBRARY.DIALOG.CREATE_TITLE'; + libraryTitleExists = false; form: FormGroup; visibilityOption: any; visibilityOptions = [ @@ -50,6 +60,7 @@ export class LibraryDialogComponent implements OnInit { ]; constructor( + private alfrescoApiService: AlfrescoApiService, private formBuilder: FormBuilder, private dialog: MatDialogRef, private contentApi: ContentApiService @@ -75,19 +86,28 @@ export class LibraryDialogComponent implements OnInit { this.visibilityOption = this.visibilityOptions[0].value; this.form.controls['title'].valueChanges - .pipe(debounceTime(300)) - .subscribe((titleValue: string) => { - if (!titleValue.trim().length) { + .pipe( + debounceTime(300), + mergeMap(title => this.checkLibraryNameExists(title), title => title), + takeUntil(this.onDestroy$) + ) + .subscribe((title: string) => { + if (!title.trim().length) { return; } if (!this.form.controls['id'].dirty) { - this.form.patchValue({ id: this.sanitize(titleValue.trim()) }); + this.form.patchValue({ id: this.sanitize(title.trim()) }); this.form.controls['id'].markAsTouched(); } }); } + ngOnDestroy() { + this.onDestroy$.next(true); + this.onDestroy$.complete(); + } + get title(): string { const { title } = this.form.value; @@ -159,4 +179,16 @@ export class LibraryDialogComponent implements OnInit { return error; } + + private async checkLibraryNameExists(libraryTitle: string) { + const { entries } = (await this.findLibraryByTitle(libraryTitle)).list; + this.libraryTitleExists = !!entries.length; + } + + private findLibraryByTitle(libraryTitle: string): Promise { + return this.alfrescoApiService + .getInstance() + .core.queriesApi.findSites(libraryTitle) + .catch(() => ({ list: { entries: [] } })); + } } diff --git a/src/assets/i18n/en.json b/src/assets/i18n/en.json index f0932015c..20e4f3a26 100644 --- a/src/assets/i18n/en.json +++ b/src/assets/i18n/en.json @@ -298,6 +298,9 @@ "PUBLIC": "Public", "MODERATED": "Moderated" }, + "HINTS": { + "SITE_TITLE_EXISTS": "Library name already in use" + }, "ERRORS": { "GENERIC": "We hit a problem", "EXISTENT_SITE": "This Library ID isn't available. Try a different Library ID.",