UserGroupUserFormByInput.jsx 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. import React from 'react';
  2. import PropTypes from 'prop-types';
  3. import { withTranslation } from 'react-i18next';
  4. import { createSubscribedElement } from '../../UnstatedUtils';
  5. import AppContainer from '../../../services/AppContainer';
  6. import UserGroupDetailContainer from '../../../services/UserGroupDetailContainer';
  7. import { toastSuccess, toastError } from '../../../util/apiNotification';
  8. class UserGroupUserFormByInput extends React.Component {
  9. constructor(props) {
  10. super(props);
  11. this.state = {
  12. username: '',
  13. };
  14. this.xss = window.xss;
  15. this.changeUsername = this.changeUsername.bind(this);
  16. this.addUserBySubmit = this.addUserBySubmit.bind(this);
  17. this.validateForm = this.validateForm.bind(this);
  18. }
  19. changeUsername(e) {
  20. this.setState({ username: e.target.value });
  21. }
  22. async addUserBySubmit(e) {
  23. e.preventDefault();
  24. const { username } = this.state;
  25. try {
  26. await this.props.userGroupDetailContainer.addUserByUsername(username);
  27. toastSuccess(`Added "${this.xss.process(username)}" to "${this.xss.process(this.props.userGroupDetailContainer.state.userGroup.name)}"`);
  28. this.setState({ username: '' });
  29. }
  30. catch (err) {
  31. toastError(new Error(`Unable to add "${this.xss.process(username)}" to "${this.xss.process(this.props.userGroupDetailContainer.state.userGroup.name)}"`));
  32. }
  33. }
  34. validateForm() {
  35. return this.state.username !== '';
  36. }
  37. render() {
  38. const { t } = this.props;
  39. return (
  40. <form className="form-inline" onSubmit={this.addUserBySubmit}>
  41. <div className="form-group">
  42. <input
  43. type="text"
  44. name="username"
  45. className="form-control input-sm"
  46. placeholder={t('username')}
  47. value={this.state.username}
  48. onChange={this.changeUsername}
  49. />
  50. </div>
  51. <button type="submit" className="btn btn-sm btn-success" disabled={!this.validateForm()}>{ t('add') }</button>
  52. </form>
  53. );
  54. }
  55. }
  56. UserGroupUserFormByInput.propTypes = {
  57. t: PropTypes.func.isRequired, // i18next
  58. appContainer: PropTypes.instanceOf(AppContainer).isRequired,
  59. userGroupDetailContainer: PropTypes.instanceOf(UserGroupDetailContainer).isRequired,
  60. };
  61. /**
  62. * Wrapper component for using unstated
  63. */
  64. const UserGroupUserFormByInputWrapper = (props) => {
  65. return createSubscribedElement(UserGroupUserFormByInput, props, [AppContainer, UserGroupDetailContainer]);
  66. };
  67. export default withTranslation()(UserGroupUserFormByInputWrapper);