feat(module-management): 导航状态化阶段二——表单设计「缺 N」徽标

- 复用既有 missingConfigCount 通用口径,新增 missingEditCount(启用字段
  未被 editConfig 任何行 b_field_id 引用的数量),子表表格编辑方式下同样成立
- configGroups 表单设计项挂「缺 N」徽标,样式与语义沿用查询配置;
  拖入画布后徽标消失
- spec 新增 4 用例:缺配计数、停用字段不计、b_field_id 类型不一致按字符串比较、空态为 0
This commit is contained in:
oneao committed 2026-08-30 20:07:56 +08:00
1 parent 4f89f373e6
commit 6bfa0d816f
3 files changed
+49 -1

No files matched your search

@@ -387,6 +387,9 @@ export function useModuleConfig(deps) {
const missingListCount = missingConfigCount('listConfig')
const missingQueryCount = missingConfigCount('queryConfig')
// 表单设计缺配:启用字段未被 editConfig 任何行引用(b_field_id 口径,
// 不涉及布局细节)。editConfig 同时承载主表表单/子表表格两种编辑方式,口径通用
const missingEditCount = missingConfigCount('editConfig')
return {
hasModuleChanges,
@@ -398,6 +401,7 @@ export function useModuleConfig(deps) {
syncFields,
missingListCount,
missingQueryCount,
missingEditCount,
fillMissingConfigs,
}
}
@@ -143,7 +143,13 @@ const configGroups = computed(() => {
// 界面配置:表单设计(数据模块,含主表表单/子表表格两种编辑方式)→ 列表配置 → 查询配置
const uiItems = []
if (isDataModule.value) {
uiItems.push({ key: 'edit', label: '表单设计', icon: Pencil })
// 表单设计缺配徽标:启用字段未布局的数量(口径与查询「缺 N」一致)
uiItems.push({
key: 'edit',
label: '表单设计',
icon: Pencil,
badge: missingEditCount.value ? `缺 ${missingEditCount.value}` : '',
})
}
// 列表配置行在加载时自动补全全部启用字段,无「缺失」概念,不带徽标
uiItems.push({ key: 'list', label: '列表配置', icon: List })
@@ -318,6 +324,7 @@ const {
syncFields,
dirtySections,
missingQueryCount,
missingEditCount,
fillMissingConfigs,
} = useModuleConfig({
moduleSelectedId,
@@ -136,3 +136,40 @@ describe('useModuleConfig 脏检查', () => {
expect(api.hasModuleChanges.value).toBe(false)
})
})
describe('useModuleConfig 缺配统计(表单设计徽标)', () => {
function configWith(fields, editConfig) {
return { module: { b_id: '1', b_module_type: 'data' }, fields, groups: [], listConfig: [], editConfig, queryConfig: [], autoCode: [], powers: [] }
}
it('启用字段未被 editConfig 引用即计入缺配', () => {
const fields = [
{ b_id: '10', b_field: 'a', b_canuse: 1 },
{ b_id: '11', b_field: 'b', b_canuse: 1 },
]
const editConfig = [{ b_id: 'e1', b_field_id: '10' }]
const { missingEditCount } = setup({ drafts: configWith(fields, editConfig), originals: configWith(fields, editConfig) })
expect(missingEditCount.value).toBe(1)
})
it('停用字段不计入缺配', () => {
const fields = [
{ b_id: '10', b_field: 'a', b_canuse: 1 },
{ b_id: '11', b_field: 'b', b_canuse: 0 },
]
const { missingEditCount } = setup({ drafts: configWith(fields, []), originals: configWith(fields, []) })
expect(missingEditCount.value).toBe(1)
})
it('b_field_id 与 b_id 类型不一致(数字/字符串)仍按字符串比较', () => {
const fields = [{ b_id: 10, b_field: 'a', b_canuse: 1 }]
const editConfig = [{ b_id: 'e1', b_field_id: '10' }]
const { missingEditCount } = setup({ drafts: configWith(fields, editConfig), originals: configWith(fields, editConfig) })
expect(missingEditCount.value).toBe(0)
})
it('无字段时缺配为 0(新建模块空态不显示徽标)', () => {
const { missingEditCount } = setup({ drafts: configWith([], []), originals: configWith([], []) })
expect(missingEditCount.value).toBe(0)
})
})