tju-yxq opened a new issue, #6201:
URL: https://github.com/apache/rocketmq-dashboard/issues/6201

   ### Describe the bug
   
   Every asynchronous outcome in the console is reported through an antd 
`message` or `notification` toast — exports, saves, deletes, retries, bulk 
results, background failures. None of it reaches a screen reader:
   
   - rc-notification (antd 5.22 / rc-notification 5.6.4, the engine behind both 
APIs) ships **no ARIA semantics** — a source scan of the installed package 
finds exactly one aria attribute (the Close button's `aria-label`); there is no 
`aria-live`, no `role="status"`/`role="alert"` anywhere.
   - A toast is therefore a DOM element that appears for three seconds and 
disappears, with no live region for assistive technology to observe. A 
screen-reader user who triggers "export CSV" or "delete consumer group" gets 
**no confirmation, no error, nothing** — the primary feedback channel of the 
whole UI is silent.
   
   Both toast paths are affected:
   
   | Path | Call sites | Portal |
   |---|---|---|
   | static `message.success/error/warning` | 60+ files | own portal in 
`document.body` |
   | `App.useApp().message` (antd `<App>` context) | 13 files | the App 
instance's portal |
   | static `notification.*` | 31 files | own portal in `document.body` |
   
   ### To reproduce
   
   1. Open the console with a screen reader running (NVDA / VoiceOver).
   2. Trigger any toast, e.g. Topic page → export CSV, or clear acknowledged 
alerts.
   3. Observe: the visual toast appears; the screen reader announces nothing.
   
   ```
   # evidence: the installed toast engine has no live semantics
   grep -r "aria" node_modules/rc-notification/es  # -> only the Close button's 
aria-label
   ```
   
   ### Expected behavior
   
   Toast text is announced when it appears (and not re-announced when it 
expires). The standard live-region pattern applied at the portal level achieves 
this without touching any call site: antd's `getContainer` config lets the app 
choose the element toasts mount into, so both the static singletons 
(`message.config` / `notification.config`) and the `App.useApp()` instances 
(the `message` / `notification` config props on antd's `<App>`) can mount into 
body-level containers carrying `role="status"` + `aria-live="polite"` — polite 
queues instead of interrupting, which fits non-emergency toasts.
   
   ### Additional context
   
   A fix is submitted referencing this issue. The region elements are created 
once at app start, before any toast can fire, because a live region that 
appears in the same DOM update as its content is not reliably announced.
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to