UserGroupCreateForm.jsx 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. import React from 'react';
  2. import PropTypes from 'prop-types';
  3. import { withTranslation } from 'react-i18next';
  4. import { apiErrorHandler, apiSuccessHandler } from '../../../util/apiNotification';
  5. class UserGroupCreateForm extends React.Component {
  6. constructor(props) {
  7. super(props);
  8. this.state = {
  9. name: '',
  10. };
  11. this.xss = window.xss;
  12. this.handleChange = this.handleChange.bind(this);
  13. this.handleSubmit = this.handleSubmit.bind(this);
  14. this.validateForm = this.validateForm.bind(this);
  15. }
  16. handleChange(event) {
  17. const target = event.target;
  18. const value = target.type === 'checkbox' ? target.checked : target.value;
  19. const name = target.name;
  20. this.setState({
  21. [name]: value,
  22. });
  23. }
  24. async handleSubmit(e) {
  25. e.preventDefault();
  26. try {
  27. const res = await this.props.crowi.apiPost('/v3/user-groups/create', {
  28. name: this.state.name,
  29. });
  30. if (res.ok) {
  31. const { userGroup, userGroupRelation } = res;
  32. this.props.onCreate(userGroup, userGroupRelation);
  33. this.setState({ name: '' });
  34. apiSuccessHandler(`Created a user group "${this.xss.process(userGroup.name)}"`);
  35. }
  36. else {
  37. throw new Error(`Unable to create a group "${this.xss.process(this.state.name)}"`);
  38. }
  39. }
  40. catch (err) {
  41. apiErrorHandler(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-default" href="#createGroupForm">
  55. { t('user_group_management.create_group') }
  56. </button>
  57. )
  58. : (
  59. t('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('user_group_management.group_name') }</label>
  67. <textarea
  68. id="name"
  69. name="name"
  70. className="form-control"
  71. placeholder={t('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. <input type="hidden" name="_csrf" defaultValue={this.props.crowi.csrfToken} />
  80. </form>
  81. </div>
  82. );
  83. }
  84. }
  85. UserGroupCreateForm.propTypes = {
  86. t: PropTypes.func.isRequired, // i18next
  87. crowi: PropTypes.object.isRequired,
  88. isAclEnabled: PropTypes.bool,
  89. onCreate: PropTypes.func.isRequired,
  90. };
  91. export default withTranslation()(UserGroupCreateForm);