VCalendar.mjs 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. import { resolveDirective as _resolveDirective, createVNode as _createVNode, mergeProps as _mergeProps } from "vue";
  2. // Styles
  3. import "./VCalendar.css";
  4. // Components
  5. import { makeVCalendarDayProps, VCalendarDay } from "./VCalendarDay.mjs";
  6. import { makeVCalendarHeaderProps, VCalendarHeader } from "./VCalendarHeader.mjs";
  7. import { VCalendarMonthDay } from "./VCalendarMonthDay.mjs"; // Composables
  8. import { makeCalendarProps, useCalendar } from "../../composables/calendar.mjs";
  9. import { useDate } from "../../composables/date/date.mjs"; // Utilities
  10. import { computed } from 'vue';
  11. import { chunkArray, genericComponent, propsFactory, useRender } from "../../util/index.mjs";
  12. export const makeVCalendarProps = propsFactory({
  13. hideHeader: Boolean,
  14. hideWeekNumber: Boolean,
  15. ...makeCalendarProps(),
  16. ...makeVCalendarDayProps(),
  17. ...makeVCalendarHeaderProps()
  18. }, 'VCalender');
  19. export const VCalendar = genericComponent()({
  20. name: 'VCalendar',
  21. props: makeVCalendarProps(),
  22. emits: {
  23. next: null,
  24. prev: null,
  25. 'update:modelValue': null
  26. },
  27. setup(props, _ref) {
  28. let {
  29. emit,
  30. slots
  31. } = _ref;
  32. const adapter = useDate();
  33. const {
  34. daysInMonth,
  35. daysInWeek,
  36. genDays,
  37. model,
  38. displayValue,
  39. weekNumbers,
  40. weekDays
  41. } = useCalendar(props);
  42. const dayNames = adapter.getWeekdays();
  43. function onClickNext() {
  44. if (props.viewMode === 'month') {
  45. model.value = [adapter.addMonths(displayValue.value, 1)];
  46. }
  47. if (props.viewMode === 'week') {
  48. model.value = [adapter.addDays(displayValue.value, 7)];
  49. }
  50. if (props.viewMode === 'day') {
  51. model.value = [adapter.addDays(displayValue.value, 1)];
  52. }
  53. }
  54. function onClickPrev() {
  55. if (props.viewMode === 'month') {
  56. model.value = [adapter.addMonths(displayValue.value, -1)];
  57. }
  58. if (props.viewMode === 'week') {
  59. model.value = [adapter.addDays(displayValue.value, -7)];
  60. }
  61. if (props.viewMode === 'day') {
  62. model.value = [adapter.addDays(displayValue.value, -1)];
  63. }
  64. }
  65. function onClickToday() {
  66. model.value = [adapter.date()];
  67. }
  68. const title = computed(() => {
  69. return adapter.format(displayValue.value, 'monthAndYear');
  70. });
  71. useRender(() => {
  72. const calendarDayProps = VCalendarDay.filterProps(props);
  73. const calendarHeaderProps = VCalendarHeader.filterProps(props);
  74. return _createVNode("div", {
  75. "class": ['v-calendar', {
  76. 'v-calendar-monthly': props.viewMode === 'month',
  77. 'v-calendar-weekly': props.viewMode === 'week',
  78. 'v-calendar-day': props.viewMode === 'day'
  79. }]
  80. }, [_createVNode("div", null, [!props.hideHeader && (!slots.header ? _createVNode(VCalendarHeader, _mergeProps({
  81. "key": "calendar-header"
  82. }, calendarHeaderProps, {
  83. "title": title.value,
  84. "onClick:next": onClickNext,
  85. "onClick:prev": onClickPrev,
  86. "onClick:toToday": onClickToday
  87. }), null) : slots.header({
  88. title: title.value
  89. }))]), _createVNode("div", {
  90. "class": ['v-calendar__container', `days__${weekDays.value.length}`]
  91. }, [props.viewMode === 'month' && !props.hideDayHeader && _createVNode("div", {
  92. "class": ['v-calendar-weekly__head', `days__${weekDays.value.length}`, ...(!props.hideWeekNumber ? ['v-calendar-weekly__head-weeknumbers'] : [])],
  93. "key": "calenderWeeklyHead"
  94. }, [!props.hideWeekNumber ? _createVNode("div", {
  95. "key": "weekNumber0",
  96. "class": "v-calendar-weekly__head-weeknumber"
  97. }, null) : '', weekDays.value.map(weekday => _createVNode("div", {
  98. "class": `v-calendar-weekly__head-weekday${!props.hideWeekNumber ? '-with-weeknumber' : ''}`
  99. }, [dayNames[weekday]]))]), props.viewMode === 'month' && _createVNode("div", {
  100. "key": "VCalendarMonth",
  101. "class": ['v-calendar-month__days', `days${!props.hideWeekNumber ? '-with-weeknumbers' : ''}__${weekDays.value.length}`, ...(!props.hideWeekNumber ? ['v-calendar-month__weeknumbers'] : [])]
  102. }, [chunkArray(daysInMonth.value, weekDays.value.length).map((week, wi) => [!props.hideWeekNumber ? _createVNode("div", {
  103. "class": "v-calendar-month__weeknumber"
  104. }, [weekNumbers.value[wi]]) : '', week.map(day => _createVNode(VCalendarMonthDay, {
  105. "color": adapter.isSameDay(adapter.date(), day.date) ? 'primary' : undefined,
  106. "day": day,
  107. "title": day ? adapter.format(day.date, 'dayOfMonth') : 'NaN',
  108. "events": props.events?.filter(e => adapter.isSameDay(day.date, e.start) || adapter.isSameDay(day.date, e.end))
  109. }, {
  110. event: slots.event
  111. }))])]), props.viewMode === 'week' && daysInWeek.value.map((day, i) => _createVNode(VCalendarDay, _mergeProps(calendarDayProps, {
  112. "day": day,
  113. "dayIndex": i,
  114. "events": props.events?.filter(e => adapter.isSameDay(e.start, day.date) || adapter.isSameDay(e.end, day.date))
  115. }), null)), props.viewMode === 'day' && _createVNode(VCalendarDay, _mergeProps(calendarDayProps, {
  116. "day": genDays([displayValue.value], adapter.date())[0],
  117. "dayIndex": 0,
  118. "events": props.events?.filter(e => adapter.isSameDay(e.start, genDays([displayValue.value], adapter.date())[0].date) || adapter.isSameDay(e.end, genDays([displayValue.value], adapter.date())[0].date))
  119. }), null)])]);
  120. });
  121. return {
  122. daysInMonth,
  123. daysInWeek,
  124. genDays
  125. };
  126. }
  127. });
  128. //# sourceMappingURL=VCalendar.mjs.map