Merge branch 'forge' of http://bdgit.educoder.net/Hjqreturn/educoder into forge
commit
75a24496da
@ -0,0 +1,89 @@
|
|||||||
|
import React , { Component } from 'react';
|
||||||
|
import { Link } from 'react-router-dom';
|
||||||
|
import { Input , AutoComplete , Dropdown , Menu , Icon } from 'antd';
|
||||||
|
import axios from 'axios';
|
||||||
|
|
||||||
|
const { Option } = AutoComplete;
|
||||||
|
const MENU_LIST = ['管理员','可读权限','可写权限'];
|
||||||
|
class Collaborator extends Component{
|
||||||
|
constructor(props){
|
||||||
|
super(props);
|
||||||
|
this.state={
|
||||||
|
userDataSource:undefined
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 选择用户
|
||||||
|
changeInputUser=(e)=>{
|
||||||
|
console.log(e);
|
||||||
|
const url = `/users/list.json`;
|
||||||
|
axios.get(url,{
|
||||||
|
params:{
|
||||||
|
search:e
|
||||||
|
}
|
||||||
|
}).then(result=>{
|
||||||
|
if(result){
|
||||||
|
this.setState({
|
||||||
|
userDataSource:result.data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}).catch(error=>{
|
||||||
|
console.log(error);
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
changeOperaiton=(e,id)=>{
|
||||||
|
console.log(e,id);
|
||||||
|
}
|
||||||
|
render(){
|
||||||
|
const { userDataSource } = this.state;
|
||||||
|
|
||||||
|
const menu =(id)=> (
|
||||||
|
<Menu>
|
||||||
|
{
|
||||||
|
MENU_LIST.map((item,key)=>{
|
||||||
|
return(
|
||||||
|
<Menu.Item key="key" onClick={(e)=>this.changeOperaiton(e,id)}>{item}</Menu.Item>
|
||||||
|
)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
</Menu>
|
||||||
|
)
|
||||||
|
|
||||||
|
const source = userDataSource && userDataSource.map((item,key)=>{
|
||||||
|
return(
|
||||||
|
<Option value={item.login}>{item.username}</Option>
|
||||||
|
)
|
||||||
|
})
|
||||||
|
return(
|
||||||
|
<div className="normalBox">
|
||||||
|
<div className="normalBox-title font-16">
|
||||||
|
协作者
|
||||||
|
</div>
|
||||||
|
<div className="collaboratorList">
|
||||||
|
<div className="collaboratorItem">
|
||||||
|
<span><Link to={``} className="color-blue">caicai</Link></span>
|
||||||
|
<span>
|
||||||
|
<Dropdown overlay={menu(1)} placement={"bottomCenter"}>
|
||||||
|
<span>管理员<Icon type="down" /></span>
|
||||||
|
</Dropdown>
|
||||||
|
</span>
|
||||||
|
<span style={{justifyContent:"center"}}>
|
||||||
|
<a className="red_btn">删除</a>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className="addPanel">
|
||||||
|
<AutoComplete
|
||||||
|
dataSource={source}
|
||||||
|
style={{ width: 200 }}
|
||||||
|
onChange={this.changeInputUser}
|
||||||
|
placeholder="搜索用户"
|
||||||
|
/>
|
||||||
|
<a className="small_submitBtn ml20" onClick={this.addCollaborator}>增加协作者</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
export default Collaborator;
|
@ -0,0 +1,62 @@
|
|||||||
|
import React , { Component } from 'react';
|
||||||
|
import { Link , Route , Switch } from 'react-router-dom';
|
||||||
|
|
||||||
|
import '../css/index.css';
|
||||||
|
import './setting.css';
|
||||||
|
|
||||||
|
import Loadable from 'react-loadable';
|
||||||
|
import Loading from '../../Loading';
|
||||||
|
|
||||||
|
const Branch = Loadable({
|
||||||
|
loader: () => import('./Branch'),
|
||||||
|
loading: Loading,
|
||||||
|
})
|
||||||
|
const Setting = Loadable({
|
||||||
|
loader: () => import('./Setting'),
|
||||||
|
loading: Loading,
|
||||||
|
})
|
||||||
|
const Collaborator = Loadable({
|
||||||
|
loader: () => import('./Collaborator'),
|
||||||
|
loading: Loading,
|
||||||
|
})
|
||||||
|
class Index extends Component{
|
||||||
|
render(){
|
||||||
|
const { projectsId } = this.props.match.params;
|
||||||
|
console.log(this.props);
|
||||||
|
const { pathname } = this.props.history.location;
|
||||||
|
|
||||||
|
const flag = (pathname === `/projects/${projectsId}/setting`);
|
||||||
|
return(
|
||||||
|
<div>
|
||||||
|
<ul className="settingNav">
|
||||||
|
<li className={flag?"active":""}><Link to={`/projects/${projectsId}/setting`}>仓库</Link></li>
|
||||||
|
<li className={pathname.indexOf('setting/collaborator')>-1?"active":""}><Link to={`/projects/${projectsId}/setting/collaborator`}>协作者</Link></li>
|
||||||
|
<li className={pathname.indexOf('setting/branch')>-1?"active":""}><Link to={`/projects/${projectsId}/setting/branch`}>分支列表</Link></li>
|
||||||
|
</ul>
|
||||||
|
<div className="main">
|
||||||
|
<Switch {...this.props}>
|
||||||
|
{/* 分支列表 */}
|
||||||
|
<Route path="/projects/:projectsId/setting/branch"
|
||||||
|
render={
|
||||||
|
(props) => (<Branch {...this.props} {...props} {...this.state}/>)
|
||||||
|
}
|
||||||
|
></Route>
|
||||||
|
{/* 协作者 */}
|
||||||
|
<Route path="/projects/:projectsId/setting/collaborator"
|
||||||
|
render={
|
||||||
|
(props) => (<Collaborator {...this.props} {...props} {...this.state}/>)
|
||||||
|
}
|
||||||
|
></Route>
|
||||||
|
{/* 修改仓库信息 */}
|
||||||
|
<Route path="/projects/:projectsId/setting"
|
||||||
|
render={
|
||||||
|
(props) => (<Setting {...this.props} {...props} {...this.state}/>)
|
||||||
|
}
|
||||||
|
></Route>
|
||||||
|
</Switch>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
export default Index;
|
@ -0,0 +1,143 @@
|
|||||||
|
import React , { Component } from 'react';
|
||||||
|
import { Form , Input , Checkbox , Select } from 'antd';
|
||||||
|
|
||||||
|
import axios from 'axios';
|
||||||
|
const { TextArea } = Input;
|
||||||
|
const { Option } = Select;
|
||||||
|
class Setting extends Component{
|
||||||
|
constructor(props){
|
||||||
|
super(props);
|
||||||
|
this.state={
|
||||||
|
preType:"1",
|
||||||
|
CategoryList:undefined
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
componentDidMount=()=>{
|
||||||
|
this.getCategory();
|
||||||
|
this.getInfo();
|
||||||
|
}
|
||||||
|
|
||||||
|
getInfo=()=>{
|
||||||
|
const { current_user } = this.props;
|
||||||
|
const { projectsId } = this.props.match.params;
|
||||||
|
const url = `/${current_user.login}/${projectsId}.json`;
|
||||||
|
axios.get(url).then(result=>{
|
||||||
|
if(result){
|
||||||
|
this.props.form.setFieldsValue({
|
||||||
|
...result.data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}).catch(error=>{
|
||||||
|
console.log(error);
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
getCategory=()=>{
|
||||||
|
const url = `/project_categories.json`
|
||||||
|
axios.get(url).then((result)=>{
|
||||||
|
if(result){
|
||||||
|
let CategoryList = this.setOptionsList(result.data.project_categories)
|
||||||
|
this.setState({
|
||||||
|
CategoryList
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}).catch((error)=>{})
|
||||||
|
}
|
||||||
|
|
||||||
|
setOptionsList = (data) =>{
|
||||||
|
let list = undefined;
|
||||||
|
if(data && data.length > 0){
|
||||||
|
list = data.map((item,key)=>{
|
||||||
|
return(
|
||||||
|
<Option key={item.id}>{item.name}</Option>
|
||||||
|
)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 更新仓库设置
|
||||||
|
resetSetting=()=>{
|
||||||
|
this.props.form.validateFields((err,values)=>{
|
||||||
|
if(!err){
|
||||||
|
const { projectsId } = this.props.match.params;
|
||||||
|
const url = `/projects/${projectsId}.json`;
|
||||||
|
axios.patch(url,{
|
||||||
|
...values
|
||||||
|
}).then(result=>{
|
||||||
|
if(result){
|
||||||
|
this.props.showNotification(`仓库信息修改成功!`)
|
||||||
|
}
|
||||||
|
}).catch(error=>{
|
||||||
|
console.log(error);
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
render(){
|
||||||
|
const { getFieldDecorator } = this.props.form;
|
||||||
|
|
||||||
|
const { preType , CategoryList } = this.state;
|
||||||
|
return(
|
||||||
|
<div className="normalBox">
|
||||||
|
<div className="normalBox-title font-16">
|
||||||
|
基本设置
|
||||||
|
</div>
|
||||||
|
<Form className="baseForm">
|
||||||
|
<Form.Item
|
||||||
|
label="项目名称"
|
||||||
|
>
|
||||||
|
{getFieldDecorator('name', {
|
||||||
|
rules: [{
|
||||||
|
required: true, message: '请输入项目名称'
|
||||||
|
}],
|
||||||
|
})(
|
||||||
|
<Input placeholder="请输入项目名称"/>
|
||||||
|
)}
|
||||||
|
</Form.Item >
|
||||||
|
<div className="df" style={{alignItems:"center"}}>
|
||||||
|
<span className="mr20 mb15 font-16">可见性</span>
|
||||||
|
<Form.Item
|
||||||
|
label=""
|
||||||
|
>
|
||||||
|
{getFieldDecorator('private', {
|
||||||
|
rules: [],
|
||||||
|
})(
|
||||||
|
<Checkbox value="private">将仓库设为私有</Checkbox>
|
||||||
|
)}
|
||||||
|
</Form.Item >
|
||||||
|
</div>
|
||||||
|
<Form.Item
|
||||||
|
label="仓库描述"
|
||||||
|
>
|
||||||
|
{getFieldDecorator('description', {
|
||||||
|
rules: [],
|
||||||
|
})(
|
||||||
|
<TextArea placeholder="请输入仓库描述" style={{height:"80px"}}/>
|
||||||
|
)}
|
||||||
|
</Form.Item >
|
||||||
|
<Form.Item
|
||||||
|
label="项目类别"
|
||||||
|
>
|
||||||
|
{getFieldDecorator('project_category_id', {
|
||||||
|
rules: [{
|
||||||
|
required: true, message: '请选择大类别'
|
||||||
|
}],
|
||||||
|
})(
|
||||||
|
<Select value={preType}>
|
||||||
|
{CategoryList}
|
||||||
|
</Select>
|
||||||
|
)}
|
||||||
|
</Form.Item>
|
||||||
|
<p className="clearfix">
|
||||||
|
<a className="submitBtn" onClick={this.resetSetting}>更新仓库设置</a>
|
||||||
|
</p>
|
||||||
|
</Form>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const WrappedSettingIndexForm = Form.create({ name: 'settingForm' })(Setting);
|
||||||
|
export default WrappedSettingIndexForm;
|
@ -0,0 +1,75 @@
|
|||||||
|
.settingNav{
|
||||||
|
display: flex;
|
||||||
|
border-bottom: 1px solid #ddd;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
.settingNav li{
|
||||||
|
height: 46px;
|
||||||
|
line-height: 46px;
|
||||||
|
position: relative;
|
||||||
|
padding:0px 15px;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
.settingNav li.active a{
|
||||||
|
color: #4CACFF!important;
|
||||||
|
}
|
||||||
|
.settingNav li.active::after{
|
||||||
|
position: absolute;
|
||||||
|
width: 100%;
|
||||||
|
bottom: 0px;
|
||||||
|
height: 2px;
|
||||||
|
left: 0px;
|
||||||
|
background: #4CACFF;
|
||||||
|
content: '';
|
||||||
|
}
|
||||||
|
.baseForm{
|
||||||
|
padding:15px 20px!important;
|
||||||
|
}
|
||||||
|
.baseForm .ant-row.ant-form-item{
|
||||||
|
margin-bottom: 15px;
|
||||||
|
}
|
||||||
|
.submitBtn{
|
||||||
|
display: block;
|
||||||
|
float: left;
|
||||||
|
padding:0px 12px;
|
||||||
|
border-radius: 4px;
|
||||||
|
height: 35px;
|
||||||
|
line-height: 35px;
|
||||||
|
color: #fff!important;
|
||||||
|
background: #4CACFF;
|
||||||
|
}
|
||||||
|
.small_submitBtn{
|
||||||
|
display: block;
|
||||||
|
padding:0px 12px;
|
||||||
|
border-radius: 4px;
|
||||||
|
height: 32px;
|
||||||
|
line-height: 32px;
|
||||||
|
color: #fff!important;
|
||||||
|
background: #4CACFF;
|
||||||
|
}
|
||||||
|
.addPanel{
|
||||||
|
display: flex;
|
||||||
|
padding:15px;
|
||||||
|
}
|
||||||
|
.red_btn{
|
||||||
|
display: block;
|
||||||
|
padding:0px 8px;
|
||||||
|
height: 28px;
|
||||||
|
line-height: 28px;
|
||||||
|
color: #fff;
|
||||||
|
background: #db2828;
|
||||||
|
border-radius: 3px;
|
||||||
|
}
|
||||||
|
.collaboratorItem{
|
||||||
|
display: flex;
|
||||||
|
border-bottom: 1px solid #f4f4f4;
|
||||||
|
padding:15px;
|
||||||
|
}
|
||||||
|
.collaboratorItem>span{
|
||||||
|
flex: 1;
|
||||||
|
display: flex;
|
||||||
|
}
|
||||||
|
.branchSelect{
|
||||||
|
width: 200px;
|
||||||
|
height: 32px;
|
||||||
|
}
|
Loading…
Reference in new issue