Skip to content
Snippets Groups Projects
Commit 3f593904 authored by Martin's avatar Martin
Browse files

OZG-7501 refresh wiedervorlage list on vorgang change

parent f350017e
No related branches found
No related tags found
2 merge requests!107Ozg 7473 e2e,!105Ozg 7501 adjust loading
......@@ -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();
});
});
});
});
});
......@@ -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) => {
......
......@@ -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,8 +44,7 @@ export class WiedervorlageListInVorgangContainerComponent implements OnChanges {
ngOnChanges(): void {
this.reloadWiedervorlageListOnVorgangReload();
this.wiedervorlagenStateResource$ =
this.wiedervorlageService.getWiedervorlageListByGivenVorgang(
this.wiedervorlagenStateResource$ = this.wiedervorlageService.getWiedervorlageListByGivenVorgang(
this.vorgangStateResource.resource,
);
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment