知识库配置
This commit is contained in:
@@ -276,7 +276,13 @@
|
||||
"textDataset": "Text dataset",
|
||||
"tableDataset": "Table Dataset",
|
||||
"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": {
|
||||
"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": "文本数据集",
|
||||
"tableDataset": "表格数据集",
|
||||
"createImport": "新建/导入",
|
||||
"knowledge": "知识库"
|
||||
"knowledge": "知识库",
|
||||
"web": "网站",
|
||||
"knowledgeId": "知识库ID",
|
||||
"knowledgeImg": "知识库头像",
|
||||
"indexModel": "索引模型",
|
||||
"dataUp": "单条数据上限",
|
||||
"introduce": "介绍"
|
||||
},
|
||||
"code": {
|
||||
"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);
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改支持库
|
||||
*
|
||||
*/
|
||||
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({
|
||||
id: data.id,
|
||||
name: data.name,
|
||||
parent_id: parentId
|
||||
parent_id: parentId,
|
||||
description: data.description
|
||||
}).then(res => {
|
||||
reload()
|
||||
setOpen(false)
|
||||
|
||||
@@ -6,7 +6,7 @@ import {alertContext} from "../../../contexts/alertContext";
|
||||
import {captureAndAlertRequestErrorHoc} from "../../../controllers/request";
|
||||
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 navigate = useNavigate()
|
||||
const name = data.nameType == "file"? data.file_name :data.name
|
||||
@@ -42,7 +42,8 @@ export default function CreateModal({ data, open, setOpen, reload }) {
|
||||
captureAndAlertRequestErrorHoc(updateFileLib({
|
||||
id: data.id,
|
||||
name: name,
|
||||
parent_id: data.parent_id
|
||||
parent_id: data.parent_id,
|
||||
description: data.description
|
||||
}).then(res => {
|
||||
reload()
|
||||
setOpen(false)
|
||||
|
||||
@@ -27,7 +27,7 @@ import { Select, SelectContent, SelectGroup, SelectIconTrigger, SelectItem } fro
|
||||
import { locationContext } from "../../contexts/locationContext";
|
||||
import {
|
||||
deleteFile,
|
||||
deleteFileLib,
|
||||
deleteFileLib, getFileLibById,
|
||||
readFileByLibDatabase,
|
||||
readFileLibDatabase,
|
||||
retryKnowledgeFileApi
|
||||
@@ -44,6 +44,7 @@ import {
|
||||
import CreateModal from "./components/createModel";
|
||||
import RenameModal from "./components/renameModel";
|
||||
import MoveModal from "./components/moveModel";
|
||||
import ConfigModal from "./components/configModel";
|
||||
import {userContext} from "../../contexts/userContext";
|
||||
|
||||
export default function FilesPage() {
|
||||
@@ -52,24 +53,25 @@ export default function FilesPage() {
|
||||
const { id } = useParams()
|
||||
// 上传 上传成功添加到列表
|
||||
const [open, setOpen] = useState(false)
|
||||
const [title, setTitle] = useState('')
|
||||
const [knowledge, setKnowledge] = useState({})
|
||||
const nameRef = useRef(null)
|
||||
const [renameOpen, setRenameOpen] = useState(false);
|
||||
const [moveOpen, setMoveOpen] = useState(false);
|
||||
const [parentId, setParentId] = useState(id)
|
||||
const [tabType, setTabType] = useState(1);
|
||||
|
||||
useEffect(() => {
|
||||
setParentId(id)
|
||||
getFileLibById(id).then(res => {
|
||||
const data = res || {}
|
||||
setKnowledge(data)
|
||||
})
|
||||
}, [id])
|
||||
|
||||
const [type, setType] = useState(1)
|
||||
const [data, setData] = useState({})
|
||||
const [titleArray, setTitleArray] = useState([]);
|
||||
|
||||
const detailData = {
|
||||
img_url: ""
|
||||
}
|
||||
|
||||
const [hasPermission, setHasPermission] = useState(true)
|
||||
const { appConfig } = useContext(locationContext)
|
||||
|
||||
@@ -80,7 +82,7 @@ export default function FilesPage() {
|
||||
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 => {
|
||||
setHasPermission(res.writeable)
|
||||
return res
|
||||
@@ -95,18 +97,17 @@ export default function FilesPage() {
|
||||
const reload = () => {
|
||||
fileReload()
|
||||
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) => {
|
||||
setOpen(e)
|
||||
@@ -202,21 +203,27 @@ export default function FilesPage() {
|
||||
<div className={"file-info relative"}>
|
||||
<div className={"file-name"}>
|
||||
{
|
||||
detailData.img_url?
|
||||
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>
|
||||
}
|
||||
<label>{ title }</label>
|
||||
<label>{ knowledge.name }</label>
|
||||
</div>
|
||||
<div className={"folder-type"}>{t('lib.universalKnowledgeBase')}</div>
|
||||
<div className={"file-menu-active"}>
|
||||
<img src={"/src/assets/knowledge/knowledge-active-icon.png"}/>{t("lib.dataset")}
|
||||
<div className={"folder-type"}>
|
||||
{t('lib.universalKnowledgeBase') }
|
||||
</div>
|
||||
<div className={"file-menu"}>
|
||||
<img src={"/src/assets/knowledge/set-icon.png"}/>{t("lib.config")}
|
||||
<div className={tabType == 1 ? "file-menu-active" : "file-menu"} onClick={ () => {
|
||||
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>
|
||||
|
||||
@@ -226,170 +233,175 @@ export default function FilesPage() {
|
||||
<div className={"back-knowledge"}><img src={"/src/assets/knowledge/back-icon.png"}/>{t("lib.allKnowledge")}</div>
|
||||
</Link>
|
||||
</div>
|
||||
<div className={"file-list p-6 overflow-y-auto"}>
|
||||
<div className={'knowledge-header'}>
|
||||
<div className={'knowledge-title'}>
|
||||
{titleArray.length > 0?
|
||||
<div className={"title-list"}>
|
||||
<div className={"title-item"}>
|
||||
<label onClick={()=>backFolder(id, -1)}>{t("lib.rootDirectory")}</label>
|
||||
</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>
|
||||
{
|
||||
tabType == 1 ?
|
||||
<div className={"file-list p-6 overflow-y-auto"}>
|
||||
<div className={'knowledge-header'}>
|
||||
<div className={'knowledge-title'}>
|
||||
{titleArray.length > 0?
|
||||
<div className={"title-list"}>
|
||||
<div className={"title-item"}>
|
||||
<label onClick={()=>backFolder(id, -1)}>{t("lib.rootDirectory")}</label>
|
||||
</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>{t("lib.file")}({libTotal + total})</div>
|
||||
}
|
||||
</div>
|
||||
{hasPermission &&
|
||||
<div className={'knowledge-create-box'}>
|
||||
<DropdownMenu>
|
||||
<DropdownMenuTrigger>
|
||||
<div className={'knowledge-create'} onClick={() => setOpen(true)}>
|
||||
<img src={"/src/assets/knowledge/add-icon.png"} className={'create-icon'}/>
|
||||
<label style={{letterSpacing:0}}>{t("lib.createImport")}</label>
|
||||
</div>
|
||||
</DropdownMenuTrigger>
|
||||
<DropdownMenuContent>
|
||||
<DropdownMenuItem onClick={()=>{
|
||||
setType(1)
|
||||
setOpen(true)
|
||||
}}><img src={"/src/assets/knowledge/folder-icon.png"} style={{width:'13px',height:'13px',marginRight:'8px'}}/>{t("lib.folder")}</DropdownMenuItem>
|
||||
<DropdownMenuItem ><img src={"/src/assets/knowledge/write-icon.png"} style={{width:'13px',height:'13px',marginRight:'8px'}}/>{t("lib.manualDataset")}</DropdownMenuItem>
|
||||
<DropdownMenuItem ><img src={"/src/assets/knowledge/knowledge-no-icon.png"} style={{width:'13px',height:'13px',marginRight:'8px'}}/>{t("lib.textDataset")}</DropdownMenuItem>
|
||||
<DropdownMenuItem ><img src={"/src/assets/knowledge/table-icon.png"} style={{width:'13px',height:'13px',marginRight:'8px'}}/>{t("lib.tableDataset")}</DropdownMenuItem>
|
||||
</DropdownMenuContent>
|
||||
</DropdownMenu>
|
||||
{hasPermission &&
|
||||
<div className={'knowledge-create-box'}>
|
||||
<DropdownMenu>
|
||||
<DropdownMenuTrigger>
|
||||
<div className={'knowledge-create'} onClick={() => setOpen(true)}>
|
||||
<img src={"/src/assets/knowledge/add-icon.png"} className={'create-icon'}/>
|
||||
<label style={{letterSpacing:0}}>{t("lib.createImport")}</label>
|
||||
</div>
|
||||
</DropdownMenuTrigger>
|
||||
<DropdownMenuContent>
|
||||
<DropdownMenuItem onClick={()=>{
|
||||
setType(1)
|
||||
setOpen(true)
|
||||
}}><img src={"/src/assets/knowledge/folder-icon.png"} style={{width:'13px',height:'13px',marginRight:'8px'}}/>{t("lib.folder")}</DropdownMenuItem>
|
||||
<DropdownMenuItem ><img src={"/src/assets/knowledge/write-icon.png"} style={{width:'13px',height:'13px',marginRight:'8px'}}/>{t("lib.manualDataset")}</DropdownMenuItem>
|
||||
<DropdownMenuItem ><img src={"/src/assets/knowledge/knowledge-no-icon.png"} style={{width:'13px',height:'13px',marginRight:'8px'}}/>{t("lib.textDataset")}</DropdownMenuItem>
|
||||
<DropdownMenuItem ><img src={"/src/assets/knowledge/table-icon.png"} style={{width:'13px',height:'13px',marginRight:'8px'}}/>{t("lib.tableDataset")}</DropdownMenuItem>
|
||||
</DropdownMenuContent>
|
||||
</DropdownMenu>
|
||||
</div>
|
||||
}
|
||||
<div className={"search-box"}>
|
||||
<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 className={"search-box"}>
|
||||
<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"}/>
|
||||
<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>
|
||||
<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>
|
||||
}
|
||||
: <ConfigModal reload={reload} id={id}></ConfigModal>
|
||||
}
|
||||
|
||||
</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>
|
||||
<CreateModal reload={reload} createType={type} parentId={parentId} datalist={datalist} open={open} setOpen={setOpen}></CreateModal>
|
||||
|
||||
@@ -366,6 +366,71 @@
|
||||
display: inline-block;
|
||||
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