From 76d329b888eae6ab831618ced28c80f18cfe2172 Mon Sep 17 00:00:00 2001 From: Valentin Mihai Date: Tue, 8 Oct 2024 00:51:21 +0300 Subject: [PATCH] RED-7340 - Rectangle redactions: Use bulk-local redactions + New dialog design --- .../edit-redaction-dialog.component.html | 1 + .../edit-redaction-dialog.component.ts | 34 ++- .../rectangle-annotation-dialog.component.ts | 59 +++-- .../remove-redaction-dialog.component.html | 7 +- .../remove-redaction-dialog.component.ts | 39 ++- .../services/annotation-actions.service.ts | 28 +- .../file-preview/utils/dialog-options.ts | 24 +- .../file-preview/utils/dialog-types.ts | 19 +- .../enhance-manual-redaction-request.utils.ts | 38 ++- .../rectangle-redact-translations.ts | 28 ++ apps/red-ui/src/assets/i18n/redact/de.json | 250 +++++++++++------- apps/red-ui/src/assets/i18n/redact/en.json | 48 +++- apps/red-ui/src/assets/i18n/scm/de.json | 246 ++++++++++------- apps/red-ui/src/assets/i18n/scm/en.json | 48 +++- .../redaction-log/recategorization.request.ts | 7 +- 15 files changed, 598 insertions(+), 278 deletions(-) diff --git a/apps/red-ui/src/app/modules/file-preview/dialogs/edit-redaction-dialog/edit-redaction-dialog.component.html b/apps/red-ui/src/app/modules/file-preview/dialogs/edit-redaction-dialog/edit-redaction-dialog.component.html index a1f9c2ce9..55bfda05b 100644 --- a/apps/red-ui/src/app/modules/file-preview/dialogs/edit-redaction-dialog/edit-redaction-dialog.component.html +++ b/apps/red-ui/src/app/modules/file-preview/dialogs/edit-redaction-dialog/edit-redaction-dialog.component.html @@ -18,6 +18,7 @@ diff --git a/apps/red-ui/src/app/modules/file-preview/dialogs/edit-redaction-dialog/edit-redaction-dialog.component.ts b/apps/red-ui/src/app/modules/file-preview/dialogs/edit-redaction-dialog/edit-redaction-dialog.component.ts index 8f3a13cb2..1a4e8384e 100644 --- a/apps/red-ui/src/app/modules/file-preview/dialogs/edit-redaction-dialog/edit-redaction-dialog.component.ts +++ b/apps/red-ui/src/app/modules/file-preview/dialogs/edit-redaction-dialog/edit-redaction-dialog.component.ts @@ -25,10 +25,19 @@ import { SelectedAnnotationsTableComponent, ValueColumn, } from '../../components/selected-annotations-table/selected-annotations-table.component'; -import { getEditRedactionOptions } from '../../utils/dialog-options'; -import { EditRedactionData, EditRedactionOption, EditRedactResult, LegalBasisOption } from '../../utils/dialog-types'; +import { getEditRedactionOptions, getRectangleRedactOptions } from '../../utils/dialog-options'; +import { + EditRedactionData, + EditRedactionOption, + EditRedactResult, + LegalBasisOption, + RectangleRedactOption, + RectangleRedactOptions, +} from '../../utils/dialog-types'; import { DetailsRadioComponent } from '@common-ui/inputs/details-radio/details-radio.component'; import { DetailsRadioOption } from '@common-ui/inputs/details-radio/details-radio-option'; +import { validatePageRange } from '../../utils/form-validators'; +import { parseRectanglePosition, parseSelectedPageNumbers } from '../../utils/enhance-manual-redaction-request.utils'; interface TypeSelectOptions { type: string; @@ -79,7 +88,7 @@ export class EditRedactionDialogComponent { label: redaction.value, bold: true }, { label: redaction.typeLabel }, ]); - options = getEditRedactionOptions(); + options = this.allRectangles ? getRectangleRedactOptions('edit') : getEditRedactionOptions(); legalOptions: LegalBasisOption[] = []; dictionaries: Dictionary[] = []; typeSelectOptions: TypeSelectOptions[] = []; @@ -96,6 +105,14 @@ export class EditRedactionDialogComponent super(); } + extraOptionChanged(option: DetailsRadioOption): void { + if (option.value === RectangleRedactOptions.MULTIPLE_PAGES) { + setTimeout(() => { + this.form.get('option')?.updateValueAndValidity(); + }, 0); + } + } + get displayedDictionaryLabel() { const selectedDictionaryType = this.form.controls.type.value; if (selectedDictionaryType) { @@ -188,6 +205,13 @@ export class EditRedactionDialogComponent const value = this.form.value; const initialReason: LegalBasisOption = this.initialFormValue.reason; const initialLegalBasis = initialReason?.legalBasis ?? ''; + const pageNumbers = parseSelectedPageNumbers( + this.form.get('option').value.additionalInput?.value, + this.data.file, + this.data.annotations[0], + ); + const position = parseRectanglePosition(this.annotations[0]); + this.close({ legalBasis: value.reason?.legalBasis ?? (this.isImage ? initialLegalBasis : ''), section: value.section, @@ -195,6 +219,8 @@ export class EditRedactionDialogComponent type: value.type, value: this.allRectangles ? value.value : null, option: value.option.value, + position, + pageNumbers, }); } @@ -229,7 +255,7 @@ export class EditRedactionDialogComponent disabled: this.isImported, }), section: new FormControl({ value: sameSection ? this.annotations[0].section : null, disabled: this.isImported }), - option: new FormControl>(this.options[0]), + option: new FormControl>(this.options[0], validatePageRange()), value: new FormControl(this.allRectangles ? this.annotations[0].value : null), }); } diff --git a/apps/red-ui/src/app/modules/file-preview/dialogs/rectangle-annotation-dialog/rectangle-annotation-dialog.component.ts b/apps/red-ui/src/app/modules/file-preview/dialogs/rectangle-annotation-dialog/rectangle-annotation-dialog.component.ts index 4e565ff06..7bbe89cdb 100644 --- a/apps/red-ui/src/app/modules/file-preview/dialogs/rectangle-annotation-dialog/rectangle-annotation-dialog.component.ts +++ b/apps/red-ui/src/app/modules/file-preview/dialogs/rectangle-annotation-dialog/rectangle-annotation-dialog.component.ts @@ -9,8 +9,7 @@ import { IqserDialogComponent, Toaster, } from '@iqser/common-ui'; -import { ManualRedactionEntryWrapper } from '@models/file/manual-redaction-entry.wrapper'; -import { Dossier, File, IAddRedactionRequest, IManualRedactionEntry, SuperTypes } from '@red/domain'; +import { Dossier, IAddRedactionRequest, SuperTypes } from '@red/domain'; import { ActiveDossiersService } from '@services/dossiers/active-dossiers.service'; import { JustificationsService } from '@services/entity-services/justifications.service'; import { Roles } from '@users/roles'; @@ -23,21 +22,17 @@ import { MatOption, MatSelect, MatSelectTrigger } from '@angular/material/select import { MatTooltip } from '@angular/material/tooltip'; import { MatCheckbox } from '@angular/material/checkbox'; import { DetailsRadioOption } from '@common-ui/inputs/details-radio/details-radio-option'; -import { LegalBasisOption, RectangleRedactOption, RectangleRedactOptions } from '../../utils/dialog-types'; +import { + LegalBasisOption, + RectangleDialogData, + RectangleDialogResult, + RectangleRedactOption, + RectangleRedactOptions, +} from '../../utils/dialog-types'; import { getRectangleRedactOptions } from '../../utils/dialog-options'; import { DetailsRadioComponent } from '@common-ui/inputs/details-radio/details-radio.component'; import { SystemDefaults } from '../../../account/utils/dialog-defaults'; import { validatePageRange } from '../../utils/form-validators'; -import { getMultiplePagesRectangle } from '../../utils/enhance-manual-redaction-request.utils'; - -interface RectangleDialogData { - dossierId: string; - manualRedactionEntryWrapper: ManualRedactionEntryWrapper; - file: File; -} -export interface RectangleDialogResult { - annotation: IManualRedactionEntry; -} export const NON_READABLE_CONTENT = 'non-readable content'; @@ -116,7 +111,7 @@ export class RectangleAnnotationDialog try { const annotation = ( this.form.get('option').value.value === RectangleRedactOptions.MULTIPLE_PAGES - ? getMultiplePagesRectangle(this.#multiplePagesRectangleData) + ? this.#multiplePagesRectangle : this.data.manualRedactionEntryWrapper ).manualRedactionEntry; super.close({ @@ -127,14 +122,6 @@ export class RectangleAnnotationDialog } } - get #multiplePagesRectangleData() { - return { - manualRedactionEntryWrapper: this.data.manualRedactionEntryWrapper, - pages: this.form.get('option').value.additionalInput.value, - file: this.data.file, - }; - } - #getForm() { return this._formBuilder.group({ selectedText: this.data?.manualRedactionEntryWrapper?.manualRedactionEntry?.value, @@ -165,6 +152,34 @@ export class RectangleAnnotationDialog return this.options.find(o => o.value === option); } + get #multiplePagesRectangle() { + const value: string = this.form.get('option').value.additionalInput.value.replace(/[^0-9-,]/g, ''); + const entry = { ...this.data.manualRedactionEntryWrapper.manualRedactionEntry, pageNumbers: [] }; + const wrapper = { + ...this.data.manualRedactionEntryWrapper, + manualRedactionEntry: entry, + }; + + value.split(',').forEach(range => { + const splitted = range.split('-'); + const startPage = parseInt(splitted[0], 10); + const endPage = splitted.length > 1 ? parseInt(splitted[1], 10) : startPage; + if (!startPage || !endPage || startPage > this.data.file.numberOfPages || endPage > this.data.file.numberOfPages) { + throw new Error(); + } + + for (let page = startPage; page <= endPage; page++) { + if (page === wrapper.manualRedactionEntry.positions[0].page) { + continue; + } + + wrapper.manualRedactionEntry.pageNumbers.push(page); + } + }); + + return wrapper; + } + #selectReason() { if (this.legalOptions.length === 1) { this.form.get('reason').setValue(this.legalOptions[0]); diff --git a/apps/red-ui/src/app/modules/file-preview/dialogs/remove-redaction-dialog/remove-redaction-dialog.component.html b/apps/red-ui/src/app/modules/file-preview/dialogs/remove-redaction-dialog/remove-redaction-dialog.component.html index 67b718ed6..af6631396 100644 --- a/apps/red-ui/src/app/modules/file-preview/dialogs/remove-redaction-dialog/remove-redaction-dialog.component.html +++ b/apps/red-ui/src/app/modules/file-preview/dialogs/remove-redaction-dialog/remove-redaction-dialog.component.html @@ -14,7 +14,11 @@ > - +
@@ -31,6 +35,7 @@
acc && a.AREA, true); readonly #applyToAllDossiers = this.systemDefaultByType[this.annotationsType].extra; readonly isSystemDefault = this.optionByType[this.annotationsType].main === SystemDefaultOption.SYSTEM_DEFAULT; readonly isExtraOptionSystemDefault = this.optionByType[this.annotationsType].extra === 'undefined'; @@ -96,15 +102,17 @@ export class RemoveRedactionDialogComponent extends IqserDialogComponent< ? this.systemDefaultByType[this.annotationsType].main : this.optionByType[this.annotationsType].main; readonly extraOptionPreference = stringToBoolean(this.optionByType[this.annotationsType].extra); - readonly options: DetailsRadioOption[] = getRemoveRedactionOptions( - this.data, - this.isSystemDefault || this.isExtraOptionSystemDefault ? this.#applyToAllDossiers : this.extraOptionPreference, - ); + readonly options: DetailsRadioOption[] = this.#allRectangles + ? getRectangleRedactOptions('remove') + : getRemoveRedactionOptions( + this.data, + this.isSystemDefault || this.isExtraOptionSystemDefault ? this.#applyToAllDossiers : this.extraOptionPreference, + ); readonly skipped = this.data.redactions.some(annotation => annotation.isSkipped); readonly redactedTexts = this.data.redactions.map(annotation => annotation.value); form: UntypedFormGroup = this._formBuilder.group({ comment: [null], - option: [this.defaultOption], + option: [this.defaultOption, validatePageRange()], }); readonly selectedOption = toSignal(this.form.get('option').valueChanges.pipe(map(value => value.value))); @@ -160,14 +168,31 @@ export class RemoveRedactionDialogComponent extends IqserDialogComponent< return this.options.length * 75 + 230; } + extraOptionChanged(option: DetailsRadioOption): void { + if (option.value === RectangleRedactOptions.MULTIPLE_PAGES) { + setTimeout(() => { + this.form.get('option')?.updateValueAndValidity(); + }, 0); + } + } + save(): void { + const pageNumbers = parseSelectedPageNumbers( + this.form.get('option').value.additionalInput?.value, + this.data.file, + this.data.redactions[0], + ); + const position = parseRectanglePosition(this.data.redactions[0]); + this.close({ ...this.form.getRawValue(), bulkLocal: this.form.controls.option.value.value === ResizeOptions.IN_DOCUMENT, + pageNumbers, + position, }); } - #getOption(option: RemoveRedactionOption): DetailsRadioOption { + #getOption(option: RemoveRedactionOption): DetailsRadioOption { return this.options.find(o => o.value === option); } } 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 598fcf674..ecf5b5300 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 @@ -35,7 +35,9 @@ import { EditRedactionData, EditRedactResult, ForceAnnotationOptions, + RectangleRedactOptions, RedactOrHintOptions, + RedactRecommendationData, RemoveRedactionData, RemoveRedactionOptions, RemoveRedactionPermissions, @@ -49,6 +51,7 @@ import { FilePreviewStateService } from './file-preview-state.service'; import { ManualRedactionService } from './manual-redaction.service'; import { SkippedService } from './skipped.service'; import { NON_READABLE_CONTENT } from '../dialogs/rectangle-annotation-dialog/rectangle-annotation-dialog.component'; +import { result } from 'lodash-es'; @Injectable() export class AnnotationActionsService { @@ -110,11 +113,12 @@ export class AnnotationActionsService { } async editRedaction(annotations: AnnotationWrapper[]) { - const { dossierId, fileId } = this._state; + const { dossierId, file } = this._state; const includeUnprocessed = annotations.every(annotation => this.#includeUnprocessed(annotation, true)); const data = { annotations, dossierId, + file: file(), }; const result = await this.#getEditRedactionDialog(data).result(); @@ -124,7 +128,7 @@ export class AnnotationActionsService { let recategorizeBody: List | IBulkRecategorizationRequest; - if (result.option === RedactOrHintOptions.ONLY_HERE) { + if (result.option === RedactOrHintOptions.ONLY_HERE || result.option === RectangleRedactOptions.ONLY_THIS_PAGE) { recategorizeBody = annotations.map(annotation => { const body: IRecategorizationRequest = { annotationId: annotation.id, @@ -151,7 +155,9 @@ export class AnnotationActionsService { section: result.section, originTypes, originLegalBases, - rectangle: false, + rectangle: annotations[0].AREA, + pageNumbers: result.pageNumbers, + position: result.position, }; } @@ -160,10 +166,10 @@ export class AnnotationActionsService { .recategorizeRedactions( recategorizeBody, dossierId, - fileId, + file().id, this.#getChangedFields(annotations, result), includeUnprocessed, - result.option === RedactOrHintOptions.IN_DOCUMENT, + result.option === RedactOrHintOptions.IN_DOCUMENT || !!result.pageNumbers.length, ) .pipe(log()), ); @@ -177,9 +183,11 @@ export class AnnotationActionsService { }; const dossierTemplate = this._dossierTemplatesService.find(this._state.dossierTemplateId); const isApprover = this._permissionsService.isApprover(this._state.dossier()); + const { file } = this._state; const data = { redactions, + file: file(), dossier: this._state.dossier(), falsePositiveContext: redactions.map(r => this.#getFalsePositiveText(r)), permissions: removePermissions, @@ -217,7 +225,7 @@ export class AnnotationActionsService { async convertRecommendationToAnnotation(recommendations: AnnotationWrapper[]) { const { dossierId, fileId } = this._state; - const data = this.#getRedactRecommendationDialogData(recommendations); + const data = this.#getRedactRecommendationDialogData(recommendations) as RedactRecommendationData; const dialog = this._iqserDialog.openDefault(RedactRecommendationDialogComponent, { data }); const result = await dialog.result(); if (!result) { @@ -508,7 +516,7 @@ export class AnnotationActionsService { removeFromDictionary, isHint, includeUnprocessed, - dialogResult.bulkLocal, + dialogResult.bulkLocal || !!dialogResult.pageNumbers.length, ), ).then(); } @@ -584,15 +592,15 @@ export class AnnotationActionsService { redactions: AnnotationWrapper[], dialogResult: RemoveRedactionResult, ): List | IBulkLocalRemoveRequest { - if (dialogResult.bulkLocal) { + if (dialogResult.bulkLocal || !!dialogResult.pageNumbers.length) { const redaction = redactions[0]; if (redaction.value === NON_READABLE_CONTENT) { return { value: redaction.value, rectangle: true, - position: redaction.entry.positions[0], originTypes: [redaction.entry.type], - pageNumbers: [redaction.pageNumber], + pageNumbers: dialogResult.pageNumbers, + position: dialogResult.position, }; } diff --git a/apps/red-ui/src/app/modules/file-preview/utils/dialog-options.ts b/apps/red-ui/src/app/modules/file-preview/utils/dialog-options.ts index 19f6b7b79..5b4288ccd 100644 --- a/apps/red-ui/src/app/modules/file-preview/utils/dialog-options.ts +++ b/apps/red-ui/src/app/modules/file-preview/utils/dialog-options.ts @@ -19,7 +19,11 @@ import { ResizeOptions, ResizeRedactionOption, } from './dialog-types'; -import { rectangleRedactTranslations } from '@translations/rectangle-redact-translations'; +import { + editRectangleTranslations, + rectangleRedactTranslations, + removeRectangleTranslations, +} from '@translations/rectangle-redact-translations'; const PIN_ICON = 'red:push-pin'; const DOCUMENT_ICON = 'iqser:document'; @@ -94,23 +98,25 @@ export const getRedactOrHintOptions = ( return options; }; -export const getRectangleRedactOptions = (): DetailsRadioOption[] => { +export const getRectangleRedactOptions = (action: 'add' | 'edit' | 'remove' = 'add'): DetailsRadioOption[] => { + const translations = + action === 'add' ? rectangleRedactTranslations : action === 'edit' ? editRectangleTranslations : removeRectangleTranslations; return [ { - label: rectangleRedactTranslations.onlyThisPage.label, - description: rectangleRedactTranslations.onlyThisPage.description, + label: translations.onlyThisPage.label, + description: translations.onlyThisPage.description, icon: PIN_ICON, value: RectangleRedactOptions.ONLY_THIS_PAGE, }, { - label: rectangleRedactTranslations.multiplePages.label, - description: rectangleRedactTranslations.multiplePages.description, + label: translations.multiplePages.label, + description: translations.multiplePages.description, icon: DOCUMENT_ICON, value: RectangleRedactOptions.MULTIPLE_PAGES, additionalInput: { - label: rectangleRedactTranslations.multiplePages.extraOptionLabel, - description: rectangleRedactTranslations.multiplePages.extraOptionDescription, - placeholder: rectangleRedactTranslations.multiplePages.extraOptionPlaceholder, + label: translations.multiplePages.extraOptionLabel, + description: translations.multiplePages.extraOptionDescription, + placeholder: translations.multiplePages.extraOptionPlaceholder, value: '', }, }, diff --git a/apps/red-ui/src/app/modules/file-preview/utils/dialog-types.ts b/apps/red-ui/src/app/modules/file-preview/utils/dialog-types.ts index 2b8a44dc4..00131bcda 100644 --- a/apps/red-ui/src/app/modules/file-preview/utils/dialog-types.ts +++ b/apps/red-ui/src/app/modules/file-preview/utils/dialog-types.ts @@ -1,7 +1,7 @@ import { DetailsRadioOption } from '@common-ui/inputs/details-radio/details-radio-option'; import { AnnotationWrapper } from '@models/file/annotation.wrapper'; import { ManualRedactionEntryWrapper } from '@models/file/manual-redaction-entry.wrapper'; -import { Dictionary, Dossier, File, IAddRedactionRequest, IManualRedactionEntry } from '@red/domain'; +import { Dictionary, Dossier, File, IAddRedactionRequest, IEntityLogEntryPosition, IManualRedactionEntry } from '@red/domain'; export const EditRedactionOptions = { ONLY_HERE: 'ONLY_HERE', @@ -65,6 +65,7 @@ export interface RedactTextData { export interface EditRedactionData { annotations: AnnotationWrapper[]; dossierId: string; + file: File; isApprover?: boolean; } @@ -93,7 +94,9 @@ export interface EditRedactResult { comment: string; type: string; value: string; - option: EditRedactionOption; + option: EditRedactionOption | RectangleRedactOption; + position: IEntityLogEntryPosition; + pageNumbers?: number[]; } export type AddHintResult = RedactTextResult; @@ -133,6 +136,7 @@ export interface RemoveRedactionPermissions { export interface RemoveRedactionData { redactions: AnnotationWrapper[]; dossier: Dossier; + file?: File; falsePositiveContext: string[]; permissions: RemoveRedactionPermissions; applyToAllDossiers: boolean; @@ -146,6 +150,17 @@ export interface RemoveRedactionResult { option: DetailsRadioOption; applyToAllDossiers?: boolean; bulkLocal?: boolean; + pageNumbers?: number[]; + position: IEntityLogEntryPosition; } export type RemoveAnnotationResult = RemoveRedactionResult; + +export interface RectangleDialogData { + dossierId: string; + manualRedactionEntryWrapper: ManualRedactionEntryWrapper; + file: File; +} +export interface RectangleDialogResult { + annotation: IManualRedactionEntry; +} diff --git a/apps/red-ui/src/app/modules/file-preview/utils/enhance-manual-redaction-request.utils.ts b/apps/red-ui/src/app/modules/file-preview/utils/enhance-manual-redaction-request.utils.ts index 701028276..635549d37 100644 --- a/apps/red-ui/src/app/modules/file-preview/utils/enhance-manual-redaction-request.utils.ts +++ b/apps/red-ui/src/app/modules/file-preview/utils/enhance-manual-redaction-request.utils.ts @@ -1,6 +1,7 @@ -import { Dictionary, File, IAddRedactionRequest, SuperType } from '@red/domain'; +import { Dictionary, File, IAddRedactionRequest, IEntityLogEntryPosition, SuperType } from '@red/domain'; import { ManualRedactionEntryWrapper } from '@models/file/manual-redaction-entry.wrapper'; import { LegalBasisOption } from './dialog-types'; +import { AnnotationWrapper } from '@models/file/annotation.wrapper'; export interface EnhanceRequestData { readonly type: SuperType | null; @@ -46,30 +47,41 @@ export const enhanceManualRedactionRequest = (addRedactionRequest: IAddRedaction addRedactionRequest.addToAllDossiers = data.isApprover && data.dictionaryRequest && data.applyToAllDossiers; }; -export const getMultiplePagesRectangle = (data: MultiplePagesRectangleData) => { - const value: string = data.pages.replace(/[^0-9-,]/g, ''); - const entry = { ...data.manualRedactionEntryWrapper.manualRedactionEntry, pageNumbers: [] }; - const wrapper = { - ...data.manualRedactionEntryWrapper, - manualRedactionEntry: entry, - }; +export const parseSelectedPageNumbers = (inputValue: string, file: File, annotation: AnnotationWrapper) => { + if (!inputValue) { + return []; + } - value.split(',').forEach(range => { + inputValue = inputValue.replace(/[^0-9-,]/g, ''); + const pageNumbers = []; + + inputValue.split(',').forEach(range => { const splitted = range.split('-'); const startPage = parseInt(splitted[0], 10); const endPage = splitted.length > 1 ? parseInt(splitted[1], 10) : startPage; - if (!startPage || !endPage || startPage > data.file.numberOfPages || endPage > data.file.numberOfPages) { + if (!startPage || !endPage || startPage > file.numberOfPages || endPage > file.numberOfPages) { throw new Error(); } for (let page = startPage; page <= endPage; page++) { - if (page === wrapper.manualRedactionEntry.positions[0].page) { + if (page === annotation.positions[0].page) { continue; } - wrapper.manualRedactionEntry.pageNumbers.push(page); + pageNumbers.push(page); } }); - return wrapper; + return pageNumbers; +}; + +export const parseRectanglePosition = (annotation: AnnotationWrapper) => { + if (annotation.AREA) { + const position = annotation.positions[0]; + return { + rectangle: [position.topLeft.x, position.topLeft.y, position.width, position.height], + pageNumber: position.page, + } as IEntityLogEntryPosition; + } + return null; }; diff --git a/apps/red-ui/src/app/translations/rectangle-redact-translations.ts b/apps/red-ui/src/app/translations/rectangle-redact-translations.ts index 2feb6c67b..65359c754 100644 --- a/apps/red-ui/src/app/translations/rectangle-redact-translations.ts +++ b/apps/red-ui/src/app/translations/rectangle-redact-translations.ts @@ -14,3 +14,31 @@ export const rectangleRedactTranslations: Record<'onlyThisPage' | 'multiplePages extraOptionPlaceholder: _('manual-annotation.dialog.content.options.multiple-pages.extraOptionPlaceholder'), }, } as const; + +export const editRectangleTranslations: Record<'onlyThisPage' | 'multiplePages', DialogOption> = { + onlyThisPage: { + label: _('edit-rectangle.dialog.content.options.only-this-page.label'), + description: _('edit-rectangle.dialog.content.options.only-this-page.description'), + }, + multiplePages: { + label: _('edit-rectangle.dialog.content.options.multiple-pages.label'), + description: _('edit-rectangle.dialog.content.options.multiple-pages.description'), + extraOptionLabel: _('edit-rectangle.dialog.content.options.multiple-pages.extraOptionLabel'), + extraOptionDescription: _('edit-rectangle.dialog.content.options.multiple-pages.extraOptionDescription'), + extraOptionPlaceholder: _('edit-rectangle.dialog.content.options.multiple-pages.extraOptionPlaceholder'), + }, +} as const; + +export const removeRectangleTranslations: Record<'onlyThisPage' | 'multiplePages', DialogOption> = { + onlyThisPage: { + label: _('remove-rectangle.dialog.content.options.only-this-page.label'), + description: _('remove-rectangle.dialog.content.options.only-this-page.description'), + }, + multiplePages: { + label: _('remove-rectangle.dialog.content.options.multiple-pages.label'), + description: _('remove-rectangle.dialog.content.options.multiple-pages.description'), + extraOptionLabel: _('remove-rectangle.dialog.content.options.multiple-pages.extraOptionLabel'), + extraOptionDescription: _('remove-rectangle.dialog.content.options.multiple-pages.extraOptionDescription'), + extraOptionPlaceholder: _('remove-rectangle.dialog.content.options.multiple-pages.extraOptionPlaceholder'), + }, +} as const; diff --git a/apps/red-ui/src/assets/i18n/redact/de.json b/apps/red-ui/src/assets/i18n/redact/de.json index 3e729eb92..430e48213 100644 --- a/apps/red-ui/src/assets/i18n/redact/de.json +++ b/apps/red-ui/src/assets/i18n/redact/de.json @@ -243,7 +243,8 @@ } }, "type": "Typ", - "type-placeholder": "Typ auswählen..." + "type-placeholder": "Typ auswählen...", + "value": "" }, "title": "Hinweis hinzufügen" } @@ -275,9 +276,6 @@ "watermarks": "Wasserzeichen" }, "analysis-disabled": "", - "annotation": { - "pending": "(Analyse steht aus)" - }, "annotation-actions": { "accept-recommendation": { "label": "Empfehlung annehmen" @@ -333,14 +331,14 @@ "error": "Rekategorisierung des Bilds fehlgeschlagen: {error}", "success": "Bild wurde einer neuen Kategorie zugeordnet." }, - "remove": { - "error": "Entfernen der Schwärzung fehlgeschlagen: {error}", - "success": "Schwärzung wurde entfernt" - }, "remove-hint": { "error": "Entfernen des Hinweises fehlgeschlagen: {error}", "success": "Hinweis wurde entfernt" }, + "remove": { + "error": "Entfernen der Schwärzung fehlgeschlagen: {error}", + "success": "Schwärzung wurde entfernt" + }, "undo": { "error": "Die Aktion konnte nicht rückgängig gemacht werden. Fehler: {error}", "success": "Rücksetzung erfolgreich" @@ -353,15 +351,15 @@ "remove-highlights": { "label": "Ausgewählte Markierungen entfernen" }, - "resize": { - "label": "Größe ändern" - }, "resize-accept": { "label": "Neue Größe speichern" }, "resize-cancel": { "label": "Größenänderung abbrechen" }, + "resize": { + "label": "Größe ändern" + }, "see-references": { "label": "Referenzen anzeigen" }, @@ -378,6 +376,7 @@ "removed-manual": "Schwärzung/Hinweis wurde entfernt", "resized": "Schwärzungsbereich wurde geändert" }, + "annotation-content": "", "annotation-engines": { "dictionary": "Basiert auf Wörterbuch", "dossier-dictionary": "Basiert auf Dossier-Wörterbuch", @@ -395,6 +394,9 @@ "skipped": "Ignorierte Schwärzung", "text-highlight": "Markierung" }, + "annotation": { + "pending": "(Analyse steht aus)" + }, "annotations": "Annotationen", "archived-dossiers-listing": { "no-data": { @@ -1018,13 +1020,13 @@ "recent": "Neu ({hours} h)", "unassigned": "Keinem Bearbeiter zugewiesen" }, - "reanalyse": { - "action": "Datei analysieren" - }, "reanalyse-dossier": { "error": "Einplanung der Dateien für die Reanalyse fehlgeschlagen. Bitte versuchen Sie es noch einmal.", "success": "Dateien für Reanalyse vorgesehen." }, + "reanalyse": { + "action": "Datei analysieren" + }, "report-download": "", "start-auto-analysis": "Auto-Analyse aktivieren", "stop-auto-analysis": "Auto-Analyse anhalten", @@ -1094,14 +1096,6 @@ "total-documents": "Dokumente", "total-people": "{count} {count, plural, one{Benutzer} other {Benutzer}}" }, - "dossier-templates": { - "label": "Dossier-Vorlagen", - "status": { - "active": "Aktiv", - "inactive": "Inaktiv", - "incomplete": "Unvollständig" - } - }, "dossier-templates-listing": { "action": { "clone": "Vorlage klonen", @@ -1136,6 +1130,14 @@ "title": "{length} {length, plural, one{Dossier-Vorlage} other{Dossier-Vorlagen}}" } }, + "dossier-templates": { + "label": "Dossier-Vorlagen", + "status": { + "active": "Aktiv", + "inactive": "Inaktiv", + "incomplete": "Unvollständig" + } + }, "dossier-watermark-selector": { "heading": "Wasserzeichen auf Dokumenten", "no-watermark": "Kein Wasserzeichen in der Dossier-Vorlage verfügbar:
Bitten Sie Ihren Admin, eines zu konfigurieren.", @@ -1233,10 +1235,8 @@ "save": "Speichern", "title": "{label} bearbeiten" }, - "entries": "{length} {length, plural, one{Eintrag} other{Einträge}}", - "false-positive-entries": "{length} {length, plural, one{Falsch-Positiver} other{Falsch-Positive}}", + "entries-count": "", "false-positives": "Falsch-Positive", - "false-recommendation-entries": "{length} {length, plural, one{falsche Empfehlung} other{falsche Empfehlungen}}", "false-recommendations": "Falsche Empfehlungen", "to-redact": "Schwärzungen" }, @@ -1273,6 +1273,25 @@ }, "side-nav-title": "Konfiguration" }, + "edit-rectangle": { + "dialog": { + "content": { + "options": { + "multiple-pages": { + "description": "", + "extraOptionDescription": "", + "extraOptionLabel": "", + "extraOptionPlaceholder": "", + "label": "" + }, + "only-this-page": { + "description": "", + "label": "" + } + } + } + } + }, "edit-redaction": { "dialog": { "actions": { @@ -1282,14 +1301,11 @@ "content": { "comment": "Kommentar", "comment-placeholder": "Bemerkungen oder Notizen hinzufügen...", - "custom-rectangle": "Bereichsschwärzung", - "imported": "Importierte Schwärzung", "legal-basis": "Rechtsgrundlage", "options": { - "in-dossier": { - "description": "Schwärzung in jedem Dokument in {dossierName} bearbeiten.", - "extraOptionLabel": "In alle aktiven und zukünftigen Dossiers übernehmen", - "label": "Typ in Dossier ändern" + "in-document": { + "description": "", + "label": "" }, "only-here": { "description": "Bearbeiten Sie die Schwärzung nur an dieser Stelle im Dokument.", @@ -1332,15 +1348,6 @@ "title": "{length} {length, plural, one{Wörterbuch} other{Wörterbücher}}" } }, - "entity": { - "info": { - "actions": { - "revert": "Zurücksetzen", - "save": "Änderungen speichern" - }, - "heading": "Entität bearbeiten" - } - }, "entity-rules-screen": { "error": { "generic": "Fehler: Aktualisierung der Entitätsregeln fehlgeschlagen." @@ -1354,19 +1361,28 @@ "title": "Entitätsregeln-Editor", "warnings-found": "{warnings, plural, one{A warning} other{{warnings} warnings}} in Regeln gefunden" }, + "entity": { + "info": { + "actions": { + "revert": "Zurücksetzen", + "save": "Änderungen speichern" + }, + "heading": "Entität bearbeiten" + } + }, "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": { @@ -1384,12 +1400,6 @@ }, "exact-date": "{day}. {month} {year} um {hour}:{minute} Uhr", "file": "Datei", - "file-attribute": { - "update": { - "error": "Aktualisierung des Werts für das Datei-Attribut fehlgeschlagen. Bitte versuchen Sie es noch einmal.", - "success": "Der Wert für das Dateiattribut wurde erfolgreich aktualisiert." - } - }, "file-attribute-encoding-types": { "ascii": "ASCII", "iso": "ISO-8859-1", @@ -1400,6 +1410,12 @@ "number": "Nummer", "text": "Freier Text" }, + "file-attribute": { + "update": { + "error": "Aktualisierung des Werts für das Datei-Attribut fehlgeschlagen. Bitte versuchen Sie es noch einmal.", + "success": "Der Wert für das Dateiattribut wurde erfolgreich aktualisiert." + } + }, "file-attributes-configurations": { "cancel": "Abbrechen", "form": { @@ -1617,15 +1633,6 @@ "csv": "Die Datei-Attribute wurden erfolgreich aus der hochgeladenen CSV-Datei importiert." } }, - "filter": { - "analysis": "Analyse erforderlich", - "comment": "Kommentare", - "hint": "Nur Hinweise", - "image": "Bilder", - "none": "Keine Annotationen", - "redaction": "Schwärzung", - "updated": "Aktualisiert" - }, "filter-menu": { "filter-options": "Filteroptionen", "filter-types": "Filter", @@ -1635,6 +1642,15 @@ "unseen-pages": "Nur Annotationen auf ungesehenen Seiten", "with-comments": "Nur Annotationen mit Kommentaren" }, + "filter": { + "analysis": "Analyse erforderlich", + "comment": "Kommentare", + "hint": "Nur Hinweise", + "image": "Bilder", + "none": "Keine Annotationen", + "redaction": "Schwärzung", + "updated": "Aktualisiert" + }, "filters": { "assigned-people": "Bearbeiter", "documents-status": "Dokumentenstatus", @@ -1868,13 +1884,8 @@ "save": "Speichern" }, "content": { - "apply-on-multiple-pages": "Auf mehreren Seiten anwenden", - "apply-on-multiple-pages-hint": "Minus (-) für Bereich und Komma (,) für Aufzählung.", - "apply-on-multiple-pages-placeholder": "z. B. 1-20,22,32", "classification": "Wert / Klassifizierung", "comment": "Kommentar", - "dictionary": "Wörterbuch", - "edit-selected-text": "Ausgewählten Text bearbeiten", "legalBasis": "Rechtsgrundlage", "options": { "multiple-pages": { @@ -1891,10 +1902,7 @@ }, "reason": "Grund", "reason-placeholder": "Grund auswählen...", - "rectangle": "Bereichsschwärzung", - "section": "Absatz / Textstelle", - "text": "Ausgewählter Text:", - "type": "Entität" + "section": "Absatz / Textstelle" }, "error": "Fehler: Ungültige Seitenauswahl", "header": { @@ -1926,13 +1934,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": "Benachrichtigungen", - "deleted-dossier": "Gelöschtes Dossier", - "label": "Benachrichtigungen", - "mark-all-as-read": "Alle als gelesen markieren", - "mark-as": "Als {type, select, read{gelesen} unread{ungelesen} other{}} markieren" - }, "notifications-screen": { "category": { "email-notifications": "E-Mail-Benachrichtigungen", @@ -1946,6 +1947,7 @@ "dossier": "Benachrichtigungen zu Dossiers", "other": "Andere Benachrichtigungen" }, + "options-title": "Wählen Sie aus, bei welchen Aktivitäten Sie benachrichtigt werden möchten", "options": { "ASSIGN_APPROVER": "Wenn ich einem Dokument als Genehmiger zugewiesen werde", "ASSIGN_REVIEWER": "Wenn ich einem Dokument als Prüfer zugewiesen werde", @@ -1963,7 +1965,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, bei welchen Aktivitäten Sie benachrichtigt werden möchten", "schedule": { "daily": "Tägliche Zusammenfassung", "instant": "Sofort", @@ -1971,6 +1972,13 @@ }, "title": "Benachrichtigungseinstellungen" }, + "notifications": { + "button-text": "Benachrichtigungen", + "deleted-dossier": "Gelöschtes Dossier", + "label": "Benachrichtigungen", + "mark-all-as-read": "Alle als gelesen markieren", + "mark-as": "Als {type, select, read{gelesen} unread{ungelesen} other{}} markieren" + }, "ocr": { "confirmation-dialog": { "cancel": "Abbrechen", @@ -2017,14 +2025,34 @@ "previous": "Vorherige" }, "pdf-viewer": { + "header": { + "all-annotations-loaded": "", + "compare-button": "", + "layers-panel-button": "", + "left-panel-button": "", + "load-all-annotations": "", + "no-outlines-text": "", + "no-signatures-text": "", + "outline-multi-select": "", + "outlines-panel-button": "", + "pan-tool-button": "", + "rectangle-tool-button": "", + "rotate-left-button": "", + "rotate-right-button": "", + "select-tool-button": "", + "signature-panel-button": "", + "thumbnails-panel-button": "", + "toggle-layers": "", + "toggle-readable-redactions": "", + "toggle-tooltips": "", + "zoom-in-button": "", + "zoom-out-button": "" + }, "text-popup": { "actions": { "search": "Ausgewählten Text suchen" } - }, - "toggle-layers": "Layout-Raster {active, select, true{deaktivieren} false{aktivieren} other{}}", - "toggle-readable-redactions": "Schwärzungen {active, select, true{wie im finalen Dokument} false{in Vorschau-Farbe} other{}} anzeigen", - "toggle-tooltips": "Tooltips zu Annotationen {active, select, true{deaktivieren} false{aktivieren} other{}}" + } }, "permissions-screen": { "dossier": { @@ -2062,16 +2090,16 @@ "warnings-label": "Dialoge und Meldungen", "warnings-subtitle": "„Nicht mehr anzeigen“-Optionen" }, - "processing": { - "basic": "Verarbeitung läuft", - "ocr": "OCR" - }, "processing-status": { "ocr": "OCR", "pending": "Ausstehend", "processed": "Verarbeitet", "processing": "Verarbeitung läuft" }, + "processing": { + "basic": "Verarbeitung läuft", + "ocr": "OCR" + }, "readonly": "Lesemodus", "readonly-archived": "Lesemodus (archiviert)", "redact-text": { @@ -2086,6 +2114,10 @@ "edit-text": "Text bearbeiten", "legal-basis": "Rechtsgrundlage", "options": { + "in-document": { + "description": "", + "label": "" + }, "in-dossier": { "description": "Fügen Sie die Schwärzung zu jedem Dokument in {dossierName} hinzu.", "extraOptionLabel": "In alle aktiven und zukünftigen Dossiers übernehmen", @@ -2101,7 +2133,8 @@ "revert-text": "Zurück zu ursprünglicher Auswahl", "type": "Typ", "type-placeholder": "Typ auswählen...", - "unchanged": "Ungeändert" + "unchanged": "Ungeändert", + "value": "" }, "title": "Text schwärzen" } @@ -2125,6 +2158,10 @@ "description-bulk": "", "label": "In diesem Kontext aus dem Dossier entfernen" }, + "in-document": { + "description": "", + "label": "" + }, "in-dossier": { "description": "Annotieren Sie den Begriff in diesem Dossier nicht.", "description-bulk": "", @@ -2142,6 +2179,25 @@ "title": "{count, plural, one{Annotation} other {Annotationen}} entfernen" } }, + "remove-rectangle": { + "dialog": { + "content": { + "options": { + "multiple-pages": { + "description": "", + "extraOptionDescription": "", + "extraOptionLabel": "", + "extraOptionPlaceholder": "", + "label": "" + }, + "only-this-page": { + "description": "", + "label": "" + } + } + } + } + }, "remove-redaction": { "dialog": { "actions": { @@ -2165,6 +2221,10 @@ "extraOptionLabel": "In alle aktiven und zukünftigen Dossiers übernehmen", "label": "In diesem Kontext aus Dossier entfernen" }, + "in-document": { + "description": "", + "label": "" + }, "in-dossier": { "description": "Der Begriff wird in keinem Dokument dieses Dossiers {type, select, hint{annotiert} other{automatisch geschwärzt}}.", "description-bulk": "Die ausgewählten Begriffe werden in diesem Dossier nicht {type, select, hint{annotiert} other{automatisch geschwärzt}}.", @@ -2307,12 +2367,6 @@ "red-user-admin": "Benutzeradmin", "regular": "regulärer Benutzer" }, - "search": { - "active-dossiers": "Dokumente in aktiven Dossiers", - "all-dossiers": "Alle Dokumente", - "placeholder": "Dokumente durchsuchen...", - "this-dossier": "In diesem Dossier" - }, "search-screen": { "cols": { "assignee": "Bearbeiter", @@ -2336,6 +2390,12 @@ "no-match": "Der Suchbegriff wurde in keinem der Dokumente gefunden.", "table-header": "{length} {length, plural, one{Suchergebnis} other{Suchergebnisse}}" }, + "search": { + "active-dossiers": "Dokumente in aktiven Dossiers", + "all-dossiers": "Alle Dokumente", + "placeholder": "Dokumente durchsuchen...", + "this-dossier": "In diesem Dossier" + }, "seconds": "Sekunden", "size": "Größe", "smtp-auth-config": { @@ -2526,10 +2586,6 @@ "view-as": "Ansicht:", "workflow": "Workflow-Spalten" }, - "viewer-header": { - "all-annotations-loaded": "Alle Annotationen geladen", - "load-all-annotations": "Alle Annotationen laden" - }, "watermark-screen": { "action": { "change-success": "Wasserzeichen wurde aktualisiert.", @@ -2558,6 +2614,10 @@ "orientation": "Textrichtung", "text-label": "Text für Wasserzeichen", "text-placeholder": "Text eingeben" + }, + "pagination": { + "landscape": "", + "portrait": "" } }, "watermarks-listing": { diff --git a/apps/red-ui/src/assets/i18n/redact/en.json b/apps/red-ui/src/assets/i18n/redact/en.json index e8db36f2d..b4b07efe4 100644 --- a/apps/red-ui/src/assets/i18n/redact/en.json +++ b/apps/red-ui/src/assets/i18n/redact/en.json @@ -1273,6 +1273,25 @@ }, "side-nav-title": "Configurations" }, + "edit-rectangle": { + "dialog": { + "content": { + "options": { + "multiple-pages": { + "description": "Edit redaction the range of pages", + "extraOptionDescription": "Minus(-) for range and comma(,) for enumeration", + "extraOptionLabel": "Range", + "extraOptionPlaceholder": "e.g. 1-20,22,32", + "label": "Change on all pages" + }, + "only-this-page": { + "description": "Edit redaction only at this position in this document", + "label": "Change only on this page" + } + } + } + } + }, "edit-redaction": { "dialog": { "actions": { @@ -1865,13 +1884,8 @@ "save": "Save" }, "content": { - "apply-on-multiple-pages": "Apply on multiple pages", - "apply-on-multiple-pages-hint": "Minus(-) for range and comma(,) for enumeration.", - "apply-on-multiple-pages-placeholder": "e.g. 1-20,22,32", "classification": "Value / classification", "comment": "Comment", - "dictionary": "Dictionary", - "edit-selected-text": "Edit selected text", "legalBasis": "Legal basis", "options": { "multiple-pages": { @@ -1888,10 +1902,7 @@ }, "reason": "Reason", "reason-placeholder": "Select a reason...", - "rectangle": "Custom rectangle", - "section": "Paragraph / location", - "text": "Selected text:", - "type": "Entity" + "section": "Paragraph / location" }, "error": "Error! Invalid page selection", "header": { @@ -2168,6 +2179,25 @@ "title": "Remove {count, plural, one{annotation} other {annotations}}" } }, + "remove-rectangle": { + "dialog": { + "content": { + "options": { + "multiple-pages": { + "description": "Edit redaction the range of pages", + "extraOptionDescription": "Minus(-) for range and comma(,) for enumeration", + "extraOptionLabel": "Range", + "extraOptionPlaceholder": "e.g. 1-20,22,32", + "label": "Remove on all pages" + }, + "only-this-page": { + "description": "Edit redaction only at this position in this document", + "label": "Remove only on this page" + } + } + } + } + }, "remove-redaction": { "dialog": { "actions": { diff --git a/apps/red-ui/src/assets/i18n/scm/de.json b/apps/red-ui/src/assets/i18n/scm/de.json index 7f79dfc40..d90f55996 100644 --- a/apps/red-ui/src/assets/i18n/scm/de.json +++ b/apps/red-ui/src/assets/i18n/scm/de.json @@ -243,7 +243,8 @@ } }, "type": "Typ", - "type-placeholder": "Typ auswählen..." + "type-placeholder": "Typ auswählen...", + "value": "" }, "title": "Hinweis hinzufügen" } @@ -275,9 +276,6 @@ "watermarks": "Wasserzeichen" }, "analysis-disabled": "Analyse deaktiviert", - "annotation": { - "pending": "(Analyse steht aus)" - }, "annotation-actions": { "accept-recommendation": { "label": "Empfehlung annehmen" @@ -333,14 +331,14 @@ "error": "Rekategorisierung des Bilds fehlgeschlagen: {error}", "success": "Bild wurde einer neuen Kategorie zugeordnet." }, - "remove": { - "error": "Entfernen der Annotation fehlgeschlagen: {error}", - "success": "Annotation wurde entfernt" - }, "remove-hint": { "error": "Entfernen des Hinweises fehlgeschlagen: {error}", "success": "Hinweis wurde entfernt" }, + "remove": { + "error": "Entfernen der Annotation fehlgeschlagen: {error}", + "success": "Annotation wurde entfernt" + }, "undo": { "error": "Die Aktion konnte nicht rückgängig gemacht werden. Fehler: {error}", "success": "erfolgreich Rückgängig gemacht" @@ -353,15 +351,15 @@ "remove-highlights": { "label": "Ausgewählte Markierungen entfernen" }, - "resize": { - "label": "Größe ändern" - }, "resize-accept": { "label": "Neue Größe speichern" }, "resize-cancel": { "label": "Größenänderung abbrechen" }, + "resize": { + "label": "Größe ändern" + }, "see-references": { "label": "See references" }, @@ -378,6 +376,7 @@ "removed-manual": "Schwärzung/Hinweis entfernt", "resized": "Schwärzungsbereich wurde geändert" }, + "annotation-content": "", "annotation-engines": { "dictionary": "{isHint, select, true{Hinweis} other{Schwärzung}} basiert auf Wörterbuch", "dossier-dictionary": "Annotation basiert auf Dossier-Wörterbuch", @@ -395,6 +394,9 @@ "skipped": "Übersprungen", "text-highlight": "Markierung" }, + "annotation": { + "pending": "(Analyse steht aus)" + }, "annotations": "Annotationen", "archived-dossiers-listing": { "no-data": { @@ -1018,13 +1020,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" + }, "report-download": "Report download", "start-auto-analysis": "Enable auto-analysis", "stop-auto-analysis": "Stop auto-analysis", @@ -1094,14 +1096,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", @@ -1136,6 +1130,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.", @@ -1233,10 +1235,8 @@ "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}}", + "entries-count": "", "false-positives": "False positives", - "false-recommendation-entries": "{length} false recommendation {length, plural, one{entry} other{entries}}", "false-recommendations": "False recommendations", "to-redact": "To redact" }, @@ -1273,6 +1273,25 @@ }, "side-nav-title": "Konfiguration" }, + "edit-rectangle": { + "dialog": { + "content": { + "options": { + "multiple-pages": { + "description": "", + "extraOptionDescription": "", + "extraOptionLabel": "", + "extraOptionPlaceholder": "", + "label": "" + }, + "only-this-page": { + "description": "", + "label": "" + } + } + } + } + }, "edit-redaction": { "dialog": { "actions": { @@ -1282,13 +1301,10 @@ "content": { "comment": "Comment", "comment-placeholder": "Add remarks or mentions...", - "custom-rectangle": "", - "imported": "", "legal-basis": "", "options": { - "in-dossier": { + "in-document": { "description": "", - "extraOptionLabel": "", "label": "" }, "only-here": { @@ -1332,15 +1348,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!" @@ -1354,19 +1361,28 @@ "title": "Entity rule editor", "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": { @@ -1384,12 +1400,6 @@ }, "exact-date": "{day} {month} {year} um {hour}:{minute} Uhr", "file": "Datei", - "file-attribute": { - "update": { - "error": "Aktualisierung des Werts für das Datei-Attribut fehlgeschlagen. Bitte versuchen Sie es noch einmal.", - "success": "Der Wert für das Dateiattribut wurde erfolgreich aktualisiert." - } - }, "file-attribute-encoding-types": { "ascii": "ASCII", "iso": "ISO-8859-1", @@ -1400,6 +1410,12 @@ "number": "Nummer", "text": "Freier Text" }, + "file-attribute": { + "update": { + "error": "Aktualisierung des Werts für das Datei-Attribut fehlgeschlagen. Bitte versuchen Sie es noch einmal.", + "success": "Der Wert für das Dateiattribut wurde erfolgreich aktualisiert." + } + }, "file-attributes-configurations": { "cancel": "Abbrechen", "form": { @@ -1617,15 +1633,6 @@ "csv": "Die Datei-Attribute wurden erfolgreich aus der hochgeladenen CSV-Datei importiert." } }, - "filter": { - "analysis": "Analyse erforderlich", - "comment": "Kommentare", - "hint": "Nur Hinweise", - "image": "Bilder", - "none": "Keine Annotationen", - "redaction": "Annotationen", - "updated": "Aktualisiert" - }, "filter-menu": { "filter-options": "Filteroptionen", "filter-types": "Filter", @@ -1635,6 +1642,15 @@ "unseen-pages": "Nur Anmerkungen auf ungesehenen Seiten", "with-comments": "Nur Anmerkungen mit Kommentaren" }, + "filter": { + "analysis": "Analyse erforderlich", + "comment": "Kommentare", + "hint": "Nur Hinweise", + "image": "Bilder", + "none": "Keine Annotationen", + "redaction": "Annotationen", + "updated": "Aktualisiert" + }, "filters": { "assigned-people": "Bearbeiter", "documents-status": "Dokumentenstatus", @@ -1868,13 +1884,8 @@ "save": "Speichern" }, "content": { - "apply-on-multiple-pages": "Apply on multiple pages", - "apply-on-multiple-pages-hint": "Minus(-) for range and comma(,) for enumeration.", - "apply-on-multiple-pages-placeholder": "e.g. 1-20,22,32", "classification": "Wert / Klassifizierung", "comment": "Kommentar", - "dictionary": "Wörterbuch", - "edit-selected-text": "Edit selected text", "legalBasis": "Rechtsgrundlage", "options": { "multiple-pages": { @@ -1891,10 +1902,7 @@ }, "reason": "Begründung", "reason-placeholder": "Wählen Sie eine Begründung aus ...", - "rectangle": "Benutzerdefinierter Bereich", - "section": "Absatz / Ort", - "text": "Ausgewählter Text:", - "type": "Entity" + "section": "Absatz / Ort" }, "error": "Error! Invalid page selection", "header": { @@ -1926,13 +1934,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", @@ -1946,6 +1947,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", @@ -1963,7 +1965,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", @@ -1971,6 +1972,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", @@ -2017,14 +2025,34 @@ "previous": "Vorherige" }, "pdf-viewer": { + "header": { + "all-annotations-loaded": "", + "compare-button": "", + "layers-panel-button": "", + "left-panel-button": "", + "load-all-annotations": "", + "no-outlines-text": "", + "no-signatures-text": "", + "outline-multi-select": "", + "outlines-panel-button": "", + "pan-tool-button": "", + "rectangle-tool-button": "", + "rotate-left-button": "", + "rotate-right-button": "", + "select-tool-button": "", + "signature-panel-button": "", + "thumbnails-panel-button": "", + "toggle-layers": "", + "toggle-readable-redactions": "", + "toggle-tooltips": "", + "zoom-in-button": "", + "zoom-out-button": "" + }, "text-popup": { "actions": { "search": "Search for selected text" } - }, - "toggle-layers": "{active, select, true{Disable} false{Enable} other{}} layout grid", - "toggle-readable-redactions": "Show components {active, select, true{as in final document} false{in preview color} other{}}", - "toggle-tooltips": "{active, select, true{Disable} false{Enable} other{}} Kurzinfos für Anmerkungen" + } }, "permissions-screen": { "dossier": { @@ -2062,16 +2090,16 @@ "warnings-label": "Prompts and dialogs", "warnings-subtitle": "Do not show again options" }, - "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": { @@ -2086,6 +2114,10 @@ "edit-text": "", "legal-basis": "Legal basis", "options": { + "in-document": { + "description": "", + "label": "" + }, "in-dossier": { "description": "Add redaction in every document in {dossierName}.", "extraOptionLabel": "Apply to all dossiers", @@ -2101,7 +2133,8 @@ "revert-text": "", "type": "Type", "type-placeholder": "Select type...", - "unchanged": "" + "unchanged": "", + "value": "" }, "title": "Redact text" } @@ -2125,6 +2158,10 @@ "description-bulk": "The selected items should not be annotated in their respective contexts.", "label": "False positive" }, + "in-document": { + "description": "", + "label": "" + }, "in-dossier": { "description": "Do not annotate ''{value}'' as ''{type}'' in any dossier.", "description-bulk": "Do not annotate the selected terms as their respective types in any dossier.", @@ -2142,6 +2179,25 @@ "title": "Remove {count, plural, one{annotation} other {annotations}}" } }, + "remove-rectangle": { + "dialog": { + "content": { + "options": { + "multiple-pages": { + "description": "", + "extraOptionDescription": "", + "extraOptionLabel": "", + "extraOptionPlaceholder": "", + "label": "" + }, + "only-this-page": { + "description": "", + "label": "" + } + } + } + } + }, "remove-redaction": { "dialog": { "actions": { @@ -2165,6 +2221,10 @@ "extraOptionLabel": "Apply to all dossiers", "label": "False positive" }, + "in-document": { + "description": "", + "label": "" + }, "in-dossier": { "description": "Do not {type} \"{value}\" in any document of the current dossier.", "description-bulk": "", @@ -2307,12 +2367,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", @@ -2336,6 +2390,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": { @@ -2526,10 +2586,6 @@ "view-as": "Ansicht als:", "workflow": "Arbeitsablauf" }, - "viewer-header": { - "all-annotations-loaded": "All annotations loaded", - "load-all-annotations": "Load all annotations" - }, "watermark-screen": { "action": { "change-success": "Das Wasserzeichen wurde aktualisiert!", @@ -2558,6 +2614,10 @@ "orientation": "Ausrichtung", "text-label": "Watermark text", "text-placeholder": "Text eingeben" + }, + "pagination": { + "landscape": "", + "portrait": "" } }, "watermarks-listing": { diff --git a/apps/red-ui/src/assets/i18n/scm/en.json b/apps/red-ui/src/assets/i18n/scm/en.json index fbbb9229d..5b74c260d 100644 --- a/apps/red-ui/src/assets/i18n/scm/en.json +++ b/apps/red-ui/src/assets/i18n/scm/en.json @@ -1273,6 +1273,25 @@ }, "side-nav-title": "Configurations" }, + "edit-rectangle": { + "dialog": { + "content": { + "options": { + "multiple-pages": { + "description": "", + "extraOptionDescription": "", + "extraOptionLabel": "", + "extraOptionPlaceholder": "", + "label": "" + }, + "only-this-page": { + "description": "", + "label": "" + } + } + } + } + }, "edit-redaction": { "dialog": { "actions": { @@ -1865,13 +1884,8 @@ "save": "Save" }, "content": { - "apply-on-multiple-pages": "Apply on multiple pages", - "apply-on-multiple-pages-hint": "Minus(-) for range and comma(,) for enumeration.", - "apply-on-multiple-pages-placeholder": "e.g. 1-20,22,32", "classification": "Value / classification", "comment": "Comment", - "dictionary": "Dictionary", - "edit-selected-text": "Edit selected text", "legalBasis": "Legal Basis", "options": { "multiple-pages": { @@ -1888,10 +1902,7 @@ }, "reason": "Reason", "reason-placeholder": "Select a reason ...", - "rectangle": "Custom Rectangle", - "section": "Paragraph / Location", - "text": "Selected text:", - "type": "Entity" + "section": "Paragraph / Location" }, "error": "Error! Invalid page selection", "header": { @@ -2168,6 +2179,25 @@ "title": "Remove {count, plural, one{annotation} other {annotations}}" } }, + "remove-rectangle": { + "dialog": { + "content": { + "options": { + "multiple-pages": { + "description": "", + "extraOptionDescription": "", + "extraOptionLabel": "", + "extraOptionPlaceholder": "", + "label": "" + }, + "only-this-page": { + "description": "", + "label": "" + } + } + } + } + }, "remove-redaction": { "dialog": { "actions": { diff --git a/libs/red-domain/src/lib/redaction-log/recategorization.request.ts b/libs/red-domain/src/lib/redaction-log/recategorization.request.ts index 815d28acf..edf967fc8 100644 --- a/libs/red-domain/src/lib/redaction-log/recategorization.request.ts +++ b/libs/red-domain/src/lib/redaction-log/recategorization.request.ts @@ -1,3 +1,5 @@ +import { IEntityLogEntryPosition } from './entity-log-entry'; + export interface IRecategorizationRequest { readonly annotationId?: string; readonly comment?: string; @@ -15,9 +17,6 @@ export interface IBulkRecategorizationRequest { readonly originTypes: string[]; readonly originLegalBases: string[]; readonly rectangle: boolean; - readonly position?: { - readonly rectangle: number[]; - readonly pageNumber: number; - }; + readonly position?: IEntityLogEntryPosition; readonly pageNumbers?: number[]; }