balibabu
fix: #209 after saving the knowledge base configuration, jump to the dataset page (#212)
badd5fe
| import ChunkMethodModal from '@/components/chunk-method-modal'; | |
| import SvgIcon from '@/components/svg-icon'; | |
| import { | |
| useSelectDocumentList, | |
| useSetDocumentStatus, | |
| } from '@/hooks/documentHooks'; | |
| import { useSelectParserList } from '@/hooks/userSettingHook'; | |
| import { IKnowledgeFile } from '@/interfaces/database/knowledge'; | |
| import { getExtension } from '@/utils/documentUtils'; | |
| import { | |
| FileOutlined, | |
| FileTextOutlined, | |
| PlusOutlined, | |
| SearchOutlined, | |
| } from '@ant-design/icons'; | |
| import type { MenuProps } from 'antd'; | |
| import { | |
| Button, | |
| Divider, | |
| Dropdown, | |
| Flex, | |
| Input, | |
| Space, | |
| Switch, | |
| Table, | |
| Tag, | |
| } from 'antd'; | |
| import type { ColumnsType } from 'antd/es/table'; | |
| import { useMemo } from 'react'; | |
| import CreateFileModal from './create-file-modal'; | |
| import { | |
| useChangeDocumentParser, | |
| useCreateEmptyDocument, | |
| useFetchDocumentListOnMount, | |
| useGetPagination, | |
| useHandleSearchChange, | |
| useNavigateToOtherPage, | |
| useRenameDocument, | |
| } from './hooks'; | |
| import ParsingActionCell from './parsing-action-cell'; | |
| import ParsingStatusCell from './parsing-status-cell'; | |
| import RenameModal from './rename-modal'; | |
| import { useSetSelectedRecord } from '@/hooks/logicHooks'; | |
| import { useTranslation } from 'react-i18next'; | |
| import styles from './index.less'; | |
| const KnowledgeFile = () => { | |
| const data = useSelectDocumentList(); | |
| const { fetchDocumentList } = useFetchDocumentListOnMount(); | |
| const parserList = useSelectParserList(); | |
| const { pagination, setPagination, total, searchString } = | |
| useGetPagination(fetchDocumentList); | |
| const onChangeStatus = useSetDocumentStatus(); | |
| const { linkToUploadPage, toChunk } = useNavigateToOtherPage(); | |
| const { handleInputChange } = useHandleSearchChange(setPagination); | |
| const { currentRecord, setRecord } = useSetSelectedRecord(); | |
| const { | |
| renameLoading, | |
| onRenameOk, | |
| renameVisible, | |
| hideRenameModal, | |
| showRenameModal, | |
| } = useRenameDocument(currentRecord.id); | |
| const { | |
| createLoading, | |
| onCreateOk, | |
| createVisible, | |
| hideCreateModal, | |
| showCreateModal, | |
| } = useCreateEmptyDocument(); | |
| const { | |
| changeParserLoading, | |
| onChangeParserOk, | |
| changeParserVisible, | |
| hideChangeParserModal, | |
| showChangeParserModal, | |
| } = useChangeDocumentParser(currentRecord.id); | |
| const { t } = useTranslation('translation', { | |
| keyPrefix: 'knowledgeDetails', | |
| }); | |
| const actionItems: MenuProps['items'] = useMemo(() => { | |
| return [ | |
| { | |
| key: '1', | |
| onClick: linkToUploadPage, | |
| label: ( | |
| <div> | |
| <Button type="link"> | |
| <Space> | |
| <FileTextOutlined /> | |
| {t('localFiles')} | |
| </Space> | |
| </Button> | |
| </div> | |
| ), | |
| }, | |
| { type: 'divider' }, | |
| { | |
| key: '2', | |
| onClick: showCreateModal, | |
| label: ( | |
| <div> | |
| <Button type="link"> | |
| <FileOutlined /> | |
| {t('emptyFiles')} | |
| </Button> | |
| </div> | |
| ), | |
| // disabled: true, | |
| }, | |
| ]; | |
| }, [linkToUploadPage, showCreateModal, t]); | |
| const columns: ColumnsType<IKnowledgeFile> = [ | |
| { | |
| title: t('name'), | |
| dataIndex: 'name', | |
| key: 'name', | |
| fixed: 'left', | |
| render: (text: any, { id, thumbnail, name }) => ( | |
| <div className={styles.tochunks} onClick={() => toChunk(id)}> | |
| <Flex gap={10} align="center"> | |
| {thumbnail ? ( | |
| <img className={styles.img} src={thumbnail} alt="" /> | |
| ) : ( | |
| <SvgIcon | |
| name={`file-icon/${getExtension(name)}`} | |
| width={24} | |
| ></SvgIcon> | |
| )} | |
| {text} | |
| </Flex> | |
| </div> | |
| ), | |
| }, | |
| { | |
| title: t('chunkNumber'), | |
| dataIndex: 'chunk_num', | |
| key: 'chunk_num', | |
| }, | |
| { | |
| title: t('uploadDate'), | |
| dataIndex: 'create_date', | |
| key: 'create_date', | |
| }, | |
| { | |
| title: t('chunkMethod'), | |
| dataIndex: 'parser_id', | |
| key: 'parser_id', | |
| render: (text) => { | |
| return parserList.find((x) => x.value === text)?.label; | |
| }, | |
| }, | |
| { | |
| title: t('enabled'), | |
| key: 'status', | |
| dataIndex: 'status', | |
| render: (_, { status, id }) => ( | |
| <> | |
| <Switch | |
| defaultChecked={status === '1'} | |
| onChange={(e) => { | |
| onChangeStatus(e, id); | |
| }} | |
| /> | |
| </> | |
| ), | |
| }, | |
| { | |
| title: t('parsingStatus'), | |
| dataIndex: 'run', | |
| key: 'run', | |
| render: (text, record) => { | |
| return <ParsingStatusCell record={record}></ParsingStatusCell>; | |
| }, | |
| }, | |
| { | |
| title: t('action'), | |
| key: 'action', | |
| render: (_, record) => ( | |
| <ParsingActionCell | |
| setCurrentRecord={setRecord} | |
| showRenameModal={showRenameModal} | |
| showChangeParserModal={showChangeParserModal} | |
| record={record} | |
| ></ParsingActionCell> | |
| ), | |
| }, | |
| ]; | |
| const finalColumns = columns.map((x) => ({ | |
| ...x, | |
| className: `${styles.column}`, | |
| })); | |
| return ( | |
| <div className={styles.datasetWrapper}> | |
| <h3>{t('dataset')}</h3> | |
| <p>{t('datasetDescription')}</p> | |
| <Divider></Divider> | |
| <div className={styles.filter}> | |
| <Space> | |
| <h3>{t('total', { keyPrefix: 'common' })}</h3> | |
| <Tag color="purple">{total} files</Tag> | |
| </Space> | |
| <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> | |
| <Table | |
| rowKey="id" | |
| columns={finalColumns} | |
| dataSource={data} | |
| // loading={loading} | |
| pagination={pagination} | |
| scroll={{ scrollToFirstRowOnChange: true, x: 1300, y: 'fill' }} | |
| /> | |
| <CreateFileModal | |
| visible={createVisible} | |
| hideModal={hideCreateModal} | |
| loading={createLoading} | |
| onOk={onCreateOk} | |
| /> | |
| <ChunkMethodModal | |
| documentId={currentRecord.id} | |
| parserId={currentRecord.parser_id} | |
| parserConfig={currentRecord.parser_config} | |
| documentExtension={getExtension(currentRecord.name)} | |
| onOk={onChangeParserOk} | |
| visible={changeParserVisible} | |
| hideModal={hideChangeParserModal} | |
| loading={changeParserLoading} | |
| /> | |
| <RenameModal | |
| visible={renameVisible} | |
| onOk={onRenameOk} | |
| loading={renameLoading} | |
| hideModal={hideRenameModal} | |
| initialName={currentRecord.name} | |
| ></RenameModal> | |
| </div> | |
| ); | |
| }; | |
| export default KnowledgeFile; | |