Skip to content

Commit df446f2

Browse files
committed
[fix](Member): Modify permission control
1 parent 564257f commit df446f2

File tree

9 files changed

+85
-121
lines changed

9 files changed

+85
-121
lines changed

packages/base/src/page/Member/Drawer/Member/__tests__/AddMember.test.tsx

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import { dbServices as dbServicesList } from '@actiontech/shared/lib/testUtil/mo
2121
import { ListMemberRoleWithOpRangeOpRangeTypeEnum } from '@actiontech/shared/lib/api/base/service/common.enum';
2222
import { createSpySuccessResponse } from '@actiontech/shared/lib/testUtil/mockApi';
2323
import { memberProjectPermissions } from '@actiontech/shared/lib/testUtil/mockApi/base/member/data';
24-
import { mockUseCurrentUser } from '@actiontech/shared/lib/testUtil/mockHook/mockUseCurrentUser';
24+
import { mockUsePermission } from '@actiontech/shared/lib/testUtil/mockHook/mockUsePermission';
2525

2626
jest.mock('react-redux', () => ({
2727
...jest.requireActual('react-redux'),
@@ -46,7 +46,14 @@ describe('base/Member/Drawer/AddMember', () => {
4646
);
4747
mockUseDbServiceDriver();
4848
mockUseCurrentProject();
49-
mockUseCurrentUser();
49+
mockUsePermission(
50+
{
51+
checkActionPermission: jest.fn().mockReturnValue(true)
52+
},
53+
{
54+
useSpyOnMockHooks: true
55+
}
56+
);
5057
jest.useFakeTimers();
5158
addMemberSpy = member.addMember();
5259
listUsersSpy = userCenter.getUserList();

packages/base/src/page/Member/Drawer/Member/__tests__/UpdateMember.test.tsx

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import { selectOptionByIndex } from '@actiontech/shared/lib/testUtil/customQuery
2020
import { ListMemberRoleWithOpRangeOpRangeTypeEnum } from '@actiontech/shared/lib/api/base/service/common.enum';
2121
import { dbServices as dbServicesList } from '@actiontech/shared/lib/testUtil/mockApi/base/dbServices/data';
2222
import { createSpySuccessResponse } from '@actiontech/shared/lib/testUtil/mockApi';
23-
import { mockUseCurrentUser } from '@actiontech/shared/lib/testUtil/mockHook/mockUseCurrentUser';
23+
import { mockUsePermission } from '@actiontech/shared/lib/testUtil/mockHook/mockUsePermission';
2424

2525
jest.mock('react-redux', () => ({
2626
...jest.requireActual('react-redux'),
@@ -48,7 +48,14 @@ describe('base/Member/Drawer/UpdateMember', () => {
4848
);
4949
mockUseDbServiceDriver();
5050
mockUseCurrentProject();
51-
mockUseCurrentUser();
51+
mockUsePermission(
52+
{
53+
checkActionPermission: jest.fn().mockReturnValue(true)
54+
},
55+
{
56+
useSpyOnMockHooks: true
57+
}
58+
);
5259
jest.useFakeTimers();
5360
updateMemberSpy = member.updateMember();
5461
listUsersSpy = userCenter.getUserList();

packages/base/src/page/Member/Drawer/MemberGroup/__tests__/AddMemberGroup.test.tsx

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import { dbServices as dbServicesList } from '@actiontech/shared/lib/testUtil/mo
2121
import { ListMemberRoleWithOpRangeOpRangeTypeEnum } from '@actiontech/shared/lib/api/base/service/common.enum';
2222
import { memberProjectPermissions } from '@actiontech/shared/lib/testUtil/mockApi/base/member/data';
2323
import { createSpySuccessResponse } from '@actiontech/shared/lib/testUtil/mockApi';
24-
import { mockUseCurrentUser } from '@actiontech/shared/lib/testUtil/mockHook/mockUseCurrentUser';
24+
import { mockUsePermission } from '@actiontech/shared/lib/testUtil/mockHook/mockUsePermission';
2525

2626
jest.mock('react-redux', () => ({
2727
...jest.requireActual('react-redux'),
@@ -45,7 +45,14 @@ describe('base/Member/Drawer/AddMemberGroup', () => {
4545
);
4646
mockUseDbServiceDriver();
4747
mockUseCurrentProject();
48-
mockUseCurrentUser();
48+
mockUsePermission(
49+
{
50+
checkActionPermission: jest.fn().mockReturnValue(true)
51+
},
52+
{
53+
useSpyOnMockHooks: true
54+
}
55+
);
4956
jest.useFakeTimers();
5057
addMemberGroupSpy = member.addMemberGroup();
5158
listUsersSpy = userCenter.getUserList();

packages/base/src/page/Member/Drawer/MemberGroup/__tests__/UpdateMemberGroup.test.tsx

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import {
1717
memberProjectPermissions
1818
} from '@actiontech/shared/lib/testUtil/mockApi/base/member/data';
1919
import { createSpySuccessResponse } from '@actiontech/shared/lib/testUtil/mockApi';
20-
import { mockUseCurrentUser } from '@actiontech/shared/lib/testUtil/mockHook/mockUseCurrentUser';
20+
import { mockUsePermission } from '@actiontech/shared/lib/testUtil/mockHook/mockUsePermission';
2121

2222
jest.mock('react-redux', () => ({
2323
...jest.requireActual('react-redux'),
@@ -44,7 +44,14 @@ describe('base/Member/Drawer/UpdateMemberGroup', () => {
4444
);
4545
mockUseDbServiceDriver();
4646
mockUseCurrentProject();
47-
mockUseCurrentUser();
47+
mockUsePermission(
48+
{
49+
checkActionPermission: jest.fn().mockReturnValue(true)
50+
},
51+
{
52+
useSpyOnMockHooks: true
53+
}
54+
);
4855
jest.useFakeTimers();
4956
updateMemberGroup = member.updateMemberGroup();
5057
listUsersSpy = userCenter.getUserList();

packages/base/src/page/Member/components/PermissionFields.tsx

Lines changed: 10 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import {
66
BasicSwitch,
77
EmptyBox
88
} from '@actiontech/shared';
9-
import { useEffect, useMemo } from 'react';
9+
import { useEffect } from 'react';
1010
import { useTranslation } from 'react-i18next';
1111
import useRole from '../../../hooks/useRole';
1212
import useDbService from '../../../hooks/useDbService';
@@ -23,11 +23,7 @@ import {
2323
import { PlusCircleFilled, MinusCircleFilled } from '@actiontech/icons';
2424
import { ListOpPermissionsFilterByTargetEnum } from '@actiontech/shared/lib/api/base/service/OpPermission/index.enum';
2525
import useOpPermission from '../../../hooks/useOpPermission';
26-
import {
27-
useCurrentUser,
28-
useCurrentProject
29-
} from '@actiontech/shared/lib/features';
30-
import { SystemRole } from '@actiontech/shared/lib/enum';
26+
import { usePermission, PERMISSIONS } from '@actiontech/shared/lib/features';
3127

3228
type PermissionFieldsProps = {
3329
projectID: string;
@@ -38,17 +34,7 @@ const PermissionFields: React.FC<PermissionFieldsProps> = ({ projectID }) => {
3834

3935
const isProjectAdmin = Form.useWatch('isProjectAdmin');
4036

41-
const { projectName } = useCurrentProject();
42-
43-
const { isAdmin, isProjectManager, userRoles } = useCurrentUser();
44-
45-
const allowSwitchProjectAdmin = useMemo(() => {
46-
return (
47-
isAdmin ||
48-
isProjectManager(projectName) ||
49-
userRoles[SystemRole.systemAdministrator]
50-
);
51-
}, [isAdmin, isProjectManager, projectName, userRoles]);
37+
const { checkActionPermission } = usePermission();
5238

5339
const {
5440
loading: getRoleListLoading,
@@ -85,7 +71,13 @@ const PermissionFields: React.FC<PermissionFieldsProps> = ({ projectID }) => {
8571
valuePropName="checked"
8672
initialValue={false}
8773
>
88-
<BasicSwitch disabled={!allowSwitchProjectAdmin} />
74+
<BasicSwitch
75+
disabled={
76+
!checkActionPermission(
77+
PERMISSIONS.ACTIONS.BASE.MEMBER.SWITCH_PROJECT_MANAGER
78+
)
79+
}
80+
/>
8981
</Form.Item>
9082
<EmptyBox if={isProjectAdmin}>
9183
<Alert

packages/base/src/page/Member/components/__tests__/PermissionFields.test.tsx

Lines changed: 21 additions & 94 deletions
Original file line numberDiff line numberDiff line change
@@ -6,26 +6,29 @@ import dbServices from '@actiontech/shared/lib/testUtil/mockApi/base/dbServices'
66
import PermissionFields from '../PermissionFields';
77
import { mockProjectInfo } from '@actiontech/shared/lib/testUtil/mockHook/data';
88
import { Form } from 'antd';
9-
import { mockUseCurrentUser } from '@actiontech/shared/lib/testUtil/mockHook/mockUseCurrentUser';
10-
import { mockUseCurrentProject } from '@actiontech/shared/lib/testUtil/mockHook/mockUseCurrentProject';
11-
import { SystemRole } from '@actiontech/shared/lib/enum';
12-
import { mockCurrentUserReturn } from '@actiontech/shared/lib/testUtil/mockHook/data';
9+
import { mockUsePermission } from '@actiontech/shared/lib/testUtil/mockHook/mockUsePermission';
1310

1411
describe('base/Member/components/PermissionFields', () => {
1512
let litDBServices: jest.SpyInstance;
1613
let listRoleSpy: jest.SpyInstance;
1714
let opPermissionListSpy: jest.SpyInstance;
18-
let useCurrentUserSpy: jest.SpyInstance;
19-
let useCurrentProjectSpy: jest.SpyInstance;
15+
const checkActionPermissionSpy = jest.fn();
2016

2117
beforeEach(() => {
2218
mockUseDbServiceDriver();
2319
jest.useFakeTimers();
2420
litDBServices = dbServices.ListDBServicesTips();
2521
listRoleSpy = userCenter.getRoleList();
2622
opPermissionListSpy = userCenter.getOpPermissionsList();
27-
useCurrentUserSpy = mockUseCurrentUser();
28-
useCurrentProjectSpy = mockUseCurrentProject();
23+
mockUsePermission(
24+
{
25+
checkActionPermission: checkActionPermissionSpy
26+
},
27+
{
28+
useSpyOnMockHooks: true
29+
}
30+
);
31+
checkActionPermissionSpy.mockReturnValue(true);
2932
});
3033

3134
afterEach(() => {
@@ -66,93 +69,17 @@ describe('base/Member/components/PermissionFields', () => {
6669
).toBeInTheDocument();
6770
});
6871

69-
describe('allowSwitchProjectAdmin logic', () => {
70-
it('should enable project admin switch when user is admin', async () => {
71-
useCurrentUserSpy.mockImplementation(() => ({
72-
...mockCurrentUserReturn,
73-
isAdmin: true,
74-
isProjectManager: jest.fn().mockReturnValue(false),
75-
userRoles: {
76-
...mockCurrentUserReturn.userRoles,
77-
[SystemRole.systemAdministrator]: false
78-
}
79-
}));
80-
81-
const { container } = superRender(
82-
<Form>
83-
<PermissionFields projectID={mockProjectInfo.projectID} />
84-
</Form>
85-
);
86-
await act(async () => jest.advanceTimersByTime(3000));
87-
88-
const switchElement = container.querySelector('.ant-switch');
89-
expect(switchElement).not.toHaveClass('ant-switch-disabled');
90-
});
91-
92-
it('should enable project admin switch when user is project manager', async () => {
93-
useCurrentUserSpy.mockImplementation(() => ({
94-
...mockCurrentUserReturn,
95-
isAdmin: false,
96-
isProjectManager: jest.fn().mockReturnValue(true),
97-
userRoles: {
98-
...mockCurrentUserReturn.userRoles,
99-
[SystemRole.systemAdministrator]: false
100-
}
101-
}));
102-
103-
const { container } = superRender(
104-
<Form>
105-
<PermissionFields projectID={mockProjectInfo.projectID} />
106-
</Form>
107-
);
108-
await act(async () => jest.advanceTimersByTime(3000));
109-
110-
const switchElement = container.querySelector('.ant-switch');
111-
expect(switchElement).not.toHaveClass('ant-switch-disabled');
112-
});
113-
114-
it('should enable project admin switch when user has system administrator role', async () => {
115-
useCurrentUserSpy.mockImplementation(() => ({
116-
...mockCurrentUserReturn,
117-
isAdmin: false,
118-
isProjectManager: jest.fn().mockReturnValue(false),
119-
userRoles: {
120-
...mockCurrentUserReturn.userRoles,
121-
[SystemRole.systemAdministrator]: true
122-
}
123-
}));
124-
125-
const { container } = superRender(
126-
<Form>
127-
<PermissionFields projectID={mockProjectInfo.projectID} />
128-
</Form>
129-
);
130-
await act(async () => jest.advanceTimersByTime(3000));
72+
it('should disable project admin switch when checkActionPermission return false', async () => {
73+
checkActionPermissionSpy.mockReturnValue(false);
13174

132-
const switchElement = container.querySelector('.ant-switch');
133-
expect(switchElement).not.toHaveClass('ant-switch-disabled');
134-
});
135-
136-
it('should disable project admin switch when user has no admin permissions', async () => {
137-
useCurrentUserSpy.mockImplementation(() => ({
138-
...mockCurrentUserReturn,
139-
isAdmin: false,
140-
isProjectManager: jest.fn().mockReturnValue(false),
141-
userRoles: {
142-
...mockCurrentUserReturn.userRoles,
143-
[SystemRole.systemAdministrator]: false
144-
}
145-
}));
146-
147-
const { container } = superRender(
148-
<Form>
149-
<PermissionFields projectID={mockProjectInfo.projectID} />
150-
</Form>
151-
);
152-
await act(async () => jest.advanceTimersByTime(3000));
75+
const { container } = superRender(
76+
<Form>
77+
<PermissionFields projectID={mockProjectInfo.projectID} />
78+
</Form>
79+
);
80+
await act(async () => jest.advanceTimersByTime(3000));
15381

154-
const switchElement = container.querySelector('.ant-switch');
155-
expect(switchElement).toHaveClass('ant-switch-disabled');
156-
});
82+
const switchElement = container.querySelector('.ant-switch');
83+
expect(switchElement).toHaveClass('ant-switch-disabled');
15784
});
15885
});

packages/shared/lib/features/usePermission/__tests__/__snapshots__/index.test.ts.snap

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ exports[`usePermission should match snapshot 1`] = `
5151
"EDIT_MEMBER": "action:edit_member",
5252
"EDIT_MEMBER_GROUP": "action:edit_member_group",
5353
"MANAGE_MEMBER_GROUP": "action:manage_member_group",
54+
"SWITCH_PROJECT_MANAGER": "action:switch_project_manager",
5455
},
5556
"NAV": {
5657
"EDIT_SYSTEM_NOTICE": "action: edit_system_notice",
@@ -1480,6 +1481,15 @@ exports[`usePermission should match snapshot 2`] = `
14801481
],
14811482
"type": "action",
14821483
},
1484+
"action:switch_project_manager": {
1485+
"id": "action:switch_project_manager",
1486+
"projectManager": true,
1487+
"role": [
1488+
"admin",
1489+
"systemAdministrator",
1490+
],
1491+
"type": "action",
1492+
},
14831493
"action:sync_task": {
14841494
"id": "action:sync_task",
14851495
"role": [

packages/shared/lib/features/usePermission/permissionManifest.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -596,6 +596,12 @@ export const PERMISSION_MANIFEST: Record<
596596
projectArchived: false,
597597
projectPermission: OpPermissionItemOpPermissionTypeEnum.manage_member
598598
},
599+
[PERMISSIONS.ACTIONS.BASE.MEMBER.SWITCH_PROJECT_MANAGER]: {
600+
id: PERMISSIONS.ACTIONS.BASE.MEMBER.SWITCH_PROJECT_MANAGER,
601+
type: 'action',
602+
role: [SystemRole.admin, SystemRole.systemAdministrator],
603+
projectManager: true
604+
},
599605

600606
// 数据导出
601607
[PERMISSIONS.ACTIONS.BASE.DATA_EXPORT.BATCH_CLOSE]: {

packages/shared/lib/features/usePermission/permissions.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,8 @@ export const PERMISSIONS = {
106106
MANAGE_MEMBER_GROUP: 'action:manage_member_group',
107107
ADD_MEMBER_GROUP: 'action:add_member_group',
108108
EDIT_MEMBER_GROUP: 'action:edit_member_group',
109-
DELETE_MEMBER_GROUP: 'action:delete_member_group'
109+
DELETE_MEMBER_GROUP: 'action:delete_member_group',
110+
SWITCH_PROJECT_MANAGER: 'action:switch_project_manager'
110111
},
111112
DATA_EXPORT: {
112113
BATCH_CLOSE: 'action:data_export_batch_close',

0 commit comments

Comments
 (0)