Repository navigation
feat(app-shell): the Studio item header says where a read-only base’s customization is saved - #29843
Merged
Merged
Conversation
…and name the base on the pending-changes sheet Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QsR2jTWKHRdA5msPPhwmw4
…tion is saved ADR-0146 D3: Interfaces, Data and Automations headers draw the pending-changes sheet's sentence, "Saved to BASE's customizations", on a note line under the title row, outside the fold's measured row. Access is unchanged. Fixes objectstack#29691 (PR 2 of 2). Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QsR2jTWKHRdA5msPPhwmw4
…odule Studio tests that replace the whole DraftChangesPanel module with a stub crashed once the item header imported the note from it. The sentence and its note element now live in preview/savedToCustomization.tsx, which no stub replaces; DraftChangesPanel re-exports savedToCustomizationText. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QsR2jTWKHRdA5msPPhwmw4
Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QsR2jTWKHRdA5msPPhwmw4
Contributor
Author
|
domain:ui#1 · zhuangjianguo · session_01QsR2jUJ19MstFvFhjgiYTu Contract reviewServed-tier: ① Derived judgments
② Semver levelThe changeset declares ③ Boundary flags
Implemented-by: VERDICT: PASS |
Contributor
Author
|
domain:ui#1 · zhuangjianguo · session_01QsR2jUJ19MstFvFhjgiYTu 席位核对 · ACCEPT · 2026-11-03T07:22ZHead-sha:
|
This was referenced Nov 3, 2026
Closed
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 Steedos · project thread
Fixes #29691
Clause-②: yes (widening)
Metadata-protocol: none
维护者速读
StudioItemHeader.tsx的note槽位(标题行之后);新文件preview/savedToCustomization.tsx(这句话与SavedToCustomizationNote,DraftChangesPanel改为转出);StudioDesignSurface.tsx三处note=的显示条件。What changes
StudioItemHeadertakes an optionalnote. It is one line under the title row and above the tabs, outside the title row, so the objectstack#29693 fold (which measures only that row) never counts it.savedToCustomizationText(from PR 1, feat(app-shell): fold the .custom pair's landing card under its base and name the base on the pending-changes sheet #29723) moves topreview/savedToCustomization.tsx, next to a newSavedToCustomizationNoteelement.DraftChangesPanelimports it and re-exports it, so its public export is unchanged. The header and the pending-changes sheet say the same words from the same key (preview.changes.savedToCustomization), and no key is added. The move is needed because many Studio tests replace the wholeDraftChangesPanelmodule with a stub. When the header imported the note from that module, 7 tests inoneSurface-28572andkernelReadOnly-29567crashed with "No SavedToCustomizationNote export is defined on the mock". The header now does not depend on what such a stub exports.StudioDesignSurface.tsx), only on a read-only base with a customization:customization.baseLabel). On Data,packageIdnames the pair for a pair's own object, so it is not used.DraftChangesPanel.test.tsx.Contract review
@object-ui/app-shellgains an optionalStudioItemHeaderprop (note) and a source modulepreview/savedToCustomization.tsxexportingSavedToCustomizationNoteandsavedToCustomizationText.DraftChangesPanelstill exportssavedToCustomizationText.Metadata-protocol: none).Tests
StudioItemHeader.titleRowFold-12897.test.tsx: a new describe over the stubbed-geometry harness. The note is the title row's next sibling and is not inside it, with the tab row after it. A 400 px note, wider than the room the row leaves, folds nothing at 632 px. The row still folds at 330 px and unfolds at 480 px with the note there. CONTROL: no note, no line.StudioDesignSurface.customizePublish-28562.test.tsx(the real surface): after Customize, the Interfaces header says "Saved to HotCRM’s customizations" outside the title row, and still does after the first edit makes the pair. The header line and the sheet line read the same. CONTROL: before Customize, no line.DataPillar.baseObjectExtension-28575.test.tsx(the real pillar): the first Add field makes the extension and the object header says it; a base object the published extension extends says it on open. CONTROLS: a base object with no extension, and a writable package's object, say nothing.AutomationsPillar.customizeFlow-28570.test.tsx(the real pillar): Customize unlocks the flow and the header says it; a published override says it on open. CONTROLS: the base's flow before Customize, and a writable package's flow, say nothing.DraftChangesPanel). The stub now draws its line with the realsavedToCustomizationText, using the label the host hands it. The pin compares the real header element with the sentence the real sheet draws from that label.DraftChangesPanel.test.tsxfrom PR 1 pins the real sheet's own line.Verification
Tests and gates (code head a3d4ffd; head e2d07e0 only rewords the changeset, and its changeset gates exit 0)
origin/main339f63da'sStudioItemHeader.tsx,DraftChangesPanel.tsxandStudioDesignSurface.tsx, keeping the new helper module the test imports, and restoredHEADafter. Result: 6 failed, 52 passed. The 6 are the new surface and header pins, and every CONTROL stays green on main. On the branch: 58 passed.StudioItemHeader,DraftChangesPanel,StudioDesignSurface,DataPillar,AutomationsPillar,InterfacesPillarorsavedToCustomization(284 files, in six locked batches, five of them withsrc/preview/whole alongside), all green ona3d4ffd1: 358 + 701 + 528 + 509 + 655 + 800 tests. An earlier sweep on6e6a5f34was what caught the 7 crashes the module move fixes.turbo run type-check --filter=@object-ui/app-shell: 65 of 65 tasks green.savedToCustomizationTextin the new module, the same warning that export carried inDraftChangesPanel.node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack): 35 commands, each exit 0 ona3d4ffd1, includingcheck-sdui-manifest,check-changeset-no-major,check-adr-0087-registration,check-closing-keyword-parity(run against this body) andpnpm --dir ui exec vitest run scripts/.Generated by Claude Code