update Log (#4533)

* add log search

* update log
This commit is contained in:
gggaaallleee
2025-04-14 18:28:42 +08:00
committed by GitHub
parent ea74c669ee
commit 2af3cd83f2
2 changed files with 115 additions and 9 deletions

View File

@@ -8,12 +8,12 @@ import {
Td,
Th,
Thead,
Tr
Tr,
HStack
} from '@chakra-ui/react';
import { useState } from 'react';
import { useState, useEffect, useMemo } from 'react';
import { useTranslation } from 'next-i18next';
import MyBox from '@fastgpt/web/components/common/MyBox';
import SearchInput from '@fastgpt/web/components/common/Input/SearchInput';
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';
@@ -21,28 +21,129 @@ import { operationLogI18nMap } from '@fastgpt/service/support/operationLog/const
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: (
<HStack spacing={1} color={'myGray.500'}>
<Avatar src={item.avatar} w={'1.2rem'} mr={1} rounded={'full'} />
<Box>{item.memberName}</Box>
</HStack>
),
value: item.tmbId
})),
[members]
);
const eventOptions = useMemo(
() =>
Object.values(OperationLogEventEnum).map((event) => ({
label: t(operationLogI18nMap[event].typeLabel),
value: event
})),
[t]
);
const [searchKey, setSearchKey] = useState<string>('');
const {
data: operationLogs = [],
isLoading: loadingLogs,
ScrollData: LogScrollData
} = useScrollPagination(getOperationLogs, {
pageSize: 20,
refreshDeps: [searchKey],
throttleWait: 500,
debounceWait: 200
debounceWait: 200,
refreshDeps: [searchParams],
params: searchParams
});
const {
value: selectedTmbIds,
setValue: setSelectedTmbIds,
isSelectAll: isSelectAllTmb,
setIsSelectAll: setIsSelectAllTmb
} = useMultipleSelect<string>(
tmbList.map((item) => item.value),
true
);
const {
value: selectedEvents,
setValue: setSelectedEvents,
isSelectAll: isSelectAllEvent,
setIsSelectAll: setIsSelectAllEvent
} = useMultipleSelect<OperationLogEventEnum>(
eventOptions.map((item) => item.value),
true
);
useEffect(() => {
setSearchParams({
...(isSelectAllTmb ? {} : { tmbIds: selectedTmbIds.length > 0 ? selectedTmbIds : undefined }),
...(isSelectAllEvent
? {}
: { events: selectedEvents.length > 0 ? selectedEvents : undefined })
});
}, [selectedTmbIds, selectedEvents, isSelectAllTmb, isSelectAllEvent]);
const isLoading = loadingLogs;
return (
<>
<Flex justify={'space-between'} align={'center'} pb={'1rem'}>
<Flex justify={'flex-start'} align={'center'} pb={'1rem'} gap={2} wrap="wrap">
{Tabs}
<Flex alignItems={'center'} gap={2}>
<Box fontSize={'mini'} fontWeight={'medium'} color={'myGray.900'}>
{t('account_team:log_user')}
</Box>
<Box>
<MultipleSelect<string>
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}
/>
</Box>
</Flex>
<Flex alignItems={'center'} gap={2}>
<Box fontSize={'mini'} fontWeight={'medium'} color={'myGray.900'}>
{t('account_team:log_type')}
</Box>
<Box>
<MultipleSelect
list={eventOptions}
value={selectedEvents}
onSelect={setSelectedEvents}
isSelectAll={isSelectAllEvent}
setIsSelectAll={setIsSelectAllEvent}
itemWrap={false}
height={'32px'}
bg={'myGray.50'}
w={'160px'}
/>
</Box>
</Flex>
</Flex>
<MyBox isLoading={isLoading} flex={'1 0 0'} overflow={'auto'}>

View File

@@ -1,8 +1,13 @@
import { GET, POST, PUT } from '@/web/common/api/request';
import type { PaginationProps, PaginationResponse } from '@fastgpt/web/common/fetch/type';
import type { OperationListItemType } from '@fastgpt/global/support/operationLog/type';
export const getOperationLogs = (props: PaginationProps<PaginationProps>) =>
import { OperationLogEventEnum } from '@fastgpt/global/support/operationLog/constants';
export const getOperationLogs = (
props: PaginationProps & {
tmbIds?: string[];
events?: OperationLogEventEnum[];
}
) =>
POST<PaginationResponse<OperationListItemType>>(
`/proApi/support/user/team/operationLog/list`,
props