userAvatar.js 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. Meteor.subscribe('my-avatars');
  2. Template.userAvatar.helpers({
  3. userData: function() {
  4. return Users.findOne(this.userId, {
  5. fields: {
  6. profile: 1,
  7. username: 1
  8. }
  9. });
  10. },
  11. memberType: function() {
  12. var user = Users.findOne(this.userId);
  13. return user && user.isBoardAdmin() ? 'admin' : 'normal';
  14. },
  15. presenceStatusClassName: function() {
  16. var userPresence = Presences.findOne({ userId: this.userId });
  17. if (! userPresence)
  18. return 'disconnected';
  19. else if (Session.equals('currentBoard', userPresence.state.currentBoardId))
  20. return 'active';
  21. else
  22. return 'idle';
  23. }
  24. });
  25. Template.userAvatar.events({
  26. 'click .js-change-avatar': Popup.open('changeAvatar')
  27. });
  28. Template.userAvatarInitials.helpers({
  29. initials: function() {
  30. var user = Users.findOne(this.userId);
  31. return user && user.getInitials();
  32. },
  33. viewPortWidth: function() {
  34. var user = Users.findOne(this.userId);
  35. return (user && user.getInitials().length || 1) * 12;
  36. }
  37. });
  38. BlazeComponent.extendComponent({
  39. template: function() {
  40. return 'changeAvatarPopup';
  41. },
  42. avatarUrlOptions: function() {
  43. return {
  44. auth: false,
  45. brokenIsFine: true
  46. };
  47. },
  48. uploadedAvatars: function() {
  49. return Avatars.find({userId: Meteor.userId()});
  50. },
  51. isSelected: function() {
  52. var userProfile = Meteor.user().profile;
  53. var avatarUrl = userProfile && userProfile.avatarUrl;
  54. var currentAvatarUrl = this.currentData().url(this.avatarUrlOptions());
  55. return avatarUrl === currentAvatarUrl;
  56. },
  57. noAvatarUrl: function() {
  58. var userProfile = Meteor.user().profile;
  59. var avatarUrl = userProfile && userProfile.avatarUrl;
  60. return ! avatarUrl;
  61. },
  62. setAvatar: function(avatarUrl) {
  63. Meteor.users.update(Meteor.userId(), {
  64. $set: {
  65. 'profile.avatarUrl': avatarUrl
  66. }
  67. });
  68. },
  69. events: function() {
  70. return [{
  71. 'click .js-upload-avatar': function() {
  72. this.$('.js-upload-avatar-input').click();
  73. },
  74. 'change .js-upload-avatar-input': function(evt) {
  75. var self = this;
  76. var file, fileUrl;
  77. FS.Utility.eachFile(evt, function(f) {
  78. file = Avatars.insert(new FS.File(f));
  79. fileUrl = file.url(self.avatarUrlOptions());
  80. });
  81. var fetchAvatarInterval = window.setInterval(function() {
  82. $.ajax({
  83. url: fileUrl,
  84. success: function() {
  85. self.setAvatar(file.url(self.avatarUrlOptions()));
  86. window.clearInterval(fetchAvatarInterval);
  87. }
  88. });
  89. }, 100);
  90. },
  91. 'click .js-select-avatar': function() {
  92. var avatarUrl = this.currentData().url(this.avatarUrlOptions());
  93. this.setAvatar(avatarUrl);
  94. },
  95. 'click .js-select-initials': function() {
  96. this.setAvatar('');
  97. },
  98. 'click .js-delete-avatar': function() {
  99. Avatars.remove(this.currentData()._id);
  100. }
  101. }];
  102. }
  103. }).register('changeAvatarPopup');
  104. Template.cardMembersPopup.helpers({
  105. isCardMember: function() {
  106. var cardId = Template.parentData()._id;
  107. var cardMembers = Cards.findOne(cardId).members || [];
  108. return _.contains(cardMembers, this.userId);
  109. },
  110. user: function() {
  111. return Users.findOne(this.userId);
  112. }
  113. });
  114. Template.cardMembersPopup.events({
  115. 'click .js-select-member': function(evt) {
  116. var cardId = Template.parentData(2).data._id;
  117. var memberId = this.userId;
  118. var operation;
  119. if (Cards.find({ _id: cardId, members: memberId}).count() === 0)
  120. operation = '$addToSet';
  121. else
  122. operation = '$pull';
  123. var query = {};
  124. query[operation] = {
  125. members: memberId
  126. };
  127. Cards.update(cardId, query);
  128. evt.preventDefault();
  129. }
  130. });
  131. Template.cardMemberPopup.helpers({
  132. user: function() {
  133. return Users.findOne(this.userId);
  134. }
  135. });
  136. Template.cardMemberPopup.events({
  137. 'click .js-remove-member': function() {
  138. Cards.update(this.cardId, {$pull: {members: this.userId}});
  139. Popup.close();
  140. },
  141. 'click .js-edit-profile': Popup.open('editProfile')
  142. });