@@ -25,8 +29,8 @@ export default function Dataset() {
Upload file
+
-
{documentUploadVisible && (
,
+ onClick: () => {},
+ },
+ {
+ id: 'disabled',
+ label: t('knowledgeDetails.disabled'),
+ icon: ,
+ onClick: () => {},
+ },
+ {
+ id: 'run',
+ label: t('knowledgeDetails.run'),
+ icon: ,
+ onClick: () => {},
+ },
+ {
+ id: 'cancel',
+ label: t('knowledgeDetails.cancel'),
+ icon: ,
+ onClick: () => {},
+ },
+ {
+ id: 'delete',
+ label: t('common.delete'),
+ icon: ,
+ onClick: () => {},
+ },
+ ];
+
+ return { list };
+}
diff --git a/web/src/pages/datasets/index.tsx b/web/src/pages/datasets/index.tsx
index e1db3cebb..ce9f7e359 100644
--- a/web/src/pages/datasets/index.tsx
+++ b/web/src/pages/datasets/index.tsx
@@ -5,6 +5,7 @@ import { useFetchNextKnowledgeListByPage } from '@/hooks/use-knowledge-request';
import { pick } from 'lodash';
import { Plus } from 'lucide-react';
import { PropsWithChildren, useCallback } from 'react';
+import { useTranslation } from 'react-i18next';
import { DatasetCard } from './dataset-card';
import { DatasetCreatingDialog } from './dataset-creating-dialog';
import { DatasetsFilterPopover } from './datasets-filter-popover';
@@ -13,6 +14,7 @@ import { useSaveKnowledge } from './hooks';
import { useRenameDataset } from './use-rename-dataset';
export default function Datasets() {
+ const { t } = useTranslation();
const {
visible,
hideModal,
@@ -63,8 +65,8 @@ export default function Datasets() {
>
- Create dataset
{kbs.map((dataset) => {
diff --git a/web/src/pages/files/action-cell.tsx b/web/src/pages/files/action-cell.tsx
index f6b7d4663..e4893778a 100644
--- a/web/src/pages/files/action-cell.tsx
+++ b/web/src/pages/files/action-cell.tsx
@@ -17,12 +17,12 @@ import {
UseHandleConnectToKnowledgeReturnType,
UseRenameCurrentFileReturnType,
} from './hooks';
-import { UseMoveDocumentReturnType } from './use-move-file';
+import { UseMoveDocumentShowType } from './use-move-file';
type IProps = Pick, 'row'> &
Pick &
Pick &
- Pick;
+ UseMoveDocumentShowType;
export function ActionCell({
row,
diff --git a/web/src/pages/files/files-table.tsx b/web/src/pages/files/files-table.tsx
index 85eb4b156..65f5950cd 100644
--- a/web/src/pages/files/files-table.tsx
+++ b/web/src/pages/files/files-table.tsx
@@ -3,6 +3,8 @@
import {
ColumnDef,
ColumnFiltersState,
+ OnChangeFn,
+ RowSelectionState,
SortingState,
VisibilityState,
flexRender,
@@ -33,7 +35,7 @@ import {
TooltipContent,
TooltipTrigger,
} from '@/components/ui/tooltip';
-import { useFetchFileList } from '@/hooks/file-manager-hooks';
+import { useFetchFileList } from '@/hooks/use-file-request';
import { IFile } from '@/interfaces/database/file-manager';
import { cn } from '@/lib/utils';
import { formatFileSize } from '@/utils/common-util';
@@ -44,18 +46,33 @@ import { useTranslation } from 'react-i18next';
import { ActionCell } from './action-cell';
import { useHandleConnectToKnowledge, useRenameCurrentFile } from './hooks';
import { LinkToDatasetDialog } from './link-to-dataset-dialog';
-import { MoveDialog } from './move-dialog';
-import { useHandleMoveFile } from './use-move-file';
+import { UseMoveDocumentShowType } from './use-move-file';
import { useNavigateToOtherFolder } from './use-navigate-to-folder';
-export function FilesTable() {
+type FilesTableProps = Pick<
+ ReturnType,
+ 'files' | 'loading' | 'pagination' | 'setPagination' | 'total'
+> & {
+ rowSelection: RowSelectionState;
+ setRowSelection: OnChangeFn;
+} & UseMoveDocumentShowType;
+
+export function FilesTable({
+ files,
+ total,
+ pagination,
+ setPagination,
+ loading,
+ rowSelection,
+ setRowSelection,
+ showMoveFileModal,
+}: FilesTableProps) {
const [sorting, setSorting] = React.useState([]);
const [columnFilters, setColumnFilters] = React.useState(
[],
);
const [columnVisibility, setColumnVisibility] =
React.useState({});
- const [rowSelection, setRowSelection] = React.useState({});
const { t } = useTranslation('translation', {
keyPrefix: 'fileManager',
});
@@ -77,16 +94,6 @@ export function FilesTable() {
fileRenameLoading,
} = useRenameCurrentFile();
- const {
- showMoveFileModal,
- moveFileVisible,
- onMoveFileOk,
- hideMoveFileModal,
- moveFileLoading,
- } = useHandleMoveFile();
-
- const { pagination, data, loading, setPagination } = useFetchFileList();
-
const columns: ColumnDef[] = [
{
id: 'select',
@@ -244,7 +251,7 @@ export function FilesTable() {
}, [pagination]);
const table = useReactTable({
- data: data?.files || [],
+ data: files || [],
columns,
onSortingChange: setSorting,
onColumnFiltersChange: setColumnFilters,
@@ -277,7 +284,7 @@ export function FilesTable() {
rowSelection,
pagination: currentPagination,
},
- rowCount: data?.total ?? 0,
+ rowCount: total ?? 0,
debugTable: true,
});
@@ -333,8 +340,8 @@ export function FilesTable() {
- {table.getFilteredSelectedRowModel().rows.length} of {data?.total}{' '}
- row(s) selected.
+ {table.getFilteredSelectedRowModel().rows.length} of {total} row(s)
+ selected.
);
}
diff --git a/web/src/pages/files/hooks.ts b/web/src/pages/files/hooks.ts
index 99fedb024..171a25e29 100644
--- a/web/src/pages/files/hooks.ts
+++ b/web/src/pages/files/hooks.ts
@@ -1,7 +1,6 @@
-import { useSetModalState, useShowDeleteConfirm } from '@/hooks/common-hooks';
+import { useSetModalState } from '@/hooks/common-hooks';
import {
useConnectToKnowledge,
- useDeleteFile,
useRenameFile,
} from '@/hooks/file-manager-hooks';
import { IFile } from '@/interfaces/database/file-manager';
@@ -77,29 +76,6 @@ export type UseRenameCurrentFileReturnType = ReturnType<
typeof useRenameCurrentFile
>;
-export const useHandleDeleteFile = (
- fileIds: string[],
- setSelectedRowKeys: (keys: string[]) => void,
-) => {
- const { deleteFile: removeDocument } = useDeleteFile();
- const showDeleteConfirm = useShowDeleteConfirm();
- const parentId = useGetFolderId();
-
- const handleRemoveFile = () => {
- showDeleteConfirm({
- onOk: async () => {
- const code = await removeDocument({ fileIds, parentId });
- if (code === 0) {
- setSelectedRowKeys([]);
- }
- return;
- },
- });
- };
-
- return { handleRemoveFile };
-};
-
export const useHandleConnectToKnowledge = () => {
const {
visible: connectToKnowledgeVisible,
diff --git a/web/src/pages/files/index.tsx b/web/src/pages/files/index.tsx
index 3226f6a08..b20b7a607 100644
--- a/web/src/pages/files/index.tsx
+++ b/web/src/pages/files/index.tsx
@@ -1,3 +1,4 @@
+import { BulkOperateBar } from '@/components/bulk-operate-bar';
import { FileUploadDialog } from '@/components/file-upload-dialog';
import ListFilterBar from '@/components/list-filter-bar';
import { Button } from '@/components/ui/button';
@@ -8,12 +9,19 @@ import {
DropdownMenuSeparator,
DropdownMenuTrigger,
} from '@/components/ui/dropdown-menu';
+import { useFetchFileList } from '@/hooks/use-file-request';
+import { RowSelectionState } from '@tanstack/react-table';
+import { isEmpty } from 'lodash';
import { Upload } from 'lucide-react';
+import { useState } from 'react';
import { useTranslation } from 'react-i18next';
import { CreateFolderDialog } from './create-folder-dialog';
import { FileBreadcrumb } from './file-breadcrumb';
import { FilesTable } from './files-table';
+import { MoveDialog } from './move-dialog';
+import { useBulkOperateFile } from './use-bulk-operate-file';
import { useHandleCreateFolder } from './use-create-folder';
+import { useHandleMoveFile } from './use-move-file';
import { useHandleUploadFile } from './use-upload-file';
export default function Files() {
@@ -34,6 +42,33 @@ export default function Files() {
onFolderCreateOk,
} = useHandleCreateFolder();
+ const {
+ pagination,
+ files,
+ total,
+ loading,
+ setPagination,
+ searchString,
+ handleInputChange,
+ } = useFetchFileList();
+
+ const {
+ showMoveFileModal,
+ moveFileVisible,
+ onMoveFileOk,
+ hideMoveFileModal,
+ moveFileLoading,
+ } = useHandleMoveFile();
+
+ const [rowSelection, setRowSelection] = useState
({});
+
+ const { list } = useBulkOperateFile({
+ files,
+ rowSelection,
+ showMoveFileModal,
+ setRowSelection,
+ });
+
const leftPanel = (
@@ -42,7 +77,12 @@ export default function Files() {
return (
-
+
-
+ {!isEmpty(rowSelection) && }
+
{fileUploadVisible && (
)}
+
+ {moveFileVisible && (
+
+ )}
);
}
diff --git a/web/src/pages/files/use-bulk-operate-file.tsx b/web/src/pages/files/use-bulk-operate-file.tsx
new file mode 100644
index 000000000..a4f9f6cc4
--- /dev/null
+++ b/web/src/pages/files/use-bulk-operate-file.tsx
@@ -0,0 +1,53 @@
+import { IFile } from '@/interfaces/database/file-manager';
+import { OnChangeFn, RowSelectionState } from '@tanstack/react-table';
+import { FolderInput, Trash2 } from 'lucide-react';
+import { useMemo } from 'react';
+import { useTranslation } from 'react-i18next';
+import { useHandleDeleteFile } from './use-delete-file';
+import { UseMoveDocumentShowType } from './use-move-file';
+
+export function useBulkOperateFile({
+ files,
+ rowSelection,
+ showMoveFileModal,
+ setRowSelection,
+}: {
+ files: IFile[];
+ rowSelection: RowSelectionState;
+ setRowSelection: OnChangeFn;
+} & UseMoveDocumentShowType) {
+ const { t } = useTranslation();
+
+ const selectedIds = useMemo(() => {
+ const indexes = Object.keys(rowSelection);
+ return files
+ .filter((x, idx) => indexes.some((y) => Number(y) === idx))
+ .map((x) => x.id);
+ }, [files, rowSelection]);
+
+ const { handleRemoveFile } = useHandleDeleteFile();
+
+ const list = [
+ {
+ id: 'move',
+ label: t('common.move'),
+ icon: ,
+ onClick: () => {
+ showMoveFileModal(selectedIds);
+ },
+ },
+ {
+ id: 'delete',
+ label: t('common.delete'),
+ icon: ,
+ onClick: async () => {
+ const code = await handleRemoveFile(selectedIds);
+ if (code === 0) {
+ setRowSelection({});
+ }
+ },
+ },
+ ];
+
+ return { list };
+}
diff --git a/web/src/pages/files/use-delete-file.ts b/web/src/pages/files/use-delete-file.ts
new file mode 100644
index 000000000..bf3fed528
--- /dev/null
+++ b/web/src/pages/files/use-delete-file.ts
@@ -0,0 +1,19 @@
+import { useDeleteFile } from '@/hooks/use-file-request';
+import { useCallback } from 'react';
+import { useGetFolderId } from './hooks';
+
+export const useHandleDeleteFile = () => {
+ const { deleteFile: removeDocument } = useDeleteFile();
+ const parentId = useGetFolderId();
+
+ const handleRemoveFile = useCallback(
+ async (fileIds: string[]) => {
+ const code = await removeDocument({ fileIds, parentId });
+
+ return code;
+ },
+ [parentId, removeDocument],
+ );
+
+ return { handleRemoveFile };
+};
diff --git a/web/src/pages/files/use-move-file.ts b/web/src/pages/files/use-move-file.ts
index 5b2294a0d..d73061b77 100644
--- a/web/src/pages/files/use-move-file.ts
+++ b/web/src/pages/files/use-move-file.ts
@@ -2,49 +2,52 @@ import { useSetModalState } from '@/hooks/common-hooks';
import { useMoveFile } from '@/hooks/use-file-request';
import { useCallback, useState } from 'react';
-export const useHandleMoveFile = () =>
- // setSelectedRowKeys: (keys: string[]) => void,
- {
- const {
- visible: moveFileVisible,
- hideModal: hideMoveFileModal,
- showModal: showMoveFileModal,
- } = useSetModalState();
- const { moveFile, loading } = useMoveFile();
- const [sourceFileIds, setSourceFileIds] = useState([]);
+export const useHandleMoveFile = () => {
+ const {
+ visible: moveFileVisible,
+ hideModal: hideMoveFileModal,
+ showModal: showMoveFileModal,
+ } = useSetModalState();
+ const { moveFile, loading } = useMoveFile();
+ const [sourceFileIds, setSourceFileIds] = useState([]);
- const onMoveFileOk = useCallback(
- async (targetFolderId: string) => {
- const ret = await moveFile({
- src_file_ids: sourceFileIds,
- dest_file_id: targetFolderId,
- });
+ const onMoveFileOk = useCallback(
+ async (targetFolderId: string) => {
+ const ret = await moveFile({
+ src_file_ids: sourceFileIds,
+ dest_file_id: targetFolderId,
+ });
- if (ret === 0) {
- // setSelectedRowKeys([]);
- hideMoveFileModal();
- }
- return ret;
- },
- [moveFile, hideMoveFileModal, sourceFileIds],
- );
+ if (ret === 0) {
+ // setSelectedRowKeys([]);
+ hideMoveFileModal();
+ }
+ return ret;
+ },
+ [moveFile, hideMoveFileModal, sourceFileIds],
+ );
- const handleShowMoveFileModal = useCallback(
- (ids: string[]) => {
- setSourceFileIds(ids);
- showMoveFileModal();
- },
- [showMoveFileModal],
- );
+ const handleShowMoveFileModal = useCallback(
+ (ids: string[]) => {
+ setSourceFileIds(ids);
+ showMoveFileModal();
+ },
+ [showMoveFileModal],
+ );
- return {
- initialValue: '',
- moveFileLoading: loading,
- onMoveFileOk,
- moveFileVisible,
- hideMoveFileModal,
- showMoveFileModal: handleShowMoveFileModal,
- };
+ return {
+ initialValue: '',
+ moveFileLoading: loading,
+ onMoveFileOk,
+ moveFileVisible,
+ hideMoveFileModal,
+ showMoveFileModal: handleShowMoveFileModal,
};
+};
export type UseMoveDocumentReturnType = ReturnType;
+
+export type UseMoveDocumentShowType = Pick<
+ ReturnType,
+ 'showMoveFileModal'
+>;