Repository navigation
feat(app-shell): render a record on a named record page at /apps/APP/OBJECT/record/ID/page/PAGE - #12731
Merged
objectstack-fleet[bot] merged 3 commits intoOct 16, 2026
Conversation
…/page/PAGE A new console route, `:objectName/record/:recordId/page/:pageName`, renders the record on the named page when it is a record page bound to the object, and shows the page-not-found state for any other name, never the default page. The record route is unchanged. `@object-ui/react` exports `isRecordPageOf`, the one reading of "a record page of object O"; `usePageAssignment`'s object-based lookup filters with it (behaviour unchanged) and the route asks it before rendering a named page. Claude-Session: https://claude.ai/code/session_01ACSfW1aH5ptDiXVMpWKPgv Co-authored-by: Claude <noreply@anthropic.com>
…int pages Claude-Session: https://claude.ai/code/session_01ACSfW1aH5ptDiXVMpWKPgv Co-authored-by: Claude <noreply@anthropic.com>
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
|
Contributor
Author
席位核对 · ACCEPT ·
|
objectstack-fleet
Bot
deleted the
claude/issue-12715-named-record-page
branch
October 16, 2026 16:15
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 #12715
Clause-②: yes
What
A console URL that renders a record on a NAMED record page, so the server's print service can print any record page of an object, not only its default one.
URL shape (the contract objectstack's print service binds to):
Route
:objectName/record/:recordId/page/:pageName, declared beside the record route inpackages/app-shell/src/console/AppContent.tsxasRECORD_NAMED_PAGE_ROUTE. The record route/apps/APP/OBJECT/record/IDis unchanged, and it still opens the object's default record page.Behaviour
type: 'record',object: OBJECT). A page that declaresprintrenders with its print stylesheet and its print root (data-print-page), andwindow.__objectui.idlebehaves as on the record route. Those are the two signals the print driver's ready predicate reads.How
RecordDetailViewreadspageNamefrom the route, passes it tousePageAssignment, and checks the named page withisRecordPageOfbefore it renders. A pending or refused name blocks both the assigned page and the synthesized default.@object-ui/reactexportsisRecordPageOf(page, objectName), the single reading of "a record page of object O".usePageAssignment's object-based lookup now filters with it, with unchanged behaviour. The hook's publishedpageNameoverride is NOT narrowed: it still returns any page by that name, and that is pinned. No consumer in the tree relies on it returning a non-record page (measured: the hook's own test only).pagequery parameter: it matches the record route's/editsub-route, and the default route's path is untouched. An optional query would let a stray parameter change which document the record route draws.pageis also a page-scoped list parameter elsewhere.Tests
RecordDetailView.namedRecordPage-12715.test.tsxmounts both routes from the real route constant. It pins: the happy path (print root present and idle false while the record read is in flight, then true); the unchanged default route; parity on the default route when its default page is a print page; all three refusal cases (no default page, no other page, no print root, no record read); and skeleton-only while pages load.usePageAssignment.isRecordPageOf-12715.test.tsxpins the predicate, the lookup reading through it, and the unchangedpageNameoverride.RecordDetailView.*tests (63 files, 397 tests); console route, console app and react hook suites (126 files, 1504 tests). All green.Live reading
Showcase backend from published
@objectstack/*18.0.0-next.2; console from this branch; headless Chromium with print emulation. One throwaway non-default print record page was added in a scratch copy of the showcase only.Screenshots and the reading log: branch
claude/issue-12715-evidence, folderevidence/12715/.Acceptance notes
empty.pageNotFoundcopy; no locale keys are added.print-service.tsdefault-page rule is widened in objectstack after its pin carries this change. That is not part of this PR.Provenance: built by the cloud session
session_01ACSfW1aH5ptDiXVMpWKPgv(claim6218257366) and opened by thedomain:uiseat 1 PM (session_011K9g23W67dy2zwnyzaoB6o) from that session's final message, because a cloud session cannot open a PR from its container. The seat replaced the dev's own footer lines with this line.Generated by Claude Code