Skip to content

Commit 94bae79

Browse files
authored
fix(ui5-table): accessibility improvements implemented (#12684)
* fix(ui5-table): accessibility improvements implemented - The correct npm package is used for translations Fixes: #12630 - ariaLabelledByElements is used instead of aria-labelledby Fixes: #12657 - The sample now uses correct mode property Fixes: #11946 * fix(ui5-table): accessibility improvements implemented - The correct npm package is used for translations Fixes: #12630 - ariaLabelledByElements is used instead of aria-labelledby Fixes: #12657 - The sample now uses correct mode property Fixes: #11946
1 parent 45ac45d commit 94bae79

File tree

3 files changed

+22
-19
lines changed

3 files changed

+22
-19
lines changed

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

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,15 @@ describe("Cell Custom Announcement - More details", () => {
148148
cy.realPress("ArrowRight"); // Row actions cell
149149
checkAnnouncement(Table.i18nBundle.getText(MULTIPLE_ACTIONS, 2));
150150
cy.focused().should("have.attr", "aria-colindex", "6")
151-
.should("have.attr", "role", "gridcell");
151+
.should("have.attr", "role", "gridcell")
152+
.then($rowActionsCell => {
153+
const rowActionsCell = $rowActionsCell[0];
154+
const invisibleText = document.getElementById("ui5-table-invisible-text");
155+
expect(rowActionsCell.ariaLabelledByElements[0]).to.equal(invisibleText);
156+
rowActionsCell.blur();
157+
expect(rowActionsCell.ariaLabelledByElements).to.equal(null);
158+
rowActionsCell.focus();
159+
});
152160

153161
cy.get("#row1-edit-action").invoke("remove");
154162
checkAnnouncement(ONE_ROW_ACTION, true);

packages/main/src/TableCustomAnnouncement.ts

Lines changed: 12 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -23,37 +23,32 @@ import {
2323
} from "./generated/i18n/i18n-defaults.js";
2424

2525
let invisibleText: HTMLElement;
26-
const i18nBundle = new I18nBundle("@ui5/webcomponents/main");
26+
const i18nBundle = new I18nBundle("@ui5/webcomponents");
2727

2828
const checkVisibility = (element: HTMLElement): boolean => {
2929
return element.checkVisibility() || getComputedStyle(element).display === "contents";
3030
};
3131

32-
const updateInvisibleText = (element: HTMLElement, text: string | string[] = []) => {
33-
const invisibleTextId = "ui5-table-invisible-text";
32+
const updateInvisibleText = (element: any, text: string | string[] = []) => {
3433
if (!invisibleText || !invisibleText.isConnected) {
3534
invisibleText = document.createElement("span");
36-
invisibleText.id = invisibleTextId;
35+
invisibleText.id = "ui5-table-invisible-text";
3736
invisibleText.ariaHidden = "true";
3837
invisibleText.style.display = "none";
3938
document.body.appendChild(invisibleText);
4039
}
4140

42-
let ariaLabelledBy = (element.getAttribute("aria-labelledby") || "").split(" ").filter(Boolean);
43-
const invisibleTextAssociated = ariaLabelledBy.includes(invisibleTextId);
44-
41+
const ariaLabelledByElements = [...(element.ariaLabelledByElements || [])];
42+
const invisibleTextIndex = ariaLabelledByElements.indexOf(invisibleText);
4543
text = Array.isArray(text) ? text.filter(Boolean).join(" . ").trim() : text.trim();
46-
if (text && !invisibleTextAssociated) {
47-
ariaLabelledBy.push(invisibleTextId);
48-
} else if (!text && invisibleTextAssociated) {
49-
ariaLabelledBy = ariaLabelledBy.filter(id => id !== invisibleTextId);
50-
}
51-
5244
invisibleText.textContent = text;
53-
if (ariaLabelledBy.length > 0) {
54-
element.setAttribute("aria-labelledby", ariaLabelledBy.join(" "));
55-
} else {
56-
element.removeAttribute("aria-labelledby");
45+
46+
if (text && invisibleTextIndex === -1) {
47+
ariaLabelledByElements.unshift(invisibleText);
48+
element.ariaLabelledByElements = ariaLabelledByElements;
49+
} else if (!text && invisibleTextIndex > -1) {
50+
ariaLabelledByElements.splice(invisibleTextIndex, 1);
51+
element.ariaLabelledByElements = ariaLabelledByElements.length ? ariaLabelledByElements : null;
5752
}
5853
};
5954

packages/website/docs/_samples/main/Table/ScrollToLoad/sample.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
<div class="section" style="height: 100px; overflow: auto;">
1313
<!-- playground-fold-end -->
1414
<ui5-table id="table">
15-
<ui5-table-growing id="growing" type="Scroll" slot="features"></ui5-table-growing>
15+
<ui5-table-growing id="growing" mode="Scroll" slot="features"></ui5-table-growing>
1616
<!-- playground-fold -->
1717
<ui5-table-header-row slot="headerRow">
1818
<ui5-table-header-cell id="produtCol"><span>Product</span></ui5-table-header-cell>

0 commit comments

Comments
 (0)