import { useUserStore } from '@/web/support/user/useUserStore'; import { Box, Divider, Flex, HStack, Table, TableContainer, Tag, Tbody, Td, Th, Thead, Tr, VStack } from '@chakra-ui/react'; import type { OrgListItemType } from '@fastgpt/global/support/user/team/org/type'; import Avatar from '@fastgpt/web/components/common/Avatar'; import MyIcon from '@fastgpt/web/components/common/Icon'; import type { IconNameType } from '@fastgpt/web/components/common/Icon/type'; import MyMenu from '@fastgpt/web/components/common/MyMenu'; import { useConfirm } from '@fastgpt/web/hooks/useConfirm'; import { useRequest2 } from '@fastgpt/web/hooks/useRequest'; import { useTranslation } from 'next-i18next'; import { useMemo, useState } from 'react'; import MemberTag from '@/components/support/user/team/Info/MemberTag'; import { deleteOrg, deleteOrgMember } from '@/web/support/user/team/org/api'; import IconButton from './IconButton'; import { defaultOrgForm, type OrgFormType } from './OrgInfoModal'; import dynamic from 'next/dynamic'; import MyBox from '@fastgpt/web/components/common/MyBox'; import Path from '@/components/common/folder/Path'; import { useSystemStore } from '@/web/common/system/useSystemStore'; import { delRemoveMember } from '@/web/support/user/team/api'; import SearchInput from '@fastgpt/web/components/common/Input/SearchInput'; import useOrg from '@/web/support/user/team/org/hooks/useOrg'; const OrgInfoModal = dynamic(() => import('./OrgInfoModal')); const OrgMemberManageModal = dynamic(() => import('./OrgMemberManageModal')); const OrgMoveModal = dynamic(() => import('./OrgMoveModal')); function ActionButton({ icon, text, onClick }: { icon: IconNameType; text: string; onClick: () => void; }) { return ( {text} ); } function OrgTable({ Tabs }: { Tabs: React.ReactNode }) { const { t } = useTranslation(); const { userInfo, isTeamAdmin } = useUserStore(); const { feConfigs } = useSystemStore(); const isSyncMember = feConfigs.register_method?.includes('sync'); const [editOrg, setEditOrg] = useState(); const [manageMemberOrg, setManageMemberOrg] = useState(); const [movingOrg, setMovingOrg] = useState(); const [searchOrg, setSearchOrg] = useState(''); const { currentOrg, orgs, isLoadingOrgs, paths, onClickOrg, members, MemberScrollData, onPathClick, refresh, updateCurrentOrg } = useOrg(); // Delete org const { ConfirmModal: ConfirmDeleteOrgModal, openConfirm: openDeleteOrgModal } = useConfirm({ type: 'delete', content: t('account_team:confirm_delete_org') }); const deleteOrgHandler = (orgId: string) => openDeleteOrgModal(() => deleteOrgReq(orgId))(); const { runAsync: deleteOrgReq } = useRequest2(deleteOrg, { onSuccess: refresh }); // Delete member const { ConfirmModal: ConfirmDeleteMemberFromOrg, openConfirm: openDeleteMemberFromOrgModal } = useConfirm({ type: 'delete' }); const { ConfirmModal: ConfirmDeleteMemberFromTeam, openConfirm: openDeleteMemberFromTeamModal } = useConfirm({ type: 'delete' }); const { runAsync: deleteMemberReq } = useRequest2(deleteOrgMember, { onSuccess: refresh }); const { runAsync: deleteMemberFromTeamReq } = useRequest2(delRemoveMember, { onSuccess: refresh }); const searchedOrgs = useMemo(() => { if (!searchOrg) return []; return orgs.filter((org) => org.name.includes(searchOrg)); }, [orgs, searchOrg]); return ( <> {Tabs} setSearchOrg(e.target.value)} /> {searchedOrgs.map((org) => ( onClickOrg(org)}> {isTeamAdmin && !isSyncMember && ( )} ))} {!searchOrg && orgs .filter((org) => org.path !== '') .map((org) => ( {isTeamAdmin && !isSyncMember && ( )} ))} {!searchOrg && members.map((member) => { return ( ); })}
{t('common:Name')} {t('common:common.Action')}
onClickOrg(org)}> {org.total} } menuList={[ { children: [ { icon: 'edit', label: t('account_team:edit_info'), onClick: () => setEditOrg(org) }, { icon: 'common/file/move', label: t('common:Move'), onClick: () => setMovingOrg(org) }, { icon: 'delete', label: t('account_team:delete'), type: 'danger', onClick: () => deleteOrgHandler(org._id) } ] } ]} />
onClickOrg(org)}> {org.total} } menuList={[ { children: [ { icon: 'edit', label: t('account_team:edit_info'), onClick: () => setEditOrg(org) }, { icon: 'common/file/move', label: t('common:Move'), onClick: () => setMovingOrg(org) }, { icon: 'delete', label: t('account_team:delete'), type: 'danger', onClick: () => deleteOrgHandler(org._id) } ] } ]} />
{isTeamAdmin && ( } menuList={[ { children: [ { menuItemStyles: { _hover: { color: 'red.600', backgroundColor: 'red.50' } }, label: t('account_team:delete_from_team', { username: member.memberName }), onClick: () => { openDeleteMemberFromTeamModal( () => deleteMemberFromTeamReq(member.tmbId), undefined, t('account_team:confirm_delete_from_team', { username: member.memberName }) )(); } }, ...(isSyncMember ? [] : [ { menuItemStyles: { _hover: { color: 'red.600', bgColor: 'red.50' } }, label: t('account_team:delete_from_org'), onClick: () => openDeleteMemberFromOrgModal( () => { if (currentOrg) { return deleteMemberReq( currentOrg._id, member.tmbId ); } }, undefined, t('account_team:confirm_delete_from_org', { username: member.memberName }) )() } ]) ] } ]} /> )}
{/* Slider */} {!isSyncMember && ( {currentOrg.name} {currentOrg?.path !== '' && ( setEditOrg(currentOrg)} /> )} {currentOrg?.path !== '' && ( {currentOrg?.description || t('common:common.no_intro')} )} {t('common:common.Action')} {isTeamAdmin && ( { setEditOrg({ ...defaultOrgForm, path: currentOrg.path }); }} /> setManageMemberOrg(currentOrg)} /> {currentOrg?.path !== '' && ( <> setMovingOrg(currentOrg)} /> deleteOrgHandler(currentOrg._id)} /> )} )} )}
{!!editOrg && ( setEditOrg(undefined)} onSuccess={refresh} updateCurrentOrg={updateCurrentOrg} /> )} {!!movingOrg && ( setMovingOrg(undefined)} onSuccess={refresh} /> )} {!!manageMemberOrg && ( setManageMemberOrg(undefined)} /> )} ); } export default OrgTable;