Merge branch 'develop'
This commit is contained in:
commit
eb58f91dbf
|
@ -14030,13 +14030,13 @@
|
|||
},
|
||||
"qr.js": {
|
||||
"version": "0.0.0",
|
||||
"resolved": "https://registry.npmjs.org/qr.js/-/qr.js-0.0.0.tgz",
|
||||
"resolved": "https://registry.npm.taobao.org/qr.js/download/qr.js-0.0.0.tgz",
|
||||
"integrity": "sha1-ys6GOG9ZoNuAUPqQ2baw6IoeNk8="
|
||||
},
|
||||
"qrcode.react": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/qrcode.react/-/qrcode.react-1.0.0.tgz",
|
||||
"integrity": "sha512-jBXleohRTwvGBe1ngV+62QvEZ/9IZqQivdwzo9pJM4LQMoCM2VnvNBnKdjvGnKyDZ/l0nCDgsPod19RzlPvm/Q==",
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npm.taobao.org/qrcode.react/download/qrcode.react-1.0.1.tgz",
|
||||
"integrity": "sha1-KDS7UOXidf/lr2kG7/FTkf6eOKU=",
|
||||
"requires": {
|
||||
"loose-envify": "^1.4.0",
|
||||
"prop-types": "^15.6.0",
|
||||
|
|
|
@ -63,7 +63,7 @@
|
|||
"postcss-loader": "2.0.8",
|
||||
"promise": "8.0.1",
|
||||
"prop-types": "^15.6.1",
|
||||
"qrcode.react": "^1.0.0",
|
||||
"qrcode.react": "^1.0.1",
|
||||
"qs": "^6.9.3",
|
||||
"quill": "^1.3.7",
|
||||
"quill-delta-to-html": "^0.11.0",
|
||||
|
|
|
@ -205,7 +205,7 @@ class App extends Component {
|
|||
<ConfigProvider locale={zhCN}>
|
||||
<MuiThemeProvider theme={theme}>
|
||||
<LoginDialog {...this.props} {...this.state} Modifyloginvalue={() => this.Modifyloginvalue()}></LoginDialog>
|
||||
<SiderBar />
|
||||
<SiderBar/>
|
||||
<Router>
|
||||
<Switch>
|
||||
{/*项目*/}
|
||||
|
|
|
@ -32,7 +32,7 @@ export function initAxiosInterceptors(props) {
|
|||
// 判断网络是否连接
|
||||
initOnlineOfflineListener();
|
||||
|
||||
var proxy = "http://192.168.1.37:3000";
|
||||
var proxy = "https://testforgeplus.trustie.net";
|
||||
//响应前的设置
|
||||
axios.interceptors.request.use(
|
||||
config => {
|
||||
|
|
|
@ -205,17 +205,33 @@ li.ant-menu-item{
|
|||
|
||||
@media screen and (max-width: 1920px){
|
||||
.-task-sidebar{
|
||||
right:240px;
|
||||
right:220px;
|
||||
}
|
||||
}
|
||||
@media screen and (max-width: 1500px){
|
||||
@media screen and (max-width: 1750px){
|
||||
.-task-sidebar{
|
||||
right:100px;
|
||||
right:160px;
|
||||
}
|
||||
}
|
||||
@media screen and (max-width: 1650px){
|
||||
.-task-sidebar{
|
||||
right:115px;
|
||||
}
|
||||
}
|
||||
@media screen and (max-width: 1550px){
|
||||
.-task-sidebar{
|
||||
right:90px;
|
||||
}
|
||||
}
|
||||
@media screen and (max-width: 1450px){
|
||||
.-task-sidebar{
|
||||
right:45px;
|
||||
}
|
||||
}
|
||||
@media screen and (max-width: 1200px){
|
||||
.-task-sidebar{
|
||||
right:0px;
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
.-task-sidebar>div {
|
||||
|
@ -246,6 +262,9 @@ li.ant-menu-item{
|
|||
.helpBox{
|
||||
width: 260px;
|
||||
z-index: 103;
|
||||
&.shareContent{
|
||||
width: 200px;
|
||||
}
|
||||
.ant-popover-inner-content{
|
||||
padding:0px;
|
||||
}
|
||||
|
@ -281,6 +300,17 @@ li.ant-menu-item{
|
|||
}
|
||||
}
|
||||
}
|
||||
.shareUl{
|
||||
padding:10px 0px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
.titlecontent{
|
||||
margin-right: 20px;
|
||||
}
|
||||
li > i{
|
||||
font-size: 32px!important;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -2,6 +2,7 @@ import React, { useEffect, useState } from 'react';
|
|||
import { Popover , Tooltip } from 'antd';
|
||||
import './Component.scss';
|
||||
import axios from 'axios';
|
||||
import ShareModal from './SiderBarShareModal';
|
||||
|
||||
const $ = window.$;
|
||||
|
||||
|
@ -21,6 +22,7 @@ $(window).scroll(function () {
|
|||
|
||||
function SiderBar() {
|
||||
const [ data , setData ] = useState([]);
|
||||
const [ visible , setVisible ] = useState(false);
|
||||
|
||||
useEffect(()=>{
|
||||
getFAQ();
|
||||
|
@ -48,30 +50,40 @@ function SiderBar() {
|
|||
</ul>
|
||||
</div>
|
||||
}
|
||||
|
||||
function shareContent(){
|
||||
return <div>
|
||||
<ul className="shareUl">
|
||||
<p className="titlecontent">分享到</p>
|
||||
<li onClick={()=>setVisible(true)}><i className="iconfont icon-weixin2" style={{color:"#62b900"}}></i></li>
|
||||
</ul>
|
||||
</div>
|
||||
}
|
||||
return (
|
||||
<div className={"-task-sidebar"} >
|
||||
{
|
||||
data && data.length > 0 && (data[0] && data[0].question) ?
|
||||
<Popover content={content(data)} overlayClassName="helpBox" placement={"left"}>
|
||||
<div className="feedback">
|
||||
<i className="iconfont icon-bangzhu font-22"></i>
|
||||
</div>
|
||||
</Popover>
|
||||
:""
|
||||
}
|
||||
{/* <div className="scan pr" title="微信扫一扫">
|
||||
<span className="inline erweima"><i className="iconfont icon-erweima color-white font-22 fl"></i></span>
|
||||
</div>
|
||||
<div className="consult" title='在线咨询'>
|
||||
<a target="_blank" className="color_white" href="//shang.qq.com/wpa/qunwpa?idkey=2f2043d88c1bd61d182b98bf1e061c6185e23055bec832c07d8148fe11c5a6cd">
|
||||
<i className="iconfont icon-qqzaixianzixun color-white font-22"></i>
|
||||
</a>
|
||||
</div> */}
|
||||
<div className="gotop">
|
||||
<Tooltip title="返回顶部" placement={"left"}>
|
||||
<a><i className="iconfont icon-huidaodingbu1"></i></a>
|
||||
</Tooltip>
|
||||
</div>
|
||||
<ShareModal visible={visible} urlValue={window.location.href} onCancel={()=>setVisible(false)}/>
|
||||
{
|
||||
data && data.length > 0 && (data[0] && data[0].question) ?
|
||||
<Popover content={content(data)} overlayClassName="helpBox" placement={"left"}>
|
||||
<div className="feedback">
|
||||
<i className="iconfont icon-bangzhu font-22"></i>
|
||||
</div>
|
||||
</Popover>
|
||||
:""
|
||||
}
|
||||
{/* <div className="scan pr" title="微信扫一扫">
|
||||
<span className="inline erweima"><i className="iconfont icon-erweima color-white font-22 fl"></i></span>
|
||||
</div>*/}
|
||||
<Popover content={shareContent()} overlayClassName="helpBox shareContent" placement={"left"}>
|
||||
<div className="consult">
|
||||
<i className="iconfont icon-fenxiang1"></i>
|
||||
</div>
|
||||
</Popover>
|
||||
<div className="gotop">
|
||||
<Tooltip title="返回顶部" placement={"right"}>
|
||||
<a><i className="iconfont icon-huidaodingbu1"></i></a>
|
||||
</Tooltip>
|
||||
</div>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
|
|
@ -0,0 +1,27 @@
|
|||
import React from 'react';
|
||||
import { Modal } from 'antd';
|
||||
import QRCode from 'qrcode.react';
|
||||
|
||||
function SiderBarShareModal({visible,urlValue,onCancel}) {
|
||||
return(
|
||||
<Modal
|
||||
title={"分享到微信"}
|
||||
visible={visible}
|
||||
width="500px"
|
||||
closable={true}
|
||||
footer={false}
|
||||
onCancel={onCancel}
|
||||
>
|
||||
<div style={{textAlign:"center"}}>
|
||||
{urlValue &&<QRCode
|
||||
value={urlValue}
|
||||
size={200}
|
||||
fgColor="#000000"
|
||||
style={{margin:"20px"}}
|
||||
/>}
|
||||
<p>打开微信“扫一扫”,点击右上角菜单,即可将网页分享至朋友圈</p>
|
||||
</div>
|
||||
</Modal>
|
||||
)
|
||||
}
|
||||
export default SiderBarShareModal;
|
|
@ -45,19 +45,22 @@ function CoderDepot(props){
|
|||
const [ desc , setDesc ] = useState(undefined);
|
||||
const [ website , setWebsite ] = useState(undefined);
|
||||
const [ lesson_url , setLessonUrl ] = useState(undefined);
|
||||
const [ readme , setReadme ] = useState(undefined)
|
||||
|
||||
const owner = props.match.params.owner;
|
||||
const projectsId = props.match.params.projectsId;
|
||||
const branchName = props.match.params.branchName;
|
||||
const details = props.projectDetail;
|
||||
let pathname = props.history.location.pathname;
|
||||
|
||||
useEffect(()=>{
|
||||
if(props.projectDetail){
|
||||
setProjectDetail(props.projectDetail);
|
||||
setDesc(props.projectDetail.description);
|
||||
setWebsite(props.projectDetail.website);
|
||||
setLessonUrl(props.projectDetail.lesson_url);
|
||||
if(details){
|
||||
setProjectDetail(details);
|
||||
setDesc(details.description);
|
||||
setWebsite(details.website);
|
||||
setLessonUrl(details.lesson_url);
|
||||
}
|
||||
},[props])
|
||||
},[details])
|
||||
|
||||
useEffect(()=>{
|
||||
if(treeValue){
|
||||
|
@ -67,18 +70,19 @@ function CoderDepot(props){
|
|||
}
|
||||
},[treeValue])
|
||||
|
||||
|
||||
useEffect(()=>{
|
||||
if (pathname && projectDetail){
|
||||
if (projectsId && owner){
|
||||
if(pathname.indexOf(`/projects/${owner}/${projectsId}`) > -1 && pathname.indexOf(`/tree/${branchName}/`) > -1) {
|
||||
let url = pathname.split(`/tree/${branchName}/`)[1];
|
||||
setTreeValue(url);
|
||||
getFileInfo(url,branchName);
|
||||
}else{
|
||||
setTreeValue(undefined);
|
||||
getDirInfo(branchName ||projectDetail.default_branch);
|
||||
getDirInfo(branchName ||(projectDetail && projectDetail.default_branch));
|
||||
}
|
||||
}
|
||||
},[pathname,projectDetail])
|
||||
},[projectsId,owner,pathname])
|
||||
|
||||
// 获取主目录列表
|
||||
function getDirInfo(branch){
|
||||
|
@ -98,6 +102,7 @@ function CoderDepot(props){
|
|||
setLastCommitAuthor(c && c.committer);
|
||||
setMainFlag(true);
|
||||
setReadOnly(true);
|
||||
setReadme(result.data.readme);
|
||||
}
|
||||
setTimeout(function(){setIsSpin(false);},500);
|
||||
}).catch(error=>{setIsSpin(false);})
|
||||
|
@ -373,7 +378,7 @@ function CoderDepot(props){
|
|||
(dirInfo && dirInfo.length === 0) && (fileInfo && fileInfo.length === 0) ? <Nodata _html="暂未发现文件"/> :""
|
||||
}
|
||||
{/* readme文件显示(显示文件详情时不显示readme文件) */}
|
||||
{ dirInfo && (projectDetail && projectDetail.readme) ? <ReadMe ChangeFile={ChangeFile} readme={projectDetail && projectDetail.readme} operate={props && (props.isManager || props.isDeveloper) && projectDetail.type !==2 } history={props.history} /> :"" }
|
||||
{ dirInfo && readme ? <ReadMe ChangeFile={ChangeFile} readme={readme} operate={props && (props.isManager || props.isDeveloper) && projectDetail.type !==2 } history={props.history} /> :"" }
|
||||
</div>
|
||||
</LongWidth>
|
||||
{
|
||||
|
|
|
@ -6,20 +6,25 @@ const $ = window.$;
|
|||
|
||||
function CoderDepotReadme({ operate , history , readme , ChangeFile }){
|
||||
const [ menuList ,setMenuList ] = useState(undefined);
|
||||
const [ content ,setContent ] = useState(undefined);
|
||||
|
||||
useEffect(()=>{
|
||||
if(readme && readme.content){
|
||||
let path = history.location.pathname;
|
||||
const items = $.map($("#readme").find("h1,h2,h3,h4,h5,h6"), function (el, _) {
|
||||
const anchor = el.id;
|
||||
const level = el.tagName.replace("H", "");
|
||||
const href = `#${anchor}`;
|
||||
return { href:`${path}${href}`,text:el.textContent , level:level }
|
||||
});
|
||||
setMenuList(items);
|
||||
setContent(readme.content);
|
||||
}
|
||||
},[readme])
|
||||
|
||||
useEffect(()=>{
|
||||
let path = history.location.pathname;
|
||||
const items = $.map($("#readme").find("h1,h2,h3,h4,h5,h6"), function (el, _) {
|
||||
const anchor = el.id;
|
||||
const level = el.tagName.replace("H", "");
|
||||
const href = `#${anchor}`;
|
||||
return { href:`${path}${href}`,text:el.textContent , level:level }
|
||||
});
|
||||
setMenuList(items);
|
||||
},[content])
|
||||
|
||||
function menu(){
|
||||
if(menuList && menuList.length > 0){
|
||||
let hash = history.location.hash;
|
||||
|
@ -54,7 +59,7 @@ function CoderDepotReadme({ operate , history , readme , ChangeFile }){
|
|||
}
|
||||
</div>
|
||||
<div className="commonBox-info">
|
||||
<RenderHtml className="break_word_comments imageLayerParent" value={readme && readme.content} url={history.location}/>
|
||||
<RenderHtml className="break_word_comments imageLayerParent" value={content} url={history.location}/>
|
||||
</div>
|
||||
</div>
|
||||
)
|
||||
|
|
|
@ -0,0 +1,21 @@
|
|||
.i_open{
|
||||
color: #28BD6C!important;
|
||||
}
|
||||
.i_merged{
|
||||
color: #4C9ED3!important;
|
||||
}
|
||||
.i_closed{
|
||||
color: #FA6400!important;
|
||||
}
|
||||
.pr_tags_open{
|
||||
border:1px solid #28BD6C;
|
||||
color: #28BD6C;
|
||||
}
|
||||
.pr_tags_merged{
|
||||
border:1px solid #4C9ED3;
|
||||
color: #4C9ED3;
|
||||
}
|
||||
.pr_tags_closed{
|
||||
border:1px solid #FA6400;
|
||||
color: #FA6400;
|
||||
}
|
|
@ -49,10 +49,12 @@ class MergeItem extends Component {
|
|||
const renderList = () => {
|
||||
if (issues && issues.length > 0) {
|
||||
return issues.map((item, key) => {
|
||||
let status = item.pull_request_staus;
|
||||
return (
|
||||
<div className="issueItem">
|
||||
<div className="flex-1">
|
||||
<p className="mb15 df" style={{ alignItems: "center" }}>
|
||||
<i className={`iconfont icon-hebingqingqiu1 font-14 mr3 i_${status}`}></i>
|
||||
<Link
|
||||
to={`/projects/${owner}/${projectsId}/pulls/${item.pull_request_id}/Messagecount`}
|
||||
className="hide-1 font-15 color-grey-3 fwb lineh-30 mr10"
|
||||
|
@ -60,10 +62,10 @@ class MergeItem extends Component {
|
|||
>
|
||||
{item.name}
|
||||
</Link>
|
||||
<Tag className={`pr_tags_${item.pull_request_staus}`}>
|
||||
{item.pull_request_staus === "merged"
|
||||
<Tag className={`pr_tags_${status}`}>
|
||||
{status === "merged"
|
||||
? "已合并"
|
||||
: item.pull_request_staus === "closed"
|
||||
: status === "closed"
|
||||
? "已拒绝"
|
||||
: "开启的"}
|
||||
</Tag>
|
||||
|
|
|
@ -241,6 +241,34 @@ class MessageCount extends Component {
|
|||
)
|
||||
}
|
||||
|
||||
// 点击按钮复制功能
|
||||
jsCopy = () => {
|
||||
const copyEle = document.querySelector('#descContent') // 获取要复制的节点
|
||||
const range = document.createRange(); // 创造range
|
||||
window.getSelection().removeAllRanges(); //清除页面中已有的selection
|
||||
range.selectNode(copyEle); // 选中需要复制的节点
|
||||
window.getSelection().addRange(range); // 执行选中元素
|
||||
document.execCommand("Copy"); // 执行copy操作
|
||||
}
|
||||
|
||||
mergeabledMes=()=>{
|
||||
return(
|
||||
<div className="clearfix">
|
||||
<p className="fl">该分支存在冲突,无法自动合并,你可以尝试通过如下命令手动合并</p>
|
||||
<i className="iconfont icon-fuzhi font-16 fr" onClick={()=>this.jsCopy()}></i>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
mergeabledDesc=(base,head)=>{
|
||||
return(
|
||||
<ul id="descContent">
|
||||
<li>git fetch origin</li>
|
||||
<li>git checkout -b {`${base}`} origin/{`${base}`}</li>
|
||||
<li>git merge {`${head}`}</li>
|
||||
</ul>
|
||||
)
|
||||
}
|
||||
|
||||
render() {
|
||||
const { projectsId, mergeId , owner } = this.props.match.params;
|
||||
|
||||
|
@ -323,7 +351,6 @@ class MessageCount extends Component {
|
|||
to={`/projects/${owner}/${projectsId}/tree/${data.pull_request.base}`}
|
||||
className="ver-middle"
|
||||
>
|
||||
{/* {data.pull_request.is_fork ? data.pull_request.base : `${data.pull_request.pull_request_user}:${data.pull_request.base}`} */}
|
||||
{data.issue.project_author_name}:{data.pull_request.base}
|
||||
</Link>
|
||||
</Tag>
|
||||
|
@ -388,12 +415,6 @@ class MessageCount extends Component {
|
|||
</div>
|
||||
<div className="ml10">
|
||||
<div className="mt15 text-right" style={{display:"flex",justifyContent:"flex-end"}}>
|
||||
{/* <span className="composeButton">
|
||||
<Dropdown overlay={this.copyItem()} visible={copyVisible} onClick={(e)=>this.setCopyVisible(e)}>
|
||||
<span>复制</span>
|
||||
</Dropdown>
|
||||
<span>下载为<i className="iconfont icon-sanjiaoxing-down color-blue"></i></span>
|
||||
</span> */}
|
||||
{operate && (
|
||||
<Button
|
||||
type="green"
|
||||
|
@ -440,18 +461,14 @@ class MessageCount extends Component {
|
|||
type="success"
|
||||
/>
|
||||
)}
|
||||
{pr_status === 0 && projectDetail && projectDetail.permission !=="Reporter" && (
|
||||
{operate && (
|
||||
<Spin spinning={SpinFlag}>
|
||||
<div
|
||||
style={{
|
||||
display:
|
||||
this.state.mergekey === "rebase"
|
||||
? this.state.buttonshow === "none"
|
||||
? "block"
|
||||
: "none"
|
||||
: !ismesrge
|
||||
? "block"
|
||||
: "none",
|
||||
? this.state.buttonshow === "none" ? "block" : "none"
|
||||
: !ismesrge ? "block" : "none",
|
||||
}}
|
||||
>
|
||||
<p className="mb15">
|
||||
|
@ -460,15 +477,25 @@ class MessageCount extends Component {
|
|||
type="primary"
|
||||
onClick={this.submitmerge}
|
||||
icon={<Icon type="caret-down" />}
|
||||
disabled={!pull_request || (pull_request && !pull_request.mergeable) }
|
||||
>
|
||||
{this.state.mergename}
|
||||
</Dropdown.Button>
|
||||
</p>
|
||||
<Alert
|
||||
message="该合并请求可以进行自动合并操作"
|
||||
type="success"
|
||||
showIcon
|
||||
/>
|
||||
{pull_request && pull_request.mergeable
|
||||
?
|
||||
<Alert
|
||||
message="该合并请求可以进行自动合并操作"
|
||||
type="success"
|
||||
showIcon
|
||||
/>:
|
||||
<Alert
|
||||
message={this.mergeabledMes()}
|
||||
type="error"
|
||||
description={this.mergeabledDesc(pull_request.base,pull_request.head)}
|
||||
showIcon
|
||||
/>
|
||||
}
|
||||
</div>
|
||||
<div>
|
||||
<div
|
||||
|
|
|
@ -5,6 +5,7 @@ import "../Order/order.css";
|
|||
import "../Order/index.scss";
|
||||
import NoneData from "./no_data";
|
||||
import OrderItem from "./MergeItem";
|
||||
import './Index.scss';
|
||||
|
||||
import axios from "axios";
|
||||
|
||||
|
@ -282,6 +283,7 @@ class merge extends Component {
|
|||
className={status_type === "1" ? "active" : ""}
|
||||
onClick={() => this.openorder("1")}
|
||||
>
|
||||
<i className="iconfont icon-hebingqingqiu1 font-14 mr3 i_open"></i>
|
||||
<label>开启的</label>
|
||||
<span>{data && data.open_count}</span>
|
||||
</li>
|
||||
|
@ -289,6 +291,7 @@ class merge extends Component {
|
|||
className={status_type === "11" ? "active" : ""}
|
||||
onClick={() => this.openorder("11")}
|
||||
>
|
||||
<i className="iconfont icon-hebingqingqiu1 font-14 mr3 i_merged"></i>
|
||||
<label>已合并</label>
|
||||
<span>{data && data.merged_issues_size}</span>
|
||||
</li>
|
||||
|
@ -296,6 +299,7 @@ class merge extends Component {
|
|||
className={status_type === "2" ? "active" : ""}
|
||||
onClick={() => this.openorder("2")}
|
||||
>
|
||||
<i className="iconfont icon-hebingqingqiu1 font-14 mr3 i_closed"></i>
|
||||
<label>已拒绝</label>
|
||||
<span>{data && data.close_count}</span>
|
||||
</li>
|
||||
|
|
|
@ -64,7 +64,7 @@ class m_editor extends Component {
|
|||
/>
|
||||
</div>
|
||||
{!readOnly && (
|
||||
<div style={{marginTop:"20px"}}>
|
||||
<div style={{marginTop:"20px",padding:"20px"}}>
|
||||
<UserSubmitComponent
|
||||
{...this.props}
|
||||
{...this.state}
|
||||
|
|
|
@ -553,7 +553,7 @@ class order extends Component {
|
|||
<div className="topWrapper" style={{borderBottom:"none"}}>
|
||||
<div className="target-detail-search">
|
||||
<Search
|
||||
placeholder="输入issue名称进行搜索"
|
||||
placeholder="输入关键字搜索易修"
|
||||
enterButton
|
||||
onSearch={this.searchFunc}
|
||||
style={{ width: 300 }}
|
||||
|
|
|
@ -54,6 +54,7 @@ class Home extends React.Component {
|
|||
this.getSchoolDetail();
|
||||
}
|
||||
|
||||
|
||||
getSchoolDetail() {
|
||||
axios.get(`/schools/${this.state.schoolId}/detail.json`).then(result => {
|
||||
if(result.status === 200){
|
||||
|
|
Loading…
Reference in New Issue