AdminUsersContainer.js 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265
  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 onClickSortAsc(sortColumns) {
  93. await this.setState({ sort: sortColumns, sortOrder: 'asc' });
  94. this.retrieveUsersByPagingNum(1);
  95. }
  96. async onClickSortDesc(sortColumns) {
  97. await this.setState({ sort: sortColumns, sortOrder: 'desc' });
  98. this.retrieveUsersByPagingNum(1);
  99. }
  100. async resetAllChanges() {
  101. await this.setState({
  102. sort: 'id', sortOrder: 'asc', searchText: '', selectedStatusList: new Set(['all']),
  103. });
  104. this.retrieveUsersByPagingNum(1);
  105. }
  106. /**
  107. * syncUsers of selectedPage
  108. * @memberOf AdminUsersContainer
  109. * @param {number} selectedPage
  110. */
  111. async retrieveUsersByPagingNum(selectedPage) {
  112. const params = {
  113. page: selectedPage,
  114. sort: this.state.sort,
  115. sortOrder: this.state.sortOrder,
  116. selectedStatusList: Array.from(this.state.selectedStatusList),
  117. searchText: this.state.searchText,
  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. const { invitedUserList } = response.data;
  144. return invitedUserList;
  145. }
  146. /**
  147. * open reset password modal, and props user
  148. * @memberOf AdminUsersContainer
  149. * @param {object} user
  150. */
  151. async showPasswordResetModal(user) {
  152. await this.setState({
  153. isPasswordResetModalShown: true,
  154. userForPasswordResetModal: user,
  155. });
  156. }
  157. /**
  158. * close reset password modal
  159. * @memberOf AdminUsersContainer
  160. */
  161. async hidePasswordResetModal() {
  162. await this.setState({ isPasswordResetModalShown: false });
  163. }
  164. /**
  165. * toggle user invite modal
  166. * @memberOf AdminUsersContainer
  167. */
  168. async toggleUserInviteModal() {
  169. await this.setState({ isUserInviteModalShown: !this.state.isUserInviteModalShown });
  170. }
  171. /**
  172. * Give user admin
  173. * @memberOf AdminUsersContainer
  174. * @param {string} userId
  175. * @return {string} username
  176. */
  177. async giveUserAdmin(userId) {
  178. const response = await this.appContainer.apiv3.put(`/users/${userId}/giveAdmin`);
  179. const { username } = response.data.userData;
  180. await this.retrieveUsersByPagingNum(this.state.activePage);
  181. return username;
  182. }
  183. /**
  184. * Remove user admin
  185. * @memberOf AdminUsersContainer
  186. * @param {string} userId
  187. * @return {string} username
  188. */
  189. async removeUserAdmin(userId) {
  190. const response = await this.appContainer.apiv3.put(`/users/${userId}/removeAdmin`);
  191. const { username } = response.data.userData;
  192. await this.retrieveUsersByPagingNum(this.state.activePage);
  193. return username;
  194. }
  195. /**
  196. * Activate user
  197. * @memberOf AdminUsersContainer
  198. * @param {string} userId
  199. * @return {string} username
  200. */
  201. async activateUser(userId) {
  202. const response = await this.appContainer.apiv3.put(`/users/${userId}/activate`);
  203. const { username } = response.data.userData;
  204. await this.retrieveUsersByPagingNum(this.state.activePage);
  205. return username;
  206. }
  207. /**
  208. * Deactivate user
  209. * @memberOf AdminUsersContainer
  210. * @param {string} userId
  211. * @return {string} username
  212. */
  213. async deactivateUser(userId) {
  214. const response = await this.appContainer.apiv3.put(`/users/${userId}/deactivate`);
  215. const { username } = response.data.userData;
  216. await this.retrieveUsersByPagingNum(this.state.activePage);
  217. return username;
  218. }
  219. /**
  220. * remove user
  221. * @memberOf AdminUsersContainer
  222. * @param {string} userId
  223. * @return {object} removedUserData
  224. */
  225. async removeUser(userId) {
  226. const response = await this.appContainer.apiv3.delete(`/users/${userId}/remove`);
  227. const removedUserData = response.data.userData;
  228. await this.retrieveUsersByPagingNum(this.state.activePage);
  229. return removedUserData;
  230. }
  231. }