Browse Source

bugfix: only care active members, also optimize some code

floatinghotpot 9 years ago
parent
commit
672c21bfe0

+ 1 - 1
client/components/cards/cardDetails.jade

@@ -94,7 +94,7 @@ template(name="moveCardPopup")
 
 
 template(name="cardMembersPopup")
 template(name="cardMembersPopup")
   ul.pop-over-list.js-card-member-list
   ul.pop-over-list.js-card-member-list
-    each board.members
+    each board.activeMembers
       li.item(class="{{#if isCardMember}}active{{/if}}")
       li.item(class="{{#if isCardMember}}active{{/if}}")
         a.name.js-select-member(href="#")
         a.name.js-select-member(href="#")
           +userAvatar(userId=user._id)
           +userAvatar(userId=user._id)

+ 1 - 1
client/components/lists/listBody.js

@@ -186,7 +186,7 @@ BlazeComponent.extendComponent({
         match: /\B@(\w*)$/,
         match: /\B@(\w*)$/,
         search(term, callback) {
         search(term, callback) {
           const currentBoard = Boards.findOne(Session.get('currentBoard'));
           const currentBoard = Boards.findOne(Session.get('currentBoard'));
-          callback($.map(currentBoard.members, (member) => {
+          callback($.map(currentBoard.activeMembers(), (member) => {
             const user = Users.findOne(member.userId);
             const user = Users.findOne(member.userId);
             return user.username.indexOf(term) === 0 ? user : null;
             return user.username.indexOf(term) === 0 ? user : null;
           }));
           }));

+ 1 - 1
client/components/main/editor.js

@@ -28,7 +28,7 @@ Template.editor.onRendered(() => {
       match: /\B@(\w*)$/,
       match: /\B@(\w*)$/,
       search(term, callback) {
       search(term, callback) {
         const currentBoard = Boards.findOne(Session.get('currentBoard'));
         const currentBoard = Boards.findOne(Session.get('currentBoard'));
-        callback(currentBoard.members.map((member) => {
+        callback(currentBoard.activeMembers().map((member) => {
           const username = Users.findOne(member.userId).username;
           const username = Users.findOne(member.userId).username;
           return username.includes(term) ? username : null;
           return username.includes(term) ? username : null;
         }));
         }));

+ 4 - 8
client/components/sidebar/sidebar.js

@@ -279,7 +279,7 @@ BlazeComponent.extendComponent({
       'click .js-select-member'() {
       'click .js-select-member'() {
         const userId = this.currentData()._id;
         const userId = this.currentData()._id;
         const currentBoard = Boards.findOne(Session.get('currentBoard'));
         const currentBoard = Boards.findOne(Session.get('currentBoard'));
-        if (currentBoard.memberIndex(userId)<0) {
+        if (!currentBoard.hasMember(userId)) {
           this.inviteUser(userId);
           this.inviteUser(userId);
         }
         }
       },
       },
@@ -305,16 +305,12 @@ Template.changePermissionsPopup.events({
 
 
 Template.changePermissionsPopup.helpers({
 Template.changePermissionsPopup.helpers({
   isAdmin() {
   isAdmin() {
-    const user = Users.findOne(this.userId);
-    return user.isBoardAdmin();
+    const currentBoard = Boards.findOne(Session.get('currentBoard'));
+    return currentBoard.hasAdmin(this.userId);
   },
   },
 
 
   isLastAdmin() {
   isLastAdmin() {
-    const user = Users.findOne(this.userId);
-    if (!user.isBoardAdmin())
-      return false;
     const currentBoard = Boards.findOne(Session.get('currentBoard'));
     const currentBoard = Boards.findOne(Session.get('currentBoard'));
-    const nbAdmins = _.where(currentBoard.members, { isAdmin: true }).length;
-    return nbAdmins === 1;
+    return currentBoard.hasAdmin(this.userId) && (currentBoard.activeAdmins() === 1);
   },
   },
 });
 });

+ 22 - 24
client/components/sidebar/sidebarFilters.jade

@@ -18,17 +18,16 @@ template(name="filterSidebar")
             i.fa.fa-check
             i.fa.fa-check
   hr
   hr
   ul.sidebar-list
   ul.sidebar-list
-    each currentBoard.members
-      if isActive
-        with getUser userId
-          li(class="{{#if Filter.members.isSelected _id}}active{{/if}}")
-            a.name.js-toggle-member-filter
-              +userAvatar(userId=this._id)
-              span.sidebar-list-item-description
-                = profile.fullname
-                | (<span class="username">{{ username }}</span>)
-              if Filter.members.isSelected _id
-                i.fa.fa-check
+    each currentBoard.activeMembers
+      with getUser userId
+        li(class="{{#if Filter.members.isSelected _id}}active{{/if}}")
+          a.name.js-toggle-member-filter
+            +userAvatar(userId=this._id)
+            span.sidebar-list-item-description
+              = profile.fullname
+              | (<span class="username">{{ username }}</span>)
+            if Filter.members.isSelected _id
+              i.fa.fa-check
   if Filter.isActive
   if Filter.isActive
     hr
     hr
     a.sidebar-btn.js-clear-all
     a.sidebar-btn.js-clear-all
@@ -55,19 +54,18 @@ template(name="multiselectionSidebar")
             i.fa.fa-ellipsis-h
             i.fa.fa-ellipsis-h
   hr
   hr
   ul.sidebar-list
   ul.sidebar-list
-    each currentBoard.members
-      if isActive
-        with getUser userId
-          li(class="{{#if Filter.members.isSelected _id}}active{{/if}}")
-            a.name.js-toggle-member-multiselection
-              +userAvatar(userId=this._id)
-              span.sidebar-list-item-description
-                = profile.fullname
-                | (<span class="username">{{ username }}</span>)
-              if allSelectedElementHave 'member' _id
-                i.fa.fa-check
-              else if someSelectedElementHave 'member' _id
-                i.fa.fa-ellipsis-h
+    each currentBoard.activeMembers
+      with getUser userId
+        li(class="{{#if Filter.members.isSelected _id}}active{{/if}}")
+          a.name.js-toggle-member-multiselection
+            +userAvatar(userId=this._id)
+            span.sidebar-list-item-description
+              = profile.fullname
+              | (<span class="username">{{ username }}</span>)
+            if allSelectedElementHave 'member' _id
+              i.fa.fa-check
+            else if someSelectedElementHave 'member' _id
+              i.fa.fa-ellipsis-h
   hr
   hr
   a.sidebar-btn.js-archive-selection
   a.sidebar-btn.js-archive-selection
     i.fa.fa-archive
     i.fa.fa-archive

+ 27 - 32
models/boards.js

@@ -115,6 +115,14 @@ Boards.helpers({
     return _.pluck(this.members, 'userId').indexOf(memberId);
     return _.pluck(this.members, 'userId').indexOf(memberId);
   },
   },
 
 
+  hasMember(memberId) {
+    return !!_.findWhere(this.members, {userId: memberId, isActive: true});
+  },
+
+  hasAdmin(memberId) {
+    return !!_.findWhere(this.members, {userId: memberId, isActive: true, isAdmin: true});
+  },
+
   absoluteUrl() {
   absoluteUrl() {
     return FlowRouter.path('board', { id: this._id, slug: this.slug });
     return FlowRouter.path('board', { id: this._id, slug: this.slug });
   },
   },
@@ -186,34 +194,23 @@ Boards.mutations({
 
 
   addMember(memberId) {
   addMember(memberId) {
     const memberIndex = this.memberIndex(memberId);
     const memberIndex = this.memberIndex(memberId);
-    if (memberIndex === -1) {
-      const xIndex = this.memberIndex('x');
-      if (xIndex === -1) {
-        return {
-          $push: {
-            members: {
-              userId: memberId,
-              isAdmin: false,
-              isActive: true,
-            },
-          },
-        };
-      } else {
-        return {
-          $set: {
-            [`members.${xIndex}.userId`]: memberId,
-            [`members.${xIndex}.isActive`]: true,
-            [`members.${xIndex}.isAdmin`]: false,
-          },
-        };
-      }
-    } else {
+    if (memberIndex >= 0) {
       return {
       return {
         $set: {
         $set: {
           [`members.${memberIndex}.isActive`]: true,
           [`members.${memberIndex}.isActive`]: true,
         },
         },
       };
       };
     }
     }
+
+    return {
+      $push: {
+        members: {
+          userId: memberId,
+          isAdmin: false,
+          isActive: true,
+        },
+      },
+    };
   },
   },
 
 
   removeMember(memberId) {
   removeMember(memberId) {
@@ -221,22 +218,20 @@ Boards.mutations({
 
 
     // we do not allow the only one admin to be removed
     // we do not allow the only one admin to be removed
     const allowRemove = (!this.members[memberIndex].isAdmin) || (this.activeAdmins().length > 1);
     const allowRemove = (!this.members[memberIndex].isAdmin) || (this.activeAdmins().length > 1);
-
-    if (allowRemove) {
-      return {
-        $set: {
-          [`members.${memberIndex}.userId`]: 'x',
-          [`members.${memberIndex}.isActive`]: false,
-          [`members.${memberIndex}.isAdmin`]: false,
-        },
-      };
-    } else {
+    if (!allowRemove) {
       return {
       return {
         $set: {
         $set: {
           [`members.${memberIndex}.isActive`]: true,
           [`members.${memberIndex}.isActive`]: true,
         },
         },
       };
       };
     }
     }
+
+    return {
+      $set: {
+        [`members.${memberIndex}.isActive`]: false,
+        [`members.${memberIndex}.isAdmin`]: false,
+      },
+    };
   },
   },
 
 
   setMemberPermission(memberId, isAdmin) {
   setMemberPermission(memberId, isAdmin) {

+ 2 - 6
models/users.js

@@ -12,16 +12,12 @@ if (Meteor.isClient) {
   Users.helpers({
   Users.helpers({
     isBoardMember() {
     isBoardMember() {
       const board = Boards.findOne(Session.get('currentBoard'));
       const board = Boards.findOne(Session.get('currentBoard'));
-      return board &&
-        _.contains(_.pluck(board.members, 'userId'), this._id) &&
-        _.where(board.members, {userId: this._id})[0].isActive;
+      return board && board.hasMember(this._id);
     },
     },
 
 
     isBoardAdmin() {
     isBoardAdmin() {
       const board = Boards.findOne(Session.get('currentBoard'));
       const board = Boards.findOne(Session.get('currentBoard'));
-      return board &&
-        this.isBoardMember(board) &&
-        _.where(board.members, {userId: this._id})[0].isAdmin;
+      return board && board.hasAdmin(this._id);
     },
     },
   });
   });
 }
 }

+ 2 - 3
server/lib/utils.js

@@ -1,8 +1,7 @@
 allowIsBoardAdmin = function(userId, board) {
 allowIsBoardAdmin = function(userId, board) {
-  const admins = _.pluck(_.where(board.members, {isAdmin: true}), 'userId');
-  return _.contains(admins, userId);
+  return board && board.hasAdmin(userId);
 };
 };
 
 
 allowIsBoardMember = function(userId, board) {
 allowIsBoardMember = function(userId, board) {
-  return _.contains(_.pluck(board.members, 'userId'), userId);
+  return board && board.hasMember(userId);
 };
 };

+ 2 - 2
server/publications/boards.js

@@ -16,7 +16,7 @@ Meteor.publish('boards', function() {
   return Boards.find({
   return Boards.find({
     archived: false,
     archived: false,
     $or: [
     $or: [
-      { 'members.userId': this.userId },
+      { members: { $elemMatch: { userId: this.userId, isActive: true }}},
       { _id: { $in: starredBoards } },
       { _id: { $in: starredBoards } },
     ],
     ],
   }, {
   }, {
@@ -66,7 +66,7 @@ Meteor.publishComposite('board', function(boardId) {
         // it.
         // it.
         $or: [
         $or: [
           { permission: 'public' },
           { permission: 'public' },
-          { 'members.userId': this.userId },
+          { members: { $elemMatch: { userId: this.userId, isActive: true }}},
         ],
         ],
       }, { limit: 1 });
       }, { limit: 1 });
     },
     },