cardDate.js 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. // Edit start & due dates
  2. const EditCardDate = BlazeComponent.extendComponent({
  3. template() {
  4. return 'editCardDate';
  5. },
  6. onCreated() {
  7. this.error = new ReactiveVar('');
  8. this.card = this.data();
  9. this.date = new ReactiveVar(moment.invalid());
  10. },
  11. onRendered() {
  12. let $picker = this.$('.js-datepicker').datepicker({
  13. todayHighlight: true,
  14. todayBtn: 'linked',
  15. language: TAPi18n.getLanguage()
  16. }).on('changeDate', function(e) {
  17. const localDate = moment(e.date).format('L');
  18. date.value = localDate;
  19. this.error.set('');
  20. time.focus();
  21. }.bind(this));
  22. if (this.date.get().isValid()) {
  23. $picker.datepicker('update', this.date.get().toDate());
  24. }
  25. },
  26. showDate() {
  27. if (this.date.get().isValid())
  28. return this.date.get().format('L');
  29. },
  30. showTime() {
  31. if (this.date.get().isValid())
  32. return this.date.get().format('LT');
  33. },
  34. dateFormat() {
  35. return moment.localeData().longDateFormat('L');
  36. },
  37. timeFormat() {
  38. return moment.localeData().longDateFormat('LT');
  39. },
  40. events() {
  41. return [{
  42. 'keyup .js-date-field'(evt) {
  43. // parse for localized date format in strict mode
  44. const dateMoment = moment(date.value, 'L', true);
  45. if (dateMoment.isValid()) {
  46. this.error.set('');
  47. this.$('.js-datepicker').datepicker('update', dateMoment.toDate());
  48. }
  49. },
  50. 'keyup .js-time-field'(evt) {
  51. // parse for localized time format in strict mode
  52. const dateMoment = moment(time.value, 'LT', true);
  53. if (dateMoment.isValid()) {
  54. this.error.set('');
  55. }
  56. },
  57. 'submit .edit-date'(evt) {
  58. evt.preventDefault();
  59. // if no time was given, init with 12:00
  60. var time = evt.target.time.value || moment(new Date().setHours(12,0,0)).format('LT');
  61. const dateString = evt.target.date.value + ' ' + time;
  62. const newDate = moment.utc(dateString, 'L LT', true);
  63. if (newDate.isValid()) {
  64. this._storeDate(newDate.toDate());
  65. Popup.close();
  66. }
  67. else {
  68. this.error.set('invalid-date');
  69. evt.target.date.focus();
  70. }
  71. },
  72. 'click .js-delete-date'(evt) {
  73. evt.preventDefault();
  74. this._deleteDate();
  75. Popup.close();
  76. },
  77. }];
  78. },
  79. });
  80. // editCardStartDatePopup
  81. (class extends EditCardDate {
  82. onCreated() {
  83. super();
  84. if (this.data().startAt) {
  85. this.date.set(moment.utc(this.data().startAt));
  86. }
  87. }
  88. _storeDate(date) {
  89. this.card.setStart(date);
  90. }
  91. _deleteDate() {
  92. this.card.unsetStart();
  93. }
  94. }).register('editCardStartDatePopup');
  95. // editCardDueDatePopup
  96. (class extends EditCardDate {
  97. onCreated() {
  98. super();
  99. if (this.data().dueAt !== undefined) {
  100. this.date.set(moment.utc(this.data().dueAt));
  101. }
  102. }
  103. onRendered() {
  104. super();
  105. if (moment.isDate(this.card.startAt)) {
  106. this.$('.js-datepicker').datepicker('setStartDate', this.card.startAt);
  107. }
  108. }
  109. _storeDate(date) {
  110. this.card.setDue(date);
  111. }
  112. _deleteDate() {
  113. this.card.unsetDue();
  114. }
  115. }).register('editCardDueDatePopup');
  116. // Display start & due dates
  117. const CardDate = BlazeComponent.extendComponent({
  118. template() {
  119. return 'dateBadge';
  120. },
  121. onCreated() {
  122. this.date = ReactiveVar();
  123. },
  124. showDate() {
  125. // this will start working once mquandalle:moment
  126. // is updated to at least moment.js 2.10.5
  127. // until then, the date is displayed in the "L" format
  128. return this.date.get().calendar(null, {
  129. sameElse: 'llll'
  130. });
  131. },
  132. showTitle() {
  133. return this.date.get().format('LLLL');
  134. },
  135. showISODate() {
  136. return this.date.get().toISOString();
  137. },
  138. });
  139. class CardStartDate extends CardDate {
  140. onCreated() {
  141. super();
  142. let self = this;
  143. this.autorun(() => {
  144. self.date.set(moment.utc(this.data().startAt));
  145. });
  146. }
  147. events() {
  148. return super.events().concat({
  149. 'click .js-edit-date': Popup.open('editCardStartDate'),
  150. });
  151. }
  152. }
  153. CardStartDate.register('cardStartDate');
  154. class CardDueDate extends CardDate {
  155. onCreated() {
  156. super();
  157. let self = this;
  158. this.autorun(() => {
  159. self.date.set(moment.utc(this.data().dueAt));
  160. });
  161. }
  162. events() {
  163. return super.events().concat({
  164. 'click .js-edit-date': Popup.open('editCardDueDate'),
  165. });
  166. }
  167. }
  168. CardDueDate.register('cardDueDate');
  169. (class extends CardStartDate {
  170. showDate() {
  171. return this.date.get().format('l');
  172. }
  173. }).register('minicardStartDate');
  174. (class extends CardDueDate {
  175. showDate() {
  176. return this.date.get().format('l');
  177. }
  178. }).register('minicardDueDate');