AdminUsersContainer.js 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261
  1. import { Container } from 'unstated';
  2. import loggerFactory from '@alias/logger';
  3. // eslint-disable-next-line no-unused-vars
  4. const logger = loggerFactory('growi:services:AdminUserGroupDetailContainer');
  5. /**
  6. * Service container for admin users page (Users.jsx)
  7. * @extends {Container} unstated Container
  8. */
  9. export default class AdminUsersContainer extends Container {
  10. constructor(appContainer) {
  11. super();
  12. this.appContainer = appContainer;
  13. this.state = {
  14. users: [],
  15. sort: 'id',
  16. sortOrder: 'asc',
  17. isPasswordResetModalShown: false,
  18. isUserInviteModalShown: false,
  19. userForPasswordResetModal: null,
  20. totalUsers: 0,
  21. activePage: 1,
  22. pagingLimit: Infinity,
  23. selectedStatusList: new Set(['all']),
  24. searchText: '',
  25. notifyComment: '',
  26. };
  27. this.showPasswordResetModal = this.showPasswordResetModal.bind(this);
  28. this.hidePasswordResetModal = this.hidePasswordResetModal.bind(this);
  29. this.toggleUserInviteModal = this.toggleUserInviteModal.bind(this);
  30. }
  31. /**
  32. * Workaround for the mangling in production build to break constructor.name
  33. */
  34. static getClassName() {
  35. return 'AdminUsersContainer';
  36. }
  37. setNotifyComment(notifyComment) {
  38. this.setState({ notifyComment });
  39. }
  40. /**
  41. * Workaround for status list
  42. */
  43. isSelected(statusType) {
  44. return this.state.selectedStatusList.has(statusType);
  45. }
  46. handleClick(statusType) {
  47. const all = 'all';
  48. if (this.isSelected(statusType)) {
  49. this.deleteStatusFromList(statusType);
  50. }
  51. else {
  52. if (statusType === all) {
  53. this.clearStatusList();
  54. }
  55. else {
  56. this.deleteStatusFromList(all);
  57. }
  58. this.addStatusToList(statusType);
  59. }
  60. }
  61. async clearStatusList() {
  62. const { selectedStatusList } = this.state;
  63. selectedStatusList.clear();
  64. await this.setState({ selectedStatusList });
  65. }
  66. async addStatusToList(statusType) {
  67. const { selectedStatusList } = this.state;
  68. selectedStatusList.add(statusType);
  69. await this.setState({ selectedStatusList });
  70. this.retrieveUsersByPagingNum(1);
  71. }
  72. async deleteStatusFromList(statusType) {
  73. const { selectedStatusList } = this.state;
  74. selectedStatusList.delete(statusType);
  75. await this.setState({ selectedStatusList });
  76. this.retrieveUsersByPagingNum(1);
  77. }
  78. /**
  79. * Workaround for Increment Search Text Input
  80. */
  81. async handleChangeSearchText(searchText) {
  82. await this.setState({ searchText });
  83. this.retrieveUsersByPagingNum(1);
  84. }
  85. async clearSearchText() {
  86. await this.setState({ searchText: '' });
  87. this.retrieveUsersByPagingNum(1);
  88. }
  89. /**
  90. * Workaround for Sorting
  91. */
  92. async sort(sort, isAsc) {
  93. const sortOrder = isAsc ? 'asc' : 'desc';
  94. await this.setState({ sort, sortOrder });
  95. this.retrieveUsersByPagingNum(1);
  96. }
  97. async resetAllChanges() {
  98. await this.setState({
  99. sort: 'id', sortOrder: 'asc', searchText: '', selectedStatusList: new Set(['all']),
  100. });
  101. this.retrieveUsersByPagingNum(1);
  102. }
  103. /**
  104. * syncUsers of selectedPage
  105. * @memberOf AdminUsersContainer
  106. * @param {number} selectedPage
  107. */
  108. async retrieveUsersByPagingNum(selectedPage) {
  109. const params = {
  110. page: selectedPage,
  111. sort: this.state.sort,
  112. sortOrder: this.state.sortOrder,
  113. selectedStatusList: Array.from(this.state.selectedStatusList),
  114. searchText: this.state.searchText,
  115. };
  116. const { data } = await this.appContainer.apiv3.get('/users', params);
  117. if (data.paginateResult == null) {
  118. throw new Error('data must conclude \'paginateResult\' property.');
  119. }
  120. const { docs: users, totalDocs: totalUsers, limit: pagingLimit } = data.paginateResult;
  121. this.setState({
  122. users,
  123. totalUsers,
  124. pagingLimit,
  125. activePage: selectedPage,
  126. });
  127. }
  128. /**
  129. * create user invited
  130. * @memberOf AdminUsersContainer
  131. * @param {object} shapedEmailList
  132. * @param {bool} sendEmail
  133. */
  134. async createUserInvited(shapedEmailList, sendEmail) {
  135. const response = await this.appContainer.apiv3.post('/users/invite', {
  136. shapedEmailList,
  137. sendEmail,
  138. });
  139. await this.retrieveUsersByPagingNum(this.state.activePage);
  140. const { invitedUserList } = response.data;
  141. return invitedUserList;
  142. }
  143. /**
  144. * open reset password modal, and props user
  145. * @memberOf AdminUsersContainer
  146. * @param {object} user
  147. */
  148. async showPasswordResetModal(user) {
  149. await this.setState({
  150. isPasswordResetModalShown: true,
  151. userForPasswordResetModal: user,
  152. });
  153. }
  154. /**
  155. * close reset password modal
  156. * @memberOf AdminUsersContainer
  157. */
  158. async hidePasswordResetModal() {
  159. await this.setState({ isPasswordResetModalShown: false });
  160. }
  161. /**
  162. * toggle user invite modal
  163. * @memberOf AdminUsersContainer
  164. */
  165. async toggleUserInviteModal() {
  166. await this.setState({ isUserInviteModalShown: !this.state.isUserInviteModalShown });
  167. }
  168. /**
  169. * Give user admin
  170. * @memberOf AdminUsersContainer
  171. * @param {string} userId
  172. * @return {string} username
  173. */
  174. async giveUserAdmin(userId) {
  175. const response = await this.appContainer.apiv3.put(`/users/${userId}/giveAdmin`);
  176. const { username } = response.data.userData;
  177. await this.retrieveUsersByPagingNum(this.state.activePage);
  178. return username;
  179. }
  180. /**
  181. * Remove user admin
  182. * @memberOf AdminUsersContainer
  183. * @param {string} userId
  184. * @return {string} username
  185. */
  186. async removeUserAdmin(userId) {
  187. const response = await this.appContainer.apiv3.put(`/users/${userId}/removeAdmin`);
  188. const { username } = response.data.userData;
  189. await this.retrieveUsersByPagingNum(this.state.activePage);
  190. return username;
  191. }
  192. /**
  193. * Activate user
  194. * @memberOf AdminUsersContainer
  195. * @param {string} userId
  196. * @return {string} username
  197. */
  198. async activateUser(userId) {
  199. const response = await this.appContainer.apiv3.put(`/users/${userId}/activate`);
  200. const { username } = response.data.userData;
  201. await this.retrieveUsersByPagingNum(this.state.activePage);
  202. return username;
  203. }
  204. /**
  205. * Deactivate user
  206. * @memberOf AdminUsersContainer
  207. * @param {string} userId
  208. * @return {string} username
  209. */
  210. async deactivateUser(userId) {
  211. const response = await this.appContainer.apiv3.put(`/users/${userId}/deactivate`);
  212. const { username } = response.data.userData;
  213. await this.retrieveUsersByPagingNum(this.state.activePage);
  214. return username;
  215. }
  216. /**
  217. * remove user
  218. * @memberOf AdminUsersContainer
  219. * @param {string} userId
  220. * @return {object} removedUserData
  221. */
  222. async removeUser(userId) {
  223. const response = await this.appContainer.apiv3.delete(`/users/${userId}/remove`);
  224. const removedUserData = response.data.userData;
  225. await this.retrieveUsersByPagingNum(this.state.activePage);
  226. return removedUserData;
  227. }
  228. }