diff --git a/web/src/components/bulk-operate-bar.tsx b/web/src/components/bulk-operate-bar.tsx
index 6c9ceaf2c1..8ba2ab8c4f 100644
--- a/web/src/components/bulk-operate-bar.tsx
+++ b/web/src/components/bulk-operate-bar.tsx
@@ -50,7 +50,7 @@ export function BulkOperateBar({
-
+
{list.map((x) => {
const isDeleteItem = x.id === 'delete';
diff --git a/web/src/pages/files/files-table.tsx b/web/src/pages/files/files-table.tsx
index 339b21583f..3f565c7e59 100644
--- a/web/src/pages/files/files-table.tsx
+++ b/web/src/pages/files/files-table.tsx
@@ -43,7 +43,10 @@ import { useMemo } from 'react';
import { useTranslation } from 'react-i18next';
import { useNavigate } from 'react-router';
import { ActionCell } from './action-cell';
-import { useHandleConnectToKnowledge, useRenameCurrentFile } from './hooks';
+import {
+ UseHandleConnectToKnowledgeReturnType,
+ useRenameCurrentFile,
+} from './hooks';
import { KnowledgeCell } from './knowledge-cell';
import { LinkToDatasetDialog } from './link-to-dataset-dialog';
import { UseMoveDocumentShowType } from './use-move-file';
@@ -57,7 +60,9 @@ type FilesTableProps = Pick<
'files' | 'loading' | 'pagination' | 'setPagination' | 'total'
> &
Pick &
- UseMoveDocumentShowType;
+ UseMoveDocumentShowType & {
+ connectKnowledgeModal: UseHandleConnectToKnowledgeReturnType;
+ };
export function FilesTable({
files,
@@ -68,6 +73,7 @@ export function FilesTable({
rowSelection,
setRowSelection,
showMoveFileModal,
+ connectKnowledgeModal,
}: FilesTableProps) {
const [sorting, setSorting] = React.useState([]);
const [columnFilters, setColumnFilters] = React.useState(
@@ -87,7 +93,7 @@ export function FilesTable({
initialConnectedIds,
onConnectToKnowledgeOk,
connectToKnowledgeLoading,
- } = useHandleConnectToKnowledge();
+ } = connectKnowledgeModal;
const {
fileRenameVisible,
showFileRenameModal,
diff --git a/web/src/pages/files/hooks.ts b/web/src/pages/files/hooks.ts
index 02402f97e3..4fea3879da 100644
--- a/web/src/pages/files/hooks.ts
+++ b/web/src/pages/files/hooks.ts
@@ -82,6 +82,7 @@ export const useHandleConnectToKnowledge = () => {
const { connectFileToKnowledge: connectToKnowledge, loading } =
useConnectToKnowledge();
const [record, setRecord] = useState({} as IFile);
+ const [documentIds, setDocumentIds] = useState([]);
const initialValue = useMemo(() => {
return Array.isArray(record?.kbs_info)
@@ -92,7 +93,7 @@ export const useHandleConnectToKnowledge = () => {
const onConnectToKnowledgeOk = useCallback(
async (knowledgeIds: string[]) => {
const ret = await connectToKnowledge({
- fileIds: [record.id],
+ fileIds: documentIds,
kbIds: knowledgeIds,
});
@@ -101,12 +102,19 @@ export const useHandleConnectToKnowledge = () => {
}
return ret;
},
- [connectToKnowledge, hideConnectToKnowledgeModal, record.id],
+ [connectToKnowledge, hideConnectToKnowledgeModal, documentIds],
);
const handleShowConnectToKnowledgeModal = useCallback(
- (record: IFile) => {
- setRecord(record);
+ (documents: IFile | string[]) => {
+ if (Array.isArray(documents)) {
+ setDocumentIds(documents);
+ setRecord({} as IFile);
+ } else {
+ setRecord(documents);
+ setDocumentIds([documents.id]);
+ }
+
showConnectToKnowledgeModal();
},
[showConnectToKnowledgeModal],
diff --git a/web/src/pages/files/index.tsx b/web/src/pages/files/index.tsx
index ffa2f61431..23e42370c3 100644
--- a/web/src/pages/files/index.tsx
+++ b/web/src/pages/files/index.tsx
@@ -16,6 +16,10 @@ import { useTranslation } from 'react-i18next';
import { CreateFolderDialog } from './create-folder-dialog';
import { FileBreadcrumb } from './file-breadcrumb';
import { FilesTable } from './files-table';
+import {
+ useHandleConnectToKnowledge,
+ UseHandleConnectToKnowledgeReturnType,
+} from './hooks';
import { MoveDialog } from './move-dialog';
import { useBulkOperateFile } from './use-bulk-operate-file';
import { useHandleCreateFolder } from './use-create-folder';
@@ -67,11 +71,16 @@ export default function Files() {
moveFileLoading,
} = useHandleMoveFile({ clearRowSelection });
+ const connectKnowledgeModal: UseHandleConnectToKnowledgeReturnType =
+ useHandleConnectToKnowledge();
+
const { list } = useBulkOperateFile({
files,
rowSelection,
showMoveFileModal,
setRowSelection,
+ showConnectToKnowledgeModal:
+ connectKnowledgeModal.showConnectToKnowledgeModal,
});
const breadcrumbItems = useSelectBreadcrumbItems();
@@ -130,6 +139,7 @@ export default function Files() {
rowSelection={rowSelection}
setRowSelection={setRowSelection}
showMoveFileModal={showMoveFileModal}
+ connectKnowledgeModal={connectKnowledgeModal}
/>
diff --git a/web/src/pages/files/use-bulk-operate-file.tsx b/web/src/pages/files/use-bulk-operate-file.tsx
index 6f4a6dacf2..b343c04928 100644
--- a/web/src/pages/files/use-bulk-operate-file.tsx
+++ b/web/src/pages/files/use-bulk-operate-file.tsx
@@ -1,8 +1,9 @@
import { useSelectedIds } from '@/hooks/logic-hooks/use-row-selection';
import { IFile } from '@/interfaces/database/file-manager';
import { OnChangeFn, RowSelectionState } from '@tanstack/react-table';
-import { FolderInput, Trash2 } from 'lucide-react';
+import { FolderInput, Link2, Trash2 } from 'lucide-react';
import { useTranslation } from 'react-i18next';
+import { UseHandleConnectToKnowledgeReturnType } from './hooks';
import { useHandleDeleteFile } from './use-delete-file';
import { UseMoveDocumentShowType } from './use-move-file';
@@ -11,11 +12,14 @@ export function useBulkOperateFile({
rowSelection,
showMoveFileModal,
setRowSelection,
+ showConnectToKnowledgeModal,
}: {
files: IFile[];
rowSelection: RowSelectionState;
setRowSelection: OnChangeFn;
-} & UseMoveDocumentShowType) {
+} & UseMoveDocumentShowType & {
+ showConnectToKnowledgeModal: UseHandleConnectToKnowledgeReturnType['showConnectToKnowledgeModal'];
+ }) {
const { t } = useTranslation();
const { selectedIds } = useSelectedIds(rowSelection, files);
@@ -31,6 +35,14 @@ export function useBulkOperateFile({
showMoveFileModal(selectedIds, true);
},
},
+ {
+ id: 'link',
+ label: t('fileManager.addToKnowledge'),
+ icon: ,
+ onClick: async () => {
+ showConnectToKnowledgeModal(selectedIds);
+ },
+ },
{
id: 'delete',
label: t('common.delete'),