瀏覽代碼

Add / remove team members as board members when adding / removing team to a board

Emile NDAGIJIMANA 3 年之前
父節點
當前提交
c19723ae27
共有 3 個文件被更改,包括 138 次插入8 次删除
  1. 47 4
      client/components/cards/cardDetails.js
  2. 65 2
      client/components/sidebar/sidebar.js
  3. 26 2
      models/boards.js

+ 47 - 4
client/components/cards/cardDetails.js

@@ -43,6 +43,13 @@ BlazeComponent.extendComponent({
     this.calculateNextPeak();
 
     Meteor.subscribe('unsaved-edits');
+
+    // this.findUsersOptions = new ReactiveVar({});
+    // this.page = new ReactiveVar(1);
+    // this.autorun(() => {
+    //   const limitUsers = this.page.get() * Number.MAX_SAFE_INTEGER;
+    //   this.subscribe('people', this.findUsersOptions.get(), limitUsers, () => {});
+    // });
   },
 
   isWatching() {
@@ -668,7 +675,19 @@ Template.editCardTitleForm.onRendered(function () {
 });
 
 Template.cardMembersPopup.onCreated(function () {
-  const members = Boards.findOne(Session.get('currentBoard')).activeMembers();
+  let currBoard = Boards.findOne(Session.get('currentBoard'));
+  let members = currBoard.activeMembers();
+
+  // let query = {
+  //   "teams.teamId": { $in: currBoard.teams.map(t => t.teamId) },
+  // };
+
+  // let boardTeamUsers = Users.find(query, {
+  //   sort: { sort: 1 },
+  // });
+
+  // members = currBoard.activeMembers2(members, boardTeamUsers);
+
   this.members = new ReactiveVar(members);
 });
 
@@ -686,7 +705,18 @@ Template.cardMembersPopup.helpers({
 });
 
 const filterMembers = (filterTerm) => {
-  let members = Boards.findOne(Session.get('currentBoard')).activeMembers();
+  let currBoard = Boards.findOne(Session.get('currentBoard'));
+  let members = currBoard.activeMembers();
+
+  // let query = {
+  //   "teams.teamId": { $in: currBoard.teams.map(t => t.teamId) },
+  // };
+
+  // let boardTeamUsers = Users.find(query, {
+  //   sort: { sort: 1 },
+  // });
+
+  // members = currBoard.activeMembers2(members, boardTeamUsers);
 
   if (filterTerm) {
     members = members
@@ -695,7 +725,8 @@ const filterMembers = (filterTerm) => {
         user: Users.findOne(member.userId)
       }))
       .filter(({ user }) =>
-        user.profile.fullname.toLowerCase().indexOf(filterTerm.toLowerCase()) !== -1)
+      (user.profile.fullname !== undefined && user.profile.fullname.toLowerCase().indexOf(filterTerm.toLowerCase()) !== -1)
+      || user.profile.fullname === undefined && user.profile.username !== undefined && user.profile.username.toLowerCase().indexOf(filterTerm.toLowerCase()) !== -1)
       .map(({ member }) => member);
   }
   return members;
@@ -1623,7 +1654,19 @@ EscapeActions.register(
 );
 
 Template.cardAssigneesPopup.onCreated(function () {
-  const members = Boards.findOne(Session.get('currentBoard')).activeMembers();
+  let currBoard = Boards.findOne(Session.get('currentBoard'));
+  let members = currBoard.activeMembers();
+
+  // let query = {
+  //   "teams.teamId": { $in: currBoard.teams.map(t => t.teamId) },
+  // };
+
+  // let boardTeamUsers = Users.find(query, {
+  //   sort: { sort: 1 },
+  // });
+
+  // members = currBoard.activeMembers2(members, boardTeamUsers);
+
   this.members = new ReactiveVar(members);
 });
 

+ 65 - 2
client/components/sidebar/sidebar.js

@@ -1392,6 +1392,13 @@ BlazeComponent.extendComponent({
       const limitTeams = this.page.get() * Number.MAX_SAFE_INTEGER;
       this.subscribe('team', this.findOrgsOptions.get(), limitTeams, () => {});
     });
+
+    this.findUsersOptions = new ReactiveVar({});
+    this.userPage = new ReactiveVar(1);
+    this.autorun(() => {
+      const limitUsers = this.userPage.get() * Number.MAX_SAFE_INTEGER;
+      this.subscribe('people', this.findUsersOptions.get(), limitUsers, () => {});
+    });
   },
 
   onRendered() {
@@ -1436,7 +1443,35 @@ BlazeComponent.extendComponent({
             })
 
             if (selectedTeamId != "-1") {
-              Meteor.call('setBoardTeams', boardTeams, currentBoard._id);
+              let members = currentBoard.members;
+
+              let query = {
+                "teams.teamId": { $in: boardTeams.map(t => t.teamId) },
+              };
+
+              const boardTeamUsers = Users.find(query, {
+                sort: { sort: 1 },
+              });
+
+              if(boardTeams !== undefined && boardTeams.length > 0){
+                let index;
+                if(boardTeamUsers && boardTeamUsers.count() > 0){
+                  boardTeamUsers.forEach((u) => {
+                    index = members.findIndex(function(m){ return m.userId == u._id});
+                    if(index == -1){
+                      members.push({
+                        "isActive": true,
+                        "isAdmin": u.isAdmin !== undefined ? u.isAdmin : false,
+                        "isCommentOnly" : false,
+                        "isNoComments" : false,
+                        "userId": u._id,
+                      });
+                    }
+                  });
+                }
+              }
+
+              Meteor.call('setBoardTeams', boardTeams, members, currentBoard._id);
             }
           }
 
@@ -1465,6 +1500,13 @@ BlazeComponent.extendComponent({
       const limitTeams = this.page.get() * Number.MAX_SAFE_INTEGER;
       this.subscribe('team', this.findOrgsOptions.get(), limitTeams, () => {});
     });
+
+    this.findUsersOptions = new ReactiveVar({});
+    this.userPage = new ReactiveVar(1);
+    this.autorun(() => {
+      const limitUsers = this.userPage.get() * Number.MAX_SAFE_INTEGER;
+      this.subscribe('people', this.findUsersOptions.get(), limitUsers, () => {});
+    });
   },
 
   onRendered() {
@@ -1501,7 +1543,28 @@ BlazeComponent.extendComponent({
             }
           }
 
-          Meteor.call('setBoardTeams', boardTeams, currentBoard._id);
+          let members = currentBoard.members;
+          let query = {
+            "teams.teamId": stringTeamId
+          };
+
+          const boardTeamUsers = Users.find(query, {
+            sort: { sort: 1 },
+          });
+
+          if(currentBoard.teams !== undefined && currentBoard.teams.length > 0){
+            let index;
+            if(boardTeamUsers && boardTeamUsers.count() > 0){
+              boardTeamUsers.forEach((u) => {
+                index = members.findIndex(function(m){ return m.userId == u._id});
+                if(index !== -1 && (u.isAdmin === undefined || u.isAdmin == false)){
+                  members.splice(index, 1);
+                }
+              });
+            }
+          }
+
+          Meteor.call('setBoardTeams', boardTeams, members, currentBoard._id);
 
           Popup.close();
         },

+ 26 - 2
models/boards.js

@@ -749,10 +749,32 @@ Boards.helpers({
     return Activities.find({ boardId: this._id }, { sort: { createdAt: -1 } });
   },
 
-  activeMembers() {
+  activeMembers(){
     return _.where(this.members, { isActive: true });
   },
 
+  activeMembers2(members, boardTeamUsers) {
+    let allMembers = members;
+    if(this.teams !== undefined && this.teams.length > 0){
+      let index;
+      if(boardTeamUsers && boardTeamUsers.count() > 0){
+        boardTeamUsers.forEach((u) => {
+          index = allMembers.findIndex(function(m){ return m.userId == u._id});
+          if(index == -1){
+            allMembers.push({
+              "isActive": true,
+              "isAdmin": u.isAdmin !== undefined ? u.isAdmin : false,
+              "isCommentOnly" : false,
+              "isNoComments" : false,
+              "userId": u._id,
+            });
+          }
+        });
+      }
+    }
+
+    return allMembers;
+  },
 
   activeOrgs() {
     return _.where(this.orgs, { isActive: true });
@@ -1567,11 +1589,13 @@ if (Meteor.isServer) {
         },
       });
     },
-    setBoardTeams(boardTeamsArray, currBoardId){
+    setBoardTeams(boardTeamsArray, membersArray, currBoardId){
       check(boardTeamsArray, Array);
+      check(membersArray, Array);
       check(currBoardId, String);
       Boards.update(currBoardId, {
         $set: {
+          members: membersArray,
           teams: boardTeamsArray,
         },
       });