Uh oh!
There was an error while loading. Please reload this page.
feat(report): true matrix cross-tab + dataset drill-down (ADR-0021 D2) - #1649
Merged
Conversation
DatasetReportRenderer pivots matrix reports into a real rows × columns
cross-tab: one dataset query over [rows..., columns...], pivoted client-
side; empty intersections render '—'. No totals row/column by design —
re-aggregating bucketed avg-style measures client-side would drift from
the semantic layer. A matrix without `columns` (pre-9.1 stored JSON)
degrades to the flat grouped table; joined blocks pivot the same way.
Drill-down comes back on the dataset path: rows/cells are clickable when
the host supplies onDrill (gated on the report's `drilldown` flag,
default on) and emit {dataset, groupKey, runtimeFilter}. ReportView
resolves the dataset's object + dimension→field mapping and opens the
object list scoped by ?filter[field]=value — reverse-mapping select
option LABELS back to stored values first, because the analytics service
resolves dimension buckets to display labels in place (caught live: a
filter[status]="In Progress" matched nothing; the stored value is
`in_progress`). Lookup and date-granularity dims are skipped (superset)
rather than filtered wrongly.
Studio: the report inspector gains a Columns (across) list for matrix
reports; ReportPreview now renders through the SAME DatasetReportRenderer
as the runtime, deleting the parallel lightweight table and making the
matrix preview WYSIWYG.
Browser-verified against app-showcase: status × priority cross-tab
renders; clicking the In Progress × High cell (40h) lands on the task
list filtered to exactly the one underlying record.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>The latest updates on your projects. Learn more about Vercel for GitHub. |
Contributor
✅ Console Performance Budget
📦 Bundle Size Report
Size Limits
|
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 freeto 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.
Summary
Closes the two capability gaps left by the legacy-report-surface retirement (#1645), implementing the ADR-0021 D2 pivot grammar on the dataset path. Upstream prerequisite already merged + on framework main: framework#1732 (spec
Report.columnsacross-dims +drilldownflag).True matrix cross-tab
DatasetReportRendererpivotstype: 'matrix'into a real rows × columns cross-tab — one dataset query over all dimensions, pivoted client-side; empty intersections render—; multi-measure rendersbucket · measurecolumns. Joined blocks pivot the same way.avg-style measures client-side would drift from the semantic layer (the ADR-0021 governance red line).columns(pre-9.1 stored JSON) degrades to the flat grouped table.Dataset-path drill-down
onDrill(gated on the report'sdrilldownflag, default on) → emits{dataset, groupKey, runtimeFilter}; the renderer stays navigation-agnostic.ReportViewresolves dataset →object+ dimension→field and opens/apps/:app/:object?filter[field]=value(the related-list View All contract).filter[status]="In Progress"matched nothing — the stored value isin_progress. Select dims reverse-map via the object's field options; lookup + date-granularity dims are skipped (drill lands on a superset) rather than filtered wrongly.Studio
ReportPreviewnow renders through the SAMEDatasetReportRendereras the runtime — parallel lightweight table deleted, matrix preview is WYSIWYG.Browser verification (app-showcase, live backend)
showcase_status_priority_matrixrenders status × Low/Medium/High/Urgent cross-tab in runtime and studio previewshowcase_task?filter[status]=in_progress&filter[priority]=high→ exactly the 1 underlying record ("Build homepage")Test plan
pnpm vitest run— 3556 passed (new: 5 matrix/drill renderer cases, 2 inspector cases, 1 preview matrix case)pnpm --filter @object-ui/app-shell type-check— clean; touched files lint 0 errorspnpm --filter @object-ui/console exec vite build🤖 Generated with Claude Code