import { Box, Flex, Table, TableContainer, Tbody, Td, Th, Thead, Tr, HStack } from '@chakra-ui/react'; import { useState, useEffect, useMemo, useCallback } 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 { 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'; import { specialProcessors } from './processors'; import { defaultMetadataProcessor } from './processors/commonProcessor'; 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 processMetadataByEvent = useCallback( (event: string, metadata: any) => { const defaultFormat = defaultMetadataProcessor(metadata, t); const specialFormat = specialProcessors[event as OperationLogEventEnum]?.(defaultFormat, t); return specialFormat || defaultFormat; }, [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 = processMetadataByEvent(log.event, { ...log.metadata }); 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 as any, metadata)}
); } export default OperationLogTable;