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,259 @@
1
+ @import "components/DatepickerInput";
2
+ @import "components/DatepickerMenu";
3
+ @import "components/Calendar";
4
+ @import "components/MonthYearInput";
5
+ @import "components/SelectionOverlay";
6
+ @import "components/TimeInput";
7
+ @import "components/ActionRow";
8
+ @import "components/QuarterPicker";
9
+ @import "components/shared";
10
+
11
+ :root {
12
+ --dp-common-transition: all 0.1s ease-in;
13
+ --dp-menu-padding: 0;
14
+ --dp-animation-duration: 0.1s;
15
+ --dp-menu-appear-transition-timing: cubic-bezier(.4, 0, 1, 1);
16
+ --dp-transition-timing: ease-out;
17
+ --dp-action-row-transtion: all 0.2s ease-in;
18
+ --dp-font-family: -apple-system, blinkmacsystemfont, "Segoe UI", roboto, oxygen, ubuntu, cantarell, "Open Sans",
19
+ "Helvetica Neue", sans-serif;
20
+ --dp-border-radius: 4px;
21
+ --dp-cell-border-radius: 4px;
22
+ --dp-transition-length: 22px;
23
+ --dp-transition-timing-general: 0.1s;
24
+ --dp-button-height: 35px;
25
+ --dp-month-year-row-height: 22px;
26
+ --dp-month-year-row-button-size: 25px;
27
+ --dp-button-icon-height: 20px;
28
+ --dp-calendar-wrap-padding: 0 5px;
29
+ --dp-cell-size: 32px;
30
+ --dp-cell-padding: 5px;
31
+ --dp-common-padding: 10px;
32
+ --dp-input-icon-padding: 35px;
33
+ --dp-input-padding: 6px 30px 6px 12px;
34
+ --dp-menu-min-width: 260px;
35
+ --dp-action-buttons-padding: 1px 6px;
36
+ --dp-row-margin: 5px 0;
37
+ --dp-calendar-header-cell-padding: 0.5rem;
38
+ --dp-multi-calendars-spacing: 10px;
39
+ --dp-overlay-col-padding: 3px;
40
+ --dp-time-inc-dec-button-size: 32px;
41
+ --dp-font-size: 14px;
42
+ --dp-preview-font-size: 0.8rem;
43
+ --dp-time-font-size: 2rem;
44
+ --dp-action-button-height: 22px;
45
+ --dp-action-row-padding: 8px;
46
+ --dp-direction: ltr;
47
+ }
48
+
49
+ .dp__theme_dark {
50
+ --dp-background-color: var(--bg-float);
51
+ --dp-text-color: var(--tc-secondary);
52
+ --dp-hover-color: var(--bg-opacity);
53
+ --dp-hover-text-color: var(--tc-title);
54
+ --dp-hover-icon-color: #959595;
55
+ --dp-primary-color: var(--persistent-bg-theme);
56
+ --dp-primary-disabled-color: #61a8ea;
57
+ --dp-primary-text-color: var(--persistent-black);
58
+ --dp-secondary-color: var(--tc-quaternary);
59
+ --dp-border-color: #2d2d2d;
60
+ --dp-menu-border-color: #2d2d2d;
61
+ --dp-border-color-hover: #aaaeb7;
62
+ --dp-border-color-focus: #aaaeb7;
63
+ --dp-disabled-color: #737373;
64
+ --dp-disabled-color-text: #d0d0d0;
65
+ --dp-scroll-bar-background: #212121;
66
+ --dp-scroll-bar-color: #484848;
67
+ --dp-success-color: #00701a;
68
+ --dp-success-color-disabled: #428f59;
69
+ --dp-icon-color: var(--tc-tertiary);
70
+ --dp-danger-color: #e53935;
71
+ --dp-marker-color: #e53935;
72
+ --dp-tooltip-color: #3e3e3e;
73
+ --dp-highlight-color: rgb(0 92 178 / 20%);
74
+ --dp-range-between-dates-background-color: var(--dp-hover-color, #484848);
75
+ --dp-range-between-dates-text-color: var(--dp-hover-text-color, #fff);
76
+ --dp-range-between-border-color: transparent;
77
+ --dp-loader: 5px solid #005cb2;
78
+ }
79
+
80
+ .dp__theme_light {
81
+ --dp-background-color: #fff;
82
+ --dp-text-color: #212121;
83
+ --dp-hover-color: #f3f3f3;
84
+ --dp-hover-text-color: #212121;
85
+ --dp-hover-icon-color: #959595;
86
+ --dp-primary-color: var(--persistent-bg-theme);
87
+ --dp-primary-disabled-color: #6bacea;
88
+ --dp-primary-text-color: #fff;
89
+ --dp-secondary-color: var(--tc-quaternary);
90
+ --dp-border-color: #ddd;
91
+ --dp-menu-border-color: #ddd;
92
+ --dp-border-color-hover: #aaaeb7;
93
+ --dp-border-color-focus: #aaaeb7;
94
+ --dp-disabled-color: #f6f6f6;
95
+ --dp-scroll-bar-background: #f3f3f3;
96
+ --dp-scroll-bar-color: #959595;
97
+ --dp-success-color: #76d275;
98
+ --dp-success-color-disabled: #a3d9b1;
99
+ --dp-icon-color: var(--tc-tertiary);;
100
+ --dp-danger-color: #ff6f60;
101
+ --dp-marker-color: #ff6f60;
102
+ --dp-tooltip-color: #fafafa;
103
+ --dp-disabled-color-text: #8e8e8e;
104
+ --dp-highlight-color: rgb(25 118 210 / 10%);
105
+ --dp-range-between-dates-background-color: var(--dp-hover-color, #f3f3f3);
106
+ --dp-range-between-dates-text-color: var(--dp-hover-text-color, #212121);
107
+ --dp-range-between-border-color: transparent;
108
+ --dp-loader: 5px solid #1976d2;
109
+ }
110
+
111
+ .dp__flex {
112
+ display: flex;
113
+ align-items: center;
114
+ }
115
+
116
+ .dp__btn {
117
+ @extend %dp--btn-placeholder;
118
+
119
+ background: none;
120
+ }
121
+
122
+ .dp__main {
123
+ font-family: var(--dp-font-family);
124
+ user-select: none;
125
+ box-sizing: border-box;
126
+ position: relative;
127
+ width: 100%;
128
+ }
129
+
130
+ .dp__main * {
131
+ direction: var(--dp-direction, ltr);
132
+ }
133
+
134
+ .dp__pointer {
135
+ cursor: pointer;
136
+ }
137
+
138
+ // Allow control of color property on icons
139
+ .dp__icon {
140
+ stroke: currentcolor;
141
+ fill: currentcolor;
142
+ }
143
+
144
+ // Div style that is displayed on the bottom of the menu for switching layouts
145
+ .dp__button {
146
+ width: 100%;
147
+ text-align: center;
148
+ color: var(--dp-icon-color);
149
+ cursor: pointer;
150
+ display: flex;
151
+ align-items: center;
152
+ place-content: center center;
153
+ padding: var(--dp-common-padding);
154
+ box-sizing: border-box;
155
+ height: var(--dp-button-height);
156
+
157
+ &.dp__overlay_action {
158
+ position: absolute;
159
+ bottom: 0;
160
+ }
161
+
162
+ &:hover {
163
+ background: var(--dp-hover-color);
164
+ color: var(--dp-hover-icon-color);
165
+ }
166
+
167
+ svg {
168
+ height: var(--dp-button-icon-height);
169
+ width: auto;
170
+ }
171
+ }
172
+
173
+ .dp__button_bottom {
174
+ border-bottom-left-radius: var(--dp-border-radius);
175
+ border-bottom-right-radius: var(--dp-border-radius);
176
+ }
177
+
178
+ .dp__flex_display {
179
+ display: flex;
180
+ }
181
+
182
+ .dp__flex_display_with_input {
183
+ flex-direction: column;
184
+ align-items: flex-start;
185
+ }
186
+
187
+ .dp__relative {
188
+ position: relative;
189
+ }
190
+
191
+ .calendar-next-enter-active,
192
+ .calendar-next-leave-active,
193
+ .calendar-prev-enter-active,
194
+ .calendar-prev-leave-active {
195
+ transition: all var(--dp-transition-timing-general) ease-out;
196
+ }
197
+
198
+ .calendar-next-enter-from {
199
+ opacity: 0;
200
+ transform: translateX(var(--dp-transition-length));
201
+ }
202
+
203
+ .calendar-next-leave-to {
204
+ opacity: 0;
205
+ transform: translateX(calc(var(--dp-transition-length) * -1));
206
+ }
207
+
208
+ .calendar-prev-enter-from {
209
+ opacity: 0;
210
+ transform: translateX(calc(var(--dp-transition-length) * -1));
211
+ }
212
+
213
+ .calendar-prev-leave-to {
214
+ opacity: 0;
215
+ transform: translateX(var(--dp-transition-length));
216
+ }
217
+
218
+ .dp-menu-appear-bottom-enter-active,
219
+ .dp-menu-appear-bottom-leave-active,
220
+ .dp-menu-appear-top-enter-active,
221
+ .dp-menu-appear-top-leave-active,
222
+ .dp-slide-up-enter-active,
223
+ .dp-slide-up-leave-active,
224
+ .dp-slide-down-enter-active,
225
+ .dp-slide-down-leave-active {
226
+ transition: all var(--dp-animation-duration) var(--dp-transition-timing);
227
+ }
228
+
229
+ .dp-menu-appear-top-enter-from,
230
+ .dp-menu-appear-top-leave-to,
231
+ .dp-slide-down-leave-to,
232
+ .dp-slide-up-enter-from {
233
+ opacity: 0;
234
+ transform: translateY(var(--dp-transition-length));
235
+ }
236
+
237
+ .dp-menu-appear-bottom-enter-from,
238
+ .dp-menu-appear-bottom-leave-to,
239
+ .dp-slide-down-enter-from,
240
+ .dp-slide-up-leave-to {
241
+ opacity: 0;
242
+ transform: translateY(calc(var(--dp-transition-length) * -1));
243
+ }
244
+
245
+ .dp--arrow-btn-nav {
246
+ transition: var(--dp-common-transition);
247
+
248
+ svg {
249
+ font-size: 12px !important;
250
+ }
251
+ }
252
+
253
+ .dp--highlighted {
254
+ background-color: var(--dp-highlight-color);
255
+ }
256
+
257
+ .dp--hidden-el {
258
+ visibility: hidden;
259
+ }
@@ -0,0 +1,440 @@
1
+ import {
2
+ parse,
3
+ isDate,
4
+ isValid,
5
+ setHours,
6
+ setMinutes,
7
+ setSeconds,
8
+ setMilliseconds,
9
+ isBefore,
10
+ isEqual,
11
+ isAfter,
12
+ set,
13
+ getHours,
14
+ getMinutes,
15
+ getSeconds,
16
+ getYear,
17
+ getMonth,
18
+ eachDayOfInterval,
19
+ addMonths,
20
+ startOfWeek,
21
+ endOfWeek,
22
+ setMonth,
23
+ setYear,
24
+ subMonths,
25
+ format,
26
+ startOfMonth,
27
+ } from 'date-fns';
28
+ import { errors } from '../utils/util';
29
+
30
+ import type {
31
+ DateTimeSetter,
32
+ DateValue,
33
+ TimeModel,
34
+ TimeType,
35
+ TimeObj,
36
+ PossibleDate,
37
+ WeekStartNum,
38
+ IFormat,
39
+ Highlight,
40
+ HighlightFn,
41
+ MaybeDate,
42
+ } from '../interfaces';
43
+
44
+ import type { Duration, Locale } from 'date-fns';
45
+
46
+ const parseTextToDate = (
47
+ value: string,
48
+ pattern: string,
49
+ time: TimeModel,
50
+ inputVal?: string,
51
+ onPaste?: boolean,
52
+ locale?: Locale,
53
+ ): Date | null => {
54
+ const parsedDate = parse(value, pattern.slice(0, value.length), new Date(), { locale });
55
+ if (isValid(parsedDate) && isDate(parsedDate)) {
56
+ if (inputVal || onPaste) return parsedDate;
57
+ return set(parsedDate, {
58
+ hours: +time.hours,
59
+ minutes: +time?.minutes,
60
+ seconds: +time?.seconds,
61
+ milliseconds: 0,
62
+ });
63
+ }
64
+ return null;
65
+ };
66
+
67
+ export const parseFreeInput = (
68
+ value: string,
69
+ pattern: string | string[] | ((value: string) => Date | null),
70
+ time: TimeModel | TimeModel[],
71
+ inputVal?: string,
72
+ onPaste?: boolean,
73
+ locale?: Locale,
74
+ ): Date | null => {
75
+ const defaultTime = Array.isArray(time) ? time[0] : time;
76
+ if (typeof pattern === 'string') {
77
+ return parseTextToDate(value, pattern, defaultTime, inputVal, onPaste, locale);
78
+ }
79
+
80
+ if (Array.isArray(pattern)) {
81
+ let parsedDate = null;
82
+ for (const textVal of pattern) {
83
+ parsedDate = parseTextToDate(value, textVal, defaultTime, inputVal, onPaste, locale);
84
+ if (parsedDate) {
85
+ break;
86
+ }
87
+ }
88
+ return parsedDate;
89
+ }
90
+
91
+ if (typeof pattern === 'function') {
92
+ return pattern(value);
93
+ }
94
+
95
+ return null;
96
+ };
97
+
98
+ export const getDate = (value?: PossibleDate) => (value ? new Date(value) : new Date());
99
+
100
+ export const dateToUtc = (date: Date, preserve: boolean, enableSeconds: boolean) => {
101
+ if (preserve) {
102
+ const month = (date.getMonth() + 1).toString().padStart(2, '0');
103
+ const day = date.getDate().toString().padStart(2, '0');
104
+ const hours = date.getHours().toString().padStart(2, '0');
105
+ const minutes = date.getMinutes().toString().padStart(2, '0');
106
+ const seconds = enableSeconds ? date.getSeconds().toString().padStart(2, '0') : '00';
107
+
108
+ return `${date.getFullYear()}-${month}-${day}T${hours}:${minutes}:${seconds}.000Z`;
109
+ }
110
+ const utcDate = Date.UTC(
111
+ date.getUTCFullYear(),
112
+ date.getUTCMonth(),
113
+ date.getUTCDate(),
114
+ date.getUTCHours(),
115
+ date.getUTCMinutes(),
116
+ date.getUTCSeconds(),
117
+ );
118
+
119
+ return new Date(utcDate).toISOString();
120
+ };
121
+
122
+ // Reset date time
123
+ export const resetDateTime = (value: Date | string, beginning?: boolean): Date => {
124
+ const dateParse = getDate(JSON.parse(JSON.stringify(value)));
125
+ const timeReset = set(dateParse, { hours: 0, minutes: 0, seconds: 0, milliseconds: 0 });
126
+ return beginning ? startOfMonth(timeReset) : timeReset;
127
+ };
128
+
129
+ export const setDateTime = (
130
+ date: Date | null,
131
+ hours?: DateTimeSetter,
132
+ minutes?: DateTimeSetter,
133
+ seconds?: DateTimeSetter,
134
+ ): Date => {
135
+ let dateCopy = date ? getDate(date) : getDate();
136
+ if (hours || hours === 0) {
137
+ dateCopy = setHours(dateCopy, +hours);
138
+ }
139
+ if (minutes || minutes === 0) {
140
+ dateCopy = setMinutes(dateCopy, +minutes);
141
+ }
142
+ if (seconds || seconds === 0) {
143
+ dateCopy = setSeconds(dateCopy, +seconds);
144
+ }
145
+ return setMilliseconds(dateCopy, 0);
146
+ };
147
+
148
+ export const isDateBefore = (date: DateValue, dateToCompare: DateValue): boolean => {
149
+ if (!date || !dateToCompare) {
150
+ return false;
151
+ }
152
+ return isBefore(resetDateTime(date), resetDateTime(dateToCompare));
153
+ };
154
+
155
+ export const isDateEqual = (date: DateValue, dateToCompare: DateValue): boolean => {
156
+ if (!date || !dateToCompare) {
157
+ return false;
158
+ }
159
+ return isEqual(resetDateTime(date), resetDateTime(dateToCompare));
160
+ };
161
+
162
+ export const isDateAfter = (date: DateValue, dateToCompare: DateValue): boolean => {
163
+ if (!date || !dateToCompare) {
164
+ return false;
165
+ }
166
+ return isAfter(resetDateTime(date), resetDateTime(dateToCompare));
167
+ };
168
+
169
+ export const isDateBetween = (range: Date[], hoverDate: Date | null, dateToCheck: Date): boolean => {
170
+ if (range?.[0] && range?.[1]) {
171
+ return isDateAfter(dateToCheck, range[0]) && isDateBefore(dateToCheck, range[1]);
172
+ }
173
+ if (range?.[0] && hoverDate) {
174
+ return (
175
+ (isDateAfter(dateToCheck, range[0]) && isDateBefore(dateToCheck, hoverDate)) ||
176
+ (isDateBefore(dateToCheck, range[0]) && isDateAfter(dateToCheck, hoverDate))
177
+ );
178
+ }
179
+ return false;
180
+ };
181
+
182
+ export const resetDate = (date: Date | string): Date => {
183
+ const onFirst = set(new Date(date), { date: 1 });
184
+ return resetDateTime(onFirst);
185
+ };
186
+
187
+ export const sanitizeTime = (time: TimeModel, type?: TimeType, value?: number): Duration => {
188
+ if (type && (value || value === 0)) {
189
+ return Object.fromEntries(
190
+ (['hours', 'minutes', 'seconds'] as TimeType[]).map((timeType) => {
191
+ if (timeType === type) return [timeType, value];
192
+ return [timeType, !isNaN(+time[timeType]) ? +time[timeType] : undefined];
193
+ }),
194
+ );
195
+ }
196
+ return {
197
+ hours: !isNaN(+time.hours) ? +time.hours : undefined,
198
+ minutes: !isNaN(+time.minutes) ? +time.minutes : undefined,
199
+ seconds: !isNaN(+time.seconds) ? +time.seconds : undefined,
200
+ };
201
+ };
202
+
203
+ export const getTimeObj = (date: Date): TimeObj => {
204
+ return {
205
+ hours: getHours(date),
206
+ minutes: getMinutes(date),
207
+ seconds: getSeconds(date),
208
+ };
209
+ };
210
+
211
+ export const getMinMonth = (year: number, minDate?: PossibleDate) => {
212
+ if (minDate) {
213
+ const minYear = getYear(getDate(minDate));
214
+ if (minYear > year) return 12;
215
+ if (minYear === year) return getMonth(getDate(minDate));
216
+ }
217
+ };
218
+
219
+ export const getMaxMonth = (year: number, maxDate?: PossibleDate) => {
220
+ if (maxDate) {
221
+ const maxYear = getYear(getDate(maxDate));
222
+ if (maxYear < year) return -1;
223
+ if (maxYear === year) return getMonth(getDate(maxDate));
224
+ return undefined;
225
+ }
226
+ return undefined;
227
+ };
228
+
229
+ export const getMinMaxYear = (minMaxDate: PossibleDate) => {
230
+ if (minMaxDate) return getYear(getDate(minMaxDate));
231
+ return undefined;
232
+ };
233
+
234
+ export const getDaysInBetween = (dateOne: Date, dateTwo: Date) => {
235
+ // Check if selection is backwards
236
+ const start = isDateAfter(dateOne, dateTwo) ? dateTwo : dateOne;
237
+ const end = isDateAfter(dateTwo, dateOne) ? dateTwo : dateOne;
238
+ return eachDayOfInterval({ start, end });
239
+ };
240
+
241
+ // Add one month to a given date
242
+ export const getNextMonthYear = (date: Date): { month: number; year: number } => {
243
+ const newDate = addMonths(date, 1);
244
+ return { month: getMonth(newDate), year: getYear(newDate) };
245
+ };
246
+
247
+ export const getWeekFromDate = (date: Date, weekStart: string | number): [Date, Date] => {
248
+ const start = startOfWeek(date, { weekStartsOn: +weekStart as WeekStartNum });
249
+ const end = endOfWeek(date, { weekStartsOn: +weekStart as WeekStartNum });
250
+ return [start, end];
251
+ };
252
+
253
+ export const assignDefaultTime = (
254
+ obj: TimeModel | Record<string, string | number>,
255
+ enableSeconds: boolean,
256
+ ): TimeModel => {
257
+ const defaultTime = {
258
+ hours: getHours(getDate()),
259
+ minutes: getMinutes(getDate()),
260
+ seconds: enableSeconds ? getSeconds(getDate()) : 0,
261
+ };
262
+ return Object.assign(defaultTime, obj);
263
+ };
264
+
265
+ export const getDateForCompare = (date: MaybeDate, month: number, year: number): [Date, Date] => {
266
+ return [set(getDate(date), { date: 1 }), set(getDate(), { month, year, date: 1 })];
267
+ };
268
+
269
+ export const setDateMonthOrYear = (date: DateValue, month?: number | null, year?: number | null): Date => {
270
+ let dateCopy = date ? getDate(date) : getDate();
271
+ if (month || month === 0) {
272
+ dateCopy = setMonth(dateCopy, month);
273
+ }
274
+ if (year) {
275
+ dateCopy = setYear(dateCopy, year);
276
+ }
277
+ return dateCopy;
278
+ };
279
+
280
+ export const validateMonthYear = (
281
+ date: Date,
282
+ maxDate: DateValue,
283
+ minDate: DateValue,
284
+ preventMinMaxNavigation: boolean,
285
+ next: boolean,
286
+ ) => {
287
+ if (!preventMinMaxNavigation) return false;
288
+ if (next && !maxDate) return false;
289
+ if (!next && !minDate) return false;
290
+ const compareDate = next ? addMonths(date, 1) : subMonths(date, 1);
291
+ const monthYear: [number, number] = [getMonth(compareDate), getYear(compareDate)];
292
+ return next ? !validateMaxDate(...monthYear, maxDate as Date) : !validateMinDate(...monthYear, minDate as Date);
293
+ };
294
+
295
+ export const validateMinDate = (month: number, year: number, minDate: Date): boolean => {
296
+ return (
297
+ isDateBefore(...getDateForCompare(minDate, month, year)) ||
298
+ isDateEqual(...getDateForCompare(minDate, month, year))
299
+ );
300
+ };
301
+
302
+ export const validateMaxDate = (month: number, year: number, maxDate: Date): boolean => {
303
+ return (
304
+ isDateAfter(...getDateForCompare(maxDate, month, year)) ||
305
+ isDateEqual(...getDateForCompare(maxDate, month, year))
306
+ );
307
+ };
308
+
309
+ export const formatDate = (
310
+ value: Date | Date[],
311
+ formatProp: IFormat | null,
312
+ formatLocale: Locale | null,
313
+ rangeSeparator: string,
314
+ modelAuto: boolean,
315
+ pattern: string,
316
+ parser?: boolean,
317
+ ) => {
318
+ if (typeof formatProp === 'function' && !parser) return formatProp(value);
319
+ const options = formatLocale ? { locale: formatLocale } : undefined;
320
+ if (Array.isArray(value)) {
321
+ let result = ''
322
+ if (isValidDate(value[0])) {
323
+ result += `${format(value[0], pattern, options)}`
324
+ }
325
+ result += `${modelAuto && !value[1] ? '' : rangeSeparator}`
326
+ if (isValidDate(value[1])) {
327
+ result += `${format(value[1], pattern, options)}`
328
+ }
329
+ return result
330
+ // return `${format(value[0], pattern, options)}${modelAuto && !value[1] ? '' : rangeSeparator}${
331
+ // value[1] ? format(value[1], pattern, options) : ''
332
+ // }`;
333
+ }
334
+
335
+ return format(value, pattern, options);
336
+ };
337
+
338
+ export const checkPartialRangeValue = (isPartial: boolean): Date => {
339
+ if (isPartial) return null as unknown as Date;
340
+ throw new Error(errors.prop('partial-range'));
341
+ };
342
+
343
+ // Execute some code depending on the range prop, if not, throw error
344
+ export const checkRangeEnabled = <T>(fn: () => T, range: boolean): T => {
345
+ if (range) return fn();
346
+ throw new Error(errors.prop('range'));
347
+ };
348
+
349
+ export const isValidDate = (value: Date | Date[] | null | (Date | null)[]): boolean => {
350
+ if (Array.isArray(value)) {
351
+ return isValid(value[0]) || (value[1] ? isValid(value[1]) : true);
352
+ }
353
+ return value ? isValid(value) : false;
354
+ };
355
+
356
+ export const setDateTimeFromObj = (time: TimeModel, date?: Date | null) => {
357
+ return set(date ?? getDate(), {
358
+ hours: +time.hours || 0,
359
+ minutes: +time.minutes || 0,
360
+ seconds: +time.seconds || 0,
361
+ });
362
+ };
363
+
364
+ /**
365
+ * Depending on the time or full date validation, validate if the selected time is valid
366
+ * Extracted logic from isValidTime fn
367
+ */
368
+ export const validateTime = (
369
+ date: Date | null,
370
+ dateToCompare: Date,
371
+ compare: 'max' | 'min',
372
+ full: boolean,
373
+ ): boolean => {
374
+ if (!date) return true;
375
+ if (full) {
376
+ const valid = compare === 'max' ? isBefore(date, dateToCompare) : isAfter(date, dateToCompare);
377
+ const setOptions = { seconds: 0, milliseconds: 0 };
378
+ return valid || isEqual(set(date, setOptions), set(dateToCompare, setOptions));
379
+ }
380
+ return compare === 'max' ? date.getTime() <= dateToCompare.getTime() : date.getTime() >= dateToCompare.getTime();
381
+ };
382
+
383
+ const getDateForCompareValidation = (
384
+ minOrMax: TimeModel | null,
385
+ selected: Date,
386
+ minOrMaxDate: Date | string | null,
387
+ ) => {
388
+ return minOrMax ? setDateTimeFromObj(minOrMax, selected) : getDate(minOrMaxDate ?? selected);
389
+ };
390
+
391
+ export const checkTimeMinMax = (
392
+ minOrMax: TimeModel | null,
393
+ dateCompare: Date | string | null,
394
+ map: 'min' | 'max',
395
+ selectedDateTime: Date | Date[],
396
+ isValid: boolean,
397
+ ) => {
398
+ if (Array.isArray(selectedDateTime)) {
399
+ const dateOne = getDateForCompareValidation(minOrMax, selectedDateTime[0], dateCompare);
400
+ const dateTwo = getDateForCompareValidation(minOrMax, selectedDateTime[1], dateCompare);
401
+ return (
402
+ validateTime(selectedDateTime[0], dateOne, map, !!dateCompare) &&
403
+ validateTime(selectedDateTime[1], dateTwo, map, !!dateCompare) &&
404
+ isValid
405
+ );
406
+ }
407
+ const date = getDateForCompareValidation(minOrMax, selectedDateTime, dateCompare);
408
+ return validateTime(selectedDateTime, date, map, !!dateCompare) && isValid;
409
+ };
410
+
411
+ // Returns a getDate object with a set of time from a provided date
412
+ export const setTimeValue = (date: Date): Date => set(getDate(), getTimeObj(date));
413
+
414
+ export const getDisabledMonths = (
415
+ disabledDates: Map<string, Date | null> | null | ((date: Date) => boolean),
416
+ year: number,
417
+ ) => {
418
+ if (disabledDates instanceof Map) {
419
+ return Array.from(disabledDates.values())
420
+ .filter((date) => getYear(getDate(date)) === year)
421
+ .map((date) => getMonth(date as Date));
422
+ }
423
+ return [];
424
+ };
425
+
426
+ export const checkHighlightMonth = (defaultedHighlight: Highlight | HighlightFn, month: number, year: number) => {
427
+ return typeof defaultedHighlight === 'function'
428
+ ? defaultedHighlight({ month: month, year })
429
+ : !!defaultedHighlight.months.find((value) => value.month === month && value.year === year);
430
+ };
431
+
432
+ export const checkHighlightYear = (defaultedHighlight: Highlight | HighlightFn, year: number) => {
433
+ return typeof defaultedHighlight === 'function'
434
+ ? defaultedHighlight(year)
435
+ : defaultedHighlight.years.includes(year);
436
+ };
437
+
438
+ export const getCellId = (date: Date) => {
439
+ return format(date, 'yyyy-MM-dd');
440
+ };