datepicker.js 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. import { ReactiveCache } from '/imports/reactiveCache';
  2. import { TAPi18n } from '/imports/i18n';
  3. import {
  4. formatDateTime,
  5. formatDate,
  6. formatTime,
  7. getISOWeek,
  8. isValidDate,
  9. isBefore,
  10. isAfter,
  11. isSame,
  12. add,
  13. subtract,
  14. startOf,
  15. endOf,
  16. format,
  17. parseDate,
  18. now,
  19. createDate,
  20. fromNow,
  21. calendar
  22. } from '/imports/lib/dateUtils';
  23. // Helper function to get time format for 24 hours
  24. function adjustedTimeFormat() {
  25. return 'HH:mm';
  26. }
  27. // .replace(/HH/i, 'H');
  28. export class DatePicker extends BlazeComponent {
  29. template() {
  30. return 'datepicker';
  31. }
  32. onCreated(defaultTime = '1970-01-01 08:00:00') {
  33. this.error = new ReactiveVar('');
  34. this.card = this.data();
  35. this.date = new ReactiveVar(new Date('invalid'));
  36. this.defaultTime = defaultTime;
  37. }
  38. startDayOfWeek() {
  39. const currentUser = ReactiveCache.getCurrentUser();
  40. if (currentUser) {
  41. return currentUser.getStartDayOfWeek();
  42. } else {
  43. return 1;
  44. }
  45. }
  46. onRendered() {
  47. // Set initial values for native HTML inputs
  48. if (isValidDate(this.date.get())) {
  49. const dateInput = this.find('#date');
  50. const timeInput = this.find('#time');
  51. if (dateInput) {
  52. dateInput.value = formatDate(this.date.get());
  53. }
  54. if (timeInput && !timeInput.value && this.defaultTime) {
  55. const defaultDate = new Date(this.defaultTime);
  56. timeInput.value = formatTime(defaultDate);
  57. } else if (timeInput && isValidDate(this.date.get())) {
  58. timeInput.value = formatTime(this.date.get());
  59. }
  60. }
  61. }
  62. showDate() {
  63. if (isValidDate(this.date.get())) return formatDate(this.date.get());
  64. return '';
  65. }
  66. showTime() {
  67. if (isValidDate(this.date.get())) return formatTime(this.date.get());
  68. return '';
  69. }
  70. dateFormat() {
  71. return 'L';
  72. }
  73. timeFormat() {
  74. return 'LT';
  75. }
  76. events() {
  77. return [
  78. {
  79. 'change .js-date-field'() {
  80. // Native HTML date input validation
  81. const dateValue = this.find('#date').value;
  82. if (dateValue) {
  83. const dateObj = new Date(dateValue);
  84. if (isValidDate(dateObj)) {
  85. this.error.set('');
  86. } else {
  87. this.error.set('invalid-date');
  88. }
  89. }
  90. },
  91. 'change .js-time-field'() {
  92. // Native HTML time input validation
  93. const timeValue = this.find('#time').value;
  94. if (timeValue) {
  95. const timeObj = new Date(`1970-01-01T${timeValue}`);
  96. if (isValidDate(timeObj)) {
  97. this.error.set('');
  98. } else {
  99. this.error.set('invalid-time');
  100. }
  101. }
  102. },
  103. 'submit .edit-date'(evt) {
  104. evt.preventDefault();
  105. const dateValue = evt.target.date.value;
  106. const timeValue = evt.target.time.value || '12:00'; // Default to 12:00 if no time given
  107. if (!dateValue) {
  108. this.error.set('invalid-date');
  109. evt.target.date.focus();
  110. return;
  111. }
  112. const newCompleteDate = new Date(`${dateValue}T${timeValue}`);
  113. if (!isValidDate(newCompleteDate)) {
  114. this.error.set('invalid');
  115. return;
  116. }
  117. this._storeDate(newCompleteDate);
  118. Popup.back();
  119. },
  120. 'click .js-delete-date'(evt) {
  121. evt.preventDefault();
  122. this._deleteDate();
  123. Popup.back();
  124. },
  125. },
  126. ];
  127. }
  128. }