From 24c9d50d32fdaa3e5adacb688315cd9d49b789b0 Mon Sep 17 00:00:00 2001 From: OZGCloud <ozgcloud@mgm-tp.com> Date: Tue, 28 May 2024 07:44:01 +0200 Subject: [PATCH] OZG-5708: improve code after code review --- .../src/lib/bescheid.service.ts | 4 +- .../libs/command-shared/test/command.ts | 4 +- .../lib/attachment/attachment.component.ts | 3 +- alfa-client/libs/tech-shared/src/index.ts | 1 + ...eiden-result-attachments.component.spec.ts | 2 +- ...-bescheiden-result-dokument.component.html | 19 +--- ...scheiden-result-dokument.component.spec.ts | 103 +++++++++++++++--- ...il-bescheiden-result-dokument.component.ts | 36 +++++- 8 files changed, 132 insertions(+), 40 deletions(-) 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 27d3e4969c..1319d619d0 100644 --- a/alfa-client/libs/bescheid-shared/src/lib/bescheid.service.ts +++ b/alfa-client/libs/bescheid-shared/src/lib/bescheid.service.ts @@ -397,7 +397,7 @@ export class BescheidService { public createBescheidDocument(): Observable<StateResource<CommandResource>> { this.clearUploadBescheidDocumentInProgress(); - this.setCreateBescheidDocumenInProgress(); + this.setCreateBescheidDocumentInProgress(); this.doCreateBescheidDocument() .pipe(filterIsLoadedOrHasError(), first()) .subscribe((commandStateResource: StateResource<CommandResource>) => @@ -414,7 +414,7 @@ export class BescheidService { return this.createBescheidDocumentInProgress$.asObservable(); } - private setCreateBescheidDocumenInProgress(): void { + private setCreateBescheidDocumentInProgress(): void { this.createBescheidDocumentInProgress$.next(createEmptyStateResource(true)); } diff --git a/alfa-client/libs/command-shared/test/command.ts b/alfa-client/libs/command-shared/test/command.ts index 50191f7763..22dfc484d7 100644 --- a/alfa-client/libs/command-shared/test/command.ts +++ b/alfa-client/libs/command-shared/test/command.ts @@ -27,7 +27,7 @@ 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 { Command, CommandListResource, CommandOrder, CommandResource, CommandStatus, CreateCommand, CreateCommandProps, } from '../src/lib/command.model'; export function createCommand(): Command { return { @@ -71,7 +71,7 @@ export function createCommandErrorResource(linkRelations: string[] = []): Comman export function createCommandErrorStateResource( linkRelations: string[] = [], ): StateResource<CommandResource> { - return createStateResource(createCommandResource(linkRelations)); + return createStateResource(createCommandErrorResource(linkRelations)); } export function createCreateCommand( 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 576f749144..4a4fe3ee58 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,6 +1,7 @@ import { CommonModule } from '@angular/common'; import { Component, Input } from '@angular/core'; +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'; @@ -50,7 +51,7 @@ export class AttachmentComponent { @Input() isLoading: boolean = false; @Input() set errorMessages(errorMessages: string[]) { - this.hasError = errorMessages?.length > 0; + this.hasError = isNotEmpty(errorMessages); this.errors = errorMessages; } diff --git a/alfa-client/libs/tech-shared/src/index.ts b/alfa-client/libs/tech-shared/src/index.ts index fd72ff72fc..64e34b9ffc 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/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 b22cef4f5b..c9b80fe49d 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, @@ -26,7 +27,6 @@ import { createLoadedBinaryFileResource, createLoadingBinaryFileStateResource, } from '../../../../../../../binary-file-shared/test/binary-file'; -import { ConvertApiErrorToErrorMessagesPipe } from '../../../../../../../tech-shared/src/lib/pipe/convert-api-error-to-error-messages.pipe'; import { getDataTestIdOf } from '../../../../../../../tech-shared/test/data-test'; import { createApiError } from '../../../../../../../tech-shared/test/error'; import { BescheidenFormService } from '../../bescheiden.formservice'; 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 2ab0f38b91..2080ba5b2a 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 @@ -11,7 +11,7 @@ *ngIf=" !bescheidDocumentFile.loading && !uploadBescheidDocumentInProgress.loading && - !createBescheidDocumentInProgress.loading + !createDocumentInProgess.loading " [file]="bescheidDocumentFile.resource" [deletable]="deletable" @@ -31,21 +31,12 @@ description="Bescheiddokument wird hochgeladen" ></ods-attachment> <ods-attachment - *ngIf=" - createBescheidDocumentInProgress.loading || - createBescheidDocumentInProgress.resource?.errorMessage - " + *ngIf="createDocumentInProgess.loading || hasCreateDocumentError" errorCaption="Fehler beim automatischen Erstellen" loadingCaption="Bescheiddokument" description="Bescheiddokument wird erstellt" - [isLoading]="createBescheidDocumentInProgress.loading" - [errorMessages]=" - createBescheidDocumentInProgress.resource?.errorMessage ? - ['Bescheiddokument konnte nicht erzeugt werden.'] - : [] - " - [attr.data-test-id]=" - 'create-bescheid-document-error-' + !!createBescheidDocumentInProgress.resource?.errorMessage - " + [isLoading]="createDocumentInProgess.loading" + [errorMessages]="createDocumentErrorMessages" + data-test-id="create-bescheid-document-attachment" ></ods-attachment> </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 3088aa467f..15a99f1bea 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,6 +1,12 @@ import { BescheidLinkRel, BescheidResource, BescheidService } from '@alfa-client/bescheid-shared'; import { BinaryFile2ContainerComponent } from '@alfa-client/binary-file'; -import { createStateResource } from '@alfa-client/tech-shared'; +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'; @@ -11,18 +17,18 @@ import { getDataTestIdOf } from 'libs/tech-shared/test/data-test'; import { createApiError } from 'libs/tech-shared/test/error'; import { MockComponent, MockPipe } from 'ng-mocks'; import { - createCommandErrorResource, + createCommandErrorStateResource, + createCommandResource, createCommandStateResource, } from '../../../../../../../command-shared/test/command'; -import { ConvertApiErrorToErrorMessagesPipe } from '../../../../../../../tech-shared/src/lib/pipe/convert-api-error-to-error-messages.pipe'; 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-true', + const createBescheidDocumentAttachment: string = getDataTestIdOf( + 'create-bescheid-document-attachment', ); const uploadBescheidDocumentError: string = getDataTestIdOf( 'upload-bescheid-document-error-true', @@ -78,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', () => { @@ -118,23 +153,61 @@ describe('VorgangDetailBescheidenResultDokumentComponent', () => { }); }); - describe('create bescheid document error', () => { - it('should be shown if error exists', () => { - component.createBescheidDocumentInProgress = createStateResource( - createCommandErrorResource(), + describe('set create bescheid document in progress', () => { + beforeEach(() => { + component.handleCreateBescheidDocumentCommandError = jest.fn(); + }); + + it('should set create document in progress', () => { + const commandStateResource: StateResource<CommandResource> = createEmptyStateResource(); + + component.createBescheidDocumentInProgress = commandStateResource; + + expect(component.createDocumentInProgess).toBe(commandStateResource); + }); + + it('should handle command error', () => { + const commandStateResource: StateResource<CommandResource> = createEmptyStateResource(); + + component.createBescheidDocumentInProgress = commandStateResource; + + expect(component.handleCreateBescheidDocumentCommandError).toHaveBeenCalledWith( + commandStateResource, ); + }); + }); - fixture.detectChanges(); + describe('handleCreateBescheidDocumentCommandError', () => { + it('should set has error', () => { + component.handleCreateBescheidDocumentCommandError(createCommandErrorStateResource()); - existsAsHtmlElement(fixture, createBescheidDocumentError); + expect(component.hasCreateDocumentError).toBeTruthy(); }); - it('should be hidden on non error', () => { - component.createBescheidDocumentInProgress = createCommandStateResource(); + it('should not set has error', () => { + component.handleCreateBescheidDocumentCommandError(createCommandStateResource()); - fixture.detectChanges(); + 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 cbfdd571df..6e7c4eb394 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,8 +5,8 @@ import { UploadFileInProgress, } from '@alfa-client/bescheid-shared'; import { BinaryFileResource } from '@alfa-client/binary-file-shared'; -import { CommandResource } from '@alfa-client/command-shared'; -import { createEmptyStateResource, 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'; @@ -15,20 +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: StateResource<CommandResource> = - createEmptyStateResource(); + + @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 { @@ -38,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 = []; + } + } } -- GitLab