Skip to content

finding(react/plugins): useNavigationOverlay is handed a bare schema.objectName by three components that resolve their record source through the #6939 ladder — so the record-page URL can name a different object than the rows #7638

Description

@os-sam

Filed by the domain:ui execution seat while implementing #7627. The previous round of #7627 spotted this in ObjectTree and withheld it pending the ruling, because which spelling is correct was the pending decision. The ruling now exists (retraction comment on #7627, 2026-09-04: option C — the record-source ladder is data, then staticData, then objectName, published on both faces and pinned by objectql-record-source-refinement-6939.test.ts), so the card can be filed without being mooted.

Re-measuring for this card widened it: it is not one intra-file divergence in plugin-tree, it is the same line in three components plus the hook's own doc comment.

What is true today (measured on origin/main 11edab88)

useNavigationOverlay's objectName builds the record-page URL:

// packages/react/src/hooks/useNavigationOverlay.ts:290-291
const url = objectName
  ? `/${objectName}/record/${encodedId}`

Three components pass it the bare schema.objectName, never the object their rows actually came from:

file line what it passes
packages/plugin-tree/src/ObjectTree.tsx 598 objectName: schema.objectName
packages/plugin-kanban/src/ObjectKanban.tsx 699 objectName: schema.objectName
packages/plugin-calendar/src/ObjectCalendar.tsx 625 objectName: schema.objectName
packages/react/src/hooks/useNavigationOverlay.ts 198 the doc comment prescribes it in prose

Each of those three components resolves its record source the other way, in the same file:

  • ObjectTree line 575 headerObjectName — the ladder (feeds i18n field labels and formatCellValue);
  • ObjectCalendar line 969 — the ladder, and hands the result to RecordDetailDrawer as its objectName. So one component resolves the drawer with the data block and the URL with the top-level key, on the same click;
  • ObjectKanban resolves its records through getDataConfig likewise.

Why this is a finding and not a filed defect

No reproduction was run and no user report is attached — severity is for triage. What the shapes imply, stated as implication and not as a measurement:

  • a view bound only through data: { provider: 'object', object: X } (no top-level objectName) has no name to build a URL from, so the objectName ? … : … branch takes the other leg;
  • a view carrying both bindings clicks a row that came from X and navigates to /Y/record/<id>.

Both need the both-bindings / data-only shapes to be reachable in a real app, which is exactly what was not measured here.

Relationship to the fix that just landed

#7627 (PR #7637) published resolveRecordSourceObjectName in @object-ui/core and pointed the seven record-source sites at it — including ObjectTree:575 and ObjectCalendar:969 above. It deliberately did not touch these four, because a navigation URL is a different receiver from a record query and the ruling scoped the collapse to record-source reads. The shared reader now exists, so whoever picks this up has the ladder available as one call; the open question is whether a record-page URL should follow the record source, which is a product decision this card does not presume.

⚠️ Note the same trap #7627 hit: useNavigationOverlay.ts:198's doc comment prescribes the local spelling in prose. It has to move with any code change, or it re-seeds the copies — the defect PR #7617 landed a gate for.

Refs: #7627 (the ruling and the shared reader) · #7632 (the five hand-copied getDataConfig producers) · objectui#6939 (the published ladder) · AGENTS.md #0.1.

Activity

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

Metadata

Metadata

Assignees

Labels

domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatfinding

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions