Skip to content

fix: add/remove manage permission #4427

New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

Merged
merged 4 commits into from
Apr 9, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .github/workflows/fastgpt-test.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,9 @@ jobs:

steps:
- uses: actions/checkout@v4
with:
ref: ${{ github.event.pull_request.head.ref }}
repository: ${{ github.event.pull_request.head.repo.full_name }}
- uses: pnpm/action-setup@v4
with:
version: 10
Expand Down
9 changes: 6 additions & 3 deletions packages/global/support/permission/collaborator.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,15 @@ export type CollaboratorItemType = {
orgId: string;
}>;

export type UpdateClbPermissionProps = {
export type UpdateClbPermissionProps<addOnly = false> = {
members?: string[];
groups?: string[];
orgs?: string[];
permission: PermissionValueType;
};
} & (addOnly extends true
? {}
: {
permission: PermissionValueType;
});

export type DeletePermissionQuery = RequireOnlyOne<{
tmbId?: string;
Expand Down
4 changes: 4 additions & 0 deletions packages/global/support/permission/controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -74,4 +74,8 @@ export class Permission {
this.hasWritePer = this.checkPer(this._permissionList['write'].value);
this.hasReadPer = this.checkPer(this._permissionList['read'].value);
}

toBinary() {
return this.value.toString(2);
}
}
10 changes: 5 additions & 5 deletions packages/global/support/permission/user/constant.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,29 +15,29 @@ export const TeamPermissionList: PermissionListType<TeamPermissionKeyEnum> = {
},
[PermissionKeyEnum.write]: {
...PermissionList[PermissionKeyEnum.write],
value: 0b000110
value: 0b000010
},
[PermissionKeyEnum.manage]: {
...PermissionList[PermissionKeyEnum.manage],
value: 0b000101
value: 0b000001
},
[TeamPermissionKeyEnum.appCreate]: {
checkBoxType: 'multiple',
description: '',
name: i18nT('account_team:permission_appCreate'),
value: 0b001100
value: 0b001000
},
[TeamPermissionKeyEnum.datasetCreate]: {
checkBoxType: 'multiple',
description: '',
name: i18nT('account_team:permission_datasetCreate'),
value: 0b010100
value: 0b010000
},
[TeamPermissionKeyEnum.apikeyCreate]: {
checkBoxType: 'multiple',
description: '',
name: i18nT('account_team:permission_apikeyCreate'),
value: 0b100100
value: 0b100000
}
};

Expand Down
18 changes: 17 additions & 1 deletion packages/global/support/permission/user/controller.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
import { PerConstructPros, Permission } from '../controller';
import { TeamDefaultPermissionVal, TeamPermissionList } from './constant';
import {
TeamAppCreatePermissionVal,
TeamDefaultPermissionVal,
TeamPermissionList
} from './constant';

export class TeamPermission extends Permission {
constructor(props?: PerConstructPros) {
Expand All @@ -13,4 +17,16 @@ export class TeamPermission extends Permission {
props.permissionList = TeamPermissionList;
super(props);
}

hasAppCreatePer() {
return this.checkPer(TeamAppCreatePermissionVal);
}

hasDatasetCreatePer() {
return this.checkPer(TeamAppCreatePermissionVal);
}

hasApikeyCreatePer() {
return this.checkPer(TeamAppCreatePermissionVal);
}
}
3 changes: 2 additions & 1 deletion packages/web/i18n/en/user.json
Original file line number Diff line number Diff line change
Expand Up @@ -111,5 +111,6 @@
"team.manage_collaborators": "Manage Collaborators",
"team.no_collaborators": "No Collaborators",
"team.org.org": "Organization",
"team.write_role_member": "Write Permission"
"team.write_role_member": "Write Permission",
"team.collaborator.added": "Added"
}
3 changes: 2 additions & 1 deletion packages/web/i18n/zh-CN/user.json
Original file line number Diff line number Diff line change
Expand Up @@ -110,5 +110,6 @@
"team.manage_collaborators": "管理协作者",
"team.no_collaborators": "暂无协作者",
"team.org.org": "部门",
"team.write_role_member": "可写权限"
"team.write_role_member": "可写权限",
"team.collaborator.added": "已添加"
}
3 changes: 2 additions & 1 deletion packages/web/i18n/zh-Hant/user.json
Original file line number Diff line number Diff line change
Expand Up @@ -111,5 +111,6 @@
"team.manage_collaborators": "管理協作者",
"team.no_collaborators": "目前沒有協作者",
"team.org.org": "組織",
"team.write_role_member": "可寫入權限"
"team.write_role_member": "可寫入權限",
"team.collaborator.added": "已添加"
}
Original file line number Diff line number Diff line change
@@ -1,20 +1,24 @@
import React from 'react';
import { useTranslation } from 'next-i18next';
import { Box, Checkbox, HStack, VStack } from '@chakra-ui/react';
import Avatar from '@fastgpt/web/components/common/Avatar';
import PermissionTags from './PermissionTags';
import { PermissionValueType } from '@fastgpt/global/support/permission/type';
import MyIcon from '@fastgpt/web/components/common/Icon';
import OrgTags from '../../user/team/OrgTags';
import Tag from '@fastgpt/web/components/common/Tag';

function MemberItemCard({
avatar,
key,
onChange,
onChange: _onChange,
isChecked,
onDelete,
name,
permission,
orgs
orgs,
addOnly,
rightSlot
}: {
avatar: string;
key: string;
Expand All @@ -23,44 +27,66 @@ function MemberItemCard({
onDelete?: () => void;
name: string;
permission?: PermissionValueType;
addOnly?: boolean;
orgs?: string[];
rightSlot?: React.ReactNode;
}) {
const isAdded = addOnly && !!permission;
const onChange = () => {
if (!isAdded) _onChange();
};
const { t } = useTranslation();
return (
<>
<HStack
justifyContent="space-between"
alignItems="center"
key={key}
px="3"
py="2"
borderRadius="sm"
_hover={{
bgColor: 'myGray.50',
cursor: 'pointer'
}}
onClick={onChange}
>
{isChecked !== undefined && <Checkbox isChecked={isChecked} pointerEvents="none" />}
<Avatar src={avatar} w="1.5rem" borderRadius={'50%'} />
<HStack
justifyContent="space-between"
alignItems="center"
key={key}
px="3"
py="2"
borderRadius="sm"
_hover={{
bgColor: 'myGray.50',
cursor: 'pointer'
}}
onClick={onChange}
>
{isChecked !== undefined && (
<Checkbox isChecked={isChecked} pointerEvents="none" disabled={isAdded} />
)}
<Avatar src={avatar} w="1.5rem" borderRadius={'50%'} />

<Box w="full">
<Box fontSize={'sm'}>{name}</Box>
<Box lineHeight={1}>{orgs && orgs.length > 0 && <OrgTags orgs={orgs} />}</Box>
<Box w="full">
<Box fontSize={'sm'} className="textEllipsis" maxW="300px">
{name}
</Box>
{permission && <PermissionTags permission={permission} />}
{onDelete !== undefined && (
<MyIcon
name="common/closeLight"
w="1rem"
cursor={'pointer'}
_hover={{
color: 'red.600'
}}
onClick={onDelete}
/>
)}
</HStack>
</>
<Box lineHeight={1}>{orgs && orgs.length > 0 && <OrgTags orgs={orgs} />}</Box>
</Box>
{!isAdded && permission && <PermissionTags permission={permission} />}
{isAdded && (
<Tag
mixBlendMode={'multiply'}
colorSchema="blue"
border="none"
py={2}
px={3}
fontSize={'xs'}
>
{t('user:team.collaborator.added')}
</Tag>
)}
{onDelete !== undefined && (
<MyIcon
name="common/closeLight"
w="1rem"
cursor={'pointer'}
_hover={{
color: 'red.600'
}}
onClick={onDelete}
/>
)}
{rightSlot}
</HStack>
);
}

Expand Down
Loading
Loading