diff --git a/alfa-client/libs/bescheid-shared/src/lib/bescheid.service.spec.ts b/alfa-client/libs/bescheid-shared/src/lib/bescheid.service.spec.ts index a120af6e0825c4a292affa1f14694eb0c3184411..71dc21f419656314c564a01cf6f51cd6907b19d9 100644 --- a/alfa-client/libs/bescheid-shared/src/lib/bescheid.service.spec.ts +++ b/alfa-client/libs/bescheid-shared/src/lib/bescheid.service.spec.ts @@ -11,12 +11,12 @@ import { } from '@alfa-client/command-shared'; import { ApiError, - EMPTY_STRING, - HttpError, - StateResource, createEmptyStateResource, createErrorStateResource, createStateResource, + EMPTY_STRING, + HttpError, + StateResource, } from '@alfa-client/tech-shared'; import { Mock, mock, useFromMock } from '@alfa-client/test-utils'; import { @@ -27,17 +27,18 @@ import { } from '@alfa-client/vorgang-shared'; import { fakeAsync, tick } from '@angular/core/testing'; import faker from '@faker-js/faker'; -import { ResourceUri, getUrl } from '@ngxp/rest'; +import { getUrl, ResourceUri } from '@ngxp/rest'; import { cold } from 'jest-marbles'; import { CommandLinkRel } from 'libs/command-shared/src/lib/command.linkrel'; import { createApiError } from 'libs/tech-shared/test/error'; import { createVorgangWithEingangResource } from 'libs/vorgang-shared/test/vorgang'; -import { Observable, first, of } from 'rxjs'; +import { first, Observable, of } from 'rxjs'; import { createBinaryFileListResource, createBinaryFileResource, } from '../../../binary-file-shared/test/binary-file'; import { + createCommandErrorResource, createCommandResource, createCommandStateResource, createCreateCommandProps, @@ -458,10 +459,10 @@ describe('BescheidService', () => { }); it('should clear create bescheid document in progress', (done) => { - service.createBescheidDocumentInProgress$.next(createUploadFileInProgress()); + service.createBescheidDocumentInProgress$.next(createCommandStateResource()); service.updateBescheid(bescheid).subscribe(() => { - expect(service.createBescheidDocumentInProgress$.value).toEqual({ loading: false }); + expect(service.createBescheidDocumentInProgress$.value).toEqual(createEmptyStateResource()); done(); }); }); @@ -479,8 +480,7 @@ describe('BescheidService', () => { describe('send bescheid', () => { const bescheidResource: BescheidResource = createBescheidResource(); const createCommandProps: CreateCommandProps = createCreateCommandProps(); - const commandStateResource: StateResource<CommandResource> = - createStateResource(createCommandResource()); + const commandStateResource: StateResource<CommandResource> = createCommandStateResource(); const linkRel: string = 'link_rel'; let buildSendBescheidCommandPropsSpy: jest.SpyInstance; @@ -527,8 +527,7 @@ describe('BescheidService', () => { describe('sendBescheidManually', () => { const bescheidResource: BescheidResource = createBescheidResource(); - const sendBescheidCommand: StateResource<CommandResource> = - createStateResource(createCommandResource()); + const sendBescheidCommand: StateResource<CommandResource> = createCommandStateResource(); beforeEach(() => { service.sendBescheid = jest.fn().mockReturnValue(of(sendBescheidCommand)); @@ -553,8 +552,7 @@ describe('BescheidService', () => { describe('sendBescheidToAntragsteller', () => { const bescheidResource: BescheidResource = createBescheidResource(); - const sendBescheidCommand: StateResource<CommandResource> = - createStateResource(createCommandResource()); + const sendBescheidCommand: StateResource<CommandResource> = createCommandStateResource(); beforeEach(() => { service.sendBescheid = jest.fn().mockReturnValue(of(sendBescheidCommand)); @@ -589,9 +587,7 @@ describe('BescheidService', () => { .spyOn(BescheidUtil, 'buildUpdateBescheidCommandProps') .mockReturnValue(createCommandProps); commandService.createCommandByProps.mockClear(); - commandService.createCommandByProps.mockReturnValue( - of(createStateResource(createCommandResource())), - ); + commandService.createCommandByProps.mockReturnValue(of(createCommandStateResource())); }); it('should build update bescheid command props', () => { @@ -688,16 +684,10 @@ describe('BescheidService', () => { }); it('should clear create bescheid document', () => { - service.createBescheidDocumentInProgress$.next({ - loading: true, - fileName: 'Dummy', - error: createApiError(), - }); + service.createBescheidDocumentInProgress$.next(createCommandStateResource()); service.uploadBescheidDocument(bescheid, file); - expect(service.createBescheidDocumentInProgress$.value).toEqual({ - loading: false, - }); + expect(service.createBescheidDocumentInProgress$.value).toEqual(createEmptyStateResource()); }); it('should call do upload bescheid document', () => { @@ -796,8 +786,7 @@ describe('BescheidService', () => { const createCommandProps: CreateCommandProps = createCreateCommandProps(); let buildCreateBescheidDocumentFromFilePropsSpy; - const commandStateResource: StateResource<CommandResource> = - createStateResource(createCommandResource()); + const commandStateResource: StateResource<CommandResource> = createCommandStateResource(); beforeEach(() => { buildCreateBescheidDocumentFromFilePropsSpy = jest @@ -1012,20 +1001,20 @@ describe('BescheidService', () => { }); describe('on error', () => { - const apiError: HttpError = createApiError(); - const commandErrorStateResource: StateResource<CommandResource> = - createErrorStateResource(apiError); + const commandErrorStateResource: StateResource<CommandResource> = createStateResource( + createCommandErrorResource(), + ); - it('should set error ', () => { + it('should emit command state resource', () => { commandService.createCommandByProps.mockReturnValue(of(commandErrorStateResource)); service.createBescheidDocument(); - expect(service.createBescheidDocumentInProgress$.value.error).toBe(apiError); + expect(service.createBescheidDocumentInProgress$.value).toBe(commandErrorStateResource); }); it('should set create bescheid document in progress loading false', () => { - service.createBescheidDocumentInProgress$.next({ loading: true }); + service.createBescheidDocumentInProgress$.next(createEmptyStateResource(true)); commandService.createCommandByProps.mockReturnValue(of(commandErrorStateResource)); service.createBescheidDocument(); @@ -1168,7 +1157,7 @@ describe('BescheidService', () => { }); it('should set create bescheid document in progress loading false', () => { - service.createBescheidDocumentInProgress$.next({ loading: true }); + service.createBescheidDocumentInProgress$.next(createEmptyStateResource(true)); service.loadBescheidDocumentFile(document); diff --git a/alfa-client/libs/bescheid-shared/src/lib/bescheid.service.ts b/alfa-client/libs/bescheid-shared/src/lib/bescheid.service.ts index 05a83a1c4861aaf65fd48d1d90c9d4873f680175..1319d619d0cd50d9aefbf616003409ca3a9ebf3e 100644 --- a/alfa-client/libs/bescheid-shared/src/lib/bescheid.service.ts +++ b/alfa-client/libs/bescheid-shared/src/lib/bescheid.service.ts @@ -9,20 +9,21 @@ import { CommandResourceService, CommandService, getEffectedResourceUrl, + hasCommandError, tapOnCommandSuccessfullyDone, } from '@alfa-client/command-shared'; import { - HttpError, - ResourceListService, - StateResource, createEmptyStateResource, createStateResource, filterIsLoadedOrHasError, getEmbeddedResources, hasStateResourceError, + HttpError, isLoaded, isNotEmpty, + ResourceListService, sortByGermanDateStr, + StateResource, } from '@alfa-client/tech-shared'; import { VorgangCommandService, @@ -32,15 +33,15 @@ import { } from '@alfa-client/vorgang-shared'; import { getEmpfaenger } from '@alfa-client/vorgang-shared-ui'; import { Injectable } from '@angular/core'; -import { ResourceUri, getUrl, hasLink } from '@ngxp/rest'; +import { getUrl, hasLink, ResourceUri } from '@ngxp/rest'; import { BehaviorSubject, - Observable, - Subscription, filter, first, map, + Observable, startWith, + Subscription, switchMap, tap, } from 'rxjs'; @@ -92,8 +93,8 @@ export class BescheidService { readonly bescheidList$: BehaviorSubject<StateResource<BescheidListResource>> = new BehaviorSubject(createEmptyStateResource<BescheidListResource>()); - readonly createBescheidDocumentInProgress$: BehaviorSubject<UploadFileInProgress> = - new BehaviorSubject<UploadFileInProgress>({ loading: false }); + readonly createBescheidDocumentInProgress$: BehaviorSubject<StateResource<CommandResource>> = + new BehaviorSubject<StateResource<CommandResource>>(createEmptyStateResource()); readonly uploadBescheidDocumentInProgress$: BehaviorSubject<UploadFileInProgress> = new BehaviorSubject<UploadFileInProgress>({ loading: false }); @@ -330,8 +331,9 @@ export class BescheidService { } private clearCreateBescheidDocumentInProgress(): void { - this.createBescheidDocumentInProgress$.next({ loading: false }); + this.createBescheidDocumentInProgress$.next(createEmptyStateResource()); } + private initUploadBescheidDocumentInProgress(fileName: string): void { this.uploadBescheidDocumentInProgress$.next({ fileName, loading: true }); } @@ -393,9 +395,9 @@ export class BescheidService { this.bescheidDocument$.next(createEmptyStateResource()); } - public createBescheidDocument(): Observable<UploadFileInProgress> { + public createBescheidDocument(): Observable<StateResource<CommandResource>> { this.clearUploadBescheidDocumentInProgress(); - this.setCreateBescheidDocumenInProgress(); + this.setCreateBescheidDocumentInProgress(); this.doCreateBescheidDocument() .pipe(filterIsLoadedOrHasError(), first()) .subscribe((commandStateResource: StateResource<CommandResource>) => @@ -408,12 +410,12 @@ export class BescheidService { this.uploadBescheidDocumentInProgress$.next({ loading: false }); } - public getCreateBescheidDocumentInProgress(): Observable<UploadFileInProgress> { + public getCreateBescheidDocumentInProgress(): Observable<StateResource<CommandResource>> { return this.createBescheidDocumentInProgress$.asObservable(); } - private setCreateBescheidDocumenInProgress(): void { - this.createBescheidDocumentInProgress$.next({ loading: true }); + private setCreateBescheidDocumentInProgress(): void { + this.createBescheidDocumentInProgress$.next(createEmptyStateResource(true)); } doCreateBescheidDocument(): Observable<StateResource<CommandResource>> { @@ -425,8 +427,8 @@ export class BescheidService { private handleCreateBescheidDocumentResponse( commandStateResource: StateResource<CommandResource>, ): void { - if (hasStateResourceError(commandStateResource)) { - this.setCreateBescheidDocumentInProgressError(commandStateResource.error); + if (hasCommandError(commandStateResource.resource)) { + this.createBescheidDocumentInProgress$.next(commandStateResource); } else { const documentUri: ResourceUri = getEffectedResourceUrl(commandStateResource.resource); this.bescheidDocumentUri$.next(documentUri); @@ -440,17 +442,10 @@ export class BescheidService { .pipe(filterIsLoadedOrHasError(), first()) .subscribe((binaryFile) => { this.bescheidDocumentFile$.next(binaryFile); - this.createBescheidDocumentInProgress$.next({ loading: false }); + this.createBescheidDocumentInProgress$.next(createEmptyStateResource()); }); } - private setCreateBescheidDocumentInProgressError(error: HttpError): void { - this.createBescheidDocumentInProgress$.next({ - error, - loading: false, - }); - } - public getBescheidDocumentCommand(): Observable<StateResource<CommandResource>> { return this.commandService.getCommandByOrder(CommandOrder.CREATE_BESCHEID_DOCUMENT); } diff --git a/alfa-client/libs/command-shared/test/command.ts b/alfa-client/libs/command-shared/test/command.ts index e33eef79d37a8936182390dfcb392e4f587c68f6..22dfc484d7137b928ec35e74de5a5902ef42a519 100644 --- a/alfa-client/libs/command-shared/test/command.ts +++ b/alfa-client/libs/command-shared/test/command.ts @@ -21,21 +21,13 @@ * Die sprachspezifischen Genehmigungen und Beschränkungen * unter der Lizenz sind dem Lizenztext zu entnehmen. */ +import { createStateResource, StateResource } from '@alfa-client/tech-shared'; import { faker } from '@faker-js/faker'; import { toResource } from 'libs/tech-shared/test/resource'; import { times } from 'lodash-es'; import { CommandListLinkRel } from '../src/lib/command.linkrel'; import { CommandErrorMessage } from '../src/lib/command.message'; -import { - Command, - CommandListResource, - CommandOrder, - CommandResource, - CommandStatus, - CreateCommand, - CreateCommandProps, -} from '../src/lib/command.model'; -import { createStateResource, StateResource } from '@alfa-client/tech-shared'; +import { Command, CommandListResource, CommandOrder, CommandResource, CommandStatus, CreateCommand, CreateCommandProps, } from '../src/lib/command.model'; export function createCommand(): Command { return { @@ -76,6 +68,12 @@ export function createCommandErrorResource(linkRelations: string[] = []): Comman }; } +export function createCommandErrorStateResource( + linkRelations: string[] = [], +): StateResource<CommandResource> { + return createStateResource(createCommandErrorResource(linkRelations)); +} + export function createCreateCommand( order: CommandOrder = CommandOrder.VORGANG_ANNEHMEN, ): CreateCommand { diff --git a/alfa-client/libs/design-system/src/lib/attachment/attachment.component.spec.ts b/alfa-client/libs/design-system/src/lib/attachment/attachment.component.spec.ts index c26301f01c12e62681a5166d68643a3fa9cd6f62..26ee7299e31f26003789e8eeaf5b8d77b68d4b31 100644 --- a/alfa-client/libs/design-system/src/lib/attachment/attachment.component.spec.ts +++ b/alfa-client/libs/design-system/src/lib/attachment/attachment.component.spec.ts @@ -1,20 +1,11 @@ -import { ApiError, Issue } from '@alfa-client/tech-shared'; import { ComponentFixture, TestBed } from '@angular/core/testing'; import { ReactiveFormsModule } from '@angular/forms'; -import { createApiError, createIssue } from 'libs/tech-shared/test/error'; import { AttachmentComponent } from './attachment.component'; -xdescribe('AttachmentComponent', () => { +describe('AttachmentComponent', () => { let component: AttachmentComponent; let fixture: ComponentFixture<AttachmentComponent>; - const issue: Issue = { - ...createIssue(), - messageCode: 'validation_field_file_content_type_invalid', - }; - - const error: ApiError = createApiError([issue]); - beforeEach(async () => { await TestBed.configureTestingModule({ imports: [ReactiveFormsModule], @@ -29,11 +20,40 @@ xdescribe('AttachmentComponent', () => { expect(component).toBeTruthy(); }); - describe('set errorList', () => { - it('should push VALIDATION_MESSAGES to errorList', () => { - component.error = error; + describe('set error messages', () => { + it('should mark as has error', () => { + component.errorMessages = ['Fehler']; + fixture.detectChanges(); - expect(component.errorList[0]).toBe('Erlaubte Dateiendungen: pdf, jpg, png, jpeg'); + + expect(component.hasError).toBeTruthy(); + }); + + it.each([null, undefined])( + 'should mark as has not error when error messages %s', + (errorMessages: string[]) => { + component.errorMessages = errorMessages; + + fixture.detectChanges(); + + expect(component.hasError).toBeFalsy(); + }, + ); + + it('should mark as has not error', () => { + component.errorMessages = []; + + fixture.detectChanges(); + + expect(component.hasError).toBeFalsy(); + }); + + it('should set errors', () => { + component.errorMessages = ['Fehler']; + + fixture.detectChanges(); + + expect(component.errors).toEqual(['Fehler']); }); }); }); diff --git a/alfa-client/libs/design-system/src/lib/attachment/attachment.component.ts b/alfa-client/libs/design-system/src/lib/attachment/attachment.component.ts index 26b8e0b77783d3dd5f6de9ef1eecbdc5c7db1220..4a4fe3ee5844e2db722ccfc25cd48214b3d4a068 100644 --- a/alfa-client/libs/design-system/src/lib/attachment/attachment.component.ts +++ b/alfa-client/libs/design-system/src/lib/attachment/attachment.component.ts @@ -1,8 +1,7 @@ import { CommonModule } from '@angular/common'; import { Component, Input } from '@angular/core'; -import { ApiError, EMPTY_STRING, Issue, getMessageForIssue } from '@alfa-client/tech-shared'; -import { isNil } from 'lodash-es'; +import { isNotEmpty } from '@alfa-client/tech-shared'; import { FileIconComponent } from '../icons/file-icon/file-icon.component'; import { SpinnerIconComponent } from '../icons/spinner-icon/spinner-icon.component'; @@ -11,32 +10,32 @@ import { SpinnerIconComponent } from '../icons/spinner-icon/spinner-icon.compone standalone: true, imports: [CommonModule, SpinnerIconComponent, FileIconComponent], styles: [':host {@apply flex}'], - template: `<button + template: ` <button class="relative flex w-full items-start gap-3 border-b border-b-grayborder bg-background-100 px-3 py-2 hover:bg-background-200" > <div class="flex-shrink"> <ods-file-icon - *ngIf="fileType && !isLoading && !isError" + *ngIf="fileType && !isLoading && !hasError" [fileType]="fileType" size="large" /> - <ods-file-icon *ngIf="!isLoading && isError" fileType="exclamation" size="large" /> - <ods-spinner-icon *ngIf="isLoading && !isError" size="large" /> + <ods-file-icon *ngIf="!isLoading && hasError" fileType="exclamation" size="large" /> + <ods-spinner-icon *ngIf="isLoading && !hasError" size="large" /> </div> <div class="flex grow flex-col items-start break-all text-start text-text"> - <p *ngIf="!isError && !isLoading && caption" class="text-sm"> + <p *ngIf="!hasError && !isLoading && caption" class="text-sm"> {{ caption }} </p> - <p *ngIf="isError && errorCaption" class="text-sm text-error"> + <p *ngIf="hasError && errorCaption" class="text-sm text-error"> {{ errorCaption }} </p> <p *ngIf="isLoading && loadingCaption" class="text-sm"> {{ loadingCaption }} </p> - <p *ngIf="description && !isError" class="text-xs text-text/65"> + <p *ngIf="description && !hasError" class="text-xs text-text/65"> {{ description }} </p> - <p *ngFor="let error of errorList" class="text-xs text-text/65"> + <p *ngFor="let error of errors" class="text-xs text-text/65"> {{ error }} </p> </div> @@ -50,19 +49,12 @@ export class AttachmentComponent { @Input() fileType: string = ''; @Input() description = ''; @Input() isLoading: boolean = false; - @Input() set error(error: ApiError) { - if (isNil(error)) { - this.errorList = []; - return; - } - error.issues.forEach((issue: Issue) => - this.errorList.push(getMessageForIssue(EMPTY_STRING, issue)), - ); - } - protected get isError() { - return this.errorList.length > 0; + @Input() set errorMessages(errorMessages: string[]) { + this.hasError = isNotEmpty(errorMessages); + this.errors = errorMessages; } - public errorList: string[] = []; + public errors: string[] = []; + public hasError: boolean = false; } diff --git a/alfa-client/libs/design-system/src/lib/attachment/attachment.stories.ts b/alfa-client/libs/design-system/src/lib/attachment/attachment.stories.ts index 7104e718bbf91896eee9611fd9aaabb51cc7525b..b485cf6a12ea32ef33c0906a85176ccfb9bdedd2 100644 --- a/alfa-client/libs/design-system/src/lib/attachment/attachment.stories.ts +++ b/alfa-client/libs/design-system/src/lib/attachment/attachment.stories.ts @@ -55,6 +55,6 @@ export const Error: Story = { name: 'Error message in file', args: { caption: 'Fehler beim Hochladen', - errorList: ['Erlaubte Dateiendungen: pdf, jpg, png, jpeg'], + errorMessages: ['Erlaubte Dateiendungen: pdf, jpg, png, jpeg'], }, }; diff --git a/alfa-client/libs/tech-shared/src/index.ts b/alfa-client/libs/tech-shared/src/index.ts index fd72ff72fc272d489207273fcbc805abe4f8b2f0..64e34b9ffcb66244bb7687070f685ed6090b4950 100644 --- a/alfa-client/libs/tech-shared/src/index.ts +++ b/alfa-client/libs/tech-shared/src/index.ts @@ -31,6 +31,7 @@ export * from './lib/form.util'; export * from './lib/http.util'; export * from './lib/message-code'; export * from './lib/ngrx/actions'; +export * from './lib/pipe/convert-api-error-to-error-messages.pipe'; export * from './lib/pipe/convert-for-data-test.pipe'; export * from './lib/pipe/convert-to-boolean.pipe'; export * from './lib/pipe/enum-to-label.pipe'; diff --git a/alfa-client/libs/tech-shared/src/lib/pipe/convert-api-error-to-error-messages.pipe.spec.ts b/alfa-client/libs/tech-shared/src/lib/pipe/convert-api-error-to-error-messages.pipe.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..f2d421bb49d41f593662ba2bbccd22f87255d396 --- /dev/null +++ b/alfa-client/libs/tech-shared/src/lib/pipe/convert-api-error-to-error-messages.pipe.spec.ts @@ -0,0 +1,37 @@ +import { ApiError, getMessageForIssue } from '@alfa-client/tech-shared'; +import { createApiError } from '../../../test/error'; +import { ConvertApiErrorToErrorMessagesPipe } from './convert-api-error-to-error-messages.pipe'; + +jest.mock('@alfa-client/tech-shared'); +const getMessageForIssueMock = getMessageForIssue as jest.Mock; + +describe('convertApiErrorToErrorMessagesPipe', () => { + const pipe = new ConvertApiErrorToErrorMessagesPipe(); + + it('create an instance', () => { + expect(pipe).toBeTruthy(); + }); + + describe('transform', () => { + it.each([null, undefined])('should return empty array for %s value', (value: ApiError) => { + const errorMessages: string[] = pipe.transform(value); + + expect(errorMessages).toEqual([]); + }); + + it('should get message for issue', () => { + pipe.transform(createApiError()); + + expect(getMessageForIssueMock).toHaveBeenCalled(); + }); + + it('should return array of error messages', () => { + const expectedErrorMessage = 'Fehler'; + getMessageForIssueMock.mockReturnValue(expectedErrorMessage); + + const errorMessages: string[] = pipe.transform(createApiError()); + + expect(errorMessages).toEqual([expectedErrorMessage]); + }); + }); +}); diff --git a/alfa-client/libs/tech-shared/src/lib/pipe/convert-api-error-to-error-messages.pipe.ts b/alfa-client/libs/tech-shared/src/lib/pipe/convert-api-error-to-error-messages.pipe.ts new file mode 100644 index 0000000000000000000000000000000000000000..7dc36b4163976990d1172d2fa6860c3efeba1b33 --- /dev/null +++ b/alfa-client/libs/tech-shared/src/lib/pipe/convert-api-error-to-error-messages.pipe.ts @@ -0,0 +1,13 @@ +import { ApiError, EMPTY_STRING, getMessageForIssue, Issue } from '@alfa-client/tech-shared'; +import { Pipe, PipeTransform } from '@angular/core'; +import { isNil } from 'lodash-es'; + +@Pipe({ name: 'convertApiErrorToErrorMessages' }) +export class ConvertApiErrorToErrorMessagesPipe implements PipeTransform { + transform(value: ApiError) { + if (isNil(value)) { + return []; + } + return value.issues.map((issue: Issue) => getMessageForIssue(EMPTY_STRING, issue)); + } +} diff --git a/alfa-client/libs/tech-shared/src/lib/tech-shared.module.ts b/alfa-client/libs/tech-shared/src/lib/tech-shared.module.ts index 6d81cbece935b0b247a3c77cc8ea765c6e92861f..ecb138d23695a7111038967cf2d80147cbac5206 100644 --- a/alfa-client/libs/tech-shared/src/lib/tech-shared.module.ts +++ b/alfa-client/libs/tech-shared/src/lib/tech-shared.module.ts @@ -27,6 +27,7 @@ import { Injector, NgModule } from '@angular/core'; import { HttpBinaryFileInterceptor } from './interceptor/http-binary-file.interceptor'; import { HttpXsrfInterceptor } from './interceptor/http-xsrf.interceptor'; import { XhrInterceptor } from './interceptor/xhr.interceptor'; +import { ConvertApiErrorToErrorMessagesPipe } from './pipe/convert-api-error-to-error-messages.pipe'; import { ConvertForDataTestPipe } from './pipe/convert-for-data-test.pipe'; import { ConvertToBooleanPipe } from './pipe/convert-to-boolean.pipe'; import { EnumToLabelPipe } from './pipe/enum-to-label.pipe'; @@ -65,6 +66,7 @@ import { ToTrafficLightPipe } from './pipe/to-traffic-light.pipe'; FileSizePlainPipe, GetUrlPipe, ConvertToBooleanPipe, + ConvertApiErrorToErrorMessagesPipe, ], exports: [ FormatToPrettyDatePipe, @@ -84,6 +86,7 @@ import { ToTrafficLightPipe } from './pipe/to-traffic-light.pipe'; FileSizePlainPipe, GetUrlPipe, ConvertToBooleanPipe, + ConvertApiErrorToErrorMessagesPipe, ], providers: [ { diff --git a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-attachments/vorgang-detail-bescheiden-result-attachments.component.html b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-attachments/vorgang-detail-bescheiden-result-attachments.component.html index fc9bcf1ed04f5df8d10a3a92d1c6d611d827574f..95e424d51d4542bce8bc97612cd8f632bca51b48 100644 --- a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-attachments/vorgang-detail-bescheiden-result-attachments.component.html +++ b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-attachments/vorgang-detail-bescheiden-result-attachments.component.html @@ -22,7 +22,7 @@ *ngIf="uploadFileInProgress.loading || uploadFileInProgress.error" [loadingCaption]="uploadFileInProgress.fileName" errorCaption="Fehler beim Hochladen" - [error]="uploadFileInProgress.error" + [errorMessages]="uploadFileInProgress.error | convertApiErrorToErrorMessages" description="Anhang wird hochgeladen" [isLoading]="uploadFileInProgress.loading" ></ods-attachment> diff --git a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-attachments/vorgang-detail-bescheiden-result-attachments.component.spec.ts b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-attachments/vorgang-detail-bescheiden-result-attachments.component.spec.ts index 1e9ed7dcaa08a8f3a261a01eaf31c317eb00d7ac..c9b80fe49d0d2389e5d647eac7bceb37dd55f7b3 100644 --- a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-attachments/vorgang-detail-bescheiden-result-attachments.component.spec.ts +++ b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-attachments/vorgang-detail-bescheiden-result-attachments.component.spec.ts @@ -2,6 +2,7 @@ import { BescheidService } from '@alfa-client/bescheid-shared'; import { BinaryFile2ContainerComponent } from '@alfa-client/binary-file'; import { BinaryFileResource } from '@alfa-client/binary-file-shared'; import { + ConvertApiErrorToErrorMessagesPipe, convertForDataTest, ConvertForDataTestPipe, createErrorStateResource, @@ -54,6 +55,7 @@ describe('VorgangDetailBescheidenResultAttachmentsComponent', () => { ConvertForDataTestPipe, MatIcon, MockPipe(FileSizePipe), + MockPipe(ConvertApiErrorToErrorMessagesPipe), MockComponent(OzgcloudSvgIconComponent), MockComponent(SpinnerComponent), MockComponent(AttachmentContainerComponent), diff --git a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-dokument/vorgang-detail-bescheiden-result-dokument.component.html b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-dokument/vorgang-detail-bescheiden-result-dokument.component.html index a89c65186da52532a6f73829e58afaaaf65703cd..2080ba5b2a7b977a0837a437c97ae3d1579ba396 100644 --- a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-dokument/vorgang-detail-bescheiden-result-dokument.component.html +++ b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-dokument/vorgang-detail-bescheiden-result-dokument.component.html @@ -8,7 +8,11 @@ <ods-attachment-container> <ng-container *ngIf="bescheidDocumentFile.resource"> <alfa-binary-file2-container - *ngIf="!bescheidDocumentFile.loading && !uploadBescheidDocumentInProgress.loading" + *ngIf=" + !bescheidDocumentFile.loading && + !uploadBescheidDocumentInProgress.loading && + !createDocumentInProgess.loading + " [file]="bescheidDocumentFile.resource" [deletable]="deletable" (startDelete)="deleteFile.emit()" @@ -23,11 +27,16 @@ 'upload-bescheid-document-error-' + !!uploadBescheidDocumentInProgress.error " [isLoading]="uploadBescheidDocumentInProgress.loading" - [error]="uploadBescheidDocumentInProgress.error" + [errorMessages]="uploadBescheidDocumentInProgress.error | convertApiErrorToErrorMessages" + description="Bescheiddokument wird hochgeladen" + ></ods-attachment> + <ods-attachment + *ngIf="createDocumentInProgess.loading || hasCreateDocumentError" + errorCaption="Fehler beim automatischen Erstellen" + loadingCaption="Bescheiddokument" + description="Bescheiddokument wird erstellt" + [isLoading]="createDocumentInProgess.loading" + [errorMessages]="createDocumentErrorMessages" + data-test-id="create-bescheid-document-attachment" ></ods-attachment> - <!-- REPLACEME: UI/UX Componente für den Fehler anzeigen--> - <ng-container *ngIf="createBescheidDocumentInProgress.error"> - <span data-test-id="create-bescheid-document-error">Fehler beim automatischen Erstellen.</span> - </ng-container> - <!-- --> </ods-attachment-container> diff --git a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-dokument/vorgang-detail-bescheiden-result-dokument.component.spec.ts b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-dokument/vorgang-detail-bescheiden-result-dokument.component.spec.ts index 2f71e2de6a3ef57174f129655ba0dd7f1c8ddab5..15a99f1bea6f85d4287f1ca9d0a85fffc4144dbc 100644 --- a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-dokument/vorgang-detail-bescheiden-result-dokument.component.spec.ts +++ b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-dokument/vorgang-detail-bescheiden-result-dokument.component.spec.ts @@ -1,7 +1,13 @@ import { BescheidLinkRel, BescheidResource, BescheidService } from '@alfa-client/bescheid-shared'; import { BinaryFile2ContainerComponent } from '@alfa-client/binary-file'; -import { createStateResource } from '@alfa-client/tech-shared'; -import { Mock, existsAsHtmlElement, mock, notExistsAsHtmlElement } from '@alfa-client/test-utils'; +import { CommandResource } from '@alfa-client/command-shared'; +import { + ConvertApiErrorToErrorMessagesPipe, + createEmptyStateResource, + createStateResource, + StateResource, +} from '@alfa-client/tech-shared'; +import { existsAsHtmlElement, Mock, mock, notExistsAsHtmlElement } from '@alfa-client/test-utils'; import { ComponentFixture, TestBed } from '@angular/core/testing'; import { getUrl } from '@ngxp/rest'; import { AttachmentComponent, AttachmentContainerComponent } from '@ods/system'; @@ -9,15 +15,24 @@ import { createBescheidResource } from 'libs/bescheid-shared/src/test/bescheid'; import { createBinaryFileResource } from 'libs/binary-file-shared/test/binary-file'; import { getDataTestIdOf } from 'libs/tech-shared/test/data-test'; import { createApiError } from 'libs/tech-shared/test/error'; -import { MockComponent } from 'ng-mocks'; +import { MockComponent, MockPipe } from 'ng-mocks'; +import { + createCommandErrorStateResource, + createCommandResource, + createCommandStateResource, +} from '../../../../../../../command-shared/test/command'; import { VorgangDetailBescheidenResultDokumentComponent } from './vorgang-detail-bescheiden-result-dokument.component'; describe('VorgangDetailBescheidenResultDokumentComponent', () => { let component: VorgangDetailBescheidenResultDokumentComponent; let fixture: ComponentFixture<VorgangDetailBescheidenResultDokumentComponent>; - const createBescheidDocumentError: string = getDataTestIdOf('create-bescheid-document-error'); - const uploadBescheidDocumentError: string = getDataTestIdOf('upload-bescheid-document-error-true'); + const createBescheidDocumentAttachment: string = getDataTestIdOf( + 'create-bescheid-document-attachment', + ); + const uploadBescheidDocumentError: string = getDataTestIdOf( + 'upload-bescheid-document-error-true', + ); const missingBescheidDocumentErrorMessage: string = getDataTestIdOf( 'missing-bescheid-document-error-message', ); @@ -33,6 +48,7 @@ describe('VorgangDetailBescheidenResultDokumentComponent', () => { MockComponent(BinaryFile2ContainerComponent), MockComponent(AttachmentComponent), MockComponent(AttachmentContainerComponent), + MockPipe(ConvertApiErrorToErrorMessagesPipe), ], providers: [ { @@ -68,6 +84,35 @@ describe('VorgangDetailBescheidenResultDokumentComponent', () => { notExistsAsHtmlElement(fixture, missingBescheidDocumentErrorMessage); }); + + describe('create bescheid document ods-attachment', () => { + it('should be shown if error exists', () => { + component.createBescheidDocumentInProgress = createCommandErrorStateResource(); + + fixture.detectChanges(); + + existsAsHtmlElement(fixture, createBescheidDocumentAttachment); + }); + + it('should be shown while loading', () => { + component.createBescheidDocumentInProgress = createStateResource( + createCommandResource(), + true, + ); + + fixture.detectChanges(); + + existsAsHtmlElement(fixture, createBescheidDocumentAttachment); + }); + + it('should be hidden on loaded without error', () => { + component.createBescheidDocumentInProgress = createCommandStateResource(); + + fixture.detectChanges(); + + notExistsAsHtmlElement(fixture, createBescheidDocumentAttachment); + }); + }); }); describe('handle bescheid document', () => { @@ -108,21 +153,61 @@ describe('VorgangDetailBescheidenResultDokumentComponent', () => { }); }); - describe('create bescheid document error', () => { - it('should be shown if error exists', () => { - component.createBescheidDocumentInProgress = { loading: false, error: createApiError() }; + describe('set create bescheid document in progress', () => { + beforeEach(() => { + component.handleCreateBescheidDocumentCommandError = jest.fn(); + }); - fixture.detectChanges(); + it('should set create document in progress', () => { + const commandStateResource: StateResource<CommandResource> = createEmptyStateResource(); + + component.createBescheidDocumentInProgress = commandStateResource; - existsAsHtmlElement(fixture, createBescheidDocumentError); + expect(component.createDocumentInProgess).toBe(commandStateResource); }); - it('should be hidden on non error', () => { - component.createBescheidDocumentInProgress = { loading: false }; + it('should handle command error', () => { + const commandStateResource: StateResource<CommandResource> = createEmptyStateResource(); - fixture.detectChanges(); + component.createBescheidDocumentInProgress = commandStateResource; + + expect(component.handleCreateBescheidDocumentCommandError).toHaveBeenCalledWith( + commandStateResource, + ); + }); + }); + + describe('handleCreateBescheidDocumentCommandError', () => { + it('should set has error', () => { + component.handleCreateBescheidDocumentCommandError(createCommandErrorStateResource()); + + expect(component.hasCreateDocumentError).toBeTruthy(); + }); + + it('should not set has error', () => { + component.handleCreateBescheidDocumentCommandError(createCommandStateResource()); + + expect(component.hasCreateDocumentError).toBeFalsy(); + }); + + it('should not set has error on empty state resource', () => { + component.handleCreateBescheidDocumentCommandError(createEmptyStateResource()); + + expect(component.hasCreateDocumentError).toBeFalsy(); + }); + + it('should set error messages', () => { + component.handleCreateBescheidDocumentCommandError(createCommandErrorStateResource()); + + expect(component.createDocumentErrorMessages).toEqual([ + VorgangDetailBescheidenResultDokumentComponent.CREATE_DOCUMENT_ERROR_MESSAGE, + ]); + }); + + it('should not set error messages', () => { + component.handleCreateBescheidDocumentCommandError(createCommandStateResource()); - notExistsAsHtmlElement(fixture, createBescheidDocumentError); + expect(component.createDocumentErrorMessages).toEqual([]); }); }); }); diff --git a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-dokument/vorgang-detail-bescheiden-result-dokument.component.ts b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-dokument/vorgang-detail-bescheiden-result-dokument.component.ts index f46d2cbd1d7aa2719a19b7f73ae55e1efb23945e..6e7c4eb3941d74b6d782d2ee6b51ee0d35a93a6f 100644 --- a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-dokument/vorgang-detail-bescheiden-result-dokument.component.ts +++ b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result-dokument/vorgang-detail-bescheiden-result-dokument.component.ts @@ -5,7 +5,8 @@ import { UploadFileInProgress, } from '@alfa-client/bescheid-shared'; import { BinaryFileResource } from '@alfa-client/binary-file-shared'; -import { StateResource } from '@alfa-client/tech-shared'; +import { CommandResource, hasCommandError } from '@alfa-client/command-shared'; +import { createEmptyStateResource, isNotNil, StateResource } from '@alfa-client/tech-shared'; import { Component, EventEmitter, Input, Output } from '@angular/core'; import { getUrl, hasLink } from '@ngxp/rest'; @@ -14,17 +15,32 @@ import { getUrl, hasLink } from '@ngxp/rest'; templateUrl: './vorgang-detail-bescheiden-result-dokument.component.html', }) export class VorgangDetailBescheidenResultDokumentComponent { + static readonly CREATE_DOCUMENT_ERROR_MESSAGE: string = + 'Bescheiddokument konnte nicht erzeugt werden.'; + @Input() bescheidDocumentFile: StateResource<BinaryFileResource>; @Input() uploadBescheidDocumentInProgress: UploadFileInProgress = { loading: false }; - @Input() createBescheidDocumentInProgress: UploadFileInProgress = { loading: false }; + + @Input() set createBescheidDocumentInProgress( + commandStateResource: StateResource<CommandResource>, + ) { + this.createDocumentInProgess = commandStateResource; + this.handleCreateBescheidDocumentCommandError(commandStateResource); + } + @Input() set bescheidDraftStateResource(bescheidStateResource: StateResource<BescheidResource>) { this.handleBescheidDocument(bescheidStateResource.resource); } + @Input() public deletable: boolean; - @Input() public showMissingBescheidDocumentError: boolean; + @Input() public showMissingBescheidDocumentError: boolean; @Output() deleteFile: EventEmitter<void> = new EventEmitter<void>(); + createDocumentErrorMessages: string[] = []; + createDocumentInProgess: StateResource<CommandResource> = createEmptyStateResource(); + hasCreateDocumentError: boolean = false; + constructor(private bescheidService: BescheidService) {} handleBescheidDocument(bescheid: BescheidResource): void { @@ -34,4 +50,18 @@ export class VorgangDetailBescheidenResultDokumentComponent { ); } } + + handleCreateBescheidDocumentCommandError( + commandStateResource: StateResource<CommandResource>, + ): void { + this.hasCreateDocumentError = + isNotNil(commandStateResource.resource) && hasCommandError(commandStateResource.resource); + if (this.hasCreateDocumentError) { + this.createDocumentErrorMessages = [ + VorgangDetailBescheidenResultDokumentComponent.CREATE_DOCUMENT_ERROR_MESSAGE, + ]; + } else { + this.createDocumentErrorMessages = []; + } + } } diff --git a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result.component.ts b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result.component.ts index 20d0b09b29f4ddc0ff80fc310312c5efe4a1613a..29e7e18dfa836123bfbf1232551170fc20224012 100644 --- a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result.component.ts +++ b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-result/vorgang-detail-bescheiden-result.component.ts @@ -13,10 +13,10 @@ import { switchMapCommandSuccessfullyDone, tapOnCommandSuccessfullyDone, } from '@alfa-client/command-shared'; -import { StateResource, createEmptyStateResource, isLoaded } from '@alfa-client/tech-shared'; +import { createEmptyStateResource, isLoaded, StateResource } from '@alfa-client/tech-shared'; import { Component, EventEmitter, OnInit, Output } from '@angular/core'; import { hasLink } from '@ngxp/rest'; -import { Observable, filter, map, of } from 'rxjs'; +import { filter, map, Observable, of } from 'rxjs'; import { BescheidenFormService } from '../bescheiden.formservice'; type sendBescheid = ( @@ -51,9 +51,9 @@ export class VorgangDetailBescheidenResultComponent implements OnInit { loading: false, }); - public createBescheidDocumentInProgress$: Observable<UploadFileInProgress> = of({ - loading: false, - }); + public createBescheidDocumentInProgress$: Observable<StateResource<CommandResource>> = of( + createEmptyStateResource<CommandResource>(), + ); public canSave$: Observable<boolean> = of(true); public canSend$: Observable<boolean> = of(true); diff --git a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-steps-content/vorgang-detail-bescheiden-dokumente-hinzufuegen/vorgang-detail-bescheiden-bescheid-automatisch-erstellen/vorgang-detail-bescheiden-bescheid-automatisch-erstellen.component.spec.ts b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-steps-content/vorgang-detail-bescheiden-dokumente-hinzufuegen/vorgang-detail-bescheiden-bescheid-automatisch-erstellen/vorgang-detail-bescheiden-bescheid-automatisch-erstellen.component.spec.ts index ab3d869ebee84bf9053f79efff6b80f21f68a6ae..0a6689531ec1b15b38d0deac111ed92163911adc 100644 --- a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-steps-content/vorgang-detail-bescheiden-dokumente-hinzufuegen/vorgang-detail-bescheiden-bescheid-automatisch-erstellen/vorgang-detail-bescheiden-bescheid-automatisch-erstellen.component.spec.ts +++ b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-steps-content/vorgang-detail-bescheiden-dokumente-hinzufuegen/vorgang-detail-bescheiden-bescheid-automatisch-erstellen/vorgang-detail-bescheiden-bescheid-automatisch-erstellen.component.spec.ts @@ -1,9 +1,14 @@ import { BescheidLinkRel, BescheidService } from '@alfa-client/bescheid-shared'; -import { HasLinkPipe, createStateResource } from '@alfa-client/tech-shared'; +import { CommandLinkRel } from '@alfa-client/command-shared'; +import { + createEmptyStateResource, + createStateResource, + HasLinkPipe, +} from '@alfa-client/tech-shared'; import { - Mock, dispatchEventFromFixture, existsAsHtmlElement, + Mock, mock, notExistsAsHtmlElement, } from '@alfa-client/test-utils'; @@ -14,13 +19,14 @@ import { ButtonCardComponent, SpinnerIconComponent, } from '@ods/system'; -import { - createBescheidResource, - createUploadFileInProgress, -} from 'libs/bescheid-shared/src/test/bescheid'; +import { createBescheidResource } from 'libs/bescheid-shared/src/test/bescheid'; import { getDataTestIdOf } from 'libs/tech-shared/test/data-test'; import { MockComponent } from 'ng-mocks'; import { of } from 'rxjs'; +import { + createCommandErrorStateResource, + createCommandStateResource, +} from '../../../../../../../../../command-shared/test/command'; import { BescheidenFormService } from '../../../../bescheiden.formservice'; import { VorgangDetailBescheidenBescheidAutomatischErstellenComponent } from './vorgang-detail-bescheiden-bescheid-automatisch-erstellen.component'; @@ -101,7 +107,7 @@ describe('VorgangDetailBescheidenBescheidAutomatischErstellenComponent', () => { it('should clear nachricht', () => { bescheidService.createBescheidDocument.mockReturnValue( - of({ ...createUploadFileInProgress(), loading: false, error: null }), + of(createCommandStateResource([CommandLinkRel.EFFECTED_RESOURCE])), ); component.createBescheidDocument(); @@ -111,9 +117,7 @@ describe('VorgangDetailBescheidenBescheidAutomatischErstellenComponent', () => { }); it('should not clear nachricht when loading', () => { - bescheidService.createBescheidDocument.mockReturnValue( - of({ ...createUploadFileInProgress(), error: null }), - ); + bescheidService.createBescheidDocument.mockReturnValue(of(createEmptyStateResource(true))); component.createBescheidDocument(); @@ -122,9 +126,7 @@ describe('VorgangDetailBescheidenBescheidAutomatischErstellenComponent', () => { }); it('should not clear nachricht when error', () => { - bescheidService.createBescheidDocument.mockReturnValue( - of({ ...createUploadFileInProgress(), loading: false }), - ); + bescheidService.createBescheidDocument.mockReturnValue(of(createCommandErrorStateResource())); component.createBescheidDocument(); diff --git a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-steps-content/vorgang-detail-bescheiden-dokumente-hinzufuegen/vorgang-detail-bescheiden-bescheid-automatisch-erstellen/vorgang-detail-bescheiden-bescheid-automatisch-erstellen.component.ts b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-steps-content/vorgang-detail-bescheiden-dokumente-hinzufuegen/vorgang-detail-bescheiden-bescheid-automatisch-erstellen/vorgang-detail-bescheiden-bescheid-automatisch-erstellen.component.ts index 22ea557b1d537f9bf93d27c173b8920307115e03..c8d7e21a4576391531efa2a1dce7b930e9450070 100644 --- a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-steps-content/vorgang-detail-bescheiden-dokumente-hinzufuegen/vorgang-detail-bescheiden-bescheid-automatisch-erstellen/vorgang-detail-bescheiden-bescheid-automatisch-erstellen.component.ts +++ b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-steps-content/vorgang-detail-bescheiden-dokumente-hinzufuegen/vorgang-detail-bescheiden-bescheid-automatisch-erstellen/vorgang-detail-bescheiden-bescheid-automatisch-erstellen.component.ts @@ -1,12 +1,6 @@ -import { - BescheidLinkRel, - BescheidResource, - BescheidService, - hasUploadNoError, - isUploadFinished, - UploadFileInProgress, -} from '@alfa-client/bescheid-shared'; -import { StateResource } from '@alfa-client/tech-shared'; +import { BescheidLinkRel, BescheidResource, BescheidService } from '@alfa-client/bescheid-shared'; +import { CommandResource, isSuccessfulDone } from '@alfa-client/command-shared'; +import { createEmptyStateResource, StateResource } from '@alfa-client/tech-shared'; import { Component, Input } from '@angular/core'; import { Observable, of, tap } from 'rxjs'; import { BescheidenFormService } from '../../../../bescheiden.formservice'; @@ -18,9 +12,9 @@ import { BescheidenFormService } from '../../../../bescheiden.formservice'; export class VorgangDetailBescheidenBescheidAutomatischErstellenComponent { @Input() public bescheidDraftStateResource: StateResource<BescheidResource>; - public createBescheidDocumentInProgress$: Observable<UploadFileInProgress> = of({ - loading: false, - }); + public createBescheidDocumentInProgress$: Observable<StateResource<CommandResource>> = of( + createEmptyStateResource<CommandResource>(), + ); public readonly bescheidLinkRel = BescheidLinkRel; @@ -31,8 +25,8 @@ export class VorgangDetailBescheidenBescheidAutomatischErstellenComponent { public createBescheidDocument(): void { this.createBescheidDocumentInProgress$ = this.bescheidService.createBescheidDocument().pipe( - tap((uploadFileInProgress: UploadFileInProgress) => { - if (isUploadFinished(uploadFileInProgress) && hasUploadNoError(uploadFileInProgress)) { + tap((commandStateResource: StateResource<CommandResource>) => { + if (isSuccessfulDone(commandStateResource.resource)) { this.formService.clearNachricht(); } }),