@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.
- package/dist/cjs/components/DatePicker/Common.cjs +79 -48
- 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 +78 -40
- package/dist/cjs/components/DatePicker/DateTimeRangePicker.cjs.map +1 -1
- package/dist/cjs/components/DatePicker/index.cjs +29 -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/esm/components/DatePicker/Common.js +80 -49
- 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 +79 -41
- package/dist/esm/components/DatePicker/DateTimeRangePicker.js.map +1 -1
- package/dist/esm/components/DatePicker/index.js +30 -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/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 +3 -2
- package/dist/types/components/DatePicker/index.d.ts +2 -1
- package/dist/types/components/DatePicker/utils.d.ts +9 -8
- package/dist/types/index.d.ts +1 -1
- package/package.json +2 -3
- package/dist/types/components/DatePicker/DatePicker.types.d.ts +0 -9
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DateTimeRangePicker.cjs","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 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}\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 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\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}\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}: 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 calendarOptions={startDateCalendarOptions}>\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 />\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 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 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}\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}: 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 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 [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 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 />\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 />\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","hoveredDate","setHoveredDate","useState","handleMouseOut","undefined","value","map","key","weekKey","week","jsx","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","StyledDropdownItem","getTime","jsxs","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","Label","TextField","ButtonGroup","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","useLayoutEffect","current","rect","getBoundingClientRect","right","window","innerWidth","closeDatePicker","handleOpenChange","handleSelectDate","selectedDate","onTriggerKeyDown","e","shouldShowPredefinedTimes","length","Dropdown","DateTimeRangePickerInput","Fragment"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AA+BA,MAAMA,iBAAAA,GAAoB,OAAA;AAE1B,MAAMC,2BAAAA,GAA8BC,uBAAAA,CAAOC,WAAK,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,uBAAAA,CAAOW,mBAAS,CAAA,CAACT,UAAAA,CAAA;AAAA,EAAAC,WAAAA,EAAA;AAAA,CAAA,CAAA,CAAA,CAAA,QAAA,EAAA,GAAA,GACvCL,iBAAiB,CAAA;AAM5B,MAAMc,yBAAAA,GAA4BZ,uBAAAA,CAAOa,GAAAA,CAAGX,UAAAA,CAAA;AAAA,EAAAC,WAAAA,EAAA;AAAA,CAAA,CAAA,CAAA,CAAA,aAAA,EAAA,UAAA,EAAA,mBAAA,0FAAA,EAAA,2BAAA,GAC5B,CAAC;AAAA,EAAEC;AAAM,CAAA,KACrB,CAAA,EAAGA,MAAMC,KAAAA,CAAMS,UAAAA,CAAWC,WAAWR,KAAAA,CAAMC,UAAAA,CAAWQ,OAAO,CAAA,CAAA,EACrD,CAAC;AAAA,EAAEZ;AAAM,CAAA,KACjB,CAAA,EAAGA,KAAAA,CAAMC,KAAAA,CAAMS,UAAAA,CAAWC,WAAWE,MAAM,CAAA,OAAA,EAAUb,KAAAA,CAAMC,KAAAA,CAAMS,WAAWC,UAAAA,CAAWR,KAAAA,CAAMC,UAAAA,CAAWU,KAAK,IAC9F,CAAC;AAAA,EAAEd;AAAM,CAAA,KAAMA,MAAMC,KAAAA,CAAMS,UAAAA,CAAWC,UAAAA,CAAWI,KAAAA,CAAMH,SAItE,CAAC;AAAA,EAAEI;AAAe,CAAA,KAAOA,cAAAA,KAAmB,MAAA,GAAS,cAAA,GAAiB,cAAe,CAAA;AAMzF,MAAMC,sBAAAA,GAAyBrB,uBAAAA,CAAOsB,uBAAgB,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,CAAWI,MAAMH,OAAO,CAAA;AAIjF,MAAMO,iBAAAA,GAAoBvB,uBAAAA,CAAOwB,SAAAA,CAAKC,YAAY,EAACvB,UAAAA,CAAA;AAAA,EAAAC,WAAAA,EAAA;AAAA,CAAA,CAAA,CAAA,CAAA,+BAAA,CAAA,CAAA;AAKnD,MAAMuB,mBAAAA,GAAsB1B,uBAAAA,CAAOW,mBAAS,CAAA,CAACT,UAAAA,CAAA;AAAA,EAAAC,WAAAA,EAAA;AAAA,CAAA,CAAA,CAAA,CAAA,mCAAA,CAAA,CAAA;AAK7C,MAAMwB,kBAAAA,GAAqB3B,uBAAAA,CAAOW,mBAAS,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,WAAWQ,OAAO,CAAA;AAG9D,MAAMY,kBAAAA,GAAqB5B,uBAAAA,CAAO6B,oBAAa,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,WAAWU,KAAK,CAAA;AAAA,YAAA,EAC5Dd,KAAAA,CAAMC,KAAAA,CAAMS,UAAAA,CAAWC,UAAAA,CAAWE,MAAM,CAAA,OAAA,EAAUb,KAAAA,CAAMC,KAAAA,CAAMS,UAAAA,CAAWC,UAAAA,CAAWR,KAAAA,CAAMC,UAAAA,CAAWU,KAAK,CAAA;AAAA;AAAA,IAAA,CAEnH,CAAA;AAoBL,MAAMa,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,cAAAA,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,uBACEC,cAAA,CAAC,IAAA,EAAA,EACED,QAAAA,EAAAA,IAAAA,CAAKH,GAAAA,CAAI,CAAC;AAAA,MAAEK,IAAAA;AAAAA,MAAMC,cAAAA;AAAAA,MAAgBL,GAAAA,EAAKM,MAAAA;AAAAA,MAAQR,KAAAA,EAAOS;AAAAA,KAAS,KAAM;AACpE,MAAA,MAAMC,UAAAA,GACHjB,aAAakB,mBAAAA,CAAWlB,SAAAA,EAAWgB,QAAQ,CAAA,IAC3Cf,OAAAA,IAAWiB,mBAAAA,CAAWjB,OAAAA,EAASe,QAAQ,CAAA;AAE1C,MAAA,MAAMG,KAAAA,uBAAYC,IAAAA,EAAK;AAEvB,MAAA,MAAMC,aAAAA,GAAgBH,mBAAAA,CAAWC,KAAAA,EAAOH,QAAQ,CAAA;AAChD,MAAA,MAAMM,4BAA4BC,OAAAA,CAChCvB,SAAAA,IAAaC,WAAWe,QAAAA,GAAWhB,SAAAA,IAAagB,WAAWf,OAC7D,CAAA;AAEA,MAAA,IAAIuB,UAAAA,GAAa,KAAA;AACjB,MAAA,IAAI5B,mBAAAA,IAAuBoB,WAAWG,KAAAA,EAAO;AAC3CK,QAAAA,UAAAA,GAAa,IAAA;AAAA,MACf;AAEA,MAAA,IACE3B,wBAAAA,IACAF,YAAAA,KAAiB,WAAA,IACjBqB,QAAAA,GAAWG,KAAAA,EACX;AACAK,QAAAA,UAAAA,GAAa,IAAA;AAAA,MACf;AAEA,MAAA,IACE1B,cAAAA,GAAiB,KACjBE,SAAAA,IACA,CAACyB,6BAAuBzB,SAAAA,EAAWgB,QAAAA,EAAUlB,cAAc,CAAA,EAC3D;AACA0B,QAAAA,UAAAA,GAAa,IAAA;AAAA,MACf;AAGA,MAAA,IACE7B,YAAAA,KAAiB,aACjBK,SAAAA,IACAA,SAAAA,GAAYgB,YACZ,CAACE,mBAAAA,CAAWlB,SAAAA,EAAWgB,QAAQ,CAAA,EAC/B;AACAQ,QAAAA,UAAAA,GAAa,IAAA;AAAA,MACf;AAGA,MAAA,IACE7B,iBAAiB,WAAA,IACjB,CAACK,SAAAA,IACDC,OAAAA,IACAe,WAAWf,OAAAA,EACX;AACAuB,QAAAA,UAAAA,GAAa,IAAA;AAAA,MACf;AAEA,MAAA,MAAME,sCAAAA,GACJ/B,YAAAA,KAAiB,SAAA,IACjB,CAACM,OAAAA,IACDsB,OAAAA,CACEvB,SAAAA,IAAaE,WAAAA,IAAec,QAAAA,GAAWhB,SAAAA,IAAagB,QAAAA,GAAWd,WACjE,CAAA;AAEF,MAAA,MAAMyB,sCAAAA,GACJhC,YAAAA,KAAiB,WAAA,IACjB,CAACK,SAAAA,IACDuB,OAAAA,CACEtB,OAAAA,IAAWC,WAAAA,IAAec,QAAAA,GAAWf,OAAAA,IAAWe,QAAAA,GAAWd,WAC7D,CAAA;AAEF,MAAA,MAAM0B,2BACJF,sCAAAA,IACAC,sCAAAA;AAEF,MAAA,MAAME,mBAAmBA,MAAM;AAC7B1B,QAAAA,cAAAA,CAAea,QAAQ,CAAA;AAAA,MACzB,CAAA;AAEA,MAAA,MAAMc,cAAcA,MAAM;AACxB,QAAA,IAAIN,UAAAA,EAAY;AACd,UAAA,OAAO,KAAA;AAAA,QACT;AAIA,QAAA,IAAI7B,YAAAA,KAAiB,eAAeK,SAAAA,EAAW;AAC7CgB,UAAAA,QAAAA,CAASe,QAAAA,CAAS/B,SAAAA,CAAUgC,QAAAA,EAAU,CAAA;AACtChB,UAAAA,QAAAA,CAASiB,UAAAA,CAAWjC,SAAAA,CAAUkC,UAAAA,EAAY,CAAA;AAC1ClB,UAAAA,QAAAA,CAASmB,UAAAA,CAAWnC,SAAAA,CAAUoC,UAAAA,EAAY,CAAA;AAAA,QAC5C;AAIA,QAAA,IAAIzC,YAAAA,KAAiB,aAAaM,OAAAA,EAAS;AACzCe,UAAAA,QAAAA,CAASe,QAAAA,CAAS9B,OAAAA,CAAQ+B,QAAAA,EAAU,CAAA;AACpChB,UAAAA,QAAAA,CAASiB,UAAAA,CAAWhC,OAAAA,CAAQiC,UAAAA,EAAY,CAAA;AACxClB,UAAAA,QAAAA,CAASmB,UAAAA,CAAWlC,OAAAA,CAAQmC,UAAAA,EAAY,CAAA;AAAA,QAC1C;AAEArC,QAAAA,eAAAA,CAAgBiB,UAAUrB,YAAY,CAAA;AAAA,MACxC,CAAA;AAEA,MAAA,uBACEiB,cAAA,CAAC,sBACC,yBAAA,EACEgB,wBAAAA,IAA4BN,2BAE9B,eAAA,EAAiBR,cAAAA,EACjB,aAAaU,UAAAA,EACb,WAAA,EAAaP,YACb,UAAA,EAAYI,aAAAA,EAEZ,SAASS,WAAAA,EACT,YAAA,EAAcD,kBACd,YAAA,EAAcxB,cAAAA,EAEbQ,kBALIE,MAMP,CAAA;AAAA,IAEJ,CAAC,KArHML,OAsHT,CAAA;AAAA,EAEJ,CAAC,CAAA;AACH,CAAA;AAaA,MAAM2B,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,uCACG,wBAAA,EAAA,EACC,aAAA,EAAY,yBACZ,YAAA,EAAc,KAAA,EACd,aAAY,UAAA,EAEZ,QAAA,EAAA;AAAA,oBAAAhC,cAAA,CAAC,mBAAA,EAAA,EAAoB,WAAA,EAAY,UAAA,EAC9B2B,QAAAA,EAAAA,mBAAAA,CAAoB/B,IAAI,CAAC;AAAA,MAAEyC,SAAAA,EAAW;AAAA,QAAEjD,SAAAA;AAAAA,QAAWC;AAAAA,OAAQ;AAAA,MAAGiD;AAAAA,KAAM,KAAM;AACzE,MAAA,MAAMC,kBAAkBA,MAAM;AAC5BR,QAAAA,YAAAA,CAAa3C,SAAS,CAAA;AACtB0C,QAAAA,UAAAA,CAAWzC,OAAO,CAAA;AAClBqC,QAAAA,iBAAAA,CAAkBtC,WAAWC,OAAO,CAAA;AAAA,MACtC,CAAA;AAEA,MAAA,MAAMmD,eAAAA,GACJZ,eAAAA,IACAA,eAAAA,KAAoBvC,OAAAA,IACpBwC,qBACAA,iBAAAA,KAAsBzC,SAAAA;AAExB,MAAA,sCACGqD,yBAAA,EAAA,EACC,aAAA,EAAa,mBAAmBrD,SAAAA,CAAUsD,OAAAA,EAAS,CAAA,CAAA,EAEnD,OAAA,EAASH,iBAET,QAAA,kBAAAI,eAAA,CAAClF,mBAAA,EAAA,EACC,iBAAe+E,eAAAA,EACf,aAAA,EAAaF,OACb,cAAA,EAAe,eAAA,EACf,aAAY,YAAA,EAEXA,QAAAA,EAAAA;AAAAA,QAAAA,KAAAA;AAAAA,QACAE,eAAAA,oBAAmBxC,cAAA,CAAC4C,SAAA,EAAA,EAAK,IAAA,EAAK,OAAA,EAAO;AAAA,OAAA,EACxC,CAAA,EAAA,EAXKxD,SAAAA,CAAUyD,WAAAA,EAYjB,CAAA;AAAA,IAEJ,CAAC,CAAA,EACH,CAAA;AAAA,oBACA7C,cAAA,CAACyC,6BAAmB,OAAA,EAASP,2BAAAA,EAC3B,0CAACzE,mBAAA,EAAA,EACC,cAAA,EAAe,eAAA,EACf,WAAA,EAAY,YAAA,EAAY,QAAA,EAAA;AAAA,MAAA,iCAAA;AAAA,sBAEOuC,cAAA,CAAC4C,SAAA,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,sBAAAA,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,uBAAM,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,sBAAAA,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,OAAO;AAAA,IAAEA,OAAAA,EAAS,IAAA;AAAA,IAAMS;AAAAA,GAAW;AACrC,CAAA;AAEA,MAAMX,cAAAA,GAAiB,iCAAA;AAQvB,MAAMe,YAAYA,CAAC;AAAA,EAAE9D,IAAAA;AAAAA,EAAM+D,OAAAA;AAAAA,EAASC;AAAkC,CAAA,KAAM;AAC1E,EAAA,IAAIC,SAAAA,GAAYN,uBAAM3D,IAAI,CAAA;AAC1B,EAAA,IAAI,CAACA,IAAAA,EAAM;AACTiE,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,GAAI/E,eAAiB6E,aAAa,CAAA;AAClE,EAAA,MAAM,CAACG,WAAAA,EAAaC,cAAc,CAAA,GAAIjF,eAAkB,IAAI,CAAA;AAC5D,EAAA,MAAM,CAACkF,QAAAA,EAAUC,WAAW,CAAA,GAAInF,cAAAA,EAAmB;AACnD,EAAA,MAAMoF,SAAAA,GAAYjE,QAAQV,IAAI,CAAA;AAE9B4E,EAAAA,eAAAA,CAAU,MAAM;AACd,IAAA,IAAI5E,IAAAA,EAAM;AACR0E,MAAAA,WAAAA,CAAYT,SAAAA,CAAUI,MAAAA,CAAO,GAAG,CAAa,CAAA;AAAA,IAC/C;AAAA,EACF,CAAA,EAAG,CAACrE,IAAAA,EAAMiE,SAAS,CAAC,CAAA;AAEpB,EAAA,MAAMY,gBAAAA,GAAmBC,iBAAAA,CACvB,CAACC,aAAAA,KAA0B;AACzBT,IAAAA,aAAAA,CAAcS,aAAa,CAAA;AAE3B,IAAA,IAAI,CAAC/E,IAAAA,EAAM;AACT,MAAA;AAAA,IACF;AAEA,IAAA,MAAMgF,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,CAAClF,IAAAA,EAAMiE,WAAWQ,QAAAA,EAAUV,OAAAA,EAASC,iBAAiB,CACxD,CAAA;AAEA,EAAA,MAAMqB,oBAAAA,GAAuBP,iBAAAA,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,iBAAAA,CACpB,CAAC5C,KAAAA,KAA2C;AAC1C,IAAA,IAAIA,KAAAA,CAAMtC,QAAQ,OAAA,EAAS;AACzB,MAAA,MAAM;AAAA,QAAEqD,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,uBACEJ,eAAA,CAAC,kBAAA,EAAA,EACC,GAAA,EAAI,IAAA,EACJ,OAAA,EAAQ,IAAA,EACR,QAAA,EAAU,CAAA,EAAG/F,iBAAiB,CAAA,CAAA,EAC9B,WAAA,EAAY,YAAA,EAEZ,QAAA,EAAA;AAAA,oBAAAoD,cAAA,CAACvC,mBAAA,EAAA,EAAU,UAAS,KAAA,EAClB,QAAA,kBAAAuC,cAAA,CAACyF,eAAM,OAAA,EAAQ,6BAAA,EAA8B,kBAAI,CAAA,EACnD,CAAA;AAAA,oCACChI,mBAAA,EAAA,EACC,GAAA,EAAI,MACJ,cAAA,EAAe,cAAA,EACf,aAAY,YAAA,EAEZ,QAAA,EAAA;AAAA,sBAAAuC,cAAA,CAACvC,mBAAA,EAAA,EACC,QAAA,EAAS,KAAA,EACT,WAAA,EAAY,YAAA,EAEZ,yCAACiI,mBAAA,EAAA,EACC,aAAA,EAAY,6BAAA,EACZ,QAAA,EAAU,CAACd,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/C,cAAA,CAACvC,uBAAU,QAAA,EAAS,KAAA,EAClB,yCAACkI,uBAAA,EAAA,EACC,OAAA,EAASL,oBAAAA,EACT,OAAA,EAAS,CACP;AAAA,QACEhD,KAAAA,EAAO,IAAA;AAAA,QACP3C,KAAAA,EAAO;AAAA,OACT,EACA;AAAA,QACE2C,KAAAA,EAAO,IAAA;AAAA,QACP3C,KAAAA,EAAO;AAAA,OACR,CAAA,EAEH,QAAA,EAAU+E,QAAAA,EACV,IAAA,EAAK,WAAS,CAAA,EAElB;AAAA,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ,CAAA;AAiBA,MAAMkB,iBAAiBA,CAAC;AAAA,EACtBC,gBAAAA,GAAmB,WAAA;AAAA,EACnBxG,OAAAA;AAAAA,EACAL,mBAAAA;AAAAA,EACAC,wBAAAA;AAAAA,EACAC,cAAAA;AAAAA,EACA4C,UAAAA;AAAAA,EACA3C,eAAAA;AAAAA,EACA4C,YAAAA;AAAAA,EACAkC,iBAAAA;AAAAA,EACA7E;AACmB,CAAA,KAAM;AACzB,EAAA,MAAM,CAAC0G,SAAAA,EAAWC,YAAY,CAAA,GAAIvG,eAAcqG,gBAAgB,CAAA;AAEhEhB,EAAAA,eAAAA,CAAU,MAAM;AACdkB,IAAAA,YAAAA,CAAaF,gBAAgB,CAAA;AAAA,EAC/B,CAAA,EAAG,CAACA,gBAAgB,CAAC,CAAA;AAErB,EAAA,MAAMG,eAAAA,GAAkBjB,iBAAAA,CAAY,CAACkB,MAAAA,KAAmB;AACtDF,IAAAA,YAAAA,CAAaE,MAAa,CAAA;AAAA,EAC5B,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAMC,kBAAAA,GAAqBnB,iBAAAA,CACzB,CAAC3F,UAAAA,KAAoB;AACnB2C,IAAAA,YAAAA,CAAa3C,UAAS,CAAA;AAEtBD,IAAAA,eAAAA,CAAgBC,YAAW,WAAW,CAAA;AAAA,EACxC,CAAA,EACA,CAACD,eAAAA,EAAiB4C,YAAY,CAChC,CAAA;AAEA,EAAA,MAAMoE,gBAAAA,GAAmBpB,iBAAAA,CACvB,CAAC1F,QAAAA,KAAkB;AACjByC,IAAAA,UAAAA,CAAWzC,QAAO,CAAA;AAElBF,IAAAA,eAAAA,CAAgBE,UAAS,SAAS,CAAA;AAAA,EACpC,CAAA,EACA,CAACyC,UAAAA,EAAY3C,eAAe,CAC9B,CAAA;AAEA,EAAA,MAAMiH,2BAA+C,EAAC;AACtD,EAAA,MAAMC,yBAA6C,EAAC;AAGpD,EAAA,IAAIjH,SAAAA,EAAW;AACbgH,IAAAA,wBAAAA,CAAyBE,WAAAA,GAAclH,SAAAA;AAAAA,EACzC;AAGA,EAAA,IAAIC,OAAAA,EAAS;AACXgH,IAAAA,sBAAAA,CAAuBC,WAAAA,GAAcjH,OAAAA;AAAAA,EACvC;AAEA,EAAA,uBACEsD,eAAA,CAACrE,SAAA,EAAA,EACC,aAAA,EAAe0H,eAAAA,EACf,OAAOF,SAAAA,EAEP,QAAA,EAAA;AAAA,oBAAAnD,eAAA,CAAC,iBAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAA3C,cAAA,CAAC1B,UAAK,OAAA,EAAL,EACC,OAAM,WAAA,EACN,aAAA,EAAY,iCAA+B,QAAA,EAAA,YAAA,EAG7C,CAAA;AAAA,sBACA0B,cAAA,CAAC1B,UAAK,OAAA,EAAL,EACC,OAAM,SAAA,EACN,aAAA,EAAY,+BAA6B,QAAA,EAAA,UAAA,EAG3C;AAAA,KAAA,EACF,CAAA;AAAA,oBACAqE,eAAA,CAACrE,SAAA,CAAK,OAAA,EAAL,EAAa,OAAM,WAAA,EAClB,QAAA,EAAA;AAAA,sBAAA0B,cAAA,CAAC,0BAAuB,eAAA,EAAiBoG,wBAAAA,EACtC,QAAA,EAAA,CAACG,IAAAA,oCACC,QAAA,EAAA,EACC,YAAA,EAAcA,IAAAA,EACd,YAAA,EAAa,aACb,OAAA,EACA,mBAAA,EACA,0BACA,cAAA,EACA,eAAA,EACA,WAAqB,CAAA,EAG3B,CAAA;AAAA,qCACC,SAAA,EAAA,EACC,IAAA,EAAMnH,SAAAA,EACN,OAAA,EAAS8G,oBACT,iBAAA,EAAqC;AAAA,KAAA,EAEzC,CAAA;AAAA,oBACAvD,eAAA,CAACrE,SAAA,CAAK,OAAA,EAAL,EAAa,OAAM,SAAA,EAClB,QAAA,EAAA;AAAA,sBAAA0B,cAAA,CAAC,0BAAuB,eAAA,EAAiBqG,sBAAAA,EACtC,QAAA,EAAA,CAACE,IAAAA,oCACC,QAAA,EAAA,EACC,YAAA,EAAcA,IAAAA,EACd,YAAA,EAAa,WACb,OAAA,EACA,mBAAA,EACA,0BACA,cAAA,EACA,eAAA,EACA,WAAqB,CAAA,EAG3B,CAAA;AAAA,qCACC,SAAA,EAAA,EACC,IAAA,EAAMlH,OAAAA,EACN,OAAA,EAAS8G,kBACT,iBAAA,EAAqC;AAAA,KAAA,EAEzC;AAAA,GAAA,EACF,CAAA;AAEJ,CAAA;AAkBO,MAAMK,sBAAsBA,CAAC;AAAA,EAClCC,wBAAAA,GAA2B,KAAA;AAAA,EAC3BZ,gBAAAA;AAAAA,EACAa,QAAAA,GAAW,KAAA;AAAA,EACXrH,OAAAA;AAAAA,EACAL,mBAAAA,GAAsB,KAAA;AAAA,EACtBC,wBAAAA,GAA2B,KAAA;AAAA,EAC3BC,cAAAA,GAAiB,EAAA;AAAA,EACjBwC,iBAAAA;AAAAA,EACAiF,aAAAA,GAAgB,OAAA;AAAA,EAChBC,WAAAA,GAAc,uBAAA;AAAA,EACdjF,mBAAAA;AAAAA,EACAsC,iBAAAA;AAAAA,EACA7E;AACwB,CAAA,KAAM;AAC9B,EAAA,MAAM,CAACyH,MAAAA,EAAQC,SAAS,CAAA,GAAItH,eAAkB,KAAK,CAAA;AACnD,EAAA,MAAM,CAACqC,iBAAAA,EAAmBkF,oBAAoB,CAAA,GAAIvH,cAAAA,EAAe;AACjE,EAAA,MAAM,CAACoC,eAAAA,EAAiBoF,kBAAkB,CAAA,GAAIxH,cAAAA,EAAe;AAC7D,EAAA,MAAM,CAACwC,qBAAAA,EAAuBiF,wBAAwB,CAAA,GAAIzH,eAAkB,KAAK,CAAA;AACjF,EAAA,MAAM,CAAC0H,qBAAAA,EAAuBC,wBAAwB,CAAA,GACpD3H,eAAwBmH,aAAa,CAAA;AACvC,EAAA,MAAMS,oBAAAA,GAAuBC,aAAuB,IAAI,CAAA;AAExDxC,EAAAA,eAAAA,CAAU,MAAM;AACd,IAAA,IAAIzF,SAAAA,EAAW;AACb,MAAA,IAAIA,SAAAA,CAAUgC,QAAAA,EAAS,KAAM,CAAA,EAAG;AAC9BhC,QAAAA,SAAAA,CAAU+B,SAAS,EAAE,CAAA;AAAA,MACvB;AACA4F,MAAAA,oBAAAA,CAAqB3H,SAAS,CAAA;AAAA,IAChC;AAAA,EACF,CAAA,EAAG,CAACA,SAAS,CAAC,CAAA;AAEdyF,EAAAA,eAAAA,CAAU,MAAM;AACd,IAAA,IAAIxF,OAAAA,EAAS;AACX,MAAA,IAAIA,OAAAA,CAAQ+B,QAAAA,EAAS,KAAM,CAAA,EAAG;AAC5B/B,QAAAA,OAAAA,CAAQ8B,SAAS,EAAE,CAAA;AAAA,MACrB;AACA6F,MAAAA,kBAAAA,CAAmB3H,OAAO,CAAA;AAAA,IAC5B;AAAA,EACF,CAAA,EAAG,CAACA,OAAO,CAAC,CAAA;AAEZiI,EAAAA,qBAAAA,CAAgB,MAAM;AACpB,IAAA,IAAItF,qBAAAA,IAAyBoF,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,CAACnF,qBAAqB,CAAC,CAAA;AAE1B,EAAA,MAAM6F,eAAAA,GAAkB9C,kBAAY,MAAY;AAC9C+B,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,MAAMW,gBAAAA,GAAmB/C,iBAAAA,CAAY,CAAC8B,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,MAAMY,gBAAAA,GAAmBhD,iBAAAA,CACvB,CAACiD,YAAAA,EAAoBjJ,YAAAA,KAAqC;AACxD,IAAA,IACEiJ,YAAAA,CAAa5G,QAAAA,EAAS,KAAM,CAAA,IAC5B4G,YAAAA,CAAa1G,UAAAA,EAAW,KAAM,CAAA,IAC9B0G,YAAAA,CAAaxG,UAAAA,EAAW,KAAM,CAAA,EAC9B;AACAwG,MAAAA,YAAAA,CAAa7G,SAAS,EAAE,CAAA;AAAA,IAC1B;AAEA,IAAA,IAAIpC,iBAAiB,WAAA,EAAa;AAChCgI,MAAAA,oBAAAA,CAAqBiB,YAAY,CAAA;AAEjC,MAAA,IAAIpG,eAAAA,EAAiB;AACnBF,QAAAA,iBAAAA,CAAkBsG,cAAcpG,eAAe,CAAA;AAE/C,QAAA,IAAI6E,wBAAAA,EAA0B;AAC5BoB,UAAAA,eAAAA,EAAgB;AAAA,QAClB;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAI9I,iBAAiB,SAAA,EAAW;AAC9BiI,MAAAA,kBAAAA,CAAmBgB,YAAY,CAAA;AAE/B,MAAA,IAAInG,iBAAAA,EAAmB;AACrBH,QAAAA,iBAAAA,CAAkBG,mBAAmBmG,YAAY,CAAA;AAEjD,QAAA,IAAIvB,wBAAAA,EAA0B;AAC5BoB,UAAAA,eAAAA,EAAgB;AAAA,QAClB;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAA,EACA,CAACnG,iBAAAA,EAAmBE,eAAAA,EAAiBC,iBAAiB,CACxD,CAAA;AAEA,EAAA,MAAMoG,gBAAAA,GAAmBlD,iBAAAA,CAAY,CAACmD,CAAAA,KAAqC;AACzE,IAAA,IAAIA,CAAAA,CAAErI,GAAAA,KAAQ,OAAA,IAAWqI,CAAAA,CAAErI,QAAQ,GAAA,EAAK;AACtCqI,MAAAA,CAAAA,CAAE9F,cAAAA,EAAe;AACjB0E,MAAAA,SAAAA,CAAU,IAAI,CAAA;AAAA,IAChB;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAMqB,yBAAAA,GACJxG,mBAAAA,KAAwBjC,MAAAA,IAAaiC,mBAAAA,CAAoByG,MAAAA,GAAS,CAAA;AAEpE,EAAA,uBACEzF,eAAA,CAAC0F,iBAAA,EAAA,EACC,YAAA,EAAcP,gBAAAA,EACd,MAAMjB,MAAAA,EAEN,QAAA,EAAA;AAAA,oBAAA7G,cAAA,CAACqI,kBAAS,OAAA,EAAT,EACC,QAAA,EACA,SAAA,EAAWJ,kBAEX,QAAA,kBAAAjI,cAAA,CAACsI,+BAAA,EAAA,EACC,aAAA,EAAY,4BAAA,EACZ,UACA,QAAA,EAAUzB,MAAAA,EACV,aACA,eAAA,EACA,iBAAA,EACA,mBAAqC,CAAA,EAEzC,CAAA;AAAA,mCACCwB,iBAAA,CAAS,OAAA,EAAT,EAAiB,KAAA,EAAM,OAAA,EACtB,yCAAC5K,mBAAA,EAAA,EAAU,WAAA,EAAY,YAAA,EACpB0K,QAAAA,EAAAA,yBAAAA,mCACE,2BAAA,EAAA,EACC,GAAA,EAAI,QACJ,WAAA,EAAY,YAAA,EACZ,SAAQ,MAAA,EAER,QAAA,EAAA;AAAA,sBAAAnI,cAAA,CAAC,eAAA,EAAA,EACC,iBAAA,EACA,mBAAA,EACA,eAAA,EACA,iBAAA,EACA,UAAA,EAAYgH,kBAAAA,EACZ,YAAA,EAAcD,oBAAAA,EACd,qBAAA,EACA,mBAAA,EAAqBE,wBAAAA,EAAyB,CAAA;AAAA,MAG/CjF,qBAAAA,oBACChC,cAAA,CAAC,yBAAA,EAAA,EACC,cAAA,EAAgBkH,qBAAAA,EAChB,GAAA,EAAKE,oBAAAA,EAEL,QAAA,kBAAApH,cAAA,CAAC,cAAA,EAAA,EACC,gBAAA,EACA,OAAA,EAAS4B,eAAAA,EACT,mBAAA,EACA,wBAAA,EACA,cAAA,EACA,UAAA,EAAYoF,kBAAAA,EACZ,eAAA,EAAiBe,gBAAAA,EACjB,YAAA,EAAchB,oBAAAA,EACd,iBAAA,EAAmBpG,OAAAA,CAAQsD,iBAAiB,CAAA,EAC5C,SAAA,EAAWpC,iBAAAA,EAAkB,CAAA,EAEjC;AAAA,KAAA,EAEJ,CAAA,mBAEA7B,cAAA,CAAAuI,mBAAA,EAAA,EACE,QAAA,kBAAAvI,cAAA,CAAC,cAAA,EAAA,EACC,gBAAA,EACA,SAAS4B,eAAAA,EACT,mBAAA,EACA,wBAAA,EACA,cAAA,EACA,UAAA,EAAYoF,kBAAAA,EACZ,iBAAiBe,gBAAAA,EACjB,YAAA,EAAchB,oBAAAA,EACd,iBAAA,EAAmBpG,OAAAA,CAAQsD,iBAAiB,GAC5C,SAAA,EAAWpC,iBAAAA,EAAkB,CAAA,EAEjC,CAAA,EAEJ,CAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;;;;"}
|
|
1
|
+
{"version":3,"file":"DateTimeRangePicker.cjs","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","jsx","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","StyledDropdownItem","getTime","jsxs","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","Label","TextField","ButtonGroup","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","Dropdown","DateTimeRangePickerInput","Fragment"],"mappings":"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"}
|
|
@@ -8,6 +8,7 @@ const calendar = require('@h6s/calendar');
|
|
|
8
8
|
const RadixPopover = require('@radix-ui/react-popover');
|
|
9
9
|
const styledComponents = require('styled-components');
|
|
10
10
|
const Common = require('./Common.cjs');
|
|
11
|
+
const utils = require('./utils.cjs');
|
|
11
12
|
|
|
12
13
|
function _interopNamespace(e) {
|
|
13
14
|
if (e && e.__esModule) return e;
|
|
@@ -50,12 +51,19 @@ const Calendar = ({
|
|
|
50
51
|
futureDatesDisabled,
|
|
51
52
|
selectedDate,
|
|
52
53
|
setSelectedDate,
|
|
53
|
-
autoFocus = false
|
|
54
|
+
autoFocus = false,
|
|
55
|
+
timezone
|
|
54
56
|
}) => {
|
|
55
57
|
const allDays = calendarBody.value.flatMap((week) => week.value);
|
|
56
58
|
const totalDays = allDays.length;
|
|
57
|
-
const today = /* @__PURE__ */ new Date();
|
|
58
|
-
const
|
|
59
|
+
const today = utils.shiftToTimezone(/* @__PURE__ */ new Date(), timezone);
|
|
60
|
+
const shiftedSelected = selectedDate ? utils.shiftToTimezone(selectedDate, timezone) : void 0;
|
|
61
|
+
const shiftedAllowList = react.useMemo(() => {
|
|
62
|
+
return allowOnlyDatesList?.map((date) => {
|
|
63
|
+
return utils.shiftToTimezone(date, timezone);
|
|
64
|
+
});
|
|
65
|
+
}, [allowOnlyDatesList, timezone]);
|
|
66
|
+
const initialFocusIndex = allDays.findIndex((day) => shiftedSelected ? calendar.isSameDate(shiftedSelected, day.value) : calendar.isSameDate(today, day.value));
|
|
59
67
|
const [focusedDayIndex, setFocusedDayIndex] = react.useState(initialFocusIndex >= 0 ? initialFocusIndex : 0);
|
|
60
68
|
const dayRefs = react.useRef([]);
|
|
61
69
|
react.useEffect(() => {
|
|
@@ -69,30 +77,30 @@ const Calendar = ({
|
|
|
69
77
|
return () => clearTimeout(timeoutId);
|
|
70
78
|
}
|
|
71
79
|
}, [autoFocus, initialFocusIndex]);
|
|
72
|
-
const onDayKeyDown = react.useCallback((
|
|
80
|
+
const onDayKeyDown = react.useCallback((event, index, fullDate, isDisabled) => {
|
|
73
81
|
let newIndex = index;
|
|
74
|
-
switch (
|
|
82
|
+
switch (event.key) {
|
|
75
83
|
case "ArrowRight":
|
|
76
|
-
|
|
84
|
+
event.preventDefault();
|
|
77
85
|
newIndex = (index + 1) % totalDays;
|
|
78
86
|
break;
|
|
79
87
|
case "ArrowLeft":
|
|
80
|
-
|
|
88
|
+
event.preventDefault();
|
|
81
89
|
newIndex = (index - 1 + totalDays) % totalDays;
|
|
82
90
|
break;
|
|
83
91
|
case "ArrowDown":
|
|
84
|
-
|
|
92
|
+
event.preventDefault();
|
|
85
93
|
newIndex = (index + DAYS_IN_WEEK) % totalDays;
|
|
86
94
|
break;
|
|
87
95
|
case "ArrowUp":
|
|
88
|
-
|
|
96
|
+
event.preventDefault();
|
|
89
97
|
newIndex = (index - DAYS_IN_WEEK + totalDays) % totalDays;
|
|
90
98
|
break;
|
|
91
99
|
case "Enter":
|
|
92
100
|
case " ":
|
|
93
|
-
|
|
101
|
+
event.preventDefault();
|
|
94
102
|
if (!isDisabled) {
|
|
95
|
-
setSelectedDate(fullDate);
|
|
103
|
+
setSelectedDate(utils.shiftFromTimezone(fullDate, timezone));
|
|
96
104
|
closeDatepicker();
|
|
97
105
|
}
|
|
98
106
|
return;
|
|
@@ -101,7 +109,7 @@ const Calendar = ({
|
|
|
101
109
|
}
|
|
102
110
|
setFocusedDayIndex(newIndex);
|
|
103
111
|
dayRefs.current[newIndex]?.focus();
|
|
104
|
-
}, [totalDays, setSelectedDate, closeDatepicker]);
|
|
112
|
+
}, [totalDays, setSelectedDate, closeDatepicker, timezone]);
|
|
105
113
|
let dayIndex = 0;
|
|
106
114
|
return calendarBody.value.map(({
|
|
107
115
|
key: weekKey,
|
|
@@ -113,9 +121,11 @@ const Calendar = ({
|
|
|
113
121
|
key: dayKey,
|
|
114
122
|
value: fullDate
|
|
115
123
|
}) => {
|
|
116
|
-
const isSelected =
|
|
124
|
+
const isSelected = shiftedSelected && calendar.isSameDate(shiftedSelected, fullDate);
|
|
117
125
|
const isPresent = calendar.isSameDate(today, fullDate);
|
|
118
|
-
const isNotAllowed =
|
|
126
|
+
const isNotAllowed = shiftedAllowList && shiftedAllowList.length > 0 && !shiftedAllowList.some((shiftedDate) => {
|
|
127
|
+
return calendar.isSameDate(shiftedDate, fullDate);
|
|
128
|
+
});
|
|
119
129
|
const isFutureDisabled = futureDatesDisabled && fullDate > today;
|
|
120
130
|
const isDisabled = isNotAllowed || isFutureDisabled;
|
|
121
131
|
const currentIndex = dayIndex;
|
|
@@ -124,7 +134,7 @@ const Calendar = ({
|
|
|
124
134
|
if (isDisabled) {
|
|
125
135
|
return false;
|
|
126
136
|
}
|
|
127
|
-
setSelectedDate(fullDate);
|
|
137
|
+
setSelectedDate(utils.shiftFromTimezone(fullDate, timezone));
|
|
128
138
|
closeDatepicker();
|
|
129
139
|
};
|
|
130
140
|
return /* @__PURE__ */ jsxRuntime.jsx(Common.DateTableCell, { ref: (el) => {
|
|
@@ -139,7 +149,8 @@ const DatePicker = ({
|
|
|
139
149
|
disabled = false,
|
|
140
150
|
futureDatesDisabled = false,
|
|
141
151
|
onSelectDate,
|
|
142
|
-
placeholder
|
|
152
|
+
placeholder,
|
|
153
|
+
timezone = "system"
|
|
143
154
|
}) => {
|
|
144
155
|
const [isOpen, setIsOpen] = react.useState(false);
|
|
145
156
|
const [selectedDate, setSelectedDate] = react.useState();
|
|
@@ -191,8 +202,8 @@ const DatePicker = ({
|
|
|
191
202
|
}
|
|
192
203
|
}, []);
|
|
193
204
|
return /* @__PURE__ */ jsxRuntime.jsxs(RadixPopover__namespace.Root, { onOpenChange, open: isOpen, children: [
|
|
194
|
-
/* @__PURE__ */ jsxRuntime.jsx(PopoverTrigger, { disabled, onKeyDown: onTriggerKeyDown, children: /* @__PURE__ */ jsxRuntime.jsx(Common.DatePickerInput, { "data-testid": "datepicker-input-container", disabled, isActive: isOpen, partialMonth, partialYear, placeholder, selectedDate }) }),
|
|
195
|
-
/* @__PURE__ */ jsxRuntime.jsx(RadixPopover__namespace.Portal, { children: /* @__PURE__ */ jsxRuntime.jsx(PopoverContent, { align: "start", sideOffset: 4, children: /* @__PURE__ */ jsxRuntime.jsx(Common.CalendarRenderer, { calendarOptions, onYearSelect, onMonthSelect, selectedDate, children: (body) => /* @__PURE__ */ jsxRuntime.jsx(Calendar, { allowOnlyDatesList, autoFocus: autoFocusCalendar, calendarBody: body, closeDatepicker: onCloseDatePicker, futureDatesDisabled, selectedDate, setSelectedDate: onDateSelect }) }) }) })
|
|
205
|
+
/* @__PURE__ */ jsxRuntime.jsx(PopoverTrigger, { disabled, onKeyDown: onTriggerKeyDown, children: /* @__PURE__ */ jsxRuntime.jsx(Common.DatePickerInput, { "data-testid": "datepicker-input-container", disabled, isActive: isOpen, partialMonth, partialYear, placeholder, selectedDate, timezone }) }),
|
|
206
|
+
/* @__PURE__ */ jsxRuntime.jsx(RadixPopover__namespace.Portal, { children: /* @__PURE__ */ jsxRuntime.jsx(PopoverContent, { align: "start", sideOffset: 4, children: /* @__PURE__ */ jsxRuntime.jsx(Common.CalendarRenderer, { calendarOptions, onYearSelect, onMonthSelect, selectedDate, timezone, children: (body) => /* @__PURE__ */ jsxRuntime.jsx(Calendar, { allowOnlyDatesList, autoFocus: autoFocusCalendar, calendarBody: body, closeDatepicker: onCloseDatePicker, futureDatesDisabled, selectedDate, setSelectedDate: onDateSelect, timezone }) }) }) })
|
|
196
207
|
] });
|
|
197
208
|
};
|
|
198
209
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../../../../src/components/DatePicker/DatePicker.tsx"],"sourcesContent":["import { KeyboardEvent, useCallback, useEffect, useRef, useState } from 'react';\nimport { isSameDate, UseCalendarOptions } from '@h6s/calendar';\nimport * as Popover from '@radix-ui/react-popover';\nimport { styled } from 'styled-components';\nimport { Body, CalendarRenderer, DatePickerInput, DateTableCell } from './Common';\nimport { DatePickerProps } from './DatePicker.types';\n\nconst DAYS_IN_WEEK = 7;\n\nconst PopoverTrigger = styled(Popover.Trigger)`\n background: none;\n border: none;\n padding: 0;\n cursor: pointer;\n width: fit-content;\n\n &:disabled {\n cursor: not-allowed;\n }\n\n &:focus-visible {\n outline: none;\n }\n`;\n\nconst PopoverContent = styled(Popover.Content)`\n z-index: 1;\n outline: none;\n\n ${({ theme }) => `\n border: 1px solid ${theme.click.genericMenu.panel.color.stroke.default};\n background: ${theme.click.genericMenu.panel.color.background.default};\n box-shadow: ${theme.click.genericMenu.panel.shadow.default};\n border-radius: ${theme.click.genericMenu.panel.radii.all};\n `}\n\n &:focus {\n outline: none;\n }\n`;\n\ninterface CalendarProps {\n allowOnlyDatesList?: Array<Date>;\n calendarBody: Body;\n closeDatepicker: () => void;\n futureDatesDisabled: boolean;\n selectedDate?: Date;\n setSelectedDate: (selectedDate: Date) => void;\n autoFocus?: boolean;\n}\n\nconst Calendar = ({\n allowOnlyDatesList,\n calendarBody,\n closeDatepicker,\n futureDatesDisabled,\n selectedDate,\n setSelectedDate,\n autoFocus = false,\n}: CalendarProps) => {\n const allDays = calendarBody.value.flatMap(week => week.value);\n const totalDays = allDays.length;\n\n const today = new Date();\n const initialFocusIndex = allDays.findIndex(day =>\n selectedDate ? isSameDate(selectedDate, day.value) : isSameDate(today, day.value)\n );\n\n const [focusedDayIndex, setFocusedDayIndex] = useState<number>(\n initialFocusIndex >= 0 ? initialFocusIndex : 0\n );\n const dayRefs = useRef<Array<HTMLTableCellElement | null>>([]);\n\n useEffect(() => {\n dayRefs.current[focusedDayIndex]?.focus();\n }, [focusedDayIndex]);\n\n useEffect(() => {\n if (autoFocus && initialFocusIndex >= 0) {\n const timeoutId = setTimeout(() => {\n dayRefs.current[initialFocusIndex]?.focus();\n }, 0);\n return () => clearTimeout(timeoutId);\n }\n }, [autoFocus, initialFocusIndex]);\n\n const onDayKeyDown = useCallback(\n (\n e: KeyboardEvent<HTMLTableCellElement>,\n index: number,\n fullDate: Date,\n isDisabled: boolean\n ) => {\n let newIndex = index;\n\n switch (e.key) {\n case 'ArrowRight':\n e.preventDefault();\n newIndex = (index + 1) % totalDays;\n break;\n case 'ArrowLeft':\n e.preventDefault();\n newIndex = (index - 1 + totalDays) % totalDays;\n break;\n case 'ArrowDown':\n e.preventDefault();\n newIndex = (index + DAYS_IN_WEEK) % totalDays;\n break;\n case 'ArrowUp':\n e.preventDefault();\n newIndex = (index - DAYS_IN_WEEK + totalDays) % totalDays;\n break;\n case 'Enter':\n case ' ':\n e.preventDefault();\n if (!isDisabled) {\n setSelectedDate(fullDate);\n closeDatepicker();\n }\n return;\n default:\n return;\n }\n\n setFocusedDayIndex(newIndex);\n dayRefs.current[newIndex]?.focus();\n },\n [totalDays, setSelectedDate, closeDatepicker]\n );\n\n let dayIndex = 0;\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 = selectedDate && isSameDate(selectedDate, fullDate);\n const isPresent = isSameDate(today, fullDate);\n const isNotAllowed =\n allowOnlyDatesList &&\n allowOnlyDatesList.length > 0 &&\n !allowOnlyDatesList.some(d => isSameDate(d, fullDate));\n const isFutureDisabled = futureDatesDisabled && fullDate > today;\n const isDisabled = isNotAllowed || isFutureDisabled;\n const currentIndex = dayIndex;\n dayIndex++;\n\n const handleClick = () => {\n if (isDisabled) {\n return false;\n }\n setSelectedDate(fullDate);\n closeDatepicker();\n };\n\n return (\n <DateTableCell\n ref={el => {\n dayRefs.current[currentIndex] = el;\n }}\n $isCurrentMonth={isCurrentMonth}\n $isDisabled={isDisabled}\n $isSelected={isSelected}\n $isPresent={isPresent}\n key={dayKey}\n onClick={handleClick}\n onKeyDown={e => onDayKeyDown(e, currentIndex, fullDate, isDisabled)}\n tabIndex={currentIndex === focusedDayIndex ? 0 : -1}\n role=\"gridcell\"\n aria-label={fullDate.toDateString()}\n >\n {date}\n </DateTableCell>\n );\n })}\n </tr>\n );\n });\n};\n\nexport const DatePicker = ({\n allowOnlyDatesList,\n date,\n disabled = false,\n futureDatesDisabled = false,\n onSelectDate,\n placeholder,\n}: DatePickerProps) => {\n const [isOpen, setIsOpen] = useState<boolean>(false);\n const [selectedDate, setSelectedDate] = useState<Date>();\n const [partialYear, setPartialYear] = useState<number>();\n const [partialMonth, setPartialMonth] = useState<number>();\n const [autoFocusCalendar, setAutoFocusCalendar] = useState<boolean>(false);\n\n const calendarOptions: UseCalendarOptions = {};\n\n if (selectedDate) {\n calendarOptions.defaultDate = selectedDate;\n }\n\n useEffect(() => {\n if (date) {\n setSelectedDate(date);\n }\n }, [date]);\n\n const resetPartialState = useCallback(() => {\n setPartialYear(undefined);\n setPartialMonth(undefined);\n }, []);\n\n const onOpenChange = useCallback(\n (open: boolean) => {\n setIsOpen(open);\n if (!open) {\n resetPartialState();\n setAutoFocusCalendar(false);\n }\n },\n [resetPartialState]\n );\n\n const onCloseDatePicker = useCallback(() => {\n setIsOpen(false);\n resetPartialState();\n }, [resetPartialState]);\n\n const onDateSelect = useCallback(\n (date: Date): void => {\n setSelectedDate(date);\n onSelectDate(date);\n resetPartialState();\n },\n [onSelectDate, resetPartialState]\n );\n\n const onYearSelect = useCallback((year: number) => {\n setPartialYear(year);\n setPartialMonth(undefined);\n }, []);\n\n const onMonthSelect = useCallback((year: number, month: number) => {\n setPartialYear(year);\n setPartialMonth(month);\n }, []);\n\n const onTriggerKeyDown = useCallback((e: KeyboardEvent<HTMLButtonElement>) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n setIsOpen(true);\n setAutoFocusCalendar(true);\n }\n }, []);\n\n return (\n <Popover.Root\n onOpenChange={onOpenChange}\n open={isOpen}\n >\n <PopoverTrigger\n disabled={disabled}\n onKeyDown={onTriggerKeyDown}\n >\n <DatePickerInput\n data-testid=\"datepicker-input-container\"\n disabled={disabled}\n isActive={isOpen}\n partialMonth={partialMonth}\n partialYear={partialYear}\n placeholder={placeholder}\n selectedDate={selectedDate}\n />\n </PopoverTrigger>\n <Popover.Portal>\n <PopoverContent\n align=\"start\"\n sideOffset={4}\n >\n <CalendarRenderer\n calendarOptions={calendarOptions}\n onYearSelect={onYearSelect}\n onMonthSelect={onMonthSelect}\n selectedDate={selectedDate}\n >\n {body => (\n <Calendar\n allowOnlyDatesList={allowOnlyDatesList}\n autoFocus={autoFocusCalendar}\n calendarBody={body}\n closeDatepicker={onCloseDatePicker}\n futureDatesDisabled={futureDatesDisabled}\n selectedDate={selectedDate}\n setSelectedDate={onDateSelect}\n />\n )}\n </CalendarRenderer>\n </PopoverContent>\n </Popover.Portal>\n </Popover.Root>\n );\n};\n"],"names":["DAYS_IN_WEEK","PopoverTrigger","styled","Popover","Trigger","withConfig","componentId","PopoverContent","Content","theme","click","genericMenu","panel","color","stroke","default","background","shadow","radii","all","Calendar","allowOnlyDatesList","calendarBody","closeDatepicker","futureDatesDisabled","selectedDate","setSelectedDate","autoFocus","allDays","value","flatMap","week","totalDays","length","today","Date","initialFocusIndex","findIndex","day","isSameDate","focusedDayIndex","setFocusedDayIndex","useState","dayRefs","useRef","useEffect","current","focus","timeoutId","setTimeout","clearTimeout","onDayKeyDown","useCallback","e","index","fullDate","isDisabled","newIndex","key","preventDefault","dayIndex","map","weekKey","jsx","date","isCurrentMonth","dayKey","isSelected","isPresent","isNotAllowed","some","d","isFutureDisabled","currentIndex","handleClick","DateTableCell","el","toDateString","DatePicker","disabled","onSelectDate","placeholder","isOpen","setIsOpen","partialYear","setPartialYear","partialMonth","setPartialMonth","autoFocusCalendar","setAutoFocusCalendar","calendarOptions","defaultDate","resetPartialState","undefined","onOpenChange","open","onCloseDatePicker","onDateSelect","onYearSelect","year","onMonthSelect","month","onTriggerKeyDown","DatePickerInput","CalendarRenderer","body"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../../../../src/components/DatePicker/DatePicker.tsx"],"sourcesContent":["import { KeyboardEvent, useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { isSameDate, UseCalendarOptions } from '@h6s/calendar';\nimport * as Popover from '@radix-ui/react-popover';\nimport { styled } from 'styled-components';\nimport { Body, CalendarRenderer, DatePickerInput, DateTableCell } from './Common';\nimport { shiftFromTimezone, shiftToTimezone, Timezone } from './utils';\n\nconst DAYS_IN_WEEK = 7;\n\nconst PopoverTrigger = styled(Popover.Trigger)`\n background: none;\n border: none;\n padding: 0;\n cursor: pointer;\n width: fit-content;\n\n &:disabled {\n cursor: not-allowed;\n }\n\n &:focus-visible {\n outline: none;\n }\n`;\n\nconst PopoverContent = styled(Popover.Content)`\n z-index: 1;\n outline: none;\n\n ${({ theme }) => `\n border: 1px solid ${theme.click.genericMenu.panel.color.stroke.default};\n background: ${theme.click.genericMenu.panel.color.background.default};\n box-shadow: ${theme.click.genericMenu.panel.shadow.default};\n border-radius: ${theme.click.genericMenu.panel.radii.all};\n `}\n\n &:focus {\n outline: none;\n }\n`;\n\ninterface CalendarProps {\n allowOnlyDatesList?: Array<Date>;\n calendarBody: Body;\n closeDatepicker: () => void;\n futureDatesDisabled: boolean;\n selectedDate?: Date;\n setSelectedDate: (selectedDate: Date) => void;\n autoFocus?: boolean;\n timezone: Timezone;\n}\n\nconst Calendar = ({\n allowOnlyDatesList,\n calendarBody,\n closeDatepicker,\n futureDatesDisabled,\n selectedDate,\n setSelectedDate,\n autoFocus = false,\n timezone,\n}: CalendarProps) => {\n const allDays = calendarBody.value.flatMap(week => week.value);\n const totalDays = allDays.length;\n\n const today = shiftToTimezone(new Date(), timezone);\n\n const shiftedSelected = selectedDate\n ? shiftToTimezone(selectedDate, timezone)\n : undefined;\n\n const shiftedAllowList = useMemo(() => {\n return allowOnlyDatesList?.map(date => {\n return shiftToTimezone(date, timezone);\n });\n }, [allowOnlyDatesList, timezone]);\n\n const initialFocusIndex = allDays.findIndex(day =>\n shiftedSelected\n ? isSameDate(shiftedSelected, day.value)\n : isSameDate(today, day.value)\n );\n\n const [focusedDayIndex, setFocusedDayIndex] = useState<number>(\n initialFocusIndex >= 0 ? initialFocusIndex : 0\n );\n const dayRefs = useRef<Array<HTMLTableCellElement | null>>([]);\n\n useEffect(() => {\n dayRefs.current[focusedDayIndex]?.focus();\n }, [focusedDayIndex]);\n\n useEffect(() => {\n if (autoFocus && initialFocusIndex >= 0) {\n const timeoutId = setTimeout(() => {\n dayRefs.current[initialFocusIndex]?.focus();\n }, 0);\n return () => clearTimeout(timeoutId);\n }\n }, [autoFocus, initialFocusIndex]);\n\n const onDayKeyDown = useCallback(\n (\n event: KeyboardEvent<HTMLTableCellElement>,\n index: number,\n fullDate: Date,\n isDisabled: boolean\n ) => {\n let newIndex = index;\n\n switch (event.key) {\n case 'ArrowRight':\n event.preventDefault();\n newIndex = (index + 1) % totalDays;\n break;\n case 'ArrowLeft':\n event.preventDefault();\n newIndex = (index - 1 + totalDays) % totalDays;\n break;\n case 'ArrowDown':\n event.preventDefault();\n newIndex = (index + DAYS_IN_WEEK) % totalDays;\n break;\n case 'ArrowUp':\n event.preventDefault();\n newIndex = (index - DAYS_IN_WEEK + totalDays) % totalDays;\n break;\n case 'Enter':\n case ' ':\n event.preventDefault();\n if (!isDisabled) {\n setSelectedDate(shiftFromTimezone(fullDate, timezone));\n closeDatepicker();\n }\n return;\n default:\n return;\n }\n\n setFocusedDayIndex(newIndex);\n dayRefs.current[newIndex]?.focus();\n },\n [totalDays, setSelectedDate, closeDatepicker, timezone]\n );\n\n let dayIndex = 0;\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 = shiftedSelected && isSameDate(shiftedSelected, fullDate);\n const isPresent = isSameDate(today, fullDate);\n\n const isNotAllowed =\n shiftedAllowList &&\n shiftedAllowList.length > 0 &&\n !shiftedAllowList.some((shiftedDate: Date) => {\n return isSameDate(shiftedDate, fullDate);\n });\n\n const isFutureDisabled = futureDatesDisabled && fullDate > today;\n const isDisabled = isNotAllowed || isFutureDisabled;\n const currentIndex = dayIndex;\n dayIndex++;\n\n const handleClick = () => {\n if (isDisabled) {\n return false;\n }\n setSelectedDate(shiftFromTimezone(fullDate, timezone));\n closeDatepicker();\n };\n\n return (\n <DateTableCell\n ref={el => {\n dayRefs.current[currentIndex] = el;\n }}\n $isCurrentMonth={isCurrentMonth}\n $isDisabled={isDisabled}\n $isSelected={isSelected}\n $isPresent={isPresent}\n key={dayKey}\n onClick={handleClick}\n onKeyDown={e => onDayKeyDown(e, currentIndex, fullDate, isDisabled)}\n tabIndex={currentIndex === focusedDayIndex ? 0 : -1}\n role=\"gridcell\"\n aria-label={fullDate.toDateString()}\n >\n {date}\n </DateTableCell>\n );\n })}\n </tr>\n );\n });\n};\n\nexport interface DatePickerProps {\n allowOnlyDatesList?: Array<Date>;\n date?: Date;\n disabled?: boolean;\n futureDatesDisabled?: boolean;\n onSelectDate: (selectedDate: Date) => void;\n placeholder?: string;\n timezone?: Timezone;\n}\n\nexport const DatePicker = ({\n allowOnlyDatesList,\n date,\n disabled = false,\n futureDatesDisabled = false,\n onSelectDate,\n placeholder,\n timezone = 'system',\n}: DatePickerProps) => {\n const [isOpen, setIsOpen] = useState<boolean>(false);\n const [selectedDate, setSelectedDate] = useState<Date>();\n const [partialYear, setPartialYear] = useState<number>();\n const [partialMonth, setPartialMonth] = useState<number>();\n const [autoFocusCalendar, setAutoFocusCalendar] = useState<boolean>(false);\n\n const calendarOptions: UseCalendarOptions = {};\n\n if (selectedDate) {\n calendarOptions.defaultDate = selectedDate;\n }\n\n useEffect(() => {\n if (date) {\n setSelectedDate(date);\n }\n }, [date]);\n\n const resetPartialState = useCallback(() => {\n setPartialYear(undefined);\n setPartialMonth(undefined);\n }, []);\n\n const onOpenChange = useCallback(\n (open: boolean) => {\n setIsOpen(open);\n if (!open) {\n resetPartialState();\n setAutoFocusCalendar(false);\n }\n },\n [resetPartialState]\n );\n\n const onCloseDatePicker = useCallback(() => {\n setIsOpen(false);\n resetPartialState();\n }, [resetPartialState]);\n\n const onDateSelect = useCallback(\n (date: Date): void => {\n setSelectedDate(date);\n onSelectDate(date);\n resetPartialState();\n },\n [onSelectDate, resetPartialState]\n );\n\n const onYearSelect = useCallback((year: number) => {\n setPartialYear(year);\n setPartialMonth(undefined);\n }, []);\n\n const onMonthSelect = useCallback((year: number, month: number) => {\n setPartialYear(year);\n setPartialMonth(month);\n }, []);\n\n const onTriggerKeyDown = useCallback((e: KeyboardEvent<HTMLButtonElement>) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n setIsOpen(true);\n setAutoFocusCalendar(true);\n }\n }, []);\n\n return (\n <Popover.Root\n onOpenChange={onOpenChange}\n open={isOpen}\n >\n <PopoverTrigger\n disabled={disabled}\n onKeyDown={onTriggerKeyDown}\n >\n <DatePickerInput\n data-testid=\"datepicker-input-container\"\n disabled={disabled}\n isActive={isOpen}\n partialMonth={partialMonth}\n partialYear={partialYear}\n placeholder={placeholder}\n selectedDate={selectedDate}\n timezone={timezone}\n />\n </PopoverTrigger>\n <Popover.Portal>\n <PopoverContent\n align=\"start\"\n sideOffset={4}\n >\n <CalendarRenderer\n calendarOptions={calendarOptions}\n onYearSelect={onYearSelect}\n onMonthSelect={onMonthSelect}\n selectedDate={selectedDate}\n timezone={timezone}\n >\n {body => (\n <Calendar\n allowOnlyDatesList={allowOnlyDatesList}\n autoFocus={autoFocusCalendar}\n calendarBody={body}\n closeDatepicker={onCloseDatePicker}\n futureDatesDisabled={futureDatesDisabled}\n selectedDate={selectedDate}\n setSelectedDate={onDateSelect}\n timezone={timezone}\n />\n )}\n </CalendarRenderer>\n </PopoverContent>\n </Popover.Portal>\n </Popover.Root>\n );\n};\n"],"names":["DAYS_IN_WEEK","PopoverTrigger","styled","Popover","Trigger","withConfig","componentId","PopoverContent","Content","theme","click","genericMenu","panel","color","stroke","default","background","shadow","radii","all","Calendar","allowOnlyDatesList","calendarBody","closeDatepicker","futureDatesDisabled","selectedDate","setSelectedDate","autoFocus","timezone","allDays","value","flatMap","week","totalDays","length","today","shiftToTimezone","Date","shiftedSelected","undefined","shiftedAllowList","useMemo","map","date","initialFocusIndex","findIndex","day","isSameDate","focusedDayIndex","setFocusedDayIndex","useState","dayRefs","useRef","useEffect","current","focus","timeoutId","setTimeout","clearTimeout","onDayKeyDown","useCallback","event","index","fullDate","isDisabled","newIndex","key","preventDefault","shiftFromTimezone","dayIndex","weekKey","jsx","isCurrentMonth","dayKey","isSelected","isPresent","isNotAllowed","some","shiftedDate","isFutureDisabled","currentIndex","handleClick","DateTableCell","el","e","toDateString","DatePicker","disabled","onSelectDate","placeholder","isOpen","setIsOpen","partialYear","setPartialYear","partialMonth","setPartialMonth","autoFocusCalendar","setAutoFocusCalendar","calendarOptions","defaultDate","resetPartialState","onOpenChange","open","onCloseDatePicker","onDateSelect","onYearSelect","year","onMonthSelect","month","onTriggerKeyDown","DatePickerInput","CalendarRenderer","body"],"mappings":"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"}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
4
4
|
|
|
5
|
+
require('../../utils/date.cjs');
|
|
5
6
|
const dayjs = require('dayjs');
|
|
6
7
|
|
|
7
8
|
const _interopDefault = e => e && e.__esModule ? e : { default: e };
|
|
@@ -9,31 +10,56 @@ const _interopDefault = e => e && e.__esModule ? e : { default: e };
|
|
|
9
10
|
const dayjs__default = /*#__PURE__*/_interopDefault(dayjs);
|
|
10
11
|
|
|
11
12
|
const locale = "en-US";
|
|
12
|
-
const
|
|
13
|
+
const createFormatter = (options) => {
|
|
14
|
+
const timezoneFormatters = {};
|
|
15
|
+
return (timezone, date) => {
|
|
16
|
+
if (!timezoneFormatters[timezone]) {
|
|
17
|
+
const opts = timezone === "UTC" ? {
|
|
18
|
+
...options,
|
|
19
|
+
timeZone: "UTC"
|
|
20
|
+
} : options;
|
|
21
|
+
timezoneFormatters[timezone] = new Intl.DateTimeFormat(locale, opts);
|
|
22
|
+
}
|
|
23
|
+
return timezoneFormatters[timezone].format(date);
|
|
24
|
+
};
|
|
25
|
+
};
|
|
26
|
+
const formatSelectedDate = createFormatter({
|
|
13
27
|
day: "2-digit",
|
|
14
28
|
month: "short",
|
|
15
29
|
year: "numeric"
|
|
16
30
|
});
|
|
17
|
-
const
|
|
31
|
+
const formatWeekday = createFormatter({
|
|
18
32
|
weekday: "short"
|
|
19
33
|
});
|
|
20
|
-
const
|
|
34
|
+
const formatSelectedDateTime = createFormatter({
|
|
21
35
|
day: "2-digit",
|
|
22
36
|
month: "short",
|
|
23
37
|
hour: "2-digit",
|
|
24
38
|
minute: "2-digit"
|
|
25
39
|
});
|
|
26
|
-
const
|
|
40
|
+
const formatSelectedDateTimeWithSeconds = createFormatter({
|
|
27
41
|
day: "2-digit",
|
|
28
42
|
month: "short",
|
|
29
43
|
hour: "2-digit",
|
|
30
44
|
minute: "2-digit",
|
|
31
45
|
second: "2-digit"
|
|
32
46
|
});
|
|
33
|
-
const
|
|
47
|
+
const formatDateHeader = createFormatter({
|
|
34
48
|
month: "short",
|
|
35
49
|
year: "numeric"
|
|
36
50
|
});
|
|
51
|
+
const shiftToTimezone = (date, timezone) => {
|
|
52
|
+
if (timezone !== "UTC") {
|
|
53
|
+
return date;
|
|
54
|
+
}
|
|
55
|
+
return new Date(date.getTime() + date.getTimezoneOffset() * 6e4);
|
|
56
|
+
};
|
|
57
|
+
const shiftFromTimezone = (date, timezone) => {
|
|
58
|
+
if (timezone !== "UTC") {
|
|
59
|
+
return date;
|
|
60
|
+
}
|
|
61
|
+
return new Date(date.getTime() - date.getTimezoneOffset() * 6e4);
|
|
62
|
+
};
|
|
37
63
|
const getPredefinedMonthsForDateRangePicker = (numberOfMonths) => {
|
|
38
64
|
const now = dayjs__default.default();
|
|
39
65
|
if (numberOfMonths < 0) {
|
|
@@ -67,23 +93,25 @@ const datesAreWithinMaxRange = (startDate, endDate, maxRangeLength) => {
|
|
|
67
93
|
const isDateRangeTheWholeMonth = ({
|
|
68
94
|
startDate,
|
|
69
95
|
endDate
|
|
70
|
-
}) => {
|
|
71
|
-
|
|
96
|
+
}, timezone = "system") => {
|
|
97
|
+
const start = timezone === "UTC" ? dayjs__default.default.utc(startDate) : dayjs__default.default(startDate);
|
|
98
|
+
const end = timezone === "UTC" ? dayjs__default.default.utc(endDate) : dayjs__default.default(endDate);
|
|
99
|
+
if (start.month() !== end.month()) {
|
|
72
100
|
return false;
|
|
73
101
|
}
|
|
74
|
-
const start = dayjs__default.default(startDate);
|
|
75
|
-
const end = dayjs__default.default(endDate);
|
|
76
102
|
const startDateIsFirstDay = start.isSame(start.startOf("month"), "day");
|
|
77
103
|
const endDateIsLastDay = end.isSame(end.endOf("month"), "day");
|
|
78
104
|
return startDateIsFirstDay && endDateIsLastDay;
|
|
79
105
|
};
|
|
80
106
|
|
|
81
107
|
exports.datesAreWithinMaxRange = datesAreWithinMaxRange;
|
|
108
|
+
exports.formatDateHeader = formatDateHeader;
|
|
109
|
+
exports.formatSelectedDate = formatSelectedDate;
|
|
110
|
+
exports.formatSelectedDateTime = formatSelectedDateTime;
|
|
111
|
+
exports.formatSelectedDateTimeWithSeconds = formatSelectedDateTimeWithSeconds;
|
|
112
|
+
exports.formatWeekday = formatWeekday;
|
|
82
113
|
exports.getPredefinedMonthsForDateRangePicker = getPredefinedMonthsForDateRangePicker;
|
|
83
|
-
exports.headerDateFormatter = headerDateFormatter;
|
|
84
114
|
exports.isDateRangeTheWholeMonth = isDateRangeTheWholeMonth;
|
|
85
|
-
exports.
|
|
86
|
-
exports.
|
|
87
|
-
exports.selectedDateTimeFormatterWithSeconds = selectedDateTimeFormatterWithSeconds;
|
|
88
|
-
exports.weekdayFormatter = weekdayFormatter;
|
|
115
|
+
exports.shiftFromTimezone = shiftFromTimezone;
|
|
116
|
+
exports.shiftToTimezone = shiftToTimezone;
|
|
89
117
|
//# sourceMappingURL=utils.cjs.map
|