fix(app-shell): give inline lookup action params a real record picker (#3405)#2786
Merged
Merged
Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub. |
Contributor
✅ Console Performance Budget
📦 Bundle Size Report
Size Limits
|
…er (#3405)
An action param declared inline as `{ name: 'inspector', type: 'lookup',
reference: 'sys_user' }` always rendered as a plain text input asking the user
to paste a record id (UUID). A QC supervisor assigning an inspector had to go
find that person's UUID by hand, while the very same reference field picks
records by name in the create/edit dialog.
`paramToField()` degrades a picker param to text when it has no `referenceTo`
target, and `referenceTo` was only ever populated on the field-backed branch of
`resolveActionParams()`. The inline branch dropped the authored `reference` key
entirely — as did the spec schema, which stripped it as an unknown key without
an error — so an inline picker could never reach `<LookupField>` no matter how
it was authored. The user's config was correct and silently discarded.
- `resolveActionParam()` maps an inline `reference` onto `referenceTo`: on the
inline branch, on the missing-field fallback branch, and as an override on
the field-backed branch (matching how every other inline value overrides the
resolved field).
- The text degradation warns in dev naming the offending param. With
`@objectstack/spec` now rejecting a targetless inline picker at parse time,
reaching that path means the metadata is broken, not merely partial.
- The fallback's placeholder and help text no longer claim "a picker is coming
soon" — it shipped long ago, and that copy misreported a dropped config as a
missing feature. All 10 locales now say the param has no reference object
configured.
Verified against the framework showcase (examples/app-showcase) driven in a
browser: the inline `p_account` param renders the searchable picker, queries
`/api/v1/data/showcase_account`, filters server-side on typed input (incl. the
CJK-named account), and resolves the selection by record id.
Refs objectstack-ai/objectstack#3405
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
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.
UI half of objectstack-ai/objectstack#3405. Spec half: objectstack-ai/objectstack#3406
问题
动作参数弹窗里内联声明的
lookup参数,永远渲染成纯文本框,提示「粘贴 xxx 的记录 ID(UUID)」,还附一句「可视化选择器即将上线」。真机场景(PLAT-DEF-005,天顺 EHR 质检派工):质检主管点【指派】/【转派】要选质检员,得先跑到别处把人的 UUID 复制出来再粘进去,对真人基本不可用。同一套引用字段在新建/编辑记录弹窗里是正常的搜索式选择器。
不是用户没配。 租户写的是
{ name: 'inspector', type: 'lookup', reference: 'sys_user' },意图清清楚楚,被丢了两次:spec schema 当未知键 strip 掉,本仓的RawActionParam也不认这个键。根因在
paramToField.ts:而
referenceTo唯一的来源是resolveActionParams()的字段引用分支(从对象字段的reference_to ?? reference抄)。内联分支的返回对象里根本没有这一项,所以内联 picker 100% 必然降级,与作者怎么写无关。那句「即将上线」还是过时的:选择器早就有了(字段引用式走的就是
<LookupField>),这句话把「你这个写法拿不到选择器」谎报成「平台还没做」,把用户和排查的人一起带沟里。改动
resolveActionParam()把内联reference映射成referenceTo—— 内联分支、缺字段兜底分支都透传,字段引用分支上作为覆盖(与其他所有内联值覆盖已解析字段的行为一致)。console.warn点名是哪个参数。配合 spec 侧的解析期校验,走到这条路意味着元数据坏了,不再是「元数据不全」的正常路径。lookupPlaceholder/lookupHelpText不再说「即将上线」,改成指明该参数未配置引用对象。10 个语种(en / zh / ja / ko / de / fr / es / pt / ru / ar)全改。验证
真机(framework
examples/app-showcase:5311 + 本分支 console dev :5312 指过去,中文界面):GET /api/v1/data/showcase_account?top=50拉列表;输入「华宁」→?search=…服务端过滤命中「华宁科技」;Contoso 同理GET /api/v1/data/showcase_account/{id}按记录 ID 回填测试:
@object-ui/app-shell89 用例 +@object-ui/i18n106 用例通过,tsc --noEmit干净。新增覆盖内联 / 字段引用 / 内联覆盖 / 缺字段兜底四条路径,以及降级时的 warn。合并顺序
本 PR 单独合入是安全的(
reference缺席时行为不变)。但要让内联 picker 真正可用,需要 objectstack-ai/objectstack#3406 先落地并发版 —— 否则reference在服务端就被 strip 了,到不了这里。🤖 Generated with Claude Code