Skip to content

ROU-12848: Fix Broken ARIA reference on Data Grid column headers#508

Open
gnbm wants to merge 6 commits into
devfrom
ROU-12848
Open

ROU-12848: Fix Broken ARIA reference on Data Grid column headers#508
gnbm wants to merge 6 commits into
devfrom
ROU-12848

Conversation

@gnbm
Copy link
Copy Markdown
Collaborator

@gnbm gnbm commented Jun 6, 2026

This PR fixes the "Broken ARIA reference" accessibility errors (reported by WAVE) on Data Grid column headers and filter buttons, and unblocks CI by resolving a pre-existing npm install dependency conflict.

What was happening

Accessibility (primary)

  • Every filterable column header cell and its filter ("funnel") button carried an aria-describedby attribute pointing to a non-existent element (e.g. aria-describedby="0.lhfuia0d7am"), producing WAVE "Broken ARIA reference" errors (2 per filterable column).
  • Root cause: the wrapper stored the OutSystems column uniqueId in Wijmo's Column.describedById property purely as a side-channel for column lookup. Wijmo renders describedById as a real aria-describedby attribute, but no matching description element was ever created — so the IDREF dangled.
  • axe-core and Lighthouse stayed green because they don't validate aria-describedby targets; plain Wijmo FlexGrid (same version) emits no aria-describedby, confirming the defect lives in the wrapper, not Wijmo.

CI / dependencies

  • npm install failed in CI with ERESOLVE. A prior automated bump (af11b3b) raised typedoc to ^0.28.19 (and typedoc-umlclass to ^0.10.2) without a compatible TypeScript. typedoc@0.28 peer-requires typescript@>=5.0, but the project is pinned to typescript@^4.9.5; it also breaks typedoc-plugin-merge-modules@4.1.0 (peer typedoc 0.23.x||0.24.x).
  • Because package-lock.json is gitignored, CI resolves fresh from package.json on every install, so this conflict broke every PR (pre-existing on dev, surfaced — not caused — by this PR).

What was done

Accessibility fix

  • Stopped passing the uniqueId to Wijmo's describedById (removed from ColumnConfig.getProviderConfig() and the IColumnProviderConfigs interface), so no aria-describedby attribute is emitted.
  • Relocated the uniqueId onto an isolated expando on the Wijmo column instance, accessed exclusively through new helpers Helper.GetColumnUniqueId / Helper.SetColumnUniqueId (single source of truth, no scattered casts).
  • The expando is set once in AbstractProviderColumn.build() and read by ClickEvent and DirtyMark; the existing binding fallback for autogenerated columns is unchanged, so column-to-OutSystems-column mapping is behaviorally identical.
  • Fixed two pre-existing comment typos in touched files (CleanningCleaning, not needno need).

TypeDoc rollback (CI fix)

  • Reverted typedoc ^0.28.19^0.23.28 and typedoc-umlclass ^0.10.2^0.7.1 (the last versions compatible with TypeScript 4.9.5 and typedoc-plugin-merge-modules@4.1.0), restoring a peer-coherent set and a clean npm install. typedoc is dev-only docs tooling — no runtime impact. Kept TypeScript at ^4.9.5 (a TS major upgrade is out of scope here and warrants its own PR).

Dependency bump (bundled)

  • postcss → ^8.5.15.

Documentation

  • Added ADR-0005 (Broken ARIA reference fix) and ADR-0006 (TypeDoc rollback) under docs/adr/, and backfilled the missing ADR-0004 entry in the ADR log.

Test Steps

  1. Go to the test screen
  2. Run WAVE — confirm 0 "Broken ARIA reference" errors (was 14).
  3. Regression: click a data cell and confirm the OnCellClick event fires with the correct column; edit a cell and confirm the dirty-mark styling applies.
  4. Confirm filtering, sorting, reordering, grouping, and column picker still work.
  5. CI: confirm npm install resolves with no ERESOLVE and build-n-test passes. (npm run docs still generates with the reverted TypeDoc.)

Screenshots

  • Before: image

  • After: image

Checklist

  • tested locally
  • documented the code
  • clean all warnings and errors of eslint
  • requires changes in OutSystems (if so, provide a module with changes)
  • requires new sample page in OutSystems (if so, provide a module with changes)

@gnbm gnbm requested a review from a team as a code owner June 6, 2026 09:34
@gnbm gnbm added the bug Something isn't working label Jun 6, 2026
gnbm added 2 commits June 6, 2026 10:39
Wijmo's Column.describedById was being used as a side-channel to store the
OutSystems column uniqueId. Wijmo renders describedById as an aria-describedby
attribute pointing to a non-existent element, producing 'Broken ARIA reference'
errors (flagged by WAVE) on every filterable column header and filter button.

Relocate the uniqueId off describedById onto an isolated expando on the Wijmo
column instance, accessed through Helper.GetColumnUniqueId / SetColumnUniqueId.
Column-to-OutSystems-column mapping (ClickEvent, DirtyMark) is preserved, with
the existing binding fallback for autogenerated columns unchanged. No more
aria-describedby is emitted, clearing all Broken ARIA reference errors.
Update package.json to use postcss ^8.5.15 (was ^8.5.6). This is a dependency version bump to incorporate patch fixes and improvements in the PostCSS package from a security vulnerability.
gnbm added 4 commits June 6, 2026 10:55
… bump

A previous automated dependency bump raised typedoc to ^0.28.19 (and
typedoc-umlclass to ^0.10.2) without a compatible TypeScript. typedoc@0.28
requires typescript@>=5.0 (peer) while the project is pinned to
typescript@^4.9.5, and it also breaks typedoc-plugin-merge-modules@4.1.0
(peer typedoc 0.23.x||0.24.x). Since package-lock.json is gitignored, CI
resolves fresh from package.json on every 'npm install', so this conflict
broke CI with ERESOLVE.

Revert typedoc to ^0.23.28 and typedoc-umlclass to ^0.7.1 (last versions
compatible with TypeScript 4.9.5 and the merge-modules plugin). typedoc is a
dev-only docs tool, so there is no runtime impact.
…eDoc rollback)

Document the two decisions made in this PR:
- ADR-0005: relocating the column uniqueId off Wijmo's describedById onto an
  isolated expando to eliminate the dangling aria-describedby (Broken ARIA
  reference) errors.
- ADR-0006: rolling back the incompatible typedoc 0.28 bump to the last
  TypeScript-4.9-compatible versions to restore npm install in CI.

Also backfill the missing ADR-0004 entry in the ADR log and realign the table.
@sonarqubecloud
Copy link
Copy Markdown

sonarqubecloud Bot commented Jun 6, 2026

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant