diff --git a/apps/red-ui/src/app/modules/file-preview/components/annotation-actions/annotation-actions.component.ts b/apps/red-ui/src/app/modules/file-preview/components/annotation-actions/annotation-actions.component.ts index b9a28495d..ba84aa774 100644 --- a/apps/red-ui/src/app/modules/file-preview/components/annotation-actions/annotation-actions.component.ts +++ b/apps/red-ui/src/app/modules/file-preview/components/annotation-actions/annotation-actions.component.ts @@ -60,7 +60,14 @@ export class AnnotationActionsComponent implements OnChanges { } get canRemoveRedaction(): boolean { - return (this.#isDocumine || this.annotations.length === 1) && this.annotationPermissions.canRemoveRedaction; + if (this.annotationPermissions.canRemoveRedaction) { + if (this.annotations.length > 1) { + const foundIgnoredHint = this.annotations.find(a => a.isIgnoredHint); + return !foundIgnoredHint && this.#sameType; + } + return true; + } + return false; } get viewerAnnotations() { @@ -131,4 +138,9 @@ export class AnnotationActionsComponent implements OnChanges { helpModeKey(action: string) { return this.#isDocumine ? `${action}_annotation` : ''; } + + get #sameType() { + const type = this.annotations[0].superType; + return this.annotations.every(a => a.superType === type); + } } 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 2afd68543..c5356c9c0 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 @@ -1,13 +1,51 @@
+
-
+
+
+ + + +
    +
  • + {{ + (isFalsePositive + ? 'remove-redaction.dialog.content.list-item-false-positive' + : 'remove-redaction.dialog.content.list-item' + ) + | translate + : { + text: text, + context: data.falsePositiveContext[idx] + } + | replaceNbsp + }} +
  • +
+
+
+
diff --git a/apps/red-ui/src/app/modules/file-preview/dialogs/remove-redaction-dialog/remove-redaction-dialog.component.scss b/apps/red-ui/src/app/modules/file-preview/dialogs/remove-redaction-dialog/remove-redaction-dialog.component.scss index 6c59d31b8..f211d23f7 100644 --- a/apps/red-ui/src/app/modules/file-preview/dialogs/remove-redaction-dialog/remove-redaction-dialog.component.scss +++ b/apps/red-ui/src/app/modules/file-preview/dialogs/remove-redaction-dialog/remove-redaction-dialog.component.scss @@ -1,3 +1,18 @@ .dialog-content { height: 408px; } + +cdk-virtual-scroll-viewport { + margin-top: 8px; +} + +:host ::ng-deep .cdk-virtual-scroll-orientation-vertical .cdk-virtual-scroll-content-wrapper { + max-width: 100% !important; +} + +li { + white-space: nowrap; + text-overflow: ellipsis; + list-style-position: inside; + overflow: hidden; +} diff --git a/apps/red-ui/src/app/modules/file-preview/dialogs/remove-redaction-dialog/remove-redaction-dialog.component.ts b/apps/red-ui/src/app/modules/file-preview/dialogs/remove-redaction-dialog/remove-redaction-dialog.component.ts index 0e24974e4..c2eb54f67 100644 --- a/apps/red-ui/src/app/modules/file-preview/dialogs/remove-redaction-dialog/remove-redaction-dialog.component.ts +++ b/apps/red-ui/src/app/modules/file-preview/dialogs/remove-redaction-dialog/remove-redaction-dialog.component.ts @@ -3,7 +3,7 @@ import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; import { FormBuilder, UntypedFormGroup } from '@angular/forms'; import { DetailsRadioOption, IconButtonTypes, IqserDialogComponent } from '@iqser/common-ui'; import { tap } from 'rxjs/operators'; -import { getRemoveRedactionOptions, RemoveRedactionOption } from '../../utils/dialog-options'; +import { getRemoveRedactionOptions, RemoveAnnotationOptions, RemoveRedactionOption } from '../../utils/dialog-options'; import { RemoveRedactionData, RemoveRedactionResult } from '../../utils/dialog-types'; @Component({ @@ -19,14 +19,16 @@ export class RemoveRedactionDialogComponent extends IqserDialogComponent< readonly options: DetailsRadioOption[]; readonly recommendation; readonly hint: boolean; + readonly redactedTexts: string[]; form!: UntypedFormGroup; #applyToAllDossiers: boolean; constructor(private readonly _formBuilder: FormBuilder) { super(); - this.recommendation = this.data.redactions.every(r => r.isRecommendation); - this.hint = this.data.redactions.every(r => r.hint); + this.recommendation = this.data.redactions[0].isRecommendation; + this.hint = this.data.redactions[0].hint; this.options = getRemoveRedactionOptions(this.data); + this.redactedTexts = this.data.redactions.map(annotation => annotation.value); this.form = this.#getForm(); this.#applyToAllDossiers = this.data.applyToAllDossiers ?? true; @@ -45,6 +47,10 @@ export class RemoveRedactionDialogComponent extends IqserDialogComponent< .subscribe(); } + get isFalsePositive(): boolean { + return this.form.get('option').value.value === RemoveAnnotationOptions.FALSE_POSITIVE; + } + save(): void { this.close(this.form.getRawValue()); } diff --git a/apps/red-ui/src/app/translations/remove-redaction-translations.ts b/apps/red-ui/src/app/translations/remove-redaction-translations.ts index 2a7d7b790..a6abfa7eb 100644 --- a/apps/red-ui/src/app/translations/remove-redaction-translations.ts +++ b/apps/red-ui/src/app/translations/remove-redaction-translations.ts @@ -6,20 +6,25 @@ export const removeRedactionTranslations: { [key in RemoveRedactionOption]: Dial ONLY_HERE: { label: _('remove-redaction.dialog.content.options.only-here.label'), description: _('remove-redaction.dialog.content.options.only-here.description'), + descriptionBulk: _('remove-redaction.dialog.content.options.only-here.description-bulk'), }, IN_DOSSIER: { label: _('remove-redaction.dialog.content.options.in-dossier.label'), + labelBulk: _('remove-redaction.dialog.content.options.in-dossier.label-bulk'), description: _('remove-redaction.dialog.content.options.in-dossier.description'), + descriptionBulk: _('remove-redaction.dialog.content.options.in-dossier.description-bulk'), extraOptionLabel: _('remove-redaction.dialog.content.options.in-dossier.extraOptionLabel'), }, FALSE_POSITIVE: { label: _('remove-redaction.dialog.content.options.false-positive.label'), description: _('remove-redaction.dialog.content.options.false-positive.description'), + descriptionBulk: _('remove-redaction.dialog.content.options.false-positive.description-bulk'), extraOptionLabel: _('remove-redaction.dialog.content.options.false-positive.extraOptionLabel'), }, DO_NOT_RECOMMEND: { label: _('remove-redaction.dialog.content.options.do-not-recommend.label'), description: _('remove-redaction.dialog.content.options.do-not-recommend.description'), + descriptionBulk: _('remove-redaction.dialog.content.options.do-not-recommend.description-bulk'), extraOptionLabel: _('remove-redaction.dialog.content.options.do-not-recommend.extraOptionLabel'), }, }; diff --git a/apps/red-ui/src/assets/i18n/redact/en.json b/apps/red-ui/src/assets/i18n/redact/en.json index 9b896747b..1a5d3bf82 100644 --- a/apps/red-ui/src/assets/i18n/redact/en.json +++ b/apps/red-ui/src/assets/i18n/redact/en.json @@ -2052,11 +2052,11 @@ }, "only-here": { "description": "Do not annotate \"{value}\" at this position in the current document.", - "description-bulk": "", + "description-bulk": "Do not annotate the selected terms at this position in the current document.", "label": "Remove here" } }, - "redacted-text": "" + "redacted-text": "Selected redactions" }, "title": "Remove {count, plural, one{annotation} other {annotations}}" } @@ -2070,30 +2070,38 @@ "content": { "comment": "Comment", "comment-placeholder": "Add remarks or mentions ...", + "list-item": "{text}", + "list-item-false-positive": "\"{text}\" in the context: \"{context}\"", "options": { "do-not-recommend": { "description": "Do not recommend \"{value}\" as {type} in any document of the current dossier.", - "description-bulk": "", + "description-bulk": "Do not recommend the selected terms in any document of the current dossier.", "extraOptionLabel": "Apply to all dossiers", "label": "Remove from dossier" }, "false-positive": { "description": "\"{value}\" is not a {type} in this context: \"{context}\".", + "description-bulk": "Do not redact the selected terms in their respective context.", "extraOptionLabel": "Apply to all dossiers", "label": "False positive" }, "in-dossier": { "description": "Do not {type} \"{value}\" in any document of the current dossier.", + "description-bulk": "Do not redact the selected terms as their respective types in any dossier.", "extraOptionLabel": "Apply to all dossiers", - "label": "Remove from dossier" + "label": "Remove from dossier", + "label-bulk": "No longer redact in any dossier" }, "only-here": { "description": "Do not {type, select, undefined{redact} other{type}} \"{value}\" at this position in the current document.", + "description-bulk": "Do not redact the selected terms at this position in the current document.", "label": "Remove here" } - } + }, + "redacted-text": "Selected {type}" }, - "title": "Remove {type}" + "title": "Remove {type, select, redaction{redaction} recommendation{recommendation} other{hint}}", + "title-bulk": "Remove {type, select, redaction{redactions} recommendation{recommendations} other{hints}}" } }, "report-type": { diff --git a/apps/red-ui/src/assets/i18n/scm/de.json b/apps/red-ui/src/assets/i18n/scm/de.json index f8e015e25..6bef9e9c2 100644 --- a/apps/red-ui/src/assets/i18n/scm/de.json +++ b/apps/red-ui/src/assets/i18n/scm/de.json @@ -2070,6 +2070,8 @@ "content": { "comment": "", "comment-placeholder": "", + "list-item": "", + "list-item-false-positive": "", "options": { "do-not-recommend": { "description": "", @@ -2079,21 +2081,27 @@ }, "false-positive": { "description": "", + "description-bulk": "", "extraOptionLabel": "", "label": "" }, "in-dossier": { "description": "", + "description-bulk": "", "extraOptionLabel": "", - "label": "" + "label": "", + "label-bulk": "" }, "only-here": { "description": "", + "description-bulk": "", "label": "" } - } + }, + "redacted-text": "" }, - "title": "" + "title": "", + "title-bulk": "" } }, "report-type": { diff --git a/apps/red-ui/src/assets/i18n/scm/en.json b/apps/red-ui/src/assets/i18n/scm/en.json index 43dc78a82..1846116f6 100644 --- a/apps/red-ui/src/assets/i18n/scm/en.json +++ b/apps/red-ui/src/assets/i18n/scm/en.json @@ -2070,6 +2070,8 @@ "content": { "comment": "Comment", "comment-placeholder": "Add remarks or mentions ...", + "list-item": "", + "list-item-false-positive": "", "options": { "do-not-recommend": { "description": "Do not recommend \"{value}\" as {type} in any document of the current dossier.", @@ -2079,21 +2081,27 @@ }, "false-positive": { "description": "\"{value}\" is not a {type} in this context: \"{context}\".", + "description-bulk": "", "extraOptionLabel": "Apply to all dossiers", "label": "False positive" }, "in-dossier": { "description": "Do not {type} \"{value}\" in any document of the current dossier.", + "description-bulk": "", "extraOptionLabel": "Apply to all dossiers", - "label": "Remove from dossier" + "label": "Remove from dossier", + "label-bulk": "" }, "only-here": { "description": "Do not {type} \"{value}\" at this position in the current document.", + "description-bulk": "", "label": "Remove here" } - } + }, + "redacted-text": "" }, - "title": "Remove {type}" + "title": "Remove {type}", + "title-bulk": "" } }, "report-type": {