发现于 #4874(PR #5030)的实施,回传立单。不是#4874 的一部分:那张卡问的是「值落在选项集外时看不见」,PR #5030 已经让这类值可见了;本单问的是这一列还能不能筛 —— 值可见了,用户依然挑不出别的记录。
事实
packages/components/src/custom/filter-builder.tsx(PR #5030 后的行号)renderValueInput 里那条远程 picker 分支的条件是:
if (isLookupLike && !field?.options && (field?.referenceTo || field?.type === "user" || field?.type === "owner"))
!field?.options 对 options: [] 是 false —— 空数组是真值。于是一个带 referenceTo、options 为 [] 的 lookup 列进不到LookupValuePicker,落进下面按 options 画的分支:
两种形态下用户都无法为这一列选出任何新值,而同一列若 options 键干脆缺席就能拿到完整的远程搜索。实测(jsdom,origin/maine71c854 + PR #5030 分支):字段 { value: 'account_pending', type: 'lookup', referenceTo: 'accounts', options: [] },值 trigger 只有行里那个值,展开后无候选、无搜索框。
可达性
@object-ui/fields 的 deriveFilterFields(packages/fields/src/widgets/FilterConditionField.tsx:104)是 Array.isArray(f.options) ? f.options.map(…) : undefined,plugin-view 的 deriveFieldOptions(packages/plugin-view/src/config/view-config-utils.ts:279)是 options: field.options。两处都原样透传,所以只要对象元数据里某个引用字段声明了 options: [],这一列的筛选就退化成上面的样子。没有哪个消费方用 ?? [] 兜底,因此不是「每个 lookup 列都中」,但也不需要任何异常状态就能触发。
修法方向(仅供 triage,未实施)
PR #5030 已经为「静态选项集是否真的在位」建了唯一判据 hasStaticOptionDomain(field)(= options 是非空数组),并且正是按「options: [] 属于远程/未到位」这一侧裁定的值域行为。这条分支条件把同一个问题按 !field?.options 又答了一遍,两个答案对 options: [] 相反:值域侧当它是远程列(保值),控件侧当它是静态列(画空 Select)。让分支条件读同一个判据即可一致。
改的是公共控件对一整类列画哪个控件,属于用户可见行为变更 —— #4874 就是因为这类变更被升级到维护者裁定的,建议同样处理,别自行拍。
邻接观察(另一件事,不在本单修法内)
plugin-view 的 deriveFieldOptions 根本不传 referenceTo,所以经它构造的筛选面板里,lookup 列即使 options 缺席也拿不到远程 picker(分支的第二个条件不满足),会退到手打 id 的文本框。那是「控件降级得看得见」,没有隐形值,与本单不同源,若要处理请另开。
发现于 #4874(PR #5030)的实施,回传立单。不是#4874 的一部分:那张卡问的是「值落在选项集外时看不见」,PR #5030 已经让这类值可见了;本单问的是这一列还能不能筛 —— 值可见了,用户依然挑不出别的记录。
事实
packages/components/src/custom/filter-builder.tsx(PR #5030 后的行号)renderValueInput里那条远程 picker 分支的条件是:!field?.options对options: []是 false —— 空数组是真值。于是一个带referenceTo、options为[]的 lookup 列进不到LookupValuePicker,落进下面按 options 画的分支:in/notIn)→ 一个空的勾选框列表。两种形态下用户都无法为这一列选出任何新值,而同一列若
options键干脆缺席就能拿到完整的远程搜索。实测(jsdom,origin/maine71c854 + PR #5030 分支):字段{ value: 'account_pending', type: 'lookup', referenceTo: 'accounts', options: [] },值 trigger 只有行里那个值,展开后无候选、无搜索框。可达性
@object-ui/fields的deriveFilterFields(packages/fields/src/widgets/FilterConditionField.tsx:104)是Array.isArray(f.options) ? f.options.map(…) : undefined,plugin-view的deriveFieldOptions(packages/plugin-view/src/config/view-config-utils.ts:279)是options: field.options。两处都原样透传,所以只要对象元数据里某个引用字段声明了options: [],这一列的筛选就退化成上面的样子。没有哪个消费方用?? []兜底,因此不是「每个 lookup 列都中」,但也不需要任何异常状态就能触发。修法方向(仅供 triage,未实施)
PR #5030 已经为「静态选项集是否真的在位」建了唯一判据
hasStaticOptionDomain(field)(=options是非空数组),并且正是按「options: []属于远程/未到位」这一侧裁定的值域行为。这条分支条件把同一个问题按!field?.options又答了一遍,两个答案对options: []相反:值域侧当它是远程列(保值),控件侧当它是静态列(画空 Select)。让分支条件读同一个判据即可一致。改的是公共控件对一整类列画哪个控件,属于用户可见行为变更 —— #4874 就是因为这类变更被升级到维护者裁定的,建议同样处理,别自行拍。
邻接观察(另一件事,不在本单修法内)
plugin-view的deriveFieldOptions根本不传referenceTo,所以经它构造的筛选面板里,lookup 列即使options缺席也拿不到远程 picker(分支的第二个条件不满足),会退到手打 id 的文本框。那是「控件降级得看得见」,没有隐形值,与本单不同源,若要处理请另开。