diff --git a/alfa-client/libs/command-shared/src/lib/command.model.ts b/alfa-client/libs/command-shared/src/lib/command.model.ts index a64cb0dd5f581ff2a55b66d3ab9e56f22223841a..b86ac920fbeab00514c3cf45b7ae0f88e7ff7ce3 100644 --- a/alfa-client/libs/command-shared/src/lib/command.model.ts +++ b/alfa-client/libs/command-shared/src/lib/command.model.ts @@ -73,6 +73,7 @@ export enum CommandOrder { VORGANG_ZURUECKHOLEN = 'VORGANG_ZURUECKHOLEN', VORGANG_BEARBEITEN = 'VORGANG_BEARBEITEN', VORGANG_BESCHEIDEN = 'VORGANG_BESCHEIDEN', + FORWARD_VORGANG = 'FORWARD_VORGANG', VORGANG_ZURUECKSTELLEN = 'VORGANG_ZURUECKSTELLEN', VORGANG_ABSCHLIESSEN = 'VORGANG_ABSCHLIESSEN', VORGANG_WIEDEREROEFFNEN = 'VORGANG_WIEDEREROEFFNEN', @@ -98,3 +99,5 @@ export interface CreateCommandProps { snackBarMessage?: string; snackBarErrorMessage?: string; } + +export type CreateCommandPropsWithoutResource = Omit<CreateCommandProps, 'resource'>; diff --git a/alfa-client/libs/command-shared/test/command.ts b/alfa-client/libs/command-shared/test/command.ts index ff7aae6c8ba99ae02f921c49b9a789c675e404bd..05fec9de4806f6473cf2d4204ee196ed71db5da0 100644 --- a/alfa-client/libs/command-shared/test/command.ts +++ b/alfa-client/libs/command-shared/test/command.ts @@ -35,6 +35,7 @@ import { CommandStatus, CreateCommand, CreateCommandProps, + CreateCommandPropsWithoutResource, } from '../src/lib/command.model'; export function createCommand(): Command { @@ -85,8 +86,11 @@ export function createCreateCommand(order: CommandOrder = CommandOrder.VORGANG_A } export function createCreateCommandProps(): CreateCommandProps { + return { ...createCreateCommandPropsWithoutResource(), resource: createCommandResource() }; +} + +export function createCreateCommandPropsWithoutResource(): CreateCommandPropsWithoutResource { return { - resource: createCommandResource(), linkRel: faker.internet.url(), command: createCreateCommand(), snackBarMessage: faker.word.sample(5), diff --git a/alfa-client/libs/forwarding-shared/src/lib/forwarding.repository.spec.ts b/alfa-client/libs/forwarding-shared/src/lib/forwarding.repository.spec.ts index 34a7bd065f0c85b3ddc80a39d2fbe195e9c33655..8c472b9da3215b624913bf869c367887ab97c27f 100644 --- a/alfa-client/libs/forwarding-shared/src/lib/forwarding.repository.spec.ts +++ b/alfa-client/libs/forwarding-shared/src/lib/forwarding.repository.spec.ts @@ -21,8 +21,10 @@ * Die sprachspezifischen Genehmigungen und Beschränkungen * unter der Lizenz sind dem Lizenztext zu entnehmen. */ +import { LinkRelationName } from '@alfa-client/tech-shared'; import { mock, useFromMock } from '@alfa-client/test-utils'; import { VorgangWithEingangLinkRel, VorgangWithEingangResource } from '@alfa-client/vorgang-shared'; +import { faker } from '@faker-js/faker/.'; import { ResourceFactory } from '@ngxp/rest'; import { cold, hot } from 'jest-marbles'; import { createForwardingListResource } from 'libs/forwarding-shared/test/forwarding'; @@ -45,25 +47,26 @@ describe('ForwardingRepository', () => { describe('getForwardings', () => { const vorgang: VorgangWithEingangResource = createVorgangWithEingangResource([VorgangWithEingangLinkRel.FORWARD_BY_EMAIL]); const commandList: ForwardingListResource = createForwardingListResource(); + const linkRel: LinkRelationName = faker.string.alpha(5); beforeEach(() => { resourceWrapper.get.mockReturnValue(hot('a', { a: commandList })); }); it('should call resourceFactory', () => { - repository.getForwardings(vorgang); + repository.getForwardings(vorgang, linkRel); expect(resourceFactory.from).toHaveBeenCalledWith(vorgang); }); it('should call resourceWrapper', () => { - repository.getForwardings(vorgang); + repository.getForwardings(vorgang, linkRel); - expect(resourceWrapper.get).toHaveBeenCalledWith(VorgangWithEingangLinkRel.FORWARD_BY_EMAIL); + expect(resourceWrapper.get).toHaveBeenCalledWith(linkRel); }); it('should return result', () => { - let result = repository.getForwardings(vorgang); + let result = repository.getForwardings(vorgang, linkRel); expect(result).not.toBeNull(); expect(result).toBeObservable(cold('a', { a: commandList })); diff --git a/alfa-client/libs/forwarding-shared/src/lib/forwarding.repository.ts b/alfa-client/libs/forwarding-shared/src/lib/forwarding.repository.ts index a83ca3536dabe921ff4dc10719dbbdd1f5c74943..acd33b4bc2523a2761e420640d1d422cbdbca088 100644 --- a/alfa-client/libs/forwarding-shared/src/lib/forwarding.repository.ts +++ b/alfa-client/libs/forwarding-shared/src/lib/forwarding.repository.ts @@ -21,7 +21,8 @@ * Die sprachspezifischen Genehmigungen und Beschränkungen * unter der Lizenz sind dem Lizenztext zu entnehmen. */ -import { VorgangWithEingangLinkRel, VorgangWithEingangResource } from '@alfa-client/vorgang-shared'; +import { LinkRelationName } from '@alfa-client/tech-shared'; +import { VorgangWithEingangResource } from '@alfa-client/vorgang-shared'; import { Injectable } from '@angular/core'; import { ResourceFactory } from '@ngxp/rest'; import { Observable } from 'rxjs'; @@ -31,7 +32,7 @@ import { ForwardingListResource } from './forwarding.model'; export class ForwardingRepository { constructor(private resourceFactory: ResourceFactory) {} - public getForwardings(vorgang: VorgangWithEingangResource): Observable<ForwardingListResource> { - return this.resourceFactory.from(vorgang).get(VorgangWithEingangLinkRel.FORWARD_BY_EMAIL); + public getForwardings(vorgang: VorgangWithEingangResource, linkRel: LinkRelationName): Observable<ForwardingListResource> { + return this.resourceFactory.from(vorgang).get(linkRel); } } diff --git a/alfa-client/libs/forwarding-shared/src/lib/forwarding.service.spec.ts b/alfa-client/libs/forwarding-shared/src/lib/forwarding.service.spec.ts index afb141693929a6b51c1d096d58510076816fdc0a..f3f631dfbcb316d354a18b2c2fab9299d347cd91 100644 --- a/alfa-client/libs/forwarding-shared/src/lib/forwarding.service.spec.ts +++ b/alfa-client/libs/forwarding-shared/src/lib/forwarding.service.spec.ts @@ -21,9 +21,10 @@ * Die sprachspezifischen Genehmigungen und Beschränkungen * unter der Lizenz sind dem Lizenztext zu entnehmen. */ -import { CommandOrder, CommandResource, CommandService } from '@alfa-client/command-shared'; +import { CommandOrder, CommandResource, CommandService, CreateCommandPropsWithoutResource } from '@alfa-client/command-shared'; import { NavigationService } from '@alfa-client/navigation-shared'; import { + EMPTY_STRING, StateResource, createEmptyStateResource, createErrorStateResource, @@ -38,16 +39,19 @@ import { VorgangWithEingangLinkRel, VorgangWithEingangResource, } from '@alfa-client/vorgang-shared'; -import { cold, hot } from 'jest-marbles'; +import { faker } from '@faker-js/faker/.'; +import { ResourceUri } from '@ngxp/rest'; +import { hot } from 'jest-marbles'; import { CommandLinkRel } from 'libs/command-shared/src/lib/command.linkrel'; -import { createCommandResource } from 'libs/command-shared/test/command'; +import { createCommandResource, createCreateCommandPropsWithoutResource } from 'libs/command-shared/test/command'; import { createVorgangForwardRequest, createVorgangResource, createVorgangWithEingangResource, } from 'libs/vorgang-shared/test/vorgang'; -import { of } from 'rxjs'; +import { Observable, of } from 'rxjs'; import { createApiError } from '../../../tech-shared/test/error'; +import { multipleCold, singleColdCompleted } from '../../../tech-shared/test/marbles'; import { createForwardingListResource, createForwardingResource } from '../../test/forwarding'; import { ForwardingLinkRel } from './forwarding.linkrel'; import { ForwardingListResource, ForwardingResource } from './forwarding.model'; @@ -82,10 +86,9 @@ describe('ForwardingService', () => { expect(service).toBeTruthy(); }); - describe('forward', () => { + describe('forward by email', () => { const vorgang: VorgangResource = createVorgangResource(); - const commandStateResource: StateResource<CommandResource> = - createStateResource(createCommandResource()); + const commandStateResource: StateResource<CommandResource> = createStateResource(createCommandResource()); beforeEach(() => { commandService.createCommand.mockReturnValue(of(commandStateResource)); @@ -99,31 +102,27 @@ describe('ForwardingService', () => { body: null, }; - service.forward(vorgang, forwardRequest); + service.forwardByEmail(vorgang, forwardRequest); - expect(commandService.createCommand).toHaveBeenCalledWith( - vorgang, - VorgangWithEingangLinkRel.FORWARD, - command, - ); + expect(commandService.createCommand).toHaveBeenCalledWith(vorgang, VorgangWithEingangLinkRel.FORWARD, command); }); it('should call reloadCurrentVorgang', () => { service.reloadCurrentVorgang = jest.fn(); - service.forward(vorgang, forwardRequest); + service.forwardByEmail(vorgang, forwardRequest); expect(service.reloadCurrentVorgang).toHaveBeenCalled(); }); it('should call setPendingForwardSingleCommandLoading', () => { - service.forward(vorgang, forwardRequest); + service.forwardByEmail(vorgang, forwardRequest); expect(vorgangService.setPendingForwardSingleCommandLoading).toHaveBeenCalled(); }); it('should call setPendingForwardSingleCommand', () => { - service.forward(vorgang, forwardRequest); + service.forwardByEmail(vorgang, forwardRequest); expect(vorgangService.setPendingForwardSingleCommand).toHaveBeenCalled(); }); @@ -169,16 +168,12 @@ describe('ForwardingService', () => { }); it('should call vorgangservice on command is done', () => { - const commandServiceReturnValue = createStateResource( - createCommandResource([CommandLinkRel.EFFECTED_RESOURCE]), - ); + const commandServiceReturnValue = createStateResource(createCommandResource([CommandLinkRel.EFFECTED_RESOURCE])); commandService.pollCommand.mockReturnValue(of(commandServiceReturnValue)); service.pollPendingForwardCommand(createStateResource(commandResourceWithUpdateLink)); - expect(vorgangService.setPendingForwardSingleCommand).toHaveBeenCalledWith( - commandServiceReturnValue, - ); + expect(vorgangService.setPendingForwardSingleCommand).toHaveBeenCalledWith(commandServiceReturnValue); }); it('should call not vorgangservice on pending command', () => { @@ -237,7 +232,7 @@ describe('ForwardingService', () => { }); }); - describe('getForwardings', () => { + describe('get forwardings by email', () => { const vorgang: VorgangWithEingangResource = createVorgangWithEingangResource(); const listResource: ForwardingListResource = createForwardingListResource(); @@ -246,17 +241,15 @@ describe('ForwardingService', () => { }); it('should return value', () => { - const result = service.getForwardings(vorgang); + const result: Observable<StateResource<ForwardingListResource>> = service.getForwardingsByEmail(vorgang); - expect(result).toBeObservable( - cold('ab', { a: createEmptyStateResource(true), b: createStateResource(listResource) }), - ); + expect(result).toBeObservable(multipleCold(createEmptyStateResource(true), createStateResource(listResource))); }); it('should call repository', () => { - service.getForwardings(vorgang); + service.getForwardingsByEmail(vorgang); - expect(forwardingRepository.getForwardings).toHaveBeenCalledWith(vorgang); + expect(forwardingRepository.getForwardings).toHaveBeenCalledWith(vorgang, VorgangWithEingangLinkRel.FORWARD_BY_EMAIL); }); }); @@ -273,10 +266,7 @@ describe('ForwardingService', () => { order: CommandOrder.FORWARD_SUCCESSFULL, body: null, }); - - expect(result).toBeObservable( - cold('ab', { a: createEmptyStateResource(true), b: stateResource }), - ); + expect(result).toBeObservable(multipleCold(createEmptyStateResource(true), stateResource)); }); }); @@ -284,11 +274,10 @@ describe('ForwardingService', () => { it('should call command service', () => { service.markAsSuccess(forwading); - expect(commandService.createCommand).toHaveBeenCalledWith( - forwading, - ForwardingLinkRel.MARK_AS_SUCCESS, - { order: CommandOrder.FORWARD_SUCCESSFULL, body: null }, - ); + expect(commandService.createCommand).toHaveBeenCalledWith(forwading, ForwardingLinkRel.MARK_AS_SUCCESS, { + order: CommandOrder.FORWARD_SUCCESSFULL, + body: null, + }); }); it('should update list on valid response', () => { @@ -306,11 +295,10 @@ describe('ForwardingService', () => { it('should call command service', () => { service.markAsFail(forwading); - expect(commandService.createCommand).toHaveBeenCalledWith( - forwading, - ForwardingLinkRel.MARK_AS_FAIL, - { order: CommandOrder.FORWARD_FAILED, body: null }, - ); + expect(commandService.createCommand).toHaveBeenCalledWith(forwading, ForwardingLinkRel.MARK_AS_FAIL, { + order: CommandOrder.FORWARD_FAILED, + body: null, + }); }); it('should update vorgang on valid response', () => { @@ -368,4 +356,60 @@ describe('ForwardingService', () => { expect(service.setList).toHaveBeenCalledWith(list); }); }); + + describe('forward', () => { + const forwardingToUri: ResourceUri = faker.internet.url(); + + const createCommandProps: CreateCommandPropsWithoutResource = createCreateCommandPropsWithoutResource(); + const commandResource: CommandResource = createCommandResource(); + const commandStateResource: StateResource<CommandResource> = createStateResource(commandResource); + + beforeEach(() => { + vorgangService.createCommand.mockReturnValue(of(commandStateResource)); + service._buildForwardCreateCommandProps = jest.fn().mockReturnValue(createCommandProps); + }); + + it('should call build forward create command', () => { + service.forward(forwardingToUri).subscribe(); + + expect(service._buildForwardCreateCommandProps).toHaveBeenCalledWith(forwardingToUri); + }); + + it('should call vorgang service to create command', () => { + service.forward(forwardingToUri).subscribe(); + + expect(vorgangService.createCommand).toHaveBeenCalledWith(createCommandProps, true); + }); + + it('should return response from command service', () => { + const forwardCommand$: Observable<StateResource<CommandResource>> = service.forward(forwardingToUri); + + expect(forwardCommand$).toBeObservable(singleColdCompleted(commandStateResource)); + }); + }); + + describe('build forward command props', () => { + const forwardingToUri: ResourceUri = faker.internet.url(); + + it('should contains linkrel', () => { + const commandProps: CreateCommandPropsWithoutResource = service._buildForwardCreateCommandProps(forwardingToUri); + + expect(commandProps.linkRel).toBe(VorgangWithEingangLinkRel.FORWARD_BY_OZGCLOUD); + }); + + it('should contains command', () => { + const commandProps: CreateCommandPropsWithoutResource = service._buildForwardCreateCommandProps(forwardingToUri); + + expect(commandProps.command).toEqual({ + order: CommandOrder.FORWARD_VORGANG, + body: { organisationEinheitId: forwardingToUri }, + }); + }); + + it('should contains empty snackbar message', () => { + const commandProps: CreateCommandPropsWithoutResource = service._buildForwardCreateCommandProps(forwardingToUri); + + expect(commandProps.snackBarMessage).toBe(EMPTY_STRING); + }); + }); }); diff --git a/alfa-client/libs/forwarding-shared/src/lib/forwarding.service.ts b/alfa-client/libs/forwarding-shared/src/lib/forwarding.service.ts index 73510b902a2a9408905b9af3124bba1ab81efe47..b84c9d5c0ee51ea7e6464997fd24106a8c91fbf4 100644 --- a/alfa-client/libs/forwarding-shared/src/lib/forwarding.service.ts +++ b/alfa-client/libs/forwarding-shared/src/lib/forwarding.service.ts @@ -21,17 +21,18 @@ * Die sprachspezifischen Genehmigungen und Beschränkungen * unter der Lizenz sind dem Lizenztext zu entnehmen. */ -import { Injectable, OnDestroy } from '@angular/core'; -import { Params } from '@angular/router'; import { + CommandOrder, CommandResource, CommandService, CreateCommand, + CreateCommandPropsWithoutResource, isDone, isPending, } from '@alfa-client/command-shared'; import { NavigationService } from '@alfa-client/navigation-shared'; import { + EMPTY_STRING, StateResource, createEmptyStateResource, createStateResource, @@ -45,21 +46,22 @@ import { VorgangWithEingangResource, createForwardCommand, } from '@alfa-client/vorgang-shared'; +import { Injectable, OnDestroy } from '@angular/core'; +import { Params } from '@angular/router'; +import { ResourceUri } from '@ngxp/rest'; import { isNil } from 'lodash-es'; import { BehaviorSubject, Observable, Subscription } from 'rxjs'; import { first, map, startWith, tap } from 'rxjs/operators'; import { ForwardingLinkRel } from './forwarding.linkrel'; import { ForwardingListResource, ForwardingResource } from './forwarding.model'; import { ForwardingRepository } from './forwarding.repository'; -import { - createForwardingMarkAsFailCommand, - createForwardingMarkAsSuccessCommand, -} from './forwarding.util'; +import { createForwardingMarkAsFailCommand, createForwardingMarkAsSuccessCommand } from './forwarding.util'; @Injectable({ providedIn: 'root' }) export class ForwardingService implements OnDestroy { - private readonly forwardingList$: BehaviorSubject<StateResource<ForwardingListResource>> = - new BehaviorSubject(createEmptyStateResource<ForwardingListResource>()); + private readonly forwardingList$: BehaviorSubject<StateResource<ForwardingListResource>> = new BehaviorSubject( + createEmptyStateResource<ForwardingListResource>(), + ); private navigationSubscription: Subscription; private subscription: Subscription; @@ -71,15 +73,15 @@ export class ForwardingService implements OnDestroy { private forwardingRepository: ForwardingRepository, ) {} - getForwardings( - vorgang: VorgangWithEingangResource, - ): Observable<StateResource<ForwardingListResource>> { + getForwardingsByEmail(vorgang: VorgangWithEingangResource): Observable<StateResource<ForwardingListResource>> { this.forwardingList$.next(createEmptyStateResource(true)); - const subscription = this.forwardingRepository.getForwardings(vorgang).subscribe((list) => { - this.forwardingList$.next(createStateResource(list)); - subscription.unsubscribe(); - }); + const subscription = this.forwardingRepository + .getForwardings(vorgang, VorgangWithEingangLinkRel.FORWARD_BY_EMAIL) + .subscribe((listResource: ForwardingListResource) => { + this.forwardingList$.next(createStateResource(listResource)); + subscription.unsubscribe(); + }); return this.forwardingList$.asObservable(); } @@ -94,9 +96,7 @@ export class ForwardingService implements OnDestroy { listenToNavigation(): void { this.unsubscribe(); - this.navigationSubscription = this.navigationService - .urlChanged() - .subscribe((params) => this.onNavigation(params)); + this.navigationSubscription = this.navigationService.urlChanged().subscribe((params) => this.onNavigation(params)); } onNavigation(params: Params): void { @@ -105,19 +105,15 @@ export class ForwardingService implements OnDestroy { } } - pollPendingForwardCommand( - command: StateResource<CommandResource>, - ): StateResource<CommandResource> { + pollPendingForwardCommand(command: StateResource<CommandResource>): StateResource<CommandResource> { if (this.shouldPoll(command)) { - this.subscription = this.commandService - .pollCommand(command.resource) - .subscribe((updatedCommand) => { - if (isDone(updatedCommand.resource)) { - this.vorgangService.setPendingForwardSingleCommand(updatedCommand); - this.reloadCurrentVorgang(updatedCommand); - this.subscription.unsubscribe(); - } - }); + this.subscription = this.commandService.pollCommand(command.resource).subscribe((updatedCommand) => { + if (isDone(updatedCommand.resource)) { + this.vorgangService.setPendingForwardSingleCommand(updatedCommand); + this.reloadCurrentVorgang(updatedCommand); + this.subscription.unsubscribe(); + } + }); } return command; } @@ -126,10 +122,7 @@ export class ForwardingService implements OnDestroy { return command.loaded && isPending(command.resource); } - public forward( - vorgang: VorgangResource, - request: ForwardRequest, - ): Observable<StateResource<CommandResource>> { + public forwardByEmail(vorgang: VorgangResource, request: ForwardRequest): Observable<StateResource<CommandResource>> { this.vorgangService.setPendingForwardSingleCommandLoading(); const subscription: Subscription = this.commandService .createCommand(vorgang, VorgangWithEingangLinkRel.FORWARD, createForwardCommand(request)) @@ -142,19 +135,13 @@ export class ForwardingService implements OnDestroy { } markAsSuccess(forward: ForwardingResource): Observable<StateResource<CommandResource>> { - return this.createMarkAsCommand( - forward, - ForwardingLinkRel.MARK_AS_SUCCESS, - createForwardingMarkAsSuccessCommand(), - ).pipe(tap((command) => this.updateForwardingList(command))); + return this.createMarkAsCommand(forward, ForwardingLinkRel.MARK_AS_SUCCESS, createForwardingMarkAsSuccessCommand()).pipe( + tap((command) => this.updateForwardingList(command)), + ); } markAsFail(forward: ForwardingResource): Observable<StateResource<CommandResource>> { - return this.createMarkAsCommand( - forward, - ForwardingLinkRel.MARK_AS_FAIL, - createForwardingMarkAsFailCommand(), - ).pipe( + return this.createMarkAsCommand(forward, ForwardingLinkRel.MARK_AS_FAIL, createForwardingMarkAsFailCommand()).pipe( tap((command) => { if (isDone(command.resource)) this.reloadCurrentVorgang(command); }), @@ -192,6 +179,22 @@ export class ForwardingService implements OnDestroy { this.forwardingList$.next(createStateResource(list)); } + public forward(forwardingToUri: ResourceUri): Observable<StateResource<CommandResource>> { + return this.vorgangService.createCommand(this._buildForwardCreateCommandProps(forwardingToUri), true); + } + + _buildForwardCreateCommandProps(forwardingToUri: ResourceUri): CreateCommandPropsWithoutResource { + return { + linkRel: VorgangWithEingangLinkRel.FORWARD_BY_OZGCLOUD, + command: this.createBuildForwardCommand(forwardingToUri), + snackBarMessage: EMPTY_STRING, + }; + } + + private createBuildForwardCommand(forwardingToUri: ResourceUri): CreateCommand { + return { order: CommandOrder.FORWARD_VORGANG, body: { organisationEinheitId: forwardingToUri } }; + } + ngOnDestroy(): void { this.unsubscribe(); } diff --git a/alfa-client/libs/forwarding/src/lib/forwarding-by-email-container/forwarding-by-email-container.component.spec.ts b/alfa-client/libs/forwarding/src/lib/forwarding-by-email-container/forwarding-by-email-container.component.spec.ts index a4dd016d064b1e6d4c377d4f37518d8f9811eb84..b7387f11528fc118117ad6ca0cb51e11850ec1e8 100644 --- a/alfa-client/libs/forwarding/src/lib/forwarding-by-email-container/forwarding-by-email-container.component.spec.ts +++ b/alfa-client/libs/forwarding/src/lib/forwarding-by-email-container/forwarding-by-email-container.component.spec.ts @@ -120,7 +120,7 @@ describe('ForwardingByEmailContainerComponent', () => { component.getForwardings(); - expect(service.getForwardings).not.toHaveBeenCalled(); + expect(service.getForwardingsByEmail).not.toHaveBeenCalled(); }); it('should call service get forward commands', () => { @@ -129,7 +129,7 @@ describe('ForwardingByEmailContainerComponent', () => { component.getForwardings(); - expect(service.getForwardings).toHaveBeenCalled(); + expect(service.getForwardingsByEmail).toHaveBeenCalled(); }); }); diff --git a/alfa-client/libs/forwarding/src/lib/forwarding-by-email-container/forwarding-by-email-container.component.ts b/alfa-client/libs/forwarding/src/lib/forwarding-by-email-container/forwarding-by-email-container.component.ts index f38fe66d56f971eef30db7804b5f8eea516853f1..bfc76dd9bd7bcb57c775bf38f8b60ab924c8f31b 100644 --- a/alfa-client/libs/forwarding/src/lib/forwarding-by-email-container/forwarding-by-email-container.component.ts +++ b/alfa-client/libs/forwarding/src/lib/forwarding-by-email-container/forwarding-by-email-container.component.ts @@ -65,7 +65,7 @@ export class ForwardingByEmailContainerComponent implements OnChanges { getForwardings(): void { if (hasLink(this.vorgang, VorgangWithEingangLinkRel.FORWARD_BY_EMAIL)) { - this.forwardingStateResources$ = this.forwardingService.getForwardings(this.vorgang); + this.forwardingStateResources$ = this.forwardingService.getForwardingsByEmail(this.vorgang); } } diff --git a/alfa-client/libs/forwarding/src/lib/forwarding-by-email-container/forwarding-by-email-formular/forwarding-by-email-form/forwarding-by-email-form.service.ts b/alfa-client/libs/forwarding/src/lib/forwarding-by-email-container/forwarding-by-email-formular/forwarding-by-email-form/forwarding-by-email-form.service.ts index 9cbe55ce655a5df52ab295788a8879602a7d9bb9..364d7e506e6e6b54ec5a84ecfb01f98ffebb9d9c 100644 --- a/alfa-client/libs/forwarding/src/lib/forwarding-by-email-container/forwarding-by-email-formular/forwarding-by-email-form/forwarding-by-email-form.service.ts +++ b/alfa-client/libs/forwarding/src/lib/forwarding-by-email-container/forwarding-by-email-formular/forwarding-by-email-form/forwarding-by-email-form.service.ts @@ -61,7 +61,7 @@ export class ForwardingByEmailFormService extends AbstractFormService<CommandRes } protected doSubmit(): Observable<StateResource<CommandResource>> { - return this.forwardingService.forward(this.vorgang, this.getFormValue()); + return this.forwardingService.forwardByEmail(this.vorgang, this.getFormValue()); } patchField(fieldName: string, value: string) { diff --git a/alfa-client/libs/forwarding/src/lib/forwarding-by-email-container/forwarding-by-email-formular/forwarding-by-email-form/forwarding-by-email.formservice.spec.ts b/alfa-client/libs/forwarding/src/lib/forwarding-by-email-container/forwarding-by-email-formular/forwarding-by-email-form/forwarding-by-email.formservice.spec.ts index a20bed0488696ecb79c97108a03d0c2b5f1a36f8..26483f43dbf893769e87f2c6589ff88744c84461 100644 --- a/alfa-client/libs/forwarding/src/lib/forwarding-by-email-container/forwarding-by-email-formular/forwarding-by-email-form/forwarding-by-email.formservice.spec.ts +++ b/alfa-client/libs/forwarding/src/lib/forwarding-by-email-container/forwarding-by-email-formular/forwarding-by-email-form/forwarding-by-email.formservice.spec.ts @@ -22,7 +22,7 @@ * unter der Lizenz sind dem Lizenztext zu entnehmen. */ import { ForwardingService } from '@alfa-client/forwarding-shared'; -import { mock, useFromMock } from '@alfa-client/test-utils'; +import { Mock, mock, useFromMock } from '@alfa-client/test-utils'; import { UntypedFormBuilder, UntypedFormControl, UntypedFormGroup } from '@angular/forms'; import { createVorgangResource } from 'libs/vorgang-shared/test/vorgang'; import { of } from 'rxjs'; @@ -30,7 +30,8 @@ import { ForwardingByEmailFormService } from './forwarding-by-email-form.service describe('ForwardingByEmailFormService', () => { let formService: ForwardingByEmailFormService; - let service; + + let service: Mock<ForwardingService>; const formBuilder: UntypedFormBuilder = new UntypedFormBuilder(); @@ -48,8 +49,7 @@ describe('ForwardingByEmailFormService', () => { const returnValue = {}; beforeEach(() => { - service.forward.mockReturnValue(of(returnValue)); - service.doSubmit = jest.fn(); + service.forwardByEmail.mockReturnValue(of(returnValue)); }); it('should call service', () => { @@ -57,7 +57,7 @@ describe('ForwardingByEmailFormService', () => { formService.submit(); - expect(service.forward).toHaveBeenCalledWith(formService.vorgang, formService.form.value); + expect(service.forwardByEmail).toHaveBeenCalledWith(formService.vorgang, formService.form.value); }); }); diff --git a/alfa-client/libs/forwarding/src/lib/forwarding-dialog-container/forwarding-dialog-container.component.html b/alfa-client/libs/forwarding/src/lib/forwarding-dialog-container/forwarding-dialog-container.component.html index ad97972cd9cc4c7e7f135d96b2b755378f953b3e..e6c65fbf4d123859056d2b834c6b45107a620683 100644 --- a/alfa-client/libs/forwarding/src/lib/forwarding-dialog-container/forwarding-dialog-container.component.html +++ b/alfa-client/libs/forwarding/src/lib/forwarding-dialog-container/forwarding-dialog-container.component.html @@ -1 +1,6 @@ -<alfa-forwarding-dialog [selectedSearchResult]="selectedSearchResult$ | async" data-test-id="forwarding-dialog"/> \ No newline at end of file +<alfa-forwarding-dialog + [forwardCommandStateResource]="forwardCommandStateResource$ | async" + [selectedSearchResult]="selectedSearchResult$ | async" + (forward)="forward($event)" + data-test-id="forwarding-dialog" +/> diff --git a/alfa-client/libs/forwarding/src/lib/forwarding-dialog-container/forwarding-dialog-container.component.spec.ts b/alfa-client/libs/forwarding/src/lib/forwarding-dialog-container/forwarding-dialog-container.component.spec.ts index 355c614cc694333be2f34a629eac5ad5b527035e..2dbd1a86402ade740cfbef6bc23460542baec559 100644 --- a/alfa-client/libs/forwarding/src/lib/forwarding-dialog-container/forwarding-dialog-container.component.spec.ts +++ b/alfa-client/libs/forwarding/src/lib/forwarding-dialog-container/forwarding-dialog-container.component.spec.ts @@ -1,9 +1,18 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { mock, Mock } from '@alfa-client/test-utils'; +import { CommandLinkRel, CommandResource } from '@alfa-client/command-shared'; +import { ForwardingService } from '@alfa-client/forwarding-shared'; +import { StateResource } from '@alfa-client/tech-shared'; +import { mock, Mock, triggerEvent } from '@alfa-client/test-utils'; +import { OzgcloudDialogService } from '@alfa-client/ui'; import { OrganisationsEinheitService, ZUSTAENDIGE_STELLE_SERVICE } from '@alfa-client/zustaendige-stelle-shared'; import { AsyncPipe } from '@angular/common'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { faker } from '@faker-js/faker/.'; +import { ResourceUri } from '@ngxp/rest'; +import { createCommandStateResource } from 'libs/command-shared/test/command'; +import { getDataTestIdOf } from 'libs/tech-shared/test/data-test'; +import { singleColdCompleted } from 'libs/tech-shared/test/marbles'; import { MockComponent } from 'ng-mocks'; +import { of } from 'rxjs'; import { ForwardingDialogContainerComponent } from './forwarding-dialog-container.component'; import { ForwardingDialogComponent } from './forwarding-dialog/forwarding-dialog.component'; @@ -11,14 +20,30 @@ describe('ForwardingDialogContainerComponent', () => { let component: ForwardingDialogContainerComponent; let fixture: ComponentFixture<ForwardingDialogContainerComponent>; + const forwardingDialog: string = getDataTestIdOf('forwarding-dialog'); + + let service: Mock<ForwardingService>; let organisationsEinheitService: Mock<OrganisationsEinheitService>; + let dialogService: Mock<OzgcloudDialogService>; beforeEach(async () => { + service = mock(ForwardingService); organisationsEinheitService = mock(OrganisationsEinheitService); + dialogService = mock(OzgcloudDialogService); await TestBed.configureTestingModule({ imports: [ForwardingDialogContainerComponent, AsyncPipe], declarations: [MockComponent(ForwardingDialogComponent)], + providers: [ + { + provide: ForwardingService, + useValue: service, + }, + { + provide: OzgcloudDialogService, + useValue: dialogService, + }, + ], }) .overrideComponent(ForwardingDialogContainerComponent, { set: { @@ -40,4 +65,45 @@ describe('ForwardingDialogContainerComponent', () => { it('should create', () => { expect(component).toBeTruthy(); }); + + describe('forward button', () => { + const targetUri: ResourceUri = faker.internet.url(); + + it('should call forward on click', () => { + component.forward = jest.fn(); + + triggerEvent({ fixture, elementSelector: forwardingDialog, name: 'forward', data: targetUri }); + + expect(component.forward).toHaveBeenCalledWith(targetUri); + }); + }); + + describe('forward', () => { + const targetUri: ResourceUri = faker.internet.url(); + + const commandStateResource: StateResource<CommandResource> = createCommandStateResource([CommandLinkRel.EFFECTED_RESOURCE]); + + beforeEach(() => { + service.forward.mockReturnValue(of(commandStateResource)); + }); + + it('should call service with uri', () => { + component.forward(targetUri); + + expect(service.forward).toHaveBeenCalledWith(targetUri); + }); + + it('should set service response', () => { + component.forward(targetUri); + + expect(component.forwardCommandStateResource$).toBeObservable(singleColdCompleted(commandStateResource)); + }); + + it('should call dialog service to close all if command is done', () => { + component.forward(targetUri); + component.forwardCommandStateResource$.subscribe(); + + expect(dialogService.closeAll).toHaveBeenCalled(); + }); + }); }); diff --git a/alfa-client/libs/forwarding/src/lib/forwarding-dialog-container/forwarding-dialog-container.component.ts b/alfa-client/libs/forwarding/src/lib/forwarding-dialog-container/forwarding-dialog-container.component.ts index afb2a3d5a97213615dcc22a98195e82fd916ed50..726320a3498c9e9b3ede988f28d84feee3cbcc24 100644 --- a/alfa-client/libs/forwarding/src/lib/forwarding-dialog-container/forwarding-dialog-container.component.ts +++ b/alfa-client/libs/forwarding/src/lib/forwarding-dialog-container/forwarding-dialog-container.component.ts @@ -1,4 +1,7 @@ -import { ResourceRepository } from '@alfa-client/tech-shared'; +import { CommandResource, tapOnCommandSuccessfullyDone } from '@alfa-client/command-shared'; +import { ForwardingService } from '@alfa-client/forwarding-shared'; +import { createEmptyStateResource, ResourceRepository, StateResource } from '@alfa-client/tech-shared'; +import { OzgcloudDialogService } from '@alfa-client/ui'; import { VorgangService } from '@alfa-client/vorgang-shared'; import { createOrganisationEinheitService } from '@alfa-client/zustaendige-stelle'; import { @@ -6,15 +9,16 @@ import { OrganisationsEinheitService, ZUSTAENDIGE_STELLE_SERVICE, } from '@alfa-client/zustaendige-stelle-shared'; -import { AsyncPipe } from '@angular/common'; +import { AsyncPipe, CommonModule } from '@angular/common'; import { Component, inject, OnInit } from '@angular/core'; -import { Observable } from 'rxjs'; +import { ResourceUri } from '@ngxp/rest'; +import { Observable, of } from 'rxjs'; import { ForwardingDialogComponent } from './forwarding-dialog/forwarding-dialog.component'; @Component({ selector: 'alfa-forwarding-dialog-container', standalone: true, - imports: [ForwardingDialogComponent, AsyncPipe], + imports: [ForwardingDialogComponent, AsyncPipe, CommonModule], templateUrl: './forwarding-dialog-container.component.html', providers: [ { @@ -26,10 +30,22 @@ import { ForwardingDialogComponent } from './forwarding-dialog/forwarding-dialog }) export class ForwardingDialogContainerComponent implements OnInit { private readonly organisationsEinheitService = inject(ZUSTAENDIGE_STELLE_SERVICE) as OrganisationsEinheitService; + private readonly forwardingService = inject(ForwardingService); + private readonly dialogService = inject(OzgcloudDialogService); public selectedSearchResult$: Observable<OrganisationsEinheitResource>; + public forwardCommandStateResource$: Observable<StateResource<CommandResource>> = + of(createEmptyStateResource<CommandResource>()); ngOnInit(): void { this.selectedSearchResult$ = this.organisationsEinheitService.getSelectedResult(); } + + public forward(targetUri: ResourceUri): void { + this.forwardCommandStateResource$ = this.forwardingService.forward(targetUri).pipe( + tapOnCommandSuccessfullyDone(() => { + this.dialogService.closeAll(); + }), + ); + } } diff --git a/alfa-client/libs/forwarding/src/lib/forwarding-dialog-container/forwarding-dialog/forwarding-button/forwarding-button.component.html b/alfa-client/libs/forwarding/src/lib/forwarding-dialog-container/forwarding-dialog/forwarding-button/forwarding-button.component.html index d0dd3c9c055bfc74030ddd0a0c19ddacafa8976b..1b36245dd262eb85c56fa35d29ba8f4bf1ba53d4 100644 --- a/alfa-client/libs/forwarding/src/lib/forwarding-dialog-container/forwarding-dialog/forwarding-button/forwarding-button.component.html +++ b/alfa-client/libs/forwarding/src/lib/forwarding-dialog-container/forwarding-dialog/forwarding-button/forwarding-button.component.html @@ -1,3 +1,11 @@ -<ods-button-with-spinner [disabled]="disabled" text="Weiterleiten" variant="outline" dataTestId="forwarding-button"> +<ods-button-with-spinner + [stateResource]="stateResource" + [disabled]="disabled" + (clickEmitter)="clickEmitter.emit()" + text="Weiterleiten" + variant="outline" + dataTestId="forwarding-button" + data-test-id="forwarding-button-container" +> <ods-forward-vorgang-icon icon class="fill-primary" /> -</ods-button-with-spinner> \ No newline at end of file +</ods-button-with-spinner> diff --git a/alfa-client/libs/forwarding/src/lib/forwarding-dialog-container/forwarding-dialog/forwarding-button/forwarding-button.component.spec.ts b/alfa-client/libs/forwarding/src/lib/forwarding-dialog-container/forwarding-dialog/forwarding-button/forwarding-button.component.spec.ts index ec3ee8288b888a029f6de545b97636ec3c5aae5d..9e9a9d2118e1a9758f7ba58715f822822ead4cbf 100644 --- a/alfa-client/libs/forwarding/src/lib/forwarding-dialog-container/forwarding-dialog/forwarding-button/forwarding-button.component.spec.ts +++ b/alfa-client/libs/forwarding/src/lib/forwarding-dialog-container/forwarding-dialog/forwarding-button/forwarding-button.component.spec.ts @@ -1,7 +1,8 @@ +import { dispatchEventFromFixture, MockEvent } from '@alfa-client/test-utils'; import { ComponentFixture, TestBed } from '@angular/core/testing'; - import { ButtonWithSpinnerComponent } from '@ods/component'; import { ForwardVorgangIconComponent } from '@ods/system'; +import { getDataTestIdOf } from 'libs/tech-shared/test/data-test'; import { MockComponent } from 'ng-mocks'; import { ForwardingButtonComponent } from './forwarding-button.component'; @@ -9,6 +10,8 @@ describe('ForwardingButtonComponent', () => { let component: ForwardingButtonComponent; let fixture: ComponentFixture<ForwardingButtonComponent>; + const button: string = getDataTestIdOf('forwarding-button-container'); + beforeEach(async () => { await TestBed.configureTestingModule({ imports: [ForwardingButtonComponent], @@ -23,4 +26,14 @@ describe('ForwardingButtonComponent', () => { it('should create', () => { expect(component).toBeTruthy(); }); + + describe('on button click', () => { + it('should emit', () => { + component.clickEmitter.emit = jest.fn(); + + dispatchEventFromFixture(fixture, button, MockEvent.CLICK); + + expect(component.clickEmitter.emit).toHaveBeenCalled(); + }); + }); }); diff --git a/alfa-client/libs/forwarding/src/lib/forwarding-dialog-container/forwarding-dialog/forwarding-button/forwarding-button.component.ts b/alfa-client/libs/forwarding/src/lib/forwarding-dialog-container/forwarding-dialog/forwarding-button/forwarding-button.component.ts index 63fec70d17fb549ab13163155fe3ca596446209a..767fe5e4ce40e7589725973d37e9a84c12fd0564 100644 --- a/alfa-client/libs/forwarding/src/lib/forwarding-dialog-container/forwarding-dialog/forwarding-button/forwarding-button.component.ts +++ b/alfa-client/libs/forwarding/src/lib/forwarding-dialog-container/forwarding-dialog/forwarding-button/forwarding-button.component.ts @@ -1,4 +1,6 @@ -import { Component, Input } from '@angular/core'; +import { CommandResource } from '@alfa-client/command-shared'; +import { StateResource } from '@alfa-client/tech-shared'; +import { Component, EventEmitter, Input, Output } from '@angular/core'; import { ButtonWithSpinnerComponent } from '@ods/component'; import { ForwardVorgangIconComponent } from '@ods/system'; @@ -10,4 +12,7 @@ import { ForwardVorgangIconComponent } from '@ods/system'; }) export class ForwardingButtonComponent { @Input() disabled: boolean; + @Input() stateResource: StateResource<CommandResource>; + + @Output() clickEmitter: EventEmitter<void> = new EventEmitter(); } diff --git a/alfa-client/libs/forwarding/src/lib/forwarding-dialog-container/forwarding-dialog/forwarding-dialog.component.html b/alfa-client/libs/forwarding/src/lib/forwarding-dialog-container/forwarding-dialog/forwarding-dialog.component.html index 3d60550c444dcbc34d9f229e91c1133e6a5af9ac..5aaf99a340455262073812254cf8c7d74adf578e 100644 --- a/alfa-client/libs/forwarding/src/lib/forwarding-dialog-container/forwarding-dialog/forwarding-dialog.component.html +++ b/alfa-client/libs/forwarding/src/lib/forwarding-dialog-container/forwarding-dialog/forwarding-dialog.component.html @@ -1,5 +1,5 @@ <div class="flex w-[620px] max-w-full flex-col gap-4 bg-background-100 p-8"> - <div class="flex items-center justify-between" > + <div class="flex items-center justify-between"> <h1 class="text-xl font-semibold text-primary">Vorgang weiterleiten</h1> <ods-cancel-dialog-button showAsIconButton="true" /> </div> @@ -7,14 +7,16 @@ @if (!selectedSearchResult) { <alfa-search-zustaendige-stelle-form-container cdkFocusInitial focusOnSearchField="true" data-test-id="zufi-search" /> } @else { - <alfa-forwarding-item-in-dialog - [organisationsEinheitResource]="selectedSearchResult" - data-test-id="forwarding-item" - /> + <alfa-forwarding-item-in-dialog [organisationsEinheitResource]="selectedSearchResult" data-test-id="forwarding-item" /> } <div class="flex gap-4"> - <alfa-forwarding-button [disabled]="!selectedSearchResult"/> + <alfa-forwarding-button + [stateResource]="forwardCommandStateResource" + [disabled]="!selectedSearchResult" + (clickEmitter)="onForwarding()" + data-test-id="foward-dialog-forward-button" + /> <ods-cancel-dialog-button /> </div> </div> diff --git a/alfa-client/libs/forwarding/src/lib/forwarding-dialog-container/forwarding-dialog/forwarding-dialog.component.spec.ts b/alfa-client/libs/forwarding/src/lib/forwarding-dialog-container/forwarding-dialog/forwarding-dialog.component.spec.ts index 6d4454c8e37a0bde91a410aeacf6df07087973f6..7e6114236be2ad7d2dddfcdfd309853b32568cdd 100644 --- a/alfa-client/libs/forwarding/src/lib/forwarding-dialog-container/forwarding-dialog/forwarding-dialog.component.spec.ts +++ b/alfa-client/libs/forwarding/src/lib/forwarding-dialog-container/forwarding-dialog/forwarding-dialog.component.spec.ts @@ -1,14 +1,21 @@ -import { existsAsHtmlElement, getMockComponent, notExistsAsHtmlElement } from '@alfa-client/test-utils'; +import { + dispatchEventFromFixture, + existsAsHtmlElement, + getMockComponent, + MockEvent, + notExistsAsHtmlElement, +} from '@alfa-client/test-utils'; import { ZustaendigeStelleModule } from '@alfa-client/zustaendige-stelle'; import { OrganisationsEinheitResource } from '@alfa-client/zustaendige-stelle-shared'; import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { getUrl } from '@ngxp/rest'; import { CancelDialogButtonComponent } from '@ods/component'; import { MockComponent, MockModule } from 'ng-mocks'; import { getDataTestIdOf } from '../../../../../tech-shared/test/data-test'; import { createOrganisationsEinheitResource } from '../../../../../zustaendige-stelle-shared/test/organisations-einheit'; import { ForwardingButtonComponent } from './forwarding-button/forwarding-button.component'; -import { ForwardingItemInDialogComponent } from './forwarding-item/forwarding-item.component'; import { ForwardingDialogComponent } from './forwarding-dialog.component'; +import { ForwardingItemInDialogComponent } from './forwarding-item/forwarding-item.component'; describe('ForwardingDialogComponent', () => { let component: ForwardingDialogComponent; @@ -16,6 +23,7 @@ describe('ForwardingDialogComponent', () => { const zufiSearch: string = getDataTestIdOf('zufi-search'); const forwardingItem: string = getDataTestIdOf('forwarding-item'); + const forwardButton: string = getDataTestIdOf('foward-dialog-forward-button'); const organisationsEinheitResource: OrganisationsEinheitResource = createOrganisationsEinheitResource(); beforeEach(async () => { @@ -64,23 +72,21 @@ describe('ForwardingDialogComponent', () => { fixture.detectChanges(); }); - describe('template', () => { - describe('forwarding item', () => { - it('should render if selectedSearchResult is NOT null', () => { - component.selectedSearchResult = organisationsEinheitResource; + describe('forwarding item', () => { + it('should render if selectedSearchResult is NOT null', () => { + component.selectedSearchResult = organisationsEinheitResource; - fixture.detectChanges(); + fixture.detectChanges(); - existsAsHtmlElement(fixture, forwardingItem); - }); + existsAsHtmlElement(fixture, forwardingItem); + }); - it('should NOT render if selectedSearchResult is null', () => { - component.selectedSearchResult = null; + it('should NOT render if selectedSearchResult is null', () => { + component.selectedSearchResult = null; - fixture.detectChanges(); + fixture.detectChanges(); - notExistsAsHtmlElement(fixture, forwardingItem); - }); + notExistsAsHtmlElement(fixture, forwardingItem); }); }); @@ -103,4 +109,15 @@ describe('ForwardingDialogComponent', () => { expect(forwardingButton.disabled).toBeFalsy(); }); }); + + describe('forward button', () => { + it('should emit on click', () => { + component.selectedSearchResult = organisationsEinheitResource; + component.forward.emit = jest.fn(); + + dispatchEventFromFixture(fixture, forwardButton, MockEvent.CLICK); + + expect(component.forward.emit).toHaveBeenCalledWith(getUrl(organisationsEinheitResource)); + }); + }); }); diff --git a/alfa-client/libs/forwarding/src/lib/forwarding-dialog-container/forwarding-dialog/forwarding-dialog.component.ts b/alfa-client/libs/forwarding/src/lib/forwarding-dialog-container/forwarding-dialog/forwarding-dialog.component.ts index c1695f42a08728b6921b6813694fad2ffb5440fe..178d84465273bc421ee5bd9a49dca84d213cb299 100644 --- a/alfa-client/libs/forwarding/src/lib/forwarding-dialog-container/forwarding-dialog/forwarding-dialog.component.ts +++ b/alfa-client/libs/forwarding/src/lib/forwarding-dialog-container/forwarding-dialog/forwarding-dialog.component.ts @@ -1,8 +1,11 @@ +import { CommandResource } from '@alfa-client/command-shared'; +import { StateResource } from '@alfa-client/tech-shared'; import { ZustaendigeStelleModule } from '@alfa-client/zustaendige-stelle'; import { OrganisationsEinheitResource } from '@alfa-client/zustaendige-stelle-shared'; import { A11yModule } from '@angular/cdk/a11y'; -import { Component, Input } from '@angular/core'; +import { Component, EventEmitter, Input, Output } from '@angular/core'; import { ReactiveFormsModule } from '@angular/forms'; +import { getUrl, ResourceUri } from '@ngxp/rest'; import { CancelDialogButtonComponent } from '@ods/component'; import { ForwardingButtonComponent } from './forwarding-button/forwarding-button.component'; import { ForwardingItemInDialogComponent } from './forwarding-item/forwarding-item.component'; @@ -22,4 +25,11 @@ import { ForwardingItemInDialogComponent } from './forwarding-item/forwarding-it }) export class ForwardingDialogComponent { @Input() selectedSearchResult: OrganisationsEinheitResource; + @Input() forwardCommandStateResource: StateResource<CommandResource>; + + @Output() forward: EventEmitter<ResourceUri> = new EventEmitter(); + + public onForwarding(): void { + this.forward.emit(getUrl(this.selectedSearchResult)); + } } diff --git a/alfa-client/libs/vorgang-shared/src/lib/vorgang.service.spec.ts b/alfa-client/libs/vorgang-shared/src/lib/vorgang.service.spec.ts index 0aa3ead988609bc5416e593f13cfdf6e44bd8a6e..5e9995262ed38703521d02d10ee078a330163cbd 100644 --- a/alfa-client/libs/vorgang-shared/src/lib/vorgang.service.spec.ts +++ b/alfa-client/libs/vorgang-shared/src/lib/vorgang.service.spec.ts @@ -23,27 +23,33 @@ */ import { ApiRootLinkRel, ApiRootResource, ApiRootService } from '@alfa-client/api-root-shared'; import { BinaryFileListResource } from '@alfa-client/binary-file-shared'; -import { CommandOrder, CommandResource, CommandService, CreateCommandProps } from '@alfa-client/command-shared'; +import { + CommandOrder, + CommandResource, + CommandService, + CreateCommandProps, + CreateCommandPropsWithoutResource, +} from '@alfa-client/command-shared'; import { Environment } from '@alfa-client/environment-shared'; import { NavigationService } from '@alfa-client/navigation-shared'; import { EMPTY_STRING, StateResource, createEmptyStateResource, createStateResource } from '@alfa-client/tech-shared'; import { Mock, mock, useFromMock } from '@alfa-client/test-utils'; import { HttpErrorResponse } from '@angular/common/http'; +import { faker } from '@faker-js/faker'; import { ResourceUri, getUrl } from '@ngxp/rest'; import { cold, hot } from 'jest-marbles'; import { createApiRootResource } from 'libs/api-root-shared/test/api-root'; import { createBinaryFileListResource } from 'libs/binary-file-shared/test/binary-file'; import { CommandLinkRel } from 'libs/command-shared/src/lib/command.linkrel'; -import { createCommandResource } from 'libs/command-shared/test/command'; +import { createCommandResource, createCreateCommandPropsWithoutResource } from 'libs/command-shared/test/command'; +import { singleColdCompleted } from 'libs/tech-shared/test/marbles'; import { createVorgangWithEingangResource } from 'libs/vorgang-shared/test/vorgang'; import { Observable, of } from 'rxjs'; import { VorgangFacade } from './+state/vorgang.facade'; import { VorgangWithEingangLinkRel } from './vorgang.linkrel'; -import { AdditionalActions, VorgangWithEingangResource } from './vorgang.model'; +import { AdditionalActions, VorgangResource, VorgangWithEingangResource } from './vorgang.model'; import { VorgangService } from './vorgang.service'; -import { faker } from '@faker-js/faker'; - import * as VorgangNavigationUtil from './vorgang-navigation.util'; describe('VorgangService', () => { @@ -515,4 +521,64 @@ describe('VorgangService', () => { }); }); }); + + describe('select vorgang with eingang', () => { + const vorgangStateResource: StateResource<VorgangResource> = createStateResource(createVorgangWithEingangResource()); + + beforeEach(() => { + facade.getVorgangWithEingang.mockReturnValue(of(vorgangStateResource)); + }); + + it('should call facade to get vorgang with eingang', () => { + service.selectVorgangWithEingang(); + + expect(facade.getVorgangWithEingang).toHaveBeenCalled(); + }); + + it('should return value', () => { + const vorgangWithEingangStateResource$: Observable<StateResource<VorgangWithEingangResource>> = + service.selectVorgangWithEingang(); + + expect(vorgangWithEingangStateResource$).toBeObservable(singleColdCompleted(vorgangStateResource)); + }); + }); + + describe('create command', () => { + const vorgangResource: VorgangWithEingangResource = createVorgangWithEingangResource(); + + const createCommandProps: CreateCommandPropsWithoutResource = createCreateCommandPropsWithoutResource(); + const commandResource: CommandResource = createCommandResource([CommandLinkRel.EFFECTED_RESOURCE]); + const commandStateResource: StateResource<CommandResource> = createStateResource(commandResource); + + beforeEach(() => { + facade.getVorgangWithEingang.mockReturnValue(of(createStateResource(vorgangResource))); + commandService.createCommandByProps.mockReturnValue(of(commandStateResource)); + }); + + it('should call facade to get vorgang with eingang', () => { + service.createCommand(createCommandProps).subscribe(); + + expect(facade.getVorgangWithEingang).toHaveBeenCalled(); + }); + + it('should call command service to create command', () => { + service.createCommand(createCommandProps).subscribe(); + + expect(commandService.createCommandByProps).toHaveBeenCalledWith({ ...createCommandProps, resource: vorgangResource }); + }); + + it('should return response from command service', () => { + const forwardCommand$: Observable<StateResource<CommandResource>> = service.createCommand(createCommandProps); + + expect(forwardCommand$).toBeObservable(singleColdCompleted(commandStateResource)); + }); + + it('should call reload if command is done and reload flag is true', () => { + service.reloadVorgang = jest.fn(); + + service.createCommand(createCommandProps, true).subscribe(); + + expect(service.reloadVorgang).toHaveBeenCalled(); + }); + }); }); diff --git a/alfa-client/libs/vorgang-shared/src/lib/vorgang.service.ts b/alfa-client/libs/vorgang-shared/src/lib/vorgang.service.ts index 1af6e12ff7877e9e221d05730199423689663082..7e43262e9757d58e030c4bbe2900aae791255e96 100644 --- a/alfa-client/libs/vorgang-shared/src/lib/vorgang.service.ts +++ b/alfa-client/libs/vorgang-shared/src/lib/vorgang.service.ts @@ -28,15 +28,17 @@ import { CommandResource, CommandService, CreateCommandProps, + CreateCommandPropsWithoutResource, getEffectedResourceUrl, + tapOnCommandSuccessfullyDone, } from '@alfa-client/command-shared'; import { ENVIRONMENT_CONFIG, Environment } from '@alfa-client/environment-shared'; import { NavigationService } from '@alfa-client/navigation-shared'; -import { StateResource, createEmptyStateResource, doIfLoadingRequired, isNotNull } from '@alfa-client/tech-shared'; +import { StateResource, createEmptyStateResource, doIfLoadingRequired, isNotNull, mapToResource } from '@alfa-client/tech-shared'; import { Inject, Injectable } from '@angular/core'; import { ResourceUri, hasLink } from '@ngxp/rest'; import { Observable, combineLatest } from 'rxjs'; -import { filter, map, startWith, tap, withLatestFrom } from 'rxjs/operators'; +import { filter, first, map, startWith, switchMap, tap, withLatestFrom } from 'rxjs/operators'; import { VorgangFacade } from './+state/vorgang.facade'; import { buildLinkRelFromPathSegments } from './vorgang-navigation.util'; import { VorgangWithEingangLinkRel } from './vorgang.linkrel'; @@ -142,10 +144,6 @@ export class VorgangService { return this.facade.getAssignUserCommand(); } - public reloadVorgang(commandResource: CommandResource): void { - this.facade.loadVorgangWithEingang(getEffectedResourceUrl(commandResource)); - } - public getBackButtonUrl(): Observable<string> { return this.facade.getBackButtonUrl(); } @@ -198,4 +196,28 @@ export class VorgangService { const createCommand = { order: CommandOrder.SET_AKTENZEICHEN, body: { aktenzeichen } }; return this.commandService.createCommand(vorgang, VorgangWithEingangLinkRel.SET_AKTENZEICHEN, createCommand); } + + public createCommand( + createCommandProps: CreateCommandPropsWithoutResource, + reloadResource: boolean = false, + ): Observable<StateResource<CommandResource>> { + return this.selectVorgangWithEingang().pipe( + first(), + mapToResource(), + switchMap((vorgang: VorgangWithEingangResource) => + this.commandService.createCommandByProps({ ...createCommandProps, resource: vorgang }), + ), + tapOnCommandSuccessfullyDone((commandStateResource: StateResource<CommandResource>) => { + if (reloadResource) this.reloadVorgang(commandStateResource.resource); + }), + ); + } + + public selectVorgangWithEingang(): Observable<StateResource<VorgangWithEingangResource>> { + return this.facade.getVorgangWithEingang(); + } + + public reloadVorgang(commandResource: CommandResource): void { + this.facade.loadVorgangWithEingang(getEffectedResourceUrl(commandResource)); + } }