diff --git a/web/src/components/chunk-method-modal/hooks.ts b/web/src/components/chunk-method-modal/hooks.ts new file mode 100644 index 0000000000000000000000000000000000000000..193d3f9c4a6c82aef4ce3cb09a753230a256b9b4 --- /dev/null +++ b/web/src/components/chunk-method-modal/hooks.ts @@ -0,0 +1,82 @@ +import { + useFetchTenantInfo, + useSelectParserList, +} from '@/hooks/userSettingHook'; +import { useEffect, useMemo, useState } from 'react'; + +const ParserListMap = new Map([ + [ + ['pdf'], + [ + 'naive', + 'resume', + 'manual', + 'paper', + 'book', + 'laws', + 'presentation', + 'one', + ], + ], + [ + ['doc', 'docx'], + ['naive', 'resume', 'book', 'laws', 'one'], + ], + [ + ['xlsx', 'xls'], + ['naive', 'qa', 'table', 'one'], + ], + [['ppt', 'pptx'], ['presentation']], + [ + ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'tif', 'tiff', 'webp', 'svg', 'ico'], + ['picture'], + ], + [['txt'], ['naive', 'resume', 'book', 'laws', 'one', 'qa', 'table']], + [['csv'], ['naive', 'resume', 'book', 'laws', 'one', 'qa', 'table']], +]); + +const getParserList = ( + values: string[], + parserList: Array<{ + value: string; + label: string; + }>, +) => { + return parserList.filter((x) => values?.some((y) => y === x.value)); +}; + +export const useFetchParserListOnMount = ( + parserId: string, + documentExtension: string, +) => { + const [selectedTag, setSelectedTag] = useState(''); + const parserList = useSelectParserList(); + + const nextParserList = useMemo(() => { + const key = [...ParserListMap.keys()].find((x) => + x.some((y) => y === documentExtension), + ); + if (key) { + const values = ParserListMap.get(key); + return getParserList(values ?? [], parserList); + } + + return getParserList( + ['naive', 'resume', 'book', 'laws', 'one', 'qa', 'table'], + parserList, + ); + }, [parserList, documentExtension]); + + useFetchTenantInfo(); + + useEffect(() => { + setSelectedTag(parserId); + }, [parserId]); + + const handleChange = (tag: string, checked: boolean) => { + const nextSelectedTag = checked ? tag : selectedTag; + setSelectedTag(nextSelectedTag); + }; + + return { parserList: nextParserList, handleChange, selectedTag }; +}; diff --git a/web/src/components/chunk-method-modal/index.less b/web/src/components/chunk-method-modal/index.less new file mode 100644 index 0000000000000000000000000000000000000000..8123b026cf0c30920ecf87dbe5c578b981edb9ad --- /dev/null +++ b/web/src/components/chunk-method-modal/index.less @@ -0,0 +1,10 @@ +.pageInputNumber { + width: 220px; +} + +.questionIcon { + margin-inline-start: 4px; + color: rgba(0, 0, 0, 0.45); + cursor: help; + writing-mode: horizontal-tb; +} diff --git a/web/src/pages/add-knowledge/components/knowledge-file/chunk-method-modal.tsx b/web/src/components/chunk-method-modal/index.tsx similarity index 96% rename from web/src/pages/add-knowledge/components/knowledge-file/chunk-method-modal.tsx rename to web/src/components/chunk-method-modal/index.tsx index 0d9a5275b4360df07c9b5825040da7407f0a21a8..6a0155ee32dd99fc6121b91c6c1a0641fb834ef8 100644 --- a/web/src/pages/add-knowledge/components/knowledge-file/chunk-method-modal.tsx +++ b/web/src/components/chunk-method-modal/index.tsx @@ -35,7 +35,7 @@ interface IProps extends Omit<IModalManagerChildrenProps, 'showModal'> { showModal?(): void; parserId: string; parserConfig: IKnowledgeFileParserConfig; - documentType: string; + documentExtension: string; } const hidePagesChunkMethods = ['qa', 'table', 'picture', 'resume', 'one']; @@ -45,11 +45,13 @@ const ChunkMethodModal: React.FC<IProps> = ({ onOk, hideModal, visible, - documentType, + documentExtension, parserConfig, }) => { - const { parserList, handleChange, selectedTag } = - useFetchParserListOnMount(parserId); + const { parserList, handleChange, selectedTag } = useFetchParserListOnMount( + parserId, + documentExtension, + ); const [form] = Form.useForm(); const handleOk = async () => { @@ -62,11 +64,8 @@ const ChunkMethodModal: React.FC<IProps> = ({ }; const showPages = useMemo(() => { - return ( - documentType === 'pdf' && - hidePagesChunkMethods.every((x) => x !== selectedTag) - ); - }, [documentType, selectedTag]); + return hidePagesChunkMethods.every((x) => x !== selectedTag); + }, [selectedTag]); const showOne = useMemo(() => { return showPages || selectedTag === 'one'; @@ -114,7 +113,7 @@ const ChunkMethodModal: React.FC<IProps> = ({ </Space> <Divider></Divider> - { + {documentExtension === 'pdf' && ( <Form name="dynamic_form_nest_item" autoComplete="off" form={form}> {showPages && ( <> @@ -271,7 +270,7 @@ const ChunkMethodModal: React.FC<IProps> = ({ {selectedTag === 'naive' && <MaxTokenNumber></MaxTokenNumber>} </Form> - } + )} </Modal> ); }; diff --git a/web/src/hooks/documentHooks.ts b/web/src/hooks/documentHooks.ts index 19dae5c72a99771606db4a1ea09d619bbea43933..a0b00852e261f3c68991484e08cd8eb50cfe78ee 100644 --- a/web/src/hooks/documentHooks.ts +++ b/web/src/hooks/documentHooks.ts @@ -2,6 +2,7 @@ import { IChunk, IKnowledgeFile } from '@/interfaces/database/knowledge'; import { IChangeParserConfigRequestBody } from '@/interfaces/request/document'; import { api_host } from '@/utils/api'; import { buildChunkHighlights } from '@/utils/documentUtils'; +import { UploadFile } from 'antd'; import { useCallback, useMemo, useState } from 'react'; import { IHighlight } from 'react-pdf-highlighter'; import { useDispatch, useSelector } from 'umi'; @@ -174,3 +175,47 @@ export const useRemoveDocument = (documentId: string) => { return removeDocument; }; + +export const useUploadDocument = () => { + const dispatch = useDispatch(); + const { knowledgeId } = useGetKnowledgeSearchParams(); + + const uploadDocument = useCallback( + (file: UploadFile) => { + try { + return dispatch<any>({ + type: 'kFModel/upload_document', + payload: { + file, + kb_id: knowledgeId, + }, + }); + } catch (errorInfo) { + console.log('Failed:', errorInfo); + } + }, + [dispatch, knowledgeId], + ); + + return uploadDocument; +}; + +export const useRunDocument = () => { + const dispatch = useDispatch(); + + const runDocumentByIds = useCallback( + (ids: string[]) => { + try { + return dispatch<any>({ + type: 'kFModel/document_run', + payload: { doc_ids: ids, run: 1 }, + }); + } catch (errorInfo) { + console.log('Failed:', errorInfo); + } + }, + [dispatch], + ); + + return runDocumentByIds; +}; diff --git a/web/src/hooks/logicHooks.ts b/web/src/hooks/logicHooks.ts new file mode 100644 index 0000000000000000000000000000000000000000..42dea0ffd2b19ab42123259012cabf23d92149b5 --- /dev/null +++ b/web/src/hooks/logicHooks.ts @@ -0,0 +1,47 @@ +import { IKnowledgeFile } from '@/interfaces/database/knowledge'; +import { IChangeParserConfigRequestBody } from '@/interfaces/request/document'; +import { useCallback, useState } from 'react'; +import { useSetModalState } from './commonHooks'; +import { useSetDocumentParser } from './documentHooks'; +import { useOneNamespaceEffectsLoading } from './storeHooks'; + +export const useChangeDocumentParser = (documentId: string) => { + const setDocumentParser = useSetDocumentParser(); + + const { + visible: changeParserVisible, + hideModal: hideChangeParserModal, + showModal: showChangeParserModal, + } = useSetModalState(); + const loading = useOneNamespaceEffectsLoading('kFModel', [ + 'document_change_parser', + ]); + + const onChangeParserOk = useCallback( + async (parserId: string, parserConfig: IChangeParserConfigRequestBody) => { + const ret = await setDocumentParser(parserId, documentId, parserConfig); + if (ret === 0) { + hideChangeParserModal(); + } + }, + [hideChangeParserModal, setDocumentParser, documentId], + ); + + return { + changeParserLoading: loading, + onChangeParserOk, + changeParserVisible, + hideChangeParserModal, + showChangeParserModal, + }; +}; + +export const useSetSelectedRecord = <T = IKnowledgeFile>() => { + const [currentRecord, setCurrentRecord] = useState<T>({} as T); + + const setRecord = (record: T) => { + setCurrentRecord(record); + }; + + return { currentRecord, setRecord }; +}; diff --git a/web/src/pages/add-knowledge/components/knowledge-dataset/knowledge-upload-file/index.tsx b/web/src/pages/add-knowledge/components/knowledge-dataset/knowledge-upload-file/index.tsx index 3e84a8ea4c7bc2068cfbdb9cac2007538c98ee2b..0a8bb87e03fb353cd9e19b1d74ab62ad9365156c 100644 --- a/web/src/pages/add-knowledge/components/knowledge-dataset/knowledge-upload-file/index.tsx +++ b/web/src/pages/add-knowledge/components/knowledge-dataset/knowledge-upload-file/index.tsx @@ -1,18 +1,24 @@ import { ReactComponent as SelectFilesEndIcon } from '@/assets/svg/select-files-end.svg'; import { ReactComponent as SelectFilesStartIcon } from '@/assets/svg/select-files-start.svg'; +import ChunkMethodModal from '@/components/chunk-method-modal'; import { KnowledgeRouteKey } from '@/constants/knowledge'; +import { + useRunDocument, + useSelectDocumentList, + useUploadDocument, +} from '@/hooks/documentHooks'; import { useDeleteDocumentById, useFetchKnowledgeDetail, - useGetDocumentDefaultParser, useKnowledgeBaseId, } from '@/hooks/knowledgeHook'; import { - useFetchTenantInfo, - useSelectParserList, -} from '@/hooks/userSettingHook'; -import uploadService from '@/services/uploadService'; -import { isFileUploadDone } from '@/utils/documentUtils'; + useChangeDocumentParser, + useSetSelectedRecord, +} from '@/hooks/logicHooks'; +import { useFetchTenantInfo } from '@/hooks/userSettingHook'; +import { IKnowledgeFile } from '@/interfaces/database/knowledge'; +import { getExtension, isFileUploadDone } from '@/utils/documentUtils'; import { ArrowLeftOutlined, CloudUploadOutlined, @@ -24,27 +30,16 @@ import { Button, Card, Flex, - Popover, Progress, - Radio, - RadioChangeEvent, Space, Upload, UploadFile, UploadProps, } from 'antd'; import classNames from 'classnames'; -import { - ReactElement, - useCallback, - useEffect, - useMemo, - useRef, - useState, -} from 'react'; -import { Link, useDispatch, useNavigate } from 'umi'; +import { ReactElement, useCallback, useMemo, useRef, useState } from 'react'; +import { Link, useNavigate } from 'umi'; -import { useSetDocumentParser } from '@/hooks/documentHooks'; import styles from './index.less'; const { Dragger } = Upload; @@ -57,48 +52,21 @@ const UploaderItem = ({ file, isUpload, remove, + handleEdit, }: { isUpload: boolean; originNode: ReactElement; file: UploadFile; fileList: object[]; + showModal: () => void; remove: (id: string) => void; + setRecord: (record: IKnowledgeFile) => void; + handleEdit: (id: string) => void; }) => { - const { parserConfig, defaultParserId } = useGetDocumentDefaultParser(); const { removeDocument } = useDeleteDocumentById(); - const [value, setValue] = useState(defaultParserId); - const setDocumentParser = useSetDocumentParser(); const documentId = file?.response?.id; - const parserList = useSelectParserList(); - - const saveParser = (parserId: string) => { - setDocumentParser(parserId, documentId, parserConfig as any); - }; - - const onChange = (e: RadioChangeEvent) => { - const val = e.target.value; - setValue(val); - saveParser(val); - }; - - const content = ( - <Radio.Group onChange={onChange} value={value}> - <Space direction="vertical"> - {parserList.map( - ( - x, // value is lowercase, key is uppercase - ) => ( - <Radio value={x.value} key={x.value}> - {x.label} - </Radio> - ), - )} - </Space> - </Radio.Group> - ); - const handleRemove = async () => { if (file.status === 'error') { remove(documentId); @@ -110,9 +78,11 @@ const UploaderItem = ({ } }; - useEffect(() => { - setValue(defaultParserId); - }, [defaultParserId]); + const handleEditClick = () => { + if (file.status === 'done') { + handleEdit(documentId); + } + }; return ( <Card className={styles.uploaderItem}> @@ -130,9 +100,7 @@ const UploaderItem = ({ onClick={handleRemove} /> ) : ( - <Popover content={content} placement="bottom"> - <EditOutlined /> - </Popover> + <EditOutlined onClick={handleEditClick} /> )} </Flex> <Flex> @@ -153,10 +121,20 @@ const UploaderItem = ({ const KnowledgeUploadFile = () => { const knowledgeBaseId = useKnowledgeBaseId(); const [isUpload, setIsUpload] = useState(true); - const dispatch = useDispatch(); const [uploadedFileIds, setUploadedFileIds] = useState<string[]>([]); const fileListRef = useRef<UploadFile[]>([]); const navigate = useNavigate(); + const { currentRecord, setRecord } = useSetSelectedRecord(); + const { + changeParserLoading, + onChangeParserOk, + changeParserVisible, + hideChangeParserModal, + showChangeParserModal, + } = useChangeDocumentParser(currentRecord.id); + const documentList = useSelectDocumentList(); + const runDocumentByIds = useRunDocument(); + const uploadDocument = useUploadDocument(); const enabled = useMemo(() => { if (isUpload) { @@ -175,8 +153,7 @@ const KnowledgeUploadFile = () => { onError, // onProgress, }) { - const ret = await uploadService.uploadFile(file, knowledgeBaseId); - const data = ret?.data; + const data = await uploadDocument(file as UploadFile); if (data?.retcode === 0) { setUploadedFileIds((pre) => { return pre.concat(data.data.id); @@ -197,6 +174,17 @@ const KnowledgeUploadFile = () => { }); }, []); + const handleItemEdit = useCallback( + (id: string) => { + const document = documentList.find((x) => x.id === id); + if (document) { + setRecord(document); + } + showChangeParserModal(); + }, + [documentList, showChangeParserModal, setRecord], + ); + const props: UploadProps = { name: 'file', multiple: true, @@ -215,6 +203,9 @@ const KnowledgeUploadFile = () => { fileList={fileList} originNode={originNode} remove={remove} + showModal={showChangeParserModal} + setRecord={setRecord} + handleEdit={handleItemEdit} ></UploaderItem> ); }, @@ -226,10 +217,7 @@ const KnowledgeUploadFile = () => { const runSelectedDocument = () => { const ids = fileListRef.current.map((x) => x.response.id); - dispatch({ - type: 'kFModel/document_run', - payload: { doc_ids: ids, run: 1 }, - }); + runDocumentByIds(ids); }; const handleNextClick = () => { @@ -245,67 +233,78 @@ const KnowledgeUploadFile = () => { useFetchKnowledgeDetail(); return ( - <div className={styles.uploadWrapper}> - <section> - <Space className={styles.backToList}> - <ArrowLeftOutlined /> - <Link to={`/knowledge/dataset?id=${knowledgeBaseId}`}> - Back to select files - </Link> - </Space> - <div className={styles.progressWrapper}> - <Flex align="center" justify="center"> - <SelectFilesStartIcon></SelectFilesStartIcon> - <Progress - percent={100} - showInfo={false} - className={styles.progress} - strokeColor=" - rgba(127, 86, 217, 1) - " - /> - <SelectFilesEndIcon></SelectFilesEndIcon> - </Flex> - <Flex justify="space-around"> - <p className={styles.selectFilesText}> - <b>Select files</b> + <> + <div className={styles.uploadWrapper}> + <section> + <Space className={styles.backToList}> + <ArrowLeftOutlined /> + <Link to={`/knowledge/dataset?id=${knowledgeBaseId}`}> + Back to select files + </Link> + </Space> + <div className={styles.progressWrapper}> + <Flex align="center" justify="center"> + <SelectFilesStartIcon></SelectFilesStartIcon> + <Progress + percent={100} + showInfo={false} + className={styles.progress} + strokeColor=" + rgba(127, 86, 217, 1) + " + /> + <SelectFilesEndIcon></SelectFilesEndIcon> + </Flex> + <Flex justify="space-around"> + <p className={styles.selectFilesText}> + <b>Select files</b> + </p> + <p className={styles.changeSpecificCategoryText}> + <b>Change specific category</b> + </p> + </Flex> + </div> + </section> + <section className={styles.uploadContent}> + <Dragger + {...props} + className={classNames(styles.uploader, { + [styles.hiddenUploader]: !isUpload, + })} + > + <Button className={styles.uploaderButton}> + <CloudUploadOutlined className={styles.uploaderIcon} /> + </Button> + <p className="ant-upload-text"> + Click or drag file to this area to upload </p> - <p className={styles.changeSpecificCategoryText}> - <b>Change specific category</b> + <p className="ant-upload-hint"> + Support for a single or bulk upload. Strictly prohibited from + uploading company data or other banned files. </p> - </Flex> - </div> - </section> - <section className={styles.uploadContent}> - <Dragger - {...props} - className={classNames(styles.uploader, { - [styles.hiddenUploader]: !isUpload, - })} - > - <Button className={styles.uploaderButton}> - <CloudUploadOutlined className={styles.uploaderIcon} /> + </Dragger> + </section> + <section className={styles.footer}> + <Button + type="primary" + // className={styles.nextButton} + onClick={handleNextClick} + disabled={!enabled} + > + Next </Button> - <p className="ant-upload-text"> - Click or drag file to this area to upload - </p> - <p className="ant-upload-hint"> - Support for a single or bulk upload. Strictly prohibited from - uploading company data or other banned files. - </p> - </Dragger> - </section> - <section className={styles.footer}> - <Button - type="primary" - // className={styles.nextButton} - onClick={handleNextClick} - disabled={!enabled} - > - Next - </Button> - </section> - </div> + </section> + </div> + <ChunkMethodModal + parserId={currentRecord.parser_id} + parserConfig={currentRecord.parser_config} + documentExtension={getExtension(currentRecord.name)} + onOk={onChangeParserOk} + visible={changeParserVisible} + hideModal={hideChangeParserModal} + loading={changeParserLoading} + /> + </> ); }; diff --git a/web/src/pages/add-knowledge/components/knowledge-file/hooks.ts b/web/src/pages/add-knowledge/components/knowledge-file/hooks.ts index f560954e9b6a85e5cad7add2af126510160bb97c..c52da8d14a9a6632ce1f93d738303ce8a18d1093 100644 --- a/web/src/pages/add-knowledge/components/knowledge-file/hooks.ts +++ b/web/src/pages/add-knowledge/components/knowledge-file/hooks.ts @@ -7,10 +7,7 @@ import { } from '@/hooks/documentHooks'; import { useGetKnowledgeSearchParams } from '@/hooks/routeHook'; import { useOneNamespaceEffectsLoading } from '@/hooks/storeHooks'; -import { - useFetchTenantInfo, - useSelectParserList, -} from '@/hooks/userSettingHook'; +import { useFetchTenantInfo } from '@/hooks/userSettingHook'; import { Pagination } from '@/interfaces/common'; import { IKnowledgeFile } from '@/interfaces/database/knowledge'; import { IChangeParserConfigRequestBody } from '@/interfaces/request/document'; @@ -243,21 +240,3 @@ export const useChangeDocumentParser = (documentId: string) => { showChangeParserModal, }; }; - -export const useFetchParserListOnMount = (parserId: string) => { - const [selectedTag, setSelectedTag] = useState(''); - const parserList = useSelectParserList(); - - useFetchTenantInfo(); - - useEffect(() => { - setSelectedTag(parserId); - }, [parserId]); - - const handleChange = (tag: string, checked: boolean) => { - const nextSelectedTag = checked ? tag : selectedTag; - setSelectedTag(nextSelectedTag); - }; - - return { parserList, handleChange, selectedTag }; -}; diff --git a/web/src/pages/add-knowledge/components/knowledge-file/index.tsx b/web/src/pages/add-knowledge/components/knowledge-file/index.tsx index 18f8475a79a81ccb4d52efd7d469ef9958afd041..73200c222eb5997657ff665f87fb8820ffd9d706 100644 --- a/web/src/pages/add-knowledge/components/knowledge-file/index.tsx +++ b/web/src/pages/add-knowledge/components/knowledge-file/index.tsx @@ -23,7 +23,6 @@ import { } from 'antd'; import type { ColumnsType } from 'antd/es/table'; import { useMemo } from 'react'; -import ChunkMethodModal from './chunk-method-modal'; import CreateFileModal from './create-file-modal'; import { useChangeDocumentParser, @@ -39,6 +38,8 @@ import ParsingActionCell from './parsing-action-cell'; import ParsingStatusCell from './parsing-status-cell'; import RenameModal from './rename-modal'; +import ChunkMethodModal from '@/components/chunk-method-modal'; +import { getExtension } from '@/utils/documentUtils'; import styles from './index.less'; const KnowledgeFile = () => { @@ -227,7 +228,7 @@ const KnowledgeFile = () => { <ChunkMethodModal parserId={currentRecord.parser_id} parserConfig={currentRecord.parser_config} - documentType={currentRecord.type} + documentExtension={getExtension(currentRecord.name)} onOk={onChangeParserOk} visible={changeParserVisible} hideModal={hideChangeParserModal} diff --git a/web/src/pages/add-knowledge/components/knowledge-file/model.ts b/web/src/pages/add-knowledge/components/knowledge-file/model.ts index 547c81c321b7743935fdcd358597984e11666bcc..2c42b01a8070ad0fb634c5683dea53c127b825bc 100644 --- a/web/src/pages/add-knowledge/components/knowledge-file/model.ts +++ b/web/src/pages/add-knowledge/components/knowledge-file/model.ts @@ -209,6 +209,19 @@ const model: DvaModel<KFModelState> = { console.warn(error); } }, + *upload_document({ payload = {} }, { call, put }) { + const formData = new FormData(); + formData.append('file', payload.file); + formData.append('kb_id', payload.kb_id); + const { data } = yield call(kbService.document_upload, formData); + if (data.retcode === 0) { + yield put({ + type: 'getKfList', + payload: { kb_id: payload.kb_id }, + }); + } + return data; + }, }, }; export default model; diff --git a/web/src/pages/add-knowledge/components/knowledge-file/upload.tsx b/web/src/pages/add-knowledge/components/knowledge-file/upload.tsx deleted file mode 100644 index 39a859403c630a162985e21ff238b28f7d3e5cbc..0000000000000000000000000000000000000000 --- a/web/src/pages/add-knowledge/components/knowledge-file/upload.tsx +++ /dev/null @@ -1,42 +0,0 @@ -import { useKnowledgeBaseId } from '@/hooks/knowledgeHook'; -import uploadService from '@/services/uploadService'; -import type { UploadProps } from 'antd'; -import React from 'react'; -import { Link } from 'umi'; -interface PropsType { - kb_id: string; - getKfList: () => void; -} - -type UploadRequestOption = Parameters< - NonNullable<UploadProps['customRequest']> ->[0]; - -const FileUpload: React.FC<PropsType> = ({ kb_id, getKfList }) => { - const knowledgeBaseId = useKnowledgeBaseId(); - - const createRequest: (props: UploadRequestOption) => void = async function ({ - file, - onSuccess, - onError, - }) { - const { retcode, data } = await uploadService.uploadFile(file, kb_id); - if (retcode === 0) { - onSuccess && onSuccess(data, file); - } else { - onError && onError(data); - } - getKfList && getKfList(); - }; - const uploadProps: UploadProps = { - customRequest: createRequest, - showUploadList: false, - }; - return ( - // <Upload {...uploadProps}> - <Link to={`/knowledge/dataset/upload?id=${knowledgeBaseId}`}>导入文件</Link> - // </Upload> - ); -}; - -export default FileUpload; diff --git a/web/src/services/kbService.ts b/web/src/services/kbService.ts index 8764c69583c01d99a57243fb24206d92db78780d..decb8c527ad080b4a8733312ac0572d34bfe406f 100644 --- a/web/src/services/kbService.ts +++ b/web/src/services/kbService.ts @@ -25,6 +25,7 @@ const { document_rename, document_run, get_document_file, + document_upload, } = api; const methods = { @@ -82,6 +83,10 @@ const methods = { url: document_thumbnails, method: 'get', }, + document_upload: { + url: document_upload, + method: 'post', + }, // chunkç®¡ç† chunk_list: { url: chunk_list, diff --git a/web/src/services/uploadService.ts b/web/src/services/uploadService.ts deleted file mode 100644 index 6c4d43a6d33f58b824a088f3ce4dd5c5aa4d8ce6..0000000000000000000000000000000000000000 --- a/web/src/services/uploadService.ts +++ /dev/null @@ -1,21 +0,0 @@ -import api from '@/utils/api'; -import request from '@/utils/request'; - -const { upload } = api; - -const uploadService = { - uploadFile: function (file: any, kb_id: string) { - const formData = new FormData(); - formData.append('file', file); - formData.append('kb_id', kb_id); - - const options = { - method: 'post', - data: formData, - }; - - return request(upload, options); - }, -}; - -export default uploadService; diff --git a/web/src/utils/api.ts b/web/src/utils/api.ts index 3b1ec9be42745100110976b112b31f292fe0a43b..e64c1697a703f10e239ff8bd8feb80305db8b8ad 100644 --- a/web/src/utils/api.ts +++ b/web/src/utils/api.ts @@ -45,6 +45,7 @@ export default { document_change_parser: `${api_host}/document/change_parser`, document_thumbnails: `${api_host}/document/thumbnails`, get_document_file: `${api_host}/document/get`, + document_upload: `${api_host}/document/upload`, setDialog: `${api_host}/dialog/set`, getDialog: `${api_host}/dialog/get`, diff --git a/web/src/utils/documentUtils.ts b/web/src/utils/documentUtils.ts index 45e8968eafb60dc82b633539016902c8823592a0..27e9964bd2f4c78a844270b7704e99808dfd06b1 100644 --- a/web/src/utils/documentUtils.ts +++ b/web/src/utils/documentUtils.ts @@ -35,3 +35,6 @@ export const buildChunkHighlights = ( }; export const isFileUploadDone = (file: UploadFile) => file.status === 'done'; + +export const getExtension = (name: string) => + name?.slice(name.lastIndexOf('.') + 1).toLowerCase() ?? '';