UserGroupDetailContainer.js 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. import { Container } from 'unstated';
  2. import loggerFactory from '@alias/logger';
  3. import { toastError } from '../util/apiNotification';
  4. // eslint-disable-next-line no-unused-vars
  5. const logger = loggerFactory('growi:services:UserGroupDetailContainer');
  6. /**
  7. * Service container for admin user group detail page (UserGroupDetailPage.jsx)
  8. * @extends {Container} unstated Container
  9. */
  10. export default class UserGroupDetailContainer extends Container {
  11. constructor(appContainer) {
  12. super();
  13. this.appContainer = appContainer;
  14. this.state = {
  15. // TODO: [SPA] get userGroup from props
  16. userGroup: JSON.parse(document.getElementById('admin-user-group-detail').getAttribute('data-user-group')),
  17. userGroupRelations: [],
  18. relatedPages: [],
  19. isUserGroupUserModalOpen: false,
  20. };
  21. this.init();
  22. this.openUserGroupUserModal = this.openUserGroupUserModal.bind(this);
  23. this.closeUserGroupUserModal = this.closeUserGroupUserModal.bind(this);
  24. this.addUserByUsername = this.addUserByUsername.bind(this);
  25. this.removeUserByUsername = this.removeUserByUsername.bind(this);
  26. }
  27. /**
  28. * Workaround for the mangling in production build to break constructor.name
  29. */
  30. static getClassName() {
  31. return 'UserGroupDetailContainer';
  32. }
  33. /**
  34. * retrieve user group data
  35. */
  36. async init() {
  37. try {
  38. const [
  39. userGroupRelations,
  40. relatedPages,
  41. ] = await Promise.all([
  42. this.appContainer.apiv3.get(`/user-groups/${this.state.userGroup._id}/user-group-relations`).then((res) => { return res.data.userGroupRelations }),
  43. this.appContainer.apiv3.get(`/user-groups/${this.state.userGroup._id}/pages`).then((res) => { return res.data.pages }),
  44. ]);
  45. await this.setState({
  46. userGroupRelations,
  47. relatedPages,
  48. });
  49. }
  50. catch (err) {
  51. logger.error(err);
  52. toastError(new Error('Failed to fetch data'));
  53. }
  54. }
  55. /**
  56. * update user group
  57. *
  58. * @memberOf UserGroupDetailContainer
  59. * @param {object} param update param for user group
  60. * @return {object} response object
  61. */
  62. async updateUserGroup(param) {
  63. const res = await this.appContainer.apiv3.put(`/user-groups/${this.state.userGroup._id}`, param);
  64. const { userGroup } = res.data;
  65. await this.setState({ userGroup });
  66. return res;
  67. }
  68. /**
  69. * open a modal
  70. *
  71. * @memberOf UserGroupDetailContainer
  72. */
  73. async openUserGroupUserModal() {
  74. await this.setState({ isUserGroupUserModalOpen: true });
  75. }
  76. /**
  77. * close a modal
  78. *
  79. * @memberOf UserGroupDetailContainer
  80. */
  81. async closeUserGroupUserModal() {
  82. await this.setState({ isUserGroupUserModalOpen: false });
  83. }
  84. /**
  85. * update user group
  86. *
  87. * @memberOf UserGroupDetailContainer
  88. * @param {string} username username of the user to be added to the group
  89. */
  90. async addUserByUsername(username) {
  91. const res = await this.appContainer.apiv3.post(`/user-groups/${this.state.userGroup._id}/users/${username}`);
  92. const { userGroupRelation } = res.data;
  93. this.setState((prevState) => {
  94. return {
  95. userGroupRelations: [...prevState.userGroupRelations, userGroupRelation],
  96. };
  97. });
  98. }
  99. /**
  100. * update user group
  101. *
  102. * @memberOf UserGroupDetailContainer
  103. * @param {string} username username of the user to be removed from the group
  104. */
  105. async removeUserByUsername(username) {
  106. const res = await this.appContainer.apiv3.delete(`/user-groups/${this.state.userGroup._id}/users/${username}`);
  107. this.setState((prevState) => {
  108. return {
  109. userGroupRelations: prevState.userGroupRelations.filter((u) => { return u._id !== res.data.userGroupRelation._id }),
  110. };
  111. });
  112. }
  113. }