Browse Source

# Feature/196, 198, 199 Grouping users
* Prepare userGroup delete UI.
* Imprv view userGroup related users list(dummy now).
* Prepare delete userGroupRelation api.

Tatsuya Ise 8 years ago
parent
commit
4680fd15f1

+ 21 - 1
lib/models/user-group-relation.js

@@ -54,7 +54,7 @@ module.exports = function(crowi) {
   // ページネーション利用の検索
   userGroupRelationSchema.statics.findUserGroupRelationsWithPagination = function(options, callback) {
 
-    this.paginate({ page: options.page || 1, limit: options.limit || PAGE_ITEMS }, function(err, result) {
+    this.paginate({}, { page: options.page || 1, limit: options.limit || PAGE_ITEMS }, function(err, result) {
       if (err) {
         debug('Error on pagination:', err);
         return callback(err, null);
@@ -78,6 +78,26 @@ module.exports = function(crowi) {
     });
   };
 
+  // グループに紐づく関係性の全削除
+  userGroupRelationSchema.statics.removeAllCompletelyByUserGroup = function (userGroup, callback) {
+
+    if (userGroup === null || userGroup === undefined) { return; }
+    var UserGroupRelation = this
+    var relations = this.findAllRelation(userGroup);
+
+    // TODO 関係性削除の実装
+    relations.array.forEach(element => {
+
+    });
+  }
+
+  //
+  userGroupRelationSchema.statics.removeCompletely = function (userGroupRelation, callback) {
+    if (userGroupRelation) { return; }
+    var UserGroupRelation = this
+
+  }
+
   userGroupRelationSchema.statics.PAGE_ITEMS         = PAGE_ITEMS;
 
   return mongoose.model('UserGroupRelation', userGroupRelationSchema);

+ 15 - 1
lib/routes/admin.js

@@ -11,7 +11,7 @@ module.exports = function(crowi, app) {
     , pluginUtils = new PluginUtils()
     , ApiResponse = require('../util/apiResponse')
 
-    , MAX_PAGE_LIST = 5
+    , MAX_PAGE_LIST = 50
     , actions = {};
 
   function createPager(total, limit, page, pagesCount, maxPageList) {
@@ -564,6 +564,20 @@ module.exports = function(crowi, app) {
       });
   };
 
+  // app.post('/_api/admin/user-group/delete' , admin.userGroup.removeCompletely);
+  actions.userGroup.removeCompletely = function (req, res) {
+    const id = req.body.user_group_id;
+
+    UserGroup.removeCompletelyById(id)
+      .then(function (data) {
+        data.user = User.filterToPublicFields(data.user);
+        return res.json(ApiResponse.success(data));
+      }).catch(function (err) {
+        debug('Error on reseting password', err);
+        return res.json(ApiResponse.error('Error'));
+      });
+  }
+
   actions.api = {};
   actions.api.appSetting = function(req, res) {
     var form = req.form.settingForm;

+ 1 - 0
lib/routes/index.js

@@ -103,6 +103,7 @@ module.exports = function(crowi, app) {
   // user-groups admin
   app.get('/admin/user-groups'          , loginRequired(crowi, app), middleware.adminRequired(), admin.userGroup.index);
   app.post('/admin/user-group/create'  , form.admin.userGroupCreate, loginRequired(crowi, app), middleware.adminRequired(), csrf, admin.userGroup.create);
+  app.post('/_api/admin/user-group/delete', loginRequired(crowi, app), middleware.adminRequired(), csrf, admin.userGroup.removeCompletely);
 
   app.get('/me'                       , loginRequired(crowi, app) , me.index);
   app.get('/me/password'              , loginRequired(crowi, app) , me.password);

+ 55 - 0
lib/views/admin/user-groups.html

@@ -70,6 +70,43 @@
       </div><!-- /.modal -->
       {% endif %}
 
+      <div class="modal fade" id="admin-delete-user-group-modal">
+        <div class="modal-dialog">
+          <div class="modal-content">
+            <div class="modal-header">
+              <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+              <h4 class="modal-title"><code id="admin-delete-user-group-name"></code>グループを削除しますか?</h4>
+            </div>
+
+            <div class="modal-body">
+              <p>
+                グループの削除オペレーションを行うと元に戻すことはできませんのでご注意ください。
+              </p>
+              <p>
+                Related users:
+                <ul class="list-inline">
+                  {% for dGroupRelatedUser in userGroups %}
+                  <li class="list-inline-item badge badge-primary">{{dGroupRelatedUser.name}}</li>
+                  {% endfor %}
+                </ul>
+              </p>
+
+              <form method="post" id="admin-user-groups-delete">
+                <input type="hidden" name="user-group_id" value="">
+                <input type="hidden" name="_csrf" value="{{ csrf() }}">
+                <button type="submit" value="" class="btn btn-danger">
+                  実行
+                </button>
+              </form>
+
+            </div>
+
+          </div>
+          <!-- /.modal-content -->
+        </div>
+        <!-- /.modal-dialog -->
+      </div>
+
       <h2>グループ一覧</h2>
 
       <table class="table table-hover table-striped table-bordered table-user-list">
@@ -77,6 +114,7 @@
           <tr>
             <th width="100px">#</th>
             <th>名前</th>
+            <th>ユーザ一覧</th>
             <th width="100px">作成日</th>
             <th width="90px">操作</th>
           </tr>
@@ -88,6 +126,11 @@
               <img src="{{ sGroup|picture }}" class="picture picture-rounded" />
             </td>
             <td>{{ sGroup.name }}</td>
+            <td><ul class="list-inline">
+              {% for user in userGroups %}
+              <li class="list-inline-item badge badge-primary">{{user.name}}</li>
+              {% endfor %}
+            </ul></td>
             <td>{{ sGroup.createdAt|date('Y-m-d', sGroup.createdAt.getTimezoneOffset()) }}</td>
             <td>
               <div class="btn-group admin-group-menu">
@@ -100,6 +143,18 @@
                   <li>
                     <a href="">編集</a>
                   </li>
+
+                  <li class="dropdown-button">
+                    <a href="#"
+                      data-user-group-id="{{ sGroup._id.toString() }}"
+                      data-user-group-name="{{ sGroup.name.toString() }}"
+                      data-related-users="{{ userGroups }}"
+                      data-target="#admin-delete-user-group-modal"
+                      data-toggle="modal" class="btn btn-block btn-danger">
+                      グループの削除
+                    </a>
+                  </li>
+
                 </ul>
               </div>
             </td>

+ 7 - 0
resource/css/_admin.scss

@@ -10,6 +10,13 @@
     }
   }
 
+  .admin-group-menu {
+    .dropdown-menu {
+      left: auto;
+      right: 0;
+    }
+  }
+
   .content-main.admin-customize {
     .ss-container img {
       padding: .5em;

+ 27 - 0
resource/js/legacy/crowi-admin.js

@@ -52,4 +52,31 @@ $(function() {
 
     return false;
   });
+
+  $('#admin-delete-user-group-modal').on('show.bs.modal', function (button) {
+    var data = $(button.relatedTarget);
+    var userGroupId = data.data('user-group-id');
+    var userGroupName = data.data('user-group-name');
+    var relatedUsers = data.data('related-users');
+
+    $('#admin-delete-user-group-name').text(userGroupName);
+    $('#admin-user-groups-delete input[name=user-group_id]').val(userGroupId);
+  });
+
+  $('form#admin-user-groups-delete').on('submit', function (e) {
+    $.post('/_api/admin/userGroups.delete', $(this).serialize(), function (res) {
+      if (res.ok) {
+        // TODO Fix
+        //location.reload();
+        $('#admin-delete-user-group-modal').modal('hide');
+        return;
+      }
+
+      // fixme
+      alert('Failed to reset password');
+    });
+
+    return false;
+  });
+
 });