From bb04669e2f4b87dbee4bcdd484849700cacad3de Mon Sep 17 00:00:00 2001 From: Alexander Reifschneider <alexander.reifschneider@mgm-tp.com> Date: Wed, 16 Apr 2025 08:34:28 +0200 Subject: [PATCH] Fix console error "ExpressionChangedAfterItHasBeenCheckedError" --- .../button-toggle.component.spec.ts | 18 +++++++++++++----- .../button-toggle/button-toggle.component.ts | 18 +++++++++++++----- 2 files changed, 26 insertions(+), 10 deletions(-) diff --git a/alfa-client/libs/design-system/src/lib/form/button-toggle/button-toggle.component.spec.ts b/alfa-client/libs/design-system/src/lib/form/button-toggle/button-toggle.component.spec.ts index b628713544..6fb9cc0281 100644 --- a/alfa-client/libs/design-system/src/lib/form/button-toggle/button-toggle.component.spec.ts +++ b/alfa-client/libs/design-system/src/lib/form/button-toggle/button-toggle.component.spec.ts @@ -68,22 +68,30 @@ describe('ButtonToggleComponent', () => { }); }); - describe('isChecked', () => { + describe('ngDoCheck', () => { it('should call isSelected', () => { component.isSelected = jest.fn(); component.value = 'test'; - component.isChecked; + component.ngDoCheck(); expect(component.isSelected).toHaveBeenCalledWith('test'); }); - it('should return result of isSelected', () => { + it('should set isChecked', () => { component.isSelected = jest.fn().mockReturnValue(true); - const result: boolean = component.isChecked; + component.ngDoCheck(); - expect(result).toBe(true); + expect(component.isChecked).toBe(true); + }); + }); + + describe('isToggleChecked', () => { + it('should return isChecked', () => { + component.isChecked = true; + + expect(component.isToggleChecked).toBe(true); }); }); }); diff --git a/alfa-client/libs/design-system/src/lib/form/button-toggle/button-toggle.component.ts b/alfa-client/libs/design-system/src/lib/form/button-toggle/button-toggle.component.ts index 682b688db3..33755af2e7 100644 --- a/alfa-client/libs/design-system/src/lib/form/button-toggle/button-toggle.component.ts +++ b/alfa-client/libs/design-system/src/lib/form/button-toggle/button-toggle.component.ts @@ -22,7 +22,7 @@ * unter der Lizenz sind dem Lizenztext zu entnehmen. */ import { CommonModule } from '@angular/common'; -import { Component, HostBinding, Input } from '@angular/core'; +import { Component, DoCheck, HostBinding, Input } from '@angular/core'; import { CheckIconComponent } from '../../icons/check-icon/check-icon.component'; @Component({ @@ -41,18 +41,26 @@ import { CheckIconComponent } from '../../icons/check-icon/check-icon.component' (blur)="isFocused = false" data-test-id="button-toggle" > - <ods-check-icon size="small" *ngIf="isChecked" data-test-id="toggle-check-icon" /> + @if (isChecked) { + <ods-check-icon size="small" data-test-id="toggle-check-icon" /> + } <p class="text-sm">{{ label }}</p> </button>`, }) -export class ButtonToggleComponent { +export class ButtonToggleComponent implements DoCheck { @Input({ required: true }) label!: string; @Input({ required: true }) value!: string; @Input() onClick: () => void; @Input() isSelected: (value: string) => boolean = () => false; + isChecked: boolean = false; + @HostBinding('class.ods-focused') isFocused: boolean = false; - @HostBinding('class.ods-button-toggle-checked') get isChecked() { - return this.isSelected(this.value); + @HostBinding('class.ods-button-toggle-checked') get isToggleChecked() { + return this.isChecked; + } + + ngDoCheck(): void { + this.isChecked = this.isSelected(this.value); } } -- GitLab