RED-3745 -> As an admin I want to clone a dossier template
This commit is contained in:
parent
0f32bb05eb
commit
18c0c0662b
@ -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,
|
||||
|
||||
@ -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>
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
@ -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)) {
|
||||
|
||||
@ -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 });
|
||||
}
|
||||
}
|
||||
|
||||
@ -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: {
|
||||
|
||||
@ -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"
|
||||
|
||||
@ -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) {
|
||||
|
||||
@ -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"
|
||||
},
|
||||
|
||||
@ -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
|
||||
Loading…
x
Reference in New Issue
Block a user