mirror of
https://github.com/infiniflow/ragflow.git
synced 2026-07-07 12:00:44 +08:00
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:
@@ -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>
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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;
|
||||
},
|
||||
});
|
||||
|
||||
79
web/src/interfaces/database/dataset.ts
Normal file
79
web/src/interfaces/database/dataset.ts
Normal 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;
|
||||
}
|
||||
@@ -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 {
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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 = (
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
@@ -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({
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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();
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user