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

160 lines
4.9 KiB
React
Raw Normal View History

2021-01-29 14:17:49 +08:00
import React , { useEffect , useState , useRef } from 'react';
2021-02-01 11:10:51 +08:00
import { Banner , Blueback , FlexAJ } from '../Component/layout';
2021-01-29 14:17:49 +08:00
import { Input , Table ,Pagination , Select , Popconfirm } from 'antd';
2021-02-01 11:10:51 +08:00
import { Link } from 'react-router-dom'
2021-01-29 14:17:49 +08:00
import styled from 'styled-components';
import axios from 'axios';
import New from './MouldNew';
const { Option } = Select;
const Div = styled.div`{
padding:24px 30px;
min-height:420px;
}`;
const STAGE = [
{stage_name:"所有",stage_type:"all"},
  {stage_name:"初始化",stage_type:"init"},
  {stage_name:"编译构建",stage_type:"build"},
  {stage_name:"部署",stage_type:"deploy"},
  {stage_name:"其他",stage_type:"customize"}
]
const limit = 15;
function Mould(props){
const [ visible ,setVisible ] = useState(false);
const [ list ,setList ] = useState(undefined);
const [ page ,setPage ] = useState(1);
const [ totalCount ,setTotalCount ] = useState(0);
const [ stageType ,setStageType ] = useState("all");
const [ search ,setSearch ] = useState(undefined);
const childRef = useRef();
2021-02-01 11:10:51 +08:00
let projectsId = props.match.params.projectsId;
let owner = props.match.params.owner;
2021-01-29 14:17:49 +08:00
useEffect(()=>{
Init(page,stageType);
},[page,stageType])
function Init(page,stageType,searchvalue){
const url = `/ci/templates/list.json`;
axios.get(url,{
params:{
page,limit,stage_type:stageType,name:searchvalue
}
}).then(result=>{
if(result && result.data){
setList(result.data.templates);
setTotalCount(result.data.total_count);
}
}).catch(error=>{})
}
const columns=[
{
title:"名称",
dataIndex:"template_name",
key:1,
ellipsis:true
},
{
title:"所属阶段",
dataIndex:"stage_type",
key:2,
ellipsis:true,
render:(txt,item)=>{
let i = STAGE.filter(item=>item.stage_type === txt);
return i && i.length>0 && i[0].stage_name
}
},
{
title:"模板类型",
dataIndex:"category",
key:3,
ellipsis:true
},
{
title:"操作",
dataIndex:"operation",
key:4,
ellipsis:true,
render:(txt,item)=>{
return(
<span>
<a className="mr10 color-grey-6" onClick={()=>editMouldFunc(item)}><i className="iconfont icon-zaibianji font-13 mr3"></i>编辑</a>
<Popconfirm title={"确定要删除此模板?"} onConfirm={()=>deleteMouldFunc(item.id)} okText="确定" cancelText={"取消"}>
<a className="mr10 color-grey-6"><i className="iconfont icon-lajitong font-13 mr3"></i>删除</a>
</Popconfirm>
</span>
)
}
}
]
// 编辑模板
function editMouldFunc(item){
if (childRef.current) {
childRef.current.setEditInfo(item);
}
setVisible(true);
}
// 删除模板
function deleteMouldFunc(id){
const url = `/ci/templates/${id}.json`;
axios.delete(url).then(result=>{
if(result && result.data){
props.showNotification("模板删除成功!");
Init(page,stageType,search);
}
})
}
function searchValue(){
Init(page,stageType,search);
}
function newMouldFunc(){
if (childRef.current) {
childRef.current.setEditInfo(undefined);
}
setVisible(true);
}
function onOk(){
Init(page,"all");
}
return(
<div>
<New wrappedComponentRef={(f) => childRef.current = f} ref={childRef} visible={visible} onCancel={()=>setVisible(false)} onOk={onOk}></New>
2021-02-01 11:10:51 +08:00
<Banner>
<FlexAJ><span>工作流 - 模板管理</span><Link to={`/projects/${owner}/${projectsId}/devops/dispose`} className="font-14 color-grey-9">返回</Link></FlexAJ>
</Banner>
2021-01-29 14:17:49 +08:00
<Div className="disposeList">
<FlexAJ>
<Blueback onClick={newMouldFunc}>新建模板</Blueback>
<FlexAJ>
<span className="mr10">阶段</span>
<Select onChange={e=>setStageType(e)} value={stageType} style={{width:"180px"}}>
{
STAGE.map((item,key)=>{
return(
<Option value={item.stage_type}>{item.stage_name}</Option>
)
})
}
</Select>
<Input placeholder="请输入模板名称" value={search} onChange={(e)=>setSearch(e.target.value)} allowClear style={{width:"160px",marginLeft:"15px"}}/>
<Blueback className="ml15" onClick={searchValue}>搜索</Blueback>
</FlexAJ>
</FlexAJ>
<Table className="mt20" size="small" columns={columns} dataSource={list} rowKey={(row)=>row.id} pagination={false}></Table>
{
totalCount > limit &&
<div className="mt20 pb20" style={{textAlign:'center'}}>
<Pagination simple current={page} pageSize={limit} total={totalCount} onChange={(page)=>setPage(page)}/>
</div>
}
</Div>
</div>
)
}
export default Mould;