RED-3745 -> As an admin I want to clone a dossier template

This commit is contained in:
Valentin Mihai 2022-03-31 21:25:06 +03:00
parent 0f32bb05eb
commit 18c0c0662b
12 changed files with 78 additions and 39 deletions

View File

@ -12,7 +12,7 @@ import { UserListingScreenComponent } from './screens/user-listing/user-listing-
import { DossierTemplateBreadcrumbsComponent } from './components/dossier-template-breadcrumbs/dossier-template-breadcrumbs.component';
import { ColorPickerModule } from 'ngx-color-picker';
import { AddEditFileAttributeDialogComponent } from './dialogs/add-edit-file-attribute-dialog/add-edit-file-attribute-dialog.component';
import { AddEditDossierTemplateDialogComponent } from './dialogs/add-edit-dossier-template-dialog/add-edit-dossier-template-dialog.component';
import { AddEditCloneDossierTemplateDialogComponent } from './dialogs/add-edit-clone-dossier-template-dialog/add-edit-clone-dossier-template-dialog.component';
import { AddEntityDialogComponent } from './dialogs/add-entity-dialog/add-entity-dialog.component';
import { EditColorDialogComponent } from './dialogs/edit-color-dialog/edit-color-dialog.component';
import { ComboChartComponent, ComboSeriesVerticalComponent } from './components/combo-chart';
@ -50,7 +50,7 @@ import { TrashTableItemComponent } from './screens/trash/trash-table-item/trash-
import { BaseEntityScreenComponent } from './base-entity-screen/base-entity-screen.component';
const dialogs = [
AddEditDossierTemplateDialogComponent,
AddEditCloneDossierTemplateDialogComponent,
AddEntityDialogComponent,
AddEditFileAttributeDialogComponent,
EditColorDialogComponent,

View File

@ -1,19 +1,19 @@
<section class="dialog">
<div
[translateParams]="{
type: dossierTemplate ? 'edit' : 'create',
type: dossierTemplate ? (data.clone ? 'clone' : 'edit') : 'create',
name: dossierTemplate?.name
}"
[translate]="'add-edit-dossier-template.title'"
[translate]="'add-edit-clone-dossier-template.title'"
class="dialog-header heading-l"
></div>
<form [formGroup]="form">
<div class="dialog-content">
<div class="iqser-input-group required w-300">
<label translate="add-edit-dossier-template.form.name"></label>
<label translate="add-edit-clone-dossier-template.form.name"></label>
<input
[placeholder]="'add-edit-dossier-template.form.name-placeholder' | translate"
[placeholder]="'add-edit-clone-dossier-template.form.name-placeholder' | translate"
formControlName="name"
name="name"
type="text"
@ -21,9 +21,9 @@
</div>
<div class="iqser-input-group w-400">
<label translate="add-edit-dossier-template.form.description"></label>
<label translate="add-edit-clone-dossier-template.form.description"></label>
<textarea
[placeholder]="'add-edit-dossier-template.form.description-placeholder' | translate"
[placeholder]="'add-edit-clone-dossier-template.form.description-placeholder' | translate"
formControlName="description"
name="description"
rows="4"
@ -34,11 +34,11 @@
<div class="validity">
<div>
<mat-checkbox (change)="toggleHasValid('from')" [checked]="hasValidFrom" class="filter-menu-checkbox" color="primary">
{{ 'add-edit-dossier-template.form.valid-from' | translate }}
{{ 'add-edit-clone-dossier-template.form.valid-from' | translate }}
</mat-checkbox>
<mat-checkbox (change)="toggleHasValid('to')" [checked]="hasValidTo" class="filter-menu-checkbox" color="primary">
{{ 'add-edit-dossier-template.form.valid-to' | translate }}
{{ 'add-edit-clone-dossier-template.form.valid-to' | translate }}
</mat-checkbox>
</div>
@ -83,7 +83,7 @@
<div class="dialog-actions">
<button (click)="save()" [disabled]="disabled" color="primary" mat-flat-button type="button">
{{ 'add-edit-dossier-template.save' | translate }}
{{ 'add-edit-clone-dossier-template.save' | translate }}
</button>
</div>
</form>

View File

@ -12,11 +12,16 @@ import { DictionaryService } from '@services/entity-services/dictionary.service'
import { firstValueFrom } from 'rxjs';
import dayjs, { Dayjs } from 'dayjs';
interface EditCloneTemplateData {
dossierTemplateId: string;
clone?: boolean;
}
@Component({
templateUrl: './add-edit-dossier-template-dialog.component.html',
styleUrls: ['./add-edit-dossier-template-dialog.component.scss'],
templateUrl: './add-edit-clone-dossier-template-dialog.component.html',
styleUrls: ['./add-edit-clone-dossier-template-dialog.component.scss'],
})
export class AddEditDossierTemplateDialogComponent extends BaseDialogComponent {
export class AddEditCloneDossierTemplateDialogComponent extends BaseDialogComponent {
hasValidFrom: boolean;
hasValidTo: boolean;
downloadTypesEnum: DownloadFileType[] = ['ORIGINAL', 'PREVIEW', 'DELTA_PREVIEW', 'REDACTED'];
@ -36,12 +41,12 @@ export class AddEditDossierTemplateDialogComponent extends BaseDialogComponent {
private readonly _dictionaryService: DictionaryService,
private readonly _formBuilder: FormBuilder,
protected readonly _injector: Injector,
protected readonly _dialogRef: MatDialogRef<AddEditDossierTemplateDialogComponent>,
protected readonly _dialogRef: MatDialogRef<AddEditCloneDossierTemplateDialogComponent>,
private readonly _loadingService: LoadingService,
@Inject(MAT_DIALOG_DATA) readonly dossierTemplateId: string,
@Inject(MAT_DIALOG_DATA) readonly data: EditCloneTemplateData,
) {
super(_injector, _dialogRef, !!dossierTemplateId);
this.dossierTemplate = this._dossierTemplatesService.find(this.dossierTemplateId);
super(_injector, _dialogRef, !!data && !data.clone);
this.dossierTemplate = this._dossierTemplatesService.find(this.data?.dossierTemplateId);
this.form = this._getForm();
this.initialFormValue = this.form.getRawValue();
this.hasValidFrom = !!this.dossierTemplate?.validFrom;
@ -76,7 +81,7 @@ export class AddEditDossierTemplateDialogComponent extends BaseDialogComponent {
this._loadingService.start();
try {
const dossierTemplate = {
dossierTemplateId: this.dossierTemplate?.dossierTemplateId,
dossierTemplateId: !this.data?.clone ? this.dossierTemplate?.dossierTemplateId : null,
...this.form.getRawValue(),
validFrom: this.hasValidFrom ? this.form.get('validFrom').value : null,
validTo: this.hasValidTo ? this.form.get('validTo').value : null,
@ -86,8 +91,8 @@ export class AddEditDossierTemplateDialogComponent extends BaseDialogComponent {
} catch (error: any) {
const message =
error.status === HttpStatusCode.Conflict
? _('add-edit-dossier-template.error.conflict')
: _('add-edit-dossier-template.error.generic');
? _('add-edit-clone-dossier-template.error.conflict')
: _('add-edit-clone-dossier-template.error.generic');
this._toaster.error(message, { error });
}
this._loadingService.stop();
@ -95,7 +100,7 @@ export class AddEditDossierTemplateDialogComponent extends BaseDialogComponent {
private _getForm(): FormGroup {
return this._formBuilder.group({
name: [this.dossierTemplate?.name, Validators.required],
name: [this._getTemplateName(), Validators.required],
description: [this.dossierTemplate?.description],
validFrom: [
this.dossierTemplate?.validFrom ? dayjs(this.dossierTemplate?.validFrom) : null,
@ -109,6 +114,26 @@ export class AddEditDossierTemplateDialogComponent extends BaseDialogComponent {
});
}
private _getTemplateName(): string | null {
if (this.dossierTemplate) {
const name = 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 + '');
}
return `${name} (1)`;
}
return prefix + name;
}
return name;
}
return null;
}
private _applyValidityIntervalConstraints(value): boolean {
if (applyIntervalConstraints(value, this._previousValidFrom, this._previousValidTo, this.form, 'validFrom', 'validTo')) {
return true;
@ -130,4 +155,11 @@ export class AddEditDossierTemplateDialogComponent extends BaseDialogComponent {
return null;
};
}
get disabled(): boolean {
if (!this.data?.clone) {
return super.disabled;
}
return !this.valid;
}
}

View File

@ -63,7 +63,7 @@ export class DossierTemplatesListingScreenComponent extends ListingComponent<Dos
}
openAddDossierTemplateDialog() {
this._dialogService.openDialog('addEditDossierTemplate', null, null);
this._dialogService.openDialog('addEditCloneDossierTemplate', null, null);
}
private async _deleteTemplates(templateIds = this.listingService.selected.map(d => d.dossierTemplateId)) {

View File

@ -32,6 +32,6 @@ export class DossierTemplateInfoScreenComponent {
}
openEditDossierTemplateDialog($event: MouseEvent, dossierTemplate: DossierTemplate) {
this._dialogService.openDialog('addEditDossierTemplate', $event, dossierTemplate.id);
this._dialogService.openDialog('addEditCloneDossierTemplate', $event, { dossierTemplateId: dossierTemplate.id });
}
}

View File

@ -2,7 +2,7 @@ import { Injectable, TemplateRef } from '@angular/core';
import { MatDialog } from '@angular/material/dialog';
import { AddEditFileAttributeDialogComponent } from '../dialogs/add-edit-file-attribute-dialog/add-edit-file-attribute-dialog.component';
import { AddEntityDialogComponent } from '../dialogs/add-entity-dialog/add-entity-dialog.component';
import { AddEditDossierTemplateDialogComponent } from '../dialogs/add-edit-dossier-template-dialog/add-edit-dossier-template-dialog.component';
import { AddEditCloneDossierTemplateDialogComponent } from '../dialogs/add-edit-clone-dossier-template-dialog/add-edit-clone-dossier-template-dialog.component';
import { EditColorDialogComponent } from '../dialogs/edit-color-dialog/edit-color-dialog.component';
import { SmtpAuthDialogComponent } from '../dialogs/smtp-auth-dialog/smtp-auth-dialog.component';
import { AddEditUserDialogComponent } from '../dialogs/add-edit-user-dialog/add-edit-user-dialog.component';
@ -38,7 +38,7 @@ type DialogType =
| 'fileAttributesConfigurations'
| 'addEditUser'
| 'smtpAuthConfig'
| 'addEditDossierTemplate'
| 'addEditCloneDossierTemplate'
| 'addEditDossierAttribute'
| 'uploadDictionary'
| 'addEditDossierState'
@ -78,8 +78,8 @@ export class AdminDialogService extends DialogService<DialogType> {
component: SmtpAuthDialogComponent,
dialogConfig: { autoFocus: true },
},
addEditDossierTemplate: {
component: AddEditDossierTemplateDialogComponent,
addEditCloneDossierTemplate: {
component: AddEditCloneDossierTemplateDialogComponent,
dialogConfig: { width: '900px', autoFocus: true },
},
addEditDossierAttribute: {

View File

@ -1,15 +1,20 @@
<div class="action-buttons">
<div class="action-buttons" *ngIf="currentUser.isAdmin">
<iqser-circle-button
(action)="openDeleteDossierTemplateDialog($event)"
*ngIf="currentUser.isAdmin"
[tooltip]="'dossier-templates-listing.action.delete' | translate"
icon="iqser:trash"
[type]="circleButtonTypes.dark"
></iqser-circle-button>
<iqser-circle-button
(action)="openEditDossierTemplateDialog($event)"
*ngIf="currentUser.isAdmin"
(action)="openEditCloneDossierTemplateDialog($event, true)"
[tooltip]="'dossier-templates-listing.action.clone' | translate"
icon="iqser:copy"
[type]="circleButtonTypes.dark"
></iqser-circle-button>
<iqser-circle-button
(action)="openEditCloneDossierTemplateDialog($event)"
[tooltip]="'dossier-templates-listing.action.edit' | translate"
icon="iqser:edit"
[type]="circleButtonTypes.dark"

View File

@ -34,8 +34,8 @@ export class DossierTemplateActionsComponent implements OnInit {
this.dossierTemplateId ??= this._route.snapshot.paramMap.get(DOSSIER_TEMPLATE_ID);
}
openEditDossierTemplateDialog($event: MouseEvent) {
this._dialogService.openDialog('addEditDossierTemplate', $event, this.dossierTemplateId);
openEditCloneDossierTemplateDialog($event: MouseEvent, clone: boolean = false) {
this._dialogService.openDialog('addEditCloneDossierTemplate', $event, { dossierTemplateId: this.dossierTemplateId, clone });
}
openDeleteDossierTemplateDialog($event?: MouseEvent) {

View File

@ -61,7 +61,7 @@
"success": "",
"title": ""
},
"add-edit-dossier-template": {
"add-edit-clone-dossier-template": {
"error": {
"conflict": "Dossiervorlage konnte nicht erstellt werden: Es existiert bereits eine Dossiervorlage mit demselben Namen.",
"generic": "Fehler beim Erstellen der Dossiervorlage."
@ -75,7 +75,7 @@
"valid-to": "Gültig bis"
},
"save": "Dossier-Vorlage speichern",
"title": "{type, select, edit{Dossier-Vorlage {name} bearbeiten} create{Dossier-Vorlage erstellen} other{}}"
"title": "{type, select, edit{Dossier-Vorlage {name} bearbeiten} create{Dossier-Vorlage erstellen} clone{} other{}}"
},
"add-edit-entity": {
"error": {
@ -905,6 +905,7 @@
},
"dossier-templates-listing": {
"action": {
"clone": "",
"delete": "Dossier-Vorlage",
"edit": "Vorlage bearbeiten"
},

View File

@ -61,7 +61,7 @@
"success": "Successfully {type, select, edit{updated} create{created} other{}} the dossier state!",
"title": "{type, select, edit{Edit {name}} create{Create} other{}} Dossier State"
},
"add-edit-dossier-template": {
"add-edit-clone-dossier-template": {
"error": {
"conflict": "Failed to create dossier template: a dossier template with the same name already exists.",
"generic": "Failed to create dossier template."
@ -75,7 +75,7 @@
"valid-to": "Valid to"
},
"save": "Save Dossier Template",
"title": "{type, select, edit{Edit {name}} create{Create} other{}} Dossier Template"
"title": "{type, select, edit{Edit {name}} create{Create} clone{Clone} other{}} Dossier Template"
},
"add-edit-entity": {
"error": {
@ -905,6 +905,7 @@
},
"dossier-templates-listing": {
"action": {
"clone": "Clone Template",
"delete": "Delete Template",
"edit": "Edit Template"
},

@ -1 +1 @@
Subproject commit 750aedd48a4a7af04b2026a51843420237ff94e5
Subproject commit 6c0823a94da5b33af366c693ccd94a0f3f37f7ce