datepicker.js 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. DatePicker = BlazeComponent.extendComponent({
  2. template() {
  3. return 'datepicker';
  4. },
  5. onCreated(defaultTime = '1970-01-01 08:00:00') {
  6. this.error = new ReactiveVar('');
  7. this.card = this.data();
  8. this.date = new ReactiveVar(moment.invalid());
  9. this.defaultTime = defaultTime;
  10. },
  11. onRendered() {
  12. const $picker = this.$('.js-datepicker')
  13. .datepicker({
  14. todayHighlight: true,
  15. todayBtn: 'linked',
  16. language: TAPi18n.getLanguage(),
  17. })
  18. .on(
  19. 'changeDate',
  20. function(evt) {
  21. this.find('#date').value = moment(evt.date).format('L');
  22. this.error.set('');
  23. const timeInput = this.find('#time');
  24. timeInput.focus();
  25. if (!timeInput.value) {
  26. const currentHour = evt.date.getHours();
  27. const defaultMoment = moment(
  28. currentHour > 0 ? evt.date : this.defaultTime,
  29. ); // default to 8:00 am local time
  30. timeInput.value = defaultMoment.format('LT');
  31. }
  32. }.bind(this),
  33. );
  34. if (this.date.get().isValid()) {
  35. $picker.datepicker('update', this.date.get().toDate());
  36. }
  37. },
  38. showDate() {
  39. if (this.date.get().isValid()) return this.date.get().format('L');
  40. return '';
  41. },
  42. showTime() {
  43. if (this.date.get().isValid()) return this.date.get().format('LT');
  44. return '';
  45. },
  46. dateFormat() {
  47. return moment.localeData().longDateFormat('L');
  48. },
  49. timeFormat() {
  50. return moment.localeData().longDateFormat('LT');
  51. },
  52. events() {
  53. return [
  54. {
  55. 'keyup .js-date-field'() {
  56. // parse for localized date format in strict mode
  57. const dateMoment = moment(this.find('#date').value, 'L', true);
  58. if (dateMoment.isValid()) {
  59. this.error.set('');
  60. this.$('.js-datepicker').datepicker('update', dateMoment.toDate());
  61. }
  62. },
  63. 'keyup .js-time-field'() {
  64. // parse for localized time format in strict mode
  65. const dateMoment = moment(this.find('#time').value, 'LT', true);
  66. if (dateMoment.isValid()) {
  67. this.error.set('');
  68. }
  69. },
  70. 'submit .edit-date'(evt) {
  71. evt.preventDefault();
  72. // if no time was given, init with 12:00
  73. const time =
  74. evt.target.time.value ||
  75. moment(new Date().setHours(12, 0, 0)).format('LT');
  76. const dateString = `${evt.target.date.value} ${time}`;
  77. const newDate = moment(dateString, 'L LT', true);
  78. if (newDate.isValid()) {
  79. this._storeDate(newDate.toDate());
  80. Popup.close();
  81. } else {
  82. this.error.set('invalid-date');
  83. evt.target.date.focus();
  84. }
  85. },
  86. 'click .js-delete-date'(evt) {
  87. evt.preventDefault();
  88. this._deleteDate();
  89. Popup.close();
  90. },
  91. },
  92. ];
  93. },
  94. });