UserGroupUserModal.jsx 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. import React, { Fragment } from 'react';
  2. import PropTypes from 'prop-types';
  3. import { withTranslation } from 'react-i18next';
  4. import Modal from 'react-bootstrap/es/Modal';
  5. import UserGroupUserFormByInput from './UserGroupUserFormByInput';
  6. import { createSubscribedElement } from '../../UnstatedUtils';
  7. import AppContainer from '../../../services/AppContainer';
  8. import { toastSuccess, toastError } from '../../../util/apiNotification';
  9. class UserGroupUserModal extends React.Component {
  10. constructor(props) {
  11. super(props);
  12. this.xss = window.xss;
  13. this.addUserByClick = this.addUserByClick.bind(this);
  14. this.addUserByUsername = this.addUserByUsername.bind(this);
  15. }
  16. async addUserByClick(username) {
  17. const { user, userGroup, userGroupRelation } = await this.addUser(username);
  18. this.handlePostAdd(user, userGroup, userGroupRelation);
  19. }
  20. async addUserByUsername(username) {
  21. try {
  22. const res = await this.props.appContainer.apiv3.post(`/user-groups/${this.props.userGroup._id}/users/${username}`);
  23. const { user, userGroup, userGroupRelation } = res.data;
  24. this.props.onAdd(user, userGroup, userGroupRelation);
  25. }
  26. catch (err) {
  27. toastError(new Error(`Unable to add "${this.xss.process(username)}" to "${this.xss.process(this.props.userGroup.name)}"`));
  28. }
  29. }
  30. render() {
  31. const { t } = this.props;
  32. return (
  33. <Modal show={this.props.show} onHide={this.props.onClose}>
  34. <Modal.Header closeButton>
  35. <Modal.Title>{ t('user_group_management.add_user') }</Modal.Title>
  36. </Modal.Header>
  37. <Modal.Body>
  38. <p>
  39. <strong>{ t('Method') }1.</strong> { t('user_group_management.how_to_add1') }
  40. </p>
  41. <UserGroupUserFormByInput
  42. addUserByUsername={this.addUserByUsername}
  43. onAdd={this.props.onAdd}
  44. onClose={this.props.onClose}
  45. />
  46. <hr />
  47. <p>
  48. <strong>{ t('Method') }2.</strong> { t('user_group_management.how_to_add2') }
  49. </p>
  50. <ul className="list-inline">
  51. {this.props.notRelatedUsers.map((user) => {
  52. return (
  53. <li key={user._id}>
  54. <button type="submit" className="btn btn-xs btn-primary" onClick={() => { return this.addUserByClick(user.username) }}>
  55. {user.username}
  56. </button>
  57. </li>
  58. );
  59. })}
  60. </ul>
  61. {this.props.notRelatedUsers.length === 0 ? (
  62. <Fragment>
  63. No users available.
  64. </Fragment>
  65. ) : null}
  66. </Modal.Body>
  67. </Modal>
  68. );
  69. }
  70. }
  71. UserGroupUserModal.propTypes = {
  72. t: PropTypes.func.isRequired, // i18next
  73. appContainer: PropTypes.instanceOf(AppContainer).isRequired,
  74. show: PropTypes.bool.isRequired,
  75. onClose: PropTypes.func.isRequired,
  76. onAdd: PropTypes.func.isRequired,
  77. userGroup: PropTypes.object.isRequired,
  78. notRelatedUsers: PropTypes.arrayOf(PropTypes.object).isRequired,
  79. };
  80. /**
  81. * Wrapper component for using unstated
  82. */
  83. const UserGroupUserModalWrapper = (props) => {
  84. return createSubscribedElement(UserGroupUserModal, props, [AppContainer]);
  85. };
  86. export default withTranslation()(UserGroupUserModalWrapper);