Skip to content

object.form.ts 的 20 处 visibleWhen 写的是裸标识符(type == 'formula'),同仓 field.form.ts 写的是 data.type —— 同一面两种拼写,必有一种不生效 #6254

Description

@hotlong

Filed unassigned from #6128 / PR #6248,那里为了给新闸门定爆炸半径把全仓可见性谓词扫了一遍。本单只记录发现,不含修法承诺 —— 它没有被 #6248 的闸门判到,原因见下。

事实:同一层的两种拼写

metadata 编辑表单(*.form.ts)的绑定根是 data(编辑中的那一行)—— packages/spec/src/ui/view.zod.ts:1416 / :1510 的 describe 原文,ADR-0089 D3 §Context 同。

packages/spec/src/data/field.form.ts 全部照此书写:

{ field: 'minLength', visibleWhen: "data.type == 'text' || data.type == 'textarea'" }
{ field: 'reference',  visibleWhen: "data.type == 'lookup' || data.type == 'master_detail'" }

packages/spec/src/data/object.form.ts 则一律写裸标识符,约 20 处(行号 120-190):

{ field: 'maxLength', visibleWhen: "type in ['text','textarea','email',…]" }
{ field: 'expression', visibleWhen: "type == 'formula'" }
{ field: 'autonumberFormat', visibleWhen: "type == 'autonumber'" }

view.form.ts / page.form.ts / report.form.ts / action.form.ts 也都是 data. 写法。只有 object.form.ts 是裸的。

需要先确定的一件事(不要凭印象判)

object.form.ts 的这些字段嵌在 object 表单的 repeater(字段列表)的 fields[] 里,行本身就是一个字段定义。所以有两种读法:

  1. repeater 子字段的谓词也按整张表单的 data 绑定求值 ⇒ 这 20 处全是坏谓词,Studio 的对象/字段编辑器里这些条件字段从来没有真正条件化过(fail-open ⇒ 一直显示);
  2. repeater 行在子字段谓词里另有一层行级绑定 ⇒ 裸写法是对的,那么这层绑定在 spec 里没有任何一句话写下来,而 field.form.tsdata. 写法就成了另一头的错。

无论哪一种,现状都是「同一个面上两种拼写并存,且没有文档说清楚」——这本身就是要修的东西。

为什么 #6248 的新闸门没有判到它

三条独立原因,记下来免得接手者以为闸门坏了:

  1. packages/spec*.form.ts 不是任何 app stack 的一部分,os validate 不会 lint 它们;
  2. 全仓没有任何调用方layer: 'metadata' —— 该层目前只有测试在跑;
  3. 即便前两条都补上,type 恰好是 CEL 自己声明的类型名标识符,type == 'formula' 到 checker 那里是类型 overload 错误而非「未知变量」,feat(lint): view/page 谓词裸标识符构建期闸门 —— 坏谓词发不出去 (#6128) #6248 的闸门按设计不判它(改读 overload 消息会误杀合法的 type(record.x) == string)。这一条已在 PR feat(lint): view/page 谓词裸标识符构建期闸门 —— 坏谓词发不出去 (#6128) #6248 里作为已知盲点钉了测试。

也就是说:这 20 处即使把闸门指过去也抓不到,得靠人读或靠一条专门的判据。

Refs:#6128 / PR #6248(发现处与盲点说明)、#5149(可见性谓词 fail-open 静默一族)、ADR-0089 D3。

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions