import { Box, Button, Flex, Table, TableContainer, Tbody, Td, Th, Thead, Tr, HStack } from '@chakra-ui/react'; import { useState, useEffect, useMemo } from 'react'; import { useTranslation } from 'next-i18next'; import MyBox from '@fastgpt/web/components/common/MyBox'; import { useScrollPagination } from '@fastgpt/web/hooks/useScrollPagination'; import { getOperationLogs } from '@/web/support/user/team/operantionLog/api'; import { TeamPermission } from '@fastgpt/global/support/permission/user/controller'; import { operationLogMap } from '@fastgpt/service/support/operationLog/constants'; import { OperationLogEventEnum } from '@fastgpt/global/support/operationLog/constants'; import { formatTime2YMDHMS } from '@fastgpt/global/common/string/time'; import UserBox from '@fastgpt/web/components/common/UserBox'; import MultipleSelect, { useMultipleSelect } from '@fastgpt/web/components/common/MySelect/MultipleSelect'; import Avatar from '@fastgpt/web/components/common/Avatar'; import { getTeamMembers } from '@/web/support/user/team/api'; function OperationLogTable({ Tabs }: { Tabs: React.ReactNode }) { const { t } = useTranslation(); const [searchParams, setSearchParams] = useState<{ tmbIds?: string[]; events?: OperationLogEventEnum[]; }>({}); const { data: members, ScrollData } = useScrollPagination(getTeamMembers, {}); const tmbList = useMemo( () => members.map((item) => ({ label: ( {item.memberName} ), value: item.tmbId })), [members] ); const eventOptions = useMemo( () => Object.values(OperationLogEventEnum).map((event) => ({ label: t(operationLogMap[event].typeLabel), value: event })), [t] ); const { data: operationLogs = [], isLoading: loadingLogs, ScrollData: LogScrollData } = useScrollPagination(getOperationLogs, { pageSize: 20, refreshDeps: [searchParams], params: searchParams }); const { value: selectedTmbIds, setValue: setSelectedTmbIds, isSelectAll: isSelectAllTmb, setIsSelectAll: setIsSelectAllTmb } = useMultipleSelect( tmbList.map((item) => item.value), true ); const { value: selectedEvents, setValue: setSelectedEvents, isSelectAll: isSelectAllEvent, setIsSelectAll: setIsSelectAllEvent } = useMultipleSelect( eventOptions.map((item) => item.value), true ); useEffect(() => { setSearchParams({ ...(isSelectAllTmb ? {} : { tmbIds: selectedTmbIds }), ...(isSelectAllEvent ? {} : { events: selectedEvents }) }); }, [selectedTmbIds, selectedEvents, isSelectAllTmb, isSelectAllEvent]); const isLoading = loadingLogs; return ( <> {Tabs} {t('account_team:log_user')} list={tmbList} value={selectedTmbIds} onSelect={(val) => { setSelectedTmbIds(val as string[]); }} itemWrap={false} height={'32px'} bg={'myGray.50'} w={'160px'} ScrollData={ScrollData} isSelectAll={isSelectAllTmb} setIsSelectAll={setIsSelectAllTmb} /> {t('account_team:log_type')} {operationLogs?.map((log) => { const i18nData = operationLogMap[log.event]; const metadata = { ...log.metadata }; if (log.event === OperationLogEventEnum.ASSIGN_PERMISSION) { const permissionValue = parseInt(metadata.permission, 10); const permission = new TeamPermission({ per: permissionValue }); metadata.appCreate = permission.hasAppCreatePer ? '✔' : '✘'; metadata.datasetCreate = permission.hasDatasetCreatePer ? '✔' : '✘'; metadata.apiKeyCreate = permission.hasApikeyCreatePer ? '✔' : '✘'; metadata.manage = permission.hasManagePer ? '✔' : '✘'; } return i18nData ? ( ) : null; })}
{t('account_team:log_user')} {t('account_team:log_time')} {t('account_team:log_type')} {t('account_team:log_details')}
{formatTime2YMDHMS(log.timestamp)} {t(i18nData.typeLabel)} {t(i18nData.content, metadata as any) as string}
); } export default OperationLogTable;