Content
View differences
Updated by Alexander Coles about 7 hours ago
### Goal
Bring the keyboard behavior of #DREAM-846 to every embedded consumer of the shared work package table — the form query groups (children and related work packages) in the split and full view, relation tabs, dashboard and My page widgets, text-editor table macros, global search, the BIM BCF list — in OpenProject 18.0.0, with the same feature-spec and automated accessibility coverage as the main list: the embedded-consumers part of #DREAM-846's Rollout section.
### Starting point
#DREAM-886 enables the focus model only for the main work package list through `WorkPackageTableConfiguration.keyboardNavigationEnabled`, default off. Embedded consumers and the BIM BCF list retain their previous behavior until this work enables it for them. The capability is a development-time staging switch, not a user-facing feature flag: this work enables every consumer and then removes the switch, so 18.0.0 ships one interaction everywhere, with #DREAM-897 as the release gate.
Consumers have different enabled features and permissions: context menus, inline create/editing and drag and drop can be disabled. Preserve those configurations; a consumer with context menus disabled does not gain them. Wherever the new interaction is enabled, cell reachability, focus entry/exit, selection semantics and accessible state must work together.
The interim plan proposed on #DREAM-860 (2026-10-23, https://community.openproject.org/projects/DREAM/work_packages/DREAM-860/activity#comment-1764185) keeps row-first focus and `treegrid` in all modes. Navigation uses #DREAM-886's roving-navigation boundary: header, ledger rows and overall totals. Inline-create and empty-state rows remain outside that walk but are exposed inside the treegrid by #DREAM-885. Selection eligibility follows #DREAM-893, independently of which rows are navigable; row counts and indices follow #DREAM-860 and #DREAM-938.
### Scope
1. Inventory which embedded surfaces use the shared component and their configurations: the form query groups (children and related) in the split and full view, relation tabs, dashboard/My page widgets, text-editor table macros, global search results and the BIM BCF list. The Relations tab itself is a Rails Turbo frame, not a shared-table consumer. Identify separately implemented tables that remain outside scope and why. Record whether each consumer can render expandable rows. A consumer that never does still follows the interim `treegrid` plan, with no `aria-expanded` rows; verify its reading in #DREAM-897 and send contrary evidence to #DREAM-860 rather than adding a per-consumer role workaround.
2. Enable `keyboardNavigationEnabled` per consumer once the complete interaction from #DREAM-886, #DREAM-885, #DREAM-938, #DREAM-894 and #DREAM-895 works for its enabled features. Verify navigation, selection/reconciliation, context actions, cell interaction and accessible state together; disabled features and permissions stay unchanged. Once every consumer is enabled, remove the capability together with the capability-off code paths and the specs that exist only for them (#DREAM-885's capability-off parity specs included).
3. Feature-spec parity: the embedded-table and macro suites cover the same keyboard and semantics behaviors as the main-list suites, reusing the helpers introduced with #DREAM-886, #DREAM-885 and #DREAM-894 (the keyboard navigation, treegrid semantics and keyboard selection specs and the live-region support component) instead of new hand-rolled helpers. Add coverage for configuration differences and native **Tab** entry and exit.
4. Automated accessibility checks: extend #DREAM-885's axe coverage to representative pages with an embedded table — a work package relations tab, a dashboard or My page with a table widget, a wiki page with a table macro, global search results and a BCF list — in their default configurations, with no violations attributable to the table.
5. Extend #DREAM-886's existing per-table lifetime and isolation coverage with actual consumer configurations. On pages with several tables, keyboard events, selection, focus recovery and asynchronous editor return stay with their owner. Include surrounding controls, inline-create outside roving navigation and editor-owned overlays from #DREAM-895; no table may capture another table's focus or editor.
### Acceptance criteria
- The inventory is recorded in #DREAM-846; every consumer in it exposes the complete interaction for its enabled features before release, and `keyboardNavigationEnabled` no longer exists.
- Multi-table pages show no cross-table keyboard, focus, selection or editor-return leakage; specs extend the existing isolation coverage.
- Existing disabled features and permissions are preserved. Every consumer exposes consistent navigability, selection eligibility and the agreed accessible row model.
- Embedded-table and macro feature suites cover the new interaction with the shared helpers and stay green; the axe checks on the listed pages pass; frontend typecheck and touched-file lint pass.
- Representative consumer configurations enter the #DREAM-897 screen-reader/release matrix.
### Out of scope
Card rendering; enabling previously disabled context menus, editing or other product features; separately implemented tables; redefining the shared focus model or per-consumer ARIA roles.
Bring the keyboard behavior of #DREAM-846 to every embedded consumer of the shared work package table — the form query groups (children and related work packages) in the split and full view,
### Starting point
#DREAM-886 enables the focus model only for the main work package list through `WorkPackageTableConfiguration.keyboardNavigationEnabled`, default off. Embedded consumers and the BIM BCF list retain their previous behavior until this work enables it for them. The capability is a development-time staging switch, not a user-facing feature flag: this work enables every consumer and then removes the switch, so 18.0.0 ships one interaction everywhere, with #DREAM-897 as the release gate.
Consumers have different enabled features and permissions: context menus, inline create/editing and drag and drop can be disabled. Preserve those configurations; a consumer with context menus disabled does not gain them. Wherever the new interaction is enabled, cell reachability, focus entry/exit, selection semantics and accessible state must work together.
The interim plan proposed on #DREAM-860 (2026-10-23, https://community.openproject.org/projects/DREAM/work_packages/DREAM-860/activity#comment-1764185) keeps row-first focus and `treegrid` in all modes. Navigation uses #DREAM-886's roving-navigation boundary: header, ledger rows and overall totals. Inline-create and empty-state rows remain outside that walk but are exposed inside the treegrid by #DREAM-885. Selection eligibility follows #DREAM-893, independently of which rows are navigable; row counts and indices follow #DREAM-860 and #DREAM-938.
### Scope
1. Inventory which embedded surfaces use the shared component and their configurations: the form query groups (children and related) in the split and full view,
2. Enable `keyboardNavigationEnabled` per consumer once the complete interaction from #DREAM-886, #DREAM-885, #DREAM-938, #DREAM-894 and #DREAM-895 works for its enabled features. Verify navigation, selection/reconciliation, context actions, cell interaction and accessible state together; disabled features and permissions stay unchanged. Once every consumer is enabled, remove the capability together with the capability-off code paths and the specs that exist only for them (#DREAM-885's capability-off parity specs included).
3. Feature-spec parity: the embedded-table and macro suites cover the same keyboard and semantics behaviors as the main-list suites, reusing the helpers introduced with #DREAM-886, #DREAM-885 and #DREAM-894 (the keyboard navigation, treegrid semantics and keyboard selection specs and the live-region support component) instead of new hand-rolled helpers. Add coverage for configuration differences and native **Tab** entry and exit.
4. Automated accessibility checks: extend #DREAM-885's axe coverage to representative pages with an embedded table — a work package relations tab, a dashboard or My page with a table widget, a wiki page with a table macro, global search results and a BCF list — in their default configurations, with no violations attributable to the table.
5. Extend #DREAM-886's existing per-table lifetime and isolation coverage with actual consumer configurations. On pages with several tables, keyboard events, selection, focus recovery and asynchronous editor return stay with their owner. Include surrounding controls, inline-create outside roving navigation and editor-owned overlays from #DREAM-895; no table may capture another table's focus or editor.
### Acceptance criteria
- The inventory is recorded in #DREAM-846; every consumer in it exposes the complete interaction for its enabled features before release, and `keyboardNavigationEnabled` no longer exists.
- Multi-table pages show no cross-table keyboard, focus, selection or editor-return leakage; specs extend the existing isolation coverage.
- Existing disabled features and permissions are preserved. Every consumer exposes consistent navigability, selection eligibility and the agreed accessible row model.
- Embedded-table and macro feature suites cover the new interaction with the shared helpers and stay green; the axe checks on the listed pages pass; frontend typecheck and touched-file lint pass.
- Representative consumer configurations enter the #DREAM-897 screen-reader/release matrix.
### Out of scope
Card rendering; enabling previously disabled context menus, editing or other product features; separately implemented tables; redefining the shared focus model or per-consumer ARIA roles.