Repository navigation
fix(app-shell): relay a list view's own fieldOrder to ListView (objectui#7516) - #10622
Conversation
renderListView's relay carried the active view's hiddenFields onto the schema it hands ListView but had no rung for fieldOrder, the other per-view half of the columns x hiddenFields x fieldOrder composition, so a per-view order was accepted, served and then dropped. Add the rung beside hiddenFields with the same precedence (view over list node), pin it at the relay, and replace the census ledger's known-gap row with a named check for the rung. Claude-Session: https://claude.ai/code/session_014mXUNuFomfj24w7s1pZzhN Co-authored-by: Claude <noreply@anthropic.com>
|
changeset-claim-re-read
|
✅ 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
|
Contract reviewServed-tier: ① Derived judgmentsComposition vs spec — agree, no stop. Read side by side: objectstack The rung. Census. The Pins (3 FIX + 2 CONTROL). Against the base relay ( The plugin-view finding — true as scoped. ② Semver level
③ Boundary flags
Implemented-by: VERDICT: PASS Generated by Claude Code |
Fixes #7516
Clause-②: yes — the relay begins accepting a declared spelling it drops today (the ruling's own reading).
Executes ruling 5635656263, ratified 5809517921: add the per-view
fieldOrderrung torenderListView's relay inpackages/app-shell/src/views/ObjectView.tsx, pin it at the relay, flip the census ledger entry fromknown-gapto the rung's evidence, onepatchchangeset.What changed
fieldOrder: viewDef.fieldOrder ?? listSchema.fieldOrder, placed beside thehiddenFieldsrung and resolved by the same precedence: the active view's value wins; a view that authors none keeps the list node's own (...listSchema). The value lands in the sameschema.fieldOrderslot the list-node spelling fills, soListView'seffectiveFieldsmemo composes the two spellings identically by construction.ObjectView.fieldOrderRelay-7516.test.tsx, beside therowColor/descriptionrelay pins;ListViewstubbed, itsschemaprop captured): three FIX cases (a per-viewfieldOrderarrives verbatim; it overrides a list-nodefieldOrder; it resolves by the same precedence ashiddenFieldsin one render) and two CONTROLs (the list node's ownfieldOrderis unchanged when the view authors none; none anywhere stays absent).ObjectView.relayRungCensus-7559.test.ts): thefieldOrderknown-gaprow is removed, and the rung is recorded the way the census records its other live rungs — a named check,objectui#7516 — the per-view fieldOrder rung is present, beside thedescription(A list view'sdescriptionis served but never rendered — ObjectView's relay drops it on the way to ListView #7199) androwColor(Two more declared list-view keys never reach ListView:fieldOrderandrowColorare read by the renderer but relayed by neither host #7218) ones. The two stale header sentences ("still open", "carriesneeds-user-decision") are rewritten. The census CONTROL case that usedfieldOrderas its example of a declared absence now usesoperations(a reader-havingnode-authoredabsence), sincefieldOrderis no longer one..changeset/7516-fieldorder-relay-rung.md,'@object-ui/app-shell': patch.Premises, measured on
origin/maina7df45f before the first editfullSchemaliteral wrotehiddenFieldsfromviewDefand nothing forfieldOrder. Reproduced by the new pin on the base relay:Tests 3 failed | 2 passed (5); the per-view case readexpected undefined to deeply equal [ 'stage', 'name' ], the override cases read the list node's[ 'owner', 'stage', 'name' ]. Why the spread carries nothing on this route:plugin-view's composition fillsfieldOrderfrom a NAMED list view only (currentNamedViewConfig?.fieldOrder), and this page hands itviews, notlistViews.origin/main(objectstack a08e059)ListViewSchemadescribe text:hiddenFieldsremoves names from thecolumnsprojection "beforefieldOrderorders the remainder";fieldOrder"sorts what survivescolumnsminushiddenFieldsand never adds a field. A surviving column absent fromfieldOrdersorts LAST, after every listed one, keeping itscolumns-relative order; a name listed here that did not survive orders nothing."ListView'seffectiveFieldsmemo: starts fromschema.columns, drops FLS-denied columns (the extra step the spec's own docblock names), dropshiddenFields, then sorts by an index map built fromschema.fieldOrderwith unlisted entries atInfinity(two unlisted compare as NaN, which the sort treats as equal, so the stable sort keeps theircolumnsorder). Same three steps, same order, same unlisted-last rule. Which spelling wins when both carryfieldOrder: the view's, matching thehiddenFieldsrung.Verification — all runs on HEAD
09d496810Test Files 2 passed (2)·Tests 30 passed (30).node scripts/ablation-replace.mjs(objectstack) with anchorfieldOrder: viewDef.fieldOrder ?? listSchema.fieldOrder,→anchor x1 → x0,blob 51a823a8ab22 → d16c4a7d6716, agrep -cinside the run read0. Predicted before the run: census 2 red, pin 3 red, controls green,5 failed / 25 passed. Measured:Tests 5 failed | 25 passed (30)— censusleaves NO member both unrelayed and undeclared(received[ "fieldOrder" ]) andobjectui#7516 — the per-view fieldOrder rung is present; pin: the three FIX cases. Restore:blob after restore == blob at HEAD (51a823a8ab22),git diff HEAD empty. No build is involved: both files read./ObjectViewfrom source (the census from disk text, the pin through a relative import).turbo run build --filter='@object-ui/app-shell^...' --concurrency=2→Tasks: 28 successful, 28 total.@object-ui/app-shelltype-check (tsc --noEmit && tsc -p tsconfig.test.json):VERDICT command-exit 0;--listFileson the test project lists bothObjectView.fieldOrderRelay-7516.test.tsxandObjectView.relayRungCensus-7559.test.ts.@object-ui/app-shelltests, the whole package (799 test files), run from the repo root in chunks under the shared verify lock: every chunkcommand-exit 0, zero failures; two pre-existing environment-conditional skips (describe.runIf(DRIVEN)in the audit-history date-zone test,skipIfin the flow-node spec-reconciliation test). The chunks also covered 46 tests in other packages andapps/consolethat readapp-shellsources from disk.check-changeset-presence✅3 source file(s) of 1 released package(s) changed, and this change declares 1 changeset(s)·check:new-line-citationsVERDICT new-cross-file-line-citations: 0 new citation(s)·check:control-bytes✅ OK ·check-changeset-no-major✅ ·check-changeset-overwrite✅ ·check-changeset-fixed✅ ·check-pending-changeset-literals✅ ·check-vi-mock-specifiers/-inherit/-override-shape✅ OK ·check-test-path-roots✅ OK ·check-shell-escape-residue✅ ·check-action-ref-convention✅ ·check-type-check-coverage✅ ·check-lint-coverage✅ ·check:unreferenced-sources/handler-key-reads/metadata-write-doors/doc-example-readers/self-import/phantom-depsOK ·check:comment-mask-corpuswithin the residue objectui#7882 holds (the one disagreeing file isapps/console/src/pages/DocsIndex.tsx, untouched here) ·check-governed-queue-guard --teston the four paths:NOT GOVERNED.check-changeset-claims(report-only) names.changeset/7070-no-invented-gantt-date-fields.mdfor mentioningObjectView.tsx; that paragraph is about the gantt branch, which this change does not touch — re-read, still true.isPathIgnoredis false for all three changed.ts/.tsxfiles; (2)eslint --format jsonover them: 3 files, 0 errors (warnings:ObjectView.tsx171 on head and 171 on base; the new pin 6no-explicit-anywarnings, the same shape as itsrowColorsibling; the census 0); (3) invariance —calculateConfigForFilereports noparserOptions.project/projectService(the config extends the non-type-checkedtseslint.configs.recommended), and no custom rule undereslint-rules/reads the filesystem, so this diff cannot move a verdict on any untouched file. The repo-widepnpm lintis CI's.performance-budget(needs a full console build; the change is one object-literal property),readme-exports/spec-range-floors/published-dist(not reached: no manifest, export or docs change), E2E.Acceptance notes
known-gapnow has no entry in the ledger. Its kind and its evidence check stay in the census as the machinery for the next gap; the check iterates nothing today.plugin-view's own composition readsfieldOrderfrom the named list view only, while it readshiddenFieldsfromactiveView(theviewsentry). Not a defect this card carries: the only in-tree hosts passingrenderListVieware this page, whose rung now covers theviewsentry, and the Studio design surface, which has no saved views. Noted, not filed.Generated by Claude Code