AdminUsersContainer.js 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266
  1. import { Container } from 'unstated';
  2. import { debounce } from 'throttle-debounce';
  3. import loggerFactory from '~/utils/logger';
  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. // Even if email is hidden, it will be displayed on admin page.
  117. forceIncludeAttributes: ['email'],
  118. };
  119. const { data } = await this.appContainer.apiv3.get('/users', params);
  120. if (data.paginateResult == null) {
  121. throw new Error('data must conclude \'paginateResult\' property.');
  122. }
  123. const { docs: users, totalDocs: totalUsers, limit: pagingLimit } = data.paginateResult;
  124. this.setState({
  125. users,
  126. totalUsers,
  127. pagingLimit,
  128. activePage: selectedPage,
  129. });
  130. }
  131. /**
  132. * create user invited
  133. * @memberOf AdminUsersContainer
  134. * @param {object} shapedEmailList
  135. * @param {bool} sendEmail
  136. */
  137. async createUserInvited(shapedEmailList, sendEmail) {
  138. const response = await this.appContainer.apiv3.post('/users/invite', {
  139. shapedEmailList,
  140. sendEmail,
  141. });
  142. await this.retrieveUsersByPagingNum(this.state.activePage);
  143. return response.data;
  144. }
  145. /**
  146. * open reset password modal, and props user
  147. * @memberOf AdminUsersContainer
  148. * @param {object} user
  149. */
  150. async showPasswordResetModal(user) {
  151. await this.setState({
  152. isPasswordResetModalShown: true,
  153. userForPasswordResetModal: user,
  154. });
  155. }
  156. /**
  157. * close reset password modal
  158. * @memberOf AdminUsersContainer
  159. */
  160. async hidePasswordResetModal() {
  161. await this.setState({
  162. isPasswordResetModalShown: false,
  163. userForPasswordResetModal: null,
  164. });
  165. }
  166. /**
  167. * toggle user invite modal
  168. * @memberOf AdminUsersContainer
  169. */
  170. async toggleUserInviteModal() {
  171. await this.setState({ isUserInviteModalShown: !this.state.isUserInviteModalShown });
  172. }
  173. /**
  174. * Give user admin
  175. * @memberOf AdminUsersContainer
  176. * @param {string} userId
  177. * @return {string} username
  178. */
  179. async giveUserAdmin(userId) {
  180. const response = await this.appContainer.apiv3.put(`/users/${userId}/giveAdmin`);
  181. const { username } = response.data.userData;
  182. await this.retrieveUsersByPagingNum(this.state.activePage);
  183. return username;
  184. }
  185. /**
  186. * Remove user admin
  187. * @memberOf AdminUsersContainer
  188. * @param {string} userId
  189. * @return {string} username
  190. */
  191. async removeUserAdmin(userId) {
  192. const response = await this.appContainer.apiv3.put(`/users/${userId}/removeAdmin`);
  193. const { username } = response.data.userData;
  194. await this.retrieveUsersByPagingNum(this.state.activePage);
  195. return username;
  196. }
  197. /**
  198. * Activate user
  199. * @memberOf AdminUsersContainer
  200. * @param {string} userId
  201. * @return {string} username
  202. */
  203. async activateUser(userId) {
  204. const response = await this.appContainer.apiv3.put(`/users/${userId}/activate`);
  205. const { username } = response.data.userData;
  206. await this.retrieveUsersByPagingNum(this.state.activePage);
  207. return username;
  208. }
  209. /**
  210. * Deactivate user
  211. * @memberOf AdminUsersContainer
  212. * @param {string} userId
  213. * @return {string} username
  214. */
  215. async deactivateUser(userId) {
  216. const response = await this.appContainer.apiv3.put(`/users/${userId}/deactivate`);
  217. const { username } = response.data.userData;
  218. await this.retrieveUsersByPagingNum(this.state.activePage);
  219. return username;
  220. }
  221. /**
  222. * remove user
  223. * @memberOf AdminUsersContainer
  224. * @param {string} userId
  225. * @return {object} removedUserData
  226. */
  227. async removeUser(userId) {
  228. const response = await this.appContainer.apiv3.delete(`/users/${userId}/remove`);
  229. const removedUserData = response.data.userData;
  230. await this.retrieveUsersByPagingNum(this.state.activePage);
  231. return removedUserData;
  232. }
  233. }