mirror of
https://github.com/YMFE/yapi.git
synced 2025-03-07 14:16:52 +08:00
feat: merge dev to local
This commit is contained in:
commit
f064df4863
@ -5,7 +5,7 @@ import { connect } from 'react-redux';
|
||||
import { Select, Button, Modal, Row, Col, message, Popconfirm } from 'antd';
|
||||
import './MemberList.scss';
|
||||
import { autobind } from 'core-decorators';
|
||||
import { fetchGroupMemberList, fetchGroupMsg, addMember, delMember } from '../../../reducer/modules/group.js'
|
||||
import { fetchGroupMemberList, fetchGroupMsg, addMember, delMember, changeMemberRole } from '../../../reducer/modules/group.js'
|
||||
import UsernameAutoComplete from '../../../components/UsernameAutoComplete/UsernameAutoComplete.js';
|
||||
const Option = Select.Option;
|
||||
|
||||
@ -30,7 +30,8 @@ const arrayAddKey = (arr) => {
|
||||
fetchGroupMemberList,
|
||||
fetchGroupMsg,
|
||||
addMember,
|
||||
delMember
|
||||
delMember,
|
||||
changeMemberRole
|
||||
}
|
||||
)
|
||||
class MemberList extends Component {
|
||||
@ -52,13 +53,10 @@ class MemberList extends Component {
|
||||
fetchGroupMsg: PropTypes.func,
|
||||
addMember: PropTypes.func,
|
||||
delMember: PropTypes.func,
|
||||
changeMemberRole: PropTypes.func,
|
||||
role: PropTypes.string
|
||||
}
|
||||
|
||||
@autobind
|
||||
handleChange(value) {
|
||||
console.log(`selected ${value}`);
|
||||
}
|
||||
|
||||
@autobind
|
||||
showAddMemberModal() {
|
||||
@ -67,6 +65,7 @@ class MemberList extends Component {
|
||||
});
|
||||
}
|
||||
|
||||
// 重新获取列表
|
||||
@autobind
|
||||
reFetchList() {
|
||||
this.props.fetchGroupMemberList(this.props.currGroup._id).then((res) => {
|
||||
@ -77,19 +76,7 @@ class MemberList extends Component {
|
||||
});
|
||||
}
|
||||
|
||||
@autobind
|
||||
deleteConfirm(member_uid) {
|
||||
return () => {
|
||||
const id = this.props.currGroup._id;
|
||||
this.props.delMember({ id, member_uid }).then((res) => {
|
||||
if (!res.payload.data.errcode) {
|
||||
message.success(res.payload.data.errmsg);
|
||||
this.reFetchList(); // 添加成功后重新获取分组成员列表
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// 增 - 添加成员
|
||||
@autobind
|
||||
handleOk() {
|
||||
console.log(this.props.currGroup._id, this.state.inputUid);
|
||||
@ -104,21 +91,51 @@ class MemberList extends Component {
|
||||
}
|
||||
});
|
||||
}
|
||||
// 添加成员时 选择新增成员权限
|
||||
@autobind
|
||||
changeNewMemberRole(value) {
|
||||
return () => {
|
||||
console.log(this.props.currGroup._id, value);
|
||||
}
|
||||
}
|
||||
|
||||
// 删 - 删除分组成员
|
||||
@autobind
|
||||
deleteConfirm(member_uid) {
|
||||
return () => {
|
||||
const id = this.props.currGroup._id;
|
||||
this.props.delMember({ id, member_uid }).then((res) => {
|
||||
if (!res.payload.data.errcode) {
|
||||
message.success(res.payload.data.errmsg);
|
||||
this.reFetchList(); // 添加成功后重新获取分组成员列表
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// 改 - 修改成员权限
|
||||
@autobind
|
||||
changeUserRole(e) {
|
||||
console.log(e);
|
||||
const id = this.props.currGroup._id;
|
||||
const role = e.split('-')[0];
|
||||
const member_uid = e.split('-')[1];
|
||||
this.props.changeMemberRole({ id, member_uid, role }).then((res) => {
|
||||
if (!res.payload.data.errcode) {
|
||||
message.success(res.payload.data.errmsg);
|
||||
this.reFetchList(); // 添加成功后重新获取分组成员列表
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// 关闭模态框
|
||||
@autobind
|
||||
handleCancel() {
|
||||
// 取消模态框的时候重置模态框中的值
|
||||
this.setState({
|
||||
visible: false
|
||||
});
|
||||
}
|
||||
|
||||
@autobind
|
||||
changeMemberRole(value) {
|
||||
return () => {
|
||||
console.log(this.props.currGroup._id, value);
|
||||
}
|
||||
}
|
||||
|
||||
componentWillReceiveProps(nextProps) {
|
||||
if (this.props.currGroup !== nextProps.currGroup) {
|
||||
@ -176,9 +193,9 @@ class MemberList extends Component {
|
||||
if (this.state.role === 'owner' || this.state.role === 'admin') {
|
||||
return (
|
||||
<div>
|
||||
<Select defaultValue={record.role} className="select" onChange={this.handleChange}>
|
||||
<Option value="owner">组长</Option>
|
||||
<Option value="dev">开发者</Option>
|
||||
<Select defaultValue={record.role+'-'+record.uid} className="select" onChange={this.changeUserRole}>
|
||||
<Option value={'owner-'+record.uid}>组长</Option>
|
||||
<Option value={'dev-'+record.uid}>开发者</Option>
|
||||
</Select>
|
||||
<Popconfirm placement="topRight" title="你确定要删除吗? " onConfirm={this.deleteConfirm(record.uid)} okText="确定" cancelText="">
|
||||
<Button type="danger" icon="minus" className="btn-danger" />
|
||||
@ -207,7 +224,7 @@ class MemberList extends Component {
|
||||
<Row gutter={6} className="modal-input">
|
||||
<Col span="5"><div className="label">权限: </div></Col>
|
||||
<Col span="15">
|
||||
<Select size="large" defaultValue="dev" className="select" onChange={this.changeMemberRole}>
|
||||
<Select size="large" defaultValue="dev" className="select" onChange={this.changeNewMemberRole}>
|
||||
<Option value="owner">组长</Option>
|
||||
<Option value="dev">开发者</Option>
|
||||
</Select>
|
||||
|
@ -56,6 +56,8 @@ export default class InterfaceColMenu extends Component {
|
||||
});
|
||||
message.success('添加集合成功');
|
||||
await this.props.fetchInterfaceColList(project_id);
|
||||
} else {
|
||||
message.error(res.data.errmsg);
|
||||
}
|
||||
}
|
||||
|
||||
@ -90,7 +92,7 @@ export default class InterfaceColMenu extends Component {
|
||||
onTitleClick={(key, e) => this.selectCol(key, e, col)}
|
||||
>
|
||||
{
|
||||
col.interfaceCaseList && col.interfaceCaseList.map((interfaceCase, index) => (
|
||||
col.caseList && col.caseList.map((interfaceCase, index) => (
|
||||
<Menu.Item key={index}>{interfaceCase.name}</Menu.Item>
|
||||
))
|
||||
}
|
||||
|
@ -4,9 +4,11 @@ import PropTypes from 'prop-types'
|
||||
import { Tabs } from 'antd';
|
||||
import Edit from './Edit.js'
|
||||
import View from './View.js'
|
||||
import Run from './Run.js'
|
||||
|
||||
import { fetchInterfaceData } from '../../../../reducer/modules/interface.js';
|
||||
import { withRouter } from 'react-router-dom';
|
||||
import Run from './Run/Run.js'
|
||||
|
||||
|
||||
const TabPane = Tabs.TabPane;
|
||||
@connect(
|
||||
@ -88,5 +90,4 @@ class Content extends Component {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
export default withRouter(Content)
|
||||
export default withRouter(Content)
|
||||
|
@ -0,0 +1,120 @@
|
||||
import React, { Component } from 'react';
|
||||
import { connect } from 'react-redux';
|
||||
import { Modal, Collapse, Row, Col, Input, message, Button, Icon } from 'antd';
|
||||
import PropTypes from 'prop-types';
|
||||
import axios from 'axios';
|
||||
import { withRouter } from 'react-router'
|
||||
import { fetchInterfaceColList } from '../../../../../reducer/modules/interfaceCol'
|
||||
|
||||
const { TextArea } = Input;
|
||||
const Panel = Collapse.Panel;
|
||||
|
||||
@connect(
|
||||
state => ({
|
||||
interfaceColList: state.interfaceCol.interfaceColList
|
||||
}),
|
||||
{
|
||||
fetchInterfaceColList
|
||||
}
|
||||
)
|
||||
@withRouter
|
||||
export default class AddColModal extends Component {
|
||||
static propTypes = {
|
||||
visible: PropTypes.bool,
|
||||
interfaceColList: PropTypes.array,
|
||||
fetchInterfaceColList: PropTypes.func,
|
||||
match: PropTypes.object,
|
||||
onOk: PropTypes.func,
|
||||
onCancel: PropTypes.func
|
||||
}
|
||||
|
||||
state = {
|
||||
visible: false,
|
||||
addColName: '',
|
||||
addColDesc: '',
|
||||
id: 0
|
||||
}
|
||||
|
||||
constructor(props) {
|
||||
super(props)
|
||||
}
|
||||
|
||||
componentWillMount() {
|
||||
this.props.fetchInterfaceColList(this.props.match.params.id)
|
||||
}
|
||||
|
||||
componentWillReceiveProps(nextProps) {
|
||||
this.setState({id: nextProps.interfaceColList[0]._id})
|
||||
}
|
||||
|
||||
addCol = async () => {
|
||||
const { addColName: name, addColDesc: desc } = this.state;
|
||||
const project_id = this.props.match.params.id
|
||||
const res = await axios.post('/api/col/add_col', { name, desc, project_id })
|
||||
if (!res.data.errcode) {
|
||||
message.success('添加集合成功');
|
||||
await this.props.fetchInterfaceColList(project_id);
|
||||
} else {
|
||||
message.error(res.data.errmsg);
|
||||
}
|
||||
}
|
||||
|
||||
select = (id) => {
|
||||
this.setState({id})
|
||||
}
|
||||
|
||||
render() {
|
||||
const { interfaceColList = [] } = this.props;
|
||||
const { id } = this.state;
|
||||
return (
|
||||
<Modal
|
||||
className="add-col-modal"
|
||||
title="添加到集合"
|
||||
visible={this.props.visible}
|
||||
onOk={() => this.props.onOk(id)}
|
||||
onCancel={this.props.onCancel}
|
||||
>
|
||||
<p>请选择添加到的集合:</p>
|
||||
<ul className="col-list">
|
||||
{
|
||||
interfaceColList.length ? interfaceColList.map(col =>
|
||||
<li
|
||||
key={col._id}
|
||||
className={`col-item ${col._id === id ? 'selected' : ''}`}
|
||||
onClick={() => this.select(col._id)}
|
||||
>
|
||||
<Icon type="folder-open" style={{marginRight: 6}} />{col.name}
|
||||
</li>
|
||||
) : <span>暂无集合,请添加!</span>
|
||||
}
|
||||
</ul>
|
||||
<Collapse>
|
||||
<Panel header="添加新集合">
|
||||
<Row gutter={6} className="modal-input">
|
||||
<Col span="5"><div className="label">集合名:</div></Col>
|
||||
<Col span="15">
|
||||
<Input
|
||||
placeholder="请输入集合名称"
|
||||
value={this.state.addColName}
|
||||
onChange={e => this.setState({addColName: e.target.value})}></Input>
|
||||
</Col>
|
||||
</Row>
|
||||
<Row gutter={6} className="modal-input">
|
||||
<Col span="5"><div className="label">简介:</div></Col>
|
||||
<Col span="15">
|
||||
<TextArea
|
||||
rows={3}
|
||||
placeholder="请输入集合描述"
|
||||
value={this.state.addColDesc}
|
||||
onChange={e => this.setState({addColDesc: e.target.value})}></TextArea>
|
||||
</Col>
|
||||
</Row>
|
||||
<Row type="flex" justify="end">
|
||||
<Button style={{float: 'right'}} type="primary" onClick={this.addCol}>添 加</Button>
|
||||
</Row>
|
||||
</Panel>
|
||||
</Collapse>
|
||||
</Modal>
|
||||
)
|
||||
}
|
||||
}
|
@ -1,12 +1,13 @@
|
||||
import React, { Component } from 'react'
|
||||
import PropTypes from 'prop-types'
|
||||
import { connect } from 'react-redux'
|
||||
import { Button, Input, Select, Card, Alert, Spin, Icon, Collapse, Radio } from 'antd'
|
||||
import { Button, Input, Select, Card, Alert, Spin, Icon, Collapse, Radio, Tooltip } from 'antd'
|
||||
import { autobind } from 'core-decorators';
|
||||
import crossRequest from 'cross-request';
|
||||
import { withRouter } from 'react-router';
|
||||
// import axios from 'axios';
|
||||
import URL from 'url';
|
||||
import AddColModal from './AddColModal'
|
||||
|
||||
// import {
|
||||
// } from '../../../reducer/modules/group.js'
|
||||
@ -47,7 +48,8 @@ export default class Run extends Component {
|
||||
headers: [],
|
||||
currDomain: '',
|
||||
bodyType: '',
|
||||
bodyOther: ''
|
||||
bodyOther: '',
|
||||
addColModalVisible: false
|
||||
}
|
||||
|
||||
constructor(props) {
|
||||
@ -399,17 +401,21 @@ export default class Run extends Component {
|
||||
</Select>
|
||||
<Input value={path + search} onChange={this.changePath} spellCheck="false" style={{flexBasis: 180, flexGrow: 1}} />
|
||||
</InputGroup>
|
||||
<Button
|
||||
onClick={this.reqRealInterface}
|
||||
type="primary"
|
||||
style={{marginLeft: 10}}
|
||||
loading={this.state.loading}
|
||||
>发送</Button>
|
||||
<Button
|
||||
onClick={this.reqRealInterface}
|
||||
type="primary"
|
||||
style={{marginLeft: 10}}
|
||||
>保存</Button>
|
||||
<Tooltip placement="bottom" title="请求真实接口">
|
||||
<Button
|
||||
onClick={this.reqRealInterface}
|
||||
type="primary"
|
||||
style={{marginLeft: 10}}
|
||||
loading={this.state.loading}
|
||||
>发送</Button>
|
||||
</Tooltip>
|
||||
<Tooltip placement="bottom" title="添加到集合">
|
||||
<Button
|
||||
onClick={() => this.setState({addColModalVisible: true})}
|
||||
type="primary"
|
||||
style={{marginLeft: 10}}
|
||||
>保存</Button>
|
||||
</Tooltip>
|
||||
</div>
|
||||
|
||||
<Collapse defaultActiveKey={['0', '1', '2', '3']} bordered={true}>
|
||||
@ -541,6 +547,11 @@ export default class Run extends Component {
|
||||
</div>
|
||||
</Spin>
|
||||
</Card>
|
||||
<AddColModal
|
||||
visible={this.state.addColModalVisible}
|
||||
onCancel={() => this.setState({addColModalVisible: false})}
|
||||
onOk={null}
|
||||
></AddColModal>
|
||||
</div>
|
||||
)
|
||||
}
|
@ -28,3 +28,20 @@
|
||||
color: #108ee9;
|
||||
}
|
||||
}
|
||||
.add-col-modal {
|
||||
.col-list {
|
||||
height: 200px;
|
||||
overflow: auto;
|
||||
margin: 7px 0 15px 0;
|
||||
background: #eaeaea;
|
||||
.col-item {
|
||||
padding: 7px 10px 7px 10px;
|
||||
}
|
||||
.col-item:hover {
|
||||
background: #fa0;
|
||||
}
|
||||
.col-item.selected {
|
||||
background: #108ee9;
|
||||
}
|
||||
}
|
||||
}
|
@ -7,6 +7,7 @@ const FETCH_GROUP_MEMBER = 'yapi/group/FETCH_GROUP_MEMBER';
|
||||
const FETCH_GROUP_MSG = 'yapi/group/FETCH_GROUP_MSG';
|
||||
const ADD_GROUP_MEMBER = 'yapi/group/ADD_GROUP_MEMBER';
|
||||
const DEL_GROUP_MEMBER = 'yapi/group/DEL_GROUP_MEMBER';
|
||||
const CHANGE_GROUP_MEMBER = 'yapi/group/CHANGE_GROUP_MEMBER';
|
||||
|
||||
// Reducer
|
||||
const initialState = {
|
||||
@ -58,7 +59,7 @@ export function fetchGroupMsg(id) {
|
||||
}
|
||||
}
|
||||
|
||||
// 添加项目分组成员
|
||||
// 添加分组成员
|
||||
export function addMember(param) {
|
||||
return {
|
||||
type: ADD_GROUP_MEMBER,
|
||||
@ -66,7 +67,7 @@ export function addMember(param) {
|
||||
}
|
||||
}
|
||||
|
||||
// 删除项目分组成员
|
||||
// 删除分组成员
|
||||
export function delMember(param) {
|
||||
return {
|
||||
type: DEL_GROUP_MEMBER,
|
||||
@ -74,6 +75,14 @@ export function delMember(param) {
|
||||
}
|
||||
}
|
||||
|
||||
// 修改分组成员权限
|
||||
export function changeMemberRole(param) {
|
||||
return {
|
||||
type: CHANGE_GROUP_MEMBER,
|
||||
payload: axios.post('/api/group/change_member_role', param)
|
||||
}
|
||||
}
|
||||
|
||||
// 获取分组成员列表
|
||||
export function fetchGroupMemberList(id) {
|
||||
return {
|
||||
|
Loading…
Reference in New Issue
Block a user