@clickhouse/click-ui 0.2.0-test.0 → 0.2.0
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.
- package/README.md +67 -0
- package/dist/cjs/click-ui.css +3861 -0
- package/dist/cjs/components/Assets/Flags/Mexico.cjs +469 -0
- package/dist/cjs/components/Assets/Flags/Mexico.cjs.map +1 -0
- package/dist/cjs/components/Assets/Flags/system/FlagsDark.cjs +2 -0
- package/dist/cjs/components/Assets/Flags/system/FlagsDark.cjs.map +1 -1
- package/dist/cjs/components/Assets/Flags/system/FlagsLight.cjs +2 -0
- package/dist/cjs/components/Assets/Flags/system/FlagsLight.cjs.map +1 -1
- package/dist/cjs/components/Assets/Icons/Collapse-All.cjs +13 -0
- package/dist/cjs/components/Assets/Icons/Collapse-All.cjs.map +1 -0
- package/dist/cjs/components/Assets/Icons/Expand-All.cjs +13 -0
- package/dist/cjs/components/Assets/Icons/Expand-All.cjs.map +1 -0
- package/dist/cjs/components/Assets/Icons/system/IconsLight.cjs +4 -0
- package/dist/cjs/components/Assets/Icons/system/IconsLight.cjs.map +1 -1
- package/dist/cjs/components/Button/Button.css +261 -0
- package/dist/cjs/components/Button/Button.module.css.cjs +38 -0
- package/dist/cjs/components/Button/Button.module.css.cjs.map +1 -0
- package/dist/cjs/components/Button/index.cjs +42 -126
- package/dist/cjs/components/Button/index.cjs.map +1 -1
- package/dist/cjs/components/ButtonGroup/index.cjs +1 -1
- package/dist/cjs/components/ButtonGroup/index.cjs.map +1 -1
- package/dist/cjs/components/DatePicker/Common.cjs +100 -73
- package/dist/cjs/components/DatePicker/Common.cjs.map +1 -1
- package/dist/cjs/components/DatePicker/DateRangePicker.cjs +24 -24
- package/dist/cjs/components/DatePicker/DateRangePicker.cjs.map +1 -1
- package/dist/cjs/components/DatePicker/DateTimeRangePicker.cjs +96 -50
- package/dist/cjs/components/DatePicker/DateTimeRangePicker.cjs.map +1 -1
- package/dist/cjs/components/DatePicker/index.cjs +33 -18
- package/dist/cjs/components/DatePicker/index.cjs.map +1 -1
- package/dist/cjs/components/DatePicker/utils.cjs +42 -14
- package/dist/cjs/components/DatePicker/utils.cjs.map +1 -1
- package/dist/cjs/components/Dialog/index.cjs +10 -1
- package/dist/cjs/components/Dialog/index.cjs.map +1 -1
- package/dist/cjs/components/GenericMenu/index.cjs +1 -1
- package/dist/cjs/components/GenericMenu/index.cjs.map +1 -1
- package/dist/cjs/components/InputWrapper/index.cjs +1 -1
- package/dist/cjs/components/InputWrapper/index.cjs.map +1 -1
- package/dist/cjs/components/NumberField/index.cjs +15 -2
- package/dist/cjs/components/NumberField/index.cjs.map +1 -1
- package/dist/cjs/lib/cva.cjs +15 -0
- package/dist/cjs/lib/cva.cjs.map +1 -0
- package/dist/cjs/providers/ThemeProvider.cjs +4 -0
- package/dist/cjs/providers/ThemeProvider.cjs.map +1 -1
- package/dist/cjs/theme/styles/tokens-dark.css +1806 -0
- package/dist/cjs/theme/styles/tokens-light.css +1795 -0
- package/dist/cjs/theme/theme.config.json.cjs +12 -0
- package/dist/cjs/theme/theme.config.json.cjs.map +1 -0
- package/dist/cjs/theme/tokens/variables.dark.cjs +2 -4
- package/dist/cjs/theme/tokens/variables.dark.cjs.map +1 -1
- package/dist/cjs/theme/tokens/variables.light.cjs +1 -6
- package/dist/cjs/theme/tokens/variables.light.cjs.map +1 -1
- package/dist/cjs/utils/localStorage.cjs +3 -1
- package/dist/cjs/utils/localStorage.cjs.map +1 -1
- package/dist/esm/click-ui.css +3861 -0
- package/dist/esm/components/Assets/Flags/Mexico.js +465 -0
- package/dist/esm/components/Assets/Flags/Mexico.js.map +1 -0
- package/dist/esm/components/Assets/Flags/system/FlagsDark.js +2 -0
- package/dist/esm/components/Assets/Flags/system/FlagsDark.js.map +1 -1
- package/dist/esm/components/Assets/Flags/system/FlagsLight.js +2 -0
- package/dist/esm/components/Assets/Flags/system/FlagsLight.js.map +1 -1
- package/dist/esm/components/Assets/Icons/Collapse-All.js +9 -0
- package/dist/esm/components/Assets/Icons/Collapse-All.js.map +1 -0
- package/dist/esm/components/Assets/Icons/Expand-All.js +9 -0
- package/dist/esm/components/Assets/Icons/Expand-All.js.map +1 -0
- package/dist/esm/components/Assets/Icons/system/IconsLight.js +4 -0
- package/dist/esm/components/Assets/Icons/system/IconsLight.js.map +1 -1
- package/dist/esm/components/Button/Button.css +261 -0
- package/dist/esm/components/Button/Button.module.css.js +25 -0
- package/dist/esm/components/Button/Button.module.css.js.map +1 -0
- package/dist/esm/components/Button/index.js +42 -126
- package/dist/esm/components/Button/index.js.map +1 -1
- package/dist/esm/components/ButtonGroup/index.js +1 -1
- package/dist/esm/components/ButtonGroup/index.js.map +1 -1
- package/dist/esm/components/DatePicker/Common.js +101 -74
- package/dist/esm/components/DatePicker/Common.js.map +1 -1
- package/dist/esm/components/DatePicker/DateRangePicker.js +25 -25
- package/dist/esm/components/DatePicker/DateRangePicker.js.map +1 -1
- package/dist/esm/components/DatePicker/DateTimeRangePicker.js +97 -51
- package/dist/esm/components/DatePicker/DateTimeRangePicker.js.map +1 -1
- package/dist/esm/components/DatePicker/index.js +34 -19
- package/dist/esm/components/DatePicker/index.js.map +1 -1
- package/dist/esm/components/DatePicker/utils.js +36 -10
- package/dist/esm/components/DatePicker/utils.js.map +1 -1
- package/dist/esm/components/Dialog/index.js +10 -1
- package/dist/esm/components/Dialog/index.js.map +1 -1
- package/dist/esm/components/GenericMenu/index.js +1 -1
- package/dist/esm/components/GenericMenu/index.js.map +1 -1
- package/dist/esm/components/InputWrapper/index.js +1 -1
- package/dist/esm/components/InputWrapper/index.js.map +1 -1
- package/dist/esm/components/NumberField/index.js +17 -4
- package/dist/esm/components/NumberField/index.js.map +1 -1
- package/dist/esm/lib/cva.js +7 -0
- package/dist/esm/lib/cva.js.map +1 -0
- package/dist/esm/providers/ThemeProvider.js +4 -0
- package/dist/esm/providers/ThemeProvider.js.map +1 -1
- package/dist/esm/theme/styles/tokens-dark.css +1806 -0
- package/dist/esm/theme/styles/tokens-light.css +1795 -0
- package/dist/esm/theme/theme.config.json.js +7 -0
- package/dist/esm/theme/theme.config.json.js.map +1 -0
- package/dist/esm/theme/tokens/variables.dark.js +2 -4
- package/dist/esm/theme/tokens/variables.dark.js.map +1 -1
- package/dist/esm/theme/tokens/variables.light.js +1 -6
- package/dist/esm/theme/tokens/variables.light.js.map +1 -1
- package/dist/esm/utils/localStorage.js +3 -1
- package/dist/esm/utils/localStorage.js.map +1 -1
- package/dist/types/components/Assets/Flags/Mexico.d.ts +3 -0
- package/dist/types/components/Assets/Flags/system/types.d.ts +1 -1
- package/dist/types/components/Assets/Icons/Collapse-All.d.ts +3 -0
- package/dist/types/components/Assets/Icons/Expand-All.d.ts +3 -0
- package/dist/types/components/Assets/Icons/system/types.d.ts +1 -1
- package/dist/types/components/Button/Button.d.ts +25 -2
- package/dist/types/components/DatePicker/Common.d.ts +9 -4
- package/dist/types/components/DatePicker/DatePicker.d.ts +11 -2
- package/dist/types/components/DatePicker/DateRangePicker.d.ts +3 -2
- package/dist/types/components/DatePicker/DateTimeRangePicker.d.ts +7 -3
- package/dist/types/components/DatePicker/index.d.ts +3 -2
- package/dist/types/components/DatePicker/utils.d.ts +10 -8
- package/dist/types/components/Dialog/Dialog.d.ts +1 -1
- package/dist/types/components/Dialog/Dialog.types.d.ts +1 -0
- package/dist/types/components/NumberField/NumberField.d.ts +5 -1
- package/dist/types/index.d.ts +1 -1
- package/dist/types/lib/cva.d.ts +3 -0
- package/dist/types/theme/theme.config.json.d.ts +6 -0
- package/dist/types/theme/theme.core.d.ts +0 -7
- package/dist/types/theme/tokens/variables.dark.d.ts +0 -2
- package/dist/types/theme/tokens/variables.light.d.ts +0 -5
- package/dist/types/utils/dom.d.ts +1 -1
- package/dist/types/utils/localStorage.d.ts +1 -1
- package/package.json +26 -10
- package/dist/types/components/DatePicker/DatePicker.types.d.ts +0 -8
|
@@ -7,7 +7,7 @@ import { DateTimeRangePickerInput, StyledDropdownItem, CalendarRenderer, DateTab
|
|
|
7
7
|
import { Container } from '../Container/index.js';
|
|
8
8
|
import { Panel } from '../Panel/index.js';
|
|
9
9
|
import { Icon as SvgImage } from '../Icon/index.js';
|
|
10
|
-
import { datesAreWithinMaxRange } from './utils.js';
|
|
10
|
+
import { shiftToTimezone, datesAreWithinMaxRange, shiftFromTimezone } from './utils.js';
|
|
11
11
|
import '../../utils/date.js';
|
|
12
12
|
import { Tabs } from '../Tabs/index.js';
|
|
13
13
|
import { ButtonGroup } from '../ButtonGroup/index.js';
|
|
@@ -26,7 +26,9 @@ const PredefinedTimesContainer = styled(Container).withConfig({
|
|
|
26
26
|
})(["width:", ";"], calendarFullWidth);
|
|
27
27
|
const CalendarRendererContainer = styled.div.withConfig({
|
|
28
28
|
componentId: "sc-vcr4us-2"
|
|
29
|
-
})(["border:", ";border-radius:", ";box-shadow:lch(6.77 0 0 / 0.15) 4px 4px 6px -1px,lch(6.77 0 0 / 0.15) 2px 2px 4px -1px;", " position:absolute;top:0;"], ({
|
|
29
|
+
})(["background:", ";border:", ";border-radius:", ";box-shadow:lch(6.77 0 0 / 0.15) 4px 4px 6px -1px,lch(6.77 0 0 / 0.15) 2px 2px 4px -1px;", " position:absolute;top:0;"], ({
|
|
30
|
+
theme
|
|
31
|
+
}) => `${theme.click.datePicker.dateOption.color.background.default}`, ({
|
|
30
32
|
theme
|
|
31
33
|
}) => `${theme.click.datePicker.dateOption.stroke} solid ${theme.click.datePicker.dateOption.color.background.range}`, ({
|
|
32
34
|
theme
|
|
@@ -67,9 +69,13 @@ const Calendar = ({
|
|
|
67
69
|
maxRangeLength,
|
|
68
70
|
setSelectedDate,
|
|
69
71
|
startDate,
|
|
70
|
-
endDate
|
|
72
|
+
endDate,
|
|
73
|
+
timezone
|
|
71
74
|
}) => {
|
|
72
75
|
const [hoveredDate, setHoveredDate] = useState();
|
|
76
|
+
const today = shiftToTimezone(/* @__PURE__ */ new Date(), timezone);
|
|
77
|
+
const shiftedStart = startDate ? shiftToTimezone(startDate, timezone) : void 0;
|
|
78
|
+
const shiftedEnd = endDate ? shiftToTimezone(endDate, timezone) : void 0;
|
|
73
79
|
const handleMouseOut = () => {
|
|
74
80
|
setHoveredDate(void 0);
|
|
75
81
|
};
|
|
@@ -83,10 +89,9 @@ const Calendar = ({
|
|
|
83
89
|
key: dayKey,
|
|
84
90
|
value: fullDate
|
|
85
91
|
}) => {
|
|
86
|
-
const isSelected =
|
|
87
|
-
const today = /* @__PURE__ */ new Date();
|
|
92
|
+
const isSelected = shiftedStart && isSameDate(shiftedStart, fullDate) || shiftedEnd && isSameDate(shiftedEnd, fullDate);
|
|
88
93
|
const isCurrentDate = isSameDate(today, fullDate);
|
|
89
|
-
const isBetweenStartAndEndDates = Boolean(
|
|
94
|
+
const isBetweenStartAndEndDates = Boolean(shiftedStart && shiftedEnd && fullDate > shiftedStart && fullDate < shiftedEnd);
|
|
90
95
|
let isDisabled = false;
|
|
91
96
|
if (futureDatesDisabled && fullDate > today) {
|
|
92
97
|
isDisabled = true;
|
|
@@ -94,17 +99,17 @@ const Calendar = ({
|
|
|
94
99
|
if (futureStartDatesDisabled && calendarType === "startDate" && fullDate > today) {
|
|
95
100
|
isDisabled = true;
|
|
96
101
|
}
|
|
97
|
-
if (maxRangeLength > 1 &&
|
|
102
|
+
if (maxRangeLength > 1 && shiftedStart && !datesAreWithinMaxRange(shiftedStart, fullDate, maxRangeLength)) {
|
|
98
103
|
isDisabled = true;
|
|
99
104
|
}
|
|
100
|
-
if (calendarType === "endDate" &&
|
|
105
|
+
if (calendarType === "endDate" && !shiftedEnd && shiftedStart && shiftedStart > fullDate && !isSameDate(shiftedStart, fullDate)) {
|
|
101
106
|
isDisabled = true;
|
|
102
107
|
}
|
|
103
|
-
if (calendarType === "startDate" && !
|
|
108
|
+
if (calendarType === "startDate" && !shiftedStart && shiftedEnd && fullDate > shiftedEnd) {
|
|
104
109
|
isDisabled = true;
|
|
105
110
|
}
|
|
106
|
-
const startDateSelectedAndIsSelectingEndDate = calendarType === "endDate" && !
|
|
107
|
-
const endDateSelectedAndIsSelectingStartDate = calendarType === "startDate" && !
|
|
111
|
+
const startDateSelectedAndIsSelectingEndDate = calendarType === "endDate" && !shiftedEnd && Boolean(shiftedStart && hoveredDate && fullDate > shiftedStart && fullDate < hoveredDate);
|
|
112
|
+
const endDateSelectedAndIsSelectingStartDate = calendarType === "startDate" && !shiftedStart && Boolean(shiftedEnd && hoveredDate && fullDate < shiftedEnd && fullDate > hoveredDate);
|
|
108
113
|
const shouldShowRangeIndicator = startDateSelectedAndIsSelectingEndDate || endDateSelectedAndIsSelectingStartDate;
|
|
109
114
|
const handleMouseEnter = () => {
|
|
110
115
|
setHoveredDate(fullDate);
|
|
@@ -113,17 +118,30 @@ const Calendar = ({
|
|
|
113
118
|
if (isDisabled) {
|
|
114
119
|
return false;
|
|
115
120
|
}
|
|
121
|
+
const originalFullDate = shiftFromTimezone(fullDate, timezone);
|
|
116
122
|
if (calendarType === "startDate" && startDate) {
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
123
|
+
if (timezone === "UTC") {
|
|
124
|
+
originalFullDate.setUTCHours(startDate.getUTCHours());
|
|
125
|
+
originalFullDate.setUTCMinutes(startDate.getUTCMinutes());
|
|
126
|
+
originalFullDate.setUTCSeconds(startDate.getUTCSeconds());
|
|
127
|
+
} else {
|
|
128
|
+
originalFullDate.setHours(startDate.getHours());
|
|
129
|
+
originalFullDate.setMinutes(startDate.getMinutes());
|
|
130
|
+
originalFullDate.setSeconds(startDate.getSeconds());
|
|
131
|
+
}
|
|
120
132
|
}
|
|
121
133
|
if (calendarType === "endDate" && endDate) {
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
134
|
+
if (timezone === "UTC") {
|
|
135
|
+
originalFullDate.setUTCHours(endDate.getUTCHours());
|
|
136
|
+
originalFullDate.setUTCMinutes(endDate.getUTCMinutes());
|
|
137
|
+
originalFullDate.setUTCSeconds(endDate.getUTCSeconds());
|
|
138
|
+
} else {
|
|
139
|
+
originalFullDate.setHours(endDate.getHours());
|
|
140
|
+
originalFullDate.setMinutes(endDate.getMinutes());
|
|
141
|
+
originalFullDate.setSeconds(endDate.getSeconds());
|
|
142
|
+
}
|
|
125
143
|
}
|
|
126
|
-
setSelectedDate(
|
|
144
|
+
setSelectedDate(originalFullDate, calendarType);
|
|
127
145
|
};
|
|
128
146
|
return /* @__PURE__ */ jsx(DateRangeTableCell, { $shouldShowRangeIndicator: shouldShowRangeIndicator || isBetweenStartAndEndDates, $isCurrentMonth: isCurrentMonth, $isDisabled: isDisabled, $isSelected: isSelected, $isPresent: isCurrentDate, onClick: handleClick, onMouseEnter: handleMouseEnter, onMouseLeave: handleMouseOut, children: date }, dayKey);
|
|
129
147
|
}) }, weekKey);
|
|
@@ -223,11 +241,6 @@ const parseTimeString = (timeString) => {
|
|
|
223
241
|
isValid: false
|
|
224
242
|
};
|
|
225
243
|
}
|
|
226
|
-
if (!parsedDate.isValid()) {
|
|
227
|
-
return {
|
|
228
|
-
isValid: false
|
|
229
|
-
};
|
|
230
|
-
}
|
|
231
244
|
return {
|
|
232
245
|
isValid: true,
|
|
233
246
|
parsedDate
|
|
@@ -237,9 +250,10 @@ const validTimeRegex = /^\d{1,2}(:\d{1,2}(:\d{1,2})?)?$/;
|
|
|
237
250
|
const TimeInput = ({
|
|
238
251
|
date,
|
|
239
252
|
setDate,
|
|
240
|
-
shouldShowSeconds
|
|
253
|
+
shouldShowSeconds,
|
|
254
|
+
timezone
|
|
241
255
|
}) => {
|
|
242
|
-
let dayjsDate = dayjs(date);
|
|
256
|
+
let dayjsDate = timezone === "UTC" ? dayjs.utc(date) : dayjs(date);
|
|
243
257
|
if (!date) {
|
|
244
258
|
dayjsDate = dayjsDate.hour(12).minute(0);
|
|
245
259
|
}
|
|
@@ -329,7 +343,7 @@ const TimeInput = ({
|
|
|
329
343
|
] });
|
|
330
344
|
};
|
|
331
345
|
const TabbedCalendar = ({
|
|
332
|
-
|
|
346
|
+
defaultActiveTab = "startDate",
|
|
333
347
|
endDate,
|
|
334
348
|
futureDatesDisabled,
|
|
335
349
|
futureStartDatesDisabled,
|
|
@@ -338,9 +352,13 @@ const TabbedCalendar = ({
|
|
|
338
352
|
setSelectedDate,
|
|
339
353
|
setStartDate,
|
|
340
354
|
shouldShowSeconds,
|
|
341
|
-
startDate
|
|
355
|
+
startDate,
|
|
356
|
+
timezone
|
|
342
357
|
}) => {
|
|
343
|
-
const [activeTab, setActiveTab] = useState(
|
|
358
|
+
const [activeTab, setActiveTab] = useState(defaultActiveTab);
|
|
359
|
+
useEffect(() => {
|
|
360
|
+
setActiveTab(defaultActiveTab);
|
|
361
|
+
}, [defaultActiveTab]);
|
|
344
362
|
const handleTabChange = useCallback((newTab) => {
|
|
345
363
|
setActiveTab(newTab);
|
|
346
364
|
}, []);
|
|
@@ -366,19 +384,20 @@ const TabbedCalendar = ({
|
|
|
366
384
|
/* @__PURE__ */ jsx(Tabs.Trigger, { value: "endDate", "data-testid": "tabbed-calendar-trigger-end", children: "End date" })
|
|
367
385
|
] }),
|
|
368
386
|
/* @__PURE__ */ jsxs(Tabs.Content, { value: "startDate", children: [
|
|
369
|
-
/* @__PURE__ */ jsx(StyledCalendarRenderer, { calendarOptions: startDateCalendarOptions, children: (body) => /* @__PURE__ */ jsx(Calendar, { calendarBody: body, calendarType: "startDate",
|
|
370
|
-
/* @__PURE__ */ jsx(TimeInput, { date: startDate, setDate: handleSetStartDate, shouldShowSeconds })
|
|
387
|
+
/* @__PURE__ */ jsx(StyledCalendarRenderer, { calendarOptions: startDateCalendarOptions, timezone, children: (body) => /* @__PURE__ */ jsx(Calendar, { calendarBody: body, calendarType: "startDate", endDate, futureDatesDisabled, futureStartDatesDisabled, maxRangeLength, setSelectedDate, startDate, timezone }) }),
|
|
388
|
+
/* @__PURE__ */ jsx(TimeInput, { date: startDate, setDate: handleSetStartDate, shouldShowSeconds, timezone })
|
|
371
389
|
] }),
|
|
372
390
|
/* @__PURE__ */ jsxs(Tabs.Content, { value: "endDate", children: [
|
|
373
|
-
/* @__PURE__ */ jsx(StyledCalendarRenderer, { calendarOptions: endDateCalendarOptions, children: (body) => /* @__PURE__ */ jsx(Calendar, { calendarBody: body, calendarType: "endDate",
|
|
374
|
-
/* @__PURE__ */ jsx(TimeInput, { date: endDate, setDate: handleSetEndDate, shouldShowSeconds })
|
|
391
|
+
/* @__PURE__ */ jsx(StyledCalendarRenderer, { calendarOptions: endDateCalendarOptions, timezone, children: (body) => /* @__PURE__ */ jsx(Calendar, { calendarBody: body, calendarType: "endDate", endDate, futureDatesDisabled, futureStartDatesDisabled, maxRangeLength, setSelectedDate, startDate, timezone }) }),
|
|
392
|
+
/* @__PURE__ */ jsx(TimeInput, { date: endDate, setDate: handleSetEndDate, shouldShowSeconds, timezone })
|
|
375
393
|
] })
|
|
376
394
|
] });
|
|
377
395
|
};
|
|
378
396
|
const DateTimeRangePicker = ({
|
|
379
|
-
|
|
380
|
-
|
|
397
|
+
closeOnDateRangeSelected = false,
|
|
398
|
+
defaultActiveTab,
|
|
381
399
|
disabled = false,
|
|
400
|
+
endDate,
|
|
382
401
|
futureDatesDisabled = false,
|
|
383
402
|
futureStartDatesDisabled = false,
|
|
384
403
|
maxRangeLength = -1,
|
|
@@ -386,7 +405,9 @@ const DateTimeRangePicker = ({
|
|
|
386
405
|
openDirection = "right",
|
|
387
406
|
placeholder = "start date – end date",
|
|
388
407
|
predefinedTimesList,
|
|
389
|
-
shouldShowSeconds
|
|
408
|
+
shouldShowSeconds,
|
|
409
|
+
startDate,
|
|
410
|
+
timezone = "system"
|
|
390
411
|
}) => {
|
|
391
412
|
const [isOpen, setIsOpen] = useState(false);
|
|
392
413
|
const [selectedStartDate, setSelectedStartDate] = useState();
|
|
@@ -395,21 +416,35 @@ const DateTimeRangePicker = ({
|
|
|
395
416
|
const [calendarOpenDirection, setCalendarOpenDirection] = useState(openDirection);
|
|
396
417
|
const calendarContainerRef = useRef(null);
|
|
397
418
|
useEffect(() => {
|
|
398
|
-
if (startDate) {
|
|
399
|
-
|
|
400
|
-
|
|
419
|
+
if (!startDate) {
|
|
420
|
+
return;
|
|
421
|
+
}
|
|
422
|
+
const startDateCopy = new Date(startDate);
|
|
423
|
+
const hours = timezone === "UTC" ? startDateCopy.getUTCHours() : startDateCopy.getHours();
|
|
424
|
+
if (hours === 0) {
|
|
425
|
+
if (timezone === "UTC") {
|
|
426
|
+
startDateCopy.setUTCHours(12);
|
|
427
|
+
} else {
|
|
428
|
+
startDateCopy.setHours(12);
|
|
401
429
|
}
|
|
402
|
-
setSelectedStartDate(startDate);
|
|
403
430
|
}
|
|
404
|
-
|
|
431
|
+
setSelectedStartDate(startDateCopy);
|
|
432
|
+
}, [startDate, timezone]);
|
|
405
433
|
useEffect(() => {
|
|
406
|
-
if (endDate) {
|
|
407
|
-
|
|
408
|
-
|
|
434
|
+
if (!endDate) {
|
|
435
|
+
return;
|
|
436
|
+
}
|
|
437
|
+
const endDateCopy = new Date(endDate);
|
|
438
|
+
const hours = timezone === "UTC" ? endDateCopy.getUTCHours() : endDateCopy.getHours();
|
|
439
|
+
if (hours === 0) {
|
|
440
|
+
if (timezone === "UTC") {
|
|
441
|
+
endDateCopy.setUTCHours(12);
|
|
442
|
+
} else {
|
|
443
|
+
endDateCopy.setHours(12);
|
|
409
444
|
}
|
|
410
|
-
setSelectedEndDate(endDate);
|
|
411
445
|
}
|
|
412
|
-
|
|
446
|
+
setSelectedEndDate(endDateCopy);
|
|
447
|
+
}, [endDate, timezone]);
|
|
413
448
|
useLayoutEffect(() => {
|
|
414
449
|
if (shouldShowCustomRange && calendarContainerRef.current) {
|
|
415
450
|
const rect = calendarContainerRef.current.getBoundingClientRect();
|
|
@@ -431,22 +466,33 @@ const DateTimeRangePicker = ({
|
|
|
431
466
|
}
|
|
432
467
|
}, []);
|
|
433
468
|
const handleSelectDate = useCallback((selectedDate, calendarType) => {
|
|
434
|
-
|
|
435
|
-
|
|
469
|
+
const isMidnight = timezone === "UTC" ? selectedDate.getUTCHours() === 0 && selectedDate.getUTCMinutes() === 0 && selectedDate.getUTCSeconds() === 0 : selectedDate.getHours() === 0 && selectedDate.getMinutes() === 0 && selectedDate.getSeconds() === 0;
|
|
470
|
+
if (isMidnight) {
|
|
471
|
+
if (timezone === "UTC") {
|
|
472
|
+
selectedDate.setUTCHours(12);
|
|
473
|
+
} else {
|
|
474
|
+
selectedDate.setHours(12);
|
|
475
|
+
}
|
|
436
476
|
}
|
|
437
477
|
if (calendarType === "startDate") {
|
|
438
478
|
setSelectedStartDate(selectedDate);
|
|
439
479
|
if (selectedEndDate) {
|
|
440
480
|
onSelectDateRange(selectedDate, selectedEndDate);
|
|
481
|
+
if (closeOnDateRangeSelected) {
|
|
482
|
+
closeDatePicker();
|
|
483
|
+
}
|
|
441
484
|
}
|
|
442
485
|
}
|
|
443
486
|
if (calendarType === "endDate") {
|
|
444
487
|
setSelectedEndDate(selectedDate);
|
|
445
488
|
if (selectedStartDate) {
|
|
446
489
|
onSelectDateRange(selectedStartDate, selectedDate);
|
|
490
|
+
if (closeOnDateRangeSelected) {
|
|
491
|
+
closeDatePicker();
|
|
492
|
+
}
|
|
447
493
|
}
|
|
448
494
|
}
|
|
449
|
-
}, [onSelectDateRange, selectedEndDate, selectedStartDate]);
|
|
495
|
+
}, [closeDatePicker, closeOnDateRangeSelected, onSelectDateRange, selectedEndDate, selectedStartDate, timezone]);
|
|
450
496
|
const onTriggerKeyDown = useCallback((e) => {
|
|
451
497
|
if (e.key === "Enter" || e.key === " ") {
|
|
452
498
|
e.preventDefault();
|
|
@@ -455,11 +501,11 @@ const DateTimeRangePicker = ({
|
|
|
455
501
|
}, []);
|
|
456
502
|
const shouldShowPredefinedTimes = predefinedTimesList !== void 0 && predefinedTimesList.length > 0;
|
|
457
503
|
return /* @__PURE__ */ jsxs(Dropdown, { onOpenChange: handleOpenChange, open: isOpen, children: [
|
|
458
|
-
/* @__PURE__ */ jsx(Dropdown.Trigger, { disabled, onKeyDown: onTriggerKeyDown, children: /* @__PURE__ */ jsx(DateTimeRangePickerInput, { "data-testid": "datepicker-input-container", disabled, isActive: isOpen, placeholder, selectedEndDate, selectedStartDate, shouldShowSeconds }) }),
|
|
504
|
+
/* @__PURE__ */ jsx(Dropdown.Trigger, { disabled, onKeyDown: onTriggerKeyDown, children: /* @__PURE__ */ jsx(DateTimeRangePickerInput, { "data-testid": "datepicker-input-container", disabled, isActive: isOpen, placeholder, selectedEndDate, selectedStartDate, shouldShowSeconds, timezone }) }),
|
|
459
505
|
/* @__PURE__ */ jsx(Dropdown.Content, { align: "start", children: /* @__PURE__ */ jsx(Container, { orientation: "horizontal", children: shouldShowPredefinedTimes ? /* @__PURE__ */ jsxs(PredefinedCalendarContainer, { gap: "none", orientation: "horizontal", padding: "none", children: [
|
|
460
506
|
/* @__PURE__ */ jsx(PredefinedTimes, { onSelectDateRange, predefinedTimesList, selectedEndDate, selectedStartDate, setEndDate: setSelectedEndDate, setStartDate: setSelectedStartDate, shouldShowCustomRange, showCustomDateRange: setShouldShowCustomRange }),
|
|
461
|
-
shouldShowCustomRange && /* @__PURE__ */ jsx(CalendarRendererContainer, { $openDirection: calendarOpenDirection, ref: calendarContainerRef, children: /* @__PURE__ */ jsx(TabbedCalendar, {
|
|
462
|
-
] }) : /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsx(TabbedCalendar, {
|
|
507
|
+
shouldShowCustomRange && /* @__PURE__ */ jsx(CalendarRendererContainer, { $openDirection: calendarOpenDirection, ref: calendarContainerRef, children: /* @__PURE__ */ jsx(TabbedCalendar, { defaultActiveTab, endDate: selectedEndDate, futureDatesDisabled, futureStartDatesDisabled, maxRangeLength, setEndDate: setSelectedEndDate, setSelectedDate: handleSelectDate, setStartDate: setSelectedStartDate, shouldShowSeconds: Boolean(shouldShowSeconds), startDate: selectedStartDate, timezone }) })
|
|
508
|
+
] }) : /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsx(TabbedCalendar, { defaultActiveTab, endDate: selectedEndDate, futureDatesDisabled, futureStartDatesDisabled, maxRangeLength, setEndDate: setSelectedEndDate, setSelectedDate: handleSelectDate, setStartDate: setSelectedStartDate, shouldShowSeconds: Boolean(shouldShowSeconds), startDate: selectedStartDate, timezone }) }) }) })
|
|
463
509
|
] });
|
|
464
510
|
};
|
|
465
511
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DateTimeRangePicker.js","sources":["../../../../src/components/DatePicker/DateTimeRangePicker.tsx"],"sourcesContent":["import {\n Dispatch,\n KeyboardEvent,\n MouseEvent,\n SetStateAction,\n useCallback,\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n} from 'react';\nimport { isSameDate, UseCalendarOptions } from '@h6s/calendar';\nimport { styled } from 'styled-components';\nimport { Dropdown } from '../Dropdown/Dropdown';\nimport {\n Body,\n CalendarRenderer,\n DateTimeRangePickerInput,\n DateTableCell,\n StyledDropdownItem,\n} from './Common';\nimport { Container } from '../Container/Container';\nimport { Panel } from '../Panel/Panel';\nimport { Icon } from '../Icon/Icon';\nimport { DateRangeListItem, datesAreWithinMaxRange, Meridiem } from './utils';\nimport { dayjs, Dayjs } from '@/utils/date';\nimport { Tabs } from '../Tabs/Tabs';\nimport { TextField } from '@/components/TextField';\nimport { ButtonGroup } from '../ButtonGroup/ButtonGroup';\nimport { Label } from '../Label/Label';\n\nconst calendarFullWidth = '258px';\n\nconst PredefinedCalendarContainer = styled(Panel)`\n align-items: start;\n background: ${({ theme }) => theme.click.panel.color.background.muted};\n`;\n\nconst PredefinedTimesContainer = styled(Container)`\n width: ${calendarFullWidth};\n`;\n\ntype OpenDirection = 'left' | 'right';\n\n// left value of 259px is the width of the PredefinedTimesContainer + 1 pixel for border\nconst CalendarRendererContainer = styled.div<{ $openDirection?: OpenDirection }>`\n border: ${({ theme }) =>\n `${theme.click.datePicker.dateOption.stroke} solid ${theme.click.datePicker.dateOption.color.background.range}`};\n border-radius: ${({ theme }) => theme.click.datePicker.dateOption.radii.default};\n box-shadow:\n lch(6.77 0 0 / 0.15) 4px 4px 6px -1px,\n lch(6.77 0 0 / 0.15) 2px 2px 4px -1px;\n ${({ $openDirection }) => ($openDirection === 'left' ? 'right: 100%;' : 'left: 259px;')}\n position: absolute;\n top: 0;\n`;\n\n// Height of 221px is height the height the calendar needs to match the PredefinedTimesContainer\nconst StyledCalendarRenderer = styled(CalendarRenderer)`\n border-radius: ${({ theme }) => theme.click.datePicker.dateOption.radii.default};\n min-height: 221px;\n`;\n\nconst StyledTriggerList = styled(Tabs.TriggersList)`\n justify-content: space-around;\n`;\n\n// max-height of 210px allows the scrollable container to be a reasonble height that matches the calendar\nconst ScrollableContainer = styled(Container)`\n max-height: 210px;\n overflow-y: auto;\n`;\n\nconst TimeInputContainer = styled(Container)`\n background: ${({ theme }) =>\n theme.click.datePicker.dateOption.color.background.default};\n`;\n\nconst DateRangeTableCell = styled(DateTableCell)<{\n $shouldShowRangeIndicator?: boolean;\n}>`\n ${({ $shouldShowRangeIndicator, theme }) =>\n $shouldShowRangeIndicator &&\n `\n background: ${theme.click.datePicker.dateOption.color.background.range};\n border: ${theme.click.datePicker.dateOption.stroke} solid ${theme.click.datePicker.dateOption.color.background.range};\n border-radius: 0;\n `}\n`;\n\ntype CalendarType = 'startDate' | 'endDate';\n\ntype SetSelectedDate = (selectedDate: Date, calendarType: CalendarType) => void;\n\ntype SetDate = (date: Date) => void;\n\ninterface CalendarProps {\n calendarBody: Body;\n calendarType: CalendarType;\n closeDatePicker?: () => void;\n futureDatesDisabled: boolean;\n futureStartDatesDisabled: boolean;\n maxRangeLength: number;\n setSelectedDate: SetSelectedDate;\n startDate?: Date;\n endDate?: Date;\n}\n\nconst Calendar = ({\n calendarBody,\n calendarType,\n futureDatesDisabled,\n futureStartDatesDisabled,\n maxRangeLength,\n setSelectedDate,\n startDate,\n endDate,\n}: CalendarProps) => {\n const [hoveredDate, setHoveredDate] = useState<Date>();\n\n const handleMouseOut = (): void => {\n setHoveredDate(undefined);\n };\n\n return calendarBody.value.map(({ key: weekKey, value: week }) => {\n return (\n <tr key={weekKey}>\n {week.map(({ date, isCurrentMonth, key: dayKey, value: fullDate }) => {\n const isSelected =\n (startDate && isSameDate(startDate, fullDate)) ||\n (endDate && isSameDate(endDate, fullDate));\n\n const today = new Date();\n\n const isCurrentDate = isSameDate(today, fullDate);\n const isBetweenStartAndEndDates = Boolean(\n startDate && endDate && fullDate > startDate && fullDate < endDate\n );\n\n let isDisabled = false;\n if (futureDatesDisabled && fullDate > today) {\n isDisabled = true;\n }\n\n if (\n futureStartDatesDisabled &&\n calendarType === 'startDate' &&\n fullDate > today\n ) {\n isDisabled = true;\n }\n\n if (\n maxRangeLength > 1 &&\n startDate &&\n !datesAreWithinMaxRange(startDate, fullDate, maxRangeLength)\n ) {\n isDisabled = true;\n }\n\n // start date is selected, end date is not; disable anything before start date\n if (\n calendarType === 'endDate' &&\n startDate &&\n startDate > fullDate &&\n !isSameDate(startDate, fullDate)\n ) {\n isDisabled = true;\n }\n\n // start date isn't selected, but end date is; disable anything after end date\n if (\n calendarType === 'startDate' &&\n !startDate &&\n endDate &&\n fullDate > endDate\n ) {\n isDisabled = true;\n }\n\n const startDateSelectedAndIsSelectingEndDate =\n calendarType === 'endDate' &&\n !endDate &&\n Boolean(\n startDate && hoveredDate && fullDate > startDate && fullDate < hoveredDate\n );\n\n const endDateSelectedAndIsSelectingStartDate =\n calendarType === 'startDate' &&\n !startDate &&\n Boolean(\n endDate && hoveredDate && fullDate < endDate && fullDate > hoveredDate\n );\n\n const shouldShowRangeIndicator =\n startDateSelectedAndIsSelectingEndDate ||\n endDateSelectedAndIsSelectingStartDate;\n\n const handleMouseEnter = () => {\n setHoveredDate(fullDate);\n };\n\n const handleClick = () => {\n if (isDisabled) {\n return false;\n }\n\n // If the user selects a start date and changes the start date\n // use any hours, minutes, seconds they've already set\n if (calendarType === 'startDate' && startDate) {\n fullDate.setHours(startDate.getHours());\n fullDate.setMinutes(startDate.getMinutes());\n fullDate.setSeconds(startDate.getSeconds());\n }\n\n // If the user selects an end date and changes the end date\n // use any hours, minutes, seconds they've already set\n if (calendarType === 'endDate' && endDate) {\n fullDate.setHours(endDate.getHours());\n fullDate.setMinutes(endDate.getMinutes());\n fullDate.setSeconds(endDate.getSeconds());\n }\n\n setSelectedDate(fullDate, calendarType);\n };\n\n return (\n <DateRangeTableCell\n $shouldShowRangeIndicator={\n shouldShowRangeIndicator || isBetweenStartAndEndDates\n }\n $isCurrentMonth={isCurrentMonth}\n $isDisabled={isDisabled}\n $isSelected={isSelected}\n $isPresent={isCurrentDate}\n key={dayKey}\n onClick={handleClick}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseOut}\n >\n {date}\n </DateRangeTableCell>\n );\n })}\n </tr>\n );\n });\n};\n\ninterface PredefinedTimesProps {\n onSelectDateRange: (selectedStartDate: Date, selectedEndDate: Date) => void;\n predefinedTimesList: DateRangeListItem[];\n selectedEndDate: Date | undefined;\n selectedStartDate: Date | undefined;\n setEndDate: Dispatch<SetStateAction<Date | undefined>>;\n setStartDate: Dispatch<SetStateAction<Date | undefined>>;\n shouldShowCustomRange: boolean;\n showCustomDateRange: Dispatch<SetStateAction<boolean>>;\n}\n\nconst PredefinedTimes = ({\n onSelectDateRange,\n predefinedTimesList,\n selectedEndDate,\n selectedStartDate,\n setEndDate,\n setStartDate,\n shouldShowCustomRange,\n showCustomDateRange,\n}: PredefinedTimesProps) => {\n const handleCustomTimePeriodClick = (event: MouseEvent) => {\n event.preventDefault();\n showCustomDateRange(!shouldShowCustomRange);\n };\n\n return (\n <PredefinedTimesContainer\n data-testid=\"predefined-times-list\"\n isResponsive={false}\n orientation=\"vertical\"\n >\n <ScrollableContainer orientation=\"vertical\">\n {predefinedTimesList.map(({ dateRange: { startDate, endDate }, label }) => {\n const handleItemClick = () => {\n setStartDate(startDate);\n setEndDate(endDate);\n onSelectDateRange(startDate, endDate);\n };\n\n const rangeIsSelected =\n selectedEndDate &&\n selectedEndDate === endDate &&\n selectedStartDate &&\n selectedStartDate === startDate;\n\n return (\n <StyledDropdownItem\n data-testid={`predefined-date-${startDate.getTime()}`}\n key={startDate.toISOString()}\n onClick={handleItemClick}\n >\n <Container\n data-selected={rangeIsSelected}\n data-testid={label}\n justifyContent=\"space-between\"\n orientation=\"horizontal\"\n >\n {label}\n {rangeIsSelected && <Icon name=\"check\" />}\n </Container>\n </StyledDropdownItem>\n );\n })}\n </ScrollableContainer>\n <StyledDropdownItem onClick={handleCustomTimePeriodClick}>\n <Container\n justifyContent=\"space-between\"\n orientation=\"horizontal\"\n >\n Since a specific date and time <Icon name=\"chevron-right\" />\n </Container>\n </StyledDropdownItem>\n </PredefinedTimesContainer>\n );\n};\n\nconst parseTimeString = (\n timeString: string\n): { isValid: boolean; parsedDate?: Dayjs } => {\n if (!validTimeRegex.test(timeString)) {\n return { isValid: false };\n }\n\n const [hours, minutes, seconds] = timeString.split(':');\n\n const hoursAsNumber = parseInt(hours, 10);\n if (Number.isNaN(hoursAsNumber)) {\n return { isValid: false };\n }\n\n if (hoursAsNumber > 23 || hoursAsNumber < 0) {\n return { isValid: false };\n }\n\n let parsedDate;\n if (!minutes) {\n parsedDate = dayjs(hours, 'h');\n } else {\n const minutesAsNumber = parseInt(minutes, 10);\n if (Number.isNaN(minutesAsNumber)) {\n return { isValid: false };\n }\n\n if (minutesAsNumber > 59 || minutesAsNumber < 0) {\n return { isValid: false };\n }\n\n if (!seconds) {\n parsedDate = dayjs(`${hours}:${minutes}`, 'h:mm');\n } else {\n const secondsAsNumber = parseInt(seconds, 10);\n\n if (Number.isNaN(secondsAsNumber)) {\n return { isValid: false };\n }\n\n if (secondsAsNumber > 59 || secondsAsNumber < 0) {\n return { isValid: false };\n }\n\n parsedDate = dayjs(`${hours}:${minutes}:${seconds}`, 'h:mm:ss');\n }\n }\n\n if (!parsedDate.isValid()) {\n return { isValid: false };\n }\n\n if (!parsedDate.isValid()) {\n return { isValid: false };\n }\n\n return { isValid: true, parsedDate };\n};\n\nconst validTimeRegex = /^\\d{1,2}(:\\d{1,2}(:\\d{1,2})?)?$/;\n\ninterface TimeInputProps {\n date: Date | undefined;\n setDate: (date: Date) => void;\n shouldShowSeconds: boolean;\n}\n\nconst TimeInput = ({ date, setDate, shouldShowSeconds }: TimeInputProps) => {\n let dayjsDate = dayjs(date);\n if (!date) {\n dayjsDate = dayjsDate.hour(12).minute(0);\n }\n\n const formattedDate = shouldShowSeconds\n ? dayjsDate.format('hh:mm:ss')\n : dayjsDate.format('hh:mm');\n const [timeString, setTimeString] = useState<string>(formattedDate);\n const [dateIsValid, setDateIsValid] = useState<boolean>(true);\n const [meridiem, setMeridiem] = useState<Meridiem>();\n const isEnabled = Boolean(date);\n\n useEffect(() => {\n if (date) {\n setMeridiem(dayjsDate.format('a') as Meridiem);\n }\n }, [date, dayjsDate]);\n\n const handleTimeChange = useCallback(\n (newTimeString: string) => {\n setTimeString(newTimeString);\n\n if (!date) {\n return;\n }\n\n const trimmedTime = newTimeString.trim();\n if (!trimmedTime) {\n return;\n }\n\n const { isValid, parsedDate } = parseTimeString(trimmedTime);\n\n if (!isValid) {\n setDateIsValid(false);\n return;\n }\n\n if (!parsedDate) {\n setDateIsValid(false);\n return;\n }\n\n setDateIsValid(true);\n\n let hour = parsedDate.hour();\n\n // If the meridiem is set to am and the user enters a time greater than 12,\n // e.g. 18:00, it's a pretty clear indication they mean afternoon, so set the\n // meridiem to pm\n if (meridiem === 'am' && hour >= 12) {\n setMeridiem('pm');\n }\n // It's not as easy to infer that a user intended 8:00 to mean 08:00 when the meridiem\n // is set to pm, so don't change the meridiem in that case\n if (meridiem === 'pm' && hour < 12) {\n hour = parsedDate.hour() + 12;\n }\n\n const newDate = shouldShowSeconds\n ? dayjsDate\n .hour(hour)\n .minute(parsedDate.minute())\n .second(parsedDate.second())\n .toDate()\n : dayjsDate.hour(hour).minute(parsedDate.minute()).toDate();\n\n setDate(newDate);\n },\n [date, dayjsDate, meridiem, setDate, shouldShowSeconds]\n );\n\n const handleMeridiemChange = useCallback(\n (newMeridiem: string) => {\n setMeridiem(newMeridiem as Meridiem);\n\n if (newMeridiem === 'pm' && dayjsDate.hour() < 12) {\n const newDate = dayjsDate.hour(dayjsDate.hour() + 12).toDate();\n\n setDate(newDate);\n\n return;\n }\n\n if (newMeridiem === 'am' && dayjsDate.hour() >= 12) {\n const newDate = dayjsDate.hour(dayjsDate.hour() - 12).toDate();\n\n setDate(newDate);\n\n return;\n }\n },\n [dayjsDate, setDate]\n );\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent<HTMLInputElement>) => {\n if (event.key === 'Enter') {\n const { isValid, parsedDate } = parseTimeString(timeString);\n\n if (!isValid) {\n return;\n }\n\n if (!parsedDate) {\n return;\n }\n\n const newDate = shouldShowSeconds\n ? dayjsDate\n .hour(parsedDate.hour())\n .minute(parsedDate.minute())\n .second(parsedDate.second())\n .toDate()\n : dayjsDate.hour(parsedDate.hour()).minute(parsedDate.minute()).toDate();\n\n setDate(newDate);\n }\n },\n [dayjsDate, setDate, shouldShowSeconds, timeString]\n );\n\n return (\n <TimeInputContainer\n gap=\"sm\"\n padding=\"xs\"\n maxWidth={`${calendarFullWidth}`}\n orientation=\"horizontal\"\n >\n <Container maxWidth=\"10%\">\n <Label htmlFor=\"date-time-picker-time-input\">Time</Label>\n </Container>\n <Container\n gap=\"md\"\n justifyContent=\"space-evenly\"\n orientation=\"horizontal\"\n >\n <Container\n maxWidth=\"45%\"\n orientation=\"horizontal\"\n >\n <TextField\n data-testid=\"date-time-picker-time-input\"\n disabled={!isEnabled}\n error={dateIsValid ? null : true}\n id=\"date-time-picker-time-input\"\n onChange={handleTimeChange}\n onKeyDown={handleKeyDown}\n value={timeString}\n />\n </Container>\n <Container maxWidth=\"45%\">\n <ButtonGroup\n onClick={handleMeridiemChange}\n options={[\n {\n label: 'am',\n value: 'am',\n },\n {\n label: 'pm',\n value: 'pm',\n },\n ]}\n selected={meridiem}\n type=\"default\"\n />\n </Container>\n </Container>\n </TimeInputContainer>\n );\n};\n\ntype Tab = 'startDate' | 'endDate';\n\ninterface TabbedCalendarProps {\n closeDatePicker: () => void;\n endDate: Date | undefined;\n futureDatesDisabled: boolean;\n futureStartDatesDisabled: boolean;\n maxRangeLength: number;\n setEndDate: SetDate;\n setSelectedDate: SetSelectedDate;\n setStartDate: SetDate;\n shouldShowSeconds: boolean;\n startDate: Date | undefined;\n}\n\nconst TabbedCalendar = ({\n closeDatePicker,\n endDate,\n futureDatesDisabled,\n futureStartDatesDisabled,\n maxRangeLength,\n setEndDate,\n setSelectedDate,\n setStartDate,\n shouldShowSeconds,\n startDate,\n}: TabbedCalendarProps) => {\n const [activeTab, setActiveTab] = useState<Tab>('startDate');\n\n const handleTabChange = useCallback((newTab: string) => {\n setActiveTab(newTab as Tab);\n }, []);\n\n const handleSetStartDate = useCallback(\n (startDate: Date) => {\n setStartDate(startDate);\n\n setSelectedDate(startDate, 'startDate');\n },\n [setSelectedDate, setStartDate]\n );\n\n const handleSetEndDate = useCallback(\n (endDate: Date) => {\n setEndDate(endDate);\n\n setSelectedDate(endDate, 'endDate');\n },\n [setEndDate, setSelectedDate]\n );\n\n const startDateCalendarOptions: UseCalendarOptions = {};\n const endDateCalendarOptions: UseCalendarOptions = {};\n\n // If a start date is selected, open the calendar to that date\n if (startDate) {\n startDateCalendarOptions.defaultDate = startDate;\n }\n\n // If an end date is selected, open the calendar to that date\n if (endDate) {\n endDateCalendarOptions.defaultDate = endDate;\n }\n\n return (\n <Tabs\n onValueChange={handleTabChange}\n value={activeTab}\n >\n <StyledTriggerList>\n <Tabs.Trigger\n value=\"startDate\"\n data-testid=\"tabbed-calendar-trigger-start\"\n >\n Start date\n </Tabs.Trigger>\n <Tabs.Trigger\n value=\"endDate\"\n data-testid=\"tabbed-calendar-trigger-end\"\n >\n End date\n </Tabs.Trigger>\n </StyledTriggerList>\n <Tabs.Content value=\"startDate\">\n <StyledCalendarRenderer calendarOptions={startDateCalendarOptions}>\n {(body: Body) => (\n <Calendar\n calendarBody={body}\n calendarType=\"startDate\"\n closeDatePicker={closeDatePicker}\n endDate={endDate}\n futureDatesDisabled={futureDatesDisabled}\n futureStartDatesDisabled={futureStartDatesDisabled}\n maxRangeLength={maxRangeLength}\n setSelectedDate={setSelectedDate}\n startDate={startDate}\n />\n )}\n </StyledCalendarRenderer>\n <TimeInput\n date={startDate}\n setDate={handleSetStartDate}\n shouldShowSeconds={shouldShowSeconds}\n />\n </Tabs.Content>\n <Tabs.Content value=\"endDate\">\n <StyledCalendarRenderer calendarOptions={endDateCalendarOptions}>\n {(body: Body) => (\n <Calendar\n calendarBody={body}\n calendarType=\"endDate\"\n closeDatePicker={closeDatePicker}\n endDate={endDate}\n futureDatesDisabled={futureDatesDisabled}\n futureStartDatesDisabled={futureStartDatesDisabled}\n maxRangeLength={maxRangeLength}\n setSelectedDate={setSelectedDate}\n startDate={startDate}\n />\n )}\n </StyledCalendarRenderer>\n <TimeInput\n date={endDate}\n setDate={handleSetEndDate}\n shouldShowSeconds={shouldShowSeconds}\n />\n </Tabs.Content>\n </Tabs>\n );\n};\n\nexport interface DateTimeRangePickerProps {\n endDate?: Date;\n disabled?: boolean;\n futureDatesDisabled?: boolean;\n futureStartDatesDisabled?: boolean;\n onSelectDateRange: (selectedStartDate: Date, selectedEndDate: Date) => void;\n openDirection?: OpenDirection;\n placeholder?: string;\n predefinedTimesList?: DateRangeListItem[];\n maxRangeLength?: number;\n shouldShowSeconds?: boolean;\n startDate?: Date;\n}\n\nexport const DateTimeRangePicker = ({\n endDate,\n startDate,\n disabled = false,\n futureDatesDisabled = false,\n futureStartDatesDisabled = false,\n maxRangeLength = -1,\n onSelectDateRange,\n openDirection = 'right',\n placeholder = 'start date – end date',\n predefinedTimesList,\n shouldShowSeconds,\n}: DateTimeRangePickerProps) => {\n const [isOpen, setIsOpen] = useState<boolean>(false);\n const [selectedStartDate, setSelectedStartDate] = useState<Date>();\n const [selectedEndDate, setSelectedEndDate] = useState<Date>();\n const [shouldShowCustomRange, setShouldShowCustomRange] = useState<boolean>(false);\n const [calendarOpenDirection, setCalendarOpenDirection] =\n useState<OpenDirection>(openDirection);\n const calendarContainerRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (startDate) {\n if (startDate.getHours() === 0) {\n startDate.setHours(12);\n }\n setSelectedStartDate(startDate);\n }\n }, [startDate]);\n\n useEffect(() => {\n if (endDate) {\n if (endDate.getHours() === 0) {\n endDate.setHours(12);\n }\n setSelectedEndDate(endDate);\n }\n }, [endDate]);\n\n useLayoutEffect(() => {\n if (shouldShowCustomRange && calendarContainerRef.current) {\n const rect = calendarContainerRef.current.getBoundingClientRect();\n\n if (rect.right > window.innerWidth) {\n setCalendarOpenDirection('left');\n }\n }\n }, [shouldShowCustomRange]);\n\n const closeDatePicker = useCallback((): void => {\n setIsOpen(false);\n setShouldShowCustomRange(false);\n setCalendarOpenDirection('right');\n }, []);\n\n const handleOpenChange = useCallback((isOpen: boolean): void => {\n setIsOpen(isOpen);\n\n if (!isOpen) {\n setShouldShowCustomRange(false);\n setCalendarOpenDirection('right');\n }\n }, []);\n\n const handleSelectDate = useCallback(\n (selectedDate: Date, calendarType: CalendarType): void => {\n if (\n selectedDate.getHours() === 0 &&\n selectedDate.getMinutes() === 0 &&\n selectedDate.getSeconds() === 0\n ) {\n selectedDate.setHours(12); // set the time to 12 noon if time hasn't been set yet\n }\n\n if (calendarType === 'startDate') {\n setSelectedStartDate(selectedDate);\n\n if (selectedEndDate) {\n onSelectDateRange(selectedDate, selectedEndDate);\n }\n }\n\n if (calendarType === 'endDate') {\n setSelectedEndDate(selectedDate);\n\n if (selectedStartDate) {\n onSelectDateRange(selectedStartDate, selectedDate);\n }\n }\n },\n [onSelectDateRange, selectedEndDate, selectedStartDate]\n );\n\n const onTriggerKeyDown = useCallback((e: KeyboardEvent<HTMLDivElement>) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n setIsOpen(true);\n }\n }, []);\n\n const shouldShowPredefinedTimes =\n predefinedTimesList !== undefined && predefinedTimesList.length > 0;\n\n return (\n <Dropdown\n onOpenChange={handleOpenChange}\n open={isOpen}\n >\n <Dropdown.Trigger\n disabled={disabled}\n onKeyDown={onTriggerKeyDown}\n >\n <DateTimeRangePickerInput\n data-testid=\"datepicker-input-container\"\n disabled={disabled}\n isActive={isOpen}\n placeholder={placeholder}\n selectedEndDate={selectedEndDate}\n selectedStartDate={selectedStartDate}\n shouldShowSeconds={shouldShowSeconds}\n />\n </Dropdown.Trigger>\n <Dropdown.Content align=\"start\">\n <Container orientation=\"horizontal\">\n {shouldShowPredefinedTimes ? (\n <PredefinedCalendarContainer\n gap=\"none\"\n orientation=\"horizontal\"\n padding=\"none\"\n >\n <PredefinedTimes\n onSelectDateRange={onSelectDateRange}\n predefinedTimesList={predefinedTimesList}\n selectedEndDate={selectedEndDate}\n selectedStartDate={selectedStartDate}\n setEndDate={setSelectedEndDate}\n setStartDate={setSelectedStartDate}\n shouldShowCustomRange={shouldShowCustomRange}\n showCustomDateRange={setShouldShowCustomRange}\n />\n\n {shouldShowCustomRange && (\n <CalendarRendererContainer\n $openDirection={calendarOpenDirection}\n ref={calendarContainerRef}\n >\n <TabbedCalendar\n closeDatePicker={closeDatePicker}\n endDate={selectedEndDate}\n futureDatesDisabled={futureDatesDisabled}\n futureStartDatesDisabled={futureStartDatesDisabled}\n maxRangeLength={maxRangeLength}\n setEndDate={setSelectedEndDate}\n setSelectedDate={handleSelectDate}\n setStartDate={setSelectedStartDate}\n shouldShowSeconds={Boolean(shouldShowSeconds)}\n startDate={selectedStartDate}\n />\n </CalendarRendererContainer>\n )}\n </PredefinedCalendarContainer>\n ) : (\n <>\n <TabbedCalendar\n closeDatePicker={closeDatePicker}\n endDate={selectedEndDate}\n futureDatesDisabled={futureDatesDisabled}\n futureStartDatesDisabled={futureStartDatesDisabled}\n maxRangeLength={maxRangeLength}\n setEndDate={setSelectedEndDate}\n setSelectedDate={handleSelectDate}\n setStartDate={setSelectedStartDate}\n shouldShowSeconds={Boolean(shouldShowSeconds)}\n startDate={selectedStartDate}\n />\n </>\n )}\n </Container>\n </Dropdown.Content>\n </Dropdown>\n );\n};\n"],"names":["calendarFullWidth","PredefinedCalendarContainer","styled","Panel","withConfig","componentId","theme","click","panel","color","background","muted","PredefinedTimesContainer","Container","CalendarRendererContainer","div","datePicker","dateOption","stroke","range","radii","default","$openDirection","StyledCalendarRenderer","CalendarRenderer","StyledTriggerList","Tabs","TriggersList","ScrollableContainer","TimeInputContainer","DateRangeTableCell","DateTableCell","$shouldShowRangeIndicator","Calendar","calendarBody","calendarType","futureDatesDisabled","futureStartDatesDisabled","maxRangeLength","setSelectedDate","startDate","endDate","hoveredDate","setHoveredDate","useState","handleMouseOut","undefined","value","map","key","weekKey","week","date","isCurrentMonth","dayKey","fullDate","isSelected","isSameDate","today","Date","isCurrentDate","isBetweenStartAndEndDates","Boolean","isDisabled","datesAreWithinMaxRange","startDateSelectedAndIsSelectingEndDate","endDateSelectedAndIsSelectingStartDate","shouldShowRangeIndicator","handleMouseEnter","handleClick","setHours","getHours","setMinutes","getMinutes","setSeconds","getSeconds","PredefinedTimes","onSelectDateRange","predefinedTimesList","selectedEndDate","selectedStartDate","setEndDate","setStartDate","shouldShowCustomRange","showCustomDateRange","handleCustomTimePeriodClick","event","preventDefault","dateRange","label","handleItemClick","rangeIsSelected","getTime","Icon","toISOString","parseTimeString","timeString","validTimeRegex","test","isValid","hours","minutes","seconds","split","hoursAsNumber","parseInt","Number","isNaN","parsedDate","dayjs","minutesAsNumber","secondsAsNumber","TimeInput","setDate","shouldShowSeconds","dayjsDate","hour","minute","formattedDate","format","setTimeString","dateIsValid","setDateIsValid","meridiem","setMeridiem","isEnabled","useEffect","handleTimeChange","useCallback","newTimeString","trimmedTime","trim","newDate","second","toDate","handleMeridiemChange","newMeridiem","handleKeyDown","TabbedCalendar","closeDatePicker","activeTab","setActiveTab","handleTabChange","newTab","handleSetStartDate","handleSetEndDate","startDateCalendarOptions","endDateCalendarOptions","defaultDate","body","DateTimeRangePicker","disabled","openDirection","placeholder","isOpen","setIsOpen","setSelectedStartDate","setSelectedEndDate","setShouldShowCustomRange","calendarOpenDirection","setCalendarOpenDirection","calendarContainerRef","useRef","useLayoutEffect","current","rect","getBoundingClientRect","right","window","innerWidth","handleOpenChange","handleSelectDate","selectedDate","onTriggerKeyDown","e","shouldShowPredefinedTimes","length"],"mappings":";;;;;;;;;;;;;;;;;AA+BA,MAAMA,iBAAAA,GAAoB,OAAA;AAE1B,MAAMC,2BAAAA,GAA8BC,MAAAA,CAAOC,KAAK,CAAA,CAACC,UAAAA,CAAA;AAAA,EAAAC,WAAAA,EAAA;AAAA,CAAA,CAAA,CAAA,CAAA,+BAAA,EAAA,GAAA,GAEjC,CAAC;AAAA,EAAEC;AAAM,CAAA,KAAMA,KAAAA,CAAMC,KAAAA,CAAMC,KAAAA,CAAMC,KAAAA,CAAMC,WAAWC,KAAK,CAAA;AAGvE,MAAMC,wBAAAA,GAA2BV,MAAAA,CAAOW,SAAS,CAAA,CAACT,UAAAA,CAAA;AAAA,EAAAC,WAAAA,EAAA;AAAA,CAAA,CAAA,CAAA,CAAA,QAAA,EAAA,GAAA,GACvCL,iBAAiB,CAAA;AAM5B,MAAMc,yBAAAA,GAA4BZ,MAAAA,CAAOa,GAAAA,CAAGX,UAAAA,CAAA;AAAA,EAAAC,WAAAA,EAAA;AAAA,CAAA,EAAA,CAAA,SAAA,EAAA,mBAAA,0FAAA,EAAA,2BAAA,GAChC,CAAC;AAAA,EAAEC;AAAM,CAAA,KACjB,CAAA,EAAGA,KAAAA,CAAMC,KAAAA,CAAMS,UAAAA,CAAWC,WAAWC,MAAM,CAAA,OAAA,EAAUZ,KAAAA,CAAMC,KAAAA,CAAMS,WAAWC,UAAAA,CAAWR,KAAAA,CAAMC,UAAAA,CAAWS,KAAK,IAC9F,CAAC;AAAA,EAAEb;AAAM,CAAA,KAAMA,MAAMC,KAAAA,CAAMS,UAAAA,CAAWC,UAAAA,CAAWG,KAAAA,CAAMC,SAItE,CAAC;AAAA,EAAEC;AAAe,CAAA,KAAOA,cAAAA,KAAmB,MAAA,GAAS,cAAA,GAAiB,cAAe,CAAA;AAMzF,MAAMC,sBAAAA,GAAyBrB,MAAAA,CAAOsB,gBAAgB,CAAA,CAACpB,UAAAA,CAAA;AAAA,EAAAC,WAAAA,EAAA;AAAA,CAAA,CAAA,CAAA,CAAA,gBAAA,EAAA,oBAAA,GACpC,CAAC;AAAA,EAAEC;AAAM,CAAA,KAAMA,KAAAA,CAAMC,KAAAA,CAAMS,UAAAA,CAAWC,UAAAA,CAAWG,MAAMC,OAAO,CAAA;AAIjF,MAAMI,iBAAAA,GAAoBvB,MAAAA,CAAOwB,IAAAA,CAAKC,YAAY,EAACvB,UAAAA,CAAA;AAAA,EAAAC,WAAAA,EAAA;AAAA,CAAA,CAAA,CAAA,CAAA,+BAAA,CAAA,CAAA;AAKnD,MAAMuB,mBAAAA,GAAsB1B,MAAAA,CAAOW,SAAS,CAAA,CAACT,UAAAA,CAAA;AAAA,EAAAC,WAAAA,EAAA;AAAA,CAAA,CAAA,CAAA,CAAA,mCAAA,CAAA,CAAA;AAK7C,MAAMwB,kBAAAA,GAAqB3B,MAAAA,CAAOW,SAAS,CAAA,CAACT,UAAAA,CAAA;AAAA,EAAAC,WAAAA,EAAA;AAAA,CAAA,CAAA,CAAA,CAAA,aAAA,EAAA,GAAA,GAC5B,CAAC;AAAA,EAAEC;AAAM,CAAA,KACrBA,MAAMC,KAAAA,CAAMS,UAAAA,CAAWC,UAAAA,CAAWR,KAAAA,CAAMC,WAAWW,OAAO,CAAA;AAG9D,MAAMS,kBAAAA,GAAqB5B,MAAAA,CAAO6B,aAAa,CAAA,CAAC3B,UAAAA,CAAA;AAAA,EAAAC,WAAAA,EAAA;AAAA,CAAA,CAAA,CAAA,CAAA,EAAA,EAAA,EAAA,GAG5C,CAAC;AAAA,EAAE2B,yBAAAA;AAAAA,EAA2B1B;AAAM,CAAA,KACpC0B,yBAAAA,IACA;AAAA,gBAAA,EACc1B,MAAMC,KAAAA,CAAMS,UAAAA,CAAWC,UAAAA,CAAWR,KAAAA,CAAMC,WAAWS,KAAK,CAAA;AAAA,YAAA,EAC5Db,KAAAA,CAAMC,KAAAA,CAAMS,UAAAA,CAAWC,UAAAA,CAAWC,MAAM,CAAA,OAAA,EAAUZ,KAAAA,CAAMC,KAAAA,CAAMS,UAAAA,CAAWC,UAAAA,CAAWR,KAAAA,CAAMC,UAAAA,CAAWS,KAAK,CAAA;AAAA;AAAA,IAAA,CAEnH,CAAA;AAqBL,MAAMc,WAAWA,CAAC;AAAA,EAChBC,YAAAA;AAAAA,EACAC,YAAAA;AAAAA,EACAC,mBAAAA;AAAAA,EACAC,wBAAAA;AAAAA,EACAC,cAAAA;AAAAA,EACAC,eAAAA;AAAAA,EACAC,SAAAA;AAAAA,EACAC;AACa,CAAA,KAAM;AACnB,EAAA,MAAM,CAACC,WAAAA,EAAaC,cAAc,CAAA,GAAIC,QAAAA,EAAe;AAErD,EAAA,MAAMC,iBAAiBA,MAAY;AACjCF,IAAAA,cAAAA,CAAeG,MAAS,CAAA;AAAA,EAC1B,CAAA;AAEA,EAAA,OAAOZ,YAAAA,CAAaa,KAAAA,CAAMC,GAAAA,CAAI,CAAC;AAAA,IAAEC,GAAAA,EAAKC,OAAAA;AAAAA,IAASH,KAAAA,EAAOI;AAAAA,GAAK,KAAM;AAC/D,IAAA,uBACE,GAAA,CAAC,IAAA,EAAA,EACEA,QAAAA,EAAAA,IAAAA,CAAKH,GAAAA,CAAI,CAAC;AAAA,MAAEI,IAAAA;AAAAA,MAAMC,cAAAA;AAAAA,MAAgBJ,GAAAA,EAAKK,MAAAA;AAAAA,MAAQP,KAAAA,EAAOQ;AAAAA,KAAS,KAAM;AACpE,MAAA,MAAMC,UAAAA,GACHhB,aAAaiB,UAAAA,CAAWjB,SAAAA,EAAWe,QAAQ,CAAA,IAC3Cd,OAAAA,IAAWgB,UAAAA,CAAWhB,OAAAA,EAASc,QAAQ,CAAA;AAE1C,MAAA,MAAMG,KAAAA,uBAAYC,IAAAA,EAAK;AAEvB,MAAA,MAAMC,aAAAA,GAAgBH,UAAAA,CAAWC,KAAAA,EAAOH,QAAQ,CAAA;AAChD,MAAA,MAAMM,4BAA4BC,OAAAA,CAChCtB,SAAAA,IAAaC,WAAWc,QAAAA,GAAWf,SAAAA,IAAae,WAAWd,OAC7D,CAAA;AAEA,MAAA,IAAIsB,UAAAA,GAAa,KAAA;AACjB,MAAA,IAAI3B,mBAAAA,IAAuBmB,WAAWG,KAAAA,EAAO;AAC3CK,QAAAA,UAAAA,GAAa,IAAA;AAAA,MACf;AAEA,MAAA,IACE1B,wBAAAA,IACAF,YAAAA,KAAiB,WAAA,IACjBoB,QAAAA,GAAWG,KAAAA,EACX;AACAK,QAAAA,UAAAA,GAAa,IAAA;AAAA,MACf;AAEA,MAAA,IACEzB,cAAAA,GAAiB,KACjBE,SAAAA,IACA,CAACwB,uBAAuBxB,SAAAA,EAAWe,QAAAA,EAAUjB,cAAc,CAAA,EAC3D;AACAyB,QAAAA,UAAAA,GAAa,IAAA;AAAA,MACf;AAGA,MAAA,IACE5B,YAAAA,KAAiB,aACjBK,SAAAA,IACAA,SAAAA,GAAYe,YACZ,CAACE,UAAAA,CAAWjB,SAAAA,EAAWe,QAAQ,CAAA,EAC/B;AACAQ,QAAAA,UAAAA,GAAa,IAAA;AAAA,MACf;AAGA,MAAA,IACE5B,iBAAiB,WAAA,IACjB,CAACK,SAAAA,IACDC,OAAAA,IACAc,WAAWd,OAAAA,EACX;AACAsB,QAAAA,UAAAA,GAAa,IAAA;AAAA,MACf;AAEA,MAAA,MAAME,sCAAAA,GACJ9B,YAAAA,KAAiB,SAAA,IACjB,CAACM,OAAAA,IACDqB,OAAAA,CACEtB,SAAAA,IAAaE,WAAAA,IAAea,QAAAA,GAAWf,SAAAA,IAAae,QAAAA,GAAWb,WACjE,CAAA;AAEF,MAAA,MAAMwB,sCAAAA,GACJ/B,YAAAA,KAAiB,WAAA,IACjB,CAACK,SAAAA,IACDsB,OAAAA,CACErB,OAAAA,IAAWC,WAAAA,IAAea,QAAAA,GAAWd,OAAAA,IAAWc,QAAAA,GAAWb,WAC7D,CAAA;AAEF,MAAA,MAAMyB,2BACJF,sCAAAA,IACAC,sCAAAA;AAEF,MAAA,MAAME,mBAAmBA,MAAM;AAC7BzB,QAAAA,cAAAA,CAAeY,QAAQ,CAAA;AAAA,MACzB,CAAA;AAEA,MAAA,MAAMc,cAAcA,MAAM;AACxB,QAAA,IAAIN,UAAAA,EAAY;AACd,UAAA,OAAO,KAAA;AAAA,QACT;AAIA,QAAA,IAAI5B,YAAAA,KAAiB,eAAeK,SAAAA,EAAW;AAC7Ce,UAAAA,QAAAA,CAASe,QAAAA,CAAS9B,SAAAA,CAAU+B,QAAAA,EAAU,CAAA;AACtChB,UAAAA,QAAAA,CAASiB,UAAAA,CAAWhC,SAAAA,CAAUiC,UAAAA,EAAY,CAAA;AAC1ClB,UAAAA,QAAAA,CAASmB,UAAAA,CAAWlC,SAAAA,CAAUmC,UAAAA,EAAY,CAAA;AAAA,QAC5C;AAIA,QAAA,IAAIxC,YAAAA,KAAiB,aAAaM,OAAAA,EAAS;AACzCc,UAAAA,QAAAA,CAASe,QAAAA,CAAS7B,OAAAA,CAAQ8B,QAAAA,EAAU,CAAA;AACpChB,UAAAA,QAAAA,CAASiB,UAAAA,CAAW/B,OAAAA,CAAQgC,UAAAA,EAAY,CAAA;AACxClB,UAAAA,QAAAA,CAASmB,UAAAA,CAAWjC,OAAAA,CAAQkC,UAAAA,EAAY,CAAA;AAAA,QAC1C;AAEApC,QAAAA,eAAAA,CAAgBgB,UAAUpB,YAAY,CAAA;AAAA,MACxC,CAAA;AAEA,MAAA,uBACE,GAAA,CAAC,sBACC,yBAAA,EACEgC,wBAAAA,IAA4BN,2BAE9B,eAAA,EAAiBR,cAAAA,EACjB,aAAaU,UAAAA,EACb,WAAA,EAAaP,YACb,UAAA,EAAYI,aAAAA,EAEZ,SAASS,WAAAA,EACT,YAAA,EAAcD,kBACd,YAAA,EAAcvB,cAAAA,EAEbO,kBALIE,MAMP,CAAA;AAAA,IAEJ,CAAC,KArHMJ,OAsHT,CAAA;AAAA,EAEJ,CAAC,CAAA;AACH,CAAA;AAaA,MAAM0B,kBAAkBA,CAAC;AAAA,EACvBC,iBAAAA;AAAAA,EACAC,mBAAAA;AAAAA,EACAC,eAAAA;AAAAA,EACAC,iBAAAA;AAAAA,EACAC,UAAAA;AAAAA,EACAC,YAAAA;AAAAA,EACAC,qBAAAA;AAAAA,EACAC;AACoB,CAAA,KAAM;AAC1B,EAAA,MAAMC,2BAAAA,GAA8BA,CAACC,KAAAA,KAAsB;AACzDA,IAAAA,KAAAA,CAAMC,cAAAA,EAAe;AACrBH,IAAAA,mBAAAA,CAAoB,CAACD,qBAAqB,CAAA;AAAA,EAC5C,CAAA;AAEA,EAAA,4BACG,wBAAA,EAAA,EACC,aAAA,EAAY,yBACZ,YAAA,EAAc,KAAA,EACd,aAAY,UAAA,EAEZ,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,mBAAA,EAAA,EAAoB,WAAA,EAAY,UAAA,EAC9BL,QAAAA,EAAAA,mBAAAA,CAAoB9B,IAAI,CAAC;AAAA,MAAEwC,SAAAA,EAAW;AAAA,QAAEhD,SAAAA;AAAAA,QAAWC;AAAAA,OAAQ;AAAA,MAAGgD;AAAAA,KAAM,KAAM;AACzE,MAAA,MAAMC,kBAAkBA,MAAM;AAC5BR,QAAAA,YAAAA,CAAa1C,SAAS,CAAA;AACtByC,QAAAA,UAAAA,CAAWxC,OAAO,CAAA;AAClBoC,QAAAA,iBAAAA,CAAkBrC,WAAWC,OAAO,CAAA;AAAA,MACtC,CAAA;AAEA,MAAA,MAAMkD,eAAAA,GACJZ,eAAAA,IACAA,eAAAA,KAAoBtC,OAAAA,IACpBuC,qBACAA,iBAAAA,KAAsBxC,SAAAA;AAExB,MAAA,2BACG,kBAAA,EAAA,EACC,aAAA,EAAa,mBAAmBA,SAAAA,CAAUoD,OAAAA,EAAS,CAAA,CAAA,EAEnD,OAAA,EAASF,iBAET,QAAA,kBAAA,IAAA,CAAC,SAAA,EAAA,EACC,iBAAeC,eAAAA,EACf,aAAA,EAAaF,OACb,cAAA,EAAe,eAAA,EACf,aAAY,YAAA,EAEXA,QAAAA,EAAAA;AAAAA,QAAAA,KAAAA;AAAAA,QACAE,eAAAA,oBAAmB,GAAA,CAACE,QAAA,EAAA,EAAK,IAAA,EAAK,OAAA,EAAO;AAAA,OAAA,EACxC,CAAA,EAAA,EAXKrD,SAAAA,CAAUsD,WAAAA,EAYjB,CAAA;AAAA,IAEJ,CAAC,CAAA,EACH,CAAA;AAAA,oBACA,GAAA,CAAC,sBAAmB,OAAA,EAAST,2BAAAA,EAC3B,+BAAC,SAAA,EAAA,EACC,cAAA,EAAe,eAAA,EACf,WAAA,EAAY,YAAA,EAAY,QAAA,EAAA;AAAA,MAAA,iCAAA;AAAA,sBAEO,GAAA,CAACQ,QAAA,EAAA,EAAK,IAAA,EAAK,eAAA,EAAe;AAAA,KAAA,EAC3D,CAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ,CAAA;AAEA,MAAME,eAAAA,GAAkBA,CACtBC,UAAAA,KAC6C;AAC7C,EAAA,IAAI,CAACC,cAAAA,CAAeC,IAAAA,CAAKF,UAAU,CAAA,EAAG;AACpC,IAAA,OAAO;AAAA,MAAEG,OAAAA,EAAS;AAAA,KAAM;AAAA,EAC1B;AAEA,EAAA,MAAM,CAACC,KAAAA,EAAOC,OAAAA,EAASC,OAAO,CAAA,GAAIN,UAAAA,CAAWO,MAAM,GAAG,CAAA;AAEtD,EAAA,MAAMC,aAAAA,GAAgBC,QAAAA,CAASL,KAAAA,EAAO,EAAE,CAAA;AACxC,EAAA,IAAIM,MAAAA,CAAOC,KAAAA,CAAMH,aAAa,CAAA,EAAG;AAC/B,IAAA,OAAO;AAAA,MAAEL,OAAAA,EAAS;AAAA,KAAM;AAAA,EAC1B;AAEA,EAAA,IAAIK,aAAAA,GAAgB,EAAA,IAAMA,aAAAA,GAAgB,CAAA,EAAG;AAC3C,IAAA,OAAO;AAAA,MAAEL,OAAAA,EAAS;AAAA,KAAM;AAAA,EAC1B;AAEA,EAAA,IAAIS,UAAAA;AACJ,EAAA,IAAI,CAACP,OAAAA,EAAS;AACZO,IAAAA,UAAAA,GAAaC,KAAAA,CAAMT,OAAO,GAAG,CAAA;AAAA,EAC/B,CAAA,MAAO;AACL,IAAA,MAAMU,eAAAA,GAAkBL,QAAAA,CAASJ,OAAAA,EAAS,EAAE,CAAA;AAC5C,IAAA,IAAIK,MAAAA,CAAOC,KAAAA,CAAMG,eAAe,CAAA,EAAG;AACjC,MAAA,OAAO;AAAA,QAAEX,OAAAA,EAAS;AAAA,OAAM;AAAA,IAC1B;AAEA,IAAA,IAAIW,eAAAA,GAAkB,EAAA,IAAMA,eAAAA,GAAkB,CAAA,EAAG;AAC/C,MAAA,OAAO;AAAA,QAAEX,OAAAA,EAAS;AAAA,OAAM;AAAA,IAC1B;AAEA,IAAA,IAAI,CAACG,OAAAA,EAAS;AACZM,MAAAA,UAAAA,GAAaC,MAAM,CAAA,EAAGT,KAAK,CAAA,CAAA,EAAIC,OAAO,IAAI,MAAM,CAAA;AAAA,IAClD,CAAA,MAAO;AACL,MAAA,MAAMU,eAAAA,GAAkBN,QAAAA,CAASH,OAAAA,EAAS,EAAE,CAAA;AAE5C,MAAA,IAAII,MAAAA,CAAOC,KAAAA,CAAMI,eAAe,CAAA,EAAG;AACjC,QAAA,OAAO;AAAA,UAAEZ,OAAAA,EAAS;AAAA,SAAM;AAAA,MAC1B;AAEA,MAAA,IAAIY,eAAAA,GAAkB,EAAA,IAAMA,eAAAA,GAAkB,CAAA,EAAG;AAC/C,QAAA,OAAO;AAAA,UAAEZ,OAAAA,EAAS;AAAA,SAAM;AAAA,MAC1B;AAEAS,MAAAA,UAAAA,GAAaC,KAAAA,CAAM,GAAGT,KAAK,CAAA,CAAA,EAAIC,OAAO,CAAA,CAAA,EAAIC,OAAO,IAAI,SAAS,CAAA;AAAA,IAChE;AAAA,EACF;AAEA,EAAA,IAAI,CAACM,UAAAA,CAAWT,OAAAA,EAAQ,EAAG;AACzB,IAAA,OAAO;AAAA,MAAEA,OAAAA,EAAS;AAAA,KAAM;AAAA,EAC1B;AAEA,EAAA,IAAI,CAACS,UAAAA,CAAWT,OAAAA,EAAQ,EAAG;AACzB,IAAA,OAAO;AAAA,MAAEA,OAAAA,EAAS;AAAA,KAAM;AAAA,EAC1B;AAEA,EAAA,OAAO;AAAA,IAAEA,OAAAA,EAAS,IAAA;AAAA,IAAMS;AAAAA,GAAW;AACrC,CAAA;AAEA,MAAMX,cAAAA,GAAiB,iCAAA;AAQvB,MAAMe,YAAYA,CAAC;AAAA,EAAE5D,IAAAA;AAAAA,EAAM6D,OAAAA;AAAAA,EAASC;AAAkC,CAAA,KAAM;AAC1E,EAAA,IAAIC,SAAAA,GAAYN,MAAMzD,IAAI,CAAA;AAC1B,EAAA,IAAI,CAACA,IAAAA,EAAM;AACT+D,IAAAA,SAAAA,GAAYA,SAAAA,CAAUC,IAAAA,CAAK,EAAE,CAAA,CAAEC,OAAO,CAAC,CAAA;AAAA,EACzC;AAEA,EAAA,MAAMC,aAAAA,GAAgBJ,oBAClBC,SAAAA,CAAUI,MAAAA,CAAO,UAAU,CAAA,GAC3BJ,SAAAA,CAAUI,OAAO,OAAO,CAAA;AAC5B,EAAA,MAAM,CAACvB,UAAAA,EAAYwB,aAAa,CAAA,GAAI5E,SAAiB0E,aAAa,CAAA;AAClE,EAAA,MAAM,CAACG,WAAAA,EAAaC,cAAc,CAAA,GAAI9E,SAAkB,IAAI,CAAA;AAC5D,EAAA,MAAM,CAAC+E,QAAAA,EAAUC,WAAW,CAAA,GAAIhF,QAAAA,EAAmB;AACnD,EAAA,MAAMiF,SAAAA,GAAY/D,QAAQV,IAAI,CAAA;AAE9B0E,EAAAA,SAAAA,CAAU,MAAM;AACd,IAAA,IAAI1E,IAAAA,EAAM;AACRwE,MAAAA,WAAAA,CAAYT,SAAAA,CAAUI,MAAAA,CAAO,GAAG,CAAa,CAAA;AAAA,IAC/C;AAAA,EACF,CAAA,EAAG,CAACnE,IAAAA,EAAM+D,SAAS,CAAC,CAAA;AAEpB,EAAA,MAAMY,gBAAAA,GAAmBC,WAAAA,CACvB,CAACC,aAAAA,KAA0B;AACzBT,IAAAA,aAAAA,CAAcS,aAAa,CAAA;AAE3B,IAAA,IAAI,CAAC7E,IAAAA,EAAM;AACT,MAAA;AAAA,IACF;AAEA,IAAA,MAAM8E,WAAAA,GAAcD,cAAcE,IAAAA,EAAK;AACvC,IAAA,IAAI,CAACD,WAAAA,EAAa;AAChB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM;AAAA,MAAE/B,OAAAA;AAAAA,MAASS;AAAAA,KAAW,GAAIb,gBAAgBmC,WAAW,CAAA;AAE3D,IAAA,IAAI,CAAC/B,OAAAA,EAAS;AACZuB,MAAAA,cAAAA,CAAe,KAAK,CAAA;AACpB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,CAACd,UAAAA,EAAY;AACfc,MAAAA,cAAAA,CAAe,KAAK,CAAA;AACpB,MAAA;AAAA,IACF;AAEAA,IAAAA,cAAAA,CAAe,IAAI,CAAA;AAEnB,IAAA,IAAIN,IAAAA,GAAOR,WAAWQ,IAAAA,EAAK;AAK3B,IAAA,IAAIO,QAAAA,KAAa,IAAA,IAAQP,IAAAA,IAAQ,EAAA,EAAI;AACnCQ,MAAAA,WAAAA,CAAY,IAAI,CAAA;AAAA,IAClB;AAGA,IAAA,IAAID,QAAAA,KAAa,IAAA,IAAQP,IAAAA,GAAO,EAAA,EAAI;AAClCA,MAAAA,IAAAA,GAAOR,UAAAA,CAAWQ,MAAK,GAAI,EAAA;AAAA,IAC7B;AAEA,IAAA,MAAMgB,OAAAA,GAAUlB,iBAAAA,GACZC,SAAAA,CACGC,IAAAA,CAAKA,IAAI,CAAA,CACTC,MAAAA,CAAOT,UAAAA,CAAWS,MAAAA,EAAQ,CAAA,CAC1BgB,MAAAA,CAAOzB,UAAAA,CAAWyB,MAAAA,EAAQ,CAAA,CAC1BC,MAAAA,EAAO,GACVnB,SAAAA,CAAUC,IAAAA,CAAKA,IAAI,CAAA,CAAEC,MAAAA,CAAOT,UAAAA,CAAWS,MAAAA,EAAQ,CAAA,CAAEiB,MAAAA,EAAO;AAE5DrB,IAAAA,OAAAA,CAAQmB,OAAO,CAAA;AAAA,EACjB,GACA,CAAChF,IAAAA,EAAM+D,WAAWQ,QAAAA,EAAUV,OAAAA,EAASC,iBAAiB,CACxD,CAAA;AAEA,EAAA,MAAMqB,oBAAAA,GAAuBP,WAAAA,CAC3B,CAACQ,WAAAA,KAAwB;AACvBZ,IAAAA,WAAAA,CAAYY,WAAuB,CAAA;AAEnC,IAAA,IAAIA,WAAAA,KAAgB,IAAA,IAAQrB,SAAAA,CAAUC,IAAAA,KAAS,EAAA,EAAI;AACjD,MAAA,MAAMgB,OAAAA,GAAUjB,UAAUC,IAAAA,CAAKD,SAAAA,CAAUC,MAAK,GAAI,EAAE,EAAEkB,MAAAA,EAAO;AAE7DrB,MAAAA,OAAAA,CAAQmB,OAAO,CAAA;AAEf,MAAA;AAAA,IACF;AAEA,IAAA,IAAII,WAAAA,KAAgB,IAAA,IAAQrB,SAAAA,CAAUC,IAAAA,MAAU,EAAA,EAAI;AAClD,MAAA,MAAMgB,OAAAA,GAAUjB,UAAUC,IAAAA,CAAKD,SAAAA,CAAUC,MAAK,GAAI,EAAE,EAAEkB,MAAAA,EAAO;AAE7DrB,MAAAA,OAAAA,CAAQmB,OAAO,CAAA;AAEf,MAAA;AAAA,IACF;AAAA,EACF,CAAA,EACA,CAACjB,SAAAA,EAAWF,OAAO,CACrB,CAAA;AAEA,EAAA,MAAMwB,aAAAA,GAAgBT,WAAAA,CACpB,CAAC1C,KAAAA,KAA2C;AAC1C,IAAA,IAAIA,KAAAA,CAAMrC,QAAQ,OAAA,EAAS;AACzB,MAAA,MAAM;AAAA,QAAEkD,OAAAA;AAAAA,QAASS;AAAAA,OAAW,GAAIb,gBAAgBC,UAAU,CAAA;AAE1D,MAAA,IAAI,CAACG,OAAAA,EAAS;AACZ,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,CAACS,UAAAA,EAAY;AACf,QAAA;AAAA,MACF;AAEA,MAAA,MAAMwB,OAAAA,GAAUlB,iBAAAA,GACZC,SAAAA,CACGC,IAAAA,CAAKR,UAAAA,CAAWQ,IAAAA,EAAM,CAAA,CACtBC,MAAAA,CAAOT,UAAAA,CAAWS,MAAAA,EAAQ,EAC1BgB,MAAAA,CAAOzB,UAAAA,CAAWyB,MAAAA,EAAQ,CAAA,CAC1BC,MAAAA,EAAO,GACVnB,SAAAA,CAAUC,KAAKR,UAAAA,CAAWQ,IAAAA,EAAM,CAAA,CAAEC,MAAAA,CAAOT,UAAAA,CAAWS,MAAAA,EAAQ,EAAEiB,MAAAA,EAAO;AAEzErB,MAAAA,OAAAA,CAAQmB,OAAO,CAAA;AAAA,IACjB;AAAA,EACF,GACA,CAACjB,SAAAA,EAAWF,OAAAA,EAASC,iBAAAA,EAAmBlB,UAAU,CACpD,CAAA;AAEA,EAAA,uBACE,IAAA,CAAC,kBAAA,EAAA,EACC,GAAA,EAAI,IAAA,EACJ,OAAA,EAAQ,IAAA,EACR,QAAA,EAAU,CAAA,EAAGhG,iBAAiB,CAAA,CAAA,EAC9B,WAAA,EAAY,YAAA,EAEZ,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,SAAA,EAAA,EAAU,UAAS,KAAA,EAClB,QAAA,kBAAA,GAAA,CAAC,SAAM,OAAA,EAAQ,6BAAA,EAA8B,kBAAI,CAAA,EACnD,CAAA;AAAA,yBACC,SAAA,EAAA,EACC,GAAA,EAAI,MACJ,cAAA,EAAe,cAAA,EACf,aAAY,YAAA,EAEZ,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,SAAA,EAAA,EACC,QAAA,EAAS,KAAA,EACT,WAAA,EAAY,YAAA,EAEZ,8BAAC,SAAA,EAAA,EACC,aAAA,EAAY,6BAAA,EACZ,QAAA,EAAU,CAAC6H,SAAAA,EACX,OAAOJ,WAAAA,GAAc,IAAA,GAAO,IAAA,EAC5B,EAAA,EAAG,6BAAA,EACH,QAAA,EAAUM,kBACV,SAAA,EAAWU,aAAAA,EACX,KAAA,EAAOzC,UAAAA,EAAW,CAAA,EAEtB,CAAA;AAAA,sBACA,GAAA,CAAC,aAAU,QAAA,EAAS,KAAA,EAClB,8BAAC,WAAA,EAAA,EACC,OAAA,EAASuC,oBAAAA,EACT,OAAA,EAAS,CACP;AAAA,QACE9C,KAAAA,EAAO,IAAA;AAAA,QACP1C,KAAAA,EAAO;AAAA,OACT,EACA;AAAA,QACE0C,KAAAA,EAAO,IAAA;AAAA,QACP1C,KAAAA,EAAO;AAAA,OACR,CAAA,EAEH,QAAA,EAAU4E,QAAAA,EACV,IAAA,EAAK,WAAS,CAAA,EAElB;AAAA,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ,CAAA;AAiBA,MAAMe,iBAAiBA,CAAC;AAAA,EACtBC,eAAAA;AAAAA,EACAlG,OAAAA;AAAAA,EACAL,mBAAAA;AAAAA,EACAC,wBAAAA;AAAAA,EACAC,cAAAA;AAAAA,EACA2C,UAAAA;AAAAA,EACA1C,eAAAA;AAAAA,EACA2C,YAAAA;AAAAA,EACAgC,iBAAAA;AAAAA,EACA1E;AACmB,CAAA,KAAM;AACzB,EAAA,MAAM,CAACoG,SAAAA,EAAWC,YAAY,CAAA,GAAIjG,SAAc,WAAW,CAAA;AAE3D,EAAA,MAAMkG,eAAAA,GAAkBd,WAAAA,CAAY,CAACe,MAAAA,KAAmB;AACtDF,IAAAA,YAAAA,CAAaE,MAAa,CAAA;AAAA,EAC5B,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAMC,kBAAAA,GAAqBhB,WAAAA,CACzB,CAACxF,UAAAA,KAAoB;AACnB0C,IAAAA,YAAAA,CAAa1C,UAAS,CAAA;AAEtBD,IAAAA,eAAAA,CAAgBC,YAAW,WAAW,CAAA;AAAA,EACxC,CAAA,EACA,CAACD,eAAAA,EAAiB2C,YAAY,CAChC,CAAA;AAEA,EAAA,MAAM+D,gBAAAA,GAAmBjB,WAAAA,CACvB,CAACvF,QAAAA,KAAkB;AACjBwC,IAAAA,UAAAA,CAAWxC,QAAO,CAAA;AAElBF,IAAAA,eAAAA,CAAgBE,UAAS,SAAS,CAAA;AAAA,EACpC,CAAA,EACA,CAACwC,UAAAA,EAAY1C,eAAe,CAC9B,CAAA;AAEA,EAAA,MAAM2G,2BAA+C,EAAC;AACtD,EAAA,MAAMC,yBAA6C,EAAC;AAGpD,EAAA,IAAI3G,SAAAA,EAAW;AACb0G,IAAAA,wBAAAA,CAAyBE,WAAAA,GAAc5G,SAAAA;AAAAA,EACzC;AAGA,EAAA,IAAIC,OAAAA,EAAS;AACX0G,IAAAA,sBAAAA,CAAuBC,WAAAA,GAAc3G,OAAAA;AAAAA,EACvC;AAEA,EAAA,uBACE,IAAA,CAAC,IAAA,EAAA,EACC,aAAA,EAAeqG,eAAAA,EACf,OAAOF,SAAAA,EAEP,QAAA,EAAA;AAAA,oBAAA,IAAA,CAAC,iBAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,KAAK,OAAA,EAAL,EACC,OAAM,WAAA,EACN,aAAA,EAAY,iCAA+B,QAAA,EAAA,YAAA,EAG7C,CAAA;AAAA,sBACA,GAAA,CAAC,KAAK,OAAA,EAAL,EACC,OAAM,SAAA,EACN,aAAA,EAAY,+BAA6B,QAAA,EAAA,UAAA,EAG3C;AAAA,KAAA,EACF,CAAA;AAAA,oBACA,IAAA,CAAC,IAAA,CAAK,OAAA,EAAL,EAAa,OAAM,WAAA,EAClB,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,0BAAuB,eAAA,EAAiBM,wBAAAA,EACtC,WAACG,IAAAA,qBACA,GAAA,CAAC,YACC,YAAA,EAAcA,IAAAA,EACd,YAAA,EAAa,WAAA,EACb,iBACA,OAAA,EACA,mBAAA,EACA,0BACA,cAAA,EACA,eAAA,EACA,WAAqB,CAAA,EAG3B,CAAA;AAAA,0BACC,SAAA,EAAA,EACC,IAAA,EAAM7G,SAAAA,EACN,OAAA,EAASwG,oBACT,iBAAA,EAAqC;AAAA,KAAA,EAEzC,CAAA;AAAA,oBACA,IAAA,CAAC,IAAA,CAAK,OAAA,EAAL,EAAa,OAAM,SAAA,EAClB,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,0BAAuB,eAAA,EAAiBG,sBAAAA,EACtC,WAACE,IAAAA,qBACA,GAAA,CAAC,YACC,YAAA,EAAcA,IAAAA,EACd,YAAA,EAAa,SAAA,EACb,iBACA,OAAA,EACA,mBAAA,EACA,0BACA,cAAA,EACA,eAAA,EACA,WAAqB,CAAA,EAG3B,CAAA;AAAA,0BACC,SAAA,EAAA,EACC,IAAA,EAAM5G,OAAAA,EACN,OAAA,EAASwG,kBACT,iBAAA,EAAqC;AAAA,KAAA,EAEzC;AAAA,GAAA,EACF,CAAA;AAEJ,CAAA;AAgBO,MAAMK,sBAAsBA,CAAC;AAAA,EAClC7G,OAAAA;AAAAA,EACAD,SAAAA;AAAAA,EACA+G,QAAAA,GAAW,KAAA;AAAA,EACXnH,mBAAAA,GAAsB,KAAA;AAAA,EACtBC,wBAAAA,GAA2B,KAAA;AAAA,EAC3BC,cAAAA,GAAiB,EAAA;AAAA,EACjBuC,iBAAAA;AAAAA,EACA2E,aAAAA,GAAgB,OAAA;AAAA,EAChBC,WAAAA,GAAc,uBAAA;AAAA,EACd3E,mBAAAA;AAAAA,EACAoC;AACwB,CAAA,KAAM;AAC9B,EAAA,MAAM,CAACwC,MAAAA,EAAQC,SAAS,CAAA,GAAI/G,SAAkB,KAAK,CAAA;AACnD,EAAA,MAAM,CAACoC,iBAAAA,EAAmB4E,oBAAoB,CAAA,GAAIhH,QAAAA,EAAe;AACjE,EAAA,MAAM,CAACmC,eAAAA,EAAiB8E,kBAAkB,CAAA,GAAIjH,QAAAA,EAAe;AAC7D,EAAA,MAAM,CAACuC,qBAAAA,EAAuB2E,wBAAwB,CAAA,GAAIlH,SAAkB,KAAK,CAAA;AACjF,EAAA,MAAM,CAACmH,qBAAAA,EAAuBC,wBAAwB,CAAA,GACpDpH,SAAwB4G,aAAa,CAAA;AACvC,EAAA,MAAMS,oBAAAA,GAAuBC,OAAuB,IAAI,CAAA;AAExDpC,EAAAA,SAAAA,CAAU,MAAM;AACd,IAAA,IAAItF,SAAAA,EAAW;AACb,MAAA,IAAIA,SAAAA,CAAU+B,QAAAA,EAAS,KAAM,CAAA,EAAG;AAC9B/B,QAAAA,SAAAA,CAAU8B,SAAS,EAAE,CAAA;AAAA,MACvB;AACAsF,MAAAA,oBAAAA,CAAqBpH,SAAS,CAAA;AAAA,IAChC;AAAA,EACF,CAAA,EAAG,CAACA,SAAS,CAAC,CAAA;AAEdsF,EAAAA,SAAAA,CAAU,MAAM;AACd,IAAA,IAAIrF,OAAAA,EAAS;AACX,MAAA,IAAIA,OAAAA,CAAQ8B,QAAAA,EAAS,KAAM,CAAA,EAAG;AAC5B9B,QAAAA,OAAAA,CAAQ6B,SAAS,EAAE,CAAA;AAAA,MACrB;AACAuF,MAAAA,kBAAAA,CAAmBpH,OAAO,CAAA;AAAA,IAC5B;AAAA,EACF,CAAA,EAAG,CAACA,OAAO,CAAC,CAAA;AAEZ0H,EAAAA,eAAAA,CAAgB,MAAM;AACpB,IAAA,IAAIhF,qBAAAA,IAAyB8E,qBAAqBG,OAAAA,EAAS;AACzD,MAAA,MAAMC,IAAAA,GAAOJ,oBAAAA,CAAqBG,OAAAA,CAAQE,qBAAAA,EAAsB;AAEhE,MAAA,IAAID,IAAAA,CAAKE,KAAAA,GAAQC,MAAAA,CAAOC,UAAAA,EAAY;AAClCT,QAAAA,wBAAAA,CAAyB,MAAM,CAAA;AAAA,MACjC;AAAA,IACF;AAAA,EACF,CAAA,EAAG,CAAC7E,qBAAqB,CAAC,CAAA;AAE1B,EAAA,MAAMwD,eAAAA,GAAkBX,YAAY,MAAY;AAC9C2B,IAAAA,SAAAA,CAAU,KAAK,CAAA;AACfG,IAAAA,wBAAAA,CAAyB,KAAK,CAAA;AAC9BE,IAAAA,wBAAAA,CAAyB,OAAO,CAAA;AAAA,EAClC,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAMU,gBAAAA,GAAmB1C,WAAAA,CAAY,CAAC0B,OAAAA,KAA0B;AAC9DC,IAAAA,SAAAA,CAAUD,OAAM,CAAA;AAEhB,IAAA,IAAI,CAACA,OAAAA,EAAQ;AACXI,MAAAA,wBAAAA,CAAyB,KAAK,CAAA;AAC9BE,MAAAA,wBAAAA,CAAyB,OAAO,CAAA;AAAA,IAClC;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAMW,gBAAAA,GAAmB3C,WAAAA,CACvB,CAAC4C,YAAAA,EAAoBzI,YAAAA,KAAqC;AACxD,IAAA,IACEyI,YAAAA,CAAarG,QAAAA,EAAS,KAAM,CAAA,IAC5BqG,YAAAA,CAAanG,UAAAA,EAAW,KAAM,CAAA,IAC9BmG,YAAAA,CAAajG,UAAAA,EAAW,KAAM,CAAA,EAC9B;AACAiG,MAAAA,YAAAA,CAAatG,SAAS,EAAE,CAAA;AAAA,IAC1B;AAEA,IAAA,IAAInC,iBAAiB,WAAA,EAAa;AAChCyH,MAAAA,oBAAAA,CAAqBgB,YAAY,CAAA;AAEjC,MAAA,IAAI7F,eAAAA,EAAiB;AACnBF,QAAAA,iBAAAA,CAAkB+F,cAAc7F,eAAe,CAAA;AAAA,MACjD;AAAA,IACF;AAEA,IAAA,IAAI5C,iBAAiB,SAAA,EAAW;AAC9B0H,MAAAA,kBAAAA,CAAmBe,YAAY,CAAA;AAE/B,MAAA,IAAI5F,iBAAAA,EAAmB;AACrBH,QAAAA,iBAAAA,CAAkBG,mBAAmB4F,YAAY,CAAA;AAAA,MACnD;AAAA,IACF;AAAA,EACF,CAAA,EACA,CAAC/F,iBAAAA,EAAmBE,eAAAA,EAAiBC,iBAAiB,CACxD,CAAA;AAEA,EAAA,MAAM6F,gBAAAA,GAAmB7C,WAAAA,CAAY,CAAC8C,CAAAA,KAAqC;AACzE,IAAA,IAAIA,CAAAA,CAAE7H,GAAAA,KAAQ,OAAA,IAAW6H,CAAAA,CAAE7H,QAAQ,GAAA,EAAK;AACtC6H,MAAAA,CAAAA,CAAEvF,cAAAA,EAAe;AACjBoE,MAAAA,SAAAA,CAAU,IAAI,CAAA;AAAA,IAChB;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAMoB,yBAAAA,GACJjG,mBAAAA,KAAwBhC,MAAAA,IAAagC,mBAAAA,CAAoBkG,MAAAA,GAAS,CAAA;AAEpE,EAAA,uBACE,IAAA,CAAC,QAAA,EAAA,EACC,YAAA,EAAcN,gBAAAA,EACd,MAAMhB,MAAAA,EAEN,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,SAAS,OAAA,EAAT,EACC,QAAA,EACA,SAAA,EAAWmB,kBAEX,QAAA,kBAAA,GAAA,CAAC,wBAAA,EAAA,EACC,aAAA,EAAY,4BAAA,EACZ,UACA,QAAA,EAAUnB,MAAAA,EACV,aACA,eAAA,EACA,iBAAA,EACA,mBAAqC,CAAA,EAEzC,CAAA;AAAA,wBACC,QAAA,CAAS,OAAA,EAAT,EAAiB,KAAA,EAAM,OAAA,EACtB,8BAAC,SAAA,EAAA,EAAU,WAAA,EAAY,YAAA,EACpBqB,QAAAA,EAAAA,yBAAAA,wBACE,2BAAA,EAAA,EACC,GAAA,EAAI,QACJ,WAAA,EAAY,YAAA,EACZ,SAAQ,MAAA,EAER,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,eAAA,EAAA,EACC,iBAAA,EACA,mBAAA,EACA,eAAA,EACA,iBAAA,EACA,UAAA,EAAYlB,kBAAAA,EACZ,YAAA,EAAcD,oBAAAA,EACd,qBAAA,EACA,mBAAA,EAAqBE,wBAAAA,EAAyB,CAAA;AAAA,MAG/C3E,qBAAAA,oBACC,GAAA,CAAC,yBAAA,EAAA,EACC,cAAA,EAAgB4E,qBAAAA,EAChB,GAAA,EAAKE,oBAAAA,EAEL,QAAA,kBAAA,GAAA,CAAC,cAAA,EAAA,EACC,eAAA,EACA,OAAA,EAASlF,eAAAA,EACT,mBAAA,EACA,wBAAA,EACA,cAAA,EACA,UAAA,EAAY8E,kBAAAA,EACZ,eAAA,EAAiBc,gBAAAA,EACjB,YAAA,EAAcf,oBAAAA,EACd,iBAAA,EAAmB9F,OAAAA,CAAQoD,iBAAiB,CAAA,EAC5C,SAAA,EAAWlC,iBAAAA,EAAkB,CAAA,EAEjC;AAAA,KAAA,EAEJ,CAAA,mBAEA,GAAA,CAAA,QAAA,EAAA,EACE,QAAA,kBAAA,GAAA,CAAC,cAAA,EAAA,EACC,eAAA,EACA,SAASD,eAAAA,EACT,mBAAA,EACA,wBAAA,EACA,cAAA,EACA,UAAA,EAAY8E,kBAAAA,EACZ,iBAAiBc,gBAAAA,EACjB,YAAA,EAAcf,oBAAAA,EACd,iBAAA,EAAmB9F,OAAAA,CAAQoD,iBAAiB,GAC5C,SAAA,EAAWlC,iBAAAA,EAAkB,CAAA,EAEjC,CAAA,EAEJ,CAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;;;;"}
|
|
1
|
+
{"version":3,"file":"DateTimeRangePicker.js","sources":["../../../../src/components/DatePicker/DateTimeRangePicker.tsx"],"sourcesContent":["import {\n Dispatch,\n KeyboardEvent,\n MouseEvent,\n SetStateAction,\n useCallback,\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n} from 'react';\nimport { isSameDate, UseCalendarOptions } from '@h6s/calendar';\nimport { styled } from 'styled-components';\nimport { Dropdown } from '../Dropdown/Dropdown';\nimport {\n Body,\n CalendarRenderer,\n DateTimeRangePickerInput,\n DateTableCell,\n StyledDropdownItem,\n} from './Common';\nimport { Container } from '../Container/Container';\nimport { Panel } from '../Panel/Panel';\nimport { Icon } from '../Icon/Icon';\nimport {\n DateRangeListItem,\n datesAreWithinMaxRange,\n shiftFromTimezone,\n Meridiem,\n Timezone,\n shiftToTimezone,\n} from './utils';\nimport { dayjs, Dayjs } from '@/utils/date';\nimport { Tabs } from '../Tabs/Tabs';\nimport { TextField } from '@/components/TextField';\nimport { ButtonGroup } from '../ButtonGroup/ButtonGroup';\nimport { Label } from '../Label/Label';\n\nconst calendarFullWidth = '258px';\n\nconst PredefinedCalendarContainer = styled(Panel)`\n align-items: start;\n background: ${({ theme }) => theme.click.panel.color.background.muted};\n`;\n\nconst PredefinedTimesContainer = styled(Container)`\n width: ${calendarFullWidth};\n`;\n\ntype OpenDirection = 'left' | 'right';\n\n// left value of 259px is the width of the PredefinedTimesContainer + 1 pixel for border\nconst CalendarRendererContainer = styled.div<{ $openDirection?: OpenDirection }>`\n background: ${({ theme }) =>\n `${theme.click.datePicker.dateOption.color.background.default}`};\n border: ${({ theme }) =>\n `${theme.click.datePicker.dateOption.stroke} solid ${theme.click.datePicker.dateOption.color.background.range}`};\n border-radius: ${({ theme }) => theme.click.datePicker.dateOption.radii.default};\n box-shadow:\n lch(6.77 0 0 / 0.15) 4px 4px 6px -1px,\n lch(6.77 0 0 / 0.15) 2px 2px 4px -1px;\n ${({ $openDirection }) => ($openDirection === 'left' ? 'right: 100%;' : 'left: 259px;')}\n position: absolute;\n top: 0;\n`;\n\n// Height of 221px is height the height the calendar needs to match the PredefinedTimesContainer\nconst StyledCalendarRenderer = styled(CalendarRenderer)`\n border-radius: ${({ theme }) => theme.click.datePicker.dateOption.radii.default};\n min-height: 221px;\n`;\n\nconst StyledTriggerList = styled(Tabs.TriggersList)`\n justify-content: space-around;\n`;\n\n// max-height of 210px allows the scrollable container to be a reasonble height that matches the calendar\nconst ScrollableContainer = styled(Container)`\n max-height: 210px;\n overflow-y: auto;\n`;\n\nconst TimeInputContainer = styled(Container)`\n background: ${({ theme }) =>\n theme.click.datePicker.dateOption.color.background.default};\n`;\n\nconst DateRangeTableCell = styled(DateTableCell)<{\n $shouldShowRangeIndicator?: boolean;\n}>`\n ${({ $shouldShowRangeIndicator, theme }) =>\n $shouldShowRangeIndicator &&\n `\n background: ${theme.click.datePicker.dateOption.color.background.range};\n border: ${theme.click.datePicker.dateOption.stroke} solid ${theme.click.datePicker.dateOption.color.background.range};\n border-radius: 0;\n `}\n`;\n\ntype CalendarType = 'startDate' | 'endDate';\n\ntype SetSelectedDate = (selectedDate: Date, calendarType: CalendarType) => void;\n\ntype SetDate = (date: Date) => void;\n\ninterface CalendarProps {\n calendarBody: Body;\n calendarType: CalendarType;\n futureDatesDisabled: boolean;\n futureStartDatesDisabled: boolean;\n maxRangeLength: number;\n setSelectedDate: SetSelectedDate;\n startDate?: Date;\n endDate?: Date;\n timezone: Timezone;\n}\n\nconst Calendar = ({\n calendarBody,\n calendarType,\n futureDatesDisabled,\n futureStartDatesDisabled,\n maxRangeLength,\n setSelectedDate,\n startDate,\n endDate,\n timezone,\n}: CalendarProps) => {\n const [hoveredDate, setHoveredDate] = useState<Date>();\n\n const today = shiftToTimezone(new Date(), timezone);\n const shiftedStart = startDate ? shiftToTimezone(startDate, timezone) : undefined;\n const shiftedEnd = endDate ? shiftToTimezone(endDate, timezone) : undefined;\n\n const handleMouseOut = (): void => {\n setHoveredDate(undefined);\n };\n\n return calendarBody.value.map(({ key: weekKey, value: week }) => {\n return (\n <tr key={weekKey}>\n {week.map(({ date, isCurrentMonth, key: dayKey, value: fullDate }) => {\n const isSelected =\n (shiftedStart && isSameDate(shiftedStart, fullDate)) ||\n (shiftedEnd && isSameDate(shiftedEnd, fullDate));\n\n const isCurrentDate = isSameDate(today, fullDate);\n const isBetweenStartAndEndDates = Boolean(\n shiftedStart && shiftedEnd && fullDate > shiftedStart && fullDate < shiftedEnd\n );\n\n let isDisabled = false;\n if (futureDatesDisabled && fullDate > today) {\n isDisabled = true;\n }\n\n if (\n futureStartDatesDisabled &&\n calendarType === 'startDate' &&\n fullDate > today\n ) {\n isDisabled = true;\n }\n\n if (\n maxRangeLength > 1 &&\n shiftedStart &&\n !datesAreWithinMaxRange(shiftedStart, fullDate, maxRangeLength)\n ) {\n isDisabled = true;\n }\n\n // start date is selected, end date is not; disable anything before start date\n if (\n calendarType === 'endDate' &&\n !shiftedEnd &&\n shiftedStart &&\n shiftedStart > fullDate &&\n !isSameDate(shiftedStart, fullDate)\n ) {\n isDisabled = true;\n }\n\n // start date isn't selected, but end date is; disable anything after end date\n if (\n calendarType === 'startDate' &&\n !shiftedStart &&\n shiftedEnd &&\n fullDate > shiftedEnd\n ) {\n isDisabled = true;\n }\n\n const startDateSelectedAndIsSelectingEndDate =\n calendarType === 'endDate' &&\n !shiftedEnd &&\n Boolean(\n shiftedStart &&\n hoveredDate &&\n fullDate > shiftedStart &&\n fullDate < hoveredDate\n );\n\n const endDateSelectedAndIsSelectingStartDate =\n calendarType === 'startDate' &&\n !shiftedStart &&\n Boolean(\n shiftedEnd && hoveredDate && fullDate < shiftedEnd && fullDate > hoveredDate\n );\n\n const shouldShowRangeIndicator =\n startDateSelectedAndIsSelectingEndDate ||\n endDateSelectedAndIsSelectingStartDate;\n\n const handleMouseEnter = () => {\n setHoveredDate(fullDate);\n };\n\n const handleClick = () => {\n if (isDisabled) {\n return false;\n }\n\n const originalFullDate = shiftFromTimezone(fullDate, timezone);\n\n // If the user selects a start date and changes the start date\n // use any hours, minutes, seconds they've already set\n if (calendarType === 'startDate' && startDate) {\n if (timezone === 'UTC') {\n originalFullDate.setUTCHours(startDate.getUTCHours());\n originalFullDate.setUTCMinutes(startDate.getUTCMinutes());\n originalFullDate.setUTCSeconds(startDate.getUTCSeconds());\n } else {\n originalFullDate.setHours(startDate.getHours());\n originalFullDate.setMinutes(startDate.getMinutes());\n originalFullDate.setSeconds(startDate.getSeconds());\n }\n }\n\n // If the user selects an end date and changes the end date\n // use any hours, minutes, seconds they've already set\n if (calendarType === 'endDate' && endDate) {\n if (timezone === 'UTC') {\n originalFullDate.setUTCHours(endDate.getUTCHours());\n originalFullDate.setUTCMinutes(endDate.getUTCMinutes());\n originalFullDate.setUTCSeconds(endDate.getUTCSeconds());\n } else {\n originalFullDate.setHours(endDate.getHours());\n originalFullDate.setMinutes(endDate.getMinutes());\n originalFullDate.setSeconds(endDate.getSeconds());\n }\n }\n\n setSelectedDate(originalFullDate, calendarType);\n };\n\n return (\n <DateRangeTableCell\n $shouldShowRangeIndicator={\n shouldShowRangeIndicator || isBetweenStartAndEndDates\n }\n $isCurrentMonth={isCurrentMonth}\n $isDisabled={isDisabled}\n $isSelected={isSelected}\n $isPresent={isCurrentDate}\n key={dayKey}\n onClick={handleClick}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseOut}\n >\n {date}\n </DateRangeTableCell>\n );\n })}\n </tr>\n );\n });\n};\n\ninterface PredefinedTimesProps {\n onSelectDateRange: (selectedStartDate: Date, selectedEndDate: Date) => void;\n predefinedTimesList: DateRangeListItem[];\n selectedEndDate: Date | undefined;\n selectedStartDate: Date | undefined;\n setEndDate: Dispatch<SetStateAction<Date | undefined>>;\n setStartDate: Dispatch<SetStateAction<Date | undefined>>;\n shouldShowCustomRange: boolean;\n showCustomDateRange: Dispatch<SetStateAction<boolean>>;\n}\n\nconst PredefinedTimes = ({\n onSelectDateRange,\n predefinedTimesList,\n selectedEndDate,\n selectedStartDate,\n setEndDate,\n setStartDate,\n shouldShowCustomRange,\n showCustomDateRange,\n}: PredefinedTimesProps) => {\n const handleCustomTimePeriodClick = (event: MouseEvent) => {\n event.preventDefault();\n showCustomDateRange(!shouldShowCustomRange);\n };\n\n return (\n <PredefinedTimesContainer\n data-testid=\"predefined-times-list\"\n isResponsive={false}\n orientation=\"vertical\"\n >\n <ScrollableContainer orientation=\"vertical\">\n {predefinedTimesList.map(({ dateRange: { startDate, endDate }, label }) => {\n const handleItemClick = () => {\n setStartDate(startDate);\n setEndDate(endDate);\n onSelectDateRange(startDate, endDate);\n };\n\n const rangeIsSelected =\n selectedEndDate &&\n selectedEndDate === endDate &&\n selectedStartDate &&\n selectedStartDate === startDate;\n\n return (\n <StyledDropdownItem\n data-testid={`predefined-date-${startDate.getTime()}`}\n key={startDate.toISOString()}\n onClick={handleItemClick}\n >\n <Container\n data-selected={rangeIsSelected}\n data-testid={label}\n justifyContent=\"space-between\"\n orientation=\"horizontal\"\n >\n {label}\n {rangeIsSelected && <Icon name=\"check\" />}\n </Container>\n </StyledDropdownItem>\n );\n })}\n </ScrollableContainer>\n <StyledDropdownItem onClick={handleCustomTimePeriodClick}>\n <Container\n justifyContent=\"space-between\"\n orientation=\"horizontal\"\n >\n Since a specific date and time <Icon name=\"chevron-right\" />\n </Container>\n </StyledDropdownItem>\n </PredefinedTimesContainer>\n );\n};\n\nconst parseTimeString = (\n timeString: string\n): { isValid: boolean; parsedDate?: Dayjs } => {\n if (!validTimeRegex.test(timeString)) {\n return { isValid: false };\n }\n\n const [hours, minutes, seconds] = timeString.split(':');\n\n const hoursAsNumber = parseInt(hours, 10);\n if (Number.isNaN(hoursAsNumber)) {\n return { isValid: false };\n }\n\n if (hoursAsNumber > 23 || hoursAsNumber < 0) {\n return { isValid: false };\n }\n\n let parsedDate;\n if (!minutes) {\n parsedDate = dayjs(hours, 'h');\n } else {\n const minutesAsNumber = parseInt(minutes, 10);\n if (Number.isNaN(minutesAsNumber)) {\n return { isValid: false };\n }\n\n if (minutesAsNumber > 59 || minutesAsNumber < 0) {\n return { isValid: false };\n }\n\n if (!seconds) {\n parsedDate = dayjs(`${hours}:${minutes}`, 'h:mm');\n } else {\n const secondsAsNumber = parseInt(seconds, 10);\n\n if (Number.isNaN(secondsAsNumber)) {\n return { isValid: false };\n }\n\n if (secondsAsNumber > 59 || secondsAsNumber < 0) {\n return { isValid: false };\n }\n\n parsedDate = dayjs(`${hours}:${minutes}:${seconds}`, 'h:mm:ss');\n }\n }\n\n if (!parsedDate.isValid()) {\n return { isValid: false };\n }\n\n return { isValid: true, parsedDate };\n};\n\nconst validTimeRegex = /^\\d{1,2}(:\\d{1,2}(:\\d{1,2})?)?$/;\n\ninterface TimeInputProps {\n date: Date | undefined;\n setDate: (date: Date) => void;\n shouldShowSeconds: boolean;\n timezone: Timezone;\n}\n\nconst TimeInput = ({ date, setDate, shouldShowSeconds, timezone }: TimeInputProps) => {\n let dayjsDate = timezone === 'UTC' ? dayjs.utc(date) : dayjs(date);\n\n if (!date) {\n dayjsDate = dayjsDate.hour(12).minute(0);\n }\n\n const formattedDate = shouldShowSeconds\n ? dayjsDate.format('hh:mm:ss')\n : dayjsDate.format('hh:mm');\n const [timeString, setTimeString] = useState<string>(formattedDate);\n const [dateIsValid, setDateIsValid] = useState<boolean>(true);\n const [meridiem, setMeridiem] = useState<Meridiem>();\n const isEnabled = Boolean(date);\n\n useEffect(() => {\n if (date) {\n setMeridiem(dayjsDate.format('a') as Meridiem);\n }\n }, [date, dayjsDate]);\n\n const handleTimeChange = useCallback(\n (newTimeString: string) => {\n setTimeString(newTimeString);\n\n if (!date) {\n return;\n }\n\n const trimmedTime = newTimeString.trim();\n if (!trimmedTime) {\n return;\n }\n\n const { isValid, parsedDate } = parseTimeString(trimmedTime);\n\n if (!isValid) {\n setDateIsValid(false);\n return;\n }\n\n if (!parsedDate) {\n setDateIsValid(false);\n return;\n }\n\n setDateIsValid(true);\n\n let hour = parsedDate.hour();\n\n // If the meridiem is set to am and the user enters a time greater than 12,\n // e.g. 18:00, it's a pretty clear indication they mean afternoon, so set the\n // meridiem to pm\n if (meridiem === 'am' && hour >= 12) {\n setMeridiem('pm');\n }\n // It's not as easy to infer that a user intended 8:00 to mean 08:00 when the meridiem\n // is set to pm, so don't change the meridiem in that case\n if (meridiem === 'pm' && hour < 12) {\n hour = parsedDate.hour() + 12;\n }\n\n const newDate = shouldShowSeconds\n ? dayjsDate\n .hour(hour)\n .minute(parsedDate.minute())\n .second(parsedDate.second())\n .toDate()\n : dayjsDate.hour(hour).minute(parsedDate.minute()).toDate();\n\n setDate(newDate);\n },\n [date, dayjsDate, meridiem, setDate, shouldShowSeconds]\n );\n\n const handleMeridiemChange = useCallback(\n (newMeridiem: string) => {\n setMeridiem(newMeridiem as Meridiem);\n\n if (newMeridiem === 'pm' && dayjsDate.hour() < 12) {\n const newDate = dayjsDate.hour(dayjsDate.hour() + 12).toDate();\n\n setDate(newDate);\n\n return;\n }\n\n if (newMeridiem === 'am' && dayjsDate.hour() >= 12) {\n const newDate = dayjsDate.hour(dayjsDate.hour() - 12).toDate();\n\n setDate(newDate);\n\n return;\n }\n },\n [dayjsDate, setDate]\n );\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent<HTMLInputElement>) => {\n if (event.key === 'Enter') {\n const { isValid, parsedDate } = parseTimeString(timeString);\n\n if (!isValid) {\n return;\n }\n\n if (!parsedDate) {\n return;\n }\n\n const newDate = shouldShowSeconds\n ? dayjsDate\n .hour(parsedDate.hour())\n .minute(parsedDate.minute())\n .second(parsedDate.second())\n .toDate()\n : dayjsDate.hour(parsedDate.hour()).minute(parsedDate.minute()).toDate();\n\n setDate(newDate);\n }\n },\n [dayjsDate, setDate, shouldShowSeconds, timeString]\n );\n\n return (\n <TimeInputContainer\n gap=\"sm\"\n padding=\"xs\"\n maxWidth={`${calendarFullWidth}`}\n orientation=\"horizontal\"\n >\n <Container maxWidth=\"10%\">\n <Label htmlFor=\"date-time-picker-time-input\">Time</Label>\n </Container>\n <Container\n gap=\"md\"\n justifyContent=\"space-evenly\"\n orientation=\"horizontal\"\n >\n <Container\n maxWidth=\"45%\"\n orientation=\"horizontal\"\n >\n <TextField\n data-testid=\"date-time-picker-time-input\"\n disabled={!isEnabled}\n error={dateIsValid ? null : true}\n id=\"date-time-picker-time-input\"\n onChange={handleTimeChange}\n onKeyDown={handleKeyDown}\n value={timeString}\n />\n </Container>\n <Container maxWidth=\"45%\">\n <ButtonGroup\n onClick={handleMeridiemChange}\n options={[\n {\n label: 'am',\n value: 'am',\n },\n {\n label: 'pm',\n value: 'pm',\n },\n ]}\n selected={meridiem}\n type=\"default\"\n />\n </Container>\n </Container>\n </TimeInputContainer>\n );\n};\n\nexport type Tab = 'startDate' | 'endDate';\n\ninterface TabbedCalendarProps {\n defaultActiveTab?: Tab;\n endDate: Date | undefined;\n futureDatesDisabled: boolean;\n futureStartDatesDisabled: boolean;\n maxRangeLength: number;\n setEndDate: SetDate;\n setSelectedDate: SetSelectedDate;\n setStartDate: SetDate;\n shouldShowSeconds: boolean;\n startDate: Date | undefined;\n timezone: Timezone;\n}\n\nconst TabbedCalendar = ({\n defaultActiveTab = 'startDate',\n endDate,\n futureDatesDisabled,\n futureStartDatesDisabled,\n maxRangeLength,\n setEndDate,\n setSelectedDate,\n setStartDate,\n shouldShowSeconds,\n startDate,\n timezone,\n}: TabbedCalendarProps) => {\n const [activeTab, setActiveTab] = useState<Tab>(defaultActiveTab);\n\n useEffect(() => {\n setActiveTab(defaultActiveTab);\n }, [defaultActiveTab]);\n\n const handleTabChange = useCallback((newTab: string) => {\n setActiveTab(newTab as Tab);\n }, []);\n\n const handleSetStartDate = useCallback(\n (startDate: Date) => {\n setStartDate(startDate);\n\n setSelectedDate(startDate, 'startDate');\n },\n [setSelectedDate, setStartDate]\n );\n\n const handleSetEndDate = useCallback(\n (endDate: Date) => {\n setEndDate(endDate);\n\n setSelectedDate(endDate, 'endDate');\n },\n [setEndDate, setSelectedDate]\n );\n\n const startDateCalendarOptions: UseCalendarOptions = {};\n const endDateCalendarOptions: UseCalendarOptions = {};\n\n // If a start date is selected, open the calendar to that date\n if (startDate) {\n startDateCalendarOptions.defaultDate = startDate;\n }\n\n // If an end date is selected, open the calendar to that date\n if (endDate) {\n endDateCalendarOptions.defaultDate = endDate;\n }\n\n return (\n <Tabs\n onValueChange={handleTabChange}\n value={activeTab}\n >\n <StyledTriggerList>\n <Tabs.Trigger\n value=\"startDate\"\n data-testid=\"tabbed-calendar-trigger-start\"\n >\n Start date\n </Tabs.Trigger>\n <Tabs.Trigger\n value=\"endDate\"\n data-testid=\"tabbed-calendar-trigger-end\"\n >\n End date\n </Tabs.Trigger>\n </StyledTriggerList>\n <Tabs.Content value=\"startDate\">\n <StyledCalendarRenderer\n calendarOptions={startDateCalendarOptions}\n timezone={timezone}\n >\n {(body: Body) => (\n <Calendar\n calendarBody={body}\n calendarType=\"startDate\"\n endDate={endDate}\n futureDatesDisabled={futureDatesDisabled}\n futureStartDatesDisabled={futureStartDatesDisabled}\n maxRangeLength={maxRangeLength}\n setSelectedDate={setSelectedDate}\n startDate={startDate}\n timezone={timezone}\n />\n )}\n </StyledCalendarRenderer>\n <TimeInput\n date={startDate}\n setDate={handleSetStartDate}\n shouldShowSeconds={shouldShowSeconds}\n timezone={timezone}\n />\n </Tabs.Content>\n <Tabs.Content value=\"endDate\">\n <StyledCalendarRenderer\n calendarOptions={endDateCalendarOptions}\n timezone={timezone}\n >\n {(body: Body) => (\n <Calendar\n calendarBody={body}\n calendarType=\"endDate\"\n endDate={endDate}\n futureDatesDisabled={futureDatesDisabled}\n futureStartDatesDisabled={futureStartDatesDisabled}\n maxRangeLength={maxRangeLength}\n setSelectedDate={setSelectedDate}\n startDate={startDate}\n timezone={timezone}\n />\n )}\n </StyledCalendarRenderer>\n <TimeInput\n date={endDate}\n setDate={handleSetEndDate}\n shouldShowSeconds={shouldShowSeconds}\n timezone={timezone}\n />\n </Tabs.Content>\n </Tabs>\n );\n};\n\nexport interface DateTimeRangePickerProps {\n closeOnDateRangeSelected?: boolean;\n defaultActiveTab?: Tab;\n disabled?: boolean;\n endDate?: Date;\n futureDatesDisabled?: boolean;\n futureStartDatesDisabled?: boolean;\n onSelectDateRange: (selectedStartDate: Date, selectedEndDate: Date) => void;\n openDirection?: OpenDirection;\n placeholder?: string;\n predefinedTimesList?: DateRangeListItem[];\n maxRangeLength?: number;\n shouldShowSeconds?: boolean;\n startDate?: Date;\n timezone?: Timezone;\n}\n\nexport const DateTimeRangePicker = ({\n closeOnDateRangeSelected = false,\n defaultActiveTab,\n disabled = false,\n endDate,\n futureDatesDisabled = false,\n futureStartDatesDisabled = false,\n maxRangeLength = -1,\n onSelectDateRange,\n openDirection = 'right',\n placeholder = 'start date – end date',\n predefinedTimesList,\n shouldShowSeconds,\n startDate,\n timezone = 'system',\n}: DateTimeRangePickerProps) => {\n const [isOpen, setIsOpen] = useState<boolean>(false);\n const [selectedStartDate, setSelectedStartDate] = useState<Date>();\n const [selectedEndDate, setSelectedEndDate] = useState<Date>();\n const [shouldShowCustomRange, setShouldShowCustomRange] = useState<boolean>(false);\n const [calendarOpenDirection, setCalendarOpenDirection] =\n useState<OpenDirection>(openDirection);\n const calendarContainerRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!startDate) {\n return;\n }\n\n const startDateCopy = new Date(startDate);\n\n const hours =\n timezone === 'UTC' ? startDateCopy.getUTCHours() : startDateCopy.getHours();\n\n if (hours === 0) {\n if (timezone === 'UTC') {\n startDateCopy.setUTCHours(12);\n } else {\n startDateCopy.setHours(12);\n }\n }\n\n setSelectedStartDate(startDateCopy);\n }, [startDate, timezone]);\n\n useEffect(() => {\n if (!endDate) {\n return;\n }\n\n const endDateCopy = new Date(endDate);\n\n const hours = timezone === 'UTC' ? endDateCopy.getUTCHours() : endDateCopy.getHours();\n if (hours === 0) {\n if (timezone === 'UTC') {\n endDateCopy.setUTCHours(12);\n } else {\n endDateCopy.setHours(12);\n }\n }\n\n setSelectedEndDate(endDateCopy);\n }, [endDate, timezone]);\n\n useLayoutEffect(() => {\n if (shouldShowCustomRange && calendarContainerRef.current) {\n const rect = calendarContainerRef.current.getBoundingClientRect();\n\n if (rect.right > window.innerWidth) {\n setCalendarOpenDirection('left');\n }\n }\n }, [shouldShowCustomRange]);\n\n const closeDatePicker = useCallback((): void => {\n setIsOpen(false);\n setShouldShowCustomRange(false);\n setCalendarOpenDirection('right');\n }, []);\n\n const handleOpenChange = useCallback((isOpen: boolean): void => {\n setIsOpen(isOpen);\n\n if (!isOpen) {\n setShouldShowCustomRange(false);\n setCalendarOpenDirection('right');\n }\n }, []);\n\n const handleSelectDate = useCallback(\n (selectedDate: Date, calendarType: CalendarType): void => {\n const isMidnight =\n timezone === 'UTC'\n ? selectedDate.getUTCHours() === 0 &&\n selectedDate.getUTCMinutes() === 0 &&\n selectedDate.getUTCSeconds() === 0\n : selectedDate.getHours() === 0 &&\n selectedDate.getMinutes() === 0 &&\n selectedDate.getSeconds() === 0;\n\n if (isMidnight) {\n // set the time to 12 noon if time hasn't been set yet\n\n if (timezone === 'UTC') {\n selectedDate.setUTCHours(12);\n } else {\n selectedDate.setHours(12);\n }\n }\n\n if (calendarType === 'startDate') {\n setSelectedStartDate(selectedDate);\n\n if (selectedEndDate) {\n onSelectDateRange(selectedDate, selectedEndDate);\n\n if (closeOnDateRangeSelected) {\n closeDatePicker();\n }\n }\n }\n\n if (calendarType === 'endDate') {\n setSelectedEndDate(selectedDate);\n\n if (selectedStartDate) {\n onSelectDateRange(selectedStartDate, selectedDate);\n\n if (closeOnDateRangeSelected) {\n closeDatePicker();\n }\n }\n }\n },\n [\n closeDatePicker,\n closeOnDateRangeSelected,\n onSelectDateRange,\n selectedEndDate,\n selectedStartDate,\n timezone,\n ]\n );\n\n const onTriggerKeyDown = useCallback((e: KeyboardEvent<HTMLDivElement>) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n setIsOpen(true);\n }\n }, []);\n\n const shouldShowPredefinedTimes =\n predefinedTimesList !== undefined && predefinedTimesList.length > 0;\n\n return (\n <Dropdown\n onOpenChange={handleOpenChange}\n open={isOpen}\n >\n <Dropdown.Trigger\n disabled={disabled}\n onKeyDown={onTriggerKeyDown}\n >\n <DateTimeRangePickerInput\n data-testid=\"datepicker-input-container\"\n disabled={disabled}\n isActive={isOpen}\n placeholder={placeholder}\n selectedEndDate={selectedEndDate}\n selectedStartDate={selectedStartDate}\n shouldShowSeconds={shouldShowSeconds}\n timezone={timezone}\n />\n </Dropdown.Trigger>\n <Dropdown.Content align=\"start\">\n <Container orientation=\"horizontal\">\n {shouldShowPredefinedTimes ? (\n <PredefinedCalendarContainer\n gap=\"none\"\n orientation=\"horizontal\"\n padding=\"none\"\n >\n <PredefinedTimes\n onSelectDateRange={onSelectDateRange}\n predefinedTimesList={predefinedTimesList}\n selectedEndDate={selectedEndDate}\n selectedStartDate={selectedStartDate}\n setEndDate={setSelectedEndDate}\n setStartDate={setSelectedStartDate}\n shouldShowCustomRange={shouldShowCustomRange}\n showCustomDateRange={setShouldShowCustomRange}\n />\n\n {shouldShowCustomRange && (\n <CalendarRendererContainer\n $openDirection={calendarOpenDirection}\n ref={calendarContainerRef}\n >\n <TabbedCalendar\n defaultActiveTab={defaultActiveTab}\n endDate={selectedEndDate}\n futureDatesDisabled={futureDatesDisabled}\n futureStartDatesDisabled={futureStartDatesDisabled}\n maxRangeLength={maxRangeLength}\n setEndDate={setSelectedEndDate}\n setSelectedDate={handleSelectDate}\n setStartDate={setSelectedStartDate}\n shouldShowSeconds={Boolean(shouldShowSeconds)}\n startDate={selectedStartDate}\n timezone={timezone}\n />\n </CalendarRendererContainer>\n )}\n </PredefinedCalendarContainer>\n ) : (\n <>\n <TabbedCalendar\n defaultActiveTab={defaultActiveTab}\n endDate={selectedEndDate}\n futureDatesDisabled={futureDatesDisabled}\n futureStartDatesDisabled={futureStartDatesDisabled}\n maxRangeLength={maxRangeLength}\n setEndDate={setSelectedEndDate}\n setSelectedDate={handleSelectDate}\n setStartDate={setSelectedStartDate}\n shouldShowSeconds={Boolean(shouldShowSeconds)}\n startDate={selectedStartDate}\n timezone={timezone}\n />\n </>\n )}\n </Container>\n </Dropdown.Content>\n </Dropdown>\n );\n};\n"],"names":["calendarFullWidth","PredefinedCalendarContainer","styled","Panel","withConfig","componentId","theme","click","panel","color","background","muted","PredefinedTimesContainer","Container","CalendarRendererContainer","div","datePicker","dateOption","default","stroke","range","radii","$openDirection","StyledCalendarRenderer","CalendarRenderer","StyledTriggerList","Tabs","TriggersList","ScrollableContainer","TimeInputContainer","DateRangeTableCell","DateTableCell","$shouldShowRangeIndicator","Calendar","calendarBody","calendarType","futureDatesDisabled","futureStartDatesDisabled","maxRangeLength","setSelectedDate","startDate","endDate","timezone","hoveredDate","setHoveredDate","useState","today","shiftToTimezone","Date","shiftedStart","undefined","shiftedEnd","handleMouseOut","value","map","key","weekKey","week","date","isCurrentMonth","dayKey","fullDate","isSelected","isSameDate","isCurrentDate","isBetweenStartAndEndDates","Boolean","isDisabled","datesAreWithinMaxRange","startDateSelectedAndIsSelectingEndDate","endDateSelectedAndIsSelectingStartDate","shouldShowRangeIndicator","handleMouseEnter","handleClick","originalFullDate","shiftFromTimezone","setUTCHours","getUTCHours","setUTCMinutes","getUTCMinutes","setUTCSeconds","getUTCSeconds","setHours","getHours","setMinutes","getMinutes","setSeconds","getSeconds","PredefinedTimes","onSelectDateRange","predefinedTimesList","selectedEndDate","selectedStartDate","setEndDate","setStartDate","shouldShowCustomRange","showCustomDateRange","handleCustomTimePeriodClick","event","preventDefault","dateRange","label","handleItemClick","rangeIsSelected","getTime","Icon","toISOString","parseTimeString","timeString","validTimeRegex","test","isValid","hours","minutes","seconds","split","hoursAsNumber","parseInt","Number","isNaN","parsedDate","dayjs","minutesAsNumber","secondsAsNumber","TimeInput","setDate","shouldShowSeconds","dayjsDate","utc","hour","minute","formattedDate","format","setTimeString","dateIsValid","setDateIsValid","meridiem","setMeridiem","isEnabled","useEffect","handleTimeChange","useCallback","newTimeString","trimmedTime","trim","newDate","second","toDate","handleMeridiemChange","newMeridiem","handleKeyDown","TabbedCalendar","defaultActiveTab","activeTab","setActiveTab","handleTabChange","newTab","handleSetStartDate","handleSetEndDate","startDateCalendarOptions","endDateCalendarOptions","defaultDate","body","DateTimeRangePicker","closeOnDateRangeSelected","disabled","openDirection","placeholder","isOpen","setIsOpen","setSelectedStartDate","setSelectedEndDate","setShouldShowCustomRange","calendarOpenDirection","setCalendarOpenDirection","calendarContainerRef","useRef","startDateCopy","endDateCopy","useLayoutEffect","current","rect","getBoundingClientRect","right","window","innerWidth","closeDatePicker","handleOpenChange","handleSelectDate","selectedDate","isMidnight","onTriggerKeyDown","e","shouldShowPredefinedTimes","length"],"mappings":"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"}
|