Skip to content

Commit bb0670b

Browse files
feat(ui5-button): add accessibilityInfo getter (#12704)
1 parent 768a8ca commit bb0670b

File tree

3 files changed

+88
-1
lines changed

3 files changed

+88
-1
lines changed

packages/main/cypress/specs/Button.cy.tsx

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -577,4 +577,61 @@ describe("Accessibility", () => {
577577
cy.get("@tag")
578578
.should("have.text", "999+");
579579
});
580+
581+
it("accessibilityInfo returns correct properties for different button states", () => {
582+
cy.mount(<Button design="Emphasized" accessibleDescription="Submit form">Submit</Button>);
583+
584+
cy.get<Button>("[ui5-button]")
585+
.then($button => {
586+
const button = $button.get(0);
587+
const info = button.accessibilityInfo;
588+
589+
expect(info.description).to.include("Submit form");
590+
expect(info.description).to.include(Button.i18nBundle.getText(BUTTON_ARIA_TYPE_EMPHASIZED));
591+
expect(info.role).to.equal("button");
592+
expect(info.disabled).to.be.false;
593+
});
594+
});
595+
596+
it("accessibilityInfo reflects custom role and disabled state", () => {
597+
cy.mount(<Button accessibleRole="Link" disabled>Navigate</Button>);
598+
599+
cy.get<Button>("[ui5-button]")
600+
.then($button => {
601+
const button = $button.get(0);
602+
const info = button.accessibilityInfo;
603+
604+
expect(info.role).to.equal("link");
605+
expect(info.disabled).to.be.true;
606+
expect(info.description).to.be.undefined;
607+
});
608+
});
609+
610+
it("accessibilityInfo updates when properties change", () => {
611+
cy.mount(<Button>Click me</Button>);
612+
613+
cy.get<Button>("[ui5-button]")
614+
.as("button");
615+
616+
cy.get<Button>("@button")
617+
.then($button => {
618+
const button = $button.get(0);
619+
expect(button.accessibilityInfo.disabled).to.be.false;
620+
expect(button.accessibilityInfo.role).to.equal("button");
621+
622+
button.disabled = true;
623+
button.accessibleRole = "Link";
624+
button.design = "Negative";
625+
});
626+
627+
cy.get<Button>("@button")
628+
.then($button => {
629+
const button = $button.get(0);
630+
const info = button.accessibilityInfo;
631+
632+
expect(info.disabled).to.be.true;
633+
expect(info.role).to.equal("link");
634+
expect(info.description).to.include("Negative Action");
635+
});
636+
});
580637
});

packages/main/src/Button.ts

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ import toLowercaseEnumValue from "@ui5/webcomponents-base/dist/util/toLowercaseE
2929
import ButtonDesign from "./types/ButtonDesign.js";
3030
import ButtonType from "./types/ButtonType.js";
3131
import ButtonBadgeDesign from "./types/ButtonBadgeDesign.js";
32-
import type ButtonAccessibleRole from "./types/ButtonAccessibleRole.js";
32+
import ButtonAccessibleRole from "./types/ButtonAccessibleRole.js";
3333
import type ButtonBadge from "./ButtonBadge.js";
3434
import ButtonTemplate from "./ButtonTemplate.js";
3535
import {
@@ -39,6 +39,8 @@ import {
3939
BUTTON_ARIA_TYPE_ATTENTION,
4040
BUTTON_BADGE_ONE_ITEM,
4141
BUTTON_BADGE_MANY_ITEMS,
42+
BUTTON_ROLE_DESCRIPTION,
43+
LINK_ROLE_DESCRIPTION,
4244
} from "./generated/i18n/i18n-defaults.js";
4345

4446
// Styles
@@ -658,6 +660,28 @@ class Button extends UI5Element implements IButton {
658660
};
659661
}
660662

663+
get accessibilityInfo() {
664+
return {
665+
description: this.ariaDescriptionText,
666+
role: this.effectiveAccRole,
667+
disabled: this.disabled,
668+
children: this.text,
669+
type: this.effectiveAccRoleTranslation,
670+
};
671+
}
672+
673+
get effectiveAccRoleTranslation(): string {
674+
if (this.role === ButtonAccessibleRole.Button) {
675+
return Button.i18nBundle.getText(BUTTON_ROLE_DESCRIPTION);
676+
}
677+
678+
if (this.role === ButtonAccessibleRole.Link) {
679+
return Button.i18nBundle.getText(LINK_ROLE_DESCRIPTION);
680+
}
681+
682+
return "";
683+
}
684+
661685
get effectiveBadgeDescriptionText() {
662686
if (!this.shouldRenderBadge) {
663687
return "";

packages/main/src/i18n/messagebundle.properties

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,12 @@ BUTTON_BADGE_ONE_ITEM={0} item
8585
#XACT: ARIA announcement for the Button Badge with value more than 1 - "{0} items"
8686
BUTTON_BADGE_MANY_ITEMS={0} items
8787

88+
#ACC: ARIA announcement for the Button role attribute
89+
BUTTON_ROLE_DESCRIPTION=Button
90+
91+
#ACC: ARIA announcement for the Link role attribute
92+
LINK_ROLE_DESCRIPTION=Link
93+
8894
#XACT: Text for Today item in CalendarLegend
8995
CAL_LEGEND_TODAY_TEXT=Today
9096

0 commit comments

Comments
 (0)