From 41f5a48365a9a2c826f021740242a6c521a3a535 Mon Sep 17 00:00:00 2001 From: B-LakshmiPriya Date: Tue, 11 Nov 2025 13:23:58 +0530 Subject: [PATCH 1/4] add reflect to disabled property and support aria-disabled --- .../dropdown-button/dropdown-button.ct.ts | 48 +++++++++++++++++++ .../dropdown-button/dropdown-button.tsx | 4 +- .../dropdown-item/dropdown-item.tsx | 4 +- .../components/dropdown/test/dropdown.ct.ts | 47 ++++++++++++++++++ 4 files changed, 101 insertions(+), 2 deletions(-) diff --git a/packages/core/src/components/dropdown-button/dropdown-button.ct.ts b/packages/core/src/components/dropdown-button/dropdown-button.ct.ts index b419a608a14..33a396a7990 100644 --- a/packages/core/src/components/dropdown-button/dropdown-button.ct.ts +++ b/packages/core/src/components/dropdown-button/dropdown-button.ct.ts @@ -57,3 +57,51 @@ regressionTest('submenu', async ({ mount, page }) => { await expect(subItem).toBeVisible(); }); + +regressionTest( + 'should reflect aria-disabled on disabled dropdown button', + async ({ page, mount }) => { + await mount(` + + + + + + + `); + + const disabledButton = page.locator('#disabled-button'); + const enabledButton = page.locator('#enabled-button'); + + await expect(disabledButton).toHaveAttribute('aria-disabled', 'true'); + await expect(enabledButton).toHaveAttribute('aria-disabled', 'false'); + } +); + +regressionTest( + 'should reflect disabled attribute in DOM when changed dynamically', + async ({ page, mount }) => { + await mount(` + + + + + + + `); + + const dynamicButton = page.locator('#dynamic-disabled'); + + await expect(dynamicButton).not.toHaveAttribute('disabled'); + + await dynamicButton.evaluate((element: any) => { + element.disabled = true; + }); + await expect(dynamicButton).toHaveAttribute('disabled'); + + await dynamicButton.evaluate((element: any) => { + element.disabled = false; + }); + await expect(dynamicButton).not.toHaveAttribute('disabled'); + } +); diff --git a/packages/core/src/components/dropdown-button/dropdown-button.tsx b/packages/core/src/components/dropdown-button/dropdown-button.tsx index d54d7abb92b..d93c12be152 100644 --- a/packages/core/src/components/dropdown-button/dropdown-button.tsx +++ b/packages/core/src/components/dropdown-button/dropdown-button.tsx @@ -15,6 +15,7 @@ import { } from '@siemens/ix-icons/icons'; import { makeRef } from '../utils/make-ref'; import type { DropdownButtonVariant } from './dropdown-button.types'; +import { a11yBoolean } from '../utils/a11y'; @Component({ tag: 'ix-dropdown-button', @@ -32,7 +33,7 @@ export class DropdownButton { /** * Disable button */ - @Prop() disabled = false; + @Prop({ reflect: true }) disabled = false; /** * Set label @@ -86,6 +87,7 @@ export class DropdownButton { render() { return ( { + await mount(` + Open + + + + + `); + + const disabledItem = page.locator('#disabled-item'); + const enabledItem = page.locator('#enabled-item'); + + await expect(disabledItem).toHaveAttribute('aria-disabled', 'true'); + await expect(enabledItem).toHaveAttribute('aria-disabled', 'false'); + } +); +regressionTest( + 'should reflect disabled attribute in DOM when changed dynamically', + async ({ page, mount }) => { + await mount(` + Open + + + + + + `); + + const dynamicItem = page.locator('#dynamic-disabled'); + + await expect(dynamicItem).not.toHaveAttribute('disabled'); + + await dynamicItem.evaluate((element: any) => { + element.disabled = true; + }); + + await expect(dynamicItem).toHaveAttribute('disabled'); + + await dynamicItem.evaluate((element: any) => { + element.disabled = false; + }); + + await expect(dynamicItem).not.toHaveAttribute('disabled'); + } +); From 92d8a652cf88cf7b94cb7aa9f5b8d5a877d4b60e Mon Sep 17 00:00:00 2001 From: lakshmi-priya-b Date: Tue, 11 Nov 2025 13:34:43 +0530 Subject: [PATCH 2/4] Update packages/core/src/components/dropdown-button/dropdown-button.ct.ts Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- .../core/src/components/dropdown-button/dropdown-button.ct.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/packages/core/src/components/dropdown-button/dropdown-button.ct.ts b/packages/core/src/components/dropdown-button/dropdown-button.ct.ts index 33a396a7990..3463e84d1d5 100644 --- a/packages/core/src/components/dropdown-button/dropdown-button.ct.ts +++ b/packages/core/src/components/dropdown-button/dropdown-button.ct.ts @@ -82,9 +82,6 @@ regressionTest( 'should reflect disabled attribute in DOM when changed dynamically', async ({ page, mount }) => { await mount(` - - - From 1df271f104f254d7b998964edb7d445e45d57b75 Mon Sep 17 00:00:00 2001 From: lakshmi-priya-b Date: Tue, 11 Nov 2025 13:34:54 +0530 Subject: [PATCH 3/4] Update packages/core/src/components/dropdown/test/dropdown.ct.ts Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- packages/core/src/components/dropdown/test/dropdown.ct.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/core/src/components/dropdown/test/dropdown.ct.ts b/packages/core/src/components/dropdown/test/dropdown.ct.ts index 3355c6f5dd3..1ecf61f41c3 100644 --- a/packages/core/src/components/dropdown/test/dropdown.ct.ts +++ b/packages/core/src/components/dropdown/test/dropdown.ct.ts @@ -860,9 +860,7 @@ regressionTest( await mount(` Open - - `); From 3462b4be68dae7fcaead406f809727f5a483bd44 Mon Sep 17 00:00:00 2001 From: B-LakshmiPriya Date: Tue, 11 Nov 2025 14:38:29 +0530 Subject: [PATCH 4/4] add disabled to the internal button --- packages/core/src/components/dropdown-item/dropdown-item.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/core/src/components/dropdown-item/dropdown-item.tsx b/packages/core/src/components/dropdown-item/dropdown-item.tsx index 4ce53d96751..7163e9affc0 100644 --- a/packages/core/src/components/dropdown-item/dropdown-item.tsx +++ b/packages/core/src/components/dropdown-item/dropdown-item.tsx @@ -117,9 +117,11 @@ export class DropdownItem implements DropdownItemWrapper { class={{ 'dropdown-item': true, 'no-checked-field': this.suppressChecked, + disabled: this.disabled, }} onClick={() => this.emitItemClick()} aria-label={this.ariaLabelButton} + disabled={this.disabled} > {!this.suppressChecked ? (