知识库配置

This commit is contained in:
1025859868@qq.com
2024-06-11 11:29:37 +08:00
parent 8af9a4cb61
commit 2734110636
10 changed files with 421 additions and 187 deletions

View File

@@ -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.",

View File

@@ -268,7 +268,13 @@
"textDataset": "文本数据集",
"tableDataset": "表格数据集",
"createImport": "新建/导入",
"knowledge": "知识库"
"knowledge": "知识库",
"web": "网站",
"knowledgeId": "知识库ID",
"knowledgeImg": "知识库头像",
"indexModel": "索引模型",
"dataUp": "单条数据上限",
"introduce": "介绍"
},
"code": {
"editPythonCodeDescription": "编辑你的 Python 代码此代码片段接受模块导入和一个函数定义。确保您的函数返回一个字符串。",

Binary file not shown.

After

Width:  |  Height:  |  Size: 656 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 928 B

View File

@@ -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}`);
}
/**
* 修改支持库文件
*

View 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)
}
}
}

View File

@@ -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)

View File

@@ -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)

View File

@@ -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>

View File

@@ -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;
}
}
}
}
}