| 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 { | |
| useRemoveNextDocument, | |
| useRunNextDocument, | |
| useSetNextDocumentStatus, | |
| } from '@/hooks/document-hooks'; | |
| 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 styles from './index.less'; | |
| interface IProps { | |
| selectedRowKeys: string[]; | |
| showCreateModal(): void; | |
| showWebCrawlModal(): void; | |
| showDocumentUploadModal(): void; | |
| searchString: string; | |
| handleInputChange: React.ChangeEventHandler<HTMLInputElement>; | |
| } | |
| const DocumentToolbar = ({ | |
| searchString, | |
| selectedRowKeys, | |
| showCreateModal, | |
| showDocumentUploadModal, | |
| handleInputChange, | |
| }: IProps) => { | |
| const { t } = useTranslate('knowledgeDetails'); | |
| const { removeDocument } = useRemoveNextDocument(); | |
| const showDeleteConfirm = useShowDeleteConfirm(); | |
| const { runDocumentByIds } = useRunNextDocument(); | |
| const { setDocumentStatus } = useSetNextDocumentStatus(); | |
| 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: '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({ | |
| documentIds: selectedRowKeys, | |
| run, | |
| }); | |
| }, | |
| [runDocumentByIds, selectedRowKeys], | |
| ); | |
| const handleRunClick = useCallback(() => { | |
| runDocument(1); | |
| }, [runDocument]); | |
| const handleCancelClick = useCallback(() => { | |
| runDocument(2); | |
| }, [runDocument]); | |
| const onChangeStatus = useCallback( | |
| (enabled: boolean) => { | |
| selectedRowKeys.forEach((id) => { | |
| setDocumentStatus({ status: enabled, documentId: id }); | |
| }); | |
| }, | |
| [selectedRowKeys, setDocumentStatus], | |
| ); | |
| 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; | |