bge-ui 1.3.4 → 1.3.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (135) hide show
  1. package/dist/datePicker/components/ActionRow.vue.d.ts +1051 -0
  2. package/dist/datePicker/components/Common/ArrowBtn.vue.d.ts +29 -0
  3. package/dist/datePicker/components/Common/InstanceWrap.vue.d.ts +29 -0
  4. package/dist/datePicker/components/Common/SelectionOverlay.vue.d.ts +55 -0
  5. package/dist/datePicker/components/DatePicker/DatePicker.vue.d.ts +1114 -0
  6. package/dist/datePicker/components/DatePicker/DpCalendar.vue.d.ts +1085 -0
  7. package/dist/datePicker/components/DatePicker/DpHeader.vue.d.ts +1103 -0
  8. package/dist/datePicker/components/DatePicker/date-picker.d.ts +35 -0
  9. package/dist/datePicker/components/DatepickerInput.vue.d.ts +1008 -0
  10. package/dist/datePicker/components/DatepickerMenu.vue.d.ts +1061 -0
  11. package/dist/datePicker/components/Icons/CalendarIcon.d.ts +9 -0
  12. package/dist/datePicker/components/Icons/CancelIcon.d.ts +9 -0
  13. package/dist/datePicker/components/Icons/ChevronDownIcon.d.ts +9 -0
  14. package/dist/datePicker/components/Icons/ChevronLeftIcon.d.ts +9 -0
  15. package/dist/datePicker/components/Icons/ChevronRightIcon.d.ts +9 -0
  16. package/dist/datePicker/components/Icons/ChevronUpIcon.d.ts +9 -0
  17. package/dist/datePicker/components/Icons/ClockIcon.d.ts +9 -0
  18. package/dist/datePicker/components/Icons/index.d.ts +7 -0
  19. package/dist/datePicker/components/MonthPicker/MonthPicker.vue.d.ts +1071 -0
  20. package/dist/datePicker/components/MonthPicker/month-picker.d.ts +34 -0
  21. package/dist/datePicker/components/QuarterPicker/QuarterPicker.vue.d.ts +1043 -0
  22. package/dist/datePicker/components/QuarterPicker/quarter-picker.d.ts +25 -0
  23. package/dist/datePicker/components/TimePicker/TimeInput.vue.d.ts +1116 -0
  24. package/dist/datePicker/components/TimePicker/TimePicker.vue.d.ts +1087 -0
  25. package/dist/datePicker/components/TimePicker/TimePickerSolo.vue.d.ts +1036 -0
  26. package/dist/datePicker/components/TimePicker/time-picker-utils.d.ts +15 -0
  27. package/dist/datePicker/components/TimePicker/time-picker.d.ts +13 -0
  28. package/dist/datePicker/components/YearPicker/YearPicker.vue.d.ts +1040 -0
  29. package/dist/datePicker/components/YearPicker/year-picker.d.ts +9 -0
  30. package/dist/datePicker/components/shared/YearModePicker.vue.d.ts +1075 -0
  31. package/dist/datePicker/components/shared/month-quarter-picker.d.ts +29 -0
  32. package/dist/datePicker/composables/arrow-navigate.d.ts +26 -0
  33. package/dist/datePicker/composables/calendar-class.d.ts +8 -0
  34. package/dist/datePicker/composables/common.d.ts +6 -0
  35. package/dist/datePicker/composables/defaults.d.ts +37 -0
  36. package/dist/datePicker/composables/external-internal-mapper.d.ts +14 -0
  37. package/dist/datePicker/composables/flow.d.ts +10 -0
  38. package/dist/datePicker/composables/index.d.ts +14 -0
  39. package/dist/datePicker/composables/model.d.ts +17 -0
  40. package/dist/datePicker/composables/month-year.d.ts +10 -0
  41. package/dist/datePicker/composables/position.d.ts +25 -0
  42. package/dist/datePicker/composables/shared.d.ts +12 -0
  43. package/dist/datePicker/composables/slots.d.ts +10 -0
  44. package/dist/datePicker/composables/state.d.ts +8 -0
  45. package/dist/datePicker/composables/transition.d.ts +7 -0
  46. package/dist/datePicker/composables/validation.d.ts +12 -0
  47. package/dist/datePicker/constants/index.d.ts +43 -0
  48. package/dist/datePicker/datePicker.vue.d.ts +1006 -0
  49. package/dist/datePicker/directives/clickOutside.d.ts +2 -0
  50. package/dist/datePicker/index.vue.d.ts +1012 -0
  51. package/dist/datePicker/interfaces.d.ts +323 -0
  52. package/dist/datePicker/props.d.ts +865 -0
  53. package/dist/datePicker/utils/date-utils.d.ts +45 -0
  54. package/dist/datePicker/utils/defaults.d.ts +42 -0
  55. package/dist/datePicker/utils/timezone.d.ts +8 -0
  56. package/dist/datePicker/utils/type-guard.d.ts +1 -0
  57. package/dist/datePicker/utils/util.d.ts +57 -0
  58. package/dist/dialog/index.vue.d.ts +6 -3
  59. package/dist/index.d.ts +2 -1
  60. package/dist/index.js +13008 -1250
  61. package/dist/style.css +1188 -1
  62. package/dist/tooltip/index.vue.d.ts +2 -2
  63. package/dist/tooltip/usePopper.d.ts +5 -5
  64. package/package.json +3 -2
  65. package/src/datePicker/components/ActionRow.vue +216 -0
  66. package/src/datePicker/components/Common/ArrowBtn.vue +42 -0
  67. package/src/datePicker/components/Common/InstanceWrap.vue +28 -0
  68. package/src/datePicker/components/Common/SelectionOverlay.vue +320 -0
  69. package/src/datePicker/components/DatePicker/DatePicker.vue +302 -0
  70. package/src/datePicker/components/DatePicker/DpCalendar.vue +405 -0
  71. package/src/datePicker/components/DatePicker/DpHeader.vue +332 -0
  72. package/src/datePicker/components/DatePicker/date-picker.ts +674 -0
  73. package/src/datePicker/components/DatepickerInput.vue +334 -0
  74. package/src/datePicker/components/DatepickerMenu.vue +424 -0
  75. package/src/datePicker/components/Icons/CalendarIcon.ts +40 -0
  76. package/src/datePicker/components/Icons/CancelIcon.ts +32 -0
  77. package/src/datePicker/components/Icons/ChevronDownIcon.ts +29 -0
  78. package/src/datePicker/components/Icons/ChevronLeftIcon.ts +29 -0
  79. package/src/datePicker/components/Icons/ChevronRightIcon.ts +29 -0
  80. package/src/datePicker/components/Icons/ChevronUpIcon.ts +29 -0
  81. package/src/datePicker/components/Icons/ClockIcon.ts +32 -0
  82. package/src/datePicker/components/Icons/index.ts +8 -0
  83. package/src/datePicker/components/MonthPicker/MonthPicker.vue +130 -0
  84. package/src/datePicker/components/MonthPicker/month-picker.ts +232 -0
  85. package/src/datePicker/components/QuarterPicker/QuarterPicker.vue +111 -0
  86. package/src/datePicker/components/QuarterPicker/quarter-picker.ts +153 -0
  87. package/src/datePicker/components/TimePicker/TimeInput.vue +477 -0
  88. package/src/datePicker/components/TimePicker/TimePicker.vue +265 -0
  89. package/src/datePicker/components/TimePicker/TimePickerSolo.vue +79 -0
  90. package/src/datePicker/components/TimePicker/time-picker-utils.ts +179 -0
  91. package/src/datePicker/components/TimePicker/time-picker.ts +112 -0
  92. package/src/datePicker/components/YearPicker/YearPicker.vue +70 -0
  93. package/src/datePicker/components/YearPicker/year-picker.ts +109 -0
  94. package/src/datePicker/components/shared/YearModePicker.vue +105 -0
  95. package/src/datePicker/components/shared/month-quarter-picker.ts +199 -0
  96. package/src/datePicker/composables/arrow-navigate.ts +191 -0
  97. package/src/datePicker/composables/calendar-class.ts +383 -0
  98. package/src/datePicker/composables/common.ts +25 -0
  99. package/src/datePicker/composables/defaults.ts +123 -0
  100. package/src/datePicker/composables/external-internal-mapper.ts +442 -0
  101. package/src/datePicker/composables/flow.ts +70 -0
  102. package/src/datePicker/composables/index.ts +14 -0
  103. package/src/datePicker/composables/model.ts +89 -0
  104. package/src/datePicker/composables/month-year.ts +72 -0
  105. package/src/datePicker/composables/position.ts +297 -0
  106. package/src/datePicker/composables/shared.ts +98 -0
  107. package/src/datePicker/composables/slots.ts +84 -0
  108. package/src/datePicker/composables/state.ts +25 -0
  109. package/src/datePicker/composables/transition.ts +18 -0
  110. package/src/datePicker/composables/validation.ts +312 -0
  111. package/src/datePicker/constants/index.ts +49 -0
  112. package/src/datePicker/datePicker.vue +554 -0
  113. package/src/datePicker/directives/clickOutside.ts +79 -0
  114. package/src/datePicker/index.vue +158 -0
  115. package/src/datePicker/interfaces.ts +404 -0
  116. package/src/datePicker/props.ts +173 -0
  117. package/src/datePicker/style/components/_ActionRow.scss +73 -0
  118. package/src/datePicker/style/components/_Calendar.scss +284 -0
  119. package/src/datePicker/style/components/_DatepickerInput.scss +109 -0
  120. package/src/datePicker/style/components/_DatepickerMenu.scss +213 -0
  121. package/src/datePicker/style/components/_MonthYearInput.scss +97 -0
  122. package/src/datePicker/style/components/_QuarterPicker.scss +53 -0
  123. package/src/datePicker/style/components/_SelectionOverlay.scss +142 -0
  124. package/src/datePicker/style/components/_TimeInput.scss +181 -0
  125. package/src/datePicker/style/components/_shared.scss +15 -0
  126. package/src/datePicker/style/main.scss +259 -0
  127. package/src/datePicker/utils/date-utils.ts +440 -0
  128. package/src/datePicker/utils/defaults.ts +327 -0
  129. package/src/datePicker/utils/timezone.ts +38 -0
  130. package/src/datePicker/utils/type-guard.ts +3 -0
  131. package/src/datePicker/utils/util.ts +322 -0
  132. package/src/dialog/index.vue +9 -0
  133. package/src/form/index.vue +2 -1
  134. package/src/index.ts +6 -2
  135. package/src/slider/index.vue +1 -1
@@ -0,0 +1,130 @@
1
+ <template>
2
+ <InstanceWrap v-slot="{ instance }" :multi-calendars="defaultedMultiCalendars.count" :collapse="collapse" stretch>
3
+ <slot v-if="$slots['top-extra']" name="top-extra" :value="internalModelValue" />
4
+ <template v-if="$slots['month-year']">
5
+ <slot
6
+ name="month-year"
7
+ v-bind="{
8
+ year,
9
+ months: groupedMonths(instance),
10
+ years: groupedYears(instance),
11
+ selectMonth,
12
+ selectYear,
13
+ instance,
14
+ }"
15
+ />
16
+ </template>
17
+ <template v-else>
18
+ <SelectionOverlay
19
+ :items="groupedMonths(instance)"
20
+ :arrow-navigation="arrowNavigation"
21
+ :is-last="autoApply && !defaultedConfig.keepActionRow"
22
+ :esc-close="escClose"
23
+ :height="defaultedConfig.modeHeight"
24
+ :config="config"
25
+ :no-overlay-focus="Boolean(noOverlayFocus || textInput)"
26
+ use-relative
27
+ type="month"
28
+ @selected="selectMonth($event, instance)"
29
+ @hover-value="setHoverDate($event, instance)"
30
+ >
31
+ <template #header>
32
+ <YearModePicker
33
+ v-bind="$props"
34
+ :items="groupedYears(instance)"
35
+ :instance="instance"
36
+ :show-year-picker="showYearPicker[instance]"
37
+ :year="year(instance)"
38
+ :is-disabled="(next: boolean) => isDisabled(instance, next)"
39
+ @handle-year="handleYear(instance, $event)"
40
+ @year-select="handleYearSelect($event, instance)"
41
+ @toggle-year-picker="toggleYearPicker(instance, $event?.flow, $event?.show)"
42
+ >
43
+ <template v-for="(slot, i) in yearModeSlots" #[slot]="args" :key="i">
44
+ <slot :name="slot" v-bind="args" />
45
+ </template>
46
+ </YearModePicker>
47
+ </template>
48
+ <template v-if="$slots[`month-overlay-value`]" #item="{ item }">
49
+ <slot :name="`month-overlay-value`" :text="item.text" :value="item.value" />
50
+ </template>
51
+ </SelectionOverlay>
52
+ </template>
53
+ </InstanceWrap>
54
+ </template>
55
+
56
+ <script lang="ts" setup>
57
+ import { onMounted, useSlots } from 'vue';
58
+ import SelectionOverlay from '../../components/Common/SelectionOverlay.vue';
59
+ import InstanceWrap from '../../components/Common/InstanceWrap.vue';
60
+ import YearModePicker from '../../components/shared/YearModePicker.vue';
61
+
62
+ import { PickerBaseProps } from '../../props';
63
+ import { useMonthPicker } from '../../components/MonthPicker/month-picker';
64
+ import { mapSlots } from '../../composables';
65
+
66
+ const emit = defineEmits([
67
+ 'update:internal-model-value',
68
+ 'overlay-closed',
69
+ 'reset-flow',
70
+ 'range-start',
71
+ 'range-end',
72
+ 'auto-apply',
73
+ 'update-month-year',
74
+ 'update-flow-step',
75
+ 'mount',
76
+ 'invalid-fixed-range',
77
+ 'overlay-toggle',
78
+ ]);
79
+
80
+ const slots = useSlots();
81
+ const yearModeSlots = mapSlots(slots, 'yearMode');
82
+
83
+ const props = defineProps({
84
+ ...PickerBaseProps,
85
+ });
86
+
87
+ onMounted(() => {
88
+ if (!props.shadow) {
89
+ emit('mount', null);
90
+ }
91
+ });
92
+
93
+ defineOptions({
94
+ compatConfig: {
95
+ MODE: 3,
96
+ },
97
+ });
98
+
99
+ const {
100
+ groupedMonths,
101
+ groupedYears,
102
+ year,
103
+ isDisabled,
104
+ defaultedMultiCalendars,
105
+ defaultedConfig,
106
+ showYearPicker,
107
+ modelValue,
108
+ presetDate,
109
+ setHoverDate,
110
+ selectMonth,
111
+ selectYear,
112
+ toggleYearPicker,
113
+ handleYearSelect,
114
+ handleYear,
115
+ getModelMonthYear,
116
+ } = useMonthPicker(props, emit);
117
+
118
+ const getSidebarProps = () => {
119
+ return {
120
+ modelValue,
121
+ year,
122
+ getModelMonthYear,
123
+ selectMonth,
124
+ selectYear,
125
+ handleYear,
126
+ };
127
+ };
128
+
129
+ defineExpose({ getSidebarProps, presetDate, toggleYearPicker: (flow: boolean) => toggleYearPicker(0, flow) });
130
+ </script>
@@ -0,0 +1,232 @@
1
+ import { computed, nextTick, onMounted, ref } from 'vue';
2
+ import { getMonth, getYear } from 'date-fns';
3
+
4
+ import { checkMinMaxValue, getMonths, groupListAndMap } from '../../utils/util';
5
+ import {
6
+ checkHighlightMonth,
7
+ getDate,
8
+ getDisabledMonths,
9
+ getMaxMonth,
10
+ getMinMonth,
11
+ isDateBetween,
12
+ resetDate,
13
+ setDateMonthOrYear,
14
+ } from '../../utils/date-utils';
15
+ import { useDefaults, useModel, useValidation } from '../../composables';
16
+ import {
17
+ checkRangeAutoApply,
18
+ getRangeWithFixedDate,
19
+ handleMultiDatesSelect,
20
+ setMonthOrYearRange,
21
+ setPresetDate,
22
+ } from '../../composables/shared';
23
+
24
+ import type { IDefaultSelect, OverlayGridItem, VueEmit } from '../../interfaces';
25
+ import type { PickerBasePropsType } from '../../props';
26
+ import { useMonthOrQuarterPicker } from '../../components/shared/month-quarter-picker';
27
+
28
+ export const useMonthPicker = (props: PickerBasePropsType, emit: VueEmit) => {
29
+ const {
30
+ defaultedMultiCalendars,
31
+ defaultedAriaLabels,
32
+ defaultedTransitions,
33
+ defaultedConfig,
34
+ defaultedRange,
35
+ defaultedHighlight,
36
+ propDates,
37
+ defaultedTz,
38
+ defaultedFilters,
39
+ defaultedMultiDates,
40
+ } = useDefaults(props);
41
+ const reMap = () => {
42
+ if (props.isTextInputDate) onYearSelect(getYear(getDate(props.startDate)), 0);
43
+ };
44
+ const { modelValue, year, month: instanceMonth, calendars } = useModel(props, emit, reMap);
45
+ const months = computed(() => getMonths(props.formatLocale, props.locale, props.monthNameFormat));
46
+ const hoverDate = ref<Date | null>(null);
47
+ const { checkMinMaxRange } = useValidation(props);
48
+
49
+ const {
50
+ selectYear: onYearSelect,
51
+ groupedYears,
52
+ showYearPicker,
53
+ toggleYearPicker,
54
+ handleYearSelect,
55
+ handleYear,
56
+ isDisabled,
57
+ } = useMonthOrQuarterPicker({
58
+ modelValue,
59
+ multiCalendars: defaultedMultiCalendars,
60
+ range: defaultedRange,
61
+ highlight: defaultedHighlight,
62
+ calendars,
63
+ year,
64
+ propDates,
65
+ month: instanceMonth,
66
+ filters: defaultedFilters,
67
+ props,
68
+ emit,
69
+ });
70
+
71
+ onMounted(() => {
72
+ if (props.startDate) {
73
+ if ((modelValue.value && props.focusStartDate) || !modelValue.value) {
74
+ onYearSelect(getYear(getDate(props.startDate)), 0);
75
+ }
76
+ }
77
+ });
78
+
79
+ const getMonthYear = (date?: Date) => {
80
+ if (date) {
81
+ return { month: getMonth(date), year: getYear(date) };
82
+ }
83
+ return { month: null, year: null };
84
+ };
85
+
86
+ const getModelMonthYear = () => {
87
+ if (modelValue.value) {
88
+ if (Array.isArray(modelValue.value)) {
89
+ return modelValue.value.map((val) => getMonthYear(val));
90
+ }
91
+ return getMonthYear(modelValue.value);
92
+ }
93
+ return getMonthYear();
94
+ };
95
+
96
+ const checkActiveMonth = (instance: number, month: number) => {
97
+ const calendar = calendars.value[instance];
98
+ const activeMonthYear = getModelMonthYear();
99
+ if (Array.isArray(activeMonthYear)) {
100
+ return activeMonthYear.some((value) => value.year === calendar?.year && value.month === month);
101
+ }
102
+ return calendar?.year === activeMonthYear.year && month === activeMonthYear.month;
103
+ };
104
+
105
+ const isSameMonthYear = (month: number, instance: number, i: number) => {
106
+ const currentModel = getModelMonthYear();
107
+
108
+ if (Array.isArray(currentModel)) {
109
+ const currentYear = year.value(instance);
110
+
111
+ return currentYear === currentModel[i]?.year && month === currentModel[i]?.month;
112
+ }
113
+ return false;
114
+ };
115
+
116
+ const isMonthBetween = (month: number, instance: number) => {
117
+ if (defaultedRange.value.enabled) {
118
+ const currentModel = getModelMonthYear();
119
+ if (Array.isArray(modelValue.value) && Array.isArray(currentModel)) {
120
+ const isModel = isSameMonthYear(month, instance, 0) || isSameMonthYear(month, instance, 1);
121
+ const current = setDateMonthOrYear(resetDate(getDate()), month, year.value(instance));
122
+ return isDateBetween(modelValue.value, hoverDate.value, current) && !isModel;
123
+ }
124
+ return false;
125
+ }
126
+ return false;
127
+ };
128
+
129
+ const groupedMonths = computed(() => (instance: number): OverlayGridItem[][] => {
130
+ return groupListAndMap(months.value, (month: IDefaultSelect) => {
131
+ const active = checkActiveMonth(instance, month.value);
132
+ const disabled =
133
+ checkMinMaxValue(
134
+ month.value,
135
+ getMinMonth(year.value(instance), propDates.value.minDate),
136
+ getMaxMonth(year.value(instance), propDates.value.maxDate),
137
+ ) ||
138
+ getDisabledMonths(propDates.value.disabledDates, year.value(instance)).includes(month.value) ||
139
+ defaultedFilters.value.months?.includes(month.value);
140
+ const isBetween = isMonthBetween(month.value, instance);
141
+ const highlighted = checkHighlightMonth(defaultedHighlight.value, month.value, year.value(instance));
142
+ return { active, disabled, isBetween, highlighted };
143
+ });
144
+ });
145
+
146
+ const monthToDate = (month: number, instance: number) => {
147
+ return setDateMonthOrYear(resetDate(getDate()), month, year.value(instance));
148
+ };
149
+
150
+ const selectSingleMonth = (month: number, instance: number) => {
151
+ const date = modelValue.value ? (modelValue.value as Date) : resetDate(new Date());
152
+ modelValue.value = setDateMonthOrYear(date, month, year.value(instance));
153
+ emit('auto-apply');
154
+ emit('update-flow-step');
155
+ };
156
+
157
+ const selectRangedMonth = (month: number, instance: number) => {
158
+ const date = monthToDate(month, instance);
159
+ if (defaultedRange.value.fixedEnd || defaultedRange.value.fixedStart) {
160
+ modelValue.value = getRangeWithFixedDate(date, modelValue, emit, defaultedRange);
161
+ } else if (!modelValue.value) {
162
+ modelValue.value = [monthToDate(month, instance)];
163
+ } else if (checkMinMaxRange(date, modelValue.value)) {
164
+ modelValue.value = setMonthOrYearRange(modelValue, monthToDate(month, instance), emit);
165
+ }
166
+ nextTick().then(() => {
167
+ checkRangeAutoApply(modelValue.value as Date[], emit, props.autoApply, props.modelAuto);
168
+ });
169
+ };
170
+
171
+ const selectMultiMonths = (month: number, instance: number) => {
172
+ handleMultiDatesSelect(monthToDate(month, instance), modelValue, defaultedMultiDates.value.limit);
173
+ emit('auto-apply', true);
174
+ };
175
+
176
+ const selectMonth = (month: number, instance: number) => {
177
+ calendars.value[instance].month = month;
178
+ emitMonthYearUpdate(instance, calendars.value[instance].year, month);
179
+ if (defaultedMultiDates.value.enabled) return selectMultiMonths(month, instance);
180
+ if (defaultedRange.value.enabled) return selectRangedMonth(month, instance);
181
+ return selectSingleMonth(month, instance);
182
+ };
183
+
184
+ const selectYear = (year: number, instance: number) => {
185
+ onYearSelect(year, instance);
186
+ emitMonthYearUpdate(instance, year, null);
187
+ };
188
+
189
+ const emitMonthYearUpdate = (instance: number, year: number, monthVal: number | null) => {
190
+ let month = monthVal;
191
+ if (!month && month !== 0) {
192
+ const value = getModelMonthYear();
193
+ month = Array.isArray(value) ? value[instance].month : value.month;
194
+ }
195
+ emit('update-month-year', { instance, year, month });
196
+ };
197
+
198
+ const setHoverDate = (month: number, instance: number) => {
199
+ hoverDate.value = monthToDate(month, instance);
200
+ };
201
+
202
+ const presetDate = (value: Date[] | string[] | Date | string, noTz?: boolean) => {
203
+ setPresetDate({
204
+ value,
205
+ modelValue,
206
+ range: defaultedRange.value.enabled,
207
+ timezone: noTz ? undefined : defaultedTz.value.timezone,
208
+ });
209
+ emit('auto-apply');
210
+ };
211
+
212
+ return {
213
+ groupedMonths,
214
+ groupedYears,
215
+ year,
216
+ isDisabled,
217
+ defaultedMultiCalendars,
218
+ defaultedAriaLabels,
219
+ defaultedTransitions,
220
+ defaultedConfig,
221
+ showYearPicker,
222
+ modelValue,
223
+ presetDate,
224
+ setHoverDate,
225
+ selectMonth,
226
+ selectYear,
227
+ toggleYearPicker,
228
+ handleYearSelect,
229
+ handleYear,
230
+ getModelMonthYear,
231
+ };
232
+ };
@@ -0,0 +1,111 @@
1
+ <template>
2
+ <InstanceWrap v-slot="{ instance }" :multi-calendars="defaultedMultiCalendars.count" :collapse="collapse" stretch>
3
+ <div class="dp-quarter-picker-wrap" :style="{ minHeight: `${defaultedConfig.modeHeight}px` }">
4
+ <slot v-if="$slots['top-extra']" name="top-extra" :value="internalModelValue" />
5
+ <div>
6
+ <YearModePicker
7
+ v-bind="$props"
8
+ :items="groupedYears(instance)"
9
+ :instance="instance"
10
+ :show-year-picker="showYearPicker[instance]"
11
+ :year="year(instance)"
12
+ :is-disabled="(next: boolean) => isDisabled(instance, next)"
13
+ @handle-year="handleYear(instance, $event)"
14
+ @year-select="handleYearSelect($event, instance)"
15
+ @toggle-year-picker="toggleYearPicker(instance, $event?.flow, $event?.show)"
16
+ >
17
+ <template v-for="(slot, i) in yearModeSlots" #[slot]="args" :key="i">
18
+ <slot :name="slot" v-bind="args" />
19
+ </template>
20
+ </YearModePicker>
21
+ </div>
22
+ <div class="dp--quarter-items">
23
+ <div v-for="(quarter, i) in quarters(instance)" :key="i">
24
+ <button
25
+ type="button"
26
+ class="dp--qr-btn"
27
+ :class="{
28
+ 'dp--qr-btn-active': quarter.active,
29
+ 'dp--qr-btn-between': quarter.isBetween,
30
+ 'dp--qr-btn-disabled': quarter.disabled,
31
+ 'dp--highlighted': quarter.highlighted,
32
+ }"
33
+ :data-test="quarter.value"
34
+ :disabled="quarter.disabled"
35
+ @click="selectQuarter(quarter.value, instance, quarter.disabled)"
36
+ @mouseover="setHoverDate(quarter.value)"
37
+ >
38
+ <template v-if="$slots['quarter']"
39
+ ><slot name="quarter" :value="quarter.value" :text="quarter.text"
40
+ /></template>
41
+ <template v-else>
42
+ {{ quarter.text }}
43
+ </template>
44
+ </button>
45
+ </div>
46
+ </div>
47
+ </div>
48
+ </InstanceWrap>
49
+ </template>
50
+
51
+ <script lang="ts" setup>
52
+ import { useSlots } from 'vue';
53
+
54
+ import InstanceWrap from '../../components/Common/InstanceWrap.vue';
55
+ import YearModePicker from '../../components/shared/YearModePicker.vue';
56
+
57
+ import { useQuarterPicker } from '../../components/QuarterPicker/quarter-picker';
58
+ import { mapSlots } from '../../composables';
59
+ import { PickerBaseProps } from '../../props';
60
+
61
+ const emit = defineEmits([
62
+ 'update:internal-model-value',
63
+ 'reset-flow',
64
+ 'overlay-closed',
65
+ 'auto-apply',
66
+ 'range-start',
67
+ 'range-end',
68
+ 'overlay-toggle',
69
+ 'update-month-year',
70
+ ]);
71
+ const props = defineProps({
72
+ ...PickerBaseProps,
73
+ });
74
+
75
+ const slots = useSlots();
76
+ const yearModeSlots = mapSlots(slots, 'yearMode');
77
+
78
+ defineOptions({
79
+ compatConfig: {
80
+ MODE: 3,
81
+ },
82
+ });
83
+
84
+ const {
85
+ defaultedMultiCalendars,
86
+ defaultedConfig,
87
+ groupedYears,
88
+ year,
89
+ isDisabled,
90
+ quarters,
91
+ modelValue,
92
+ showYearPicker,
93
+ setHoverDate,
94
+ selectQuarter,
95
+ toggleYearPicker,
96
+ handleYearSelect,
97
+ handleYear,
98
+ } = useQuarterPicker(props, emit);
99
+
100
+ const getSidebarProps = () => {
101
+ return {
102
+ modelValue,
103
+ year,
104
+ selectQuarter,
105
+ handleYearSelect,
106
+ handleYear,
107
+ };
108
+ };
109
+
110
+ defineExpose({ getSidebarProps });
111
+ </script>
@@ -0,0 +1,153 @@
1
+ import { computed, ref } from 'vue';
2
+ import {
3
+ eachQuarterOfInterval,
4
+ endOfQuarter,
5
+ endOfYear,
6
+ format,
7
+ getMonth,
8
+ getQuarter,
9
+ getYear,
10
+ isSameQuarter,
11
+ set,
12
+ startOfQuarter,
13
+ startOfYear,
14
+ } from 'date-fns';
15
+
16
+ import { useDefaults, useModel, useValidation } from '../../composables';
17
+ import { useMonthOrQuarterPicker } from '../../components/shared/month-quarter-picker';
18
+ import { checkRangeAutoApply, handleMultiDatesSelect, setMonthOrYearRange } from '../../composables/shared';
19
+
20
+ import type { PickerBasePropsType } from '../../props';
21
+ import type { VueEmit } from '../../interfaces';
22
+ import { isDateBetween, isDateEqual } from '../../utils/date-utils';
23
+
24
+ export const useQuarterPicker = (props: PickerBasePropsType, emit: VueEmit) => {
25
+ const hoverDate = ref();
26
+ const {
27
+ defaultedMultiCalendars,
28
+ defaultedConfig,
29
+ defaultedHighlight,
30
+ defaultedRange,
31
+ propDates,
32
+ defaultedFilters,
33
+ defaultedMultiDates,
34
+ } = useDefaults(props);
35
+ const { modelValue, year, month, calendars } = useModel(props, emit);
36
+ const { isDisabled: isDateDisabled } = useValidation(props);
37
+ const { selectYear, groupedYears, showYearPicker, isDisabled, toggleYearPicker, handleYearSelect, handleYear } =
38
+ useMonthOrQuarterPicker({
39
+ modelValue,
40
+ multiCalendars: defaultedMultiCalendars,
41
+ range: defaultedRange,
42
+ highlight: defaultedHighlight,
43
+ calendars,
44
+ propDates,
45
+ month,
46
+ year,
47
+ filters: defaultedFilters,
48
+ props,
49
+ emit,
50
+ });
51
+
52
+ const formatQuarterText = (start: Date, end: Date) => {
53
+ return [start, end].map((date) => format(date, 'MMMM', { locale: props.formatLocale })).join('-');
54
+ };
55
+
56
+ const isQuarterActive = computed(() => (date: Date) => {
57
+ if (modelValue.value) {
58
+ if (Array.isArray(modelValue.value)) {
59
+ return modelValue.value.some((val) => isSameQuarter(date, val));
60
+ }
61
+ return isSameQuarter(modelValue.value, date);
62
+ }
63
+ return false;
64
+ });
65
+
66
+ const isQuarterBetween = (date: Date) => {
67
+ if (defaultedRange.value.enabled) {
68
+ if (Array.isArray(modelValue.value)) {
69
+ const isModel = isDateEqual(date, modelValue.value[0]) || isDateEqual(date, modelValue.value[1]);
70
+ return isDateBetween(modelValue.value, hoverDate.value, date) && !isModel;
71
+ }
72
+ return false;
73
+ }
74
+ return false;
75
+ };
76
+
77
+ const matchQuarter = (value: { quarter: number; year: number }, date: Date) => {
78
+ return value.quarter === getQuarter(date) && value.year === getYear(date);
79
+ };
80
+
81
+ const isHighlighted = (start: Date) => {
82
+ return typeof defaultedHighlight.value === 'function'
83
+ ? defaultedHighlight.value({ quarter: getQuarter(start), year: getYear(start) })
84
+ : !!defaultedHighlight.value.quarters.find((value: any) => matchQuarter(value, start));
85
+ };
86
+
87
+ const quarters = computed(() => (instance: number) => {
88
+ const activeYear = set(new Date(), { year: year.value(instance) });
89
+ return eachQuarterOfInterval({
90
+ start: startOfYear(activeYear),
91
+ end: endOfYear(activeYear),
92
+ }).map((quarter) => {
93
+ const start = startOfQuarter(quarter);
94
+ const end = endOfQuarter(quarter);
95
+ const disabled = isDateDisabled(quarter);
96
+ const isBetween = isQuarterBetween(start);
97
+ const highlighted = isHighlighted(start);
98
+ return {
99
+ text: formatQuarterText(start, end),
100
+ value: start,
101
+ active: isQuarterActive.value(start),
102
+ highlighted,
103
+ disabled: disabled,
104
+ isBetween,
105
+ };
106
+ });
107
+ });
108
+
109
+ const selectMultiQuarters = (date: Date) => {
110
+ handleMultiDatesSelect(date, modelValue, defaultedMultiDates.value.limit);
111
+ emit('auto-apply', true);
112
+ };
113
+
114
+ const selectRangedQuarter = (date: Date) => {
115
+ modelValue.value = setMonthOrYearRange(modelValue, date, emit);
116
+ checkRangeAutoApply(modelValue.value, emit, props.autoApply, props.modelAuto);
117
+ };
118
+
119
+ const selectSingleQuarter = (date: Date) => {
120
+ modelValue.value = date;
121
+ emit('auto-apply');
122
+ };
123
+
124
+ const selectQuarter = (date: Date, instance: number, disabled: boolean) => {
125
+ if (disabled) return;
126
+ calendars.value[instance].month = getMonth(endOfQuarter(date));
127
+
128
+ if (defaultedMultiDates.value.enabled) return selectMultiQuarters(date);
129
+ if (defaultedRange.value.enabled) return selectRangedQuarter(date);
130
+ return selectSingleQuarter(date);
131
+ };
132
+
133
+ const setHoverDate = (date: Date) => {
134
+ hoverDate.value = date;
135
+ };
136
+
137
+ return {
138
+ defaultedConfig,
139
+ defaultedMultiCalendars,
140
+ groupedYears,
141
+ year,
142
+ isDisabled,
143
+ quarters,
144
+ showYearPicker,
145
+ modelValue,
146
+ setHoverDate,
147
+ selectYear,
148
+ selectQuarter,
149
+ toggleYearPicker,
150
+ handleYearSelect,
151
+ handleYear,
152
+ };
153
+ };