ObjectStack UI 协议——使用 ObjectStack 规范设计用户界面的专家指引。该技能覆盖视图(列表、表单、看板、日历等)、应用导航、仪表盘、报表与动作。
【视图类型】 列表视图包含:grid(标准数据表,多数对象的默认)、kanban(状态驱动看板)、gallery(卡片瀑布流)、calendar(日期排程)、timeline(时间线)、gantt(带依赖跟踪的项目管理)、map(地理空间记录)、chart(对象聚合迷你图)、tree(自引用层级树)。 表单视图包含:simple(单页表单,适合不超过 15 个字段)、tabbed(多分组复杂对象的分页签)、wizard(分步引导录入,如入职、申请)。
【主子表单】录入一条记录连同其子行(发票+行项目、项目+任务)并原子保存,几乎无需自定义页面或表单配置。优先顺序为:1)关系层 inlineEdit(默认,零 UI 配置),在数据模型中子对象的 master_detail 字段上声明 inlineEdit,父对象所有标准新建/编辑表单会自动渲染子项并通过 /api/v1/batch 原子保存;2)表单视图 subforms(覆盖/调优),仅在需要覆盖派生列/顺序或暴露关系未标记的子项时使用;3)object-master-detail-form 页面块(定制布局)。行项目网格为电子表格式编辑器,尾部始终存在 ghost 行,因此不要添加“Add line”按钮;autofill: false 可让某列退出自动填充;表单的 taxRateField 覆盖驱动总计的父字段。
【详情页关联列表】每个子关系默认显示为关联列表(优先 owned master_detail 子项)。relatedList: 'primary' 标记核心关系并提升为独立页签;relatedList: false 抑制噪声子项;relatedListTitle / relatedListColumns 可覆盖标题与列。
【表单字段条件规则】visibleWhen、readonlyWhen、requiredWhen 声明在数据模型字段上,而非表单视图。inline 主子网格逐行评估这些规则。requiredWhen 的别名 conditionalRequired 在协议 17 已移除。
【应用导航】一个 App 将对象、仪表盘、报表和自定义页面组织为导航树。用 App.create({...}) 构建。每个 type: 'app' 包只能有一个 App。导航项类型包括 group、object、dashboard、report、page、url、action、component、doc、separator。requiresObject / requiresService 可让依赖可选对象或服务的导航项在缺失时自动隐藏。
【报表类型】tabular(扁平数据表)、summary(分组小计)、matrix(交叉透视)、joined(多块分析)。没有独立的图表报表类型,报表通过内嵌 chart: config 可视化。
【CRM UI 蓝图】提供元数据优先的结构参考:多视图对象 UI 位于 src/views/.view.ts;公开表单在 formView 中设置 sharing: { enabled: true, allowAnonymous: true, publicLink: 'slug' };应用导航在 src/apps/.app.ts;分析数据集在 src/datasets/.dataset.ts;仪表盘在 src/dashboards/.dashboard.ts;报表在 src/reports/.report.ts;记录页在 src/pages/.page.ts;用户动作在 src/actions/*.actions.ts。
【日期宏】列表视图、仪表盘、报表和页面的过滤值接受相对日期 token(如 {today}、{current_month_start}、{30_days_ago})以及会话 token {current_user_id} / {current_org_id}。过滤 token 是展示范围而非安全边界,RLS 才决定调用者可读取什么。AppContextSelector id 仅在导航 recordId / params 中解析。
【动作】六种类型:script(运行内联 L2 hook 沙箱 JS)、url(跳转内部路由或外部 URL)、modal(打开 target 指定页面)、flow(按名称启动流程)、api(调用注册的 API 端点)、form(按名称打开 FormView)。
【常见陷阱】网格视图列过多(默认建议 6–8 列);主列忘记 link: true;仪表盘控件网格放置应使用 layout: { x, y, w, h } 而非 position。
【验证】编写 *.view.ts / *.action.ts / *.dashboard.ts 后运行 os validate(或 os build)作为编写时关卡,可捕获动作/字段谓词裸字段引用(如 done 而非 record.done)以及仪表盘控件绑定未解析到已声明 dataset/field 的问题。脚手架项目中关卡为 npm run validate。
完整 Zod schema 列表见 references/_index.md,指向 node_modules/@objectstack/spec/src/,应始终阅读源码确认字段形状。