diff --git a/src/controllers/API/index.ts b/src/controllers/API/index.ts index 8612450..8a70df8 100644 --- a/src/controllers/API/index.ts +++ b/src/controllers/API/index.ts @@ -167,6 +167,14 @@ export async function updateFileLib(data) { return await axios.put(`/api/v1/knowledge/update`, data); } +/** + * 修改支持库文件 + * + */ +export async function updateFile(data) { + return await axios.put(`/api/v1/knowledge/file/update`, data); +} + /** * 删除支持库 * diff --git a/src/pages/Knowledge/components/createModel.tsx b/src/pages/Knowledge/components/createModel.tsx index a4ed3df..4c8d7d9 100644 --- a/src/pages/Knowledge/components/createModel.tsx +++ b/src/pages/Knowledge/components/createModel.tsx @@ -18,7 +18,6 @@ import folderIcon from "../../../assets/knowledge/folder-icon.png"; export default function CreateModal({ createType, parentId, datalist, open, setOpen, reload }) { const { t } = useTranslation() const navigate = useNavigate() - const nameRef = useRef(null) const descRef = useRef(null) const [type, setType] = useState(createType) @@ -29,12 +28,13 @@ export default function CreateModal({ createType, parentId, datalist, open, setO // Fetch model data useEffect(() => { + setType(createType) getEmbeddingModel().then(res => { const models = res.models || [] setOptions(models) setModal(models[0] || '') }) - }, []) + }, [createType]) const { setErrorData } = useContext(alertContext); @@ -63,7 +63,6 @@ export default function CreateModal({ createType, parentId, datalist, open, setO parent_id: parentId, type: type }).then(res => { - // @ts-ignore reload() setOpen(false) })) @@ -177,7 +176,7 @@ export default function CreateModal({ createType, parentId, datalist, open, setO return (
{ - type == 1? : + createType == 1? : }
); diff --git a/src/pages/Knowledge/components/moveModel.tsx b/src/pages/Knowledge/components/moveModel.tsx index 6cb031d..93bbd1b 100644 --- a/src/pages/Knowledge/components/moveModel.tsx +++ b/src/pages/Knowledge/components/moveModel.tsx @@ -1,7 +1,7 @@ import { useTranslation } from "react-i18next"; import {useContext, useEffect, useRef, useState} from "react"; import {useNavigate} from "react-router-dom"; -import {readFileLibDatabase, updateFileLib} from "../../../controllers/API"; +import {readFileLibDatabase, updateFile, updateFileLib} from "../../../controllers/API"; import {alertContext} from "../../../contexts/alertContext"; import {captureAndAlertRequestErrorHoc} from "../../../controllers/request"; import { @@ -14,32 +14,58 @@ import {useTable} from "../../../util/hook"; import moveIcon from "../../../assets/knowledge/move-icon.png"; import folderIcon from "../../../assets/knowledge/folder-icon.png"; import noFolderIcon from "../../../assets/knowledge/no-folder-icon.png"; +import knowledgeIcon from "@/assets/knowledge/knowledge-icon.png"; export default function MoveModal({ data, open, setOpen, reload }) { + if(!open) return null + const { t } = useTranslation() const navigate = useNavigate() const [parentId, setParentId] = useState("") const { setErrorData } = useContext(alertContext); const [error, setError] = useState({ name: false }) + const [datalist, setDatalist] = useState([]) + + useEffect(() => { + readFileLibDatabase(1, 10000, "", data.nameType == "file" ? data.knowledge_id : data.parent_id, '1').then(res => { + const list = res.data || [] + const array = [] + list.forEach((item) => { + if(item.id != data.id){ + array.push(item) + } + }) + setDatalist(array) + }) + }, []) + const handleMove = () => { const errorlist = [] if (!parentId) errorlist.push(t('lib.selectFold')) if (errorlist.length) return handleError(errorlist) - captureAndAlertRequestErrorHoc(updateFileLib({ - id: data.id, - name: data.name, - parent_id: parentId - }).then(res => { - reload() - setOpen(false) - })) + if(data.nameType == "file"){ + captureAndAlertRequestErrorHoc(updateFile({ + id: data.id, + file_name: data.file_name, + knowledge_id: parentId + }).then(res => { + reload() + setOpen(false) + })) + }else{ + captureAndAlertRequestErrorHoc(updateFileLib({ + id: data.id, + name: data.name, + parent_id: parentId + }).then(res => { + reload() + setOpen(false) + })) + } } - const { page, pageSize, data: datalist, total, loading, setPage, search} = useTable({},(param) => - readFileLibDatabase(param.page, 10000, param.keyword, '', '1') - ) const handleError = (list) => { setErrorData({ @@ -57,13 +83,12 @@ export default function MoveModal({ data, open, setOpen, reload }) { datalist.length > 0 ?
{datalist.map((el) => ( - el.id != data.id ?
setParentId(el.id)}>
- - + +
@@ -72,12 +97,11 @@ export default function MoveModal({ data, open, setOpen, reload }) {
{el.type == 1?t('lib.folder'):el.type == 2?t('lib.universalKnowledgeBase'):t('lib.webSite')}
- : "" ))}
: -
- +
+

{t('lib.noFold')}

} diff --git a/src/pages/Knowledge/components/renameModel.tsx b/src/pages/Knowledge/components/renameModel.tsx index 27dd5b4..baa45fa 100644 --- a/src/pages/Knowledge/components/renameModel.tsx +++ b/src/pages/Knowledge/components/renameModel.tsx @@ -1,7 +1,7 @@ import { useTranslation } from "react-i18next"; import {useContext, useEffect, useRef, useState} from "react"; import {useNavigate} from "react-router-dom"; -import {updateFileLib} from "../../../controllers/API"; +import {updateFileLib, updateFile} from "../../../controllers/API"; import {alertContext} from "../../../contexts/alertContext"; import {captureAndAlertRequestErrorHoc} from "../../../controllers/request"; import writeIcon from "../../../assets/knowledge/write-icon.png"; @@ -9,11 +9,12 @@ import writeIcon from "../../../assets/knowledge/write-icon.png"; export default function CreateModal({ data, open, setOpen, reload }) { const { t } = useTranslation() const navigate = useNavigate() - const [nameValue, setNameValue] = useState(data.name) + const name = data.nameType == "file"? data.file_name :data.name + const [nameValue, setNameValue] = useState(name) useEffect(() => { - setNameValue(data.name); - }, [data.name]); + setNameValue(name) + }, [name]); const nameRef = useRef(data.name) const { setErrorData } = useContext(alertContext); @@ -28,14 +29,25 @@ export default function CreateModal({ data, open, setOpen, reload }) { setError({ name: !!nameErrors}) if (errorlist.length) return handleError(errorlist) - captureAndAlertRequestErrorHoc(updateFileLib({ - id: data.id, - name: name, - parent_id: data.parent_id - }).then(res => { - reload() - setOpen(false) - })) + if(data.nameType == "file"){ + captureAndAlertRequestErrorHoc(updateFile({ + id: data.id, + file_name: name, + knowledge_id: data.knowledge_id + }).then(res => { + reload() + setOpen(false) + })) + }else{ + captureAndAlertRequestErrorHoc(updateFileLib({ + id: data.id, + name: name, + parent_id: data.parent_id + }).then(res => { + reload() + setOpen(false) + })) + } } const handleError = (list) => { diff --git a/src/pages/Knowledge/index.tsx b/src/pages/Knowledge/index.tsx index 2c4c1b4..b09bb1c 100644 --- a/src/pages/Knowledge/index.tsx +++ b/src/pages/Knowledge/index.tsx @@ -34,6 +34,10 @@ export default function FileLibPage() { readFileLibDatabase(param.page, 10000, param.keyword, parentId) ) + useEffect(() => { + reload() + }, []) + // Delete const { delShow, idRef, close, delConfirm } = useDelete(); @@ -62,12 +66,12 @@ export default function FileLibPage() { const backFolder = (parentId, index) => { setParentId(parentId) reload(); - if(index != -1){ - titleArray.splice(index) + if(index == -1){ + setTitleArray([]) }else if(index == (titleArray.length - 1)){ return; }else{ - setTitleArray([]) + titleArray.splice(index+1) } } @@ -108,7 +112,7 @@ export default function FileLibPage() { { titleArray.map((title, index) => (
- {index == (titleArray.length - 1)? ">" : ""} + {index <= (titleArray.length - 1)? ">" : ""}
)) diff --git a/src/pages/Knowledge/knowledge.tsx b/src/pages/Knowledge/knowledge.tsx index d547233..36c7014 100644 --- a/src/pages/Knowledge/knowledge.tsx +++ b/src/pages/Knowledge/knowledge.tsx @@ -25,7 +25,13 @@ import ShadTooltip from "../../components/ShadTooltipComponent"; import { Input } from "../../components/ui/input"; import { Select, SelectContent, SelectGroup, SelectIconTrigger, SelectItem } from "../../components/ui/select1"; import { locationContext } from "../../contexts/locationContext"; -import { deleteFile, readFileByLibDatabase, retryKnowledgeFileApi } from "../../controllers/API"; +import { + deleteFile, + deleteFileLib, + readFileByLibDatabase, + readFileLibDatabase, + retryKnowledgeFileApi +} from "../../controllers/API"; import { captureAndAlertRequestErrorHoc } from "../../controllers/request"; import UploadModal from "../../modals/UploadModal"; import { useTable } from "../../util/hook"; @@ -50,16 +56,15 @@ export default function FilesPage() { const nameRef = useRef(null) const [renameOpen, setRenameOpen] = useState(false); const [moveOpen, setMoveOpen] = useState(false); - const [parentId, setParentId] = useState('0') + const [parentId, setParentId] = useState(id) + + useEffect(() => { + setParentId(id) + }, [id]) + const [type, setType] = useState(1) const [data, setData] = useState({}) - - const { page, pageSize, data: datalist, total, loading, setPage, search, reload, filterData, refreshData } = useTable({}, (param) => - readFileByLibDatabase({ ...param, id, name: param.keyword }).then(res => { - setHasPermission(res.writeable) - return res - }) - ) + const [titleArray, setTitleArray] = useState([]); const detailData = { img_url: "" @@ -70,10 +75,28 @@ export default function FilesPage() { // filter const [filter, setFilter] = useState(999) + + const { data: libList, total: libTotal, loading: libLoading, search: libSearch, reload:libReload } = useTable({},(param) => + readFileLibDatabase(param.page, 10000, param.keyword, parentId) + ) + + const { page, pageSize, data: datalist, total, loading, setPage, search, reload:fileReload, filterData, refreshData } = useTable({}, (param) => + readFileByLibDatabase({ ...param, id: parentId, pageSize: 10000, name: param.keyword }).then(res => { + setHasPermission(res.writeable) + return res + }) + ) + useEffect(() => { filterData({ status: filter }) }, [filter]) + + const reload = () => { + fileReload() + libReload() + } + useEffect(() => { // @ts-ignore const libname = window.libname // 临时记忆 @@ -91,13 +114,22 @@ export default function FilesPage() { } // 删除 - const { delShow, idRef, close, delConfim } = useDelete() + const { delShow, idRef, delType, close, delConfim } = useDelete() const handleDelete = () => { - captureAndAlertRequestErrorHoc(deleteFile(idRef.current).then(res => { - reload() - close() - })) + //知识库里面有文件和文件夹,它对应两个表 + if(delType == "file"){ + captureAndAlertRequestErrorHoc(deleteFile(idRef.current).then(res => { + reload() + close() + })) + }else if(delType == "folder"){ + captureAndAlertRequestErrorHoc(deleteFileLib(idRef.current).then(res => { + reload(); + close(); + })); + } + } const [repeatFiles, setRepeatFiles] = useState([]) @@ -141,6 +173,25 @@ export default function FilesPage() { setFilter(Number(id)) } + const handleLibDetail = (el) => { + setParentId(el.id) + titleArray.push(el) + setTitleArray(titleArray) + reload(); + } + + const backFolder = (parentId, index) => { + setParentId(parentId) + reload(); + if(index == -1){ + setTitleArray([]) + }else if(index == (titleArray.length - 1)){ + return; + }else{ + titleArray.splice(index+1) + } + } + return (
{loading &&
@@ -158,7 +209,7 @@ export default function FilesPage() { } - +
{t('lib.universalKnowledgeBase')}
@@ -178,7 +229,23 @@ export default function FilesPage() {
- {t("lib.file")}(6) + {titleArray.length > 0? +
+
+ +
+ { + titleArray.map((title, index) => ( +
+ {index <= (titleArray.length - 1)? ">" : ""} + +
+ )) + } +
+ : +
{t("lib.file")}({libTotal + total})
+ }
{hasPermission &&
@@ -190,7 +257,10 @@ export default function FilesPage() {
- {t("lib.folder")} + { + setType(1) + setOpen(true) + }}>{t("lib.folder")} {t("lib.manualDataset")} {t("lib.textDataset")} {t("lib.tableDataset")} @@ -237,6 +307,56 @@ export default function FilesPage() { {[t('lib.parseFailed'), t('lib.parsing'), t('lib.completed'), t('lib.parseFailed')][el.status]} } + + + + + + + { + event.stopPropagation(); + // 数据集重命名 + setData({ ...el, nameType: "file" }) + setRenameOpen(true) + }}>{t("lib.rename")} + { + event.stopPropagation(); + setData({ ...el, nameType: "file" }) + setMoveOpen(true) + }}>{t("lib.move")} + {hasPermission && + { + event.stopPropagation(); + delConfim(el.id, "file") + }}> + {t('delete')} + + } + + + + + + ))} + {libList.map((el,index) => ( + + {index + 1} + handleLibDetail(el) }> + + {el.name} + + + {el.update_time.replace('T', ' ')} + + {el.status === 3 ?
+
+ {t('lib.parseFailed')} +
+ +
: + {[t('lib.parseFailed'), t('lib.parsing'), t('lib.completed'), t('lib.parseFailed')][el.status]} + } +
@@ -256,7 +376,7 @@ export default function FilesPage() { {hasPermission && { event.stopPropagation(); - delConfim(el.id) + delConfim(el.id, "folder") }}> {t('delete')} @@ -293,16 +413,20 @@ export default function FilesPage() { const useDelete = () => { const [delShow, setDelShow] = useState(false) + const [delType, setDelType] = useState("") const idRef = useRef(null) return { delShow, idRef, + delType, close: () => { setDelShow(false) }, - delConfim: (id) => { + delConfim: (id, delType) => { idRef.current = id + setDelType(delType) + console.log(delType) setDelShow(true) } }