From 0643db4347cd82aa6fd56a884a4f46f342c0a880 Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Wed, 26 Jun 2024 19:52:08 -0700 Subject: [PATCH] Feature: improve history display of object names etc (#7102) --- .../document-history.component.html | 2 +- .../document-history.component.spec.ts | 100 ++++++++++++++++++ .../document-history.component.ts | 41 ++++++- 3 files changed, 141 insertions(+), 2 deletions(-) diff --git a/src-ui/src/app/components/document-history/document-history.component.html b/src-ui/src/app/components/document-history/document-history.component.html index c63a1223c..edb045323 100644 --- a/src-ui/src/app/components/document-history/document-history.component.html +++ b/src-ui/src/app/components/document-history/document-history.component.html @@ -48,7 +48,7 @@ @if (change.key === 'content') { {{ change.value[1]?.substring(0,100) }}... } @else { - {{ change.value[1] }} + {{ getPrettyName(change.key, change.value[1]) | async }} } } diff --git a/src-ui/src/app/components/document-history/document-history.component.spec.ts b/src-ui/src/app/components/document-history/document-history.component.spec.ts index 90108a971..57133ed74 100644 --- a/src-ui/src/app/components/document-history/document-history.component.spec.ts +++ b/src-ui/src/app/components/document-history/document-history.component.spec.ts @@ -9,11 +9,20 @@ import { CustomDatePipe } from 'src/app/pipes/custom-date.pipe' import { DatePipe } from '@angular/common' import { NgbCollapseModule, NgbTooltipModule } from '@ng-bootstrap/ng-bootstrap' import { NgxBootstrapIconsModule, allIcons } from 'ngx-bootstrap-icons' +import { CorrespondentService } from 'src/app/services/rest/correspondent.service' +import { DocumentTypeService } from 'src/app/services/rest/document-type.service' +import { StoragePathService } from 'src/app/services/rest/storage-path.service' +import { UserService } from 'src/app/services/rest/user.service' +import { DataType } from 'src/app/data/datatype' describe('DocumentHistoryComponent', () => { let component: DocumentHistoryComponent let fixture: ComponentFixture let documentService: DocumentService + let correspondentService: CorrespondentService + let documentTypeService: DocumentTypeService + let storagePathService: StoragePathService + let userService: UserService beforeEach(async () => { await TestBed.configureTestingModule({ @@ -29,6 +38,10 @@ describe('DocumentHistoryComponent', () => { fixture = TestBed.createComponent(DocumentHistoryComponent) documentService = TestBed.inject(DocumentService) + correspondentService = TestBed.inject(CorrespondentService) + documentTypeService = TestBed.inject(DocumentTypeService) + storagePathService = TestBed.inject(StoragePathService) + userService = TestBed.inject(UserService) component = fixture.componentInstance }) @@ -55,4 +68,91 @@ describe('DocumentHistoryComponent', () => { fixture.detectChanges() expect(getHistorySpy).toHaveBeenCalledWith(1) }) + + it('getPrettyName should return the correspondent name', () => { + const correspondentId = '1' + const correspondentName = 'John Doe' + const getCachedSpy = jest + .spyOn(correspondentService, 'getCached') + .mockReturnValue(of({ name: correspondentName })) + component + .getPrettyName(DataType.Correspondent, correspondentId) + .subscribe((result) => { + expect(result).toBe(correspondentName) + }) + expect(getCachedSpy).toHaveBeenCalledWith(parseInt(correspondentId)) + // no correspondent found + getCachedSpy.mockReturnValue(of(null)) + component + .getPrettyName(DataType.Correspondent, correspondentId) + .subscribe((result) => { + expect(result).toBe(correspondentId) + }) + }) + + it('getPrettyName should return the document type name', () => { + const documentTypeId = '1' + const documentTypeName = 'Invoice' + const getCachedSpy = jest + .spyOn(documentTypeService, 'getCached') + .mockReturnValue(of({ name: documentTypeName })) + component + .getPrettyName(DataType.DocumentType, documentTypeId) + .subscribe((result) => { + expect(result).toBe(documentTypeName) + }) + expect(getCachedSpy).toHaveBeenCalledWith(parseInt(documentTypeId)) + // no document type found + getCachedSpy.mockReturnValue(of(null)) + component + .getPrettyName(DataType.DocumentType, documentTypeId) + .subscribe((result) => { + expect(result).toBe(documentTypeId) + }) + }) + + it('getPrettyName should return the storage path path', () => { + const storagePathId = '1' + const storagePath = '/path/to/storage' + const getCachedSpy = jest + .spyOn(storagePathService, 'getCached') + .mockReturnValue(of({ path: storagePath })) + component + .getPrettyName(DataType.StoragePath, storagePathId) + .subscribe((result) => { + expect(result).toBe(storagePath) + }) + expect(getCachedSpy).toHaveBeenCalledWith(parseInt(storagePathId)) + // no storage path found + getCachedSpy.mockReturnValue(of(null)) + component + .getPrettyName(DataType.StoragePath, storagePathId) + .subscribe((result) => { + expect(result).toBe(storagePathId) + }) + }) + + it('getPrettyName should return the owner username', () => { + const ownerId = '1' + const ownerUsername = 'user1' + const getCachedSpy = jest + .spyOn(userService, 'getCached') + .mockReturnValue(of({ username: ownerUsername })) + component.getPrettyName('owner', ownerId).subscribe((result) => { + expect(result).toBe(ownerUsername) + }) + expect(getCachedSpy).toHaveBeenCalledWith(parseInt(ownerId)) + // no user found + getCachedSpy.mockReturnValue(of(null)) + component.getPrettyName('owner', ownerId).subscribe((result) => { + expect(result).toBe(ownerId) + }) + }) + + it('getPrettyName should return the value as is for other types', () => { + const id = '123' + component.getPrettyName('other', id).subscribe((result) => { + expect(result).toBe(id) + }) + }) }) diff --git a/src-ui/src/app/components/document-history/document-history.component.ts b/src-ui/src/app/components/document-history/document-history.component.ts index 7870c1714..934ddab56 100644 --- a/src-ui/src/app/components/document-history/document-history.component.ts +++ b/src-ui/src/app/components/document-history/document-history.component.ts @@ -1,6 +1,12 @@ import { Component, Input, OnInit } from '@angular/core' +import { Observable, first, map, of } from 'rxjs' import { AuditLogAction, AuditLogEntry } from 'src/app/data/auditlog-entry' +import { DataType } from 'src/app/data/datatype' +import { CorrespondentService } from 'src/app/services/rest/correspondent.service' +import { DocumentTypeService } from 'src/app/services/rest/document-type.service' import { DocumentService } from 'src/app/services/rest/document.service' +import { StoragePathService } from 'src/app/services/rest/storage-path.service' +import { UserService } from 'src/app/services/rest/user.service' @Component({ selector: 'pngx-document-history', @@ -20,7 +26,13 @@ export class DocumentHistoryComponent implements OnInit { public loading: boolean = true public entries: AuditLogEntry[] = [] - constructor(private documentService: DocumentService) {} + constructor( + private documentService: DocumentService, + private correspondentService: CorrespondentService, + private storagePathService: StoragePathService, + private documentTypeService: DocumentTypeService, + private userService: UserService + ) {} ngOnInit(): void { if (this._documentId) { @@ -33,4 +45,31 @@ export class DocumentHistoryComponent implements OnInit { }) } } + + getPrettyName(type: DataType | string, id: string): Observable { + switch (type) { + case DataType.Correspondent: + return this.correspondentService.getCached(parseInt(id, 10)).pipe( + first(), + map((correspondent) => correspondent?.name ?? id) + ) + case DataType.DocumentType: + return this.documentTypeService.getCached(parseInt(id, 10)).pipe( + first(), + map((documentType) => documentType?.name ?? id) + ) + case DataType.StoragePath: + return this.storagePathService.getCached(parseInt(id, 10)).pipe( + first(), + map((storagePath) => storagePath?.path ?? id) + ) + case 'owner': + return this.userService.getCached(parseInt(id, 10)).pipe( + first(), + map((user) => user?.username ?? id) + ) + default: + return of(id) + } + } }