From e56afdcea2270235f4d6e9fff27382a3c42e6809 Mon Sep 17 00:00:00 2001 From: Nicoleta Panaghiu Date: Fri, 19 Apr 2024 15:23:53 +0300 Subject: [PATCH] RED-8945: set addToDictionaryAction flag on dossier level. --- .../src/app/guards/dossier-files-guard.ts | 2 +- .../add-hint-dialog.component.ts | 2 +- .../edit-redaction-dialog.component.ts | 4 +- .../manual-annotation-dialog.component.ts | 2 +- .../redact-recommendation-dialog.component.ts | 2 +- .../redact-text-dialog.component.ts | 2 +- .../edit-dictionary-dialog.component.html | 33 ++++ .../edit-dictionary-dialog.component.ts | 81 +++++++++ .../edit-dossier-dictionary.component.html | 7 + .../edit-dossier-dictionary.component.scss | 4 + .../edit-dossier-dictionary.component.ts | 51 ++++-- .../shared-dossiers/shared-dossiers.module.ts | 2 + .../entity-services/dictionary.service.ts | 94 +++++------ apps/red-ui/src/assets/i18n/redact/de.json | 157 +++++++++--------- apps/red-ui/src/assets/i18n/redact/en.json | 11 +- apps/red-ui/src/assets/i18n/scm/de.json | 157 +++++++++--------- apps/red-ui/src/assets/i18n/scm/en.json | 11 +- 17 files changed, 392 insertions(+), 230 deletions(-) create mode 100644 apps/red-ui/src/app/modules/shared-dossiers/dialogs/edit-dictionary-dialog/edit-dictionary-dialog.component.html create mode 100644 apps/red-ui/src/app/modules/shared-dossiers/dialogs/edit-dictionary-dialog/edit-dictionary-dialog.component.ts diff --git a/apps/red-ui/src/app/guards/dossier-files-guard.ts b/apps/red-ui/src/app/guards/dossier-files-guard.ts index 534a23c47..646a3de8e 100644 --- a/apps/red-ui/src/app/guards/dossier-files-guard.ts +++ b/apps/red-ui/src/app/guards/dossier-files-guard.ts @@ -47,7 +47,7 @@ export class DossierFilesGuard implements CanActivate { const promises = []; if (!this._dictionaryMapService.has(dossierId) && !this.isDocumine) { - const dictionaryPromise = this._dictionaryService.loadDossierRedaction(dossierTemplateId, dossierId); + const dictionaryPromise = firstValueFrom(this._dictionaryService.loadDictionaryDataForDossier(dossierTemplateId, dossierId)); promises.push(dictionaryPromise); } diff --git a/apps/red-ui/src/app/modules/file-preview/dialogs/add-hint-dialog/add-hint-dialog.component.ts b/apps/red-ui/src/app/modules/file-preview/dialogs/add-hint-dialog/add-hint-dialog.component.ts index 55c45a3b6..2aeb8f9d3 100644 --- a/apps/red-ui/src/app/modules/file-preview/dialogs/add-hint-dialog/add-hint-dialog.component.ts +++ b/apps/red-ui/src/app/modules/file-preview/dialogs/add-hint-dialog/add-hint-dialog.component.ts @@ -108,7 +108,7 @@ export class AddHintDialogComponent extends IqserDialogComponent dictionary.type); + return this._dictionaryService.getRedactionTypes(this.#dossier.dossierTemplateId).map(dictionary => dictionary.type); } get isRedactBasedType() { diff --git a/apps/red-ui/src/app/modules/file-preview/dialogs/manual-redaction-dialog/manual-annotation-dialog.component.ts b/apps/red-ui/src/app/modules/file-preview/dialogs/manual-redaction-dialog/manual-annotation-dialog.component.ts index ef23b5c70..eca423650 100644 --- a/apps/red-ui/src/app/modules/file-preview/dialogs/manual-redaction-dialog/manual-annotation-dialog.component.ts +++ b/apps/red-ui/src/app/modules/file-preview/dialogs/manual-redaction-dialog/manual-annotation-dialog.component.ts @@ -78,7 +78,7 @@ export class ManualAnnotationDialogComponent extends BaseDialogComponent impleme async ngOnInit() { this.possibleDictionaries = this.isDictionaryRequest - ? await this._dictionaryService.getDictionariesOptions(this.#dossier.dossierTemplateId, this.#dossier.id) + ? this._dictionaryService.getDictionariesOptions(this.#dossier.dossierTemplateId) : this._dictionaryService.getRedactionTypes(this.#dossier.dossierTemplateId); const data = await firstValueFrom(this._justificationsService.getForDossierTemplate(this.#dossier.dossierTemplateId)); diff --git a/apps/red-ui/src/app/modules/file-preview/dialogs/redact-recommendation-dialog/redact-recommendation-dialog.component.ts b/apps/red-ui/src/app/modules/file-preview/dialogs/redact-recommendation-dialog/redact-recommendation-dialog.component.ts index d34afa725..5eb8e2070 100644 --- a/apps/red-ui/src/app/modules/file-preview/dialogs/redact-recommendation-dialog/redact-recommendation-dialog.component.ts +++ b/apps/red-ui/src/app/modules/file-preview/dialogs/redact-recommendation-dialog/redact-recommendation-dialog.component.ts @@ -115,7 +115,7 @@ export class RedactRecommendationDialogComponent } #setDictionaries() { - this.dictionaries = this._dictionaryService.getRedactTextDictionaries(this.#dossier.dossierTemplateId, !this.#applyToAllDossiers); + this.dictionaries = this._dictionaryService.getRedactTextDictionaries(this.#dossier.dossierId, !this.#applyToAllDossiers); } #selectReason() { diff --git a/apps/red-ui/src/app/modules/file-preview/dialogs/redact-text-dialog/redact-text-dialog.component.ts b/apps/red-ui/src/app/modules/file-preview/dialogs/redact-text-dialog/redact-text-dialog.component.ts index 5399600be..12a5b4259 100644 --- a/apps/red-ui/src/app/modules/file-preview/dialogs/redact-text-dialog/redact-text-dialog.component.ts +++ b/apps/red-ui/src/app/modules/file-preview/dialogs/redact-text-dialog/redact-text-dialog.component.ts @@ -157,7 +157,7 @@ export class RedactTextDialogComponent } #setDictionaries() { - this.dictionaries = this._dictionaryService.getRedactTextDictionaries(this.#dossier.dossierTemplateId, !this.#applyToAllDossiers); + this.dictionaries = this._dictionaryService.getRedactTextDictionaries(this.#dossier.dossierId, !this.#applyToAllDossiers); } #getForm(): FormGroup { diff --git a/apps/red-ui/src/app/modules/shared-dossiers/dialogs/edit-dictionary-dialog/edit-dictionary-dialog.component.html b/apps/red-ui/src/app/modules/shared-dossiers/dialogs/edit-dictionary-dialog/edit-dictionary-dialog.component.html new file mode 100644 index 000000000..d3e86bc47 --- /dev/null +++ b/apps/red-ui/src/app/modules/shared-dossiers/dialogs/edit-dictionary-dialog/edit-dictionary-dialog.component.html @@ -0,0 +1,33 @@ +
+
+ +
+
+
+ + {{ 'edit-dossier-dialog.dictionary.edit-dialog.add-to-dictionary-action' | translate }} + +
+
+ +
+ + +
+
+
+ + +
diff --git a/apps/red-ui/src/app/modules/shared-dossiers/dialogs/edit-dictionary-dialog/edit-dictionary-dialog.component.ts b/apps/red-ui/src/app/modules/shared-dossiers/dialogs/edit-dictionary-dialog/edit-dictionary-dialog.component.ts new file mode 100644 index 000000000..f5f16cb34 --- /dev/null +++ b/apps/red-ui/src/app/modules/shared-dossiers/dialogs/edit-dictionary-dialog/edit-dictionary-dialog.component.ts @@ -0,0 +1,81 @@ +import { Component } from '@angular/core'; +import { + CircleButtonComponent, + IconButtonComponent, + IconButtonTypes, + IqserDialogComponent, + LoadingService, + Toaster, +} from '@iqser/common-ui'; +import { MatDialogClose } from '@angular/material/dialog'; +import { MatFormField } from '@angular/material/form-field'; +import { NgIf } from '@angular/common'; +import { FormBuilder, ReactiveFormsModule } from '@angular/forms'; +import { TranslateModule } from '@ngx-translate/core'; +import { MatCheckbox } from '@angular/material/checkbox'; +import { DictionaryService } from '@services/entity-services/dictionary.service'; +import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; + +interface DialogData { + addToDictionaryAction: boolean; + label: string; + type: string; + dossierTemplateId: string; + dossierId: string; + canEdit: boolean; +} + +interface ReturnType { + addToDictionaryAction: boolean; +} + +@Component({ + selector: 'redaction-edit-dictionary-dialog', + standalone: true, + imports: [ + CircleButtonComponent, + IconButtonComponent, + MatDialogClose, + MatFormField, + ReactiveFormsModule, + TranslateModule, + MatCheckbox, + NgIf, + ], + templateUrl: './edit-dictionary-dialog.component.html', +}) +export class EditDictionaryDialogComponent extends IqserDialogComponent { + readonly form = this._formBuilder.group({ + addToDictionaryAction: [{ value: this.data.addToDictionaryAction, disabled: !this.data.canEdit }], + }); + readonly initialFormValue = this.form.getRawValue(); + + constructor( + private _formBuilder: FormBuilder, + private _dictionaryService: DictionaryService, + private _loadingService: LoadingService, + private _toaster: Toaster, + ) { + super(); + } + + async save() { + this._loadingService.start(); + try { + await this._dictionaryService.updateFlag( + this.data.dossierTemplateId, + this.data.type, + this.data.dossierId, + this.form.controls.addToDictionaryAction.value, + ); + } catch (error) { + console.error(error); + this._toaster.error(_('edit-dossier-dialog.dictionary.edit-dialog.error.generic')); + } + + this._loadingService.stop(); + this.close(this.form.value as ReturnType); + } + + protected readonly iconButtonTypes = IconButtonTypes; +} diff --git a/apps/red-ui/src/app/modules/shared-dossiers/dialogs/edit-dossier-dialog/dictionary/edit-dossier-dictionary.component.html b/apps/red-ui/src/app/modules/shared-dossiers/dialogs/edit-dossier-dialog/dictionary/edit-dossier-dictionary.component.html index 17ff6ac7e..32956edf3 100644 --- a/apps/red-ui/src/app/modules/shared-dossiers/dialogs/edit-dossier-dialog/dictionary/edit-dossier-dictionary.component.html +++ b/apps/red-ui/src/app/modules/shared-dossiers/dialogs/edit-dossier-dialog/dictionary/edit-dossier-dictionary.component.html @@ -35,6 +35,13 @@
{{ selectedDictionary?.label }} +
diff --git a/apps/red-ui/src/app/modules/shared-dossiers/dialogs/edit-dossier-dialog/dictionary/edit-dossier-dictionary.component.scss b/apps/red-ui/src/app/modules/shared-dossiers/dialogs/edit-dossier-dialog/dictionary/edit-dossier-dictionary.component.scss index bbf05053c..01fac8bdf 100644 --- a/apps/red-ui/src/app/modules/shared-dossiers/dialogs/edit-dossier-dialog/dictionary/edit-dossier-dictionary.component.scss +++ b/apps/red-ui/src/app/modules/shared-dossiers/dialogs/edit-dossier-dialog/dictionary/edit-dossier-dictionary.component.scss @@ -72,3 +72,7 @@ } } } + +.p-left-8 { + padding-left: 8px; +} diff --git a/apps/red-ui/src/app/modules/shared-dossiers/dialogs/edit-dossier-dialog/dictionary/edit-dossier-dictionary.component.ts b/apps/red-ui/src/app/modules/shared-dossiers/dialogs/edit-dossier-dialog/dictionary/edit-dossier-dictionary.component.ts index a2ddfdbc6..c0e90fa3c 100644 --- a/apps/red-ui/src/app/modules/shared-dossiers/dialogs/edit-dossier-dialog/dictionary/edit-dossier-dictionary.component.ts +++ b/apps/red-ui/src/app/modules/shared-dossiers/dialogs/edit-dossier-dialog/dictionary/edit-dossier-dictionary.component.ts @@ -1,13 +1,13 @@ import { Component, Input, OnInit, ViewChild } from '@angular/core'; -import { LoadingService } from '@iqser/common-ui'; +import { IqserDialog, LoadingService } from '@iqser/common-ui'; import { List } from '@iqser/common-ui/lib/utils'; import { Dictionary, DictionaryEntryType, DictionaryEntryTypes, Dossier } from '@red/domain'; import { DictionaryService } from '@services/entity-services/dictionary.service'; import { PermissionsService } from '@services/permissions.service'; import { DictionaryManagerComponent } from '@shared/components/dictionary-manager/dictionary-manager.component'; import { firstValueFrom } from 'rxjs'; -import { DossiersDialogService } from '../../../services/dossiers-dialog.service'; import { EditDossierSaveResult } from '../edit-dossier-section.interface'; +import { EditDictionaryDialogComponent } from '../../edit-dictionary-dialog/edit-dictionary-dialog.component'; @Component({ selector: 'redaction-edit-dossier-dictionary', @@ -17,6 +17,7 @@ import { EditDossierSaveResult } from '../edit-dossier-section.interface'; export class EditDossierDictionaryComponent implements OnInit { @Input() dossier: Dossier; canEdit = false; + canEditDictionaryFlag = false; dictionaries: Dictionary[]; selectedDictionary: Dictionary; activeEntryType = DictionaryEntryTypes.ENTRY; @@ -40,12 +41,13 @@ export class EditDossierDictionaryComponent implements OnInit { private readonly _dictionaryService: DictionaryService, private readonly _permissionsService: PermissionsService, private readonly _loadingService: LoadingService, - private readonly _dialogService: DossiersDialogService, + private readonly _iqserDialog: IqserDialog, ) {} async ngOnInit() { this._loadingService.start(); this.canEdit = this._permissionsService.canEditDossierDictionary(this.dossier); + this.canEditDictionaryFlag = this._permissionsService.isOwner(this.dossier); await this.#updateDossierDictionary(); this._loadingService.stop(); } @@ -101,19 +103,27 @@ export class EditDossierDictionaryComponent implements OnInit { } } - async #updateDossierDictionary() { + async openEditDictionaryModal() { const { dossierId, dossierTemplateId } = this.dossier; - let dictionaryTypes = [ - ...this._dictionaryService.getRedactTextDictionaries(dossierTemplateId, true), - ...this._dictionaryService.getAddHintDictionaries(dossierTemplateId, false, true), - ].map(d => d.type); - dictionaryTypes = [...new Set(dictionaryTypes)]; - this.dictionaries = await firstValueFrom( - this._dictionaryService.loadDictionaryEntriesByType(dictionaryTypes, dossierTemplateId, dossierId), - ); - //TODO remove this when backend will send also the type - this.#setType(dictionaryTypes); - this.dictionaries = this.dictionaries.sort((a, b) => a.label.localeCompare(b.label)); + const result = await this._iqserDialog + .openDefault(EditDictionaryDialogComponent, { + data: { + addToDictionaryAction: this.selectedDictionary.addToDictionaryAction, + label: this.selectedDictionary.label, + type: this.selectedDictionary.type, + dossierId, + dossierTemplateId, + canEdit: this.canEditDictionaryFlag, + }, + }) + .result(); + + this.selectedDictionary = { ...this.selectedDictionary, addToDictionaryAction: result.addToDictionaryAction } as Dictionary; + await this.#retrieveDictionaries(); + } + + async #updateDossierDictionary() { + await this.#retrieveDictionaries(); let dictionaryToSelect = this.dictionaries[0]; if (this.selectedDictionary) { dictionaryToSelect = this.dictionaries.find(d => d.type === this.selectedDictionary.type); @@ -121,6 +131,17 @@ export class EditDossierDictionaryComponent implements OnInit { this.selectDictionary(dictionaryToSelect, this.activeEntryType); } + async #retrieveDictionaries() { + const { dossierId, dossierTemplateId } = this.dossier; + const dictionaryTypes = [...new Set(this._dictionaryService.getDictionaries(dossierTemplateId).map(d => d.type))]; + this.dictionaries = await firstValueFrom( + this._dictionaryService.loadDictionaryEntriesByType(dictionaryTypes, dossierTemplateId, dossierId), + ); + //TODO remove this when backend will send also the type + this.#setType(dictionaryTypes); + this.dictionaries.sort((a, b) => a.label.localeCompare(b.label)); + } + //TODO remove this when backend will send also the type #setType(dictionaryTypes: string[]) { for (let i = 0; i < this.dictionaries.length; i++) { diff --git a/apps/red-ui/src/app/modules/shared-dossiers/shared-dossiers.module.ts b/apps/red-ui/src/app/modules/shared-dossiers/shared-dossiers.module.ts index 01552d1e0..7cfca15d6 100644 --- a/apps/red-ui/src/app/modules/shared-dossiers/shared-dossiers.module.ts +++ b/apps/red-ui/src/app/modules/shared-dossiers/shared-dossiers.module.ts @@ -30,6 +30,7 @@ import { IqserUsersModule } from '@iqser/common-ui/lib/users'; import { SideNavComponent, SmallChipComponent, StatusBarComponent } from '@iqser/common-ui/lib/shared'; import { SelectComponent } from '@shared/components/select/select.component'; import { SnakeCasePipe } from '@common-ui/pipes/snake-case.pipe'; +import { EditDictionaryDialogComponent } from './dialogs/edit-dictionary-dialog/edit-dictionary-dialog.component'; const components = [ FileActionsComponent, @@ -69,6 +70,7 @@ const dialogs = [EditDossierDialogComponent, AssignReviewerApproverDialogCompone IqserDenyDirective, SelectComponent, SnakeCasePipe, + EditDictionaryDialogComponent, ], }) export class SharedDossiersModule {} diff --git a/apps/red-ui/src/app/services/entity-services/dictionary.service.ts b/apps/red-ui/src/app/services/entity-services/dictionary.service.ts index d287e476a..1aac767c8 100644 --- a/apps/red-ui/src/app/services/entity-services/dictionary.service.ts +++ b/apps/red-ui/src/app/services/entity-services/dictionary.service.ts @@ -4,7 +4,6 @@ import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import { EntitiesService, QueryParam, Toaster } from '@iqser/common-ui'; import { List } from '@iqser/common-ui/lib/utils'; import { Dictionary, DictionaryEntryType, DictionaryEntryTypes, IDictionary, IUpdateDictionary, SuperTypes } from '@red/domain'; -import { DossierDictionariesMapService } from '@services/entity-services/dossier-dictionaries-map.service'; import { firstValueFrom, forkJoin, Observable } from 'rxjs'; import { map, switchMap, tap } from 'rxjs/operators'; import { IMAGE_CATEGORIES } from '../../modules/file-preview/utils/constants'; @@ -24,7 +23,6 @@ export class DictionaryService extends EntitiesService private readonly _toaster: Toaster, private readonly _dossierTemplateStatsService: DossierTemplateStatsService, private readonly _dictionariesMapService: DictionariesMapService, - private readonly _dossierDictionariesMapService: DossierDictionariesMapService, ) { super(); } @@ -75,6 +73,16 @@ export class DictionaryService extends EntitiesService return await firstValueFrom(request); } + async updateFlag(dossierTemplateId: string, type: string, dossierId: string, addToDictionary: boolean): Promise { + const url = `${this._defaultModelPath}/updateFlag/${type}/${dossierTemplateId}/${dossierId}`; + const queryParams = [{ key: 'addToDictionary', value: addToDictionary }]; + const request = this._post(null, url, queryParams).pipe( + switchMap(() => this.loadDictionaryDataForDossier(dossierTemplateId, dossierId)), + ); + + return await firstValueFrom(request); + } + async add(dictionary: IDictionary, dossierId?: string): Promise { const queryParams = dossierId ? [{ key: 'dossierId', value: dossierId }] : undefined; const request = this._post(dictionary, `${this._defaultModelPath}/type`, queryParams).pipe( @@ -142,9 +150,14 @@ export class DictionaryService extends EntitiesService return !!this._dictionariesMapService.get(dossierTemplateId).find(e => e.type === type && !e.virtual); } - getRedactTextDictionaries(dossierTemplateId: string, dossierDictionaryOnly: boolean): Dictionary[] { + getDictionaries(dossierTemplateId: string) { return this._dictionariesMapService .get(dossierTemplateId) + .filter(d => d.model['typeId'] && (d.dossierDictionaryOnly || d.addToDictionaryAction)); + } + + getRedactTextDictionaries(dossierId: string, dossierDictionaryOnly: boolean): Dictionary[] { + return this.#extractDossierLevelTypes(dossierId) .filter(d => d.model['typeId'] && !d.hint && d.addToDictionaryAction && (dossierDictionaryOnly || !d.dossierDictionaryOnly)) .sort((a, b) => a.label.localeCompare(b.label)); } @@ -162,10 +175,9 @@ export class DictionaryService extends EntitiesService .sort((a, b) => a.label.localeCompare(b.label)); } - getAddHintDictionaries(dossierTemplateId: string, dossierDictionaryOnly: boolean, dictionaryRequest: boolean): Dictionary[] { + getAddHintDictionaries(dossierId: string, dossierDictionaryOnly: boolean, dictionaryRequest: boolean): Dictionary[] { const dictionaries: Dictionary[] = []; - - this._dictionariesMapService.get(dossierTemplateId).forEach((d: Dictionary) => { + this.#extractDossierLevelTypes(dossierId).forEach((d: Dictionary) => { if (d.hint) { if (dictionaryRequest) { if (d.hasDictionary && d.addToDictionaryAction) { @@ -187,59 +199,17 @@ export class DictionaryService extends EntitiesService } getRedactionTypes(dossierTemplateId: string): Dictionary[] { - const possibleDictionaries: Dictionary[] = []; - - for (const dictionary of this._dictionariesMapService.get(dossierTemplateId)) { - if (!dictionary.virtual && !dictionary.hint && !dictionary.systemManaged) { - possibleDictionaries.push(dictionary); - } - } - - return possibleDictionaries.sort((a, b) => a.label.localeCompare(b.label)); + return this._dictionariesMapService + .get(dossierTemplateId) + .filter(dictionary => !dictionary.virtual && !dictionary.hint && !dictionary.systemManaged) + .sort((a, b) => a.label.localeCompare(b.label)); } - async getDictionariesOptions(dossierTemplateId: string, dossierId: string): Promise { - const possibleDictionaries: Dictionary[] = []; - - const dossierDictionary: Dictionary = this._dossierDictionariesMapService.get(dossierId, 'dossier_redaction'); - - for (const dictionary of this._dictionariesMapService.get(dossierTemplateId)) { - if (!dictionary.virtual && dictionary.addToDictionaryAction) { - possibleDictionaries.push(dictionary); - } - } - - if (dossierDictionary?.addToDictionaryAction) { - possibleDictionaries.push(dossierDictionary); - } - - possibleDictionaries.sort((a, b) => a.label.localeCompare(b.label)); - - return possibleDictionaries; - } - - async loadDossierRedaction(dossierTemplateId: string, dossierId: string): Promise { - const promise = this.getForType(dossierTemplateId, 'dossier_redaction', dossierId); - const dict = await promise.catch(() => undefined); - if (dict) { - const dictionary = new Dictionary({ - ...dict, - type: 'dossier_redaction', - }); - this._dossierDictionariesMapService.set(dossierId, [dictionary]); - return dictionary; - } - - this._dossierDictionariesMapService.set(dossierId, []); - return undefined; - } - - loadDictionaryData(dossierTemplatesIds: string[]): Observable { - const observables: Observable[] = []; - for (const dossierTemplateId of dossierTemplatesIds) { - observables.push(this.loadDictionaryDataForDossierTemplate(dossierTemplateId)); - } - return forkJoin(observables); + getDictionariesOptions(dossierTemplateId: string): Dictionary[] { + return this._dictionariesMapService + .get(dossierTemplateId) + .filter(dictionary => !dictionary.virtual && dictionary.addToDictionaryAction) + .sort((a, b) => a.label.localeCompare(b.label)); } loadDictionaryDataForDossierTemplate(dossierTemplateId: string): Observable { @@ -248,6 +218,12 @@ export class DictionaryService extends EntitiesService ); } + loadDictionaryDataForDossier(dossierTemplateId: string, dossierId: string): Observable { + return this.getAllDictionaries(dossierTemplateId, false, dossierId).pipe( + tap(dictionaries => this._dictionariesMapService.set(dossierId, dictionaries)), + ); + } + loadTemporaryDictionaryData(dossierTemplateId: string, readOnlyFile = true): Observable { return this.getAllDictionaries(dossierTemplateId, readOnlyFile); } @@ -288,4 +264,8 @@ export class DictionaryService extends EntitiesService const url = `${this._defaultModelPath}/delete/${type}/${dossierTemplateId}`; return firstValueFrom(this._post(entries, url, queryParams)); } + + #extractDossierLevelTypes(dossierId: string) { + return this._dictionariesMapService.get(dossierId).filter(dictionary => dictionary.model['typeId']?.includes(dossierId)); + } } diff --git a/apps/red-ui/src/assets/i18n/redact/de.json b/apps/red-ui/src/assets/i18n/redact/de.json index 68a711b4d..7eccda780 100644 --- a/apps/red-ui/src/assets/i18n/redact/de.json +++ b/apps/red-ui/src/assets/i18n/redact/de.json @@ -250,9 +250,6 @@ "watermarks": "Watermarks" }, "analysis-disabled": "", - "annotation": { - "pending": "(Pending analysis)" - }, "annotation-actions": { "accept-recommendation": { "label": "Empfehlung annehmen" @@ -307,14 +304,14 @@ "error": "Rekategorisierung des Bildes gescheitert: {error}", "success": "Bild wurde einer neuen Kategorie zugeordnet." }, - "remove": { - "error": "Fehler beim Entfernen der Schwärzung: {error}", - "success": "Schwärzung entfernt!" - }, "remove-hint": { "error": "Failed to remove hint: {error}", "success": "Hint removed!" }, + "remove": { + "error": "Fehler beim Entfernen der Schwärzung: {error}", + "success": "Schwärzung entfernt!" + }, "undo": { "error": "Die Aktion konnte nicht rückgängig gemacht werden. Fehler: {error}", "success": "erfolgreich Rückgängig gemacht" @@ -327,15 +324,15 @@ "remove-highlights": { "label": "Remove selected earmarks" }, - "resize": { - "label": "Größe ändern" - }, "resize-accept": { "label": "Größe speichern" }, "resize-cancel": { "label": "Größenänderung abbrechen" }, + "resize": { + "label": "Größe ändern" + }, "see-references": { "label": "See references" }, @@ -367,6 +364,9 @@ "skipped": "Übersprungen", "text-highlight": "Earmark" }, + "annotation": { + "pending": "(Pending analysis)" + }, "archived-dossiers-listing": { "no-data": { "title": "No archived dossiers." @@ -572,18 +572,14 @@ "warning": "Achtung: Diese Aktion kann nicht rückgängig gemacht werden!" }, "confirmation-dialog": { - "approve-file": { - "question": "Dieses Dokument enthält ungesehene Änderungen. Möchten Sie es trotzdem genehmigen?", - "title": "Warnung!" - }, "approve-file-without-analysis": { "confirmationText": "Approve without analysis", "denyText": "Cancel", "question": "Analysis required to detect new redactions.", "title": "Warning!" }, - "approve-multiple-files": { - "question": "Mindestens eine der ausgewählten Dateien enthält ungesehene Änderungen. Möchten Sie sie trotzdem genehmigen?", + "approve-file": { + "question": "Dieses Dokument enthält ungesehene Änderungen. Möchten Sie es trotzdem genehmigen?", "title": "Warnung!" }, "approve-multiple-files-without-analysis": { @@ -592,6 +588,10 @@ "question": "Analysis required to detect new redactions for at least one file.", "title": "Warning" }, + "approve-multiple-files": { + "question": "Mindestens eine der ausgewählten Dateien enthält ungesehene Änderungen. Möchten Sie sie trotzdem genehmigen?", + "title": "Warnung!" + }, "assign-file-to-me": { "question": { "multiple": "Dieses Dokument wird gerade von einer anderen Person geprüft. Möchten Sie Reviewer werden und sich selbst dem Dokument zuweisen?", @@ -936,13 +936,13 @@ "recent": "Neu ({hours} h)", "unassigned": "Niemandem zugewiesen" }, - "reanalyse": { - "action": "Datei analysieren" - }, "reanalyse-dossier": { "error": "Die Dateien konnten nicht für eine Reanalyse eingeplant werden. Bitte versuchen Sie es erneut.", "success": "Dateien für Reanalyse vorgesehen." }, + "reanalyse": { + "action": "Datei analysieren" + }, "start-auto-analysis": "Enable auto-analysis", "stop-auto-analysis": "Stop auto-analysis", "table-col-names": { @@ -1011,14 +1011,6 @@ "total-documents": "Anzahl der Dokumente", "total-people": "{count} {count, plural, one{user} other {users}}" }, - "dossier-templates": { - "label": "Dossier-Vorlagen", - "status": { - "active": "Active", - "inactive": "Inactive", - "incomplete": "Incomplete" - } - }, "dossier-templates-listing": { "action": { "clone": "Clone template", @@ -1054,6 +1046,14 @@ "title": "{length} {length, plural, one{Dossier-Vorlage} other{Dossier-Vorlagen}}" } }, + "dossier-templates": { + "label": "Dossier-Vorlagen", + "status": { + "active": "Active", + "inactive": "Inactive", + "incomplete": "Incomplete" + } + }, "dossier-watermark-selector": { "heading": "Watermarks on documents", "no-watermark": "There is no watermark defined for the dossier template.
Contact your app admin to define one.", @@ -1140,6 +1140,15 @@ "change-successful": "Dossier wurde aktualisiert.", "delete-successful": "Dossier wurde gelöscht.", "dictionary": { + "edit-dialog": { + "add-to-dictionary-action": "", + "cancel": "", + "error": { + "generic": "" + }, + "save": "", + "title": "" + }, "entries": "{length} {length, plural, one{entry} other{entries}}", "false-positive-entries": "{length} false positive {length, plural, one{entry} other{entries}}", "false-positives": "False positives", @@ -1239,15 +1248,6 @@ "title": "{length} {length, plural, one{Wörterbuch} other{Wörterbücher}}" } }, - "entity": { - "info": { - "actions": { - "revert": "Revert", - "save": "Save changes" - }, - "heading": "Edit entity" - } - }, "entity-rules-screen": { "error": { "generic": "Something went wrong... Entity rules update failed!" @@ -1262,19 +1262,28 @@ "warning-text": "Warning: experimental feature!", "warnings-found": "{warnings, plural, one{A warning} other{{warnings} warnings}} found in rules" }, + "entity": { + "info": { + "actions": { + "revert": "Revert", + "save": "Save changes" + }, + "heading": "Edit entity" + } + }, "error": { "deleted-entity": { "dossier": { "action": "Zurück zur Übersicht", "label": "Dieses Dossier wurde gelöscht!" }, - "file": { - "action": "Zurück zum Dossier", - "label": "Diese Datei wurde gelöscht!" - }, "file-dossier": { "action": "Zurück zur Übersicht", "label": "Das Dossier dieser Datei wurde gelöscht!" + }, + "file": { + "action": "Zurück zum Dossier", + "label": "Diese Datei wurde gelöscht!" } }, "file-preview": { @@ -1292,12 +1301,6 @@ }, "exact-date": "{day} {month} {year} um {hour}:{minute} Uhr", "file": "Datei", - "file-attribute": { - "update": { - "error": "Failed to update file attribute value!", - "success": "File attribute value has been updated successfully!" - } - }, "file-attribute-encoding-types": { "ascii": "ASCII", "iso": "ISO-8859-1", @@ -1308,6 +1311,12 @@ "number": "Nummer", "text": "Freier Text" }, + "file-attribute": { + "update": { + "error": "Failed to update file attribute value!", + "success": "File attribute value has been updated successfully!" + } + }, "file-attributes-configurations": { "cancel": "Cancel", "form": { @@ -1526,15 +1535,6 @@ "csv": "File attributes were imported successfully from uploaded CSV file." } }, - "filter": { - "analysis": "Analyse erforderlich", - "comment": "Kommentare", - "hint": "Nut Hinweise", - "image": "Bilder", - "none": "Keine Anmerkungen", - "redaction": "Geschwärzt", - "updated": "Aktualisiert" - }, "filter-menu": { "filter-options": "Filteroptionen", "filter-types": "Filter", @@ -1544,6 +1544,15 @@ "unseen-pages": "Nur Anmerkungen auf unsichtbaren Seiten", "with-comments": "Nur Anmerkungen mit Kommentaren" }, + "filter": { + "analysis": "Analyse erforderlich", + "comment": "Kommentare", + "hint": "Nut Hinweise", + "image": "Bilder", + "none": "Keine Anmerkungen", + "redaction": "Geschwärzt", + "updated": "Aktualisiert" + }, "filters": { "assigned-people": "Beauftragt", "documents-status": "Documents state", @@ -1814,13 +1823,6 @@ "user-promoted-to-approver": "{user} wurde im Dossier {dossierHref, select, null{{dossierName}} other{{dossierName}}} zum Genehmiger ernannt!", "user-removed-as-dossier-member": "{user} wurde als Mitglied von: {dossierHref, select, null{{dossierName}} other{{dossierName}}} entfernt!" }, - "notifications": { - "button-text": "Notifications", - "deleted-dossier": "Deleted dossier", - "label": "Benachrichtigungen", - "mark-all-as-read": "Alle als gelesen markieren", - "mark-as": "Mark as {type, select, read{read} unread{unread} other{}}" - }, "notifications-screen": { "category": { "email-notifications": "E-Mail Benachrichtigungen", @@ -1834,6 +1836,7 @@ "dossier": "Dossierbezogene Benachrichtigungen", "other": "Andere Benachrichtigungen" }, + "options-title": "Wählen Sie aus, in welcher Kategorie Sie benachrichtigt werden möchten", "options": { "ASSIGN_APPROVER": "Wenn ich einem Dokument als Genehmiger zugewiesen bin", "ASSIGN_REVIEWER": "Wenn ich einem Dokument als Überprüfer zugewiesen bin", @@ -1851,7 +1854,6 @@ "USER_PROMOTED_TO_APPROVER": "Wenn ich Genehmiger in einem Dossier werde", "USER_REMOVED_AS_DOSSIER_MEMBER": "Wenn ich die Dossier-Mitgliedschaft verliere" }, - "options-title": "Wählen Sie aus, in welcher Kategorie Sie benachrichtigt werden möchten", "schedule": { "daily": "Tägliche Zusammenfassung", "instant": "Sofortig", @@ -1859,6 +1861,13 @@ }, "title": "Benachrichtigungseinstellungen" }, + "notifications": { + "button-text": "Notifications", + "deleted-dossier": "Deleted dossier", + "label": "Benachrichtigungen", + "mark-all-as-read": "Alle als gelesen markieren", + "mark-as": "Mark as {type, select, read{read} unread{unread} other{}}" + }, "ocr": { "confirmation-dialog": { "cancel": "Cancel", @@ -1950,16 +1959,16 @@ "warnings-subtitle": "Do not show again options", "warnings-title": "Prompts and dialogs settings" }, - "processing": { - "basic": "Processing", - "ocr": "OCR" - }, "processing-status": { "ocr": "OCR", "pending": "Pending", "processed": "processed", "processing": "Processing" }, + "processing": { + "basic": "Processing", + "ocr": "OCR" + }, "readonly": "Lesemodus", "readonly-archived": "Read only (archived)", "redact-text": { @@ -2182,12 +2191,6 @@ "red-user-admin": "Benutzer-Admin", "regular": "Regulär" }, - "search": { - "active-dossiers": "ganze Plattform", - "all-dossiers": "all documents", - "placeholder": "Nach Dokumenten oder Dokumenteninhalt suchen", - "this-dossier": "in diesem Dossier" - }, "search-screen": { "cols": { "assignee": "Bevollmächtigter", @@ -2211,6 +2214,12 @@ "no-match": "Keine Dokumente entsprechen Ihren aktuellen Filtern.", "table-header": "{length} {length, plural, one{Suchergebnis} other{Suchergebnisse}}" }, + "search": { + "active-dossiers": "ganze Plattform", + "all-dossiers": "all documents", + "placeholder": "Nach Dokumenten oder Dokumenteninhalt suchen", + "this-dossier": "in diesem Dossier" + }, "seconds": "seconds", "size": "Size", "smtp-auth-config": { @@ -2462,4 +2471,4 @@ } }, "yesterday": "Gestern" -} \ No newline at end of file +} diff --git a/apps/red-ui/src/assets/i18n/redact/en.json b/apps/red-ui/src/assets/i18n/redact/en.json index 8622f212d..05f60b197 100644 --- a/apps/red-ui/src/assets/i18n/redact/en.json +++ b/apps/red-ui/src/assets/i18n/redact/en.json @@ -1140,6 +1140,15 @@ "change-successful": "Dossier {dossierName} was updated.", "delete-successful": "Dossier {dossierName} was deleted.", "dictionary": { + "edit-dialog": { + "add-to-dictionary-action": "Available in add/edit dialogs in this dossier", + "cancel": "Cancel", + "error": { + "generic": "Failed to update flag." + }, + "save": "Save", + "title": "Edit {label}" + }, "entries": "{length} {length, plural, one{entry} other{entries}} to redact", "false-positive-entries": "{length} false positive {length, plural, one{entry} other{entries}}", "false-positives": "False positives", @@ -2462,4 +2471,4 @@ } }, "yesterday": "Yesterday" -} \ No newline at end of file +} diff --git a/apps/red-ui/src/assets/i18n/scm/de.json b/apps/red-ui/src/assets/i18n/scm/de.json index b0d740204..a876c5563 100644 --- a/apps/red-ui/src/assets/i18n/scm/de.json +++ b/apps/red-ui/src/assets/i18n/scm/de.json @@ -250,9 +250,6 @@ "watermarks": "Watermarks" }, "analysis-disabled": "Analysis disabled", - "annotation": { - "pending": "(Pending analysis)" - }, "annotation-actions": { "accept-recommendation": { "label": "Empfehlung annehmen" @@ -307,14 +304,14 @@ "error": "Rekategorisierung des Bildes gescheitert: {error}", "success": "Bild wurde einer neuen Kategorie zugeordnet." }, - "remove": { - "error": "Fehler beim Entfernen der Schwärzung: {error}", - "success": "Schwärzung entfernt!" - }, "remove-hint": { "error": "Failed to remove hint: {error}", "success": "Hint removed!" }, + "remove": { + "error": "Fehler beim Entfernen der Schwärzung: {error}", + "success": "Schwärzung entfernt!" + }, "undo": { "error": "Die Aktion konnte nicht rückgängig gemacht werden. Fehler: {error}", "success": "erfolgreich Rückgängig gemacht" @@ -327,15 +324,15 @@ "remove-highlights": { "label": "Remove selected earmarks" }, - "resize": { - "label": "Größe ändern" - }, "resize-accept": { "label": "Größe speichern" }, "resize-cancel": { "label": "Größenänderung abbrechen" }, + "resize": { + "label": "Größe ändern" + }, "see-references": { "label": "See references" }, @@ -367,6 +364,9 @@ "skipped": "Übersprungen", "text-highlight": "Earmark" }, + "annotation": { + "pending": "(Pending analysis)" + }, "archived-dossiers-listing": { "no-data": { "title": "No archived dossiers." @@ -572,18 +572,14 @@ "warning": "Achtung: Diese Aktion kann nicht rückgängig gemacht werden!" }, "confirmation-dialog": { - "approve-file": { - "question": "Dieses Dokument enthält ungesehene Änderungen. Möchten Sie es trotzdem genehmigen?", - "title": "Warnung!" - }, "approve-file-without-analysis": { "confirmationText": "Approve without analysis", "denyText": "Cancel", "question": "Analysis required to detect new components.", "title": "Warning!" }, - "approve-multiple-files": { - "question": "Mindestens eine der ausgewählten Dateien enthält ungesehene Änderungen. Möchten Sie sie trotzdem genehmigen?", + "approve-file": { + "question": "Dieses Dokument enthält ungesehene Änderungen. Möchten Sie es trotzdem genehmigen?", "title": "Warnung!" }, "approve-multiple-files-without-analysis": { @@ -592,6 +588,10 @@ "question": "Analysis required to detect new components for at least one file.", "title": "Warning" }, + "approve-multiple-files": { + "question": "Mindestens eine der ausgewählten Dateien enthält ungesehene Änderungen. Möchten Sie sie trotzdem genehmigen?", + "title": "Warnung!" + }, "assign-file-to-me": { "question": { "multiple": "Dieses Dokument wird gerade von einer anderen Person geprüft. Möchten Sie Reviewer werden und sich selbst dem Dokument zuweisen?", @@ -936,13 +936,13 @@ "recent": "Neu ({hours} h)", "unassigned": "Niemandem zugewiesen" }, - "reanalyse": { - "action": "Datei analysieren" - }, "reanalyse-dossier": { "error": "Die Dateien konnten nicht für eine Reanalyse eingeplant werden. Bitte versuchen Sie es erneut.", "success": "Dateien für Reanalyse vorgesehen." }, + "reanalyse": { + "action": "Datei analysieren" + }, "start-auto-analysis": "Enable auto-analysis", "stop-auto-analysis": "Stop auto-analysis", "table-col-names": { @@ -1011,14 +1011,6 @@ "total-documents": "Anzahl der Dokumente", "total-people": "{count} {count, plural, one{user} other {users}}" }, - "dossier-templates": { - "label": "Dossier-Vorlagen", - "status": { - "active": "Active", - "inactive": "Inactive", - "incomplete": "Incomplete" - } - }, "dossier-templates-listing": { "action": { "clone": "Clone template", @@ -1054,6 +1046,14 @@ "title": "{length} dossier {length, plural, one{template} other{templates}}" } }, + "dossier-templates": { + "label": "Dossier-Vorlagen", + "status": { + "active": "Active", + "inactive": "Inactive", + "incomplete": "Incomplete" + } + }, "dossier-watermark-selector": { "heading": "Watermarks on documents", "no-watermark": "There is no watermark defined for the dossier template.
Contact your app admin to define one.", @@ -1140,6 +1140,15 @@ "change-successful": "Dossier wurde aktualisiert.", "delete-successful": "Dossier wurde gelöscht.", "dictionary": { + "edit-dialog": { + "add-to-dictionary-action": "", + "cancel": "", + "error": { + "generic": "" + }, + "save": "", + "title": "" + }, "entries": "{length} {length, plural, one{entry} other{entries}} to {hint, select, true{annotate} other{redact}}", "false-positive-entries": "{length} false positive {length, plural, one{entry} other{entries}}", "false-positives": "False positives", @@ -1239,15 +1248,6 @@ "title": "{length} {length, plural, one{entity} other{entities}}" } }, - "entity": { - "info": { - "actions": { - "revert": "Revert", - "save": "Save changes" - }, - "heading": "Edit entity" - } - }, "entity-rules-screen": { "error": { "generic": "Something went wrong... Entity rules update failed!" @@ -1262,19 +1262,28 @@ "warning-text": "Warning: experimental feature!", "warnings-found": "{warnings, plural, one{A warning} other{{warnings} warnings}} found in rules" }, + "entity": { + "info": { + "actions": { + "revert": "Revert", + "save": "Save changes" + }, + "heading": "Edit entity" + } + }, "error": { "deleted-entity": { "dossier": { "action": "Zurück zur Übersicht", "label": "Dieses Dossier wurde gelöscht!" }, - "file": { - "action": "Zurück zum Dossier", - "label": "Diese Datei wurde gelöscht!" - }, "file-dossier": { "action": "Zurück zur Übersicht", "label": "Das Dossier dieser Datei wurde gelöscht!" + }, + "file": { + "action": "Zurück zum Dossier", + "label": "Diese Datei wurde gelöscht!" } }, "file-preview": { @@ -1292,12 +1301,6 @@ }, "exact-date": "{day} {month} {year} um {hour}:{minute} Uhr", "file": "Datei", - "file-attribute": { - "update": { - "error": "Failed to update file attribute value!", - "success": "File attribute value has been updated successfully!" - } - }, "file-attribute-encoding-types": { "ascii": "ASCII", "iso": "ISO-8859-1", @@ -1308,6 +1311,12 @@ "number": "Nummer", "text": "Freier Text" }, + "file-attribute": { + "update": { + "error": "Failed to update file attribute value!", + "success": "File attribute value has been updated successfully!" + } + }, "file-attributes-configurations": { "cancel": "Cancel", "form": { @@ -1526,15 +1535,6 @@ "csv": "File attributes were imported successfully from uploaded CSV file." } }, - "filter": { - "analysis": "Analyse erforderlich", - "comment": "Kommentare", - "hint": "Nut Hinweise", - "image": "Bilder", - "none": "Keine Anmerkungen", - "redaction": "Geschwärzt", - "updated": "Aktualisiert" - }, "filter-menu": { "filter-options": "Filteroptionen", "filter-types": "Filter", @@ -1544,6 +1544,15 @@ "unseen-pages": "Nur Anmerkungen auf unsichtbaren Seiten", "with-comments": "Nur Anmerkungen mit Kommentaren" }, + "filter": { + "analysis": "Analyse erforderlich", + "comment": "Kommentare", + "hint": "Nut Hinweise", + "image": "Bilder", + "none": "Keine Anmerkungen", + "redaction": "Geschwärzt", + "updated": "Aktualisiert" + }, "filters": { "assigned-people": "Beauftragt", "documents-status": "Documents state", @@ -1814,13 +1823,6 @@ "user-promoted-to-approver": "{user} wurde im Dossier {dossierHref, select, null{{dossierName}} other{{dossierName}}} zum Genehmiger ernannt!", "user-removed-as-dossier-member": "{user} wurde als Mitglied von: {dossierHref, select, null{{dossierName}} other{{dossierName}}} entfernt!" }, - "notifications": { - "button-text": "Notifications", - "deleted-dossier": "Deleted dossier", - "label": "Benachrichtigungen", - "mark-all-as-read": "Alle als gelesen markieren", - "mark-as": "Mark as {type, select, read{read} unread{unread} other{}}" - }, "notifications-screen": { "category": { "email-notifications": "E-Mail Benachrichtigungen", @@ -1834,6 +1836,7 @@ "dossier": "Dossierbezogene Benachrichtigungen", "other": "Andere Benachrichtigungen" }, + "options-title": "Wählen Sie aus, in welcher Kategorie Sie benachrichtigt werden möchten", "options": { "ASSIGN_APPROVER": "Wenn ich einem Dokument als Genehmiger zugewiesen bin", "ASSIGN_REVIEWER": "Wenn ich einem Dokument als Überprüfer zugewiesen bin", @@ -1851,7 +1854,6 @@ "USER_PROMOTED_TO_APPROVER": "Wenn ich Genehmiger in einem Dossier werde", "USER_REMOVED_AS_DOSSIER_MEMBER": "Wenn ich die Dossier-Mitgliedschaft verliere" }, - "options-title": "Wählen Sie aus, in welcher Kategorie Sie benachrichtigt werden möchten", "schedule": { "daily": "Tägliche Zusammenfassung", "instant": "Sofortig", @@ -1859,6 +1861,13 @@ }, "title": "Benachrichtigungseinstellungen" }, + "notifications": { + "button-text": "Notifications", + "deleted-dossier": "Deleted dossier", + "label": "Benachrichtigungen", + "mark-all-as-read": "Alle als gelesen markieren", + "mark-as": "Mark as {type, select, read{read} unread{unread} other{}}" + }, "ocr": { "confirmation-dialog": { "cancel": "Cancel", @@ -1950,16 +1959,16 @@ "warnings-subtitle": "Do not show again options", "warnings-title": "Prompts and dialogs settings" }, - "processing": { - "basic": "Processing", - "ocr": "OCR" - }, "processing-status": { "ocr": "OCR", "pending": "Pending", "processed": "Processed", "processing": "Processing" }, + "processing": { + "basic": "Processing", + "ocr": "OCR" + }, "readonly": "Lesemodus", "readonly-archived": "Read only (archived)", "redact-text": { @@ -2182,12 +2191,6 @@ "red-user-admin": "Benutzer-Admin", "regular": "Regulär" }, - "search": { - "active-dossiers": "ganze Plattform", - "all-dossiers": "all documents", - "placeholder": "Nach Dokumenten oder Dokumenteninhalt suchen", - "this-dossier": "in diesem Dossier" - }, "search-screen": { "cols": { "assignee": "Bevollmächtigter", @@ -2211,6 +2214,12 @@ "no-match": "Keine Dokumente entsprechen Ihren aktuellen Filtern.", "table-header": "{length} search {length, plural, one{result} other{results}}" }, + "search": { + "active-dossiers": "ganze Plattform", + "all-dossiers": "all documents", + "placeholder": "Nach Dokumenten oder Dokumenteninhalt suchen", + "this-dossier": "in diesem Dossier" + }, "seconds": "seconds", "size": "Size", "smtp-auth-config": { @@ -2462,4 +2471,4 @@ } }, "yesterday": "Gestern" -} \ No newline at end of file +} diff --git a/apps/red-ui/src/assets/i18n/scm/en.json b/apps/red-ui/src/assets/i18n/scm/en.json index 99295d153..961ae4bbc 100644 --- a/apps/red-ui/src/assets/i18n/scm/en.json +++ b/apps/red-ui/src/assets/i18n/scm/en.json @@ -1140,6 +1140,15 @@ "change-successful": "Dossier {dossierName} was updated.", "delete-successful": "Dossier {dossierName} was deleted.", "dictionary": { + "edit-dialog": { + "add-to-dictionary-action": "", + "cancel": "", + "error": { + "generic": "" + }, + "save": "", + "title": "" + }, "entries": "{length} {length, plural, one{entry} other{entries}} to {hint, select, true{annotate} other{redact}}", "false-positive-entries": "{length} false positive {length, plural, one{entry} other{entries}}", "false-positives": "False positives", @@ -2462,4 +2471,4 @@ } }, "yesterday": "Yesterday" -} \ No newline at end of file +}