forgeplus-react/src/forge/DevOps/MouldNew.jsx

161 lines
4.4 KiB
React
Raw Normal View History

2021-01-29 14:17:49 +08:00
import React , { useImperativeHandle , useState , forwardRef , useCallback } from 'react';
import { Form , Modal , Input , Select , Spin } from 'antd';
import Editor from './Dispose/Editors';
import axios from 'axios';
const { Option } = Select;
const TYPE = ["Java","C","C++","Python","Go","Ruby","R","PHP",
    "Perl","Node","Docker","Rust","Swift","Erlang","Other"]
function MouldNew({ form , visible , onCancel , onOk }, ref){
const [value , setValue ] = useState(undefined);
const [isSpin , setIsSpin ] = useState(false);
const [valueFlag , setValueFlag ] = useState(false);
const [ id , setId ] = useState(false);
2021-02-01 11:10:51 +08:00
const [ buildFlag , setBuildFlag ] = useState(false);
2021-01-29 14:17:49 +08:00
2021-02-01 11:10:51 +08:00
const { getFieldDecorator, validateFields , setFieldsValue } = form;
2021-01-29 14:17:49 +08:00
useImperativeHandle(ref, () => ({
setEditInfo: (info) => {
if(info){
2021-02-01 11:10:51 +08:00
if(info.stage_type === "build"){
setBuildFlag(true);
}else{
removeCate();
}
2021-01-29 14:17:49 +08:00
setFieldsValue({
...info
})
setValue(info.content);
setId(info.id);
}else{
2021-02-01 11:10:51 +08:00
removeCate();
2021-01-29 14:17:49 +08:00
clear();
setId(undefined);
}
}
}))
const helper = useCallback(
(label, name, rules, widget, className, isRequired,flag) => (
2021-02-01 11:10:51 +08:00
<Form.Item label={label} className={className}>
2021-01-29 14:17:49 +08:00
{getFieldDecorator(name, { rules, validateFirst: true , valuePropName:flag ? "checked":"value" })(widget)}
</Form.Item>
),
[]
);
function changeContent(v){
if(v){
setValue(v);
setValueFlag(false);
}
}
function cancel(){
clear();
onCancel();
}
function sure(){
if(!value){
setValueFlag(true);
return;
}
validateFields((error,values)=>{
if(!error){
setIsSpin(true);
const url = `/ci/templates.json`;
axios.post(url,{
...values,id,content:value
}).then(result=>{
if(result && result.data){
setIsSpin(false);
cancel();
onOk();
}
}).catch(error=>{})
}
})
}
function clear(){
setFieldsValue({
2021-02-01 11:10:51 +08:00
stage_type:"init",
2021-01-29 14:17:49 +08:00
template_name:undefined,
category:"Java",
})
setValue("");
setValueFlag(false);
}
2021-02-01 11:10:51 +08:00
function changeStage(e){
if(e === "build"){
setBuildFlag(true);
}else{
removeCate();
}
}
function removeCate(){
setBuildFlag(false);
setFieldsValue({
category:""
})
}
2021-01-29 14:17:49 +08:00
return(
<Modal
visible={visible}
width="500px"
title={"新建/编辑模板"}
onCancel={cancel}
onOk={sure}
centered={true}
>
<Spin spinning={isSpin}>
<Form layout={"inline"}>
{helper(
"所属阶段",
"stage_type",
[{required:true,message:"请选择所属阶段"}],
2021-02-01 11:10:51 +08:00
<Select placeholder="请选择所属阶段" style={{width:"350px"}} onChange={(e)=>{changeStage(e)}}>
2021-01-29 14:17:49 +08:00
<Option value="init">初始化</Option>
<Option value="build">编译构建</Option>
<Option value="deploy">部署</Option>
<Option value="customize">其他</Option>
2021-02-01 11:10:51 +08:00
</Select>
2021-01-29 14:17:49 +08:00
)}
{helper(
"模板名称",
"template_name",
[{required:true,message:"请输入模板名称"}],
2021-02-01 11:10:51 +08:00
<Input placeholder="请输入模板名称" style={{width:"350px"}}/>
2021-01-29 14:17:49 +08:00
)}
{helper(
"模板分类",
"category",
2021-02-01 11:10:51 +08:00
[{required:buildFlag,message:"请选择模板分类"}],
2021-01-29 14:17:49 +08:00
<Select placeholder="请选择模板分类" style={{width:"350px"}}>
{
TYPE.map((item,key)=>{
return(
<Option value={item}>{item}</Option>
)
})
}
2021-02-01 11:10:51 +08:00
</Select>,buildFlag===true ? "" :"hide"
2021-01-29 14:17:49 +08:00
)}
<div style={{display:'flex',justifyContent:"flex-start"}}>
<span><span className="color-red">* </span>模板内容</span>
<div>
<div className="editorPanel">
<Editor Numbers={"off"} width={"350px"} value={value} height="200px" theme="vs-grey" onChange={changeContent}/>
</div>
{ valueFlag && <span className="color-red">请输入模板内容</span>}
</div>
</div>
</Form>
</Spin>
</Modal>
)
}
export default Form.create()(forwardRef(MouldNew));