Skip to content

object-grid 的 inputs 声明 filters(复数),渲染器只读 filter(单数):按已发布词汇写筛选条件静默无效 #4041

Description

@os-zhuang

Migrated from objectstack-ai/objectstack#7119 under the file-at-destination ruling (objectstack-ai/objectstack#7167, maintainer 2026-08-10). Originally filed 2026-08-09T17:46:03Z. The full prior thread — including triage rulings and hold/restart conditions — remains on the source issue and MUST be read before acting on this card.


发现于 objectstack#6953 的实施过程(objectui 分支 claude/issue-6953-datasource-block-wiring),不在该单范围内,单独立单。

事实(objectui origin/main @ 65bb513 实测)

object-grid(以及同一渲染器的 view:grid 别名)的注册 inputs 声明的是复数 filters:

packages/plugin-grid/src/index.tsx
ComponentRegistry.register('object-grid', ObjectGridRenderer, {
  inputs: [
    { name: 'objectName', ... },
    { name: 'columns', ... },
    { name: 'filters', type: 'array', label: 'Filters' },   // ← 复数
  ]
});

而渲染器读的是单数 filter:

packages/plugin-grid/src/ObjectGrid.tsx:440  const schemaFilter = schema.filter;
packages/plugin-grid/src/ObjectGrid.tsx:615  params.$filter = schemaFilter;

schema.filtersObjectGrid.tsx 里 grep 不到任何读点(唯一命中是文件头注释里的一句 "Search, filters, pagination")。同一仓的 list-view 声明的是单数 filter,与它自己的读点一致 —— 两个同族 block 对外发布了两种拼写,只有一个是真的。

症状

作者(或 AI)按 object-grid 已发布的 inputs/manifest 写 filters: [...],查询里没有 $filter,拿到全表 —— 不报错,SDUI 保存门也不会报 unknown-prop(filters 是已声明键)。反过来,写真正生效的 filter 时,filters 才是被 manifest 承认的那个名字,于是「发布的词汇」和「运行时读的键」指向相反。objectstack#4413 的形状,叠加 objectui#3407 那种「声明与读点拼写不一致」的变体。

为什么现有门禁看不见

  • check:react-declaration-parity 比的是两侧声明(spec zod props ↔ 本仓 inputs),不观察渲染器。
  • apps/console/src/__tests__/public-block-binding-reach.test.tsx 只问一个问题:声明了 objectName 的 block 有没有把对象名送到数据层。object-grid 送到了,所以它在那里是绿的 —— 该测试的文档也明确写了它不是「每个声明的 input 都被消费」的检查。

建议范围(需要判一次方向,别直接猜)

两条路,选哪条会落进公开契约,建议由维护者定:

  • A(推荐):把 inputs 改成单数 filter,与 list-view、与 spec 词汇、与渲染器读点三方对齐;filters 作为从未生效过的错误拼写直接去掉(它没有任何读点,不存在「已在野的可用写法」需要兼容)。
  • B:让渲染器额外读 filters。⛔ 这会把一个错误拼写固化成第二套 de-facto 契约(AGENTS.md #0.1),不建议。

无论哪条,需要一条钉子:按 inputs 声明的名字写筛选条件时,$filter 必须出现在查询里。

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions