| 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' }, |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| { 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; |
|
|