datepicker.js 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. import { ReactiveCache } from '/imports/reactiveCache';
  2. import { TAPi18n } from '/imports/i18n';
  3. import moment from 'moment/min/moment-with-locales';
  4. // Helper function to replace HH with H for 24 hours format, because H allows also single-digit hours
  5. function adjustedTimeFormat() {
  6. return moment
  7. .localeData()
  8. .longDateFormat('LT');
  9. }
  10. // .replace(/HH/i, 'H');
  11. export class DatePicker extends BlazeComponent {
  12. template() {
  13. return 'datepicker';
  14. }
  15. onCreated(defaultTime = '1970-01-01 08:00:00') {
  16. this.error = new ReactiveVar('');
  17. this.card = this.data();
  18. this.date = new ReactiveVar(moment.invalid());
  19. this.defaultTime = defaultTime;
  20. }
  21. startDayOfWeek() {
  22. const currentUser = ReactiveCache.getCurrentUser();
  23. if (currentUser) {
  24. return currentUser.getStartDayOfWeek();
  25. } else {
  26. return 1;
  27. }
  28. }
  29. onRendered() {
  30. // Set initial values for native HTML inputs
  31. if (this.date.get().isValid()) {
  32. const dateInput = this.find('#date');
  33. const timeInput = this.find('#time');
  34. if (dateInput) {
  35. dateInput.value = this.date.get().format('YYYY-MM-DD');
  36. }
  37. if (timeInput && !timeInput.value && this.defaultTime) {
  38. const defaultMoment = moment(this.defaultTime);
  39. timeInput.value = defaultMoment.format('HH:mm');
  40. } else if (timeInput && this.date.get().isValid()) {
  41. timeInput.value = this.date.get().format('HH:mm');
  42. }
  43. }
  44. }
  45. showDate() {
  46. if (this.date.get().isValid()) return this.date.get().format('YYYY-MM-DD');
  47. return '';
  48. }
  49. showTime() {
  50. if (this.date.get().isValid()) return this.date.get().format('HH:mm');
  51. return '';
  52. }
  53. dateFormat() {
  54. return moment.localeData().longDateFormat('L');
  55. }
  56. timeFormat() {
  57. return moment.localeData().longDateFormat('LT');
  58. }
  59. events() {
  60. return [
  61. {
  62. 'change .js-date-field'() {
  63. // Native HTML date input validation
  64. const dateValue = this.find('#date').value;
  65. if (dateValue) {
  66. const dateMoment = moment(dateValue, 'YYYY-MM-DD', true);
  67. if (dateMoment.isValid()) {
  68. this.error.set('');
  69. } else {
  70. this.error.set('invalid-date');
  71. }
  72. }
  73. },
  74. 'change .js-time-field'() {
  75. // Native HTML time input validation
  76. const timeValue = this.find('#time').value;
  77. if (timeValue) {
  78. const timeMoment = moment(timeValue, 'HH:mm', true);
  79. if (timeMoment.isValid()) {
  80. this.error.set('');
  81. } else {
  82. this.error.set('invalid-time');
  83. }
  84. }
  85. },
  86. 'submit .edit-date'(evt) {
  87. evt.preventDefault();
  88. const dateValue = evt.target.date.value;
  89. const timeValue = evt.target.time.value || '12:00'; // Default to 12:00 if no time given
  90. if (!dateValue) {
  91. this.error.set('invalid-date');
  92. evt.target.date.focus();
  93. return;
  94. }
  95. const newCompleteDate = moment(`${dateValue} ${timeValue}`, 'YYYY-MM-DD HH:mm', true);
  96. if (!newCompleteDate.isValid()) {
  97. this.error.set('invalid');
  98. return;
  99. }
  100. this._storeDate(newCompleteDate.toDate());
  101. Popup.back();
  102. },
  103. 'click .js-delete-date'(evt) {
  104. evt.preventDefault();
  105. this._deleteDate();
  106. Popup.back();
  107. },
  108. },
  109. ];
  110. }
  111. }