forgeplus-react/src/forge/Merge/NewMerge.js

296 lines
8.5 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import React, { Component } from "react";
import { Input, Select, Button, Spin, Alert } from "antd";
import axios from "axios";
import "../Order/order.css";
import "./merge.css";
import MergeForm from "./merge_form";
import MergeFooter from "./merge_footer";
const Option = Select.Option;
class NewMerge extends Component {
constructor(props) {
super(props);
this.state = {
data: undefined,
branches: undefined,
merge_branches: undefined,
merge_projects: undefined,
merge: "master",
pull: "master",
is_fork: false,
projects_names: undefined,
isSpin: false,
show_message: true,
merge_head: false, // 是否向fork后的源项目发起合并请求
default_message: "必须选择不同的分支",
project_id: undefined, // 当前项目的id也即开始发送合并请求的源项目id
merge_project_user: undefined
};
}
componentDidMount = () => {
const { projectsId } = this.props.match.params;
this.getmergelist(projectsId);
};
//获取新建分枝数据
getmergelist = (projectsId) => {
this.setState({isSpin: true})
const { owner } = this.props.match.params;
const url = `/${owner}/${projectsId}/pulls/new.json`;
axios
.get(url)
.then((result) => {
if (result) {
this.setState({
is_fork: result.data.is_fork,
projects_names: result.data.projects_names,
merge_projects: result.data.merge_projects,
branches: result.data.branches,
merge_branches: result.data.branches,
project_id: result.data.project_id,
});
this.set_default_pull()
this.set_default_merge()
}
this.setState({isSpin: false})
})
.catch((error) => {
this.setState({isSpin: false})
console.log(error);
});
};
set_default_pull = () => {
const {branches} = this.state;
let default_pull = branches.filter((e) => e.name === "master")
if (default_pull.length > 0){
this.state.pull = default_pull[0].name
}else{
this.state.pull = "master"
}
}
set_default_merge = () => {
const {merge_branches} = this.state;
let default_merge = merge_branches.filter((e) => e.name === "master")
if (default_merge.length > 0){
this.state.merge = default_merge[0].name
}else{
this.state.merge = "master"
}
this.ischeckmerge();
}
newMergelist = (id) => {
this.setState({isSpin: true})
const { owner , projectsId } = this.props.match.params;
const url = `/${owner}/${projectsId}/pulls/get_branches.json`;
axios.get(url).then((result) => {
if (result) {
this.setState({
merge_branches: result.data
})
this.set_default_merge()
}
this.setState({isSpin: false})
})
.catch((error) => {
this.setState({isSpin: false})
console.log(error);
});
};
selectBrach = (type, value) => {
this.state[type] = value;
this.ischeckmerge();
};
selectProjectName = (value) => {
const { project_id, projects_names } = this.state;
const { owner } = this.props.match.params;
console.log(value);
let is_fork_id = parseInt(value) !== parseInt(project_id)
this.setState({
isSpin: true,
merge_head: is_fork_id,
data: {
is_original: is_fork_id,
fork_project_id: is_fork_id ? project_id : "",
merge_user_login: is_fork_id ? projects_names[0].project_user_login : undefined
}
})
// this.props.history.push(`/projects/${owner}/${value}/pulls/new`);
this.newMergelist(value);
};
//判断2分支是否可以合并
ischeckmerge = () => {
this.setState({ isSpin: true });
const { projectsId , owner } = this.props.match.params;
const { pull, merge, project_id, merge_head } = this.state;
const url = `/${owner}/${projectsId}/pulls/check_can_merge.json`;
axios.post(url, {
head: pull,
base: merge,
is_original: merge_head,
fork_project_id: merge_head ? project_id : undefined
})
.then((result) => {
if (result) {
if (result.data.status === 0) {
this.setState({
isSpin: false,
show_message: false,
});
} else {
this.setState({
isSpin: false,
show_message: true,
default_message: result.data.message,
});
}
} else {
this.setState({
isSpin: false,
show_message: true,
default_message: "出现错误了",
});
}
})
.catch((error) => {
this.setState({ isSpin: false, show_message: true });
console.log(error);
});
};
render() {
const {
data,
branches,
merge_branches,
merge_projects,
pull,
merge,
isSpin,
show_message,
default_message,
merge_head,
projects_names,
} = this.state;
const { projectsId } = this.props.match.params;
const renderBrances = (list, type) => {
if (list && list.length > 0) {
return list.map((item, key) => {
return (
<Option
key={key + 1}
value={item.name}
>
{item.name}
</Option>
);
});
}
};
const renderProjectNames = (list) => {
if (list && list.length > 0) {
return list.map((item, key) => {
return (
<Option key={key + 1} value={item.project_id}>
{item.project_name}
</Option>
);
});
}
};
const withHtml = (html) => {
return <div dangerouslySetInnerHTML={{ __html: html }}></div>;
};
let { project } = this.props;
return (
<div>
<div className="main">
<Spin spinning={isSpin}>
<div className="merge-header width100 inline-block">
<div className="width45 pull-left">
<div className="color-grey-3 mb10 fwb">源分支:</div>
<Input.Group compact className="display-flex">
<Select
defaultValue={parseInt(project && project.id)}
class=" maxW50 hide-1 task-hide"
disabled
>
{renderProjectNames(projects_names)}
</Select>
<Select
defaultValue={pull}
onSelect={(e) => this.selectBrach("pull", e)}
showSearch
className="minW50 merge-flex1"
>
{renderBrances(branches, false)}
</Select>
</Input.Group>
</div>
<div className="width10 pull-left text-center mt25">
<i
className={"iconfont icon-youjiang color-grey-c font-32"}
></i>
</div>
<div className="width45 pull-left">
<div>
<div className="color-grey-3 mb10 fwb">目标分支:</div>
<Input.Group compact className="display-flex">
<Select
defaultValue={parseInt(project && project.id)}
class=" maxW50 hide-1 task-hide"
onSelect={(e) => this.selectProjectName(e)}
>
{renderProjectNames(merge_projects)}
</Select>
<Select
defaultValue={merge}
value={merge}
onSelect={(e) => this.selectBrach("merge", e)}
showSearch
className="minW50 merge-flex1"
>
{renderBrances(merge_branches, merge_head)}
</Select>
</Input.Group>
</div>
</div>
</div>
{show_message ? (
<div className="mb20">
<Alert description={withHtml(default_message)} type="error" />
</div>
) : (
<MergeForm
{...this.props}
merge_type="new"
data={data}
merge={merge}
pull={pull}
></MergeForm>
)}
</Spin>
</div>
{/* <div className=" main">
<MergeFooter footer_type="new" {...this.props}></MergeFooter>
</div> */}
</div>
);
}
}
export default NewMerge;