diff --git a/apps/red-ui/src/app/models/file/annotation-permissions.utils.ts b/apps/red-ui/src/app/models/file/annotation-permissions.utils.ts index 6fecfd9a0..a00e57441 100644 --- a/apps/red-ui/src/app/models/file/annotation-permissions.utils.ts +++ b/apps/red-ui/src/app/models/file/annotation-permissions.utils.ts @@ -13,7 +13,7 @@ export const canForceRedaction = (annotation: AnnotationWrapper, canAddRedaction export const canAcceptRecommendation = (annotation: AnnotationWrapper) => annotation.isRecommendation && !annotation.pending; export const canMarkAsFalsePositive = (annotation: AnnotationWrapper, annotationEntity: Dictionary) => - annotation.canBeMarkedAsFalsePositive && annotationEntity.hasDictionary; + annotation.canBeMarkedAsFalsePositive && annotationEntity?.hasDictionary; export const canRemoveOnlyHere = (annotation: AnnotationWrapper, canAddRedaction: boolean) => canAddRedaction && !annotation.pending && (annotation.isRedacted || (annotation.isHint && !annotation.isImage)); diff --git a/apps/red-ui/src/app/models/file/annotation.permissions.ts b/apps/red-ui/src/app/models/file/annotation.permissions.ts index 4abb9d7bb..e99e52326 100644 --- a/apps/red-ui/src/app/models/file/annotation.permissions.ts +++ b/apps/red-ui/src/app/models/file/annotation.permissions.ts @@ -62,7 +62,7 @@ export class AnnotationPermissions { permissions.canRemoveRedaction = canRemoveRedaction(annotation, permissions); permissions.canChangeLegalBasis = canChangeLegalBasis(annotation, canAddRedaction); permissions.canRecategorizeAnnotation = canRecategorizeAnnotation(annotation, canAddRedaction); - permissions.canResizeAnnotation = canResizeAnnotation(annotation, canAddRedaction, annotationEntity.hasDictionary); + permissions.canResizeAnnotation = canResizeAnnotation(annotation, canAddRedaction, annotationEntity?.hasDictionary); permissions.canEditAnnotations = canEditAnnotation(annotation); permissions.canEditHints = canEditHint(annotation); permissions.canEditImages = canEditImage(annotation); diff --git a/apps/red-ui/src/app/models/file/annotation.wrapper.ts b/apps/red-ui/src/app/models/file/annotation.wrapper.ts index 13755fe4c..441b0ae03 100644 --- a/apps/red-ui/src/app/models/file/annotation.wrapper.ts +++ b/apps/red-ui/src/app/models/file/annotation.wrapper.ts @@ -1,9 +1,11 @@ import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import { IListable } from '@iqser/common-ui'; import { + annotationDefaultColorConfig, annotationEntityColorConfig, AnnotationIconType, ChangeType, + DefaultColors, Dictionary, Earmark, EntityTypes, @@ -213,6 +215,7 @@ export class AnnotationWrapper implements IListable { changeLogType: ChangeType, legalBasisList: ILegalBasis[], isDocumine: boolean, + defaultColors: DefaultColors, ) { const annotationWrapper = new AnnotationWrapper(); @@ -273,10 +276,11 @@ export class AnnotationWrapper implements IListable { annotationWrapper.isRemoved = logEntry.state === EntryStates.REMOVED; annotationWrapper.isRemovedLocally = lastRelevantManualChange?.manualRedactionType === ManualRedactionTypes.REMOVE_LOCALLY; - annotationWrapper.typeLabel = dictionary.virtual ? undefined : dictionary.label; + annotationWrapper.typeLabel = dictionary?.virtual ? undefined : dictionary?.label; const colorKey = annotationEntityColorConfig[annotationWrapper.superType]; - annotationWrapper.color = dictionary[colorKey] as string; + const defaultColor = annotationDefaultColorConfig[annotationWrapper.superType]; + annotationWrapper.color = dictionary ? (dictionary[colorKey] as string) : (defaultColors[defaultColor] as string); annotationWrapper['entry'] = logEntry; return annotationWrapper; diff --git a/apps/red-ui/src/app/modules/file-preview/dialogs/docu-mine/resize-annotation-dialog/resize-annotation-dialog.component.ts b/apps/red-ui/src/app/modules/file-preview/dialogs/docu-mine/resize-annotation-dialog/resize-annotation-dialog.component.ts index fb6d55108..b8b6e015f 100644 --- a/apps/red-ui/src/app/modules/file-preview/dialogs/docu-mine/resize-annotation-dialog/resize-annotation-dialog.component.ts +++ b/apps/red-ui/src/app/modules/file-preview/dialogs/docu-mine/resize-annotation-dialog/resize-annotation-dialog.component.ts @@ -26,8 +26,8 @@ export class ResizeAnnotationDialogComponent extends IqserDialogComponent< this.close({ comment: formValue.comment, - updateDictionary: this.entity.hasDictionary, - addToAllDossiers: this.entity.hasDictionary, + updateDictionary: this.entity?.hasDictionary, + addToAllDossiers: this.entity?.hasDictionary, }); } } diff --git a/apps/red-ui/src/app/modules/file-preview/services/file-data.service.ts b/apps/red-ui/src/app/modules/file-preview/services/file-data.service.ts index 35433f183..84505a2f0 100644 --- a/apps/red-ui/src/app/modules/file-preview/services/file-data.service.ts +++ b/apps/red-ui/src/app/modules/file-preview/services/file-data.service.ts @@ -18,6 +18,7 @@ import { firstValueFrom, Observable } from 'rxjs'; import { FilePreviewStateService } from './file-preview-state.service'; import { MultiSelectService } from './multi-select.service'; import { ViewModeService } from './view-mode.service'; +import { DefaultColorsService } from '@services/entity-services/default-colors.service'; const DELTA_VIEW_TIME = 10 * 60 * 1000; // 10 minutes; @@ -55,6 +56,7 @@ export class FileDataService extends EntitiesService { } #showToast(action: ManualRedactionActions | DictionaryActions, isDictionary = false) { - return tap({ - next: () => this._toaster.success(getMessage(action, isDictionary), { positionClass: 'toast-file-preview' }), - error: (error: unknown) => { + return pipe( + catchError((error: unknown) => { const isConflict = (error as HttpErrorResponse).status === HttpStatusCode.Conflict; this._toaster.error(getMessage(action, isDictionary, true, isConflict), { error: error as HttpErrorResponse, positionClass: 'toast-file-preview', }); - }, - }); + return EMPTY; + }), + tap(() => this._toaster.success(getMessage(action, isDictionary), { positionClass: 'toast-file-preview' })), + ); } #showAddToDictionaryToast(body: List, dictionaryLabel?: string) { - return tap({ - next: () => this._toaster.success(getDictionaryMessage('add'), { positionClass: 'toast-file-preview' }), - error: (error: unknown) => { + return pipe( + catchError((error: unknown) => { const isConflict = (error as HttpErrorResponse).status === HttpStatusCode.Conflict; this._toaster.error(getDictionaryMessage('add', true, isConflict), { error: error as HttpErrorResponse, @@ -175,7 +175,9 @@ export class ManualRedactionService extends GenericService { }, positionClass: 'toast-file-preview', }); - }, - }); + return EMPTY; + }), + tap(() => this._toaster.success(getDictionaryMessage('add'), { positionClass: 'toast-file-preview' })), + ); } } diff --git a/apps/red-ui/src/app/modules/file-preview/services/pdf-annotation-actions.service.ts b/apps/red-ui/src/app/modules/file-preview/services/pdf-annotation-actions.service.ts index 157a7e963..f967c3f73 100644 --- a/apps/red-ui/src/app/modules/file-preview/services/pdf-annotation-actions.service.ts +++ b/apps/red-ui/src/app/modules/file-preview/services/pdf-annotation-actions.service.ts @@ -73,21 +73,21 @@ export class PdfAnnotationActionsService { availableActions.push(editButton); } - if (permissions.canAcceptRecommendation) { + if (permissions.canAcceptRecommendation && annotationChangesAllowed) { const acceptRecommendationButton = this.#getButton('check', _('annotation-actions.accept-recommendation.label'), () => this.#annotationActionsService.convertRecommendationToAnnotation(annotations), ); availableActions.push(acceptRecommendationButton); } - if (permissions.canForceRedaction) { + if (permissions.canForceRedaction && annotationChangesAllowed) { const forceRedactionButton = this.#getButton('thumb-up', _('annotation-actions.force-redaction.label'), () => this.#annotationActionsService.forceAnnotation(annotations), ); availableActions.push(forceRedactionButton); } - if (permissions.canForceHint) { + if (permissions.canForceHint && annotationChangesAllowed) { const forceHintButton = this.#getButton('thumb-up', _('annotation-actions.force-hint.label'), () => this.#annotationActionsService.forceAnnotation(annotations, true), ); diff --git a/apps/red-ui/src/app/modules/shared/components/type-filter/type-filter.component.ts b/apps/red-ui/src/app/modules/shared/components/type-filter/type-filter.component.ts index 197352b41..13c2f4b27 100644 --- a/apps/red-ui/src/app/modules/shared/components/type-filter/type-filter.component.ts +++ b/apps/red-ui/src/app/modules/shared/components/type-filter/type-filter.component.ts @@ -21,11 +21,11 @@ export class TypeFilterComponent implements OnChanges { this.filter.metadata?.shortLabel === '' ? '' : this.filter.id === 'none' - ? '-' - : this._needsAnalysisKeys.includes(this.filter.id) - ? 'A' - : this.filter.skipTranslation - ? this.filter.label.charAt(0) - : this._translateService.instant(this.filter.label).charAt(0); + ? '-' + : this._needsAnalysisKeys.includes(this.filter.id) + ? 'A' + : this.filter.skipTranslation + ? this.filter.label?.charAt(0) + : this._translateService.instant(this.filter.label).charAt(0); } }