ryuichi-e 6 лет назад
Родитель
Сommit
e559e50e4e

+ 3 - 0
src/client/js/components/Admin/UserManagement.jsx

@@ -27,6 +27,7 @@ class UserManagement extends React.Component {
     this.handlePage(1);
   }
 
+  // ----- page loading -----
   async handlePage(selectedPage) {
     try {
       await this.props.adminUsersContainer.retrieveUsersByPagingNum(selectedPage);
@@ -36,6 +37,7 @@ class UserManagement extends React.Component {
     }
   }
 
+  // ----- User Status Check box -----
   handleClick(statusType) {
     const { adminUsersContainer } = this.props;
     if (!this.validateToggleStatus(statusType)) {
@@ -57,6 +59,7 @@ class UserManagement extends React.Component {
     return true;
   }
 
+  // ----- Search Input -----
   handleChangeSearchText(event) {
     this.props.adminUsersContainer.handleChangeSearchText(event.target.value);
   }

+ 11 - 8
src/client/js/services/AdminUsersContainer.js

@@ -1,6 +1,6 @@
 import { Container } from 'unstated';
-
 import loggerFactory from '@alias/logger';
+import { toastError } from '../util/apiNotification';
 
 // eslint-disable-next-line no-unused-vars
 const logger = loggerFactory('growi:services:AdminUserGroupDetailContainer');
@@ -18,8 +18,8 @@ export default class AdminUsersContainer extends Container {
 
     this.state = {
       users: [],
-      sort: '',
-      sortOrder: '',
+      sort: 'status',
+      sortOrder: 'asc',
       isPasswordResetModalShown: false,
       isUserInviteModalShown: false,
       userForPasswordResetModal: null,
@@ -77,6 +77,7 @@ export default class AdminUsersContainer extends Container {
     const { selectedStatusList } = this.state;
     selectedStatusList.add(statusType);
     this.setState({ selectedStatusList });
+    this.retrieveUsersByPagingNum();
   }
 
   deleteStatusFromList(statusType) {
@@ -93,10 +94,6 @@ export default class AdminUsersContainer extends Container {
     this.setState({ searchText: '' });
   }
 
-  retrieveUsersByChangedDetails(selectedPage) {
-    // TODO Access to /search-user-status/
-  }
-
   /**
    * syncUsers of selectedPage
    * @memberOf AdminUsersContainer
@@ -104,7 +101,13 @@ export default class AdminUsersContainer extends Container {
    */
   async retrieveUsersByPagingNum(selectedPage) {
 
-    const params = { page: selectedPage };
+    const params = {
+      page: selectedPage,
+      sort: this.state.sort,
+      sortOrder: this.state.sortOrder,
+      selectedStatusList: Array.from(this.state.selectedStatusList),
+      searchText: this.state.searchText,
+    };
     const { data } = await this.appContainer.apiv3.get('/users', params);
 
     if (data.paginateResult == null) {

+ 8 - 48
src/server/routes/apiv3/users.js

@@ -77,47 +77,6 @@ module.exports = (crowi) => {
 
   const { ApiV3FormValidator } = crowi.middlewares;
 
-  /**
-   * @swagger
-   *
-   *  paths:
-   *    /users:
-   *      get:
-   *        tags: [Users]
-   *        operationId: listUsers
-   *        summary: /users
-   *        description: Get users
-   *        responses:
-   *          200:
-   *            description: users are fetched
-   *            content:
-   *              application/json:
-   *                schema:
-   *                  properties:
-   *                    paginateResult:
-   *                      $ref: '#/components/schemas/PaginateResult'
-   */
-  router.get('/', loginRequiredStrictly, adminRequired, async(req, res) => {
-    const page = parseInt(req.query.page) || 1;
-
-    try {
-      const paginateResult = await User.paginate(
-        { status: { $ne: User.STATUS_DELETED } },
-        {
-          sort: { status: 1, username: 1, createdAt: 1 },
-          page,
-          limit: PAGE_ITEMS,
-        },
-      );
-      return res.apiv3({ paginateResult });
-    }
-    catch (err) {
-      const msg = 'Error occurred in fetching user group list';
-      logger.error('Error', err);
-      return res.apiv3Err(new ErrorV3(msg, 'user-group-list-fetch-failed'), 500);
-    }
-  });
-
   const statusNo = {
     registered: User.STATUS_REGISTERED,
     active: User.STATUS_ACTIVE,
@@ -127,7 +86,7 @@ module.exports = (crowi) => {
 
   validator.statusList = [
     // validate status list status array match to statusNo
-    body('selectedStatusList').custom((value) => {
+    query('selectedStatusList').custom((value) => {
       const error = [];
       value.forEach((status) => {
         if (!Object.keys(statusNo)) {
@@ -137,19 +96,20 @@ module.exports = (crowi) => {
       return (error.length === 0);
     }),
     // validate sortOrder : asc or desc
-    body('sortOrder').isIn(['asc', 'desc']),
+    query('sortOrder').isIn(['asc', 'desc']),
     // validate sort : what column you will sort
-    body('sort').isIn(['status', 'username', 'name', 'email', 'createdAt', 'lastLoginAt']),
+    query('sort').isIn(['id', 'status', 'username', 'name', 'email', 'createdAt', 'lastLoginAt']),
     query('page').isInt({ min: 1 }),
   ];
 
-  router.get('/search-user-status/', validator.statusList, ApiV3FormValidator, async(req, res) => {
+  router.get('/', validator.statusList, ApiV3FormValidator, async(req, res) => {
+
     const page = parseInt(req.query.page) || 1;
     // status
-    const { selectedStatusList } = req.body;
+    const { selectedStatusList } = req.query;
     const statusNoList = selectedStatusList.map(element => statusNo[element]);
     // Search from input
-    const searchText = req.body.searchText || '';
+    const searchText = req.query.searchText || '';
     const searchWord = new RegExp(`${searchText}`);
     const orColumns = ['name', 'username', 'email'];
     const orOutput = {};
@@ -157,7 +117,7 @@ module.exports = (crowi) => {
       orOutput[element] = { $in: searchWord };
     });
     // Sort
-    const { sort, sortOrder } = req.body;
+    const { sort, sortOrder } = req.query;
     const sortOutput = {
       [sort]: (sortOrder === 'desc') ? -1 : 1,
     };