cardDate.js 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. // Edit start & due dates
  2. Template.dateBadge.helpers({
  3. canModifyCard() {
  4. return Meteor.user() && Meteor.user().isBoardMember() && !Meteor.user().isCommentOnly();
  5. },
  6. });
  7. // editCardStartDatePopup
  8. (class extends DatePicker {
  9. onCreated() {
  10. super.onCreated();
  11. this.data().startAt && this.date.set(moment(this.data().startAt));
  12. }
  13. _storeDate(date) {
  14. this.card.setStart(date);
  15. }
  16. _deleteDate() {
  17. this.card.unsetStart();
  18. }
  19. }).register('editCardStartDatePopup');
  20. // editCardDueDatePopup
  21. (class extends DatePicker {
  22. onCreated() {
  23. super.onCreated();
  24. this.data().dueAt && this.date.set(moment(this.data().dueAt));
  25. }
  26. onRendered() {
  27. super.onRendered();
  28. if (moment.isDate(this.card.startAt)) {
  29. this.$('.js-datepicker').datepicker('setStartDate', this.card.startAt);
  30. }
  31. }
  32. _storeDate(date) {
  33. this.card.setDue(date);
  34. }
  35. _deleteDate() {
  36. this.card.unsetDue();
  37. }
  38. }).register('editCardDueDatePopup');
  39. // Display start & due dates
  40. const CardDate = BlazeComponent.extendComponent({
  41. template() {
  42. return 'dateBadge';
  43. },
  44. onCreated() {
  45. const self = this;
  46. self.date = ReactiveVar();
  47. self.now = ReactiveVar(moment());
  48. window.setInterval(() => {
  49. self.now.set(moment());
  50. }, 60000);
  51. },
  52. showDate() {
  53. // this will start working once mquandalle:moment
  54. // is updated to at least moment.js 2.10.5
  55. // until then, the date is displayed in the "L" format
  56. return this.date.get().calendar(null, {
  57. sameElse: 'llll',
  58. });
  59. },
  60. showISODate() {
  61. return this.date.get().toISOString();
  62. },
  63. });
  64. class CardStartDate extends CardDate {
  65. onCreated() {
  66. super.onCreated();
  67. const self = this;
  68. self.autorun(() => {
  69. self.date.set(moment(self.data().startAt));
  70. });
  71. }
  72. classes() {
  73. if (this.date.get().isBefore(this.now.get(), 'minute') &&
  74. this.now.get().isBefore(this.data().dueAt)) {
  75. return 'current';
  76. }
  77. return '';
  78. }
  79. showTitle() {
  80. return `${TAPi18n.__('card-start-on')} ${this.date.get().format('LLLL')}`;
  81. }
  82. events() {
  83. return super.events().concat({
  84. 'click .js-edit-date': Popup.open('editCardStartDate'),
  85. });
  86. }
  87. }
  88. CardStartDate.register('cardStartDate');
  89. class CardDueDate extends CardDate {
  90. onCreated() {
  91. super.onCreated();
  92. const self = this;
  93. self.autorun(() => {
  94. self.date.set(moment(self.data().dueAt));
  95. });
  96. }
  97. classes() {
  98. if (this.now.get().diff(this.date.get(), 'days') >= 2)
  99. return 'long-overdue';
  100. else if (this.now.get().diff(this.date.get(), 'minute') >= 0)
  101. return 'due';
  102. else if (this.now.get().diff(this.date.get(), 'days') >= -1)
  103. return 'almost-due';
  104. return '';
  105. }
  106. showTitle() {
  107. return `${TAPi18n.__('card-due-on')} ${this.date.get().format('LLLL')}`;
  108. }
  109. events() {
  110. return super.events().concat({
  111. 'click .js-edit-date': Popup.open('editCardDueDate'),
  112. });
  113. }
  114. }
  115. CardDueDate.register('cardDueDate');
  116. (class extends CardStartDate {
  117. showDate() {
  118. return this.date.get().format('l');
  119. }
  120. }).register('minicardStartDate');
  121. (class extends CardDueDate {
  122. showDate() {
  123. return this.date.get().format('l');
  124. }
  125. }).register('minicardDueDate');