知识库配置
This commit is contained in:
@@ -276,7 +276,13 @@
|
|||||||
"textDataset": "Text dataset",
|
"textDataset": "Text dataset",
|
||||||
"tableDataset": "Table Dataset",
|
"tableDataset": "Table Dataset",
|
||||||
"createImport": "Create/Import",
|
"createImport": "Create/Import",
|
||||||
"knowledge": "Knowledge base"
|
"knowledge": "Knowledge base",
|
||||||
|
"web": "Website",
|
||||||
|
"knowledgeId": "Knowledge Base ID",
|
||||||
|
"knowledgeImg": "Knowledge Base Avatar",
|
||||||
|
"indexModel": "Index model",
|
||||||
|
"dataUp": "Single data upper limit",
|
||||||
|
"introduce": "Introduce"
|
||||||
},
|
},
|
||||||
"code": {
|
"code": {
|
||||||
"editPythonCodeDescription": "Edit your Python code here. This code snippet accepts module imports and a function definition. Make sure your function returns a string.",
|
"editPythonCodeDescription": "Edit your Python code here. This code snippet accepts module imports and a function definition. Make sure your function returns a string.",
|
||||||
|
|||||||
@@ -268,7 +268,13 @@
|
|||||||
"textDataset": "文本数据集",
|
"textDataset": "文本数据集",
|
||||||
"tableDataset": "表格数据集",
|
"tableDataset": "表格数据集",
|
||||||
"createImport": "新建/导入",
|
"createImport": "新建/导入",
|
||||||
"knowledge": "知识库"
|
"knowledge": "知识库",
|
||||||
|
"web": "网站",
|
||||||
|
"knowledgeId": "知识库ID",
|
||||||
|
"knowledgeImg": "知识库头像",
|
||||||
|
"indexModel": "索引模型",
|
||||||
|
"dataUp": "单条数据上限",
|
||||||
|
"introduce": "介绍"
|
||||||
},
|
},
|
||||||
"code": {
|
"code": {
|
||||||
"editPythonCodeDescription": "编辑你的 Python 代码此代码片段接受模块导入和一个函数定义。确保您的函数返回一个字符串。",
|
"editPythonCodeDescription": "编辑你的 Python 代码此代码片段接受模块导入和一个函数定义。确保您的函数返回一个字符串。",
|
||||||
|
|||||||
BIN
src/assets/knowledge/red-delete-icon.png
Normal file
BIN
src/assets/knowledge/red-delete-icon.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 656 B |
BIN
src/assets/knowledge/set-active-icon.png
Normal file
BIN
src/assets/knowledge/set-active-icon.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 928 B |
@@ -167,6 +167,14 @@ export async function updateFileLib(data) {
|
|||||||
return await axios.put(`/api/v1/knowledge/update`, data);
|
return await axios.put(`/api/v1/knowledge/update`, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 修改支持库
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
export async function getFileLibById(id) {
|
||||||
|
return await axios.get(`/api/v1/knowledge/${id}`);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 修改支持库文件
|
* 修改支持库文件
|
||||||
*
|
*
|
||||||
|
|||||||
135
src/pages/Knowledge/components/configModel.tsx
Normal file
135
src/pages/Knowledge/components/configModel.tsx
Normal file
@@ -0,0 +1,135 @@
|
|||||||
|
import {Link, useNavigate, useParams} from "react-router-dom";
|
||||||
|
import { useContext, useEffect, useRef, useState } from "react";
|
||||||
|
import { useTranslation } from "react-i18next";
|
||||||
|
import { locationContext } from "../../../contexts/locationContext";
|
||||||
|
import {
|
||||||
|
getFileLibById,
|
||||||
|
deleteFileLib, updateFileLib
|
||||||
|
} from "../../../controllers/API";
|
||||||
|
import {captureAndAlertRequestErrorHoc} from "../../../controllers/request";
|
||||||
|
|
||||||
|
|
||||||
|
export default function ConfigModal({ id, reload }) {
|
||||||
|
if(!open) return null
|
||||||
|
|
||||||
|
const { t } = useTranslation()
|
||||||
|
const [knowledge, setKnowledge] = useState({})
|
||||||
|
const [nameValue, setNameValue] = useState("")
|
||||||
|
const [descValue, setDescValue] = useState("")
|
||||||
|
const navigate = useNavigate()
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
getFileLibById(id).then(res => {
|
||||||
|
const data = res || {}
|
||||||
|
setNameValue(data.name)
|
||||||
|
setDescValue(data.description)
|
||||||
|
setKnowledge(data)
|
||||||
|
})
|
||||||
|
}, [id])
|
||||||
|
|
||||||
|
// 删除
|
||||||
|
const { delShow, idRef, close, delConfim } = useDelete()
|
||||||
|
|
||||||
|
const handleDelete = () => {
|
||||||
|
captureAndAlertRequestErrorHoc(deleteFileLib(idRef.current).then(res => {
|
||||||
|
navigate("/filelib");
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
|
const saveKnowledge = () => {
|
||||||
|
captureAndAlertRequestErrorHoc(updateFileLib({
|
||||||
|
id: knowledge.id,
|
||||||
|
name: nameValue,
|
||||||
|
parent_id: knowledge.parent_id,
|
||||||
|
description: descValue
|
||||||
|
}).then(res => {
|
||||||
|
reload()
|
||||||
|
}))
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className={"file-list p-6 overflow-y-auto"}>
|
||||||
|
<div className={'knowledge-header'}>
|
||||||
|
<div className={'knowledge-title'}>
|
||||||
|
<div>配置</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div style={{marginTop: '50px'}}>
|
||||||
|
<div className={'config-item'}>
|
||||||
|
<div className={'config-item-title'}>{ t("lib.knowledgeId")}</div>
|
||||||
|
<div className={'config-item-value'}>{knowledge.id}</div>
|
||||||
|
</div>
|
||||||
|
<div className={'config-item'}>
|
||||||
|
<div className={'config-item-title'}>{ t("lib.knowledgeImg")}</div>
|
||||||
|
<div className={'config-item-value'}>
|
||||||
|
{
|
||||||
|
knowledge.img_url?
|
||||||
|
<img src={"/src/assets/knowledge/knowledge-icon.png"} className={"knowledge-img"}/>
|
||||||
|
:
|
||||||
|
<span className={"knowledge-img-bg"}>
|
||||||
|
<img src={"/src/assets/knowledge/knowledge-icon.png"}/>
|
||||||
|
</span>
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className={'config-item'}>
|
||||||
|
<div className={'config-item-title'}>{ t("lib.libraryName")}</div>
|
||||||
|
<div className={'config-item-value'}>
|
||||||
|
<input id="name" value={nameValue}
|
||||||
|
onChange={event => setNameValue(event.target.value)} placeholder={t('lib.giveAName')} className={'form-input'}/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className={'config-item'}>
|
||||||
|
<div className={'config-item-title'}>{ t("lib.indexModel")}</div>
|
||||||
|
<div className={'config-item-value'}>{knowledge.model}</div>
|
||||||
|
</div>
|
||||||
|
<div className={'config-item'}>
|
||||||
|
<div className={'config-item-title'}>{ t("lib.dataUp")}</div>
|
||||||
|
<div className={'config-item-value'}>3000</div>
|
||||||
|
</div>
|
||||||
|
<div className={'config-item'}>
|
||||||
|
<div className={'config-item-title'}>{ t("lib.introduce")}</div>
|
||||||
|
<div className={'config-item-value'}>
|
||||||
|
<textarea id="desc" value={descValue}
|
||||||
|
onChange={event => setDescValue(event.target.value)} placeholder={t('lib.describe')} className={'form-input'}/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className={'config-button-box'}>
|
||||||
|
<button className={"delete-button"} onClick={(event) => {
|
||||||
|
delConfim(knowledge.id)
|
||||||
|
}}><img src={"/src/assets/knowledge/red-delete-icon.png"} className={"delete-icon"}/></button>
|
||||||
|
<button className={"save-button"} onClick={(event) => {
|
||||||
|
saveKnowledge(knowledge.id)
|
||||||
|
}}>{t('save')}</button>
|
||||||
|
</div>
|
||||||
|
<dialog className={`modal ${delShow && 'modal-open'}`}>
|
||||||
|
<form method="dialog" className="modal-box w-[360px] bg-[#fff] shadow-lg dialog-box">
|
||||||
|
<h3 className="tip-title">{t('prompt')}</h3>
|
||||||
|
<p className="tip-message">{t('lib.confirmDeleteLibrary')}</p>
|
||||||
|
<div className={"button-box"}>
|
||||||
|
<button className={"cancel-button tip-button"} onClick={close}>{t("cancel")}</button>
|
||||||
|
<button className={"confirm-button delete-button tip-button-margin"} onClick={handleDelete}>{t("lib.confirmDelete")}</button>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</dialog>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
};
|
||||||
|
|
||||||
|
const useDelete = () => {
|
||||||
|
const [delShow, setDelShow] = useState(false)
|
||||||
|
const idRef = useRef<any>(null)
|
||||||
|
|
||||||
|
return {
|
||||||
|
delShow,
|
||||||
|
idRef,
|
||||||
|
close: () => {
|
||||||
|
setDelShow(false)
|
||||||
|
},
|
||||||
|
delConfim: (id) => {
|
||||||
|
idRef.current = id
|
||||||
|
setDelShow(true)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -58,7 +58,8 @@ export default function MoveModal({ data, open, setOpen, reload }) {
|
|||||||
captureAndAlertRequestErrorHoc(updateFileLib({
|
captureAndAlertRequestErrorHoc(updateFileLib({
|
||||||
id: data.id,
|
id: data.id,
|
||||||
name: data.name,
|
name: data.name,
|
||||||
parent_id: parentId
|
parent_id: parentId,
|
||||||
|
description: data.description
|
||||||
}).then(res => {
|
}).then(res => {
|
||||||
reload()
|
reload()
|
||||||
setOpen(false)
|
setOpen(false)
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ import {alertContext} from "../../../contexts/alertContext";
|
|||||||
import {captureAndAlertRequestErrorHoc} from "../../../controllers/request";
|
import {captureAndAlertRequestErrorHoc} from "../../../controllers/request";
|
||||||
import writeIcon from "../../../assets/knowledge/write-icon.png";
|
import writeIcon from "../../../assets/knowledge/write-icon.png";
|
||||||
|
|
||||||
export default function CreateModal({ data, open, setOpen, reload }) {
|
export default function RenameModal({ data, open, setOpen, reload }) {
|
||||||
const { t } = useTranslation()
|
const { t } = useTranslation()
|
||||||
const navigate = useNavigate()
|
const navigate = useNavigate()
|
||||||
const name = data.nameType == "file"? data.file_name :data.name
|
const name = data.nameType == "file"? data.file_name :data.name
|
||||||
@@ -42,7 +42,8 @@ export default function CreateModal({ data, open, setOpen, reload }) {
|
|||||||
captureAndAlertRequestErrorHoc(updateFileLib({
|
captureAndAlertRequestErrorHoc(updateFileLib({
|
||||||
id: data.id,
|
id: data.id,
|
||||||
name: name,
|
name: name,
|
||||||
parent_id: data.parent_id
|
parent_id: data.parent_id,
|
||||||
|
description: data.description
|
||||||
}).then(res => {
|
}).then(res => {
|
||||||
reload()
|
reload()
|
||||||
setOpen(false)
|
setOpen(false)
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ import { Select, SelectContent, SelectGroup, SelectIconTrigger, SelectItem } fro
|
|||||||
import { locationContext } from "../../contexts/locationContext";
|
import { locationContext } from "../../contexts/locationContext";
|
||||||
import {
|
import {
|
||||||
deleteFile,
|
deleteFile,
|
||||||
deleteFileLib,
|
deleteFileLib, getFileLibById,
|
||||||
readFileByLibDatabase,
|
readFileByLibDatabase,
|
||||||
readFileLibDatabase,
|
readFileLibDatabase,
|
||||||
retryKnowledgeFileApi
|
retryKnowledgeFileApi
|
||||||
@@ -44,6 +44,7 @@ import {
|
|||||||
import CreateModal from "./components/createModel";
|
import CreateModal from "./components/createModel";
|
||||||
import RenameModal from "./components/renameModel";
|
import RenameModal from "./components/renameModel";
|
||||||
import MoveModal from "./components/moveModel";
|
import MoveModal from "./components/moveModel";
|
||||||
|
import ConfigModal from "./components/configModel";
|
||||||
import {userContext} from "../../contexts/userContext";
|
import {userContext} from "../../contexts/userContext";
|
||||||
|
|
||||||
export default function FilesPage() {
|
export default function FilesPage() {
|
||||||
@@ -52,24 +53,25 @@ export default function FilesPage() {
|
|||||||
const { id } = useParams()
|
const { id } = useParams()
|
||||||
// 上传 上传成功添加到列表
|
// 上传 上传成功添加到列表
|
||||||
const [open, setOpen] = useState(false)
|
const [open, setOpen] = useState(false)
|
||||||
const [title, setTitle] = useState('')
|
const [knowledge, setKnowledge] = useState({})
|
||||||
const nameRef = useRef(null)
|
const nameRef = useRef(null)
|
||||||
const [renameOpen, setRenameOpen] = useState(false);
|
const [renameOpen, setRenameOpen] = useState(false);
|
||||||
const [moveOpen, setMoveOpen] = useState(false);
|
const [moveOpen, setMoveOpen] = useState(false);
|
||||||
const [parentId, setParentId] = useState(id)
|
const [parentId, setParentId] = useState(id)
|
||||||
|
const [tabType, setTabType] = useState(1);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
setParentId(id)
|
setParentId(id)
|
||||||
|
getFileLibById(id).then(res => {
|
||||||
|
const data = res || {}
|
||||||
|
setKnowledge(data)
|
||||||
|
})
|
||||||
}, [id])
|
}, [id])
|
||||||
|
|
||||||
const [type, setType] = useState(1)
|
const [type, setType] = useState(1)
|
||||||
const [data, setData] = useState({})
|
const [data, setData] = useState({})
|
||||||
const [titleArray, setTitleArray] = useState([]);
|
const [titleArray, setTitleArray] = useState([]);
|
||||||
|
|
||||||
const detailData = {
|
|
||||||
img_url: ""
|
|
||||||
}
|
|
||||||
|
|
||||||
const [hasPermission, setHasPermission] = useState(true)
|
const [hasPermission, setHasPermission] = useState(true)
|
||||||
const { appConfig } = useContext(locationContext)
|
const { appConfig } = useContext(locationContext)
|
||||||
|
|
||||||
@@ -80,7 +82,7 @@ export default function FilesPage() {
|
|||||||
readFileLibDatabase(param.page, 10000, param.keyword, parentId)
|
readFileLibDatabase(param.page, 10000, param.keyword, parentId)
|
||||||
)
|
)
|
||||||
|
|
||||||
const { page, pageSize, data: datalist, total, loading, setPage, search, reload:fileReload, filterData, refreshData } = useTable({}, (param) =>
|
const { page, pageSize, data: datalist, total, loading, setPage, search: fileSearch, reload:fileReload, filterData, refreshData } = useTable({}, (param) =>
|
||||||
readFileByLibDatabase({ ...param, id: parentId, pageSize: 10000, name: param.keyword }).then(res => {
|
readFileByLibDatabase({ ...param, id: parentId, pageSize: 10000, name: param.keyword }).then(res => {
|
||||||
setHasPermission(res.writeable)
|
setHasPermission(res.writeable)
|
||||||
return res
|
return res
|
||||||
@@ -95,18 +97,17 @@ export default function FilesPage() {
|
|||||||
const reload = () => {
|
const reload = () => {
|
||||||
fileReload()
|
fileReload()
|
||||||
libReload()
|
libReload()
|
||||||
|
getFileLibById(id).then(res => {
|
||||||
|
const data = res || {}
|
||||||
|
setKnowledge(data)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
const search = (keyword) => {
|
||||||
|
libSearch(keyword)
|
||||||
|
fileSearch(keyword)
|
||||||
}
|
}
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
// @ts-ignore
|
|
||||||
const libname = window.libname // 临时记忆
|
|
||||||
if (libname) {
|
|
||||||
// @ts-ignore
|
|
||||||
localStorage.setItem('libname', window.libname)
|
|
||||||
}
|
|
||||||
// @ts-ignore
|
|
||||||
setTitle(window.libname || localStorage.getItem('libname'))
|
|
||||||
}, [])
|
|
||||||
|
|
||||||
const handleOpen = (e) => {
|
const handleOpen = (e) => {
|
||||||
setOpen(e)
|
setOpen(e)
|
||||||
@@ -202,21 +203,27 @@ export default function FilesPage() {
|
|||||||
<div className={"file-info relative"}>
|
<div className={"file-info relative"}>
|
||||||
<div className={"file-name"}>
|
<div className={"file-name"}>
|
||||||
{
|
{
|
||||||
detailData.img_url?
|
knowledge.img_url?
|
||||||
<img src={"/src/assets/knowledge/knowledge-icon.png"} className={"knowledge-img"}/>
|
<img src={"/src/assets/knowledge/knowledge-icon.png"} className={"knowledge-img"}/>
|
||||||
:
|
:
|
||||||
<span className={"knowledge-img-bg"}>
|
<span className={"knowledge-img-bg"}>
|
||||||
<img src={"/src/assets/knowledge/knowledge-icon.png"}/>
|
<img src={"/src/assets/knowledge/knowledge-icon.png"}/>
|
||||||
</span>
|
</span>
|
||||||
}
|
}
|
||||||
<label>{ title }</label>
|
<label>{ knowledge.name }</label>
|
||||||
</div>
|
</div>
|
||||||
<div className={"folder-type"}>{t('lib.universalKnowledgeBase')}</div>
|
<div className={"folder-type"}>
|
||||||
<div className={"file-menu-active"}>
|
{t('lib.universalKnowledgeBase') }
|
||||||
<img src={"/src/assets/knowledge/knowledge-active-icon.png"}/>{t("lib.dataset")}
|
|
||||||
</div>
|
</div>
|
||||||
<div className={"file-menu"}>
|
<div className={tabType == 1 ? "file-menu-active" : "file-menu"} onClick={ () => {
|
||||||
<img src={"/src/assets/knowledge/set-icon.png"}/>{t("lib.config")}
|
setTabType(1)
|
||||||
|
}} >
|
||||||
|
<img src={tabType == 1 ? "/src/assets/knowledge/knowledge-active-icon.png" : "/src/assets/knowledge/knowledge-icon.png"}/>{t("lib.dataset")}
|
||||||
|
</div>
|
||||||
|
<div className={tabType == 2 ? "file-menu-active" : "file-menu"} onClick={ () => {
|
||||||
|
setTabType(2)
|
||||||
|
}} >
|
||||||
|
<img src={tabType == 2 ? "/src/assets/knowledge/set-active-icon.png" : "/src/assets/knowledge/set-icon.png"}/>{t("lib.config")}
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
|
|
||||||
@@ -226,170 +233,175 @@ export default function FilesPage() {
|
|||||||
<div className={"back-knowledge"}><img src={"/src/assets/knowledge/back-icon.png"}/>{t("lib.allKnowledge")}</div>
|
<div className={"back-knowledge"}><img src={"/src/assets/knowledge/back-icon.png"}/>{t("lib.allKnowledge")}</div>
|
||||||
</Link>
|
</Link>
|
||||||
</div>
|
</div>
|
||||||
<div className={"file-list p-6 overflow-y-auto"}>
|
{
|
||||||
<div className={'knowledge-header'}>
|
tabType == 1 ?
|
||||||
<div className={'knowledge-title'}>
|
<div className={"file-list p-6 overflow-y-auto"}>
|
||||||
{titleArray.length > 0?
|
<div className={'knowledge-header'}>
|
||||||
<div className={"title-list"}>
|
<div className={'knowledge-title'}>
|
||||||
<div className={"title-item"}>
|
{titleArray.length > 0?
|
||||||
<label onClick={()=>backFolder(id, -1)}>{t("lib.rootDirectory")}</label>
|
<div className={"title-list"}>
|
||||||
</div>
|
<div className={"title-item"}>
|
||||||
{
|
<label onClick={()=>backFolder(id, -1)}>{t("lib.rootDirectory")}</label>
|
||||||
titleArray.map((title, index) => (
|
|
||||||
<div className={"title-item"} key={title}>
|
|
||||||
<span>{index <= (titleArray.length - 1)? ">" : ""}</span>
|
|
||||||
<label onClick={()=>backFolder(title.id, index)}>{title.name}</label>
|
|
||||||
</div>
|
</div>
|
||||||
))
|
{
|
||||||
|
titleArray.map((title, index) => (
|
||||||
|
<div className={"title-item"} key={title}>
|
||||||
|
<span>{index <= (titleArray.length - 1)? ">" : ""}</span>
|
||||||
|
<label onClick={()=>backFolder(title.id, index)}>{title.name}</label>
|
||||||
|
</div>
|
||||||
|
))
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
:
|
||||||
|
<div>{t("lib.file")}({libTotal + total})</div>
|
||||||
}
|
}
|
||||||
</div>
|
</div>
|
||||||
:
|
{hasPermission &&
|
||||||
<div>{t("lib.file")}({libTotal + total})</div>
|
<div className={'knowledge-create-box'}>
|
||||||
}
|
<DropdownMenu>
|
||||||
</div>
|
<DropdownMenuTrigger>
|
||||||
{hasPermission &&
|
<div className={'knowledge-create'} onClick={() => setOpen(true)}>
|
||||||
<div className={'knowledge-create-box'}>
|
<img src={"/src/assets/knowledge/add-icon.png"} className={'create-icon'}/>
|
||||||
<DropdownMenu>
|
<label style={{letterSpacing:0}}>{t("lib.createImport")}</label>
|
||||||
<DropdownMenuTrigger>
|
</div>
|
||||||
<div className={'knowledge-create'} onClick={() => setOpen(true)}>
|
</DropdownMenuTrigger>
|
||||||
<img src={"/src/assets/knowledge/add-icon.png"} className={'create-icon'}/>
|
<DropdownMenuContent>
|
||||||
<label style={{letterSpacing:0}}>{t("lib.createImport")}</label>
|
<DropdownMenuItem onClick={()=>{
|
||||||
</div>
|
setType(1)
|
||||||
</DropdownMenuTrigger>
|
setOpen(true)
|
||||||
<DropdownMenuContent>
|
}}><img src={"/src/assets/knowledge/folder-icon.png"} style={{width:'13px',height:'13px',marginRight:'8px'}}/>{t("lib.folder")}</DropdownMenuItem>
|
||||||
<DropdownMenuItem onClick={()=>{
|
<DropdownMenuItem ><img src={"/src/assets/knowledge/write-icon.png"} style={{width:'13px',height:'13px',marginRight:'8px'}}/>{t("lib.manualDataset")}</DropdownMenuItem>
|
||||||
setType(1)
|
<DropdownMenuItem ><img src={"/src/assets/knowledge/knowledge-no-icon.png"} style={{width:'13px',height:'13px',marginRight:'8px'}}/>{t("lib.textDataset")}</DropdownMenuItem>
|
||||||
setOpen(true)
|
<DropdownMenuItem ><img src={"/src/assets/knowledge/table-icon.png"} style={{width:'13px',height:'13px',marginRight:'8px'}}/>{t("lib.tableDataset")}</DropdownMenuItem>
|
||||||
}}><img src={"/src/assets/knowledge/folder-icon.png"} style={{width:'13px',height:'13px',marginRight:'8px'}}/>{t("lib.folder")}</DropdownMenuItem>
|
</DropdownMenuContent>
|
||||||
<DropdownMenuItem ><img src={"/src/assets/knowledge/write-icon.png"} style={{width:'13px',height:'13px',marginRight:'8px'}}/>{t("lib.manualDataset")}</DropdownMenuItem>
|
</DropdownMenu>
|
||||||
<DropdownMenuItem ><img src={"/src/assets/knowledge/knowledge-no-icon.png"} style={{width:'13px',height:'13px',marginRight:'8px'}}/>{t("lib.textDataset")}</DropdownMenuItem>
|
</div>
|
||||||
<DropdownMenuItem ><img src={"/src/assets/knowledge/table-icon.png"} style={{width:'13px',height:'13px',marginRight:'8px'}}/>{t("lib.tableDataset")}</DropdownMenuItem>
|
}
|
||||||
</DropdownMenuContent>
|
<div className={"search-box"}>
|
||||||
</DropdownMenu>
|
<input id="name" ref={nameRef} className={"form-input"} />
|
||||||
|
<button onClick={(e) => search(nameRef.current.value)} className={"search-btn"}>{t('tools.Search.display_name')}</button>
|
||||||
|
<img src={"/src/assets/knowledge/search-icon.png"}/>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
}
|
<Table>
|
||||||
<div className={"search-box"}>
|
<TableHeader>
|
||||||
<input id="name" ref={nameRef} className={"form-input"} />
|
<TableRow>
|
||||||
<button onClick={(e) => search(nameRef.current.value)} className={"search-btn"}>{t('tools.Search.display_name')}</button>
|
<TableHead>#</TableHead>
|
||||||
<img src={"/src/assets/knowledge/search-icon.png"}/>
|
<TableHead className="w-[600px]">{t('lib.name')}</TableHead>
|
||||||
|
<TableHead className="items-center">{t('lib.dataTotal')}</TableHead>
|
||||||
|
<TableHead>{t('lib.lastUpdate')}</TableHead>
|
||||||
|
{/* 状态 */}
|
||||||
|
<TableHead>{t('lib.status')}</TableHead>
|
||||||
|
<TableHead className="w-[80px]"></TableHead>
|
||||||
|
</TableRow>
|
||||||
|
</TableHeader>
|
||||||
|
<TableBody>
|
||||||
|
{datalist.map((el,index) => (
|
||||||
|
<TableRow key={el.id} className={"file-row"}>
|
||||||
|
<TableCell>{index + 1}</TableCell>
|
||||||
|
<TableCell>
|
||||||
|
<img className={"img-icon"} src={el.type == 1 ?"/src/assets/chat/write-icon.png":el.type == 2
|
||||||
|
?"/src/assets/knowledge/knowledge-no-icon.png":el.type == 3 ?"/src/assets/knowledge/table-icon.png":"/src/assets/knowledge/folder-icon.png"}/>
|
||||||
|
{el.file_name}
|
||||||
|
</TableCell>
|
||||||
|
<TableCell></TableCell>
|
||||||
|
<TableCell>{el.update_time.replace('T', ' ')}</TableCell>
|
||||||
|
<TableCell>
|
||||||
|
{el.status === 3 ? <div className="flex items-center">
|
||||||
|
<div className="tooltip" data-tip={el.remark}>
|
||||||
|
<span className='text-red-500'>{t('lib.parseFailed')}</span>
|
||||||
|
</div>
|
||||||
|
<Button variant="link"><RotateCw size={16} onClick={() => handleRetry([el])} /></Button>
|
||||||
|
</div> :
|
||||||
|
<span className={el.status === 3 && 'text-red-500'}>{[t('lib.parseFailed'), t('lib.parsing'), t('lib.completed'), t('lib.parseFailed')][el.status]}</span>
|
||||||
|
}
|
||||||
|
</TableCell>
|
||||||
|
<TableCell>
|
||||||
|
<DropdownMenu>
|
||||||
|
<DropdownMenuTrigger>
|
||||||
|
<img src={"/src/assets/chat/duihua-gengduo.png"} className={'more-button'}/>
|
||||||
|
</DropdownMenuTrigger>
|
||||||
|
<DropdownMenuContent>
|
||||||
|
<DropdownMenuItem onClick={(event)=>{
|
||||||
|
event.stopPropagation();
|
||||||
|
// 数据集重命名
|
||||||
|
setData({ ...el, nameType: "file" })
|
||||||
|
setRenameOpen(true)
|
||||||
|
}}><img src={"/src/assets/knowledge/write-icon.png"} style={{width:'13px',height:'13px',marginRight:'8px'}}/>{t("lib.rename")}</DropdownMenuItem>
|
||||||
|
<DropdownMenuItem onClick={(event)=>{
|
||||||
|
event.stopPropagation();
|
||||||
|
setData({ ...el, nameType: "file" })
|
||||||
|
setMoveOpen(true)
|
||||||
|
}}><img src={"/src/assets/knowledge/move-icon.png"} style={{width:'13px',height:'13px',marginRight:'8px'}}/>{t("lib.move")}</DropdownMenuItem>
|
||||||
|
{hasPermission &&
|
||||||
|
<DropdownMenuItem onClick={(event) => {
|
||||||
|
event.stopPropagation();
|
||||||
|
delConfim(el.id, "file")
|
||||||
|
}}>
|
||||||
|
<img src={"/src/assets/knowledge/delete-icon.png"} style={{width:'13px',height:'13px',marginRight:'8px'}}/>{t('delete')}
|
||||||
|
</DropdownMenuItem>
|
||||||
|
}
|
||||||
|
|
||||||
|
</DropdownMenuContent>
|
||||||
|
</DropdownMenu>
|
||||||
|
</TableCell>
|
||||||
|
</TableRow>
|
||||||
|
))}
|
||||||
|
{libList.map((el,index) => (
|
||||||
|
<TableRow key={el.id} className={"file-row"}>
|
||||||
|
<TableCell>{index + 1}</TableCell>
|
||||||
|
<TableCell onClick={ () => handleLibDetail(el) }>
|
||||||
|
<img className={"img-icon"} src={"/src/assets/knowledge/folder-icon.png"}/>
|
||||||
|
{el.name}
|
||||||
|
</TableCell>
|
||||||
|
<TableCell></TableCell>
|
||||||
|
<TableCell>{el.update_time.replace('T', ' ')}</TableCell>
|
||||||
|
<TableCell>
|
||||||
|
{el.status === 3 ? <div className="flex items-center">
|
||||||
|
<div className="tooltip" data-tip={el.remark}>
|
||||||
|
<span className='text-red-500'>{t('lib.parseFailed')}</span>
|
||||||
|
</div>
|
||||||
|
<Button variant="link"><RotateCw size={16} onClick={() => handleRetry([el])} /></Button>
|
||||||
|
</div> :
|
||||||
|
<span className={el.status === 3 && 'text-red-500'}>{[t('lib.parseFailed'), t('lib.parsing'), t('lib.completed'), t('lib.parseFailed')][el.status]}</span>
|
||||||
|
}
|
||||||
|
</TableCell>
|
||||||
|
<TableCell>
|
||||||
|
<DropdownMenu>
|
||||||
|
<DropdownMenuTrigger>
|
||||||
|
<img src={"/src/assets/chat/duihua-gengduo.png"} className={'more-button'}/>
|
||||||
|
</DropdownMenuTrigger>
|
||||||
|
<DropdownMenuContent>
|
||||||
|
<DropdownMenuItem onClick={(event)=>{
|
||||||
|
event.stopPropagation();
|
||||||
|
setData(el)
|
||||||
|
setRenameOpen(true)
|
||||||
|
}}><img src={"/src/assets/knowledge/write-icon.png"} style={{width:'13px',height:'13px',marginRight:'8px'}}/>{t("lib.rename")}</DropdownMenuItem>
|
||||||
|
<DropdownMenuItem onClick={(event)=>{
|
||||||
|
event.stopPropagation();
|
||||||
|
setData(el)
|
||||||
|
setMoveOpen(true)
|
||||||
|
}}><img src={"/src/assets/knowledge/move-icon.png"} style={{width:'13px',height:'13px',marginRight:'8px'}}/>{t("lib.move")}</DropdownMenuItem>
|
||||||
|
{hasPermission &&
|
||||||
|
<DropdownMenuItem onClick={(event) => {
|
||||||
|
event.stopPropagation();
|
||||||
|
delConfim(el.id, "folder")
|
||||||
|
}}>
|
||||||
|
<img src={"/src/assets/knowledge/delete-icon.png"} style={{width:'13px',height:'13px',marginRight:'8px'}}/>{t('delete')}
|
||||||
|
</DropdownMenuItem>
|
||||||
|
}
|
||||||
|
|
||||||
|
</DropdownMenuContent>
|
||||||
|
</DropdownMenu>
|
||||||
|
</TableCell>
|
||||||
|
</TableRow>
|
||||||
|
))}
|
||||||
|
</TableBody>
|
||||||
|
</Table>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
: <ConfigModal reload={reload} id={id}></ConfigModal>
|
||||||
<Table>
|
}
|
||||||
<TableHeader>
|
|
||||||
<TableRow>
|
|
||||||
<TableHead>#</TableHead>
|
|
||||||
<TableHead className="w-[600px]">{t('lib.name')}</TableHead>
|
|
||||||
<TableHead className="items-center">{t('lib.dataTotal')}</TableHead>
|
|
||||||
<TableHead>{t('lib.lastUpdate')}</TableHead>
|
|
||||||
{/* 状态 */}
|
|
||||||
<TableHead>{t('lib.status')}</TableHead>
|
|
||||||
<TableHead className="w-[80px]"></TableHead>
|
|
||||||
</TableRow>
|
|
||||||
</TableHeader>
|
|
||||||
<TableBody>
|
|
||||||
{datalist.map((el,index) => (
|
|
||||||
<TableRow key={el.id} className={"file-row"}>
|
|
||||||
<TableCell>{index + 1}</TableCell>
|
|
||||||
<TableCell>
|
|
||||||
<img className={"img-icon"} src={el.type == 1 ?"/src/assets/chat/write-icon.png":el.type == 2
|
|
||||||
?"/src/assets/knowledge/knowledge-no-icon.png":el.type == 3 ?"/src/assets/knowledge/table-icon.png":"/src/assets/knowledge/folder-icon.png"}/>
|
|
||||||
{el.file_name}
|
|
||||||
</TableCell>
|
|
||||||
<TableCell></TableCell>
|
|
||||||
<TableCell>{el.update_time.replace('T', ' ')}</TableCell>
|
|
||||||
<TableCell>
|
|
||||||
{el.status === 3 ? <div className="flex items-center">
|
|
||||||
<div className="tooltip" data-tip={el.remark}>
|
|
||||||
<span className='text-red-500'>{t('lib.parseFailed')}</span>
|
|
||||||
</div>
|
|
||||||
<Button variant="link"><RotateCw size={16} onClick={() => handleRetry([el])} /></Button>
|
|
||||||
</div> :
|
|
||||||
<span className={el.status === 3 && 'text-red-500'}>{[t('lib.parseFailed'), t('lib.parsing'), t('lib.completed'), t('lib.parseFailed')][el.status]}</span>
|
|
||||||
}
|
|
||||||
</TableCell>
|
|
||||||
<TableCell>
|
|
||||||
<DropdownMenu>
|
|
||||||
<DropdownMenuTrigger>
|
|
||||||
<img src={"/src/assets/chat/duihua-gengduo.png"} className={'more-button'}/>
|
|
||||||
</DropdownMenuTrigger>
|
|
||||||
<DropdownMenuContent>
|
|
||||||
<DropdownMenuItem onClick={(event)=>{
|
|
||||||
event.stopPropagation();
|
|
||||||
// 数据集重命名
|
|
||||||
setData({ ...el, nameType: "file" })
|
|
||||||
setRenameOpen(true)
|
|
||||||
}}><img src={"/src/assets/knowledge/write-icon.png"} style={{width:'13px',height:'13px',marginRight:'8px'}}/>{t("lib.rename")}</DropdownMenuItem>
|
|
||||||
<DropdownMenuItem onClick={(event)=>{
|
|
||||||
event.stopPropagation();
|
|
||||||
setData({ ...el, nameType: "file" })
|
|
||||||
setMoveOpen(true)
|
|
||||||
}}><img src={"/src/assets/knowledge/move-icon.png"} style={{width:'13px',height:'13px',marginRight:'8px'}}/>{t("lib.move")}</DropdownMenuItem>
|
|
||||||
{hasPermission &&
|
|
||||||
<DropdownMenuItem onClick={(event) => {
|
|
||||||
event.stopPropagation();
|
|
||||||
delConfim(el.id, "file")
|
|
||||||
}}>
|
|
||||||
<img src={"/src/assets/knowledge/delete-icon.png"} style={{width:'13px',height:'13px',marginRight:'8px'}}/>{t('delete')}
|
|
||||||
</DropdownMenuItem>
|
|
||||||
}
|
|
||||||
|
|
||||||
</DropdownMenuContent>
|
|
||||||
</DropdownMenu>
|
|
||||||
</TableCell>
|
|
||||||
</TableRow>
|
|
||||||
))}
|
|
||||||
{libList.map((el,index) => (
|
|
||||||
<TableRow key={el.id} className={"file-row"}>
|
|
||||||
<TableCell>{index + 1}</TableCell>
|
|
||||||
<TableCell onClick={ () => handleLibDetail(el) }>
|
|
||||||
<img className={"img-icon"} src={"/src/assets/knowledge/folder-icon.png"}/>
|
|
||||||
{el.name}
|
|
||||||
</TableCell>
|
|
||||||
<TableCell></TableCell>
|
|
||||||
<TableCell>{el.update_time.replace('T', ' ')}</TableCell>
|
|
||||||
<TableCell>
|
|
||||||
{el.status === 3 ? <div className="flex items-center">
|
|
||||||
<div className="tooltip" data-tip={el.remark}>
|
|
||||||
<span className='text-red-500'>{t('lib.parseFailed')}</span>
|
|
||||||
</div>
|
|
||||||
<Button variant="link"><RotateCw size={16} onClick={() => handleRetry([el])} /></Button>
|
|
||||||
</div> :
|
|
||||||
<span className={el.status === 3 && 'text-red-500'}>{[t('lib.parseFailed'), t('lib.parsing'), t('lib.completed'), t('lib.parseFailed')][el.status]}</span>
|
|
||||||
}
|
|
||||||
</TableCell>
|
|
||||||
<TableCell>
|
|
||||||
<DropdownMenu>
|
|
||||||
<DropdownMenuTrigger>
|
|
||||||
<img src={"/src/assets/chat/duihua-gengduo.png"} className={'more-button'}/>
|
|
||||||
</DropdownMenuTrigger>
|
|
||||||
<DropdownMenuContent>
|
|
||||||
<DropdownMenuItem onClick={(event)=>{
|
|
||||||
event.stopPropagation();
|
|
||||||
setData(el)
|
|
||||||
setRenameOpen(true)
|
|
||||||
}}><img src={"/src/assets/knowledge/write-icon.png"} style={{width:'13px',height:'13px',marginRight:'8px'}}/>{t("lib.rename")}</DropdownMenuItem>
|
|
||||||
<DropdownMenuItem onClick={(event)=>{
|
|
||||||
event.stopPropagation();
|
|
||||||
setData(el)
|
|
||||||
setMoveOpen(true)
|
|
||||||
}}><img src={"/src/assets/knowledge/move-icon.png"} style={{width:'13px',height:'13px',marginRight:'8px'}}/>{t("lib.move")}</DropdownMenuItem>
|
|
||||||
{hasPermission &&
|
|
||||||
<DropdownMenuItem onClick={(event) => {
|
|
||||||
event.stopPropagation();
|
|
||||||
delConfim(el.id, "folder")
|
|
||||||
}}>
|
|
||||||
<img src={"/src/assets/knowledge/delete-icon.png"} style={{width:'13px',height:'13px',marginRight:'8px'}}/>{t('delete')}
|
|
||||||
</DropdownMenuItem>
|
|
||||||
}
|
|
||||||
|
|
||||||
</DropdownMenuContent>
|
|
||||||
</DropdownMenu>
|
|
||||||
</TableCell>
|
|
||||||
</TableRow>
|
|
||||||
))}
|
|
||||||
</TableBody>
|
|
||||||
</Table>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<CreateModal reload={reload} createType={type} parentId={parentId} datalist={datalist} open={open} setOpen={setOpen}></CreateModal>
|
<CreateModal reload={reload} createType={type} parentId={parentId} datalist={datalist} open={open} setOpen={setOpen}></CreateModal>
|
||||||
|
|||||||
@@ -366,6 +366,71 @@
|
|||||||
display: inline-block;
|
display: inline-block;
|
||||||
margin-right: 8px;
|
margin-right: 8px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.config-item{
|
||||||
|
display: flex;
|
||||||
|
margin-bottom: 30px;
|
||||||
|
|
||||||
|
.config-item-title{
|
||||||
|
width:200px;
|
||||||
|
text-align: right;
|
||||||
|
margin-right: 36px;
|
||||||
|
font-size: 12px;
|
||||||
|
color: #FFFFFF;
|
||||||
|
line-height: 34px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.config-item-value{
|
||||||
|
width: 500px;
|
||||||
|
font-weight: 300;
|
||||||
|
font-size: 12px;
|
||||||
|
color: #CCCCCC;
|
||||||
|
line-height: 34px;
|
||||||
|
|
||||||
|
.form-input{
|
||||||
|
background: #1A1A1A;
|
||||||
|
border-radius: 7px;
|
||||||
|
width: 100%;
|
||||||
|
font-weight: 300;
|
||||||
|
font-size: 12px;
|
||||||
|
border:unset;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.config-button-box{
|
||||||
|
text-align: right;
|
||||||
|
width: 736px;
|
||||||
|
position: absolute;
|
||||||
|
bottom: 50px;
|
||||||
|
|
||||||
|
.delete-button{
|
||||||
|
width: 34px;
|
||||||
|
height: 34px;
|
||||||
|
background: rgba(255, 96, 96, 0.3);
|
||||||
|
border-radius: 100%;
|
||||||
|
|
||||||
|
.delete-icon{
|
||||||
|
width: 15px;
|
||||||
|
height: 15px;
|
||||||
|
margin: 0 0 0 10px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.save-button{
|
||||||
|
width: 95px;
|
||||||
|
height: 34px;
|
||||||
|
line-height: 34px;
|
||||||
|
text-align: center;
|
||||||
|
background: #FFD025;
|
||||||
|
border-radius: 17px;
|
||||||
|
font-weight: 400;
|
||||||
|
font-size: 14px;
|
||||||
|
color: #010101;
|
||||||
|
margin-left: 20px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user