diff --git a/apps/red-ui/src/app/modules/admin/screens/entities/screens/dictionary/dictionary-screen.component.html b/apps/red-ui/src/app/modules/admin/screens/entities/screens/dictionary/dictionary-screen.component.html index 44a84b6ab..30e79e8e4 100644 --- a/apps/red-ui/src/app/modules/admin/screens/entities/screens/dictionary/dictionary-screen.component.html +++ b/apps/red-ui/src/app/modules/admin/screens/entities/screens/dictionary/dictionary-screen.component.html @@ -5,4 +5,5 @@ [filterByDossierTemplate]="true" [initialEntries]="initialEntries$ | async" [isLeavingPage]="isLeavingPage" + [type]="type" > diff --git a/apps/red-ui/src/app/modules/admin/screens/entities/screens/dictionary/dictionary-screen.component.ts b/apps/red-ui/src/app/modules/admin/screens/entities/screens/dictionary/dictionary-screen.component.ts index 9e3038b3b..4a4cea930 100644 --- a/apps/red-ui/src/app/modules/admin/screens/entities/screens/dictionary/dictionary-screen.component.ts +++ b/apps/red-ui/src/app/modules/admin/screens/entities/screens/dictionary/dictionary-screen.component.ts @@ -2,7 +2,7 @@ import { Component, ElementRef, OnInit, ViewChild } from '@angular/core'; import { ActivatedRoute } from '@angular/router'; import { DictionaryManagerComponent } from '@shared/components/dictionary-manager/dictionary-manager.component'; import { DictionaryService } from '@services/entity-services/dictionary.service'; -import { LoadingService } from '@iqser/common-ui'; +import { List, LoadingService } from '@iqser/common-ui'; import { UserService } from '@services/user.service'; import { BehaviorSubject, firstValueFrom } from 'rxjs'; import { DOSSIER_TEMPLATE_ID, ENTITY_TYPE } from '@utils/constants'; @@ -16,9 +16,9 @@ export class DictionaryScreenComponent implements OnInit { readonly currentUser = this._userService.currentUser; initialEntries$ = new BehaviorSubject([]); isLeavingPage = false; + readonly type: DictionaryType; readonly #dossierTemplateId: string; readonly #entityType: string; - readonly #type: DictionaryType; @ViewChild('dictionaryManager', { static: false }) private readonly _dictionaryManager: DictionaryManagerComponent; @ViewChild('fileInput') private readonly _fileInput: ElementRef; @@ -31,7 +31,7 @@ export class DictionaryScreenComponent implements OnInit { ) { this.#dossierTemplateId = _route.parent.snapshot.paramMap.get(DOSSIER_TEMPLATE_ID); this.#entityType = _route.parent.snapshot.paramMap.get(ENTITY_TYPE); - this.#type = this._route.snapshot.routeConfig.path as DictionaryType; + this.type = this._route.snapshot.routeConfig.path as DictionaryType; } get changed() { @@ -55,7 +55,7 @@ export class DictionaryScreenComponent implements OnInit { this.#entityType, null, true, - DICTIONARY_TO_ENTRY_TYPE_MAP[this.#type], + DICTIONARY_TO_ENTRY_TYPE_MAP[this.type], ), ); await this._loadEntries(); @@ -68,7 +68,7 @@ export class DictionaryScreenComponent implements OnInit { this._loadingService.start(); try { const data = await firstValueFrom(this._dictionaryService.getForType(this.#dossierTemplateId, this.#entityType)); - const entries: string[] = data[DICTIONARY_TYPE_KEY_MAP[this.#type]]; + const entries: List = data[DICTIONARY_TYPE_KEY_MAP[this.type]]; this.initialEntries$.next([...entries].sort((str1, str2) => str1.localeCompare(str2, undefined, { sensitivity: 'accent' }))); this._loadingService.stop(); } catch (e) { diff --git a/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/dictionary/edit-dossier-dictionary.component.ts b/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/dictionary/edit-dossier-dictionary.component.ts index a009ef5ba..b1c2e7a8c 100644 --- a/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/dictionary/edit-dossier-dictionary.component.ts +++ b/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/dictionary/edit-dossier-dictionary.component.ts @@ -85,6 +85,7 @@ export class EditDossierDictionaryComponent implements EditDossierSectionInterfa const dictionary: IDictionary = { ...this.dossierDictionary, type: 'dossier_redaction', + hasDictionary: true, addToDictionaryAction: this.form.get('addToDictionaryAction').value, }; await firstValueFrom( diff --git a/apps/red-ui/src/app/modules/shared/components/dictionary-manager/dictionary-manager.component.ts b/apps/red-ui/src/app/modules/shared/components/dictionary-manager/dictionary-manager.component.ts index 4744e5dc0..02ec11ae4 100644 --- a/apps/red-ui/src/app/modules/shared/components/dictionary-manager/dictionary-manager.component.ts +++ b/apps/red-ui/src/app/modules/shared/components/dictionary-manager/dictionary-manager.component.ts @@ -2,7 +2,7 @@ import { ChangeDetectorRef, Component, EventEmitter, Input, OnChanges, Output, S import { Debounce, IconButtonTypes, List, LoadingService } from '@iqser/common-ui'; import { firstValueFrom, Observable, of } from 'rxjs'; import { catchError, map, take, tap } from 'rxjs/operators'; -import { Dictionary, Dossier, DossierTemplate } from '@red/domain'; +import { Dictionary, DICTIONARY_TYPE_KEY_MAP, DictionaryType, Dossier, DossierTemplate } from '@red/domain'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import { DictionaryService } from '@services/entity-services/dictionary.service'; import { ActiveDossiersService } from '@services/dossiers/active-dossiers.service'; @@ -22,6 +22,7 @@ const SMOOTH_SCROLL = 0; export class DictionaryManagerComponent implements OnChanges { readonly iconButtonTypes = IconButtonTypes; + @Input() type: DictionaryType = 'dictionary'; @Input() withFloatingActions = true; @Input() filterByDossierTemplate = false; @Input() initialEntries: List; @@ -96,6 +97,7 @@ export class DictionaryManagerComponent implements OnChanges { } set compareDictionary(dictionary: Dictionary) { + this._loadingService.start(); this._compareDictionary = dictionary; if (dictionary.label === this.selectDictionary.label) { @@ -104,8 +106,8 @@ export class DictionaryManagerComponent implements OnChanges { return; } const entries: List = - this._compareDictionary.entries ?? - this._dictionariesMapService.get(this._compareDictionary.dossierTemplateId, this._compareDictionary.type).entries; + this._compareDictionary.getEntries(this.type) ?? + this._dictionariesMapService.get(this._compareDictionary.dossierTemplateId, this._compareDictionary.type).getEntries(this.type); if (entries.length) { this.diffEditorText = this._toString([...entries]); @@ -113,17 +115,18 @@ export class DictionaryManagerComponent implements OnChanges { return; } - this._loadingService.start(); firstValueFrom( this._dictionaryService.getForType(this._compareDictionary.dossierTemplateId, this._compareDictionary.type).pipe( - tap(values => (this._compareDictionary.entries = [...values.entries] ?? [])), + tap(values => { + this._compareDictionary.setEntries([...values[DICTIONARY_TYPE_KEY_MAP[this.type]]] ?? [], this.type); + }), catchError(() => { - this._compareDictionary.entries = []; + this._compareDictionary.setEntries([], this.type); return of({}); }), ), ).then(() => { - this.diffEditorText = this._toString([...this._compareDictionary.entries]); + this.diffEditorText = this._toString([...(this._compareDictionary.getEntries(this.type) as string[])]); this.showDiffEditor = true; this._changeRef.markForCheck(); this._loadingService.stop(); @@ -213,7 +216,6 @@ export class DictionaryManagerComponent implements OnChanges { private _onDossierChanged(dossierTemplateId: string, dossierId?: string, type = 'dossier_redaction'): Observable { const dictionary$ = this._dictionaryService.getForType(dossierTemplateId, type, dossierId); - return dictionary$.pipe(map(data => this._toString([...data.entries]))); } diff --git a/apps/red-ui/src/app/services/entity-services/dictionary.service.ts b/apps/red-ui/src/app/services/entity-services/dictionary.service.ts index e29d5e382..76ce7f3e9 100644 --- a/apps/red-ui/src/app/services/entity-services/dictionary.service.ts +++ b/apps/red-ui/src/app/services/entity-services/dictionary.service.ts @@ -32,7 +32,7 @@ export class DictionaryService extends EntitiesService * Retrieves all dictionary entries of an entry type */ @Validate() - getForType(@RequiredParam() dossierTemplateId: string, @RequiredParam() type: string, dossierId?: string) { + getForType(@RequiredParam() dossierTemplateId: string, @RequiredParam() type: string, dossierId?: string): Observable { const queryParams = dossierId ? [{ key: 'dossierId', value: dossierId }] : undefined; return this._getOne([type, dossierTemplateId], this._defaultModelPath, queryParams); } diff --git a/libs/red-domain/src/lib/dictionaries/dictionary.model.ts b/libs/red-domain/src/lib/dictionaries/dictionary.model.ts index f61935dfb..24c06b959 100644 --- a/libs/red-domain/src/lib/dictionaries/dictionary.model.ts +++ b/libs/red-domain/src/lib/dictionaries/dictionary.model.ts @@ -1,5 +1,6 @@ import { Entity, List } from '@iqser/common-ui'; import { IDictionary } from './dictionary'; +import { DICTIONARY_TYPE_KEY_MAP, DictionaryType } from '../redaction-log'; export class Dictionary extends Entity implements IDictionary { readonly addToDictionaryAction: boolean; @@ -51,4 +52,12 @@ export class Dictionary extends Entity implements IDictionary { get routerLink(): string { return `/main/admin/dossier-templates/${this.dossierTemplateId}/entities/${this.type}`; } + + setEntries(entries: List, type: DictionaryType): void { + this[DICTIONARY_TYPE_KEY_MAP[type]] = entries; + } + + getEntries(type: DictionaryType): List { + return this[DICTIONARY_TYPE_KEY_MAP[type]]; + } } diff --git a/libs/red-domain/src/lib/redaction-log/dictionary-entry-types.ts b/libs/red-domain/src/lib/redaction-log/dictionary-entry-types.ts index ca59c6ce8..f7917e815 100644 --- a/libs/red-domain/src/lib/redaction-log/dictionary-entry-types.ts +++ b/libs/red-domain/src/lib/redaction-log/dictionary-entry-types.ts @@ -1,6 +1,3 @@ -import { KeysOf } from '@iqser/common-ui'; -import { Dictionary } from '../dictionaries'; - export type DictionaryEntryType = 'ENTRY' | 'FALSE_POSITIVE' | 'FALSE_RECOMMENDATION'; export const DictionaryEntryTypes = { @@ -11,7 +8,7 @@ export const DictionaryEntryTypes = { export type DictionaryType = 'dictionary' | 'false-positive' | 'false-recommendations'; -export const DICTIONARY_TYPE_KEY_MAP: { [key in DictionaryType]: KeysOf } = { +export const DICTIONARY_TYPE_KEY_MAP: { [key in DictionaryType]: 'entries' | 'falsePositiveEntries' | 'falseRecommendationEntries' } = { dictionary: 'entries', 'false-positive': 'falsePositiveEntries', 'false-recommendations': 'falseRecommendationEntries',