import React, { useCallback, useState } from 'react'; import { Box, TableContainer, Table, Thead, Tbody, Tr, Th, Td, IconButton, Flex, Button, useDisclosure, Menu, MenuButton, MenuList, MenuItem } from '@chakra-ui/react'; import type { ModelSchema } from '@/types/mongoSchema'; import type { RedisModelDataItemType } from '@/types/redis'; import { ModelDataStatusMap } from '@/constants/model'; import { usePagination } from '@/hooks/usePagination'; import { getModelDataList, delOneModelData, getModelSplitDataListLen, getExportDataList } from '@/api/model'; import { DeleteIcon, RepeatIcon, EditIcon } from '@chakra-ui/icons'; import { useLoading } from '@/hooks/useLoading'; import { fileDownload } from '@/utils/file'; import dynamic from 'next/dynamic'; import { useMutation, useQuery } from '@tanstack/react-query'; import type { FormData as InputDataType } from './InputDataModal'; import Papa from 'papaparse'; const InputModel = dynamic(() => import('./InputDataModal')); const SelectFileModel = dynamic(() => import('./SelectFileModal')); const SelectUrlModel = dynamic(() => import('./SelectUrlModal')); const SelectCsvModal = dynamic(() => import('./SelectCsvModal')); const ModelDataCard = ({ model }: { model: ModelSchema }) => { const { Loading, setIsLoading } = useLoading(); const { data: modelDataList, isLoading, Pagination, total, getData, pageNum } = usePagination({ api: getModelDataList, pageSize: 8, params: { modelId: model._id } }); const [editInputData, setEditInputData] = useState(); const { isOpen: isOpenSelectFileModal, onOpen: onOpenSelectFileModal, onClose: onCloseSelectFileModal } = useDisclosure(); const { isOpen: isOpenSelectUrlModal, onOpen: onOpenSelectUrlModal, onClose: onCloseSelectUrlModal } = useDisclosure(); const { isOpen: isOpenSelectCsvModal, onOpen: onOpenSelectCsvModal, onClose: onCloseSelectCsvModal } = useDisclosure(); const { data: splitDataLen, refetch } = useQuery(['getModelSplitDataList'], () => getModelSplitDataListLen(model._id) ); const refetchData = useCallback( (num = 1) => { getData(num); refetch(); }, [getData, refetch] ); // 获取所有的数据,并导出 json const { mutate: onclickExport, isLoading: isLoadingExport } = useMutation({ mutationFn: () => getExportDataList(model._id), onSuccess(res) { try { setIsLoading(true); const text = Papa.unparse({ fields: ['question', 'answer'], data: res }); fileDownload({ text, type: 'text/csv', filename: 'data.csv' }); } catch (error) { error; } setIsLoading(false); } }); return ( <> 模型数据: {total}组 (测试版本) } aria-label={'refresh'} variant={'outline'} mr={4} size={'sm'} onClick={() => refetchData(pageNum)} /> 导入 setEditInputData({ text: '', q: '' }) } > 手动输入 文本内容 QA 拆分 网站内容 QA 拆分 csv 问答对导入 {!!(splitDataLen && splitDataLen > 0) && ( {splitDataLen}条数据正在拆分... )} {modelDataList.map((item) => ( ))}
Question Text Status 操作
{item.q} {item.text} {ModelDataStatusMap[item.status]} } variant={'outline'} aria-label={'delete'} size={'sm'} onClick={() => setEditInputData({ dataId: item.id, q: item.q, text: item.text }) } /> } variant={'outline'} colorScheme={'gray'} aria-label={'delete'} size={'sm'} onClick={async () => { await delOneModelData(item.id); refetchData(pageNum); }} />
{editInputData !== undefined && ( setEditInputData(undefined)} onSuccess={refetchData} /> )} {isOpenSelectFileModal && ( )} {isOpenSelectUrlModal && ( )} {isOpenSelectCsvModal && ( )} ); }; export default ModelDataCard;