Fix file link-to-datasets to suport both replace and add (#817) (#16908)

This commit is contained in:
Wang Qi
2026-07-14 20:12:31 +08:00
committed by GitHub
parent 376a9057a8
commit 55d5879622
6 changed files with 157 additions and 18 deletions

View File

@@ -2,11 +2,17 @@ import message from '@/components/ui/message';
import { PaginationProps } from '@/interfaces/antd-compat';
import {
IFetchFileListResult,
IFile,
IFolder,
} from '@/interfaces/database/file-manager';
import { IConnectRequestBody } from '@/interfaces/request/file-manager';
import {
ConnectFileToKnowledgeMode,
IConnectRequestBody,
} from '@/interfaces/request/file-manager';
import fileManagerService from '@/services/file-manager-service';
import api from '@/utils/api';
import { downloadFileFromBlob } from '@/utils/file-util';
import request from '@/utils/request';
import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
import { useDebounce } from 'ahooks';
import { useCallback } from 'react';
@@ -294,12 +300,49 @@ export const useConnectToKnowledge = () => {
mutateAsync,
} = useMutation({
mutationKey: [FileApiAction.ConnectFileToKnowledge],
mutationFn: async (params: IConnectRequestBody) => {
const { data } = await fileManagerService.connectFileToKnowledge(params);
mutationFn: async (
params: IConnectRequestBody & {
mode: ConnectFileToKnowledgeMode;
kbsInfo: IFile['kbs_info'];
},
) => {
const { data } = await request.post(api.connectFileToKnowledge, {
data: { fileIds: params.fileIds, kbIds: params.kbIds },
params: { mode: params.mode },
});
if (data.code === 0) {
message.success(t('message.operated'));
const fileIdSet = new Set(params.fileIds);
queryClient.setQueriesData<IFetchFileListResult>(
{
queryKey: [FileApiAction.FetchFileList],
},
(oldData) => {
if (!oldData?.files) return oldData;
return {
...oldData,
files: oldData.files.map((file) => {
if (!fileIdSet.has(file.id)) return file;
const kbsInfo =
params.mode === 'replace'
? params.kbsInfo
: [
...(file.kbs_info ?? []),
...params.kbsInfo.filter(
(kb) =>
!(file.kbs_info ?? []).some(
(item) => item.kb_id === kb.kb_id,
),
),
];
return { ...file, kbs_info: kbsInfo };
}),
};
},
);
queryClient.invalidateQueries({
queryKey: [FileApiAction.FetchFileList],
refetchType: 'none',
});
}
return data.code;

View File

@@ -8,3 +8,5 @@ export interface IConnectRequestBody {
fileIds: string[];
kbIds: string[];
}
export type ConnectFileToKnowledgeMode = 'add' | 'replace';

View File

@@ -1,7 +1,9 @@
import { useSetModalState } from '@/hooks/common-hooks';
import { useConnectToKnowledge, useRenameFile } from '@/hooks/use-file-request';
import { useSelectKnowledgeOptions } from '@/hooks/use-knowledge-request';
import { TableRowSelection } from '@/interfaces/antd-compat';
import { IFile } from '@/interfaces/database/file-manager';
import { ConnectFileToKnowledgeMode } from '@/interfaces/request/file-manager';
import { useCallback, useMemo, useState } from 'react';
import { useNavigate, useSearchParams } from 'react-router';
@@ -83,6 +85,8 @@ export const useHandleConnectToKnowledge = () => {
useConnectToKnowledge();
const [record, setRecord] = useState<IFile>({} as IFile);
const [documentIds, setDocumentIds] = useState<string[]>([]);
const [mode, setMode] = useState<ConnectFileToKnowledgeMode>('replace');
const knowledgeOptions = useSelectKnowledgeOptions();
const initialValue = useMemo(() => {
return Array.isArray(record?.kbs_info)
@@ -90,11 +94,25 @@ export const useHandleConnectToKnowledge = () => {
: [];
}, [record?.kbs_info]);
const knowledgeNameMap = useMemo(() => {
return new Map(
knowledgeOptions?.map((option) => [
option.value,
typeof option.label === 'string' ? option.label : String(option.label),
]) ?? [],
);
}, [knowledgeOptions]);
const onConnectToKnowledgeOk = useCallback(
async (knowledgeIds: string[]) => {
const ret = await connectToKnowledge({
fileIds: documentIds,
kbIds: knowledgeIds,
mode,
kbsInfo: knowledgeIds.map((id) => ({
kb_id: id,
kb_name: knowledgeNameMap.get(id) ?? id,
})),
});
if (ret === 0) {
@@ -102,7 +120,13 @@ export const useHandleConnectToKnowledge = () => {
}
return ret;
},
[connectToKnowledge, hideConnectToKnowledgeModal, documentIds],
[
connectToKnowledge,
hideConnectToKnowledgeModal,
documentIds,
mode,
knowledgeNameMap,
],
);
const handleShowConnectToKnowledgeModal = useCallback(
@@ -110,9 +134,11 @@ export const useHandleConnectToKnowledge = () => {
if (Array.isArray(documents)) {
setDocumentIds(documents);
setRecord({} as IFile);
setMode('add');
} else {
setRecord(documents);
setDocumentIds([documents.id]);
setMode('replace');
}
showConnectToKnowledgeModal();