bugfix: only care active members, also optimize some code

This commit is contained in:
floatinghotpot 2015-12-08 16:03:31 +08:00
parent b719968df5
commit 672c21bfe0
9 changed files with 62 additions and 78 deletions

View file

@ -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)

View file

@ -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;
})); }));

View file

@ -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;
})); }));

View file

@ -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); const currentBoard = Boards.findOne(Session.get('currentBoard'));
return user.isBoardAdmin(); 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 currentBoard.hasAdmin(this.userId) && (currentBoard.activeAdmins() === 1);
return nbAdmins === 1;
}, },
}); });

View file

@ -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 each currentBoard.activeMembers
if isActive with getUser userId
with getUser userId li(class="{{#if Filter.members.isSelected _id}}active{{/if}}")
li(class="{{#if Filter.members.isSelected _id}}active{{/if}}") a.name.js-toggle-member-filter
a.name.js-toggle-member-filter +userAvatar(userId=this._id)
+userAvatar(userId=this._id) span.sidebar-list-item-description
span.sidebar-list-item-description = profile.fullname
= profile.fullname | (<span class="username">{{ username }}</span>)
| (<span class="username">{{ username }}</span>) if Filter.members.isSelected _id
if Filter.members.isSelected _id i.fa.fa-check
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 each currentBoard.activeMembers
if isActive with getUser userId
with getUser userId li(class="{{#if Filter.members.isSelected _id}}active{{/if}}")
li(class="{{#if Filter.members.isSelected _id}}active{{/if}}") a.name.js-toggle-member-multiselection
a.name.js-toggle-member-multiselection +userAvatar(userId=this._id)
+userAvatar(userId=this._id) span.sidebar-list-item-description
span.sidebar-list-item-description = profile.fullname
= profile.fullname | (<span class="username">{{ username }}</span>)
| (<span class="username">{{ username }}</span>) if allSelectedElementHave 'member' _id
if allSelectedElementHave 'member' _id i.fa.fa-check
i.fa.fa-check else if someSelectedElementHave 'member' _id
else if someSelectedElementHave 'member' _id i.fa.fa-ellipsis-h
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

View file

@ -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) { if (memberIndex >= 0) {
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 {
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) {
if (allowRemove) {
return {
$set: {
[`members.${memberIndex}.userId`]: 'x',
[`members.${memberIndex}.isActive`]: false,
[`members.${memberIndex}.isAdmin`]: false,
},
};
} else {
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) {

View file

@ -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 && return board && board.hasMember(this._id);
_.contains(_.pluck(board.members, 'userId'), this._id) &&
_.where(board.members, {userId: this._id})[0].isActive;
}, },
isBoardAdmin() { isBoardAdmin() {
const board = Boards.findOne(Session.get('currentBoard')); const board = Boards.findOne(Session.get('currentBoard'));
return board && return board && board.hasAdmin(this._id);
this.isBoardMember(board) &&
_.where(board.members, {userId: this._id})[0].isAdmin;
}, },
}); });
} }

View file

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

View file

@ -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 });
}, },