Repository navigation
fix(plugin-tree): honour filter and the row ceiling on inline value data - #10357
Conversation
… data The record effect's `provider: 'value'` branch set the authored rows and returned without reaching the `find` in the `object` arm, which is the one site in the file that lowers `schema.filter` onto `$filter` and the objectui#7210 ceiling onto `$top`. An inline tree that declared a `filter` therefore drew every authored row: the fail-open direction, because the key that was dropped is the key that narrows. Ported in ObjectCalendar's shape (objectui#9061), not ObjectGantt's: the `find` sits inside the `dataProvider === 'object' && dataSource` arm, so the inline provider resolves its own `ValueDataSource` and lowers the same keys onto the same query shape, then goes through the same `applyNonGridRowCeiling`. Two keys, not three: the tree reads `schema.sort` on no provider. No dependency array moves. The adapter's constructor clone is `structuredClone` since objectui#9175, so a back-referencing inline record graph still renders; pinned. Refs: objectui#9136 Claude-Session: https://claude.ai/code/session_01BA3nKVUwKQJf8DBxrSVtNC
States the behaviour change plainly: an inline tree now honours an authored `filter` and the platform row ceiling, rows reach the view as the adapter's structuredClone copy, and the host `data` passthrough is unchanged. Claude-Session: https://claude.ai/code/session_01BA3nKVUwKQJf8DBxrSVtNC
|
changeset-claim-re-read
|
…ssue-9136-object-tree-inline-query
… minor Same behaviour-change class as the calendar and map port, which declared minor: an authored filter now narrows inline rows, the platform row ceiling now applies to them, rows arrive as the adapter's copy, and a function-valued key now fails loudly. The body now names the precedent. Claude-Session: https://claude.ai/code/session_01BA3nKVUwKQJf8DBxrSVtNC
✅ Console Performance Budget
The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it. 📦 Bundle Size Report
Size Limits
|
✅ Console Performance Budget
The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it. 📦 Bundle Size Report
Size Limits
|
Fixes #9136
Clause-②: no
What was wrong
ObjectTree's record effect had adataProvider === 'value'branch that set the authored rows, reportedtruncated: falseand returned. It never reached thedataSource.find(...)inside thedataProvider === 'object' && dataSourcearm, and thatfindis the one site in the file that lowersschema.filteronto$filterand the objectui#7210 ceiling onto$top(it is also the only caller ofapplyNonGridRowCeilingin the file). So an inline tree with an authoredfilterdrew every row, and an inline tree pastNON_GRID_ROW_CEILINGdrew every row with no footnote. This is the fail-open direction: the dropped key is the one that narrows. It is not a data-exposure boundary, because the rows are already in the authored schema.What changed
Ported in
ObjectCalendar's shape (objectui#9061), notObjectGantt's, per the triage unlock on this card. The inline branch now builds aValueDataSourceover its own rows, callsfind('', { $filter: schema.filter, $top: NON_GRID_ROW_CEILING_TOP })and passes the result throughapplyNonGridRowCeiling. These are the same adapter, the same keys, the same ceiling call and the samesetRowCeiling({ truncated, total })that the object arm uses. No variant helper was written.ObjectTreereadsschema.sorton no provider, so no$orderbywas added.schema.filteranddataItemswere already listed).api/null exits, and the host-data passthrough above the inline branch ((rest as any).data ?? schema.data).structuredClonesince objectui#9175 (ruling A on objectui#9061), so a back-referencing record graph still renders. Pinned.Files:
packages/plugin-tree/src/ObjectTree.tsx, a newpackages/plugin-tree/src/ObjectTree.inlineQueryKeys-9136.test.tsx, and.changeset/9136-tree-inline-query-keys.md(aminoron@object-ui/plugin-tree, as objectui#9061 declared the same change on the calendar and map; corrected frompatchin round 2,72461542).Behaviour change, stated plainly
Inline trees (
data: { provider: 'value', items }andstaticData) now honour an authoredfilterand the platform row ceiling:NON_GRID_ROW_CEILINGrows and shows the footnote naming both numbers.onRowClickis not===the authored object.structuredClonerefuses functions, and ruling A deliberately keeps that refusal loud.The host
dataprop, and a bare array underschema.data, are unchanged.Tests
All runs are from the repo root, through the shared verify lock.
3f882bbf(tree clean):pnpm exec vitest run --maxWorkers=2 packages/plugin-tree/gaveTest Files 18 passed (18),Tests 105 passed (105).3f882bbf:pnpm --filter @object-ui/plugin-tree type-check(tsc --noEmit && tsc -p tsconfig.test.json) exited 0.tsc -p tsconfig.test.json --listFileslists the new test file, one of 18 test files in that program. The dependency closure was built first (pnpm --filter '@object-ui/plugin-tree^...' build, exit 0).1f8ef0a8:Tests 3 failed | 3 passed (6).twoSidedFilter: expected 5 to be 3.ceilingCap: expected 2501 to be 2000.ceilingOrder: expected 2400 to be 800.control,backReferenceGraphandproviderBackedControlwere green.ablation-replace.mjsin WRAP mode, on commit58909922. That commit'sObjectTree.tsxblob26e42a61is identical at HEAD.26e42a61to879d498b.Tests 3 failed | 3 passed (6), the same three red with the same readings.control,backReferenceGraphandproviderBackedControlstayed green, as predicted.26e42a61,git diff HEADis empty, and the marker count on disk is 0.backReferenceGraphwent red, and the DOM showedFailed to load tree: Converting circular structure to JSON. The other 5 stayed green. The restore was proven the same way.main: onmainthe inline branch never clones, so the pin is green there by construction. Leg 2 shows that the pin fails for the reason it guards.staticDatawith afilterdraws the 2 matching rows, and a function-valued key shows the error panel. These back two sentences of the changeset.Gates
Each gate below exited 0; the gate's own verdict line is quoted where it has one.
pnpm check:control-bytes: OK.pnpm check:new-line-citations:0 new citation(s).node scripts/check-changeset-presence.mjs: 1 changeset declared for 1 released package.pnpm check:changeset-claims: report-only. It points at.changeset/8253-export-tree-view-config.md, which namesObjectTree.tsx. I read that paragraph. It describes the retired module-localTreeConfiginterface in the past tense, and this diff does not make it false.check-changeset-no-major,check-changeset-fixedandcheck-changeset-overwrite.check:pending-changeset-literals.check:vi-mock-specifiers,check:vi-mock-inheritandcheck:vi-mock-override-shape.check:phantom-deps,check:test-path-rootsandcheck:unreferenced-sources.check-governed-queue-guard --teston the three paths: NOT GOVERNED.Lint was narrowed to the package, and here is why that narrowing excludes nothing:
pnpm --filter @object-ui/plugin-tree lint(eslint .) exited 0.--format jsoncounted 21 files, 0 errors.eslint.config.js(**/*.{ts,tsx}).parserOptions.projectorprojectServiceineslint.config.js, and nothing undereslint-rules/reads the filesystem. So this diff cannot move the verdict on any untouched file.pnpm lintis left to CI.NOT MEASURED locally, and left to CI: the sharded root
pnpm test, Build & E2E, and the repo-wide lint. Onlypackages/plugin-treechanged, and its public surface bytes did not change. A grep for tests that renderobject-tree/treewith inlinevaluedata outside this package found none.Acceptance notes
packages/plugin-tree/README.mddoes not document inline data,filteror the ceiling.content/docs/guide/data-source.mdalready saysobject-treedraws at most the ceiling, with a footnote, and does not exempt inline rows. So no published sentence became false. Docs were outside the claim's declared file surface, so none were added.Refs:line naming this card, which the dispatch contract forbids. It is not in the trailer block and is not rewritten, because force-push is banned here. The squash message can drop it.ObjectTreereadssorton no provider, which is a question about the object path. This card leaves it untouched, as the triage ruled.Seat session:
https://claude.ai/code/session_01BA3nKVUwKQJf8DBxrSVtNCGenerated by Claude Code