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

892 lines
31 KiB
JavaScript
Raw Normal View History

2020-07-10 15:42:57 +08:00
import React, { Component } from 'react';
2021-09-09 16:09:16 +08:00
import { Spin, Tooltip } from 'antd';
2020-06-11 15:40:22 +08:00
import { Link, Route, Switch } from 'react-router-dom';
2021-08-25 11:34:46 +08:00
import { Content, AlignTop } from '../Component/layout';
2021-03-19 15:46:37 +08:00
import DetailBanner from './sub/DetailBanner';
2022-01-14 17:33:25 +08:00
import cookie from 'react-cookies';
2020-06-22 14:07:06 +08:00
import '../css/index.scss'
2021-08-12 11:45:56 +08:00
import './list.scss';
2020-03-16 14:12:11 +08:00
2021-09-07 13:57:28 +08:00
import { ImageLayerOfCommentHOC } from "../../modules/page/layers/ImageLayerOfCommentHOC";
2020-03-16 14:12:11 +08:00
import Loadable from 'react-loadable';
import Loading from '../../Loading';
import axios from 'axios';
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({
2021-12-13 15:01:03 +08:00
// loader: () => import('../Order/UpdateDetail'),
loader: () => import('../Order/order_form'),
2020-05-20 18:11:32 +08:00
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
})
2022-07-11 11:45:44 +08:00
//合并请求
const QualityAnalyse = Loadable({
loader: () => import('../Quality/index'),
loading: Loading,
})
2020-03-16 14:12:11 +08:00
const CreateMerge = Loadable({
loader: () => import('../Merge/CreateMerge'),
2020-05-20 18:11:32 +08:00
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,
})
2021-03-19 11:35:03 +08:00
const Contribute = Loadable({
loader: () => import('./sub/Contribute'),
loading: Loading,
})
2020-03-16 14:12:11 +08:00
2021-03-18 17:28:53 +08:00
const CoderRootCommit = Loadable({
2021-08-25 11:34:46 +08:00
loader: () => import('./CoderRootCommit'),
loading: Loading,
2021-03-18 17:28:53 +08:00
})
const CoderDepot = Loadable({
2021-08-25 11:34:46 +08:00
loader: () => import('./CoderDepot'),
loading: Loading,
2021-03-18 17:28:53 +08:00
})
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-10-05 18:01:56 +08:00
const DevAbout = Loadable({
loader: () => import('../About/Index'),
loading: Loading,
})
2021-03-29 16:48:23 +08:00
const Source = Loadable({
loader: () => import('../Source/Index'),
loading: Loading,
})
2022-05-12 09:11:59 +08:00
const Server = Loadable({
loader: () => import('../Server/Index'),
loading: Loading,
})
2020-07-10 15:42:57 +08:00
const DevIndex = Loadable({
loader: () => import('../DevOps/Index'),
loading: Loading,
2021-08-04 11:18:21 +08:00
});
const Wiki = Loadable({
loader: () => import('../Wiki/Index'),
loading: Loading,
});
const WikiEdit = Loadable({
loader: () => import('../Wiki/EditWiki'),
loading: Loading,
});
2020-03-16 14:12:11 +08:00
/**
* permissionManager:管理员Reporter报告人员(只有读取权限)Developer开发人员除不能设置仓库信息外
*/
2021-08-25 11:34:46 +08:00
function checkPathname(projectsId, owner, pathname) {
2020-08-19 18:34:52 +08:00
let name = "";
2021-09-01 09:33:22 +08:00
if (pathname && pathname !== `/${owner}/${projectsId}`) {
2021-09-07 13:57:28 +08:00
let url = pathname.split(`/${owner}/${projectsId}`)[1] || "";
2021-08-25 11:34:46 +08:00
if (url.indexOf("/about") > -1) {
name = "about"
} else if (url.indexOf("/issues") > -1 || url.indexOf("Milepost") > 0) {
2020-08-19 18:34:52 +08:00
name = "issues";
} else if (url.indexOf("/pulls") > -1 || url.indexOf("/compare") > -1) {
// /pulls合并请求除新建合并请求外
// /compare新建合并请求
2021-08-25 11:34:46 +08:00
name = "pulls"
} else if (url.indexOf("/milestones") > -1) {
name = "milestones"
} else if (url.indexOf("/activity") > -1) {
name = "activity"
2021-09-03 09:23:12 +08:00
} else if (url.indexOf("/settings") > -1) {
name = "settings"
2021-08-25 11:34:46 +08:00
} else if (url.indexOf(`/devops`) > -1) {
name = "devops"
} else if (url.indexOf(`/source`) > -1) {
name = "source"
} else if (url.indexOf(`/wiki`) > -1) {
name = "wiki"
2022-05-12 09:11:59 +08:00
} else if (url.indexOf(`/server`) > -1) {
name = "server"
2020-08-19 18:34:52 +08:00
}
}
return name;
}
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
branchs: undefined,
branchList: undefined,
project: null,
2021-08-25 11:34:46 +08:00
firstSync: false,
secondSync: false,
open_devops: false,
forkSpin: false,
2020-11-24 18:00:34 +08:00
// 默认分支
2021-08-25 11:34:46 +08:00
defaultBranch: undefined,
2020-10-22 19:34:11 +08:00
// 非本平台项目
2021-08-25 11:34:46 +08:00
platform: 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();
2022-01-14 17:33:25 +08:00
let history = this.props.location;
this.clearIssueCookies(history);
2020-03-16 14:12:11 +08:00
}
2020-05-20 18:11:32 +08:00
componentDidUpdate = (prevState) => {
2020-08-14 10:08:38 +08:00
let prevParam = prevState.match.params;
let propsParam = this.props.match.params;
if (prevState && this.props && (prevParam.projectsId !== propsParam.projectsId || prevParam.owner !== propsParam.owner)) {
2020-06-29 15:28:24 +08:00
this.getProject();
2020-03-24 16:51:34 +08:00
}
2022-01-14 17:33:25 +08:00
this.props.history.listen((history) => {
// 非issue链接地址清除cookie states具体保存和操作在order.js页面
this.clearIssueCookies(history);
})
}
clearIssueCookies=(history)=>{
const { pathname } = history;
const { projectsId , owner } = this.props.match.params;
let currentIssue = pathname.indexOf(`/${owner}/${projectsId}/issues`) === -1;
if (currentIssue) {
cookie.save('states', undefined,{ expires: 0,path:`/` });
}
2020-03-24 16:51:34 +08:00
}
2021-12-13 15:48:31 +08:00
componentWillUnmount() {
this.timerChannel && clearTimeout(this.timerChannel);
}
getProject = (num) => {
2021-08-25 11:34:46 +08:00
const { projectsId, owner } = this.props.match.params;
2020-08-12 18:13:18 +08:00
const url = `/${owner}/${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({
2020-08-26 16:09:27 +08:00
project: result.data,
2021-08-25 11:34:46 +08:00
open_devops: result.data.open_devops,
platform: result.data.platform && result.data.platform !== 'educoder'
2020-07-02 14:21:22 +08:00
})
2020-08-26 16:09:27 +08:00
if (result.data.type !== 0 && result.data.mirror_status === 1) {
console.log("--------start channel --------");
// 是镜像项目,且未完成迁移
this.canvasChannel();
2021-08-25 11:34:46 +08:00
if (num) {
this.setState({
2021-08-25 11:34:46 +08:00
secondSync: true,
firstSync: false
})
2021-08-25 11:34:46 +08:00
} else {
this.setState({
2021-08-25 11:34:46 +08:00
firstSync: true,
secondSync: false
})
}
2021-08-25 11:34:46 +08:00
} else if (result.data.mirror_status === 2) {
this.deleteProjectBack();
} else {
2021-11-18 17:36:03 +08:00
this.getBanner();
this.getDetail();
this.setState({
2021-08-25 11:34:46 +08:00
firstSync: false,
secondSync: false
})
}
2020-07-02 14:21:22 +08:00
}
})
2020-07-02 14:21:22 +08:00
}
2020-08-26 16:09:27 +08:00
// 工作流激活后修改状态
2021-08-25 11:34:46 +08:00
changeOpenDevops = (flag) => {
2022-02-23 14:26:58 +08:00
// this.setState({
// open_devops: flag
// })
this.getProject();
2020-08-26 16:09:27 +08:00
}
/**
*
* @param {*} deleteFlag 同步镜像需要提示成功且未成功的情况下不需要删除项目
*/
canvasChannel = (deleteFlag) => {
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`,
2021-08-18 14:38:11 +08:00
id: project && project.id
}, {
connected: () => {
console.log("###### channel connected! ######");
},
2021-12-13 15:48:31 +08:00
disconnected: () => {
console.log("###### cannot connected! ######");
},
received: data => {
console.log(`###### ---received data--- ######`);
2021-08-25 11:34:46 +08:00
console.log(data);
if (data) {
if(deleteFlag){
this.props.showNotification("镜像同步成功!");
window.location.reload();
}else{
if (data.project && data.project.mirror_status === 2) {
this.deleteProjectBack();
}
this.getDetail();
2021-11-18 17:36:03 +08:00
this.getBanner();
2021-08-25 11:34:46 +08:00
}
2021-08-18 14:38:11 +08:00
this.setState({
2021-08-25 11:34:46 +08:00
firstSync: false,
secondSync: false
2021-08-18 14:38:11 +08:00
});
cable.subscriptions.consumer.disconnect();
}
2021-12-13 15:48:31 +08:00
},
onerror:()=>{
console.log("###### cannot connected! ######");
}
2021-12-13 15:48:31 +08:00
});
this.timerChannel = setTimeout(this.reloadDetail,5000);
}
reloadDetail=()=>{
if(this.state.firstSync||this.state.secondSync){
window.location.reload();
}
2020-06-29 14:48:46 +08:00
}
2021-12-13 15:48:31 +08:00
2020-03-16 14:12:11 +08:00
2021-08-25 11:34:46 +08:00
deleteProjectBack = () => {
const { history } = this.props;
const { projectsId, owner } = this.props.match.params;
axios.delete(`/${owner}/${projectsId}.json`).then(res => {
let hash = '/projects/mirror/new';
if (res && res.data) {
history.push({
pathname: hash,
mirror_status: 2
});
}
else {
window.location.hash = hash;
}
});
}
2020-05-20 18:11:32 +08:00
getDetail = () => {
2021-08-25 11:34:46 +08:00
const { projectsId, owner } = this.props.match.params;
2021-03-18 17:28:53 +08:00
const url = `/${owner}/${projectsId}/detail.json`;
2020-05-20 18:11:32 +08:00
axios.get(url).then((result) => {
2020-08-26 16:09:27 +08:00
if (result && result.data) {
2021-10-13 16:38:43 +08:00
if (result.data.status === 404) {
this.props.history.push('/nopage');
}
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,
2020-10-19 11:45:58 +08:00
isManager: result.data.permission && (result.data.permission === "Manager" || result.data.permission === "Admin" || result.data.permission === "Owner"),
2020-05-20 18:11:32 +08:00
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
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,
2021-08-25 11:34:46 +08:00
defaultBranch: result.data.default_branch
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
}
2021-03-19 15:46:37 +08:00
// 获取动态导航栏菜单
2021-08-25 11:34:46 +08:00
getBanner() {
const { projectsId, owner } = this.props.match.params;
2021-03-19 15:46:37 +08:00
const url = `/${owner}/${projectsId}/menu_list.json`;
2021-08-25 11:34:46 +08:00
axios.get(url).then(result => {
if (result) {
2021-03-19 15:46:37 +08:00
this.setState({
2021-08-25 11:34:46 +08:00
bannerList: result.data
2021-03-19 15:46:37 +08:00
})
}
2021-08-25 11:34:46 +08:00
}).catch(error => { })
2021-03-19 15:46:37 +08:00
}
2020-03-16 14:12:11 +08:00
// 关注和取消关注
2020-05-20 18:11:32 +08:00
focusFunc = (flag) => {
2020-10-22 19:34:11 +08:00
const { platform } = this.state;
2021-08-25 11:34:46 +08:00
if (!platform) return;
2020-10-22 19:34: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-08-14 10:08:38 +08:00
}).then(result => {
if (result && result.data.status === 0) {
this.setWatchersCount(result.data.watchers_count, result.data.watched);
}
2020-07-02 14:21:22 +08:00
})
2021-08-25 11:34:46 +08:00
.catch(error => {
console.log(error);
});
2020-03-16 14:12:11 +08:00
}
// 点赞和取消点赞
2020-05-20 18:11:32 +08:00
pariseFunc = (flag) => {
2020-10-22 19:34:11 +08:00
const { platform } = this.state;
2021-08-25 11:34:46 +08:00
if (!platform) return;
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`
2020-08-14 10:08:38 +08:00
}).then(result => {
if (result && result.data.status === 0) {
this.setPraisesCount(result.data.praises_count, result.data.praised)
}
2020-05-20 18:11:32 +08:00
})
2021-08-25 11:34:46 +08:00
.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-10-22 19:34:11 +08:00
const { platform } = this.state;
2021-08-25 11:34:46 +08:00
if (!platform) return;
this.setState({
2021-08-25 11:34:46 +08:00
forkSpin: true
})
2020-08-14 10:08:38 +08:00
const { current_user } = this.props
2021-08-25 11:34:46 +08:00
const { projectsId, owner } = this.props.match.params;
2020-08-12 18:13:18 +08:00
const url = `/${owner}/${projectsId}/forks.json`;
2020-05-20 18:11:32 +08:00
axios.post(url).then(result => {
if (result && result.data.status === 0) {
if(result.data.message === "fork失败你已拥有了这个项目"){
this.props.history.push(`/${current_user && current_user.login}/${projectsId}`);
return;
}
2021-09-01 09:33:22 +08:00
this.props.history.push(`/${current_user && current_user.login}/${result.data.identifier}`);
2020-04-07 14:03:16 +08:00
this.props.showNotification(result.data.message);
2020-03-16 14:12:11 +08:00
}
this.setState({
2021-08-25 11:34:46 +08:00
forkSpin: false
})
2020-05-20 18:11:32 +08:00
}).catch(error => {
this.setState({
2021-08-25 11:34:46 +08:00
forkSpin: false
})
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-10-22 19:34:11 +08:00
const { platform } = this.state;
2021-08-25 11:34:46 +08:00
if (!platform) return;
const { projectsId, owner } = this.props.match.params;
2020-08-12 18:13:18 +08:00
const url = `/${owner}/${projectsId}/sync_mirror.json`;
2020-07-02 14:21:22 +08:00
axios.post(url).then(result => {
if (result && result.data && result.data.status === 0) {
this.setState({
secondSync:true
})
this.canvasChannel(true);
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);
})
}
2021-08-25 11:34:46 +08:00
textFunc = (forked_from_project_id, fork_info) => {
let type = fork_info && fork_info.fork_project_user_type;
2021-06-09 17:37:04 +08:00
return forked_from_project_id && fork_info ?
<div className="color-grey-9 df">
<span>复刻自</span>
2021-08-30 10:31:51 +08:00
<Link to={`/${fork_info.fork_project_user_login}`} className="show-user-link color-grey-6 ml5">{fork_info.fork_project_user_name}</Link>
2021-06-09 17:37:04 +08:00
<span> / </span>
2021-09-01 09:33:22 +08:00
<Link to={`/${fork_info.fork_project_user_login}/${fork_info.fork_project_identifier}`} className="color-grey-6 task-hide flex1" style={{ maxWidth: "400px" }} title={fork_info.fork_form_name}>{fork_info.fork_form_name}</Link>
2021-06-09 17:37:04 +08:00
</div> : ""
}
2021-08-12 11:45:56 +08:00
2020-08-19 18:34:52 +08:00
2020-05-20 18:11:32 +08:00
render() {
2021-08-25 11:34:46 +08:00
const { projectDetail, watchers_count, praises_count,
forked_count, firstSync, secondSync,
isManager, watched, praised,
project, open_devops, platform, defaultBranch, bannerList, forkSpin } = 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
2021-08-25 11:34:46 +08:00
const { projectsId, owner } = this.props.match.params;
2021-06-04 09:43:38 +08:00
const { current_user } = this.props;
2021-08-25 11:34:46 +08:00
let pathname = checkPathname(projectsId, owner, url);
2020-03-16 14:12:11 +08:00
const { state } = this.props.history.location;
2021-08-25 11:34:46 +08:00
2020-07-02 14:21:22 +08:00
const common = {
2020-08-26 16:09:27 +08:00
getDetail: this.getDetail,
2022-04-01 19:19:15 +08:00
getBanner:this.getBanner,
2021-08-25 11:34:46 +08:00
changeOpenDevops: this.changeOpenDevops,
2020-11-24 18:00:34 +08:00
defaultBranch
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">
2021-09-09 17:50:46 +08:00
<AlignTop style={{ padding: "18px 0px 10px", justifyContent: "space-between" }}>
<div>
<AlignTop>
<div className="projectallName">
{project && project.author &&
2021-08-30 10:31:51 +08:00
<Link to={`/${project.author.login}`}>{project.author.name}</Link>
}
<span className="ml5 mr5">/</span>
2021-09-01 09:33:22 +08:00
<Link to={`/${owner}/${projectsId}`} className="projectN mt6">{projectDetail && projectDetail.name}</Link>
</div>
2021-08-25 11:34:46 +08:00
{projectDetail && projectDetail.private && <span className="privateTag mt6">私有</span>}
2021-12-09 17:31:34 +08:00
{ !platform && <span className="privateTag red mt6">只读</span> }
</AlignTop>
<div className="mt8">
{
projectDetail && projectDetail.forked_from_project_id && projectDetail.fork_info ?
2021-08-25 11:34:46 +08:00
this.textFunc(projectDetail.forked_from_project_id, projectDetail.fork_info)
: ""
2020-06-03 09:56:07 +08:00
}
</div>
</div>
<div>
{
2021-08-25 11:34:46 +08:00
firstSync ? "" :
<span className="df">
{
2021-08-25 11:34:46 +08:00
((current_user && current_user.admin) || isManager) && (projectDetail && projectDetail.type && projectDetail.type === 2) ?
<a className="synchronism ml30" onClick={this.synchronismMirror}>同步镜像</a> : ""
}
2021-09-09 16:09:16 +08:00
<span className="detail_tag_btn">
2021-08-25 11:34:46 +08:00
<a className="detail_tag_btn_name" style={{ cursor: platform ? "pointer" : "default" }} onClick={() => this.focusFunc(watched)}>
<i className={watched ? "iconfont icon-shixing color-orange font-16 mr3" : "iconfont icon-kongxing color-grey-9 font-16 mr3"}></i>
<span>{watched ? '取消关注' : '关注'}</span>
</a>
2021-08-25 11:34:46 +08:00
{
watchers_count > 0 ?
platform ?
2021-09-09 16:09:16 +08:00
<Link className="detail_tag_btn_count" style={{ color: `#666` }} to={platform ? { pathname: `/${owner}/${projectsId}/following`, state } : ""}>
2021-08-25 11:34:46 +08:00
{watchers_count}
</Link>
:
<span className="detail_tag_btn_count">{watchers_count}</span>
: ""
}
2021-09-09 16:09:16 +08:00
</span>
<span className="detail_tag_btn">
2021-08-25 11:34:46 +08:00
<a className="detail_tag_btn_name" style={{ cursor: platform ? "pointer" : "default" }} onClick={() => this.pariseFunc(praised)}>
<i className={praised ? "iconfont icon-weibiaoti105 color-orange font-14 mr3" : "iconfont icon-guanzhu color-grey-9 font-14 mr3"}></i>
<span>{praised ? '取消点赞' : '点赞'}</span>
</a>
{
praises_count > 0 ?
platform ?
2021-09-09 16:09:16 +08:00
<Link className="detail_tag_btn_count" style={{ color: `#666` }} to={{ pathname: `/${owner}/${projectsId}/stargazers`, state }}>
2021-08-25 11:34:46 +08:00
{praises_count}
</Link> :
<span className="detail_tag_btn_count">{praises_count}</span>
: ""
}
2021-09-09 16:09:16 +08:00
</span>
<span className="detail_tag_btn" loading={forkSpin}>
2021-08-25 11:34:46 +08:00
<Tooltip title="复刻是fork的中文名即复制代码仓库" placement="bottom">
<a className="detail_tag_btn_name" style={{ cursor: platform ? "pointer" : "default" }} onClick={this.forkFunc}>
2021-10-14 09:43:00 +08:00
<i className="iconfont icon-fork color-grey-9 mr3 font-16"></i><span>(Fork)</span>
2021-08-25 11:34:46 +08:00
</a>
</Tooltip>
{
forked_count > 0 ?
platform ?
2021-09-03 11:38:22 +08:00
<Link className="detail_tag_btn_count" to={{ pathname: `/${owner}/${projectsId}/members`, state }}>
2021-08-25 11:34:46 +08:00
{forked_count}
</Link>
:
<span className="detail_tag_btn_count">{forked_count}</span>
: ""
}
2021-09-09 16:09:16 +08:00
</span>
2021-08-12 11:45:56 +08:00
</span>
}
2021-06-09 17:37:04 +08:00
</div>
2021-10-22 13:56:34 +08:00
</AlignTop>
{/* <div className="mt6" style={{minHeight:"20px"}}>
2021-08-13 17:12:56 +08:00
{
projectDetail && projectDetail.forked_from_project_id && projectDetail.fork_info ?
this.textFunc(projectDetail.forked_from_project_id,projectDetail.fork_info)
:""
}
{
projectDetail && projectDetail.type && projectDetail.type !== 0 ?
<span className="color-grey-9">镜像自 <a className="color-blue hoverLine" target="_blank" href={projectDetail.mirror_url}>{projectDetail.mirror_url}</a></span>
:""
}
2021-10-22 13:56:34 +08:00
</div> */}
2020-07-02 14:21:22 +08:00
{
firstSync ? "" :
2021-08-25 11:34:46 +08:00
<DetailBanner
history={this.props.history}
list={bannerList}
owner={owner}
projectsId={projectsId}
pathname={pathname}
state={state}
projectDetail={projectDetail}
open_devops={open_devops}
platform={platform}
urlFlag={urlFlag}
2022-05-26 16:30:19 +08:00
showNotification={this.props.showNotification}
current_user={current_user}
2021-08-25 11:34:46 +08:00
/>
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 ?
2021-08-25 11:34:46 +08:00
<Content className="spincontent">
<Spin className="spinstyle" tip={project && `正在从 ${project.mirror_url} 迁移`} size="large" />
</Content>
:
<Spin spinning={secondSync} className="spinstyle" tip="正在同步镜像" size="large">
<Switch {...this.props}>
2022-05-12 09:11:59 +08:00
{/* 服务 */}
<Route path="/:owner/:projectsId/server"
render={
() => (<Server {...this.props} {...this.state} {...common} />)
}
></Route>
2021-08-25 11:34:46 +08:00
{/* 资源 */}
2021-09-01 09:33:22 +08:00
<Route path="/:owner/:projectsId/source"
2021-08-25 11:34:46 +08:00
render={
() => (<Source {...this.props} {...this.state} {...common} />)
}
></Route>
{/* 主页 */}
2021-09-01 09:33:22 +08:00
<Route path="/:owner/:projectsId/about"
2021-08-25 11:34:46 +08:00
render={
() => (<DevAbout {...this.props} {...this.state} {...common} />)
}
></Route>
{/* wiki新增文件 */}
2021-09-01 09:33:22 +08:00
<Route path="/:owner/:projectsId/wiki/add"
2021-08-25 11:34:46 +08:00
render={
() => (<WikiEdit {...this.props} {...this.state} {...common} />)
}
></Route>
{/* wiki编辑文件 */}
2021-09-01 09:33:22 +08:00
<Route path="/:owner/:projectsId/wiki/edit/:wikiName"
2021-08-25 11:34:46 +08:00
render={
() => (<WikiEdit {...this.props} {...this.state} {...common} />)
}
></Route>
{/* wiki */}
2021-09-01 09:33:22 +08:00
<Route path="/:owner/:projectsId/wiki"
2021-08-25 11:34:46 +08:00
render={
() => (<Wiki {...this.props} {...this.state} {...common} />)
}
></Route>
{/* 工作流 */}
2021-09-01 09:33:22 +08:00
<Route path="/:owner/:projectsId/devops"
2021-08-25 11:34:46 +08:00
render={
() => (<DevIndex {...this.props} {...this.state} {...common} />)
}
></Route>
{/* 标签列表 */}
2021-09-01 09:33:22 +08:00
<Route path="/:owner/:projectsId/issues/tags"
2021-08-25 11:34:46 +08:00
render={
(props) => (<TagList {...this.props} {...props} {...this.state} {...common} />)
}
></Route>
{/* 仓库设置 */}
2021-09-03 09:23:12 +08:00
<Route path="/:owner/:projectsId/settings"
2021-08-25 11:34:46 +08:00
render={
(props) => (<Setting {...this.props} {...props} {...this.state} {...common} />)
}
></Route>
2021-09-03 09:23:12 +08:00
2021-08-25 11:34:46 +08:00
{/*修改里程碑*/}
2021-09-01 09:33:22 +08:00
<Route path="/:owner/:projectsId/milestones/:meilid/edit"
2021-08-25 11:34:46 +08:00
render={
(props) => (<OrderupdateMilepost {...this.props} {...props} {...this.state} {...common} />)
}
></Route>
{/* 新建里程碑 */}
2021-09-01 09:33:22 +08:00
<Route path="/:owner/:projectsId/milestones/new"
2021-08-25 11:34:46 +08:00
render={
(props) => (<OrdernewMilepost {...this.props} {...props} {...this.state} {...common} />)
}
></Route>
{/*里程碑详情*/}
2021-09-01 09:33:22 +08:00
<Route path="/:owner/:projectsId/milestones/:meilid"
2021-08-25 11:34:46 +08:00
render={
(props) => (<MilepostDetail {...this.props} {...props} {...this.state} {...common} />)
}
></Route>
{/* 里程碑 */}
2021-09-01 09:33:22 +08:00
<Route path="/:owner/:projectsId/milestones"
2021-08-25 11:34:46 +08:00
render={
(props) => (<OrderMilepost {...this.props} {...props} {...this.state} {...common} />)
}
></Route>
{/* 里程碑页面新建任务 */}
2021-09-01 09:33:22 +08:00
<Route path="/:owner/:projectsId/issues/:milepostId/new"
2021-08-25 11:34:46 +08:00
render={
(props) => (<OrderNew {...this.props} {...props} {...this.state} {...common} />)
}
></Route>
{/* 新建任务 */}
2021-09-01 09:33:22 +08:00
<Route path="/:owner/:projectsId/issues/new"
2021-08-25 11:34:46 +08:00
render={
(props) => (<OrderNew {...this.props} {...props} {...this.state} {...common} />)
}
></Route>
2021-12-13 15:01:03 +08:00
{/* 修改详情 edit*/}
<Route path="/:owner/:projectsId/issues/:orderId/edit"
2021-08-25 11:34:46 +08:00
render={
2021-12-13 15:01:03 +08:00
(props) => (<OrderupdateDetail {...this.props} {...props} {...this.state} {...common} form_type={"edit"}/>)
2021-08-25 11:34:46 +08:00
}
></Route>
2021-09-29 17:25:36 +08:00
{/* 复制详情 copyetail*/}
<Route path="/:owner/:projectsId/issues/:orderId/copyetail"
2021-09-29 17:25:36 +08:00
render={
2021-12-13 15:01:03 +08:00
(props) => (<OrderupdateDetail {...this.props} {...props} {...this.state} {...common} form_type={"copy"}/>)
2021-09-29 17:25:36 +08:00
}
2021-09-03 09:23:12 +08:00
></Route>
2021-09-03 09:23:12 +08:00
{/* 任务详情 */}
<Route path="/:owner/:projectsId/issues/:orderId"
render={
(props) => (<OrderDetail {...this.props} {...this.state} {...props} {...common} />)
}
2021-08-25 11:34:46 +08:00
></Route>
{/* 动态 */}
2022-07-11 11:45:44 +08:00
{/* <Route path="/:owner/:projectsId/activity"
2021-08-25 11:34:46 +08:00
render={
(props) => (<TrendsIndex {...this.props} {...props} {...this.state} {...common} />)
}
2022-07-11 11:45:44 +08:00
></Route> */}
<Route path="/:owner/:projectsId/sonar"
render={
(props) => (<QualityAnalyse {...this.props} {...props} {...this.state} {...common} />)
}
2021-08-25 11:34:46 +08:00
></Route>
{/* 代码Index */}
2021-09-01 09:33:22 +08:00
<Route path="/:owner/:projectsId/issues"
2021-08-25 11:34:46 +08:00
render={
(props) => (<OrderIndex {...this.props} {...props} {...this.state} {...common} />)
}
></Route>
{/* 新建合并请求 */}
{/* <Route path="/:owner/:projectsId/compare/:branch"
2021-08-25 11:34:46 +08:00
render={
(props) => (<CreateMerge {...this.props} {...props} {...this.state} {...common} is_fork={true} />)
}
></Route> */}
<Route path="/:owner/:projectsId/compare"
2021-08-25 11:34:46 +08:00
render={
(props) => (<CreateMerge {...this.props} {...props} {...this.state} {...common} is_fork={true} />)
}
></Route>
2021-10-13 16:38:43 +08:00
<Route path="/:owner/:projectsId/pulls/:mergeId/edit"
2021-08-25 11:34:46 +08:00
render={
(props) => (<UpdateMerge {...this.props} {...props} {...this.state} {...common} />)
}
></Route>
<Route path="/:owner/:projectsId/pulls/:mergeId"
render={
(props) => (<MessageCount {...this.props} {...props} {...this.state} {...common} />)
}
></Route>
<Route path="/:owner/:projectsId/pulls/:mergeId/commits"
render={
(props) => (<MessageCount {...this.props} {...props} {...this.state} {...common} />)
}
></Route>
<Route path="/:owner/:projectsId/pulls/:mergeId/files"
2021-08-25 11:34:46 +08:00
render={
(props) => (<MessageCount {...this.props} {...props} {...this.state} {...common} />)
}
></Route>
2021-09-01 09:33:22 +08:00
<Route path="/:owner/:projectsId/pulls/:mergeId/MergeSubmit"
2021-08-25 11:34:46 +08:00
render={
(props) => (<MessageCount {...this.props} {...props} {...this.state} {...common} />)
}
></Route>
2020-07-02 14:21:22 +08:00
2021-09-01 09:33:22 +08:00
<Route path="/:owner/:projectsId/pulls"
2021-08-25 11:34:46 +08:00
render={
(props) => (<MergeIndexDetail {...this.props} {...props} {...this.state} {...common} />)
}
></Route>
<Route path="/:owner/:projectsId/following"
2021-08-25 11:34:46 +08:00
render={
(props) => (<WatchUsers {...this.props} {...props} {...this.state} {...common} />)
}
></Route>
2021-09-01 09:33:22 +08:00
<Route path="/:owner/:projectsId/stargazers"
2021-08-25 11:34:46 +08:00
render={
(props) => (<PraiseUsers {...this.props} {...props} {...this.state} {...common} />)
}
></Route>
2021-09-03 11:38:22 +08:00
<Route path="/:owner/:projectsId/members"
2021-08-25 11:34:46 +08:00
render={
(props) => (<ForkUsers {...this.props} {...props} {...this.state} {...common} />)
}
></Route>
{/* 贡献者列表 */}
2021-09-01 09:33:22 +08:00
<Route path="/:owner/:projectsId/contribute"
2021-08-25 11:34:46 +08:00
render={
() => (<Contribute {...this.props} {...this.state} {...common} />)
}
></Route>
2021-03-18 17:28:53 +08:00
2021-08-25 11:34:46 +08:00
{/* 代码库----详情页面 */}
2021-09-01 09:33:22 +08:00
<Route path="/:owner/:projectsId/commits/branch/:branchName"
2021-08-25 11:34:46 +08:00
render={
(props) => (<CoderRootCommit {...this.props} {...props} {...this.state} {...common} />)
}
></Route>
2021-09-01 09:33:22 +08:00
<Route path="/:owner/:projectsId/tree/:branchName"
2021-08-25 11:34:46 +08:00
render={
(props) => (<CoderDepot {...this.props} {...props} {...this.state} {...common} />)
}
></Route>
2021-09-01 09:33:22 +08:00
<Route path="/:owner/:projectsId/:subIndex"
2021-08-25 11:34:46 +08:00
render={
(props) => (<CoderRootIndex {...this.props} {...props} {...this.state} {...common} />)
}
></Route>
2021-09-01 09:33:22 +08:00
<Route path="/:owner/:projectsId"
2021-08-25 11:34:46 +08:00
render={
(props) => (<CoderDepot {...this.props} {...props} {...this.state} {...common} />)
}
></Route>
</Switch>
</Spin>
2020-07-02 14:21:22 +08:00
}
2020-03-16 14:12:11 +08:00
</div>
)
}
}
2021-09-07 13:57:28 +08:00
export default ImageLayerOfCommentHOC({
imgSelector: ".imageLayerParent img, .imageLayerParent .imageTarget",
parentSelector: ".newContainer",
})(Detail);