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。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions