2
0

UserGroupPage.jsx 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. import React, { Fragment } from 'react';
  2. import PropTypes from 'prop-types';
  3. import * as toastr from 'toastr';
  4. import UserGroupTable from './UserGroupTable';
  5. import UserGroupCreateForm from './UserGroupCreateForm';
  6. import UserGroupDeleteModal from './UserGroupDeleteModal';
  7. class UserGroupPage extends React.Component {
  8. constructor(props) {
  9. super(props);
  10. this.state = {
  11. userGroups: props.userGroups,
  12. selectedUserGroup: undefined,
  13. isDeleteModalShow: false,
  14. };
  15. this.showDeleteModal = this.showDeleteModal.bind(this);
  16. this.hideDeleteModal = this.hideDeleteModal.bind(this);
  17. this.addGroup = this.addGroup.bind(this);
  18. }
  19. async showDeleteModal(group) {
  20. await this.syncUserGroupState();
  21. this.setState({
  22. selectedUserGroup: group,
  23. isDeleteModalShow: true,
  24. });
  25. }
  26. hideDeleteModal() {
  27. this.setState({
  28. selectedUserGroup: undefined,
  29. isDeleteModalShow: false,
  30. });
  31. }
  32. addGroup(newUserGroup) {
  33. this.setState((prevState) => {
  34. return {
  35. userGroups: [...prevState.userGroups, newUserGroup],
  36. isDeleteModalShow: false,
  37. };
  38. });
  39. }
  40. async syncUserGroupState() {
  41. let userGroups = [];
  42. try {
  43. const res = await this.props.crowi.apiGet('/admin/user-groups');
  44. if (res.ok) {
  45. userGroups = res.userGroups;
  46. }
  47. else {
  48. throw new Error('Unable to fetch groups from server');
  49. }
  50. }
  51. catch (err) {
  52. this.handleError(err);
  53. }
  54. this.setState({ userGroups });
  55. }
  56. handleError(err) {
  57. this.logger.error(err);
  58. toastr.error(err, 'Error occured', {
  59. closeButton: true,
  60. progressBar: true,
  61. newestOnTop: false,
  62. showDuration: '100',
  63. hideDuration: '100',
  64. timeOut: '3000',
  65. });
  66. }
  67. render() {
  68. return (
  69. <Fragment>
  70. <UserGroupCreateForm
  71. crowi={this.props.crowi}
  72. isAclEnabled={this.props.isAclEnabled}
  73. addGroup={this.addGroup}
  74. />
  75. <UserGroupTable
  76. crowi={this.props.crowi}
  77. userGroups={this.state.userGroups}
  78. userGroupRelations={this.props.userGroupRelations}
  79. isAclEnabled={this.props.isAclEnabled}
  80. onDelete={this.showDeleteModal}
  81. />
  82. <UserGroupDeleteModal
  83. crowi={this.props.crowi}
  84. userGroups={this.state.userGroups}
  85. deleteUserGroup={this.state.selectedUserGroup}
  86. isShow={this.state.isDeleteModalShow}
  87. onShow={this.showDeleteModal}
  88. onHide={this.hideDeleteModal}
  89. />
  90. </Fragment>
  91. );
  92. }
  93. }
  94. UserGroupPage.propTypes = {
  95. crowi: PropTypes.object.isRequired,
  96. userGroups: PropTypes.arrayOf(PropTypes.object).isRequired,
  97. userGroupRelations: PropTypes.object.isRequired,
  98. isAclEnabled: PropTypes.bool,
  99. };
  100. export default UserGroupPage;