UserGroupCreateForm.jsx 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. import React from 'react';
  2. import PropTypes from 'prop-types';
  3. import { withTranslation } from 'react-i18next';
  4. import { withUnstatedContainers } from '../../UnstatedUtils';
  5. import AppContainer from '~/client/services/AppContainer';
  6. import { toastSuccess, toastError } from '~/client/util/apiNotification';
  7. class UserGroupCreateForm extends React.Component {
  8. constructor(props) {
  9. super(props);
  10. this.state = {
  11. name: '',
  12. };
  13. this.xss = window.xss;
  14. this.handleChange = this.handleChange.bind(this);
  15. this.handleSubmit = this.handleSubmit.bind(this);
  16. this.validateForm = this.validateForm.bind(this);
  17. }
  18. handleChange(event) {
  19. const target = event.target;
  20. const value = target.type === 'checkbox' ? target.checked : target.value;
  21. const name = target.name;
  22. this.setState({
  23. [name]: value,
  24. });
  25. }
  26. async handleSubmit(e) {
  27. e.preventDefault();
  28. try {
  29. const res = await this.props.appContainer.apiv3.post('/user-groups', {
  30. name: this.state.name,
  31. });
  32. const userGroup = res.data.userGroup;
  33. const userGroupId = userGroup._id;
  34. const res2 = await this.props.appContainer.apiv3.get(`/user-groups/${userGroupId}/users`);
  35. const { users } = res2.data;
  36. this.props.onCreate(userGroup, users);
  37. this.setState({ name: '' });
  38. toastSuccess(`Created a user group "${this.xss.process(userGroup.name)}"`);
  39. }
  40. catch (err) {
  41. toastError(err);
  42. }
  43. }
  44. validateForm() {
  45. return this.state.name !== '';
  46. }
  47. render() {
  48. const { t } = this.props;
  49. return (
  50. <div>
  51. <p>
  52. {this.props.isAclEnabled
  53. ? (
  54. <button type="button" data-toggle="collapse" className="btn btn-outline-secondary" href="#createGroupForm">
  55. {t('admin:user_group_management.create_group')}
  56. </button>
  57. )
  58. : (
  59. t('admin:user_group_management.deny_create_group')
  60. )
  61. }
  62. </p>
  63. <form onSubmit={this.handleSubmit}>
  64. <div id="createGroupForm" className="collapse">
  65. <div className="form-group">
  66. <label htmlFor="name">{t('admin:user_group_management.group_name')}</label>
  67. <textarea
  68. id="name"
  69. name="name"
  70. className="form-control"
  71. placeholder={t('admin:user_group_management.group_example')}
  72. value={this.state.name}
  73. onChange={this.handleChange}
  74. >
  75. </textarea>
  76. </div>
  77. <button type="submit" className="btn btn-primary" disabled={!this.validateForm()}>{t('Create')}</button>
  78. </div>
  79. </form>
  80. </div>
  81. );
  82. }
  83. }
  84. /**
  85. * Wrapper component for using unstated
  86. */
  87. const UserGroupCreateFormWrapper = withUnstatedContainers(UserGroupCreateForm, [AppContainer]);
  88. UserGroupCreateForm.propTypes = {
  89. t: PropTypes.func.isRequired, // i18next
  90. appContainer: PropTypes.instanceOf(AppContainer).isRequired,
  91. isAclEnabled: PropTypes.bool.isRequired,
  92. onCreate: PropTypes.func.isRequired,
  93. };
  94. export default withTranslation()(UserGroupCreateFormWrapper);