Commit 83703b74 authored by wuyongsheng's avatar wuyongsheng

Merge branch 'feat-20220530-project' into 'staging'

Feat 20220530 project

See merge request !4
parents cd69671b e26e9f13
...@@ -37,7 +37,6 @@ type addProjectParams = { ...@@ -37,7 +37,6 @@ type addProjectParams = {
}; };
// 新增项目 // 新增项目
const addProject = (params: addProjectParams) => { const addProject = (params: addProjectParams) => {
console.log("params", params);
return request({ return request({
url: Api.API_PROJECT_ADD, url: Api.API_PROJECT_ADD,
method: "post", method: "post",
......
import { Box, List } from "@mui/material"; import { Box, List } from "@mui/material";
// import CurrentProject from "./CurrentProject";
import CurrentProject from "../Project/components/CurrentProject"; import CurrentProject from "../Project/components/CurrentProject";
import React from "react"; import React from "react";
import { Outlet, useNavigate } from "react-router-dom"; import { Outlet, useNavigate } from "react-router-dom";
......
.loadingBox {
width: 100%;
display: flex;
justify-content: center;
align-items: center;
height: 300px;
}
.projectInfoList { .projectInfoList {
background-color: #fff; background-color: #fff;
position: relative; position: relative;
......
...@@ -26,6 +26,7 @@ import LoadingButton from "@mui/lab/LoadingButton"; ...@@ -26,6 +26,7 @@ import LoadingButton from "@mui/lab/LoadingButton";
import { useMessage } from "@/components/MySnackbar"; import { useMessage } from "@/components/MySnackbar";
import Loading from "@/views/Loading"; import Loading from "@/views/Loading";
import MyDialog from "@/components/mui/MyDialog"; import MyDialog from "@/components/mui/MyDialog";
import { getProjectList } from "../../project";
const reg = new RegExp("^[A-Za-z0-9\u4e00-\u9fa5]+$"); const reg = new RegExp("^[A-Za-z0-9\u4e00-\u9fa5]+$");
...@@ -51,9 +52,11 @@ const BaseInfo = observer(() => { ...@@ -51,9 +52,11 @@ const BaseInfo = observer(() => {
run({ run({
id: currentProjectStore.currentProjectInfo.id as string, id: currentProjectStore.currentProjectInfo.id as string,
}); });
}, [currentProjectStore, run]); }, [currentProjectStore.currentProjectInfo.id, run]);
const [zoneIdMap, setZoneIdMap] = useState<Map<string, string>>(new Map()); const [zoneIdMap, setZoneIdMap] = useState<Map<string, string>>(new Map());
const [zoneIdOptions, setZoneIdOptions] = useState<Array<zoneIdOption>>([]); const [zoneIdOptions, setZoneIdOptions] = useState<Array<zoneIdOption>>([]);
// 获取计算区信息
const { run: getZone } = useMyRequest(hpczone, { const { run: getZone } = useMyRequest(hpczone, {
onSuccess: (result: any) => { onSuccess: (result: any) => {
setZoneIdOptions(result); setZoneIdOptions(result);
...@@ -64,9 +67,12 @@ const BaseInfo = observer(() => { ...@@ -64,9 +67,12 @@ const BaseInfo = observer(() => {
setZoneIdMap(zoneMap); setZoneIdMap(zoneMap);
}, },
}); });
useEffect(() => { useEffect(() => {
getZone(); getZone();
}, [getZone]); }, [getZone]);
// 项目信息展示数据转换
const infoList = useMemo(() => { const infoList = useMemo(() => {
return [ return [
{ {
...@@ -109,12 +115,16 @@ const BaseInfo = observer(() => { ...@@ -109,12 +115,16 @@ const BaseInfo = observer(() => {
const { run: updateProjectRun, loading: updateLoading } = useMyRequest( const { run: updateProjectRun, loading: updateLoading } = useMyRequest(
updateProject, updateProject,
{ {
onSuccess: (result: any) => { onSuccess: async (result: any) => {
message.success("修改成功"); message.success("修改成功");
const projectList = await getProjectList();
currentProjectStore.setProjectList(projectList);
currentProjectStore.changeProject(projectInfo);
}, },
} }
); );
// 修改项目
const handleClickUpdate = () => { const handleClickUpdate = () => {
if (projectInfo.name) { if (projectInfo.name) {
if (reg.test(projectInfo.name)) { if (reg.test(projectInfo.name)) {
...@@ -132,14 +142,19 @@ const BaseInfo = observer(() => { ...@@ -132,14 +142,19 @@ const BaseInfo = observer(() => {
const { run: deleteProjectRun, loading: deleteLoading } = useMyRequest( const { run: deleteProjectRun, loading: deleteLoading } = useMyRequest(
deleteProject, deleteProject,
{ {
onSuccess: (result: any) => { onSuccess: async (result: any) => {
message.success("删除成功"); message.success("删除成功");
DialogRef.current.handleClose(); DialogRef.current.handleClose();
const projectList = await getProjectList();
currentProjectStore.setProjectList(projectList);
currentProjectStore.changeProject(projectList[0]);
setProjectInfo(projectList[0]);
}, },
} }
); );
let DialogRef: any = React.createRef(); let DialogRef: any = React.createRef();
// 显示删除弹窗
const handleClickDelete = () => { const handleClickDelete = () => {
DialogRef.current.handleClickOpen(); DialogRef.current.handleClickOpen();
}; };
...@@ -148,7 +163,8 @@ const BaseInfo = observer(() => { ...@@ -148,7 +163,8 @@ const BaseInfo = observer(() => {
setDeleteProjectName(e.target.value); setDeleteProjectName(e.target.value);
}; };
const handleSubmit = () => { // 删除项目
const handleSubmitDelete = () => {
if ( if (
deleteProjectName === toJS(currentProjectStore.currentProjectInfo.name) deleteProjectName === toJS(currentProjectStore.currentProjectInfo.name)
) { ) {
...@@ -158,11 +174,17 @@ const BaseInfo = observer(() => { ...@@ -158,11 +174,17 @@ const BaseInfo = observer(() => {
} }
}; };
// return <Loading></Loading>; if (loading) {
if (currentUserName === projectInfo.owner) { return (
<div className={style.loadingBox}>
<Loading />
</div>
);
} else if (currentUserName !== projectInfo.owner) {
return <InformationDisplay infoList={infoList} />;
} else {
return ( return (
<div className={style.projectInfoList}> <div className={style.projectInfoList}>
{loading && <Loading></Loading>}
<div className={style.projectInfoListLi}> <div className={style.projectInfoListLi}>
<div <div
className={classnames({ className={classnames({
...@@ -238,7 +260,6 @@ const BaseInfo = observer(() => { ...@@ -238,7 +260,6 @@ const BaseInfo = observer(() => {
variant="outlined" variant="outlined"
className={style.updateButton} className={style.updateButton}
onClick={handleClickUpdate} onClick={handleClickUpdate}
// style={{ backgroundColor: "#1370ff", color: "#fff" }}
loading={updateLoading} loading={updateLoading}
> >
保存修改 保存修改
...@@ -263,7 +284,7 @@ const BaseInfo = observer(() => { ...@@ -263,7 +284,7 @@ const BaseInfo = observer(() => {
</Button> </Button>
</div> </div>
<MyDialog <MyDialog
handleSubmit={handleSubmit} handleSubmit={handleSubmitDelete}
onRef={DialogRef} onRef={DialogRef}
title="删除项目" title="删除项目"
submitloading={deleteLoading} submitloading={deleteLoading}
...@@ -294,12 +315,6 @@ const BaseInfo = observer(() => { ...@@ -294,12 +315,6 @@ const BaseInfo = observer(() => {
</MyDialog> </MyDialog>
</div> </div>
); );
} else {
return loading ? (
<Loading></Loading>
) : (
<InformationDisplay infoList={infoList} />
);
} }
}); });
......
...@@ -4,6 +4,9 @@ import MyDialog from "@/components/mui/MyDialog"; ...@@ -4,6 +4,9 @@ import MyDialog from "@/components/mui/MyDialog";
import React, { useState, useEffect, useImperativeHandle } from "react"; import React, { useState, useEffect, useImperativeHandle } from "react";
import useMyRequest from "@/hooks/useMyRequest"; import useMyRequest from "@/hooks/useMyRequest";
import { hpczone, addProject } from "@/api/project_api"; import { hpczone, addProject } from "@/api/project_api";
import { useMessage } from "@/components/MySnackbar";
import { getProjectList } from "../../project";
import { useStores } from "@/store";
const reg = new RegExp("^[A-Za-z0-9\u4e00-\u9fa5]+$"); const reg = new RegExp("^[A-Za-z0-9\u4e00-\u9fa5]+$");
...@@ -13,6 +16,8 @@ type zoneIdOption = { ...@@ -13,6 +16,8 @@ type zoneIdOption = {
}; };
const AddProject = (props: any) => { const AddProject = (props: any) => {
const { currentProjectStore } = useStores();
const message = useMessage();
let DialogRef: any = React.createRef(); let DialogRef: any = React.createRef();
useImperativeHandle(props.onRef, () => { useImperativeHandle(props.onRef, () => {
return { return {
...@@ -22,6 +27,7 @@ const AddProject = (props: any) => { ...@@ -22,6 +27,7 @@ const AddProject = (props: any) => {
const [zoneId, setZoneId] = useState(""); const [zoneId, setZoneId] = useState("");
const [zoneIdOptions, setZoneIdOptions] = useState<Array<zoneIdOption>>([]); const [zoneIdOptions, setZoneIdOptions] = useState<Array<zoneIdOption>>([]);
// 设置计算区
const { run } = useMyRequest(hpczone, { const { run } = useMyRequest(hpczone, {
onSuccess: (result: any) => { onSuccess: (result: any) => {
setZoneIdOptions(result); setZoneIdOptions(result);
...@@ -33,10 +39,13 @@ const AddProject = (props: any) => { ...@@ -33,10 +39,13 @@ const AddProject = (props: any) => {
onBefore: () => { onBefore: () => {
setSubmitloading(true); setSubmitloading(true);
}, },
onSuccess: (result: any) => { onSuccess: async (result: any) => {
if (result.data) { if (result.data) {
setSubmitloading(false); setSubmitloading(false);
DialogRef.current.handleClose(); DialogRef.current.handleClose();
message.success("新建项目成功");
const projectList = await getProjectList();
currentProjectStore.setProjectList(projectList);
} }
}, },
onError: () => { onError: () => {
...@@ -46,7 +55,7 @@ const AddProject = (props: any) => { ...@@ -46,7 +55,7 @@ const AddProject = (props: any) => {
useEffect(() => { useEffect(() => {
run(); run();
}, []); }, [run]);
const handleClickOpen = () => { const handleClickOpen = () => {
DialogRef.current.handleClickOpen(); DialogRef.current.handleClickOpen();
...@@ -62,6 +71,7 @@ const AddProject = (props: any) => { ...@@ -62,6 +71,7 @@ const AddProject = (props: any) => {
error: false, error: false,
help: "", help: "",
}); });
const checkName = (name: string) => { const checkName = (name: string) => {
if (name) { if (name) {
if (name.length > 30) { if (name.length > 30) {
...@@ -87,6 +97,7 @@ const AddProject = (props: any) => { ...@@ -87,6 +97,7 @@ const AddProject = (props: any) => {
}); });
} }
}; };
const handleNameChange = (e: any) => { const handleNameChange = (e: any) => {
const name = e.target.value; const name = e.target.value;
setName(name); setName(name);
...@@ -96,6 +107,7 @@ const AddProject = (props: any) => { ...@@ -96,6 +107,7 @@ const AddProject = (props: any) => {
const handleZoneIdChange = (e: any) => { const handleZoneIdChange = (e: any) => {
setZoneId(e.target.value); setZoneId(e.target.value);
}; };
const handleDescChange = (e: any) => { const handleDescChange = (e: any) => {
const desc = e.target.value; const desc = e.target.value;
setDesc(desc); setDesc(desc);
...@@ -126,6 +138,10 @@ const AddProject = (props: any) => { ...@@ -126,6 +138,10 @@ const AddProject = (props: any) => {
} }
}; };
const handleFromBox = (e: React.SyntheticEvent) => {
e.nativeEvent.stopImmediatePropagation();
};
return ( return (
<MyDialog <MyDialog
handleSubmit={handleSubmit} handleSubmit={handleSubmit}
...@@ -133,7 +149,7 @@ const AddProject = (props: any) => { ...@@ -133,7 +149,7 @@ const AddProject = (props: any) => {
title="新建项目" title="新建项目"
submitloading={submitloading} submitloading={submitloading}
> >
<div className={style.formBox}> <div className={style.formBox} onClick={handleFromBox}>
<TextField <TextField
required required
error={nameCheck.error} error={nameCheck.error}
...@@ -152,6 +168,7 @@ const AddProject = (props: any) => { ...@@ -152,6 +168,7 @@ const AddProject = (props: any) => {
value={zoneId} value={zoneId}
onChange={handleZoneIdChange} onChange={handleZoneIdChange}
variant="outlined" variant="outlined"
onClick={handleFromBox}
> >
{zoneIdOptions && {zoneIdOptions &&
zoneIdOptions.map((option) => ( zoneIdOptions.map((option) => (
......
...@@ -4,14 +4,25 @@ import ArrowForwardIosIcon from "@mui/icons-material/ArrowForwardIos"; ...@@ -4,14 +4,25 @@ import ArrowForwardIosIcon from "@mui/icons-material/ArrowForwardIos";
import { Popper, Fade } from "@mui/material"; import { Popper, Fade } from "@mui/material";
import { useStores } from "@/store/index"; import { useStores } from "@/store/index";
import ProjectListPopper from "../ProjectListPopper"; import ProjectListPopper from "../ProjectListPopper";
import { useState } from "react"; import React, { useEffect, useState } from "react";
import { observer } from "mobx-react-lite"; import { observer } from "mobx-react-lite";
import AddProject from "../AddProject";
const CurrentProject = observer(() => { const CurrentProject = observer(() => {
const { currentProjectStore } = useStores(); const { currentProjectStore } = useStores();
let addProjectRef: any = React.createRef();
const [open, setOpen] = useState(false); const [open, setOpen] = useState(false);
const [anchorEl, setAnchorEl] = useState<null | HTMLElement>(null); const [anchorEl, setAnchorEl] = useState<null | HTMLElement>(null);
// 结合handleShowProjectList中的event.nativeEvent.stopImmediatePropagation();实现点击空白区域隐藏项目列表
useEffect(()=>{
document.addEventListener('click', (e) => {
setOpen(false)
})
}, [])
const handleShowProjectList = (event: React.MouseEvent<HTMLElement>) => { const handleShowProjectList = (event: React.MouseEvent<HTMLElement>) => {
event.nativeEvent.stopImmediatePropagation();
setAnchorEl(event.currentTarget); setAnchorEl(event.currentTarget);
setOpen((previousOpen) => !previousOpen); setOpen((previousOpen) => !previousOpen);
}; };
...@@ -22,6 +33,11 @@ const CurrentProject = observer(() => { ...@@ -22,6 +33,11 @@ const CurrentProject = observer(() => {
setOpen(!open); setOpen(!open);
}; };
const openAddProject = () => {
addProjectRef.current.handleClickOpen()
setOpen(false)
}
return ( return (
<div> <div>
<div <div
...@@ -43,6 +59,7 @@ const CurrentProject = observer(() => { ...@@ -43,6 +59,7 @@ const CurrentProject = observer(() => {
style={{ fontSize: 12 }} style={{ fontSize: 12 }}
/> />
</div> </div>
<AddProject onRef={addProjectRef} />
<Popper <Popper
id={id} id={id}
open={open} open={open}
...@@ -55,6 +72,7 @@ const CurrentProject = observer(() => { ...@@ -55,6 +72,7 @@ const CurrentProject = observer(() => {
<Fade {...TransitionProps} timeout={350}> <Fade {...TransitionProps} timeout={350}>
<div> <div>
<ProjectListPopper <ProjectListPopper
handleClickOpen={openAddProject}
handleChangeCurrentProject={handleChangeCurrentProject} handleChangeCurrentProject={handleChangeCurrentProject}
/> />
</div> </div>
......
...@@ -4,19 +4,14 @@ import { InputBase, IconButton } from "@mui/material"; ...@@ -4,19 +4,14 @@ import { InputBase, IconButton } from "@mui/material";
import SearchIcon from "@mui/icons-material/Search"; import SearchIcon from "@mui/icons-material/Search";
import AddIcon from "@mui/icons-material/Add"; import AddIcon from "@mui/icons-material/Add";
import { useStores } from "@/store/index"; import { useStores } from "@/store/index";
import AddProject from "@/views/Project/components/AddProject";
import moment from "moment"; import moment from "moment";
import React, { useMemo, useState } from "react"; import React, { useMemo, useState } from "react";
import { toJS } from "mobx"; import { toJS } from "mobx";
import { observer } from "mobx-react-lite"; import { observer } from "mobx-react-lite";
const ProjectListPopper = observer((props: any) => { const ProjectListPopper = observer((props: any) => {
const { handleChangeCurrentProject } = props; const { handleChangeCurrentProject, handleClickOpen } = props;
let addProjectRef: any = React.createRef();
const { currentProjectStore } = useStores(); const { currentProjectStore } = useStores();
const handleClickOpen = () => {
addProjectRef.current.handleClickOpen();
};
const [name, setName] = useState(""); const [name, setName] = useState("");
const nameChange = (e: any) => { const nameChange = (e: any) => {
setName(e.target.value); setName(e.target.value);
...@@ -28,8 +23,12 @@ const ProjectListPopper = observer((props: any) => { ...@@ -28,8 +23,12 @@ const ProjectListPopper = observer((props: any) => {
}); });
}, [currentProjectStore.projectList, name]); }, [currentProjectStore.projectList, name]);
const handleProjectBox = (e: React.SyntheticEvent) => {
e.nativeEvent.stopImmediatePropagation();
}
return ( return (
<div className={style.projectBox}> <div className={style.projectBox} onClick={handleProjectBox}>
<div className={style.searchBox}> <div className={style.searchBox}>
<IconButton <IconButton
type="submit" type="submit"
...@@ -53,7 +52,6 @@ const ProjectListPopper = observer((props: any) => { ...@@ -53,7 +52,6 @@ const ProjectListPopper = observer((props: any) => {
> >
<AddIcon className={style.addIcon} /> <AddIcon className={style.addIcon} />
</IconButton> </IconButton>
<AddProject onRef={addProjectRef} />
</div> </div>
<div className={style.projectlist}> <div className={style.projectlist}>
{list.map((item: any) => { {list.map((item: any) => {
......
import { product } from "@/api/project_api"
export const getProjectList = async () => {
const res = await product({product: "CADD",})
return res.data
}
\ No newline at end of file
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