Commit 0be6371
feat(showcase): 动作显隐矩阵——四个动作面 × 三种 visible 写法 × requiredPermissions × 每种字段类型的谓词
给 `showcase_field_zoo` 加一整套可证伪的动作门控夹具,覆盖决定「按钮出不出现」的两件事:
`visible`(记录上的 CEL 谓词)与 `requiredPermissions`(ADR-0066 D4 能力门)。
两条种子记录是可证伪性的来源:Specimen — Full(字段全填)必须出现,
Specimen — Minimal(多数为 null)必须消失——写错的表现是按钮出现在错误的地方,
而不是一个悄悄变绿的测试。
- **四面一致性**:同一个动作声明在行内 kebab / 记录页头 / ⋯ 菜单,并被视图的
`bulkActions` 提升进批量栏。关系比关系(`f_lookup == f_lookups[0]`)是最利的
一条:两个操作数都是 lookup,谁被展开谁就变成对象,比较就静默为假。
`gated_columns` 视图把 `f_lookup` 设为列(于是被 `populate=`),默认列表两个都不展开
—— 同样的记录、同样的谓词,两个视图必须给出同一结论(objectui#3501)。
- **三种 visible 写法**:裸 CEL 字符串 / `P` 标签模板 / `{ dialect, source }` 信封,
同一条谓词并排钉住;三者若在同一条记录上分歧,就是某个渲染器把某一种当特例了。
布尔 visible 不在此列——`ExpressionInput` 不接受它,`objectstack build` 发不出这种
形状,由 objectui 自己的单测钉(objectui#3492)。
- **requiredPermissions**:持有 / 不持有 / 两个取 AND / 空声明四种,四个面同一结论。
新增 `showcase.restricted_ops` 能力:**定义了但不授予任何权限集**——门的可证伪一半,
正是批量栏当初整个忽略 `requiredPermissions` 时无人察觉的原因。
- **字段类型谓词园**:每种字段类型一条 `visible`,含 lookup(单/多/空)、master_detail、
tree、user、文本族、数值族、时间族、布尔/选项族、json/location/address/composite/
repeater/vector,以及 AND/OR/NOT/三元。全部对着真实 runtime 的 CEL 引擎实测过,
不是照着规范猜的。
顺带钉住三条实测得到的作者规则:必须 `record.` 前缀;遍历/调方法前必须判空
(`null` 没有成员也没有方法,不判空在 Minimal 上直接 fault);用 `contains()` / `matches()`
而不是 `startsWith()` / `endsWith()`(后者不是 CEL,objectui 会降级到遗留 JS 引擎并告警)。
`showcase_zoo_dialect_split` 是故意留下的**红色夹具**:同一个 `.contains()` 谓词在行内
kebab 里正常、在记录页头被判抛错并隐藏——页头不走 CEL 引擎(objectui#3521)。
按仓库规矩不粉饰,改成一屏可对比的现场。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>1 parent 7b005b4 commit 0be6371
6 files changed
Lines changed: 655 additions & 3 deletions
File tree
- examples/app-showcase
- src
- security
- ui
- actions
- views
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
20 | 20 | | |
21 | 21 | | |
22 | 22 | | |
23 | | - | |
| 23 | + | |
24 | 24 | | |
25 | 25 | | |
26 | 26 | | |
| |||
193 | 193 | | |
194 | 194 | | |
195 | 195 | | |
196 | | - | |
| 196 | + | |
197 | 197 | | |
198 | 198 | | |
199 | 199 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
57 | 57 | | |
58 | 58 | | |
59 | 59 | | |
60 | | - | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
2 | 2 | | |
3 | 3 | | |
4 | 4 | | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
5 | 12 | | |
6 | 13 | | |
7 | 14 | | |
| |||
375 | 382 | | |
376 | 383 | | |
377 | 384 | | |
| 385 | + | |
378 | 386 | | |
0 commit comments