Repository navigation
fix(plugin-detail,app-shell,components): record page round 2 — related OFF draws no column or rail, one segmented panel control in the header row, three columns in a 1440 window with the sidebar - #27473
Conversation
…related OFF has no rail, one segmented panel control in the header row, 1120/760 container thresholds, relatedLists order and field-group placement, a standing restore-default-order entry Claude-Session: https://claude.ai/code/session_cdb7a717def74e719988f089fbaa18ff Co-authored-by: Claude <noreply@anthropic.com>
…placement pin Claude-Session: https://claude.ai/code/session_cdb7a717def74e719988f089fbaa18ff Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_cdb7a717def74e719988f089fbaa18ff Co-authored-by: Claude <noreply@anthropic.com>
…e trailing panel switches never overflow a narrow record page Claude-Session: https://claude.ai/code/session_cdb7a717def74e719988f089fbaa18ff Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_cdb7a717def74e719988f089fbaa18ff Co-authored-by: Claude <noreply@anthropic.com>
|
epic:#26676#1 · zhuangjianguo · session_cdb7a717def74e719988f089fbaa18ff 席位核对 · PR #27473 ← #27055 round 2 + #27241 · epic PM
|
Fixes #27055
Fixes #27241
Clause-②: no
Metadata-protocol: none
Round 2 of the record page v3 (epic #26676), on
mainafter #27310: the three rulings of #27241, the #27069 fence half of #27055, and a standing 「恢复默认顺序」 entry. Maintainer, 2026-10-28, verbatim: 「是:三栏阈值改成 1440 窗口(含侧栏)即三栏;开关改进头部动作行,关联 OFF 就没有栏」.What changes
A1 — the related switch decides whether the column exists.
recordPageArrangementForsetsrelatedRailtoswitches.related && !columns.includes('related'), andRecordPageColumnsdraws the related column only when the arrangement places it. Related OFF: no related column and no rail toggle, in both column tiers. Related ON with no room (two-column tier): the rail toggle, which opens the column. With both switches off the page is the details column alone.A2 — one segmented control at the end of the header's action row.
PanelToggles(@object-ui/components) is now one segmented control, an icon and a label per segment (Timeline with the activity glyph, Related column with the right-panel glyph). The console's record view hands it topage:headerthrough a new host slot,PageHeaderTrailingContext.PageHeaderActionsdraws it as the last segment of itsrole=toolbarrow, after⋯, behind a vertical hairline. It is drawn in both column tiers, and not in the tabbed tier or in the drawer. The toolbar gainedmax-w-full, so on a narrow header the segment wraps onto its own line, right-aligned, instead of running past the page (measured at a 1024 px window; see screenshot 08). The crumb row keeps only the ways back (origin link, 「Collapse to drawer」) and has no child without one, soempty:hiddenremoves it. Tooltip keycaps andaria-keyshortcutsare unchanged. The chord matcher acceptscodePeriod/Comma, orkey./>and,/<.A3 — thresholds. Measured on the console from this branch (HotCRM contact, sidebar expanded): the sidebar is 255 px plus its 1 px border, and
[data-record-page-root]is 1184 px in a 1440 window, 1024 px in 1280 and 768 px in 1024. The constants are1440 − 256 − 64 = 1120and1024 − 256 − 8 = 760, with the derivation in their docblock. The #26758 tier pins move to 1120 / 760, plus a pin on the three windows the thresholds serve.e2e/live/record-history-display.spec.tsopens the tab strip, so its viewport moves from 1200 to 1000, which keeps the record view under the new two-column floor.B — the #27069 fence half.
deriveRelatedListsalready orders by the object'srelatedLists(resolveRelatedListOrder, landed with feat(spec): an object declares the business order of its related lists, and 'primary' places a list #27215/feat(app-shell,i18n): Studio orders an object's related lists, and a field group can place a related table #27303), andsynthPartskeeps that order. Only the fence comment said otherwise. The comment is replaced, and a mounted pin (RecordDetailView.relatedListsOrder-27241) holds the card order with and withoutrelatedLists.bodyTablePlacementreads the field groups. A body table whose relationship a group'srelatedListnames (child object name, orobject.field) is drawn at that group's position amongfieldGroups. Other body tables keep the "after the first section" rule. The one reading of an entry,relatedListEntryNames, moved from app-shell into@object-ui/plugin-detail(app-shell re-exports it), so the order and the placement cannot read an entry two ways.C — standing 「恢复默认顺序」.
resolveRelatedArrangementnow reportsrearranged: the shown order differs from the default, or a card is hidden. The column foot, which is the same line as 「已隐藏 N 张 · 显示」 and appears in both the related column and the tabbed tier's Related tab, then offers 「Restore default order」 (new keydetail.relatedRestoreDefaultOrder, ten packs). It writes the new editrestore-default-arrangement:order: [],hidden: [],basedOnset to the current default's hash,seen: {}. Collapsed state is kept. The stored shape{v,order,collapsed,hidden,basedOn,seen}is unchanged.RelatedDefaultChangedHintis unchanged.Not touched:
packages/spec/**,navigation-overlay.tsx,recordDrawerStack.tsx.Screenshots
HotCRM contact record page. The console runs on vite from this branch; the backend is
objectstack dev --fresh --seed-adminfrom hotcrm 1f3f8880; headless Chromium. The images are on the never-merged branchclaude/issue-27055-evidence-20261029.{"order":[],"collapsed":[],"hidden":[],"basedOn":"e40133ac","v":1}.Tests
Head `9c82d929a8`. The build and type-check closure was rebuilt first (`pnpm --workspace-concurrency=2 --filter '@object-ui/console^...' build`, VERDICT command-exit 0, 72 of 127 projects, then `@object-ui/i18n`, `components` and `plugin-detail` again after the edits). Every run went through `scripts/pm/os-verify-lock.sh`, UNLOCKED (declared below).
Reverse verification
Each new pin was run against its mutation through `node scripts/ablation-replace.mjs`. The tool's own verdict was `ok mutation landed` (anchor 1 → 0, blob moved), and it restored with `git diff HEAD empty` and the HEAD blob matching. All runs were vitest on the aliased `src`, so no dist step applies.
`git diff HEAD` was empty after the ten runs.
Gates
Derived with `node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack` at `9c82d929a8`. The change set is 38 paths against merge base `3bfb357aa3`, which derives 34 commands. Each command's exit code was written before any pipe. `--ran` reports `Run reconciliation — 34 derived, 34 run, 0 NOT-MEASURED, 0 UNRUN`.
33 commands exited 0. `pnpm --dir ui exec vitest run scripts/` exited 1, with `Test Files 2 failed | 167 passed | 2 skipped (171)` and `Tests 3 failed | 4898 passed`. All three failures are known host gaps on this macOS box, the same three as in rounds 0 and 1 of #27310. Two are the bash 3.2 `mapfile: command not found` in `select-affected-tests-wiring.test.ts`. The third is the `check-i18n-dead-keys` 「on the real tree」 case, which times out. These three are NOT MEASURED locally, and CI reads them.
Declared narrowing — verification ran UNLOCKED.
scripts/pm/os-verify-lock.shcould not take the shared verify lock on this host: no usable
flock. The sharedverify lock is declared Linux-only (
flockis util-linux, and a stock macOS doesnot ship it), so every build and test command in this PR was run directly, without the lock —
a declared narrowing, not a silent one. No serialization guarantee held for these
runs, nor for any sibling agent in this container while they ran.
Acceptance notes
text-accentvstext-accent-foreground. The ruling namesbg-accent+text-accentand describes the result as 「accent 浅底深字」. In both console themes,text-accentis the same pale HSL asbg-accent(light:--accent240 18% 94%, measured on the page). The literal pair would draw invisible text. The on segment is thereforebg-accent+text-accent-foreground, which is the light-tint, dark-text pair the ruling describes. An off segment istext-muted-foreground. This is flagged for the seat in the report.max-w-full), and the segment ends its own line. Before this, the toolbar overflowed and a click scrolled the page sideways.e2e/record-header-title-width.spec.tsran locally: 14 passed.bodyTablePlacementplaces body tables only. A field group whoserelatedListnames a relationship that is not a body table (not'primary', not an inline-editedmaster_detail) places nothing, and the card stays in the related column. Before this, such a group drew nothing either.maingained 7 commits since the base3bfb357aa3, none touching a changed path. GitHub reports no conflict, and no merge was made.Generated by Claude Code