patternfly / patternfly/react-data-view

DataViewFilters: MenuToggle for filter category selector has no accessible name

Aperta Adatta ai principianti
#680 1 commento 0 reazioni 0 assegnatari Vedi su GitHub

Nessuno ha ancora preso questa issue.

Lingua principale
TypeScript
Stelle
4
Fork
21
Metriche di merge delle PR
Nessuna PR unita negli ultimi 30g

Descrizione

Description

The DataViewFilters component renders a MenuToggle as the filter category selector (e.g., to switch between "Name" and "Label" filters). This button has no accessible name, causing a critical button-name axe violation (WCAG 4.1.2).

Root cause

In DataViewFilters.tsx:

  1. activeAttributeMenu is initialized as '' (line 46)
  2. It's only populated via useEffect after the first render (lines 63–65)
  3. The MenuToggle has no aria-label prop (lines 80–88)

On the initial render, the button has no text content, no aria-label, no aria-labelledby, and no title — making it completely invisible to screen readers.

// Line 46 — empty initial state
const [activeAttributeMenu, setActiveAttributeMenu] = useState<string>('');

// Lines 80-88 — no aria-label, children is '' on first render
const attributeToggle = (
  <MenuToggle
    ref={attributeToggleRef}
    onClick={() => setIsAttributeMenuOpen(!isAttributeMenuOpen)}
    isExpanded={isAttributeMenuOpen}
    icon={toggleIcon}
  >
    {activeAttributeMenu}
  </MenuToggle>
);

Suggested fix

Two changes:

  1. Initialize activeAttributeMenu from the first child's title prop synchronously instead of via useEffect, so it's never empty:

    const initialTitle = useMemo(() => filterItems[0]?.title ?? '', []);
    const [activeAttributeMenu, setActiveAttributeMenu] = useState<string>(initialTitle);
    
  2. Add a fallback aria-label on the MenuToggle:

    <MenuToggle
      aria-label="Filter by"
      ...
    >
    

How to reproduce

Render DataViewFilters with 2+ filter children and run axe-core:

<DataViewFilters>
  <DataViewTextFilter filterId="name" title="Name" />
  <DataViewTextFilter filterId="label" title="Label" />
</DataViewFilters>

axe reports:

critical button-name: Buttons must have discernible text
Target: .pf-m-filter-group > div:nth-child(1) > .pf-v6-c-menu-toggle

Environment

  • @patternfly/react-data-view: 6.5.0

  • Detected by: axe-core 4.11 via @axe-core/playwright

Related

  • #21 (DataView accessibility meta-issue)

Jira Issue: PF-4416

Guida per i contributori

Apri la guida per i contributori

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Direzione di ricerca

Inizia da packages/module/src/DataViewFilters/DataViewFilters.tsx, esaminando lo stato activeAttributeMenu e il MenuToggle intorno alle righe 46 e 80–88. Esegui il rendering di DataViewFilters con i figli del filtro Name e Label dell’issue, quindi esegui axe-core. Il lavoro è completato quando il selettore della categoria del filtro ha un nome accessibile rilevabile al rendering iniziale e la violazione critica button-name è scomparsa.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Valutazione

Stack tecnologico
react, typescript
Ambito
accessibility, frontend
Tipo di issue
Bug
Difficoltà
2/5
Tempo stimato
1-3 ore
Stato di attività
Tranquilla
Chiarezza
Specificata chiaramente
Idoneità per principianti
78/100

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.