diff --git a/apps/red-ui/src/app/modules/admin/admin.module.ts b/apps/red-ui/src/app/modules/admin/admin.module.ts index 81a7a91b0..8f417aab5 100644 --- a/apps/red-ui/src/app/modules/admin/admin.module.ts +++ b/apps/red-ui/src/app/modules/admin/admin.module.ts @@ -17,7 +17,7 @@ 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 { AddEditDictionaryDialogComponent } from './dialogs/add-edit-dictionary-dialog/add-edit-dictionary-dialog.component'; -import { ConfirmDeleteFileAttributeDialogComponent } from './dialogs/confirm-delete-file-attribute-dialog/confirm-delete-file-attribute-dialog.component'; +import { ConfirmDeleteAttributeDialogComponent } from './dialogs/confirm-delete-attribute-dialog/confirm-delete-attribute-dialog.component'; import { EditColorDialogComponent } from './dialogs/edit-color-dialog/edit-color-dialog.component'; import { ComboChartComponent, ComboSeriesVerticalComponent } from './components/combo-chart'; import { NgxChartsModule } from '@swimlane/ngx-charts'; @@ -53,7 +53,7 @@ const dialogs = [ AddEditDossierTemplateDialogComponent, AddEditDictionaryDialogComponent, AddEditFileAttributeDialogComponent, - ConfirmDeleteFileAttributeDialogComponent, + ConfirmDeleteAttributeDialogComponent, EditColorDialogComponent, SmtpAuthDialogComponent, AddEditUserDialogComponent, diff --git a/apps/red-ui/src/app/modules/admin/dialogs/confirm-delete-file-attribute-dialog/confirm-delete-file-attribute-dialog.component.html b/apps/red-ui/src/app/modules/admin/dialogs/confirm-delete-attribute-dialog/confirm-delete-attribute-dialog.component.html similarity index 64% rename from apps/red-ui/src/app/modules/admin/dialogs/confirm-delete-file-attribute-dialog/confirm-delete-file-attribute-dialog.component.html rename to apps/red-ui/src/app/modules/admin/dialogs/confirm-delete-attribute-dialog/confirm-delete-attribute-dialog.component.html index d90c5f201..b7442e49a 100644 --- a/apps/red-ui/src/app/modules/admin/dialogs/confirm-delete-file-attribute-dialog/confirm-delete-file-attribute-dialog.component.html +++ b/apps/red-ui/src/app/modules/admin/dialogs/confirm-delete-attribute-dialog/confirm-delete-attribute-dialog.component.html @@ -1,13 +1,6 @@
- {{ - 'confirm-delete-file-attribute.title' - | translate - : { - type: type, - name: fileAttribute?.label - } - }} + {{ 'confirm-delete-file-attribute.title' | translate: translateArgs }}
@@ -20,14 +13,11 @@
- - {{ checkbox.label | translate: { type: type } }} - + + + {{ checkbox.label }} + +
@@ -35,7 +25,7 @@ {{ 'confirm-delete-file-attribute.delete' | translate: { type: type } }}
+ value instanceof FileAttributeConfig; + +interface CheckBox { + value: boolean; + label: string; +} + +interface DialogData { + attribute: FileAttributeConfig | DossierAttributeConfig; + count: number; +} + +@Component({ + selector: 'redaction-confirm-delete-attribute-dialog', + templateUrl: './confirm-delete-attribute-dialog.component.html', + styleUrls: ['./confirm-delete-attribute-dialog.component.scss'], +}) +export class ConfirmDeleteAttributeDialogComponent { + checkboxes: CheckBox[]; + showToast = false; + + constructor( + private readonly _translateService: TranslateService, + readonly dialogRef: MatDialogRef, + @Inject(MAT_DIALOG_DATA) public data: DialogData, + ) { + this.checkboxes = this.checkBoxConfig; + } + + get checkBoxConfig(): CheckBox[] { + const checkBoxes = isFileAttributeConfig(this.data.attribute) ? this._fileAttributeCheckboxes : this._dossierAttributeCheckboxes; + if (this.data.count !== 0) { + checkBoxes.push({ + value: false, + label: this._translateService.instant('confirm-delete-file-attribute.impacted-report', { count: this.data.count }), + }); + } + + return checkBoxes; + } + + get valid() { + return this.checkboxes.reduce((acc, currentValue) => acc && currentValue.value, true); + } + + get type(): 'bulk' | 'single' { + return this.data.attribute ? 'single' : 'bulk'; + } + + get translateArgs() { + return { + type: this.type, + name: this.data.attribute?.label, + }; + } + + private get _fileAttributeCheckboxes(): CheckBox[] { + return [ + { + value: false, + label: this._translateService.instant('confirm-delete-file-attribute.file-impacted-documents', { type: this.type }), + }, + { value: false, label: this._translateService.instant('confirm-delete-file-attribute.file-lost-details') }, + ]; + } + + private get _dossierAttributeCheckboxes(): CheckBox[] { + return [ + { value: false, label: this._translateService.instant('confirm-delete-file-attribute.dossier-impacted-documents') }, + { value: false, label: this._translateService.instant('confirm-delete-file-attribute.dossier-lost-details') }, + ]; + } + + deleteFileAttribute() { + if (this.valid) { + this.dialogRef.close(true); + } else { + this.showToast = true; + } + } +} diff --git a/apps/red-ui/src/app/modules/admin/dialogs/confirm-delete-file-attribute-dialog/confirm-delete-file-attribute-dialog.component.ts b/apps/red-ui/src/app/modules/admin/dialogs/confirm-delete-file-attribute-dialog/confirm-delete-file-attribute-dialog.component.ts deleted file mode 100644 index 1cf2cee1b..000000000 --- a/apps/red-ui/src/app/modules/admin/dialogs/confirm-delete-file-attribute-dialog/confirm-delete-file-attribute-dialog.component.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { Component, Inject } from '@angular/core'; -import { IFileAttributeConfig } from '@red/domain'; -import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; -import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; - -@Component({ - selector: 'redaction-confirm-delete-file-attribute-dialog', - templateUrl: './confirm-delete-file-attribute-dialog.component.html', - styleUrls: ['./confirm-delete-file-attribute-dialog.component.scss'], -}) -export class ConfirmDeleteFileAttributeDialogComponent { - fileAttribute: IFileAttributeConfig; - checkboxes = [ - { value: false, label: _('confirm-delete-file-attribute.impacted-documents') }, - { value: false, label: _('confirm-delete-file-attribute.lost-details') }, - ]; - showToast = false; - - constructor( - public dialogRef: MatDialogRef, - @Inject(MAT_DIALOG_DATA) public data: IFileAttributeConfig, - ) { - this.fileAttribute = data; - } - - get valid() { - return this.checkboxes[0].value && this.checkboxes[1].value; - } - - get type(): 'bulk' | 'single' { - return this.fileAttribute ? 'single' : 'bulk'; - } - - deleteFileAttribute() { - if (this.valid) { - this.dialogRef.close(true); - } else { - this.showToast = true; - } - } - - cancel() { - this.dialogRef.close(); - } -} diff --git a/apps/red-ui/src/app/modules/admin/screens/dossier-attributes-listing/dossier-attributes-listing-screen.component.ts b/apps/red-ui/src/app/modules/admin/screens/dossier-attributes-listing/dossier-attributes-listing-screen.component.ts index 490b4515e..50f43dc35 100644 --- a/apps/red-ui/src/app/modules/admin/screens/dossier-attributes-listing/dossier-attributes-listing-screen.component.ts +++ b/apps/red-ui/src/app/modules/admin/screens/dossier-attributes-listing/dossier-attributes-listing-screen.component.ts @@ -16,6 +16,7 @@ import { UserService } from '@services/user.service'; import { DossierAttributeConfig, IDossierAttributeConfig } from '@red/domain'; import { DossierTemplatesService } from '@services/entity-services/dossier-templates.service'; import { firstValueFrom } from 'rxjs'; +import { ReportTemplateService } from '../../../../services/report-template.service'; @Component({ templateUrl: './dossier-attributes-listing-screen.component.html', @@ -45,6 +46,7 @@ export class DossierAttributesListingScreenComponent extends ListingComponent { + async openConfirmDeleteAttributeDialog($event: MouseEvent, dossierAttribute?: DossierAttributeConfig) { + const dossierTemplateId = this._dossierTemplatesService.activeDossierTemplateId; + const resp = await firstValueFrom( + this._reportTemplateService.getTemplatesByPlaceholder(dossierTemplateId, dossierAttribute.placeholder), + ); + + this._dialogService.openDialog('deleteAttribute', $event, { attribute: dossierAttribute, count: resp.length }, async () => { this._loadingService.start(); const ids = dossierAttribute ? [dossierAttribute.id] : this.listingService.selected.map(item => item.id); await firstValueFrom(this._dossierAttributesService.delete(ids)); diff --git a/apps/red-ui/src/app/modules/admin/screens/file-attributes-listing/file-attributes-listing-screen.component.ts b/apps/red-ui/src/app/modules/admin/screens/file-attributes-listing/file-attributes-listing-screen.component.ts index d94729b50..74774974a 100644 --- a/apps/red-ui/src/app/modules/admin/screens/file-attributes-listing/file-attributes-listing-screen.component.ts +++ b/apps/red-ui/src/app/modules/admin/screens/file-attributes-listing/file-attributes-listing-screen.component.ts @@ -18,6 +18,7 @@ import { FileAttributesService } from '@services/entity-services/file-attributes import { DossierTemplatesService } from '@services/entity-services/dossier-templates.service'; import { HttpStatusCode } from '@angular/common/http'; import { firstValueFrom } from 'rxjs'; +import { ReportTemplateService } from '../../../../services/report-template.service'; @Component({ templateUrl: './file-attributes-listing-screen.component.html', @@ -60,6 +61,7 @@ export class FileAttributesListingScreenComponent extends ListingComponent { + async openConfirmDeleteAttributeDialog($event: MouseEvent, fileAttribute?: FileAttributeConfig) { + const dossierTemplateId = this._dossierTemplatesService.activeDossierTemplateId; + const resp = await firstValueFrom( + this._reportTemplateService.getTemplatesByPlaceholder(dossierTemplateId, fileAttribute.placeholder), + ); + + this._dialogService.openDialog('deleteAttribute', $event, { attribute: fileAttribute, count: resp.length }, async () => { this._loadingService.start(); - const dossierTemplateId = this._dossierTemplatesService.activeDossierTemplateId; if (fileAttribute) { await firstValueFrom(this._fileAttributesService.deleteFileAttributes([fileAttribute.id], dossierTemplateId)); } else { diff --git a/apps/red-ui/src/app/modules/admin/services/admin-dialog.service.ts b/apps/red-ui/src/app/modules/admin/services/admin-dialog.service.ts index 6d161fb42..41548f39a 100644 --- a/apps/red-ui/src/app/modules/admin/services/admin-dialog.service.ts +++ b/apps/red-ui/src/app/modules/admin/services/admin-dialog.service.ts @@ -3,7 +3,7 @@ import { MatDialog } from '@angular/material/dialog'; import { AddEditFileAttributeDialogComponent } from '../dialogs/add-edit-file-attribute-dialog/add-edit-file-attribute-dialog.component'; import { AddEditDictionaryDialogComponent } from '../dialogs/add-edit-dictionary-dialog/add-edit-dictionary-dialog.component'; import { AddEditDossierTemplateDialogComponent } from '../dialogs/add-edit-dossier-template-dialog/add-edit-dossier-template-dialog.component'; -import { ConfirmDeleteFileAttributeDialogComponent } from '../dialogs/confirm-delete-file-attribute-dialog/confirm-delete-file-attribute-dialog.component'; +import { ConfirmDeleteAttributeDialogComponent } from '../dialogs/confirm-delete-attribute-dialog/confirm-delete-attribute-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'; @@ -19,7 +19,7 @@ type DialogType = | 'addEditDictionary' | 'editColor' | 'addEditFileAttribute' - | 'deleteFileAttribute' + | 'deleteAttribute' | 'importFileAttributes' | 'addEditUser' | 'deleteUsers' @@ -48,8 +48,8 @@ export class AdminDialogService extends DialogService { component: AddEditFileAttributeDialogComponent, dialogConfig: { autoFocus: true }, }, - deleteFileAttribute: { - component: ConfirmDeleteFileAttributeDialogComponent, + deleteAttribute: { + component: ConfirmDeleteAttributeDialogComponent, dialogConfig: { disableClose: false }, }, importFileAttributes: { diff --git a/apps/red-ui/src/app/services/report-template.service.ts b/apps/red-ui/src/app/services/report-template.service.ts index 72083e60e..585f4c36a 100644 --- a/apps/red-ui/src/app/services/report-template.service.ts +++ b/apps/red-ui/src/app/services/report-template.service.ts @@ -43,6 +43,11 @@ export class ReportTemplateService extends GenericService { return this._getOne([dossierTemplateId], 'placeholders'); } + @Validate() + getTemplatesByPlaceholder(@RequiredParam() dossierTemplateId: string, @RequiredParam() attributeId: string) { + return this._post({ value: attributeId }, `templates/${dossierTemplateId}`); + } + downloadReportTemplate(dossierTemplateId: string, templateId: string, observe: 'response'): Observable>; downloadReportTemplate(dossierTemplateId: string, templateId: string, observe: 'body'): Observable; @Validate() diff --git a/apps/red-ui/src/assets/i18n/de.json b/apps/red-ui/src/assets/i18n/de.json index 262c2d514..7dd9ec900 100644 --- a/apps/red-ui/src/assets/i18n/de.json +++ b/apps/red-ui/src/assets/i18n/de.json @@ -395,11 +395,14 @@ "confirm-delete-file-attribute": { "cancel": "{type, select, single{Attribut} bulk{Attribute} other{}} behalten", "delete": "{type, select, single{Attribut} bulk{Attribute} other{}} löschen", - "impacted-documents": "Alle Dokumente {type, select, single{ist} bulk{sind} other{}} betroffen", - "lost-details": "Alle in die Dokumente eingegebenen Daten gehen verloren", + "file-impacted-documents": "Alle Dokumente {type, select, single{ist} bulk{sind} other{}} betroffen", + "dossier-impacted-documents": "", + "file-lost-details": "Alle in die Dokumente eingegebenen Daten gehen verloren", + "dossier-lost-details": "", "title": "{type, select, single{{name}} bulk{Datei-Attribute} other{}} löschen", "toast-error": "Bitte bestätigen Sie, dass Ihnen die Konsequenzen dieser Aktion bewusst sind!", - "warning": "Achtung: Diese Aktion kann nicht rückgängig gemacht werden!" + "warning": "Achtung: Diese Aktion kann nicht rückgängig gemacht werden!", + "impacted-report": "{count}" }, "confirm-delete-users": { "cancel": "{usersCount, plural, one{Benutzer} other{Benutzer}} behalten", diff --git a/apps/red-ui/src/assets/i18n/en.json b/apps/red-ui/src/assets/i18n/en.json index a9c81135f..5df64f861 100644 --- a/apps/red-ui/src/assets/i18n/en.json +++ b/apps/red-ui/src/assets/i18n/en.json @@ -395,11 +395,14 @@ "confirm-delete-file-attribute": { "cancel": "Keep {type, select, single{Attribute} bulk{Attributes} other{}}", "delete": "Delete {type, select, single{Attribute} bulk{Attributes} other{}}", - "impacted-documents": "All documents {type, select, single{it is} bulk{they are} other{}} used on will be impacted", - "lost-details": "All inputted details on the documents will be lost", + "file-impacted-documents": "All documents {type, select, single{it is} bulk{they are} other{}} used on will be impacted", + "dossier-impacted-documents": "All dossiers based on this template will be affected", + "file-lost-details": "All inputted details on the documents will be lost", + "dossier-lost-details": "All values for this attribute will be lost", "title": "Delete {type, select, single{{name}} bulk{File Attributes} other{}}", "toast-error": "Please confirm that you understand the ramifications of your action!", - "warning": "Warning: this cannot be undone!" + "warning": "Warning: this cannot be undone!", + "impacted-report": "{count} reports use the placeholder for this attribute and need to be adjusted" }, "confirm-delete-users": { "cancel": "Keep {usersCount, plural, one{User} other{Users}}",