Skip to content

objectui 跟进项(源自 #2616 Showcase 全链路 UX 测试) #2620

Description

@os-zhuang

来自 #2616 的发现,根因定位到 sibling objectui 仓库(pinned .objectui-sha),本会话的 GitHub 访问范围仅限 objectstack-ai/framework,无法直接在 objectui 建 issue,先在本仓汇总跟踪,便于换成 objectui 会话时认领。框架侧可修的部分已在 #2616 的修复 PR 中处理;以下均需要在 objectui 侧改动。

A1. UnifiedSidebar 用 i18n 对象标签覆盖导航项显式 label

UnifiedSidebar 把导航项自己的 label 仅作为 fallback 传入 useObjectLabel().objectLabel,只要翻译包定义了同名 objects.<name>.label,翻译永远赢,导致应用配置里显式写的复数 label('Projects'/'Tasks'/...)在侧边栏被单数对象标签覆盖。
修复方向:导航项显式 label 应优先于对象标签;对象类导航兜底时应取 pluralLabel 而非 label

A3(残留). ActionEngine 的 visible 表达式求值失败时 fail-open,且 toast 时序早于写库确认

packages/formula/src/cel-engine.tscelEngine.evaluate() 返回 {ok:false,error} 而非抛出,由调用方(objectui 的 SchemaRenderer/ActionEngine)决定失败时的默认可见性——当前在无绑定记录的上下文(如页头/工具栏)下默认 fail-open(显示),而在有绑定记录的行/详情上下文下 fail-closed(隐藏),不一致。此外 script action 的成功 toast 出现时机早于服务端真正确认写库结果。
框架侧已通过移除 showcase_review_queue 的无绑定工具栏按钮规避了具体复现场景(#2616 修复 PR),但 ActionEngine 本身的 fail-open 默认值和 toast 时序问题仍在。

B1(待核实). formType:'wizard'<ObjectForm> 是否真的处理 submitBehavior

submitBehavior 是 spec 里合法的 <ObjectForm> prop(packages/spec/src/ui/view.zod.ts,react-blocks.tsdataProps),showcase_new_project_wizard 之前从未设置它,已在修复 PR 里补上 {kind:'thank-you',...}。但 objectui 的 wizard 分步渲染器是否真的读取并执行 submitBehavior(而不仅仅是非 wizard 的简单表单)需要在 objectui 侧核实。

B2. 详情页 "Overdue Nd" 相对日期格式化器不区分字段语义

Task Detail 的 START DATE 套用了逾期相对时间格式化器,渲染成 "Overdue 6d"。框架侧 Field.date()RecordDetailsProps 都没有任何"这是开始日期/截止日期"的语义区分或按字段覆盖格式化器的能力——这个格式化器完全实现在 objectui 的日期单元格渲染器里,需要按字段角色(due vs. start/end)区分,而不是简单地对"日期 < 今天"一律套用 "Overdue"。

C2. Work Map 默认 MapLibre style 指向 demotiles.maplibre.org,无降级态

框架侧(examples/app-showcasepackages/spec/src/ui/view.zod.ts)完全没有 map style/tile server 的配置项——默认 style URL 和加载失败降级态都在 objectui 的地图渲染组件里硬编码。建议:objectui 侧加载失败时显示明确降级提示;可选地在 framework 侧的 MapViewSchema 加一个 style/tileServer 配置项,让上层能传入自定义 style。

C3. console bundle 内置的 Sentry 上报离线时持续重试,无开关

框架自身运行时(@objectstack/runtimeErrorReporter)对遥测完全是可选注入、默认 no-op。重试的 Sentry 调用编译在 vendored @object-ui/console SPA 里,这个仓库里甚至没有构建产物(packages/console 只有 stub package.json)。需要在 objectui 侧的 Sentry 初始化加一个默认关闭的开关(OSS/dev 模式下默认不上报,或至少不无限重试)。

D(残留). Command Center 图表在 1440px 下被挤到 ~130px 宽;坐标轴/图例显示原始字段名与原始枚举值

examples/app-showcase/src/pages/command-center.page.ts 的 SDUI 布局本身用的是标准 display:grid, gridTemplateColumns:'repeat(3, minmax(0,1fr))',看起来是正确的;数据集 label(chart-gallery.dataset.ts)和选项 label(project.object.ts 的 health 选项)也都已经是人类可读文案,后端 AnalyticsService.resolveDimensionLabels() 也已把维度值解析成显示文本并附带 fields[].label(有单测覆盖)。如果实际渲染仍然出现窄图表和原始字段名/枚举值,问题出在 objectui 的 SDUI type:'flex' 组件渲染(可能是内联 display:'flex' 覆盖了 responsiveStyles 编译出的 display:grid 规则)和图表组件未读取已解析的 fields[].label/行数据,而不是这个页面的配置。
框架侧已加上 showcase_command_center 的 e2e 冒烟覆盖(#2616 修复 PR 的 showcase-smoke.spec.ts),并把图表宽度断言从 >0 收紧到 >200,后续如果这个渲染 bug 还在,CI 会失败并指向这里。

E(残留). AuthProvider 加载 organizations 失败告警 + useAgents 每次导航重复请求 + 组件注册表 bare-name fallback 告警

  • GET /api/v1/auth/organization/list 服务端早已默认启用 organization 插件(packages/plugins/plugin-auth/src/auth-manager.ts,避免 404),但 [AuthProvider] Failed to load organizations 字符串和该 fetch 的 abort/取消逻辑完全不在本仓——在 objectui 的 AuthProvider(可能是 effect cleanup 或路由切换取消了 fetch)。
  • useAgents 在 objectui 的 @object-ui/plugin-chatbot 里,每次导航重复请求 /ai/agents,缺少缓存/去重(framework 侧已把该端点在未配置 AI 服务时的响应从 404 改成 200 {agents:[]},见 Showcase 全链路浏览器 UX 测试:5 个 Bug + 交互/视觉/离线健壮性改进清单 #2616 修复 PR,但重复请求本身是客户端缓存问题)。
  • field:time / field:address / view:calendar / view:timeline / plugin-charts:chart 的 "bare-name fallback" 告警来自 objectui 的 @object-ui/coreComponentRegistry(packages/core/src/registry/Registry.ts),本仓完全没有这个注册表的实现,只有 ADR-0026 描述的 registerFieldType/registerViewType/registerWidget 契约。

关联:#2616(本 issue 汇总了该 issue 里判定为 objectui 归属、本仓无法直接修复的部分)。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions