forgeplus-react/src/forge/Main/Detail.js

625 lines
23 KiB
JavaScript
Raw Normal View History

2020-07-10 15:42:57 +08:00
import React, { Component } from 'react';
2020-05-20 18:11:32 +08:00
import { Spin, Tooltip } from 'antd';
2020-06-11 15:40:22 +08:00
import { Link, Route, Switch } from 'react-router-dom';
2020-07-02 14:21:22 +08:00
import { Content } from '../Component/layout';
2020-06-22 14:07:06 +08:00
import '../css/index.scss'
2020-03-16 14:12:11 +08:00
import './list.css';
import Loadable from 'react-loadable';
import Loading from '../../Loading';
import axios from 'axios';
import img_1 from '../Images/1.png';
import img_2 from '../Images/2.png';
import img_3 from '../Images/3.png';
import img_6 from '../Images/6.png';
import img_7 from '../Images/7.png';
import img_parise from '../Images/parise.png';
import img_focus from '../Images/focus.png';
import img_parised from '../Images/parised.png';
import img_focused from '../Images/focused.png';
import img_fork from '../Images/fork.png';
2020-04-09 18:13:26 +08:00
import img_milepost from '../Images/milepost.png';
2020-03-16 14:12:11 +08:00
const Setting = Loadable({
2020-05-20 18:11:32 +08:00
loader: () => import('../Settings/Index'),
loading: Loading,
2020-03-16 14:12:11 +08:00
})
const TagList = Loadable({
2020-05-20 18:11:32 +08:00
loader: () => import('../Order/Tags'),
loading: Loading,
2020-03-16 14:12:11 +08:00
})
const OrderNew = Loadable({
2020-05-20 18:11:32 +08:00
loader: () => import('../Order/New'),
loading: Loading,
2020-03-16 14:12:11 +08:00
})
const OrderDetail = Loadable({
2020-05-20 18:11:32 +08:00
loader: () => import('../Order/Detail'),
loading: Loading,
2020-03-16 14:12:11 +08:00
})
const OrderIndex = Loadable({
2020-05-20 18:11:32 +08:00
loader: () => import('../Order/order'),
loading: Loading,
2020-03-16 14:12:11 +08:00
})
const CoderRootIndex = Loadable({
2020-05-20 18:11:32 +08:00
loader: () => import('./CoderRootIndex'),
loading: Loading,
2020-03-16 14:12:11 +08:00
})
const OrderMilepost = Loadable({
2020-05-20 18:11:32 +08:00
loader: () => import('../Order/Milepost'),
loading: Loading,
2020-03-16 14:12:11 +08:00
})
const OrdernewMilepost = Loadable({
2020-05-20 18:11:32 +08:00
loader: () => import('../Order/newMilepost'),
loading: Loading,
2020-03-16 14:12:11 +08:00
})
const OrderupdateMilepost = Loadable({
2020-05-20 18:11:32 +08:00
loader: () => import('../Order/UpdateMilepost'),
loading: Loading,
2020-03-16 14:12:11 +08:00
})
const OrderupdateDetail = Loadable({
2020-05-20 18:11:32 +08:00
loader: () => import('../Order/UpdateDetail'),
loading: Loading,
2020-03-16 14:12:11 +08:00
})
const OrdercopyDetail = Loadable({
2020-05-20 18:11:32 +08:00
loader: () => import('../Order/CopyDetail'),
loading: Loading,
2020-03-16 14:12:11 +08:00
})
//合并请求
const MergeIndexDetail = Loadable({
2020-05-20 18:11:32 +08:00
loader: () => import('../Merge/merge'),
loading: Loading,
2020-03-16 14:12:11 +08:00
})
const CreateMerge = Loadable({
2020-05-20 18:11:32 +08:00
loader: () => import('../Merge/NewMerge'),
loading: Loading,
2020-03-16 14:12:11 +08:00
})
const MessageCount = Loadable({
2020-05-20 18:11:32 +08:00
loader: () => import('../Merge/MessageCount'),
loading: Loading,
2020-03-16 14:12:11 +08:00
})
2020-06-12 17:58:58 +08:00
const UpdateMerge = Loadable({
loader: () => import('../Merge/UpdateMerge'),
loading: Loading,
})
2020-03-16 14:12:11 +08:00
const MilepostDetail = Loadable({
2020-05-20 18:11:32 +08:00
loader: () => import('../Order/MilepostDetail'),
loading: Loading,
2020-03-16 14:12:11 +08:00
})
const WatchUsers = Loadable({
2020-07-02 14:21:22 +08:00
loader: () => import('../UsersList/watch_users'),
loading: Loading,
})
const PraiseUsers = Loadable({
2020-07-02 14:21:22 +08:00
loader: () => import('../UsersList/praise_users'),
loading: Loading,
})
const ForkUsers = Loadable({
2020-07-02 14:21:22 +08:00
loader: () => import('../UsersList/fork_users'),
loading: Loading,
})
2020-03-16 14:12:11 +08:00
const TrendsIndex = Loadable({
2020-05-20 18:11:32 +08:00
loader: () => import('../Activity/Activity'),
loading: Loading,
2020-03-16 14:12:11 +08:00
})
2020-06-02 18:54:46 +08:00
2020-07-10 15:42:57 +08:00
const DevIndex = Loadable({
loader: () => import('../DevOps/Index'),
loading: Loading,
})
2020-03-16 14:12:11 +08:00
/**
* permissionManager:管理员Reporter报告人员(只有读取权限)Developer开发人员除不能设置仓库信息外
*/
2020-03-24 15:08:57 +08:00
2020-05-20 18:11:32 +08:00
class Detail extends Component {
constructor(props) {
2020-03-16 14:12:11 +08:00
super(props);
2020-05-20 18:11:32 +08:00
this.state = {
projectDetail: undefined,
isManager: false,
isReporter: false,
isDeveloper: false,
project_id: undefined,
watchers_count: undefined,
praises_count: undefined,
forked_count: undefined,
watched: false,
praised: false,
2020-03-16 14:12:11 +08:00
http_url: undefined,
2020-05-20 18:11:32 +08:00
author: undefined,
branchs: undefined,
branchList: undefined,
project: null,
firstSync:false,
2020-07-03 16:32:47 +08:00
secondSync:false,
2020-03-16 14:12:11 +08:00
}
}
2020-05-20 18:11:32 +08:00
componentDidMount = () => {
2020-06-29 14:48:46 +08:00
this.getProject();
2020-03-16 14:12:11 +08:00
}
2020-05-20 18:11:32 +08:00
componentDidUpdate = (prevState) => {
if ((prevState.match.params.projectsId !== this.props.match.params.projectsId)) {
2020-06-29 15:28:24 +08:00
this.getProject();
2020-03-24 16:51:34 +08:00
}
}
getProject = (num) => {
2020-06-29 14:48:46 +08:00
const { projectsId } = this.props.match.params;
2020-06-29 15:28:24 +08:00
const url = `/projects/${projectsId}/simple.json`;
2020-06-29 14:48:46 +08:00
axios.get(url).then((result) => {
if (result && result.data) {
2020-07-02 14:21:22 +08:00
this.setState({
project: result.data
})
if (result.data.type !== 0 && result.data.mirror_status === 1) {
console.log("--------start channel --------");
// 是镜像项目,且未完成迁移
this.canvasChannel();
if(num){
this.setState({
secondSync:true,
firsrtSync:false
})
}else{
this.setState({
firstSync:true,
secondSync:false
})
}
}else{
this.getDetail();
this.setState({
firsrtSync:false,
secondSync:false
})
}
2020-07-02 14:21:22 +08:00
}
})
2020-07-02 14:21:22 +08:00
}
canvasChannel = () => {
2020-07-03 11:17:23 +08:00
const name = window.location.hostname === "localhost" ? "testforgeplus.trustie.net" : window.location.hostname;
const actioncable = require("actioncable");
var project = this.state.project;
2020-07-02 18:22:54 +08:00
var cable = actioncable.createConsumer(`wss://${name}/cable`);
this.canvasChannel1 = cable.subscriptions.create({
channel: `MirrorProjectChannel`,
id: project && project.identifier
}, {
connected: () => {
console.log("###### channel connected! ######");
},
disconnected: () => { },
received: data => {
console.log(`###### ---received data--- ######`);
console.log(data);
if (data) {
this.getDetail();
cable.subscriptions.consumer.disconnect();
}
}
2020-06-29 14:48:46 +08:00
})
}
2020-03-16 14:12:11 +08:00
2020-05-20 18:11:32 +08:00
getDetail = () => {
2020-03-20 20:50:30 +08:00
const { projectsId } = this.props.match.params;
2020-06-29 15:28:24 +08:00
const url = `/repositories/${projectsId}.json`;
2020-05-20 18:11:32 +08:00
axios.get(url).then((result) => {
if (result) {
2020-03-16 14:12:11 +08:00
this.setState({
2020-05-20 18:11:32 +08:00
projectDetail: result.data,
project_id: result.data.project_id,
isManager: result.data.permission && result.data.permission === "Manager",
isReporter: result.data.permission && result.data.permission === "Reporter",
isDeveloper: result.data.permission && result.data.permission === "Developer",
2020-03-16 14:12:11 +08:00
http_url: result.data.clone_url,
2020-05-20 18:11:32 +08:00
author: result.data.author,
praised: result.data.praised,
watched: result.data.watched,
watchers_count: result.data.watchers_count,
praises_count: result.data.praises_count,
forked_count: result.data.forked_count,
2020-03-16 14:12:11 +08:00
})
}
2020-05-20 18:11:32 +08:00
}).catch((error) => { })
2020-03-16 14:12:11 +08:00
}
// 关注和取消关注
2020-05-20 18:11:32 +08:00
focusFunc = (flag) => {
2020-03-16 14:12:11 +08:00
const { project_id } = this.state;
2020-07-02 14:21:22 +08:00
axios({
method: flag ? 'delete' : 'post',
url: `/watchers/${flag ? 'unfollow' : 'follow'}.json`,
params: {
target_type: "project",
id: project_id
}
2020-07-02 14:21:22 +08:00
})
.then(result => {
if (result && result.data.status === 0) {
this.setWatchersCount(result.data.watchers_count, result.data.watched);
}
})
.catch(error => {
console.log(error);
});
2020-03-16 14:12:11 +08:00
}
// 点赞和取消点赞
2020-05-20 18:11:32 +08:00
pariseFunc = (flag) => {
2020-03-16 14:12:11 +08:00
const { project_id } = this.state;
2020-05-20 18:11:32 +08:00
axios({
method: flag ? 'delete' : 'post',
url: `/projects/${project_id}/praise_tread/${flag ? 'unlike' : 'like'}.json`
})
.then(result => {
if (result && result.data.status === 0) {
this.setPraisesCount(result.data.praises_count, result.data.praised)
}
})
.catch(error => {
console.log(error);
});
2020-03-16 14:12:11 +08:00
}
2020-05-20 18:11:32 +08:00
setWatchersCount = (count, is_watched) => {
this.setState({
watched: is_watched,
watchers_count: count
})
}
2020-03-27 17:30:16 +08:00
2020-05-20 18:11:32 +08:00
setPraisesCount = (count, is_praised) => {
this.setState({
praised: is_praised,
praises_count: count
})
}
2020-03-27 17:30:16 +08:00
2020-03-16 14:12:11 +08:00
// fork项目
2020-05-20 18:11:32 +08:00
forkFunc = () => {
2020-03-16 14:12:11 +08:00
const { project_id } = this.state;
const url = `/projects/${project_id}/forks.json`;
2020-05-20 18:11:32 +08:00
axios.post(url).then(result => {
if (result && result.data.status === 0) {
this.props.history.push(`/projects/${result.data.id}/coders`);
2020-04-07 14:03:16 +08:00
this.props.showNotification(result.data.message);
2020-03-16 14:12:11 +08:00
}
2020-05-20 18:11:32 +08:00
}).catch(error => {
2020-03-16 14:12:11 +08:00
console.log(error);
})
}
2020-03-16 14:12:11 +08:00
2020-06-03 09:56:07 +08:00
// 同步镜像
2020-07-02 14:21:22 +08:00
synchronismMirror = () => {
2020-06-03 09:56:07 +08:00
const { repo_id } = this.state.projectDetail;
2020-07-02 14:21:22 +08:00
const url = `/repositories/${repo_id}/sync_mirror.json`;
axios.post(url).then(result => {
if (result && result.data && result.data.status === 0) {
this.getProject(2);
2020-07-02 14:21:22 +08:00
} else {
2020-06-03 09:56:07 +08:00
this.props.showNotification("镜像同步失败!");
}
2020-07-02 14:21:22 +08:00
}).catch(error => {
2020-06-03 09:56:07 +08:00
console.log(error);
})
}
2020-05-20 18:11:32 +08:00
render() {
const { projectDetail, watchers_count, praises_count, forked_count, firstSync , secondSync , isManager, watched, praised, project } = this.state;
2020-03-16 14:12:11 +08:00
const url = this.props.history.location.pathname;
2020-05-20 18:11:32 +08:00
const urlArr = url.split("/");
2020-03-20 21:40:43 +08:00
const urlFlag = (urlArr.length === 3);
2020-03-24 15:40:22 +08:00
2020-03-20 21:40:43 +08:00
const { projectsId } = this.props.match.params;
2020-03-16 14:12:11 +08:00
const { state } = this.props.history.location;
2020-06-05 11:46:56 +08:00
const { current_user } = this.props;
const checkLogin = current_user && current_user.login;
2020-04-24 18:22:45 +08:00
const text = (
projectDetail && projectDetail.forked_from_project_id && projectDetail.fork_info ?
<React.Fragment>
<span>forked from </span>
2020-06-05 16:24:37 +08:00
<Link to={`/users/${projectDetail.fork_info.fork_project_user_login}`} className="show-user-link color-grey-ccc">{projectDetail.fork_info.fork_project_user_name}</Link>
2020-04-24 18:22:45 +08:00
<span> / </span>
2020-05-20 18:11:32 +08:00
<Link to={`/projects/${projectDetail.forked_from_project_id}/coders`} className="color-grey-ccc">{projectDetail.fork_info.fork_form_name}</Link>
</React.Fragment> : ""
);
2020-06-04 18:27:19 +08:00
2020-07-02 14:21:22 +08:00
const common = {
getDetail: this.getDetail
2020-05-28 11:35:57 +08:00
}
2020-05-20 18:11:32 +08:00
return (
2020-03-16 14:12:11 +08:00
<div>
2020-07-02 14:21:22 +08:00
<div className="detailHeader-wrapper">
<div className="normal">
<div className="f-wrap-between pb15" style={{ position: "relative" }}>
<p className="font-22 color-white df flex-1 lineH2 mt15" style={{ alignItems: "center" }}>
2020-07-02 14:21:22 +08:00
{project && project.author &&
<Link to={`/users/${project.author.login}`} className="show-user-link color-white">
{project.author.name}
</Link>
}
<span className="ml5 mr5">/</span>
<span className="hide-1 flex-1 df">
<Link to={`/projects/${projectsId}/coders`} className="color-white font-22">{project && project.name}</Link>
{
projectDetail && projectDetail.forked_from_project_id && projectDetail.fork_info ?
<Tooltip placement={'right'} title={text}>
<Link to={`/projects/${projectDetail.forked_from_project_id}/coders`}
className="ml10" >
<i className="iconfont icon-fork font-18 fl mt6" style={{ color: "#8D90E3" }}></i>
</Link>
</Tooltip> : ""
2020-04-23 16:26:42 +08:00
}
2020-07-02 14:21:22 +08:00
{
2020-07-03 18:09:47 +08:00
projectDetail && projectDetail.type && projectDetail.type !== 0 ?
2020-07-03 10:25:07 +08:00
projectDetail.type === 2 ?
2020-07-03 18:16:16 +08:00
<Tooltip title={"镜像自: " + projectDetail.mirror_url} className="ml5" placement={'right'}>
2020-07-03 18:09:47 +08:00
<i className="iconfont icon-banbenku font-18 mt6" style={{ color: "#8D90E3" }}/>
2020-07-03 10:25:07 +08:00
</Tooltip>:
2020-07-03 18:16:16 +08:00
<Tooltip title={"镜像自: " + projectDetail.mirror_url} className="ml5" placement={'right'}>
2020-07-03 18:09:47 +08:00
<i className="iconfont icon-jingxiang font-18 color-green mt6" />
</Tooltip>
:""
2020-06-03 09:56:07 +08:00
}
2020-07-02 14:21:22 +08:00
</span>
</p>
{
firstSync ? "":
2020-05-20 18:11:32 +08:00
<span className="df mt25">
2020-06-03 09:56:07 +08:00
{
2020-06-04 18:28:26 +08:00
projectDetail && projectDetail.type && projectDetail.type === 2 ?
<a className="synchronism ml30" onClick={this.synchronismMirror}>同步镜像</a> : ""
2020-06-03 09:56:07 +08:00
}
2020-03-24 16:51:34 +08:00
<span className="detail_tag_btn">
2020-05-20 18:11:32 +08:00
<a className="detail_tag_btn_name" onClick={() => this.focusFunc(watched)}>
<img src={watched ? img_focused : img_focus} alt="" width="14px" />
{watched ? '取消关注' : '关注'}
2020-03-24 16:51:34 +08:00
</a>
<Link className="detail_tag_btn_count" to={{ pathname: `/projects/${projectsId}/watch_users`, state }}>
{watchers_count}
2020-06-03 09:56:07 +08:00
</Link>
2020-03-24 16:51:34 +08:00
</span>
<span className="detail_tag_btn">
2020-05-20 18:11:32 +08:00
<a className="detail_tag_btn_name" onClick={() => this.pariseFunc(praised)}>
<img src={praised ? img_parised : img_parise} width="13px" alt="" />
{praised ? '取消点赞' : '点赞'}
2020-03-24 16:51:34 +08:00
</a>
<Link className="detail_tag_btn_count" to={{ pathname: `/projects/${projectsId}/praise_users`, state }}>
{praises_count}
</Link>
2020-03-24 16:51:34 +08:00
</span>
<span className="detail_tag_btn">
<a className="detail_tag_btn_name" onClick={this.forkFunc}>
<img src={img_fork} alt="" width="10px" />Fork</a>
<Link className="detail_tag_btn_count" to={{ pathname: `/projects/${projectsId}/fork_users`, state }}>
{forked_count}
</Link>
2020-03-24 16:51:34 +08:00
</span>
2020-03-16 14:12:11 +08:00
</span>
2020-07-02 14:21:22 +08:00
}
2020-03-16 14:12:11 +08:00
</div>
2020-07-02 14:21:22 +08:00
{
firstSync ? "" :
2020-07-02 14:21:22 +08:00
<div className="f-wrap-between pb20">
2020-05-20 18:11:32 +08:00
<ul className="headerMenu-wrapper">
<li className={(url.indexOf("coders") > -1 || urlFlag) ? "active" : ""}>
<Link to={{ pathname: `/projects/${projectsId}/coders`, state }}>
<img alt="" src={img_1} width="18" />代码库
2020-07-02 14:21:22 +08:00
</Link>
2020-05-20 18:11:32 +08:00
</li>
2020-07-10 15:42:57 +08:00
<li className={(url.indexOf("/orders") > -1 && !(url.indexOf("Milepost") > 0 || url.indexOf("meilpost") > 0 || url.indexOf("tags") > 0)) ? "active" : ""}>
2020-05-20 18:11:32 +08:00
<Link to={{ pathname: `/projects/${projectsId}/orders`, state }}>
<img alt="" src={img_2} width="12" />任务
2020-07-02 14:21:22 +08:00
{projectDetail && projectDetail.issues_count ? <span>{projectDetail.issues_count}</span> : ""}
2020-05-20 18:11:32 +08:00
</Link>
</li>
2020-06-30 18:15:48 +08:00
{
projectDetail && parseInt(projectDetail.type) !== 2 &&
2020-07-02 14:21:22 +08:00
<li className={url.indexOf("merge") > -1 ? "active" : ""}>
<Link to={{ pathname: `/projects/${projectsId}/merge`, state }}>
<img alt="" src={img_3} width="13" />合并请求
{projectDetail && projectDetail.pull_requests_count ? <span>{projectDetail.pull_requests_count}</span> : ""}
</Link>
</li>
2020-06-30 18:15:48 +08:00
}
2020-07-16 09:40:39 +08:00
{/* <li className={url.indexOf("/ops") > -1 ? "active" : ""}>
2020-07-13 15:24:13 +08:00
<Link to={{ pathname: `/projects/${projectsId}/ops`, state }}>
<i className="iconfont icon-gongzuoliu font-13 mr8"></i>
2020-07-15 17:17:31 +08:00
{projectDetail && projectDetail.ops_count ? <span>{projectDetail.ops_count}</span> : ""}
2020-07-13 15:24:13 +08:00
</Link>
2020-07-16 09:40:39 +08:00
</li> */}
2020-07-10 15:42:57 +08:00
<li className={(url.indexOf("/Milepost") > -1 || url.indexOf("meilpost") > -1) ? "active" : ""}>
2020-05-20 18:11:32 +08:00
<Link to={{ pathname: `/projects/${projectsId}/orders/Milepost`, state }}>
<img alt="" src={img_milepost} width="16" />里程碑
2020-07-17 09:45:02 +08:00
{projectDetail && projectDetail.versions_count ? <span>{projectDetail.versions_count}</span> :""}
2020-05-20 18:11:32 +08:00
</Link>
</li>
2020-07-10 15:42:57 +08:00
<li className={url.indexOf("/trends") > -1 ? "active" : ""}>
2020-05-20 18:11:32 +08:00
<Link to={{ pathname: `/projects/${projectsId}/trends`, state }}>
<img alt="" src={img_6} width="16" />动态
2020-07-02 14:21:22 +08:00
</Link>
2020-05-20 18:11:32 +08:00
</li>
{
isManager &&
2020-07-10 15:42:57 +08:00
<li className={url.indexOf("/setting") > 0 ? "active" : ""}><Link to={`/projects/${projectsId}/setting`}><img alt="" src={img_7} width="19" />仓库设置</Link></li>
2020-05-20 18:11:32 +08:00
}
</ul>
</div>
2020-07-02 14:21:22 +08:00
}
2020-03-16 14:12:11 +08:00
</div>
2020-07-02 14:21:22 +08:00
</div>
{
firstSync ?
2020-07-02 14:21:22 +08:00
<Content className="spincontent">
<Spin className="spinstyle" tip={project && `正在从 ${project.mirror_url} 迁移`} size="large">
2020-07-02 14:21:22 +08:00
</Spin>
</Content>
:
<Spin spinning={secondSync} className="spinstyle" tip="正在同步镜像" size="large">
2020-07-02 14:21:22 +08:00
<Switch {...this.props}>
2020-07-10 15:42:57 +08:00
{/* 工作流 */}
<Route path="/projects/:projectsId/ops"
render={
() => (<DevIndex {...this.props} {...this.state} {...common} />)
}
></Route>
2020-07-02 14:21:22 +08:00
{/* 标签列表 */}
<Route path="/projects/:projectsId/orders/tags"
render={
(props) => (<TagList {...this.props} {...props} {...this.state} {...common} />)
}
></Route>
{/* 仓库设置 */}
<Route path="/projects/:projectsId/setting"
render={
(props) => (<Setting {...this.props} {...props} {...this.state} {...common} />)
}
></Route>
{/* 任务详情 */}
<Route path="/projects/:projectsId/orders/:orderId/detail"
render={
(props) => (<OrderDetail {...this.props} {...props} {...this.state} {...common} />)
}
></Route>
{/* 里程碑 */}
<Route path="/projects/:projectsId/orders/Milepost"
render={
(props) => (<OrderMilepost {...this.props} {...props} {...this.state} {...common} />)
}
></Route>
{/* 新建里程碑 */}
<Route path="/projects/:projectsId/orders/meilpost"
render={
(props) => (<OrdernewMilepost {...this.props} {...props} {...this.state} {...common} />)
}
></Route>
{/*里程碑详情*/}
<Route path="/projects/:projectsId/orders/:meilid/MilepostDetail"
render={
(props) => (<MilepostDetail {...this.props} {...props} {...this.state} {...common} />)
}
></Route>
{/*修改里程碑*/}
<Route path="/projects/:projectsId/orders/:meilid/meilpost"
render={
(props) => (<OrderupdateMilepost {...this.props} {...props} {...this.state} {...common} />)
}
></Route>
{/* 里程碑页面新建任务 */}
<Route path="/projects/:projectsId/orders/:milepostId/new"
render={
(props) => (<OrderNew {...this.props} {...props} {...this.state} {...common} />)
}
></Route>
{/* 新建任务 */}
<Route path="/projects/:projectsId/orders/new"
render={
(props) => (<OrderNew {...this.props} {...props} {...this.state} {...common} />)
}
></Route>
{/* 修改详情 */}
<Route path="/projects/:projectsId/orders/:orderId/updatedetail"
render={
(props) => (<OrderupdateDetail {...this.props} {...props} {...this.state} {...common} />)
}
></Route>
{/* 复制详情 */}
<Route path="/projects/:projectsId/orders/:orderId/copyetail"
render={
(props) => (<OrdercopyDetail {...this.props} {...props} {...this.state} {...common} />)
}
></Route>
{/* 动态 */}
<Route path="/projects/:projectsId/trends"
render={
(props) => (<TrendsIndex {...this.props} {...props} {...this.state} {...common} />)
}
></Route>
{/* 代码Index */}
<Route path="/projects/:projectsId/orders"
render={
(props) => (<OrderIndex {...this.props} {...props} {...this.state} {...common} />)
}
></Route>
<Route path="/projects/:projectsId/merge/new"
render={
(props) => (<CreateMerge {...this.props} {...props} {...this.state} {...common} is_fork={true} />)
}
></Route>
<Route path="/projects/:projectsId/merge/:mergeId/UpdateMerge"
render={
(props) => (<UpdateMerge {...this.props} {...props} {...this.state} {...common} />)
}
></Route>
<Route path="/projects/:projectsId/merge/:mergeId/Messagecount"
render={
(props) => (<MessageCount {...this.props} {...props} {...this.state} {...common} />)
}
></Route>
<Route path="/projects/:projectsId/merge/:mergeId/MergeSubmit"
render={
(props) => (<MessageCount {...this.props} {...props} {...this.state} {...common} />)
}
></Route>
<Route path="/projects/:projectsId/merge"
render={
(props) => (<MergeIndexDetail {...this.props} {...props} {...this.state} {...common} />)
}
></Route>
<Route path="/projects/:projectsId/coders/filesurl"
render={
(props) => (<CoderRootIndex {...this.props} {...props} {...this.state} {...common} />)
}
></Route>
<Route path="/projects/:projectsId/coders"
render={
(props) => (<CoderRootIndex {...this.props} {...props} {...this.state} {...common} />)
}
></Route>
<Route path="/projects/:projectsId/watch_users"
render={
(props) => (<WatchUsers {...this.props} {...props} {...this.state} {...common} />)
}
></Route>
<Route path="/projects/:projectsId/praise_users"
render={
(props) => (<PraiseUsers {...this.props} {...props} {...this.state} {...common} />)
}
></Route>
<Route path="/projects/:projectsId/fork_users"
render={
(props) => (<ForkUsers {...this.props} {...props} {...this.state} {...common} />)
}
></Route>
<Route path="/projects/:projectsId"
render={
(props) => (<CoderRootIndex {...this.props} {...props} {...this.state} {...common} />)
}
></Route>
</Switch>
</Spin>
}
2020-03-16 14:12:11 +08:00
</div>
)
}
}
2020-06-11 15:40:22 +08:00
export default Detail;