From 0fbf5802934d5e72a0012bc3911034ea0ffcde2d Mon Sep 17 00:00:00 2001 From: Maverick Studer Date: Fri, 25 Oct 2024 12:31:51 +0200 Subject: [PATCH 1/3] RED-9447 && RED-10244 --- .../edit-dossier-general-info.component.html | 18 +- .../edit-dossier-general-info.component.ts | 242 +++++++++++++----- .../dossier-templates.service.ts | 7 + 3 files changed, 191 insertions(+), 76 deletions(-) diff --git a/apps/red-ui/src/app/modules/shared-dossiers/dialogs/edit-dossier-dialog/general-info/edit-dossier-general-info.component.html b/apps/red-ui/src/app/modules/shared-dossiers/dialogs/edit-dossier-dialog/general-info/edit-dossier-general-info.component.html index bbd9d8aa2..86a398e69 100644 --- a/apps/red-ui/src/app/modules/shared-dossiers/dialogs/edit-dossier-dialog/general-info/edit-dossier-general-info.component.html +++ b/apps/red-ui/src/app/modules/shared-dossiers/dialogs/edit-dossier-dialog/general-info/edit-dossier-general-info.component.html @@ -44,11 +44,15 @@
- - -
- -
{{ getStateName(stateId) }}
+ + +
+ +
{{ stateNameAndColor()[stateId]?.name }}
@@ -80,7 +84,7 @@
(); hasDueDate: boolean; dossierTemplates: IDossierTemplate[]; - states: string[]; + form: FormGroup> = this._formBuilder.group({ + dossierName: [null, Validators.required], + dossierTemplateId: [null, Validators.required], + dossierStatusId: [null], + description: [null], + dueDate: [null], + }); + initialFormValue: GeneralInfoForm; + readonly dossierStatusIdControl = formControlToSignal(this.form.controls.dossierStatusId); + readonly dossierTemplateIdControl = formControlToSignal(this.form.controls.dossierTemplateId); + readonly states = signal([null]); + readonly stateNameAndColor = computed(() => { + const nameAndColor = {}; + this.states().forEach(stateId => { + nameAndColor[stateId] = { + name: this.#getStateName(stateId, untracked(this.dossierTemplateIdControl)), + color: this.#getStateColor(stateId, untracked(this.dossierTemplateIdControl)), + }; + }); + return nameAndColor; + }); + readonly statePlaceholder = computed(() => this.#statePlaceholder); constructor( readonly permissionsService: PermissionsService, @@ -87,18 +115,36 @@ export class EditDossierGeneralInfoComponent implements OnInit, EditDossierSecti private readonly _loadingService: LoadingService, private readonly _translateService: TranslateService, private readonly _archivedDossiersService: ArchivedDossiersService, - ) {} + private readonly _changeDetectorRef: ChangeDetectorRef, + private readonly _dossierStatesService: DossierStatesService, + ) { + effect(() => { + if (this.dossierStatusIdControl() !== this.initialFormValue.dossierStatusId && this.dossierStatusIdControl()) { + this.form.controls.dossierTemplateId.disable(); + } else { + this.form.controls.dossierTemplateId.enable(); + } + }); + + effect( + () => { + this.states.set(this.#statesForDossierTemplate); + this.#onDossierTemplateChange(); + }, + { allowSignalWrites: true }, + ); + } get changed(): boolean { for (const key of Object.keys(this.form.getRawValue())) { if (key === 'dueDate') { - if (this.hasDueDate !== !!this.dossier.dueDate) { + if (this.hasDueDate !== !!this.dossier().dueDate) { return true; } - if (this.hasDueDate && !dayjs(this.dossier.dueDate).isSame(dayjs(this.form.get(key).value), 'day')) { + if (this.hasDueDate && !dayjs(this.dossier().dueDate).isSame(dayjs(this.form.get(key).value), 'day')) { return true; } - } else if (this.dossier[key] !== this.form.get(key).value) { + } else if (this.dossier()[key] !== this.form.get(key).value) { return true; } } @@ -114,40 +160,89 @@ export class EditDossierGeneralInfoComponent implements OnInit, EditDossierSecti return this.hasDueDate && this.form.get('dueDate').value === null; } - get #statusPlaceholder(): string { + get #statePlaceholder(): string { return this._translateService.instant( - this.states.length === 1 + isJustOne(this.states()) ? 'edit-dossier-dialog.general-info.form.dossier-state.no-state-placeholder' : 'dossier-state.placeholder', ) as string; } + get #statesForDossierTemplate() { + return [ + null, + ...this._dossierStatesMapService + .get(this.dossierTemplateIdControl() ?? untracked(this.dossier).dossierTemplateId) + .map(s => s.id), + ]; + } + + get #formValue(): { key: string; value: string; disabled: boolean }[] { + const dossier = untracked(this.dossier); + const formFieldWithArchivedCheck = value => ({ value, disabled: !dossier.isActive }); + const dossierStateId = untracked(this.dossierStatusIdControl); + const states = untracked(this.states); + return [ + { + key: 'dossierName', + ...formFieldWithArchivedCheck(dossier.dossierName), + }, + { + key: 'dossierTemplateId', + value: dossier.dossierTemplateId, + disabled: this._dossierStatsService.get(dossier.id).hasFiles || !dossier.isActive || !!dossierStateId, + }, + { + key: 'dossierStatusId', + value: dossier.dossierStatusId, + disabled: isJustOne(states) || !dossier.isActive, + }, + { + key: 'description', + ...formFieldWithArchivedCheck(dossier.description), + }, + { + key: 'dueDate', + ...formFieldWithArchivedCheck(dossier.dueDate), + }, + ]; + } + ngOnInit() { - this.states = [null, ...this._dossierStatesMapService.get(this.dossier.dossierTemplateId).map(s => s.id)]; - this.statusPlaceholder = this.#statusPlaceholder; - this.#filterInvalidDossierTemplates(); - this.form = this.#getForm(); - if (!this.permissionsService.canEditDossier(this.dossier)) { + this.#patchFormValue(); + if (isJustOne(this._dossierTemplatesService.all)) { + this._loadingService.loadWhile( + firstValueFrom(this._dossierTemplatesService.loadOnlyDossierTemplates()).then(async () => { + await firstValueFrom(this._dossierStatesService.loadAllForAllTemplates()); + this.#filterInvalidDossierTemplates(); + }), + ); + } else { + this.#filterInvalidDossierTemplates(); + } + + if (!this.permissionsService.canEditDossier(this.dossier())) { this.form.disable(); } - this.hasDueDate = !!this.dossier.dueDate; + this.hasDueDate = !!this.dossier().dueDate; } revert() { this.form.reset({ - dossierName: this.dossier.dossierName, - dossierTemplateId: this.dossier.dossierTemplateId, - dossierStatusId: this.dossier.dossierStatusId, - description: this.dossier.description, - dueDate: this.dossier.dueDate, + dossierName: this.dossier().dossierName, + dossierTemplateId: this.dossier().dossierTemplateId, + dossierStatusId: this.dossier().dossierStatusId, + description: this.dossier().description, + dueDate: this.dossier().dueDate, }); - this.hasDueDate = !!this.dossier.dueDate; + this.hasDueDate = !!this.dossier().dueDate; + this.initialFormValue = this.form.getRawValue(); } async save(): EditDossierSaveResult { const dueDate = dateWithoutTime(dayjs(this.form.get('dueDate').value)); const dossier = { - ...this.dossier, + ...this.dossier(), dossierName: this.form.get('dossierName').value, description: this.form.get('description').value, dueDate: dueDate.isValid() ? dueDate.toISOString() : undefined, @@ -156,9 +251,10 @@ export class EditDossierGeneralInfoComponent implements OnInit, EditDossierSecti } as IDossierRequest; const updatedDossier = await firstValueFrom(this._dossiersService.createOrUpdate(dossier)); - if (updatedDossier && updatedDossier.dossierTemplateId !== this.dossier.dossierTemplateId) { + if (updatedDossier && updatedDossier.dossierTemplateId !== this.dossier().dossierTemplateId) { await this._router.navigate([updatedDossier.routerLink]); } + this.initialFormValue = this.form.getRawValue(); return { success: !!updatedDossier }; } @@ -171,14 +267,14 @@ export class EditDossierGeneralInfoComponent implements OnInit, EditDossierSecti requireInput: true, denyText: _('confirmation-dialog.delete-dossier.deny-text'), translateParams: { - dossierName: this.dossier.dossierName, + dossierName: this.dossier().dossierName, dossiersCount: 1, }, }; this._dialogService.openDialog('confirm', data, async () => { this._loadingService.start(); - const successful = await this._trashService.deleteDossier(this.dossier); + const successful = await this._trashService.deleteDossier(this.dossier()); if (successful) { await this.#closeDialogAndRedirectToDossier(); } @@ -194,7 +290,7 @@ export class EditDossierGeneralInfoComponent implements OnInit, EditDossierSecti confirmationText: _('confirm-archive-dossier.archive'), denyText: _('confirm-archive-dossier.cancel'), titleColor: TitleColors.WARN, - translateParams: { ...this.dossier }, + translateParams: { ...this.dossier() }, checkboxes: [{ value: false, label: _('confirm-archive-dossier.checkbox.documents') }], toastMessage: _('confirm-archive-dossier.toast-error'), }; @@ -202,10 +298,10 @@ export class EditDossierGeneralInfoComponent implements OnInit, EditDossierSecti this._dialogService.openDialog('confirm', data, async result => { if (result === ConfirmOptions.CONFIRM) { this._loadingService.start(); - await firstValueFrom(this._archivedDossiersService.archive([this.dossier])); + await firstValueFrom(this._archivedDossiersService.archive([this.dossier()])); this._toaster.success(_('dossier-listing.archive.archive-succeeded'), { params: { - dossierName: this.dossier.dossierName, + dossierName: this.dossier().dossierName, }, }); this._editDossierDialogRef.close(); @@ -214,15 +310,6 @@ export class EditDossierGeneralInfoComponent implements OnInit, EditDossierSecti }); } - getStateName(stateId: string): string { - return (this._dossierStatesMapService.get(this.dossier.dossierTemplateId, stateId)?.name || - this._translateService.instant('dossier-state.placeholder')) as string; - } - - getStateColor(stateId: string): string { - return this._dossierStatesMapService.get(this.dossier.dossierTemplateId, stateId).color; - } - toggleDueDateField() { this.hasDueDate = !this.hasDueDate; if (!this.hasDueDate) { @@ -230,46 +317,63 @@ export class EditDossierGeneralInfoComponent implements OnInit, EditDossierSecti } } + #getStateName(stateId: string, templateId: string): string { + return (this._dossierStatesMapService.get(templateId, stateId)?.name || + this._translateService.instant('dossier-state.placeholder')) as string; + } + + #getStateColor(stateId: string, templateId: string): string { + return this._dossierStatesMapService.get(templateId, stateId)?.color; + } + + #patchFormValue() { + this.#formValue.forEach(formValue => { + this.form.patchValue({ [formValue.key]: formValue.value }); + if (formValue.disabled) this.form.get(formValue.key).disable(); + }); + this.initialFormValue = this.form.getRawValue(); + } + async #closeDialogAndRedirectToDossier() { this._editDossierDialogRef.close(); - await this._router.navigate([this.dossier.dossiersListRouterLink]); + await this._router.navigate([this.dossier().dossiersListRouterLink]); this._toaster.success(_('edit-dossier-dialog.delete-successful'), { params: { - dossierName: this.dossier.dossierName, + dossierName: this.dossier().dossierName, }, }); } - #getForm(): UntypedFormGroup { - const formFieldWithArchivedCheck = value => ({ value, disabled: !this.dossier.isActive }); - return this._formBuilder.group({ - dossierName: [formFieldWithArchivedCheck(this.dossier.dossierName), Validators.required], - dossierTemplateId: [ - { - value: this.dossier.dossierTemplateId, - disabled: this._dossierStatsService.get(this.dossier.id).hasFiles || !this.dossier.isActive, - }, - Validators.required, - ], - dossierStatusId: [ - { - value: this.dossier.dossierStatusId, - disabled: this.states.length === 1 || !this.dossier.isActive, - }, - ], - description: [formFieldWithArchivedCheck(this.dossier.description)], - dueDate: [formFieldWithArchivedCheck(this.dossier.dueDate)], - }); - } - #filterInvalidDossierTemplates() { + const dossier = untracked(this.dossier); this.dossierTemplates = this._dossierTemplatesService.all.filter(r => { - if (this.dossier?.dossierTemplateId === r.dossierTemplateId) { + if (dossier.dossierTemplateId === r.dossierTemplateId) { return true; } const notYetValid = !!r.validFrom && dayjs(r.validFrom).isAfter(dayjs()); const notValidAnymore = !!r.validTo && dayjs(r.validTo).add(1, 'd').isBefore(dayjs()); + this._changeDetectorRef.markForCheck(); return !(notYetValid || notValidAnymore) && r.isActive; }); } + + #onDossierTemplateChange() { + const dossierStateId = untracked(this.dossierStatusIdControl); + const dossierTemplateId = untracked(this.dossierTemplateIdControl); + if (!!dossierStateId && dossierTemplateId !== this.initialFormValue.dossierTemplateId) { + this.form.controls.dossierStatusId.setValue(null); + } + const dossier = untracked(this.dossier); + if (dossierTemplateId === this.initialFormValue.dossierTemplateId) { + this.form.controls.dossierStatusId.setValue(dossier.dossierStatusId); + } + const states = untracked(this.states); + if (isJustOne(states) || !dossier.isActive) { + this.form.controls.dossierStatusId.disable(); + } else { + this.form.controls.dossierStatusId.enable(); + } + + this._changeDetectorRef.markForCheck(); + } } diff --git a/apps/red-ui/src/app/services/dossier-templates/dossier-templates.service.ts b/apps/red-ui/src/app/services/dossier-templates/dossier-templates.service.ts index fa79a0d16..2283d410b 100644 --- a/apps/red-ui/src/app/services/dossier-templates/dossier-templates.service.ts +++ b/apps/red-ui/src/app/services/dossier-templates/dossier-templates.service.ts @@ -45,6 +45,13 @@ export class DossierTemplatesService extends EntitiesService { + return this.getAll().pipe( + mapEach(entity => new DossierTemplate(entity)), + tap(templates => this.setEntities(templates)), + ); + } + loadDossierTemplate(dossierTemplateId: string) { return this._getOne([dossierTemplateId], this._defaultModelPath).pipe( map(entity => new DossierTemplate(entity)), From 3a5a91f1e12e3bae202bb7a258699ff6729eafef Mon Sep 17 00:00:00 2001 From: Nicoleta Panaghiu Date: Fri, 25 Oct 2024 14:34:26 +0300 Subject: [PATCH 2/3] RED-3800: manual localazy sync. --- apps/red-ui/src/assets/i18n/redact/de.json | 36 +- apps/red-ui/src/assets/i18n/redact/en.json | 30 +- apps/red-ui/src/assets/i18n/scm/de.json | 402 ++++++++++----------- apps/red-ui/src/assets/i18n/scm/en.json | 74 ++-- 4 files changed, 271 insertions(+), 271 deletions(-) diff --git a/apps/red-ui/src/assets/i18n/redact/de.json b/apps/red-ui/src/assets/i18n/redact/de.json index 4713bb576..7f446c353 100644 --- a/apps/red-ui/src/assets/i18n/redact/de.json +++ b/apps/red-ui/src/assets/i18n/redact/de.json @@ -102,14 +102,14 @@ }, "disabled-file-options": "", "form": { - "quote-char": "Zitatzeichen", - "quote-char-placeholder": "\"", - "delimiter": "Trennzeichen", - "delimiter-placeholder": ",", - "encoding-type": "Codierung", + "delimiter": "", + "delimiter-placeholder": "", + "encoding-type": "", "file": "Mapping-Datei", "name": "Mapping-Name", "name-placeholder": "Mapping-Name", + "quote-char": "Quotation marker", + "quote-char-placeholder": "\"", "version": "Version" } }, @@ -1238,9 +1238,9 @@ "title": "{label} bearbeiten" }, "entries-count": "{count} {count, plural, one{Eintrag} other{Einträge}}", - "false-positives": "Falsch-Positive", - "false-recommendations": "Falsche Empfehlungen", - "to-redact": "Schwärzungen" + "false-positives": "Falsch-Positive ({count})", + "false-recommendations": "Falsche Empfehlungen ({count})", + "to-redact": "Schwärzungen ({count})" }, "general-info": { "form": { @@ -1280,11 +1280,11 @@ "content": { "options": { "multiple-pages": { - "description": "Schwärzung auf folgenden Seiten bearbeiten", + "description": "Bearbeiten Sie die Schwärzung auf einer Reihe von Seiten", "extraOptionDescription": "Minus (-) für Seitenbereich und Komma (,) für Aufzählung.", - "extraOptionLabel": "Seitenbereich", + "extraOptionLabel": "Seiten", "extraOptionPlaceholder": "z. B. 1-20,22,32", - "label": "Auf allen Seiten ändern" + "label": "Auf mehreren Seiten ändern" }, "only-this-page": { "description": "Schwärzung nur an dieser Position in diesem Dokument bearbeiten", @@ -1891,9 +1891,9 @@ "legalBasis": "Rechtsgrundlage", "options": { "multiple-pages": { - "description": "Schwärzung auf folgenden Seiten hinzufügen", + "description": "Fügen Sie die Schwärzung auf einer Reihe von Seiten hinzu", "extraOptionDescription": "Minus (-) für Seitenbereich und Komma (,) für Aufzählung.", - "extraOptionLabel": "Seitenbereich", + "extraOptionLabel": "Seiten", "extraOptionPlaceholder": "z. B. 1-20,22,32", "label": "Auf mehreren Seiten anwenden" }, @@ -2186,11 +2186,11 @@ "content": { "options": { "multiple-pages": { - "description": "Schwärzung auf folgenden Seiten entfernen", + "description": "Entfernen Sie die Schwärzung auf einer Reihe von Seiten", "extraOptionDescription": "Minus (-) für Seitenbereich und Komma (,) für Aufzählung.", - "extraOptionLabel": "Seitenbereich", + "extraOptionLabel": "Seiten", "extraOptionPlaceholder": "z. B. 1-20,22,32", - "label": "Auf allen Seiten entfernen" + "label": "Auf mehreren Seiten entfernen" }, "only-this-page": { "description": "Schwärzung nur an dieser Stelle in diesem Dokument entfernen", @@ -2224,7 +2224,7 @@ "label": "In diesem Kontext aus Dossier entfernen" }, "in-document": { - "description": "{isImage, select, image{Das Bild} other{der Begriff}} wird auf keiner Seite dieses Dokuments automatisch geschwärzt.", + "description": "{isImage, select, image{Das Bild} other{Der Begriff}} wird auf keiner Seite dieses Dokuments automatisch geschwärzt.", "label": "Aus Dokument entfernen" }, "in-dossier": { @@ -2642,7 +2642,7 @@ "table-header": { "title": "Wasserzeichen" }, - "watermark-is-used": "Dieses Wasserzeichen wird bereits verwendet. Möchten Sie es dennocht löschen?" + "watermark-is-used": "Dieses Wasserzeichen wird bereits verwendet. Möchten Sie es dennoch löschen?" }, "workflow": { "selection": { diff --git a/apps/red-ui/src/assets/i18n/redact/en.json b/apps/red-ui/src/assets/i18n/redact/en.json index 8c9615cb3..a63802082 100644 --- a/apps/red-ui/src/assets/i18n/redact/en.json +++ b/apps/red-ui/src/assets/i18n/redact/en.json @@ -104,9 +104,9 @@ "form": { "quote-char": "Quotation marker", "quote-char-placeholder": "\"", - "delimiter": "Delimiter", - "delimiter-placeholder": ",", - "encoding-type": "Encoding", + "delimiter": "", + "delimiter-placeholder": "", + "encoding-type": "", "file": "Mapping file", "name": "Mapping name", "name-placeholder": "Mapping name", @@ -1062,7 +1062,7 @@ "dossier-states": "{count, plural, one{Dossier state} other{Dossier states}}" }, "error": { - "conflict": "Dossier state with this name already exists" + "conflict": "Dossier state with this name already exists." }, "no-data": { "title": "There are no dossier states." @@ -1238,9 +1238,9 @@ "title": "Edit {label}" }, "entries-count": "{count} {count, plural, one{entry} other{entries}}", - "false-positives": "False positives", - "false-recommendations": "False recommendations", - "to-redact": "To redact" + "false-positives": "False positives ({count})", + "false-recommendations": "False recommendations ({count})", + "to-redact": "To redact ({count})" }, "general-info": { "form": { @@ -1280,11 +1280,11 @@ "content": { "options": { "multiple-pages": { - "description": "Edit redaction on following range of pages", + "description": "Edit redaction on a range of pages", "extraOptionDescription": "Minus(-) for range and comma(,) for enumeration", - "extraOptionLabel": "Range", + "extraOptionLabel": "Pages", "extraOptionPlaceholder": "e.g. 1-20,22,32", - "label": "Change on all pages" + "label": "Change on multiple pages" }, "only-this-page": { "description": "Edit redaction only at this position in this document", @@ -1891,9 +1891,9 @@ "legalBasis": "Legal basis", "options": { "multiple-pages": { - "description": "Add redaction on following range of pages", + "description": "Add redaction on a range of pages", "extraOptionDescription": "Minus(-) for range and comma(,) for enumeration", - "extraOptionLabel": "Range", + "extraOptionLabel": "Pages", "extraOptionPlaceholder": "e.g. 1-20,22,32", "label": "Apply on multiple pages" }, @@ -2186,11 +2186,11 @@ "content": { "options": { "multiple-pages": { - "description": "Remove redaction on following range of pages", + "description": "Remove redaction on a range of pages", "extraOptionDescription": "Minus(-) for range and comma(,) for enumeration", - "extraOptionLabel": "Range", + "extraOptionLabel": "Pages", "extraOptionPlaceholder": "e.g. 1-20,22,32", - "label": "Remove on all pages" + "label": "Remove on multiple pages" }, "only-this-page": { "description": "Remove redaction only at this position in this document", diff --git a/apps/red-ui/src/assets/i18n/scm/de.json b/apps/red-ui/src/assets/i18n/scm/de.json index d71a1ea28..bdcc10b71 100644 --- a/apps/red-ui/src/assets/i18n/scm/de.json +++ b/apps/red-ui/src/assets/i18n/scm/de.json @@ -100,7 +100,7 @@ "dialog": { "title": "{type, select, add{Neues Komponenten-Mapping erstellen} edit{Komponenten-Mapping bearbeiten} other{}}" }, - "disabled-file-options": "Re-upload mapping file to change", + "disabled-file-options": "Aktualisierte Mapping-Datei hochladen", "form": { "delimiter": "CSV-Trennzeichen", "delimiter-placeholder": "CSV-Trennzeichen", @@ -135,9 +135,9 @@ }, "add-edit-entity": { "form": { - "ai-creation-enabled": "Enable AI creation", - "ai-description": "AI Description", - "ai-description-placeholder": "Enter AI description", + "ai-creation-enabled": "KI-Erstellung aktivieren", + "ai-description": "KI-Beschreibung", + "ai-description-placeholder": "KI-Beschreibung eingeben", "case-sensitive": "Groß-/Kleinschreibung beachten", "color": "Farbe {type, select, redaction{Annotation} hint{Hinweis} recommendation{Empfehlung} skipped{Übersprungene Annotation} ignored{Ignorierter Hinweis} other{}}", "color-placeholder": "#", @@ -244,7 +244,7 @@ }, "type": "Typ", "type-placeholder": "Typ auswählen...", - "value": "Value" + "value": "Wert\n" }, "title": "Hinweis hinzufügen" } @@ -287,14 +287,14 @@ "label": "Ausgewählte Markierungen konvertieren" }, "edit-redaction": { - "label": "Edit" + "label": "Bearbeiten" }, "force-hint": { "label": "Hinweis erzwingen" }, "force-redaction": { "label": "Schwärzung erzwingen", - "label-image-hint": "Redact" + "label-image-hint": "Schwärzen" }, "hide": "Ausblenden", "message": { @@ -364,7 +364,7 @@ "label": "Größenänderung abbrechen" }, "see-references": { - "label": "See references" + "label": "Referenzen anzeigen" }, "show": "Zeigen", "undo": "Rückgängig" @@ -379,7 +379,7 @@ "removed-manual": "Schwärzung/Hinweis entfernt", "resized": "Schwärzungsbereich wurde geändert" }, - "annotation-content": "{hasRule, select, true {Rule {matchedRule} matched{ruleSymbol}} other {}} {hasReason, select, true {{reason}} other {}} {hasLb, select, true {Legal basis: {legalBasis}} other {}} {hasOverride, select, true {Removed by manual override} other {}} {hasSection, select, true {{shouldLower, plural, =0 {I} other {i}}n section{sectionSymbol} \"{section}\"} other {}}", + "annotation-content": "{hasRule, select, true {Rule {matchedRule} trifft zu:{ruleSymbol}} other {}} {hasReason, select, true {{reason}} other {}} {hasLb, select, true {Legal basis: {legalBasis}} other {}} {hasOverride, select, true {Removed by manual override} other {}} {hasSection, select, true {{shouldLower, plural, =0 {I} other {i}}n Abschnitt{sectionSymbol} \"{section}\"} other {}}", "annotation-engines": { "dictionary": "{isHint, select, true{Hinweis} other{Schwärzung}} basiert auf Wörterbuch", "dossier-dictionary": "Annotation basiert auf Dossier-Wörterbuch", @@ -933,7 +933,7 @@ "total-people": "Anzahl der Benutzer" }, "table-col-names": { - "documents-status": "Documents state", + "documents-status": "Dokumentenstatus", "dossier-state": "Dossier-Status", "last-modified": "Letzte Änderung", "name": "Name", @@ -950,7 +950,7 @@ "assign-approver": "Genehmiger zuordnen", "assign-me": "Mir zuweisen", "assign-reviewer": "Benutzer zuweisen", - "back-to-new": "Move to 'New'", + "back-to-new": "Nach \"Neu\" verschieben", "bulk": { "delete": "Dokumente löschen", "reanalyse": "Dokumente analysieren" @@ -966,22 +966,22 @@ }, "charts": { "documents-in-dossier": "Dokumente", - "pages-in-dossier": "Pages" + "pages-in-dossier": "Seiten" }, "description": "Beschreibung", "dictionary": "Dossier-Wörterbuch", "stats": { - "analysed-pages": "{count} {count, plural, one{page} other{pages}}", + "analysed-pages": "{count} {count, plural, one{Seite} other{Seiten}}", "created-on": "Erstellt am {date}", "deleted": "{count} gelöschte Dateien", - "documents": "{count} {count, plural, one{document} other{documents}}", + "documents": "{count} {count, plural, one{Seite} other{Seiten}}", "due-date": "Fällig am {date}", - "people": "{count} {count, plural, one{user} other{users}}", - "processing-documents": "{count} processing {count, plural, one{document} other{documents}}" + "people": "{count} {count, plural, one{Benutzer} other{Benutzer}}", + "processing-documents": "{count} {count, plural, one{Dokument} other{Dokumente}} in Verarbeitung" } }, "download-file": "Herunterladen", - "download-file-disabled": "You need to be approver in the dossier and the {count, plural, one{file needs} other{files need}} to be initially processed in order to download.", + "download-file-disabled": "Download: Sie müssen Genehmiger im Dossier sein und die initiale Verarbeitung {count, plural, one{der Datei} other{der Dateien}} muss abgeschlossen sein.", "file-listing": { "file-entry": { "file-error": "Reanalyse erforderlich", @@ -997,7 +997,7 @@ "edit": "Dossier bearbeiten", "upload-document": "Dokument hochgeladen" }, - "import-redactions": "Import annotations", + "import-redactions": "Annotationen importieren", "new-rule": { "toast": { "actions": { @@ -1027,71 +1027,71 @@ "error": "Die Dateien konnten nicht für eine Reanalyse eingeplant werden. Bitte versuchen Sie es erneut.", "success": "Dateien für Reanalyse vorgesehen." }, - "report-download": "Report download", - "start-auto-analysis": "Enable auto-analysis", - "stop-auto-analysis": "Stop auto-analysis", + "report-download": "Bericht herunterladen", + "start-auto-analysis": "Auto-Analyse aktivieren", + "stop-auto-analysis": "Auto-Analyse anhalten", "table-col-names": { "added-on": "Hinzugefügt", "assigned-to": "Zugewiesen an", - "last-modified": "Last modified", + "last-modified": "Letzte Änderung", "name": "Name", "needs-work": "Arbeitsvorrat", "pages": "Seiten", "status": "Status" }, "table-header": { - "title": "{length} {length, plural, one{document} other{documents}}" + "title": "{length} {length, plural, one{Dokument} other{Dokumente}}" }, "under-approval": "Zur Genehmigung", "under-review": "In Review", "upload-files": "Sie können Dateien überall per Drag and Drop platzieren..." }, - "dossier-permissions": "Dossier permissions", + "dossier-permissions": "Dossier-Rechte", "dossier-state": { - "placeholder": "Undefined" + "placeholder": "NIcht definiert" }, "dossier-states-listing": { "action": { - "delete": "Delete state", - "edit": "Edit state" + "delete": "Status löschen", + "edit": "Status bearbeiten" }, - "add-new": "New state", + "add-new": "Neuer Status", "chart": { - "dossier-states": "{count, plural, one{Dossier state} other{Dossier states}}" + "dossier-states": "{count, plural, one{Dossier-Status} other{Dossier-Status}}" }, "error": { - "conflict": "Dossier state with this name already exists!" + "conflict": "Es gibt bereits einen Dossier-Status mit diesem Namen." }, "no-data": { - "title": "There are no dossier states." + "title": "Es wurde noch kein Dossier-Status angelegt." }, "no-match": { - "title": "No dossier states match your current filters." + "title": "Kein Dossier-Status entspricht den aktuell ausgewählten Filtern." }, - "search": "Search...", + "search": "Suche...", "table-col-names": { - "dossiers-count": "Dossiers count", + "dossiers-count": "Anzahl der Dossiers", "name": "Name", - "rank": "Rank" + "rank": "Rang" }, "table-header": { - "title": "{length} dossier {length, plural, one{state} other{states}}" + "title": "{length} {length, plural, one{Dossierstatus} other{Dossierstatus}}" } }, "dossier-template-info-screen": { - "created-by": "Created by", - "created-on": "Created on: {date}", - "entities": "{count} {count, plural, one{entity} other{entities}}", - "entries": "{count} {count, plural, one{entry} other{entries}}", - "modified-on": "Modified on: {date}", - "title": "Edit dossier template", - "valid-from": "Valid from: {date}", - "valid-to": "Valid to: {date}" + "created-by": "Ersteller", + "created-on": "Erstellt am {date}", + "entities": "{count} {count, plural, one{Entität} other{Entitäten}}", + "entries": "{count} {count, plural, one{Eintrag} other{Einträge}}", + "modified-on": "Geändert am {date}", + "title": "Dossier-Vorlage bearbeiten", + "valid-from": "Gültig ab: {date}", + "valid-to": "Gültig bis: {date}" }, "dossier-template-stats": { - "active-dossiers": "Active {count, plural, one{dossier} other{dossiers}}", - "analyzed-pages": "{count} {count, plural, one{page} other {pages}} analyzed", - "archived-dossiers": "{count} {count, plural, one{dossier} other {dossiers}} in archive", + "active-dossiers": "{count, plural, one{Aktives Dossier} other{Aktive Dossiers}}", + "analyzed-pages": "{count} {count, plural, one{Seite} other {Seiten}} analysiert", + "archived-dossiers": "{count} {count, plural, one{Dossier} other {Dossiers}} im Archiv", "deleted-dossiers": "{count} {count, plural, one{dossier} other {dossiers}} in trash", "total-documents": "Anzahl der Dokumente", "total-people": "{count} {count, plural, one{user} other {users}}" @@ -1153,11 +1153,11 @@ "save": "Download" }, "form": { - "redaction-preview-color": "Redaction preview color", + "redaction-preview-color": "Vorschau-Farbe", "redaction-preview-color-placeholder": "#000000" }, - "header": "Download options", - "unapproved-files-warning": "This download contains unapproved file(s)." + "header": "Download-Optionen", + "unapproved-files-warning": "Dieser Download enthält Dateien, die noch nicht freigegeben sind." }, "download-includes": "Wählen Sie die Dokumente für Ihr Download-Paket aus", "download-status": { @@ -1235,10 +1235,10 @@ "save": "", "title": "" }, - "entries-count": "{count} {count, plural, one{entry} other{entries}}", - "false-positives": "False positives", - "false-recommendations": "False recommendations", - "to-redact": "To redact" + "entries-count": "{count} {count, plural, one{Eintrag} other{Einträge}}", + "false-positives": "Falsch-Positive ({count})", + "false-recommendations": "Falsche Empfehlungen ({count})", + "to-redact": "Schwärzungen ({count})" }, "general-info": { "form": { @@ -1247,8 +1247,8 @@ "placeholder": "Beschreibung eingeben" }, "dossier-state": { - "label": "Dossier state", - "no-state-placeholder": "This dossier template has no states" + "label": "Dossier-Status", + "no-state-placeholder": "Für dieses Dossier ist noch kein Status festgelegt" }, "due-date": "Termin", "name": { @@ -1259,7 +1259,7 @@ } }, "header": "{dossierName} bearbeiten", - "missing-owner": "You cannot edit the dossier because the owner is missing!", + "missing-owner": "Bearbeiten des Dossiers nicht möglich: Kein Besitzer zugewiesen.", "nav-items": { "choose-download": "Wählen Sie die Dokumente für Ihr Download-Paket aus:", "dictionary": "Wörterbuch", @@ -1295,12 +1295,12 @@ "edit-redaction": { "dialog": { "actions": { - "cancel": "Cancel", - "save": "Save changes" + "cancel": "Abbrechen", + "save": "Änderungen speichern" }, "content": { - "comment": "Comment", - "comment-placeholder": "Add remarks or mentions...", + "comment": "Kommentar", + "comment-placeholder": "Bemerkungen oder Notizen hinzufügen...", "legal-basis": "", "options": { "in-document": { @@ -1766,14 +1766,14 @@ "label": "Auf allen Seiten entfernen" }, "this-page": { - "description": "The earmarks in the selected HEX color will be removed only on the current page in view.", - "label": "Remove only on this page" + "description": "Die Markierungen in der ausgewählten HEX-Farbe werden nur auf der aktuell angezeigten Seite konvertiert.", + "label": "Nur auf dieser Seite entfernen" } }, - "save": "Remove earmarks", - "title": "Remove earmarks" + "save": "Markierungen entfernen", + "title": "Markierungen entfernen" }, - "success": "{operation, select, convert{Converting earmarks in progress...} delete{Successfully removed earmarks!} other{}} " + "success": "{operation, select, convert{Markierungen werden konvertiert...} delete{Markierungen erfolgreich entfernt.} other{}} " }, "highlights": "{color} - {length} {length, plural, one{earmark} other{earmarks}}", "image-category": { @@ -2206,48 +2206,48 @@ }, "content": { "comment": "Kommentar", - "comment-placeholder": "Add remarks or mentions...", + "comment-placeholder": "Bemerkungen oder Notizen hinzufügen...", "options": { "do-not-recommend": { - "description": "Do not recommend ''{value}'' as {type} in any document of the current dossier.", - "description-bulk": "Do not recommend the selected values as their respective types in any document of the current dossier.", - "extraOptionLabel": "Apply to all dossiers", - "label": "Remove from dossier" + "description": "Der Begriff soll in Dokumenten dieses Dossiers nicht zur Annotation empfohlen werden.", + "description-bulk": "Der Begriff soll in Dokumenten dieses Dossiers nicht zur Annotation empfohlen werden.", + "extraOptionLabel": "In alle aktiven und zukünftigen Dossiers übernehmen", + "label": "Aus Dossier entfernen" }, "false-positive": { - "description": "''{value}'' is not a {type} in this context: ''{context}''.", + "description": "Markieren Sie die Annotation als falsch-positiv. Der Begriff wird in diesem Dossier nicht geschwärzt, wenn er im gleichen Kontext vorkommt.", "description-bulk": "", "extraOptionDescription": "", - "extraOptionLabel": "Apply to all dossiers", - "label": "False positive" + "extraOptionLabel": "In alle aktiven und zukünftigen Dossiers übernehmen", + "label": "In diesem Kontext aus Dossier entfernen" }, "in-document": { "description": "", "label": "Aus Dokument entfernen" }, "in-dossier": { - "description": "Do not annotate the term in this dossier.", + "description": "Der Begriff wird in diesem Dossier nicht geschwärzt.", "description-bulk": "", - "extraOptionLabel": "Apply to all dossiers", - "label": "Remove from dossier", + "extraOptionLabel": "In alle aktiven und zukünftigen Dossiers übernehmen", + "label": "Aus Dossier entfernen", "label-bulk": "" }, "only-here": { - "description": "Do not {type} ''{value}'' at this position in the current document.", - "description-bulk": "", - "label": "Remove here" + "description": "{type} '{value}'' wird an dieser Stelle nicht annotiert.", + "description-bulk": "Do not{type} ''{value}'' at this position in the current document.", + "label": "Hier entfernen" } } }, - "title": "Remove {type}", + "title": "Entferne {type}", "title-bulk": "" } }, "report-type": { - "label": "{length} report {length, plural, one{type} other{types}}" + "label": "{length} {length, plural, one{Berichtstyp} other{Berichtstypen}}" }, "reports-screen": { - "description": "Below, you will find a list of placeholders for dossier- and document-specific information. You can include these placeholders in your report templates.", + "description": "Die Liste unten enthält Platzhalter, die für dossier- und dokumentenspezifische Informationen stehen. Sie können diese in die Vorlagen für Ihre Berichte einbauen.", "descriptions": { "dossier-attributes": "Dieser Platzhalter wird durch den Wert des Dossier-Attributs {attribute} ersetzt.", "file-attributes": "Dieser Platzhalter wird durch den Wert des Dateiattributs {attribute} ersetzt.", @@ -2265,17 +2265,17 @@ }, "redaction": { "entity": { - "display-name": "This placeholder is replaced by the name of the entity the component is based on." + "display-name": "Dieser Platzhalter wird durch den Entitätsnamen ersetzt, auf der die Komponente basiert." }, "excerpt": "Dieser Platzhalter wird durch einen Textausschnitt ersetzt, der die Schwärzung enthält.", - "is-skipped": "The skipped redaction placeholder indicates whether a redaction is skipped or not. It can be included in a separate column of a template that also contains the '{{redaction.value'}} placeholder. The placeholder is replaced by “true” if the respective redaction is skipped, and by “false” if it is redacted (i. e., not skipped).", + "is-skipped": "Dieser Platzhalter gibt an, ob eine Schwärzung ignoriert wird oder nicht. Er kann in eine separate Spalte einer Vorlage eingebaut werden, die auch den Platzhalter '{{'redaction.value'}}' enthält. Der Platzhalter wird durch „true“ (wahr) ersetzt, wenn die entsprechende Schwärzung ignoriert ist, und durch „false“ (falsch), wenn sie nicht ignoriert (d. h. geschwärzt) ist.", "justification": "Dieser Platzhalter wird durch die Begründung der Schwärzung ersetzt. Es ist eine Kombination aus dem Rechtsverweis (justificationParagraph) und dem Begründungstext (justificationReason).", - "justification-legal-basis": "This placeholder is replaced by the legal basis for the component.", - "justification-paragraph": "Dieser Platzhalter wird durch den Rechtshinweis der Begründung der Redaktion ersetzt.", - "justification-reason": "Dieser Platzhalter wird durch den Begründungstext der Schwärzung ersetzt.", - "justification-text": "This placeholder is replaced by the justification text.", - "page": "Dieser Platzhalter wird durch die Seitenzahl der Redaktion ersetzt.", - "paragraph": "Dieser Platzhalter wird durch den Absatz ersetzt, der die Schwärzung enthält.", + "justification-legal-basis": "Dieser Platzhalter wird durch die Rechtsgrundlage der Komponente ersetzt.", + "justification-paragraph": "Dieser Platzhalter wird durch den Rechtshinweis der Begründung der Komponente ersetzt.", + "justification-reason": "Dieser Platzhalter wird durch den Begründungstext der Komponente ersetzt.", + "justification-text": "Dieser Platzhalter wird durch die Schwärzungsbegründung (Text) ersetzt.", + "page": "Dieser Platzhalter wird durch die Seitenzahl der Komponente ersetzt.", + "paragraph": "Dieser Platzhalter wird durch den Absatz ersetzt, der die Komponente enthält.", "paragraph-idx": "The placeholder is replaced by the number of the paragraph containing the redaction. Paragraphs are numbered on a per-page basis.", "value": "This placeholder is replaced by the value that was extracted." }, @@ -2287,7 +2287,7 @@ "invalid-upload": "Ungültiges Upload-Format ausgewählt! Unterstützt werden Dokumente im .xlsx- und im .docx-Format", "multi-file-report": "(Mehrere Dateien)", "report-documents": "Dokumente für den Bericht", - "setup": "Click the upload button on the right to upload your component report templates.", + "setup": "Dieser Platzhalter wird durch die Nummer der Seite ersetzt, auf der sich die Schwärzung befindet.", "table-header": { "description": "Beschreibung", "placeholders": "Platzhalter" @@ -2309,95 +2309,95 @@ "resize-annotation": { "dialog": { "actions": { - "cancel": "Cancel", - "save": "Save changes" + "cancel": "Abbrechen", + "save": "Änderungen speichern" }, "content": { - "comment": "Comment", - "original-text": "Original annotation:", - "resized-text": "Resized annotation:" + "comment": "Kommentar", + "original-text": "Originale Annotation:", + "resized-text": "Geändert zu: " }, - "header": "Resize annotation" + "header": "Größe der Annotation ändern" } }, "resize-redaction": { "dialog": { "actions": { - "cancel": "Cancel", - "save": "Save changes" + "cancel": "Abbrechen", + "save": "Änderungen speichern" }, "content": { - "comment": "Comment", + "comment": "Kommentar", "options": { "in-dossier": { - "description": "Resize in every document in {dossierName}.", - "extraOptionLabel": "Apply to all dossiers", - "label": "Resize in dossier", - "tooltip": "Only available for dictionary-based types" + "description": "Ändern Sie die Größe in jedem Dokument in {dossierName}.", + "extraOptionLabel": "In alle Dossiers übernehmen", + "label": "Größe im Dossier ändern", + "tooltip": "Nur bei wörterbuchbasierten Typen verfügbar" }, "only-here": { - "description": "Resize only at this position in this document.", - "label": "Resize only here" + "description": "Ändern Sie die Größe nur an dieser Stelle im Dokument.", + "label": "Größe nur hier ändern" } }, - "original-text": "Original text:", - "resized-text": "Resized text:", - "type": "Type" + "original-text": "Originaltext:", + "resized-text": "Geändert zu:", + "type": "Typ" }, - "header": "Resize {type}" + "header": "Größe von {type} ändern" } }, "revert-value-dialog": { "actions": { - "cancel": "Cancel", - "revert": "Revert to original values" + "cancel": "Abbrechen", + "revert": "Auf ursprüngliche Werte zurücksetzen" }, - "component-rule": "Component rule: ", - "current-values": "Current values", - "original-values": "Original values", - "title": "Revert to the original values?" + "component-rule": "Komponentenregel:", + "current-values": "Aktuelle Werte", + "original-values": "Ursprüngliche Werte", + "title": "Auf ursprüngliche Werte zurücksetzen?" }, "roles": { "inactive": "Inaktiv", - "manager-admin": "Manager & admin", + "manager-admin": "Manager & Admin", "no-role": "Keine Rolle definiert", - "red-admin": "Anwendungsadministrator", + "red-admin": "Anwendungsadmin", "red-manager": "Manager", "red-user": "Benutzer", - "red-user-admin": "Benutzer-Admin", - "regular": "Regulär" + "red-user-admin": "Benutzeradmin", + "regular": "regulärer Benutzer" }, "search": { - "active-dossiers": "ganze Plattform", - "all-dossiers": "all documents", - "placeholder": "Nach Dokumenten oder Dokumenteninhalt suchen", - "this-dossier": "in diesem Dossier" + "active-dossiers": "Dokumente in aktiven Dossiers", + "all-dossiers": "Alle Dokumente", + "placeholder": "Dokumente durchsuchen...", + "this-dossier": "In diesem Dossier" }, "search-screen": { "cols": { - "assignee": "Bevollmächtigter", + "assignee": "Bearbeiter", "document": "Dokument", "dossier": "Dossier", "pages": "Seiten", "status": "Status" }, "filters": { - "assignee": "Assignee", - "by-dossier": "Nach Dossier filtern", - "by-template": "Dossier template", - "only-active": "Active dossiers only", - "search-by-template-placeholder": "Dossier template name...", + "assignee": "Bearbeiter", + "by-dossier": "Dossier", + "by-template": "Dossier-Vorlage", + "only-active": "Nur aktive Dossiers", + "search-by-template-placeholder": "Dossiernamen eingeben...", "search-placeholder": "Dossiername...", "status": "Status" }, "missing": "Fehlt", "must-contain": "Muss enthalten", - "no-data": "Geben Sie einen Suchbegriff in die Suchleiste, um nach Dokumenten oder Inhalten von Dokumenten zu suchen.", - "no-match": "Keine Dokumente entsprechen Ihren aktuellen Filtern.", - "table-header": "{length} search {length, plural, one{result} other{results}}" + "no-data": "Geben Sie einen Suchbegriff in die Suchleiste ein,
um Dokumente oder Inhalte zu suchen.", + "no-match": "Der Suchbegriff wurde in keinem der Dokumente gefunden.", + "table-header": "{length} {length, plural, one{Suchergebnis} other{Suchergebnisse}}" }, - "seconds": "seconds", - "size": "Size", + "seconds": "Sekunden", + "size": "Größe", "smtp-auth-config": { "actions": { "cancel": "Abbrechen", @@ -2411,48 +2411,48 @@ "title": "Authentifizierung aktivieren" }, "table-header": { - "selected-count": "{count} selected" + "selected-count": "{count} ausgewählt" }, "tenant-resolve": { - "contact-administrator": "Cannot remember the workspace? Please contact your administrator.", + "contact-administrator": "Workspace vergessen? Bitte wenden Sie sich an Ihren Administrator.", "header": { - "first-time": "Sign in for the first time to a workspace", - "join-another-domain": "Or join another workspace", - "no-role-log-out": "User role missing. Please ask your administrator to assign roles before logging in again.", - "sign-in-previous-domain": "Sign in to a previously used workspace", - "youre-logged-out": "You have successfully been logged out." + "first-time": "Melden Sie sich zum ersten Mal bei einem Workspace an", + "join-another-domain": "Oder treten Sie einem andren Workspace bei", + "no-role-log-out": "Keine Benutzerrolle zugewiesen. Bitten Sie Ihren Admin, Ihnen eine Rolle zuzuweisen, und versuchen Sie es dann noch einmal.", + "sign-in-previous-domain": "Melden Sie sich bei einem bereits verwendeten Workspace an", + "youre-logged-out": "Sie wurden erfolgreich abgemeldet." }, - "input-placeholder": "your workspace" + "input-placeholder": "Ihr Workspace" }, "time": { - "days": "{days} {days, plural, one{day} other{days}}", - "hours": "{hours} {hours, plural, one{hour} other{hours}}", + "days": "{days} {days, plural, one{Tag} other{Tage}}", + "hours": "{hours} {hours, plural, one{Stunde} other{Stunden}}", "less-than-an-hour": "< 1 Stunde", "no-time-left": "Frist für Wiederherstellung verstrichen" }, - "today": "Today", + "today": "Heute", "toggle-auto-analysis-message": { - "error": "Something went wrong.", - "success": "{toggleOperation} automatic processing." + "error": "Es ist ein Fehler aufgetreten.", + "success": "{toggleOperation} automatische Verarbeitung." }, "top-bar": { "navigation-items": { "back": "Zurück", - "back-to-dashboard": "Back to home", - "dashboard": "Home", + "back-to-dashboard": "Zurück zu Start", + "dashboard": "Start", "my-account": { "children": { "account": "Konto", "admin": "Einstellungen", "downloads": "Meine Downloads", - "join-another-tenant": "Join another workspace", + "join-another-tenant": "Anderem Workspace beitreten", "language": { "de": "Deutsch", "en": "Englisch", "label": "Sprache" }, "logout": "Abmelden", - "select-tenant": "Select Tenant", + "select-tenant": "Workspace wechseln", "trash": "Papierkorb" } } @@ -2469,7 +2469,7 @@ }, "label": "Papierkorb", "no-data": { - "title": "Es wurde noch kein Dossier angelegt." + "title": "Im Papierkorb befinden sich keine gelöschten Elemente." }, "no-match": { "title": "Die ausgewählten Filter treffen auf kein Dossier zu." @@ -2478,19 +2478,19 @@ "deleted-on": "Gelöscht am", "dossier": "Dossier", "name": "Name", - "owner": "Eigentümer", + "owner": "Besitzer/Bearbeiter", "time-to-restore": "Verbleibende Zeit für Wiederherstellung" }, "table-header": { - "title": "{length} deleted {length, plural, one{item} other{items}}" + "title": "{length} {length, plural, one{gelöschtes Dossier} other{gelöschte Dossiers}}" } }, "type": "Typ", "unknown": "Unbekannt", "update-profile": { "errors": { - "bad-request": "Error: {message}.", - "generic": "An error has occurred while updating the profile." + "bad-request": "Fehler: {message}.", + "generic": "Bei der Aktualisierung des Profils ist ein Fehler aufgetreten." } }, "upload-dictionary-dialog": { @@ -2499,11 +2499,11 @@ "merge": "Einträge zusammenführen", "overwrite": "Überschreiben" }, - "question": "Wählen Sie, wie Sie fortfahren möchten:", + "question": "Wie möchten Sie vorgehen?", "title": "Das Wörterbuch hat bereits Einträge!" }, "upload-file": { - "upload-area-text": "Click or drag & drop anywhere on this area..." + "upload-area-text": "Klicken Sie hier oder ziehen Sie die Datei in diesen Bereich..." }, "upload-status": { "dialog": { @@ -2515,8 +2515,8 @@ }, "error": { "file-size": "Datei zu groß. Die maximal zulässige Größe beträgt {size} MB.", - "file-type": "This file type is not accepted.", - "generic": "Fehler beim Hochladen des Dokuments. {error}" + "file-type": "Dateityp wird nicht unterstützt.", + "generic": "Aktualisierung der Datei fehlgeschlagen: {error}" } }, "user-listing": { @@ -2530,22 +2530,22 @@ "delete-disabled": "Sie können Ihr eigenes Konto nicht löschen." }, "no-match": { - "title": "Die ausgewählten Filter treffen auf keinen Benutzer zu." + "title": "Ausgewählte Filter treffen auf keinen Benutzer zu." }, "search": "Suche ...", "table-col-names": { "active": "Aktiv", "email": "E-Mail-Adresse", - "name": "Name", + "name": "Name\n", "roles": "Rollen" }, "table-header": { - "title": "{length} {length, plural, one{user} other{users}}" + "title": "{length} {length, plural, one{Benutzer} other{Benutzer}}" } }, "user-management": "Benutzerverwaltung", "user-menu": { - "button-text": "User menu" + "button-text": "Benutzermenü" }, "user-profile": "Mein Profil", "user-profile-screen": { @@ -2556,63 +2556,63 @@ "confirm-password": { "form": { "password": { - "label": "Password" + "label": "Passwort" } }, - "header": "Confirm your password", - "save": "Submit" + "header": "Passwort bestätigen", + "save": "Absenden" }, "form": { - "dark-theme": "Dark theme", - "email": "E-mail", + "dark-theme": "Nachtmodus", + "email": "E-Mail", "first-name": "Vorname", "last-name": "Nachname" }, "title": "Profil bearbeiten", "update": { - "success": "Successfully updated profile!" + "success": "Das Profil wurde erfolgreich aktualisiert." } }, "user-stats": { "chart": { - "users": "Benutzer im Arbeitsbereich" + "users": "Benutzer im Workspace" }, "collapse": "Details ausblenden", "expand": "Details anzeigen", "title": "Benutzer" }, "view-mode": { - "list": "Liste", + "list": "Dokumentenliste", "view-as": "Ansicht als:", - "workflow": "Arbeitsablauf" + "workflow": "Workflow-Spalten" }, "watermark-screen": { "action": { - "change-success": "Das Wasserzeichen wurde aktualisiert!", - "created-success": "Watermark has been created!", - "error": "Fehler beim Aktualisieren des Wasserzeichens", - "revert": "Rückgängig machen", + "change-success": "Wasserzeichen wurde aktualisiert.", + "created-success": "Wasserzeichen wurde erstellt.", + "error": "Aktualisierung des Wasserzeichens fehlgeschlagen.", + "revert": "Zurücksetzen", "save": "Änderungen speichern" }, "alignment": { - "align-bottom": "Align bottom", - "align-horizontal-centers": "Align horizontal centers", - "align-left": "Align left", - "align-right": "Align right", - "align-top": "Align top", - "align-vertical-centers": "Align vertical centers" + "align-bottom": "Unten", + "align-horizontal-centers": "Horizontal mittig", + "align-left": "Linksbündig", + "align-right": "Rechtsbündig", + "align-top": "Oben", + "align-vertical-centers": "Vertikal mittig" }, "form": { - "alignment": "Alignment", + "alignment": "Position", "color": "Farbe", "color-placeholder": "#", "font-size": "Schriftgröße", "font-type": "Schriftart", - "name-label": "Watermark name", - "name-placeholder": "Choose a name to identify the watermark", + "name-label": "Name des Wsserzeichens", + "name-placeholder": "Namen für Wasserzeichen eingeben", "opacity": "Deckkraft", - "orientation": "Ausrichtung", - "text-label": "Watermark text", + "orientation": "Textrichtung", + "text-label": "Text für Wasserzeichen", "text-placeholder": "Text eingeben" }, "pagination": { @@ -2622,32 +2622,32 @@ }, "watermarks-listing": { "action": { - "delete": "Delete", - "delete-success": "Watermark has been deleted!", - "edit": "Edit" + "delete": "Löschen", + "delete-success": "Das Wasserzeichen wurde gelöscht.", + "edit": "Bearbeiten" }, - "add-new": "New watermark", + "add-new": "Neues Wasserzeichen", "no-data": { - "title": "There are no watermarks yet." + "title": "Es wurde noch kein Wasserzeichen erstellt." }, "table-col-names": { - "created-by": "Created by", - "created-on": "Created on", - "modified-on": "Modified on", + "created-by": "Ersteller", + "created-on": "Erstellt am", + "modified-on": "Geändert am", "name": "Name", "status": "Status" }, "table-header": { - "title": "Watermarks" + "title": "Wasserzeichen" }, - "watermark-is-used": "This watermark is already in use, are you sure you want to delete it?" + "watermark-is-used": "Dieses Wasserzeichen wird bereits verwendet. Möchten Sie es dennoch löschen?" }, "workflow": { "selection": { "all": "Alle", "count": "{count} ausgewählt", "none": "Keiner", - "select": "Wählen" + "select": "Auswählen" } }, "yesterday": "Gestern" diff --git a/apps/red-ui/src/assets/i18n/scm/en.json b/apps/red-ui/src/assets/i18n/scm/en.json index 532ceadec..44997e9ca 100644 --- a/apps/red-ui/src/assets/i18n/scm/en.json +++ b/apps/red-ui/src/assets/i18n/scm/en.json @@ -18,7 +18,7 @@ }, "content": { "comment": "Comment", - "comment-placeholder": "Add remarks or mentions...", + "comment-placeholder": "Add remarks or notes...", "selected-text": "Selected text:", "type": "Type", "type-placeholder": "Select type..." @@ -100,7 +100,7 @@ "dialog": { "title": "{type, select, add{Add new} edit{Edit} other{}} component mapping" }, - "disabled-file-options": "Re-upload mapping file to change", + "disabled-file-options": "Upload updated mapping file", "form": { "delimiter": "CSV delimiter", "delimiter-placeholder": "CSV delimiter", @@ -230,11 +230,11 @@ }, "content": { "comment": "Comment", - "comment-placeholder": "Add remarks or mentions...", + "comment-placeholder": "Add remarks or notes...", "options": { "in-dossier": { "description": "Add hint in every document in {dossierName}.", - "extraOptionLabel": "Apply to all dossiers", + "extraOptionLabel": "Apply to all active and future dossiers", "label": "Add hint in dossier" }, "only-here": { @@ -981,7 +981,7 @@ } }, "download-file": "Download", - "download-file-disabled": "You need to be approver in the dossier and the {count, plural, one{file needs} other{files need}} to be initially processed in order to download.", + "download-file-disabled": "To download, ensure you are an approver in the dossier, and the {count, plural, one{file has undergone} other{files have undergone}} initial processing.", "file-listing": { "file-entry": { "file-error": "Re-processing required", @@ -1060,13 +1060,13 @@ "dossier-states": "{count, plural, one{Dossier state} other{Dossier states}}" }, "error": { - "conflict": "Dossier state with this name already exists!" + "conflict": "Dossier state with this name already exists." }, "no-data": { "title": "There are no dossier states." }, "no-match": { - "title": "No dossier states match your current filters." + "title": "No dossier state matches the currently selected filters." }, "search": "Search...", "table-col-names": { @@ -1153,7 +1153,7 @@ "save": "Download" }, "form": { - "redaction-preview-color": "Redaction preview color", + "redaction-preview-color": "Preview color", "redaction-preview-color-placeholder": "#000000" }, "header": "Download options", @@ -1236,9 +1236,9 @@ "title": "" }, "entries-count": "{count} {count, plural, one{entry} other{entries}}", - "false-positives": "False positives", - "false-recommendations": "False recommendations", - "to-redact": "To redact" + "false-positives": "False positives ({count})", + "false-recommendations": "False recommendations ({count})", + "to-redact": "To redact ({count})" }, "general-info": { "form": { @@ -1259,7 +1259,7 @@ } }, "header": "Edit {dossierName}", - "missing-owner": "You cannot edit the dossier because the owner is missing!", + "missing-owner": "Editing the dossier not possible: No owner assigned.", "nav-items": { "choose-download": "Choose what is included at download:", "dictionary": "Dictionary", @@ -1300,7 +1300,7 @@ }, "content": { "comment": "Comment", - "comment-placeholder": "Add remarks or mentions...", + "comment-placeholder": "Add remarks or notes...", "legal-basis": "", "options": { "in-document": { @@ -1745,7 +1745,7 @@ "label": "Convert on all pages" }, "this-page": { - "description": "The earmarks in the selected HEX color will be converted only on the current page in view.", + "description": "The earmarks in the selected HEX color will be converted only on the currently viewed page.", "label": "Convert only on this page" } }, @@ -2110,7 +2110,7 @@ }, "content": { "comment": "Comment", - "comment-placeholder": "Add remarks or mentions...", + "comment-placeholder": "Add remarks or notes...", "edit-text": "", "legal-basis": "Legal basis", "options": { @@ -2120,7 +2120,7 @@ }, "in-dossier": { "description": "Add redaction in every document in {dossierName}.", - "extraOptionLabel": "Apply to all dossiers", + "extraOptionLabel": "Apply to all active and future dossiers", "label": "Redact in dossier" }, "only-here": { @@ -2149,14 +2149,14 @@ }, "content": { "comment": "Comment", - "comment-placeholder": "Add remarks or mentions...", + "comment-placeholder": "Add remarks or notes...", "list-item": "{text}", "list-item-false-positive": "''{text}'' in the context: ''{context}''", "options": { "false-positive": { - "description": "''{value}'' is not a ''{type}'' in this context: ''{context}''.", + "description": "Mark this redaction as a false-positive. The term will not be redacted in this dossier if it occurs in the same context.", "description-bulk": "Mark this redaction as a false-positive. The term will not be redacted in this dossier if it occurs in the same context.", - "label": "False positive" + "label": "Remove from dossier in this context" }, "in-document": { "description": "", @@ -2206,20 +2206,20 @@ }, "content": { "comment": "Comment", - "comment-placeholder": "Add remarks or mentions...", + "comment-placeholder": "Add remarks or notes...", "options": { "do-not-recommend": { - "description": "Do not recommend ''{value}'' as {type} in any document of the current dossier.", + "description": "Do not recommend the selected term in any document of this dossier.", "description-bulk": "Do not recommend the selected values as their respective types in any document of the current dossier.", - "extraOptionLabel": "Apply to all dossiers", + "extraOptionLabel": "Apply to all active and future dossiers", "label": "Remove from dossier" }, "false-positive": { - "description": "''{value}'' is not a {type} in this context: ''{context}''.", + "description": "Mark this redaction as a false-positive. The term will not be redacted in this dossier if it occurs in the same context.", "description-bulk": "", "extraOptionDescription": "", - "extraOptionLabel": "Apply to all dossiers", - "label": "False positive" + "extraOptionLabel": "Apply to all active and future dossiers", + "label": "Remove from dossier in this context" }, "in-document": { "description": "", @@ -2228,13 +2228,13 @@ "in-dossier": { "description": "Do not annotate the term in this dossier.", "description-bulk": "", - "extraOptionLabel": "Apply to all dossiers", + "extraOptionLabel": "Apply to all active and future dossiers", "label": "Remove from dossier", "label-bulk": "" }, "only-here": { - "description": "Do not {type} ''{value}'' at this position in the current document.", - "description-bulk": "", + "description": "Do not{type} '{value}'' at this position in the current document.", + "description-bulk": "Do not{type} ''{value}'' at this position in the current document.", "label": "Remove here" } } @@ -2268,7 +2268,7 @@ "display-name": "This placeholder is replaced by the name of the entity the component is based on." }, "excerpt": "This placeholder is replaced by a text snippet that contains the component.", - "is-skipped": "The skipped redaction placeholder indicates whether a redaction is skipped or not. It can be included in a separate column of a template that also contains the '{{redaction.value'}} placeholder. The placeholder is replaced by “true” if the respective redaction is skipped, and by “false” if it is redacted (i. e., not skipped).", + "is-skipped": "The skipped redaction placeholder indicates whether a redaction is skipped or not. It can be included in a separate column of a template that also contains the '\n{{'redaction.value'}}' placeholder. The placeholder is replaced by “true” if the respective redaction is skipped, and by “false” if it is redacted (i. e., not skipped).", "justification": "This placeholder is replaced by the justification of the component. It is a combination of the legal reference (justificationParagraph) and the justification text (justificationReason).", "justification-legal-basis": "This placeholder is replaced by the legal basis for the component.", "justification-paragraph": "This placeholder is replaced by the legal reference of the justification of the component.", @@ -2331,7 +2331,7 @@ "options": { "in-dossier": { "description": "Resize in every document in {dossierName}.", - "extraOptionLabel": "Apply to all dossiers", + "extraOptionLabel": "Apply to all active and future dossiers", "label": "Resize in dossier", "tooltip": "Only available for dictionary-based types" }, @@ -2386,7 +2386,7 @@ }, "missing": "Missing", "must-contain": "Must contain", - "no-data": "Please enter a keyword into the search bar to look for documents or document content.", + "no-data": "Enter a keyword into the search bar
to look for documents or document content.", "no-match": "The specified search term was not found in any of the documents.", "table-header": "{length} search {length, plural, one{result} other{results}}" }, @@ -2422,7 +2422,7 @@ "sign-in-previous-domain": "Sign in to a previously used workspace", "youre-logged-out": "You have successfully been logged out." }, - "input-placeholder": "your workspace" + "input-placeholder": "Your workspace" }, "time": { "days": "{days} {days, plural, one{day} other{days}}", @@ -2515,7 +2515,7 @@ }, "error": { "file-size": "File too large. Limit is {size}MB.", - "file-type": "This file type is not accepted.", + "file-type": "This file type is not supported.", "generic": "Failed to upload file. {error}" } }, @@ -2570,7 +2570,7 @@ }, "title": "Edit profile", "update": { - "success": "Successfully updated profile!" + "success": "Successfully updated profile." } }, "user-stats": { @@ -2588,9 +2588,9 @@ }, "watermark-screen": { "action": { - "change-success": "Watermark has been updated!", - "created-success": "Watermark has been created!", - "error": "Failed to update watermark", + "change-success": "Watermark has been updated.", + "created-success": "Watermark has been created.", + "error": "Failed to update watermark.", "revert": "Revert", "save": "Save changes" }, From 51e46f20f4f66a0be16714cca3c56d15d1039c25 Mon Sep 17 00:00:00 2001 From: Kilian Schuettler Date: Fri, 25 Oct 2024 13:50:27 +0200 Subject: [PATCH 3/3] RED-10264: remove includeUnprocessed from all manual change calls --- .../services/annotation-actions.service.ts | 22 +------------ .../services/manual-redaction.service.ts | 33 +++++-------------- 2 files changed, 9 insertions(+), 46 deletions(-) diff --git a/apps/red-ui/src/app/modules/file-preview/services/annotation-actions.service.ts b/apps/red-ui/src/app/modules/file-preview/services/annotation-actions.service.ts index 852c3b9e3..fc703931a 100644 --- a/apps/red-ui/src/app/modules/file-preview/services/annotation-actions.service.ts +++ b/apps/red-ui/src/app/modules/file-preview/services/annotation-actions.service.ts @@ -114,7 +114,6 @@ export class AnnotationActionsService { async editRedaction(annotations: AnnotationWrapper[]) { const { dossierId, file } = this._state; const allFileAnnotations = this._fileDataService.annotations(); - const includeUnprocessed = annotations.every(annotation => this.#includeUnprocessed(annotation, true)); const data = { annotations, allFileAnnotations, @@ -170,7 +169,6 @@ export class AnnotationActionsService { dossierId, file().id, this.#getChangedFields(annotations, result), - includeUnprocessed, result.option === RedactOrHintOptions.IN_DOCUMENT || !!result.pageNumbers.length, ) .pipe(log()), @@ -269,7 +267,6 @@ export class AnnotationActionsService { async acceptResize(annotation: AnnotationWrapper, permissions: AnnotationPermissions): Promise { const textAndPositions = await this.#extractTextAndPositions(annotation.id); - const includeUnprocessed = this.#includeUnprocessed(annotation); if (annotation.isRecommendation) { const recommendation = { ...annotation, @@ -320,7 +317,7 @@ export class AnnotationActionsService { await this.cancelResize(annotation); const { fileId, dossierId } = this._state; - const request = this._manualRedactionService.resize([resizeRequest], dossierId, fileId, includeUnprocessed); + const request = this._manualRedactionService.resize([resizeRequest], dossierId, fileId); return this.#processObsAndEmit(request); } @@ -477,7 +474,6 @@ export class AnnotationActionsService { #removeRedaction(redactions: AnnotationWrapper[], dialogResult: RemoveRedactionResult) { const removeFromDictionary = dialogResult.option.value === RemoveRedactionOptions.IN_DOSSIER; - const includeUnprocessed = redactions.every(redaction => this.#includeUnprocessed(redaction, true)); const body = this.#getRemoveRedactionBody(redactions, dialogResult); // todo: might not be correct, probably shouldn't get to this point if they are not all the same const isHint = redactions.every(r => r.isHint); @@ -505,7 +501,6 @@ export class AnnotationActionsService { fileId, removeFromDictionary, isHint, - includeUnprocessed, dialogResult.bulkLocal, ), ), @@ -521,7 +516,6 @@ export class AnnotationActionsService { fileId, removeFromDictionary, isHint, - includeUnprocessed, dialogResult.bulkLocal || !!dialogResult.pageNumbers.length, ), ).then(); @@ -580,20 +574,6 @@ export class AnnotationActionsService { return { changes: changedFields.join(', ') }; } - //TODO this is temporary, based on RED-8950. Should be removed when a better solution will be found - #includeUnprocessed(annotation: AnnotationWrapper, isRemoveOrRecategorize = false) { - const processed = annotation.entry.manualChanges.at(-1)?.processed; - if (!processed) { - const autoAnalysisDisabled = this._state.file().excludedFromAutomaticAnalysis; - const addedLocallyWhileDisabled = annotation.manual; - if (autoAnalysisDisabled) { - return addedLocallyWhileDisabled; - } - return isRemoveOrRecategorize && addedLocallyWhileDisabled; - } - return false; - } - #getRemoveRedactionBody( redactions: AnnotationWrapper[], dialogResult: RemoveRedactionResult, diff --git a/apps/red-ui/src/app/modules/file-preview/services/manual-redaction.service.ts b/apps/red-ui/src/app/modules/file-preview/services/manual-redaction.service.ts index e8017d6df..524717c07 100644 --- a/apps/red-ui/src/app/modules/file-preview/services/manual-redaction.service.ts +++ b/apps/red-ui/src/app/modules/file-preview/services/manual-redaction.service.ts @@ -75,13 +75,10 @@ export class ManualRedactionService extends GenericService { body: List | IBulkRecategorizationRequest, dossierId: string, fileId: string, - successMessageParameters?: { - [key: string]: string; - }, - includeUnprocessed = false, + successMessageParameters?: { [p: string]: string }, bulkLocal = false, ) { - return this.#recategorize(body, dossierId, fileId, includeUnprocessed, bulkLocal).pipe( + return this.#recategorize(body, dossierId, fileId, bulkLocal).pipe( this.#showToast('recategorize-annotation', false, successMessageParameters), ); } @@ -117,10 +114,9 @@ export class ManualRedactionService extends GenericService { fileId: string, removeFromDictionary = false, isHint = false, - includeUnprocessed = false, bulkLocal = false, ) { - return this.#remove(body, dossierId, fileId, includeUnprocessed, bulkLocal).pipe( + return this.#remove(body, dossierId, fileId, bulkLocal).pipe( this.#showToast(!isHint ? 'remove' : 'remove-hint', removeFromDictionary), ); } @@ -154,36 +150,23 @@ export class ManualRedactionService extends GenericService { return this._post(body, `${this.#bulkRedaction}/force/${dossierId}/${fileId}`).pipe(this.#log('Force redaction', body)); } - resize(body: List, dossierId: string, fileId: string, includeUnprocessed = false) { - return this._post(body, `${this.#bulkRedaction}/resize/${dossierId}/${fileId}?includeUnprocessed=${includeUnprocessed}`).pipe( - this.#log('Resize', body), - ); + resize(body: List, dossierId: string, fileId: string) { + return this._post(body, `${this.#bulkRedaction}/resize/${dossierId}/${fileId}`).pipe(this.#log('Resize', body)); } #recategorize( body: List | IBulkRecategorizationRequest, dossierId: string, fileId: string, - includeUnprocessed = false, bulkLocal = false, ) { const bulkPath = bulkLocal ? this.#bulkLocal : this.#bulkRedaction; - return this._post(body, `${bulkPath}/recategorize/${dossierId}/${fileId}?includeUnprocessed=${includeUnprocessed}`).pipe( - this.#log('Recategorize', body), - ); + return this._post(body, `${bulkPath}/recategorize/${dossierId}/${fileId}`).pipe(this.#log('Recategorize', body)); } - #remove( - body: List | IBulkLocalRemoveRequest, - dossierId: string, - fileId: string, - includeUnprocessed = false, - bulkLocal = false, - ) { + #remove(body: List | IBulkLocalRemoveRequest, dossierId: string, fileId: string, bulkLocal = false) { const bulkPath = bulkLocal ? this.#bulkLocal : this.#bulkRedaction; - return this._post(body, `${bulkPath}/remove/${dossierId}/${fileId}?includeUnprocessed=${includeUnprocessed}`).pipe( - this.#log('Remove', body), - ); + return this._post(body, `${bulkPath}/remove/${dossierId}/${fileId}`).pipe(this.#log('Remove', body)); } #log(action: string, body: unknown) {