Merge remote-tracking branch 'origin/master' into RED-3313

This commit is contained in:
Dan Percic 2022-03-03 23:04:52 +02:00
commit 7a39ba96ca
26 changed files with 365 additions and 197 deletions

View File

@ -2,28 +2,17 @@ import { annotationTypesTranslations } from '../../translations/annotation-types
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { IComment, IManualChange, ImportedRedaction, IPoint, IRectangle, LogEntryStatus, ManualRedactionType } from '@red/domain';
import { RedactionLogEntry } from '@models/file/redaction-log.entry';
export type AnnotationSuperType =
| 'text-highlight'
| 'suggestion-change-legal-basis'
| 'suggestion-recategorize-image'
| 'suggestion-add-dictionary'
| 'suggestion-force-redaction'
| 'suggestion-force-hint'
| 'suggestion-resize'
| 'suggestion-remove-dictionary'
| 'suggestion-add'
| 'suggestion-remove'
| 'ignored-hint'
| 'skipped'
| 'redaction'
| 'manual-redaction'
| 'recommendation'
| 'hint'
| 'declined-suggestion';
import {
FalsePositiveSuperTypes,
LowLevelFilterTypes,
SuggestionAddSuperTypes,
SuggestionsSuperTypes,
SuperType,
SuperTypes,
} from '@models/file/super-types';
export class AnnotationWrapper {
superType: AnnotationSuperType;
superType: SuperType;
typeValue: string;
recategorizationType: string;
@ -88,7 +77,7 @@ export class AnnotationWrapper {
}
get canBeMarkedAsFalsePositive() {
return (this.isRecommendation || this.superType === 'redaction') && !this.isImage;
return (this.isRecommendation || this.superType === SuperTypes.Redaction) && !this.isImage;
}
get isSuperTypeBasedColor() {
@ -96,7 +85,7 @@ export class AnnotationWrapper {
}
get isSkipped() {
return this.superType === 'skipped';
return this.superType === SuperTypes.Skipped;
}
get isImage() {
@ -112,13 +101,7 @@ export class AnnotationWrapper {
}
get topLevelFilter() {
return (
this.superType !== 'hint' &&
this.superType !== 'redaction' &&
this.superType !== 'recommendation' &&
this.superType !== 'ignored-hint' &&
this.superType !== 'skipped'
);
return !LowLevelFilterTypes[this.superType];
}
get filterKey() {
@ -129,26 +112,12 @@ export class AnnotationWrapper {
return this.topLevelFilter ? this.superType : this.superType + this.type;
}
get isManuallySkipped() {
return this.isSkipped && this.manual;
}
get isFalsePositive() {
return (
this.type?.toLowerCase() === 'false_positive' &&
(this.superType === 'skipped' ||
this.superType === 'hint' ||
this.superType === 'ignored-hint' ||
this.superType === 'redaction')
);
}
get isManualRedaction() {
return this.superType === 'manual-redaction';
return this.type?.toLowerCase() === 'false_positive' && !!FalsePositiveSuperTypes[this.superType];
}
get isDeclinedSuggestion() {
return this.superType === 'declined-suggestion';
return this.superType === SuperTypes.DeclinedSuggestion;
}
get isApproved() {
@ -156,53 +125,39 @@ export class AnnotationWrapper {
}
get isHint() {
return this.superType === 'hint';
return this.superType === SuperTypes.Hint;
}
get isHighlight() {
return this.superType === 'text-highlight';
return this.superType === SuperTypes.TextHighlight;
}
get isIgnoredHint() {
return this.superType === 'ignored-hint';
return this.superType === SuperTypes.IgnoredHint;
}
get isRedacted() {
return this.superType === 'redaction' || this.superType === 'manual-redaction';
return this.superType === SuperTypes.Redaction || this.superType === SuperTypes.ManualRedaction;
}
get isSuggestion() {
return (
this.isSuggestionAdd ||
this.isSuggestionRemove ||
this.isSuggestionChangeLegalBasis ||
this.isSuggestionRecategorizeImage ||
this.isSuggestionResize
);
return !!SuggestionsSuperTypes[this.superType];
}
get isSuggestionResize() {
return this.superType === 'suggestion-resize';
return this.superType === SuperTypes.SuggestionResize;
}
get isSuggestionRecategorizeImage() {
return this.superType === 'suggestion-recategorize-image';
}
get isSuggestionChangeLegalBasis() {
return this.superType === 'suggestion-change-legal-basis';
return this.superType === SuperTypes.SuggestionRecategorizeImage;
}
get isSuggestionAdd() {
return (
this.superType === 'suggestion-add' ||
this.superType === 'suggestion-add-dictionary' ||
this.superType === 'suggestion-force-redaction'
);
return !!SuggestionAddSuperTypes[this.superType];
}
get isSuggestionRemove() {
return this.superType === 'suggestion-remove' || this.superType === 'suggestion-remove-dictionary';
return this.superType === SuperTypes.SuggestionRemove || this.superType === SuperTypes.SuggestionRemoveDictionary;
}
get isModifyDictionary() {
@ -221,11 +176,11 @@ export class AnnotationWrapper {
}
get isConvertedRecommendation() {
return this.isRecommendation && this.superType === 'suggestion-add-dictionary';
return this.isRecommendation && this.superType === SuperTypes.SuggestionAddDictionary;
}
get isRecommendation() {
return this.superType === 'recommendation';
return this.superType === SuperTypes.Recommendation;
}
get id() {
@ -402,7 +357,7 @@ export class AnnotationWrapper {
redactionLogEntry: RedactionLogEntry,
lastManualChange: IManualChange,
isHintDictionary: boolean,
): AnnotationSuperType {
): SuperType {
switch (lastManualChange.manualRedactionType) {
case ManualRedactionType.ADD_LOCALLY:
switch (lastManualChange.annotationStatus) {

View File

@ -0,0 +1,57 @@
import { ValuesOf } from '@iqser/common-ui';
export const SuperTypes = {
TextHighlight: 'text-highlight',
SuggestionChangeLegalBasis: 'suggestion-change-legal-basis',
SuggestionRecategorizeImage: 'suggestion-recategorize-image',
SuggestionAddDictionary: 'suggestion-add-dictionary',
SuggestionForceRedaction: 'suggestion-force-redaction',
SuggestionForceHint: 'suggestion-force-hint',
SuggestionResize: 'suggestion-resize',
SuggestionRemoveDictionary: 'suggestion-remove-dictionary',
SuggestionAdd: 'suggestion-add',
SuggestionRemove: 'suggestion-remove',
IgnoredHint: 'ignored-hint',
Skipped: 'skipped',
Redaction: 'redaction',
ManualRedaction: 'manual-redaction',
Recommendation: 'recommendation',
Hint: 'hint',
DeclinedSuggestion: 'declined-suggestion',
} as const;
export type SuperType = ValuesOf<typeof SuperTypes>;
export const LowLevelFilterTypes = {
[SuperTypes.Hint]: true,
[SuperTypes.Redaction]: true,
[SuperTypes.Recommendation]: true,
[SuperTypes.IgnoredHint]: true,
[SuperTypes.Skipped]: true,
} as const;
export const FalsePositiveSuperTypes = {
[SuperTypes.Hint]: true,
[SuperTypes.Redaction]: true,
[SuperTypes.IgnoredHint]: true,
[SuperTypes.Skipped]: true,
} as const;
export const SuggestionAddSuperTypes = {
[SuperTypes.SuggestionAdd]: true,
[SuperTypes.SuggestionAddDictionary]: true,
[SuperTypes.SuggestionForceRedaction]: true,
[SuperTypes.SuggestionForceHint]: true,
} as const;
export const SuggestionsSuperTypes = {
[SuperTypes.SuggestionAdd]: true,
[SuperTypes.SuggestionAddDictionary]: true,
[SuperTypes.SuggestionForceRedaction]: true,
[SuperTypes.SuggestionForceHint]: true,
[SuperTypes.SuggestionChangeLegalBasis]: true,
[SuperTypes.SuggestionRecategorizeImage]: true,
[SuperTypes.SuggestionRemove]: true,
[SuperTypes.SuggestionRemoveDictionary]: true,
[SuperTypes.SuggestionResize]: true,
} as const;

View File

@ -3,11 +3,6 @@
<div class="description" translate="reports-screen.description"></div>
<div class="document-setup">
<div class="all-caps-label" translate="reports-screen.document-setup-heading"></div>
<div translate="reports-screen.document-setup-description"></div>
</div>
<div *ngIf="placeholders$ | async as placeholders" class="placeholders">
<div class="all-caps-label" translate="reports-screen.table-header.placeholders"></div>
<div class="all-caps-label" translate="reports-screen.table-header.description"></div>

View File

@ -71,8 +71,7 @@
.content-container {
> .heading-xl,
> .description,
> .document-setup {
> .description {
margin-bottom: 24px;
> .all-caps-label {

View File

@ -4,10 +4,28 @@
<div class="dialog-content">
<ng-container *ngIf="!data.manualRedactionEntryWrapper.manualRedactionEntry.rectangle">
<div class="iqser-input-group">
<div class="iqser-input-group w-400">
<label translate="manual-annotation.dialog.content.text"></label>
<div class="flex-align-items-center" *ngIf="!isEditingSelectedText">
{{ data.manualRedactionEntryWrapper.manualRedactionEntry.value }}
<iqser-circle-button
*ngIf="isDictionaryRequest"
(action)="isEditingSelectedText = true"
[tooltip]="'manual-annotation.dialog.content.edit-selected-text' | translate"
[type]="circleButtonTypes.dark"
icon="iqser:edit"
tooltipPosition="below"
></iqser-circle-button>
</div>
<iqser-input-with-action
*ngIf="isEditingSelectedText"
(action)="isEditingSelectedText = false"
[(value)]="data.manualRedactionEntryWrapper.manualRedactionEntry.value"
[placeholder]="'manual-annotation.dialog.content.selected-text' | translate"
icon="iqser:check"
width="full"
></iqser-input-with-action>
</div>
{{ format(data.manualRedactionEntryWrapper.manualRedactionEntry.value) }}
</ng-container>
<ng-container *ngIf="data.manualRedactionEntryWrapper.manualRedactionEntry.rectangle">

View File

@ -8,7 +8,7 @@ import { JustificationsService } from '@services/entity-services/justifications.
import { Dictionary, Dossier, IAddRedactionRequest } from '@red/domain';
import { ActiveDossiersService } from '@services/dossiers/active-dossiers.service';
import { DictionaryService } from '@shared/services/dictionary.service';
import { BaseDialogComponent } from '@iqser/common-ui';
import { BaseDialogComponent, CircleButtonTypes } from '@iqser/common-ui';
import { firstValueFrom } from 'rxjs';
export interface LegalBasisOption {
@ -22,9 +22,11 @@ export interface LegalBasisOption {
styleUrls: ['./manual-annotation-dialog.component.scss'],
})
export class ManualAnnotationDialogComponent extends BaseDialogComponent implements OnInit {
readonly circleButtonTypes = CircleButtonTypes;
isDocumentAdmin: boolean;
isDictionaryRequest: boolean;
isFalsePositiveRequest: boolean;
isEditingSelectedText: boolean = false;
possibleDictionaries: Dictionary[] = [];
legalOptions: LegalBasisOption[] = [];
@ -66,7 +68,7 @@ export class ManualAnnotationDialogComponent extends BaseDialogComponent impleme
}
get disabled() {
return this.form.invalid;
return this.form.invalid || this.isEditingSelectedText;
}
get commentIsMandatory() {
@ -87,6 +89,9 @@ export class ManualAnnotationDialogComponent extends BaseDialogComponent impleme
}));
this.legalOptions.sort((a, b) => a.label.localeCompare(b.label));
if (!this.data.manualRedactionEntryWrapper.manualRedactionEntry.rectangle) {
this._formatSelectedTextValue();
}
}
save() {
@ -94,12 +99,13 @@ export class ManualAnnotationDialogComponent extends BaseDialogComponent impleme
this._dialogRef.close(this.data.manualRedactionEntryWrapper);
}
format(value: string) {
return value.replace(
// eslint-disable-next-line no-control-regex,max-len
/([^\s\d-]{2,})[-\u00AD]\u000D\u000A|[\u000A\u000B\u000C\u000D\u0085\u2028\u2029]/gi,
'$1',
);
private _formatSelectedTextValue() {
this.data.manualRedactionEntryWrapper.manualRedactionEntry.value =
this.data.manualRedactionEntryWrapper.manualRedactionEntry.value.replace(
// eslint-disable-next-line no-control-regex,max-len
/([^\s\d-]{2,})[-\u00AD]\u000D\u000A|[\u000A\u000B\u000C\u000D\u0085\u2028\u2029]/gi,
'$1',
);
}
private _getForm(): FormGroup {

View File

@ -149,7 +149,7 @@
[tooltip]="'annotation-actions.remove-annotation.remove-from-dict' | translate"
[type]="buttonType"
icon="red:remove-from-dict"
iqserHelpMode="skipped_remove_from_dictionary"
iqserHelpMode="remove_from_dictionary"
[scrollableParentView]="scrollableParentView"
></iqser-circle-button>

View File

@ -39,7 +39,7 @@
</div>
</div>
<div *ngIf="multiSelectActive$ | async" class="multi-select">
<div *ngIf="multiSelectService.active$ | async" class="multi-select">
<div class="selected-wrapper">
<iqser-round-checkbox
(click)="!!selectedAnnotations?.length && selectAnnotations.emit()"
@ -68,7 +68,7 @@
></iqser-circle-button>
</div>
<div [class.lower-height]="(multiSelectActive$ | async) || (state.isReadonly$ | async)" class="annotations-wrapper">
<div [class.lower-height]="(multiSelectService.active$ | async) || (state.isReadonly$ | async)" class="annotations-wrapper">
<div
#quickNavigation
(keydown)="preventKeyDefault($event)"
@ -135,7 +135,7 @@
</span>
</span>
<div *ngIf="multiSelectActive$ | async">
<div *ngIf="multiSelectService.active$ | async">
<div
(click)="selectAllOnActivePage()"
class="all-caps-label primary pointer"

View File

@ -53,12 +53,10 @@ export class FileWorkloadComponent {
displayedAnnotations = new Map<number, AnnotationWrapper[]>();
@Input() selectedAnnotations: AnnotationWrapper[];
@Input() activeViewerPage: number;
@Input() shouldDeselectAnnotationsOnPageChange: boolean;
@Input() dialogRef: MatDialogRef<unknown>;
@Input() file!: File;
@Input() annotationActionsTemplate: TemplateRef<unknown>;
@Input() viewer: WebViewerInstance;
@Output() readonly shouldDeselectAnnotationsOnPageChangeChange = new EventEmitter<boolean>();
@Output() readonly selectAnnotations = new EventEmitter<AnnotationWrapper[]>();
@Output() readonly deselectAnnotations = new EventEmitter<AnnotationWrapper[]>();
@Output() readonly selectPage = new EventEmitter<number>();
@ -66,7 +64,6 @@ export class FileWorkloadComponent {
displayedPages: number[] = [];
pagesPanelActive = true;
readonly displayedAnnotations$: Observable<Map<number, AnnotationWrapper[]>>;
readonly multiSelectActive$: Observable<boolean>;
readonly multiSelectInactive$: Observable<boolean>;
readonly showExcludedPages$: Observable<boolean>;
readonly title$: Observable<string>;
@ -88,7 +85,6 @@ export class FileWorkloadComponent {
private readonly _annotationProcessingService: AnnotationProcessingService,
) {
this.displayedAnnotations$ = this._displayedAnnotations$;
this.multiSelectActive$ = this._multiSelectActive$;
this.multiSelectInactive$ = this._multiSelectInactive$;
this.showExcludedPages$ = this._showExcludedPages$;
this.isHighlights$ = this._isHighlights$;
@ -140,16 +136,6 @@ export class FileWorkloadComponent {
);
}
private get _multiSelectActive$() {
const disableDeselectOnPageChange = (value: boolean) => {
if (value) {
this.shouldDeselectAnnotationsOnPageChange = false;
this.shouldDeselectAnnotationsOnPageChangeChange.emit(false);
}
};
return this.multiSelectService.active$.pipe(tap(disableDeselectOnPageChange), shareDistinctLast());
}
private get _firstSelectedAnnotation() {
return this.selectedAnnotations?.length ? this.selectedAnnotations[0] : null;
}
@ -303,15 +289,11 @@ export class FileWorkloadComponent {
// Displayed page doesn't have annotations
if ($event.key === 'ArrowDown') {
const nextPage = this._nextPageWithAnnotations();
this.shouldDeselectAnnotationsOnPageChange = false;
this.shouldDeselectAnnotationsOnPageChangeChange.emit(false);
this.selectAnnotations.emit([this.displayedAnnotations.get(nextPage)[0]]);
return;
}
const prevPage = this._prevPageWithAnnotations();
this.shouldDeselectAnnotationsOnPageChange = false;
this.shouldDeselectAnnotationsOnPageChangeChange.emit(false);
const prevPageAnnotations = this.displayedAnnotations.get(prevPage);
this.selectAnnotations.emit([prevPageAnnotations[prevPageAnnotations.length - 1]]);
return;
@ -319,6 +301,8 @@ export class FileWorkloadComponent {
const page = this._firstSelectedAnnotation.pageNumber;
const pageIdx = this.displayedPages.indexOf(page);
const nextPageIdx = pageIdx + 1;
const previousPageIdx = pageIdx - 1;
const annotationsOnPage = this.displayedAnnotations.get(page);
const idx = annotationsOnPage.findIndex(a => a.id === this._firstSelectedAnnotation.id);
@ -326,22 +310,33 @@ export class FileWorkloadComponent {
if (idx + 1 !== annotationsOnPage.length) {
// If not last item in page
this.selectAnnotations.emit([annotationsOnPage[idx + 1]]);
} else if (pageIdx + 1 < this.displayedPages.length) {
} else if (nextPageIdx < this.displayedPages.length) {
// If not last page
const nextPageAnnotations = this.displayedAnnotations.get(this.displayedPages[pageIdx + 1]);
this.shouldDeselectAnnotationsOnPageChange = false;
this.shouldDeselectAnnotationsOnPageChangeChange.emit(false);
this.selectAnnotations.emit([nextPageAnnotations[0]]);
for (let i = nextPageIdx; i < this.displayedPages.length; i++) {
const nextPageAnnotations = this.displayedAnnotations.get(this.displayedPages[i]);
if (nextPageAnnotations) {
this.selectAnnotations.emit([nextPageAnnotations[0]]);
break;
}
}
}
} else if (idx !== 0) {
return;
}
if (idx !== 0) {
// If not first item in page
this.selectAnnotations.emit([annotationsOnPage[idx - 1]]);
} else if (pageIdx) {
return this.selectAnnotations.emit([annotationsOnPage[idx - 1]]);
}
if (pageIdx) {
// If not first page
const prevPageAnnotations = this.displayedAnnotations.get(this.displayedPages[pageIdx - 1]);
this.shouldDeselectAnnotationsOnPageChange = false;
this.shouldDeselectAnnotationsOnPageChangeChange.emit(false);
this.selectAnnotations.emit([prevPageAnnotations[prevPageAnnotations.length - 1]]);
for (let i = previousPageIdx; i > 0; i--) {
const prevPageAnnotations = this.displayedAnnotations.get(this.displayedPages[i]);
if (prevPageAnnotations) {
this.selectAnnotations.emit([prevPageAnnotations[prevPageAnnotations.length - 1]]);
break;
}
}
}
}

View File

@ -67,7 +67,6 @@ export class PdfViewerComponent extends AutoUnsubscribe implements OnInit, OnCha
@Input() dossier: Dossier;
@Input() canPerformActions = false;
@Input() annotations: AnnotationWrapper[];
@Input() shouldDeselectAnnotationsOnPageChange = true;
@Output() readonly fileReady = new EventEmitter();
@Output() readonly annotationSelected = new EventEmitter<string[]>();
@Output() readonly manualAnnotationRequested = new EventEmitter<ManualRedactionEntryWrapper>();
@ -266,9 +265,7 @@ export class PdfViewerComponent extends AutoUnsubscribe implements OnInit, OnCha
});
this.documentViewer.addEventListener('pageNumberUpdated', (pageNumber: number) => {
if (this.shouldDeselectAnnotationsOnPageChange) {
this.utils.deselectAllAnnotations();
}
this.utils.deselectAllAnnotations();
this._ngZone.run(() => this.pageChanged.emit(pageNumber));
return this._handleCustomActions();
});

View File

@ -20,8 +20,8 @@
<redaction-file-actions
[file]="file"
type="file-preview"
fileActionsHelpModeKey="editor_document_features"
type="file-preview"
></redaction-file-actions>
<iqser-circle-button
@ -72,7 +72,6 @@
[canPerformActions]="canPerformAnnotationActions$ | async"
[class.hidden]="!ready"
[dossier]="dossier"
[shouldDeselectAnnotationsOnPageChange]="shouldDeselectAnnotationsOnPageChange"
></redaction-pdf-viewer>
</div>
@ -93,7 +92,6 @@
(selectAnnotations)="selectAnnotations($event)"
(selectPage)="selectPage($event)"
*ngIf="!file.excluded"
[(shouldDeselectAnnotationsOnPageChange)]="shouldDeselectAnnotationsOnPageChange"
[activeViewerPage]="activeViewerPage"
[annotationActionsTemplate]="annotationActionsTemplate"
[annotations]="visibleAnnotations"

View File

@ -65,7 +65,6 @@ export class FilePreviewScreenComponent extends AutoUnsubscribe implements OnIni
dialogRef: MatDialogRef<unknown>;
fullScreen = false;
shouldDeselectAnnotationsOnPageChange = true;
selectedAnnotations: AnnotationWrapper[] = [];
displayPdfViewer = false;
activeViewerPage: number = null;
@ -394,9 +393,7 @@ export class FilePreviewScreenComponent extends AutoUnsubscribe implements OnIni
}
this._scrollViews();
if (!this.multiSelectService.isActive) {
this.shouldDeselectAnnotationsOnPageChange = true;
}
this.multiSelectService.deactivate();
// Add current page in URL query params
const extras: NavigationExtras = {

View File

@ -8,8 +8,8 @@ import { IViewedPage } from '@red/domain';
@Injectable()
export class AnnotationProcessingService {
static secondaryAnnotationFilters(viewedPages: IViewedPage[]): INestedFilter[] {
const _viewedPages = viewedPages.map(page => page.page);
static secondaryAnnotationFilters(viewedPages?: IViewedPage[]): INestedFilter[] {
const _viewedPages = viewedPages ? viewedPages.map(page => page.page) : [];
return [
{
id: 'with-comments',

View File

@ -151,7 +151,7 @@ export class FileActionsComponent extends AutoUnsubscribe implements OnDestroy,
type: ActionTypes.circleBtn,
action: ($event: MouseEvent) => this._triggerImportRedactions($event),
tooltip: _('dossier-overview.import-redactions'),
icon: 'iqser:upload',
icon: 'red:import_redactions',
show: this.showImportRedactions,
},
{

View File

@ -37,6 +37,7 @@ export class IconsModule {
'fullscreen',
'html-file',
'info',
'import_redactions',
'lightning',
'logo',
'nav-first',

View File

@ -99,11 +99,11 @@ export class DictionaryService extends EntitiesService<Dictionary, IDictionary>
const queryParams = dossierId ? [{ key: 'dossierId', value: dossierId }] : undefined;
return this._post(body, url, queryParams).pipe(
catchError((error: HttpErrorResponse) => this.#addUpdateDictionaryErrorToast(error)),
switchMap(dictionary =>
switchMap(() =>
forkJoin([
this._dossierTemplateStatsService.getFor([dossierTemplateId]),
this.loadDictionaryDataForDossierTemplate(dossierTemplateId),
]).pipe(map(() => this._dictionariesMapService.get(dictionary.dossierTemplateId, dictionary.type))),
]).pipe(map(() => this._dictionariesMapService.get(dossierTemplateId, type))),
),
);
}

View File

@ -25,7 +25,7 @@ export class PermissionsService {
}
displayReanalyseBtn(dossier: Dossier): boolean {
return dossier.isActive && this.isApprover(dossier) && this._filesMapService.get(dossier.dossierId).length > 0;
return this.isApprover(dossier) && !!this._filesMapService.get(dossier.dossierId).find(f => f.analysisRequired);
}
canUploadFiles(dossier: Dossier): boolean {

View File

@ -1,7 +1,7 @@
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { AnnotationSuperType } from '@models/file/annotation.wrapper';
import { SuperType } from '@models/file/super-types';
export const annotationTypesTranslations: { [key in AnnotationSuperType]: string } = {
export const annotationTypesTranslations: { [key in SuperType]: string } = {
'text-highlight': _('annotation-type.text-highlight'),
'declined-suggestion': _('annotation-type.declined-suggestion'),
hint: _('annotation-type.hint'),

View File

@ -1,6 +1,6 @@
import { AnnotationSuperType } from '../../models/file/annotation.wrapper';
import { SuperType } from '../../models/file/super-types';
export const SuperTypeSorter: { [key in AnnotationSuperType]: number } = {
export const SuperTypeSorter: { [key in SuperType]: number } = {
'text-highlight': 100,
'suggestion-change-legal-basis': 14,
'suggestion-force-redaction': 15,

View File

@ -119,8 +119,8 @@
"it": "",
"fr": ""
},
"skipped_remove_from_dictionary": {
"en": "/en/index-en.html?contextId=skipped_remove_from_dictionary",
"remove_from_dictionary": {
"en": "/en/index-en.html?contextId=remove_from_dictionary",
"de": "",
"it": "",
"fr": ""

View File

@ -1,10 +1,13 @@
{
"accept-recommendation-dialog": {
"header": "",
"multiple-values": ""
},
"account-settings": "Account Einstellungen",
"actions": {
"all": "Alle",
"none": "Keine"
},
"active": "Aktiv",
"add-dossier-dialog": {
"actions": {
"save": "Speichern",
@ -68,6 +71,16 @@
"save": "Attribut speichern",
"title": "{type, select, edit{Dossier-Attribut {name} bearbeiten} create{Neues Dossier-Attribut hinzufügen} other{}}"
},
"add-edit-dossier-state": {
"form": {
"color": "",
"color-placeholder": "",
"name": "",
"name-placeholder": ""
},
"save": "",
"title": ""
},
"add-edit-dossier-template": {
"error": {
"conflict": "Dossiervorlage konnte nicht erstellt werden: Es existiert bereits eine Dossiervorlage mit demselben Namen.",
@ -141,10 +154,6 @@
"settings": "Einstellungen"
},
"annotation": "Anmerkung",
"references": {
"singular": "",
"plural": ""
},
"annotation-actions": {
"accept-recommendation": {
"label": "Empfehlung annehmen"
@ -155,15 +164,12 @@
"edit-reason": {
"label": "Begründung bearbeiten"
},
"force-redaction": {
"label": "Schwärzung erzwingen"
},
"see-references": {
"label": ""
},
"force-hint": {
"label": "Hinweis erzwingen"
},
"force-redaction": {
"label": "Schwärzung erzwingen"
},
"hide": "Ausblenden",
"message": {
"dictionary": {
@ -268,11 +274,15 @@
"resize": {
"label": "Größe ändern"
},
"see-references": {
"label": ""
},
"show": "Zeigen",
"undo": "Rückgängig"
},
"annotation-changes": {
"forced": "Redaktion erzwungen",
"forced-hint": "",
"forced-redaction": "",
"header": "Manuelle Änderungen:",
"legal-basis": "Grund geändert",
"recategorized": "Bildkategorie geändert",
@ -295,14 +305,15 @@
"suggestion-add": "Vorschlag für Schwärzung",
"suggestion-add-dictionary": "Vorschlag für neuen Wörterbucheintrag",
"suggestion-change-legal-basis": "Vorschlag für Änderung der Rechtsgrundlage",
"suggestion-force-hint": "",
"suggestion-force-redaction": "Vorschlag für erzwungene Schwärzung",
"suggestion-recategorize-image": "Vorschlag für Rekategorisierung eines Bilds",
"suggestion-remove": "Vorschlagen, die Schwärzung zu entfernen",
"suggestion-remove-dictionary": "Vorschlag für Löschung eines Wörterbucheintrags",
"suggestion-resize": "Vorgeschlagene Größenänderung"
"suggestion-resize": "Vorgeschlagene Größenänderung",
"text-highlight": ""
},
"annotations": "Anmerkungen",
"archived": "Archiviert",
"assign-dossier-owner": {
"dialog": {
"approvers": "Genehmiger",
@ -310,7 +321,6 @@
"no-reviewers": "Es gibt noch keine Reviewer.\nBitte aus der Liste unten auswählen.",
"reviewers": "Reviewer",
"search": "Suche ...",
"select-below": "Wählen Sie aus der Liste unten aus.",
"single-user": "Besitzer"
}
},
@ -384,6 +394,7 @@
},
"header": "Begründung für die Schwärzung bearbeiten"
},
"color": "",
"comments": {
"add-comment": "Kommentar eingeben",
"comments": "{count} {count, plural, one{Kommentar} other{Kommentare}}",
@ -399,6 +410,18 @@
}
},
"configurations": "Einstellungen",
"confirm-delete-dossier-state": {
"cancel": "",
"delete": "",
"delete-replace": "",
"form": {
"status": "",
"status-placeholder": ""
},
"suggestion": "",
"title": "",
"warning": ""
},
"confirm-delete-file-attribute": {
"cancel": "{count, plural, one{Attribut} other{Attribute}} behalten",
"delete": "{count, plural, one{Attribut} other{Attribute}} löschen",
@ -470,18 +493,25 @@
"question": "Möchten Sie {filesCount, plural, one{dieses Dokument} other{diese Dokumente}} wirklich löschen?",
"title": "{filesCount, plural, one{{fileName}} other{ausgewählte Dokumente}} löschen"
},
"report-template-same-name": {
"confirmation-text": "Ja. Hochladen fortsetzen",
"deny-text": "Nein. Hochladen abbrechen",
"question": "<b>{fileName}</b>",
"title": "Hochladen von Berichtsvorlagen"
},
"unsaved-changes": {
"confirmation-text": "",
"details": "",
"discard-changes-text": "",
"question": "",
"title": ""
},
"upload-report-template": {
"alternate-confirmation-text": "Als Bericht für mehrere Dokumente hochladen",
"confirmation-text": "Als Bericht für ein Dokument hochladen",
"deny-text": "Uploads abbrechen",
"question": "Wählen Sie bitte aus, ob <b>{fileName}</b> eine Berichtsvorlage für eine oder für mehrere Dateien ist",
"title": "Upload der Berichtsvorlage"
},
"report-template-same-name": {
"confirmation-text": "Ja. Hochladen fortsetzen",
"deny-text": "Nein. Hochladen abbrechen",
"question": "<b>{fileName}</b>",
"title": "Hochladen von Berichtsvorlagen"
}
},
"content": "Begründung",
@ -616,7 +646,6 @@
"title": "Datei-Attribute anlegen"
},
"dossier": "Dossier",
"dossier-states": "",
"dossier-attribute-types": {
"date": "Datum",
"image": "Bild",
@ -701,10 +730,11 @@
"total-people": "Anzahl der Benutzer"
},
"table-col-names": {
"documents-status": "",
"dossier-status": "",
"name": "Name",
"needs-work": "Arbeitsvorrat",
"owner": "Besitzer",
"status": "Status"
"owner": "Besitzer"
},
"table-header": {
"title": "{length} {length, plural, one{aktives Dossier} other{aktive Dossiers}}"
@ -763,6 +793,7 @@
"edit": "Dossier bearbeiten",
"upload-document": "Dokument hochgeladen"
},
"import-redactions": "",
"new-rule": {
"toast": {
"actions": {
@ -794,8 +825,8 @@
},
"table-col-names": {
"added-on": "Hinzugefügt",
"last-modified": "",
"assigned-to": "Zugewiesen an",
"last-modified": "",
"name": "Name",
"needs-work": "Arbeitsvorrat",
"pages": "Seiten",
@ -808,14 +839,46 @@
"under-review": "In Review",
"upload-files": "Sie können Dateien überall per Drag and Drop platzieren..."
},
"dossier-templates": {
"label": "Dossier-Vorlagen",
"status": {
"label": "",
"active": "",
"incomplete": ""
"dossier-states": "",
"dossier-states-listing": {
"action": {
"delete": "",
"edit": ""
},
"add-new": "",
"chart": {
"dossier-states": ""
},
"error": {
"conflict": "",
"generic": ""
},
"no-data": {
"title": ""
},
"no-match": {
"title": ""
},
"search": "",
"table-col-names": {
"dossiers-count": "",
"name": ""
},
"table-header": {
"title": ""
}
},
"dossier-template-info": "",
"dossier-template-info-screen": {
"created-by": "",
"created-on": "",
"description": "",
"dictionaries": "",
"entries": "",
"modified-on": "",
"valid-from": "",
"valid-to": ""
},
"dossier-templates-listing": {
"action": {
"delete": "Dossier-Vorlage",
@ -848,12 +911,20 @@
"title": "{length} {length, plural, one{Dossier-Vorlage} other{Dossier-Vorlagen}}"
}
},
"dossier-templates": {
"label": "Dossier-Vorlagen",
"status": {
"active": "",
"incomplete": ""
}
},
"download-includes": "Wählen Sie die Dokumente für Ihr Download-Paket aus",
"download-status": {
"queued": "Ihr Download wurde zur Warteschlange hinzugefügt. Hier finden Sie alle angeforderten Downloads: <a href='/main/downloads'>My Downloads<a/>."
},
"download-type": {
"annotated": "PDF mit Anmerkungen",
"delta-preview": "",
"flatten": "PDF verflachen",
"label": "{length} Dokumenten{length, plural, one{version} other{versionen}}",
"original": "Optimiertes PDF",
@ -951,6 +1022,11 @@
"label": "Beschreibung",
"placeholder": "Beschreibung eingeben"
},
"dossier-status": {
"label": "",
"no-status-placeholder": "",
"placeholder": ""
},
"due-date": "Termin",
"name": {
"label": "Dossier-Name",
@ -975,8 +1051,7 @@
"members": "Mitglieder",
"team-members": "Team-Mitglieder"
},
"side-nav-title": "Konfiguration",
"unsaved-changes": "Sie haben nicht gespeicherte Änderungen. Speichern Sie oder machen Sie die Änderungen rückgängig, bevor Sie die Registerkarte wechseln."
"side-nav-title": "Konfiguration"
},
"error": {
"deleted-entity": {
@ -996,6 +1071,7 @@
"http": {
"generic": "Aktion mit Code {status} fehlgeschlagen"
},
"missing-types": "",
"offline": "Du bist offline",
"online": "Du bist online",
"reload": "Neu laden",
@ -1003,12 +1079,32 @@
},
"exact-date": "{day} {month} {year} um {hour}:{minute} Uhr",
"file": "Datei",
"file-attribute-encoding-types": {
"ascii": "",
"iso": "",
"utf8": ""
},
"file-attribute-types": {
"date": "Datum",
"number": "Nummer",
"text": "Freier Text"
},
"file-attributes": "Datei-Attribute",
"file-attributes-configurations": {
"cancel": "",
"form": {
"delimiter": "",
"encoding-type": "",
"key-column": "",
"support-csv-mapping": ""
},
"save": "",
"title": "",
"update": {
"error": "",
"success": ""
}
},
"file-attributes-csv-import": {
"action": {
"cancel-edit-name": "Abbrechen",
@ -1074,6 +1170,7 @@
"bulk-actions": {
"delete": "Ausgewählte Attribute löschen"
},
"configurations": "",
"error": {
"conflict": "Es gibt bereits ein Attribute mit diesem Name!",
"generic": "Attribute konnte nicht erstellt werden!"
@ -1112,6 +1209,10 @@
"exclude-pages": "Seiten von Schwärzung ausschließen",
"excluded-from-redaction": "Von Schwärzung ausgeschlossen",
"fullscreen": "Vollbildmodus",
"highlights": {
"convert": "",
"remove": ""
},
"last-reviewer": "Zuletzt überprüft von:",
"no-data": {
"title": "Auf dieser Seite gibt es keine Anmerkungen."
@ -1131,9 +1232,12 @@
"jump-to-previous": "Springe zu Vorheriger",
"label": "Arbeitsvorrat",
"page-is": "Diese Seite ist",
"reset": "",
"select": "Auswählen",
"select-all": "Alle",
"select-none": "Keine"
"select-none": "Keine",
"the-filters": "",
"wrong-filters": ""
},
"document-info": {
"close": "Dokumenteninformation schließen",
@ -1156,8 +1260,13 @@
"put-back": "Rückgängig machen",
"removed-from-redaction": "Von der Schwärzung ausgeschlossen"
},
"highlights": {
"label": ""
},
"is-excluded": "Schwärzungen für dieses Dokument deaktiviert."
},
"text-highlights": "",
"text-highlights-tooltip": "",
"toggle-analysis": {
"disable": "Schwärzen deaktivieren",
"enable": "Schwärzen aktivieren",
@ -1165,16 +1274,20 @@
}
},
"file-status": {
"analyse": "",
"approved": "Genehmigt",
"deleted": "Gelöscht",
"error": "Reanalyse erforderlich",
"full-reprocess": "Wird analysiert",
"image-analyzing": "Bildanalyse",
"indexing": "Wird analysiert",
"initial-processing": "",
"ner-analyzing": "",
"new": "Neu",
"ocr-processing": "OCR-Analyse",
"processed": "Verarbeitet",
"processing": "Wird analysiert...",
"re-processing": "",
"reprocess": "Wird analysiert",
"unassigned": "Nicht zugewiesen",
"under-approval": "In Genehmigung",
@ -1185,6 +1298,7 @@
"filter-options": "Filteroptionen",
"filter-types": "Filter",
"label": "Filter",
"pages-without-annotations": "",
"redaction-changes": "Nur Anmerkungen mit Schwärzungsänderungen",
"unseen-pages": "Nur Anmerkungen auf unsichtbaren Seiten",
"with-comments": "Nur Anmerkungen mit Kommentaren"
@ -1201,12 +1315,13 @@
},
"filters": {
"assigned-people": "Beauftragt",
"documents-status": "",
"dossier-status": "",
"dossier-templates": "Regelsätze",
"empty": "Leer",
"filter-by": "Filter:",
"needs-work": "Arbeitsvorrat",
"people": "Dossier-Mitglied(er)",
"status": "Status"
"people": "Dossier-Mitglied(er)"
},
"general-config-screen": {
"actions": {
@ -1259,6 +1374,30 @@
"text": "Hilfe-Modus",
"welcome-to-help-mode": "<b> Willkommen im Hilfe-Modus! <br> Klicken Sie auf interaktive Elemente, um in einem neuen Tab Infos dazu zu erhalten. </b>"
},
"highlight-action-dialog": {
"actions": {
"cancel": ""
},
"convert": {
"confirmation": "",
"details": "",
"save": "",
"title": ""
},
"form": {
"color": {
"label": ""
}
},
"remove": {
"confirmation": "",
"details": "",
"save": "",
"title": ""
},
"success": ""
},
"highlights": "",
"hint": "Hinweis",
"image-category": {
"formula": "Formel",
@ -1333,11 +1472,13 @@
"classification": "Wert / Klassifizierung",
"comment": "Kommentar",
"dictionary": "Wörterbuch",
"edit-selected-text": "",
"legalBasis": "Rechtsgrundlage",
"reason": "Begründung",
"reason-placeholder": "Wählen Sie eine Begründung aus ...",
"rectangle": "Benutzerdefinierter Bereich",
"section": "Absatz / Ort",
"selected-text": "",
"text": "Ausgewählter Text:"
},
"header": {
@ -1352,10 +1493,6 @@
}
}
},
"accept-recommendation-dialog": {
"header": "",
"multiple-values": ""
},
"months": {
"apr": "Apr.",
"aug": "August",
@ -1447,7 +1584,12 @@
},
"toggle-tooltips": "{active, select, true{Disable} false{Enable} other{}} Kurzinfos für Anmerkungen"
},
"pending-changes-guard": "ACHTUNG: Sie haben ungespeicherte Änderungen. Klicken Sie auf „Abbrechen“, wenn Sie zurückkehren und die Änderungen speichern möchten. Klicken Sie auf „OK“, um die Änderungen zu speichern.",
"processing-status": {
"ocr": "",
"pending": "",
"processed": "",
"processing": ""
},
"readonly": "Lesemodus",
"recategorize-image-dialog": {
"actions": {
@ -1462,6 +1604,7 @@
"header": "Bildtypen bearbeiten"
},
"redaction": "Schwärzung",
"references": "",
"remove-annotations-dialog": {
"cancel": "Abbrechen",
"confirm": "Ja, fortfahren und löschen!",
@ -1482,7 +1625,7 @@
},
"reports": "Berichte",
"reports-screen": {
"description": "Ein kurzer Text, der erläutert, was Platzhalter sind und wie Sie sie in Ihrer Berichtsvorlage einsetzen können. Es ist bekannt, dass ein Leser vom lesbaren Inhalt einer Seite abgelenkt wird, wenn er sich das Layout ansieht.",
"description": "",
"descriptions": {
"dossier-attributes": "Dieser Platzhalter wird durch den Wert des Dossier-Attributs <code>{attribute}</code> ersetzt.",
"file-attributes": "Dieser Platzhalter wird durch den Wert des Dateiattributs <code>{attribute}</code> ersetzt.",
@ -1511,8 +1654,6 @@
}
}
},
"document-setup-description": "Ein kurzer Text, der erläutert, was Platzhalter sind und wie Sie sie in Ihrer Berichtsvorlage einsetzen können. Es ist bekannt, dass ein Leser vom lesbaren Inhalt einer Seite abgelenkt wird, wenn er sich das Layout ansieht.",
"document-setup-heading": "Dokumenten-Konfiguration",
"invalid-upload": "Ungültiges Upload-Format ausgewählt! Unterstützt werden Dokumente im .xlsx- und im .docx-Format",
"multi-file-report": "(Mehrere Dateien)",
"report-documents": "Dokumente für den Bericht",
@ -1591,6 +1732,7 @@
"placeholder": "Nach Dokumenten oder Dokumenteninhalt suchen",
"this-dossier": "in diesem Dossier"
},
"size": "",
"smtp-auth-config": {
"actions": {
"cancel": "Abbrechen",
@ -1610,8 +1752,8 @@
"no-time-left": "Frist für Wiederherstellung verstrichen"
},
"toggle-auto-analysis-message": {
"success": "",
"error": ""
"error": "",
"success": ""
},
"top-bar": {
"navigation-items": {

View File

@ -1506,11 +1506,13 @@
"classification": "Value / Classification",
"comment": "Comment",
"dictionary": "Dictionary",
"edit-selected-text": "Edit selected text",
"legalBasis": "Legal Basis",
"reason": "Reason",
"reason-placeholder": "Select a reason ...",
"rectangle": "Custom Rectangle",
"section": "Paragraph / Location",
"selected-text": "Selected text",
"text": "Selected text:"
},
"header": {
@ -1658,7 +1660,7 @@
},
"reports": "Reports",
"reports-screen": {
"description": "A short text explaining how to create report documents. It is a long established fact that a reader will be distracted by the readable content of a page when looking at its layout.",
"description": "Click the upload button on the right to upload your redaction report templates.",
"descriptions": {
"dossier-attributes": "This placeholder gets replaced with the value of the dossier attribute <code>{attribute}</code>.",
"file-attributes": "This placeholder gets replaced with the value of the file attribute <code>{attribute}</code>.",
@ -1687,8 +1689,6 @@
}
}
},
"document-setup-description": "A short text explaining what placeholders are and how to use them in your report template. It is a long established fact that a reader will be distracted by the readable content of a page when looking at its layout.",
"document-setup-heading": "Document Setup",
"invalid-upload": "Invalid format selected for Upload! Supported formats are XLSX and DOCX",
"multi-file-report": "(Multi-file)",
"report-documents": "Report Documents",

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="100px" height="100px" viewBox="0 0 100 100" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="Symbols" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="import-redactions" fill="currentColor" fill-rule="nonzero">
<path d="M68.5,0 L96.5,28 L96.5,100 L16.5,100 L16.5,72 L26.5001786,72 L26.5001786,89.9998214 L86.5001786,89.9998214 L86.5001786,34.9998214 L61.5001786,34.9998214 L61.5001786,9.99982143 L26.5001786,9.99982143 L26.5001786,46 L16.5,46 L16.5,0 L68.5,0 Z M43.4996429,39 L63.4996429,59.5 L43.4996429,80.0003571 L35.9996429,73.0005357 L44.5,64.5001786 L3.5,64.5001786 L3.5,54.5001786 L44.5,54.5001786 L35.9996429,46.5 L43.4996429,39 Z M71.5001786,16.9998214 L71.5001786,25 L79.5003571,25 L71.5001786,16.9998214 Z" id="Combined-Shape"></path>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 923 B

@ -1 +1 @@
Subproject commit 2cfe09a07083fb75ab070c5f428d2a1482213b7b
Subproject commit 0157507f661ab216413ec0cf6f4a03128ecb5fce

View File

@ -1,13 +1,13 @@
{
"name": "redaction",
"version": "3.270.0",
"version": "3.281.0",
"private": true,
"license": "MIT",
"scripts": {
"build": "nx build",
"build-lint-all": "ng build --project=red-ui --configuration production --base-href /ui/",
"build-paligo-styles": "mkdir -p dist/paligo-styles && sass --load-path=. paligo-styles/style.scss > dist/paligo-styles/redacto-theme.css",
"i18n:extract": "ngx-translate-extract --input ./apps/red-ui/src ./libs/common-ui/src --output apps/red-ui/src/assets/i18n/en.json --clean --sort --format namespaced-json && prettier apps/red-ui/src/assets/i18n/*.json --write",
"i18n:extract": "ngx-translate-extract --input ./apps/red-ui/src ./libs/common-ui/src --output apps/red-ui/src/assets/i18n/{en,de}.json --clean --sort --format namespaced-json && prettier apps/red-ui/src/assets/i18n/*.json --write",
"postinstall": "ngcc --properties es2015 browser module main",
"lint": "ng lint --project=red-domain --fix && ng lint --project=red-ui --fix && ng lint --project=common-ui --fix",
"nx": "nx",

Binary file not shown.