forked from Gitlink/forgeplus-react
Merge pull request '20220507周里程碑内容' (#370) from gitlink_server into pre_gitlink_server
This commit is contained in:
commit
62f4a0417f
|
@ -1,8 +1,8 @@
|
||||||
@font-face {
|
@font-face {
|
||||||
font-family: "iconfont"; /* Project id 2340181 */
|
font-family: "iconfont"; /* Project id 2340181 */
|
||||||
src: url('iconfont.woff2?t=1649726899310') format('woff2'),
|
src: url('iconfont.woff2?t=1651041108151') format('woff2'),
|
||||||
url('iconfont.woff?t=1649726899310') format('woff'),
|
url('iconfont.woff?t=1651041108151') format('woff'),
|
||||||
url('iconfont.ttf?t=1649726899310') format('truetype');
|
url('iconfont.ttf?t=1651041108151') format('truetype');
|
||||||
}
|
}
|
||||||
|
|
||||||
.iconfont {
|
.iconfont {
|
||||||
|
@ -13,6 +13,10 @@
|
||||||
-moz-osx-font-smoothing: grayscale;
|
-moz-osx-font-smoothing: grayscale;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.icon-personal-center:before {
|
||||||
|
content: "\e927";
|
||||||
|
}
|
||||||
|
|
||||||
.icon-bangzhuzhongxinicon:before {
|
.icon-bangzhuzhongxinicon:before {
|
||||||
content: "\e926";
|
content: "\e926";
|
||||||
}
|
}
|
||||||
|
|
File diff suppressed because one or more lines are too long
|
@ -5,6 +5,13 @@
|
||||||
"css_prefix_text": "icon-",
|
"css_prefix_text": "icon-",
|
||||||
"description": "",
|
"description": "",
|
||||||
"glyphs": [
|
"glyphs": [
|
||||||
|
{
|
||||||
|
"icon_id": "29206429",
|
||||||
|
"name": "personal-center",
|
||||||
|
"font_class": "personal-center",
|
||||||
|
"unicode": "e927",
|
||||||
|
"unicode_decimal": 59687
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"icon_id": "28888753",
|
"icon_id": "28888753",
|
||||||
"name": "帮助中心icon",
|
"name": "帮助中心icon",
|
||||||
|
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -93,6 +93,9 @@ body {
|
||||||
.editormd-preview .markdown-body{
|
.editormd-preview .markdown-body{
|
||||||
padding:0px !important;
|
padding:0px !important;
|
||||||
}
|
}
|
||||||
|
.editormd-preview{
|
||||||
|
width: 50%!important;
|
||||||
|
}
|
||||||
|
|
||||||
/* 图片点击放大的场景,隐藏图片链接 */
|
/* 图片点击放大的场景,隐藏图片链接 */
|
||||||
.editormd-image-click-expand .editormd-image-dialog {
|
.editormd-image-click-expand .editormd-image-dialog {
|
||||||
|
|
|
@ -25,7 +25,7 @@ if (isDev) {
|
||||||
}
|
}
|
||||||
debugType = window.location.search.indexOf('debug=t') !== -1 ? 'teacher' :
|
debugType = window.location.search.indexOf('debug=t') !== -1 ? 'teacher' :
|
||||||
window.location.search.indexOf('debug=s') !== -1 ? 'student' :
|
window.location.search.indexOf('debug=s') !== -1 ? 'student' :
|
||||||
window.location.search.indexOf('debug=a') !== -1 ? 'admin' : parsed.debug || 'admin'
|
window.location.search.indexOf('debug=a') !== -1 ? 'admin' : parsed.debug || 'student'
|
||||||
}
|
}
|
||||||
window._debugType = debugType;
|
window._debugType = debugType;
|
||||||
export function initAxiosInterceptors(props) {
|
export function initAxiosInterceptors(props) {
|
||||||
|
|
|
@ -436,7 +436,7 @@ function CoderDepot(props){
|
||||||
<div className="addOptionBtn">
|
<div className="addOptionBtn">
|
||||||
{
|
{
|
||||||
baseOperate &&
|
baseOperate &&
|
||||||
<CheckProfile {...props} sureFunc={()=>urlLink(`/${owner}/${projectsId}/compare/master...${turnbar(branchName || defaultBranch)}`)} >+ 合并请求</CheckProfile>
|
<CheckProfile {...props} sureFunc={()=>urlLink(`/${owner}/${projectsId}/compare/${turnbar(branchName || defaultBranch)}...${turnbar(branchName || defaultBranch)}`)} >+ 合并请求</CheckProfile>
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
issuesFlag &&
|
issuesFlag &&
|
||||||
|
|
|
@ -14,8 +14,8 @@ function Index(props) {
|
||||||
const [ isSpin , setIsSpin ] = useState(true);
|
const [ isSpin , setIsSpin ] = useState(true);
|
||||||
|
|
||||||
const { projectsId , owner } = props.match.params;
|
const { projectsId , owner } = props.match.params;
|
||||||
const { isManager , isDeveloper , projectDetail } = props;
|
const { isManager , isDeveloper , projectDetail , defaultBranch } = props;
|
||||||
|
|
||||||
useEffect(()=>{
|
useEffect(()=>{
|
||||||
getList();
|
getList();
|
||||||
},[])
|
},[])
|
||||||
|
@ -85,7 +85,7 @@ function Index(props) {
|
||||||
<div className="treeabout">
|
<div className="treeabout">
|
||||||
{
|
{
|
||||||
(isManager || isDeveloper) && (projectDetail && projectDetail.type!==2) &&
|
(isManager || isDeveloper) && (projectDetail && projectDetail.type!==2) &&
|
||||||
<Link to={`/${owner}/${projectsId}/compare/master...${turnbar(i.name)}`} className="btn-83">+ 合并请求</Link>
|
<Link to={`/${owner}/${projectsId}/compare/${turnbar(defaultBranch)}...${turnbar(i.name)}`} className="btn-83">+ 合并请求</Link>
|
||||||
}
|
}
|
||||||
<Dropdown overlay={menu(i.zip_url,i.tar_url)} trigger={['click']} placement="bottomRight">
|
<Dropdown overlay={menu(i.zip_url,i.tar_url)} trigger={['click']} placement="bottomRight">
|
||||||
<a className="btn-83 ml15">下载<i className="iconfont icon-sanjiaoxing-down font-14"></i></a>
|
<a className="btn-83 ml15">下载<i className="iconfont icon-sanjiaoxing-down font-14"></i></a>
|
||||||
|
|
|
@ -116,68 +116,45 @@ class CreateMerge extends Component {
|
||||||
this.setState({ isSpin: true });
|
this.setState({ isSpin: true });
|
||||||
const { pullOwner, pullBranch, mergeOwner, mergeBranch, projectId } = branchParams;
|
const { pullOwner, pullBranch, mergeOwner, mergeBranch, projectId } = branchParams;
|
||||||
const url = `/${pullOwner}/${projectId}/pulls/new.json`;
|
const url = `/${pullOwner}/${projectId}/pulls/new.json`;
|
||||||
axios
|
axios.get(url).then((result) => {
|
||||||
.get(url)
|
if (result) {
|
||||||
.then((result) => {
|
if(init){
|
||||||
if (result) {
|
//页面初始化时调用selectProjectName,给is_original、fork_project_id、merge_user_login赋值
|
||||||
if(init){
|
const initUser = result.data.projects_names && result.data.projects_names.filter((item)=>item.project_user_login === branchParams.mergeOwner);
|
||||||
//页面初始化时调用selectProjectName,给is_original、fork_project_id、merge_user_login赋值
|
initUser && initUser[0] && this.selectProjectName(initUser[0].id,false,{projects_names: result.data.projects_names,id: result.data.id});
|
||||||
const initUser = result.data.projects_names && result.data.projects_names.filter((item)=>item.project_user_login === branchParams.mergeOwner);
|
|
||||||
initUser && initUser[0] && this.selectProjectName(initUser[0].id,false,{projects_names: result.data.projects_names,id: result.data.id});
|
|
||||||
}
|
|
||||||
this.setState({isSpin: false});
|
|
||||||
// 如果url上的分支不存在,取默认值master
|
|
||||||
const noMergeBranch =
|
|
||||||
(result.data.branches || []).filter(
|
|
||||||
(branch) => branch.name === returnbar(mergeBranch)
|
|
||||||
).length === 0;
|
|
||||||
const noPullBranch =
|
|
||||||
(result.data.branches || []).filter(
|
|
||||||
(branch) => branch.name === returnbar(pullBranch)
|
|
||||||
).length === 0;
|
|
||||||
this.setState({
|
|
||||||
// isFork: result.data.is_fork,
|
|
||||||
projects_names: result.data.projects_names,
|
|
||||||
mergeProjects: result.data.merge_projects,
|
|
||||||
pullBranches: result.data.branches,
|
|
||||||
mergeBranches: result.data.branches,
|
|
||||||
project_id: result.data.project_id,
|
|
||||||
id: result.data.id,
|
|
||||||
merge: returnbar(mergeBranch),
|
|
||||||
pull: returnbar(pullBranch),
|
|
||||||
});
|
|
||||||
|
|
||||||
//判断源分支是否存在
|
|
||||||
if(noPullBranch){
|
|
||||||
this.setState({
|
|
||||||
showMessage: true,
|
|
||||||
defaultMessage:'源分支不存在',
|
|
||||||
isCompareSpin: false,
|
|
||||||
});
|
|
||||||
}else{
|
|
||||||
if(pullOwner === returnbar(mergeOwner)){
|
|
||||||
if (!noMergeBranch) {
|
|
||||||
this.compareProject(true, branchParams);
|
|
||||||
} else {
|
|
||||||
this.setState({
|
|
||||||
showMessage: true,
|
|
||||||
defaultMessage:'目标分支不存在',
|
|
||||||
isCompareSpin: false,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}else{
|
|
||||||
this.getBranchList(branchParams);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
this.setState({ isSpin: false });
|
this.setState({
|
||||||
})
|
// isFork: result.data.is_fork,
|
||||||
.catch((error) => {
|
projects_names: result.data.projects_names,
|
||||||
this.setState({ isSpin: false });
|
mergeProjects: result.data.merge_projects,
|
||||||
console.log(error);
|
// pullBranches: result.data.branches,
|
||||||
});
|
// mergeBranches: result.data.branches,
|
||||||
|
project_id: result.data.project_id,
|
||||||
|
id: result.data.id,
|
||||||
|
merge: returnbar(mergeBranch),
|
||||||
|
pull: returnbar(pullBranch),
|
||||||
|
});
|
||||||
|
this.checkBranch(branchParams);
|
||||||
|
this.setState({
|
||||||
|
isSpin: false,isCompareSpin: false
|
||||||
|
});
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.catch((error) => {
|
||||||
|
this.setState({ isSpin: false });
|
||||||
|
console.log(error);
|
||||||
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
checkBranch=async(branchParams)=>{
|
||||||
|
const { mergeBranch , mergeOwner, projectId , pullBranch ,pullOwner} = branchParams;
|
||||||
|
let getbranch =await this.getBranchList(mergeOwner,projectId,pullBranch,mergeBranch);
|
||||||
|
// let checkpull =await this.getBranchList(pullOwner,projectId,pullBranch,"pull");
|
||||||
|
if(getbranch){
|
||||||
|
this.compareProject(mergeOwner === pullOwner, branchParams);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// compare接口,获取分支对比信息
|
// compare接口,获取分支对比信息
|
||||||
compareProject = (sameProject, branchParams) => {
|
compareProject = (sameProject, branchParams) => {
|
||||||
const { pullOwner, pullBranch, mergeOwner, mergeBranch, projectId } = branchParams;
|
const { pullOwner, pullBranch, mergeOwner, mergeBranch, projectId } = branchParams;
|
||||||
|
@ -187,8 +164,6 @@ class CreateMerge extends Component {
|
||||||
} else {
|
} else {
|
||||||
url += `/${Base64.encode(returnbar(mergeBranch))}...${pullOwner}/${projectId}:${Base64.encode(returnbar(pullBranch))}.json`;
|
url += `/${Base64.encode(returnbar(mergeBranch))}...${pullOwner}/${projectId}:${Base64.encode(returnbar(pullBranch))}.json`;
|
||||||
}
|
}
|
||||||
console.log(url);
|
|
||||||
this.setState({ isSpin: false, isCompareSpin: true });
|
|
||||||
axios
|
axios
|
||||||
.get(url)
|
.get(url)
|
||||||
.then((result) => {
|
.then((result) => {
|
||||||
|
@ -219,31 +194,40 @@ class CreateMerge extends Component {
|
||||||
};
|
};
|
||||||
|
|
||||||
// 根据所有者、仓库名,获取分支列表,目前仅涉及目标仓库分支查询
|
// 根据所有者、仓库名,获取分支列表,目前仅涉及目标仓库分支查询
|
||||||
getBranchList = (branchParams) => {
|
getBranchList =async(owner,identifier,branch,mergebranch) => {
|
||||||
const { mergeOwner, projectId, mergeBranch } = branchParams;
|
const url = `/${owner}/${identifier}/branches.json`;
|
||||||
this.setState({ isSpin: true });
|
let check = await axios.get(url).then((result) => {
|
||||||
const url = `/${mergeOwner}/${projectId}/pulls/get_branches.json`;
|
if(result.data){
|
||||||
axios
|
let pfilter = (result.data || []).filter(i => i.name === branch).length === 0;
|
||||||
.get(url)
|
let mfilter = (result.data || []).filter(i => i.name === mergebranch).length === 0;
|
||||||
.then((result) => {
|
if(pfilter){
|
||||||
if (result) {
|
|
||||||
const noMergeBranch =
|
|
||||||
(result.data || []).filter((branch) => branch.name === mergeBranch)
|
|
||||||
.length === 0;
|
|
||||||
this.setState({
|
this.setState({
|
||||||
mergeBranches: result.data,
|
showMessage: branch,
|
||||||
showMessage: noMergeBranch,
|
defaultMessage: `源分支不存在`,
|
||||||
defaultMessage: '目标分支不存在',
|
isCompareSpin: false
|
||||||
isCompareSpin: false,
|
|
||||||
});
|
});
|
||||||
!noMergeBranch && this.compareProject(false, branchParams);
|
return false;
|
||||||
}
|
}
|
||||||
this.setState({ isSpin: false });
|
if(mfilter){
|
||||||
})
|
this.setState({
|
||||||
.catch((error) => {
|
showMessage: mergebranch,
|
||||||
this.setState({ isSpin: false });
|
defaultMessage: `目标分支不存在`,
|
||||||
console.log(error);
|
isCompareSpin: false
|
||||||
});
|
});
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
this.setState({
|
||||||
|
pullBranches:result.data,
|
||||||
|
mergeBranches:result.data
|
||||||
|
})
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.catch((error) => {
|
||||||
|
this.setState({ isSpin: false });
|
||||||
|
check = false;
|
||||||
|
});
|
||||||
|
return check;
|
||||||
};
|
};
|
||||||
|
|
||||||
// 切换分支事件
|
// 切换分支事件
|
||||||
|
@ -291,14 +275,16 @@ class CreateMerge extends Component {
|
||||||
});
|
});
|
||||||
// 加上是否需要切换url判断
|
// 加上是否需要切换url判断
|
||||||
if(isChangeProject){
|
if(isChangeProject){
|
||||||
|
const { defaultBranch } = this.props;
|
||||||
|
let branch = turnbar(defaultBranch) || "master";
|
||||||
if (login === pullOwner) {
|
if (login === pullOwner) {
|
||||||
// 如果切换后, 仓库与源仓库一致了
|
// 如果切换后, 仓库与源仓库一致了
|
||||||
this.props.history.push(
|
this.props.history.push(
|
||||||
`/${login}/${identifier}/compare/master...${turnbar(pullBranch)}`
|
`/${login}/${identifier}/compare/${branch}...${turnbar(pullBranch)}`
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
this.props.history.push(
|
this.props.history.push(
|
||||||
`/${login}/${identifier}/compare/master...${pullOwner}:${turnbar(pullBranch)}`
|
`/${login}/${identifier}/compare/${branch}...${pullOwner}:${turnbar(pullBranch)}`
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -336,6 +322,32 @@ class CreateMerge extends Component {
|
||||||
return <div dangerouslySetInnerHTML={{ __html: html }}></div>;
|
return <div dangerouslySetInnerHTML={{ __html: html }}></div>;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// 源分支-分支搜索
|
||||||
|
changePullValue=async(value,cate)=>{
|
||||||
|
const branchParams = getBranchParams(this.props.location.pathname);
|
||||||
|
const { pullOwner, mergeOwner , projectId } = branchParams;
|
||||||
|
const url = `/${cate === "pull" ? pullOwner :mergeOwner}/${projectId}/pulls/get_branches.json`;
|
||||||
|
axios.get(url,{
|
||||||
|
params:{
|
||||||
|
name:value || undefined,
|
||||||
|
}
|
||||||
|
}).then(result=>{
|
||||||
|
if(result){
|
||||||
|
if(cate === "pull"){
|
||||||
|
this.setState({
|
||||||
|
pullBranches:result.data,
|
||||||
|
pullBranch:result.data
|
||||||
|
})
|
||||||
|
}else{
|
||||||
|
this.setState({
|
||||||
|
mergeBranches:result.data,
|
||||||
|
mergeBranch:result.data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}).catch(error=>{})
|
||||||
|
}
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
const {
|
const {
|
||||||
data,
|
data,
|
||||||
|
@ -355,7 +367,6 @@ class CreateMerge extends Component {
|
||||||
} = this.state;
|
} = this.state;
|
||||||
|
|
||||||
let { project } = this.props;
|
let { project } = this.props;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
<Spin spinning={isSpin || isCompareSpin}>
|
<Spin spinning={isSpin || isCompareSpin}>
|
||||||
|
@ -378,6 +389,8 @@ class CreateMerge extends Component {
|
||||||
className="merge-flex1 flex1 matchwidth"
|
className="merge-flex1 flex1 matchwidth"
|
||||||
dropdownMatchSelectWidth={false}
|
dropdownMatchSelectWidth={false}
|
||||||
dropdownClassName="overlihide"
|
dropdownClassName="overlihide"
|
||||||
|
// onSearch={(e)=>this.changePullValue(e,"pull")}
|
||||||
|
// filterOption={(input,option)=>option}
|
||||||
>
|
>
|
||||||
{this.renderBrances(pullBranches)}
|
{this.renderBrances(pullBranches)}
|
||||||
</Select>
|
</Select>
|
||||||
|
@ -406,6 +419,8 @@ class CreateMerge extends Component {
|
||||||
className="merge-flex1 flex1 matchwidth"
|
className="merge-flex1 flex1 matchwidth"
|
||||||
dropdownMatchSelectWidth={false}
|
dropdownMatchSelectWidth={false}
|
||||||
dropdownClassName="overlihide"
|
dropdownClassName="overlihide"
|
||||||
|
// onSearch={(e)=>this.changePullValue(e,"merge")}
|
||||||
|
// filterOption={(input,option)=>option}
|
||||||
>
|
>
|
||||||
{this.renderBrances(mergeBranches)}
|
{this.renderBrances(mergeBranches)}
|
||||||
</Select>
|
</Select>
|
||||||
|
|
|
@ -226,4 +226,7 @@ form .ant-cascader-picker, form .ant-select {
|
||||||
/* 距离底部加大 @列表被遮挡 */
|
/* 距离底部加大 @列表被遮挡 */
|
||||||
.updateMerge{
|
.updateMerge{
|
||||||
margin: 30px auto 60px;
|
margin: 30px auto 60px;
|
||||||
|
}
|
||||||
|
.searchIcon .ant-select-arrow{
|
||||||
|
margin-top:-9px
|
||||||
}
|
}
|
|
@ -6,6 +6,7 @@ import "../Order/index.scss";
|
||||||
import NoneData from "./no_data";
|
import NoneData from "./no_data";
|
||||||
import MergeItem from "./MergeItem";
|
import MergeItem from "./MergeItem";
|
||||||
import './Index.scss';
|
import './Index.scss';
|
||||||
|
import { turnbar } from "educoder";
|
||||||
|
|
||||||
import axios from "axios";
|
import axios from "axios";
|
||||||
import CheckProfile from '../Component/ProfileModal/Profile';
|
import CheckProfile from '../Component/ProfileModal/Profile';
|
||||||
|
@ -210,10 +211,11 @@ class merge extends Component {
|
||||||
|
|
||||||
this.getIssueList();
|
this.getIssueList();
|
||||||
};
|
};
|
||||||
|
|
||||||
checkOperation() {
|
checkOperation() {
|
||||||
|
const { defaultBranch } = this.props;
|
||||||
const { projectsId,owner } = this.props.match.params;
|
const { projectsId,owner } = this.props.match.params;
|
||||||
this.props.history.push(`/${owner}/${projectsId}/compare/master...master`);
|
let branch = turnbar(defaultBranch) || "master";
|
||||||
|
this.props.history.push(`/${owner}/${projectsId}/compare/${branch}...${branch}`);
|
||||||
}
|
}
|
||||||
render() {
|
render() {
|
||||||
const { projectsId , owner } = this.props.match.params;
|
const { projectsId , owner } = this.props.match.params;
|
||||||
|
@ -414,7 +416,7 @@ class merge extends Component {
|
||||||
) : (
|
) : (
|
||||||
""
|
""
|
||||||
)}
|
)}
|
||||||
{ data && data.issues && data.issues.length === 0 ? <NoneData _html="暂时还没有相关数据!" user_admin_or_developer={data.user_admin_or_developer} projectsId={projectsId} owner={owner} /> :""}
|
{ data && data.issues && data.issues.length === 0 ? <NoneData _html="暂时还没有相关数据!" user_admin_or_developer={data.user_admin_or_developer} projectsId={projectsId} owner={owner} defaultBranch={this.props && turnbar(this.props.defaultBranch) }/> :""}
|
||||||
</Spin>
|
</Spin>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -181,7 +181,6 @@ class MergeForm extends Component {
|
||||||
this.setState({
|
this.setState({
|
||||||
isSpin: false,
|
isSpin: false,
|
||||||
});
|
});
|
||||||
console.log(error);
|
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
let url = `/${owner}/${projectsId}/pulls/${mergeId}.json`;
|
let url = `/${owner}/${projectsId}/pulls/${mergeId}.json`;
|
||||||
|
@ -315,7 +314,16 @@ class MergeForm extends Component {
|
||||||
{getFieldDecorator("assigned_to_id", {
|
{getFieldDecorator("assigned_to_id", {
|
||||||
initialValue: assigned_to_id,
|
initialValue: assigned_to_id,
|
||||||
})(
|
})(
|
||||||
<Select placeholder="未选择审查人员" showSearch>
|
<Select
|
||||||
|
placeholder="未选择审查人员"
|
||||||
|
showSearch
|
||||||
|
className="searchIcon"
|
||||||
|
suffixIcon={<i className="iconfont icon-sousuo1"></i>}
|
||||||
|
optionFilterProp="children"
|
||||||
|
filterOption={(input, option) =>
|
||||||
|
option.props.value && option.props.children && option.props.children.toLowerCase().indexOf(input.toLowerCase()) >= 0
|
||||||
|
}
|
||||||
|
>
|
||||||
<Option key={0} value={""}>未选择审查人员</Option>
|
<Option key={0} value={""}>未选择审查人员</Option>
|
||||||
{this.renderSelect(members)}
|
{this.renderSelect(members)}
|
||||||
</Select>
|
</Select>
|
||||||
|
@ -330,6 +338,12 @@ class MergeForm extends Component {
|
||||||
issue_versions && issue_versions.length > 0? "未选择里程碑": "请添加里程碑"
|
issue_versions && issue_versions.length > 0? "未选择里程碑": "请添加里程碑"
|
||||||
}
|
}
|
||||||
showSearch
|
showSearch
|
||||||
|
className="searchIcon"
|
||||||
|
suffixIcon={<i className="iconfont icon-sousuo1"></i>}
|
||||||
|
optionFilterProp="children"
|
||||||
|
filterOption={(input, option) =>
|
||||||
|
option.props.value && option.props.children && option.props.children.toLowerCase().indexOf(input.toLowerCase()) >= 0
|
||||||
|
}
|
||||||
>
|
>
|
||||||
<Option key={0} value={""}>{issue_versions && issue_versions.length > 0? "未选择里程碑": "请添加里程碑"}</Option>
|
<Option key={0} value={""}>{issue_versions && issue_versions.length > 0? "未选择里程碑": "请添加里程碑"}</Option>
|
||||||
{this.renderSelect(issue_versions)}
|
{this.renderSelect(issue_versions)}
|
||||||
|
@ -345,6 +359,12 @@ class MergeForm extends Component {
|
||||||
issue_tags && issue_tags.length > 0 ? "未选择标记" : "请在仓库设置里添加标记"
|
issue_tags && issue_tags.length > 0 ? "未选择标记" : "请在仓库设置里添加标记"
|
||||||
}
|
}
|
||||||
showSearch
|
showSearch
|
||||||
|
className="searchIcon"
|
||||||
|
suffixIcon={<i className="iconfont icon-sousuo1"></i>}
|
||||||
|
optionFilterProp="children"
|
||||||
|
filterOption={(input, option) =>
|
||||||
|
option.props.value && option.props.children && option.props.children.toLowerCase().indexOf(input.toLowerCase()) >= 0
|
||||||
|
}
|
||||||
>
|
>
|
||||||
<Option key={0} value={""}>{issue_tags && issue_tags.length > 0 ? "未选择标记" : "请在仓库设置里添加标记"}</Option>
|
<Option key={0} value={""}>{issue_tags && issue_tags.length > 0 ? "未选择标记" : "请在仓库设置里添加标记"}</Option>
|
||||||
{this.renderSelect(issue_tags)}
|
{this.renderSelect(issue_tags)}
|
||||||
|
|
|
@ -2,7 +2,7 @@ import React , { Component } from 'react';
|
||||||
import { Link } from "react-router-dom";
|
import { Link } from "react-router-dom";
|
||||||
class Nodata extends Component{
|
class Nodata extends Component{
|
||||||
render(){
|
render(){
|
||||||
const { _html, projectsId , owner , user_admin_or_developer} = this.props;
|
const { _html, projectsId , owner , user_admin_or_developer , defaultBranch} = this.props;
|
||||||
return(
|
return(
|
||||||
<div className="none_panels">
|
<div className="none_panels">
|
||||||
<div>
|
<div>
|
||||||
|
@ -12,7 +12,7 @@ class Nodata extends Component{
|
||||||
<h3>欢迎使用合并请求!</h3>
|
<h3>欢迎使用合并请求!</h3>
|
||||||
|
|
||||||
<div className="color-grey-8">
|
<div className="color-grey-8">
|
||||||
合并请求可以帮助您与他人协作编写代码。{ user_admin_or_developer && <span>在使用之前,请先创建一个 <Link className="color-blue" to={`/${owner}/${projectsId}/compare/master...master`}>合并请求</Link></span> }
|
合并请求可以帮助您与他人协作编写代码。{ user_admin_or_developer && <span>在使用之前,请先创建一个 <Link className="color-blue" to={`/${owner}/${projectsId}/compare/${defaultBranch}...${defaultBranch}`}>合并请求</Link></span> }
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -11,7 +11,7 @@
|
||||||
}
|
}
|
||||||
.quillFlag {
|
.quillFlag {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
bottom: 0px;
|
bottom: 30px;
|
||||||
left: 6px;
|
left: 6px;
|
||||||
height: 20px;
|
height: 20px;
|
||||||
line-height: 18px;
|
line-height: 18px;
|
||||||
|
@ -710,4 +710,8 @@ a.issue-type-button.active:hover {
|
||||||
.boder-4{border-radius: 4px;}
|
.boder-4{border-radius: 4px;}
|
||||||
.pbt20{padding: 20px 0;}
|
.pbt20{padding: 20px 0;}
|
||||||
.inline-block{display: inline-block;}
|
.inline-block{display: inline-block;}
|
||||||
.pd10{padding: 10px;}
|
.pd10{padding: 10px;}
|
||||||
|
|
||||||
|
.searchIcon .ant-select-arrow{
|
||||||
|
margin-top:-9px
|
||||||
|
}
|
|
@ -210,17 +210,16 @@ class order_form extends Component {
|
||||||
if (result && result.data.id) {
|
if (result && result.data.id) {
|
||||||
this.props.showNotification("任务创建成功!");
|
this.props.showNotification("任务创建成功!");
|
||||||
this.props.history.push(`/${owner}/${projectsId}/issues/${result.data.id}`);
|
this.props.history.push(`/${owner}/${projectsId}/issues/${result.data.id}`);
|
||||||
this.setState({
|
|
||||||
description: "",
|
|
||||||
isSpin: false,
|
|
||||||
});
|
|
||||||
const { getDetail } = this.props;
|
const { getDetail } = this.props;
|
||||||
getDetail && getDetail();
|
getDetail && getDetail();
|
||||||
}
|
}
|
||||||
|
this.setState({
|
||||||
|
isSpin: false,
|
||||||
|
});
|
||||||
})
|
})
|
||||||
.catch((error) => {
|
.catch((error) => {
|
||||||
this.setState({
|
this.setState({
|
||||||
isSpin: false,
|
isSpin: false
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
|
@ -240,10 +239,13 @@ class order_form extends Component {
|
||||||
const { getDetail } = this.props;
|
const { getDetail } = this.props;
|
||||||
getDetail && getDetail();
|
getDetail && getDetail();
|
||||||
}
|
}
|
||||||
|
this.setState({
|
||||||
|
isSpin: false
|
||||||
|
});
|
||||||
})
|
})
|
||||||
.catch((error) => {
|
.catch((error) => {
|
||||||
this.setState({
|
this.setState({
|
||||||
isSpin: false,
|
isSpin: false
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -437,7 +439,17 @@ class order_form extends Component {
|
||||||
<div className="pd20 background-f issue-form-right">
|
<div className="pd20 background-f issue-form-right">
|
||||||
<Form.Item label="指派成员">
|
<Form.Item label="指派成员">
|
||||||
{getFieldDecorator("assigned_to_id", {rules: []})(
|
{getFieldDecorator("assigned_to_id", {rules: []})(
|
||||||
<Select>
|
<Select
|
||||||
|
showSearch
|
||||||
|
className="searchIcon"
|
||||||
|
showArrow={true}
|
||||||
|
suffixIcon={<i className="iconfont icon-sousuo1"></i>}
|
||||||
|
optionFilterProp="children"
|
||||||
|
filterOption={(input, option) =>
|
||||||
|
option.props.children[1] && option.props.children[1].toLowerCase().indexOf(input.toLowerCase()) >= 0
|
||||||
|
}
|
||||||
|
placeholder="搜索成员"
|
||||||
|
>
|
||||||
<Option value={""}>未指派成员</Option>
|
<Option value={""}>未指派成员</Option>
|
||||||
{this.renderSelect(
|
{this.renderSelect(
|
||||||
issue_chosen && issue_chosen.assign_user
|
issue_chosen && issue_chosen.assign_user
|
||||||
|
@ -485,7 +497,16 @@ class order_form extends Component {
|
||||||
|
|
||||||
<Form.Item label="里程碑">
|
<Form.Item label="里程碑">
|
||||||
{getFieldDecorator("fixed_version_id", {rules: []})(
|
{getFieldDecorator("fixed_version_id", {rules: []})(
|
||||||
<Select>
|
<Select
|
||||||
|
showSearch
|
||||||
|
className="searchIcon"
|
||||||
|
showArrow={true}
|
||||||
|
suffixIcon={<i className="iconfont icon-sousuo1"></i>}
|
||||||
|
optionFilterProp="children"
|
||||||
|
filterOption={(input, option) =>
|
||||||
|
option.props.children[1] && option.props.children[1].toLowerCase().indexOf(input.toLowerCase()) >= 0
|
||||||
|
}
|
||||||
|
>
|
||||||
<Option value={""}>
|
<Option value={""}>
|
||||||
{issue_chosen && issue_chosen.issue_version.length > 0
|
{issue_chosen && issue_chosen.issue_version.length > 0
|
||||||
? "未选择里程碑"
|
? "未选择里程碑"
|
||||||
|
@ -499,7 +520,16 @@ class order_form extends Component {
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
<Form.Item label="标记">
|
<Form.Item label="标记">
|
||||||
{getFieldDecorator("issue_tag_ids", {rules: []})(
|
{getFieldDecorator("issue_tag_ids", {rules: []})(
|
||||||
<Select>
|
<Select
|
||||||
|
showSearch
|
||||||
|
className="searchIcon"
|
||||||
|
showArrow={true}
|
||||||
|
suffixIcon={<i className="iconfont icon-sousuo1"></i>}
|
||||||
|
optionFilterProp="children"
|
||||||
|
filterOption={(input, option) =>
|
||||||
|
option.props.children[1] && option.props.children[1].toLowerCase().indexOf(input.toLowerCase()) >= 0
|
||||||
|
}
|
||||||
|
>
|
||||||
<Option value={""}>
|
<Option value={""}>
|
||||||
{issue_chosen && issue_chosen.issue_tag.length > 0
|
{issue_chosen && issue_chosen.issue_tag.length > 0
|
||||||
? "未选择标记"
|
? "未选择标记"
|
||||||
|
@ -537,7 +567,16 @@ class order_form extends Component {
|
||||||
{getFieldDecorator("branch_name", {
|
{getFieldDecorator("branch_name", {
|
||||||
rules: []
|
rules: []
|
||||||
})(
|
})(
|
||||||
<Select>
|
<Select
|
||||||
|
showSearch
|
||||||
|
className="searchIcon"
|
||||||
|
showArrow={true}
|
||||||
|
suffixIcon={<i className="iconfont icon-sousuo1"></i>}
|
||||||
|
optionFilterProp="children"
|
||||||
|
filterOption={(input, option) =>
|
||||||
|
option.props.children && option.props.children.toLowerCase().indexOf(input.toLowerCase()) >= 0
|
||||||
|
}
|
||||||
|
>
|
||||||
<Option value={""}>分支未指定</Option>
|
<Option value={""}>分支未指定</Option>
|
||||||
{branches && branches.length > 0 && branches.map((item, key) => {
|
{branches && branches.length > 0 && branches.map((item, key) => {
|
||||||
return (
|
return (
|
||||||
|
|
|
@ -21,24 +21,17 @@ export default ((props)=>{
|
||||||
|
|
||||||
const [ count , setCount ] = useState(0);
|
const [ count , setCount ] = useState(0);
|
||||||
const [ page , setPage ] = useState(1);
|
const [ page , setPage ] = useState(1);
|
||||||
let defaultBranch = props.defaultBranch;
|
|
||||||
|
|
||||||
|
|
||||||
useEffect(()=>{
|
useEffect(()=>{
|
||||||
if(defaultBranch){
|
if(props.defaultBranch){
|
||||||
setBranch(defaultBranch);
|
setBranch(props.defaultBranch);
|
||||||
setProtectBranch(defaultBranch);
|
setProtectBranch(props.defaultBranch);
|
||||||
}
|
}
|
||||||
},[defaultBranch]);
|
},[props.defaultBranch]);
|
||||||
|
|
||||||
const { projectsId , owner } = props.match.params;
|
const { projectsId , owner } = props.match.params;
|
||||||
const projectDetail = props.projectDetail;
|
const projectDetail = props.projectDetail;
|
||||||
|
|
||||||
useEffect(()=>{
|
|
||||||
if(defaultBranch){
|
|
||||||
setBranch(defaultBranch);
|
|
||||||
}
|
|
||||||
},[defaultBranch]);
|
|
||||||
|
|
||||||
useEffect(()=>{
|
useEffect(()=>{
|
||||||
if(owner){
|
if(owner){
|
||||||
|
|
|
@ -52,7 +52,7 @@ class Attachment extends Component {
|
||||||
show_video: status === "preview",
|
show_video: status === "preview",
|
||||||
video_url:
|
video_url:
|
||||||
status === "preview"
|
status === "preview"
|
||||||
? "https://forgeplus.trustie.net" + result.data.url
|
? "https://www.gitlink.org.cn" + result.data.url
|
||||||
: undefined,
|
: undefined,
|
||||||
move_spin: false,
|
move_spin: false,
|
||||||
});
|
});
|
||||||
|
|
|
@ -192,7 +192,7 @@ export default Form.create()(({ form, history, showNotification, projectDetail,
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
<Form.Item className="mb0">
|
<Form.Item className="mb0 wiki-md">
|
||||||
<MDEditor
|
<MDEditor
|
||||||
placeholder={"请输入wiki内容"}
|
placeholder={"请输入wiki内容"}
|
||||||
height={500}
|
height={500}
|
||||||
|
|
|
@ -10,7 +10,7 @@ body {
|
||||||
.wiki-main {
|
.wiki-main {
|
||||||
width: 1200px;
|
width: 1200px;
|
||||||
min-height: 400px;
|
min-height: 400px;
|
||||||
margin: 20px auto;
|
margin: 20px auto 60px;
|
||||||
|
|
||||||
.ant-btn-primary {
|
.ant-btn-primary {
|
||||||
background-color: $wikiColor;
|
background-color: $wikiColor;
|
||||||
|
@ -106,6 +106,9 @@ body {
|
||||||
.has-error .ant-form-split {
|
.has-error .ant-form-split {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
}
|
}
|
||||||
|
.wiki-md .ant-form-explain{
|
||||||
|
bottom: -6px;
|
||||||
|
}
|
||||||
.wiki-nav {
|
.wiki-nav {
|
||||||
max-height: 60vh;
|
max-height: 60vh;
|
||||||
.wiki-search {
|
.wiki-search {
|
||||||
|
|
|
@ -42,13 +42,14 @@ class comments extends Component {
|
||||||
|
|
||||||
//添加评论
|
//添加评论
|
||||||
addjournals = () => {
|
addjournals = () => {
|
||||||
const { content, reply_content } = this.state;
|
const { content, reply_content , fileList } = this.state;
|
||||||
this.setState({
|
this.setState({
|
||||||
journal_spin: true,
|
journal_spin: true,
|
||||||
});
|
});
|
||||||
if (!content && !reply_content) {
|
if (!content && !reply_content) {
|
||||||
this.setState({
|
this.setState({
|
||||||
journal_spin: false,
|
journal_spin: false,
|
||||||
|
quillFlag:true
|
||||||
});
|
});
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -58,15 +59,12 @@ class comments extends Component {
|
||||||
const {
|
const {
|
||||||
page,
|
page,
|
||||||
limit,
|
limit,
|
||||||
fileList,
|
|
||||||
orderId,
|
orderId,
|
||||||
reply_id,
|
reply_id,
|
||||||
is_reply,
|
is_reply,
|
||||||
atWhoLoginList,
|
atWhoLoginList,
|
||||||
} = this.state;
|
} = this.state;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
const url = `/issues/${orderId}/journals.json`;
|
const url = `/issues/${orderId}/journals.json`;
|
||||||
axios
|
axios
|
||||||
.post(url, {
|
.post(url, {
|
||||||
|
@ -343,7 +341,7 @@ class comments extends Component {
|
||||||
height="30"
|
height="30"
|
||||||
/>
|
/>
|
||||||
</Link>
|
</Link>
|
||||||
<div>
|
<div style={{position:"relative"}}>
|
||||||
<MDEditor
|
<MDEditor
|
||||||
placeholder={"添加评论..."}
|
placeholder={"添加评论..."}
|
||||||
height={300}
|
height={300}
|
||||||
|
@ -362,7 +360,7 @@ class comments extends Component {
|
||||||
projectsId = {projectsId}
|
projectsId = {projectsId}
|
||||||
></MDEditor>
|
></MDEditor>
|
||||||
<p className="quillFlag">
|
<p className="quillFlag">
|
||||||
{quillFlag && <span className="">请输入评论内容</span>}
|
{quillFlag && <span>请输入评论内容</span>}
|
||||||
</p>
|
</p>
|
||||||
<Upload
|
<Upload
|
||||||
className="commentStyle"
|
className="commentStyle"
|
||||||
|
|
|
@ -15,6 +15,7 @@ import Activity from './Activity';
|
||||||
import moment from 'moment';
|
import moment from 'moment';
|
||||||
import Axios from 'axios';
|
import Axios from 'axios';
|
||||||
import Nodata from '../../Nodata';
|
import Nodata from '../../Nodata';
|
||||||
|
import Personal from '../Personal/Index';
|
||||||
|
|
||||||
const { Option } = Select;
|
const { Option } = Select;
|
||||||
const aLimit = 5;
|
const aLimit = 5;
|
||||||
|
@ -95,8 +96,8 @@ function Index(props) {
|
||||||
}
|
}
|
||||||
}).catch(error=>{})
|
}).catch(error=>{})
|
||||||
}
|
}
|
||||||
|
|
||||||
return(
|
return(
|
||||||
|
props && props.menuKey === "0" ?
|
||||||
<div>
|
<div>
|
||||||
<div>
|
<div>
|
||||||
<ConcentrateProject
|
<ConcentrateProject
|
||||||
|
@ -127,6 +128,8 @@ function Index(props) {
|
||||||
{ total > aLimit && <div style={{textAlign:'center',paddingBottom:"30px"}}><Pagination pageSize={aLimit} current={page} total={total} onChange={(p)=>setPage(p)}/></div> }
|
{ total > aLimit && <div style={{textAlign:'center',paddingBottom:"30px"}}><Pagination pageSize={aLimit} current={page} total={total} onChange={(p)=>setPage(p)}/></div> }
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
:
|
||||||
|
<Personal {...props}/>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
export default Index;
|
export default Index;
|
|
@ -216,7 +216,7 @@ ul.ant-menu.menuStyle li {
|
||||||
|
|
||||||
.infosRightMenu .ant-menu-item {
|
.infosRightMenu .ant-menu-item {
|
||||||
padding: 0px;
|
padding: 0px;
|
||||||
margin: 0px 20px !important;
|
margin: 0px 20px 0px 0px !important;
|
||||||
font-size: 17px;
|
font-size: 17px;
|
||||||
height: 32px;
|
height: 32px;
|
||||||
line-height: 0px;
|
line-height: 0px;
|
||||||
|
@ -224,7 +224,7 @@ ul.ant-menu.menuStyle li {
|
||||||
position: relative;
|
position: relative;
|
||||||
}
|
}
|
||||||
.infosRightMenu .ant-menu-item a > i {
|
.infosRightMenu .ant-menu-item a > i {
|
||||||
font-size: 15px !important;
|
font-size: 15px;
|
||||||
margin-right: 8px;
|
margin-right: 8px;
|
||||||
}
|
}
|
||||||
.infosRightMenu .ant-menu-item .menuNum {
|
.infosRightMenu .ant-menu-item .menuNum {
|
||||||
|
|
|
@ -24,7 +24,7 @@ export default withRouter(
|
||||||
secondRouter = props.location.pathname.split('/')[2];
|
secondRouter = props.location.pathname.split('/')[2];
|
||||||
}
|
}
|
||||||
|
|
||||||
let userRouterArr = ['statistics', 'projects', 'notice', 'devops', 'organizes', 'info', 'following', 'followers', 'password'];
|
let userRouterArr = ['statistics', 'projects', 'notice', 'devops', 'organizes', 'info', 'following', 'followers', 'password' , "general"];
|
||||||
return (
|
return (
|
||||||
<Switch>
|
<Switch>
|
||||||
|
|
||||||
|
|
|
@ -107,6 +107,46 @@ $flex:flex;
|
||||||
font-size: 16px;
|
font-size: 16px;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
}
|
}
|
||||||
|
.usersDesc{
|
||||||
|
padding:20px 10px;
|
||||||
|
background-color: rgba(239, 247, 255, 1);
|
||||||
|
margin-top: 24px;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
flex-direction: column;
|
||||||
|
p{
|
||||||
|
text-align: left;
|
||||||
|
line-height: 20px;
|
||||||
|
font-size: 14px;
|
||||||
|
color: #666;
|
||||||
|
margin-bottom: 20px!important;
|
||||||
|
}
|
||||||
|
.emptyBtn{
|
||||||
|
width: 118px;
|
||||||
|
text-align: center;
|
||||||
|
height: 36px;
|
||||||
|
line-height: 34px;
|
||||||
|
border: 1px solid rgba(26, 71, 255, 1);
|
||||||
|
color: rgba(26, 71, 255, 1);
|
||||||
|
border-radius: 5px;
|
||||||
|
&:hover{
|
||||||
|
border-color:rgba(102, 132, 254, 1);
|
||||||
|
color: rgba(102, 132, 254, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.fullBtn{
|
||||||
|
width: 118px;
|
||||||
|
text-align: center;
|
||||||
|
height: 36px;
|
||||||
|
line-height: 34px;
|
||||||
|
color: #fff!important;
|
||||||
|
border-radius: 5px;
|
||||||
|
background-color: rgba(70, 106, 255, 1);
|
||||||
|
&:hover{
|
||||||
|
background-color: rgba(102, 132, 254, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
.focusBox,.infoBox{
|
.focusBox,.infoBox{
|
||||||
width: 100%!important;
|
width: 100%!important;
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
|
@ -237,7 +277,7 @@ ul.ant-menu.menuStyle{
|
||||||
.infosRightMenu{
|
.infosRightMenu{
|
||||||
.ant-menu-item{
|
.ant-menu-item{
|
||||||
padding:0px;
|
padding:0px;
|
||||||
margin:0px 20px!important;
|
margin:0px 30px 0px 0px !important;
|
||||||
font-size: 17px;
|
font-size: 17px;
|
||||||
height: 32px;
|
height: 32px;
|
||||||
line-height: 0px;
|
line-height: 0px;
|
||||||
|
@ -245,9 +285,14 @@ ul.ant-menu.menuStyle{
|
||||||
position: relative;
|
position: relative;
|
||||||
a{
|
a{
|
||||||
font-size: 16px;
|
font-size: 16px;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
& >i{
|
& >i{
|
||||||
font-size: 15px!important;
|
font-size: 15px!important;
|
||||||
margin-right: 8px;
|
margin-right: 8px;
|
||||||
|
&.font-20{
|
||||||
|
font-size: 17px!important;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.menuNum{
|
.menuNum{
|
||||||
|
|
|
@ -58,6 +58,12 @@ const Notice = Loadable({
|
||||||
loader: () => import("../Notice/Index"),
|
loader: () => import("../Notice/Index"),
|
||||||
loading: Loading,
|
loading: Loading,
|
||||||
})
|
})
|
||||||
|
const Personal = Loadable({
|
||||||
|
loader: () => import("./Personal/Index"),
|
||||||
|
loading: Loading,
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
class Infos extends Component {
|
class Infos extends Component {
|
||||||
constructor(props) {
|
constructor(props) {
|
||||||
super(props);
|
super(props);
|
||||||
|
@ -67,15 +73,20 @@ class Infos extends Component {
|
||||||
project_type: undefined,
|
project_type: undefined,
|
||||||
route_type: undefined,
|
route_type: undefined,
|
||||||
undo_events:0,
|
undo_events:0,
|
||||||
menuKey:"0",
|
menuKey:"6",
|
||||||
avatarVisible:false
|
avatarVisible:false
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
renderPath=(pathname)=>{
|
renderPath=(pathname,load)=>{
|
||||||
const { username } = this.props.match.params;
|
const { username } = this.props.match.params;
|
||||||
if(pathname === `/${username}`){
|
if(pathname === `/${username}`){
|
||||||
this.setState({menuKey:"0",route_type:undefined});
|
this.setState({route_type:undefined});
|
||||||
|
if(load){
|
||||||
|
this.setState({
|
||||||
|
menuKey:load.show_super_description ? "6" :"0"
|
||||||
|
})
|
||||||
|
}
|
||||||
}else if(pathname === `/${username}/statistics`){
|
}else if(pathname === `/${username}/statistics`){
|
||||||
this.setState({menuKey:"1",route_type:undefined});
|
this.setState({menuKey:"1",route_type:undefined});
|
||||||
}else if(pathname.indexOf(`/${username}/projects`)>-1){
|
}else if(pathname.indexOf(`/${username}/projects`)>-1){
|
||||||
|
@ -97,8 +108,6 @@ class Infos extends Component {
|
||||||
|
|
||||||
componentDidMount = () => {
|
componentDidMount = () => {
|
||||||
this.fetchUser();
|
this.fetchUser();
|
||||||
const { pathname } = this.props.location;
|
|
||||||
this.renderPath(pathname);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
componentDidUpdate=(prevProps)=>{
|
componentDidUpdate=(prevProps)=>{
|
||||||
|
@ -136,6 +145,8 @@ class Infos extends Component {
|
||||||
isSpin: false,
|
isSpin: false,
|
||||||
undo_events:e
|
undo_events:e
|
||||||
});
|
});
|
||||||
|
const { pathname } = this.props.location;
|
||||||
|
this.renderPath(pathname,result.data);
|
||||||
})
|
})
|
||||||
.catch((error) => {
|
.catch((error) => {
|
||||||
this.setState({
|
this.setState({
|
||||||
|
@ -211,10 +222,34 @@ class Infos extends Component {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
chooseTab =(key)=>{
|
||||||
|
this.setState({
|
||||||
|
menuKey:key
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
aboutDescFunc =(flag)=>{
|
||||||
|
const { user } = this.state;
|
||||||
|
const url = `/users/${user && user.login}.json`;
|
||||||
|
const params={
|
||||||
|
user: {
|
||||||
|
user_extension_attributes: {
|
||||||
|
show_super_description:flag
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
axios.put(url,params).then(result=>{
|
||||||
|
if(result && result.data){
|
||||||
|
this.fetchUser();
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
const { current_user } = this.props;
|
const { current_user } = this.props;
|
||||||
const { username } = this.props.match.params;
|
const { username } = this.props.match.params;
|
||||||
const { user, isSpin, route_type , undo_events , menuKey , avatarVisible } = this.state;
|
const { user, isSpin, route_type , undo_events , menuKey , avatarVisible } = this.state;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="newMain clearfix">
|
<div className="newMain clearfix">
|
||||||
{
|
{
|
||||||
|
@ -254,34 +289,42 @@ class Infos extends Component {
|
||||||
<div className="userDescription">
|
<div className="userDescription">
|
||||||
{user && user.description}
|
{user && user.description}
|
||||||
</div>
|
</div>
|
||||||
<div>
|
|
||||||
{/* {user && current_user && user.login === current_user.login && (
|
{/* {user && current_user && user.login === current_user.login && (
|
||||||
<div className="user-info-star-button ">
|
<div className="user-info-star-button ">
|
||||||
<Button
|
<Button
|
||||||
block
|
block
|
||||||
className="text-button-grey"
|
className="text-button-grey"
|
||||||
onClick={()=>this.props.history.push(`/${user.login}/info`)}
|
onClick={()=>this.props.history.push(`/${user.login}/info`)}
|
||||||
type="primary"
|
type="primary"
|
||||||
>
|
>
|
||||||
{" "}
|
{" "}
|
||||||
<i className="iconfont icon-shezhi4 font-15 mr5"></i>
|
<i className="iconfont icon-shezhi4 font-15 mr5"></i>
|
||||||
修改资料
|
修改资料
|
||||||
</Button>
|
</Button>
|
||||||
</div>
|
</div>
|
||||||
)} */}
|
)} */}
|
||||||
{current_user && user && user.login !== current_user.login && (
|
{current_user && user && user.login !== current_user.login && (
|
||||||
<div className="user-info-star-button ">
|
<div className="user-info-star-button ">
|
||||||
<FocusButton
|
<FocusButton
|
||||||
is_block={true}
|
is_block={true}
|
||||||
is_watch={user.is_watch}
|
is_watch={user.is_watch}
|
||||||
id={user.login}
|
id={user.login}
|
||||||
fontClass={"font-14 ml5"}
|
fontClass={"font-14 ml5"}
|
||||||
starText={"关注TA"}
|
starText={"关注TA"}
|
||||||
notReset={true}
|
notReset={true}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
</div>
|
{
|
||||||
|
current_user && user && user.login === current_user.login &&
|
||||||
|
<div className="usersDesc">
|
||||||
|
<p>想全方位展示自己?试试点击下方按钮定制化您的专属个人简介吧!</p>
|
||||||
|
{
|
||||||
|
user.show_super_description ? <a className="emptyBtn" onClick={()=>this.aboutDescFunc(false)}>隐藏个人简介</a> : <a className="fullBtn" onClick={()=>this.aboutDescFunc(true)}>展示个人简介</a>
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
}
|
||||||
<div className="focusBox">
|
<div className="focusBox">
|
||||||
<Link
|
<Link
|
||||||
to={`/${user && user.login}/following`}
|
to={`/${user && user.login}/following`}
|
||||||
|
@ -315,7 +358,11 @@ class Infos extends Component {
|
||||||
<div className="list-right">
|
<div className="list-right">
|
||||||
{ !route_type && menuKey &&
|
{ !route_type && menuKey &&
|
||||||
<Menu selectedKeys={[menuKey]} mode={`horizontal`} className="infosRightMenu">
|
<Menu selectedKeys={[menuKey]} mode={`horizontal`} className="infosRightMenu">
|
||||||
<Menu.Item key="0"><Link to={`/${user && user.login}`}><i className="iconfont icon-gailan"></i>活动概览</Link></Menu.Item>
|
{
|
||||||
|
user && user.show_super_description &&
|
||||||
|
<Menu.Item key="6"><Link to={`/${user && user.login}`} onClick={()=>this.chooseTab("6")}><i className="iconfont icon-personal-center font-20"></i>个人简介</Link></Menu.Item>
|
||||||
|
}
|
||||||
|
<Menu.Item key="0"><Link to={`/${user && user.login}`} onClick={()=>this.chooseTab("0")}><i className="iconfont icon-gailan"></i>活动概览</Link></Menu.Item>
|
||||||
<Menu.Item key="1"><Link to={`/${user && user.login}/statistics`}><i className="iconfont icon-shujutongji"></i>数据统计</Link></Menu.Item>
|
<Menu.Item key="1"><Link to={`/${user && user.login}/statistics`}><i className="iconfont icon-shujutongji"></i>数据统计</Link></Menu.Item>
|
||||||
<Menu.Item key="2"><Link to={`/${user && user.login}/projects`}><i className="iconfont icon-xiangmu"></i>参与项目</Link></Menu.Item>
|
<Menu.Item key="2"><Link to={`/${user && user.login}/projects`}><i className="iconfont icon-xiangmu"></i>参与项目</Link></Menu.Item>
|
||||||
{
|
{
|
||||||
|
@ -406,13 +453,19 @@ class Infos extends Component {
|
||||||
<Route
|
<Route
|
||||||
path="/:username"
|
path="/:username"
|
||||||
render={(props) => {
|
render={(props) => {
|
||||||
return <GeneralView {...this.props} {...this.state} />;
|
return <GeneralView {...this.props} {...this.state} menuKey={menuKey} show_super_description={user && user.show_super_description}/>;
|
||||||
}}
|
}}
|
||||||
></Route>
|
></Route>
|
||||||
|
{/* <Route
|
||||||
|
path="/:username"
|
||||||
|
render={(props) => {
|
||||||
|
return <Personal {...this.props} {...this.state} />;
|
||||||
|
}}
|
||||||
|
></Route> */}
|
||||||
<Route
|
<Route
|
||||||
path="/"
|
path="/"
|
||||||
render={(props) => {
|
render={(props) => {
|
||||||
return <GeneralView {...this.props} {...this.state} />;
|
return <GeneralView {...this.props} {...this.state} menuKey={menuKey}/>;
|
||||||
}}
|
}}
|
||||||
></Route>
|
></Route>
|
||||||
</Switch>
|
</Switch>
|
||||||
|
|
|
@ -115,11 +115,11 @@ export default Form.create()(
|
||||||
<Checkbox>在个人主页展示</Checkbox>
|
<Checkbox>在个人主页展示</Checkbox>
|
||||||
)}
|
)}
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
<Form.Item label="简介">
|
<Form.Item label="签名">
|
||||||
{getFieldDecorator("description",{
|
{getFieldDecorator("description",{
|
||||||
rules:[]
|
rules:[]
|
||||||
})(
|
})(
|
||||||
<TextArea placeholder="请输入您的自我简介" rows={4} maxLength={140} style={{width:"600px"}}/>
|
<TextArea placeholder="请输入您的签名" rows={4} maxLength={140} style={{width:"600px"}}/>
|
||||||
)}
|
)}
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
<AlignCenter>
|
<AlignCenter>
|
||||||
|
|
|
@ -0,0 +1,111 @@
|
||||||
|
import React, { useEffect, useState } from 'react';
|
||||||
|
import { Button } from 'antd';
|
||||||
|
import './Index.scss';
|
||||||
|
import MDEditor from "../../../modules/tpm/challengesnew/tpm-md-editor";
|
||||||
|
import RenderHtml from "../../../components/render-html";
|
||||||
|
import { Divider } from 'antd';
|
||||||
|
import axios from 'axios';
|
||||||
|
|
||||||
|
function Personal(props){
|
||||||
|
const { user ,current_user , resetUserInfo } = props;
|
||||||
|
const [ edit , setEdit ] = useState(false);
|
||||||
|
const [ showedit , setShowEdit ] = useState(false);
|
||||||
|
const [ description ,setDescription ] = useState("");
|
||||||
|
const [ copyDescription ,setCopyDescription ] = useState("");
|
||||||
|
useEffect(()=>{
|
||||||
|
if(user && user.super_description){
|
||||||
|
setDescription(user.super_description);
|
||||||
|
setCopyDescription(user.super_description);
|
||||||
|
setShowEdit(true);
|
||||||
|
}
|
||||||
|
},[user])
|
||||||
|
|
||||||
|
function onContentChange(value){
|
||||||
|
setDescription(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
function emtptyEditFunc(){
|
||||||
|
setShowEdit(true);
|
||||||
|
setEdit(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
function editCancelFunc(){
|
||||||
|
if(!copyDescription){
|
||||||
|
setShowEdit(false);
|
||||||
|
}
|
||||||
|
setDescription(copyDescription);
|
||||||
|
setEdit(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
function editSaveFunc(){
|
||||||
|
const url = `/users/${user && user.login}.json`;
|
||||||
|
const params={
|
||||||
|
user: {
|
||||||
|
user_extension_attributes: {
|
||||||
|
super_description:description
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
axios.put(url,params).then(result=>{
|
||||||
|
if(result && result.data){
|
||||||
|
setCopyDescription(description);
|
||||||
|
setEdit(false);
|
||||||
|
setShowEdit(description ?true :false);
|
||||||
|
resetUserInfo && resetUserInfo();
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
return(
|
||||||
|
<div>
|
||||||
|
{
|
||||||
|
description || showedit?
|
||||||
|
user && current_user && user.login === current_user.login &&
|
||||||
|
<div className="editPanel">
|
||||||
|
{
|
||||||
|
edit ?
|
||||||
|
<div>
|
||||||
|
<Button ghost onClick={()=>editCancelFunc()}>取消</Button>
|
||||||
|
<Button type="primary" ghost onClick={editSaveFunc}>保存</Button>
|
||||||
|
</div>
|
||||||
|
:
|
||||||
|
<Button type="primary" ghost onClick={()=>setEdit(true)}>编辑</Button>
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
:
|
||||||
|
<div className="emptyDescBox">
|
||||||
|
<img src={require('./img/nullicon.png')} alt="" width="58px"/>
|
||||||
|
<p className="emptyMain">暂无数据</p>
|
||||||
|
{
|
||||||
|
current_user && user && (current_user.login === user.login) &&
|
||||||
|
<div className="emptyContent">
|
||||||
|
<p className="emptysub">您可以在此页面定制化您的个人简介信息,包括开发者介绍,宣传链接,宣传图片等</p>
|
||||||
|
<Divider className="divider"/>
|
||||||
|
<a className="fullBtn" onClick={emtptyEditFunc}>编辑个人简介</a>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
{
|
||||||
|
showedit ?
|
||||||
|
<div className="padding20">
|
||||||
|
{
|
||||||
|
edit ?
|
||||||
|
<MDEditor
|
||||||
|
placeholder={"请输入个人简介"}
|
||||||
|
height={500}
|
||||||
|
mdID={"personal-description"}
|
||||||
|
initValue={description || ""}
|
||||||
|
onChange={onContentChange}
|
||||||
|
isCanAtme = {false}
|
||||||
|
></MDEditor>
|
||||||
|
:
|
||||||
|
<RenderHtml className="break_word_comments imageLayerParent" value={description || ""} url={props.history.location} />
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
:
|
||||||
|
""
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
export default Personal;
|
|
@ -0,0 +1,70 @@
|
||||||
|
.editPanel
|
||||||
|
{
|
||||||
|
display: flex;
|
||||||
|
justify-content: right;
|
||||||
|
padding:20px 20px 0px 0px;
|
||||||
|
.ant-btn.ant-btn-background-ghost{
|
||||||
|
color: #d0d0d0;
|
||||||
|
}
|
||||||
|
.ant-btn.ant-btn-primary.ant-btn-background-ghost {
|
||||||
|
border-color: #1890ff;
|
||||||
|
color: #1890ff;
|
||||||
|
margin-left: 20px;
|
||||||
|
&:hover{
|
||||||
|
background-color: #fff!important;
|
||||||
|
color: #1890ff;;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.emptyDescBox{
|
||||||
|
min-height:420px;
|
||||||
|
background-color:#fafcff;
|
||||||
|
border:1px solid;
|
||||||
|
border-color:rgba(42, 97, 255, 0.23);
|
||||||
|
border-radius:4px 4px 0px 0px;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
margin-top: 20px;
|
||||||
|
.emptyMain{
|
||||||
|
height: 28px;
|
||||||
|
line-height: 28px;
|
||||||
|
margin-top: 22px;
|
||||||
|
color:#333333;
|
||||||
|
font-size:20px;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
.emptyContent{
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
flex-direction: column;
|
||||||
|
.emptysub{
|
||||||
|
margin-top: 12px;
|
||||||
|
line-height:23px;
|
||||||
|
color:#333333;
|
||||||
|
font-size:14px;
|
||||||
|
text-align:center;
|
||||||
|
width: 325px;
|
||||||
|
}
|
||||||
|
.divider{
|
||||||
|
width: 400px;
|
||||||
|
min-width: 400px;
|
||||||
|
}
|
||||||
|
.fullBtn{
|
||||||
|
width: 118px;
|
||||||
|
text-align: center;
|
||||||
|
height: 36px;
|
||||||
|
line-height: 34px;
|
||||||
|
color: #fff!important;
|
||||||
|
border-radius: 5px;
|
||||||
|
background-color: rgba(70, 106, 255, 1);
|
||||||
|
&:hover{
|
||||||
|
background-color: rgba(102, 132, 254, 1);
|
||||||
|
}
|
||||||
|
margin:0px auto;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Binary file not shown.
After Width: | Height: | Size: 692 B |
|
@ -14,9 +14,9 @@ function Help(props) {
|
||||||
// 获取仓库wiki列表
|
// 获取仓库wiki列表
|
||||||
useEffect(()=>{
|
useEffect(()=>{
|
||||||
wikiPages({
|
wikiPages({
|
||||||
owner: locationStatus ? 'GLCC' : 'forgetest2',
|
owner: locationStatus ? 'CCF-GLCC' : 'forgetest2',
|
||||||
repo: locationStatus ? 'glcc2022' : 'wiki1',
|
repo: locationStatus ? 'glcc-help' : 'wiki1',
|
||||||
projectId: locationStatus ? '1403785' : '546103'
|
projectId: locationStatus ? '1403908' : '546103'
|
||||||
}).then(res => {
|
}).then(res => {
|
||||||
if (res && res.message === "200" && Array.isArray(res.data)) {
|
if (res && res.message === "200" && Array.isArray(res.data)) {
|
||||||
setFileArrInit(res.data);
|
setFileArrInit(res.data);
|
||||||
|
@ -32,10 +32,10 @@ function Help(props) {
|
||||||
// 获取选择wiki详情
|
// 获取选择wiki详情
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
checkItem.name && getWiki({
|
checkItem.name && getWiki({
|
||||||
owner: locationStatus ? 'GLCC' : 'forgetest2',
|
owner: locationStatus ? 'CCF-GLCC' : 'forgetest2',
|
||||||
repo: locationStatus ? 'glcc2022' : 'wiki1',
|
repo: locationStatus ? 'glcc-help' : 'wiki1',
|
||||||
pagename: checkItem.name,
|
pagename: checkItem.name,
|
||||||
projectId: locationStatus ? '1403785' : '546103'
|
projectId: locationStatus ? '1403908' : '546103'
|
||||||
}).then(res => {
|
}).then(res => {
|
||||||
if (res && res.message === "200") {
|
if (res && res.message === "200") {
|
||||||
setItemDetail(res.data);
|
setItemDetail(res.data);
|
||||||
|
|
|
@ -31,5 +31,8 @@
|
||||||
width: 100%;
|
width: 100%;
|
||||||
top: 0;
|
top: 0;
|
||||||
}
|
}
|
||||||
|
div img{
|
||||||
|
max-width: 100%;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -19,7 +19,7 @@ function Footnav() {
|
||||||
</ul>
|
</ul>
|
||||||
<ul>
|
<ul>
|
||||||
<li className="thehead">支持与服务</li>
|
<li className="thehead">支持与服务</li>
|
||||||
<li><a href="https://forgeplus.trustie.net/docs/api">API文档</a></li>
|
<li><a href="https://www.gitlink.org.cn/docs/api">API文档</a></li>
|
||||||
<li><a href="https://git-scm.com">Git常用命令</a></li>
|
<li><a href="https://git-scm.com">Git常用命令</a></li>
|
||||||
<li><a href="https://forum.trustie.net/forums/3080/detail">DevOps使用文档</a></li>
|
<li><a href="https://forum.trustie.net/forums/3080/detail">DevOps使用文档</a></li>
|
||||||
<li><a href='https://www.trustie.net/agreement'>服务协议</a></li>
|
<li><a href='https://www.trustie.net/agreement'>服务协议</a></li>
|
||||||
|
|
|
@ -94,7 +94,7 @@ function Index(props) {
|
||||||
CCF开源发展委员会首批执行委员名单发布
|
CCF开源发展委员会首批执行委员名单发布
|
||||||
</li>
|
</li>
|
||||||
</a>
|
</a>
|
||||||
<a href="https://forgeplus.trustie.net/Gitlink/forgeplus" target="_blank" className="font-18">
|
<a href="https://www.gitlink.org.cn/Gitlink/forgeplus" target="_blank" className="font-18">
|
||||||
<li>
|
<li>
|
||||||
平台精选仓库:GitLink/GitLink
|
平台精选仓库:GitLink/GitLink
|
||||||
</li>
|
</li>
|
||||||
|
|
Loading…
Reference in New Issue