import React from 'react'; import PropTypes from 'prop-types'; import { gettext } from '../../utils/constants'; import { Button, Modal, ModalHeader, ModalBody, ModalFooter, Table } from 'reactstrap'; import { seafileAPI } from '../../utils/seafile-api.js'; import RoleEditor from '../select-editor/role-editor'; import UserSelect from '../user-select.js'; import { Utils } from '../../utils/utils'; import toaster from '../toast'; import '../../css/manage-members-dialog.css'; const propTypes = { groupID: PropTypes.string.isRequired, toggleManageMembersDialog: PropTypes.func.isRequired, onGroupChanged: PropTypes.func.isRequired, isOwner: PropTypes.bool.isRequired, }; class ManageMembersDialog extends React.Component { constructor(props) { super(props); this.state = { groupMembers: [], selectedOption: null, errMessage: [], isItemFreezed: false, }; } onSelectChange = (option) => { this.setState({ selectedOption: option, errMessage: [], }); } addGroupMember = () => { let emails = []; for (let i = 0; i < this.state.selectedOption.length; i++) { emails.push(this.state.selectedOption[i].email); } seafileAPI.addGroupMembers(this.props.groupID, emails).then((res) => { this.onGroupMembersChange(); this.setState({ selectedOption: null, }); this.refs.userSelect.clearSelect(); if (res.data.failed.length > 0) { this.setState({ errMessage: res.data.failed }); } }).catch(error => { let errMessage = Utils.getErrorMsg(error); toaster.danger(errMessage); }); } listGroupMembers = () => { seafileAPI.listGroupMembers(this.props.groupID).then((res) => { this.setState({ groupMembers: res.data }); }).catch(error => { let errMessage = Utils.getErrorMsg(error); toaster.danger(errMessage); }); } onGroupMembersChange = () => { this.listGroupMembers(); } toggleItemFreezed = (isFreezed) => { this.setState({ isItemFreezed: isFreezed }); } toggle = () => { this.props.toggleManageMembersDialog(); } componentDidMount() { this.listGroupMembers(); } render() { return ( {gettext('Manage group members')}

{gettext('Add group member')}

{this.state.selectedOption ? : }
{ this.state.errMessage.length > 0 && this.state.errMessage.map((item, index = 0) => { return (
{item.error_msg}
); }) }
{ this.state.groupMembers.length > 0 && this.state.groupMembers.map((item, index = 0) => { return ( ); }) }
{gettext('Name')} {gettext('Role')}
); } } ManageMembersDialog.propTypes = propTypes; const MemberPropTypes = { item: PropTypes.object.isRequired, onGroupMembersChange: PropTypes.func.isRequired, groupID: PropTypes.string.isRequired, isOwner: PropTypes.bool.isRequired, }; class Member extends React.PureComponent { constructor(props) { super(props); this.roles = ['Admin', 'Member']; this.state = ({ highlight: false, }); } onChangeUserRole = (role) => { let isAdmin = role === 'Admin' ? 'True' : 'False'; seafileAPI.setGroupAdmin(this.props.groupID, this.props.item.email, isAdmin).then((res) => { this.props.onGroupMembersChange(); }); this.setState({ highlight: false, }); } deleteMember = (name) => { seafileAPI.deleteGroupMember(this.props.groupID, name).then((res) => { this.props.onGroupMembersChange(); }).catch(error => { let errMessage = Utils.getErrorMsg(error); toaster.danger(errMessage); }); } handleMouseOver = () => { if (this.props.isItemFreezed) return; this.setState({ highlight: true, }); } handleMouseLeave = () => { if (this.props.isItemFreezed) return; this.setState({ highlight: false, }); } translateRole = (role) => { if (role === 'Admin') { return gettext('Admin'); } else if (role === 'Member') { return gettext('Member'); } else if (role === 'Owner') { return gettext('Owner'); } } render() { const { item, isOwner } = this.props; const deleteAuthority = (item.role !== 'Owner' && isOwner === true) || (item.role === 'Member' && isOwner === false); return( {item.name} {((isOwner === false) || (isOwner === true && item.role === 'Owner')) && {this.translateRole(item.role)} } {(isOwner === true && item.role !== 'Owner') && } {(deleteAuthority && !this.props.isItemFreezed) && } ); } } Member.propTypes = MemberPropTypes; export default ManageMembersDialog;