import React, { Component } from 'react' import PropTypes from 'prop-types' import { connect } from 'react-redux' import { Icon, Modal, Alert, Input, message, Menu, Row, Col } from 'antd' import { autobind } from 'core-decorators'; import axios from 'axios'; import { withRouter } from 'react-router-dom'; const { TextArea } = Input; const Search = Input.Search; const TYPE_EDIT = 'edit'; const confirm = Modal.confirm; import UsernameAutoComplete from '../../../components/UsernameAutoComplete/UsernameAutoComplete.js'; import { fetchGroupList, setCurrGroup, setGroupList } from '../../../reducer/modules/group.js' import './GroupList.scss' @connect( state => ({ groupList: state.group.groupList, currGroup: state.group.currGroup, curUserRole: state.user.role }), { fetchGroupList, setCurrGroup, setGroupList } ) @withRouter export default class GroupList extends Component { static propTypes = { groupList: PropTypes.array, currGroup: PropTypes.object, fetchGroupList: PropTypes.func, setCurrGroup: PropTypes.func, setGroupList: PropTypes.func, match: PropTypes.object, history: PropTypes.object, curUserRole: PropTypes.string } state = { addGroupModalVisible: false, editGroupModalVisible: false, newGroupName: '', newGroupDesc: '', currGroupName: '', currGroupDesc: '', groupList: [], owner_uid: 0 } constructor(props) { super(props) } async componentWillMount() { const groupId = !isNaN(this.props.match.params.groupId) ? parseInt(this.props.match.params.groupId) : 0; await this.props.fetchGroupList(); let currGroup = this.props.groupList[0] || { group_name: '', group_desc: '' }; if (this.props.groupList.length && groupId) { for (let i = 0; i < this.props.groupList.length; i++) { if (this.props.groupList[i]._id === groupId) { currGroup = this.props.groupList[i]; } else { this.props.history.replace(`${currGroup._id}`); } } } else if (!groupId && this.props.groupList.length) { this.props.history.push(`/group/${this.props.groupList[0]._id}`); } this.setState({ groupList: this.props.groupList }); this.props.setCurrGroup(currGroup) } @autobind showModal(type) { if (type === 'edit') { const { currGroup } = this.props; this.setState({ currGroupName: currGroup.group_name, currGroupDesc: currGroup.group_desc, editGroupModalVisible: true }); } else { this.setState({ addGroupModalVisible: true }); } } @autobind hideModal(type) { if (type === TYPE_EDIT) { this.setState({ editGroupModalVisible: false }); } else { this.setState({ addGroupModalVisible: false }); } } @autobind async addGroup() { const { newGroupName: group_name, newGroupDesc: group_desc, owner_uid } = this.state; const res = await axios.post('/api/group/add', { group_name, group_desc, owner_uid }) if (!res.data.errcode) { this.setState({ addGroupModalVisible: false }); await this.props.fetchGroupList(); this.setState({ groupList: this.props.groupList }); this.props.setCurrGroup(res.data.data) } else { message.error(res.data.errmsg) } } @autobind async editGroup() { const { currGroupName: group_name, currGroupDesc: group_desc } = this.state; const id = this.props.currGroup._id; const res = await axios.post('/api/group/up', { group_name, group_desc, id }); if (res.data.errcode) { message.error(res.data.errmsg); } else { this.setState({ editGroupModalVisible: false }); this.props.setCurrGroup({ group_name, group_desc, _id: id }); } } @autobind inputNewGroupName(e, type) { if (type === TYPE_EDIT) { this.setState({ currGroupName: e.target.value }) } else { this.setState({ newGroupName: e.target.value }); } } @autobind inputNewGroupDesc(e, type) { if (type === TYPE_EDIT) { this.setState({ currGroupDesc: e.target.value }) } else { this.setState({ newGroupDesc: e.target.value }); } } @autobind selectGroup(e) { const groupId = e.key; const currGroup = this.props.groupList.find((group) => { return +group._id === +groupId }); this.props.setCurrGroup(currGroup); this.props.history.replace(`${currGroup._id}`); } @autobind onUserSelect(childState) { this.setState({ owner_uid: childState.uid }) } showConfirm = () => { let that = this; confirm({ title: "确认删除 " + that.props.currGroup.group_name + " 分组吗?", content:

请输入分组名称确认此操作:

, onOk() { let groupName = document.getElementById('group_name').value; if (that.props.currGroup.group_name !== groupName) { message.error('分组名称有误') return new Promise((resolve, reject) => { reject('error') }) } else { that.deleteGroup() } }, iconType: 'delete', onCancel() { } }); } @autobind async deleteGroup() { const self = this; const { currGroup } = self.props; const res = await axios.post('/api/group/del', { id: currGroup._id }) if (res.data.errcode) { message.error(res.data.errmsg); } else { message.success('删除成功') await self.props.fetchGroupList() const currGroup = self.props.groupList[0] || { group_name: '', group_desc: '' }; self.setState({ groupList: self.props.groupList }); self.props.setCurrGroup(currGroup) } } @autobind searchGroup(e, value) { const v = value || e.target.value; const { groupList } = this.props; if (v === '') { this.setState({ groupList }) } else { this.setState({ groupList: groupList.filter(group => new RegExp(v, 'i').test(group.group_name)) }) } } render() { const { currGroup } = this.props; const delmark = this.showModal(TYPE_EDIT)} /> const editmark = { this.showConfirm() }} type="delete" title="删除分组" /> const addmark = return (
{currGroup.group_name}
{ this.props.curUserRole === "admin" ? (editmark) : '' } { this.props.curUserRole === "admin" || currGroup.role ==='owner' ? (delmark) : '' } { this.props.curUserRole === 'admin' ? (addmark) : '' }
简介:{currGroup.group_desc}
this.searchGroup(null, v)} />
{ this.state.groupList.map((group) => ( {group.group_name} )) }
分组名:
简介:
组长:
this.hideModal(TYPE_EDIT)} className="add-group-modal" >
分组名:
this.inputNewGroupName(e, TYPE_EDIT)}>
简介:
) } }