Skip to content

normaliseOptions 把继承来的选项重建成 { label, value } —— field-backed action param 丢掉字段自己声明的 visibleWhen / color #3559

Description

@qq9340100

发现于 framework#5016 的实施过程(objectstack-ai/objectstack#6235),与那单的修复无关(那单开放的是作者写在 param 上的内联选项,走的是另一条分支),按 Prime Directive #10 单独立单,未认领

事实

packages/app-shell/src/utils/resolveActionParams.ts:228normaliseOptions 把每个条目重建成 { label, value }

return options.map((o) => {
  const raw = typeof o === 'string' ? { label: o, value: o } : o;
  const label = optionLabel ? optionLabel(objectName, fieldName, raw.value, raw.label) : raw.label;
  return { label, value: raw.value };   // 其余键在这里消失
});

它出现在 resolveActionParam 的这一行(同文件 :331):

const resolvedOptions = param.options ?? normaliseOptions(field.options, ownerName, param.field, ctx.fieldOptionLabel);

所以只有从字段继承的列表被重建。作者显式写在 param 上的 options 走左半,逐字下沉。

后果(今天就能撞上)

一个对象字段声明了逐选项 visibleWhen@objectstack/specSelectOptionSchema 早已声明,ADR-0058 / #2284),在对象表单里正常按谓词收窄;同一个字段被 action param 以 { field: 'xxx' } 继承后,visibleWhennormaliseOptions 里被丢掉,对话框把所有选项都列出来 —— 包括那些谓词本该藏起来的。同一份字段元数据,两个 surface 两种行为,没有任何提示。

color 同理(虽然影响面小得多:对话框只建输入控件,本来也不渲染 color)。

修法方向(不要猜,值得先定一次)

normaliseOptions 真正需要做的只有两件事:把裸字符串规格化成 { label, value },以及经 fieldOptionLabel 翻译 label。保留其余键是一行的事:

- return { label, value: raw.value };
+ return { ...raw, label, value: raw.value };

但连带要动两处类型(这是需要一并想清楚的部分,不是纯粹一行):

  • RawActionParam.options?: Array<{ label: string; value: string }>(同文件 :52
  • ActionParamDef.options?: Array<{ label: string; value: string }>packages/core/src/actions/ActionRunner.ts:436

两者都比它们承载的东西窄。目标词汇是 @object-ui/typesSelectOptionMetadatapackages/types/src/field-types.ts:289),也是 paramToField 下游控件真正读的形状 —— 收敛到它、还是只加 visibleWhen?: FieldRulePredicate,值得定一次再动。

顺带:framework 侧 objectstack-ai/objectstack#6235 落地后,ActionParamSchema.options[]接受 visibleWhen,所以上面两个 TS 类型也会成为「服务端接受、TS 作者写不出来」的那种不对称 —— 两件事一起修比较划算。

参考

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions