You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
finding(app-shell): ActionParamDialog's isLookupParam restates the picker family over RAW param spellings, so a degraded master_detail param loses the #3405 affordances #5654
// A lookup-typed param that fell back to text (no referenceTo)// keeps the "paste an ID" placeholder/help hints.constisLookupParam=param.type==='lookup'||param.type==='reference';
两个读者::355 的 placeholder(actionDialog.lookupPlaceholder)与 :447 的 help text
(actionDialog.lookupHelpText)。两处都还要求 field.type === 'text',即只在降级发生
后才生效。
发现于 #5312 的实施(PR 见该卡)。不在 #5312 范围内 —— 该卡的文件面只有
packages/app-shell/src/utils/paramToField.ts,且这一条不是同一条规则:#5312 收敛的是「哪些 widget 要带 reference 目标」,这里是「哪些 param 在降级后要拿到提示」。单独立此单。
事实(实读
origin/main@aa3b81062,与 #5312 分支7784e137e同树)packages/app-shell/src/views/ActionParamDialog.tsx:351:两个读者:
:355的 placeholder(actionDialog.lookupPlaceholder)与:447的 help text(
actionDialog.lookupHelpText)。两处都还要求field.type === 'text',即只在降级发生后才生效。
而真正执行降级的是
packages/app-shell/src/utils/paramToField.ts,它测的是解析后的widget key:
测得的分歧
两个集合在任一方向上都不是子集关系:
paramToField降级?lookupreferencePARAM_TYPE_ALIASES先折成lookup)master_detailmaster_detail只在paramToField一侧:一个无referenceTo的master_detailparam确实降级成纯文本框、确实在 dev 下告警,但对话框既不给「粘贴 ID」的 placeholder
也不给 help text —— 恰好是 fix(fields): 注册路径的全屏长文本对话框接上 i18n(#3404) #3405 为这个状态补上的两个可见提示。用户看到的是一个没有任何
说明、要求裸 UUID 的空文本框。
reference只在对话框一侧,因为它在paramToField里已被 alias 折走 —— 于是这行把alias 表的一条内容又手抄了一遍。
master_detail是可达的:ActionParamDef['type']是string(
packages/core/src/actions/ActionRunner.ts:584),且paramToField.test.ts的 drift guard断言
FORM_FIELD_TYPES的每个成员(含master_detail)都解析到自己的 widget。为什么不在 #5312 里顺手修
三条都不满足「有界就地修」:① 不是同一条规则(reference-bearing vs degraded-hint);
② 没有可派生的权威 —— 正确形态是
LOOKUP_WIDGET_TYPES.has(resolveParamWidgetType(param.type)),而LOOKUP_WIDGET_TYPES是 surface-local 的、目前还没有导出;③ 改了会改变行为(
master_detail从此开始拿到placeholder 与 help text),那是修复,不是机械收敛,需要单独的证据与测试。
修法方向
把这行改成读解析后的 widget key,而不是原始拼写 —— 即从
paramToField导出降级判据(例如
paramDegradesWithoutTarget(param)),让「谁会降级」与「谁在降级后拿提示」由同一个判据回答,而不是两处各自维护。⛔ 不要反过来把
master_detail手加进对话框那行:那是把同一个成员集抄成第三份。
参考
paramToFieldis now the LAST private copy of the reference-bearing rule — and its "moves in lockstep with plugin-grid" comment stopped being true #5312 / 其 PR(本单的发现来源;那张卡收敛的是同文件里的另一条规则)DATA_SOURCE_WIDGET_TYPES是「哪些 widget 要 DataSource」的第四份私有副本 —— 与表单规则不同集、零 gate #4815(同型收敛的前三次)packages/app-shell/src/views/ActionParamDialog.tsx:351,355,447、packages/app-shell/src/utils/paramToField.ts:44,65