feat(report): drill a date-bucket cell into its time range, not a superset (#1752)#2672
Merged
Merged
Conversation
…erset (#1752) Clicking a report/dashboard cell grouped by a `dateGranularity` date dimension ("2026-Q2") used to drill into a superset (the date dim was skipped, so the record list spanned every time bucket). It now scopes to the clicked bucket's half-open range via the framework's new `drillRanges` sidecar. - core: `buildDatasetDrillFilter` merges a per-row range as an ObjectQL operator object `{ [field]: { $gte, $lt } }` alongside equality dims. - plugin-report / plugin-dashboard: forward `drillRanges`; a date-ONLY report (no equality drill dim) is now drillable via the range alone. - app-shell: the "Open in list" escape hatch (`useOpenRecordList`) targets the ADR-0055 bare data surface (`/:object/data`) and serializes a range to `filter[field][gte|lt]`; `ObjectDataPage` parses those operators, renders a range as one chip, and removes both bounds together. New `drillUrlFilters` module owns write+read serialization (round-trip tested) so they can't drift. Companion to framework#3256. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RCXBnmMQTwjmFkjtpEe11f
|
The latest updates on your projects. Learn more about Vercel for GitHub. |
Contributor
✅ Console Performance Budget
📦 Bundle Size Report
Size Limits
|
os-zhuang
marked this pull request as ready for review
July 19, 2026 07:21
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.
Why
objectui half of framework#1752 (companion: objectstack-ai/framework#3256). Clicking a report/dashboard cell grouped by a
dateGranularitydate dimension ("2026-Q2") drilled into a superset — the date dimension was skipped, so the record list spanned every time bucket. It now scopes to the clicked bucket's half-open range.What
@object-ui/core—buildDatasetDrillFiltertakes the server's per-rowdrillRangessidecar and emits an ObjectQL range operator object ({ [field]: { $gte, $lt } }) alongside the equality dims. New exportedDatasetDrillRangetype.@object-ui/plugin-report/@object-ui/plugin-dashboard— the report renderer (table + matrix) and dashboard widget forwarddrillRanges; the drill fast-path now fires on a range too, so a date-only report (no equality drill dim) is drillable via the range alone.@object-ui/app-shelluseOpenRecordList("Open in list →") now targets the ADR-0055 bare data surface (/:object/data) instead of the object route. The bare surface bakes in no saved-view filter — "the URL is the view" — so the drill scope is exactly the drilled conditions; the object route stacks URL filters on top of the default view and can silently over-narrow a drill.filter[field][gte|lt]operator contract (ADR-0055's rich-operator follow-up) instead of stringifying{ $gte, $lt }to"[object Object]".ObjectDataPageparses those operators (equalityfilter[field]unchanged), FLS-trims both bounds together (they share the field), renders a range as a single chip, and removes both bounds together.drillUrlFiltersmodule owns the write (serializeDrillFilterParams) and read (parseUrlFilterTriples) sides so the URL contract can't drift between them.Design notes
Testing
drillUrlFiltersround-trip:serialize → parseyields the exact triples (write & read sides agree); operator parse, unknown-op ignore, paired FLS removal, single range chip.buildDrillFilterrange + equality + runtime-filter merge; date-ONLY widget drillable via range.DatasetReportRenderer: a date-bucketed row emits a{ $gte, $lt }objectFilter.type-checkclean for core / app-shell / plugin-report / plugin-dashboard.Note
pnpm lintsurfaces one pre-existing error inDatasetReportRenderer(ChartComponentat the chart block — untouched by this diff) and pre-existingno-explicit-anywarnings; the Lint workflow isworkflow_dispatch-only, and this diff introduces no new lint problems.🤖 Generated with Claude Code
https://claude.ai/code/session_01RCXBnmMQTwjmFkjtpEe11f
Generated by Claude Code