Add Bulk action for linking Multiple Files to Datasets (#14960)

### What problem does this PR solve?

Feature: #14961 


### Type of change

- [x] New Feature (non-breaking change which adds functionality)
- [x] Refactoring
This commit is contained in:
Julian
2026-06-02 06:23:33 +02:00
committed by GitHub
parent 0f6f7b3c3c
commit 33ef724b5f
5 changed files with 46 additions and 10 deletions

View File

@@ -50,7 +50,7 @@ export function BulkOperateBar({
<Separator orientation={'vertical'} className="h-[1em]"></Separator>
<ul className="flex gap-2">
<ul className="flex gap-3">
{list.map((x) => {
const isDeleteItem = x.id === 'delete';

View File

@@ -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<UseRowSelectionType, 'rowSelection' | 'setRowSelection'> &
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<SortingState>([]);
const [columnFilters, setColumnFilters] = React.useState<ColumnFiltersState>(
@@ -87,7 +93,7 @@ export function FilesTable({
initialConnectedIds,
onConnectToKnowledgeOk,
connectToKnowledgeLoading,
} = useHandleConnectToKnowledge();
} = connectKnowledgeModal;
const {
fileRenameVisible,
showFileRenameModal,

View File

@@ -82,6 +82,7 @@ export const useHandleConnectToKnowledge = () => {
const { connectFileToKnowledge: connectToKnowledge, loading } =
useConnectToKnowledge();
const [record, setRecord] = useState<IFile>({} as IFile);
const [documentIds, setDocumentIds] = useState<string[]>([]);
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],

View File

@@ -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}
/>
</div>

View File

@@ -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<RowSelectionState>;
} & 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: <Link2 />,
onClick: async () => {
showConnectToKnowledgeModal(selectedIds);
},
},
{
id: 'delete',
label: t('common.delete'),