Conversation
…(WCAG 1.3.1) WCAG 2.2 criterion 1.3.1 (Info and Relationships, Level A) requires that programmatic structure matches the visual presentation so assistive technologies can correctly expose list context and item counts. Two violations fixed: 1. Navigation sidebar (RecentList): NavGroup (renders <section>) was a direct child of NavList (renders <ul>), producing <ul><section>...</section></ul>. HTML forbids <section> as a direct child of <ul>; screen readers could not announce the correct list context or item count. Fix: remove the NavList wrapper from NavigationRecentList. NavGroup already creates its own internal <ul> for its NavItem children, so the rendered structure is now <nav><ul>...</ul><section><ul><li>...</li></ul></section></nav>, which is valid and correctly exposes the list to assistive technologies. 2. Toast alert group (AppAlertGroup): AlertGroup with isToast always rendered <ul role="list" class="pf-v6-c-alert-group pf-m-toast"> even when empty. An empty element declared as a list violates 1.3.1 because it claims a list relationship with no list items. Fix: return an empty fragment when there are no alerts, consistent with the existing guard in WorkspaceProgress/Alert. Assisted-by: Claude Sonnet 4.6 Signed-off-by: Oleksii Orel <oorel@redhat.com>
|
Docker image build succeeded: quay.io/eclipse/che-dashboard:pr-1564 (linux/amd64, linux/arm64) kubectl patch commandkubectl patch -n eclipse-che "checluster/eclipse-che" --type=json -p="[{"op": "replace", "path": "/spec/components/dashboard/deployment", "value": {containers: [{image: "quay.io/eclipse/che-dashboard:pr-1564", name: che-dashboard}]}}]" |
|
/retest |
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #1564 +/- ##
=======================================
Coverage 92.50% 92.51%
=======================================
Files 561 561
Lines 55890 55892 +2
Branches 4219 4223 +4
=======================================
+ Hits 51700 51706 +6
+ Misses 4142 4138 -4
Partials 48 48 ☔ View full report in Codecov by Sentry. 🚀 New features to boost your workflow:
|
dmytro-ndp
left a comment
There was a problem hiding this comment.
@olexii4 : I tested Eclipse Che Next with the User Dashboard image quay.io/eclipse/che-dashboard:pr-1564, and there was correct HTML sctructure:
- Left sidebar menu and page navigation (html elements
.pf-v6-c-nav__list) lists had the correct structure<ul><li>...:
- There were no
<ul>elements defined as a ‘list' that didn’t contain child elements.
|
[APPROVALNOTIFIER] This PR is NOT APPROVED This pull-request has been approved by: dmytro-ndp, olexii4, svor The full list of commands accepted by this bot can be found here. DetailsNeeds approval from an approver in each of these files:Approvers can indicate their approval by writing |
* fix(a11y): fix invalid list structures in navigation and alert group (WCAG 1.3.1) (#1564) WCAG 2.2 criterion 1.3.1 (Info and Relationships, Level A) requires that programmatic structure matches the visual presentation so assistive technologies can correctly expose list context and item counts. Two violations fixed: 1. Navigation sidebar (RecentList): NavGroup (renders <section>) was a direct child of NavList (renders <ul>), producing <ul><section>...</section></ul>. HTML forbids <section> as a direct child of <ul>; screen readers could not announce the correct list context or item count. Fix: remove the NavList wrapper from NavigationRecentList. NavGroup already creates its own internal <ul> for its NavItem children, so the rendered structure is now <nav><ul>...</ul><section><ul><li>...</li></ul></section></nav>, which is valid and correctly exposes the list to assistive technologies. 2. Toast alert group (AppAlertGroup): AlertGroup with isToast always rendered <ul role="list" class="pf-v6-c-alert-group pf-m-toast"> even when empty. An empty element declared as a list violates 1.3.1 because it claims a list relationship with no list items. Fix: return an empty fragment when there are no alerts, consistent with the existing guard in WorkspaceProgress/Alert. Assisted-by: Claude Sonnet 4.6 Signed-off-by: Oleksii Orel <oorel@redhat.com> * fix(a11y): add role="img" to workspace status indicator span (WCAG 4.1.2) (#1563) WCAG 2.2 criterion 4.1.2 (Name, Role, Value, Level A) requires that elements with aria-label have a valid semantic role so assistive technologies can correctly expose the value. The workspace status indicator used a generic <span> with aria-label but no role, causing screen readers to silently ignore the status text. The same span is used in the Workspaces list and the Workspace Details Overview. Adding role="img" to the span declares it as a named graphic element. Screen readers now announce e.g. "Workspace status is Running" when the element receives focus, satisfying the criterion. Assisted-by: Claude Sonnet 4.6 Signed-off-by: Oleksii Orel <oorel@redhat.com> --------- Signed-off-by: Oleksii Orel <oorel@redhat.com> Co-authored-by: Oleksii Orel <oorel@redhat.com>
What does this PR do?
Fixes two violations of WCAG 2.2 criterion 1.3.1 Info and Relationships (Level A).
WCAG 1.3.1 requires that information conveyed through visual presentation (including list structure) is also available programmatically. When
<ul>or<ol>elements contain children that are not<li>,<script>, or<template>, screen readers cannot correctly announce list context or item count, breaking the programmatic relationship for assistive technology users.Fix 1 — Navigation sidebar:
NavGroupnested insideNavListFile:
src/Layout/Navigation/RecentList.tsxThe "Recent Workspaces" section wrapped a
NavGroup(which PatternFly renders as<section class="pf-v6-c-nav__section">) inside aNavList(which renders as<ul class="pf-v6-c-nav__list" role="list">). This produced the invalid structure:NavGroupalready creates its own internal<ul>for itsNavItemchildren — the outerNavListwrapper was redundant and structurally invalid.Fix: remove the
NavListwrapper fromNavigationRecentList.NavGroupnow sits directly inside theNavelement alongsideNavigationMainList, producing valid HTML:Fix 2 — Toast alert group: empty
<ul role="list">File:
src/components/AppAlertGroup/index.tsxAppAlertGroupunconditionally rendered<AlertGroup isToast>, which PatternFly renders as<ul role="list" class="pf-v6-c-alert-group pf-m-toast">. When there are no active alerts the list is empty — arole="list"element with norole="listitem"children violates 1.3.1.Fix: return an empty fragment when there are no alerts (consistent with the existing guard in
WorkspaceProgress/Alert/index.tsx):public render(): React.ReactElement { - return <AlertGroup isToast>{this.state.alerts.map(alert => this.getAlert(alert))}</AlertGroup>; + const { alerts } = this.state; + if (alerts.length === 0) { + return <></>; + } + return <AlertGroup isToast>{alerts.map(alert => this.getAlert(alert))}</AlertGroup>; }Screenshot/screencast of this PR
What issues does this PR fix or reference?
fixes https://redhat.atlassian.net/browse/CRW-10232
Is it tested? How?
<ul>elements contain only valid<li>children.Release Notes
Docs PR