diff --git a/alfa-client/libs/wiedervorlage-shared/src/lib/wiedervorlage.service.spec.ts b/alfa-client/libs/wiedervorlage-shared/src/lib/wiedervorlage.service.spec.ts index 4d6c0e5ba0bca3a14b4e33d989d737fa379552ff..e5de206c374792dc517fe2ae1cfbd7edab08a699 100644 --- a/alfa-client/libs/wiedervorlage-shared/src/lib/wiedervorlage.service.spec.ts +++ b/alfa-client/libs/wiedervorlage-shared/src/lib/wiedervorlage.service.spec.ts @@ -24,7 +24,6 @@ import { BinaryFileService } from '@alfa-client/binary-file-shared'; import { CommandOrder, CommandResource, CommandService } from '@alfa-client/command-shared'; import { NavigationService } from '@alfa-client/navigation-shared'; -import * as TechShared from '@alfa-client/tech-shared'; import { createEmptyStateResource, createStateResource, decodeUrlFromEmbedding, StateResource } from '@alfa-client/tech-shared'; import { Mock, mock, useFromMock } from '@alfa-client/test-utils'; import { SnackBarService } from '@alfa-client/ui'; @@ -35,14 +34,25 @@ import { cold, hot } from 'jest-marbles'; import { CommandLinkRel } from 'libs/command-shared/src/lib/command.linkrel'; import { createCommandResource } from 'libs/command-shared/test/command'; import { createVorgangResource, createVorgangWithEingangResource } from 'libs/vorgang-shared/test/vorgang'; -import { createWiedervorlage, createWiedervorlageListResource, createWiedervorlageResource, } from 'libs/wiedervorlage-shared/test/wiedervorlage'; -import { of } from 'rxjs'; +import { + createWiedervorlage, + createWiedervorlageListResource, + createWiedervorlageResource, +} from 'libs/wiedervorlage-shared/test/wiedervorlage'; +import { of, Subscription } from 'rxjs'; import { WiedervorlageLinkRel, WiedervorlageListLinkRel } from './wiedervorlage.linkrel'; import { WiedervorlageMessages } from './wiedervorlage.message'; -import { Wiedervorlage, WIEDERVORLAGE_UPLOADED_ATTACHMENTS, WiedervorlageListResource, WiedervorlageResource, } from './wiedervorlage.model'; +import { + Wiedervorlage, + WIEDERVORLAGE_UPLOADED_ATTACHMENTS, + WiedervorlageListResource, + WiedervorlageResource, +} from './wiedervorlage.model'; import { WiedervorlageRepository } from './wiedervorlage.repository'; import { WiedervorlageService } from './wiedervorlage.service'; +import * as TechShared from '@alfa-client/tech-shared'; + jest.mock('@alfa-client/tech-shared', () => mockAsEsModule('@alfa-client/tech-shared')); function mockAsEsModule(module: string) { @@ -59,11 +69,14 @@ describe('WiedervorlageService', () => { let commandService: Mock<CommandService>; let snackbarService: Mock<SnackBarService>; let binaryFileService: Mock<BinaryFileService>; - let vorgangService: Mock<VorgangService> = mock(VorgangService); + let vorgangService: Mock<VorgangService>; const vorgangResource: VorgangWithEingangResource = createVorgangWithEingangResource(); + const vorgangWithEingangStateResource: StateResource<VorgangWithEingangResource> = createStateResource(vorgangResource); + const wiedervorlageResource: WiedervorlageResource = createWiedervorlageResource(); const wiedervorlage: Wiedervorlage = createWiedervorlage(); + const commandResource: CommandResource = createCommandResource(); const commandResourceWithEffectedResourceLink: CommandResource = createCommandResource([CommandLinkRel.EFFECTED_RESOURCE]); @@ -73,7 +86,10 @@ describe('WiedervorlageService', () => { commandService = mock(CommandService); snackbarService = mock(SnackBarService); binaryFileService = mock(BinaryFileService); - vorgangService = mock(VorgangService); + vorgangService = { + ...mock(VorgangService), + getVorgangWithEingang: jest.fn().mockReturnValue(of(vorgangWithEingangStateResource)), + }; navigationService.urlChanged.mockReturnValue(of({})); @@ -93,10 +109,6 @@ describe('WiedervorlageService', () => { const vorgangWithEingangStateResource: StateResource<VorgangWithEingangResource> = createStateResource(vorgangResource); - beforeEach(() => { - vorgangService.getVorgangWithEingang.mockReturnValue(of(vorgangWithEingangStateResource)); - }); - it('should call vorgangFacade getVorgangWithEingang', () => { service.getWiedervorlageList(); @@ -142,6 +154,16 @@ describe('WiedervorlageService', () => { const wiedervorlageListStateResource: StateResource<WiedervorlageListResource> = createStateResource(wiedervorlageListResource); + beforeEach(() => { + service._refreshVorgangSubscription = jest.fn(); + }); + + it('should call refresh vorgang subscription', () => { + service.getWiedervorlageListByGivenVorgang(vorgang); + + expect(service._refreshVorgangSubscription).toHaveBeenCalled(); + }); + it('should return initial value', () => { service.wiedervorlageList$.asObservable = jest.fn().mockReturnValue(hot('-a', { a: wiedervorlageListResource })); @@ -169,6 +191,24 @@ describe('WiedervorlageService', () => { }); }); + describe('refresh vorgang subscription', () => { + beforeEach(() => { + service.vorgangSubscription = <any>mock(Subscription); + service._listenToVorgangChange = jest.fn(); + }); + + it('should unsubscribe existing subscription', () => { + service._refreshVorgangSubscription(); + + expect(service.vorgangSubscription.unsubscribe).toHaveBeenCalled(); + }); + it('should call listen to vorgang change', () => { + service._refreshVorgangSubscription(); + + expect(service._listenToVorgangChange).toHaveBeenCalled(); + }); + }); + describe('getWiedervorlage', () => { const wiedervorlage: WiedervorlageResource = createWiedervorlageResource(); const wiedervorlageStateResource: StateResource<WiedervorlageResource> = createStateResource(wiedervorlage); @@ -534,4 +574,63 @@ describe('WiedervorlageService', () => { expect(binaryFileService.clearUploadedFiles).toHaveBeenCalledWith(WIEDERVORLAGE_UPLOADED_ATTACHMENTS); }); }); + + describe('listen to vorgang change', () => { + beforeEach(() => { + service._handleVorgangChange = jest.fn(); + }); + + it('should call vorgang service to get vorgang with eingang', () => { + service._listenToVorgangChange(); + + expect(vorgangService.getVorgangWithEingang).toHaveBeenCalled(); + }); + + it('should call handle vorgang change', () => { + service._listenToVorgangChange(); + + expect(service._handleVorgangChange).toHaveBeenCalledWith(vorgangWithEingangStateResource); + }); + }); + + describe('handle vorgang change', () => { + it('should set reload flag if list is loaded and state resource is loading', () => { + service.shouldReload = false; + service.wiedervorlageList$.next(createStateResource(createWiedervorlageListResource())); + + service._handleVorgangChange({ ...vorgangWithEingangStateResource, loading: true }); + + expect(service.shouldReload).toBeTruthy(); + }); + + it('should set reload flag if list is loaded and state resource is reloading', () => { + service.wiedervorlageList$.next(createStateResource(createWiedervorlageListResource())); + service.shouldReload = false; + + service._handleVorgangChange({ ...vorgangWithEingangStateResource, reload: true }); + + expect(service.shouldReload).toBeTruthy(); + }); + + describe('on setted reload flag', () => { + beforeEach(() => { + service.setWiedervorlageListReload = jest.fn(); + service.shouldReload = true; + }); + + describe('and loaded vorgang resource', () => { + it('should call set wiedervorlage list reload', () => { + service._handleVorgangChange(vorgangWithEingangStateResource); + + expect(service.setWiedervorlageListReload).toHaveBeenCalled(); + }); + + it('and loaded vorgang resource should call set wiedervorlage list reload', () => { + service._handleVorgangChange(vorgangWithEingangStateResource); + + expect(service.shouldReload).toBeFalsy(); + }); + }); + }); + }); }); diff --git a/alfa-client/libs/wiedervorlage-shared/src/lib/wiedervorlage.service.ts b/alfa-client/libs/wiedervorlage-shared/src/lib/wiedervorlage.service.ts index 208bf667e34a682bf13a4022276667409c9f4831..a33839c5dc0e02cbee261d5468769b59dbb888cd 100644 --- a/alfa-client/libs/wiedervorlage-shared/src/lib/wiedervorlage.service.ts +++ b/alfa-client/libs/wiedervorlage-shared/src/lib/wiedervorlage.service.ts @@ -24,9 +24,20 @@ import { BinaryFileService } from '@alfa-client/binary-file-shared'; import { CommandOrder, CommandResource, CommandService, CreateCommand, isDone } from '@alfa-client/command-shared'; import { NavigationService } from '@alfa-client/navigation-shared'; -import { createEmptyStateResource, createStateResource, decodeUrlFromEmbedding, doIfLoadingRequired, hasStateResourceError, isNotNull, isNotUndefined, replacePlaceholder, StateResource, } from '@alfa-client/tech-shared'; +import { + createEmptyStateResource, + createStateResource, + decodeUrlFromEmbedding, + doIfLoadingRequired, + hasStateResourceError, + isLoaded, + isNotNull, + isNotUndefined, + replacePlaceholder, + StateResource, +} from '@alfa-client/tech-shared'; import { SnackBarService } from '@alfa-client/ui'; -import { VorgangHeaderLinkRel, VorgangResource, VorgangService } from '@alfa-client/vorgang-shared'; +import { VorgangHeaderLinkRel, VorgangResource, VorgangService, VorgangWithEingangResource } from '@alfa-client/vorgang-shared'; import { Injectable, OnDestroy } from '@angular/core'; import { Params } from '@angular/router'; import { hasLink, ResourceUri } from '@ngxp/rest'; @@ -35,7 +46,12 @@ import { BehaviorSubject, combineLatest, Observable, Subscription } from 'rxjs'; import { filter, map, startWith, tap } from 'rxjs/operators'; import { WiedervorlageLinkRel, WiedervorlageListLinkRel } from './wiedervorlage.linkrel'; import { WiedervorlageMessages } from './wiedervorlage.message'; -import { Wiedervorlage, WIEDERVORLAGE_UPLOADED_ATTACHMENTS, WiedervorlageListResource, WiedervorlageResource, } from './wiedervorlage.model'; +import { + Wiedervorlage, + WIEDERVORLAGE_UPLOADED_ATTACHMENTS, + WiedervorlageListResource, + WiedervorlageResource, +} from './wiedervorlage.model'; import { WiedervorlageRepository } from './wiedervorlage.repository'; import { WiedervorlageRoutes } from './wiedervorlage.route'; import { createErledigenCommand, createWiedereroeffnenCommand } from './wiedervorlage.util'; @@ -62,7 +78,10 @@ export class WiedervorlageService implements OnDestroy { StateResource<CommandResource> >(createEmptyStateResource<CommandResource>()); + shouldReload: boolean = false; + private subscription: Subscription; + vorgangSubscription: Subscription; constructor( private repository: WiedervorlageRepository, @@ -73,6 +92,7 @@ export class WiedervorlageService implements OnDestroy { private vorgangService: VorgangService, ) { this.listenToNavigation(); + this._listenToVorgangChange(); } public getWiedervorlageList(): Observable<StateResource<WiedervorlageListResource>> { @@ -90,10 +110,41 @@ export class WiedervorlageService implements OnDestroy { public getWiedervorlageListByGivenVorgang( vorgangResource: VorgangResource, ): Observable<StateResource<WiedervorlageListResource>> { + this._refreshVorgangSubscription(); doIfLoadingRequired(this.wiedervorlageList$.value, () => this.loadWiedervorlagenByVorgang(vorgangResource)); return this.wiedervorlageList$.asObservable(); } + _refreshVorgangSubscription(): void { + this.vorgangSubscription.unsubscribe(); + this._listenToVorgangChange(); + } + + _listenToVorgangChange() { + this.vorgangSubscription = this.vorgangService + .getVorgangWithEingang() + .subscribe((vorgangWithEingangStateResource: StateResource<VorgangWithEingangResource>) => + this._handleVorgangChange(vorgangWithEingangStateResource), + ); + } + + _handleVorgangChange(vorgangWithEingangStateResource: StateResource<VorgangWithEingangResource>): void { + if (this.shouldReloadList(vorgangWithEingangStateResource)) { + this.shouldReload = true; + } + if (isLoaded(vorgangWithEingangStateResource) && this.shouldReload) { + this.setWiedervorlageListReload(); + this.shouldReload = false; + } + } + + private shouldReloadList(vorgangWithEingangStateResource: StateResource<VorgangWithEingangResource>): boolean { + return ( + (vorgangWithEingangStateResource.loading || vorgangWithEingangStateResource.reload) && + isNotNull(this.wiedervorlageList$.value.resource) + ); + } + loadWiedervorlagenByVorgang(vorgangResource: VorgangResource): void { if (hasLink(vorgangResource, VorgangHeaderLinkRel.WIEDERVORLAGEN)) { const subscription: Subscription = this.repository.getWiedervorlageList(vorgangResource).subscribe((wiedervorlagenList) => { diff --git a/alfa-client/libs/wiedervorlage/src/lib/wiedervorlage-list-in-vorgang-container/wiedervorlage-list-in-vorgang-container.component.ts b/alfa-client/libs/wiedervorlage/src/lib/wiedervorlage-list-in-vorgang-container/wiedervorlage-list-in-vorgang-container.component.ts index 6a99467e90164b63414677a0e80f4f9ea2470759..49636b773f656e428d851532fd44bacffbe80abf 100644 --- a/alfa-client/libs/wiedervorlage/src/lib/wiedervorlage-list-in-vorgang-container/wiedervorlage-list-in-vorgang-container.component.ts +++ b/alfa-client/libs/wiedervorlage/src/lib/wiedervorlage-list-in-vorgang-container/wiedervorlage-list-in-vorgang-container.component.ts @@ -21,11 +21,11 @@ * Die sprachspezifischen Genehmigungen und Beschränkungen * unter der Lizenz sind dem Lizenztext zu entnehmen. */ -import { Component, Input, OnChanges } from '@angular/core'; -import { StateResource } from '@alfa-client/tech-shared'; +import { createEmptyStateResource, StateResource } from '@alfa-client/tech-shared'; import { VorgangHeaderLinkRel, VorgangResource } from '@alfa-client/vorgang-shared'; import { WiedervorlageListResource, WiedervorlageService } from '@alfa-client/wiedervorlage-shared'; -import { Observable } from 'rxjs'; +import { Component, Input, OnChanges } from '@angular/core'; +import { Observable, of } from 'rxjs'; @Component({ selector: 'alfa-wiedervorlage-list-in-vorgang-container', @@ -35,7 +35,8 @@ import { Observable } from 'rxjs'; export class WiedervorlageListInVorgangContainerComponent implements OnChanges { @Input() vorgangStateResource: StateResource<VorgangResource>; - wiedervorlagenStateResource$: Observable<StateResource<WiedervorlageListResource>>; + wiedervorlagenStateResource$: Observable<StateResource<WiedervorlageListResource>> = + of(createEmptyStateResource<WiedervorlageListResource>()); readonly vorgangLinkRel = VorgangHeaderLinkRel; @@ -43,10 +44,9 @@ export class WiedervorlageListInVorgangContainerComponent implements OnChanges { ngOnChanges(): void { this.reloadWiedervorlageListOnVorgangReload(); - this.wiedervorlagenStateResource$ = - this.wiedervorlageService.getWiedervorlageListByGivenVorgang( - this.vorgangStateResource.resource, - ); + this.wiedervorlagenStateResource$ = this.wiedervorlageService.getWiedervorlageListByGivenVorgang( + this.vorgangStateResource.resource, + ); } reloadWiedervorlageListOnVorgangReload(): void {