Skip to content

Commit 22eed89

Browse files
committed
fix(checkbox): re-evaluate label visibility when label is updated
1 parent 682a17e commit 22eed89

File tree

4 files changed

+19
-7
lines changed

4 files changed

+19
-7
lines changed

core/src/components/checkbox/checkbox.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import type { ComponentInterface, EventEmitter } from '@stencil/core';
2-
import { Build, Component, Element, Event, Host, Method, Prop, State, h } from '@stencil/core';
2+
import { Build, Component, Element, Event, Host, Method, Prop, State, h, forceUpdate } from '@stencil/core';
33
import { checkInvalidState } from '@utils/forms';
44
import type { Attributes } from '@utils/helpers';
55
import { inheritAriaAttributes, renderHiddenInput } from '@utils/helpers';
@@ -382,7 +382,7 @@ export class Checkbox implements ComponentInterface {
382382
id={this.inputLabelId}
383383
onClick={this.onDivLabelClick}
384384
>
385-
<slot></slot>
385+
<slot onSlotchange={() => forceUpdate(this)}></slot>
386386
{this.renderHintText()}
387387
</div>
388388
<div class="native-wrapper">

packages/angular/test/base/e2e/src/standalone/value-accessors.spec.ts

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,19 @@ test.describe('Value Accessors', () => {
88

99
test('should update the form value', async ({ page }) => {
1010
await expect(page.locator('#formValue')).toHaveText(JSON.stringify({ checkbox: false }, null, 2));
11-
await expect(page.locator('ion-checkbox')).toHaveClass(/ion-pristine/);
11+
await expect(page.getByRole('checkbox', { name: 'Static Checkbox Label' })).toHaveClass(/ion-pristine/);
1212

13-
await page.locator('ion-checkbox').click();
13+
await page.getByRole('checkbox', { name: 'Static Checkbox Label' }).click();
1414

1515
await expect(page.locator('#formValue')).toHaveText(JSON.stringify({ checkbox: true }, null, 2));
16-
await expect(page.locator('ion-checkbox')).toHaveClass(/ion-dirty/);
17-
await expect(page.locator('ion-checkbox')).toHaveClass(/ion-valid/);
16+
await expect(page.getByRole('checkbox', { name: 'Static Checkbox Label' })).toHaveClass(/ion-dirty/);
17+
await expect(page.getByRole('checkbox', { name: 'Static Checkbox Label' })).toHaveClass(/ion-valid/);
18+
19+
await expect(page.getByRole('checkbox', { name: 'Static Checkbox Label' })).toBeVisible();
20+
});
21+
22+
test('should display dynamically set label', async ({ page }) => {
23+
await expect(page.getByRole('checkbox', { name: 'Dynamic Checkbox Label' })).toBeVisible();
1824
});
1925
});
2026

packages/angular/test/base/src/app/standalone/value-accessors/checkbox/checkbox.component.html

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ <h1>IonCheckbox Value Accessors</h1>
66
</p>
77

88
<app-value-accessor-test [formGroup]="form">
9-
<ion-checkbox formControlName="checkbox">Checkbox</ion-checkbox>
9+
<ion-checkbox formControlName="checkbox">Static Checkbox Label</ion-checkbox>
1010
</app-value-accessor-test>
11+
<ion-checkbox>{{dynamicLabel}}</ion-checkbox>
1112
</div>

packages/angular/test/base/src/app/standalone/value-accessors/checkbox/checkbox.component.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,11 @@ import { ValueAccessorTestComponent } from "../value-accessor-test/value-accesso
1515
]
1616
})
1717
export class CheckboxComponent {
18+
dynamicLabel = '';
19+
20+
ngAfterViewChecked(): void {
21+
this.dynamicLabel = 'Dynamic Checkbox Label';
22+
}
1823

1924
form = this.fb.group({
2025
checkbox: [false, Validators.required],

0 commit comments

Comments
 (0)