Commit 0a94454b authored by jiangzijing's avatar jiangzijing

Merge branch 'feat-20220718' into 'release'

Feat 20220718

See merge request !34
parents dcce10a3 45c5f606
......@@ -86,8 +86,8 @@ const theme = createTheme({
boxShadow: "none !important",
color: "rgba(30, 38, 51, 1)",
"&:hover": {
// backgroundColor: "#FFEDED ",
// border: "1px solid rgba(30, 38, 51, 1)",
backgroundColor: "rgba(240, 242, 245, 1) ",
border: "1px solid rgba(221, 225, 230, 1)",
},
},
textSecondary: {
......
......@@ -97,14 +97,12 @@ const ConsoleLayout = observer(() => {
dropValue={productOpen}
drop={true}
/>
{/* <ArrowDropDownIcon classes={{
root: cx({
[style.ArrowDropDownIconRoot]: true,
[style.ArrowDropDownIconRootOpen]: Boolean(productOpen)
})
}} /> */}
<Menu
id="product-menu"
anchorEl={productAnchorEl}
......
......@@ -38,6 +38,7 @@
.taskName {
font-size: 14px;
font-weight: 500;
cursor: pointer;
}
.taskStatus {
......
......@@ -13,6 +13,7 @@ import fileIcon from "@/assets/project/fileIcon.svg";
import dataSetIcon from "@/assets/project/dataSetIcon.svg";
type TaskCardProps = {
id: string;
name: string;
creator: string;
state: string;
......@@ -24,7 +25,7 @@ type TaskCardProps = {
};
const TaskCard = (props: TaskCardProps) => {
const { name, creator, state, completeNum, totalNum, costTime, jobCost, outputs } = props;
const { id, name, creator, state, completeNum, totalNum, costTime, jobCost, outputs } = props;
const navigate = useNavigate();
const randerOutputs = useMemo(() => {
if (outputs) {
......@@ -62,6 +63,12 @@ const TaskCard = (props: TaskCardProps) => {
});
}
}
// 跳转详情页
const gotoDetail = (id: string) => {
navigate(`/product/cadd/projectJobDetail`, {
state: { taskId: id },
});
}
// 渲染状态图标
const renderStatusIcon = (data: string) => {
switch (data) {
......@@ -140,7 +147,7 @@ const TaskCard = (props: TaskCardProps) => {
return <div className={style.cardBox}>
<div className={style.cardLeft}>
<div className={style.topLine}>
<div className={style.taskName}>{name}</div>
<div className={style.taskName} onClick={() => gotoDetail(id)}>{name}</div>
<div className={style.taskStatus} style={{ color: renderTextColor(state), background: renderBackgroundColor(state) }}>
<img src={renderStatusIcon(state)} alt="" className={style.statusImg} />
<span>{renderStatusText(state)}</span>
......@@ -152,7 +159,7 @@ const TaskCard = (props: TaskCardProps) => {
<div>Progress</div>
<div style={{ color: renderTextColor(state) }}>{completeNum + "/" + totalNum}</div>
</div>
<MyProgress color={renderProgressColor(state)} value={(completeNum / totalNum) * 100}/>
<MyProgress color={renderProgressColor(state)} value={(completeNum / totalNum) * 100} />
</div>
<div className={style.bottomLine}>
<img alt="" src={runTime} />
......
......@@ -38,6 +38,10 @@
color: #565C66;
}
.otherInformationBoxRight{
color: #565C66;
}
.numberDisplay {
font-size: 20px;
font-weight: 600;
......@@ -48,7 +52,7 @@
.verticalLine {
height: 32px;
border: 1px solid #EBEDF0;
margin-left: 10px;
margin-left: 20px;
margin-right: 20px;
}
......
......@@ -44,19 +44,23 @@ const ProjectOverview = observer(() => {
},
});
useEffect(() => {
getOverview({
id: currentProjectStore.currentProjectInfo.id as string,
});
if (currentProjectStore.currentProjectInfo.id) {
getOverview({
id: currentProjectStore.currentProjectInfo.id as string,
});
}
}, [currentProjectStore.currentProjectInfo.id, getOverview]);
useEffect(() => {
getTaskOverviewList({
projectId: currentProjectStore.currentProjectInfo.id as string,
jobName: jobName,
day: Number(day),
page: page,
size: size,
});
if (currentProjectStore.currentProjectInfo.id) {
getTaskOverviewList({
projectId: currentProjectStore.currentProjectInfo.id as string,
jobName: jobName,
day: Number(day),
page: page,
size: size,
});
}
}, [currentProjectStore.currentProjectInfo.id, getTaskOverviewList, day, jobName]);
const handleKeyWordChangeKeyUp = (e: any) => {
......@@ -64,6 +68,21 @@ const ProjectOverview = observer(() => {
setJobName(e.target.value);
}
}
const storageUnitFromB = (b: number) => {
if (b <= 0) {
return { data: '0.00', unit: 'KB' };
} else if (b < 1024 * 1024) {
return { data: (b / 1024).toFixed(2), unit: 'KB' };
} else if (b < 1024 * 1024 * 1024) {
return { data: (b / (1024 * 1024)).toFixed(2), unit: 'MB' };
} else if (b < 1024 * 1024 * 1024 * 1024) {
return { data: (b / (1024 * 1024 * 1024)).toFixed(2), unit: 'G' };
} else {
return { data: (b / (1024 * 1024 * 1024 * 1024)).toFixed(2), unit: 'T' };
}
};
if (currentProjectStore.currentProjectInfo.name) {
if (loading) {
return (
......@@ -90,18 +109,21 @@ const ProjectOverview = observer(() => {
</div>
<div className={style.basicInformationRight}>
<div>
<div className={style.otherInformationBox}>项目总消费</div>
<div className={style.otherInformationBoxRight}>项目总消费</div>
<div><span className={style.numberDisplay}>{overviewInfo.projectCost?.toFixed(2)}</span></div>
</div>
<div className={style.verticalLine}></div>
<div>
<div className={style.otherInformationBox}>项目剩余预算</div>
<div className={style.otherInformationBoxRight}>项目剩余预算</div>
<div><span className={style.numberDisplay}>{overviewInfo.projectRemainingBudget?.toFixed(2)}</span></div>
</div>
<div className={style.verticalLine}></div>
<div>
<div className={style.otherInformationBox}>项目存储大小</div>
<div><span className={style.numberDisplay}>{overviewInfo.projectStorage?.toFixed(2)}</span> G</div>
<div className={style.otherInformationBoxRight} style={{ marginRight: '20px' }}>项目存储大小</div>
<div>
<span className={style.numberDisplay}>{overviewInfo.projectStorage !== undefined ? storageUnitFromB(overviewInfo.projectStorage).data : ''}</span>
{overviewInfo.projectStorage !== undefined ? storageUnitFromB(overviewInfo.projectStorage).unit : ''}
</div>
</div>
</div>
</div>
......@@ -134,6 +156,7 @@ const ProjectOverview = observer(() => {
{/* 任务列表卡片渲染 */}
{taskList.length > 0 && taskList.map((item: any) => {
return <TaskCard
id={item.id}
name={item.name}
creator={item.creator}
state={item.state}
......
......@@ -23,7 +23,7 @@ import InformationDisplay from "@/components/CommonComponents/InformationDisplay
import classnames from "classnames";
import { TextField } from "@mui/material";
import LoadingButton from "@mui/lab/LoadingButton";
import InputAdornment from '@mui/material/InputAdornment';
import InputAdornment from "@mui/material/InputAdornment";
import { useMessage } from "@/components/MySnackbar";
import Loading from "@/views/Loading";
import MyDialog from "@/components/mui/MyDialog";
......@@ -59,6 +59,13 @@ const BaseInfo = observer(() => {
).name;
// 弹窗显示控制
const [dialogOpen, setDialogOpen] = useState(false);
// 打开弹窗时重置表单
useEffect(() => {
if (dialogOpen) {
setDeleteProjectName("");
}
}, [dialogOpen]);
// 是否拥有编辑权限
const hasEditAuth = useMemo(() => {
if (!currentUserName) {
......@@ -75,7 +82,10 @@ const BaseInfo = observer(() => {
}, [currentUserName, projectInfo]);
const { run, loading } = useMyRequest(getProject, {
onSuccess: (result: any) => {
setProjectInfo({ ...result.data, projectBudget: result.data.projectBudget.toFixed(2) });
setProjectInfo({
...result.data,
projectBudget: result.data.projectBudget.toFixed(2),
});
},
});
useEffect(() => {
......@@ -184,43 +194,50 @@ const BaseInfo = observer(() => {
});
};
const budgetChange = (e: any) => {
let inputValue = e.target.value.replace('.', '')
if (inputValue.indexOf('.') !== -1) {
setBudgetCheck({
error: true,
help: "格式错误,请输入正确的金额,可精确至分(两位小数)",
});
return
}
if (isNaN(Number(inputValue))) {
setBudgetCheck({
error: true,
help: "格式错误,请输入正确的金额,可精确至分(两位小数)",
});
return
const checkBudget = (budget: string, showMessage = false) => {
let help = "";
if (budget) {
if (isNaN(Number(budget)) || Number(budget) > 10000000 || Number(budget) < 0) {
help = "格式错误,请输入0~10000000之间的数值,结果最高保留两位小数。";
setBudgetCheck({
error: true,
help,
});
showMessage && message.error(help);
return false;
} else {
setBudgetCheck({
error: false,
help: "",
});
return true;
}
} else {
setProjectInfo({
...projectInfo,
projectBudget: e.target.value
})
help = "格式错误,请输入0~10000000之间的数值,结果最高保留两位小数。";
setBudgetCheck({
error: false,
help: "",
error: true,
help,
});
showMessage && message.error(help);
return false;
}
}
const budgetBlur = (e: any) => {
const budgetChange = (e: any) => {
setProjectInfo({
...projectInfo,
projectBudget: Number(e.target.value).toFixed(2)
})
setBudgetCheck({
error: false,
help: "",
projectBudget: e.target.value,
});
checkBudget(e.target.value);
}
const budgetBlur = (e: any) => {
setProjectInfo({
...projectInfo,
projectBudget: Number(e.target.value) ? Number(e.target.value).toFixed(2) : e.target.value,
});
};
const { run: updateProjectRun, loading: updateLoading } = useMyRequest(
updateProject,
{
......@@ -235,7 +252,7 @@ const BaseInfo = observer(() => {
// 修改项目
const handleClickUpdate = () => {
if (checkName(projectInfo.name, true)) {
if (checkName(projectInfo.name, true) && checkBudget(projectInfo.projectBudget, true)) {
updateProjectRun({ ...projectInfo, product: "cadd" });
} else {
return;
......@@ -312,9 +329,9 @@ const BaseInfo = observer(() => {
size="small"
sx={{
width: "560px",
'& .MuiOutlinedInput-root': {
height: '36px'
}
"& .MuiOutlinedInput-root": {
height: "36px",
},
}}
/>
{/* <input
......@@ -390,12 +407,14 @@ const BaseInfo = observer(() => {
size="small"
sx={{
width: "560px",
'& .MuiOutlinedInput-root': {
height: '36px'
}
"& .MuiOutlinedInput-root": {
height: "36px",
},
}}
InputProps={{
startAdornment: <InputAdornment position="start">¥</InputAdornment>,
startAdornment: (
<InputAdornment position="start">¥</InputAdornment>
),
}}
/>
</div>
......@@ -426,10 +445,10 @@ const BaseInfo = observer(() => {
删除项目将删除其存储的数据和所有相关资源,并且已删除的项目无法恢复!请谨慎操作!
</div>
<MyButton
text='删除项目'
text="删除项目"
variant="contained"
onClick={() => setDialogOpen(true)}
color='error'
color="error"
// style={{
// backgroundColor: "#fff",
// color: "#FF4E4E",
......
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