概述
做「按角色/账号显隐动作按钮」时,接连踩到三个控制台动作可见性坑,共性是**visible 求值失败一律 fail-closed 静默隐藏、无任何诊断**——这才是最耗时的根源。
1. visible 的 CEL 身份变量是 user,不是服务端的 os.user
控制台给动作 visible 构造的作用域是 { record, user:{id,name,email,role,roles,...}, app },身份变量是 user;服务端 CEL(公式/校验/sharing)用 os.user。在 visible 里写 os.user.*(很自然的第一直觉)→ 求值失败 → 按钮对所有人静默消失。
定位:packages/app-shell/src/.../ExpressionProvider.tsx:57, 67(无 os. 别名)。
注:user 对象已含 id,user.id 可用。
2. record_more-only 动作不在记录页头 ⋯ 菜单渲染
记录页头只渲染 locations 含 record_header 的动作;只声明 record_more 的动作在详情页头整个不显示,须补 record_header 才进 ⋯,语义反直觉。
定位:packages/app-shell/src/views/RecordDetailView.tsx:1394(硬性 record_header 过滤)。
3. visible 引用 hidden:true 字段 → 动作静默隐藏
详情记录 payload 剔除 hidden 字段;visible 引用被剔除的字段 → 求值失败 → fail-closed 隐藏,无报错。
定位:objectui 侧不剥字段(RecordDetailView.tsx:270-276 只 $expand),疑为服务端 payload 行为,需服务端确认后归位。
统一改进建议
dev 模式下 visible 求值抛异常/引用不存在变量时,在浏览器 console 打警告(动作名 + 表达式 + 失败原因),而非静默隐藏——上述三坑有此诊断都能秒定位。
来源(项目 dogfood):steedos-labs/os-tianshun-mtc#26 · 相关 #40
概述
做「按角色/账号显隐动作按钮」时,接连踩到三个控制台动作可见性坑,共性是**
visible求值失败一律 fail-closed 静默隐藏、无任何诊断**——这才是最耗时的根源。1.
visible的 CEL 身份变量是user,不是服务端的os.user控制台给动作
visible构造的作用域是{ record, user:{id,name,email,role,roles,...}, app },身份变量是user;服务端 CEL(公式/校验/sharing)用os.user。在visible里写os.user.*(很自然的第一直觉)→ 求值失败 → 按钮对所有人静默消失。定位:
packages/app-shell/src/.../ExpressionProvider.tsx:57, 67(无os.别名)。2.
record_more-only 动作不在记录页头 ⋯ 菜单渲染记录页头只渲染
locations含record_header的动作;只声明record_more的动作在详情页头整个不显示,须补record_header才进 ⋯,语义反直觉。定位:
packages/app-shell/src/views/RecordDetailView.tsx:1394(硬性record_header过滤)。3.
visible引用hidden:true字段 → 动作静默隐藏详情记录 payload 剔除 hidden 字段;
visible引用被剔除的字段 → 求值失败 → fail-closed 隐藏,无报错。定位:objectui 侧不剥字段(
RecordDetailView.tsx:270-276只$expand),疑为服务端 payload 行为,需服务端确认后归位。统一改进建议
dev 模式下
visible求值抛异常/引用不存在变量时,在浏览器 console 打警告(动作名 + 表达式 + 失败原因),而非静默隐藏——上述三坑有此诊断都能秒定位。来源(项目 dogfood):steedos-labs/os-tianshun-mtc#26 · 相关 #40