Merge branch 'master' into VM/RED-8692

This commit is contained in:
Valentin Mihai 2024-03-22 15:59:21 +02:00
commit 5c096eb876
20 changed files with 173 additions and 111 deletions

View File

@ -66,6 +66,7 @@ export class AnnotationWrapper implements IListable {
isRemovedLocally = false;
hiddenInWorkload = false;
lastManualChange: ManualRedactionType;
entry: IEntityLogEntry;
get isRuleBased() {
return this.engines.includes(LogEntryEngines.RULE);
@ -214,7 +215,6 @@ export class AnnotationWrapper implements IListable {
static fromData(
logEntry: IEntityLogEntry,
allLogEntries: IEntityLogEntry[],
dictionary: Dictionary,
changeLogType: ChangeType,
legalBasisList: ILegalBasis[],
@ -275,10 +275,6 @@ export class AnnotationWrapper implements IListable {
const lastRelevantManualChange = logEntry.manualChanges?.at(-1);
annotationWrapper.lastManualChange = lastRelevantManualChange?.manualRedactionType;
if (annotationWrapper.pending) {
const removedEntry = allLogEntries.find((e: IEntityLogEntry) => e.id === annotationWrapper.id);
logEntry.oldState = removedEntry?.state;
}
annotationWrapper.superType = SuperTypeMapper[logEntry.entryType][logEntry.state](logEntry);
annotationWrapper.superTypeLabel = annotationTypesTranslations[annotationWrapper.superType];
@ -295,7 +291,7 @@ export class AnnotationWrapper implements IListable {
annotationWrapper.color = dictionary ? (dictionary[colorKey] as string) : (defaultColors[defaultColor] as string);
}
annotationWrapper['entry'] = logEntry;
annotationWrapper.entry = logEntry;
return annotationWrapper;
}

View File

@ -1,6 +1,6 @@
<ng-container *ngIf="configService.listingMode$ | async as mode">
<div
(click)="editFileAttribute($event)"
(click)="handleFieldClick($event)"
(mousedown)="handleClick($event)"
[ngClass]="{ 'workflow-attribute': mode === 'workflow', 'file-name-column': fileNameColumn }"
class="file-attribute"
@ -37,7 +37,11 @@
*ngIf="!isInEditMode; else input"
[attr.help-mode-key]="'edit_file_attributes'"
[class.help-mode-button]="helpModeService.isHelpModeActive$ | async"
[ngClass]="{ 'workflow-edit-button': mode === 'workflow', 'action-buttons edit-button': !fileNameColumn }"
[ngClass]="{
'workflow-edit-button': mode === 'workflow',
'action-buttons edit-button': !fileNameColumn,
'filename-edit-button': fileNameColumn
}"
>
<div [ngClass]="{ 'workflow-edit-icon': mode === 'workflow', 'edit-icon': !fileNameColumn }">
<mat-icon [svgIcon]="'iqser:edit'"></mat-icon>

View File

@ -170,6 +170,11 @@
}
}
.filename-edit-button:hover {
background-color: var(--iqser-grey-6);
border-radius: 50%;
}
.file-attribute:hover {
&.workflow-attribute {
background-color: var(--iqser-grey-6);

View File

@ -150,7 +150,13 @@ export class FileAttributeComponent extends BaseFormComponent implements OnDestr
this.#subscriptions.unsubscribe();
}
async editFileAttribute($event: MouseEvent): Promise<void> {
handleFieldClick($event: MouseEvent) {
if (!this.fileNameColumn) {
this.editFileAttribute($event);
}
}
editFileAttribute($event: MouseEvent) {
if (
!this.file.isInitialProcessing &&
this.permissionsService.canEditFileAttributes(this.file, this.dossier) &&

View File

@ -31,9 +31,10 @@
.file-name-cell:hover {
::ng-deep.file-name-column {
background: var(--iqser-grey-6);
.filename-edit-button {
width: 24px;
height: 24px;
div {
mat-icon {
visibility: visible;
}

View File

@ -40,6 +40,16 @@ export class RedactTextDialogComponent
readonly #manualRedactionTypeExists = inject(DictionaryService).hasManualType(this.#dossier.dossierTemplateId);
#applyToAllDossiers = this.data.applyToAllDossiers ?? true;
get defaultOption() {
const inDossierOption = this.options.find(option => option.value === RedactOrHintOptions.IN_DOSSIER);
this.dictionaryRequest = !!inDossierOption && !inDossierOption.disabled;
if (this.dictionaryRequest) {
this.#setDictionaries();
return inDossierOption;
}
return this.options[0];
}
constructor(
private readonly _justificationsService: JustificationsService,
private readonly _dictionaryService: DictionaryService,
@ -49,6 +59,7 @@ export class RedactTextDialogComponent
this.options = getRedactOrHintOptions(this.#dossier, this.#applyToAllDossiers, this.data.isApprover, this.data.isPageExcluded);
this.form = this.#getForm();
this.#setupValidators(this.dictionaryRequest ? RedactOrHintOptions.IN_DOSSIER : RedactOrHintOptions.ONLY_HERE);
this.form.controls.option.valueChanges
.pipe(
@ -152,10 +163,10 @@ export class RedactTextDialogComponent
#getForm(): FormGroup {
return this._formBuilder.group({
selectedText: this.data?.manualRedactionEntryWrapper?.manualRedactionEntry?.value,
reason: [null as LegalBasisOption, Validators.required],
reason: [null as LegalBasisOption],
comment: [null],
dictionary: [this.#manualRedactionTypeExists ? SuperTypes.ManualRedaction : null],
option: this.options[0],
option: this.defaultOption,
});
}

View File

@ -1,35 +1,28 @@
<section class="dialog">
<form (submit)="save()" [formGroup]="form">
<div
*ngIf="data.redactions.length === 1"
[innerHTML]="
'remove-redaction.dialog.title' | translate: { type: hint ? 'hint' : recommendation ? 'recommendation' : 'redaction' }
"
class="dialog-header heading-l"
></div>
<div
*ngIf="data.redactions.length > 1"
[innerHTML]="
'remove-redaction.dialog.title-bulk' | translate: { type: hint ? 'hint' : recommendation ? 'recommendation' : 'redaction' }
"
[innerHTML]="(isBulk ? 'remove-redaction.dialog.title-bulk' : 'remove-redaction.dialog.title') | translate: typeTranslationArg"
class="dialog-header heading-l"
></div>
<div class="dialog-content redaction">
<div *ngIf="data.redactions.length > 1">
<div *ngIf="!isImage" class="iqser-input-group">
<label
[translateParams]="{ type: hint ? 'hints' : recommendation ? 'recommendations' : 'redactions' }"
[translate]="'remove-redaction.dialog.content.redacted-text'"
[translateParams]="typeTranslationArg"
[translate]="
isBulk ? 'remove-redaction.dialog.content.redacted-text-bulk' : 'remove-redaction.dialog.content.redacted-text'
"
class="selected-text"
></label>
<cdk-virtual-scroll-viewport
*ngIf="data.redactions.length > 1; else singleSelected"
[itemSize]="16"
[ngStyle]="{ height: redactedTexts.length <= 5 ? 16 * redactedTexts.length + 'px' : 80 + 'px' }"
>
<ul *cdkVirtualFor="let text of redactedTexts; let idx = index">
<li>
{{
<li
[innerHTML]="
(isFalsePositive
? 'remove-redaction.dialog.content.list-item-false-positive'
: 'remove-redaction.dialog.content.list-item'
@ -37,15 +30,36 @@
| translate
: {
text: text,
type: data.redactions[idx].typeLabel,
context: data.falsePositiveContext[idx]
}
| replaceNbsp
}}
</li>
"
></li>
</ul>
</cdk-virtual-scroll-viewport>
</div>
<ng-template #singleSelected>
<span
[innerHTML]="
(recommendation
? 'remove-redaction.dialog.content.list-item-false-recommendation'
: isFalsePositive
? 'remove-redaction.dialog.content.list-item-false-positive'
: 'remove-redaction.dialog.content.list-item'
)
| translate
: {
text: redactedTexts[0],
type: data.redactions[0].typeLabel,
context: data.falsePositiveContext[0]
}
| replaceNbsp
"
></span>
</ng-template>
<iqser-details-radio [options]="options" formControlName="option"></iqser-details-radio>
<div class="iqser-input-group w-450">

View File

@ -1,11 +1,10 @@
@use 'common-mixins';
.dialog-content {
height: 408px;
height: 470px;
}
cdk-virtual-scroll-viewport {
margin-top: 8px;
@include common-mixins.scroll-bar;
}

View File

@ -1,9 +1,12 @@
import { Component } from '@angular/core';
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, RemoveAnnotationOptions, RemoveRedactionOption } from '../../utils/dialog-options';
import {
getRemoveRedactionOptions,
RemoveAnnotationOptions,
RemoveRedactionOption,
RemoveRedactionOptions,
} from '../../utils/dialog-options';
import { RemoveRedactionData, RemoveRedactionResult } from '../../utils/dialog-types';
import { Roles } from '@users/roles';
import { DialogHelpModeKeys } from '../../utils/constants';
@ -17,58 +20,52 @@ export class RemoveRedactionDialogComponent extends IqserDialogComponent<
RemoveRedactionData,
RemoveRedactionResult
> {
#applyToAllDossiers: boolean;
readonly iconButtonTypes = IconButtonTypes;
readonly options: DetailsRadioOption<RemoveRedactionOption>[];
readonly recommendation: boolean;
readonly hint: boolean;
readonly skipped: boolean;
readonly redactedTexts: string[];
readonly options: DetailsRadioOption<RemoveRedactionOption>[] = getRemoveRedactionOptions(this.data);
readonly recommendation = this.data.redactions.every(redaction => redaction.isRecommendation);
readonly hint = this.data.redactions[0].HINT;
readonly skipped = this.data.redactions.some(annotation => annotation.isSkipped);
readonly redactedTexts = this.data.redactions.map(annotation => annotation.value);
readonly isImage = this.data.redactions.every(redaction => redaction.isImage);
protected readonly roles = Roles;
form!: UntypedFormGroup;
constructor(private readonly _formBuilder: FormBuilder) {
super();
this.recommendation = this.data.redactions[0].isRecommendation;
this.hint = this.data.redactions[0].HINT;
this.skipped = this.data.redactions.some(annotation => annotation.isSkipped);
this.options = getRemoveRedactionOptions(this.data);
this.redactedTexts = this.data.redactions.map(annotation => annotation.value);
this.form = this.#getForm();
this.#applyToAllDossiers = this.data.applyToAllDossiers ?? true;
this.form
.get('option')
.valueChanges.pipe(
tap(() => {
for (const option of this.options) {
if (option.extraOption) {
option.extraOption.checked = this.#applyToAllDossiers;
}
}
}),
takeUntilDestroyed(),
)
.subscribe();
}
get isFalsePositive(): boolean {
return this.form.get('option').value.value === RemoveAnnotationOptions['FALSE' + '_POSITIVE'];
return this.form.get('option').value.value === RemoveAnnotationOptions.FALSE_POSITIVE;
}
get helpButtonKey() {
if (this.hint) {
return DialogHelpModeKeys.HINT_REMOVE
return DialogHelpModeKeys.HINT_REMOVE;
}
if (this.recommendation) {
return DialogHelpModeKeys.RECOMMENDATION_REMOVE
return DialogHelpModeKeys.RECOMMENDATION_REMOVE;
}
if (this.skipped) {
return DialogHelpModeKeys.SKIPPED_REMOVE
return DialogHelpModeKeys.SKIPPED_REMOVE;
}
return DialogHelpModeKeys.REDACTION_REMOVE;
}
get defaultOption() {
const removeHereOption = this.options.find(option => option.value === RemoveRedactionOptions.ONLY_HERE);
if (!!removeHereOption && !removeHereOption.disabled) return removeHereOption;
return this.options[0];
}
get typeTranslationArg() {
return { type: this.hint ? 'hint' : this.recommendation ? 'recommendation' : 'redaction' };
}
get isBulk() {
return this.data.redactions.length > 1;
}
save(): void {
this.close(this.form.getRawValue());
}
@ -76,7 +73,7 @@ export class RemoveRedactionDialogComponent extends IqserDialogComponent<
#getForm() {
return this._formBuilder.group({
comment: [null],
option: [this.options[0]],
option: [this.defaultOption],
});
}
}

View File

@ -228,9 +228,16 @@ export class FileDataService extends EntitiesService<AnnotationWrapper, Annotati
const changeType = this.#getChangeLogType(entry, file);
if (entry.state === EntryStates.PENDING) {
const originalAnnotation = this.#findOriginalAnnotation(annotations, entry);
if (originalAnnotation) {
entry.oldState = originalAnnotation.entry.state;
originalAnnotation.pending = true;
}
}
const annotation = AnnotationWrapper.fromData(
entry,
entityLog.entityLogEntry,
dictionary,
changeType,
entityLog.legalBasis ?? [],
@ -303,4 +310,16 @@ export class FileDataService extends EntitiesService<AnnotationWrapper, Annotati
annotations.push(pendingAnnotation);
}
}
#findOriginalAnnotation(annotations: AnnotationWrapper[], pendingEntry: IEntityLogEntry) {
for (let i = annotations.length - 1; i >= 0; i--) {
const annotation = annotations[i];
if (annotation.positions[0].page !== pendingEntry.positions[0].pageNumber) {
return;
}
if (annotation.id === pendingEntry.id) {
return annotation;
}
}
}
}

View File

@ -177,14 +177,14 @@ export const getRemoveRedactionOptions = (
extraOption: !isDocumine
? {
label: translations.IN_DOSSIER.extraOptionLabel,
checked: applyToAllDossiers ?? true,
checked: redactions[0].isRecommendation && applyToAllDossiers,
hidden: !isApprover,
}
: null,
});
}
if (permissions.canMarkAsFalsePositive) {
if (data.redactions[0].isRecommendation) {
if (redactions[0].isRecommendation) {
options.push({
label: translations.DO_NOT_RECOMMEND.label,
description: isBulk ? translations.DO_NOT_RECOMMEND.descriptionBulk : translations.DO_NOT_RECOMMEND.description,
@ -198,7 +198,7 @@ export const getRemoveRedactionOptions = (
extraOption: !isDocumine
? {
label: translations.DO_NOT_RECOMMEND.extraOptionLabel,
checked: applyToAllDossiers ?? true,
checked: applyToAllDossiers,
hidden: !isApprover,
}
: null,
@ -217,8 +217,9 @@ export const getRemoveRedactionOptions = (
extraOption: !isDocumine
? {
label: translations.FALSE_POSITIVE.extraOptionLabel,
checked: applyToAllDossiers ?? true,
checked: false,
hidden: !isApprover,
description: translations.FALSE_POSITIVE.extraOptionDescription,
}
: null,
});

View File

@ -132,7 +132,7 @@ export class AnnotationDrawService {
return;
}
if (annotationWrapper.pending) {
if (annotationWrapper.pending && annotationWrapper.id.includes('pending')) {
const polylineAnnot = this._pdf.polyline();
polylineAnnot.ReadOnly = true;
polylineAnnot.StrokeColor = this.convertColor(annotationWrapper.color);
@ -140,8 +140,6 @@ export class AnnotationDrawService {
polylineAnnot.Id = annotationWrapper.id;
polylineAnnot.PageNumber = pageNumber;
polylineAnnot.Opacity = polylineAnnot.Id.endsWith('pending') ? 0 : 0.5;
console.log(polylineAnnot.Id);
console.log(polylineAnnot.Id.split('-'));
const points = this.#computePolylinePoints(annotationWrapper.positions, annotationWrapper.pageNumber);
for (let i = 0; i < points.length; i++) {
@ -190,7 +188,7 @@ export class AnnotationDrawService {
annotation.setCustomData('skipped', String(annotationWrapper.isSkipped));
annotation.setCustomData('changeLog', String(annotationWrapper.isChangeLogEntry));
annotation.setCustomData('changeLogRemoved', String(annotationWrapper.isRemoved));
annotation.setCustomData('opacity', String(!annotationWrapper.pending ? annotation.Opacity : annotation.Opacity / 2));
annotation.setCustomData('opacity', String(annotation.Opacity));
const redactionColor = this._defaultColorsService.getColor(dossierTemplateId, 'previewColor');
annotation.setCustomData('redactionColor', String(redactionColor));

View File

@ -48,6 +48,7 @@
[disabled]="disabled"
[label]="'edit-dossier-dialog.attributes.upload-image' | translate"
[type]="iconButtonTypes.dark"
[buttonId]="'upload-image-attribute-' + (attr.label | snakeCase)"
class="upload-button"
icon="iqser:upload"
></iqser-icon-button>

View File

@ -29,6 +29,7 @@ import { DossiersListingActionsComponent } from './components/dossiers-listing-a
import { IqserUsersModule } from '@iqser/common-ui/lib/users';
import { SideNavComponent, SmallChipComponent, StatusBarComponent } from '@iqser/common-ui/lib/shared';
import { SelectComponent } from '@shared/components/select/select.component';
import { SnakeCasePipe } from '@common-ui/pipes/snake-case.pipe';
const components = [
FileActionsComponent,
@ -67,6 +68,7 @@ const dialogs = [EditDossierDialogComponent, AssignReviewerApproverDialogCompone
IqserAllowDirective,
IqserDenyDirective,
SelectComponent,
SnakeCasePipe,
],
})
export class SharedDossiersModule {}

View File

@ -6,6 +6,7 @@ export interface DialogOption {
description: string;
descriptionBulk?: string;
extraOptionLabel?: string;
extraOptionDescription?: string;
}
export const redactTextTranslations: Record<'onlyHere' | 'inDossier', DialogOption> = {

View File

@ -20,6 +20,7 @@ export const removeRedactionTranslations: { [key in RemoveRedactionOption]: Dial
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'),
extraOptionDescription: _('remove-redaction.dialog.content.options.false-positive.extraOptionDescription'),
},
DO_NOT_RECOMMEND: {
label: _('remove-redaction.dialog.content.options.do-not-recommend.label'),

View File

@ -2017,19 +2017,19 @@
"list-item-false-positive": "",
"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": "",
"label": "False positive"
"label": "Remove from dossier in this context"
},
"in-dossier": {
"description": "Do not annotate ''{value}'' as ''{type}'' in any dossier.",
"description": "Do not annotate the term in this dossier.",
"description-bulk": "",
"label": "No longer annotate as ''{type}''",
"label": "Do not annotate as <i>{type}</i>",
"label-bulk": ""
},
"only-here": {
"description": "Do not annotate ''{value}'' at this position in the current document.",
"description-bulk": "Do not annotate the selected terms at this position in the current document.",
"description": "Do not annotate the term at this position in the current document.",
"description-bulk": "Do not auto-annotate the selected terms at this position in the current document.",
"label": "Remove here"
}
},
@ -2048,29 +2048,29 @@
"comment": "Comment",
"comment-placeholder": "Add remarks or mentions...",
"list-item": "{text}",
"list-item-false-positive": "''{text}'' in the context: ''{context}''",
"list-item-false-positive": "<b>{text}</b> as <i>{type}</i> in the context: <b>{context}</b>",
"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 terms 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 terms in any document of this dossier.",
"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-bulk": "Do not redact the selected terms in their respective 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 these redactions as false-positives. The terms will not be redacted in this dossier if they occur in the same context.",
"extraOptionLabel": "Apply to all active and future dossiers",
"label": "False positive"
"label": "Remove from dossier in this context"
},
"in-dossier": {
"description": "Do not {type, select, hint{annotate} other{redact}} ''{value}'' in any document of the current dossier.",
"description-bulk": "Do not redact the selected terms as their respective types in any dossier.",
"description": "Do not {type, select, hint{annotate} other{redact}} the selected term in any document of this dossier.",
"description-bulk": "Do not auto-redact the selected term in this dossier.",
"extraOptionLabel": "Apply to all active and future dossiers",
"label": "Remove from dossier",
"label-bulk": "No longer redact in any dossier"
"label-bulk": "Remove from dossier"
},
"only-here": {
"description": "Do not {type, select, hint{annotate} other{redact}} ''{value}'' at this position in the current document.",
"description": "Do not {type, select, hint{annotate} other{redact}} the term 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"
}

View File

@ -2017,19 +2017,19 @@
"list-item-false-positive": "",
"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": "",
"label": "False positive"
"label": "Remove from dossier in this context"
},
"in-dossier": {
"description": "Do not annotate ''{value}'' as ''{type}'' in any dossier.",
"description": "Do not annotate the term in this dossier.",
"description-bulk": "",
"label": "No longer annotate as ''{type}''",
"label": "Do not annotate as <i>{type}</i>",
"label-bulk": ""
},
"only-here": {
"description": "Do not annotate ''{value}'' at this position in the current document.",
"description-bulk": "Do not annotate the selected terms at this position in the current document.",
"description": "Do not annotate the term at this position in the current document.",
"description-bulk": "Do not auto-annotate the selected terms at this position in the current document.",
"label": "Remove here"
}
},
@ -2048,34 +2048,37 @@
"comment": "Comment",
"comment-placeholder": "Add remarks or mentions...",
"list-item": "{text}",
"list-item-false-positive": "''{text}'' in the context: ''{context}''",
"list-item-false-positive": "<b>{text}</b> as <i>{type}</i> in the context: <b>{context}</b>",
"list-item-false-recommendation": "<b>{text}</b> as <i>{type}</i>",
"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 terms 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 terms in any document of this dossier.",
"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-bulk": "Do not redact the selected terms in their respective 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 these redactions as false-positives. The terms will not be redacted in this dossier if they occur in the same context.",
"extraOptionDescription": "<i>Dossier template access is required to reverse this action. As a regular user you can only reverse it for the current dossier.</i>",
"extraOptionLabel": "Apply to all active and future dossiers",
"label": "False positive"
"label": "Remove from dossier in this context"
},
"in-dossier": {
"description": "Do not {type, select, hint{annotate} other{redact}} ''{value}'' in any document of the current dossier.",
"description-bulk": "Do not redact the selected terms as their respective types in any dossier.",
"description": "Do not {type, select, hint{annotate} other{redact}} the selected term in any document of this dossier.",
"description-bulk": "Do not auto-redact the selected term in this dossier.",
"extraOptionLabel": "Apply to all active and future dossiers",
"label": "Remove from dossier",
"label-bulk": "No longer redact in any dossier"
"label-bulk": "Remove from dossier"
},
"only-here": {
"description": "Do not {type, select, hint{annotate} other{redact}} ''{value}'' at this position in the current document.",
"description": "Do not {type, select, hint{annotate} other{redact}} the term 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}"
"redacted-text": "Selected {type}",
"redacted-text-bulk": "Selected {type, select, redaction{redactions} recommendation{recommendations} other{hints}}"
},
"title": "Remove {type, select, redaction{redaction} recommendation{recommendation} other{hint}}",
"title-bulk": "Remove {type, select, redaction{redactions} recommendation{recommendations} other{hints}}"

View File

@ -2049,6 +2049,7 @@
"comment-placeholder": "Add remarks or mentions...",
"list-item": "",
"list-item-false-positive": "",
"list-item-false-recommendation": "",
"options": {
"do-not-recommend": {
"description": "Do not recommend ''{value}'' as {type} in any document of the current dossier.",
@ -2059,6 +2060,7 @@
"false-positive": {
"description": "''{value}'' is not a {type} in this context: ''{context}''.",
"description-bulk": "",
"extraOptionDescription": "",
"extraOptionLabel": "Apply to all dossiers",
"label": "False positive"
},
@ -2075,7 +2077,8 @@
"label": "Remove here"
}
},
"redacted-text": ""
"redacted-text": "",
"redacted-text-bulk": ""
},
"title": "Remove {type}",
"title-bulk": ""

@ -1 +1 @@
Subproject commit 292573f3b3766a2e2ffef4be6d6b702d779b259e
Subproject commit 48a5160d6fccfe72de2e024e4359a97cbc52c942