wekan/client/components/users/userAvatar.js
Maxime Quandalle 8cf9ec2660 Allow a user to edit its profile or avatar from a member popover
Fixes the data context on the member popover in the details pane. Also
change the way Popover detect if the click is initiated from a parent
popover -- from reading Blaze context, to looking at the event target
parents.
2015-06-19 14:39:38 +02:00

161 lines
4 KiB
JavaScript

Meteor.subscribe('my-avatars');
Template.userAvatar.helpers({
userData: function() {
return Users.findOne(this.userId, {
fields: {
profile: 1,
username: 1
}
});
},
memberType: function() {
var user = Users.findOne(this.userId);
return user && user.isBoardAdmin() ? 'admin' : 'normal';
},
presenceStatusClassName: function() {
var userPresence = Presences.findOne({ userId: this.userId });
if (! userPresence)
return 'disconnected';
else if (Session.equals('currentBoard', userPresence.state.currentBoardId))
return 'active';
else
return 'idle';
}
});
Template.userAvatar.events({
'click .js-change-avatar': Popup.open('changeAvatar')
});
Template.userAvatarInitials.helpers({
initials: function() {
var user = Users.findOne(this.userId);
return user && user.getInitials();
},
viewPortWidth: function() {
var user = Users.findOne(this.userId);
return (user && user.getInitials().length || 1) * 12;
}
});
BlazeComponent.extendComponent({
template: function() {
return 'changeAvatarPopup';
},
avatarUrlOptions: function() {
return {
auth: false,
brokenIsFine: true
};
},
uploadedAvatars: function() {
return Avatars.find({userId: Meteor.userId()});
},
isSelected: function() {
var userProfile = Meteor.user().profile;
var avatarUrl = userProfile && userProfile.avatarUrl;
var currentAvatarUrl = this.currentData().url(this.avatarUrlOptions());
return avatarUrl === currentAvatarUrl;
},
noAvatarUrl: function() {
var userProfile = Meteor.user().profile;
var avatarUrl = userProfile && userProfile.avatarUrl;
return ! avatarUrl;
},
setAvatar: function(avatarUrl) {
Meteor.users.update(Meteor.userId(), {
$set: {
'profile.avatarUrl': avatarUrl
}
});
},
events: function() {
return [{
'click .js-upload-avatar': function() {
this.$('.js-upload-avatar-input').click();
},
'change .js-upload-avatar-input': function(evt) {
var self = this;
var file, fileUrl;
FS.Utility.eachFile(evt, function(f) {
file = Avatars.insert(new FS.File(f));
fileUrl = file.url(self.avatarUrlOptions());
});
var fetchAvatarInterval = window.setInterval(function() {
$.ajax({
url: fileUrl,
success: function() {
self.setAvatar(file.url(self.avatarUrlOptions()));
window.clearInterval(fetchAvatarInterval);
}
});
}, 100);
},
'click .js-select-avatar': function() {
var avatarUrl = this.currentData().url(this.avatarUrlOptions());
this.setAvatar(avatarUrl);
},
'click .js-select-initials': function() {
this.setAvatar('');
},
'click .js-delete-avatar': function() {
Avatars.remove(this.currentData()._id);
}
}];
}
}).register('changeAvatarPopup');
Template.cardMembersPopup.helpers({
isCardMember: function() {
var cardId = Template.parentData()._id;
var cardMembers = Cards.findOne(cardId).members || [];
return _.contains(cardMembers, this.userId);
},
user: function() {
return Users.findOne(this.userId);
}
});
Template.cardMembersPopup.events({
'click .js-select-member': function(evt) {
var cardId = Template.parentData(2).data._id;
var memberId = this.userId;
var operation;
if (Cards.find({ _id: cardId, members: memberId}).count() === 0)
operation = '$addToSet';
else
operation = '$pull';
var query = {};
query[operation] = {
members: memberId
};
Cards.update(cardId, query);
evt.preventDefault();
}
});
Template.cardMemberPopup.helpers({
user: function() {
return Users.findOne(this.userId);
}
});
Template.cardMemberPopup.events({
'click .js-remove-member': function() {
Cards.update(this.cardId, {$pull: {members: this.userId}});
Popup.close();
},
'click .js-edit-profile': Popup.open('editProfile')
});