UserGroupDetailContainer.js 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  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. * search user for invitation
  86. * @param {string} username username of the user to be searched
  87. */
  88. async fetchApplicableUsers(searchWord) {
  89. const res = await this.appContainer.apiv3.get(`/user-groups/${this.state.userGroup._id}/unrelated-users`, {
  90. searchWord,
  91. // TODO GW-716 switch value
  92. isForwardMatch: false,
  93. isAlsoNameSearched: false,
  94. isAlsoMailSearched: false,
  95. });
  96. const { users } = res.data;
  97. const applicableUsers = users.map((user) => {
  98. return user.username;
  99. });
  100. return applicableUsers;
  101. }
  102. /**
  103. * update user group
  104. *
  105. * @memberOf UserGroupDetailContainer
  106. * @param {string} username username of the user to be added to the group
  107. */
  108. async addUserByUsername(username) {
  109. const res = await this.appContainer.apiv3.post(`/user-groups/${this.state.userGroup._id}/users/${username}`);
  110. const { userGroupRelation } = res.data;
  111. this.setState((prevState) => {
  112. return {
  113. userGroupRelations: [...prevState.userGroupRelations, userGroupRelation],
  114. };
  115. });
  116. }
  117. /**
  118. * update user group
  119. *
  120. * @memberOf UserGroupDetailContainer
  121. * @param {string} username username of the user to be removed from the group
  122. */
  123. async removeUserByUsername(username) {
  124. const res = await this.appContainer.apiv3.delete(`/user-groups/${this.state.userGroup._id}/users/${username}`);
  125. this.setState((prevState) => {
  126. return {
  127. userGroupRelations: prevState.userGroupRelations.filter((u) => { return u._id !== res.data.userGroupRelation._id }),
  128. };
  129. });
  130. }
  131. }