patternfly / patternfly/react-data-view

DataViewFilters: MenuToggle for filter category selector has no accessible name

Offen Anfängerfreundlich
#680 1 Kommentar 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

Vorherrschende Sprache
TypeScript
Sterne
4
Forks
21
PR-Merge-Kennzahlen
Keine gemergten PRs in 30 T.

Beschreibung

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

Beitragsleitfaden

Beitragsleitfaden öffnen

Erste Schritte

  1. Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
  3. Forke das Repository und arbeite in einem Branch.
  4. Öffne einen Pull Request, der die Issue-Nummer nennt.

Rechercherichtung

Beginne in packages/module/src/DataViewFilters/DataViewFilters.tsx und überprüfe den activeAttributeMenu-Zustand sowie den MenuToggle um die Zeilen 46 und 80–88. Rendere DataViewFilters mit den Filter-Kindern Name und Label aus dem Issue und führe anschließend axe-core aus. Erledigt ist die Aufgabe, wenn der Filterkategorie-Selektor beim initialen Rendern einen erkennbaren zugänglichen Namen hat und die kritische button-name-Verletzung verschwunden ist.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
react, typescript
Bereich
accessibility, frontend
Issue-Typ
Bug
Schwierigkeit
2/5
Geschätzter Aufwand
1-3 Stunden
Aktivitätsstatus
Ruhig
Klarheit
Klar beschrieben
Anfängerfreundlichkeit
78/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.