| import { ReactComponent as DeleteIcon } from '@/assets/svg/delete.svg'; | |
| import { useTranslate } from '@/hooks/common-hooks'; | |
| import { | |
| DownOutlined, | |
| FileTextOutlined, | |
| FolderOpenOutlined, | |
| PlusOutlined, | |
| SearchOutlined, | |
| } from '@ant-design/icons'; | |
| import { | |
| Breadcrumb, | |
| BreadcrumbProps, | |
| Button, | |
| Dropdown, | |
| Flex, | |
| Input, | |
| MenuProps, | |
| Space, | |
| } from 'antd'; | |
| import { useCallback, useMemo } from 'react'; | |
| import { | |
| useHandleBreadcrumbClick, | |
| useHandleDeleteFile, | |
| useSelectBreadcrumbItems, | |
| } from './hooks'; | |
| import SvgIcon from '@/components/svg-icon'; | |
| import { | |
| IListResult, | |
| useFetchParentFolderList, | |
| } from '@/hooks/file-manager-hooks'; | |
| import styles from './index.less'; | |
| interface IProps | |
| extends Pick<IListResult, 'searchString' | 'handleInputChange'> { | |
| selectedRowKeys: string[]; | |
| showFolderCreateModal: () => void; | |
| showFileUploadModal: () => void; | |
| setSelectedRowKeys: (keys: string[]) => void; | |
| showMoveFileModal: (ids: string[]) => void; | |
| } | |
| const FileToolbar = ({ | |
| selectedRowKeys, | |
| showFolderCreateModal, | |
| showFileUploadModal, | |
| setSelectedRowKeys, | |
| searchString, | |
| handleInputChange, | |
| showMoveFileModal, | |
| }: IProps) => { | |
| const { t } = useTranslate('knowledgeDetails'); | |
| const breadcrumbItems = useSelectBreadcrumbItems(); | |
| const { handleBreadcrumbClick } = useHandleBreadcrumbClick(); | |
| const parentFolderList = useFetchParentFolderList(); | |
| const isKnowledgeBase = | |
| parentFolderList.at(-1)?.source_type === 'knowledgebase'; | |
| 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 handleShowMoveFileModal = useCallback(() => { | |
| showMoveFileModal(selectedRowKeys); | |
| }, [selectedRowKeys, showMoveFileModal]); | |
| 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> | |
| ), | |
| }, | |
| { | |
| key: '5', | |
| onClick: handleShowMoveFileModal, | |
| label: ( | |
| <Flex gap={10}> | |
| <span className={styles.deleteIconWrapper}> | |
| <SvgIcon name={`move`} width={18}></SvgIcon> | |
| </span> | |
| <b>{t('move', { keyPrefix: 'common' })}</b> | |
| </Flex> | |
| ), | |
| }, | |
| ]; | |
| }, [handleShowMoveFileModal, t, handleRemoveFile]); | |
| return ( | |
| <div className={styles.filter}> | |
| <Breadcrumb items={breadcrumbItems} itemRender={itemRender} /> | |
| <Space> | |
| {isKnowledgeBase || ( | |
| <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 />} | |
| /> | |
| {isKnowledgeBase || ( | |
| <Dropdown menu={{ items: actionItems }} trigger={['click']}> | |
| <Button type="primary" icon={<PlusOutlined />}> | |
| {t('addFile')} | |
| </Button> | |
| </Dropdown> | |
| )} | |
| </Space> | |
| </div> | |
| ); | |
| }; | |
| export default FileToolbar; | |