183 lines
5.8 KiB
JavaScript
183 lines
5.8 KiB
JavaScript
import React , { useState , useEffect } from 'react';
|
|
import { getProjectBranch, addPipelines, getTemplateList } from './api';
|
|
import './index.scss';
|
|
import { Modal , Form , Input, Select , Button, Divider } from 'antd';
|
|
|
|
const modalList = [
|
|
{
|
|
name: '空白模板',
|
|
id: -1,
|
|
nodes: [{ name: '请自定义您的流水线模板' }]
|
|
},
|
|
]
|
|
|
|
const pipType = {
|
|
all: 0,
|
|
code: 1,
|
|
image: 2
|
|
}
|
|
|
|
const { Option } = Select;
|
|
|
|
|
|
const New =({
|
|
open,onCancel,form,match, onOk
|
|
}) => {
|
|
|
|
const { getFieldDecorator } = form;
|
|
const {owner, projectsId} = match.params;
|
|
// const [ loading, setLoading ] = useState(false);
|
|
const [ pipelineType, setPipelineType ] = useState(pipType.code);
|
|
const [ branchList, setBranchList] = useState([]);
|
|
const [ templateList, setTemplateList ] = useState([]);
|
|
const [ templateSelected, setTemplateSelected ] = useState(-1);
|
|
|
|
let settings = JSON.parse(localStorage.chromesetting);
|
|
let pipelineUrl = settings && settings.common.pipeline;
|
|
|
|
useEffect(() => {
|
|
if(open){
|
|
getTemplates();
|
|
getBranchList()
|
|
}
|
|
}, [open]);
|
|
|
|
function getTemplates(){
|
|
// 获取流水线模板列表
|
|
getTemplateList().then(res=>{
|
|
|
|
if(res.templates){
|
|
res.templates.map((item)=>{
|
|
return item.nodes = JSON.parse(item.json).nodes
|
|
})
|
|
setTemplateList(modalList.concat(res.templates));
|
|
}
|
|
})
|
|
}
|
|
|
|
function getBranchList () {
|
|
getProjectBranch(owner, projectsId).then(res => {
|
|
setBranchList(res)
|
|
})
|
|
}
|
|
|
|
async function onSubmit() {
|
|
await form.validateFields();
|
|
const { branch , pipeline_name, pipeline_type } = form.getFieldsValue();
|
|
const params = {
|
|
branch,pipeline_name, pipeline_type
|
|
}
|
|
if (pipelineType === pipType.image) params.pipelineTemplateJson = templateSelected !== -1 ? getTemplateJson(templateSelected) : {nodes: [], edges: [], combos: []}
|
|
addPipelines(owner, projectsId, params).then(res=>{
|
|
if(res.id){
|
|
form.resetFields();
|
|
onOk()
|
|
window.open(`${ pipelineUrl }/devops/${owner}/${projectsId}/${res.id}/edit`)
|
|
}
|
|
})
|
|
}
|
|
|
|
const getTemplateJson = (id) => {
|
|
let json = {}
|
|
for (let i = 0; i < templateList.length; i++) {
|
|
const element = templateList[i];
|
|
if (element.id === id) json = JSON.parse(element.json)
|
|
}
|
|
return json
|
|
}
|
|
|
|
function close() {
|
|
form.resetFields();
|
|
onCancel();
|
|
}
|
|
|
|
return(
|
|
<Modal
|
|
visible={open}
|
|
width={"686px"}
|
|
className="format-style"
|
|
title={"新建流水线"}
|
|
onCancel={close}
|
|
footer={
|
|
<div style={{textAlign:"center"}}>
|
|
<Button style={{width:"90px"}} onClick={close}>取消</Button>
|
|
<Button type={"primary"} className="ml25" onClick={onSubmit} style={{width:"90px"}}>保存</Button>
|
|
</div>
|
|
}
|
|
>
|
|
<Form layout={"vertical"}>
|
|
|
|
<Form.Item label="流水线名称">
|
|
{getFieldDecorator("pipeline_name",{
|
|
rules:[{ required: true, message: '请输入流水线名称' }]
|
|
})(
|
|
<Input placeholder={"请输入流水线名称"} maxLength={50}/>
|
|
)}
|
|
</Form.Item>
|
|
<Form.Item label="代码库分支">
|
|
{getFieldDecorator("branch",{
|
|
rules: [{ required: true, message: '请选择代码库分支' }]
|
|
})(
|
|
<Select
|
|
placeholder={"请选择代码库分支"}
|
|
filterOption={(input, option) =>
|
|
option.title.indexOf(input.toLowerCase()) >= 0
|
|
}
|
|
showSearch
|
|
getPopupContainer={trigger => trigger.parentNode}
|
|
>
|
|
{
|
|
branchList.map((item)=>{
|
|
return <Select.Option key={item.name} value={item.name} title={item.name}>
|
|
<span><i className="iconfont icon-a-fenzhi1 font14 mr5"/>{item.name}</span>
|
|
</Select.Option>
|
|
})
|
|
}
|
|
</Select>
|
|
)}
|
|
</Form.Item>
|
|
<Form.Item label="流水线类型">
|
|
{getFieldDecorator("pipeline_type",{
|
|
rules: [{ required: true, message: '请选择流水线类型' }]
|
|
})(
|
|
<Select
|
|
placeholder={"请选择流水线类型"}
|
|
onChange={e => { setPipelineType(e) }}
|
|
>
|
|
<Option value={ pipType.code }>声明式流水线</Option>
|
|
<Option value={ pipType.image }>图形化流水线</Option>
|
|
</Select>
|
|
)}
|
|
</Form.Item>
|
|
{
|
|
pipelineType === pipType.image &&
|
|
<Form.Item label="请选择流水线模板" >
|
|
<div className='templateContainer'>
|
|
{
|
|
templateList.map(e => {
|
|
console.log('e.nodes', e.nodes);
|
|
|
|
return <div className={`template ${ e.id === templateSelected ? 'templateSelected' : '' }`} onClick={()=>{
|
|
setTemplateSelected(e.id)
|
|
}}>
|
|
<span className='col0d0Text font16'><i className="iconfont icon-moban mr10 themeColorSpan font14"/>{e.name}</span>
|
|
<div className='mt15 nodes'>
|
|
{e.nodes && e.nodes.map((item, index)=>{
|
|
const nextItem = e.nodes[index+1]
|
|
return <React.Fragment>
|
|
<span className={`node mb10`}>{item.name}</span>
|
|
{nextItem && <Divider className='mb10' style={{marginTop: '0', minWidth: '45px', width: '45px', borderTop: '1px solid #B8C1CF', display: 'inline-flex'}}/>}
|
|
</React.Fragment>
|
|
})}
|
|
</div>
|
|
</div>
|
|
})
|
|
}
|
|
</div>
|
|
</Form.Item>
|
|
}
|
|
</Form>
|
|
</Modal>
|
|
)
|
|
}
|
|
export default Form.create()(New) |