mirror of
https://github.com/infiniflow/ragflow.git
synced 2025-12-19 12:06:42 +08:00
### What problem does this PR solve? #345 feat: translate FileManager feat: batch delete files from the file table in the knowledge base ### Type of change - [x] New Feature (non-breaking change which adds functionality)
164 lines
3.8 KiB
TypeScript
164 lines
3.8 KiB
TypeScript
import { ReactComponent as DeleteIcon } from '@/assets/svg/delete.svg';
|
|
import { useTranslate } from '@/hooks/commonHooks';
|
|
import {
|
|
DownOutlined,
|
|
FileTextOutlined,
|
|
FolderOpenOutlined,
|
|
PlusOutlined,
|
|
SearchOutlined,
|
|
} from '@ant-design/icons';
|
|
import {
|
|
Breadcrumb,
|
|
BreadcrumbProps,
|
|
Button,
|
|
Dropdown,
|
|
Flex,
|
|
Input,
|
|
MenuProps,
|
|
Space,
|
|
} from 'antd';
|
|
import { useMemo } from 'react';
|
|
import {
|
|
useFetchDocumentListOnMount,
|
|
useHandleBreadcrumbClick,
|
|
useHandleDeleteFile,
|
|
useHandleSearchChange,
|
|
useSelectBreadcrumbItems,
|
|
} from './hooks';
|
|
|
|
import styles from './index.less';
|
|
|
|
interface IProps {
|
|
selectedRowKeys: string[];
|
|
showFolderCreateModal: () => void;
|
|
showFileUploadModal: () => void;
|
|
setSelectedRowKeys: (keys: string[]) => void;
|
|
}
|
|
|
|
const FileToolbar = ({
|
|
selectedRowKeys,
|
|
showFolderCreateModal,
|
|
showFileUploadModal,
|
|
setSelectedRowKeys,
|
|
}: IProps) => {
|
|
const { t } = useTranslate('knowledgeDetails');
|
|
useFetchDocumentListOnMount();
|
|
const { handleInputChange, searchString } = useHandleSearchChange();
|
|
const breadcrumbItems = useSelectBreadcrumbItems();
|
|
const { handleBreadcrumbClick } = useHandleBreadcrumbClick();
|
|
|
|
const itemRender: BreadcrumbProps['itemRender'] = (
|
|
currentRoute,
|
|
params,
|
|
items,
|
|
) => {
|
|
const isLast = currentRoute?.path === items[items.length - 1]?.path;
|
|
|
|
return isLast ? (
|
|
<span>{currentRoute.title}</span>
|
|
) : (
|
|
<span
|
|
className={styles.breadcrumbItemButton}
|
|
onClick={() => handleBreadcrumbClick(currentRoute.path)}
|
|
>
|
|
{currentRoute.title}
|
|
</span>
|
|
);
|
|
};
|
|
|
|
const actionItems: MenuProps['items'] = useMemo(() => {
|
|
return [
|
|
{
|
|
key: '1',
|
|
onClick: showFileUploadModal,
|
|
label: (
|
|
<div>
|
|
<Button type="link">
|
|
<Space>
|
|
<FileTextOutlined />
|
|
{t('uploadFile', { keyPrefix: 'fileManager' })}
|
|
</Space>
|
|
</Button>
|
|
</div>
|
|
),
|
|
},
|
|
{ type: 'divider' },
|
|
{
|
|
key: '2',
|
|
onClick: showFolderCreateModal,
|
|
label: (
|
|
<div>
|
|
<Button type="link">
|
|
<Space>
|
|
<FolderOpenOutlined />
|
|
{t('newFolder', { keyPrefix: 'fileManager' })}
|
|
</Space>
|
|
</Button>
|
|
</div>
|
|
),
|
|
},
|
|
];
|
|
}, [t, showFolderCreateModal, showFileUploadModal]);
|
|
|
|
const { handleRemoveFile } = useHandleDeleteFile(
|
|
selectedRowKeys,
|
|
setSelectedRowKeys,
|
|
);
|
|
|
|
const disabled = selectedRowKeys.length === 0;
|
|
|
|
const items: MenuProps['items'] = useMemo(() => {
|
|
return [
|
|
{
|
|
key: '4',
|
|
onClick: handleRemoveFile,
|
|
label: (
|
|
<Flex gap={10}>
|
|
<span className={styles.deleteIconWrapper}>
|
|
<DeleteIcon width={18} />
|
|
</span>
|
|
<b>{t('delete', { keyPrefix: 'common' })}</b>
|
|
</Flex>
|
|
),
|
|
},
|
|
];
|
|
}, [handleRemoveFile, t]);
|
|
|
|
return (
|
|
<div className={styles.filter}>
|
|
<Breadcrumb items={breadcrumbItems} itemRender={itemRender} />
|
|
<Space>
|
|
<Dropdown
|
|
menu={{ items }}
|
|
placement="bottom"
|
|
arrow={false}
|
|
disabled={disabled}
|
|
>
|
|
<Button>
|
|
<Space>
|
|
<b> {t('bulk')}</b>
|
|
<DownOutlined />
|
|
</Space>
|
|
</Button>
|
|
</Dropdown>
|
|
<Input
|
|
placeholder={t('searchFiles')}
|
|
value={searchString}
|
|
style={{ width: 220 }}
|
|
allowClear
|
|
onChange={handleInputChange}
|
|
prefix={<SearchOutlined />}
|
|
/>
|
|
|
|
<Dropdown menu={{ items: actionItems }} trigger={['click']}>
|
|
<Button type="primary" icon={<PlusOutlined />}>
|
|
{t('addFile')}
|
|
</Button>
|
|
</Dropdown>
|
|
</Space>
|
|
</div>
|
|
);
|
|
};
|
|
|
|
export default FileToolbar;
|