From 1bc4868abe9063f52075843392e775ecc5137aa2 Mon Sep 17 00:00:00 2001 From: balibabu Date: Tue, 14 Apr 2026 18:07:32 +0800 Subject: [PATCH] Fix: The file count in the file header did not change after uploading or deleting files. (#14034) ### What problem does this PR solve? Fix: The file count in the file header did not change after uploading or deleting files. ### Type of change - [x] Bug Fix (non-breaking change which fixes an issue) Co-authored-by: Yingfeng --- .../components/chunk-method-dialog/index.tsx | 16 +--- web/src/hooks/use-document-request.ts | 12 ++- web/src/hooks/use-knowledge-request.ts | 33 +++----- web/src/interfaces/database/dataset.ts | 79 +++++++++++++++++++ web/src/interfaces/database/knowledge.ts | 10 ++- .../components/knowledge-chunk/index.tsx | 5 +- .../pages/dataset/dataset-setting/hooks.ts | 2 +- web/src/pages/dataset/dataset/index.tsx | 9 +-- web/src/pages/dataset/index.tsx | 2 +- web/src/pages/dataset/sidebar/index.tsx | 11 +-- web/src/pages/datasets/dataset-card.tsx | 4 +- web/src/pages/datasets/dataset-dropdown.tsx | 4 +- web/src/pages/datasets/use-rename-dataset.ts | 6 +- 13 files changed, 123 insertions(+), 70 deletions(-) create mode 100644 web/src/interfaces/database/dataset.ts diff --git a/web/src/components/chunk-method-dialog/index.tsx b/web/src/components/chunk-method-dialog/index.tsx index ddf39b637..aa6c23983 100644 --- a/web/src/components/chunk-method-dialog/index.tsx +++ b/web/src/components/chunk-method-dialog/index.tsx @@ -215,7 +215,6 @@ export function ChunkMethodDialog({ const showAutoKeywords = useShowAutoKeywords(); async function onSubmit(data: z.infer) { - console.log('🚀 ~ onSubmit ~ data:', data); const parserConfig = data.parser_config; const imageTableContextWindow = Number( parserConfig?.image_table_context_window || 0, @@ -234,7 +233,6 @@ export function ChunkMethodDialog({ pages: parserConfig?.pages?.map((x: any) => [x.from, x.to]) ?? [], }, }; - console.log('🚀 ~ onSubmit ~ nextData:', nextData); const ret = await onOk?.(nextData); if (ret) { hideModal?.(); @@ -378,19 +376,7 @@ export function ChunkMethodDialog({ )} - {/* {showRaptorParseConfiguration( - selectedTag as DocumentParserType, - ) && ( - - - - )} */} - {/* {showGraphRagItems(selectedTag as DocumentParserType) && - useGraphRag && ( - - - - )} */} +
{showEntityTypes && }
diff --git a/web/src/hooks/use-document-request.ts b/web/src/hooks/use-document-request.ts index ee37e5ef7..6ee6c3895 100644 --- a/web/src/hooks/use-document-request.ts +++ b/web/src/hooks/use-document-request.ts @@ -2,6 +2,7 @@ import { useHandleFilterSubmit } from '@/components/list-filter-bar/use-handle-f import { post } from '@/utils/next-request'; import message from '@/components/ui/message'; +import { RunningStatus } from '@/constants/knowledge'; import { ResponseType } from '@/interfaces/database/base'; import { IReferenceChunk } from '@/interfaces/database/chat'; import { @@ -25,7 +26,7 @@ import { buildChunkHighlights } from '@/utils/document-util'; import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'; import { useDebounce } from 'ahooks'; import { get } from 'lodash'; -import { useCallback, useMemo, useState } from 'react'; +import { useCallback, useEffect, useMemo, useState } from 'react'; import { IHighlight } from 'react-pdf-highlighter'; import { useParams } from 'react-router'; import { @@ -36,6 +37,7 @@ import { useGetKnowledgeSearchParams, useSetPaginationParams, } from './route-hook'; +import { KnowledgeApiAction } from './use-knowledge-request'; export const enum DocumentApiAction { UploadDocument = 'uploadDocument', @@ -105,7 +107,7 @@ export const useFetchDocumentList = (loop = true) => { const [docs, setDocs] = useState([]); const isLoop = useMemo(() => { - return loop && docs.some((doc) => doc.run === '1'); + return loop && docs.some((doc) => doc.run === RunningStatus.RUNNING); }, [docs, loop]); const { data, isFetching: loading } = useQuery<{ @@ -174,6 +176,12 @@ export const useFetchDocumentList = (loop = true) => { [handleInputChange, setPagination], ); + useEffect(() => { + queryClient.invalidateQueries({ + queryKey: [KnowledgeApiAction.FetchKnowledgeDetail], + }); + }, [data.docs, queryClient]); + return { loading, searchString, diff --git a/web/src/hooks/use-knowledge-request.ts b/web/src/hooks/use-knowledge-request.ts index af3a4a5cd..9a908a2da 100644 --- a/web/src/hooks/use-knowledge-request.ts +++ b/web/src/hooks/use-knowledge-request.ts @@ -2,10 +2,10 @@ import { useHandleFilterSubmit } from '@/components/list-filter-bar/use-handle-f import message from '@/components/ui/message'; import { ParseType } from '@/constants/knowledge'; import { ResponsePostType } from '@/interfaces/database/base'; +import { IDataset, IDatasetListResult } from '@/interfaces/database/dataset'; import { IKnowledge, IKnowledgeGraph, - IKnowledgeResult, INextTestingResult, IRenameTag, ITestingResult, @@ -148,7 +148,7 @@ export const useFetchNextKnowledgeListByPage = () => { const debouncedSearchString = useDebounce(searchString, { wait: 500 }); const { filterValue, handleFilterSubmit } = useHandleFilterSubmit(); - const { data, isFetching: loading } = useQuery({ + const { data, isFetching: loading } = useQuery({ queryKey: [ KnowledgeApiAction.FetchKnowledgeListByPage, { @@ -386,33 +386,22 @@ export const useUpdateKnowledge = (shouldFetchList = false) => { export const useFetchKnowledgeBaseConfiguration = (props?: { isEdit?: boolean; - refreshCount?: number; }) => { - const { isEdit = true, refreshCount } = props || { isEdit: true }; + const { isEdit = true } = props || { isEdit: true }; const { id } = useParams(); const [searchParams] = useSearchParams(); const knowledgeBaseId = searchParams.get('id') || id; - let queryKey: (KnowledgeApiAction | number)[] = [ - KnowledgeApiAction.FetchKnowledgeDetail, - ]; - if (typeof refreshCount === 'number') { - queryKey = [KnowledgeApiAction.FetchKnowledgeDetail, refreshCount]; - } - const { data, isFetching: loading } = useQuery({ - queryKey, + queryKey: [KnowledgeApiAction.FetchKnowledgeDetail, knowledgeBaseId], initialData: {} as IKnowledge, gcTime: 0, + enabled: !!knowledgeBaseId && isEdit, queryFn: async () => { - if (isEdit) { - const { data } = await kbService.getKbDetail({ - kb_id: knowledgeBaseId, - }); - return data?.data ?? {}; - } else { - return {}; - } + const { data } = await kbService.getKbDetail({ + kb_id: knowledgeBaseId, + }); + return data?.data ?? {}; }, }); @@ -481,7 +470,7 @@ export const useRemoveKnowledgeGraph = () => { export const useFetchKnowledgeList = ( shouldFilterListWithoutDocument: boolean = false, ): { - list: IKnowledge[]; + list: IDataset[]; loading: boolean; } => { const { data, isFetching: loading } = useQuery({ @@ -492,7 +481,7 @@ export const useFetchKnowledgeList = ( const { data } = await listDataset(); const list = data?.data ?? []; return shouldFilterListWithoutDocument - ? list.filter((x: IKnowledge) => x.chunk_count > 0) + ? list.filter((x: IDataset) => x.chunk_count > 0) : list; }, }); diff --git a/web/src/interfaces/database/dataset.ts b/web/src/interfaces/database/dataset.ts new file mode 100644 index 000000000..2a028a77d --- /dev/null +++ b/web/src/interfaces/database/dataset.ts @@ -0,0 +1,79 @@ +// for the dataset list +// The data structures returned by the `datasets` interface and `kb/detail` are inconsistent. + +export interface IDataset { + avatar?: string; + chunk_count: number; + chunk_method: string; + create_date: string; + create_time: number; + created_by: string; + description?: string; + document_count: number; + embedding_model: string; + graphrag_task_finish_at: null; + graphrag_task_id: Nullable; + id: string; + language: string; + mindmap_task_finish_at: null; + mindmap_task_id: Nullable; + name: string; + nickname: string; + pagerank: number; + parser_config: Parserconfig; + permission: string; + pipeline_id: string; + raptor_task_finish_at: string; + raptor_task_id: string; + similarity_threshold: number; + status: string; + tenant_avatar: string; + tenant_embd_id: number; + tenant_id: string; + token_num: number; + update_date: string; + update_time: number; + vector_similarity_weight: number; +} + +interface Parserconfig { + auto_keywords: number; + auto_questions: number; + children_delimiter: string; + chunk_token_num: number; + delimiter: string; + graphrag: Graphrag; + html4excel: boolean; + image_context_size: number; + layout_recognize: string; + llm_id: string; + parent_child: Parentchild; + raptor: Raptor; + table_context_size: number; + topn_tags: number; +} + +interface Raptor { + max_cluster: number; + max_token: number; + prompt: string; + random_seed: number; + threshold: number; + use_raptor: boolean; +} + +interface Parentchild { + children_delimiter: string; + use_parent_child: boolean; +} + +interface Graphrag { + entity_types: string[]; + method: string; + use_graphrag: boolean; +} + +export interface IDatasetListResult { + kbs: IDataset[]; + total_datasets: number; +} diff --git a/web/src/interfaces/database/knowledge.ts b/web/src/interfaces/database/knowledge.ts index 6ef02986b..8578e42b8 100644 --- a/web/src/interfaces/database/knowledge.ts +++ b/web/src/interfaces/database/knowledge.ts @@ -1,5 +1,5 @@ import { RunningStatus } from '@/constants/knowledge'; -import { DataSourceKey } from '@/pages/user-setting/data-source/contant'; +import { DataSourceKey } from '@/pages/user-setting/data-source/constant'; import { TreeData } from '@antv/g6/lib/types'; export interface IConnector { id: string; @@ -8,15 +8,15 @@ export interface IConnector { source: DataSourceKey; auto_parse?: '0' | '1'; } -// knowledge base +// knowledge base detail export interface IKnowledge { avatar?: any; - chunk_count: number; + chunk_num: number; create_date: string; create_time: number; created_by: string; description: string; - document_count: number; + doc_num: number; id: string; name: string; parser_config: ParserConfig; @@ -43,6 +43,8 @@ export interface IKnowledge { graphrag_task_finish_at: string; graphrag_task_id: string; connectors: IConnector[]; + embd_id: string; + parser_id: string; } export interface IKnowledgeResult { diff --git a/web/src/pages/chunk/parsed-result/add-knowledge/components/knowledge-chunk/index.tsx b/web/src/pages/chunk/parsed-result/add-knowledge/components/knowledge-chunk/index.tsx index 17e929451..2a2293750 100644 --- a/web/src/pages/chunk/parsed-result/add-knowledge/components/knowledge-chunk/index.tsx +++ b/web/src/pages/chunk/parsed-result/add-knowledge/components/knowledge-chunk/index.tsx @@ -35,7 +35,6 @@ import { QueryStringMap, useNavigatePage, } from '@/hooks/logic-hooks/navigate-hooks'; -import { useFetchKnowledgeBaseConfiguration } from '@/hooks/use-knowledge-request'; import { LucideArrowBigLeft } from 'lucide-react'; import styles from './index.module.less'; @@ -54,7 +53,6 @@ const Chunk = () => { } = useFetchNextChunkList(); const { handleChunkCardClick, selectedChunkId } = useHandleChunkCardClick(); const isPdf = documentInfo?.type === 'pdf'; - const { data: dataset } = useFetchKnowledgeBaseConfiguration(); const { t } = useTranslation(); const { changeChunkTextMode, textMode } = useChangeChunkTextMode(); @@ -69,8 +67,7 @@ const Chunk = () => { chunkUpdatingVisible, documentId, } = useUpdateChunk(); - const { navigateToDataFile, getQueryString, navigateToDatasetList } = - useNavigatePage(); + const { navigateToDataFile, getQueryString } = useNavigatePage(); const fileUrl = useGetDocumentUrl(false); useEffect(() => { setChunkList(data); diff --git a/web/src/pages/dataset/dataset-setting/hooks.ts b/web/src/pages/dataset/dataset-setting/hooks.ts index 536e35603..c42be72ff 100644 --- a/web/src/pages/dataset/dataset-setting/hooks.ts +++ b/web/src/pages/dataset/dataset-setting/hooks.ts @@ -31,7 +31,7 @@ export function useHasParsedDocument(isEdit?: boolean) { const { data: knowledgeDetails } = useFetchKnowledgeBaseConfiguration({ isEdit, }); - return knowledgeDetails.chunk_count > 0; + return knowledgeDetails.chunk_num > 0; } export const useFetchKnowledgeConfigurationOnMount = ( diff --git a/web/src/pages/dataset/dataset/index.tsx b/web/src/pages/dataset/dataset/index.tsx index bd8a4499e..6e232497b 100644 --- a/web/src/pages/dataset/dataset/index.tsx +++ b/web/src/pages/dataset/dataset/index.tsx @@ -18,7 +18,7 @@ import { useRowSelection } from '@/hooks/logic-hooks/use-row-selection'; import { useFetchDocumentList } from '@/hooks/use-document-request'; import { useFetchKnowledgeBaseConfiguration } from '@/hooks/use-knowledge-request'; import { LucidePlus } from 'lucide-react'; -import { useEffect, useMemo } from 'react'; +import { useEffect } from 'react'; import { useTranslation } from 'react-i18next'; import { MetadataType } from '../components/metedata/constant'; import { useManageMetadata } from '../components/metedata/hooks/use-manage-modal'; @@ -54,13 +54,8 @@ export default function Dataset() { checkValue, } = useFetchDocumentList(); - const refreshCount = useMemo(() => { - return documents.findIndex((doc) => doc.run === '1') + documents.length; - }, [documents]); + const { data: dataSetData } = useFetchKnowledgeBaseConfiguration(); - const { data: dataSetData } = useFetchKnowledgeBaseConfiguration({ - refreshCount, - }); const { filters, onOpenChange, filterGroup } = useSelectDatasetFilters(); const { diff --git a/web/src/pages/dataset/index.tsx b/web/src/pages/dataset/index.tsx index 6fb82c9f1..fa9acfe64 100644 --- a/web/src/pages/dataset/index.tsx +++ b/web/src/pages/dataset/index.tsx @@ -10,7 +10,7 @@ export default function DatasetWrapper() { return (
- +
diff --git a/web/src/pages/dataset/sidebar/index.tsx b/web/src/pages/dataset/sidebar/index.tsx index 3fb9a6311..35cbe32c1 100644 --- a/web/src/pages/dataset/sidebar/index.tsx +++ b/web/src/pages/dataset/sidebar/index.tsx @@ -14,25 +14,22 @@ import { IconFontFill } from '@/components/icon-font'; import { RAGFlowAvatar } from '@/components/ragflow-avatar'; import { Button } from '@/components/ui/button'; import { useSecondPathName } from '@/hooks/route-hook'; -import { - useFetchKnowledgeBaseConfiguration, - useFetchKnowledgeGraph, -} from '@/hooks/use-knowledge-request'; +import { useFetchKnowledgeGraph } from '@/hooks/use-knowledge-request'; import { cn, formatBytes } from '@/lib/utils'; import { Routes } from '@/routes'; import { formatPureDate } from '@/utils/date'; +import { IKnowledge } from '@/interfaces/database/knowledge'; import { useParams } from 'react-router'; type PropType = { refreshCount?: number; + dataset: IKnowledge; }; -export function SideBar({ refreshCount }: PropType) { +export function SideBar({ dataset: data }: PropType) { const pathName = useSecondPathName(); const { id } = useParams(); - // refreshCount: be for avatar img sync update on top left - const { data } = useFetchKnowledgeBaseConfiguration({ refreshCount }); const { data: routerData } = useFetchKnowledgeGraph(); const { t } = useTranslation(); diff --git a/web/src/pages/datasets/dataset-card.tsx b/web/src/pages/datasets/dataset-card.tsx index 338951b27..ca2398828 100644 --- a/web/src/pages/datasets/dataset-card.tsx +++ b/web/src/pages/datasets/dataset-card.tsx @@ -3,14 +3,14 @@ import { MoreButton } from '@/components/more-button'; import { SharedBadge } from '@/components/shared-badge'; import { Card, CardContent } from '@/components/ui/card'; import { useNavigatePage } from '@/hooks/logic-hooks/navigate-hooks'; -import { IKnowledge } from '@/interfaces/database/knowledge'; +import { IDataset } from '@/interfaces/database/dataset'; import { t } from 'i18next'; import { ChevronRight } from 'lucide-react'; import { DatasetDropdown } from './dataset-dropdown'; import { useRenameDataset } from './use-rename-dataset'; export type DatasetCardProps = { - dataset: IKnowledge; + dataset: IDataset; } & Pick, 'showDatasetRenameModal'>; export function DatasetCard({ diff --git a/web/src/pages/datasets/dataset-dropdown.tsx b/web/src/pages/datasets/dataset-dropdown.tsx index 966ffcd49..f70302947 100644 --- a/web/src/pages/datasets/dataset-dropdown.tsx +++ b/web/src/pages/datasets/dataset-dropdown.tsx @@ -10,7 +10,7 @@ import { DropdownMenuTrigger, } from '@/components/ui/dropdown-menu'; import { useDeleteKnowledge } from '@/hooks/use-knowledge-request'; -import { IKnowledge } from '@/interfaces/database/knowledge'; +import { IDataset } from '@/interfaces/database/dataset'; import { PenLine, Trash2 } from 'lucide-react'; import { MouseEventHandler, PropsWithChildren, useCallback } from 'react'; import { useTranslation } from 'react-i18next'; @@ -22,7 +22,7 @@ export function DatasetDropdown({ dataset, }: PropsWithChildren & Pick, 'showDatasetRenameModal'> & { - dataset: IKnowledge; + dataset: IDataset; }) { const { t } = useTranslation(); const { deleteKnowledge } = useDeleteKnowledge(); diff --git a/web/src/pages/datasets/use-rename-dataset.ts b/web/src/pages/datasets/use-rename-dataset.ts index e303bcc58..db318b5a8 100644 --- a/web/src/pages/datasets/use-rename-dataset.ts +++ b/web/src/pages/datasets/use-rename-dataset.ts @@ -1,10 +1,10 @@ import { useSetModalState } from '@/hooks/common-hooks'; import { useUpdateKnowledge } from '@/hooks/use-knowledge-request'; -import { IKnowledge } from '@/interfaces/database/knowledge'; +import { IDataset } from '@/interfaces/database/dataset'; import { useCallback, useState } from 'react'; export const useRenameDataset = () => { - const [dataset, setDataset] = useState({} as IKnowledge); + const [dataset, setDataset] = useState({} as IDataset); const { visible: datasetRenameVisible, hideModal: hideDatasetRenameModal, @@ -27,7 +27,7 @@ export const useRenameDataset = () => { ); const handleShowDatasetRenameModal = useCallback( - async (record: IKnowledge) => { + async (record: IDataset) => { setDataset(record); showDatasetRenameModal(); },