forked from Gitlink/forgeplus-react
Merge pull request '添加一些功能和修复相关问题' (#196) from pre_develop_dev into pre_develop
This commit is contained in:
commit
12f97cce62
|
@ -2,7 +2,7 @@ import React , { useState , useEffect } from 'react';
|
|||
import { Input , Spin , Menu } from 'antd';
|
||||
import { getBranch , getTag } from '../GetData/getData';
|
||||
|
||||
function SelectOverlay({ changeBranch , tagflag , branchList , projectsId , owner , visible }) {
|
||||
function SelectOverlay({ changeBranch , tagflag , projectsId , owner , visible }) {
|
||||
const [ inputValue , setInputValue] = useState(undefined);
|
||||
const [ nav , setNav ] = useState(0);
|
||||
const [ isSpin , setIsSpin ] = useState(true);
|
||||
|
@ -11,21 +11,13 @@ function SelectOverlay({ changeBranch , tagflag , branchList , projectsId , owne
|
|||
const [ datas , setDatas ] = useState(undefined);
|
||||
const [ keys ,setKeys] = useState("branch");
|
||||
|
||||
// useEffect(()=>{
|
||||
// if(visible){
|
||||
// setKeys("branch");
|
||||
// getBranchs(projectsId,owner);
|
||||
// setIsSpin(true);
|
||||
// }
|
||||
// },[visible])
|
||||
|
||||
useEffect(()=>{
|
||||
if(branchList){
|
||||
setData(branchList);
|
||||
setDatas(branchList);
|
||||
setIsSpin(false);
|
||||
if(visible){
|
||||
setKeys("branch");
|
||||
getBranchs(projectsId,owner);
|
||||
setIsSpin(true);
|
||||
}
|
||||
},[branchList])
|
||||
},[visible])
|
||||
|
||||
async function getBranchs(id,owner){
|
||||
let result = await getBranch(id,owner);
|
||||
|
|
|
@ -12,26 +12,15 @@ function SystemNotice({system_notification,history}){
|
|||
if(system_notification && !cookie.load('notice_stage')){
|
||||
setVisible(true);
|
||||
}
|
||||
},[system_notification])
|
||||
},[system_notification,history.location])
|
||||
|
||||
function sureContinue() {
|
||||
// if(login && ( system_notification && system_notification.id )){
|
||||
// const url = `/users/${login}/system_notification_histories.json`;
|
||||
// axios.post(url,{
|
||||
// system_notification_id:system_notification.id
|
||||
// }).then(result=>{
|
||||
// if(result && result.status === 0){
|
||||
// setVisible(false);
|
||||
// hideSystemNotice();
|
||||
// }
|
||||
// }).catch(error=>{})
|
||||
// }
|
||||
console.log("cookies before:",cookie.load('notice_stage')) ;
|
||||
cookie.remove('notice_stage');
|
||||
|
||||
let inFifteenMinutes = new Date(new Date().getTime() + 24 * 3600 * 1000);//一天
|
||||
// let inFifteenMinutes = new Date(new Date().getTime() + 60 * 1000);//一分钟
|
||||
cookie.save('notice_stage', true,{ expires: inFifteenMinutes });
|
||||
console.log("cookies after:",cookie.load('notice_stage')) ;
|
||||
cookie.save('notice_stage', true,{ expires: inFifteenMinutes,path:"/" });
|
||||
|
||||
setVisible(false);
|
||||
}
|
||||
|
||||
|
|
|
@ -407,14 +407,14 @@ function CoderDepot(props){
|
|||
<Link to={`/${owner}/${projectsId}/branches`} className="iconBtn">
|
||||
<i className="iconfont icon-master_icon font-16"></i>
|
||||
<span>分支</span>
|
||||
<span>{projectDetail && projectDetail.branches && projectDetail.branches.total_count}</span>
|
||||
<span>{projectDetail && projectDetail.branches_count}</span>
|
||||
</Link>
|
||||
</AlignCenter>
|
||||
<AlignCenter className="mr20">
|
||||
<Link to={`/${owner}/${projectsId}/tags`} className="iconBtn">
|
||||
<i className="iconfont icon-biaoqianicon font-16"></i>
|
||||
<span>标签</span>
|
||||
<span>{projectDetail && projectDetail.tags && projectDetail.tags.total_count}</span>
|
||||
<span>{projectDetail && projectDetail.tags_count}</span>
|
||||
</Link>
|
||||
</AlignCenter>
|
||||
</React.Fragment>
|
||||
|
|
|
@ -734,7 +734,9 @@ a.color-grey-ccc:hover{
|
|||
border: 1px solid rgba(42, 97, 255, 0.23);
|
||||
border-radius: 4px;
|
||||
margin-left: 16px;
|
||||
align-items: center;
|
||||
& .treecopy{
|
||||
margin-top: 20px;
|
||||
}
|
||||
& .markdown-body table{
|
||||
background: #FAFCFF;
|
||||
}
|
||||
|
|
|
@ -22,9 +22,14 @@
|
|||
border-bottom: none;
|
||||
}
|
||||
.treeinfo{
|
||||
max-width: 399px;
|
||||
width: 399px;
|
||||
flex:1;
|
||||
flex-direction: column;
|
||||
&>a{
|
||||
display: block;
|
||||
width: 399px;
|
||||
|
||||
}
|
||||
a:hover{
|
||||
span{
|
||||
color: #466AFF!important;
|
||||
|
|
|
@ -367,7 +367,9 @@ class CreateMerge extends Component {
|
|||
value={pull}
|
||||
onSelect={(e) => this.selectBrach('pull', e)}
|
||||
showSearch
|
||||
className="merge-flex1 flex1"
|
||||
className="merge-flex1 flex1 matchwidth"
|
||||
dropdownMatchSelectWidth={false}
|
||||
dropdownClassName="overlihide"
|
||||
>
|
||||
{this.renderBrances(pullBranches)}
|
||||
</Select>
|
||||
|
@ -393,7 +395,9 @@ class CreateMerge extends Component {
|
|||
value={merge}
|
||||
onSelect={(e) => this.selectBrach('merge', e)}
|
||||
showSearch
|
||||
className="merge-flex1 flex1"
|
||||
className="merge-flex1 flex1 matchwidth"
|
||||
dropdownMatchSelectWidth={false}
|
||||
dropdownClassName="overlihide"
|
||||
>
|
||||
{this.renderBrances(mergeBranches)}
|
||||
</Select>
|
||||
|
|
|
@ -110,7 +110,7 @@ class MergeItem extends Component {
|
|||
<Tag className="pr-branch-tag">
|
||||
<Link
|
||||
to={`/${item.is_original ? item.fork_project_user : owner}/${ item.is_original ? item.fork_project_identifier : projectsId }/tree/${turnbar(item.pull_request_head)}`}
|
||||
className="maxW200px hide-1 ver-middle"
|
||||
className="maxW200px task-hide ver-middle" style={{maxWidth:"200px"}}
|
||||
>
|
||||
{item.is_original
|
||||
? item.fork_project_user
|
||||
|
@ -134,7 +134,7 @@ class MergeItem extends Component {
|
|||
<Tag className="pr-branch-tag">
|
||||
<Link
|
||||
to={`/${owner}/${projectsId}/tree/${turnbar(item.pull_request_base)}`}
|
||||
className="maxW200px hide-1 ver-middle"
|
||||
className="maxW200px task-hide ver-middle" style={{maxWidth:"200px"}}
|
||||
>
|
||||
{/* {item.is_fork ? item.pull_request_base : `${item.author_name}:${item.pull_request_base}`} */}
|
||||
{project_author_name}:{item.pull_request_base}
|
||||
|
|
|
@ -366,7 +366,7 @@ class MessageCount extends Component {
|
|||
<Tag className="pr-branch-tag">
|
||||
<Link
|
||||
to={`/${data.pull_request.is_original ? data.pull_request.fork_project_user : data.issue.project_author_name}/${data.pull_request.is_original?data.project_identifier:projectsId}/tree/${turnbar(data.pull_request && data.pull_request.head)}`}
|
||||
className="ver-middle"
|
||||
className="ver-middle task-hide" style={{maxWidth:"200px"}} title={`${data.pull_request.is_original ? data.pull_request.fork_project_user : data.issue.project_author_name}: ${data.pull_request && data.pull_request.head}`}
|
||||
>
|
||||
{data.pull_request.is_original ? data.pull_request.fork_project_user : data.issue.project_author_name}: {data.pull_request && data.pull_request.head}
|
||||
</Link>
|
||||
|
@ -381,7 +381,7 @@ class MessageCount extends Component {
|
|||
<Tag className="pr-branch-tag">
|
||||
<Link
|
||||
to={`/${owner}/${projectsId}/tree/${data.pull_request.base}`}
|
||||
className="ver-middle"
|
||||
className="ver-middle task-hide" style={{maxWidth:"200px"}} title={`${data.issue.project_author_name}:${data.pull_request.base}`}
|
||||
>
|
||||
{data.issue.project_author_name}:{data.pull_request.base}
|
||||
</Link>
|
||||
|
|
|
@ -64,12 +64,12 @@ class UpdateMerge extends Component {
|
|||
<div className="color-grey-3 mb10 fwb">源分支:</div>
|
||||
|
||||
<Input.Group compact className="display-flex">
|
||||
<Button className="merge-header-button maxW50 hide-1 task-hide">
|
||||
<Button className="merge-header-button flex1 maxW50 hide-1 task-hide" disabled>
|
||||
{data.is_original ? `${data.fork_project_user_name}/${data.fork_project_identifier}` : `${data.project_author}/${data.project_name}`}
|
||||
</Button>
|
||||
<Select
|
||||
defaultValue={data.is_original ? `${data.fork_project_user}:${pull}` : `${pull}`}
|
||||
className="minW50 merge-flex1 flex1"
|
||||
className="minW50 merge-flex1 flex1 matchwidth"
|
||||
disabled
|
||||
></Select>{" "}
|
||||
</Input.Group>{" "}
|
||||
|
@ -83,12 +83,12 @@ class UpdateMerge extends Component {
|
|||
<div>
|
||||
<div className="color-grey-3 mb10 fwb"> 目标分支 : </div>{" "}
|
||||
<Input.Group compact className="display-flex">
|
||||
<Button className="merge-header-button maxW50 hide-1 task-hide">
|
||||
<Button className="merge-header-button flex1 maxW50 hide-1 task-hide" disabled>
|
||||
{`${data.project_author}/${data.project_name}`}
|
||||
</Button>
|
||||
<Select
|
||||
defaultValue={data.is_original ? `${data.project_login}:${merge}` : `${merge}`}
|
||||
className="minW50 merge-flex1 flex1"
|
||||
className="minW50 merge-flex1 flex1 matchwidth"
|
||||
disabled
|
||||
></Select>{" "}
|
||||
</Input.Group>{" "}
|
||||
|
|
|
@ -40,6 +40,7 @@ form .ant-cascader-picker, form .ant-select {
|
|||
}
|
||||
.merge-header-button{
|
||||
background:rgba(241,248,255,1);
|
||||
text-align: left;
|
||||
}
|
||||
.width70{
|
||||
width:70%;
|
||||
|
@ -213,4 +214,12 @@ form .ant-cascader-picker, form .ant-select {
|
|||
.mergeRequest .folders{
|
||||
/* width: 72rem; */
|
||||
width: 100%;
|
||||
}
|
||||
}
|
||||
|
||||
.matchwidth .ant-select-selection__rendered{
|
||||
width: 200px;
|
||||
}
|
||||
.overlihide li{
|
||||
max-width: 450px;
|
||||
|
||||
}
|
|
@ -63,7 +63,7 @@ function Index(props){
|
|||
{notice_url && <ul className="securityUl ul-border-buttom">
|
||||
<li>消息通知</li>
|
||||
<li className={(pathname.indexOf("/settings/notice")>-1 && pathname.indexOf("/settings/notice/config") == -1) || pathname.indexOf("/settings/notice/privateLetter")>-1 ?"active":""}><Link to={"/settings/notice"}><i className="iconfont icon-wodetongzhi"></i><span className="text-shodow-bold">我的通知</span></Link></li>
|
||||
{/* <li className={pathname.indexOf("/settings/notice/config")>-1 ?"active":""}><Link to={'/settings/notice/config'}><i className="iconfont icon-tongzhiguanli"></i><span className="text-shodow-bold">通知管理</span></Link></li> */}
|
||||
<li className={pathname.indexOf("/settings/notice/config")>-1 ?"active":""}><Link to={'/settings/notice/config'}><i className="iconfont icon-tongzhiguanli"></i><span className="text-shodow-bold">通知管理</span></Link></li>
|
||||
</ul>}
|
||||
<ul className="securityUl">
|
||||
<li>安全设置</li>
|
||||
|
@ -73,18 +73,24 @@ function Index(props){
|
|||
<LongWidth>
|
||||
<Gap>
|
||||
<Switch>
|
||||
<Route
|
||||
path="/settings/notice"
|
||||
render={(p) => (
|
||||
<MyNoticeIndex {...props} {...p}/>
|
||||
)}
|
||||
></Route>
|
||||
<Route
|
||||
path="/settings/notice/config"
|
||||
render={(p) => (
|
||||
<NoticeManager {...props} {...p}/>
|
||||
)}
|
||||
></Route>
|
||||
<Route
|
||||
path="/settings/notice/privateLetter"
|
||||
render={(p)=>(
|
||||
<PrivateLetter{...props} {...p}/>
|
||||
)}
|
||||
></Route>
|
||||
<Route
|
||||
path="/settings/notice"
|
||||
render={(p) => (
|
||||
<MyNoticeIndex {...props} {...p}/>
|
||||
)}
|
||||
></Route>
|
||||
<Route
|
||||
path="/settings/SSH/new"
|
||||
render={(p) => (
|
||||
|
@ -103,12 +109,6 @@ function Index(props){
|
|||
<SSHIndex {...props} {...p}/>
|
||||
)}
|
||||
></Route>
|
||||
<Route
|
||||
path="/settings/notice/privateLetter"
|
||||
render={(p)=>(
|
||||
<PrivateLetter{...props} {...p}/>
|
||||
)}
|
||||
></Route>
|
||||
</Switch>
|
||||
</Gap>
|
||||
</LongWidth>
|
||||
|
|
|
@ -1,9 +1,52 @@
|
|||
import { Button, Checkbox } from "antd";
|
||||
import React from "react";
|
||||
|
||||
import { Checkbox } from "antd";
|
||||
import React, { useEffect, useState } from "react";
|
||||
import axios from 'axios';
|
||||
import './Index.scss';
|
||||
|
||||
function NoticeManager(props){
|
||||
const {current_user} = props;
|
||||
|
||||
const [settingTypes, setSettingTypes] = useState();
|
||||
const [userNotification, setUserNotification] = useState();
|
||||
const [userEmail, setUserEmail] = useState();
|
||||
|
||||
function onChange(type,e,setting){
|
||||
let notification_body = userNotification;
|
||||
let email_body = userEmail;
|
||||
if(type){//站内信
|
||||
notification_body[setting] = e.target.checked;
|
||||
}else{//邮件
|
||||
email_body[setting] = e.target.checked;
|
||||
}
|
||||
axios.post(`/users/${current_user.login}/template_message_settings/update_setting.json`,{
|
||||
setting:{
|
||||
notification_body:notification_body,
|
||||
email_body:email_body
|
||||
}
|
||||
}).then(response=>{
|
||||
if(response && response.status === 0){
|
||||
getUserSettings();
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
function getUserSettings(){
|
||||
axios.get(`/users/${current_user.login}/template_message_settings.json`).then((response)=>{
|
||||
if(response && response.status === 200 ){
|
||||
setUserEmail(response.data.email_body);
|
||||
setUserNotification(response.data.notification_body);
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
useEffect(()=>{
|
||||
axios.get("/template_message_settings.json").then(response => {
|
||||
if (response && response.status === 200) {
|
||||
setSettingTypes(response.data.setting_types);
|
||||
}
|
||||
})
|
||||
getUserSettings();
|
||||
},[])
|
||||
|
||||
return(
|
||||
<div className="notice01">
|
||||
|
@ -12,87 +55,23 @@ function NoticeManager(props){
|
|||
</div>
|
||||
<div>
|
||||
<span className="notice-manager-tip">您可以通过通知管理来选择接受通知的方式</span>
|
||||
<div className="manager-cont-top">
|
||||
我创建或负责的
|
||||
</div>
|
||||
<div className="manager-cont">
|
||||
<div className="manager-cont-title">易修状态变更</div>
|
||||
<Checkbox defaultChecked='true' disabled>站内信</Checkbox>
|
||||
<Checkbox >邮件</Checkbox>
|
||||
</div>
|
||||
<div className="manager-cont">
|
||||
<div className="manager-cont-title">易修截止日期到达最后一天</div>
|
||||
<Checkbox defaultChecked='true' disabled>站内信</Checkbox>
|
||||
<Checkbox >邮件</Checkbox>
|
||||
</div>
|
||||
<div className="manager-cont">
|
||||
<div className="manager-cont-title">合并请求状态变更</div>
|
||||
<Checkbox defaultChecked='true' disabled>站内信</Checkbox>
|
||||
<Checkbox >邮件</Checkbox>
|
||||
</div>
|
||||
<div className="manager-cont">
|
||||
<div className="manager-cont-title">易修有新的评论</div>
|
||||
<Checkbox defaultChecked='true'>站内信</Checkbox>
|
||||
<Checkbox >邮件</Checkbox>
|
||||
</div>
|
||||
<div className="manager-cont">
|
||||
<div className="manager-cont-title">合并请求有新的评论</div>
|
||||
<Checkbox defaultChecked='true'>站内信</Checkbox>
|
||||
<Checkbox >邮件</Checkbox>
|
||||
</div>
|
||||
|
||||
<div className="manager-cont-top">
|
||||
我管理的仓库
|
||||
</div>
|
||||
<div className="manager-cont">
|
||||
<div className="manager-cont-title">被关注</div>
|
||||
<Checkbox defaultChecked='true'>站内信</Checkbox>
|
||||
<Checkbox >邮件</Checkbox>
|
||||
</div>
|
||||
<div className="manager-cont">
|
||||
<div className="manager-cont-title">被点赞</div>
|
||||
<Checkbox defaultChecked='true'>站内信</Checkbox>
|
||||
<Checkbox >邮件</Checkbox>
|
||||
</div>
|
||||
<div className="manager-cont">
|
||||
<div className="manager-cont-title">被复刻</div>
|
||||
<Checkbox defaultChecked='true'>站内信</Checkbox>
|
||||
<Checkbox >邮件</Checkbox>
|
||||
</div>
|
||||
<div className="manager-cont">
|
||||
<div className="manager-cont-title">有新的里程碑</div>
|
||||
<Checkbox defaultChecked='true'>站内信</Checkbox>
|
||||
<Checkbox >邮件</Checkbox>
|
||||
</div>
|
||||
|
||||
<div className="manager-cont-top">
|
||||
我关注的仓库
|
||||
</div>
|
||||
<div className="manager-cont">
|
||||
<div className="manager-cont-title">被删除</div>
|
||||
<Checkbox defaultChecked='true'>站内信</Checkbox>
|
||||
<Checkbox >邮件</Checkbox>
|
||||
</div>
|
||||
<div className="manager-cont">
|
||||
<div className="manager-cont-title">被转移</div>
|
||||
<Checkbox defaultChecked='true'>站内信</Checkbox>
|
||||
<Checkbox >邮件</Checkbox>
|
||||
</div>
|
||||
<div className="manager-cont">
|
||||
<div className="manager-cont-title">有新的易修</div>
|
||||
<Checkbox defaultChecked='true'>站内信</Checkbox>
|
||||
<Checkbox >邮件</Checkbox>
|
||||
</div>
|
||||
<div className="manager-cont">
|
||||
<div className="manager-cont-title">有新的合并请求</div>
|
||||
<Checkbox defaultChecked='true'>站内信</Checkbox>
|
||||
<Checkbox >邮件</Checkbox>
|
||||
</div>
|
||||
<div className="manager-cont">
|
||||
<div className="manager-cont-title">有新的版本发布</div>
|
||||
<Checkbox defaultChecked='true'>站内信</Checkbox>
|
||||
<Checkbox >邮件</Checkbox>
|
||||
</div>
|
||||
{settingTypes && userNotification && userEmail && settingTypes.map((item,key)=>{
|
||||
return(
|
||||
item.type_name && <div key={key}>
|
||||
<div className="manager-cont-top">{item.type_name}</div>
|
||||
{item.settings.map((i, k) => {
|
||||
const setting = item.type.substring(item.type.indexOf("::")+2)+"::"+i.key;
|
||||
return (
|
||||
<div className="manager-cont" key={k}>
|
||||
<div className="manager-cont-title">{i.name}</div>
|
||||
<Checkbox disabled = {i.notification_disabled} defaultChecked={userNotification[setting]} onChange={(e)=>{onChange(true,e,setting)}}>站内信</Checkbox>
|
||||
<Checkbox disabled = {i.email_disabled} defaultChecked={userEmail[setting]} onChange={(e)=>{onChange(false,e,setting)}}>邮件</Checkbox>
|
||||
</div>
|
||||
)
|
||||
})}
|
||||
</div>
|
||||
)
|
||||
})}
|
||||
</div>
|
||||
</div>
|
||||
)
|
||||
|
|
|
@ -11,7 +11,6 @@ export default Form.create()(
|
|||
const { getFieldDecorator, validateFields , setFieldsValue } = props && props.form;
|
||||
// const { username } = props && props.match && props.match.params;
|
||||
const { resetUserInfo , current_user } = props;
|
||||
console.log(props);
|
||||
|
||||
useEffect(()=>{
|
||||
if(current_user && current_user.login){
|
||||
|
|
Loading…
Reference in New Issue