Skip to content

Add confirm-before-execute, Chat query states, and accessible FilterPanel - #348

Merged
woksin merged 65 commits into
mainfrom
feature/release-4160
Sep 27, 2026
Merged

woksin merged 65 commits into
mainfrom
feature/release-4160

Conversation

@woksin

@woksin woksin commented Sep 26, 2026 •

Copy link
Copy Markdown
Contributor

Command dialogs can now ask for confirmation before they execute, Chat shows loading and failure states, and FilterPanel works from the keyboard and with screen readers.

Added

Changed

  • Tooltip content accepts any React node, and 0 now shows. undefined, null, booleans, and an empty string still disable the tooltip. Keep tooltip content non-interactive. Renderer adapters that implement common.tooltip receive nodes and must render them as they are; the Conformance profile now checks this. (Tooltip content is typed string but renders any ReactNode #230)
  • FilterPanel is now a named, non-modal dialog. Opening it moves focus into the panel, and Escape closes it and returns focus to the element that opened it. It now renders as a div with role="dialog" instead of an <aside>, so it is no longer a complementary landmark: getByRole('complementary') no longer finds it, and CSS or tests that target the aside element must use .pv-filter-dropdown or getByRole('dialog', { name }) instead. This also applies to the filter panel inside PivotViewer. (Make toolbar and filter controls keyboard- and screen-reader-accessible #328)
  • Loading and failure rows in query tables now remount on each state change, so screen readers announce the change. (Show query loading, failure, and authorization states in bound tables and chat #327)
  • Conformance merges a part variant's own pt attributes with the profile's pass-through markers instead of replacing them.

Fixed

  • A read-only or disabled DatePickerInput can no longer change its value through the Today and Clear actions, and a read-only picker no longer opens its calendar with Alt+ArrowDown.
  • DataTableForQuery, DataTableForObservableQuery and DataPage show their loading state, not the empty state, while an Arc query result says it is not ready yet (isReady: false). Results that do not report readiness behave as before.

Closes #317, closes #327, closes #230, closes #244, closes #260, closes #334. Refs #328 (toolbar arrow-key navigation remains) and #349.

…lection guides

Adds a DatePickerInput reference page (props, Date | null contract,
locale and messages.datePicker, React Aria keyboard and screen-reader
behavior, validation states, stable parts), registers it in the Common
toc, and links it from CalendarField. Rewrites the Common and Dialogs
landing pages as 'which component do I use' guides. Docs only; no API
changes. The Tooltip reference page is deferred.

Prose was AI-drafted; review it as prose as well as for accuracy.

Refs #260
Resolve Arc query flags in a CSS-free internal directory so Chat no longer inherits the DataTables stylesheet through its runtime closure. Keep area-specific status enums and guard the Chat import boundary.
…claims

The Tooltip row now links to the Tooltips section, BusyIndicatorDialog is described as taking only a title and message, and the Tooltip guidance names Dialog for interactive content instead of a Popover that Components does not export.
Release note: getByRole('complementary') no longer finds the panel; use getByRole('dialog').
Arc's setCommandValues writes the onBeforeExecute result onto the command instance that execute() sends. Skipping it after unmount made an unguarded command execute with its pre-transform values. Always apply the values, as main does; the React state update it also performs is a no-op after unmount.
structuredClone throws for values it cannot copy, such as a function in a command property. Taking the approval snapshot outside the guard's error handling let that escape as an unhandled rejection. The snapshot is now taken inside it, so the failure reaches onException, the guard is not asked, and the command does not execute. The stepper docs also now say fields stay disabled until the guarded submission settles, not only while the guard is pending.
@woksin woksin added the minor label Sep 26, 2026
4.16.0 adds one story module (FilterPanel accessibility) and five stories: Chat query states, CommandDialog confirmation, rich Tooltip content, PivotViewer labels, and FilterPanel keyboard focus. The Tooltip and CommandDialog stories render slotted components, so the full renderer matrix grows by two. Counts measured from the built indexes: 75 modules, 336 stories and 75 autodocs pages per renderer, and 181 matrix stories.
The story used a fixed 600px wrapper. In CI's viewport the PivotViewer viewport overflowed and became scrollable, and axe flagged it (scrollable-region-focusable). The other PivotViewer stories fill the preview with a flex wrapper, which avoids the overflow. The underlying gap, that the viewport is not keyboard-focusable when it scrolls, is tracked separately.
Arc serializes declared command properties with Fundamentals, including derived type identifiers. Comparing cloned enumerable fields can approve a different payload after the guard starts. Compare serialized property snapshots instead and report serialization failures without executing.
The stories wait for the 150 ms open and close transitions to finish before axe runs. Under the parallel light/dark browser matrix, the default 1 s waitFor timeout sometimes expired mid-fade (opacity 0.19), failing one run in three locally. The waits keep the same conditions with a 5 s ceiling; four consecutive full runs passed.
@woksin
woksin merged commit da6e6c3 into main Sep 27, 2026
93 of 94 checks passed
@woksin
woksin deleted the feature/release-4160 branch September 27, 2026 08:41
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment