add: invite user via email, invited user can accept or decline, allow member to quit

This commit is contained in:
floatinghotpot 2015-12-07 11:15:57 +08:00
parent d4c5310d65
commit 011f53ad08
11 changed files with 367 additions and 61 deletions

View file

@ -117,6 +117,9 @@ Template.memberPopup.helpers({
const type = Users.findOne(this.userId).isBoardAdmin() ? 'admin' : 'normal';
return TAPi18n.__(type).toLowerCase();
},
isInvited() {
return Users.findOne(this.userId).isInvitedTo(Session.get('currentBoard'));
},
});
Template.memberPopup.events({
@ -132,8 +135,13 @@ Template.memberPopup.events({
Popup.close();
}),
'click .js-leave-member'() {
// XXX Not implemented
Popup.close();
const currentBoard = Boards.findOne(Session.get('currentBoard'));
Meteor.call('quitBoard', currentBoard, (err, ret) => {
if (!ret && ret) {
Popup.close();
FlowRouter.go('home');
}
});
},
});
@ -146,9 +154,29 @@ Template.removeMemberPopup.helpers({
},
});
Template.membersWidget.helpers({
isInvited() {
const user = Meteor.user();
return user && user.isInvitedTo(Session.get('currentBoard'));
},
});
Template.membersWidget.events({
'click .js-member': Popup.open('member'),
'click .js-manage-board-members': Popup.open('addMember'),
'click .js-member-invite-accept'() {
const boardId = Session.get('currentBoard');
Meteor.user().removeInvite(boardId);
},
'click .js-member-invite-decline'() {
const boardId = Session.get('currentBoard');
Meteor.call('quitBoard', boardId, (err, ret) => {
if (!err && ret) {
Meteor.user().removeInvite(boardId);
FlowRouter.go('home');
}
});
},
});
Template.labelsWidget.events({
@ -194,25 +222,76 @@ function draggableMembersLabelsWidgets() {
Template.membersWidget.onRendered(draggableMembersLabelsWidgets);
Template.labelsWidget.onRendered(draggableMembersLabelsWidgets);
Template.addMemberPopup.helpers({
BlazeComponent.extendComponent({
template() {
return 'addMemberPopup';
},
onCreated() {
this.error = new ReactiveVar('');
this.loading = new ReactiveVar(false);
},
onRendered() {
this.find('.js-search-member input').focus();
this.setLoading(false);
},
isBoardMember() {
const user = Users.findOne(this._id);
const userId = this.currentData()._id;
const user = Users.findOne(userId);
return user && user.isBoardMember();
},
});
Template.addMemberPopup.events({
'click .js-select-member'() {
const userId = this._id;
const currentBoard = Boards.findOne(Session.get('currentBoard'));
currentBoard.addMember(userId);
Popup.close();
isValidEmail(email) {
return SimpleSchema.RegEx.Email.test(email);
},
});
Template.addMemberPopup.onRendered(function() {
this.find('.js-search-member input').focus();
});
setError(error) {
this.error.set(error);
},
setLoading(w) {
this.loading.set(w);
},
isLoading() {
return this.loading.get();
},
inviteUser(idNameEmail) {
const boardId = Session.get('currentBoard');
this.setLoading(true);
const self = this;
Meteor.call('inviteUserToBoard', idNameEmail, boardId, (err, ret) => {
self.setLoading(false);
if (err) self.setError(err.error);
else if (ret.email) self.setError('email-sent');
else Popup.close();
});
},
events() {
return [{
'keyup input'() {
this.setError('');
},
'click .js-select-member'() {
const userId = this.currentData()._id;
const currentBoard = Boards.findOne(Session.get('currentBoard'));
if (currentBoard.memberIndex(userId)<0) {
this.inviteUser(userId);
}
},
'click .js-email-invite'() {
const idNameEmail = $('.js-search-member input').val();
if (idNameEmail.indexOf('@')<0 || this.isValidEmail(idNameEmail)) {
this.inviteUser(idNameEmail);
} else this.setError('email-invalid');
},
}];
},
}).register('addMemberPopup');
Template.changePermissionsPopup.events({
'click .js-set-admin, click .js-set-normal'(event) {