feat: 增加项目成员批量导入

This commit is contained in:
gaoxiaolin.gao 2018-01-31 16:46:17 +08:00
parent 8cbe548d52
commit dbb9146ade
3 changed files with 104 additions and 31 deletions

View File

@ -1,3 +1,9 @@
### v1.3.6
#### Feature
* 增加项目成员批量导入
### v1.3.5 ### v1.3.5
#### Feature #### Feature

View File

@ -6,7 +6,7 @@ import { fetchGroupMsg } from '../../../../reducer/modules/group';
import { connect } from 'react-redux'; import { connect } from 'react-redux';
import ErrMsg from '../../../../components/ErrMsg/ErrMsg.js'; import ErrMsg from '../../../../components/ErrMsg/ErrMsg.js';
import { fetchGroupMemberList } from '../../../../reducer/modules/group.js'; import { fetchGroupMemberList } from '../../../../reducer/modules/group.js';
import { getProjectMemberList, getProject, addMember, delMember, changeMemberRole } from '../../../../reducer/modules/project.js'; import { fetchProjectList, getProjectMemberList, getProject, addMember, delMember, changeMemberRole } from '../../../../reducer/modules/project.js';
import UsernameAutoComplete from '../../../../components/UsernameAutoComplete/UsernameAutoComplete.js'; import UsernameAutoComplete from '../../../../components/UsernameAutoComplete/UsernameAutoComplete.js';
import '../Setting.scss'; import '../Setting.scss';
@ -25,7 +25,8 @@ const arrayAddKey = (arr) => {
state => { state => {
return { return {
projectMsg: state.project.currProject, projectMsg: state.project.currProject,
uid: state.user.uid uid: state.user.uid,
projectList: state.project.projectList
} }
}, },
{ {
@ -35,7 +36,8 @@ const arrayAddKey = (arr) => {
delMember, delMember,
fetchGroupMsg, fetchGroupMsg,
changeMemberRole, changeMemberRole,
getProject getProject,
fetchProjectList
} }
) )
class ProjectMember extends Component { class ProjectMember extends Component {
@ -49,7 +51,9 @@ class ProjectMember extends Component {
visible: false, visible: false,
dataSource: [], dataSource: [],
inputUids: [], inputUids: [],
inputRole: 'dev' inputRole: 'dev',
modalVisible: false,
selectProjectId: 0
} }
} }
static propTypes = { static propTypes = {
@ -63,32 +67,45 @@ class ProjectMember extends Component {
getProject: PropTypes.func, getProject: PropTypes.func,
fetchGroupMemberList: PropTypes.func, fetchGroupMemberList: PropTypes.func,
fetchGroupMsg: PropTypes.func, fetchGroupMsg: PropTypes.func,
getProjectMemberList: PropTypes.func getProjectMemberList: PropTypes.func,
fetchProjectList: PropTypes.func,
projectList: PropTypes.array
} }
@autobind
showAddMemberModal() { showAddMemberModal = () => {
this.setState({ this.setState({
visible: true visible: true
}); });
} }
showImportMemberModal = async () => {
await this.props.fetchProjectList(this.props.projectMsg.group_id)
this.setState({
modalVisible: true
});
}
// 重新获取列表 // 重新获取列表
@autobind
reFetchList() { reFetchList = () => {
this.props.getProjectMemberList(this.props.match.params.id).then((res) => { this.props.getProjectMemberList(this.props.match.params.id).then((res) => {
this.setState({ this.setState({
projectMemberList: arrayAddKey(res.payload.data.data), projectMemberList: arrayAddKey(res.payload.data.data),
visible: false visible: false,
modalVisible: false
}); });
}); });
} }
handleOk =()=>{
this.addMembers(this.state.inputUids)
}
// 增 - 添加成员 // 增 - 添加成员
@autobind addMembers = (memberUids) => {
handleOk() {
this.props.addMember({ this.props.addMember({
id: this.props.match.params.id, id: this.props.match.params.id,
member_uids: this.state.inputUids, member_uids: memberUids,
role: this.state.inputRole role: this.state.inputRole
}).then((res) => { }).then((res) => {
if (!res.payload.data.errcode) { if (!res.payload.data.errcode) {
@ -105,8 +122,7 @@ class ProjectMember extends Component {
}); });
} }
// 添加成员时 选择新增成员权限 // 添加成员时 选择新增成员权限
@autobind changeNewMemberRole = (value) => {
changeNewMemberRole(value) {
this.setState({ this.setState({
inputRole: value inputRole: value
}); });
@ -127,8 +143,7 @@ class ProjectMember extends Component {
} }
// 改 - 修改成员权限 // 改 - 修改成员权限
@autobind changeUserRole = (e) => {
changeUserRole(e) {
const id = this.props.match.params.id; const id = this.props.match.params.id;
const role = e.split('-')[0]; const role = e.split('-')[0];
const member_uid = e.split('-')[1]; const member_uid = e.split('-')[1];
@ -141,26 +156,46 @@ class ProjectMember extends Component {
} }
// 关闭模态框 // 关闭模态框
@autobind handleCancel = () => {
handleCancel() {
this.setState({ this.setState({
visible: false visible: false
}); });
} }
// 关闭批量导入模态框
handleModalCancel = () => {
this.setState({
modalVisible: false
});
}
@autobind // 处理选择项目
onUserSelect(uids) { handleChange = (key) => {
this.setState({
selectProjectId: key
})
}
// 确定批量导入模态框
handleModalOk =async () => {
// 获取项目中的成员列表
const menberList = await this.props.getProjectMemberList(this.state.selectProjectId);
const memberUidList = menberList.payload.data.data.map(item =>{
return item.uid
})
this.addMembers(memberUidList)
}
onUserSelect = (uids) => {
this.setState({ this.setState({
inputUids: uids inputUids: uids
}) })
} }
async componentWillMount() { async componentWillMount() {
// console.log('projectMsg', this.props.projectMsg)
// await this.props.getProject(this.props.match.params.id)
const groupMemberList = await this.props.fetchGroupMemberList(this.props.projectMsg.group_id); const groupMemberList = await this.props.fetchGroupMemberList(this.props.projectMsg.group_id);
const groupMsg = await this.props.fetchGroupMsg(this.props.projectMsg.group_id); const groupMsg = await this.props.fetchGroupMsg(this.props.projectMsg.group_id);
// const rojectMsg = await this.props.getProjectMsg(this.props.match.params.id);
const projectMemberList = await this.props.getProjectMemberList(this.props.match.params.id); const projectMemberList = await this.props.getProjectMemberList(this.props.match.params.id);
this.setState({ this.setState({
groupMemberList: groupMemberList.payload.data.data, groupMemberList: groupMemberList.payload.data.data,
@ -182,7 +217,11 @@ class ProjectMember extends Component {
</div>); </div>);
} }
}, { }, {
title: (this.state.role === 'owner' || this.state.role === 'admin') ? <div className="btn-container"><Button className="btn" type="primary" icon="plus" onClick={this.showAddMemberModal}>添加成员</Button></div> : '', title: (this.state.role === 'owner' || this.state.role === 'admin') ?
<div className="btn-container">
<Button className="btn" type="primary" icon="plus" onClick={this.showAddMemberModal}>添加成员</Button>
<Button className="btn" icon="plus" onClick={this.showImportMemberModal}>批量导入成员</Button>
</div> : '',
key: 'action', key: 'action',
className: 'member-opration', className: 'member-opration',
render: (text, record) => { render: (text, record) => {
@ -213,6 +252,11 @@ class ProjectMember extends Component {
} }
} }
}]; }];
// 获取当前分组下的所有项目名称
const children = this.props.projectList.map((item, index) => (
<Option key={index} value={'' + item._id}>{item.name}</Option>
))
return ( return (
<div className="g-row"> <div className="g-row">
<div className="m-panel"> <div className="m-panel">
@ -223,13 +267,13 @@ class ProjectMember extends Component {
onCancel={this.handleCancel} onCancel={this.handleCancel}
> >
<Row gutter={6} className="modal-input"> <Row gutter={6} className="modal-input">
<Col span="5"><div className="label">用户名: </div></Col> <Col span="5"><div className="label usernamelabel">用户名: </div></Col>
<Col span="15"> <Col span="15">
<UsernameAutoComplete callbackState={this.onUserSelect} /> <UsernameAutoComplete callbackState={this.onUserSelect} />
</Col> </Col>
</Row> </Row>
<Row gutter={6} className="modal-input"> <Row gutter={6} className="modal-input">
<Col span="5"><div className="label">权限: </div></Col> <Col span="5"><div className="label usernameauth">权限: </div></Col>
<Col span="15"> <Col span="15">
<Select size="large" defaultValue="dev" className="select" onChange={this.changeNewMemberRole}> <Select size="large" defaultValue="dev" className="select" onChange={this.changeNewMemberRole}>
<Option value="owner">组长</Option> <Option value="owner">组长</Option>
@ -239,6 +283,28 @@ class ProjectMember extends Component {
</Col> </Col>
</Row> </Row>
</Modal> : ""} </Modal> : ""}
<Modal
title="批量导入成员"
visible={this.state.modalVisible}
onOk={this.handleModalOk}
onCancel={this.handleModalCancel}
>
<Row gutter={6} className="modal-input">
<Col span="5"><div className="label usernamelabel">项目名: </div></Col>
<Col span="15">
<Select
showSearch
style={{ width: 200 }}
placeholder="请选择项目名称"
optionFilterProp="children"
onChange={this.handleChange}
>
{children}
</Select>
</Col>
</Row>
</Modal>
<Table columns={columns} dataSource={this.state.projectMemberList} pagination={false} locale={{ emptyText: <ErrMsg type="noMemberInProject" /> }} className="setting-project-member" /> <Table columns={columns} dataSource={this.state.projectMemberList} pagination={false} locale={{ emptyText: <ErrMsg type="noMemberInProject" /> }} className="setting-project-member" />
<Card bordered={false} title={this.state.groupName + ' 分组成员 ' + '(' + this.state.groupMemberList.length + ') 人'} noHovering className="setting-group"> <Card bordered={false} title={this.state.groupName + ' 分组成员 ' + '(' + this.state.groupMemberList.length + ') 人'} noHovering className="setting-group">
{this.state.groupMemberList.length ? this.state.groupMemberList.map((item, index) => { {this.state.groupMemberList.length ? this.state.groupMemberList.map((item, index) => {

View File

@ -25,10 +25,11 @@
} }
} }
// .setting-project-member { .setting-project-member {
// border: 1px solid #e9e9e9; .btn{
// border-radius: 4px; margin-left: 8px;
// } }
}
.setting-group { .setting-group {
margin-top: .48rem; margin-top: .48rem;