cardDate.js 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391
  1. import moment from 'moment/min/moment-with-locales';
  2. import { TAPi18n } from '/imports/i18n';
  3. import { DatePicker } from '/client/lib/datepicker';
  4. // editCardReceivedDatePopup
  5. (class extends DatePicker {
  6. onCreated() {
  7. super.onCreated(moment().format('YYYY-MM-DD HH:mm'));
  8. this.data().getReceived() &&
  9. this.date.set(moment(this.data().getReceived()));
  10. }
  11. _storeDate(date) {
  12. this.card.setReceived(date);
  13. }
  14. _deleteDate() {
  15. this.card.unsetReceived();
  16. }
  17. }.register('editCardReceivedDatePopup'));
  18. // editCardStartDatePopup
  19. (class extends DatePicker {
  20. onCreated() {
  21. super.onCreated(moment().format('YYYY-MM-DD HH:mm'));
  22. this.data().getStart() && this.date.set(moment(this.data().getStart()));
  23. }
  24. onRendered() {
  25. super.onRendered();
  26. if (moment.isDate(this.card.getReceived())) {
  27. this.$('.js-datepicker').datepicker(
  28. 'setStartDate',
  29. this.card.getReceived(),
  30. );
  31. }
  32. }
  33. _storeDate(date) {
  34. this.card.setStart(date);
  35. }
  36. _deleteDate() {
  37. this.card.unsetStart();
  38. }
  39. }.register('editCardStartDatePopup'));
  40. // editCardDueDatePopup
  41. (class extends DatePicker {
  42. onCreated() {
  43. super.onCreated('1970-01-01 17:00:00');
  44. this.data().getDue() && this.date.set(moment(this.data().getDue()));
  45. }
  46. onRendered() {
  47. super.onRendered();
  48. if (moment.isDate(this.card.getStart())) {
  49. this.$('.js-datepicker').datepicker('setStartDate', this.card.getStart());
  50. }
  51. }
  52. _storeDate(date) {
  53. this.card.setDue(date);
  54. }
  55. _deleteDate() {
  56. this.card.unsetDue();
  57. }
  58. }.register('editCardDueDatePopup'));
  59. // editCardEndDatePopup
  60. (class extends DatePicker {
  61. onCreated() {
  62. super.onCreated(moment().format('YYYY-MM-DD HH:mm'));
  63. this.data().getEnd() && this.date.set(moment(this.data().getEnd()));
  64. }
  65. onRendered() {
  66. super.onRendered();
  67. if (moment.isDate(this.card.getStart())) {
  68. this.$('.js-datepicker').datepicker('setStartDate', this.card.getStart());
  69. }
  70. }
  71. _storeDate(date) {
  72. this.card.setEnd(date);
  73. }
  74. _deleteDate() {
  75. this.card.unsetEnd();
  76. }
  77. }.register('editCardEndDatePopup'));
  78. // Display received, start, due & end dates
  79. const CardDate = BlazeComponent.extendComponent({
  80. template() {
  81. return 'dateBadge';
  82. },
  83. onCreated() {
  84. const self = this;
  85. self.date = ReactiveVar();
  86. self.now = ReactiveVar(moment());
  87. window.setInterval(() => {
  88. self.now.set(moment());
  89. }, 60000);
  90. },
  91. showWeek() {
  92. return this.date.get().week().toString();
  93. },
  94. showDate() {
  95. // this will start working once mquandalle:moment
  96. // is updated to at least moment.js 2.10.5
  97. // until then, the date is displayed in the "L" format
  98. return this.date.get().calendar(null, {
  99. sameElse: 'llll',
  100. });
  101. },
  102. showISODate() {
  103. return this.date.get().toISOString();
  104. },
  105. });
  106. class CardReceivedDate extends CardDate {
  107. onCreated() {
  108. super.onCreated();
  109. const self = this;
  110. self.autorun(() => {
  111. self.date.set(moment(self.data().getReceived()));
  112. });
  113. }
  114. classes() {
  115. let classes = 'received-date ';
  116. const dueAt = this.data().getDue();
  117. const endAt = this.data().getEnd();
  118. const startAt = this.data().getStart();
  119. const theDate = this.date.get();
  120. // if dueAt, endAt and startAt exist & are > receivedAt, receivedAt doesn't need to be flagged
  121. if (
  122. (startAt && theDate.isAfter(startAt)) ||
  123. (endAt && theDate.isAfter(endAt)) ||
  124. (dueAt && theDate.isAfter(dueAt))
  125. )
  126. classes += 'long-overdue';
  127. else classes += 'current';
  128. return classes;
  129. }
  130. showTitle() {
  131. return `${TAPi18n.__('card-received-on')} ${this.date
  132. .get()
  133. .format('LLLL')}`;
  134. }
  135. events() {
  136. return super.events().concat({
  137. 'click .js-edit-date': Popup.open('editCardReceivedDate'),
  138. });
  139. }
  140. }
  141. CardReceivedDate.register('cardReceivedDate');
  142. class CardStartDate extends CardDate {
  143. onCreated() {
  144. super.onCreated();
  145. const self = this;
  146. self.autorun(() => {
  147. self.date.set(moment(self.data().getStart()));
  148. });
  149. }
  150. classes() {
  151. let classes = 'start-date' + ' ';
  152. const dueAt = this.data().getDue();
  153. const endAt = this.data().getEnd();
  154. const theDate = this.date.get();
  155. const now = this.now.get();
  156. // if dueAt or endAt exist & are > startAt, startAt doesn't need to be flagged
  157. if ((endAt && theDate.isAfter(endAt)) || (dueAt && theDate.isAfter(dueAt)))
  158. classes += 'long-overdue';
  159. else if (theDate.isAfter(now)) classes += '';
  160. else classes += 'current';
  161. return classes;
  162. }
  163. showTitle() {
  164. return `${TAPi18n.__('card-start-on')} ${this.date.get().format('LLLL')}`;
  165. }
  166. events() {
  167. return super.events().concat({
  168. 'click .js-edit-date': Popup.open('editCardStartDate'),
  169. });
  170. }
  171. }
  172. CardStartDate.register('cardStartDate');
  173. class CardDueDate extends CardDate {
  174. onCreated() {
  175. super.onCreated();
  176. const self = this;
  177. self.autorun(() => {
  178. self.date.set(moment(self.data().getDue()));
  179. });
  180. }
  181. classes() {
  182. let classes = 'due-date' + ' ';
  183. const endAt = this.data().getEnd();
  184. const theDate = this.date.get();
  185. const now = this.now.get();
  186. // if the due date is after the end date, green - done early
  187. if (endAt && theDate.isAfter(endAt)) classes += 'current';
  188. // if there is an end date, don't need to flag the due date
  189. else if (endAt) classes += '';
  190. else if (now.diff(theDate, 'days') >= 2) classes += 'long-overdue';
  191. else if (now.diff(theDate, 'minute') >= 0) classes += 'due';
  192. else if (now.diff(theDate, 'days') >= -1) classes += 'almost-due';
  193. return classes;
  194. }
  195. showTitle() {
  196. return `${TAPi18n.__('card-due-on')} ${this.date.get().format('LLLL')}`;
  197. }
  198. events() {
  199. return super.events().concat({
  200. 'click .js-edit-date': Popup.open('editCardDueDate'),
  201. });
  202. }
  203. }
  204. CardDueDate.register('cardDueDate');
  205. class CardEndDate extends CardDate {
  206. onCreated() {
  207. super.onCreated();
  208. const self = this;
  209. self.autorun(() => {
  210. self.date.set(moment(self.data().getEnd()));
  211. });
  212. }
  213. classes() {
  214. let classes = 'end-date' + ' ';
  215. const dueAt = this.data().getDue();
  216. const theDate = this.date.get();
  217. if (!dueAt) classes += '';
  218. else if (theDate.isBefore(dueAt)) classes += 'current';
  219. else if (theDate.isAfter(dueAt)) classes += 'due';
  220. return classes;
  221. }
  222. showTitle() {
  223. return `${TAPi18n.__('card-end-on')} ${this.date.get().format('LLLL')}`;
  224. }
  225. events() {
  226. return super.events().concat({
  227. 'click .js-edit-date': Popup.open('editCardEndDate'),
  228. });
  229. }
  230. }
  231. CardEndDate.register('cardEndDate');
  232. class CardCustomFieldDate extends CardDate {
  233. template() {
  234. return 'dateCustomField';
  235. }
  236. onCreated() {
  237. super.onCreated();
  238. const self = this;
  239. self.autorun(() => {
  240. self.date.set(moment(self.data().value));
  241. });
  242. }
  243. showWeek() {
  244. return this.date.get().week().toString();
  245. }
  246. showDate() {
  247. // this will start working once mquandalle:moment
  248. // is updated to at least moment.js 2.10.5
  249. // until then, the date is displayed in the "L" format
  250. return this.date.get().calendar(null, {
  251. sameElse: 'llll',
  252. });
  253. }
  254. showTitle() {
  255. return `${this.date.get().format('LLLL')}`;
  256. }
  257. classes() {
  258. return 'customfield-date';
  259. }
  260. events() {
  261. return [];
  262. }
  263. }
  264. CardCustomFieldDate.register('cardCustomFieldDate');
  265. (class extends CardReceivedDate {
  266. showDate() {
  267. return this.date.get().format('L');
  268. }
  269. }.register('minicardReceivedDate'));
  270. (class extends CardStartDate {
  271. showDate() {
  272. return this.date.get().format('L');
  273. }
  274. }.register('minicardStartDate'));
  275. (class extends CardDueDate {
  276. showDate() {
  277. return this.date.get().format('L');
  278. }
  279. }.register('minicardDueDate'));
  280. (class extends CardEndDate {
  281. showDate() {
  282. return this.date.get().format('L');
  283. }
  284. }.register('minicardEndDate'));
  285. (class extends CardCustomFieldDate {
  286. showDate() {
  287. return this.date.get().format('L');
  288. }
  289. }.register('minicardCustomFieldDate'));
  290. class VoteEndDate extends CardDate {
  291. onCreated() {
  292. super.onCreated();
  293. const self = this;
  294. self.autorun(() => {
  295. self.date.set(moment(self.data().getVoteEnd()));
  296. });
  297. }
  298. classes() {
  299. const classes = 'end-date' + ' ';
  300. return classes;
  301. }
  302. showDate() {
  303. return this.date.get().format('L LT');
  304. }
  305. showTitle() {
  306. return `${TAPi18n.__('card-end-on')} ${this.date.get().format('LLLL')}`;
  307. }
  308. events() {
  309. return super.events().concat({
  310. 'click .js-edit-date': Popup.open('editVoteEndDate'),
  311. });
  312. }
  313. }
  314. VoteEndDate.register('voteEndDate');
  315. class PokerEndDate extends CardDate {
  316. onCreated() {
  317. super.onCreated();
  318. const self = this;
  319. self.autorun(() => {
  320. self.date.set(moment(self.data().getPokerEnd()));
  321. });
  322. }
  323. classes() {
  324. const classes = 'end-date' + ' ';
  325. return classes;
  326. }
  327. showDate() {
  328. return this.date.get().format('l LT');
  329. }
  330. showTitle() {
  331. return `${TAPi18n.__('card-end-on')} ${this.date.get().format('LLLL')}`;
  332. }
  333. events() {
  334. return super.events().concat({
  335. 'click .js-edit-date': Popup.open('editPokerEndDate'),
  336. });
  337. }
  338. }
  339. PokerEndDate.register('pokerEndDate');