fix(role): 优化角色资源树选中ID处理逻辑

This commit is contained in:
caozehui
2026-05-15 13:16:14 +08:00
parent 14e0502d16
commit 3ad30b4f39
3 changed files with 103 additions and 18 deletions

View File

@@ -1,12 +1,14 @@
import assert from 'node:assert/strict';
import { describe, it } from 'node:test';
import { resolveRoleMenuSubmitIds } from '../src/views/system/role/modules/role-resource-tree';
import * as roleResourceTree from '../src/views/system/role/modules/role-resource-tree';
type MenuNode = {
id: string;
children?: MenuNode[];
};
type NormalizeRoleMenuCheckedIds = (input: { menuTree: MenuNode[]; checkedIds: string[] }) => string[];
const menuTree: MenuNode[] = [
{
id: 'personal',
@@ -27,14 +29,18 @@ const menuTree: MenuNode[] = [
}
];
const normalizeRoleMenuCheckedIds = (roleResourceTree as { normalizeRoleMenuCheckedIds?: NormalizeRoleMenuCheckedIds })
.normalizeRoleMenuCheckedIds;
const { resolveRoleMenuSubmitIds } = roleResourceTree;
describe('resolveRoleMenuSubmitIds', () => {
it('keeps original ids when there is no user interaction', () => {
const result = resolveRoleMenuSubmitIds({
menuTree,
baselineIds: ['weekly', 'monthly'],
dirtyIds: [],
checkedIds: ['personal', 'weekly', 'monthly'],
halfCheckedIds: []
checkedIds: ['personal', 'weekly', 'monthly']
});
assert.deepEqual(result, ['weekly', 'monthly']);
@@ -45,8 +51,7 @@ describe('resolveRoleMenuSubmitIds', () => {
menuTree,
baselineIds: ['weekly', 'monthly'],
dirtyIds: ['stateMachine'],
checkedIds: ['personal', 'weekly', 'monthly', 'stateMachine'],
halfCheckedIds: ['infra']
checkedIds: ['personal', 'weekly', 'monthly', 'stateMachine']
});
assert.deepEqual(result, ['weekly', 'monthly', 'stateMachine']);
@@ -57,8 +62,7 @@ describe('resolveRoleMenuSubmitIds', () => {
menuTree,
baselineIds: ['personal'],
dirtyIds: ['weekly'],
checkedIds: ['personal', 'weekly', 'weeklyDetail'],
halfCheckedIds: []
checkedIds: ['personal', 'weekly', 'weeklyDetail']
});
assert.deepEqual(result, ['personal', 'weekly', 'weeklyDetail']);
@@ -69,10 +73,44 @@ describe('resolveRoleMenuSubmitIds', () => {
menuTree,
baselineIds: ['monthly'],
dirtyIds: ['weeklyDetail'],
checkedIds: ['personal', 'weekly', 'weeklyDetail', 'monthly', 'monthlyDetail'],
halfCheckedIds: []
checkedIds: ['personal', 'weekly', 'weeklyDetail', 'monthly', 'monthlyDetail']
});
assert.deepEqual(result, ['weeklyDetail', 'monthly']);
});
it('does not submit half-checked parent ids when a fully authorized branch becomes partial', () => {
const result = resolveRoleMenuSubmitIds({
menuTree,
baselineIds: ['personal'],
dirtyIds: ['monthlyDetail'],
checkedIds: ['weekly', 'weeklyDetail']
});
assert.deepEqual(result, ['weekly', 'weeklyDetail']);
});
});
describe('normalizeRoleMenuCheckedIds', () => {
it('removes partially covered parent ids before tree rendering', () => {
assert.equal(typeof normalizeRoleMenuCheckedIds, 'function');
const result = normalizeRoleMenuCheckedIds?.({
menuTree,
checkedIds: ['personal', 'weekly', 'weeklyDetail']
});
assert.deepEqual(result, ['weekly', 'weeklyDetail']);
});
it('keeps parent ids when the backend uses a parent-only full-branch representation', () => {
assert.equal(typeof normalizeRoleMenuCheckedIds, 'function');
const result = normalizeRoleMenuCheckedIds?.({
menuTree,
checkedIds: ['personal']
});
assert.deepEqual(result, ['personal']);
});
});