diff --git a/goofy-client/libs/ozg-file/src/lib/anhang-list-container/anhang-list-container.component.html b/goofy-client/libs/ozg-file/src/lib/anhang-list-container/anhang-list-container.component.html index 7ef284e7dde3d98fe2dfb791bb1e8ba9544e878c..c444775a8b3b65d44da62d059e8454acfc783026 100644 --- a/goofy-client/libs/ozg-file/src/lib/anhang-list-container/anhang-list-container.component.html +++ b/goofy-client/libs/ozg-file/src/lib/anhang-list-container/anhang-list-container.component.html @@ -1,13 +1,15 @@ <goofy-client-expansion-panel headline="Anhänge"> <ng-container *ngIf="attachmentStateResource$ | async as attachmentStateResource"> - <goofy-client-anhaenge *ngIf="vorgangWithEingang | hasLink: linkRel.ATTACHMENTS; else emptyAnhaenge" data-test-id="anhaenge" class="files" - [attachments]="attachmentStateResource.resource | toEmbeddedResources: fileListRel.FILE_LIST"> - </goofy-client-anhaenge> - - <ng-template #emptyAnhaenge> - <p data-test-id="empty-anhaenge">keine Anhänge vorhanden</p> - </ng-template> - + <goofy-client-spinner [stateResource]="attachmentStateResource"> + <goofy-client-anhaenge *ngIf="vorgangWithEingang | hasLink: linkRel.ATTACHMENTS; else emptyAnhaenge" data-test-id="anhaenge" class="files" + [attachments]="attachmentStateResource.resource | toEmbeddedResources: fileListRel.FILE_LIST"> + </goofy-client-anhaenge> + + <ng-template #emptyAnhaenge> + <p data-test-id="empty-anhaenge">keine Anhänge vorhanden</p> + </ng-template> + </goofy-client-spinner> + </ng-container> </goofy-client-expansion-panel> \ No newline at end of file diff --git a/goofy-client/libs/ozg-file/src/lib/anhang-list-container/anhang-list-container.component.spec.ts b/goofy-client/libs/ozg-file/src/lib/anhang-list-container/anhang-list-container.component.spec.ts index 5e680f08abe33606bf8f16fca51011b42dfbb0fe..4cc21fb1aefed0e1c8bef39477568e1d8f42bed6 100644 --- a/goofy-client/libs/ozg-file/src/lib/anhang-list-container/anhang-list-container.component.spec.ts +++ b/goofy-client/libs/ozg-file/src/lib/anhang-list-container/anhang-list-container.component.spec.ts @@ -1,7 +1,7 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { createEmptyStateResource, HasLinkPipe, ToEmbeddedResourcesPipe } from '@goofy-client/tech-shared'; import { mock } from '@goofy-client/test-utils'; -import { ExpansionPanelComponent } from '@goofy-client/ui'; +import { ExpansionPanelComponent, SpinnerComponent } from '@goofy-client/ui'; import { VorgangService, VorgangWithEingangLinkRel, VorgangWithEingangResource } from '@goofy-client/vorgang-shared'; import { createVorgangWithEingangResource } from 'libs/vorgang-shared/test/vorgang'; import { MockComponent } from 'ng-mocks'; @@ -13,13 +13,13 @@ describe('AnhangListContainerComponent', () => { let component: AnhangListContainerComponent; let fixture: ComponentFixture<AnhangListContainerComponent>; - const vorgangWithAttachments: VorgangWithEingangResource = createVorgangWithEingangResource([VorgangWithEingangLinkRel.ATTACHMENTS]); - const vorgang: VorgangWithEingangResource = createVorgangWithEingangResource(); + const emptyAnhaenge: string = '[data-test-id="empty-anhaenge"]'; + const anhaenge: string = '[data-test-id="anhaenge"]'; const vorgangService = mock(VorgangService); - const emptyAnhaenge: string = '[data-test-id="empty-anhaenge"]'; - const anhaenge: string = '[data-test-id="anhaenge"]'; + const vorgangWithAttachments: VorgangWithEingangResource = createVorgangWithEingangResource([VorgangWithEingangLinkRel.ATTACHMENTS]); + const vorgang: VorgangWithEingangResource = createVorgangWithEingangResource(); beforeEach(async () => { await TestBed.configureTestingModule({ @@ -28,7 +28,8 @@ describe('AnhangListContainerComponent', () => { HasLinkPipe, ToEmbeddedResourcesPipe, MockComponent(AnhaengeComponent), - MockComponent(ExpansionPanelComponent) + MockComponent(ExpansionPanelComponent), + MockComponent(SpinnerComponent) ], providers: [ { @@ -93,9 +94,10 @@ describe('AnhangListContainerComponent', () => { describe('ng on changes', () => { it('should call vorgang service getAttachments', () => { + component.vorgangWithEingang = vorgang; component.ngOnChanges(); - expect(vorgangService.getAttachments).toHaveBeenCalled(); + expect(vorgangService.getAttachments).toHaveBeenCalledWith(vorgang); }) }) }); \ No newline at end of file diff --git a/goofy-client/libs/ozg-file/src/lib/anhang-list-container/anhang-list-container.component.ts b/goofy-client/libs/ozg-file/src/lib/anhang-list-container/anhang-list-container.component.ts index 6ed57be6413122ba281173d1f629cdf7772fc0e7..538de97d4480e28226ac7a7ce2434943f57fff74 100644 --- a/goofy-client/libs/ozg-file/src/lib/anhang-list-container/anhang-list-container.component.ts +++ b/goofy-client/libs/ozg-file/src/lib/anhang-list-container/anhang-list-container.component.ts @@ -1,8 +1,8 @@ import { Component, Input, OnChanges } from '@angular/core'; import { OzgFileListLinkRel, OzgFileListResource } from '@goofy-client/ozg-file-shared'; -import { StateResource } from '@goofy-client/tech-shared'; +import { createEmptyStateResource, StateResource } from '@goofy-client/tech-shared'; import { VorgangService, VorgangWithEingangLinkRel, VorgangWithEingangResource } from '@goofy-client/vorgang-shared'; -import { Observable } from 'rxjs'; +import { Observable, of } from 'rxjs'; @Component({ selector: 'goofy-client-anhang-list-container', @@ -14,13 +14,13 @@ export class AnhangListContainerComponent implements OnChanges { @Input() vorgangWithEingang: VorgangWithEingangResource; readonly linkRel = VorgangWithEingangLinkRel; - attachmentStateResource$: Observable<StateResource<OzgFileListResource>>; - readonly fileListRel = OzgFileListLinkRel; + attachmentStateResource$: Observable<StateResource<OzgFileListResource>> = of(createEmptyStateResource()); + constructor(private vorgangService: VorgangService) { } ngOnChanges(): void { - this.attachmentStateResource$ = this.vorgangService.getAttachments(); + this.attachmentStateResource$ = this.vorgangService.getAttachments(this.vorgangWithEingang); } } diff --git a/goofy-client/libs/vorgang-shared/src/lib/vorgang.service.spec.ts b/goofy-client/libs/vorgang-shared/src/lib/vorgang.service.spec.ts index dff9186b05effaeba064300008ad0d9db09c8c24..3461845ce1c44dc7a42614ba4e58cfb6fa02e139 100644 --- a/goofy-client/libs/vorgang-shared/src/lib/vorgang.service.spec.ts +++ b/goofy-client/libs/vorgang-shared/src/lib/vorgang.service.spec.ts @@ -170,6 +170,7 @@ describe('VorgangService', () => { service.clearVorgang = jest.fn(); service.clearPendingForwardCommand = jest.fn(); service.clearPendingSendPostfachMailCommand = jest.fn(); + service.clearAttachments = jest.fn(); }) it('should clear vorgang', () => { @@ -178,17 +179,23 @@ describe('VorgangService', () => { expect(service.clearVorgang).toHaveBeenCalled(); }); - it('should clear clearPendingForwardCommand', () => { + it('should call clearPendingForwardCommand', () => { service.onNavigation({}); expect(service.clearPendingForwardCommand).toHaveBeenCalled(); }) - it('should clear clearPendingSendPostfachMailCommand', () => { + it('should call clearPendingSendPostfachMailCommand', () => { service.onNavigation({}); expect(service.clearPendingSendPostfachMailCommand).toHaveBeenCalled(); }) + + it('should call clearAttachments', () => { + service.onNavigation({}); + + expect(service.clearAttachments).toHaveBeenCalled(); + }) }); }) diff --git a/goofy-client/libs/vorgang-shared/src/lib/vorgang.service.ts b/goofy-client/libs/vorgang-shared/src/lib/vorgang.service.ts index a837677fe0c440cfee7d33eb40336b70b58ba474..7f32ad4888013deaf09aa31561bf893230da50f3 100644 --- a/goofy-client/libs/vorgang-shared/src/lib/vorgang.service.ts +++ b/goofy-client/libs/vorgang-shared/src/lib/vorgang.service.ts @@ -59,8 +59,9 @@ export class VorgangService { updateVorgang(vorgang: VorgangWithEingangResource): void { this.setVorgangWithEingang(createStateResource(vorgang)); + //TODO nur laden, wenn es notwendig ist -> im HTML anstoßen this.loadPendingCommandsByVorgang(vorgang); - this.loadAttachments(vorgang); + //this.loadAttachments(vorgang); } setVorgangWithEingang(stateResource: StateResource<VorgangWithEingangResource>) { @@ -123,20 +124,13 @@ export class VorgangService { stateResource$.next({ ...stateResource$.value, loading: true }); } - loadAttachments(vorgang: VorgangWithEingangResource): void { - if (this.hasAttachments(vorgang)) { + getAttachments(vorgang: VorgangWithEingangResource): Observable<StateResource<OzgFileListResource>> { + doIfLoadingRequired(this.attachments$.value, () => { this.setStateResourceOnLoading(this.attachments$); this.vorgangRepository.getAttachments(vorgang).pipe(first()) .subscribe(result => this.attachments$.next(createStateResource(result))) - } - } - - private hasAttachments(vorgang: VorgangWithEingangResource): boolean { - return hasLink(vorgang, VorgangWithEingangLinkRel.ATTACHMENTS); - } - - getAttachments(): Observable<StateResource<OzgFileListResource>> { - return this.attachments$; + }) + return this.attachments$.asObservable(); } private listenForLeavingVorgang(): void { @@ -149,6 +143,7 @@ export class VorgangService { this.clearVorgang(); this.clearPendingForwardCommand(); this.clearPendingSendPostfachMailCommand(); + this.clearAttachments(); } } @@ -164,6 +159,10 @@ export class VorgangService { this.pendingSendPostfachMailCommand$.next(createEmptyStateResource()); } + clearAttachments(): void { + this.attachments$.next(createEmptyStateResource()); + } + getVorgang(): VorgangResource { return this.vorgangWithEingang$.value.resource; }