Repository navigation
feat(app-shell): Studio opens an off-nav list view on its object's page, lists only views no dropdown reaches, and reads form views as forms - #30401
Conversation
…s object's page; the group lists what the dropdown does not reach; a form view reads a real type WIP: the three remaining scopes of the Interfaces view dropdown card, with their tests; not yet run. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Utp6CXDf4Yt5PtKZFbtLVD
…rlaid read Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Utp6CXDf4Yt5PtKZFbtLVD
…e opened from 不在导航中; controls stay controls Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Utp6CXDf4Yt5PtKZFbtLVD
… first; changeset Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Utp6CXDf4Yt5PtKZFbtLVD
…-5r0o5c Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Utp6CXDf4Yt5PtKZFbtLVD
|
domain:ui#2 · os-bill · session_01Utp6Cb5R6JDdfyvtj3dPR2 Contract reviewServed-tier: Reviewed 2026-11-05T09:45Z. Face: ① Derived judgments
② Semver levelThe changeset sets ③ Boundary flags
Implemented-by: VERDICT: PASS |
|
domain:ui#2 · os-bill · session_01Utp6Cb5R6JDdfyvtj3dPR2 维护者速读
席位核对 — ACCEPT · domain:ui#2 · head
|
…-5r0o5c ViewVariantInspector.tsx: main moved the list-view type labels to viewTypeLabels.ts (imported as typeLabel); this branch's form-layout labels (FORM_TYPE_LABELS, formTypeLabel) are kept beside that import. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Utp6CXDf4Yt5PtKZFbtLVD
Requested by Bill · project thread
domain:ui#2 · os-bill · session_01Utp6Cb5R6JDdfyvtj3dPR2
维护者速读
crm_lead.form这类内部名。StudioDesignSurface.tsx的pickOffNav/listViewDoorOf与离线分组过滤,ListViewMoreSection.tsx(新),ViewVariantInspector.tsx的useTypeOptions。?surface=view:crm_lead.pipeline落到「线索 / 线索看板」。Fixes #30046
Clause-②: yes (widening) — three new published
@object-ui/i18nStudio keys:engine.studio.if.offNav.viewForms,engine.studio.if.offNav.viewMixed,engine.studio.if.offNav.formName(en + zh). No accept set narrowed.Metadata-protocol: none — Studio UI only: no metadata key, spec schema, server route or stored shape is added or read differently; the view items are read through the existing
/meta/viewlist (drafts overlaid) and written through the existing list-view draft path.What changes
Scope 6–8 of #30046, ruled as option A (6651738887). Scope 1–5 landed in #30175 and are untouched.
?surface=view:OBJECT.KEY), now lands on the object page with its header dropdown (object / view ▾) on that view: the object's nav entry when it has one, else the object itself with no entry (?surface=object:OBJECT&view=…, which a reload or a shared link opens again). The panel there gainsListViewMoreSection(new): the view's 条件格式化 (ConditionalFormattingEditor, whose CEL verdicts now hold the list-view autosave the way they held the view page's Save) and the spec authoring form's sections for a view, pruned of every key the panel already edits, so no setting has two controls. A form view, and a view a read-only base's pair adds (addedIn), still open as themselves. Studio on zh-CN still mixes languages and terms: view properties panel, flow nodes, publish sheet labels, and 仪表板 beside 仪表盘 #30039 owns translating those sections.withDraftViewBindingsreads the drafted rows'object/viewKindfrom the draft-overlaid list, fail-soft). The list views of an object with no entry stay listed. The only-customized filter is unchanged.· keyfor a non-default form); the group's heading says what it holds (表单视图, 视图, or 表单视图与列表视图). InViewVariantInspector, a form view's 视图类型 reads the form-variant schema'stypeenum (simple / tabbed / wizard, labelled with the existingengine.inspector.pageBlock.option.formType.*keys) and defaults tosimple; a list view's picker is byte-for-byte the same roster as before.ObjectListViewInspector.tsx: the hook gainsopenView(surface, viewId); the panel appendsListViewMoreSectionas an independent block after the sort block, with no existing section reordered (seat 4's [Decision] Selection-bar actions cannot be configured in Studio: should the view panel offer them? #30089 adds a section in the same render region). fix(app-shell): a draft-only object's nav entry opens its drafted default list view in Studio Interfaces #30315'slistViewTargetOfhunks are not touched.StudioDesignSurface.tsx'srestoreOriginal/publishNonceregion (Studio: after 恢复原版 the rail keeps the customized mark and 仅看定制 (1) until a reload #30238) is not touched.Tests
InterfacesPillar.offNavListViews-30046.test.tsx(13 cases): Scope 7 filtering with controls (an object with no entry stays listed, a drafted view included), Scope 8 names and the three headings, Scope 6 object page landing, the panel's 条件格式化 and spec sections, a second pick on the same page,?surface=object:…&view=and?surface=view:…links with and without an entry, CONTROL that a form view still opens as itself, and the CEL hold (autosave blocked on a bad rule, saved once fixed).ViewVariantInspector.formViewType-30046.test.tsx(8 cases, en + zh): a form view reads its layout and offers only the form roster; a form view with no type reads Simple; CONTROL a list view still offers the list types; CONTROL an off-enum list type is still flagged.packageSurfaces.test.ts: 3 cases forviewBindingOf/withDraftViewBindings.InterfacesPillar.offNavItems-26889.test.tsxandInterfacesPillar.offNavDeepLink-28561.test.tsx: their off-nav view fixture is now a form view (web_form), since a list view of an object with an entry is no longer listed there; what they assert is unchanged.origin/main's five source files checked out, 17 of the new/changed cases fail (5 files); all pass on this branch.scripts/ablation-replace.mjs, each restored with blob == HEAD and an emptygit diff HEAD): Scope 7 filter → 3 red; the list-view door → 5 red; the form-type roster pick → 2 red (both locales); the CEL hold term → 1 red.Acceptance notes
ui-seat2/card-30046/screenshots/:examples/app-crm): 不在导航中 lists only 表单视图 (4): 活动表单, 线索表单 · web_to_lead, 线索表单, 商机表单; the default landing panel carries 条件格式化 and 基础信息 below the sort block;?surface=view:crm_lead.pipelinelands on 线索 / 线索看板 atsurface=object:crm_lead&nav=nav_leads&view=crm_lead.pipeline; 线索表单 opens as a form view whose 视图类型 reads 简单.surface=object:ws_case&view=ws_case.open, survives a reload, and its panel shows the view's CEL rule (CEL 有效).crm_lead.form), and its spec sections (Layout, Columns, Title) are English in zh, which is Studio on zh-CN still mixes languages and terms: view properties panel, flow nodes, publish sheet labels, and 仪表板 beside 仪表盘 #30039's.Verification
On the final tree (head
9eff7192,origin/main870ebce3merged in), every exit code recorded to a file before any pipe:node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack <14 changed paths>: 35 commands, all exit 0 (pnpm --dir ui exec vitest run scripts/: Test Files 170 passed | 2 skipped, Tests 4985 passed | 2 skipped).--ranreconciliation: 35 derived, 35 run, 0 NOT-MEASURED, 0 UNRUN.node scripts/check-sdui-manifest.mjs: exit 0 (and--self-testexit 0).pnpm --filter @object-ui/app-shell --filter @object-ui/i18n lint: exit 0, 0 errors (warnings only, existing patterns).pnpm --dir ui run check:new-line-citations: exit 0.pnpm check:nul-bytes: exit 0.pnpm exec turbo run type-check --filter=@object-ui/app-shell --filter=@object-ui/i18n --concurrency=2(underos-verify-lock): 69/69 tasks, exit 0.InterfacesPillar.*andStudioDesignSurface.*test (167 files): 1220/1221, the one red being the zh lazy-catalogue race in the new inspector test, since fixed (top-levelawait loadStudioCatalogue('zh')) and green three runs in a row.Generated by Claude Code