@clickhouse/click-ui 0.2.0-rc.7 → 0.2.0-rc.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (29) hide show
  1. package/dist/cjs/components/DatePicker/Common.cjs +79 -48
  2. package/dist/cjs/components/DatePicker/Common.cjs.map +1 -1
  3. package/dist/cjs/components/DatePicker/DateRangePicker.cjs +24 -24
  4. package/dist/cjs/components/DatePicker/DateRangePicker.cjs.map +1 -1
  5. package/dist/cjs/components/DatePicker/DateTimeRangePicker.cjs +78 -40
  6. package/dist/cjs/components/DatePicker/DateTimeRangePicker.cjs.map +1 -1
  7. package/dist/cjs/components/DatePicker/index.cjs +29 -18
  8. package/dist/cjs/components/DatePicker/index.cjs.map +1 -1
  9. package/dist/cjs/components/DatePicker/utils.cjs +42 -14
  10. package/dist/cjs/components/DatePicker/utils.cjs.map +1 -1
  11. package/dist/esm/components/DatePicker/Common.js +80 -49
  12. package/dist/esm/components/DatePicker/Common.js.map +1 -1
  13. package/dist/esm/components/DatePicker/DateRangePicker.js +25 -25
  14. package/dist/esm/components/DatePicker/DateRangePicker.js.map +1 -1
  15. package/dist/esm/components/DatePicker/DateTimeRangePicker.js +79 -41
  16. package/dist/esm/components/DatePicker/DateTimeRangePicker.js.map +1 -1
  17. package/dist/esm/components/DatePicker/index.js +30 -19
  18. package/dist/esm/components/DatePicker/index.js.map +1 -1
  19. package/dist/esm/components/DatePicker/utils.js +36 -10
  20. package/dist/esm/components/DatePicker/utils.js.map +1 -1
  21. package/dist/types/components/DatePicker/Common.d.ts +9 -4
  22. package/dist/types/components/DatePicker/DatePicker.d.ts +11 -2
  23. package/dist/types/components/DatePicker/DateRangePicker.d.ts +3 -2
  24. package/dist/types/components/DatePicker/DateTimeRangePicker.d.ts +3 -2
  25. package/dist/types/components/DatePicker/index.d.ts +2 -1
  26. package/dist/types/components/DatePicker/utils.d.ts +9 -8
  27. package/dist/types/index.d.ts +1 -1
  28. package/package.json +2 -3
  29. package/dist/types/components/DatePicker/DatePicker.types.d.ts +0 -9
@@ -57,9 +57,13 @@ const Calendar = ({
57
57
  maxRangeLength,
58
58
  setSelectedDate,
59
59
  startDate,
60
- endDate
60
+ endDate,
61
+ timezone
61
62
  }) => {
62
63
  const [hoveredDate, setHoveredDate] = react.useState();
64
+ const today = utils.shiftToTimezone(/* @__PURE__ */ new Date(), timezone);
65
+ const shiftedStart = startDate ? utils.shiftToTimezone(startDate, timezone) : void 0;
66
+ const shiftedEnd = endDate ? utils.shiftToTimezone(endDate, timezone) : void 0;
63
67
  const handleMouseOut = () => {
64
68
  setHoveredDate(void 0);
65
69
  };
@@ -73,21 +77,20 @@ const Calendar = ({
73
77
  key: dayKey,
74
78
  value: fullDate
75
79
  }) => {
76
- const today = /* @__PURE__ */ new Date();
77
- const isSelected = startDate && calendar.isSameDate(startDate, fullDate) || endDate && calendar.isSameDate(endDate, fullDate);
80
+ const isSelected = shiftedStart && calendar.isSameDate(shiftedStart, fullDate) || shiftedEnd && calendar.isSameDate(shiftedEnd, fullDate);
78
81
  const isPresent = calendar.isSameDate(today, fullDate);
79
- const isBetweenStartAndEndDates = Boolean(startDate && endDate && fullDate > startDate && fullDate < endDate);
82
+ const isBetweenStartAndEndDates = Boolean(shiftedStart && shiftedEnd && fullDate > shiftedStart && fullDate < shiftedEnd);
80
83
  let isDisabled = false;
81
84
  if (futureDatesDisabled && fullDate > today) {
82
85
  isDisabled = true;
83
86
  }
84
- if (futureStartDatesDisabled && !startDate && fullDate > today) {
87
+ if (futureStartDatesDisabled && !shiftedStart && fullDate > today) {
85
88
  isDisabled = true;
86
89
  }
87
- if (maxRangeLength > 1 && startDate && !utils.datesAreWithinMaxRange(startDate, fullDate, maxRangeLength)) {
90
+ if (maxRangeLength > 1 && shiftedStart && !utils.datesAreWithinMaxRange(shiftedStart, fullDate, maxRangeLength)) {
88
91
  isDisabled = true;
89
92
  }
90
- const shouldShowRangeIndicator = !endDate && Boolean(startDate && hoveredDate && fullDate > startDate && fullDate < hoveredDate);
93
+ const shouldShowRangeIndicator = !shiftedEnd && Boolean(shiftedStart && hoveredDate && fullDate > shiftedStart && fullDate < hoveredDate);
91
94
  const handleMouseEnter = () => {
92
95
  setHoveredDate(fullDate);
93
96
  };
@@ -95,14 +98,14 @@ const Calendar = ({
95
98
  if (isDisabled) {
96
99
  return false;
97
100
  }
98
- setSelectedDate(fullDate);
99
- if (startDate && endDate) {
101
+ setSelectedDate(utils.shiftFromTimezone(fullDate, timezone));
102
+ if (shiftedStart && shiftedEnd) {
100
103
  return;
101
104
  }
102
- if (startDate && fullDate < startDate) {
105
+ if (shiftedStart && fullDate < shiftedStart) {
103
106
  return;
104
107
  }
105
- if (startDate && !calendar.isSameDate(fullDate, startDate)) {
108
+ if (shiftedStart && !calendar.isSameDate(fullDate, shiftedStart)) {
106
109
  closeDatepicker();
107
110
  return;
108
111
  }
@@ -111,11 +114,6 @@ const Calendar = ({
111
114
  }) }, weekKey);
112
115
  });
113
116
  };
114
- const locale = "en-US";
115
- const monthFormatter = new Intl.DateTimeFormat(locale, {
116
- month: "short",
117
- year: "numeric"
118
- });
119
117
  const PredefinedDates = ({
120
118
  onSelectDateRange,
121
119
  predefinedDatesList,
@@ -124,7 +122,8 @@ const PredefinedDates = ({
124
122
  setEndDate,
125
123
  setStartDate,
126
124
  shouldShowCustomRange,
127
- showCustomDateRange
125
+ showCustomDateRange,
126
+ timezone
128
127
  }) => {
129
128
  const handleCustomTimePeriodClick = (event) => {
130
129
  event.preventDefault();
@@ -144,8 +143,8 @@ const PredefinedDates = ({
144
143
  const isWholeMonth = utils.isDateRangeTheWholeMonth({
145
144
  startDate,
146
145
  endDate
147
- });
148
- const formattedText = isWholeMonth ? monthFormatter.format(startDate) : `${utils.selectedDateFormatter.format(startDate)} – ${utils.selectedDateFormatter.format(endDate)}`.trim();
146
+ }, timezone);
147
+ const formattedText = isWholeMonth ? utils.formatDateHeader(timezone, startDate) : `${utils.formatSelectedDate(timezone, startDate)} – ${utils.formatSelectedDate(timezone, endDate)}`.trim();
149
148
  return /* @__PURE__ */ jsxRuntime.jsx(Common.StyledDropdownItem, { "data-testid": `predefined-date-${startDate.getTime()}`, onClick: handleItemClick, children: /* @__PURE__ */ jsxRuntime.jsxs(Container.Container, { "data-selected": rangeIsSelected, "data-testid": formattedText, justifyContent: "space-between", orientation: "horizontal", children: [
150
149
  formattedText,
151
150
  rangeIsSelected && /* @__PURE__ */ jsxRuntime.jsx(Icon.Icon, { name: "check" })
@@ -168,7 +167,8 @@ const DateRangePicker = ({
168
167
  openDirection = "right",
169
168
  placeholder = "start date – end date",
170
169
  predefinedDatesList,
171
- responsivePositioning = true
170
+ responsivePositioning = true,
171
+ timezone = "system"
172
172
  }) => {
173
173
  const [isOpen, setIsOpen] = react.useState(false);
174
174
  const [selectedStartDate, setSelectedStartDate] = react.useState();
@@ -243,11 +243,11 @@ const DateRangePicker = ({
243
243
  }, []);
244
244
  const shouldShowPredefinedDates = predefinedDatesList !== void 0 && predefinedDatesList.length > 0;
245
245
  return /* @__PURE__ */ jsxRuntime.jsxs(Dropdown.Dropdown, { onOpenChange: handleOpenChange, open: isOpen, children: [
246
- /* @__PURE__ */ jsxRuntime.jsx(Dropdown.Dropdown.Trigger, { disabled, onKeyDown: onTriggerKeyDown, children: /* @__PURE__ */ jsxRuntime.jsx(Common.DateRangePickerInput, { "data-testid": "datepicker-input-container", disabled, isActive: isOpen, placeholder, selectedEndDate, selectedStartDate }) }),
246
+ /* @__PURE__ */ jsxRuntime.jsx(Dropdown.Dropdown.Trigger, { disabled, onKeyDown: onTriggerKeyDown, children: /* @__PURE__ */ jsxRuntime.jsx(Common.DateRangePickerInput, { "data-testid": "datepicker-input-container", disabled, isActive: isOpen, placeholder, selectedEndDate, selectedStartDate, timezone }) }),
247
247
  /* @__PURE__ */ jsxRuntime.jsx(Dropdown.Dropdown.Content, { align: "start", responsivePositioning, children: shouldShowPredefinedDates ? /* @__PURE__ */ jsxRuntime.jsxs(PredefinedCalendarContainer, { gap: "none", orientation: "horizontal", padding: "none", children: [
248
- /* @__PURE__ */ jsxRuntime.jsx(PredefinedDates, { onSelectDateRange, predefinedDatesList, selectedEndDate, selectedStartDate, setEndDate: setSelectedEndDate, setStartDate: setSelectedStartDate, shouldShowCustomRange, showCustomDateRange: setShouldShowCustomRange }),
249
- shouldShowCustomRange && /* @__PURE__ */ jsxRuntime.jsx(CalendarRendererContainer, { $openDirection: calendarOpenDirection, ref: calendarContainerRef, children: /* @__PURE__ */ jsxRuntime.jsx(StyledCalendarRenderer, { calendarOptions, allowYearMonthSelection: false, selectedDate: selectedStartDate, children: (body) => /* @__PURE__ */ jsxRuntime.jsx(Calendar, { calendarBody: body, closeDatepicker: closeDatePicker, futureDatesDisabled, futureStartDatesDisabled, maxRangeLength, setSelectedDate: handleSelectDate, startDate: selectedStartDate, endDate: selectedEndDate }) }) })
250
- ] }) : /* @__PURE__ */ jsxRuntime.jsx(Common.CalendarRenderer, { calendarOptions, allowYearMonthSelection: false, selectedDate: selectedStartDate, children: (body) => /* @__PURE__ */ jsxRuntime.jsx(Calendar, { calendarBody: body, closeDatepicker: closeDatePicker, futureDatesDisabled, futureStartDatesDisabled, maxRangeLength, setSelectedDate: handleSelectDate, startDate: selectedStartDate, endDate: selectedEndDate }) }) })
248
+ /* @__PURE__ */ jsxRuntime.jsx(PredefinedDates, { onSelectDateRange, predefinedDatesList, selectedEndDate, selectedStartDate, setEndDate: setSelectedEndDate, setStartDate: setSelectedStartDate, shouldShowCustomRange, showCustomDateRange: setShouldShowCustomRange, timezone }),
249
+ shouldShowCustomRange && /* @__PURE__ */ jsxRuntime.jsx(CalendarRendererContainer, { $openDirection: calendarOpenDirection, ref: calendarContainerRef, children: /* @__PURE__ */ jsxRuntime.jsx(StyledCalendarRenderer, { calendarOptions, allowYearMonthSelection: false, selectedDate: selectedStartDate, timezone, children: (body) => /* @__PURE__ */ jsxRuntime.jsx(Calendar, { calendarBody: body, closeDatepicker: closeDatePicker, futureDatesDisabled, futureStartDatesDisabled, maxRangeLength, setSelectedDate: handleSelectDate, startDate: selectedStartDate, endDate: selectedEndDate, timezone }) }) })
250
+ ] }) : /* @__PURE__ */ jsxRuntime.jsx(Common.CalendarRenderer, { calendarOptions, allowYearMonthSelection: false, selectedDate: selectedStartDate, timezone, children: (body) => /* @__PURE__ */ jsxRuntime.jsx(Calendar, { calendarBody: body, closeDatepicker: closeDatePicker, futureDatesDisabled, futureStartDatesDisabled, maxRangeLength, setSelectedDate: handleSelectDate, startDate: selectedStartDate, endDate: selectedEndDate, timezone }) }) })
251
251
  ] });
252
252
  };
253
253
 
@@ -1 +1 @@
1
- {"version":3,"file":"DateRangePicker.cjs","sources":["../../../../src/components/DatePicker/DateRangePicker.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 '@/components/Dropdown';\nimport {\n Body,\n CalendarRenderer,\n DateRangePickerInput,\n DateTableCell,\n StyledDropdownItem,\n} from './Common';\nimport { Container } from '@/components/Container';\nimport { Panel } from '@/components/Panel';\nimport { Icon } from '@/components/Icon';\nimport {\n DateRange,\n datesAreWithinMaxRange,\n isDateRangeTheWholeMonth,\n selectedDateFormatter,\n} from './utils';\n\ntype OpenDirection = 'left' | 'right';\n\nconst calendarWidth = 275;\n\nconst PredefinedCalendarContainer = styled(Panel)`\n align-items: start;\n background: ${({ theme }) => theme.click.panel.color.background.muted};\n`;\n\nconst PredefinedDatesContainer = styled(Container)`\n width: ${calendarWidth}px;\n`;\n\n// left value of 276px is the width of the PredefinedDatesContainer + 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: 276px;')}\n position: absolute;\n top: 0;\n`;\n\n// Height of 221px is height the height the calendar needs to match the PredefinedDatesContainer\nconst StyledCalendarRenderer = styled(CalendarRenderer)`\n border-radius: ${({ theme }) => theme.click.datePicker.dateOption.radii.default};\n min-height: 221px;\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 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\ninterface CalendarProps {\n calendarBody: Body;\n closeDatepicker: () => void;\n futureDatesDisabled: boolean;\n futureStartDatesDisabled: boolean;\n maxRangeLength: number;\n setSelectedDate: (selectedDate: Date) => void;\n startDate?: Date;\n endDate?: Date;\n}\n\nconst Calendar = ({\n calendarBody,\n closeDatepicker,\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 today = new Date();\n const isSelected =\n (startDate && isSameDate(startDate, fullDate)) ||\n (endDate && isSameDate(endDate, fullDate));\n const isPresent = isSameDate(today, fullDate);\n\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 (futureStartDatesDisabled && !startDate && fullDate > today) {\n isDisabled = true;\n }\n\n if (\n maxRangeLength > 1 &&\n startDate &&\n !datesAreWithinMaxRange(startDate, fullDate, maxRangeLength)\n ) {\n isDisabled = true;\n }\n\n const shouldShowRangeIndicator =\n !endDate &&\n Boolean(\n startDate && hoveredDate && fullDate > startDate && fullDate < hoveredDate\n );\n\n const handleMouseEnter = () => {\n setHoveredDate(fullDate);\n };\n\n const handleClick = () => {\n if (isDisabled) {\n return false;\n }\n setSelectedDate(fullDate);\n\n // User has a date range selected and clicked a new date.\n // This will cause the selected date to be reset, thus do not close the datepicker.\n if (startDate && endDate) {\n return;\n }\n\n // The user has selected a new start date, don't close\n if (startDate && fullDate < startDate) {\n return;\n }\n\n // Only close the datepicker if the user hasn't clicked the selected start date.\n if (startDate && !isSameDate(fullDate, startDate)) {\n closeDatepicker();\n return;\n }\n };\n return (\n <DateRangeTableCell\n $shouldShowRangeIndicator={\n !isSelected && (shouldShowRangeIndicator || isBetweenStartAndEndDates)\n }\n $isCurrentMonth={isCurrentMonth}\n $isDisabled={isDisabled}\n $isSelected={isSelected}\n $isPresent={isPresent}\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\nconst locale = 'en-US';\nconst monthFormatter = new Intl.DateTimeFormat(locale, {\n month: 'short',\n year: 'numeric',\n});\n\ninterface PredefinedDatesProps {\n onSelectDateRange: (selectedStartDate: Date, selectedEndDate: Date) => void;\n predefinedDatesList: DateRange[];\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 PredefinedDates = ({\n onSelectDateRange,\n predefinedDatesList,\n selectedEndDate,\n selectedStartDate,\n setEndDate,\n setStartDate,\n shouldShowCustomRange,\n showCustomDateRange,\n}: PredefinedDatesProps) => {\n const handleCustomTimePeriodClick = (event: MouseEvent) => {\n event.preventDefault();\n showCustomDateRange(!shouldShowCustomRange);\n };\n\n return (\n <PredefinedDatesContainer\n data-testid=\"predefined-dates-list\"\n isResponsive={false}\n orientation=\"vertical\"\n >\n <ScrollableContainer orientation=\"vertical\">\n {predefinedDatesList.map(({ startDate, endDate }) => {\n const handleItemClick = () => {\n setStartDate(startDate);\n setEndDate(endDate);\n onSelectDateRange(startDate, endDate);\n };\n\n const rangeIsSelected =\n selectedEndDate &&\n isSameDate(selectedEndDate, endDate) &&\n selectedStartDate &&\n isSameDate(selectedStartDate, startDate);\n\n const isWholeMonth = isDateRangeTheWholeMonth({ startDate, endDate });\n\n const formattedText = isWholeMonth\n ? monthFormatter.format(startDate)\n : `${selectedDateFormatter.format(\n startDate\n )} – ${selectedDateFormatter.format(endDate)}`.trim();\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={formattedText}\n justifyContent=\"space-between\"\n orientation=\"horizontal\"\n >\n {formattedText}\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 Custom time period <Icon name=\"chevron-right\" />\n </Container>\n </StyledDropdownItem>\n </PredefinedDatesContainer>\n );\n};\n\nexport interface DateRangePickerProps {\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 predefinedDatesList?: DateRange[];\n maxRangeLength?: number;\n startDate?: Date;\n responsivePositioning?: boolean;\n}\n\nexport const DateRangePicker = ({\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 predefinedDatesList,\n responsivePositioning = true,\n}: DateRangePickerProps) => {\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 const calendarOptions: UseCalendarOptions = {};\n\n // If a start date is selected, open the calendar to that date\n if (selectedStartDate) {\n calendarOptions.defaultDate = selectedStartDate;\n }\n\n useEffect(() => {\n if (startDate) {\n setSelectedStartDate(startDate);\n }\n }, [startDate]);\n\n useEffect(() => {\n if (endDate) {\n setSelectedEndDate(endDate);\n }\n }, [endDate]);\n\n useLayoutEffect(() => {\n if (shouldShowCustomRange && calendarContainerRef.current) {\n if (\n calendarContainerRef.current.getBoundingClientRect().right > window.innerWidth\n ) {\n setCalendarOpenDirection('left');\n }\n }\n }, [shouldShowCustomRange]);\n\n const closeDatePicker = useCallback((): void => {\n setIsOpen(false);\n setShouldShowCustomRange(false);\n setCalendarOpenDirection(openDirection);\n }, [openDirection]);\n\n const handleOpenChange = (isOpen: boolean): void => {\n setIsOpen(isOpen);\n\n if (!isOpen) {\n setShouldShowCustomRange(false);\n setCalendarOpenDirection(openDirection);\n }\n };\n\n const handleSelectDate = useCallback(\n (selectedDate: Date): void => {\n // Start date and end date are selected, user clicks any date.\n // Set start date to the selected date, clear the end date.\n if (selectedStartDate && selectedEndDate) {\n // If futureStartDatesDisabled is true, only set the selected date to the date clicked if it's before today\n if (futureStartDatesDisabled && selectedDate > new Date()) {\n setSelectedEndDate(undefined);\n return;\n }\n setSelectedStartDate(selectedDate);\n setSelectedEndDate(undefined);\n return;\n }\n\n if (selectedStartDate) {\n if (isSameDate(selectedStartDate, selectedDate)) {\n // Start date is selected, user clicks start date.\n // Reset the start date.\n setSelectedStartDate(undefined);\n return;\n }\n\n // Start date is selected, user clicks an earlier date.\n // Set the earlier date to the new start date.\n if (selectedDate < selectedStartDate) {\n setSelectedStartDate(selectedDate);\n return;\n }\n\n // Otherwise, set the end date to the date the user clicked.\n setSelectedEndDate(selectedDate);\n onSelectDateRange(selectedStartDate, selectedDate);\n setShouldShowCustomRange(false);\n return;\n }\n\n setSelectedStartDate(selectedDate);\n },\n [futureStartDatesDisabled, 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 shouldShowPredefinedDates =\n predefinedDatesList !== undefined && predefinedDatesList.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 <DateRangePickerInput\n data-testid=\"datepicker-input-container\"\n disabled={disabled}\n isActive={isOpen}\n placeholder={placeholder}\n selectedEndDate={selectedEndDate}\n selectedStartDate={selectedStartDate}\n />\n </Dropdown.Trigger>\n <Dropdown.Content\n align=\"start\"\n responsivePositioning={responsivePositioning}\n >\n {shouldShowPredefinedDates ? (\n <PredefinedCalendarContainer\n gap=\"none\"\n orientation=\"horizontal\"\n padding=\"none\"\n >\n <PredefinedDates\n onSelectDateRange={onSelectDateRange}\n predefinedDatesList={predefinedDatesList}\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 <StyledCalendarRenderer\n calendarOptions={calendarOptions}\n allowYearMonthSelection={false}\n selectedDate={selectedStartDate}\n >\n {(body: Body) => (\n <Calendar\n calendarBody={body}\n closeDatepicker={closeDatePicker}\n futureDatesDisabled={futureDatesDisabled}\n futureStartDatesDisabled={futureStartDatesDisabled}\n maxRangeLength={maxRangeLength}\n setSelectedDate={handleSelectDate}\n startDate={selectedStartDate}\n endDate={selectedEndDate}\n />\n )}\n </StyledCalendarRenderer>\n </CalendarRendererContainer>\n )}\n </PredefinedCalendarContainer>\n ) : (\n <CalendarRenderer\n calendarOptions={calendarOptions}\n allowYearMonthSelection={false}\n selectedDate={selectedStartDate}\n >\n {(body: Body) => (\n <Calendar\n calendarBody={body}\n closeDatepicker={closeDatePicker}\n futureDatesDisabled={futureDatesDisabled}\n futureStartDatesDisabled={futureStartDatesDisabled}\n maxRangeLength={maxRangeLength}\n setSelectedDate={handleSelectDate}\n startDate={selectedStartDate}\n endDate={selectedEndDate}\n />\n )}\n </CalendarRenderer>\n )}\n </Dropdown.Content>\n </Dropdown>\n );\n};\n"],"names":["calendarWidth","PredefinedCalendarContainer","styled","Panel","withConfig","componentId","theme","click","panel","color","background","muted","PredefinedDatesContainer","Container","CalendarRendererContainer","div","datePicker","dateOption","stroke","range","radii","default","$openDirection","StyledCalendarRenderer","CalendarRenderer","ScrollableContainer","DateRangeTableCell","DateTableCell","$shouldShowRangeIndicator","Calendar","calendarBody","closeDatepicker","futureDatesDisabled","futureStartDatesDisabled","maxRangeLength","setSelectedDate","startDate","endDate","hoveredDate","setHoveredDate","useState","handleMouseOut","undefined","value","map","key","weekKey","week","jsx","date","isCurrentMonth","dayKey","fullDate","today","Date","isSelected","isSameDate","isPresent","isBetweenStartAndEndDates","Boolean","isDisabled","datesAreWithinMaxRange","shouldShowRangeIndicator","handleMouseEnter","handleClick","locale","monthFormatter","Intl","DateTimeFormat","month","year","PredefinedDates","onSelectDateRange","predefinedDatesList","selectedEndDate","selectedStartDate","setEndDate","setStartDate","shouldShowCustomRange","showCustomDateRange","handleCustomTimePeriodClick","event","preventDefault","handleItemClick","rangeIsSelected","isWholeMonth","isDateRangeTheWholeMonth","formattedText","format","selectedDateFormatter","trim","StyledDropdownItem","getTime","jsxs","Icon","toISOString","DateRangePicker","disabled","openDirection","placeholder","responsivePositioning","isOpen","setIsOpen","setSelectedStartDate","setSelectedEndDate","setShouldShowCustomRange","calendarOpenDirection","setCalendarOpenDirection","calendarContainerRef","useRef","calendarOptions","defaultDate","useEffect","useLayoutEffect","current","getBoundingClientRect","right","window","innerWidth","closeDatePicker","useCallback","handleOpenChange","handleSelectDate","selectedDate","onTriggerKeyDown","e","shouldShowPredefinedDates","length","Dropdown","DateRangePickerInput","body"],"mappings":"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"}
1
+ {"version":3,"file":"DateRangePicker.cjs","sources":["../../../../src/components/DatePicker/DateRangePicker.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 '@/components/Dropdown';\nimport {\n Body,\n CalendarRenderer,\n DateRangePickerInput,\n DateTableCell,\n StyledDropdownItem,\n} from './Common';\nimport { Container } from '@/components/Container';\nimport { Panel } from '@/components/Panel';\nimport { Icon } from '@/components/Icon';\nimport {\n DateRange,\n datesAreWithinMaxRange,\n formatDateHeader,\n formatSelectedDate,\n shiftFromTimezone,\n isDateRangeTheWholeMonth,\n Timezone,\n shiftToTimezone,\n} from './utils';\n\ntype OpenDirection = 'left' | 'right';\n\nconst calendarWidth = 275;\n\nconst PredefinedCalendarContainer = styled(Panel)`\n align-items: start;\n background: ${({ theme }) => theme.click.panel.color.background.muted};\n`;\n\nconst PredefinedDatesContainer = styled(Container)`\n width: ${calendarWidth}px;\n`;\n\n// left value of 276px is the width of the PredefinedDatesContainer + 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: 276px;')}\n position: absolute;\n top: 0;\n`;\n\n// Height of 221px is height the height the calendar needs to match the PredefinedDatesContainer\nconst StyledCalendarRenderer = styled(CalendarRenderer)`\n border-radius: ${({ theme }) => theme.click.datePicker.dateOption.radii.default};\n min-height: 221px;\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 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\ninterface CalendarProps {\n calendarBody: Body;\n closeDatepicker: () => void;\n futureDatesDisabled: boolean;\n futureStartDatesDisabled: boolean;\n maxRangeLength: number;\n setSelectedDate: (selectedDate: Date) => void;\n startDate?: Date;\n endDate?: Date;\n timezone: Timezone;\n}\n\nconst Calendar = ({\n calendarBody,\n closeDatepicker,\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 const isPresent = isSameDate(today, fullDate);\n\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 (futureStartDatesDisabled && !shiftedStart && fullDate > today) {\n isDisabled = true;\n }\n\n if (\n maxRangeLength > 1 &&\n shiftedStart &&\n !datesAreWithinMaxRange(shiftedStart, fullDate, maxRangeLength)\n ) {\n isDisabled = true;\n }\n\n const shouldShowRangeIndicator =\n !shiftedEnd &&\n Boolean(\n shiftedStart &&\n hoveredDate &&\n fullDate > shiftedStart &&\n fullDate < hoveredDate\n );\n\n const handleMouseEnter = () => {\n setHoveredDate(fullDate);\n };\n\n const handleClick = () => {\n if (isDisabled) {\n return false;\n }\n setSelectedDate(shiftFromTimezone(fullDate, timezone));\n\n // User has a date range selected and clicked a new date.\n // This will cause the selected date to be reset, thus do not close the datepicker.\n if (shiftedStart && shiftedEnd) {\n return;\n }\n\n // The user has selected a new start date, don't close\n if (shiftedStart && fullDate < shiftedStart) {\n return;\n }\n\n // Only close the datepicker if the user hasn't clicked the selected start date.\n if (shiftedStart && !isSameDate(fullDate, shiftedStart)) {\n closeDatepicker();\n return;\n }\n };\n return (\n <DateRangeTableCell\n $shouldShowRangeIndicator={\n !isSelected && (shouldShowRangeIndicator || isBetweenStartAndEndDates)\n }\n $isCurrentMonth={isCurrentMonth}\n $isDisabled={isDisabled}\n $isSelected={isSelected}\n $isPresent={isPresent}\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 PredefinedDatesProps {\n onSelectDateRange: (selectedStartDate: Date, selectedEndDate: Date) => void;\n predefinedDatesList: DateRange[];\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 timezone: Timezone;\n}\n\nconst PredefinedDates = ({\n onSelectDateRange,\n predefinedDatesList,\n selectedEndDate,\n selectedStartDate,\n setEndDate,\n setStartDate,\n shouldShowCustomRange,\n showCustomDateRange,\n timezone,\n}: PredefinedDatesProps) => {\n const handleCustomTimePeriodClick = (event: MouseEvent) => {\n event.preventDefault();\n showCustomDateRange(!shouldShowCustomRange);\n };\n\n return (\n <PredefinedDatesContainer\n data-testid=\"predefined-dates-list\"\n isResponsive={false}\n orientation=\"vertical\"\n >\n <ScrollableContainer orientation=\"vertical\">\n {predefinedDatesList.map(({ startDate, endDate }) => {\n const handleItemClick = () => {\n setStartDate(startDate);\n setEndDate(endDate);\n onSelectDateRange(startDate, endDate);\n };\n\n const rangeIsSelected =\n selectedEndDate &&\n isSameDate(selectedEndDate, endDate) &&\n selectedStartDate &&\n isSameDate(selectedStartDate, startDate);\n\n const isWholeMonth = isDateRangeTheWholeMonth({ startDate, endDate }, timezone);\n\n const formattedText = isWholeMonth\n ? formatDateHeader(timezone, startDate)\n : `${formatSelectedDate(timezone, startDate)} – ${formatSelectedDate(timezone, endDate)}`.trim();\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={formattedText}\n justifyContent=\"space-between\"\n orientation=\"horizontal\"\n >\n {formattedText}\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 Custom time period <Icon name=\"chevron-right\" />\n </Container>\n </StyledDropdownItem>\n </PredefinedDatesContainer>\n );\n};\n\nexport interface DateRangePickerProps {\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 predefinedDatesList?: DateRange[];\n maxRangeLength?: number;\n startDate?: Date;\n responsivePositioning?: boolean;\n timezone?: Timezone;\n}\n\nexport const DateRangePicker = ({\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 predefinedDatesList,\n responsivePositioning = true,\n timezone = 'system',\n}: DateRangePickerProps) => {\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 const calendarOptions: UseCalendarOptions = {};\n\n // If a start date is selected, open the calendar to that date\n if (selectedStartDate) {\n calendarOptions.defaultDate = selectedStartDate;\n }\n\n useEffect(() => {\n if (startDate) {\n setSelectedStartDate(startDate);\n }\n }, [startDate]);\n\n useEffect(() => {\n if (endDate) {\n setSelectedEndDate(endDate);\n }\n }, [endDate]);\n\n useLayoutEffect(() => {\n if (shouldShowCustomRange && calendarContainerRef.current) {\n if (\n calendarContainerRef.current.getBoundingClientRect().right > window.innerWidth\n ) {\n setCalendarOpenDirection('left');\n }\n }\n }, [shouldShowCustomRange]);\n\n const closeDatePicker = useCallback((): void => {\n setIsOpen(false);\n setShouldShowCustomRange(false);\n setCalendarOpenDirection(openDirection);\n }, [openDirection]);\n\n const handleOpenChange = (isOpen: boolean): void => {\n setIsOpen(isOpen);\n\n if (!isOpen) {\n setShouldShowCustomRange(false);\n setCalendarOpenDirection(openDirection);\n }\n };\n\n const handleSelectDate = useCallback(\n (selectedDate: Date): void => {\n // Start date and end date are selected, user clicks any date.\n // Set start date to the selected date, clear the end date.\n if (selectedStartDate && selectedEndDate) {\n // If futureStartDatesDisabled is true, only set the selected date to the date clicked if it's before today\n if (futureStartDatesDisabled && selectedDate > new Date()) {\n setSelectedEndDate(undefined);\n return;\n }\n setSelectedStartDate(selectedDate);\n setSelectedEndDate(undefined);\n return;\n }\n\n if (selectedStartDate) {\n if (isSameDate(selectedStartDate, selectedDate)) {\n // Start date is selected, user clicks start date.\n // Reset the start date.\n setSelectedStartDate(undefined);\n return;\n }\n\n // Start date is selected, user clicks an earlier date.\n // Set the earlier date to the new start date.\n if (selectedDate < selectedStartDate) {\n setSelectedStartDate(selectedDate);\n return;\n }\n\n // Otherwise, set the end date to the date the user clicked.\n setSelectedEndDate(selectedDate);\n onSelectDateRange(selectedStartDate, selectedDate);\n setShouldShowCustomRange(false);\n return;\n }\n\n setSelectedStartDate(selectedDate);\n },\n [futureStartDatesDisabled, 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 shouldShowPredefinedDates =\n predefinedDatesList !== undefined && predefinedDatesList.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 <DateRangePickerInput\n data-testid=\"datepicker-input-container\"\n disabled={disabled}\n isActive={isOpen}\n placeholder={placeholder}\n selectedEndDate={selectedEndDate}\n selectedStartDate={selectedStartDate}\n timezone={timezone}\n />\n </Dropdown.Trigger>\n <Dropdown.Content\n align=\"start\"\n responsivePositioning={responsivePositioning}\n >\n {shouldShowPredefinedDates ? (\n <PredefinedCalendarContainer\n gap=\"none\"\n orientation=\"horizontal\"\n padding=\"none\"\n >\n <PredefinedDates\n onSelectDateRange={onSelectDateRange}\n predefinedDatesList={predefinedDatesList}\n selectedEndDate={selectedEndDate}\n selectedStartDate={selectedStartDate}\n setEndDate={setSelectedEndDate}\n setStartDate={setSelectedStartDate}\n shouldShowCustomRange={shouldShowCustomRange}\n showCustomDateRange={setShouldShowCustomRange}\n timezone={timezone}\n />\n\n {shouldShowCustomRange && (\n <CalendarRendererContainer\n $openDirection={calendarOpenDirection}\n ref={calendarContainerRef}\n >\n <StyledCalendarRenderer\n calendarOptions={calendarOptions}\n allowYearMonthSelection={false}\n selectedDate={selectedStartDate}\n timezone={timezone}\n >\n {(body: Body) => (\n <Calendar\n calendarBody={body}\n closeDatepicker={closeDatePicker}\n futureDatesDisabled={futureDatesDisabled}\n futureStartDatesDisabled={futureStartDatesDisabled}\n maxRangeLength={maxRangeLength}\n setSelectedDate={handleSelectDate}\n startDate={selectedStartDate}\n endDate={selectedEndDate}\n timezone={timezone}\n />\n )}\n </StyledCalendarRenderer>\n </CalendarRendererContainer>\n )}\n </PredefinedCalendarContainer>\n ) : (\n <CalendarRenderer\n calendarOptions={calendarOptions}\n allowYearMonthSelection={false}\n selectedDate={selectedStartDate}\n timezone={timezone}\n >\n {(body: Body) => (\n <Calendar\n calendarBody={body}\n closeDatepicker={closeDatePicker}\n futureDatesDisabled={futureDatesDisabled}\n futureStartDatesDisabled={futureStartDatesDisabled}\n maxRangeLength={maxRangeLength}\n setSelectedDate={handleSelectDate}\n startDate={selectedStartDate}\n endDate={selectedEndDate}\n timezone={timezone}\n />\n )}\n </CalendarRenderer>\n )}\n </Dropdown.Content>\n </Dropdown>\n );\n};\n"],"names":["calendarWidth","PredefinedCalendarContainer","styled","Panel","withConfig","componentId","theme","click","panel","color","background","muted","PredefinedDatesContainer","Container","CalendarRendererContainer","div","datePicker","dateOption","stroke","range","radii","default","$openDirection","StyledCalendarRenderer","CalendarRenderer","ScrollableContainer","DateRangeTableCell","DateTableCell","$shouldShowRangeIndicator","Calendar","calendarBody","closeDatepicker","futureDatesDisabled","futureStartDatesDisabled","maxRangeLength","setSelectedDate","startDate","endDate","timezone","hoveredDate","setHoveredDate","useState","today","shiftToTimezone","Date","shiftedStart","undefined","shiftedEnd","handleMouseOut","value","map","key","weekKey","week","jsx","date","isCurrentMonth","dayKey","fullDate","isSelected","isSameDate","isPresent","isBetweenStartAndEndDates","Boolean","isDisabled","datesAreWithinMaxRange","shouldShowRangeIndicator","handleMouseEnter","handleClick","shiftFromTimezone","PredefinedDates","onSelectDateRange","predefinedDatesList","selectedEndDate","selectedStartDate","setEndDate","setStartDate","shouldShowCustomRange","showCustomDateRange","handleCustomTimePeriodClick","event","preventDefault","handleItemClick","rangeIsSelected","isWholeMonth","isDateRangeTheWholeMonth","formattedText","formatDateHeader","formatSelectedDate","trim","StyledDropdownItem","getTime","jsxs","Icon","toISOString","DateRangePicker","disabled","openDirection","placeholder","responsivePositioning","isOpen","setIsOpen","setSelectedStartDate","setSelectedEndDate","setShouldShowCustomRange","calendarOpenDirection","setCalendarOpenDirection","calendarContainerRef","useRef","calendarOptions","defaultDate","useEffect","useLayoutEffect","current","getBoundingClientRect","right","window","innerWidth","closeDatePicker","useCallback","handleOpenChange","handleSelectDate","selectedDate","onTriggerKeyDown","e","shouldShowPredefinedDates","length","Dropdown","DateRangePickerInput","body"],"mappings":"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"}
@@ -77,9 +77,13 @@ const Calendar = ({
77
77
  maxRangeLength,
78
78
  setSelectedDate,
79
79
  startDate,
80
- endDate
80
+ endDate,
81
+ timezone
81
82
  }) => {
82
83
  const [hoveredDate, setHoveredDate] = react.useState();
84
+ const today = utils.shiftToTimezone(/* @__PURE__ */ new Date(), timezone);
85
+ const shiftedStart = startDate ? utils.shiftToTimezone(startDate, timezone) : void 0;
86
+ const shiftedEnd = endDate ? utils.shiftToTimezone(endDate, timezone) : void 0;
83
87
  const handleMouseOut = () => {
84
88
  setHoveredDate(void 0);
85
89
  };
@@ -93,10 +97,9 @@ const Calendar = ({
93
97
  key: dayKey,
94
98
  value: fullDate
95
99
  }) => {
96
- const isSelected = startDate && calendar.isSameDate(startDate, fullDate) || endDate && calendar.isSameDate(endDate, fullDate);
97
- const today = /* @__PURE__ */ new Date();
100
+ const isSelected = shiftedStart && calendar.isSameDate(shiftedStart, fullDate) || shiftedEnd && calendar.isSameDate(shiftedEnd, fullDate);
98
101
  const isCurrentDate = calendar.isSameDate(today, fullDate);
99
- const isBetweenStartAndEndDates = Boolean(startDate && endDate && fullDate > startDate && fullDate < endDate);
102
+ const isBetweenStartAndEndDates = Boolean(shiftedStart && shiftedEnd && fullDate > shiftedStart && fullDate < shiftedEnd);
100
103
  let isDisabled = false;
101
104
  if (futureDatesDisabled && fullDate > today) {
102
105
  isDisabled = true;
@@ -104,17 +107,17 @@ const Calendar = ({
104
107
  if (futureStartDatesDisabled && calendarType === "startDate" && fullDate > today) {
105
108
  isDisabled = true;
106
109
  }
107
- if (maxRangeLength > 1 && startDate && !utils.datesAreWithinMaxRange(startDate, fullDate, maxRangeLength)) {
110
+ if (maxRangeLength > 1 && shiftedStart && !utils.datesAreWithinMaxRange(shiftedStart, fullDate, maxRangeLength)) {
108
111
  isDisabled = true;
109
112
  }
110
- if (calendarType === "endDate" && startDate && startDate > fullDate && !calendar.isSameDate(startDate, fullDate)) {
113
+ if (calendarType === "endDate" && !shiftedEnd && shiftedStart && shiftedStart > fullDate && !calendar.isSameDate(shiftedStart, fullDate)) {
111
114
  isDisabled = true;
112
115
  }
113
- if (calendarType === "startDate" && !startDate && endDate && fullDate > endDate) {
116
+ if (calendarType === "startDate" && !shiftedStart && shiftedEnd && fullDate > shiftedEnd) {
114
117
  isDisabled = true;
115
118
  }
116
- const startDateSelectedAndIsSelectingEndDate = calendarType === "endDate" && !endDate && Boolean(startDate && hoveredDate && fullDate > startDate && fullDate < hoveredDate);
117
- const endDateSelectedAndIsSelectingStartDate = calendarType === "startDate" && !startDate && Boolean(endDate && hoveredDate && fullDate < endDate && fullDate > hoveredDate);
119
+ const startDateSelectedAndIsSelectingEndDate = calendarType === "endDate" && !shiftedEnd && Boolean(shiftedStart && hoveredDate && fullDate > shiftedStart && fullDate < hoveredDate);
120
+ const endDateSelectedAndIsSelectingStartDate = calendarType === "startDate" && !shiftedStart && Boolean(shiftedEnd && hoveredDate && fullDate < shiftedEnd && fullDate > hoveredDate);
118
121
  const shouldShowRangeIndicator = startDateSelectedAndIsSelectingEndDate || endDateSelectedAndIsSelectingStartDate;
119
122
  const handleMouseEnter = () => {
120
123
  setHoveredDate(fullDate);
@@ -123,17 +126,30 @@ const Calendar = ({
123
126
  if (isDisabled) {
124
127
  return false;
125
128
  }
129
+ const originalFullDate = utils.shiftFromTimezone(fullDate, timezone);
126
130
  if (calendarType === "startDate" && startDate) {
127
- fullDate.setHours(startDate.getHours());
128
- fullDate.setMinutes(startDate.getMinutes());
129
- fullDate.setSeconds(startDate.getSeconds());
131
+ if (timezone === "UTC") {
132
+ originalFullDate.setUTCHours(startDate.getUTCHours());
133
+ originalFullDate.setUTCMinutes(startDate.getUTCMinutes());
134
+ originalFullDate.setUTCSeconds(startDate.getUTCSeconds());
135
+ } else {
136
+ originalFullDate.setHours(startDate.getHours());
137
+ originalFullDate.setMinutes(startDate.getMinutes());
138
+ originalFullDate.setSeconds(startDate.getSeconds());
139
+ }
130
140
  }
131
141
  if (calendarType === "endDate" && endDate) {
132
- fullDate.setHours(endDate.getHours());
133
- fullDate.setMinutes(endDate.getMinutes());
134
- fullDate.setSeconds(endDate.getSeconds());
142
+ if (timezone === "UTC") {
143
+ originalFullDate.setUTCHours(endDate.getUTCHours());
144
+ originalFullDate.setUTCMinutes(endDate.getUTCMinutes());
145
+ originalFullDate.setUTCSeconds(endDate.getUTCSeconds());
146
+ } else {
147
+ originalFullDate.setHours(endDate.getHours());
148
+ originalFullDate.setMinutes(endDate.getMinutes());
149
+ originalFullDate.setSeconds(endDate.getSeconds());
150
+ }
135
151
  }
136
- setSelectedDate(fullDate, calendarType);
152
+ setSelectedDate(originalFullDate, calendarType);
137
153
  };
138
154
  return /* @__PURE__ */ jsxRuntime.jsx(DateRangeTableCell, { $shouldShowRangeIndicator: shouldShowRangeIndicator || isBetweenStartAndEndDates, $isCurrentMonth: isCurrentMonth, $isDisabled: isDisabled, $isSelected: isSelected, $isPresent: isCurrentDate, onClick: handleClick, onMouseEnter: handleMouseEnter, onMouseLeave: handleMouseOut, children: date }, dayKey);
139
155
  }) }, weekKey);
@@ -242,9 +258,10 @@ const validTimeRegex = /^\d{1,2}(:\d{1,2}(:\d{1,2})?)?$/;
242
258
  const TimeInput = ({
243
259
  date,
244
260
  setDate,
245
- shouldShowSeconds
261
+ shouldShowSeconds,
262
+ timezone
246
263
  }) => {
247
- let dayjsDate = dayjs__default.default(date);
264
+ let dayjsDate = timezone === "UTC" ? dayjs__default.default.utc(date) : dayjs__default.default(date);
248
265
  if (!date) {
249
266
  dayjsDate = dayjsDate.hour(12).minute(0);
250
267
  }
@@ -343,7 +360,8 @@ const TabbedCalendar = ({
343
360
  setSelectedDate,
344
361
  setStartDate,
345
362
  shouldShowSeconds,
346
- startDate
363
+ startDate,
364
+ timezone
347
365
  }) => {
348
366
  const [activeTab, setActiveTab] = react.useState(defaultActiveTab);
349
367
  react.useEffect(() => {
@@ -374,12 +392,12 @@ const TabbedCalendar = ({
374
392
  /* @__PURE__ */ jsxRuntime.jsx(Tabs.Tabs.Trigger, { value: "endDate", "data-testid": "tabbed-calendar-trigger-end", children: "End date" })
375
393
  ] }),
376
394
  /* @__PURE__ */ jsxRuntime.jsxs(Tabs.Tabs.Content, { value: "startDate", children: [
377
- /* @__PURE__ */ jsxRuntime.jsx(StyledCalendarRenderer, { calendarOptions: startDateCalendarOptions, children: (body) => /* @__PURE__ */ jsxRuntime.jsx(Calendar, { calendarBody: body, calendarType: "startDate", endDate, futureDatesDisabled, futureStartDatesDisabled, maxRangeLength, setSelectedDate, startDate }) }),
378
- /* @__PURE__ */ jsxRuntime.jsx(TimeInput, { date: startDate, setDate: handleSetStartDate, shouldShowSeconds })
395
+ /* @__PURE__ */ jsxRuntime.jsx(StyledCalendarRenderer, { calendarOptions: startDateCalendarOptions, timezone, children: (body) => /* @__PURE__ */ jsxRuntime.jsx(Calendar, { calendarBody: body, calendarType: "startDate", endDate, futureDatesDisabled, futureStartDatesDisabled, maxRangeLength, setSelectedDate, startDate, timezone }) }),
396
+ /* @__PURE__ */ jsxRuntime.jsx(TimeInput, { date: startDate, setDate: handleSetStartDate, shouldShowSeconds, timezone })
379
397
  ] }),
380
398
  /* @__PURE__ */ jsxRuntime.jsxs(Tabs.Tabs.Content, { value: "endDate", children: [
381
- /* @__PURE__ */ jsxRuntime.jsx(StyledCalendarRenderer, { calendarOptions: endDateCalendarOptions, children: (body) => /* @__PURE__ */ jsxRuntime.jsx(Calendar, { calendarBody: body, calendarType: "endDate", endDate, futureDatesDisabled, futureStartDatesDisabled, maxRangeLength, setSelectedDate, startDate }) }),
382
- /* @__PURE__ */ jsxRuntime.jsx(TimeInput, { date: endDate, setDate: handleSetEndDate, shouldShowSeconds })
399
+ /* @__PURE__ */ jsxRuntime.jsx(StyledCalendarRenderer, { calendarOptions: endDateCalendarOptions, timezone, children: (body) => /* @__PURE__ */ jsxRuntime.jsx(Calendar, { calendarBody: body, calendarType: "endDate", endDate, futureDatesDisabled, futureStartDatesDisabled, maxRangeLength, setSelectedDate, startDate, timezone }) }),
400
+ /* @__PURE__ */ jsxRuntime.jsx(TimeInput, { date: endDate, setDate: handleSetEndDate, shouldShowSeconds, timezone })
383
401
  ] })
384
402
  ] });
385
403
  };
@@ -396,7 +414,8 @@ const DateTimeRangePicker = ({
396
414
  placeholder = "start date – end date",
397
415
  predefinedTimesList,
398
416
  shouldShowSeconds,
399
- startDate
417
+ startDate,
418
+ timezone = "system"
400
419
  }) => {
401
420
  const [isOpen, setIsOpen] = react.useState(false);
402
421
  const [selectedStartDate, setSelectedStartDate] = react.useState();
@@ -405,21 +424,35 @@ const DateTimeRangePicker = ({
405
424
  const [calendarOpenDirection, setCalendarOpenDirection] = react.useState(openDirection);
406
425
  const calendarContainerRef = react.useRef(null);
407
426
  react.useEffect(() => {
408
- if (startDate) {
409
- if (startDate.getHours() === 0) {
410
- startDate.setHours(12);
427
+ if (!startDate) {
428
+ return;
429
+ }
430
+ const startDateCopy = new Date(startDate);
431
+ const hours = timezone === "UTC" ? startDateCopy.getUTCHours() : startDateCopy.getHours();
432
+ if (hours === 0) {
433
+ if (timezone === "UTC") {
434
+ startDateCopy.setUTCHours(12);
435
+ } else {
436
+ startDateCopy.setHours(12);
411
437
  }
412
- setSelectedStartDate(startDate);
413
438
  }
414
- }, [startDate]);
439
+ setSelectedStartDate(startDateCopy);
440
+ }, [startDate, timezone]);
415
441
  react.useEffect(() => {
416
- if (endDate) {
417
- if (endDate.getHours() === 0) {
418
- endDate.setHours(12);
442
+ if (!endDate) {
443
+ return;
444
+ }
445
+ const endDateCopy = new Date(endDate);
446
+ const hours = timezone === "UTC" ? endDateCopy.getUTCHours() : endDateCopy.getHours();
447
+ if (hours === 0) {
448
+ if (timezone === "UTC") {
449
+ endDateCopy.setUTCHours(12);
450
+ } else {
451
+ endDateCopy.setHours(12);
419
452
  }
420
- setSelectedEndDate(endDate);
421
453
  }
422
- }, [endDate]);
454
+ setSelectedEndDate(endDateCopy);
455
+ }, [endDate, timezone]);
423
456
  react.useLayoutEffect(() => {
424
457
  if (shouldShowCustomRange && calendarContainerRef.current) {
425
458
  const rect = calendarContainerRef.current.getBoundingClientRect();
@@ -441,8 +474,13 @@ const DateTimeRangePicker = ({
441
474
  }
442
475
  }, []);
443
476
  const handleSelectDate = react.useCallback((selectedDate, calendarType) => {
444
- if (selectedDate.getHours() === 0 && selectedDate.getMinutes() === 0 && selectedDate.getSeconds() === 0) {
445
- selectedDate.setHours(12);
477
+ const isMidnight = timezone === "UTC" ? selectedDate.getUTCHours() === 0 && selectedDate.getUTCMinutes() === 0 && selectedDate.getUTCSeconds() === 0 : selectedDate.getHours() === 0 && selectedDate.getMinutes() === 0 && selectedDate.getSeconds() === 0;
478
+ if (isMidnight) {
479
+ if (timezone === "UTC") {
480
+ selectedDate.setUTCHours(12);
481
+ } else {
482
+ selectedDate.setHours(12);
483
+ }
446
484
  }
447
485
  if (calendarType === "startDate") {
448
486
  setSelectedStartDate(selectedDate);
@@ -462,7 +500,7 @@ const DateTimeRangePicker = ({
462
500
  }
463
501
  }
464
502
  }
465
- }, [onSelectDateRange, selectedEndDate, selectedStartDate]);
503
+ }, [closeDatePicker, closeOnDateRangeSelected, onSelectDateRange, selectedEndDate, selectedStartDate, timezone]);
466
504
  const onTriggerKeyDown = react.useCallback((e) => {
467
505
  if (e.key === "Enter" || e.key === " ") {
468
506
  e.preventDefault();
@@ -471,11 +509,11 @@ const DateTimeRangePicker = ({
471
509
  }, []);
472
510
  const shouldShowPredefinedTimes = predefinedTimesList !== void 0 && predefinedTimesList.length > 0;
473
511
  return /* @__PURE__ */ jsxRuntime.jsxs(Dropdown.Dropdown, { onOpenChange: handleOpenChange, open: isOpen, children: [
474
- /* @__PURE__ */ jsxRuntime.jsx(Dropdown.Dropdown.Trigger, { disabled, onKeyDown: onTriggerKeyDown, children: /* @__PURE__ */ jsxRuntime.jsx(Common.DateTimeRangePickerInput, { "data-testid": "datepicker-input-container", disabled, isActive: isOpen, placeholder, selectedEndDate, selectedStartDate, shouldShowSeconds }) }),
512
+ /* @__PURE__ */ jsxRuntime.jsx(Dropdown.Dropdown.Trigger, { disabled, onKeyDown: onTriggerKeyDown, children: /* @__PURE__ */ jsxRuntime.jsx(Common.DateTimeRangePickerInput, { "data-testid": "datepicker-input-container", disabled, isActive: isOpen, placeholder, selectedEndDate, selectedStartDate, shouldShowSeconds, timezone }) }),
475
513
  /* @__PURE__ */ jsxRuntime.jsx(Dropdown.Dropdown.Content, { align: "start", children: /* @__PURE__ */ jsxRuntime.jsx(Container.Container, { orientation: "horizontal", children: shouldShowPredefinedTimes ? /* @__PURE__ */ jsxRuntime.jsxs(PredefinedCalendarContainer, { gap: "none", orientation: "horizontal", padding: "none", children: [
476
514
  /* @__PURE__ */ jsxRuntime.jsx(PredefinedTimes, { onSelectDateRange, predefinedTimesList, selectedEndDate, selectedStartDate, setEndDate: setSelectedEndDate, setStartDate: setSelectedStartDate, shouldShowCustomRange, showCustomDateRange: setShouldShowCustomRange }),
477
- shouldShowCustomRange && /* @__PURE__ */ jsxRuntime.jsx(CalendarRendererContainer, { $openDirection: calendarOpenDirection, ref: calendarContainerRef, children: /* @__PURE__ */ jsxRuntime.jsx(TabbedCalendar, { defaultActiveTab, endDate: selectedEndDate, futureDatesDisabled, futureStartDatesDisabled, maxRangeLength, setEndDate: setSelectedEndDate, setSelectedDate: handleSelectDate, setStartDate: setSelectedStartDate, shouldShowSeconds: Boolean(shouldShowSeconds), startDate: selectedStartDate }) })
478
- ] }) : /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: /* @__PURE__ */ jsxRuntime.jsx(TabbedCalendar, { defaultActiveTab, endDate: selectedEndDate, futureDatesDisabled, futureStartDatesDisabled, maxRangeLength, setEndDate: setSelectedEndDate, setSelectedDate: handleSelectDate, setStartDate: setSelectedStartDate, shouldShowSeconds: Boolean(shouldShowSeconds), startDate: selectedStartDate }) }) }) })
515
+ shouldShowCustomRange && /* @__PURE__ */ jsxRuntime.jsx(CalendarRendererContainer, { $openDirection: calendarOpenDirection, ref: calendarContainerRef, children: /* @__PURE__ */ jsxRuntime.jsx(TabbedCalendar, { defaultActiveTab, endDate: selectedEndDate, futureDatesDisabled, futureStartDatesDisabled, maxRangeLength, setEndDate: setSelectedEndDate, setSelectedDate: handleSelectDate, setStartDate: setSelectedStartDate, shouldShowSeconds: Boolean(shouldShowSeconds), startDate: selectedStartDate, timezone }) })
516
+ ] }) : /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: /* @__PURE__ */ jsxRuntime.jsx(TabbedCalendar, { defaultActiveTab, endDate: selectedEndDate, futureDatesDisabled, futureStartDatesDisabled, maxRangeLength, setEndDate: setSelectedEndDate, setSelectedDate: handleSelectDate, setStartDate: setSelectedStartDate, shouldShowSeconds: Boolean(shouldShowSeconds), startDate: selectedStartDate, timezone }) }) }) })
479
517
  ] });
480
518
  };
481
519