AdminUsersContainer.js 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269
  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. notifyComment: '',
  27. };
  28. this.showPasswordResetModal = this.showPasswordResetModal.bind(this);
  29. this.hidePasswordResetModal = this.hidePasswordResetModal.bind(this);
  30. this.toggleUserInviteModal = this.toggleUserInviteModal.bind(this);
  31. this.handleChangeSearchTextDebouce = debounce(3000, () => this.retrieveUsersByPagingNum(1));
  32. }
  33. /**
  34. * Workaround for the mangling in production build to break constructor.name
  35. */
  36. static getClassName() {
  37. return 'AdminUsersContainer';
  38. }
  39. setNotifyComment(notifyComment) {
  40. this.setState({ notifyComment });
  41. }
  42. /**
  43. * Workaround for status list
  44. */
  45. isSelected(statusType) {
  46. return this.state.selectedStatusList.has(statusType);
  47. }
  48. handleClick(statusType) {
  49. const all = 'all';
  50. if (this.isSelected(statusType)) {
  51. this.deleteStatusFromList(statusType);
  52. }
  53. else {
  54. if (statusType === all) {
  55. this.clearStatusList();
  56. }
  57. else {
  58. this.deleteStatusFromList(all);
  59. }
  60. this.addStatusToList(statusType);
  61. }
  62. }
  63. async clearStatusList() {
  64. const { selectedStatusList } = this.state;
  65. selectedStatusList.clear();
  66. await this.setState({ selectedStatusList });
  67. }
  68. async addStatusToList(statusType) {
  69. const { selectedStatusList } = this.state;
  70. selectedStatusList.add(statusType);
  71. await this.setState({ selectedStatusList });
  72. this.retrieveUsersByPagingNum(1);
  73. }
  74. async deleteStatusFromList(statusType) {
  75. const { selectedStatusList } = this.state;
  76. selectedStatusList.delete(statusType);
  77. await this.setState({ selectedStatusList });
  78. this.retrieveUsersByPagingNum(1);
  79. }
  80. /**
  81. * Workaround for Increment Search Text Input
  82. */
  83. async handleChangeSearchText(searchText) {
  84. await this.setState({ searchText });
  85. this.handleChangeSearchTextDebouce();
  86. }
  87. async clearSearchText() {
  88. await this.setState({ searchText: '' });
  89. this.retrieveUsersByPagingNum(1);
  90. }
  91. /**
  92. * Workaround for Sorting
  93. */
  94. async onClickSort(sortColumns, isAsc) {
  95. if (isAsc) {
  96. await this.setState({ sort: sortColumns, sortOrder: 'asc' });
  97. }
  98. else {
  99. await this.setState({ sort: sortColumns, sortOrder: 'desc' });
  100. }
  101. this.retrieveUsersByPagingNum(1);
  102. }
  103. async resetAllChanges() {
  104. await this.setState({
  105. sort: 'id', sortOrder: 'asc', searchText: '', selectedStatusList: new Set(['all']),
  106. });
  107. this.retrieveUsersByPagingNum(1);
  108. }
  109. /**
  110. * syncUsers of selectedPage
  111. * @memberOf AdminUsersContainer
  112. * @param {number} selectedPage
  113. */
  114. async retrieveUsersByPagingNum(selectedPage) {
  115. const params = {
  116. page: selectedPage,
  117. sort: this.state.sort,
  118. sortOrder: this.state.sortOrder,
  119. selectedStatusList: Array.from(this.state.selectedStatusList),
  120. searchText: this.state.searchText,
  121. };
  122. const { data } = await this.appContainer.apiv3.get('/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 this.appContainer.apiv3.post('/users/invite', {
  142. shapedEmailList,
  143. sendEmail,
  144. });
  145. await this.retrieveUsersByPagingNum(this.state.activePage);
  146. const { invitedUserList } = response.data;
  147. return invitedUserList;
  148. }
  149. /**
  150. * open reset password modal, and props user
  151. * @memberOf AdminUsersContainer
  152. * @param {object} user
  153. */
  154. async showPasswordResetModal(user) {
  155. await this.setState({
  156. isPasswordResetModalShown: true,
  157. userForPasswordResetModal: user,
  158. });
  159. }
  160. /**
  161. * close reset password modal
  162. * @memberOf AdminUsersContainer
  163. */
  164. async hidePasswordResetModal() {
  165. await this.setState({ isPasswordResetModalShown: false });
  166. }
  167. /**
  168. * toggle user invite modal
  169. * @memberOf AdminUsersContainer
  170. */
  171. async toggleUserInviteModal() {
  172. await this.setState({ isUserInviteModalShown: !this.state.isUserInviteModalShown });
  173. }
  174. /**
  175. * Give user admin
  176. * @memberOf AdminUsersContainer
  177. * @param {string} userId
  178. * @return {string} username
  179. */
  180. async giveUserAdmin(userId) {
  181. const response = await this.appContainer.apiv3.put(`/users/${userId}/giveAdmin`);
  182. const { username } = response.data.userData;
  183. await this.retrieveUsersByPagingNum(this.state.activePage);
  184. return username;
  185. }
  186. /**
  187. * Remove user admin
  188. * @memberOf AdminUsersContainer
  189. * @param {string} userId
  190. * @return {string} username
  191. */
  192. async removeUserAdmin(userId) {
  193. const response = await this.appContainer.apiv3.put(`/users/${userId}/removeAdmin`);
  194. const { username } = response.data.userData;
  195. await this.retrieveUsersByPagingNum(this.state.activePage);
  196. return username;
  197. }
  198. /**
  199. * Activate user
  200. * @memberOf AdminUsersContainer
  201. * @param {string} userId
  202. * @return {string} username
  203. */
  204. async activateUser(userId) {
  205. const response = await this.appContainer.apiv3.put(`/users/${userId}/activate`);
  206. const { username } = response.data.userData;
  207. await this.retrieveUsersByPagingNum(this.state.activePage);
  208. return username;
  209. }
  210. /**
  211. * Deactivate user
  212. * @memberOf AdminUsersContainer
  213. * @param {string} userId
  214. * @return {string} username
  215. */
  216. async deactivateUser(userId) {
  217. const response = await this.appContainer.apiv3.put(`/users/${userId}/deactivate`);
  218. const { username } = response.data.userData;
  219. await this.retrieveUsersByPagingNum(this.state.activePage);
  220. return username;
  221. }
  222. /**
  223. * remove user
  224. * @memberOf AdminUsersContainer
  225. * @param {string} userId
  226. * @return {object} removedUserData
  227. */
  228. async removeUser(userId) {
  229. const response = await this.appContainer.apiv3.delete(`/users/${userId}/remove`);
  230. const removedUserData = response.data.userData;
  231. await this.retrieveUsersByPagingNum(this.state.activePage);
  232. return removedUserData;
  233. }
  234. }