You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
finding(plugin-grid): the list link: true column renders a span role="link" with no href — no middle-click, no copy-link, and now inconsistent with the detail page's real anchors #4490
Measured during #4336 (PR #4489). Observation-class; no fix proposed here.
What
ObjectGrid's link: true column renders LinkCell as a span role="link" (no href), navigating only via navigation.handleClick(row) → the host's onNavigate. Consequences:
No native link affordances: middle-click / ctrl-click open-in-new-tab, right-click copy-link, hover status-bar URL — all absent. Only a plain left click works.
A11y: role="link" without an href is a weaker contract for assistive tech than a real anchor.
LinkCell consumes the same host-published recordHref (the provider needs mounting on the list surface, or the href callback threading through the grid's navigation context) and renders a real anchor with the same left-click-SPA / modifier-click-native split #4489 established. One mechanism, both surfaces.
Refs #4336 (PR #4489), #4472 (no hand-built URLs — the href must come from the host).
Ruling (delegated authority; open veto window): give the list link: true column the SAME real-anchor mechanism PR #4489 established for detail/related surfaces — LinkCell consumes the host-published recordHref (RelatedRecordActionsContext) and renders a real <a href> with the #4489 split: plain left click SPA-handled via the existing navigation.handleClick, modifier clicks left to the browser. One mechanism, all three surfaces.
Graceful degradation: no host recordHref ⇒ LinkCell renders exactly today's span role="link" behavior — byte-identical, pinned. The anchor is an upgrade where the host provides the URL, never a break where it doesn't.
a11y: the anchor carries the display text as its accessible name; role="link" span path unchanged for the fallback.
Red-first: list with a host-published recordHref → pre-fix querySelector('a') null in the link cell (today's span — capture); post-fix a real anchor whose href is the host-built record URL; modifier-click not preventDefault'ed (assert the handler split); plain click still calls navigation.handleClick. Must-not-change (green both sides): provider-less hosts byte-identical; non-link columns untouched; row-click navigation unchanged; #4503/#4510's landed BulkActionBar/fan-out behavior untouched (their pins stay green).
Grading: patch @object-ui/plugin-grid (+ patch app-shell if the provider mounting lands there — .d.ts measured; additive-export rules per precedent). Never major.
Surface (mutual exclusion): packages/plugin-grid/src/ObjectGrid.tsx (LinkCell) + the measured provider/threading seam + tests + changesets. ⛔ NOT: packages/react's context FILE unless a new optional member is genuinely required (measure — #4489 already added recordHref/openRecord), RecordDetailView (in-flight #4213), AppContent (in-flight #4252), metadata-admin (in-flight #4518), plugin-timeline (in-flight #4513), content/docs/releases/.
Measured during #4336 (PR #4489). Observation-class; no fix proposed here.
What
ObjectGrid's
link: truecolumn rendersLinkCellas aspan role="link"(nohref), navigating only vianavigation.handleClick(row)→ the host'sonNavigate. Consequences:role="link"without an href is a weaker contract for assistive tech than a real anchor.<a href>anchors (host-built URL viaRelatedRecordActionsContext.recordHref, plain left click SPA-handled, modifier clicks left to the browser). The list page's own link column is now the surface with the weaker affordance — the reverse of the situation 记录详情页的 lookup 字段渲染成纯文本+复制按钮,不可点击跳转到被引用记录(列表页的链接列正常) #4336 opened with.Remedy shape (when someone takes it)
LinkCellconsumes the same host-publishedrecordHref(the provider needs mounting on the list surface, or the href callback threading through the grid's navigation context) and renders a real anchor with the same left-click-SPA / modifier-click-native split #4489 established. One mechanism, both surfaces.Refs #4336 (PR #4489), #4472 (no hand-built URLs — the href must come from the host).
Filed unassigned for triage.
Generated by Claude Code