Spaces:
Paused
Paused
import { ReactComponent as CancelIcon } from '@/assets/svg/cancel.svg'; | |
import { ReactComponent as DeleteIcon } from '@/assets/svg/delete.svg'; | |
import { ReactComponent as DisableIcon } from '@/assets/svg/disable.svg'; | |
import { ReactComponent as EnableIcon } from '@/assets/svg/enable.svg'; | |
import { ReactComponent as RunIcon } from '@/assets/svg/run.svg'; | |
import { useShowDeleteConfirm, useTranslate } from '@/hooks/common-hooks'; | |
import { | |
useRemoveDocument, | |
useRunDocument, | |
useSetDocumentStatus, | |
} from '@/hooks/document-hooks'; | |
import { useGetKnowledgeSearchParams } from '@/hooks/route-hook'; | |
import { | |
DownOutlined, | |
FileOutlined, | |
FileTextOutlined, | |
PlusOutlined, | |
SearchOutlined, | |
} from '@ant-design/icons'; | |
import { Button, Dropdown, Flex, Input, MenuProps, Space } from 'antd'; | |
import { useCallback, useMemo } from 'react'; | |
import { | |
useFetchDocumentListOnMount, | |
useGetPagination, | |
useHandleSearchChange, | |
} from './hooks'; | |
import styles from './index.less'; | |
interface IProps { | |
selectedRowKeys: string[]; | |
showCreateModal(): void; | |
showWebCrawlModal(): void; | |
showDocumentUploadModal(): void; | |
} | |
const DocumentToolbar = ({ | |
selectedRowKeys, | |
showCreateModal, | |
showWebCrawlModal, | |
showDocumentUploadModal, | |
}: IProps) => { | |
const { t } = useTranslate('knowledgeDetails'); | |
const { fetchDocumentList } = useFetchDocumentListOnMount(); | |
const { setPagination, searchString } = useGetPagination(fetchDocumentList); | |
const { handleInputChange } = useHandleSearchChange(setPagination); | |
const removeDocument = useRemoveDocument(); | |
const showDeleteConfirm = useShowDeleteConfirm(); | |
const runDocumentByIds = useRunDocument(); | |
const { knowledgeId } = useGetKnowledgeSearchParams(); | |
const changeStatus = useSetDocumentStatus(); | |
const actionItems: MenuProps['items'] = useMemo(() => { | |
return [ | |
{ | |
key: '1', | |
onClick: showDocumentUploadModal, | |
label: ( | |
<div> | |
<Button type="link"> | |
<Space> | |
<FileTextOutlined /> | |
{t('localFiles')} | |
</Space> | |
</Button> | |
</div> | |
), | |
}, | |
{ type: 'divider' }, | |
// { | |
// key: '2', | |
// onClick: showWebCrawlModal, | |
// label: ( | |
// <div> | |
// <Button type="link"> | |
// <FileTextOutlined /> | |
// {t('webCrawl')} | |
// </Button> | |
// </div> | |
// ), | |
// }, | |
{ type: 'divider' }, | |
{ | |
key: '3', | |
onClick: showCreateModal, | |
label: ( | |
<div> | |
<Button type="link"> | |
<FileOutlined /> | |
{t('emptyFiles')} | |
</Button> | |
</div> | |
), | |
}, | |
]; | |
}, [showDocumentUploadModal, showCreateModal, t]); | |
const handleDelete = useCallback(() => { | |
showDeleteConfirm({ | |
onOk: () => { | |
removeDocument(selectedRowKeys); | |
}, | |
}); | |
}, [removeDocument, showDeleteConfirm, selectedRowKeys]); | |
const runDocument = useCallback( | |
(run: number) => { | |
runDocumentByIds({ | |
doc_ids: selectedRowKeys, | |
run, | |
knowledgeBaseId: knowledgeId, | |
}); | |
}, | |
[runDocumentByIds, selectedRowKeys, knowledgeId], | |
); | |
const handleRunClick = useCallback(() => { | |
runDocument(1); | |
}, [runDocument]); | |
const handleCancelClick = useCallback(() => { | |
runDocument(2); | |
}, [runDocument]); | |
const onChangeStatus = useCallback( | |
(enabled: boolean) => { | |
selectedRowKeys.forEach((id) => { | |
changeStatus(enabled, id); | |
}); | |
}, | |
[selectedRowKeys, changeStatus], | |
); | |
const handleEnableClick = useCallback(() => { | |
onChangeStatus(true); | |
}, [onChangeStatus]); | |
const handleDisableClick = useCallback(() => { | |
onChangeStatus(false); | |
}, [onChangeStatus]); | |
const disabled = selectedRowKeys.length === 0; | |
const items: MenuProps['items'] = useMemo(() => { | |
return [ | |
{ | |
key: '0', | |
onClick: handleEnableClick, | |
label: ( | |
<Flex gap={10}> | |
<EnableIcon></EnableIcon> | |
<b>{t('enabled')}</b> | |
</Flex> | |
), | |
}, | |
{ | |
key: '1', | |
onClick: handleDisableClick, | |
label: ( | |
<Flex gap={10}> | |
<DisableIcon></DisableIcon> | |
<b>{t('disabled')}</b> | |
</Flex> | |
), | |
}, | |
{ type: 'divider' }, | |
{ | |
key: '2', | |
onClick: handleRunClick, | |
label: ( | |
<Flex gap={10}> | |
<RunIcon></RunIcon> | |
<b>{t('run')}</b> | |
</Flex> | |
), | |
}, | |
{ | |
key: '3', | |
onClick: handleCancelClick, | |
label: ( | |
<Flex gap={10}> | |
<CancelIcon /> | |
<b>{t('cancel')}</b> | |
</Flex> | |
), | |
}, | |
{ type: 'divider' }, | |
{ | |
key: '4', | |
onClick: handleDelete, | |
label: ( | |
<Flex gap={10}> | |
<span className={styles.deleteIconWrapper}> | |
<DeleteIcon width={18} /> | |
</span> | |
<b>{t('delete', { keyPrefix: 'common' })}</b> | |
</Flex> | |
), | |
}, | |
]; | |
}, [ | |
handleDelete, | |
handleRunClick, | |
handleCancelClick, | |
t, | |
handleDisableClick, | |
handleEnableClick, | |
]); | |
return ( | |
<div className={styles.filter}> | |
<Dropdown | |
menu={{ items }} | |
placement="bottom" | |
arrow={false} | |
disabled={disabled} | |
> | |
<Button> | |
<Space> | |
<b> {t('bulk')}</b> | |
<DownOutlined /> | |
</Space> | |
</Button> | |
</Dropdown> | |
<Space> | |
<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 DocumentToolbar; | |