UserGroupEditForm.jsx 3.5 KB

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