+
1">
+
+
+
+
+ -
+ {{
+ (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/modules/file-preview/services/annotation-actions.service.ts b/apps/red-ui/src/app/modules/file-preview/services/annotation-actions.service.ts
index a222a2f56..d1c2eaec0 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
@@ -15,7 +15,7 @@ import {
} from '@red/domain';
import { DossierTemplatesService } from '@services/dossier-templates/dossier-templates.service';
import { PermissionsService } from '@services/permissions.service';
-import { firstValueFrom, from, Observable, zip } from 'rxjs';
+import { firstValueFrom, Observable, zip } from 'rxjs';
import { getFirstRelevantTextPart } from '../../../utils';
import { AnnotationDrawService } from '../../pdf-viewer/services/annotation-draw.service';
import { REDAnnotationManager } from '../../pdf-viewer/services/annotation-manager.service';
@@ -97,7 +97,6 @@ export class AnnotationActionsService {
};
const result = await this.#getEditRedactionDialog(data).result();
- console.log(result);
const requests: Observable[] = [];
@@ -114,22 +113,23 @@ export class AnnotationActionsService {
}));
requests.push(this._manualRedactionService.changeLegalBasis(changeLegalBasisBody, dossierId, fileId));
}
- const recategorizeBody: List = annotations.map(annotation => ({
- annotationId: annotation.id,
- type: result.type ?? annotation.type,
- }));
- requests.push(this._manualRedactionService.recategorizeRedactions(recategorizeBody, dossierId, fileId));
+ if (result.type && !annotations.every(annotation => annotation.type === result.type)) {
+ const recategorizeBody: List = annotations.map(annotation => ({
+ annotationId: annotation.id,
+ type: result.type ?? annotation.type,
+ }));
+ requests.push(this._manualRedactionService.recategorizeRedactions(recategorizeBody, dossierId, fileId));
+ }
+
+ if (result.comment) {
+ for (const a of annotations) {
+ await this._manualRedactionService.addComment(result.comment, a.id, dossierId, fileId);
+ }
+ }
if (!requests.length) {
return;
}
-
- if (result.comment) {
- requests.push(
- from(Promise.all(annotations.map(a => this._manualRedactionService.addComment(result.comment, a.id, dossierId, fileId)))),
- );
- }
-
await this.#processObsAndEmit(zip(requests).pipe(log()));
}
diff --git a/apps/red-ui/src/app/modules/shared/components/add-edit-entity/add-edit-entity.component.ts b/apps/red-ui/src/app/modules/shared/components/add-edit-entity/add-edit-entity.component.ts
index 78d4501b8..7e423e2e7 100644
--- a/apps/red-ui/src/app/modules/shared/components/add-edit-entity/add-edit-entity.component.ts
+++ b/apps/red-ui/src/app/modules/shared/components/add-edit-entity/add-edit-entity.component.ts
@@ -1,13 +1,13 @@
-import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, OnInit } from '@angular/core';
-import { Dictionary, IDictionary } from '@red/domain';
+import { booleanAttribute, ChangeDetectorRef, Component, Input, OnInit } from '@angular/core';
import { FormGroup, UntypedFormBuilder, UntypedFormControl, UntypedFormGroup, Validators } from '@angular/forms';
-import { map, startWith } from 'rxjs/operators';
-import { firstValueFrom, Observable } from 'rxjs';
-import { toSnakeCase } from '@utils/functions';
-import { DictionariesMapService } from '@services/entity-services/dictionaries-map.service';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
-import { DictionaryService } from '@services/entity-services/dictionary.service';
import { BaseFormComponent, getConfig, LoadingService, Toaster } from '@iqser/common-ui';
+import { Dictionary, IDictionary } from '@red/domain';
+import { DictionariesMapService } from '@services/entity-services/dictionaries-map.service';
+import { DictionaryService } from '@services/entity-services/dictionary.service';
+import { toSnakeCase } from '@utils/functions';
+import { firstValueFrom, Observable } from 'rxjs';
+import { map, startWith } from 'rxjs/operators';
const REDACTION_FIELDS = ['defaultReason'];
@@ -20,15 +20,14 @@ interface Color {
}
@Component({
- selector: 'redaction-add-edit-entity [entity] [dossierTemplateId] [readOnly]',
+ selector: 'redaction-add-edit-entity [entity] [dossierTemplateId]',
templateUrl: './add-edit-entity.component.html',
styleUrls: ['./add-edit-entity.component.scss'],
- changeDetection: ChangeDetectionStrategy.OnPush,
})
export class AddEditEntityComponent extends BaseFormComponent implements OnInit {
- @Input() dossierTemplateId: string;
- @Input() entity: Dictionary;
- @Input() readOnly: boolean;
+ @Input({ required: true }) dossierTemplateId: string;
+ @Input({ required: true }) entity: Dictionary;
+ @Input({ transform: booleanAttribute }) readOnly = false;
@Input() dossierId?: string;
technicalName$: Observable;
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/app/utils/functions.ts b/apps/red-ui/src/app/utils/functions.ts
index b63b3aa2a..83190316a 100644
--- a/apps/red-ui/src/app/utils/functions.ts
+++ b/apps/red-ui/src/app/utils/functions.ts
@@ -115,3 +115,21 @@ export function moveElementInArray(array: T[], element: T, index: number) {
result.splice(index, 0, element);
return result;
}
+
+export function calcTextWidthInPixels(text: string): number {
+ const temporaryElement = document.createElement('span');
+ document.body.appendChild(temporaryElement);
+
+ temporaryElement.style.font = 'times new roman';
+ temporaryElement.style.fontSize = 13 + 'px';
+ temporaryElement.style.height = 'auto';
+ temporaryElement.style.width = 'auto';
+ temporaryElement.style.position = 'absolute';
+ temporaryElement.style.whiteSpace = 'no-wrap';
+ temporaryElement.innerHTML = text;
+
+ const width = Math.ceil(temporaryElement.clientWidth);
+ document.body.removeChild(temporaryElement);
+
+ return width;
+}
diff --git a/apps/red-ui/src/assets/help-mode/help-mode-keys.json b/apps/red-ui/src/assets/help-mode/help-mode-keys.json
index 061fba14e..e26cd61b6 100644
--- a/apps/red-ui/src/assets/help-mode/help-mode-keys.json
+++ b/apps/red-ui/src/assets/help-mode/help-mode-keys.json
@@ -596,5 +596,21 @@
"elementKey": "workload_bulk_selection",
"documentKey": "workload_bulk_selection",
"overlappingElements": ["USER_MENU", "DOCUMENT_INFO"]
+ },
+ {
+ "elementKey": "audit_detailed_audit_info",
+ "documentKey": "audit_detailed_audit_info"
+ },
+ {
+ "elementKey": "audit_filter_audit_entries",
+ "documentKey": "audit_filter_audit_entries"
+ },
+ {
+ "elementKey": "configure_csv_mapping",
+ "documentKey": "configure_csv_mapping"
+ },
+ {
+ "elementKey": "upload_report",
+ "documentKey": "upload_report"
}
]
diff --git a/apps/red-ui/src/assets/i18n/redact/de.json b/apps/red-ui/src/assets/i18n/redact/de.json
index e2b3a85cd..01b36bc4f 100644
--- a/apps/red-ui/src/assets/i18n/redact/de.json
+++ b/apps/red-ui/src/assets/i18n/redact/de.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": {
@@ -2533,4 +2541,4 @@
}
},
"yesterday": "Gestern"
-}
\ No newline at end of file
+}
diff --git a/apps/red-ui/src/assets/i18n/redact/en.json b/apps/red-ui/src/assets/i18n/redact/en.json
index 7f9e90aee..b4b1f45b7 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 {length, plural, one{text} other {texts}}"
+ "redacted-text": "Selected {length, plural, one{redaction} other {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": {
@@ -2533,4 +2541,4 @@
}
},
"yesterday": "Yesterday"
-}
\ No newline at end of file
+}
diff --git a/apps/red-ui/src/assets/i18n/scm/de.json b/apps/red-ui/src/assets/i18n/scm/de.json
index 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": {