useRangeViewDates.js 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. import { getValue, updateValues } from '../utils/miscUtil';
  2. import { getClosingViewDate, isSameYear, isSameMonth, isSameDecade } from '../utils/dateUtil';
  3. import { watchEffect, computed, ref } from 'vue';
  4. function getStartEndDistance(startDate, endDate, picker, generateConfig) {
  5. const startNext = getClosingViewDate(startDate, picker, generateConfig, 1);
  6. function getDistance(compareFunc) {
  7. if (compareFunc(startDate, endDate)) {
  8. return 'same';
  9. }
  10. if (compareFunc(startNext, endDate)) {
  11. return 'closing';
  12. }
  13. return 'far';
  14. }
  15. switch (picker) {
  16. case 'year':
  17. return getDistance((start, end) => isSameDecade(generateConfig, start, end));
  18. case 'quarter':
  19. case 'month':
  20. return getDistance((start, end) => isSameYear(generateConfig, start, end));
  21. default:
  22. return getDistance((start, end) => isSameMonth(generateConfig, start, end));
  23. }
  24. }
  25. function getRangeViewDate(values, index, picker, generateConfig) {
  26. const startDate = getValue(values, 0);
  27. const endDate = getValue(values, 1);
  28. if (index === 0) {
  29. return startDate;
  30. }
  31. if (startDate && endDate) {
  32. const distance = getStartEndDistance(startDate, endDate, picker, generateConfig);
  33. switch (distance) {
  34. case 'same':
  35. return startDate;
  36. case 'closing':
  37. return startDate;
  38. default:
  39. return getClosingViewDate(endDate, picker, generateConfig, -1);
  40. }
  41. }
  42. return startDate;
  43. }
  44. export default function useRangeViewDates(_ref) {
  45. let {
  46. values,
  47. picker,
  48. defaultDates,
  49. generateConfig
  50. } = _ref;
  51. const defaultViewDates = ref([getValue(defaultDates, 0), getValue(defaultDates, 1)]);
  52. const viewDates = ref(null);
  53. const startDate = computed(() => getValue(values.value, 0));
  54. const endDate = computed(() => getValue(values.value, 1));
  55. const getViewDate = index => {
  56. // If set default view date, use it
  57. if (defaultViewDates.value[index]) {
  58. return defaultViewDates.value[index];
  59. }
  60. return getValue(viewDates.value, index) || getRangeViewDate(values.value, index, picker.value, generateConfig.value) || startDate.value || endDate.value || generateConfig.value.getNow();
  61. };
  62. const startViewDate = ref(null);
  63. const endViewDate = ref(null);
  64. watchEffect(() => {
  65. startViewDate.value = getViewDate(0);
  66. endViewDate.value = getViewDate(1);
  67. });
  68. function setViewDate(viewDate, index) {
  69. if (viewDate) {
  70. let newViewDates = updateValues(viewDates.value, viewDate, index);
  71. // Set view date will clean up default one
  72. // Should always be an array
  73. defaultViewDates.value = updateValues(defaultViewDates.value, null, index) || [null, null];
  74. // Reset another one when not have value
  75. const anotherIndex = (index + 1) % 2;
  76. if (!getValue(values.value, anotherIndex)) {
  77. newViewDates = updateValues(newViewDates, viewDate, anotherIndex);
  78. }
  79. viewDates.value = newViewDates;
  80. } else if (startDate.value || endDate.value) {
  81. // Reset all when has values when `viewDate` is `null` which means from open trigger
  82. viewDates.value = null;
  83. }
  84. }
  85. return [startViewDate, endViewDate, setViewDate];
  86. }