[ui5-li | ui5-list]: inner RadioButton announces 'Item Selection.' instead of option label in single-select mode (WCAG 4.1.2)
Maintainer thường phản hồi trong vòng 2 ngày
Chưa có ai nhận issue này.
Đánh giá
- Độ khó
- 2/5
- Thời gian dự kiến
- 1-3 giờ
- Mức phù hợp với người mới
- 78/100
- Loại issue
- Lỗi
- Độ rõ ràng
- Đặc tả rõ ràng
- Mức độ hoạt động
- Sôi nổi
- Công nghệ
- typescript, web-dev
- Lĩnh vực
- accessibility, frontend
Hướng nghiên cứu
Bắt đầu tại packages/main/src/ListItemTemplate.tsx, ở selectionElement(), và kiểm tra ngữ nghĩa trợ năng của RadioButton chọn một và li bên ngoài được mô tả trong issue. Kiểm tra xem việc ẩn điều khiển bên trong có giữ nguyên việc trình đọc màn hình thông báo tùy chọn hay không, sau đó chạy các bài kiểm tra trợ năng hoặc mục danh sách liên quan. Hoàn tất khi các tùy chọn chọn một thông báo nhãn hiển thị của chúng mà không có cụm chung “Item Selection”.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Mô tả
Bug Description
In single-select ui5-list mode (e.g. inside ui5-view-settings-dialog), each ui5-li renders an inner RadioButton via the selectionElement() function in ListItemTemplate.tsx. That RadioButton carries a hardcoded aria-label of "Item Selection." (from the i18n key ARIA_LABEL_LIST_ITEM_RADIO_BUTTON).
NVDA (and other screen readers that pierce the shadow DOM) focuses the inner div[role="radio"] inside the RadioButton shadow root and announces:
"Item Selection. radio button not checked"
The actual option label (e.g. "Ascending", "Completion Date", "Title") is never announced, because the inner radio button only carries the generic i18n string.
Root cause chain:
# packages/main/src/i18n/messagebundle_en.properties
ARIA_LABEL_LIST_ITEM_RADIO_BUTTON=Item Selection.
// packages/main/src/ListItem.ts (line ~531)
ariaLabelRadioButton: ListItem.i18nBundle.getText(ARIA_LABEL_LIST_ITEM_RADIO_BUTTON),
// packages/main/src/ListItemTemplate.tsx — selectionElement()
case this.modeSingleSelect:
return (
<RadioButton
part="radio"
disabled={this.isInactive}
accessibleName={this._accInfo.ariaLabelRadioButton} // ← "Item Selection."
tabindex={-1}
id={`${this._id}-singleSelectionElement`}
class="ui5-li-singlesel-radiobtn"
checked={this.selected}
onChange={this.onSingleSelectionComponentPress}
/>
);
The inner RadioButton's div[role="radio"] therefore gets aria-label="Item Selection.", which is what screen readers announce.
The outer <li> element already carries the correct ARIA semantics:
role="radio"aria-checkedaria-posinset/aria-setsize- The option label is exposed via its text content /
aria-labelledby
The inner RadioButton is purely decorative — it is redundant and its generic label conflicts with the accessible name on the host.
Affected Component
ui5-li / ui5-list (in SingleSelect / SingleSelectBegin / SingleSelectEnd mode)
Observed via ui5-view-settings-dialog (sort option list), which uses a single-select List internally.
Expected Behaviour
Screen readers should announce each option with its visible label (e.g. "Ascending radio button not checked"), not the generic string "Item Selection.".
Fix options (in order of preference):
-
(Preferred — minimal, upstream) Add
aria-hidden="true"on the innerRadioButtoninselectionElement()whenmodeSingleSelect. The outer<li role="radio">already provides all ARIA semantics; hiding the inner radio button removes the duplicate and the misleading announcement. -
(Alternative) Derive
ariaLabelRadioButtonfrom the list item's own accessible text (e.g. the item's text content oraccessibleNameprop) instead of the hardcoded i18n string — so the inner radio button, if not hidden, at least announces the correct label.
Isolated Example
Playground: https://ui5.github.io/webcomponents/components/fiori/ViewSettingsDialog/
Steps: Open the playground, click the sort/filter dialog, Tab to a sort option. NVDA will announce "Item Selection. radio button not checked" for each option instead of the option's label.
Steps to Reproduce
- Navigate to a page with a single-select
ui5-list(e.g. theViewSettingsDialogplayground or any sort dialog) - Tab to a list item in the single-select list
- Observe: screen reader announces "Item Selection. radio button not checked" — the option label is not announced
Expected: each option is announced with its visible label ("Ascending", "Descending", "Completion Date", etc.)
Log Output, Stack Trace or Screenshots
Source references confirmed in current main branch:
messagebundle_en.properties→ARIA_LABEL_LIST_ITEM_RADIO_BUTTON=Item Selection.ListItem.ts→ariaLabelRadioButton: ListItem.i18nBundle.getText(ARIA_LABEL_LIST_ITEM_RADIO_BUTTON)ListItemTemplate.tsx→selectionElement()passesaccessibleName={this._accInfo.ariaLabelRadioButton}to innerRadioButton
Priority
High
Environment Info
UI5 Web Components Version
2.x (root cause in source confirmed against current main branch)
Browser
- Chrome
- Edge
- Firefox
- Safari
Operating System
macOS, Windows
Additional Info
Organization
SAP-SF
- Ngôn ngữ chính
- TypeScript
- Star
- 1.8k
- Fork
- 290
- Merge trung bình
- 2 ngày 14 giờ
- Pull request đã merge (30 ngày)
- 54
Chuẩn bị môi trường
- Không có Dockerfile hay tệp Docker Compose
- Có mẫu pull request
- Đọc hướng dẫn đóng góp
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Issue khác của UI5/webcomponents
-
[Button]: crash on Safari 17 due to missing ElementInternals.states guard in _setBadgeOverlayStyleĐang mởbug TOPIC B
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 87/100
UI5/webcomponents#14270 · 1 bình luận ·
Maintainer thường phản hồi trong vòng 2 ngày
-
[Feature Request][Side Navigation][A11Y]: Enhance user experience navigating components tree itemsCó thể đã có người làm @TeodorTaushanov đã nhận 5 ngày trước. Đang mởbug Medium Prio TOPIC RD
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 72/100
UI5/webcomponents#14232 · 1 bình luận · 1 người được giao ·
Maintainer thường phản hồi trong vòng 2 ngày
-
enhancement feature request TOPIC RD
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 68/100
UI5/webcomponents#14222 · 1 bình luận ·
Maintainer thường phản hồi trong vòng 2 ngày
-
[SF][A11y][ui5-select] Conflicting ARIA: role="combobox" rendered with aria-roledescription="Listbox" (confuses screen-reader users)Có thể đã có người làm @PetyaMarkovaBogdanova đã nhận 9 ngày trước. Đang mởbug Medium Prio TOPIC P
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 67/100
UI5/webcomponents#14212 · 2 bình luận · 1 người được giao ·
Maintainer thường phản hồi trong vòng 2 ngày
-
(ui5-search): Loading state sample is brokenCó thể đã có người làm @ndeshev đã nhận 9 ngày trước. Đang mởbug Low Prio TOPIC RL
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 68/100
UI5/webcomponents#14210 · 1 người được giao ·
Maintainer thường phản hồi trong vòng 2 ngày
Tất cả issue của UI5/webcomponents
Issue tương tự
-
area:cards enhancement ready-for-agent
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 66/100
fil-donadoni/tolaria#8883 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
xsd:integer cast from a string rejects negative numbers, a leading + and surrounding whitespaceĐang mởbug 🐛
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 78/100
comunica/comunica#1960 · 1 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Waiting for: Product Owner
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 76/100
getsentry/sentry-javascript#26203 · 1 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày
-
bug
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 76/100
bytedance/flowgram.ai#1235 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 76/100
devswha/herdr-web-ui#3325 ·