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,477 @@
1
+ <template>
2
+ <div v-if="!disabled" class="dp__time_input">
3
+ <div v-for="(timeInput, i) in timeInputs" :key="i" :class="timeColClass">
4
+ <template v-if="timeInput.separator"> <template v-if="!timeOverlayOpen">:</template> </template>
5
+ <template v-else>
6
+ <button
7
+ :ref="(el) => assignRefs(el, i, 0)"
8
+ type="button"
9
+ :class="{
10
+ dp__btn: true,
11
+ dp__inc_dec_button: !timePickerInline,
12
+ dp__inc_dec_button_inline: timePickerInline,
13
+ dp__tp_inline_btn_top: timePickerInline,
14
+ dp__inc_dec_button_disabled: disabledArrowUpBtn(timeInput.type),
15
+ 'dp--hidden-el': timeOverlayOpen,
16
+ }"
17
+ :data-test="`${timeInput.type}-time-inc-btn-${props.order}`"
18
+ :aria-label="defaultedAriaLabels?.incrementValue(timeInput.type)"
19
+ tabindex="0"
20
+ @keydown="
21
+ checkKeyDown($event, () => handleTimeValue(timeInput.type, true, { keyboard: true }), true)
22
+ "
23
+ @click="defaultedConfig.timeArrowHoldThreshold ? undefined : handleTimeValue(timeInput.type, true)"
24
+ @mousedown="
25
+ defaultedConfig.timeArrowHoldThreshold ? handleTimeValue(timeInput.type, true) : undefined
26
+ "
27
+ @mouseup="clearHold"
28
+ >
29
+ <template v-if="!props.timePickerInline">
30
+ <slot v-if="$slots['arrow-up']" name="arrow-up" />
31
+ <ChevronUpIcon v-if="!$slots['arrow-up']" />
32
+ </template>
33
+ <template v-else>
34
+ <template v-if="$slots['tp-inline-arrow-up']">
35
+ <slot name="tp-inline-arrow-up" />
36
+ </template>
37
+ <template v-else>
38
+ <span class="dp__tp_inline_btn_bar dp__tp_btn_in_l"></span>
39
+ <span class="dp__tp_inline_btn_bar dp__tp_btn_in_r"></span>
40
+ </template>
41
+ </template>
42
+ </button>
43
+ <button
44
+ :ref="(el) => assignRefs(el, i, 1)"
45
+ type="button"
46
+ :aria-label="`${timeValueDisplay(timeInput.type).text}-${defaultedAriaLabels?.openTpOverlay(timeInput.type)}`"
47
+ :class="{
48
+ dp__time_display: true,
49
+ dp__time_display_block: !timePickerInline,
50
+ dp__time_display_inline: timePickerInline,
51
+ 'dp--time-invalid': disabledBox(timeInput.type),
52
+ 'dp--time-overlay-btn': !disabledBox(timeInput.type),
53
+ 'dp--hidden-el': timeOverlayOpen,
54
+ }"
55
+ :disabled="checkOverlayDisabled(timeInput.type)"
56
+ tabindex="0"
57
+ :data-test="`${timeInput.type}-toggle-overlay-btn-${props.order}`"
58
+ @keydown="checkKeyDown($event, () => toggleOverlay(timeInput.type), true)"
59
+ @click="toggleOverlay(timeInput.type)"
60
+ >
61
+ <slot
62
+ v-if="$slots[timeInput.type]"
63
+ :name="timeInput.type"
64
+ :text="timeValueDisplay(timeInput.type).text"
65
+ :value="timeValueDisplay(timeInput.type).value"
66
+ />
67
+ <template v-if="!$slots[timeInput.type]">{{ timeValueDisplay(timeInput.type).text }}</template>
68
+ </button>
69
+ <button
70
+ :ref="(el) => assignRefs(el, i, 2)"
71
+ type="button"
72
+ :class="{
73
+ dp__btn: true,
74
+ dp__inc_dec_button: !timePickerInline,
75
+ dp__inc_dec_button_inline: timePickerInline,
76
+ dp__tp_inline_btn_bottom: timePickerInline,
77
+ dp__inc_dec_button_disabled: disabledArrowDownBtn(timeInput.type),
78
+ 'dp--hidden-el': timeOverlayOpen,
79
+ }"
80
+ :data-test="`${timeInput.type}-time-dec-btn-${props.order}`"
81
+ :aria-label="defaultedAriaLabels?.decrementValue(timeInput.type)"
82
+ tabindex="0"
83
+ @keydown="
84
+ checkKeyDown($event, () => handleTimeValue(timeInput.type, false, { keyboard: true }), true)
85
+ "
86
+ @click="defaultedConfig.timeArrowHoldThreshold ? undefined : handleTimeValue(timeInput.type, false)"
87
+ @mousedown="
88
+ defaultedConfig.timeArrowHoldThreshold ? handleTimeValue(timeInput.type, false) : undefined
89
+ "
90
+ @mouseup="clearHold"
91
+ >
92
+ <template v-if="!props.timePickerInline">
93
+ <slot v-if="$slots['arrow-down']" name="arrow-down" />
94
+ <ChevronDownIcon v-if="!$slots['arrow-down']" />
95
+ </template>
96
+ <template v-else>
97
+ <template v-if="$slots['tp-inline-arrow-down']">
98
+ <slot name="tp-inline-arrow-down" />
99
+ </template>
100
+ <template v-else>
101
+ <span class="dp__tp_inline_btn_bar dp__tp_btn_in_l"></span>
102
+ <span class="dp__tp_inline_btn_bar dp__tp_btn_in_r"></span>
103
+ </template>
104
+ </template>
105
+ </button>
106
+ </template>
107
+ </div>
108
+ <div v-if="!is24">
109
+ <slot v-if="$slots['am-pm-button']" name="am-pm-button" :toggle="setAmPm" :value="amPm"></slot>
110
+ <button
111
+ v-if="!$slots['am-pm-button']"
112
+ ref="amPmButton"
113
+ type="button"
114
+ class="dp__pm_am_button"
115
+ role="button"
116
+ :aria-label="defaultedAriaLabels?.amPmButton"
117
+ tabindex="0"
118
+ @click="setAmPm"
119
+ @keydown="checkKeyDown($event, () => setAmPm(), true)"
120
+ >
121
+ {{ amPm }}
122
+ </button>
123
+ </div>
124
+ <template v-for="(timeInput, i) in timeInputOverlays" :key="i">
125
+ <transition :name="transitionName(overlays[timeInput.type])" :css="showTransition">
126
+ <SelectionOverlay
127
+ v-if="overlays[timeInput.type]"
128
+ :items="getGridItems(timeInput.type)"
129
+ :is-last="autoApply && !defaultedConfig.keepActionRow"
130
+ :esc-close="escClose"
131
+ :type="timeInput.type"
132
+ :text-input="textInput"
133
+ :config="config"
134
+ :arrow-navigation="arrowNavigation"
135
+ :aria-labels="ariaLabels"
136
+ :overlay-label="defaultedAriaLabels.timeOverlay?.(timeInput.type)"
137
+ @selected="handleTimeFromOverlay(timeInput.type, $event)"
138
+ @toggle="toggleOverlay(timeInput.type)"
139
+ @reset-flow="$emit('reset-flow')"
140
+ >
141
+ <template #button-icon>
142
+ <slot v-if="$slots['clock-icon']" name="clock-icon" />
143
+ <component :is="timePickerInline ? CalendarIcon : ClockIcon" v-if="!$slots['clock-icon']" />
144
+ </template>
145
+ <template v-if="$slots[`${timeInput.type}-overlay-value`]" #item="{ item }">
146
+ <slot :name="`${timeInput.type}-overlay-value`" :text="item.text" :value="item.value" />
147
+ </template>
148
+ <template v-if="$slots[`${timeInput.type}-overlay-header`]" #header>
149
+ <slot
150
+ :name="`${timeInput.type}-overlay-header`"
151
+ :toggle="() => toggleOverlay(timeInput.type)"
152
+ />
153
+ </template>
154
+ </SelectionOverlay>
155
+ </transition>
156
+ </template>
157
+ </div>
158
+ </template>
159
+
160
+ <script lang="ts" setup>
161
+ import { computed, onMounted, reactive, ref } from 'vue';
162
+ import { add, getHours, getMinutes, getSeconds, isAfter, isBefore, isEqual, set, sub } from 'date-fns';
163
+
164
+ import { ChevronUpIcon, ChevronDownIcon, ClockIcon, CalendarIcon } from '../../components/Icons';
165
+ import SelectionOverlay from '../../components/Common/SelectionOverlay.vue';
166
+
167
+ import { useTransitions, useArrowNavigation, useDefaults } from '../../composables';
168
+ import { PickerBaseProps } from '../../props';
169
+ import { checkKeyDown, groupListAndMap, hoursToAmPmHours } from '../../utils/util';
170
+ import { getDate, sanitizeTime } from '../../utils/date-utils';
171
+
172
+ import type { PropType } from 'vue';
173
+ import type { Duration } from 'date-fns';
174
+ import type {
175
+ DynamicClass,
176
+ IDefaultSelect,
177
+ TimeType,
178
+ TimeOverlayCheck,
179
+ OverlayGridItem,
180
+ DisabledTimesArrProp,
181
+ TimeModel,
182
+ TimeInput,
183
+ } from '../../interfaces';
184
+
185
+ defineOptions({
186
+ compatConfig: {
187
+ MODE: 3,
188
+ },
189
+ });
190
+
191
+ const emit = defineEmits([
192
+ 'set-hours',
193
+ 'set-minutes',
194
+ 'update:hours',
195
+ 'update:minutes',
196
+ 'update:seconds',
197
+ 'reset-flow',
198
+ 'mounted',
199
+ 'overlay-closed',
200
+ 'overlay-opened',
201
+ 'am-pm-change',
202
+ ]);
203
+ const props = defineProps({
204
+ hours: { type: Number as PropType<number>, default: 0 },
205
+ minutes: { type: Number as PropType<number>, default: 0 },
206
+ seconds: { type: Number as PropType<number>, default: 0 },
207
+ closeTimePickerBtn: { type: Object as PropType<HTMLElement | null>, default: null },
208
+ order: { type: Number as PropType<number>, default: 0 },
209
+ disabledTimesConfig: { type: Function as PropType<DisabledTimesArrProp>, default: null },
210
+ validateTime: { type: Function as PropType<(type: TimeType, value: number) => boolean>, default: () => false },
211
+ ...PickerBaseProps,
212
+ });
213
+
214
+ const { setTimePickerElements, setTimePickerBackRef } = useArrowNavigation();
215
+ const { defaultedAriaLabels, defaultedTransitions, defaultedFilters, defaultedConfig, defaultedRange } =
216
+ useDefaults(props);
217
+
218
+ const { transitionName, showTransition } = useTransitions(defaultedTransitions);
219
+
220
+ const overlays = reactive({
221
+ hours: false,
222
+ minutes: false,
223
+ seconds: false,
224
+ });
225
+ const amPm = ref('AM');
226
+ const amPmButton = ref<HTMLElement | null>(null);
227
+ const elementRefs = ref<HTMLElement[][]>([]);
228
+ const holdTimeout = ref();
229
+ const timeOverlayOpen = ref(false);
230
+
231
+ onMounted(() => {
232
+ emit('mounted');
233
+ });
234
+
235
+ const setTime = (time: Duration) => {
236
+ return set(new Date(), {
237
+ hours: time.hours,
238
+ minutes: time.minutes,
239
+ seconds: props.enableSeconds ? time.seconds : 0,
240
+ milliseconds: 0,
241
+ });
242
+ };
243
+
244
+ const disabledBox = computed(
245
+ () => (type: TimeType) => isValueDisabled(type, props[type]) || isOverlayValueDisabled(type, props[type]),
246
+ );
247
+
248
+ const timeValues = computed(() => ({ hours: props.hours, minutes: props.minutes, seconds: props.seconds }));
249
+
250
+ const isOverlayValueDisabled = (type: TimeType, val: number) => {
251
+ if (defaultedRange.value.enabled && !defaultedRange.value.disableTimeRangeValidation) {
252
+ return !props.validateTime(type, val);
253
+ }
254
+ return false;
255
+ };
256
+
257
+ const disabledRangedArrows = (type: TimeType, inc: boolean) => {
258
+ if (defaultedRange.value.enabled && !defaultedRange.value.disableTimeRangeValidation) {
259
+ const inVal = inc ? +props[`${type}Increment`] : -+props[`${type}Increment`];
260
+ const val = props[type] + inVal;
261
+ return !props.validateTime(type, val);
262
+ }
263
+ return false;
264
+ };
265
+
266
+ const disabledArrowUpBtn = computed(() => (type: TimeType) => {
267
+ return !isDateInRange(+props[type] + +props[`${type}Increment`], type) || disabledRangedArrows(type, true);
268
+ });
269
+
270
+ const disabledArrowDownBtn = computed(() => (type: TimeType) => {
271
+ return !isDateInRange(+props[type] - +props[`${type}Increment`], type) || disabledRangedArrows(type, false);
272
+ });
273
+
274
+ const addTime = (initial: Duration, toAdd: Duration) => add(set(getDate(), initial), toAdd);
275
+
276
+ const subTime = (initial: Duration, toSub: Duration) => sub(set(getDate(), initial), toSub);
277
+
278
+ const timeColClass = computed(
279
+ (): DynamicClass => ({
280
+ dp__time_col: true,
281
+ dp__time_col_block: !props.timePickerInline,
282
+ dp__time_col_reg_block: !props.enableSeconds && props.is24 && !props.timePickerInline,
283
+ dp__time_col_reg_inline: !props.enableSeconds && props.is24 && props.timePickerInline,
284
+ dp__time_col_reg_with_button: !props.enableSeconds && !props.is24,
285
+ dp__time_col_sec: props.enableSeconds && props.is24,
286
+ dp__time_col_sec_with_button: props.enableSeconds && !props.is24,
287
+ }),
288
+ );
289
+
290
+ const timeInputs = computed((): TimeInput[] => {
291
+ const inputs = [{ type: 'hours' }];
292
+ if (props.enableMinutes) {
293
+ inputs.push({ type: '', separator: true } as unknown as TimeInput, {
294
+ type: 'minutes',
295
+ });
296
+ }
297
+ if (props.enableSeconds) {
298
+ inputs.push({ type: '', separator: true } as unknown as TimeInput, {
299
+ type: 'seconds',
300
+ });
301
+ }
302
+ return inputs as TimeInput[];
303
+ });
304
+
305
+ const timeInputOverlays = computed(() => timeInputs.value.filter((input) => !input.separator));
306
+
307
+ const timeValueDisplay = computed(() => (type: TimeType) => {
308
+ if (type === 'hours') {
309
+ const hour = convert24ToAmPm(+props.hours);
310
+ return { text: hour < 10 ? `0${hour}` : `${hour}`, value: hour };
311
+ }
312
+ return { text: props[type] < 10 ? `0${props[type]}` : `${props[type]}`, value: props[type] };
313
+ });
314
+
315
+ const isValueDisabled = (type: TimeType, value: number): boolean => {
316
+ if (!props.disabledTimesConfig) return false;
317
+ const disabledTimes = props.disabledTimesConfig(props.order, type === 'hours' ? value : undefined);
318
+ if (!disabledTimes[type]) return true;
319
+ return Boolean(disabledTimes[type]?.includes(value));
320
+ };
321
+
322
+ const getAmPmDiff = (val: number, type: TimeType): number => {
323
+ if (type !== 'hours') return val;
324
+ return amPm.value === 'AM' ? val : val + 12;
325
+ };
326
+
327
+ const getGridItems = (type: TimeType): OverlayGridItem[][] => {
328
+ const timeRange = props.is24 ? 24 : 12;
329
+ const max = type === 'hours' ? timeRange : 60;
330
+ const increment = +props[`${type}GridIncrement`];
331
+ const min = type === 'hours' && !props.is24 ? increment : 0;
332
+
333
+ const generatedArray: IDefaultSelect[] = [];
334
+
335
+ for (let i = min; i < max; i += increment) {
336
+ generatedArray.push({ value: props.is24 ? i : getAmPmDiff(i, type), text: i < 10 ? `0${i}` : `${i}` });
337
+ }
338
+
339
+ if (type === 'hours' && !props.is24) {
340
+ generatedArray.unshift({ value: amPm.value === 'PM' ? 12 : 0, text: '12' });
341
+ }
342
+
343
+ return groupListAndMap(generatedArray, (value: IDefaultSelect) => {
344
+ const active = false;
345
+ const disabled =
346
+ defaultedFilters.value.times[type].includes(value.value) ||
347
+ !isDateInRange(value.value, type) ||
348
+ isValueDisabled(type, value.value) ||
349
+ isOverlayValueDisabled(type, value.value);
350
+
351
+ return { active, disabled };
352
+ });
353
+ };
354
+
355
+ const sanitizeMinutesAndSeconds = (val: number) => (val >= 0 ? val : 59);
356
+
357
+ const sanitizeHours = (val: number) => (val >= 0 ? val : 23);
358
+
359
+ const isDateInRange = (val: number, type: TimeType): boolean => {
360
+ const minTime = props.minTime ? setTime(sanitizeTime(props.minTime as TimeModel)) : null;
361
+ const maxTime = props.maxTime ? setTime(sanitizeTime(props.maxTime as TimeModel)) : null;
362
+ const selectedDate = setTime(
363
+ sanitizeTime(
364
+ timeValues.value,
365
+ type,
366
+ type === 'minutes' || type === 'seconds' ? sanitizeMinutesAndSeconds(val) : sanitizeHours(val),
367
+ ),
368
+ );
369
+ if (minTime && maxTime)
370
+ return (
371
+ (isBefore(selectedDate, maxTime) || isEqual(selectedDate, maxTime)) &&
372
+ (isAfter(selectedDate, minTime) || isEqual(selectedDate, minTime))
373
+ );
374
+ if (minTime) return isAfter(selectedDate, minTime) || isEqual(selectedDate, minTime);
375
+ if (maxTime) return isBefore(selectedDate, maxTime) || isEqual(selectedDate, maxTime);
376
+ return true;
377
+ };
378
+
379
+ const checkOverlayDisabled = (type: TimeType): boolean => {
380
+ return props[`no${type[0].toUpperCase() + type.slice(1)}Overlay` as TimeOverlayCheck];
381
+ };
382
+
383
+ const toggleOverlay = (type: TimeType): void => {
384
+ if (!checkOverlayDisabled(type)) {
385
+ overlays[type] = !overlays[type];
386
+ if (!overlays[type]) {
387
+ timeOverlayOpen.value = false;
388
+ emit('overlay-closed', type);
389
+ } else {
390
+ timeOverlayOpen.value = true;
391
+ emit('overlay-opened', type);
392
+ }
393
+ }
394
+ };
395
+
396
+ const getTimeGetter = (type: TimeType) => {
397
+ if (type === 'hours') return getHours;
398
+ if (type === 'minutes') return getMinutes;
399
+ return getSeconds;
400
+ };
401
+
402
+ const clearHold = () => {
403
+ if (holdTimeout.value) {
404
+ clearTimeout(holdTimeout.value);
405
+ }
406
+ };
407
+
408
+ const handleTimeValue = (type: TimeType, inc = true, opts?: { keyboard?: boolean }): void => {
409
+ const addOrSub = inc ? addTime : subTime;
410
+ const inVal = inc ? +props[`${type}Increment`] : -+props[`${type}Increment`];
411
+ const isInRange = isDateInRange(+props[type] + inVal, type);
412
+ if (isInRange) {
413
+ emit(
414
+ `update:${type}`,
415
+ getTimeGetter(type)(addOrSub({ [type]: +props[type] }, { [type]: +props[`${type}Increment`] })),
416
+ );
417
+ }
418
+ if (!opts?.keyboard && defaultedConfig.value.timeArrowHoldThreshold) {
419
+ holdTimeout.value = setTimeout(() => {
420
+ handleTimeValue(type, inc);
421
+ }, defaultedConfig.value.timeArrowHoldThreshold);
422
+ }
423
+ };
424
+
425
+ const convert24ToAmPm = (time: number): number => {
426
+ if (props.is24) {
427
+ return time;
428
+ }
429
+ if (time >= 12) {
430
+ amPm.value = 'PM';
431
+ } else {
432
+ amPm.value = 'AM';
433
+ }
434
+ return hoursToAmPmHours(time);
435
+ };
436
+
437
+ const setAmPm = () => {
438
+ if (amPm.value === 'PM') {
439
+ amPm.value = 'AM';
440
+ emit('update:hours', props.hours - 12);
441
+ } else {
442
+ amPm.value = 'PM';
443
+ emit('update:hours', props.hours + 12);
444
+ }
445
+ emit('am-pm-change', amPm.value);
446
+ };
447
+
448
+ const openChildCmp = (child: TimeType): void => {
449
+ overlays[child] = true;
450
+ };
451
+
452
+ const assignRefs = (el: any, col: number, pos: number): void => {
453
+ if (el && props.arrowNavigation) {
454
+ if (Array.isArray(elementRefs.value[col])) {
455
+ elementRefs.value[col][pos] = el;
456
+ } else {
457
+ elementRefs.value[col] = [el];
458
+ }
459
+ const matrix = elementRefs.value.reduce(
460
+ (col, row) => row.map((_, i) => [...(col[i] || []), row[i]]),
461
+ [] as HTMLElement[][],
462
+ );
463
+ setTimePickerBackRef(props.closeTimePickerBtn);
464
+ if (amPmButton.value) {
465
+ matrix[1] = matrix[1].concat(amPmButton.value);
466
+ }
467
+ setTimePickerElements(matrix, props.order as 0 | 1);
468
+ }
469
+ };
470
+
471
+ const handleTimeFromOverlay = (type: TimeType, value: number): void => {
472
+ toggleOverlay(type);
473
+ return emit(`update:${type}`, value);
474
+ };
475
+
476
+ defineExpose({ openChildCmp });
477
+ </script>