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 618b9b02a..f23eab407 100644 --- a/apps/red-ui/src/app/models/file/annotation.wrapper.ts +++ b/apps/red-ui/src/app/models/file/annotation.wrapper.ts @@ -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) { diff --git a/apps/red-ui/src/app/models/file/super-types.ts b/apps/red-ui/src/app/models/file/super-types.ts new file mode 100644 index 000000000..b27c5bd6b --- /dev/null +++ b/apps/red-ui/src/app/models/file/super-types.ts @@ -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; + +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; diff --git a/apps/red-ui/src/app/modules/admin/screens/reports/reports-screen/reports-screen.component.html b/apps/red-ui/src/app/modules/admin/screens/reports/reports-screen/reports-screen.component.html index bffe195a8..40f257440 100644 --- a/apps/red-ui/src/app/modules/admin/screens/reports/reports-screen/reports-screen.component.html +++ b/apps/red-ui/src/app/modules/admin/screens/reports/reports-screen/reports-screen.component.html @@ -3,11 +3,6 @@
-
-
-
-
-
diff --git a/apps/red-ui/src/app/modules/admin/screens/reports/reports-screen/reports-screen.component.scss b/apps/red-ui/src/app/modules/admin/screens/reports/reports-screen/reports-screen.component.scss index 19aac0ebd..09dc44a65 100644 --- a/apps/red-ui/src/app/modules/admin/screens/reports/reports-screen/reports-screen.component.scss +++ b/apps/red-ui/src/app/modules/admin/screens/reports/reports-screen/reports-screen.component.scss @@ -71,8 +71,7 @@ .content-container { > .heading-xl, - > .description, - > .document-setup { + > .description { margin-bottom: 24px; > .all-caps-label { diff --git a/apps/red-ui/src/app/modules/dossier/dialogs/manual-redaction-dialog/manual-annotation-dialog.component.html b/apps/red-ui/src/app/modules/dossier/dialogs/manual-redaction-dialog/manual-annotation-dialog.component.html index fee0300fa..d26ef9e7f 100644 --- a/apps/red-ui/src/app/modules/dossier/dialogs/manual-redaction-dialog/manual-annotation-dialog.component.html +++ b/apps/red-ui/src/app/modules/dossier/dialogs/manual-redaction-dialog/manual-annotation-dialog.component.html @@ -4,10 +4,28 @@
-
+
+
+ {{ data.manualRedactionEntryWrapper.manualRedactionEntry.value }} + +
+
- {{ format(data.manualRedactionEntryWrapper.manualRedactionEntry.value) }} diff --git a/apps/red-ui/src/app/modules/dossier/dialogs/manual-redaction-dialog/manual-annotation-dialog.component.ts b/apps/red-ui/src/app/modules/dossier/dialogs/manual-redaction-dialog/manual-annotation-dialog.component.ts index bb43c5f42..7541e6ac0 100644 --- a/apps/red-ui/src/app/modules/dossier/dialogs/manual-redaction-dialog/manual-annotation-dialog.component.ts +++ b/apps/red-ui/src/app/modules/dossier/dialogs/manual-redaction-dialog/manual-annotation-dialog.component.ts @@ -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 { diff --git a/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/components/annotation-actions/annotation-actions.component.html b/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/components/annotation-actions/annotation-actions.component.html index cb6148826..0ec4827e0 100644 --- a/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/components/annotation-actions/annotation-actions.component.html +++ b/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/components/annotation-actions/annotation-actions.component.html @@ -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" > diff --git a/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/components/file-workload/file-workload.component.html b/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/components/file-workload/file-workload.component.html index b839f8921..e2b64fe9f 100644 --- a/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/components/file-workload/file-workload.component.html +++ b/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/components/file-workload/file-workload.component.html @@ -39,7 +39,7 @@
-
+
-
+
-
+
(); @Input() selectedAnnotations: AnnotationWrapper[]; @Input() activeViewerPage: number; - @Input() shouldDeselectAnnotationsOnPageChange: boolean; @Input() dialogRef: MatDialogRef; @Input() file!: File; @Input() annotationActionsTemplate: TemplateRef; @Input() viewer: WebViewerInstance; - @Output() readonly shouldDeselectAnnotationsOnPageChangeChange = new EventEmitter(); @Output() readonly selectAnnotations = new EventEmitter(); @Output() readonly deselectAnnotations = new EventEmitter(); @Output() readonly selectPage = new EventEmitter(); @@ -66,7 +64,6 @@ export class FileWorkloadComponent { displayedPages: number[] = []; pagesPanelActive = true; readonly displayedAnnotations$: Observable>; - readonly multiSelectActive$: Observable; readonly multiSelectInactive$: Observable; readonly showExcludedPages$: Observable; readonly title$: Observable; @@ -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; + } + } } } diff --git a/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/components/pdf-viewer/pdf-viewer.component.ts b/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/components/pdf-viewer/pdf-viewer.component.ts index 0c92b92ab..f6a2a834a 100644 --- a/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/components/pdf-viewer/pdf-viewer.component.ts +++ b/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/components/pdf-viewer/pdf-viewer.component.ts @@ -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(); @Output() readonly manualAnnotationRequested = new EventEmitter(); @@ -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(); }); diff --git a/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/file-preview-screen.component.html b/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/file-preview-screen.component.html index 811373798..a2f32d01f 100644 --- a/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/file-preview-screen.component.html +++ b/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/file-preview-screen.component.html @@ -20,8 +20,8 @@
@@ -93,7 +92,6 @@ (selectAnnotations)="selectAnnotations($event)" (selectPage)="selectPage($event)" *ngIf="!file.excluded" - [(shouldDeselectAnnotationsOnPageChange)]="shouldDeselectAnnotationsOnPageChange" [activeViewerPage]="activeViewerPage" [annotationActionsTemplate]="annotationActionsTemplate" [annotations]="visibleAnnotations" diff --git a/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/file-preview-screen.component.ts b/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/file-preview-screen.component.ts index 0d9cb0fc0..394a2ac29 100644 --- a/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/file-preview-screen.component.ts +++ b/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/file-preview-screen.component.ts @@ -65,7 +65,6 @@ export class FilePreviewScreenComponent extends AutoUnsubscribe implements OnIni dialogRef: MatDialogRef; 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 = { diff --git a/apps/red-ui/src/app/modules/dossier/services/annotation-processing.service.ts b/apps/red-ui/src/app/modules/dossier/services/annotation-processing.service.ts index de2bdaab0..1bb000a10 100644 --- a/apps/red-ui/src/app/modules/dossier/services/annotation-processing.service.ts +++ b/apps/red-ui/src/app/modules/dossier/services/annotation-processing.service.ts @@ -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', diff --git a/apps/red-ui/src/app/modules/dossier/shared/components/file-actions/file-actions.component.ts b/apps/red-ui/src/app/modules/dossier/shared/components/file-actions/file-actions.component.ts index a6d824225..df1352e8d 100644 --- a/apps/red-ui/src/app/modules/dossier/shared/components/file-actions/file-actions.component.ts +++ b/apps/red-ui/src/app/modules/dossier/shared/components/file-actions/file-actions.component.ts @@ -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, }, { diff --git a/apps/red-ui/src/app/modules/icons/icons.module.ts b/apps/red-ui/src/app/modules/icons/icons.module.ts index f85071c77..057a861d2 100644 --- a/apps/red-ui/src/app/modules/icons/icons.module.ts +++ b/apps/red-ui/src/app/modules/icons/icons.module.ts @@ -37,6 +37,7 @@ export class IconsModule { 'fullscreen', 'html-file', 'info', + 'import_redactions', 'lightning', 'logo', 'nav-first', diff --git a/apps/red-ui/src/app/modules/shared/services/dictionary.service.ts b/apps/red-ui/src/app/modules/shared/services/dictionary.service.ts index 275d7e278..70b401f86 100644 --- a/apps/red-ui/src/app/modules/shared/services/dictionary.service.ts +++ b/apps/red-ui/src/app/modules/shared/services/dictionary.service.ts @@ -99,11 +99,11 @@ export class DictionaryService extends EntitiesService 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))), ), ); } diff --git a/apps/red-ui/src/app/services/permissions.service.ts b/apps/red-ui/src/app/services/permissions.service.ts index 6d99dab1b..70d5be15f 100644 --- a/apps/red-ui/src/app/services/permissions.service.ts +++ b/apps/red-ui/src/app/services/permissions.service.ts @@ -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 { diff --git a/apps/red-ui/src/app/translations/annotation-types-translations.ts b/apps/red-ui/src/app/translations/annotation-types-translations.ts index 0ea4d69c1..e09d3cd18 100644 --- a/apps/red-ui/src/app/translations/annotation-types-translations.ts +++ b/apps/red-ui/src/app/translations/annotation-types-translations.ts @@ -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'), diff --git a/apps/red-ui/src/app/utils/sorters/super-type-sorter.ts b/apps/red-ui/src/app/utils/sorters/super-type-sorter.ts index c7d976872..246efd1a9 100644 --- a/apps/red-ui/src/app/utils/sorters/super-type-sorter.ts +++ b/apps/red-ui/src/app/utils/sorters/super-type-sorter.ts @@ -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, diff --git a/apps/red-ui/src/assets/help-mode/links.json b/apps/red-ui/src/assets/help-mode/links.json index 7dacb0fa5..ae6cc5c82 100644 --- a/apps/red-ui/src/assets/help-mode/links.json +++ b/apps/red-ui/src/assets/help-mode/links.json @@ -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": "" diff --git a/apps/red-ui/src/assets/i18n/de.json b/apps/red-ui/src/assets/i18n/de.json index 9becd128f..6eda98a9e 100644 --- a/apps/red-ui/src/assets/i18n/de.json +++ b/apps/red-ui/src/assets/i18n/de.json @@ -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": "{fileName}", + "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 {fileName} 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": "{fileName}", - "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: My Downloads." }, "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": " Willkommen im Hilfe-Modus!
Klicken Sie auf interaktive Elemente, um in einem neuen Tab Infos dazu zu erhalten.
" }, + "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 {attribute} ersetzt.", "file-attributes": "Dieser Platzhalter wird durch den Wert des Dateiattributs {attribute} 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": { diff --git a/apps/red-ui/src/assets/i18n/en.json b/apps/red-ui/src/assets/i18n/en.json index 94a13c81c..b9aa96abd 100644 --- a/apps/red-ui/src/assets/i18n/en.json +++ b/apps/red-ui/src/assets/i18n/en.json @@ -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 {attribute}.", "file-attributes": "This placeholder gets replaced with the value of the file attribute {attribute}.", @@ -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", diff --git a/apps/red-ui/src/assets/icons/general/import_redactions.svg b/apps/red-ui/src/assets/icons/general/import_redactions.svg new file mode 100644 index 000000000..211373806 --- /dev/null +++ b/apps/red-ui/src/assets/icons/general/import_redactions.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/libs/common-ui b/libs/common-ui index 2cfe09a07..0157507f6 160000 --- a/libs/common-ui +++ b/libs/common-ui @@ -1 +1 @@ -Subproject commit 2cfe09a07083fb75ab070c5f428d2a1482213b7b +Subproject commit 0157507f661ab216413ec0cf6f4a03128ecb5fce diff --git a/package.json b/package.json index 357bd0be1..bc1ec17bd 100644 --- a/package.json +++ b/package.json @@ -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", diff --git a/paligo-theme.tar.gz b/paligo-theme.tar.gz index a0399a8f7..e85168842 100644 Binary files a/paligo-theme.tar.gz and b/paligo-theme.tar.gz differ