Commit 9bbf7fae authored by chenshouchao's avatar chenshouchao

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

Feat 20220608 projectdata

See merge request sunyihao/bkunyun!43
parents b053f4c5 3cb7850c
...@@ -21,12 +21,14 @@ const RESTAPI = { ...@@ -21,12 +21,14 @@ const RESTAPI = {
API_DATA_FIND: `${BACKEND_API_URI_PREFIX}/cpp/data/find`, //查询某路径下数据集 API_DATA_FIND: `${BACKEND_API_URI_PREFIX}/cpp/data/find`, //查询某路径下数据集
API_DATA_SEARCH: `${BACKEND_API_URI_PREFIX}/cpp/data/search`, //搜索项目中某路径下的数据集 API_DATA_SEARCH: `${BACKEND_API_URI_PREFIX}/cpp/data/search`, //搜索项目中某路径下的数据集
API_DATA_MOVE: `${BACKEND_API_URI_PREFIX}/cpp/data/move`, //移动到 API_DATA_MOVE: `${BACKEND_API_URI_PREFIX}/cpp/data/move`, //移动到
API_DATA_MOVE_PACKAGE: `${BACKEND_API_URI_PREFIX}/cpp/data/move/package`, //移动文件夹中的数据集
API_DATA_DEL: `${BACKEND_API_URI_PREFIX}/cpp/data/del`, //删除项目中的数据集 API_DATA_DEL: `${BACKEND_API_URI_PREFIX}/cpp/data/del`, //删除项目中的数据集
API_DATA_DEL_PACKAGE: `${BACKEND_API_URI_PREFIX}/cpp/data/del/package`, //删除文件夹中的数据集
API_USER_PERMISSION_LIST: `${BACKEND_API_URI_PREFIX}/uaa/routes/privilege/list`, //获取用户包含的权限列表 API_USER_PERMISSION_LIST: `${BACKEND_API_URI_PREFIX}/uaa/routes/privilege/list`, //获取用户包含的权限列表
API_WORKBENCH_TEMPLATE_LIST: `${BACKEND_API_URI_PREFIX}/cpp/workbench/project/workflowspec`,//查询项目下工作流模板列表 API_WORKBENCH_TEMPLATE_LIST: `${BACKEND_API_URI_PREFIX}/cpp/workbench/project/workflowspec`, //查询项目下工作流模板列表
API_WORKBENCH_DELETE_TEMPLATE: `${BACKEND_API_URI_PREFIX}/cpp/workbench/project/workflowspec`,//项目管理员-删除工作流模板 API_WORKBENCH_DELETE_TEMPLATE: `${BACKEND_API_URI_PREFIX}/cpp/workbench/project/workflowspec`, //项目管理员-删除工作流模板
API_WORKBENCH_ADD_TEMPLATE_LIST: `${BACKEND_API_URI_PREFIX}/cpp/workbench/product/workflowspec`,//项目管理员-添加工作流模板-模板列表 API_WORKBENCH_ADD_TEMPLATE_LIST: `${BACKEND_API_URI_PREFIX}/cpp/workbench/product/workflowspec`, //项目管理员-添加工作流模板-模板列表
API_WORKBENCH_ADD_TEMPLATE: `${BACKEND_API_URI_PREFIX}/cpp/workbench/project/workflowspec`,//项目管理员-添加工作流模板-提交 API_WORKBENCH_ADD_TEMPLATE: `${BACKEND_API_URI_PREFIX}/cpp/workbench/project/workflowspec`, //项目管理员-添加工作流模板-提交
} };
export default RESTAPI; export default RESTAPI;
export const a = () => {
return "a";
};
...@@ -135,7 +135,6 @@ type getDataFileMoveParams = { ...@@ -135,7 +135,6 @@ type getDataFileMoveParams = {
dpath?: string; // 目标路径 dpath?: string; // 目标路径
}; };
// Content-Type application/x-www-form-urlencoded
// 移动到 // 移动到
const getDataFileMove = (params: getDataFileMoveParams) => { const getDataFileMove = (params: getDataFileMoveParams) => {
return request({ return request({
...@@ -148,13 +147,31 @@ const getDataFileMove = (params: getDataFileMoveParams) => { ...@@ -148,13 +147,31 @@ const getDataFileMove = (params: getDataFileMoveParams) => {
}); });
}; };
type getDataFileMovePackageParams = {
projectId: string;
names: string; // 包名
spath?: string; // 原路径
dpath?: string; // 目标路径
};
// 移动文件夹中的数据集
const getDataFileMovePackage = (params: getDataFileMovePackageParams) => {
return request({
url: Api.API_DATA_MOVE_PACKAGE,
method: "put",
data: params,
headers: {
"Content-Type": "application/x-www-form-urlencoded",
},
});
};
type getDataFileDelParams = { type getDataFileDelParams = {
projectId: string; projectId: string;
names: string; names: string;
path?: string; path?: string;
}; };
// Content-Type application/x-www-form-urlencoded
// 删除项目中的数据集 // 删除项目中的数据集
const getDataFileDel = (params: getDataFileDelParams) => { const getDataFileDel = (params: getDataFileDelParams) => {
return request({ return request({
...@@ -167,6 +184,24 @@ const getDataFileDel = (params: getDataFileDelParams) => { ...@@ -167,6 +184,24 @@ const getDataFileDel = (params: getDataFileDelParams) => {
}); });
}; };
type getDataFileDelPackageParams = {
projectId: string;
names: string;
path?: string;
};
// 删除项目中的数据集
const getDataFileDelPackage = (params: getDataFileDelPackageParams) => {
return request({
url: Api.API_DATA_DEL_PACKAGE,
method: "delete",
params,
headers: {
"Content-Type": "application/x-www-form-urlencoded",
},
});
};
export { export {
current, current,
menu, menu,
...@@ -180,5 +215,7 @@ export { ...@@ -180,5 +215,7 @@ export {
getDataFind, getDataFind,
getDataFileSearch, getDataFileSearch,
getDataFileMove, getDataFileMove,
getDataFileMovePackage,
getDataFileDel, getDataFileDel,
getDataFileDelPackage,
}; };
...@@ -33,14 +33,14 @@ export const uuid = () => { ...@@ -33,14 +33,14 @@ export const uuid = () => {
* params: item: 毫秒的时间戳 * params: item: 毫秒的时间戳
*/ */
export const formatTime = (time: number) => { export const formatTime = (time: number) => {
const newTime = Math.floor( time / 1000) ; const newTime = Math.floor(time / 1000);
const hours = Math.floor(newTime / 3600); const hours = Math.floor(newTime / 3600);
const minutes = Math.floor((newTime % 3600) / 60); const minutes = Math.floor((newTime % 3600) / 60);
const seconds = newTime % 60; const seconds = newTime % 60;
const hoursString = hours ? `${hours}小时` : ''; const hoursString = hours ? `${hours}小时` : "";
const minutesString = minutes ? `${minutes}分钟` : ''; const minutesString = minutes ? `${minutes}分钟` : "";
const secondsString = seconds ? `${seconds}秒` : ''; const secondsString = seconds ? `${seconds}秒` : "";
return `${hoursString}${minutesString}${secondsString}`; return `${hoursString}${minutesString}${secondsString}`;
}; };
......
import React, { useState, useImperativeHandle, useMemo } from "react";
import MyDialog from "@/components/mui/MyDialog";
import { useMessage } from "@/components/MySnackbar";
import CloudEController from "@/api/fileserver/CloudEController";
import { getDataFileDel, getDataFileDelPackage } from "@/api/project_api";
import useMyRequest from "@/hooks/useMyRequest";
const DeleteDialog = (props: any) => {
const {
path,
projectId,
fileToken,
currentOperateFile,
selectIds,
refresh,
showList,
} = props;
const Message = useMessage();
let deleteFileDialogRef: any = React.createRef();
const showDialog = () => {
deleteFileDialogRef.current.handleClickOpen();
};
useImperativeHandle(props.onRef, () => {
return {
showDialog: showDialog,
};
});
const { run: getDataFileDelRun } = useMyRequest(getDataFileDel, {
onSuccess: (res: any) => {
successDelete();
},
});
const { run: getDataFileDelPackageRun } = useMyRequest(
getDataFileDelPackage,
{
onSuccess: (res: any) => {
successDelete();
},
}
);
const successDelete = () => {
Message.success("删除成功!");
deleteFileDialogRef?.current?.handleClose();
refresh();
};
const deletePathProvidedToDataSet = useMemo(() => {
return path === "/" ? "/" : `${path}/`;
}, [path]);
const deletePathProvidedFileServer = useMemo(() => {
return path === "/" ? `${path}` : `${path}/`;
}, [path]);
// 删除
const handleSubmit = () => {
if (!currentOperateFile) {
// 批量删除
// 要删除的数据集
const datSetDeleteList = showList.filter((item: any) => {
return selectIds.indexOf(item.name) !== -1 && item.type === "dataSet";
});
// 要删除的文件夹
const folderDeleteList = showList.filter((item: any) => {
return selectIds.indexOf(item.name) !== -1 && item.type === "directory";
});
// 要删除的文件
const fileDeleteList = showList.filter((item: any) => {
return (
selectIds.indexOf(item.name) !== -1 &&
item.type !== "dataSet" &&
item.type !== "directory"
);
});
if (datSetDeleteList.length > 0) {
dataSetsDelete(datSetDeleteList);
}
if (folderDeleteList.length > 0) {
foldersDelete(folderDeleteList);
}
if (fileDeleteList.length > 0) {
filesDelete(fileDeleteList);
}
} else {
if (currentOperateFile.type === "dataSet") {
dataSetDelete();
} else if (currentOperateFile.type === "directory") {
folerDelete();
} else {
fileDelete();
}
}
};
// 删除单个数据集
const dataSetDelete = () => {
getDataFileDelRun({
projectId: projectId as string,
names: currentOperateFile.name,
path: deletePathProvidedToDataSet,
});
};
// 删除单个文件夹
const folerDelete = () => {
fileDelete();
const names = currentOperateFile.name;
dataSetInFolerDelete(names);
};
// 删除文件夹中的数据集
const dataSetInFolerDelete = (names: string) => {
getDataFileDelPackageRun({
projectId: projectId as string,
names,
path: deletePathProvidedToDataSet,
});
};
// 删除单个文件
const fileDelete = () => {
CloudEController.JobOutFileDel(
`${deletePathProvidedFileServer}${currentOperateFile.name}`,
fileToken as string,
projectId as string
)?.then((res) => {
successDelete();
});
};
// 删除多个数据集
const dataSetsDelete = (datSetDeleteList: Array<any>) => {
getDataFileDelRun({
projectId: projectId as string,
names: datSetDeleteList.map((item: any) => item.name).join(","),
path: deletePathProvidedToDataSet,
});
};
// 删除多个文件夹
const foldersDelete = (folderDeleteList: Array<any>) => {
filesDelete(folderDeleteList);
const names = folderDeleteList.map((item: any) => item.name).join(",");
dataSetInFolerDelete(names);
};
// 删除多个文件
const filesDelete = (fileDeleteList: Array<any>) => {
const deletePath = fileDeleteList
.map((item: any) => {
return `${deletePathProvidedFileServer}${item.name}`;
})
.join(" ");
CloudEController.JobOutFileDel(
deletePath,
fileToken as string,
projectId as string
)?.then((res) => {
successDelete();
});
};
const submitloading = false;
return (
<MyDialog
handleSubmit={handleSubmit}
onRef={deleteFileDialogRef}
title="提示"
submitloading={submitloading}
>
{currentOperateFile
? "确认删除该数据吗?"
: `确认删除这${selectIds.length}条数据吗?`}
</MyDialog>
);
};
export default DeleteDialog;
import React, { useState, useImperativeHandle, useCallback } from "react"; import React, {
useState,
useImperativeHandle,
useCallback,
useMemo,
} from "react";
import style from "./index.module.css"; import style from "./index.module.css";
import MyDialog from "@/components/mui/MyDialog"; import MyDialog from "@/components/mui/MyDialog";
...@@ -7,7 +12,7 @@ import bigFolderIcon from "@/assets/project/bigFolderIcon.svg"; ...@@ -7,7 +12,7 @@ import bigFolderIcon from "@/assets/project/bigFolderIcon.svg";
import { useMessage } from "@/components/MySnackbar"; import { useMessage } from "@/components/MySnackbar";
import MyTreeView from "@/components/mui/MyTreeView"; import MyTreeView from "@/components/mui/MyTreeView";
import CloudEController from "@/api/fileserver/CloudEController"; import CloudEController from "@/api/fileserver/CloudEController";
import { getDataFileMove } from "@/api/project_api"; import { getDataFileMove, getDataFileMovePackage } from "@/api/project_api";
import useMyRequest from "@/hooks/useMyRequest"; import useMyRequest from "@/hooks/useMyRequest";
import classNames from "classnames"; import classNames from "classnames";
...@@ -19,17 +24,24 @@ const MoveFile = (props: any) => { ...@@ -19,17 +24,24 @@ const MoveFile = (props: any) => {
currentOperateFile, currentOperateFile,
selectIds, selectIds,
refresh, refresh,
activeTab,
showList, showList,
} = props; } = props;
const Message = useMessage(); const Message = useMessage();
const { run: getDataFileMoveRun } = useMyRequest(getDataFileMove, { const { run: getDataFileMoveRun } = useMyRequest(getDataFileMove, {
onSuccess: (res: any) => { onSuccess: (res: any) => {
Message.success("移动成功!"); successMove();
moveFileDialogRef.current.handleClose();
refresh();
}, },
}); });
const { run: getDataFileMovePackageRun } = useMyRequest(
getDataFileMovePackage,
{
onSuccess: (res: any) => {
successMove();
},
}
);
const [newPath, setNewPath] = useState("/"); const [newPath, setNewPath] = useState("/");
const [rootActive, setRootActive] = useState(true); const [rootActive, setRootActive] = useState(true);
...@@ -65,97 +77,155 @@ const MoveFile = (props: any) => { ...@@ -65,97 +77,155 @@ const MoveFile = (props: any) => {
}; };
}); });
// 提供给fileserver相关接口的newpath 直接用newPath就可以了
// const newPathProvidedToFileServer = useMemo(() => {
// return newPath
// }, [newPath])
// 提供给数据集相关接口的newpath
const newPathProvidedToDataSet = useMemo(() => {
return newPath === "/" ? "/" : `${newPath}/`;
}, [newPath]);
// 提供给fileserver相关接口的oldpath
const oldPathProvidedToFileServer = useMemo(() => {
return `${path}${path === "/" ? "" : "/"}`;
}, [path]);
// 提供给数据集相关接口的oldpath
const oldPathProvidedToDataSet = useMemo(() => {
return path === "/" ? "/" : `${path}/`;
}, [path]);
// 移动成功后的操作
const successMove = () => {
Message.success("移动成功!");
moveFileDialogRef?.current?.handleClose();
refresh();
};
// 移动
const handleMoveFileSubmit = () => { const handleMoveFileSubmit = () => {
if (newPath) { if (!newPath) {
Message.error("请选择移动到哪个目录");
} else if (newPath === path) {
Message.error("指定的目标路径为数据原路径,无需移动。");
} else {
if (!currentOperateFile) { if (!currentOperateFile) {
// 批量移动 // 批量移动
if (activeTab === 1) { // 要移动的数据集
const oldPaths = selectIds.map((name: any) => { const datSetMoveList = showList.filter((item: any) => {
return `${path}${path === "/" ? "" : "/"}${name}`; return selectIds.indexOf(item.name) !== -1 && item.type === "dataSet";
}); });
CloudEController.JobFileBatchMove( // 要移动的文件夹
newPath, const folderMoveList = showList.filter((item: any) => {
oldPaths, return (
"", selectIds.indexOf(item.name) !== -1 && item.type === "directory"
fileToken, );
projectId });
)?.then((res) => { // 要移动的文件
Message.success("移动成功!"); const fileMoveList = showList.filter((item: any) => {
moveFileDialogRef.current.handleClose(); return (
refresh(); selectIds.indexOf(item.name) !== -1 &&
}); item.type !== "dataSet" &&
} else { item.type !== "directory"
const datSetMoveList = showList.filter((item: any) => { );
return ( });
selectIds.indexOf(item.name) !== -1 && item.type === "dataSet" if (datSetMoveList.length > 0) {
); dataSetsMove(datSetMoveList);
}); }
const otherMoveList = showList.filter((item: any) => { if (folderMoveList.length > 0) {
return ( foldersMove(folderMoveList);
selectIds.indexOf(item.name) !== -1 && item.type !== "dataSet" }
); if (fileMoveList.length > 0) {
}); filesMove(fileMoveList);
if (datSetMoveList.length > 0) {
const oldPaths = `${path}${path === "/" ? "" : "/"}`;
getDataFileMoveRun({
projectId: projectId as string,
names: datSetMoveList.map((item: any) => item.name).join(","),
spath: oldPaths,
dpath: newPath === "/" ? "/" : `${newPath}/`,
});
}
if (otherMoveList.length > 0) {
const oldPaths = otherMoveList.map((item: any) => {
return `${path}${path === "/" ? "" : "/"}${item.name}`;
});
CloudEController.JobFileBatchMove(
newPath,
oldPaths,
"",
fileToken,
projectId
)?.then((res) => {
Message.success("移动成功!");
moveFileDialogRef.current.handleClose();
refresh();
});
}
} }
} else { } else {
if (currentOperateFile.type === "dataSet") { if (currentOperateFile.type === "dataSet") {
const oldPaths = `${path}${path === "/" ? "" : "/"}`; dataSetMove();
getDataFileMoveRun({ } else if (currentOperateFile.type === "directory") {
projectId: projectId as string, folerMove();
names: currentOperateFile.name,
spath: oldPaths,
dpath: newPath === "/" ? "/" : `${newPath}/`,
});
} else { } else {
const oldPath = `${path}${path === "/" ? "" : "/"}${ fileMove();
currentOperateFile.name
}`;
if (oldPath === newPath) {
Message.info("指定的目标路径为数据原路径,无需移动。");
return;
}
CloudEController.JobFileMove(
newPath,
oldPath,
"",
fileToken,
projectId
)?.then((res) => {
Message.success("移动成功!");
moveFileDialogRef.current.handleClose();
refresh();
});
} }
} }
} else {
Message.error("请选择移动到哪个目录");
} }
}; };
// 单文件移动
const fileMove = () => {
const oldPathToFileServer = `${oldPathProvidedToFileServer}${currentOperateFile.name}`;
CloudEController.JobFileMove(
newPath,
oldPathToFileServer,
"",
fileToken,
projectId
)?.then((res) => {
successMove();
});
};
// 多文件移动
const filesMove = (fileMoveList: Array<any>) => {
const oldPaths = fileMoveList.map((item: any) => {
return `${oldPathProvidedToFileServer}${item.name}`;
});
CloudEController.JobFileBatchMove(
newPath,
oldPaths,
"",
fileToken,
projectId
)?.then((res) => {
successMove();
});
};
// 单文件夹移动
const folerMove = () => {
fileMove();
const names = currentOperateFile.name;
dataSetInFolerMove(names);
};
// 移动文件夹中的数据集
const dataSetInFolerMove = (names: string) => {
getDataFileMovePackageRun({
projectId: projectId as string,
names,
spath: oldPathProvidedToDataSet,
dpath: newPathProvidedToDataSet,
});
};
// 多文件夹移动
const foldersMove = (folderMoveList: Array<any>) => {
filesMove(folderMoveList);
const names = folderMoveList.map((item: any) => item.name).join(",");
dataSetInFolerMove(names);
};
// 单数据集移动
const dataSetMove = () => {
getDataFileMoveRun({
projectId: projectId as string,
names: currentOperateFile.name,
spath: oldPathProvidedToDataSet,
dpath: newPathProvidedToDataSet,
});
};
// 多数据集移动
const dataSetsMove = (datSetMoveList: Array<any>) => {
getDataFileMoveRun({
projectId: projectId as string,
names: datSetMoveList.map((item: any) => item.name).join(","),
spath: oldPathProvidedToFileServer,
dpath: newPath === "/" ? "/" : `${newPath}/`,
});
};
const renderLabel = (labelNmae: string) => { const renderLabel = (labelNmae: string) => {
return ( return (
<span className={style.treeLabel}> <span className={style.treeLabel}>
...@@ -170,6 +240,11 @@ const MoveFile = (props: any) => { ...@@ -170,6 +240,11 @@ const MoveFile = (props: any) => {
setRootActive(false); setRootActive(false);
}; };
// 给路径去掉第一个'/'然后结尾加上文件名 方便后面直接使用
const idFunc = (item: any) => {
return `${item.dir.substr(1)}${item.name}`;
};
const handleRoot = () => { const handleRoot = () => {
setNewPath("/"); setNewPath("/");
setRootActive(true); setRootActive(true);
...@@ -177,10 +252,6 @@ const MoveFile = (props: any) => { ...@@ -177,10 +252,6 @@ const MoveFile = (props: any) => {
const moveFileSubmitloading = false; const moveFileSubmitloading = false;
const idFunc = (item: any) => {
return `${item.dir.substr(1)}${item.name}`;
};
return ( return (
<MyDialog <MyDialog
handleSubmit={handleMoveFileSubmit} handleSubmit={handleMoveFileSubmit}
......
...@@ -67,7 +67,6 @@ const UpLoaderFile = observer((props: any) => { ...@@ -67,7 +67,6 @@ const UpLoaderFile = observer((props: any) => {
}; };
const repeatAndUploaderFileList = const repeatAndUploaderFileList =
getRepeatFileAndGetUploderFileList(acceptedFiles); getRepeatFileAndGetUploderFileList(acceptedFiles);
console.log(repeatAndUploaderFileList);
if (repeatAndUploaderFileList.repeatFileList.length > 0) { if (repeatAndUploaderFileList.repeatFileList.length > 0) {
message.error( message.error(
`“${repeatAndUploaderFileList.repeatFileList `“${repeatAndUploaderFileList.repeatFileList
...@@ -78,6 +77,12 @@ const UpLoaderFile = observer((props: any) => { ...@@ -78,6 +77,12 @@ const UpLoaderFile = observer((props: any) => {
// 插入新的文件列表 // 插入新的文件列表
const popLength = 10 - fileList.length; const popLength = 10 - fileList.length;
if (
fileList.length + repeatAndUploaderFileList.uploderFileList.length >
10
) {
message.error("最大支持同时上传10个文件");
}
let newFileList = [ let newFileList = [
...repeatAndUploaderFileList.uploderFileList.slice(0, popLength), ...repeatAndUploaderFileList.uploderFileList.slice(0, popLength),
...fileList, ...fileList,
......
...@@ -3,7 +3,6 @@ import React, { useState, useCallback, useEffect, useMemo } from "react"; ...@@ -3,7 +3,6 @@ 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 } from "@mui/material"; import { Button, InputBase, IconButton } from "@mui/material";
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";
...@@ -12,9 +11,9 @@ import dataSetIcon from "@/assets/project/dataSetIcon.svg"; ...@@ -12,9 +11,9 @@ 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 { useMessage } from "@/components/MySnackbar";
import AddFolder from "./AddFolder"; import AddFolder from "./AddFolder";
import MoveFile from "./MoveFile"; import MoveFile from "./MoveFile";
import DeleteDialog from "./DeleteDialog";
import UpLoaderFile from "./UpLoaderFile"; import UpLoaderFile from "./UpLoaderFile";
import useMyRequest from "@/hooks/useMyRequest"; import useMyRequest from "@/hooks/useMyRequest";
import { observer } from "mobx-react-lite"; import { observer } from "mobx-react-lite";
...@@ -22,20 +21,11 @@ import { useStores } from "@/store"; ...@@ -22,20 +21,11 @@ import { useStores } from "@/store";
import CloudEController from "@/api/fileserver/CloudEController"; import CloudEController from "@/api/fileserver/CloudEController";
import { toJS } from "mobx"; import { toJS } from "mobx";
import moment from "moment"; import moment from "moment";
import Dialog from "@mui/material/Dialog";
import DialogActions from "@mui/material/DialogActions";
import DialogContent from "@mui/material/DialogContent";
import DialogContentText from "@mui/material/DialogContentText";
import DialogTitle from "@mui/material/DialogTitle";
import NoProject from "@/components/NoProject"; import NoProject from "@/components/NoProject";
import usePass from "@/hooks/usePass"; import usePass from "@/hooks/usePass";
import { storageUnitFromB } from "@/utils/util"; import { storageUnitFromB } from "@/utils/util";
import { useLocation } from "react-router-dom"; import { useLocation } from "react-router-dom";
import { import { getDataFind, getDataFileSearch } from "@/api/project_api";
getDataFind,
getDataFileSearch,
getDataFileDel,
} from "@/api/project_api";
const theme = createTheme({ const theme = createTheme({
palette: { palette: {
...@@ -63,18 +53,11 @@ declare module "@mui/material/Button" { ...@@ -63,18 +53,11 @@ declare module "@mui/material/Button" {
const ProjectData = observer(() => { const ProjectData = observer(() => {
const isPass = usePass(); const isPass = usePass();
const Message = useMessage();
const { currentProjectStore } = useStores(); const { currentProjectStore } = useStores();
// const [fileToken, setFileToken] = useState("");
const fileToken = toJS(currentProjectStore.currentProjectInfo.filetoken); const fileToken = toJS(currentProjectStore.currentProjectInfo.filetoken);
const projectId = toJS(currentProjectStore.currentProjectInfo.id); const projectId = toJS(currentProjectStore.currentProjectInfo.id);
// const projectId = useMemo(() => { console.log(fileToken);
// console.log( console.log(projectId);
// toJS(currentProjectStore.currentProjectInfo.id),
// "toJS(currentProjectStore.currentProjectInfo.id)"
// );
// return toJS(currentProjectStore.currentProjectInfo.id);
// }, [currentProjectStore]);
/** 路由信息 */ /** 路由信息 */
const location = useLocation(); const location = useLocation();
// 当前文件路径 // 当前文件路径
...@@ -82,10 +65,8 @@ const ProjectData = observer(() => { ...@@ -82,10 +65,8 @@ const ProjectData = observer(() => {
const [tableLoadding, setTableLoadding] = useState(false); const [tableLoadding, setTableLoadding] = useState(false);
// 防止用户连续点击文件夹造成路径显示错误 // 防止用户连续点击文件夹造成路径显示错误
const [debounce, setDebounce] = useState(false); const [debounce, setDebounce] = useState(false);
const [deleteDialogOpen, setDeleteDialogOpen] = useState(false);
// 点击操作列中的按钮 会设置当前点击的文件 // 点击操作列中的按钮 会设置当前点击的文件
const [currentOperateFile, setCurrentOperateFile] = useState<any>(null); const [currentOperateFile, setCurrentOperateFile] = useState<any>(null);
const [deleteloading, setDeleteloading] = useState(false);
// 1文件 2数据集 // 1文件 2数据集
const [activeTab, setActiveTab] = useState(1); const [activeTab, setActiveTab] = useState(1);
// 复选框选中的文件名称数组 // 复选框选中的文件名称数组
...@@ -128,13 +109,6 @@ const ProjectData = observer(() => { ...@@ -128,13 +109,6 @@ const ProjectData = observer(() => {
return [...list, ...dataSetList]; return [...list, ...dataSetList];
}, [list, dataSetList]); }, [list, dataSetList]);
// 获取文件token
// const { run: getDataFileTokenRun } = useMyRequest(getDataFileToken, {
// onSuccess: (res: any) => {
// setFileToken(res.data);
// },
// });
// 全局搜索数据集 // 全局搜索数据集
const { run: getDataFileSearchRun } = useMyRequest(getDataFileSearch, { const { run: getDataFileSearchRun } = useMyRequest(getDataFileSearch, {
onSuccess: (res: any) => { onSuccess: (res: any) => {
...@@ -169,9 +143,9 @@ const ProjectData = observer(() => { ...@@ -169,9 +143,9 @@ const ProjectData = observer(() => {
// 获取某路径下的数据集 // 获取某路径下的数据集
const getDataSetList = useCallback(() => { const getDataSetList = useCallback(() => {
if (keyWord && projectId) { if (keyWord) {
return; return;
} else { } else if (projectId) {
return getDataFindRun({ return getDataFindRun({
projectId: projectId as string, projectId: projectId as string,
path: path === "/" ? "/" : `${path}/`, path: path === "/" ? "/" : `${path}/`,
...@@ -265,13 +239,6 @@ const ProjectData = observer(() => { ...@@ -265,13 +239,6 @@ const ProjectData = observer(() => {
} }
}; };
// 项目切换时重新获取文件token
// useEffect(() => {
// getDataFileTokenRun({
// id: currentProjectStore.currentProjectInfo.id as string,
// });
// }, [getDataFileTokenRun, currentProjectStore]);
// 搜索值改变 // 搜索值改变
const handleKeyWordChange = (e: any) => { const handleKeyWordChange = (e: any) => {
if (e.target.value.length > 30) { if (e.target.value.length > 30) {
...@@ -327,12 +294,6 @@ const ProjectData = observer(() => { ...@@ -327,12 +294,6 @@ const ProjectData = observer(() => {
} }
}; };
// 显示删除确认框
const hanleDeleteFile = (item: any) => {
setCurrentOperateFile(item);
setDeleteDialogOpen(true);
};
// table配置 // table配置
const renderName = (item: any) => { const renderName = (item: any) => {
if (item.type === "directory") { if (item.type === "directory") {
...@@ -423,7 +384,7 @@ const ProjectData = observer(() => { ...@@ -423,7 +384,7 @@ const ProjectData = observer(() => {
variant="text" variant="text"
size="small" size="small"
color="error" color="error"
onClick={() => hanleDeleteFile(item)} onClick={() => hanleShowDeleteDialogRef(item)}
disabled={ disabled={
selectIds.length > 0 || !isPass("PROJECT_DATA_DELETE", "USER") selectIds.length > 0 || !isPass("PROJECT_DATA_DELETE", "USER")
} }
...@@ -455,109 +416,11 @@ const ProjectData = observer(() => { ...@@ -455,109 +416,11 @@ const ProjectData = observer(() => {
moveFileRef.current.showDialog(); moveFileRef.current.showDialog();
}; };
// 删除文件 // 删除弹窗
const handleDeleteDialogClose = (event: any = {}, reason: any = "other") => { let deleteDialogRef: any = React.createRef();
// 点击弹窗外不关闭弹窗 const hanleShowDeleteDialogRef = (item: any) => {
if (reason === "backdropClick") { setCurrentOperateFile(item);
return; deleteDialogRef.current.showDialog();
}
setDeleteDialogOpen(false);
};
// 删除数据集请求
const { run: getDataFileDelRun } = useMyRequest(getDataFileDel, {
onSuccess: (res: any) => {
Message.success("删除成功");
setDeleteloading(false);
setDeleteDialogOpen(false);
handleRefresh();
},
});
// 删除流程判断待优化
const handleDelete = () => {
let deletePath = "";
if (currentOperateFile) {
deletePath =
path === "/"
? `${path}${currentOperateFile.name}`
: `${path}/${currentOperateFile.name}`;
} else {
deletePath = selectIds
.map((name: any) => {
return `${path}${path === "/" ? "" : "/"}${name}`;
})
.join(" ");
}
if (activeTab === 2) {
deletePath = path === "/" ? "/" : `${path}/`;
if (currentOperateFile) {
if (currentOperateFile.type === "dataSet") {
getDataFileDelRun({
projectId: projectId as string,
names: currentOperateFile.name,
path: deletePath,
});
} else {
deletePath =
path === "/"
? `${path}${currentOperateFile.name}`
: `${path}/${currentOperateFile.name}`;
CloudEController.JobOutFileDel(
deletePath,
fileToken as string,
projectId as string
)?.then((res) => {
Message.success("删除成功");
setDeleteloading(false);
setDeleteDialogOpen(false);
handleRefresh();
});
}
} else {
const datSetDeleteList = showList.filter((item: any) => {
return selectIds.indexOf(item.name) !== -1 && item.type === "dataSet";
});
const otherDeleteList = showList.filter((item: any) => {
return selectIds.indexOf(item.name) !== -1 && item.type !== "dataSet";
});
if (datSetDeleteList.length > 0) {
getDataFileDelRun({
projectId: projectId as string,
names: datSetDeleteList.map((item: any) => item.name).join(","),
path: deletePath,
});
}
if (otherDeleteList.length > 0) {
deletePath = otherDeleteList
.map((item: any) => {
return `${path}${path === "/" ? "" : "/"}${item.name}`;
})
.join(" ");
CloudEController.JobOutFileDel(
deletePath,
fileToken as string,
projectId as string
)?.then((res) => {
Message.success("删除成功");
setDeleteloading(false);
setDeleteDialogOpen(false);
handleRefresh();
});
}
}
} else {
CloudEController.JobOutFileDel(
deletePath,
fileToken as string,
projectId as string
)?.then((res) => {
Message.success("删除成功");
setDeleteloading(false);
setDeleteDialogOpen(false);
handleRefresh();
});
}
}; };
// 批量移动 // 批量移动
...@@ -569,7 +432,7 @@ const ProjectData = observer(() => { ...@@ -569,7 +432,7 @@ const ProjectData = observer(() => {
// 批量删除 // 批量删除
const handleBatchDelete = () => { const handleBatchDelete = () => {
setCurrentOperateFile(null); setCurrentOperateFile(null);
setDeleteDialogOpen(true); deleteDialogRef.current.showDialog();
}; };
// 前端展示的文件路径 // 前端展示的文件路径
...@@ -692,7 +555,7 @@ const ProjectData = observer(() => { ...@@ -692,7 +555,7 @@ const ProjectData = observer(() => {
aria-label="search" aria-label="search"
size="small" size="small"
style={{ padding: "4px" }} style={{ padding: "4px" }}
onClick={searchFileList} onClick={handleRefresh}
> >
<SearchIcon <SearchIcon
className={style.searchIcon} className={style.searchIcon}
...@@ -746,6 +609,7 @@ const ProjectData = observer(() => { ...@@ -746,6 +609,7 @@ const ProjectData = observer(() => {
load={tableLoadding} load={tableLoadding}
initSelected={selectIds} initSelected={selectIds}
headCells={versionsHeadCells} headCells={versionsHeadCells}
rowsPerPage={"99"}
checkboxData={(e: any) => { checkboxData={(e: any) => {
hanldeCheckbox(e); hanldeCheckbox(e);
}} }}
...@@ -789,41 +653,16 @@ const ProjectData = observer(() => { ...@@ -789,41 +653,16 @@ const ProjectData = observer(() => {
</Button> </Button>
</div> </div>
)} )}
<Dialog <DeleteDialog
open={deleteDialogOpen} onRef={deleteDialogRef}
onClose={handleDeleteDialogClose} path={path}
aria-labelledby="提示" fileToken={fileToken}
aria-describedby="确认要删除吗" projectId={projectId}
> currentOperateFile={currentOperateFile}
<DialogTitle id="alert-dialog-title">{"提示"}</DialogTitle> selectIds={selectIds}
<DialogContent> refresh={handleRefresh}
<DialogContentText id="alert-dialog-description"> showList={showList}
{currentOperateFile ></DeleteDialog>
? "确认删除该数据吗?"
: `确认删除这${selectIds.length}条数据吗?`}
</DialogContentText>
</DialogContent>
<DialogActions>
<Button
onClick={handleDeleteDialogClose}
color="inherit"
variant="contained"
style={{ color: "#1E2633", backgroundColor: "#fff" }}
size="small"
>
取消
</Button>
<LoadingButton
loading={deleteloading}
onClick={handleDelete}
color="primary"
variant="contained"
size="small"
>
确认
</LoadingButton>
</DialogActions>
</Dialog>
<UpLoaderFile <UpLoaderFile
onRef={UpLoaderFileRef} onRef={UpLoaderFileRef}
path={path} path={path}
...@@ -845,7 +684,6 @@ const ProjectData = observer(() => { ...@@ -845,7 +684,6 @@ const ProjectData = observer(() => {
currentOperateFile={currentOperateFile} currentOperateFile={currentOperateFile}
selectIds={selectIds} selectIds={selectIds}
refresh={handleRefresh} refresh={handleRefresh}
activeTab={activeTab}
showList={showList} showList={showList}
></MoveFile> ></MoveFile>
</div> </div>
......
...@@ -212,6 +212,7 @@ const BaseInfo = observer(() => { ...@@ -212,6 +212,7 @@ const BaseInfo = observer(() => {
// 显示删除弹窗 // 显示删除弹窗
const handleClickDelete = () => { const handleClickDelete = () => {
DialogRef.current.handleClickOpen(); DialogRef.current.handleClickOpen();
setDeleteProjectName("");
}; };
const deleteProjectNameChange = (e: any) => { const deleteProjectNameChange = (e: any) => {
......
...@@ -61,7 +61,6 @@ const AddMember = observer((props: IProps) => { ...@@ -61,7 +61,6 @@ const AddMember = observer((props: IProps) => {
const defaultValue = selectOptions.filter( const defaultValue = selectOptions.filter(
(every) => every.value === item (every) => every.value === item
); );
console.log(selectOptions, defaultValue, "111");
return ( return (
<MySelect <MySelect
input={<OutlinedInput />} input={<OutlinedInput />}
...@@ -122,13 +121,16 @@ const AddMember = observer((props: IProps) => { ...@@ -122,13 +121,16 @@ const AddMember = observer((props: IProps) => {
}); });
}, [currentProjectStore?.currentProjectInfo, http, addMemberDialog]); }, [currentProjectStore?.currentProjectInfo, http, addMemberDialog]);
const onClose = () => { const onClose = (event: any = {}, reason: any = "other") => {
// 点击弹窗外不关闭弹窗
if (reason === "backdropClick") {
return;
}
setAddMemberDialog(false); setAddMemberDialog(false);
}; };
const onConfirm = () => { const onConfirm = () => {
const projectInfo = toJS(currentProjectStore?.currentProjectInfo); const projectInfo = toJS(currentProjectStore?.currentProjectInfo);
console.log(tableData, 1111);
const params = tableData.filter((item: any) => { const params = tableData.filter((item: any) => {
return checkData.includes(item?.username); return checkData.includes(item?.username);
}); });
......
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