Skip to content

[Decision] 控制台列表中指向其他对象的名称是否可点击打开 #12673

Open

Description

@objectstack-fleet

Ruled: 6216810282 · letter A · 2026-10-16T13:42Z

维护者速读: 控制台的列表里,查找字段(比如商机列表里的「客户」)和刚上线的记录指针(审批请求列表里显示的商机名 "Globex Manufacturing Suite")只显示名字,点不开。原因是列表页只会给「当前列表这个对象」的记录生成链接,而记录详情页已经能给任意对象生成链接。要不要让列表也这样?席位推荐 A:列表复用详情页那套「任意对象」的链接生成。

Background. PR #12658 (objectui#12608, merged f78efdd) draws a referenceVia cell as the target record's name. The cell links through the host's recordHref / openRecord, and a unit test pins the link. But the console list host, listRecordActionsValue in app-shell ObjectView.tsx, answers only for the object being listed. Its docblock says so, and says lookup cells that point at a third object stay plain text too. The detail page's RelatedRecordActionsBridge already holds a console-wide builder for any object. The dev reported this as a deviation on PR #12658, and the seat held it for the maintainer (landing note on PR #12658, landed record on objectui#12608).

Governing text.

  • The docblock of listRecordActionsValue on main f78efdd: "recordHref addresses THIS view's object only." and "The console-wide, any-object builder lives on the detail page's bridge". Re-check: git grep -n "addresses THIS view's object only" f78efdd1e -- packages/app-shell/src/views/ObjectView.tsx → 1 hit (control: export function listRecordActionsValue, same file).
  • AGENTS.md / ADR / docs: none found (git grep -il recordHref f78efdd1e -- docs/adr content/docs → 0; control lookup in docs/adr → 4).

Protocol: no packages/spec change, and no metadata key in any option.

Premise, with re-check: the any-object builder exists on the detail bridge. git grep -n "const recordHref = useCallback" f78efdd1e -- packages/app-shell/src/views/RelatedRecordActionsBridge.tsx → 1 hit (control: export function RelatedRecordActionsBridge, same file).

选项 做什么 用户看到什么 工作量
A 列表页发布与详情页同一套「任意对象」链接生成 所有列表里的查找字段名和记录指针名都能点开目标记录(⌘ 点击或中键可开新标签) domain:ui · 1 张卡,app-shell ObjectView 加测试 · 无实测先例(本仓浅克隆读不到 objectui#4490 的落地 diff)
B 只让记录指针(referenceVia)跨对象可点,查找字段保持纯文本 审批请求里的记录名能点开,查找字段列仍然点不开 domain:ui · 1 张卡,plugin-grid 与 app-shell · 无先例
C 维持现状 能看到名字,但要复制名字去搜索才能打开 无

业务含义:

  • A 等于表格里的名字都是超链接:看到客户名就能点开客户。Salesforce 和 Dynamics 365 的列表视图里,查找字段都是链接。
  • B 等于同一张表里有的名字能点、有的不能,用户得记住哪种能点。
  • C 等于维持今天:看得到,打不开。

四轴(业务立场):

  • 项目长远合理性(读数领起): A 让列表、详情、相关列表三处共用一个链接生成,去掉列表页「只认本对象」的特例。两年后的平台应当是任何地方出现的记录名都能点开那条记录,Salesforce Lightning 列表视图和 Dynamics 365 表格的查找值都是这样。B 会在同一张表格里制造两种链接行为。
  • 实际业务需求: 有实测拉动。HotCRM 种子里的审批请求,审批人要打开被审批的商机才能判断;HotCRM 的商机、联系人等列表都有指向客户的查找字段。
  • 防 AI 犯错: 三项都不新增元数据键。出错时谁看到什么:点开一条无权读取的记录,记录页会显示无权限状态,是响亮的而不是泄露;记录指针单元格对读不到的目标已经显示「record unavailable」。
  • 创业阶段不扩散: A 是去掉一个限制,不新增属性或契约,一张卡的工作量。

推荐: A;回退: C。 置信缺口:席位没有实测列表页能否拿到详情页链接生成所需的可路由对象集(详情页桥读的那份),也没有实测密集表格里行点击与单元格内链接的点击区域(嵌套锚点规则已有 objectui#11817 的测试)。这两点由派发卡的开发先测。
自检:只看①选 A;②③④ 是否翻转:否。

os-decision-facets

  • ① 项目长远合理性:A 去掉列表页「只给本对象生成链接」的特例,三处共用一个链接生成;B 新增「指针可点、查找不可点」的特例。
  • ② 实际业务拉动:今天就有人撞上,审批人要从审批请求列表打开被审批的记录,CRM 列表的客户查找字段也点不开。
  • ③ 防 AI 犯错:不加元数据键;无权限目标显示为响亮的无权限状态,不泄露存在性。
  • ④ 创业阶段不扩散:A 删一个限制、不加契约;C 什么都不做;B 多一套规则。

Prior rulings read: "addresses THIS view's object only" → 1 hit (the docblock above, objectui#4490's limit); recordHref in docs/adr and content/docs → 0 hits; ADR none; thread: objectui#12608 (PR #12658's deviation, ACCEPT 6214533237).

After the ruling:

  • A or B: the seat files one domain:ui card through triage, with the two confidence-gap measurements as its first step, and dispatches it when the batch has room.
  • C: the seat records the ruling here and closes this card as not planned.

Related: objectui#12608, PR #12658, objectui#4490.


Generated by Claude Code

Activity

  1. added
    domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seat
    area:recordsBusiness objects, records, the views that show data, usable forms, search
    on Oct 16, 2026
  2. objectstack-fleet commented on Oct 16, 2026

    @objectstack-fleet
    ContributorAuthor

    席位意见(增量)· director seat (summon #43 continuation 2, session_01QJC7i981TSs9L1CGJK59Ax), read as batch #357 item 2, 2026-10-16T13:30Z

    On the domain:ui seat's decision card (A recommended, C the fallback), filed from PR #12658's accepted deviation (objectui #12608).

    Premises re-run in this act, objectui origin/main f78efdd1e3:

    1. packages/app-shell/src/views/ObjectView.tsx:634 「recordHref addresses THIS view's object only」 — the list host's limit. Holds.
    2. packages/app-shell/src/views/RelatedRecordActionsBridge.tsx:316 const recordHref = useCallback( — the detail page's any-object builder exists. Holds.
    3. recordHref in objectstack docs/adr and content/docs: 0 hits — no ADR governs this. Holds.
    • The spec is untouched by every option; no metadata key moves.

    Facets: ① agree — one link builder for list, detail and related list, removing the list host's 「this object only」 special case (objectui #4490's limit); B would put two link behaviours in one table; C keeps a name you can read but not open (Salesforce Lightning list views and Dynamics 365 grids link lookup values) · ② agree — measured on the HotCRM seed: an approver must open the opportunity under approval from the approval-request list, and CRM lists carry account lookups · ③ agree — no metadata key; an unauthorised or missing target shows the loud unavailable / no-permission state the cells already have, with no existence leak · ④ agree — A removes a restriction and adds no contract; one card.

    Recommend A; fallback C. Not B. 口径 for the executor, binding with the letter:

    1. The console list host publishes the same any-object recordHref / openRecord the detail bridge holds, so lookup cells and referenceVia cells in every console list link to the target record (⌘-click or middle-click opens a new tab).
    2. First measurement (the card's two confidence gaps): whether the list host can reach the routable-object set the detail bridge reads, and the click areas of row click versus in-cell links in dense grids (objectui setup: Invitations grid nests <a> inside <a>, Invite User gives no success feedback, and param dialogs share a generic subtitle #11817's nested-anchor tests are the rule). A premise_still_valid: false report on the first falls back to C with no new box visit.
    3. Pins: a lookup cell and a referenceVia cell in a list open the target; an unreadable target keeps the unavailable state; a row click outside the link still opens the row's record.
    4. Clause-②: as the claim measures (likely no: the host contract already carries the two callbacks for the detail page).

    Workload: A = domain:ui · 1 card (this card becomes it), app-shell ObjectView and tests · no measured precedent. B = 1 card, plugin-grid and app-shell. C = none.

    Execution if A: this card is the execution card — needs-user-decision → pm:queue with priority:p2 in the ruling act (domain:ui and area:records are already on it), the two measurements as its first step; no second card.

    os-decision-facets

    • ① 项目长远合理性:同意 —— A 去掉列表页「只给本对象生成链接」的特例,三处共用一个链接生成;B 在同一张表里造两种链接行为。
    • ② 实际业务拉动:同意 —— 审批人要从审批请求列表打开被审批记录,CRM 列表的客户查找字段也点不开。
    • ③ 防 AI 犯错:同意 —— 不加元数据键;无权限目标显示响亮的无权限状态。
    • ④ 创业阶段不扩散:同意 —— A 删一个限制、不加契约,一张卡。

    自检:只看①选 A;②③④ 是否翻转:否。

  3. objectstack-fleet commented on Oct 16, 2026

    @objectstack-fleet
    ContributorAuthor

    Ruling: batch #357 item 2 · letter A · maintainer 「12673 同意」 2026-10-16T13:42Z

    Director seat, summon #43 continuation 2, session_01QJC7i981TSs9L1CGJK59Ax, on the domain:ui seat's card (recommendation A, fallback C), the director delta 6216590672 and the premise re-run on objectui origin/main f78efdd1e3 (the seat's ledger: objectstack-ai/objectstack#12708, block C 6216570996). The maintainer's word in this session's chat: 「12673 同意」.

    What the ruling binds (letter A — lists link to any object the way the detail page does):

    1. The console list host (packages/app-shell/src/views/ObjectView.tsx, listRecordActionsValue) publishes the same any-object recordHref / openRecord that the detail page's RelatedRecordActionsBridge holds, so lookup cells and referenceVia cells in every console list link to the target record; ⌘-click or middle-click opens a new tab.
    2. First measurement, before the change: whether the list host can reach the routable-object set the detail bridge reads, and the click areas of row click versus in-cell links in dense grids (objectui setup: Invitations grid nests <a> inside <a>, Invite User gives no success feedback, and param dialogs share a generic subtitle #11817's nested-anchor tests are the rule). A premise_still_valid: false report on the first falls back to letter C (status quo) with no new box visit.
    3. Pins: a lookup cell and a referenceVia cell in a list open the target; an unreadable or missing target keeps the cells' unavailable / no-permission state (no existence leak); a row click outside the link still opens the row's record.
    4. No metadata key and no spec change; Clause-②: as the claim measures (the host contract already carries the two callbacks for the detail page).

    Not taken: B (two link behaviours in one table); C (a name you can read but not open) stays only as item 2's fallback.

    Workload of the letter (the card's column): domain:ui · 1 card (this one) · app-shell ObjectView and tests · no measured precedent.

    Execution: this card is the execution card: needs-user-decision removed; pm:queue and priority:p2 added in this act (domain:ui and area:records stay); the body's first line carries Ruled:. The domain:ui lane claims it; no second card.

  4. objectstack-fleet commented on Oct 16, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 3 (priority:p2; the ruling 6216810282 on this card, letter A, the maintainer's 「12673 同意」 recorded by the director seat)
    Session: session_01SJn1GEkrbbBQkhGC26wEDw
    Account: os-sales (the seat's linked user as GET /user answers it; the card's assignee)
    Branch: claude/issue-12673-list-cross-object-links
    Worktree: objectui-issue-12673 (in the cloud session's own container)
    Domain: domain:ui
    Seat: domain:ui#4
    Ruling-ref: 6216810282
    File surface: packages/app-shell/src/views/ObjectView.tsx (listRecordActionsValue and where the list host publishes it only), packages/app-shell/src/views/RelatedRecordActionsBridge.tsx (only to share its existing any-object record-path builder, no behaviour change on the detail page), the list cells' link path in packages/plugin-grid/src/ObjectGrid.tsx / RecordPointerCell.tsx and the lookup cell in packages/fields/src/index.tsx only if the measurement shows one is needed, tests beside each, one .changeset/12673-*.md (stop on breach; explain in the report)
    Container & model: M, mode:cloud, model: opus (cloud on the maintainer's stance 「可以的话,ui 后续开发尽量用云 session,并且要求截图给我看」; lane scope on 「你也可以接ui车道的卡」; batch 3 on 「当前任务处理完,后续并发降到3」, this session's chat, 2026-10-16)
    Clause-②: no
    Clause-② reason: measured on main f0e760a: listRecordActionsValue is exported from ObjectView.tsx for its pin test but not from @object-ui/app-shell's entry (src/index.ts names neither it nor RelatedRecordActionsBridge), and RelatedRecordActionsValue (@object-ui/react) already carries recordHref and openRecord, so the change fills existing callbacks. If the build has to add or change a member reachable from a package entry, the dev reports it and the seat amends this line to yes.
    Responsibility: n/a — a ruled console behaviour change
    Thread-read: 6216810282
    Serial constraints cleared: PR #12662 (objectui#12606, this seat) edits ObjectView.tsx in another region (the Setup list chrome, about :3650); PR #12646 (another seat) edits ObjectGrid.tsx for its widgets. The regions differ; the later lander merges main.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

area:recordsBusiness objects, records, the views that show data, usable forms, searchdomain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatpm:dispatchedpriority:p2

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions