升级价格 declared three reference-theme blocks through the accordion sections option, but the section builder handed the computed the whole field object instead of its sections array, so the guard always saw an empty length and the renderer silently fell back to a flat list. The three blocks ran into each other with no separation at all. - Move the section expansion into a pure buildFieldsetSections() helper so the mistake is now covered by a real contract test that runs the actual schema through it, instead of a regex over the component source. - Apply dependsOn to fields inside each block, so 天单价/促销标签 hide when 月费会员升级月费会员 is switched off, matching the flat path. - Give structured groups (会员商品/续费商品/积分兑换明细/升级价格) their own bottom margin and widen the gap between accordion blocks, so two adjacent groups no longer sit flush against each other. Verified: 657 Node contract tests passing, the admin SPA builds.
25 lines
976 B
JavaScript
25 lines
976 B
JavaScript
/**
|
|
* 把 accordion / fieldset 的 `schema.sections` 声明展开成「块标题 + 字段定义」。
|
|
*
|
|
* 参考主题把「升级价格」这类复合配置拆成若干可折叠块,每块用 keys 声明自己
|
|
* 包含哪些字段。这里是纯函数,方便在 Node 契约测试里直接用真实 schema 校验,
|
|
* 避免渲染层的一个小疏忽让整块手风琴静默退化成平铺。
|
|
*/
|
|
export function buildFieldsetSections(schema) {
|
|
const declared = schema && Array.isArray(schema.sections) ? schema.sections : []
|
|
if (!declared.length) return []
|
|
|
|
const byKey = {}
|
|
const nested = Array.isArray(schema.fields) ? schema.fields : []
|
|
for (const field of nested) {
|
|
if (field && field.key) byKey[field.key] = field
|
|
}
|
|
|
|
return declared.map((section) => ({
|
|
title: String((section && section.title) || ''),
|
|
fields: (Array.isArray(section && section.keys) ? section.keys : [])
|
|
.map((key) => byKey[key])
|
|
.filter(Boolean),
|
|
}))
|
|
}
|