Skip to content

feat(delightful-dashboards): Show results directly on dashboard#9766

Draft
tutntut wants to merge 10 commits into
developfrom
delightful-dashboard-part1
Draft

feat(delightful-dashboards): Show results directly on dashboard#9766
tutntut wants to merge 10 commits into
developfrom
delightful-dashboard-part1

Conversation

@tutntut

@tutntut tutntut commented Jul 19, 2026

Copy link
Copy Markdown
Contributor

Problem

  • The results page only shows Response ID + timestamp, which are not meaningful for processing. Admins — especially school admins — cannot tell who or what a submission is about without clicking into every response or exporting a CSV. This is repeatedly cited as the reason the results dashboard is not usable for day-to-day ops.
  • No quick way to search or filter for specific submissions — admins fall back to exporting CSVs multiple times and filtering in Excel/Google Sheets
  • Our usefulness score for dashboard is at 2.4/5 (below hygiene of 4.2/5)

Solution

Behind the delightful-dashboard flag, the Responses tab renders a new UnlockedResponsesV2 that 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 from StorageResponsesContext so the picker, the decrypt query key, and the cap gate all agree on one range.

Alternatives considered

  • We considered keeping the hackathon table's isResponseLimitExceeded prop 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.
  • We considered keeping V2's own local useState date range from the hackathon, but develop already owns dateRange in StorageResponsesContext (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.

Page Before (flag off) After (flag on)
/admin/form/:id/results → Responses before after

Breaking Changes

No - backwards compatible; new behaviour is behind the delightful-dashboard feature flag (off by default).

Tests

TC1: Field values render as columns

  • Enable the delightful-dashboard flag; open a storage-mode form's Results → Responses and enter the secret key
  • Field answers (incl. Checkbox/Table) render as columns alongside Response ID + timestamp

TC2: Click into an individual response

  • Click a row; it opens that submission's individual response view with all fields (no regression)

TC3 (MRF): workflow columns

  • Open an MRF form's dashboard → Workflow status, Pending response at, and Reminders columns render (before the field columns)

TC4: Search by response ID

  • Search a response ID → the table narrows to the matching row and the count shows the result count

@tutntut
tutntut force-pushed the delightful-dashboard-part1 branch 3 times, most recently from 422ecb2 to 8bee860 Compare July 19, 2026 14:39
tutntut and others added 2 commits July 19, 2026 15:26
… [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
tutntut force-pushed the delightful-dashboard-part1 branch from 3110c34 to b8bead0 Compare July 19, 2026 15:32
@tutntut tutntut added the P2 planned for next 1-2 months label Jul 20, 2026
tutntut and others added 8 commits July 20, 2026 00:48
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
tutntut force-pushed the delightful-dashboard-part1 branch from b8bead0 to 0c3ddc3 Compare July 20, 2026 00:50
@tutntut tutntut changed the title feat(delightful-dashboards): v1 Show results directly on dashboard feat(delightful-dashboards): Show results directly on dashboard Jul 20, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

P2 planned for next 1-2 months

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant