import React, { useMemo } from 'react'; import { Box, Checkbox, HStack, Table, TableContainer, Tbody, Td, Th, Thead, Text, Tr, Flex, Button } from '@chakra-ui/react'; import { useTranslation } from 'next-i18next'; import { useRequest2 } from '@fastgpt/web/hooks/useRequest'; import { deleteMemberPermission, getTeamClbs, updateMemberPermission } from '@/web/support/user/team/api'; import { useUserStore } from '@/web/support/user/useUserStore'; import QuestionTip from '@fastgpt/web/components/common/MyTooltip/QuestionTip'; import Avatar from '@fastgpt/web/components/common/Avatar'; import MemberTag from '../../../../components/support/user/team/Info/MemberTag'; import { DefaultGroupName } from '@fastgpt/global/support/user/team/group/constant'; import { TeamManagePermissionVal, TeamPermissionList, TeamWritePermissionVal } from '@fastgpt/global/support/permission/user/constant'; import { TeamPermission } from '@fastgpt/global/support/permission/user/controller'; import { useToggle } from 'ahooks'; import MyIconButton from '@fastgpt/web/components/common/Icon/button'; import MyBox from '@fastgpt/web/components/common/MyBox'; import CollaboratorContextProvider, { CollaboratorContext } from '@/components/support/permission/MemberManager/context'; import MyIcon from '@fastgpt/web/components/common/Icon'; import { useContextSelector } from 'use-context-selector'; import { CollaboratorItemType } from '@fastgpt/global/support/permission/collaborator'; function PermissionManage({ Tabs, onOpenAddMember }: { Tabs: React.ReactNode; onOpenAddMember: () => void; }) { const { t } = useTranslation(); const { userInfo } = useUserStore(); const collaboratorList = useContextSelector( CollaboratorContext, (state) => state.collaboratorList ); const onUpdateCollaborators = useContextSelector( CollaboratorContext, (state) => state.onUpdateCollaborators ); const onDelOneCollaborator = useContextSelector( CollaboratorContext, (state) => state.onDelOneCollaborator ); const [isExpandMember, setExpandMember] = useToggle(true); const [isExpandGroup, setExpandGroup] = useToggle(true); const [isExpandOrg, setExpandOrg] = useToggle(true); const { tmbList, groupList, orgList } = useMemo(() => { const tmbList: CollaboratorItemType[] = []; const groupList: CollaboratorItemType[] = []; const orgList: CollaboratorItemType[] = []; collaboratorList.forEach((item) => { if (item.tmbId) { tmbList.push(item); } else if (item.groupId) { groupList.push(item); } else if (item.orgId) { orgList.push(item); } }); return { tmbList, groupList, orgList }; }, [collaboratorList]); const { runAsync: onUpdatePermission, loading: addLoading } = useRequest2( async ({ id, type, per }: { id: string; type: 'add' | 'remove'; per: 'write' | 'manage' }) => { const clb = collaboratorList.find( (clb) => clb.tmbId === id || clb.groupId === id || clb.orgId === id ); if (!clb) return; const updatePer = per === 'write' ? TeamWritePermissionVal : TeamManagePermissionVal; const permission = new TeamPermission({ per: clb.permission.value }); if (type === 'add') { permission.addPer(updatePer); } else { permission.removePer(updatePer); } return onUpdateCollaborators({ ...(clb.tmbId && { members: [clb.tmbId] }), ...(clb.groupId && { groups: [clb.groupId] }), ...(clb.orgId && { orgs: [clb.orgId] }), permission: permission.value }); } ); const { runAsync: onDeleteMemberPermission, loading: deleteLoading } = useRequest2(onDelOneCollaborator); const userManage = userInfo?.permission.hasManagePer; const hasDeletePer = (per: TeamPermission) => { if (userInfo?.permission.isOwner) return true; if (userManage && !per.hasManagePer) return true; return false; }; return ( <> {Tabs} {/* setSearchKey(e.target.value)} /> */} {userInfo?.team.permission.hasManagePer && ( )} <> {t('user:team.group.members')} {isExpandMember && tmbList.map((member) => ( ))} <> {t('user:team.org.org')} {isExpandOrg && orgList.map((org) => ( ))} <> {t('user:team.group.group')} {isExpandGroup && groupList.map((group) => ( ))}
{`${t('user:team.group.members')} / ${t('user:team.org.org')} / ${t('user:team.group.group')}`} {t('user:team.group.permission.write')} {t('user:team.group.permission.manage')} {t('common:common.Action')}
{member.name} e.target.checked ? onUpdatePermission({ id: member.tmbId!, type: 'add', per: 'write' }) : onUpdatePermission({ id: member.tmbId!, type: 'remove', per: 'write' }) } /> e.target.checked ? onUpdatePermission({ id: member.tmbId!, type: 'add', per: 'manage' }) : onUpdatePermission({ id: member.tmbId!, type: 'remove', per: 'manage' }) } /> {hasDeletePer(member.permission) && userInfo?.team.tmbId !== member.tmbId && ( onDeleteMemberPermission({ tmbId: String(member.tmbId) }) } /> )}
e.target.checked ? onUpdatePermission({ id: org.orgId!, type: 'add', per: 'write' }) : onUpdatePermission({ id: org.orgId!, type: 'remove', per: 'write' }) } /> e.target.checked ? onUpdatePermission({ id: org.orgId!, type: 'add', per: 'manage' }) : onUpdatePermission({ id: org.orgId!, type: 'remove', per: 'manage' }) } /> {hasDeletePer(org.permission) && ( onDeleteMemberPermission({ orgId: org.orgId! })} /> )}
e.target.checked ? onUpdatePermission({ id: group.groupId!, type: 'add', per: 'write' }) : onUpdatePermission({ id: group.groupId!, type: 'remove', per: 'write' }) } /> e.target.checked ? onUpdatePermission({ id: group.groupId!, type: 'add', per: 'manage' }) : onUpdatePermission({ id: group.groupId!, type: 'remove', per: 'manage' }) } /> {hasDeletePer(group.permission) && ( onDeleteMemberPermission({ groupId: group.groupId! })} /> )}
); } export const Render = ({ Tabs }: { Tabs: React.ReactNode }) => { const { userInfo } = useUserStore(); return userInfo?.team ? ( {({ onOpenAddMember }) => } ) : null; }; export default Render;