This commit is contained in:
caishi 2020-08-27 15:15:03 +08:00
parent 42a1418181
commit 3abbaa8899
6 changed files with 136 additions and 121 deletions

View File

@ -35,6 +35,8 @@ function About(props, ref) {
const owner = props.match.params.owner;
const projectsId = props.match.params.projectsId;
const AuthorLogin = props.author && props.author.login;
const CurrentLogin = props.current_user && props.current_user.login;
useEffect(()=>{
auth('get');
@ -188,68 +190,74 @@ function About(props, ref) {
</p>
</div>
</Modal>
<img src={activate} alt="" width="250px" />
<P>定义DevOps工作流帮助您检测bug发布代码</P>
<Link to={""} style={{ color: "#5091FF", marginBottom: "20px" }}>
了解什么是DevOps
</Link>
{step <=1?
<img src={activate} alt="" width="250px" />
<P>定义DevOps工作流帮助您检测bug发布代码</P>
<Link to={""} style={{ color: "#5091FF", marginBottom: "20px" }}>
了解什么是DevOps
</Link>
{
AuthorLogin === CurrentLogin ?
<React.Fragment>
<Form>
<p className="mb20" style={{width:"370px"}}>请仔细核对您的服务器信息一旦确认提交将无法修改</p>
{helper(
"服务器IP地址",
"ip_num",
[{ required: true, message: "请输入服务器IP地址" }],
<Input
placeholder="请输入服务器IP地址"
style={{ width: "368px" }}
size="large"
disabled={firstCompleted}
/>,
true
)}
{helper(
"服务器用户名:",
"account",
[{ required: true, message: "请输入服务器用户名" }],
<Input placeholder="请输入服务器用户名" size="large" disabled={firstCompleted} />,
true
)}
{helper(
"服务器密码:",
"secret",
[{ required: true, message: "请输入服务器密码" }],
<Input.Password placeholder="请输入服务器密码" size="large" disabled={firstCompleted}/>,
true
)}
</Form>
<Blueback onClick={goStep}>下一步</Blueback>
</React.Fragment>
:""}
{step >= 2 &&(
<div>
{ step <= 1 ?
<React.Fragment>
<Form>
<p className="mb20" style={{width:"370px"}}>认证成功后请前往<a target="_blank" href={cloudAccount && cloudAccount.get_drone_token_url} className="color-blue">{cloudAccount && cloudAccount.get_drone_token_url}</a>获取token值并将获取的token值填入输入框</p>
<p className="mb20" style={{width:"370px"}}>请仔细核对您的服务器信息一旦确认提交将无法修改</p>
{helper(
"token值",
"drone_token",
[{ required: true, message: "请输入token值" }],
<Input placeholder="请输入token值" size="large" />,
"服务器IP地址",
"ip_num",
[{ required: true, message: "请输入服务器IP地址" }],
<Input
placeholder="请输入服务器IP地址"
style={{ width: "368px" }}
size="large"
disabled={firstCompleted}
/>,
true
)}
{helper(
"服务器用户名:",
"account",
[{ required: true, message: "请输入服务器用户名" }],
<Input placeholder="请输入服务器用户名" size="large" disabled={firstCompleted} />,
true
)}
{helper(
"服务器密码:",
"secret",
[{ required: true, message: "请输入服务器密码" }],
<Input.Password placeholder="请输入服务器密码" size="large" disabled={firstCompleted}/>,
true
)}
<div style={{ display: "flex", justifyContent: "center" }}>
{
step === 2?
<Blueback onClick={startActive} className="ml20">开始激活</Blueback>
:
<Blueback onClick={complete}>完成</Blueback>
}
</div>
</Form>
</div>
)}
<Blueback onClick={goStep}>下一步</Blueback>
</React.Fragment>
:""}
{step >= 2 &&(
<div>
<Form>
<p className="mb20" style={{width:"370px"}}>认证成功后请前往<a target="_blank" href={cloudAccount && cloudAccount.get_drone_token_url} className="color-blue">{cloudAccount && cloudAccount.get_drone_token_url}</a>获取token值并将获取的token值填入输入框</p>
{helper(
"token值",
"drone_token",
[{ required: true, message: "请输入token值" }],
<Input placeholder="请输入token值" size="large" />,
true
)}
<div style={{ display: "flex", justifyContent: "center" }}>
{
step === 2?
<Blueback onClick={startActive} className="ml20">开始激活</Blueback>
:
<Blueback onClick={complete}>完成</Blueback>
}
</div>
</Form>
</div>
)}
</React.Fragment>
:""
}
</div>
</Spin>
);

View File

@ -19,7 +19,6 @@ function Dispose(props){
let projectsId = props.match.params.projectsId;
let owner = props.match.params.owner;
useEffect(()=>{
if(projectsId){
const url = `/${owner}/${projectsId}/get_trustie_pipeline.json`;

View File

@ -62,8 +62,8 @@ export default ({ data, repeatSet , chooseSteps }) => {
}
}
function clickSub(e,stageN,stepN,stageName){
chooseSteps(stageN,stepN,stageName);
function clickSub(e,stageN,stepN){
chooseSteps(stageN,stepN);
}
return (
@ -107,7 +107,7 @@ export default ({ data, repeatSet , chooseSteps }) => {
>
{item.steps.map((i, k) => {
return (
<Menu.Item onClick={(e)=>clickSub(e,item.number,i.id,item.name)}>
<Menu.Item onClick={(e)=>clickSub(e,item.number,i.id)}>
<FlexAJ>
<span>
{i.name} {i.status ? TagsLine(i.status) : ""}

View File

@ -3,16 +3,38 @@ import { Spin } from 'antd';
import { FlexAJ, AlignCenter } from "../Component/layout";
import axios from 'axios';
export default (({ step , stageNumber , stageName , projectId , owner , opsId , rightSpin }) => {
export default (({ data , stepN , stageN , projectId , owner , opsId , rightSpin }) => {
const [ coders , setCoders ] = useState(undefined);
const [ empty , setEmpty ] = useState(false);
const [ spining , setSpining ] = useState(true);
const [ stage , setStage]= useState(undefined);
const [ step , setStep]= useState(undefined);
useEffect(()=>{
setSpining(rightSpin);
},[rightSpin])
useEffect(()=>{
if(projectId && stageNumber && step){
const url = `/${owner}/${projectId}/builds/${opsId}/logs/${stageNumber}/${step && step.number}.json`;
if(data){
let stages = data.stages;
if(stages && stages.length>0){
let pre = stageN ? stages.filter(item=>item.number===stageN)[0] : stages[0];
setStage(pre);
let p = pre && pre.steps;
let sub = stepN ? p && p.length > 0 && p.filter(item=>item.id===stepN)[0] : p[0];
setStep(sub);
if(sub){
getStep(pre.number,sub.number);
}
}else{
setSpining(false);
}
}
},[data,stageN,stepN])
function getStep(stageN,stepN){
if(stageN && stepN){
const url = `/${owner}/${projectId}/builds/${opsId}/logs/${stageN}/${stepN}.json`;
axios.get(url).then(result=>{
if(result){
setCoders(result.data);
@ -24,38 +46,42 @@ export default (({ step , stageNumber , stageName , projectId , owner , opsId ,
console.log(error);
})
}
},[projectId , stageNumber, step])
}
return (
<Spin spinning={spining}>
<div className="rightMainContent">
<div>
<FlexAJ className="items">
<span>{step && step.name}</span>
<AlignCenter>
{ step && step.duration_time}
<i className="iconfont icon-sanjiaoxing-down"></i>
</AlignCenter>
</FlexAJ>
{
data && data.status !== "error" ?
<div>
{
coders && coders.length>0 ? coders.map((item,key)=>{
return(
<div className="opsDetailOut">
<span>{key+1}</span>
<p>{item.out}</p>
</div>
)
}):
empty ?
<div className="opsDetailOut">
<span>1</span>
<p>{stageName} {step && step.name}: Skipped</p>
</div>
:""
}
<FlexAJ className="items">
<span>{step && step.name}</span>
<AlignCenter>
{ step && step.duration_time}
<i className="iconfont icon-sanjiaoxing-down"></i>
</AlignCenter>
</FlexAJ>
<div>
{
coders && coders.length>0 ? coders.map((item,key)=>{
return(
<div className="opsDetailOut">
<span>{key+1}</span>
<p>{item.out}</p>
</div>
)
}):
empty ?
<div className="opsDetailOut">
<span>1</span>
<p>{stage && stage.name} {step && step.name}: Skipped</p>
</div>
:""
}
</div>
</div>
</div>
:
<div style={{color:"red"}}>error:{ data && data.error }</div>
}
</div>
</Spin>
);

View File

@ -11,11 +11,9 @@ import { Link } from "react-router-dom";
export default (props) => {
const [data, setData] = useState(undefined);
const [stages, setStages] = useState(undefined);
const [ rightStageName , setRightStageName ] = useState(undefined);
const [rightStep, setRightStep] = useState(undefined);
const [stageN, setStageN] = useState(undefined);
const [stepN, setStepN] = useState(undefined);
const [rightSpin, setRightSpin] = useState(false);
const [rightStageNumber, setRightStageNumber] = useState(undefined);
const [spinning, setSpinning] = useState(true);
let projectId = props.match.params.projectId;
@ -34,14 +32,6 @@ export default (props) => {
if (result && result.data) {
setSpinning(false);
setData(result.data);
let stages = result.data.stages;
setStages(stages);
let firstStage = stages && stages.length > 0 && stages[0];
let firstStep = firstStage && firstStage.steps && firstStage.steps.length>0 && firstStage.steps[0];
setRightStep(firstStep);
setRightSpin(true);
setRightStageName(firstStage && firstStage.name);
setRightStageNumber(firstStage && firstStage.number);
}
})
.catch((error) => {
@ -79,14 +69,10 @@ export default (props) => {
}
}
function chooseSteps(stageN,stepN,stageName){
if(stageN && stepN && stages){
let stage = stages && stages.length>0 && stages.filter(item=>item.number===stageN)[0];
let s = stage.steps && stage.steps.length > 0 && stage.steps.filter(item=>item.id===stepN);
s && s.length>0 && setRightStep(s[0]);
setRightStageNumber(stageN);
setRightStageName(stageName);
function chooseSteps(pre,sub){
if(pre && sub){
setStepN(sub);
setStageN(pre);
setRightSpin(true);
}
}
@ -118,7 +104,7 @@ export default (props) => {
<LeftPanel data={data} repeatSet={repeatSet} chooseSteps={chooseSteps} />
</section>
<section className="rightSection">
<RightPanel stageName={rightStageName} rightSpin={rightSpin} step={rightStep} stageNumber = {rightStageNumber} owner={owner} projectId={projectId} opsId={opsId} />
<RightPanel data={data} rightSpin={rightSpin} stepN={stepN} stageN={stageN} owner={owner} projectId={projectId} opsId={opsId} />
</section>
</SplitPane>
</div>

View File

@ -487,16 +487,12 @@ class Detail extends Component {
</Link>
</li>
}
{
current_user && author && current_user.login === author.login ?
<li className={pathname==="devops" ? "active" : ""}>
<Link to={{ pathname: `/projects/${owner}/${projectsId}/devops${open_devops ? `/dispose`:""}`, state }}>
<i className="iconfont icon-gongzuoliu font-13 mr8"></i>
{projectDetail && projectDetail.ops_count ? <span>{projectDetail.ops_count}</span> : ""}
</Link>
</li>:""
}
<li className={pathname==="devops" ? "active" : ""}>
<Link to={{ pathname: `/projects/${owner}/${projectsId}/devops${open_devops ? `/dispose`:""}`, state }}>
<i className="iconfont icon-gongzuoliu font-13 mr8"></i>
{projectDetail && projectDetail.ops_count ? <span>{projectDetail.ops_count}</span> : ""}
</Link>
</li>
<li className={pathname==="milestones" ? "active" : ""}>
<Link to={{ pathname: `/projects/${owner}/${projectsId}/milestones`, state }}>
<img alt="" src={img_milepost} width="16" />里程碑