UserGroupEditForm.jsx 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. import React from 'react';
  2. import PropTypes from 'prop-types';
  3. import { withTranslation } from 'react-i18next';
  4. import dateFnsFormat from 'date-fns/format';
  5. import { createSubscribedElement } from '../../UnstatedUtils';
  6. import AppContainer from '../../../services/AppContainer';
  7. import UserGroupDetailContainer from '../../../services/UserGroupDetailContainer';
  8. import { toastSuccess, toastError } from '../../../util/apiNotification';
  9. class UserGroupEditForm extends React.Component {
  10. constructor(props) {
  11. super(props);
  12. this.state = {
  13. name: props.userGroupDetailContainer.state.userGroup.name,
  14. nameCache: props.userGroupDetailContainer.state.userGroup.name, // cache for name. update every submit
  15. };
  16. this.xss = window.xss;
  17. this.changeUserGroupName = this.changeUserGroupName.bind(this);
  18. this.handleSubmit = this.handleSubmit.bind(this);
  19. this.validateForm = this.validateForm.bind(this);
  20. }
  21. changeUserGroupName(event) {
  22. this.setState({
  23. name: event.target.value,
  24. });
  25. }
  26. async handleSubmit(e) {
  27. e.preventDefault();
  28. try {
  29. const res = await this.props.userGroupDetailContainer.updateUserGroup({
  30. name: this.state.name,
  31. });
  32. toastSuccess(`Updated the group name to "${this.xss.process(res.data.userGroup.name)}"`);
  33. this.setState({ nameCache: this.state.name });
  34. }
  35. catch (err) {
  36. toastError(new Error('Unable to update the group name'));
  37. }
  38. }
  39. validateForm() {
  40. return (
  41. this.state.name !== this.state.nameCache
  42. && this.state.name !== ''
  43. );
  44. }
  45. render() {
  46. const { t, userGroupDetailContainer } = this.props;
  47. return (
  48. <form className="form-horizontal" onSubmit={this.handleSubmit}>
  49. <fieldset>
  50. <legend>基本情報</legend>
  51. <div className="form-group">
  52. <label htmlFor="name" className="col-sm-2 control-label">{ t('Name') }</label>
  53. <div className="col-sm-4">
  54. <input className="form-control" type="text" name="name" value={this.state.name} onChange={this.changeUserGroupName} />
  55. </div>
  56. </div>
  57. <div className="form-group">
  58. <label className="col-sm-2 control-label">{ t('Created') }</label>
  59. <div className="col-sm-4">
  60. <input
  61. type="text"
  62. className="form-control"
  63. value={dateFnsFormat(new Date(userGroupDetailContainer.state.userGroup.createdAt), 'YYYY-MM-DD')}
  64. disabled
  65. />
  66. </div>
  67. </div>
  68. <div className="form-group">
  69. <div className="col-sm-offset-2 col-sm-10">
  70. <button type="submit" className="btn btn-primary" disabled={!this.validateForm()}>{ t('Update') }</button>
  71. </div>
  72. </div>
  73. </fieldset>
  74. </form>
  75. );
  76. }
  77. }
  78. UserGroupEditForm.propTypes = {
  79. t: PropTypes.func.isRequired, // i18next
  80. appContainer: PropTypes.instanceOf(AppContainer).isRequired,
  81. userGroupDetailContainer: PropTypes.instanceOf(UserGroupDetailContainer).isRequired,
  82. };
  83. /**
  84. * Wrapper component for using unstated
  85. */
  86. const UserGroupEditFormWrapper = (props) => {
  87. return createSubscribedElement(UserGroupEditForm, props, [AppContainer, UserGroupDetailContainer]);
  88. };
  89. export default withTranslation()(UserGroupEditFormWrapper);