Commit 983a53c1 authored by chenshouchao's avatar chenshouchao

Merge branch 'feat-20220608-projectdata' into 'release'

Feat 20220608 projectdata

See merge request sunyihao/bkunyun!34
parents 0aaeb735 126e0a9c
...@@ -11838,7 +11838,7 @@ ...@@ -11838,7 +11838,7 @@
}, },
"webpack-dev-server": { "webpack-dev-server": {
"version": "4.9.0", "version": "4.9.0",
"resolved": "https://registry.npmmirror.com/webpack-dev-server/-/webpack-dev-server-4.9.0.tgz", "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.9.0.tgz",
"integrity": "sha512-+Nlb39iQSOSsFv0lWUuUTim3jDQO8nhK3E68f//J2r5rIcp4lULHXz2oZ0UVdEeWXEh5lSzYUlzarZhDAeAVQw==", "integrity": "sha512-+Nlb39iQSOSsFv0lWUuUTim3jDQO8nhK3E68f//J2r5rIcp4lULHXz2oZ0UVdEeWXEh5lSzYUlzarZhDAeAVQw==",
"requires": { "requires": {
"@types/bonjour": "^3.5.9", "@types/bonjour": "^3.5.9",
......
...@@ -10,7 +10,6 @@ interface TreeItemType { ...@@ -10,7 +10,6 @@ interface TreeItemType {
} }
type MyTreeViewProps = { type MyTreeViewProps = {
// treeData: RenderTree;
treeData: Array<TreeItemType>; treeData: Array<TreeItemType>;
onNodeFocus?: (event: object, value: string) => void; // 点击某一项的回调 onNodeFocus?: (event: object, value: string) => void; // 点击某一项的回调
onNodeSelect?: (event: object, value: Array<any> | string) => void; // 点击某一项的回调 onNodeSelect?: (event: object, value: Array<any> | string) => void; // 点击某一项的回调
...@@ -55,20 +54,6 @@ const MyTreeView = (props: MyTreeViewProps) => { ...@@ -55,20 +54,6 @@ const MyTreeView = (props: MyTreeViewProps) => {
</TreeItem> </TreeItem>
); );
// const renderTreeArray = (node: TreeItemType, index: number) => {
// return (
// <TreeItem
// key={node.id || `${node.name}${index}`}
// nodeId={String(node.id)}
// label={renderLabel === undefined ? node.name : renderLabel(node.name)}
// >
// {Array.isArray(node.subdirs)
// ? node.subdirs.map((nodeLi: any, i) => renderTreeArray(nodeLi, i))
// : null}
// </TreeItem>
// );
// };
return ( return (
<TreeView <TreeView
defaultCollapseIcon={<ArrowRightIcon />} defaultCollapseIcon={<ArrowRightIcon />}
...@@ -79,14 +64,9 @@ const MyTreeView = (props: MyTreeViewProps) => { ...@@ -79,14 +64,9 @@ const MyTreeView = (props: MyTreeViewProps) => {
defaultExpanded={defaultExpanded} defaultExpanded={defaultExpanded}
sx={{ ...treeViewSx }} sx={{ ...treeViewSx }}
> >
{treeData.length === 0 ? ( {treeData.map((treeItem, index) => {
<div>暂无数据</div> return renderTreeObj(treeItem, index);
) : ( })}
treeData.map((treeItem, index) => {
// return renderTreeArray(treeItem, index);
return renderTreeObj(treeItem, index);
})
)}
</TreeView> </TreeView>
); );
}; };
......
...@@ -135,7 +135,7 @@ const MoveFile = (props: any) => { ...@@ -135,7 +135,7 @@ const MoveFile = (props: any) => {
currentOperateFile.name currentOperateFile.name
}`; }`;
if (oldPath === newPath) { if (oldPath === newPath) {
Message.info("当前目录和目标目录一致,请重新选择目标目录"); Message.info("指定的目标路径为数据原路径,无需移动。");
return; return;
} }
CloudEController.JobFileMove( CloudEController.JobFileMove(
......
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
} }
.projectDataStickyTop { .projectDataStickyTop {
padding: 28px 24px; padding: 28px 24px;
position: relative;
} }
.projectDataTitle { .projectDataTitle {
font-size: 18px; font-size: 18px;
...@@ -73,6 +74,10 @@ ...@@ -73,6 +74,10 @@
align-items: center; align-items: center;
} }
.folderPointer{
cursor: pointer;
}
.folderIcon { .folderIcon {
margin-right: 12px; margin-right: 12px;
} }
...@@ -111,4 +116,21 @@ ...@@ -111,4 +116,21 @@
} }
.showPathSpanActive{ .showPathSpanActive{
color: #1370FF; color: #1370FF;
}
.noDataBox{
background-color: #fff;
height: calc(100vh - 377px);
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
position: relative;
top: -53px;
}
.noDataText{
margin-top: 8px;
font-size: 14px;
line-height: 22px;
color: #8A9099;
} }
\ No newline at end of file
...@@ -2,18 +2,16 @@ import React, { useState, useCallback, useEffect, useMemo } from "react"; ...@@ -2,18 +2,16 @@ import React, { useState, useCallback, useEffect, useMemo } from "react";
import style from "./index.module.css"; import style from "./index.module.css";
import classnames from "classnames"; import classnames from "classnames";
import { Button, InputBase, IconButton, TextField } from "@mui/material"; import { Button, InputBase, IconButton } from "@mui/material";
import LoadingButton from "@mui/lab/LoadingButton"; import LoadingButton from "@mui/lab/LoadingButton";
import { createTheme, ThemeProvider } from "@mui/material/styles"; import { createTheme, ThemeProvider } from "@mui/material/styles";
import SearchIcon from "@mui/icons-material/Search"; import SearchIcon from "@mui/icons-material/Search";
import RefreshIcon from "@mui/icons-material/Refresh"; import RefreshIcon from "@mui/icons-material/Refresh";
import Table from "@/components/Material.Ui/Table"; import Table from "@/components/Material.Ui/Table";
import bigFolderIcon from "@/assets/project/bigFolderIcon.svg";
import dataSetIcon from "@/assets/project/dataSetIcon.svg"; import dataSetIcon from "@/assets/project/dataSetIcon.svg";
import fileIcon from "@/assets/project/fileIcon.svg"; import fileIcon from "@/assets/project/fileIcon.svg";
import folderIcon from "@/assets/project/folderIcon.svg"; import folderIcon from "@/assets/project/folderIcon.svg";
import noFile from "@/assets/project/noFile.svg"; import noFile from "@/assets/project/noFile.svg";
import MyDialog from "@/components/mui/MyDialog";
import { useMessage } from "@/components/MySnackbar"; import { useMessage } from "@/components/MySnackbar";
import { getDataFileToken } from "@/api/project_api"; import { getDataFileToken } from "@/api/project_api";
import AddFolder from "./AddFolder"; import AddFolder from "./AddFolder";
...@@ -69,6 +67,8 @@ const ProjectData = observer(() => { ...@@ -69,6 +67,8 @@ const ProjectData = observer(() => {
return toJS(currentProjectStore.currentProjectInfo.id); return toJS(currentProjectStore.currentProjectInfo.id);
}, [currentProjectStore]); }, [currentProjectStore]);
const [tableLoadding, setTableLoadding] = useState(false); const [tableLoadding, setTableLoadding] = useState(false);
// 防止用户连续点击文件夹造成路径显示错误
const [debounce, setDebounce] = useState(false)
const [deleteDialogOpen, setDeleteDialogOpen] = useState(false); const [deleteDialogOpen, setDeleteDialogOpen] = useState(false);
const [currentOperateFile, setCurrentOperateFile] = useState<any>(null); const [currentOperateFile, setCurrentOperateFile] = useState<any>(null);
const [deleteloading, setDeleteloading] = useState(false); const [deleteloading, setDeleteloading] = useState(false);
...@@ -79,6 +79,13 @@ const ProjectData = observer(() => { ...@@ -79,6 +79,13 @@ const ProjectData = observer(() => {
useEffect(() => { useEffect(() => {
setSelectIds([]); setSelectIds([]);
}, [activeTab]); }, [activeTab]);
const handleChangeListType = (e: number) => {
if (isPass('PROJECT_DATA_TYPECHANAGE')) {
setActiveTab(e)
setSelectIds([]);
tableRef?.current?.initSelectedFunc([]);
}
}
const [keyWord, setKeyWord] = useState(""); const [keyWord, setKeyWord] = useState("");
const [fileToken, setFileToken] = useState(""); const [fileToken, setFileToken] = useState("");
...@@ -114,16 +121,11 @@ const ProjectData = observer(() => { ...@@ -114,16 +121,11 @@ const ProjectData = observer(() => {
}); });
setDataSetList(dataSetList); setDataSetList(dataSetList);
setSelectIds([]); setSelectIds([]);
setDebounce(false)
tableRef?.current?.initSelectedFunc([]); tableRef?.current?.initSelectedFunc([]);
}, },
}); });
// useEffect(() => {
// if (activeTab === 2) {
// getDataFileSearchRun()
// }
// }, [activeTab, getDataFileSearchRun]);
const { run: getDataFindRun } = useMyRequest(getDataFind, { const { run: getDataFindRun } = useMyRequest(getDataFind, {
onSuccess: (res: any) => { onSuccess: (res: any) => {
const dataSetList = res.data.map((item: any) => { const dataSetList = res.data.map((item: any) => {
...@@ -134,6 +136,7 @@ const ProjectData = observer(() => { ...@@ -134,6 +136,7 @@ const ProjectData = observer(() => {
}); });
setDataSetList(dataSetList); setDataSetList(dataSetList);
setSelectIds([]); setSelectIds([]);
setDebounce(false)
tableRef?.current?.initSelectedFunc([]); tableRef?.current?.initSelectedFunc([]);
}, },
}); });
...@@ -182,6 +185,7 @@ const ProjectData = observer(() => { ...@@ -182,6 +185,7 @@ const ProjectData = observer(() => {
setList([]); setList([]);
} }
setSelectIds([]); setSelectIds([]);
setDebounce(false)
}); });
} }
}, [fileToken, path, projectId, keyWord]); }, [fileToken, path, projectId, keyWord]);
...@@ -212,20 +216,23 @@ const ProjectData = observer(() => { ...@@ -212,20 +216,23 @@ const ProjectData = observer(() => {
setList([]); setList([]);
} }
setSelectIds([]); setSelectIds([]);
setDebounce(false)
}); });
} }
} }
}, [fileToken, projectId, keyWord, getList]); }, [fileToken, projectId, keyWord, getList]);
const handleRefresh = () => { const handleRefresh = () => {
tableRef?.current?.initSelectedFunc([]); if (isPass('PROJECT_DATA_REFRESH', 'USER')) {
setSelectIds([]); tableRef?.current?.initSelectedFunc([]);
if (keyWord) { setSelectIds([]);
searchFileList(); if (keyWord) {
getDataSetListSearch(); searchFileList();
} else { getDataSetListSearch();
getList(); } else {
getDataSetList(); getList();
getDataSetList();
}
} }
}; };
...@@ -249,26 +256,33 @@ const ProjectData = observer(() => { ...@@ -249,26 +256,33 @@ const ProjectData = observer(() => {
} }
}; };
// todo name sort
const versionsHeadCells = [ const versionsHeadCells = [
{ id: "checkbox" }, { id: "checkbox" },
{ id: "name", numeric: false, label: "名称", width: "25%" }, { id: "name", numeric: false, label: "名称", width: "25%" },
{ id: "size", numeric: false, label: "大小", width: "25%" }, { id: "size", numeric: false, label: "大小", width: "25%", sort: true },
{ id: "mtime", numeric: false, label: "创建时间", width: "25%" }, { id: "mtime", numeric: false, label: "创建时间", width: "25%", sort: true },
{ id: "caozuo", numeric: false, label: "操作", width: "25%" }, { id: "caozuo", numeric: false, label: "操作", width: "25%" },
]; ];
const hanldeCheckbox = (e: any) => { const hanldeCheckbox = (e: any) => {
console.log(e); const selectarr = e.map((item: any) => {
setSelectIds(e); let andIndex = item.indexOf("&index=")
return item.slice(5, andIndex)
})
setSelectIds(selectarr);
}; };
const handleViewFolders = (item: any) => { const handleViewFolders = (item: any) => {
console.log("handleViewFolders"); if (debounce) {
console.log(item); return
if (path === "/") {
setPath(`/${item.name}`);
} else { } else {
setPath(`${path}/${item.name}`); setDebounce(true)
if (path === "/") {
setPath(`/${item.name}`);
} else {
setPath(`${path}/${item.name}`);
}
} }
}; };
...@@ -281,7 +295,10 @@ const ProjectData = observer(() => { ...@@ -281,7 +295,10 @@ const ProjectData = observer(() => {
if (item.type === "directory") { if (item.type === "directory") {
return ( return (
<span <span
className={style.folderIconBox} className={classnames({
[style.folderIconBox]: true,
[style.folderPointer]: true,
})}
onClick={() => handleViewFolders(item)} onClick={() => handleViewFolders(item)}
> >
<img className={style.folderIcon} src={folderIcon} alt="" /> <img className={style.folderIcon} src={folderIcon} alt="" />
...@@ -307,33 +324,34 @@ const ProjectData = observer(() => { ...@@ -307,33 +324,34 @@ const ProjectData = observer(() => {
const renderSize = (item: any) => { const renderSize = (item: any) => {
if (item.type === "dataSet") { if (item.type === "dataSet") {
return <span>{item.size}</span>; return `${item.size}条`;
} }
return <span>{item.size ? `${item.size}b` : "-"}</span>; return `${item.size ? String((Number(item.size)/1048576).toFixed(2)) + 'MB' : '-'}`;
}; };
const renderMtime = (item: any) => { const renderMtime = (item: any) => {
return ( return String(moment(item.mtime).format("YYYY-MM-DD hh:mm:ss"))
// <span>{moment(new Date(item.mtime)).format("YYYY-MM-DD hh:mm:ss")}</span>
<span>{moment(item.mtime).format("YYYY-MM-DD hh:mm:ss")}</span>
);
}; };
const renderButtons = (item: any) => { const renderButtons = (item: any) => {
return ( return (
<span> <span>
<Button {item.type !== 'dataSet' && item.type !== 'directory' && (
sx={{ position: "relative", left: "-18px" }} <Button
variant="text" sx={{ position: "relative", left: "-18px", }}
size="small" variant="text"
> size="small"
下载 disabled={!isPass("PROJECT_DATA_DOWNLOAD")}
</Button> >
下载
</Button>
)}
<Button <Button
sx={{ position: "relative", left: "-18px" }} sx={{ position: "relative", left: "-18px" }}
variant="text" variant="text"
size="small" size="small"
onClick={() => hanleShowMoveFileDialog(item)} onClick={() => hanleShowMoveFileDialog(item)}
disabled={selectIds.length > 0 && !isPass("PROJECT_DATA_MOVE", 'USER')}
> >
移动至 移动至
</Button> </Button>
...@@ -343,6 +361,7 @@ const ProjectData = observer(() => { ...@@ -343,6 +361,7 @@ const ProjectData = observer(() => {
size="small" size="small"
color="error" color="error"
onClick={() => hanleDeleteFile(item)} onClick={() => hanleDeleteFile(item)}
disabled={selectIds.length > 0 && !isPass("PROJECT_DATA_DELETE", 'USER')}
> >
删除 删除
</Button> </Button>
...@@ -364,7 +383,6 @@ const ProjectData = observer(() => { ...@@ -364,7 +383,6 @@ const ProjectData = observer(() => {
let moveFileRef: any = React.createRef(); let moveFileRef: any = React.createRef();
const hanleShowMoveFileDialog = (item: any) => { const hanleShowMoveFileDialog = (item: any) => {
console.log(item);
setCurrentOperateFile(item); setCurrentOperateFile(item);
moveFileRef.current.showDialog(); moveFileRef.current.showDialog();
}; };
...@@ -557,10 +575,9 @@ const ProjectData = observer(() => { ...@@ -557,10 +575,9 @@ const ProjectData = observer(() => {
style={{ marginRight: "12px" }} style={{ marginRight: "12px" }}
onClick={hanleShowUpLoaderFileDialog} onClick={hanleShowUpLoaderFileDialog}
disabled={ disabled={
selectIds.length !== 0 || !isPass("PROJECT_DATA_UPLOAD") selectIds.length !== 0 || !isPass("PROJECT_DATA_UPLOAD", 'USER')
} }
> >
{/* todo 项目权限 */}
上传文件 上传文件
</Button> </Button>
<Button <Button
...@@ -569,10 +586,9 @@ const ProjectData = observer(() => { ...@@ -569,10 +586,9 @@ const ProjectData = observer(() => {
size="small" size="small"
onClick={hanleShowAddFolderDialog} onClick={hanleShowAddFolderDialog}
disabled={ disabled={
selectIds.length !== 0 || !isPass("PROJECT_DATA_ADDDIR") selectIds.length !== 0 || !isPass("PROJECT_DATA_ADDDIR", 'USER')
} }
> >
{/* todo 项目权限 */}
新建文件夹 新建文件夹
</Button> </Button>
</div> </div>
...@@ -610,7 +626,8 @@ const ProjectData = observer(() => { ...@@ -610,7 +626,8 @@ const ProjectData = observer(() => {
[style.projectDataTab]: true, [style.projectDataTab]: true,
[style.projectDataTabActive]: activeTab === 1, [style.projectDataTabActive]: activeTab === 1,
})} })}
onClick={() => setActiveTab(1)} // onClick={() => setActiveTab(1)}
onClick={() => handleChangeListType(1)}
> >
文件 文件
</div> </div>
...@@ -619,7 +636,8 @@ const ProjectData = observer(() => { ...@@ -619,7 +636,8 @@ const ProjectData = observer(() => {
[style.projectDataTab]: true, [style.projectDataTab]: true,
[style.projectDataTabActive]: activeTab !== 1, [style.projectDataTabActive]: activeTab !== 1,
})} })}
onClick={() => setActiveTab(2)} // onClick={() => setActiveTab(2)}
onClick={() => handleChangeListType(2)}
> >
数据集 数据集
</div> </div>
...@@ -628,6 +646,7 @@ const ProjectData = observer(() => { ...@@ -628,6 +646,7 @@ const ProjectData = observer(() => {
aria-label="refreshIcon" aria-label="refreshIcon"
size="small" size="small"
onClick={handleRefresh} onClick={handleRefresh}
disabled={!isPass('PROJECT_DATA_REFRESH', 'USER')}
> >
<RefreshIcon /> <RefreshIcon />
</IconButton> </IconButton>
...@@ -635,28 +654,32 @@ const ProjectData = observer(() => { ...@@ -635,28 +654,32 @@ const ProjectData = observer(() => {
</div> </div>
</div> </div>
<Table <Table
footer={false}
rowHover={true}
onRef={tableRef}
nopadding={true}
stickyheader={true}
load={tableLoadding}
initSelected={selectIds}
headCells={versionsHeadCells}
checkboxData={(e: any) => { checkboxData={(e: any) => {
hanldeCheckbox(e); hanldeCheckbox(e);
}} }}
// param="name" rows={showList.map((item: any, index: number) => ({
rowHover={true}
stickyheader={true}
rows={showList.map((item: any) => ({
...item, ...item,
id: item.name, id: `name=${item.name}&index=${index}`,
name: renderName(item), name: renderName(item),
size: renderSize(item), size: renderSize(item),
mtime: renderMtime(item), mtime: renderMtime(item),
caozuo: renderButtons(item), caozuo: renderButtons(item),
}))} }))}
load={tableLoadding}
// rowsPerPage={"99"}
headCells={versionsHeadCells}
nopadding={true}
footer={false}
initSelected={selectIds}
onRef={tableRef}
></Table> ></Table>
{
showList.length === 0 && <div className={style.noDataBox}>
<img className={style.noDataImg} src={noFile} alt="" />
<span className={style.noDataText}>暂未开启模板</span>
</div>
}
</div> </div>
{selectIds.length > 1 && ( {selectIds.length > 1 && (
<div className={style.projectDataStickyBox}> <div className={style.projectDataStickyBox}>
...@@ -666,6 +689,7 @@ const ProjectData = observer(() => { ...@@ -666,6 +689,7 @@ const ProjectData = observer(() => {
size="small" size="small"
style={{ marginRight: "12px" }} style={{ marginRight: "12px" }}
onClick={handleBatchDelete} onClick={handleBatchDelete}
disabled={!isPass("PROJECT_DATA_DELETE", 'USER')}
> >
批量删除({selectIds.length} 批量删除({selectIds.length}
</Button> </Button>
...@@ -675,6 +699,7 @@ const ProjectData = observer(() => { ...@@ -675,6 +699,7 @@ const ProjectData = observer(() => {
size="small" size="small"
style={{ marginRight: "24px" }} style={{ marginRight: "24px" }}
onClick={handleBatchMove} onClick={handleBatchMove}
disabled={!isPass("PROJECT_DATA_MOVE", 'USER')}
> >
批量移动({selectIds.length} 批量移动({selectIds.length}
</Button> </Button>
......
...@@ -5,9 +5,9 @@ export const getProjectList = async () => { ...@@ -5,9 +5,9 @@ export const getProjectList = async () => {
return res.data; return res.data;
}; };
// 设置文件服务器指向
export const setFileServerEndPointLocalStorage = async (zoneId: string) => { export const setFileServerEndPointLocalStorage = async (zoneId: string) => {
const res = await hpczone(); const res = await hpczone();
console.log(res);
let fileServerEndPoint = ""; let fileServerEndPoint = "";
if (Array.isArray(res)) { if (Array.isArray(res)) {
res.forEach((item: any) => { res.forEach((item: any) => {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment