feat(delightful-dashboards): Show results directly on dashboard#9766
Draft
tutntut wants to merge 10 commits into
Draft
feat(delightful-dashboards): Show results directly on dashboard#9766tutntut wants to merge 10 commits into
tutntut wants to merge 10 commits into
Conversation
tutntut
force-pushed
the
delightful-dashboard-part1
branch
3 times, most recently
from
July 19, 2026 14:39
422ecb2 to
8bee860
Compare
… [part 1] Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…[part 2] Streams encrypted responses and decrypts them client-side via a worker pool (reusing the shared killWorkers helper), cached by React Query. Rows are numbered by stream order. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
tutntut
force-pushed
the
delightful-dashboard-part1
branch
from
July 19, 2026 15:32
3110c34 to
b8bead0
Compare
Renders index, Response ID and timestamp columns alongside the selected field-value columns, with client-side pagination over the decrypted set. Uses a shared RESPONSE_ID_LABEL constant and i18n for the empty state. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…ner [part 4] Header with response count, submission search, date range and download; gates decryption on the date-range count and paginates over the result. Over-cap strings routed through i18n. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Render UnlockedResponsesV2 when delightful-dashboard is enabled, else the existing UnlockedResponses. Off by default; this activates the dashboard. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…esizable [part 6] Drop disableResizing on the two meta columns and relax their minWidth, and mark the fixed-width '#' column non-resizable so it has no dead handle. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Wrap cell content in a truncating Text so long values show an ellipsis on one line instead of wrapping. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
… [part 8] Grow each row to max-content (floored at 100%) so the hover/active background spans columns scrolled into view. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
For multi-respondent forms, render workflow-status, pending-response-at and reminders columns (matching the production order) before the field-value columns, from the decrypted response's mrf metadata. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Pin MRF body rows to the reminder-button height (4rem) so rows with and without a reminder line up. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
tutntut
force-pushed
the
delightful-dashboard-part1
branch
from
July 20, 2026 00:50
b8bead0 to
0c3ddc3
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Problem
Solution
Behind the
delightful-dashboardflag, the Responses tab renders a newUnlockedResponsesV2that decrypts responses client-side and surfaces their field values directly as table columns (alongside submission-meta columns), instead of only Response ID + timestamp (and workflow details). Rows stay clickable to open the full individual response. Client-side decryption is gated behind a 1,000-response cap per date range; over-cap, the container shows a "narrow the range" prompt before any decryption runs. The date range is sourced fromStorageResponsesContextso the picker, the decrypt query key, and the cap gate all agree on one range.Alternatives considered
isResponseLimitExceededprop for port-fidelity, but the over-cap state now lives in the container (before decryption, mirroring ChartsPage), so the table would never see it — dead surface that invites a divergent second over-cap UI later.useStatedate range from the hackathon, but develop already ownsdateRangeinStorageResponsesContext(shared with the download and count queries); a second source of truth would let the cap gate and the decrypt disagree.Screenshots
Storage-mode (MRF) form's Responses tab — flag off (v1) vs on (v2). V2 adds the form's field-answer columns (e.g. Name) beside the meta/workflow columns.
/admin/form/:id/results→ ResponsesBreaking Changes
No - backwards compatible; new behaviour is behind the
delightful-dashboardfeature flag (off by default).Tests
TC1: Field values render as columns
delightful-dashboardflag; open a storage-mode form's Results → Responses and enter the secret keyTC2: Click into an individual response
TC3 (MRF): workflow columns
TC4: Search by response ID