Repository navigation
fix(studio): Interfaces lists a package's pages, dashboards, reports and views no nav entry names - #26982
Merged
Conversation
…and views no nav entry names The Interfaces rail listed only the app's navigation tree, so an item no entry opens, and every item of a package with no app, could not be opened in Studio. Under the tree, one section per type now lists the package's items no entry opens (published and draft, through loadPackageSurfaces narrowed by each type's list filter); a row opens its item in the existing canvas and inspector. A no-app package keeps its notice with the sections under it, and its canvas leaves the empty state once an item is opened. Claude-Session: https://claude.ai/code/session_01JQwxbZJXVERQKCsD3gtpru Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JQwxbZJXVERQKCsD3gtpru Co-authored-by: Claude <noreply@anthropic.com>
…oped list per package The two tests that refuse an identifier another package holds served that package's item from the pillar's own scoped list too, which the server never does; the Interfaces rail now reads that list, so the mock keeps scope. Claude-Session: https://claude.ai/code/session_01JQwxbZJXVERQKCsD3gtpru Co-authored-by: Claude <noreply@anthropic.com>
…prefixed template The view-cache guard (viewCacheInvalidation.guard) refuses any app-shell file that interpolates a view-prefixed template string, the adapter cache key's shape. The set of items nav entries open is not a cache key; its keys now go through itemKeyOf. Claude-Session: https://claude.ai/code/session_01JQwxbZJXVERQKCsD3gtpru Co-authored-by: Claude <noreply@anthropic.com>
Contributor
Author
席位核对ACCEPT · seat 席位意见:Interfaces 左栏在导航树(或「此包还没有应用」提示)之下,按页面 / 仪表盘 / 报表 / 视图分组列出导航没有指向的条目,点开用现有画布和检查器;只读包照样只读打开。复用
|
github-merge-queue
Bot
removed this pull request from the merge queue due to a conflict with the base branch
Oct 28, 2026
…-9g76ju # Conflicts: # ui/packages/app-shell/src/views/studio-design/StudioDesignSurface.tsx
This was referenced Oct 28, 2026
Contributor
Author
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.
Requested by Warren · project thread
Fixes #26889
Clause-②: no
Metadata-protocol: none
维护者速读
StudioDesignSurface.tsx的navOpenedItems/OffNavSections与画布空状态条件;packageSurfaces.ts的keep参数;新测试文件。pnpm --dir ui exec vitest run packages/app-shell/src/views/studio-design/InterfacesPillar.offNavItems-26889.test.tsx,预期 7/7 通过。What changes
pickSurface, shared with the tree, keeps the held-widget confirmation). On a read-only package the canvas opens read-only, as it does for a tree row. Nothing is written by listing: no nav entry is added.loadPackageSurfaces(published ∪ draft, published label wins, a draft-only item by its_draftslabel). It gains an optionalkeepfilter over the published rows, fed each type's ownMetadataResourceConfig.listFilter, so the rail lists what Setup › Metadata lists: the aggregated view container the server keeps beside its expanded view items is not an item. No third reader was added.navOpenedItemswalks the nav buffer with the tree's own binding (resolveSurface): a page / dashboard / report entry's target, and the view anobjectentry'sviewNamenames, under the view item's name (OBJECT.VIEWNAME, vialistViewTargetOf). A plainobjectentry opens its object, so that object's views stay listed. The sections are hidden while nav editing (the rail is the nav editor then) and while the app is still resolving.appStatus === 'missing' && !error && !current).engine.studio.if.offNav.*rows in the studio namespace (en,zh); none inmetadata-admin/i18n.ts. Changeset:@object-ui/i18npatch.StudioDesignSurface.interfacesCreate-11823andinterfacesCreatePage-11823served another package's item from the pillar's own package-scoped list, which the server never does; their mock now keeps scope (inScope), the assertions are unchanged.Tests
InterfacesPillar.offNavItems-26889.test.tsx(new, 7 tests): the four sections list exactly the off-nav items (record page, draft-only page, dashboard, report, view); nav-opened items appear once (in the tree), theviewNameview and the aggregated container never in the sections; a view, a record page and a dashboard each open in the canvas with the row active; a no-app package keeps its notice and opens its dashboard and page; read-only opens with noonPatchand no save, writable with one; a package whose every item an entry opens draws no sections (with a positive control).loadPackageSurfaces(…).catch(replaced byPromise.resolve([] as PackageSurface[]).catch(): 7/7 red; restored, blob equals HEAD.Acceptance notes
?surface=deep link to an off-nav item (for example the running app's Edit app on a record page route) still restores to the first nav leaf: the restore reads the nav tree only, in the app load, outside this card's declared region. Reported for the seat to file.Verification
All readings at head
c11187f3(the fix commits plus a merge oforigin/main), app-shell dependency closure rebuilt after the merge.Tests (local, under the shared verification lock)
pnpm --dir ui exec vitest runon the new test, both edited create tests, and the nav-tree, no-app-label and read-only Interfaces tests: 6 files, 54 tests passed.d9302876: the wholepackages/app-shell/src/views/studio-design/directory, 234 files; the two create tests failed on the mock described above, then passed after it was scoped. Outside importers of the changed modules (2 files) pluspackages/i18n/: 91 files passed. App-shell term tests (zh-base-term,studio-locale,metadata-form-i18n): 19 tests passed.pnpm --filter @object-ui/app-shell run type-check: exit 0.pnpm --filter @object-ui/i18n run type-check: exit 0.eslinton the changed files: 0 errors, no warning on a changed line.pnpm check:new-line-citations: 0 new citations.Derived gates (dispatch-gates --commands; reconciled with --ran: 34 derived, 34 run, 0 not measured)
node scripts/check-adr-0087-registration.mjs --base origin/main:: exit 0node scripts/check-adr-0087-registration.mjs --self-test:: exit 0node scripts/check-changeset-no-major.mjs --base origin/main:: exit 0node scripts/check-closing-keyword-parity.mjs:: exit 0node scripts/check-closing-keyword-parity.mjs --self-test:: exit 0node scripts/check-comment-mask-corpus.mjs:: exit 0node scripts/check-empty-changeset.mjs --base origin/main:: exit 0node scripts/check-empty-changeset.mjs --self-test:: exit 0node scripts/check-sdui-manifest.mjs:: exit 0node scripts/check-sdui-manifest.mjs --self-test:: exit 0node scripts/pm/release-rehearsal-clone.mjs --self-test:: exit 0node scripts/release-pending-publish.mjs --self-test:: exit 0pnpm --dir ui exec vitest run scripts/:: exit 0pnpm --filter @objectstack/spec run check:duration-unit-keys:: exit 0pnpm check:changeset-gate-self-tests:: exit 0pnpm check:closed-ceremony-text:: exit 0pnpm check:cross-package-test-inputs:: exit 0pnpm check:dispatcher-error-vocabulary:: exit 0pnpm check:driver-memory-census:: exit 0pnpm check:engine-double-contract:: exit 0pnpm check:gitlink-declared:: exit 0pnpm check:nul-bytes:: exit 0pnpm check:pm-changeset-deadline-census:: exit 0pnpm check:published-files:: exit 0pnpm check:query-options-erasure:: exit 0pnpm check:refd-timer-probe:: exit 0pnpm check:skill-identifier-liveness:: exit 0pnpm check:test-source-alias:: exit 0pnpm check:tier-file-adoption:: exit 0pnpm check:type-check-coverage:: exit 0pnpm check:type-check-debt:: exit 0pnpm check:undeclared-dep-imports:: exit 0pnpm check:watch-hint-literal:: exit 0pnpm check:where-matcher:: exit 0Families CI runs beyond the derived list are read from this PR's check-runs, not re-run locally.
Human Minimum
packages/specholds no runtime logic. (not touched)pnpm lintpasses. (changed files linted locally; the repo-wide run is CI's)main, one pull request.packages/spectouched: not touched.content/docs/references/,packages/*/CHANGELOG.mdorcontent/docs/releases/.Generated by Claude Code