|
|
@@ -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 (
|
|
|
<div className="w-full h-screen relative">
|
|
|
{loading && <div className="absolute w-full h-full top-0 left-0 flex justify-center items-center z-10 bg-[rgba(255,255,255,0.6)] dark:bg-blur-shared">
|
|
|
@@ -158,7 +209,7 @@ export default function FilesPage() {
|
|
|
<img src={"/src/assets/knowledge/knowledge-icon.png"}/>
|
|
|
</span>
|
|
|
}
|
|
|
- <label>知识库</label>
|
|
|
+ <label>{ title }</label>
|
|
|
</div>
|
|
|
<div className={"folder-type"}>{t('lib.universalKnowledgeBase')}</div>
|
|
|
<div className={"file-menu-active"}>
|
|
|
@@ -178,7 +229,23 @@ export default function FilesPage() {
|
|
|
<div className={"file-list p-6 overflow-y-auto"}>
|
|
|
<div className={'knowledge-header'}>
|
|
|
<div className={'knowledge-title'}>
|
|
|
- {t("lib.file")}(6)
|
|
|
+ {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>
|
|
|
{hasPermission &&
|
|
|
<div className={'knowledge-create-box'}>
|
|
|
@@ -190,7 +257,10 @@ export default function FilesPage() {
|
|
|
</div>
|
|
|
</DropdownMenuTrigger>
|
|
|
<DropdownMenuContent>
|
|
|
- <DropdownMenuItem ><img src={"/src/assets/knowledge/folder-icon.png"} style={{width:'13px',height:'13px',marginRight:'8px'}}/>{t("lib.folder")}</DropdownMenuItem>
|
|
|
+ <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>
|
|
|
@@ -245,6 +315,56 @@ export default function FilesPage() {
|
|
|
<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>
|
|
|
@@ -256,7 +376,7 @@ export default function FilesPage() {
|
|
|
{hasPermission &&
|
|
|
<DropdownMenuItem onClick={(event) => {
|
|
|
event.stopPropagation();
|
|
|
- delConfim(el.id)
|
|
|
+ delConfim(el.id, "folder")
|
|
|
}}>
|
|
|
<img src={"/src/assets/knowledge/delete-icon.png"} style={{width:'13px',height:'13px',marginRight:'8px'}}/>{t('delete')}
|
|
|
</DropdownMenuItem>
|
|
|
@@ -293,16 +413,20 @@ export default function FilesPage() {
|
|
|
|
|
|
const useDelete = () => {
|
|
|
const [delShow, setDelShow] = useState(false)
|
|
|
+ const [delType, setDelType] = useState("")
|
|
|
const idRef = useRef<any>(null)
|
|
|
|
|
|
return {
|
|
|
delShow,
|
|
|
idRef,
|
|
|
+ delType,
|
|
|
close: () => {
|
|
|
setDelShow(false)
|
|
|
},
|
|
|
- delConfim: (id) => {
|
|
|
+ delConfim: (id, delType) => {
|
|
|
idRef.current = id
|
|
|
+ setDelType(delType)
|
|
|
+ console.log(delType)
|
|
|
setDelShow(true)
|
|
|
}
|
|
|
}
|