现象(P0-8/P0-20,HMR console + objectstack dev 实测,非旧 bundle 假象)
/forms/showcase_task.tabbed(authed internal mode)渲染:标题为裸名 "showcase_task.tabbed"、零字段、裸 Submit 按钮。所有 form 视图(simple/tabbed/wizard)一致。若 target 误指 list 视图(如 showcase_task.default),同样黑屏渲染且提交还会误报成功。
根因(扫码 apps/console/src/components/FormPage.tsx)
服务端 GET /api/v1/meta/view/<name> 对展平视图返回 ExpandedViewItem 形状:
{ "name": "showcase_task.tabbed", "object": "showcase_task", "viewKind": "form",
"label": "showcase_task.tabbed", "config": { "type": "tabbed", "data": {...}, "sections": [...] } }
loadInternalForm(FormPage.tsx:232-269)读的是 item?.spec ?? item 的顶层 sections/label:
spec.object 有值 → 不抛错、正常进渲染;
spec.sections 为 undefined(实际在 config.sections)→ buildSections 返回空 → 零字段 + 裸 Submit;
spec.label 是裸名 → 标题错误;
- 无
viewKind 校验 → target 解析到 list 视图时照样渲染空表单,提交 POST /data/:object 还成功(误报)。
修复方案
loadInternalForm 解包 config:const form = record.config ?? record;object 取 record.object ?? form.data?.object;label 取 form.label ?? (record.label !== name ? record.label : objectSchema.label)。
record.viewKind === 'list' 时抛出明确错误("target 是 list 视图,不是 form"),不再渲染空表单。
tabbed/wizard 的 config.sections 解包后即可退化渲染为顺序 sections(可用性 > 完美 tab UI)。
现象(P0-8/P0-20,HMR console + objectstack dev 实测,非旧 bundle 假象)
/forms/showcase_task.tabbed(authed internal mode)渲染:标题为裸名 "showcase_task.tabbed"、零字段、裸 Submit 按钮。所有 form 视图(simple/tabbed/wizard)一致。若 target 误指 list 视图(如showcase_task.default),同样黑屏渲染且提交还会误报成功。根因(扫码 apps/console/src/components/FormPage.tsx)
服务端
GET /api/v1/meta/view/<name>对展平视图返回 ExpandedViewItem 形状:{ "name": "showcase_task.tabbed", "object": "showcase_task", "viewKind": "form", "label": "showcase_task.tabbed", "config": { "type": "tabbed", "data": {...}, "sections": [...] } }loadInternalForm(FormPage.tsx:232-269)读的是item?.spec ?? item的顶层sections/label:spec.object有值 → 不抛错、正常进渲染;spec.sections为 undefined(实际在config.sections)→buildSections返回空 → 零字段 + 裸 Submit;spec.label是裸名 → 标题错误;viewKind校验 → target 解析到 list 视图时照样渲染空表单,提交 POST /data/:object 还成功(误报)。修复方案
loadInternalForm解包config:const form = record.config ?? record;object 取record.object ?? form.data?.object;label 取form.label ?? (record.label !== name ? record.label : objectSchema.label)。record.viewKind === 'list'时抛出明确错误("target 是 list 视图,不是 form"),不再渲染空表单。tabbed/wizard的config.sections解包后即可退化渲染为顺序 sections(可用性 > 完美 tab UI)。