details.js 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. BlazeComponent.extendComponent({
  2. template: function() {
  3. return 'cardDetails';
  4. },
  5. mixins: function() {
  6. return [Mixins.InfiniteScrolling, Mixins.PerfectScrollbar];
  7. },
  8. calculateNextPeak: function() {
  9. var altitude = this.find('.js-card-details').scrollHeight;
  10. this.callFirstWith(this, 'setNextPeak', altitude);
  11. },
  12. reachNextPeak: function() {
  13. var activitiesComponent = this.componentChildren('activities')[0];
  14. activitiesComponent.loadNextPage();
  15. },
  16. onRendered: function() {
  17. var bodyBoardComponent = this.componentParent();
  18. var additionalMargin = 550;
  19. var $cardDetails = this.$(this.firstNode());
  20. var scollLeft = $cardDetails.offset().left + additionalMargin;
  21. bodyBoardComponent.scrollLeft(scollLeft);
  22. },
  23. onDestroyed: function() {
  24. this.componentParent().showOverlay.set(false);
  25. },
  26. updateCard: function(modifier) {
  27. Cards.update(this.data()._id, {
  28. $set: modifier
  29. });
  30. },
  31. onCreated: function() {
  32. this.isLoaded = new ReactiveVar(false);
  33. },
  34. events: function() {
  35. // XXX We can't define this event directly in the event map below because we
  36. // miss ES6 object keys interpolation.
  37. var events = {};
  38. events[CSSEvents.animationend + ' .js-card-details'] = function() {
  39. this.isLoaded.set(true);
  40. };
  41. return [_.extend(events, {
  42. 'click .js-close-card-details': function() {
  43. Utils.goBoardId(this.data().boardId);
  44. },
  45. 'click .js-move-card': Popup.open('moveCard'),
  46. 'click .js-open-card-details-menu': Popup.open('cardDetailsActions'),
  47. 'submit .js-card-description': function(evt) {
  48. evt.preventDefault();
  49. var description = this.currentComponent().getValue();
  50. this.updateCard({ description: description });
  51. },
  52. 'submit .js-card-details-title': function(evt) {
  53. evt.preventDefault();
  54. var title = this.currentComponent().getValue();
  55. if ($.trim(title)) {
  56. this.updateCard({ title: title });
  57. }
  58. },
  59. 'click .js-member': Popup.open('cardMember'),
  60. 'click .js-add-members': Popup.open('cardMembers'),
  61. 'click .js-add-labels': Popup.open('cardLabels'),
  62. 'mouseenter .js-card-details': function() {
  63. this.componentParent().showOverlay.set(true);
  64. }
  65. })];
  66. }
  67. }).register('cardDetails');
  68. Template.cardDetailsActionsPopup.events({
  69. 'click .js-members': Popup.open('cardMembers'),
  70. 'click .js-labels': Popup.open('cardLabels'),
  71. 'click .js-attachments': Popup.open('cardAttachments'),
  72. // 'click .js-copy': Popup.open(),
  73. 'click .js-archive': function(evt) {
  74. evt.preventDefault();
  75. Cards.update(this._id, {
  76. $set: {
  77. archived: true
  78. }
  79. });
  80. Popup.close();
  81. },
  82. 'click .js-more': Popup.open('cardMore')
  83. });
  84. Template.moveCardPopup.events({
  85. 'click .js-select-list': function() {
  86. // XXX We should *not* get the currentCard from the global state, but
  87. // instead from a “component” state.
  88. var cardId = Session.get('currentCard');
  89. var newListId = this._id;
  90. Cards.update(cardId, {
  91. $set: {
  92. listId: newListId
  93. }
  94. });
  95. Popup.close();
  96. }
  97. });
  98. Template.cardMorePopup.events({
  99. 'click .js-delete': Popup.afterConfirm('cardDelete', function() {
  100. Popup.close();
  101. Cards.remove(this._id);
  102. Utils.goBoardId(this.board()._id);
  103. })
  104. });
  105. // Close the card details pane by pressing escape
  106. EscapeActions.register('detailsPane',
  107. function() { Utils.goBoardId(Session.get('currentBoard')); },
  108. function() { return ! Session.equals('currentCard', null); }, {
  109. noClickEscapeOn: '.js-card-details'
  110. }
  111. );