diff --git a/alfa-client/apps/alfa-e2e/src/components/ui/button-with-spinner.e2e.component.ts b/alfa-client/apps/alfa-e2e/src/components/ui/button-with-spinner.e2e.component.ts deleted file mode 100644 index 4ac9816e675cd64b552f97c41b05a685dd8307d1..0000000000000000000000000000000000000000 --- a/alfa-client/apps/alfa-e2e/src/components/ui/button-with-spinner.e2e.component.ts +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright (C) 2023 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -export class ButtonWithSpinnerE2EComponent { - private readonly locatorButton: string = 'icon-button'; - - public findButton(root) { - return root.findTestElementWithClass(this.locatorButton); - } - - //TODO Methode aus der MeinPage verwenden - public waitToDisappear(root) { - root.should('not.have.descendants', '[data-test-class=spinner]'); - } -} diff --git a/alfa-client/apps/alfa-e2e/src/components/wiedervorlage/wiedervorlage-page.e2e.component.ts b/alfa-client/apps/alfa-e2e/src/components/wiedervorlage/wiedervorlage-page.e2e.component.ts index 4be7b6532108923566044183f5591b1a175ee2d8..e17043afdfaa7c7de564ec7b244ff85b1761985a 100644 --- a/alfa-client/apps/alfa-e2e/src/components/wiedervorlage/wiedervorlage-page.e2e.component.ts +++ b/alfa-client/apps/alfa-e2e/src/components/wiedervorlage/wiedervorlage-page.e2e.component.ts @@ -22,7 +22,6 @@ * unter der Lizenz sind dem Lizenztext zu entnehmen. */ import { AttachmentContainerE2EComponent } from '../attachment/attachment.e2e.component'; -import { ButtonWithSpinnerE2EComponent } from '../ui/button-with-spinner.e2e.component'; export class WiedervorlageE2EComponent { private readonly locatorBetreffInput: string = 'Betreff-text-input'; @@ -33,10 +32,7 @@ export class WiedervorlageE2EComponent { private readonly locatorStatusDot: string = 'dot'; private readonly locatorSpeichernButton: string = 'speichern-button'; - private readonly buttonWithSpinnerComponent: ButtonWithSpinnerE2EComponent = - new ButtonWithSpinnerE2EComponent(); - private readonly attachmentContainer: AttachmentContainerE2EComponent = - new AttachmentContainerE2EComponent(); + private readonly attachmentContainer: AttachmentContainerE2EComponent = new AttachmentContainerE2EComponent(); public getBetreff() { return cy.getTestElement(this.locatorBetreffInput); @@ -63,9 +59,7 @@ export class WiedervorlageE2EComponent { } public getSpeichernButton() { - return this.buttonWithSpinnerComponent.findButton( - cy.getTestElement(this.locatorSpeichernButton), - ); + return cy.getTestElement(this.locatorSpeichernButton); } public getAttachmentContainer(): AttachmentContainerE2EComponent { diff --git a/alfa-client/apps/alfa-e2e/src/components/wiedervorlage/wiedervorlagen-in-vorgang.e2e.component.ts b/alfa-client/apps/alfa-e2e/src/components/wiedervorlage/wiedervorlagen-in-vorgang.e2e.component.ts index 93801c671d44ca75f7473867689c7941d6efa611..91718623842de6e64bb8c0a863ba2146606d68c4 100644 --- a/alfa-client/apps/alfa-e2e/src/components/wiedervorlage/wiedervorlagen-in-vorgang.e2e.component.ts +++ b/alfa-client/apps/alfa-e2e/src/components/wiedervorlage/wiedervorlagen-in-vorgang.e2e.component.ts @@ -21,15 +21,10 @@ * Die sprachspezifischen Genehmigungen und Beschränkungen * unter der Lizenz sind dem Lizenztext zu entnehmen. */ -import { ButtonWithSpinnerE2EComponent } from '../ui/button-with-spinner.e2e.component'; import { WiedervorlageInVorgangE2EComponent } from './wiedervorlage-in-vorgang.e2e.component'; export class WiedervorlagenInVorgangE2EComponent { private readonly locatorCreateWiedervorlageButton: string = 'create-wiedervorlage'; - - private readonly buttonWithSpinnerComponent: ButtonWithSpinnerE2EComponent = - new ButtonWithSpinnerE2EComponent(); - private readonly locatorRoot: string = 'wiedervorlagen-in-vorgang'; public getRoot() { diff --git a/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-detailansicht/vorgang-wiedereroeffnen.cy.ts b/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-detailansicht/vorgang-wiedereroeffnen.cy.ts index c86efc5d90992c7d5eb14b126554bc3b1872cac1..246013c7b169d348bd6882b3cd20f1d211f1b6fa 100644 --- a/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-detailansicht/vorgang-wiedereroeffnen.cy.ts +++ b/alfa-client/apps/alfa-e2e/src/e2e/main-tests/vorgang-detailansicht/vorgang-wiedereroeffnen.cy.ts @@ -153,8 +153,9 @@ describe('Vorgang wiedereroeffnen', () => { contains(snackbar.getMessage(), VorgangMessagesE2E.WIEDEREROEFFNET); }); - it('should close snackbar on revoke', () => { + it('should click on snackbar revoke', () => { snackbar.getRevokeButton().click(); + wait(500); waitForSpinnerToDisappear(); notExist(snackbar.getMessage()); @@ -258,7 +259,7 @@ describe('Vorgang wiedereroeffnen', () => { contains(snackbar.getMessage(), VorgangMessagesE2E.WIEDEREROEFFNET); }); - it('should close snackbar on revoke', () => { + it('should click snackbar revoke', () => { snackbar.getRevokeButton().click(); wait(500); waitForSpinnerToDisappear(); diff --git a/alfa-client/libs/design-component/src/lib/button-with-spinner/button-with-spinner.component.spec.ts b/alfa-client/libs/design-component/src/lib/button-with-spinner/button-with-spinner.component.spec.ts index de1242c608e560f453c76ee160ddaf89dc3b9b0c..7643fbc6e08d29e0aadf7792f87d1f40348b709b 100644 --- a/alfa-client/libs/design-component/src/lib/button-with-spinner/button-with-spinner.component.spec.ts +++ b/alfa-client/libs/design-component/src/lib/button-with-spinner/button-with-spinner.component.spec.ts @@ -21,13 +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 { ComponentFixture, TestBed } from '@angular/core/testing'; -import { createCommandErrorStateResource, createCommandResource } from 'libs/command-shared/test/command'; +import { createCommandErrorStateResource } from 'libs/command-shared/test/command'; import { createApiError } from 'libs/tech-shared/test/error'; +import { createDummyResource } from '../../../../tech-shared/test/resource'; import { ButtonWithSpinnerComponent } from './button-with-spinner.component'; -import * as ResourceUtils from 'libs/tech-shared/src/lib/resource/resource.util'; - describe('ButtonWithSpinnerComponent', () => { let component: ButtonWithSpinnerComponent; let fixture: ComponentFixture<ButtonWithSpinnerComponent>; @@ -46,39 +46,25 @@ describe('ButtonWithSpinnerComponent', () => { expect(component).toBeTruthy(); }); - describe('onInit', () => { - it('should call getStateResource', () => { - component.getStateResource = jest.fn(); + describe('set stateResource', () => { + it('should set stateResource', () => { + const stateResource: StateResource<unknown> = createStateResource(createDummyResource()); - component.ngOnInit(); + component.stateResource = stateResource; - expect(component.getStateResource).toHaveBeenCalled(); + expect(component._stateResource).toBe(stateResource); }); - }); - - describe('getStateResource', () => { - it('should return stateResource', () => { - component.stateResource = ResourceUtils.createStateResource(createCommandResource()); - - component.getStateResource(); - const valid: boolean = ResourceUtils.isValidStateResource(component.stateResource); - expect(valid).toBeTruthy(); - }); - - it('should return empty stateResource', () => { - const spy = jest.spyOn(ResourceUtils, 'createEmptyStateResource'); + it('should not set stateResource', () => { component.stateResource = null; - component.getStateResource(); - - expect(spy).toHaveBeenCalled(); + expect(component._stateResource).not.toBe(null); }); }); describe('isLoading', () => { it('should return false', () => { - component.stateResource.loading = component.stateResource.reload = false; + component._stateResource.loading = component._stateResource.reload = false; const isLoading: boolean = component.isLoading; @@ -86,8 +72,8 @@ describe('ButtonWithSpinnerComponent', () => { }); it('should return true if stateResource is loading', () => { - component.stateResource.loading = true; - component.stateResource.reload = false; + component._stateResource.loading = true; + component._stateResource.reload = false; const isLoading: boolean = component.isLoading; @@ -95,8 +81,8 @@ describe('ButtonWithSpinnerComponent', () => { }); it('should return true if stateResource is reloading', () => { - component.stateResource.loading = false; - component.stateResource.reload = true; + component._stateResource.loading = false; + component._stateResource.reload = true; const isLoading: boolean = component.isLoading; @@ -106,7 +92,7 @@ describe('ButtonWithSpinnerComponent', () => { describe('isError', () => { it('should return false if error is not set', () => { - component.stateResource.error = null; + component._stateResource.error = null; const isError: boolean = component.isError; @@ -114,7 +100,7 @@ describe('ButtonWithSpinnerComponent', () => { }); it('should return false if error is set and error is ApiError', () => { - component.stateResource.error = createApiError(); + component._stateResource.error = createApiError(); const isError: boolean = component.isError; @@ -122,7 +108,7 @@ describe('ButtonWithSpinnerComponent', () => { }); it('should return true if error is set and error is not ApiError', () => { - component.stateResource = createCommandErrorStateResource(); + component._stateResource = createCommandErrorStateResource(); const isError: boolean = component.isError; diff --git a/alfa-client/libs/design-component/src/lib/button-with-spinner/button-with-spinner.component.ts b/alfa-client/libs/design-component/src/lib/button-with-spinner/button-with-spinner.component.ts index f76f1f907cecaa625c3e1c6dc950458e3f4aa640..a12b0a8ad74b49d34ec172ae36682d7d0ce01104 100644 --- a/alfa-client/libs/design-component/src/lib/button-with-spinner/button-with-spinner.component.ts +++ b/alfa-client/libs/design-component/src/lib/button-with-spinner/button-with-spinner.component.ts @@ -24,7 +24,7 @@ import { CommandResource, hasCommandError } from '@alfa-client/command-shared'; import { StateResource, createEmptyStateResource, isLoaded } from '@alfa-client/tech-shared'; import { CommonModule } from '@angular/common'; -import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; +import { Component, EventEmitter, Input, Output } from '@angular/core'; import { ButtonComponent, ErrorMessageComponent, buttonVariants } from '@ods/system'; import { VariantProps } from 'class-variance-authority'; import { isNil } from 'lodash-es'; @@ -49,28 +49,24 @@ type ButtonVariants = VariantProps<typeof buttonVariants>; <ng-content icon select="[icon]" /> </ods-button>`, }) -export class ButtonWithSpinnerComponent implements OnInit { +export class ButtonWithSpinnerComponent { + @Input() set stateResource(value: StateResource<unknown>) { + if (!isNil(value)) this._stateResource = value; + } @Input() text: string = ''; @Input() dataTestId: string = ''; - @Input() stateResource: StateResource<unknown>; @Input() variant: ButtonVariants['variant'] = 'primary'; @Input() size: ButtonVariants['size'] = 'medium'; @Output() public clickEmitter: EventEmitter<MouseEvent> = new EventEmitter<MouseEvent>(); - ngOnInit(): void { - this.stateResource = this.getStateResource(); - } - - getStateResource(): StateResource<unknown> { - return isNil(this.stateResource) ? createEmptyStateResource() : this.stateResource; - } + _stateResource: StateResource<unknown> = createEmptyStateResource(); get isLoading(): boolean { - return this.stateResource.loading || this.stateResource.reload; + return this._stateResource.loading || this._stateResource.reload; } get isError(): boolean { - return isLoaded(this.stateResource) && hasCommandError(<CommandResource>this.stateResource.resource); + return isLoaded(this._stateResource) && hasCommandError(<CommandResource>this._stateResource.resource); } } diff --git a/alfa-client/libs/wiedervorlage/src/lib/submit-wiedervorlage-button/submit-wiedervorlage-button.component.html b/alfa-client/libs/wiedervorlage/src/lib/submit-wiedervorlage-button/submit-wiedervorlage-button.component.html index 322b8313078161b76335fcbb5936987686522411..df18f4361bbd25449d00c65d6ae30df918cc7617 100644 --- a/alfa-client/libs/wiedervorlage/src/lib/submit-wiedervorlage-button/submit-wiedervorlage-button.component.html +++ b/alfa-client/libs/wiedervorlage/src/lib/submit-wiedervorlage-button/submit-wiedervorlage-button.component.html @@ -26,20 +26,21 @@ @if (showAsIconButton) { <ods-button-with-spinner [stateResource]="submitInProgress$ | async" + (clickEmitter)="submit()" tooltip="Wiedervorlage speichern" variant="ghost" size="fit" - (clickEmitter)="submit()" + dataTestId="speichern-icon-button" > <ods-save-icon icon class="fill-text" /> </ods-button-with-spinner> } @else { <ods-button-with-spinner - data-test-id="speichern-button" [stateResource]="submitInProgress$ | async" + (clickEmitter)="submit()" text="Speichern" variant="outline" - (clickEmitter)="submit()" + dataTestId="speichern-button" > <ods-save-icon icon /> </ods-button-with-spinner>