AdminUsersContainer.js 6.9 KB

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