RED-5551: when a type is missing reload dictionaries first

This commit is contained in:
Dan Percic 2022-12-02 12:04:07 +02:00
parent 350c11b4c8
commit bc7d44f457
3 changed files with 26 additions and 22 deletions

View File

@ -17,8 +17,6 @@ import {
AutoUnsubscribe, AutoUnsubscribe,
bool, bool,
CircleButtonTypes, CircleButtonTypes,
ConfirmationDialogInput,
ConfirmOptions,
CustomError, CustomError,
Debounce, Debounce,
ErrorService, ErrorService,
@ -26,6 +24,7 @@ import {
HelpModeService, HelpModeService,
List, List,
LoadingService, LoadingService,
log,
NestedFilter, NestedFilter,
OnAttach, OnAttach,
OnDetach, OnDetach,
@ -90,7 +89,10 @@ export class FilePreviewScreenComponent
fullScreen = false; fullScreen = false;
readonly fileId = this.state.fileId; readonly fileId = this.state.fileId;
readonly dossierId = this.state.dossierId; readonly dossierId = this.state.dossierId;
readonly file$ = this.state.file$.pipe(tap(file => this._fileDataService.loadAnnotations(file))); readonly file$ = this.state.file$.pipe(
tap(file => this._fileDataService.loadAnnotations(file)),
log('file'),
);
width: number; width: number;
@ViewChild('annotationFilterTemplate', { @ViewChild('annotationFilterTemplate', {
read: TemplateRef, read: TemplateRef,

View File

@ -6,7 +6,6 @@ import { Injectable } from '@angular/core';
import { FilePreviewStateService } from './file-preview-state.service'; import { FilePreviewStateService } from './file-preview-state.service';
import { ViewedPagesService } from '@services/files/viewed-pages.service'; import { ViewedPagesService } from '@services/files/viewed-pages.service';
import { UserPreferenceService } from '@users/user-preference.service'; import { UserPreferenceService } from '@users/user-preference.service';
import { DictionariesMapService } from '@services/entity-services/dictionaries-map.service';
import { map, switchMap, tap, withLatestFrom } from 'rxjs/operators'; import { map, switchMap, tap, withLatestFrom } from 'rxjs/operators';
import { PermissionsService } from '@services/permissions.service'; import { PermissionsService } from '@services/permissions.service';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
@ -19,7 +18,7 @@ import { NGXLogger } from 'ngx-logger';
import { MultiSelectService } from './multi-select.service'; import { MultiSelectService } from './multi-select.service';
import { FilesService } from '@services/files/files.service'; import { FilesService } from '@services/files/files.service';
import { DefaultColorsService } from '@services/entity-services/default-colors.service'; import { DefaultColorsService } from '@services/entity-services/default-colors.service';
import { DossierDictionariesMapService } from '@services/entity-services/dossier-dictionaries-map.service'; import { DictionaryService } from '@services/entity-services/dictionary.service';
const DELTA_VIEW_TIME = 10 * 60 * 1000; // 10 minutes; const DELTA_VIEW_TIME = 10 * 60 * 1000; // 10 minutes;
@ -39,8 +38,7 @@ export class FileDataService extends EntitiesService<AnnotationWrapper, Annotati
private readonly _viewedPagesService: ViewedPagesService, private readonly _viewedPagesService: ViewedPagesService,
private readonly _viewModeService: ViewModeService, private readonly _viewModeService: ViewModeService,
private readonly _userPreferenceService: UserPreferenceService, private readonly _userPreferenceService: UserPreferenceService,
private readonly _dictionariesMapService: DictionariesMapService, private readonly _dictionaryService: DictionaryService,
private readonly _dossierDictionariesMapService: DossierDictionariesMapService,
private readonly _permissionsService: PermissionsService, private readonly _permissionsService: PermissionsService,
private readonly _redactionLogService: RedactionLogService, private readonly _redactionLogService: RedactionLogService,
private readonly _earmarksService: EarmarksService, private readonly _earmarksService: EarmarksService,
@ -73,12 +71,8 @@ export class FileDataService extends EntitiesService<AnnotationWrapper, Annotati
get #annotations$() { get #annotations$() {
return this.#redactionLog$.pipe( return this.#redactionLog$.pipe(
withLatestFrom( withLatestFrom(this._state.file$),
this._state.file$, switchMap(([redactionLog, file]) => this.#buildAnnotations(redactionLog, file)),
this._dictionariesMapService.get$(this._state.dossierTemplateId),
this._dossierDictionariesMapService.get$(this._state.dossierId),
),
map(([redactionLog, file]) => this.#buildAnnotations(redactionLog, file)),
tap(() => this.#checkMissingTypes()), tap(() => this.#checkMissingTypes()),
map(annotations => map(annotations =>
this._userPreferenceService.areDevFeaturesEnabled ? annotations : annotations.filter(a => !a.isFalsePositive), this._userPreferenceService.areDevFeaturesEnabled ? annotations : annotations.filter(a => !a.isFalsePositive),
@ -172,8 +166,8 @@ export class FileDataService extends EntitiesService<AnnotationWrapper, Annotati
}); });
} }
#buildAnnotations(redactionLog: IRedactionLog, file: File) { async #buildAnnotations(redactionLog: IRedactionLog, file: File) {
const entries: RedactionLogEntry[] = this.#convertData(redactionLog, file); const entries = await this.#convertData(redactionLog, file);
const annotations = entries.map(entry => const annotations = entries.map(entry =>
AnnotationWrapper.fromData(entry, this._state.dictionaries, this._defaultColorsService.find(this._state.dossierTemplateId)), AnnotationWrapper.fromData(entry, this._state.dictionaries, this._defaultColorsService.find(this._state.dossierTemplateId)),
); );
@ -181,20 +175,28 @@ export class FileDataService extends EntitiesService<AnnotationWrapper, Annotati
return annotations.filter(ann => ann.manual || !file.excludedPages.includes(ann.pageNumber)); return annotations.filter(ann => ann.manual || !file.excludedPages.includes(ann.pageNumber));
} }
#convertData(redactionLog: IRedactionLog, file: File): RedactionLogEntry[] { async #convertData(redactionLog: IRedactionLog, file: File) {
const result: RedactionLogEntry[] = []; const result: RedactionLogEntry[] = [];
const sourceIdAnnotationIds: { [key: string]: RedactionLogEntry[] } = {}; const sourceIdAnnotationIds: { [key: string]: RedactionLogEntry[] } = {};
let checkDictionary = true;
redactionLog.redactionLogEntry?.forEach(redactionLogEntry => { for (const redactionLogEntry of redactionLog.redactionLogEntry) {
const changeLogValues = this.#getChangeLogValues(redactionLogEntry, file); const changeLogValues = this.#getChangeLogValues(redactionLogEntry, file);
if (changeLogValues.hidden) { if (changeLogValues.hidden) {
return; continue;
}
let dictionary = this._state.dictionaries.find(dict => dict.type === redactionLogEntry.type);
if (!dictionary && checkDictionary) {
const dictionaryRequest = this._dictionaryService.loadDictionaryDataForDossierTemplate(this._state.dossierTemplateId);
await firstValueFrom(dictionaryRequest);
checkDictionary = false;
dictionary = this._state.dictionaries.find(dict => dict.type === redactionLogEntry.type);
} }
const dictionary = this._state.dictionaries.find(dict => dict.type === redactionLogEntry.type);
if (!dictionary) { if (!dictionary) {
this.missingTypes.add(redactionLogEntry.type); this.missingTypes.add(redactionLogEntry.type);
return; continue;
} }
const redactionLogEntryWrapper: RedactionLogEntry = new RedactionLogEntry( const redactionLogEntryWrapper: RedactionLogEntry = new RedactionLogEntry(
@ -213,7 +215,7 @@ export class FileDataService extends EntitiesService<AnnotationWrapper, Annotati
} }
result.push(redactionLogEntryWrapper); result.push(redactionLogEntryWrapper);
}); }
const sourceKeys = Object.keys(sourceIdAnnotationIds); const sourceKeys = Object.keys(sourceIdAnnotationIds);
return result.filter(r => !sourceKeys.includes(r.id)); return result.filter(r => !sourceKeys.includes(r.id));

@ -1 +1 @@
Subproject commit c744c738451af53ca665b97cc99534bede42a7d4 Subproject commit c2aa517cb7e92b989355a69de26fe50084a66301