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 <yingfeng.zhang@gmail.com>
This commit is contained in:
balibabu
2026-04-14 18:07:32 +08:00
committed by GitHub
parent 576431de99
commit 1bc4868abe
13 changed files with 123 additions and 70 deletions

View File

@@ -215,7 +215,6 @@ export function ChunkMethodDialog({
const showAutoKeywords = useShowAutoKeywords();
async function onSubmit(data: z.infer<typeof FormSchema>) {
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({
<ExcelToHtmlFormField></ExcelToHtmlFormField>
)}
</div>
{/* {showRaptorParseConfiguration(
selectedTag as DocumentParserType,
) && (
<FormContainer>
<RaptorFormFields></RaptorFormFields>
</FormContainer>
)} */}
{/* {showGraphRagItems(selectedTag as DocumentParserType) &&
useGraphRag && (
<FormContainer>
<UseGraphRagFormField></UseGraphRagFormField>
</FormContainer>
)} */}
<div className="space-y-6 border-t-0.5 border-border-button pt-6 empty:hidden">
{showEntityTypes && <EntityTypesFormField />}
</div>

View File

@@ -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<IDocumentInfo[]>([]);
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,

View File

@@ -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<IKnowledgeResult>({
const { data, isFetching: loading } = useQuery<IDatasetListResult>({
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<IKnowledge>({
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;
},
});

View File

@@ -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<string>;
id: string;
language: string;
mindmap_task_finish_at: null;
mindmap_task_id: Nullable<string>;
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;
}

View File

@@ -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 {

View File

@@ -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);

View File

@@ -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 = (

View File

@@ -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 {

View File

@@ -10,7 +10,7 @@ export default function DatasetWrapper() {
return (
<KnowledgeBaseProvider knowledgeBase={data} loading={loading}>
<article className="pt-3 size-full grid grid-cols-[auto_1fr] grid-rows-1">
<SideBar />
<SideBar dataset={data} />
<Outlet />
</article>

View File

@@ -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();

View File

@@ -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<ReturnType<typeof useRenameDataset>, 'showDatasetRenameModal'>;
export function DatasetCard({

View File

@@ -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<ReturnType<typeof useRenameDataset>, 'showDatasetRenameModal'> & {
dataset: IKnowledge;
dataset: IDataset;
}) {
const { t } = useTranslation();
const { deleteKnowledge } = useDeleteKnowledge();

View File

@@ -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<IKnowledge>({} as IKnowledge);
const [dataset, setDataset] = useState<IDataset>({} 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();
},