From 7260b87f2128be27cdcd662f7f22af159dc23184 Mon Sep 17 00:00:00 2001 From: Valentin Mihai Date: Fri, 15 Apr 2022 17:54:39 +0300 Subject: [PATCH] RED-3745 - updated the way of how clone name is generated --- ...clone-dossier-template-dialog.component.ts | 39 +++++++++++++------ .../dossier-templates.service.ts | 6 +++ 2 files changed, 34 insertions(+), 11 deletions(-) diff --git a/apps/red-ui/src/app/modules/admin/dialogs/add-edit-clone-dossier-template-dialog/add-edit-clone-dossier-template-dialog.component.ts b/apps/red-ui/src/app/modules/admin/dialogs/add-edit-clone-dossier-template-dialog/add-edit-clone-dossier-template-dialog.component.ts index b27d52c16..a05cf3c1e 100644 --- a/apps/red-ui/src/app/modules/admin/dialogs/add-edit-clone-dossier-template-dialog/add-edit-clone-dossier-template-dialog.component.ts +++ b/apps/red-ui/src/app/modules/admin/dialogs/add-edit-clone-dossier-template-dialog/add-edit-clone-dossier-template-dialog.component.ts @@ -86,7 +86,13 @@ export class AddEditCloneDossierTemplateDialogComponent extends BaseDialogCompon validFrom: this.hasValidFrom ? this.form.get('validFrom').value : null, validTo: this.hasValidTo ? this.form.get('validTo').value : null, } as IDossierTemplate; - await firstValueFrom(this._dossierTemplatesService.createOrUpdate(dossierTemplate)); + if (this.data?.clone) { + const dossierTemplateId = this.dossierTemplate?.dossierTemplateId; + const nameOfClonedTemplate = this._getNameOfClonedTemplate(this.dossierTemplate.name); + await firstValueFrom(this._dossierTemplatesService.clone(dossierTemplate, dossierTemplateId, nameOfClonedTemplate)); + } else { + await firstValueFrom(this._dossierTemplatesService.createOrUpdate(dossierTemplate)); + } this._dialogRef.close(true); } catch (error: any) { const message = @@ -116,24 +122,35 @@ export class AddEditCloneDossierTemplateDialogComponent extends BaseDialogCompon private _getTemplateName(): string | null { if (this.dossierTemplate) { - const name = this.dossierTemplate.name.trim(); + const templateName = this.dossierTemplate.name.trim(); if (this.data.clone) { - const prefix = 'Clone of '; - if (name.startsWith(prefix)) { - const regExp = /\(\s*\d+\s*\)$/; - if (regExp.test(name)) { - const lastNumberRegExp = /\d+(?=\D*$)/; - return name.replace(lastNumberRegExp, parseInt(name.match(lastNumberRegExp)[0]) + 1 + ''); + const nameOfClonedTemplate = this._getNameOfClonedTemplate(templateName); + const allTemplatesNames = this._dossierTemplatesService.all.map(t => t.name); + + let clonesCount = 0; + for (const name of allTemplatesNames) { + const splitName = name.split(nameOfClonedTemplate); + const suffixRegExp = new RegExp(/^\(\s*\d+\s*\)$/); + if (splitName[0] === 'Clone of ' && (splitName[1].trim().match(suffixRegExp) || splitName[1] === '')) { + clonesCount++; } - return `${name} (1)`; } - return prefix + name; + + if (clonesCount >= 1) { + return `Clone of ${nameOfClonedTemplate} ${clonesCount === 1 ? '(1)' : `(${clonesCount})`}`; + } + return `Clone of ${nameOfClonedTemplate}`; } - return name; + return templateName; } return null; } + private _getNameOfClonedTemplate(templateName: string): string { + const nameOfClonedTemplate = templateName.split('Clone of ').filter(n => n)[0]; + return nameOfClonedTemplate.split(/\(\s*\d+\s*\)$/)[0].trim(); + } + private _applyValidityIntervalConstraints(value): boolean { if (applyIntervalConstraints(value, this._previousValidFrom, this._previousValidTo, this.form, 'validFrom', 'validTo')) { return true; diff --git a/apps/red-ui/src/app/services/entity-services/dossier-templates.service.ts b/apps/red-ui/src/app/services/entity-services/dossier-templates.service.ts index 0b645589e..5a28f77c3 100644 --- a/apps/red-ui/src/app/services/entity-services/dossier-templates.service.ts +++ b/apps/red-ui/src/app/services/entity-services/dossier-templates.service.ts @@ -70,6 +70,12 @@ export class DossierTemplatesService extends EntitiesService this.loadAll())); } + clone(@RequiredParam() body: any, dossierTemplateId: string, name: string) { + return this._post(body, `${this._defaultModelPath}/${dossierTemplateId}/clone?nameOfClonedDossierTemplate=${name}`).pipe( + switchMap(() => this.loadAll()), + ); + } + refreshDossierTemplate(dossierTemplateId: string): Observable { return forkJoin([ this._fileAttributesService.loadFileAttributesConfig(dossierTemplateId),