Repository navigation
feat(react,app-shell,plugin-list): the compact list block links "View all" through the host listHref (objectui#12703) - #12817
Merged
Conversation
… all" through the host's listHref (objectui#12703) RelatedRecordActionsValue gains listHref / openList, the list-side twin of recordHref / openRecord. The custom page supplies them (pageRecordActionsValue): the object's list route, or a saved view's route when the block binds dataSource.view. The compact list's footer draws a real "View all" link only when the host answers a destination; the block's own filter, columns and sort are never handed to the host. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XVp19E1MYUTFM3dnkwz8gB
… list and view routes (objectui#12703) Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XVp19E1MYUTFM3dnkwz8gB
… list's "View all" link (objectui#12703) Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XVp19E1MYUTFM3dnkwz8gB
Contributor
✅ Console Performance Budget
The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it. 📦 Bundle Size Report
Size Limits
|
…ined, compiling snippet (objectui#12703) Imports the provider and value type, types the builder's parameters, declares navigate, wraps children in a typed component, and encodes the view name as one path segment, matching the console's own builder. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XVp19E1MYUTFM3dnkwz8gB
Contributor
✅ Console Performance Budget
The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it. 📦 Bundle Size Report
Size Limits
|
This was referenced Oct 16, 2026
This was referenced Oct 16, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes #12703
Clause-②: yes
Part 2 of objectui#12703 (part 1 landed as PR #12797,
a8add5c): the compact list block's "View all" link, through one host-seam member, per the seat ruling (option B, comment 6224804504).What changed
@object-ui/react:RelatedRecordActionsValuegainslistHref(objectName, viewName?)and its SPA openopenList(objectName, viewName?), the list-side twin ofrecordHref/openRecord. Both are optional and documented in the interface's JSDoc. The seam takes an object and a view name only, so a caller has no argument through which a filter, columns or a sort could reach the URL (reverse type check below).@object-ui/app-shell: the custom page supplies them inpageRecordActionsValue, the modulePageViewpublishes on the context. The routes are/apps/APP/OBJECT/view/VIEWfor a block bound to a saved view (dataSource.view) and/apps/APP/OBJECTotherwise. They are the two routes the console mounts (:objectName/view/:viewIdand:objectNameunder/apps/:appName/*), the same shapes the app navigation writes for view and object items.ObjectViewaccepts the short and the qualified view spelling alike. The href carries the router basename andopenListnavigates by the bare route, asrecordHrefdoes (objectui#12233). An object outside the app's metadata, or a page outside an app route, getsnull.@object-ui/plugin-list:ListViewBlockreads the host (useRelatedRecordActions) and, in the compact posture only, builds the destination from the bound object anddataSource.view. It hands it to the compact list through a package-internal context, because the destination belongs to the block and the claim's surface leavesListView.tsxunchanged. The compact list draws a footera hrefnamed "View all" with an arrow. A plain left click callsopenList, and a modifier or non-primary click is left to the browser. There is no link when the host publishes nolistHref, when it answersnull, or when the list is empty (the empty state renders instead of the rows).@object-ui/i18n: one key,list.viewAll, in all ten packs.packages/react/README.md(newRelatedRecordActionsProvider / useRelatedRecordActionssection),packages/plugin-list/README.md("View all" under the compact posture), andcontent/docs/guide/react-pages.md(the part-1 paragraph no longer says "a planned follow-up").Measured assumptions
dataSourcebinding through to the child schema unchanged, andisElementDataSourceConfig(...).viewreads it. The console has a saved-view URL,/apps/:appName/:objectName/view/:viewId(the AppContent route).Tests (all at
3243f6c5d)packages/plugin-list/src/__tests__/ListViewBlock.compactViewAll-12703.test.tsx, 4 passed. It uses the real page renderer and the reallist-view, a stand-in host that records its arguments, and the real English pack./apps/crm/crm_event/view/upcoming, link named "View all". A meta-click does not callopenList; a left click calls it once with(crm_event, upcoming)./apps/crm/crm_eventwith no?, and everylistHrefcall is exactly[crm_event, undefined].listHref, and no host at all, draw no footer.mainregion draws the full list (toolbar and grid) and no link.packages/app-shell/src/views/__tests__/PageView.listHref-12703.test.tsx, 5 passed. It runs the realPageViewunderMemoryRouterwith basename/_console, the real page renderer and the reallist-view.Linkfor/apps/crm/crm_event/view/upcoming, and a left click routes there.Linkfor/apps/crm/crm_event.nullandopenListdoes not navigate; no app getsnull; a view name is one encoded segment.scripts/ablation-replace.mjs): the anchorlistHref: (objectName, viewName) => {was renamed (anchor 1 to 0, blob8b2ea172e459to045b761c6355). The app-shell pin went 5 of 5 red. Restored: blob equals HEAD8b2ea172e459andgit diff HEADis empty.value={compact ? compactListDestination(host, schema) : null}withvalue={null}: (a) and (b) went red, and the controls (c) and (d) stayed green. Restored: blob equals HEADe9a555068fafand the diff is empty.@object-ui/*tosrc, so no dist leg is involved.host.listHref(objectName, viewName, bound.filter)inListViewBlockgivesTS2554: Expected 1-2 arguments, but got 3under plugin-listtsc --noEmit. Restored, and the diff is empty.turbo run build --filter='@object-ui/app-shell^...' --concurrency=2gave 28 of 28 tasks and VERDICT command-exit 0.type-checkfor@object-ui/react,@object-ui/i18n,@object-ui/plugin-listand@object-ui/app-shell(each script name echoed): VERDICT command-exit 0.--maxWorkers=1:packages/plugin-list/dir, in three slices of 49, 49 and 48 files: 146 files and 1504 tests passed.packages/react/dir: 112 files and 1422 tests passed.packages/i18n/dir: 83 files, 1321 passed and 13 skipped.packages/app-shellwas narrowed and declared: the 34 filesgit grepnames forPageView|pageRecordActions|RelatedRecordActions|listHrefpassed, 269 tests. The other app-shell test files (out of 1503) are declared to CI.--no-inline-configon the 16 changed ts/tsx files (--format jsoncounts): 0 errors and 3 warnings, allreact-refresh/only-export-components.ListViewCompact.tsx. That file already exports a non-component.eslint.config.jsdeclares noparserOptions.project, so linting is not type-aware and this diff cannot change any untouched file's verdict.check:phantom-deps,self-import,unreferenced-sources,doc-example-readers,handler-key-reads,side-effects-array,element-data-source-declaration,spec-symbols,action-forward-parity,designer-field-key-parity,icon-record-names,i18n-keys,i18n-drift,i18n-designer-parity,control-bytesandnew-line-citations, pluscheck-hand-rolled-comment-mask,check-changeset-fixed,check-changeset-presenceandcheck-changeset-no-major.check:spec-floorsexits 1 withno-artifact, as expected on an unbuilt workspace; it is recorded and not fixed.Acceptance notes
listHref/openList, mirroringrecordHref/openRecord.pageRecordActions.ts, the modulePageView.tsximports its published value from (it was extracted soPageView.tsxexports components only).PageView.tsxitself needed no edit. That file is outside the claim's literal list and is named here.dataSource.view.Session:
https://claude.ai/code/session_01XVp19E1MYUTFM3dnkwz8gBGenerated by Claude Code