diff --git a/web/src/components/chunk-method-dialog/index.tsx b/web/src/components/chunk-method-dialog/index.tsx index d35ddd48c..dfdcab52c 100644 --- a/web/src/components/chunk-method-dialog/index.tsx +++ b/web/src/components/chunk-method-dialog/index.tsx @@ -23,7 +23,6 @@ import { ParseTypeItem, } from '@/pages/dataset/dataset-setting/configuration/common-item'; import { zodResolver } from '@hookform/resolvers/zod'; -import get from 'lodash/get'; import omit from 'lodash/omit'; import {} from 'module'; import { useEffect, useMemo } from 'react'; @@ -41,13 +40,6 @@ import { ExcelToHtmlFormField } from '../excel-to-html-form-field'; import { FormContainer } from '../form-container'; import { LayoutRecognizeFormField } from '../layout-recognize-form-field'; import { MaxTokenNumberFormField } from '../max-token-number-from-field'; -import { - UseGraphRagFormField, - showGraphRagItems, -} from '../parse-configuration/graph-rag-form-fields'; -import RaptorFormFields, { - showRaptorParseConfiguration, -} from '../parse-configuration/raptor-form-fields'; import { ButtonLoading } from '../ui/button'; import { Input } from '../ui/input'; import { DynamicPageRange } from './dynamic-page-range'; @@ -121,19 +113,19 @@ export function ChunkMethodDialog({ auto_keywords: z.coerce.number().optional(), auto_questions: z.coerce.number().optional(), html4excel: z.boolean().optional(), - raptor: z - .object({ - use_raptor: z.boolean().optional(), - prompt: z.string().optional().optional(), - max_token: z.coerce.number().optional(), - threshold: z.coerce.number().optional(), - max_cluster: z.coerce.number().optional(), - random_seed: z.coerce.number().optional(), - }) - .optional(), - graphrag: z.object({ - use_graphrag: z.boolean().optional(), - }), + // raptor: z + // .object({ + // use_raptor: z.boolean().optional(), + // prompt: z.string().optional().optional(), + // max_token: z.coerce.number().optional(), + // threshold: z.coerce.number().optional(), + // max_cluster: z.coerce.number().optional(), + // random_seed: z.coerce.number().optional(), + // }) + // .optional(), + // graphrag: z.object({ + // use_graphrag: z.boolean().optional(), + // }), entity_types: z.array(z.string()).optional(), pages: z .array(z.object({ from: z.coerce.number(), to: z.coerce.number() })) @@ -223,13 +215,13 @@ export function ChunkMethodDialog({ parser_config: fillDefaultParserValue({ pages: pages.length > 0 ? pages : [{ from: 1, to: 1024 }], ...omit(parserConfig, 'pages'), - graphrag: { - use_graphrag: get( - parserConfig, - 'graphrag.use_graphrag', - useGraphRag, - ), - }, + // graphrag: { + // use_graphrag: get( + // parserConfig, + // 'graphrag.use_graphrag', + // useGraphRag, + // ), + // }, }), }); } @@ -351,19 +343,19 @@ export function ChunkMethodDialog({ )} - {showRaptorParseConfiguration( + {/* {showRaptorParseConfiguration( selectedTag as DocumentParserType, ) && ( - )} - {showGraphRagItems(selectedTag as DocumentParserType) && + )} */} + {/* {showGraphRagItems(selectedTag as DocumentParserType) && useGraphRag && ( - )} + )} */} {showEntityTypes && ( )} diff --git a/web/src/components/chunk-method-dialog/use-default-parser-values.ts b/web/src/components/chunk-method-dialog/use-default-parser-values.ts index fce389608..829b98605 100644 --- a/web/src/components/chunk-method-dialog/use-default-parser-values.ts +++ b/web/src/components/chunk-method-dialog/use-default-parser-values.ts @@ -15,17 +15,17 @@ export function useDefaultParserValues() { auto_keywords: 0, auto_questions: 0, html4excel: false, - raptor: { - use_raptor: false, - prompt: t('knowledgeConfiguration.promptText'), - max_token: 256, - threshold: 0.1, - max_cluster: 64, - random_seed: 0, - }, - graphrag: { - use_graphrag: false, - }, + // raptor: { + // use_raptor: false, + // prompt: t('knowledgeConfiguration.promptText'), + // max_token: 256, + // threshold: 0.1, + // max_cluster: 64, + // random_seed: 0, + // }, + // graphrag: { + // use_graphrag: false, + // }, entity_types: [], pages: [], }; diff --git a/web/src/components/data-pipeline-select/index.tsx b/web/src/components/data-pipeline-select/index.tsx index 3c7fa0a91..4b71aba91 100644 --- a/web/src/components/data-pipeline-select/index.tsx +++ b/web/src/components/data-pipeline-select/index.tsx @@ -2,7 +2,7 @@ import { useTranslate } from '@/hooks/common-hooks'; import { useFetchAgentList } from '@/hooks/use-agent-request'; import { buildSelectOptions } from '@/utils/component-util'; import { ArrowUpRight } from 'lucide-react'; -import { useMemo } from 'react'; +import { useEffect, useMemo } from 'react'; import { useFormContext } from 'react-hook-form'; import { SelectWithSearch } from '../originui/select-with-search'; import { @@ -13,15 +13,21 @@ import { FormMessage, } from '../ui/form'; import { MultiSelect } from '../ui/multi-select'; +export interface IDataPipelineSelectNode { + id?: string; + name?: string; + avatar?: string; +} interface IProps { toDataPipeline?: () => void; formFieldName: string; isMult?: boolean; + setDataList?: (data: IDataPipelineSelectNode[]) => void; } export function DataFlowSelect(props: IProps) { - const { toDataPipeline, formFieldName, isMult = true } = props; + const { toDataPipeline, formFieldName, isMult = false, setDataList } = props; const { t } = useTranslate('knowledgeConfiguration'); const form = useFormContext(); const toDataPipLine = () => { @@ -36,8 +42,26 @@ export function DataFlowSelect(props: IProps) { 'id', 'title', ); + return option || []; }, [dataPipelineOptions]); + + const nodes = useMemo(() => { + return ( + dataPipelineOptions?.canvas?.map((item) => { + return { + id: item?.id, + name: item?.title, + avatar: item?.avatar, + }; + }) || [] + ); + }, [dataPipelineOptions]); + + useEffect(() => { + setDataList?.(nodes); + }, [nodes, setDataList]); + return ( { type GraphRagItemsProps = { marginBottom?: boolean; className?: string; - showGenerateItem?: boolean; + data: IGenerateLogButtonProps; }; -export function UseGraphRagFormField() { +export function UseGraphRagFormField({ + data, +}: { + data: IGenerateLogButtonProps; +}) { const form = useFormContext(); const { t } = useTranslate('knowledgeConfiguration'); @@ -73,10 +78,16 @@ export function UseGraphRagFormField() {
- + > */} +
@@ -93,8 +104,8 @@ export function UseGraphRagFormField() { // The three types "table", "resume" and "one" do not display this configuration. const GraphRagItems = ({ marginBottom = false, - showGenerateItem = false, className = 'p-10', + data, }: GraphRagItemsProps) => { const { t } = useTranslate('knowledgeConfiguration'); const form = useFormContext(); @@ -120,7 +131,7 @@ const GraphRagItems = ({ return ( - + {useRaptor && ( <> @@ -216,7 +227,7 @@ const GraphRagItems = ({ )} /> - {showGenerateItem && ( + {/* {showGenerateItem && (
{t('extractKnowledgeGraph')} @@ -227,7 +238,7 @@ const GraphRagItems = ({ type={GenerateType.KnowledgeGraph} />
- )} + )} */} )} diff --git a/web/src/components/parse-configuration/raptor-form-fields.tsx b/web/src/components/parse-configuration/raptor-form-fields.tsx index ec22be81a..a177f2e3b 100644 --- a/web/src/components/parse-configuration/raptor-form-fields.tsx +++ b/web/src/components/parse-configuration/raptor-form-fields.tsx @@ -4,6 +4,7 @@ import { useTranslate } from '@/hooks/common-hooks'; import { GenerateLogButton, GenerateType, + IGenerateLogButtonProps, } from '@/pages/dataset/dataset/generate-button/generate'; import random from 'lodash/random'; import { Shuffle } from 'lucide-react'; @@ -18,7 +19,6 @@ import { FormMessage, } from '../ui/form'; import { ExpandedInput } from '../ui/input'; -import { Switch } from '../ui/switch'; import { Textarea } from '../ui/textarea'; export const excludedParseMethods = [ @@ -56,11 +56,7 @@ const Prompt = 'parser_config.raptor.prompt'; // The three types "table", "resume" and "one" do not display this configuration. -const RaptorFormFields = ({ - showGenerateItem = false, -}: { - showGenerateItem?: boolean; -}) => { +const RaptorFormFields = ({ data }: { data: IGenerateLogButtonProps }) => { const form = useFormContext(); const { t } = useTranslate('knowledgeConfiguration'); const useRaptor = useWatch({ name: UseRaptorField }); @@ -108,13 +104,12 @@ const RaptorFormFields = ({
- { - changeRaptor(e); - field.onChange(e); - }} - > +
@@ -219,18 +214,6 @@ const RaptorFormFields = ({ )} /> - {showGenerateItem && ( -
-
- {t('extractRaptor')} -
- -
- )} )} diff --git a/web/src/interfaces/database/knowledge.ts b/web/src/interfaces/database/knowledge.ts index 0d8fc025e..d768d8e5e 100644 --- a/web/src/interfaces/database/knowledge.ts +++ b/web/src/interfaces/database/knowledge.ts @@ -14,6 +14,9 @@ export interface IKnowledge { name: string; parser_config: ParserConfig; parser_id: string; + pipeline_id: string; + pipeline_name: string; + pipeline_avatar: string; permission: string; similarity_threshold: number; status: string; @@ -26,6 +29,10 @@ export interface IKnowledge { nickname: string; operator_permission: number; size: number; + raptor_task_finish_at?: string; + raptor_task_id?: string; + mindmap_task_finish_at?: string; + mindmap_task_id?: string; } export interface IKnowledgeResult { diff --git a/web/src/pages/dataflow-result/components/parse-editer/index.tsx b/web/src/pages/dataflow-result/components/parse-editer/index.tsx index e9cf25ba4..ab27d07ca 100644 --- a/web/src/pages/dataflow-result/components/parse-editer/index.tsx +++ b/web/src/pages/dataflow-result/components/parse-editer/index.tsx @@ -115,7 +115,7 @@ const FormatPreserveEditor = ({ ) : ( <> {content.key === 'json' && */} - {content.value.map((item, index) => ( + {content.value?.map((item, index) => (
{ queryKey: [ 'fileLogList', knowledgeBaseId, - pagination.current, - pagination.pageSize, + pagination, searchString, active, ], + placeholderData: (previousData) => { + if (previousData === undefined) { + return { logs: [], total: 0 }; + } + return previousData; + }, + enabled: true, queryFn: async () => { const { data: res = {} } = await fetchFunc({ kb_id: knowledgeBaseId, @@ -73,6 +79,7 @@ const useFetchFileLogList = () => { searchString, handleInputChange: onInputChange, pagination: { ...pagination, total: data?.total }, + setPagination, active, setActive, }; diff --git a/web/src/pages/dataset/dataset-overview/index.tsx b/web/src/pages/dataset/dataset-overview/index.tsx index 85220fb31..0a71acb2f 100644 --- a/web/src/pages/dataset/dataset-overview/index.tsx +++ b/web/src/pages/dataset/dataset-overview/index.tsx @@ -1,5 +1,6 @@ import SvgIcon from '@/components/svg-icon'; import { useIsDarkTheme } from '@/components/theme-provider'; +import { useFetchDocumentList } from '@/hooks/use-document-request'; import { parseColorToRGBA } from '@/utils/common-util'; import { CircleQuestionMark } from 'lucide-react'; import { FC, useEffect, useMemo, useState } from 'react'; @@ -90,6 +91,9 @@ const FileLogsPage: FC = () => { }); const { data: topData } = useFetchOverviewTital(); + const { + pagination: { total: fileTotal }, + } = useFetchDocumentList(); console.log('topData --> ', topData); useEffect(() => { setTopAllData((prev) => { @@ -104,11 +108,24 @@ const FileLogsPage: FC = () => { }); }, [topData]); + useEffect(() => { + setTopAllData((prev) => { + return { + ...prev, + totalFiles: { + value: fileTotal || 0, + precent: 0, + }, + }; + }); + }, [fileTotal]); + const { data: tableOriginData, searchString, handleInputChange, pagination, + setPagination, active, setActive, } = useFetchFileLogList(); @@ -131,6 +148,11 @@ const FileLogsPage: FC = () => { }; const handlePaginationChange = (page: number, pageSize: number) => { console.log('Pagination changed:', { page, pageSize }); + setPagination({ + ...pagination, + page, + pageSize: pageSize, + }); }; const isDark = useIsDarkTheme(); diff --git a/web/src/pages/dataset/dataset-setting/components/link-data-pipeline.tsx b/web/src/pages/dataset/dataset-setting/components/link-data-pipeline.tsx index 08590c251..92c80dab6 100644 --- a/web/src/pages/dataset/dataset-setting/components/link-data-pipeline.tsx +++ b/web/src/pages/dataset/dataset-setting/components/link-data-pipeline.tsx @@ -1,23 +1,26 @@ +import { IDataPipelineSelectNode } from '@/components/data-pipeline-select'; import { IconFont } from '@/components/icon-font'; import { RAGFlowAvatar } from '@/components/ragflow-avatar'; import { Button } from '@/components/ui/button'; import { Modal } from '@/components/ui/modal/modal'; -import { omit } from 'lodash'; -import { Link, Settings2, Unlink } from 'lucide-react'; -import { useState } from 'react'; +import { Link } from 'lucide-react'; +import { useMemo, useState } from 'react'; import { useTranslation } from 'react-i18next'; -import { z } from 'zod'; -import { linkPiplineFormSchema } from '../form-schema'; import LinkDataPipelineModal from './link-data-pipline-modal'; - -interface DataPipelineItemProps { - id: string; - name: string; - avatar?: string; +export interface IDataPipelineNodeProps extends IDataPipelineSelectNode { isDefault?: boolean; linked?: boolean; +} + +export interface ILinkDataPipelineProps { + data?: IDataPipelineNodeProps; + handleLinkOrEditSubmit?: (data: IDataPipelineNodeProps | undefined) => void; +} + +interface DataPipelineItemProps extends IDataPipelineNodeProps { openLinkModalFunc?: (open: boolean, data?: IDataPipelineNodeProps) => void; } + const DataPipelineItem = (props: DataPipelineItemProps) => { const { t } = useTranslation(); const { name, avatar, isDefault, linked, openLinkModalFunc } = props; @@ -57,17 +60,17 @@ const DataPipelineItem = (props: DataPipelineItemProps) => { }; return ( -
+
{name}
- {isDefault && ( + {/* {isDefault && (
{t('knowledgeConfiguration.default')}
- )} + )} */}
-
+ {/*
+
*/}
); }; -export interface IDataPipelineNodeProps { - id: string; - name: string; - avatar?: string; - isDefault?: boolean; - linked?: boolean; -} -const LinkDataPipeline = () => { +const LinkDataPipeline = (props: ILinkDataPipelineProps) => { + const { data, handleLinkOrEditSubmit: submit } = props; const { t } = useTranslation(); const [openLinkModal, setOpenLinkModal] = useState(false); const [currentDataPipeline, setCurrentDataPipeline] = useState(); - const testNode = [ - { - id: '1', - name: 'Data Pipeline 1', - avatar: 'https://avatars.githubusercontent.com/u/10656201?v=4', - isDefault: true, - linked: true, - }, - { - id: '2', - name: 'Data Pipeline 2', - avatar: 'https://avatars.githubusercontent.com/u/10656201?v=4', - linked: false, - }, - { - id: '3', - name: 'Data Pipeline 3', - avatar: 'https://avatars.githubusercontent.com/u/10656201?v=4', - linked: false, - }, - { - id: '4', - name: 'Data Pipeline 4', - avatar: 'https://avatars.githubusercontent.com/u/10656201?v=4', - linked: true, - }, - ]; + const pipelineNode: IDataPipelineNodeProps[] = useMemo( + () => [ + { + id: data?.id, + name: data?.name, + avatar: data?.avatar, + isDefault: data?.isDefault, + linked: true, + }, + ], + [data], + ); const openLinkModalFunc = (open: boolean, data?: IDataPipelineNodeProps) => { console.log('open', open, data); setOpenLinkModal(open); @@ -148,9 +130,11 @@ const LinkDataPipeline = () => { } }; const handleLinkOrEditSubmit = ( - data: z.infer, + data: IDataPipelineSelectNode | undefined, ) => { console.log('handleLinkOrEditSubmit', data); + submit?.(data); + setOpenLinkModal(false); }; return (
@@ -178,13 +162,20 @@ const LinkDataPipeline = () => {
- {testNode.map((item) => ( - - ))} + {pipelineNode.map( + (item) => + item.id && ( + + ), + )}
void; - onSubmit?: (data: any) => void; + onSubmit?: (pipeline: IDataPipelineSelectNode | undefined) => void; }) => { const isEdit = !!data; + const [list, setList] = useState(); const form = useForm>({ resolver: zodResolver(pipelineFormSchema), defaultValues: { - data_flow: [], + pipeline_id: '', set_default: false, file_filter: '', }, @@ -43,11 +39,12 @@ const LinkDataPipelineModal = ({ const { navigateToAgents } = useNavigatePage(); const handleFormSubmit = (values: any) => { console.log(values, data); - const param = { - ...data, - ...values, - }; - onSubmit?.(param); + // const param = { + // ...data, + // ...values, + // }; + const pipeline = list?.find((item) => item.id === values.pipeline_id); + onSubmit?.(pipeline); }; return ( )} - ( @@ -135,7 +133,7 @@ const LinkDataPipelineModal = ({ )} /> - )} + )} */}
diff --git a/web/src/pages/dataset/dataset-setting/saving-button.tsx b/web/src/pages/dataset/dataset-setting/saving-button.tsx index 1fac81ea7..7a063081a 100644 --- a/web/src/pages/dataset/dataset-setting/saving-button.tsx +++ b/web/src/pages/dataset/dataset-setting/saving-button.tsx @@ -62,7 +62,7 @@ export function SavingButton() { if (beValid) { form.handleSubmit(async (values) => { console.log('saveKnowledgeConfiguration: ', values); - delete values['avatar']; + // delete values['avatar']; await saveKnowledgeConfiguration({ kb_id, ...values, diff --git a/web/src/pages/dataset/dataset/generate-button/generate.tsx b/web/src/pages/dataset/dataset/generate-button/generate.tsx index aa891e215..483309b6c 100644 --- a/web/src/pages/dataset/dataset/generate-button/generate.tsx +++ b/web/src/pages/dataset/dataset/generate-button/generate.tsx @@ -9,6 +9,7 @@ import { import { Modal } from '@/components/ui/modal/modal'; import { cn } from '@/lib/utils'; import { toFixed } from '@/utils/common-util'; +import { formatDate } from '@/utils/date'; import { UseMutateAsyncFunction } from '@tanstack/react-query'; import { t } from 'i18next'; import { lowerFirst } from 'lodash'; @@ -29,7 +30,13 @@ export enum GenerateType { const MenuItem: React.FC<{ name: GenerateType; data: ITraceInfo; - pauseGenerate: () => void; + pauseGenerate: ({ + task_id, + type, + }: { + task_id: string; + type: GenerateType; + }) => void; runGenerate: UseMutateAsyncFunction< any, Error, @@ -38,13 +45,12 @@ const MenuItem: React.FC<{ }, unknown >; -}> = ({ name, runGenerate, data, pauseGenerate }) => { - console.log(name, 'pppp', data); +}> = ({ name: type, runGenerate, data, pauseGenerate }) => { const iconKeyMap = { KnowledgeGraph: 'knowledgegraph', Raptor: 'dataflow-01', }; - const type = useMemo(() => { + const status = useMemo(() => { if (!data) { return generateStatus.start; } @@ -60,9 +66,9 @@ const MenuItem: React.FC<{ }, [data]); const percent = - type === generateStatus.failed + status === generateStatus.failed ? 100 - : type === generateStatus.running + : status === generateStatus.running ? data.progress * 100 : 0; @@ -72,9 +78,9 @@ const MenuItem: React.FC<{ 'border cursor-pointer p-2 rounded-md focus:bg-transparent', { 'hover:border-accent-primary hover:bg-[rgba(59,160,92,0.1)]': - type === generateStatus.start, + status === generateStatus.start, 'hover:border-border hover:bg-[rgba(59,160,92,0)]': - type !== generateStatus.start, + status !== generateStatus.start, }, )} onSelect={(e) => { @@ -87,56 +93,65 @@ const MenuItem: React.FC<{
{ - if (type === generateStatus.start) { - runGenerate({ type: name }); + if (status === generateStatus.start) { + runGenerate({ type }); } }} >
- {t(`knowledgeDetails.${lowerFirst(name)}`)} + {t(`knowledgeDetails.${lowerFirst(type)}`)}
- {type === generateStatus.start && ( + {status === generateStatus.start && (
- {t(`knowledgeDetails.generate${name}`)} + {t(`knowledgeDetails.generate${type}`)}
)} - {(type === generateStatus.running || - type === generateStatus.failed) && ( + {(status === generateStatus.running || + status === generateStatus.failed) && (
- {type === generateStatus.running && ( + {status === generateStatus.running && ( {(toFixed(percent) as string) + '%'} )} - { - e.stopPropagation(); - pauseGenerate(); - }} - > - {type === generateStatus.failed ? ( + {status === generateStatus.failed && ( + { + e.stopPropagation(); + runGenerate({ type }); + }} + > - ) : ( + + )} + {status !== generateStatus.failed && ( + { + e.stopPropagation(); + pauseGenerate({ task_id: data.id, type }); + }} + > - )} - + + )}
)}
@@ -202,7 +217,12 @@ const Generate: React.FC = () => { export default Generate; -export type IGenerateLogProps = { +export type IGenerateLogButtonProps = { + finish_at: string; + task_id: string; +}; + +export type IGenerateLogProps = IGenerateLogButtonProps & { id?: string; status: 0 | 1; message?: string; @@ -214,16 +234,7 @@ export type IGenerateLogProps = { }; export const GenerateLogButton = (props: IGenerateLogProps) => { const { t } = useTranslation(); - const { - id, - status, - message, - created_at, - updated_at, - type, - className, - onDelete, - } = props; + const { task_id, message, finish_at, type, onDelete } = props; const handleDelete = () => { Modal.show({ visible: true, @@ -278,11 +289,11 @@ export const GenerateLogButton = (props: IGenerateLogProps) => { className={cn('flex bg-bg-card rounded-md py-1 px-3', props.className)} >
- {status === 1 && ( + {finish_at && ( <>
{message || t('knowledgeDetails.generatedOn')} - {created_at} + {formatDate(finish_at)}
{ /> )} - {status === 0 &&
{t('knowledgeDetails.notGenerated')}
} + {!finish_at &&
{t('knowledgeDetails.notGenerated')}
}
); diff --git a/web/src/pages/dataset/dataset/generate-button/hook.ts b/web/src/pages/dataset/dataset/generate-button/hook.ts index 80f6ce0a9..c2aa21aba 100644 --- a/web/src/pages/dataset/dataset/generate-button/hook.ts +++ b/web/src/pages/dataset/dataset/generate-button/hook.ts @@ -1,8 +1,9 @@ import message from '@/components/ui/message'; +import agentService from '@/services/agent-service'; import kbService from '@/services/knowledge-service'; import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'; import { t } from 'i18next'; -import { useCallback, useEffect, useState } from 'react'; +import { useEffect, useState } from 'react'; import { useParams } from 'umi'; import { GenerateType } from './generate'; export const generateStatus = { @@ -14,6 +15,7 @@ export const generateStatus = { enum DatasetKey { generate = 'generate', + pauseGenerate = 'pauseGenerate', } export interface ITraceInfo { @@ -126,9 +128,28 @@ export const useDatasetGenerate = () => { return data; }, }); - const pauseGenerate = useCallback(() => { - // TODO: pause generate - console.log('pause generate'); - }, []); + // const pauseGenerate = useCallback(() => { + // // TODO: pause generate + // console.log('pause generate'); + // }, []); + const { mutateAsync: pauseGenerate } = useMutation({ + mutationKey: [DatasetKey.pauseGenerate], + mutationFn: async ({ + task_id, + type, + }: { + task_id: string; + type: GenerateType; + }) => { + const { data } = await agentService.cancelDataflow(task_id); + if (data.code === 0) { + message.success(t('message.operated')); + queryClient.invalidateQueries({ + queryKey: [type], + }); + } + return data; + }, + }); return { runGenerate: mutateAsync, pauseGenerate, data, loading }; }; diff --git a/web/src/pages/dataset/dataset/parsing-status-cell.tsx b/web/src/pages/dataset/dataset/parsing-status-cell.tsx index 1f1703ea1..2bf8b0524 100644 --- a/web/src/pages/dataset/dataset/parsing-status-cell.tsx +++ b/web/src/pages/dataset/dataset/parsing-status-cell.tsx @@ -23,7 +23,9 @@ const IconMap = { [RunningStatus.UNSTART]: (
), - [RunningStatus.RUNNING]: , + [RunningStatus.RUNNING]: ( + + ), [RunningStatus.CANCEL]: ( ),