Skip to content

Commit 01ce6a2

Browse files
authored
Merge pull request #680 from actiontech/fix/optimize-permission
[fix](Member): Add role control to project administrator settings
2 parents 442aa55 + df446f2 commit 01ce6a2

File tree

11 files changed

+97
-6
lines changed

11 files changed

+97
-6
lines changed

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +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 { mockUsePermission } from '@actiontech/shared/lib/testUtil/mockHook/mockUsePermission';
2425

2526
jest.mock('react-redux', () => ({
2627
...jest.requireActual('react-redux'),
@@ -45,6 +46,14 @@ describe('base/Member/Drawer/AddMember', () => {
4546
);
4647
mockUseDbServiceDriver();
4748
mockUseCurrentProject();
49+
mockUsePermission(
50+
{
51+
checkActionPermission: jest.fn().mockReturnValue(true)
52+
},
53+
{
54+
useSpyOnMockHooks: true
55+
}
56+
);
4857
jest.useFakeTimers();
4958
addMemberSpy = member.addMember();
5059
listUsersSpy = userCenter.getUserList();

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +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 { mockUsePermission } from '@actiontech/shared/lib/testUtil/mockHook/mockUsePermission';
2324

2425
jest.mock('react-redux', () => ({
2526
...jest.requireActual('react-redux'),
@@ -47,6 +48,14 @@ describe('base/Member/Drawer/UpdateMember', () => {
4748
);
4849
mockUseDbServiceDriver();
4950
mockUseCurrentProject();
51+
mockUsePermission(
52+
{
53+
checkActionPermission: jest.fn().mockReturnValue(true)
54+
},
55+
{
56+
useSpyOnMockHooks: true
57+
}
58+
);
5059
jest.useFakeTimers();
5160
updateMemberSpy = member.updateMember();
5261
listUsersSpy = userCenter.getUserList();

packages/base/src/page/Member/Drawer/Member/__tests__/__snapshots__/MemberForm.test.tsx.snap

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,8 @@ exports[`base/Member/Drawer/MemberForm should match snapshot when isUpdate is fa
165165
>
166166
<button
167167
aria-checked="false"
168-
class="ant-switch basic-switch-wrapper css-g6dhbn"
168+
class="ant-switch basic-switch-wrapper css-g6dhbn ant-switch-disabled"
169+
disabled=""
169170
id="isProjectAdmin"
170171
role="switch"
171172
type="button"
@@ -445,7 +446,8 @@ exports[`base/Member/Drawer/MemberForm should match snapshot when isUpdate is tr
445446
>
446447
<button
447448
aria-checked="false"
448-
class="ant-switch basic-switch-wrapper css-g6dhbn"
449+
class="ant-switch basic-switch-wrapper css-g6dhbn ant-switch-disabled"
450+
disabled=""
449451
id="isProjectAdmin"
450452
role="switch"
451453
type="button"

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +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 { mockUsePermission } from '@actiontech/shared/lib/testUtil/mockHook/mockUsePermission';
2425

2526
jest.mock('react-redux', () => ({
2627
...jest.requireActual('react-redux'),
@@ -44,6 +45,14 @@ describe('base/Member/Drawer/AddMemberGroup', () => {
4445
);
4546
mockUseDbServiceDriver();
4647
mockUseCurrentProject();
48+
mockUsePermission(
49+
{
50+
checkActionPermission: jest.fn().mockReturnValue(true)
51+
},
52+
{
53+
useSpyOnMockHooks: true
54+
}
55+
);
4756
jest.useFakeTimers();
4857
addMemberGroupSpy = member.addMemberGroup();
4958
listUsersSpy = userCenter.getUserList();

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +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 { mockUsePermission } from '@actiontech/shared/lib/testUtil/mockHook/mockUsePermission';
2021

2122
jest.mock('react-redux', () => ({
2223
...jest.requireActual('react-redux'),
@@ -43,6 +44,14 @@ describe('base/Member/Drawer/UpdateMemberGroup', () => {
4344
);
4445
mockUseDbServiceDriver();
4546
mockUseCurrentProject();
47+
mockUsePermission(
48+
{
49+
checkActionPermission: jest.fn().mockReturnValue(true)
50+
},
51+
{
52+
useSpyOnMockHooks: true
53+
}
54+
);
4655
jest.useFakeTimers();
4756
updateMemberGroup = member.updateMemberGroup();
4857
listUsersSpy = userCenter.getUserList();

packages/base/src/page/Member/Drawer/MemberGroup/__tests__/__snapshots__/MemberGroupForm.test.tsx.snap

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,8 @@ exports[`base/Member/Drawer/MemberGroupForm should match snapshot when isUpdate
188188
>
189189
<button
190190
aria-checked="false"
191-
class="ant-switch basic-switch-wrapper css-g6dhbn"
191+
class="ant-switch basic-switch-wrapper css-g6dhbn ant-switch-disabled"
192+
disabled=""
192193
id="isProjectAdmin"
193194
role="switch"
194195
type="button"
@@ -491,7 +492,8 @@ exports[`base/Member/Drawer/MemberGroupForm should match snapshot when isUpdate
491492
>
492493
<button
493494
aria-checked="false"
494-
class="ant-switch basic-switch-wrapper css-g6dhbn"
495+
class="ant-switch basic-switch-wrapper css-g6dhbn ant-switch-disabled"
496+
disabled=""
495497
id="isProjectAdmin"
496498
role="switch"
497499
type="button"

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

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +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 { usePermission, PERMISSIONS } from '@actiontech/shared/lib/features';
2627

2728
type PermissionFieldsProps = {
2829
projectID: string;
@@ -33,6 +34,8 @@ const PermissionFields: React.FC<PermissionFieldsProps> = ({ projectID }) => {
3334

3435
const isProjectAdmin = Form.useWatch('isProjectAdmin');
3536

37+
const { checkActionPermission } = usePermission();
38+
3639
const {
3740
loading: getRoleListLoading,
3841
updateRoleList,
@@ -68,7 +71,13 @@ const PermissionFields: React.FC<PermissionFieldsProps> = ({ projectID }) => {
6871
valuePropName="checked"
6972
initialValue={false}
7073
>
71-
<BasicSwitch />
74+
<BasicSwitch
75+
disabled={
76+
!checkActionPermission(
77+
PERMISSIONS.ACTIONS.BASE.MEMBER.SWITCH_PROJECT_MANAGER
78+
)
79+
}
80+
/>
7281
</Form.Item>
7382
<EmptyBox if={isProjectAdmin}>
7483
<Alert

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

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,18 +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 { mockUsePermission } from '@actiontech/shared/lib/testUtil/mockHook/mockUsePermission';
910

1011
describe('base/Member/components/PermissionFields', () => {
1112
let litDBServices: jest.SpyInstance;
1213
let listRoleSpy: jest.SpyInstance;
1314
let opPermissionListSpy: jest.SpyInstance;
15+
const checkActionPermissionSpy = jest.fn();
1416

1517
beforeEach(() => {
1618
mockUseDbServiceDriver();
1719
jest.useFakeTimers();
1820
litDBServices = dbServices.ListDBServicesTips();
1921
listRoleSpy = userCenter.getRoleList();
2022
opPermissionListSpy = userCenter.getOpPermissionsList();
23+
mockUsePermission(
24+
{
25+
checkActionPermission: checkActionPermissionSpy
26+
},
27+
{
28+
useSpyOnMockHooks: true
29+
}
30+
);
31+
checkActionPermissionSpy.mockReturnValue(true);
2132
});
2233

2334
afterEach(() => {
@@ -57,4 +68,18 @@ describe('base/Member/components/PermissionFields', () => {
5768
screen.getByText('项目管理员默认拥有项目下所有管理权限')
5869
).toBeInTheDocument();
5970
});
71+
72+
it('should disable project admin switch when checkActionPermission return false', async () => {
73+
checkActionPermissionSpy.mockReturnValue(false);
74+
75+
const { container } = superRender(
76+
<Form>
77+
<PermissionFields projectID={mockProjectInfo.projectID} />
78+
</Form>
79+
);
80+
await act(async () => jest.advanceTimersByTime(3000));
81+
82+
const switchElement = container.querySelector('.ant-switch');
83+
expect(switchElement).toHaveClass('ant-switch-disabled');
84+
});
6085
});

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]: {

0 commit comments

Comments
 (0)