Commit e3389589 authored by chenshouchao's avatar chenshouchao

feat: 参数设置表单校验

parent ed3d6226
...@@ -28,6 +28,7 @@ interface ITabList { ...@@ -28,6 +28,7 @@ interface ITabList {
interface IProps { interface IProps {
tabList: ITabList[]; tabList: ITabList[];
defaultValue?: string; defaultValue?: string;
tabPanelSx?: any;
allowNullValue?: boolean; // 是否允许空值 allowNullValue?: boolean; // 是否允许空值
} }
...@@ -36,37 +37,46 @@ const theme = createTheme({ ...@@ -36,37 +37,46 @@ const theme = createTheme({
MuiTab: { MuiTab: {
styleOverrides: { styleOverrides: {
root: { root: {
paddingLeft: 0, paddingLeft: 0,
paddingRight: 0, paddingRight: 0,
paddingTop: '8px', paddingTop: "8px",
paddingBottom: '8px', paddingBottom: "8px",
minWidth: '20px', minWidth: "20px",
marginRight: '32px', marginRight: "32px",
color: '#8A9099', color: "#8A9099",
selected: { selected: {
color: '#1976d2' color: "#1976d2",
}, },
"&.Mui-disabled": { "&.Mui-disabled": {
color: '#C2C6CC', color: "#C2C6CC",
}, },
}, },
}, },
}, },
// #C2C6CC // #C2C6CC
MuiTabs:{ MuiTabs: {
styleOverrides: { styleOverrides: {
indicator: { indicator: {
backgroundColor: '#1370FF', backgroundColor: "#1370FF",
} },
} },
}, },
}, },
}); });
const Tabs = (props: IProps) => { const Tabs = (props: IProps) => {
const { tabList, defaultValue, allowNullValue = false } = props; const {
tabList,
defaultValue,
allowNullValue = false,
tabPanelSx = { padding: "20px 0 0 0" },
} = props;
const [value, setValue] = useState( const [value, setValue] = useState(
defaultValue ? defaultValue : allowNullValue ? '' : tabList.filter((e) => !e.hide)[0].value defaultValue
? defaultValue
: allowNullValue
? ""
: tabList.filter((e) => !e.hide)[0].value
); );
const onChange = (val: string) => { const onChange = (val: string) => {
...@@ -94,42 +104,38 @@ const Tabs = (props: IProps) => { ...@@ -94,42 +104,38 @@ const Tabs = (props: IProps) => {
return ( return (
<ThemeProvider theme={theme}> <ThemeProvider theme={theme}>
<TabContext value={value}> <TabContext value={value}>
<Box sx={{ borderBottom: 1, borderColor: "#F0F2F5" }}> <Box sx={{ borderBottom: 1, borderColor: "#F0F2F5" }}>
<TabList <TabList
onChange={(e: any, val: string) => { onChange={(e: any, val: string) => {
onChange(val); onChange(val);
}} }}
> >
{tabList {tabList
?.filter((item) => !item.hide) ?.filter((item) => !item.hide)
.map((item, key) => { .map((item, key) => {
return ( return (
<Tab <Tab
key={key} key={key}
label={labelRender(item, key)} label={labelRender(item, key)}
value={item.value} value={item.value}
id={item.value} id={item.value}
disabled={item.disabled} disabled={item.disabled}
/> />
); );
})} })}
</TabList> </TabList>
</Box> </Box>
{tabList {tabList
?.filter((item) => !item.hide) ?.filter((item) => !item.hide)
.map((item) => { .map((item) => {
return ( return (
<TabPanel <TabPanel sx={tabPanelSx} value={item.value} key={item.value}>
sx={{ padding: "20px 0 0 0" }} {item.component}
value={item.value} </TabPanel>
key={item.value} );
> })}
{item.component} </TabContext>
</TabPanel>
);
})}
</TabContext>
</ThemeProvider> </ThemeProvider>
); );
}; };
......
...@@ -19,7 +19,7 @@ import fileSelectIcon from "@/assets/project/fileSelect.svg"; ...@@ -19,7 +19,7 @@ import fileSelectIcon from "@/assets/project/fileSelect.svg";
import MySwitch from "@/components/mui/MySwitch"; import MySwitch from "@/components/mui/MySwitch";
import Tabs from "@/components/mui/Tabs"; import Tabs from "@/components/mui/Tabs";
import classNames from "classnames"; import classNames from "classnames";
import { Hidden } from "@mui/material"; import { getCustomTemplateParameterCheckResult } from "../../util";
type IParameterSettingProps = { type IParameterSettingProps = {
templateConfigInfo: ITask[]; templateConfigInfo: ITask[];
...@@ -43,11 +43,11 @@ const templateConfigInfoMock = [ ...@@ -43,11 +43,11 @@ const templateConfigInfoMock = [
parameters: [ parameters: [
{ {
hidden: true, hidden: true,
id: "", id: "1",
name: "smi_in", name: "smi_in",
required: true, required: true,
defaultValue: '', defaultValue: "",
domType: "select", domType: "input",
classType: "STRING", classType: "STRING",
classTypeName: "String", classTypeName: "String",
value: "", value: "",
...@@ -69,10 +69,10 @@ const templateConfigInfoMock = [ ...@@ -69,10 +69,10 @@ const templateConfigInfoMock = [
}, },
{ {
hidden: true, hidden: true,
id: "", id: "2",
name: "out", name: "out",
required: true, required: true,
defaultValue: '', defaultValue: "",
domType: "select", domType: "select",
classType: "STRING", classType: "STRING",
classTypeName: "String", classTypeName: "String",
...@@ -95,10 +95,10 @@ const templateConfigInfoMock = [ ...@@ -95,10 +95,10 @@ const templateConfigInfoMock = [
}, },
{ {
hidden: true, hidden: true,
id: "999", id: "3",
name: "basis999", name: "basis999",
required: true, required: true,
defaultValue: '', defaultValue: "",
domType: "select", domType: "select",
classType: "STRING", classType: "STRING",
classTypeName: "String", classTypeName: "String",
...@@ -121,10 +121,10 @@ const templateConfigInfoMock = [ ...@@ -121,10 +121,10 @@ const templateConfigInfoMock = [
}, },
{ {
hidden: true, hidden: true,
id: "", id: "4",
name: "basis", name: "basis",
required: true, required: true,
defaultValue: '', defaultValue: "",
domType: "select", domType: "select",
classType: "STRING", classType: "STRING",
classTypeName: "String", classTypeName: "String",
...@@ -147,10 +147,10 @@ const templateConfigInfoMock = [ ...@@ -147,10 +147,10 @@ const templateConfigInfoMock = [
}, },
{ {
hidden: true, hidden: true,
id: "", id: "5",
name: "senior", name: "senior",
required: true, required: true,
defaultValue: '', defaultValue: "",
domType: "select", domType: "select",
classType: "STRING", classType: "STRING",
classTypeName: "String", classTypeName: "String",
...@@ -173,10 +173,10 @@ const templateConfigInfoMock = [ ...@@ -173,10 +173,10 @@ const templateConfigInfoMock = [
}, },
{ {
hidden: true, hidden: true,
id: "", id: "6",
name: "hardware", name: "hardware",
required: true, required: true,
defaultValue: '', defaultValue: "",
domType: "select", domType: "select",
classType: "STRING", classType: "STRING",
classTypeName: "String", classTypeName: "String",
...@@ -207,7 +207,9 @@ const taskId = "id"; ...@@ -207,7 +207,9 @@ const taskId = "id";
const ParameterSetting = (props: IParameterSettingProps) => { const ParameterSetting = (props: IParameterSettingProps) => {
// const { templateConfigInfo, taskId } = props; // const { templateConfigInfo, taskId } = props;
const [templateConfigInfo, setTemplateConfigInfo] = useState<ITask[]>(templateConfigInfoMock as ITask[]) const [templateConfigInfo, setTemplateConfigInfo] = useState<ITask[]>(
templateConfigInfoMock as ITask[]
);
const [descHeight, setDescHeight] = useState(0); const [descHeight, setDescHeight] = useState(0);
const [isShowAllDese, setIsShowAllDese] = useState(false); const [isShowAllDese, setIsShowAllDese] = useState(false);
...@@ -242,158 +244,161 @@ const ParameterSetting = (props: IParameterSettingProps) => { ...@@ -242,158 +244,161 @@ const ParameterSetting = (props: IParameterSettingProps) => {
}, [templateConfigInfo, taskId]); }, [templateConfigInfo, taskId]);
// 设置parameter.hidden字段 // 设置parameter.hidden字段
const handleHiddenChange = useCallback((e: any, parameterId: string) => { const handleHiddenChange = useCallback(
const result: ITask[] = _.cloneDeep(templateConfigInfo); (e: any, parameterId: string) => {
const taskIndex = result.findIndex((item) => { const result: ITask[] = _.cloneDeep(templateConfigInfo);
return item.id === taskId const taskIndex = result.findIndex((item) => {
}) return item.id === taskId;
if (taskIndex !== -1) { });
result[taskIndex].parameters.forEach((parameter) => { if (taskIndex !== -1) {
if (parameter.id === parameterId) { result[taskIndex].parameters.forEach((parameter) => {
parameter.hidden = e.target.checked if (parameter.id === parameterId) {
} console.log(e.target.checked);
}) parameter.hidden = !e.target.checked;
} }
setTemplateConfigInfo(result) });
}, [templateConfigInfo, setTemplateConfigInfo]) }
setTemplateConfigInfo(result);
},
[templateConfigInfo, setTemplateConfigInfo]
);
const renderInput = useCallback((parameter: IParameter) => { const renderInput = useCallback((parameter: IParameter) => {
return ( return (
<Tooltip title={parameter.description} placement="top"> <Tooltip title={parameter.description} placement="top">
<div> <div>
{parameter.domType.toLowerCase() === "file" && ( {parameter.domType.toLowerCase() === "file" && (
<MyInput <MyInput
value={parameter.defaultValue || ""} value={parameter.defaultValue || ""}
InputProps={{ InputProps={{
endAdornment: ( endAdornment: (
<img <img
onClick={() => handleOpenFileSelect(taskId, parameter.name)} onClick={() => handleOpenFileSelect(taskId, parameter.name)}
src={fileSelectIcon} src={fileSelectIcon}
alt="" alt=""
className={styles.fileSelectImg} className={styles.fileSelectImg}
/> />
), ),
}} }}
placeholder="请选择" placeholder="请选择"
error={parameter.error || false} error={parameter.error || false}
helperText={parameter.helperText} helperText={parameter.helperText}
disabled={parameter.parameterGroup === 'out'} disabled={parameter.parameterGroup === "out"}
></MyInput> ></MyInput>
)} )}
{parameter.domType.toLowerCase() === "path" && ( {parameter.domType.toLowerCase() === "path" && (
<MyInput <MyInput
value={parameter.defaultValue || ""} value={parameter.defaultValue || ""}
InputProps={{ InputProps={{
endAdornment: ( endAdornment: (
<img <img
onClick={() => handleOpenFileSelect(taskId, parameter.name)} onClick={() => handleOpenFileSelect(taskId, parameter.name)}
src={fileSelectIcon} src={fileSelectIcon}
alt="" alt=""
className={styles.fileSelectImg} className={styles.fileSelectImg}
/> />
), ),
}} }}
placeholder="请选择" placeholder="请选择"
error={parameter.error || false} error={parameter.error || false}
helperText={parameter.helperText} helperText={parameter.helperText}
disabled={parameter.parameterGroup === 'out'} disabled={parameter.parameterGroup === "out"}
></MyInput> ></MyInput>
)} )}
{parameter.domType.toLowerCase() === "dataset" && ( {parameter.domType.toLowerCase() === "dataset" && (
<MyInput <MyInput
value={parameter.defaultValue || ""} value={parameter.defaultValue || ""}
InputProps={{ InputProps={{
endAdornment: ( endAdornment: (
<img <img
onClick={() => handleOpenFileSelect(taskId, parameter.name)} onClick={() => handleOpenFileSelect(taskId, parameter.name)}
src={fileSelectIcon} src={fileSelectIcon}
alt="" alt=""
className={styles.fileSelectImg} className={styles.fileSelectImg}
/> />
), ),
}} }}
placeholder="请选择" placeholder="请选择"
error={parameter.error || false} error={parameter.error || false}
helperText={parameter.helperText} helperText={parameter.helperText}
disabled={parameter.parameterGroup === 'out'} disabled={parameter.parameterGroup === "out"}
></MyInput> ></MyInput>
)} )}
{parameter.domType.toLowerCase() === "input" && ( {parameter.domType.toLowerCase() === "input" && (
<MyInput <MyInput
value={parameter.defaultValue || ""} value={parameter.defaultValue || ""}
onChange={(e: any) => onChange={(e: any) =>
handleParameterChange(e, taskId, parameter.name || "") handleParameterChange(e, parameter.id || "")
} }
placeholder="请输入" placeholder="请输入"
error={parameter.error || false} error={parameter.error || false}
helperText={parameter.helperText} helperText={parameter.helperText}
disabled={parameter.parameterGroup === 'out'} disabled={parameter.parameterGroup === "out"}
></MyInput> ></MyInput>
)} )}
{parameter.domType.toLowerCase() === "select" && ( {parameter.domType.toLowerCase() === "select" && (
<MySelect <MySelect
value={parameter.defaultValue} value={parameter.defaultValue}
onChange={(e: any) => onChange={(e: any) =>
handleParameterChange(e, taskId, parameter.name || "") handleParameterChange(e, parameter.id || "")
} }
error={parameter.error || false} error={parameter.error || false}
helpertext={parameter.helperText} helpertext={parameter.helperText}
options={optionsTransform(parameter?.choices || [], "label")} options={optionsTransform(parameter?.choices || [], "label")}
disabled={parameter.parameterGroup === 'out'} disabled={parameter.parameterGroup === "out"}
></MySelect> ></MySelect>
)} )}
{parameter.domType.toLowerCase() === "multipleselect" && ( {parameter.domType.toLowerCase() === "multipleselect" && (
<MySelect <MySelect
value={parameter.defaultValue} value={parameter.defaultValue}
onChange={(e: any) => onChange={(e: any) =>
handleParameterChange(e, taskId, parameter.name || "") handleParameterChange(e, parameter.id || "")
} }
multiple={true} multiple={true}
error={parameter.error || false} error={parameter.error || false}
helpertext={parameter.helperText} helpertext={parameter.helperText}
options={optionsTransform(parameter.choices, "label")} options={optionsTransform(parameter.choices, "label")}
disabled={parameter.parameterGroup === 'out'} disabled={parameter.parameterGroup === "out"}
></MySelect> ></MySelect>
)} )}
{parameter.domType.toLowerCase() === "radio" && ( {parameter.domType.toLowerCase() === "radio" && (
<MyRadio <MyRadio
value={parameter.defaultValue} value={parameter.defaultValue}
onChange={(e: any) => onChange={(e: any) =>
handleParameterChange(e, taskId, parameter.name || "") handleParameterChange(e, parameter.id || "")
} }
options={optionsTransform(parameter.choices, "label")} options={optionsTransform(parameter.choices, "label")}
error={parameter.error || false} error={parameter.error || false}
helperText={parameter.helperText} helperText={parameter.helperText}
></MyRadio> ></MyRadio>
)} )}
{parameter.domType.toLowerCase() === "checkbox" && ( {parameter.domType.toLowerCase() === "checkbox" && (
<MyCheckBox <MyCheckBox
value={parameter.defaultValue} value={parameter.defaultValue}
onChange={(e: any) => onChange={(e: any) =>
handleParameterChange( handleParameterChange(
{ {
target: { target: {
value: e, value: e,
},
}, },
}, parameter.id || ""
taskId, )
parameter.name || "" }
) options={optionsTransform(parameter.choices, "label")}
} error={parameter.error || false}
options={optionsTransform(parameter.choices, "label")} helperText={parameter.helperText}
error={parameter.error || false} ></MyCheckBox>
helperText={parameter.helperText} )}
></MyCheckBox> {/* {parameter.description && (
)}
{/* {parameter.description && (
<Tooltip title={parameter.description} placement="top"> <Tooltip title={parameter.description} placement="top">
<img className={styles.parameterDesc} src={questionMark} alt="" /> <img className={styles.parameterDesc} src={questionMark} alt="" />
</Tooltip> </Tooltip>
)} */} )} */}
</div> </div>
</Tooltip> </Tooltip>
); );
},[]); }, []);
// 输入参数 // 输入参数
const inParameters: Array<IParameter> = useMemo(() => { const inParameters: Array<IParameter> = useMemo(() => {
...@@ -405,7 +410,6 @@ const ParameterSetting = (props: IParameterSettingProps) => { ...@@ -405,7 +410,6 @@ const ParameterSetting = (props: IParameterSettingProps) => {
); );
} }
}, [taskInfo]); }, [taskInfo]);
console.log(inParameters);
// 输出参数 // 输出参数
const outParameters: Array<IParameter> = useMemo(() => { const outParameters: Array<IParameter> = useMemo(() => {
...@@ -451,40 +455,48 @@ const ParameterSetting = (props: IParameterSettingProps) => { ...@@ -451,40 +455,48 @@ const ParameterSetting = (props: IParameterSettingProps) => {
} }
}, [taskInfo]); }, [taskInfo]);
const randerParameters = useCallback((parameters: Array<IParameter>)=>{ const randerParameters = useCallback(
return ( (parameters: Array<IParameter>) => {
<div className={styles.parameters}> return (
{parameters.map((parameter, parameterIndex) => { <div className={styles.parameters}>
return ( {parameters.map((parameter, parameterIndex) => {
<div return (
className={styles.parameter} <div
key={parameter.id || "" + parameterIndex} className={styles.parameter}
> key={parameter.id || "" + parameterIndex}
<div className={styles.parameterTop}> >
<div className={styles.parameterLeft}> <div className={styles.parameterTop}>
<div <div className={styles.parameterLeft}>
className={classNames({ <div
[styles.parameterName]: true, className={classNames({
[styles.required]: parameter.required, [styles.parameterName]: true,
})} [styles.required]: parameter.required,
> })}
{parameter.name} >
</div> {parameter.name}
<div className={styles.parameterClassTypeName}> </div>
{parameter.classTypeName} <div className={styles.parameterClassTypeName}>
{parameter.classTypeName}
</div>
</div> </div>
<MySwitch
value={!parameter.hidden}
onChange={(e: any) =>
handleHiddenChange(e, parameter.id || "")
}
></MySwitch>
</div>
<div className={styles.parameterContent}>
{renderInput(parameter)}
</div> </div>
<MySwitch value={parameter.hidden} onChange={(e: any) => handleHiddenChange(e, parameter.id || '')}></MySwitch>
</div>
<div className={styles.parameterContent}>
{renderInput(parameter)}
</div> </div>
</div> );
); })}
})} </div>
</div> );
) },
},[renderInput]) [renderInput, handleHiddenChange]
);
const handleOpenFileSelect = ( const handleOpenFileSelect = (
taskId: string = "", taskId: string = "",
...@@ -497,53 +509,80 @@ const ParameterSetting = (props: IParameterSettingProps) => { ...@@ -497,53 +509,80 @@ const ParameterSetting = (props: IParameterSettingProps) => {
setFileSelectOpen(true); setFileSelectOpen(true);
}; };
const handleParameterChange = ( const handleParameterChange = useCallback(
e: any, (e: any, parameterId: string) => {
taskId: string, console.log(e.target.value, taskId, parameterId);
parameterName: string const result: ITask[] = _.cloneDeep(templateConfigInfo);
) => { console.log(result);
console.log(e.target.value, taskId, parameterName); result.forEach((task) => {
// setParameter(e.target.value, taskId, parameterName); if (task.id === taskId) {
}; let isCheck = true;
task.parameters.forEach((parameter) => {
if (parameter.id === parameterId) {
parameter.defaultValue = e.target.value;
const checkResult = getCustomTemplateParameterCheckResult(
parameter,
e.target.value
);
parameter.error = checkResult.error;
parameter.helperText = checkResult.helperText;
}
if (
getCustomTemplateParameterCheckResult(
parameter,
parameter.defaultValue
).error === true
) {
isCheck = false;
}
});
task.isCheck = isCheck;
} else {
return;
}
});
setTemplateConfigInfo(result);
// setParameter(e.target.value, taskId, parameterName);
},
[templateConfigInfo, setTemplateConfigInfo]
);
// 参数组tabs // 参数组tabs
const paramsTabList = useMemo(()=>{ const paramsTabList = useMemo(() => {
return [ return [
{ {
label: "基础参数", label: "基础参数",
value: "basis", value: "basis",
component: randerParameters(basisParameters), component: randerParameters(basisParameters),
disabled: basisParameters.length === 0 disabled: basisParameters.length === 0,
}, },
{ {
label: "高级选项", label: "高级选项",
value: "senior", value: "senior",
component: randerParameters(seniorParameters), component: randerParameters(seniorParameters),
disabled: seniorParameters.length === 0 disabled: seniorParameters.length === 0,
}, },
{ {
label: "硬件配置", label: "硬件配置",
value: "hardware", value: "hardware",
component: randerParameters(hardwareParameters), component: randerParameters(hardwareParameters),
disabled: hardwareParameters.length === 0 disabled: hardwareParameters.length === 0,
} },
] ];
}, [basisParameters, seniorParameters, hardwareParameters, randerParameters]) }, [basisParameters, seniorParameters, hardwareParameters, randerParameters]);
// 激活的参数组tab // 激活的参数组tab
const activeParamsTab = useMemo(()=>{ const activeParamsTab = useMemo(() => {
if (basisParameters.length !== 0) { if (basisParameters.length !== 0) {
return 'basis' return "basis";
} else if (seniorParameters.length !== 0) { } else if (seniorParameters.length !== 0) {
return 'senior' return "senior";
} else if (hardwareParameters.length !== 0) { } else if (hardwareParameters.length !== 0) {
return 'hardware' return "hardware";
} else { } else {
return '' return "";
} }
}, [basisParameters, seniorParameters, hardwareParameters]) }, [basisParameters, seniorParameters, hardwareParameters]);
return ( return (
<div className={styles.parameterSetting}> <div className={styles.parameterSetting}>
...@@ -608,7 +647,12 @@ const ParameterSetting = (props: IParameterSettingProps) => { ...@@ -608,7 +647,12 @@ const ParameterSetting = (props: IParameterSettingProps) => {
</div> </div>
</div> </div>
<div className={styles.inOutParameterRight}> <div className={styles.inOutParameterRight}>
<MySwitch value={parameter.hidden}></MySwitch> <MySwitch
value={!parameter.hidden}
onChange={(e: any) =>
handleHiddenChange(e, parameter.id || "")
}
></MySwitch>
</div> </div>
</div> </div>
{renderInput(parameter)} {renderInput(parameter)}
...@@ -639,9 +683,7 @@ const ParameterSetting = (props: IParameterSettingProps) => { ...@@ -639,9 +683,7 @@ const ParameterSetting = (props: IParameterSettingProps) => {
{parameter.classTypeName} {parameter.classTypeName}
</div> </div>
</div> </div>
<div className={styles.inOutParameterRight}> <div className={styles.inOutParameterRight}></div>
</div>
</div> </div>
{renderInput(parameter)} {renderInput(parameter)}
</div> </div>
...@@ -650,30 +692,29 @@ const ParameterSetting = (props: IParameterSettingProps) => { ...@@ -650,30 +692,29 @@ const ParameterSetting = (props: IParameterSettingProps) => {
</div> </div>
</div> </div>
)} )}
{ {taskInfo && (
taskInfo && ( <div className={styles.paramsGroup}>
<div className={styles.paramsGroup}> <div className={styles.paramsTitle}>
<div className={styles.paramsTitle}> 参数组
参数组 <Tooltip
<Tooltip title="当某个参数项为启用状态时,代表该参数将由模板使用者在使用的时候填写赋值;当为关闭状态时,代表该参数不需要使用者来填写赋值。"
title="当某个参数项为启用状态时,代表该参数将由模板使用者在使用的时候填写赋值;当为关闭状态时,代表该参数不需要使用者来填写赋值。" placement="right"
placement="right" >
> <img
<img className={styles.paramsTitleDesc}
className={styles.paramsTitleDesc} src={questionMark}
src={questionMark} alt=""
alt="" />
/> </Tooltip>
</Tooltip>
</div>
<Tabs
tabList={paramsTabList}
defaultValue={activeParamsTab}
allowNullValue={true}
/>
</div> </div>
) <Tabs
} tabList={paramsTabList}
defaultValue={activeParamsTab}
allowNullValue={true}
tabPanelSx={{ padding: "7px 0" }}
/>
</div>
)}
{!taskInfo && ( {!taskInfo && (
<div className={styles.noData}> <div className={styles.noData}>
<img src={noTemplate} alt="" className={styles.noDataImg} /> <img src={noTemplate} alt="" className={styles.noDataImg} />
......
...@@ -40,7 +40,6 @@ const WorkFlowEdit = (props: IProps) => { ...@@ -40,7 +40,6 @@ const WorkFlowEdit = (props: IProps) => {
const [templateConfigInfo, setTemplateConfigInfo] = useState<ITask[]>([]); const [templateConfigInfo, setTemplateConfigInfo] = useState<ITask[]>([]);
const [leftContentType, setLeftContentType] = useState("list"); const [leftContentType, setLeftContentType] = useState("list");
const [popperTitle, setPopperTitle] = useState( const [popperTitle, setPopperTitle] = useState(
"返回后,当前页面已填写内容将不保存,确认返回吗?" "返回后,当前页面已填写内容将不保存,确认返回吗?"
); );
......
import { IParameter } from "../Project/ProjectSubmitWork/interface";
export const getCustomTemplateParameterCheckResult = (
parameter: IParameter,
value: string
): {
error: boolean;
helperText: string;
} => {
let error = false;
let helperText = "";
// 表单校验
if (parameter.required) {
// 提交任务时不展示
if (parameter.hidden) {
if (Array.isArray(value)) {
if (value.length === 0) {
error = true;
helperText = "该参数为必填,您必须为该参数赋予默认值";
}
} else if (value === "" || value === null || value === undefined) {
error = true;
helperText = "该参数为必填,您必须为该参数赋予默认值";
}
}
}
if (parameter.validators.length > 0) {
parameter.validators.forEach((validator) => {
const reg = new RegExp(validator.regex);
if (!reg.test(value)) {
error = true;
helperText = validator.message;
}
});
}
return {
error,
helperText,
};
};
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