AdminUsersContainer.js 6.9 KB

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