@stenajs-webui/calendar 20.9.0 → 20.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/util/date/DateFormats.ts","../src/util/calendar/StateModifier.ts","../src/features/today-state/UseHighlightToday.ts","../src/util/calendar/CalendarDataFactory.ts","../src/util/calendar/StateHelper.ts","../src/components/calendar/CalendarTheme.tsx","../src/components/calendar/renderers/WeekDayCell.tsx","../src/components/calendar/renderers/CalendarDay.tsx","../src/components/calendar/renderers/WeekNumberCell.tsx","../src/util/date/DateMinMaxValidator.ts","../src/components/calendar/DisabledDayWrapper.tsx","../src/components/calendar/CalendarMonth.tsx","../src/components/calendar/Calendar.tsx","../src/features/month-picker/MonthPickerCell.tsx","../src/features/month-picker/MonthPicker.tsx","../src/features/preset-picker/PresetFactory.ts","../src/features/preset-picker/PresetPicker.tsx","../src/features/calendar-with-month-year-pickers/CalendarWithMonthYearPickers.tsx","../src/features/month-switcher/hooks/UseSelectedMonthStepperLogic.ts","../src/features/month-switcher/MonthSwitcherBelow.tsx","../src/features/month-switcher/CalendarWithMonthSwitcher.tsx","../src/util/date-range/DateRangeTransformer.ts","../src/util/date-range/DateRangeValidator.ts","../src/features/date-range/hooks/UseDateRangeOnClickDayHandler.ts","../src/features/internal-panel-state/UseInternalPanelState.tsx","../src/components/calendar-types/date-range-calendar/hooks/UseDateRangeSelection.ts","../src/components/calendar-types/date-range-calendar/DateRangeCalendar.tsx","../src/components/calendar-types/date-range-calendar/hooks/UseDateRangeCalendarState.ts","../src/components/calendar-types/single-date-calendar/UseSingleDateSelection.ts","../src/components/calendar-types/single-date-calendar/SingleDateCalendar.tsx","../src/components/calendar-types/multi-date-calendar/UseMultiDateSelection.ts","../src/components/calendar-types/multi-date-calendar/MultiDateCalendar.tsx","../src/components/calendar-types/single-week-calendar/UseSingleWeekSelection.ts","../src/components/calendar-types/single-week-calendar/SingleWeekCalendar.tsx","../src/config/DefaultPopoverPlacement.ts","../src/features/internal-panel-state/UseCalendarPopoverUpdater.ts","../src/components/input-types/date-input/UseDateInput.tsx","../src/config/DefaultMaxDate.ts","../src/components/input-types/date-input/DateInput.tsx","../src/components/input-types/date-range-input/hooks/UseDateRangeInput.tsx","../src/components/input-types/date-range-input/DateRangeInput.tsx","../src/components/input-types/date-text-input/DateTextInput.tsx","../src/util/time/TimeStringFormatValidator.ts","../src/components/input-types/time-text-input/TimeTextInput.tsx","../src/features/dual-text-input/DualTextInput.tsx","../src/util/time/TimeTransformer.ts","../src/features/time-picker/TimePickerCell.tsx","../src/features/time-picker/TimePickerColumn.tsx","../src/features/time-picker/TimePicker.tsx","../src/components/input-types/date-time-input/hooks/UseDateRangeEffects.ts","../src/components/input-types/date-time-input/hooks/UseDateRangeHandlers.ts","../src/components/input-types/date-time-input/hooks/UseInputStates.ts","../src/components/input-types/date-time-input/hooks/UseUserInputHandlers.ts","../src/components/input-types/date-time-input/DateTimeInput.tsx","../src/features/year-picker/YearPickerCell.tsx","../src/features/year-picker/YearPicker.tsx","../src/components/input-types/date-range-dual-text-input/hooks/UseDateRangeEffects.ts","../src/components/input-types/date-range-dual-text-input/hooks/UseDateRangeHandlers.ts","../src/components/input-types/date-range-dual-text-input/hooks/UseInputStates.ts","../src/components/input-types/date-range-dual-text-input/hooks/UseUserInputHandlers.ts","../src/components/input-types/date-range-dual-text-input/DateRangeDualTextInput.tsx"],"sourcesContent":["export const DateFormats = {\n yearAndMonth: \"yyyy-MM\",\n fullDate: \"yyyy-MM-dd\",\n fullMonthName: \"LLLL\",\n fullDateAndTime: \"yyyy-MM-dd HH:mm\",\n fullDateAndTimeSystem: \"yyyy-MM-ddTHH:MM\",\n weekDayName: \"EEEE\", // Tuesday\n weekDayNameShort: \"EEE\", // Tue\n dateAndMonth: \"d MMM\", // 2 Jan\n monthAndDate: \"MMM do\", // Jan 2nd\n};\n","import {\n addDays,\n eachDayOfInterval,\n endOfMonth,\n format,\n getDate,\n getISOWeek,\n isAfter,\n isSameDay,\n max,\n min,\n startOfMonth,\n subDays,\n} from \"date-fns\";\nimport { last } from \"lodash-es\";\nimport {\n CalendarState,\n CalendarUserData,\n DayState,\n DayStateHighlight,\n StateForWeek,\n} from \"../../types/CalendarTypes\";\nimport { DateFormats } from \"../date/DateFormats\";\nimport { WeekData } from \"./CalendarDataFactory\";\n\nexport const buildDayStateForDateRange = (\n statePerMonth: CalendarUserData<DayState> = {},\n start?: Date,\n end?: Date\n): CalendarUserData<DayState> | undefined => {\n if (start && end && isAfter(end, start)) {\n return eachDayOfInterval({ start, end }).reduce(\n (result: CalendarUserData<DayState>, date: Date) => {\n const isFirstInRange = isSameDay(date, start);\n const isLastInRange = isSameDay(date, end);\n const highlights = isFirstInRange\n ? [\"selected\", \"selectedStart\", \"range\"]\n : isLastInRange\n ? [\"selected\", \"selectedEnd\", \"range\"]\n : [\"range\"];\n return addDayStateHighlights(result, date, highlights);\n },\n statePerMonth\n );\n }\n\n let state = statePerMonth;\n\n if (start) {\n state = addDayStateHighlights(state, start, [\"selected\", \"singleSelected\"]);\n }\n\n if (end) {\n state = addDayStateHighlights(state, end, [\"selected\", \"singleSelected\"]);\n }\n\n return state;\n};\n\nexport const buildDayStateForSingleMonth = (\n statePerMonth: CalendarUserData<DayState> = {},\n start: Date | undefined,\n end: Date | undefined,\n dateInFocus: Date\n): CalendarUserData<DayState> | undefined =>\n buildDayStateForRange(\n statePerMonth,\n start,\n end,\n startOfMonth(dateInFocus),\n endOfMonth(dateInFocus)\n );\n\nexport const buildDayStateForRange = (\n statePerMonth: CalendarUserData<DayState> = {},\n start: Date | undefined,\n end: Date | undefined,\n startLimit: Date,\n endLimit: Date\n): CalendarUserData<DayState> | undefined => {\n if (start && end) {\n return buildDayStateForDateRange(\n statePerMonth,\n max([start, subDays(startLimit, 1)]),\n min([end, addDays(endLimit, 1)])\n );\n } else {\n return buildDayStateForDateRange(statePerMonth, start, end);\n }\n};\n\nexport const setDayStateValue = (\n state: CalendarUserData<DayState> | undefined,\n date: Date,\n values: Partial<DayState>\n): CalendarUserData<DayState> => {\n const monthString = format(date, DateFormats.yearAndMonth);\n const weekNumber = getISOWeek(date);\n const dayInMonth = getDate(date);\n return {\n ...state,\n [monthString]: {\n ...(state && state[monthString]),\n [weekNumber]: {\n ...(state && state[monthString] && state[monthString][weekNumber]),\n [dayInMonth]: {\n ...(state &&\n state[monthString] &&\n state[monthString][weekNumber] &&\n state[monthString][weekNumber][dayInMonth]),\n ...values,\n },\n },\n },\n };\n};\n\nexport const setDayStateValueFunction = (\n state: CalendarUserData<DayState> | undefined,\n date: Date,\n setter: (dayState: DayState | undefined) => Partial<DayState>\n): CalendarUserData<DayState> => {\n const monthString = format(date, DateFormats.yearAndMonth);\n const weekNumber = getISOWeek(date);\n const dayInMonth = getDate(date);\n return {\n ...state,\n [monthString]: {\n ...(state && state[monthString]),\n [weekNumber]: {\n ...(state && state[monthString] && state[monthString][weekNumber]),\n [dayInMonth]: {\n ...(state &&\n state[monthString] &&\n state[monthString][weekNumber] &&\n state[monthString][weekNumber][dayInMonth]),\n ...setter(\n state &&\n state[monthString] &&\n state[monthString][weekNumber] &&\n state[monthString][weekNumber][dayInMonth]\n ),\n },\n },\n },\n };\n};\n\nexport const addDayStateHighlights = (\n calendarState: CalendarState | undefined,\n date: Date,\n highlights: Array<DayStateHighlight>\n): CalendarUserData<DayState> => {\n const month = date.getMonth() + 1;\n const monthString = `${date.getFullYear()}-${month < 10 ? \"0\" : \"\"}${month}`;\n const weekNumber = getISOWeek(date);\n const dayInMonth = getDate(date);\n const dayState: DayState | undefined =\n calendarState &&\n calendarState[monthString] &&\n calendarState[monthString][weekNumber] &&\n calendarState[monthString][weekNumber][dayInMonth];\n\n return {\n ...calendarState,\n [monthString]: {\n ...(calendarState && calendarState[monthString]),\n [weekNumber]: {\n ...(calendarState &&\n calendarState[monthString] &&\n calendarState[monthString][weekNumber]),\n [dayInMonth]: addDayStateHighlightsOnSingleDay(dayState, highlights),\n },\n },\n };\n};\n\nexport const addDayStateHighlightsOnSingleDay = (\n dayState: DayState | undefined,\n highlights: Array<DayStateHighlight>\n): DayState => {\n return {\n ...dayState,\n highlights: [...(dayState?.highlights ?? []), ...highlights],\n };\n};\n\nexport const addWeekStateHighlights = (\n calendarState: CalendarState | undefined,\n week: WeekData,\n highlights: Array<DayStateHighlight>\n): CalendarUserData<DayState> => {\n const date = week.days[0].date;\n const month = date.getMonth() + 1;\n const monthString = `${date.getFullYear()}-${month < 10 ? \"0\" : \"\"}${month}`;\n const weekNumber = week.weekNumber;\n\n let state = calendarState;\n week.days.forEach((day) => {\n state = addDayStateHighlights(state, day.date, highlights);\n });\n\n const weekState =\n state && state[monthString] ? state[monthString][weekNumber] : undefined;\n\n const newHighlights: Array<DayStateHighlight> =\n weekState && weekState.highlights\n ? [...weekState.highlights, ...highlights]\n : highlights;\n\n const newWeekState: StateForWeek = {\n ...weekState,\n highlights: newHighlights,\n };\n\n return {\n ...state,\n [monthString]: {\n ...(calendarState && calendarState[monthString]),\n [weekNumber]: newWeekState,\n },\n };\n};\n\nexport const addWeekRangeHighlights = (\n calendarState: CalendarState | undefined,\n week: WeekData\n): CalendarUserData<DayState> => {\n if (!week.days.length) {\n return { ...calendarState };\n }\n const startDate = week.days[0].date;\n const endDate = last(week.days)?.date;\n return {\n ...buildDayStateForDateRange(calendarState, startDate, endDate),\n };\n};\n","import { useMemo } from \"react\";\nimport { CalendarState } from \"../../types/CalendarTypes\";\nimport { addDayStateHighlights } from \"../../util/calendar/StateModifier\";\n\nexport const useHighlightToday = (\n enabled: boolean | undefined,\n statePerMonth: CalendarState | undefined\n) => {\n return useMemo(() => {\n return enabled\n ? addDayStateHighlights(statePerMonth, new Date(), [\"today\"])\n : statePerMonth;\n }, [enabled, statePerMonth]);\n};\n","import {\n addDays,\n addHours,\n addWeeks,\n eachDayOfInterval,\n endOfMonth,\n format,\n getDate,\n getISODay,\n getMonth,\n getWeek,\n getYear,\n isSameDay,\n startOfMonth,\n startOfWeek,\n} from \"date-fns\";\nimport { startCase } from \"lodash-es\";\nimport { DateFormats } from \"../date/DateFormats\";\n\nexport enum Month {\n JANUARY = 0,\n FEBRUARY,\n MARCH,\n APRIL,\n MAY,\n JUNE,\n JULY,\n AUGUST,\n SEPTEMBER,\n OCTOBER,\n NOVEMBER,\n DECEMBER,\n}\n\nexport enum WeekDay {\n SUNDAY = 0,\n MONDAY,\n TUESDAY,\n WEDNESDAY,\n THURSDAY,\n FRIDAY,\n SATURDAY,\n}\n\nexport interface DayData {\n name: string;\n date: Date; // YYYY-MM\n dateString: string; // YYYY-MM\n weekNumber: number;\n year: number; // 2018\n month: number; // 0-11\n dayOfMonth: number; // 1-31\n dayOfWeek: number; // 1-7\n isFirstDayOfWeek: boolean;\n isLastDayOfWeek: boolean;\n isFirstDayOfMonth: boolean;\n isLastDayOfMonth: boolean;\n}\n\nexport interface WeekData {\n weekNumber: number;\n startMonth: number;\n startYear: number;\n endMonth: number;\n endYear: number;\n isLastWeekOfMonth: boolean;\n days: Array<DayData>;\n}\n\nexport interface MonthData {\n monthString: string;\n name: string;\n year: number;\n monthInYear: number;\n weeks: Array<WeekData>;\n}\n\nexport const getMonthsInYear = (\n year: number,\n startMonth: number,\n numMonths: number,\n locale: Locale\n): Array<MonthData> => {\n const months = [];\n for (let i = 0; i < numMonths; i++) {\n months.push(getMonthInYear(year, startMonth + i, locale));\n }\n return months;\n};\n\nexport const getMonthInYear = (\n year: number,\n month: number,\n locale: Locale\n): MonthData => {\n const yearToUse = year + Math.floor(month / 12);\n const monthToUse = month % 12;\n const firstDayOfMonth = new Date(yearToUse, monthToUse, 1);\n return {\n monthString: format(firstDayOfMonth, DateFormats.yearAndMonth),\n name: startCase(\n format(firstDayOfMonth, DateFormats.fullMonthName, { locale })\n ),\n year: yearToUse,\n monthInYear: monthToUse,\n weeks: getWeeksForMonth(yearToUse, monthToUse, locale),\n };\n};\n\nexport const getWeeksForMonth = (\n year: number,\n month: number,\n locale: Locale,\n forceSixWeeks: boolean = true\n): Array<WeekData> => {\n const firstDayOfMonth = new Date(year, month, 1);\n const firstDayOfFirstWeek = startOfWeek(firstDayOfMonth, { locale });\n\n const weeks = [];\n\n for (let i = 0; i < 6; i++) {\n const week = getWeekForDate(addWeeks(firstDayOfFirstWeek, i), locale);\n if (i > 0 && week.startMonth !== month && !forceSixWeeks) {\n return weeks;\n }\n weeks.push(week);\n }\n return weeks;\n};\n\nexport const getWeekForDate = (\n firstDayOfWeek: Date,\n locale: Locale\n): WeekData => {\n const isLastWeekOfMonth =\n getMonth(addDays(firstDayOfWeek, 7)) !== getMonth(firstDayOfWeek);\n return {\n weekNumber: getWeek(firstDayOfWeek, { locale }),\n startMonth: getMonth(firstDayOfWeek),\n startYear: getYear(firstDayOfWeek),\n endMonth: getMonth(addDays(firstDayOfWeek, 6)),\n endYear: getYear(addDays(firstDayOfWeek, 6)),\n days: getDaysForWeekForDate(firstDayOfWeek, locale),\n isLastWeekOfMonth,\n };\n};\n\nexport const createDay = (date: Date, locale: Locale): DayData => {\n const dayOfWeek = getISODay(date);\n return {\n date,\n name: format(date, \"EEE\", locale ? { locale } : undefined),\n dateString: format(addHours(date, 12), DateFormats.fullDate),\n weekNumber: getWeek(date, { locale }),\n year: getYear(date),\n month: getMonth(date),\n dayOfMonth: getDate(date),\n dayOfWeek,\n isFirstDayOfWeek: dayOfWeek === 1,\n isLastDayOfWeek: dayOfWeek === 7,\n isFirstDayOfMonth: isSameDay(startOfMonth(date), date),\n isLastDayOfMonth: isSameDay(endOfMonth(date), date),\n };\n};\n\nexport const getDaysForWeekForDate = (\n firstDayOfWeek: Date,\n locale: Locale\n): Array<DayData> => {\n return eachDayOfInterval({\n start: firstDayOfWeek,\n end: addDays(firstDayOfWeek, 6),\n }).map((d) => createDay(d, locale));\n};\n\nexport const calculateOverflowingMonth = (\n year: number,\n month: number\n): { year: number; month: number } => {\n if (month > Month.DECEMBER) {\n return { year: year + Math.floor(month / 12), month: month % 12 };\n }\n if (month < Month.JANUARY) {\n return { year: year + Math.floor(month / 12), month: 12 + (month % 12) };\n }\n return { year, month };\n};\n","import { DayState, DayStateHighlight } from \"../../types/CalendarTypes\";\n\nexport const dayHasHighlight = (\n dayState: DayState | undefined,\n defaultHighlights: Array<DayStateHighlight> | undefined,\n highlight: string\n): boolean => {\n if (defaultHighlights && defaultHighlights.indexOf(highlight) >= 0) {\n return true;\n }\n if (\n dayState &&\n dayState.highlights &&\n dayState.highlights.indexOf(highlight) >= 0\n ) {\n return true;\n }\n return false;\n};\n\nexport const dayHighlightSelect = <T>(\n dayState: DayState | undefined,\n defaultHighlights: Array<DayStateHighlight> | undefined,\n highlightsOrBoolean: Array<string | boolean>,\n returnValues: Array<T>,\n fallbackValue?: T\n): T | undefined => {\n if (highlightsOrBoolean.length !== returnValues.length) {\n throw new Error(\n \"Select highlight failed, number of values do not equal number of highlights.\"\n );\n }\n if (highlightsOrBoolean.length === 0) {\n return fallbackValue;\n }\n for (let i = 0; i < highlightsOrBoolean.length; i++) {\n if (typeof highlightsOrBoolean[i] === \"boolean\" && highlightsOrBoolean[i]) {\n return returnValues[i];\n }\n if (\n typeof highlightsOrBoolean[i] === \"string\" &&\n dayHasHighlight(\n dayState,\n defaultHighlights,\n highlightsOrBoolean[i] as string\n )\n ) {\n return returnValues[i];\n }\n }\n return fallbackValue;\n};\n","import { IconDefinition } from \"@fortawesome/fontawesome-svg-core\";\nimport { TextProps } from \"@stenajs-webui/core\";\nimport { CSSProperties } from \"react\";\nimport { DayState, DayStateHighlight } from \"../../types/CalendarTypes\";\n\nimport {\n DayData,\n MonthData,\n WeekData,\n} from \"../../util/calendar/CalendarDataFactory\";\nimport { dayHighlightSelect } from \"../../util/calendar/StateHelper\";\n\nexport interface CalendarTheme<TUserData = unknown> {\n width: string;\n height: string;\n WeekNumber: WeekNumberTheme;\n WeekDay: WeekDayTheme;\n CalendarDay: CalendarDayTheme<TUserData>;\n CalendarMonth: CalendarMonthTheme;\n}\n\nexport interface WeekNumberTheme {\n backgroundColor: string;\n textColor?: string;\n clickableTextColor?: string;\n}\n\nexport interface CalendarMonthTheme {\n headerTextColor?: string;\n cellSpacing?: string;\n headerLeftIcon?: IconDefinition;\n headerRightIcon?: IconDefinition;\n}\n\nexport interface WeekDayTheme {\n textColor?: string;\n clickableTextColor?: string;\n}\n\nexport type CalendarStyleProvider<TUserData, TResult> = (\n defaultHighlights: Array<DayStateHighlight> | undefined,\n dayState: DayState | undefined,\n day: DayData,\n week: WeekData,\n month: MonthData,\n userData?: TUserData\n) => TResult;\n\nexport type CalendarWrapperStyleProvider<TUserData> = CalendarStyleProvider<\n TUserData,\n CSSProperties | undefined\n>;\n\ntype TextPropsProvider<TUserData> = CalendarStyleProvider<\n TUserData,\n TextProps | undefined\n>;\n\nexport interface CalendarDayTheme<TUserData> {\n tdStyle?: CalendarWrapperStyleProvider<TUserData>;\n innerWrapperStyle?: CalendarWrapperStyleProvider<TUserData>;\n cellWrapperStyle?: CalendarWrapperStyleProvider<TUserData>;\n textProps?: TextPropsProvider<TUserData>;\n}\n\nexport interface CalendarDefaultWrapperColors {\n selectedBackground: string;\n rangeBackground: string;\n todayBackground: string;\n borderColor?: string;\n borderRadius?: string;\n rangeBorderRadius?: string;\n}\n\nexport const defaultWrapperStyleProvider =\n ({\n selectedBackground,\n todayBackground,\n rangeBackground,\n borderColor = \"transparent\",\n }: CalendarDefaultWrapperColors): CalendarWrapperStyleProvider<unknown> =>\n (defaultHighlights, dayState, day, _, month) => {\n const backgroundColor = dayHighlightSelect(\n dayState,\n defaultHighlights,\n [\"selected\", \"range\", \"today\", day.month === month.monthInYear],\n [selectedBackground, rangeBackground, todayBackground, \"#fff\"],\n \"transparent\"\n );\n\n return {\n backgroundColor,\n borderWidth: \"1px\",\n borderStyle: \"solid\",\n borderColor: dayHighlightSelect(\n dayState,\n defaultHighlights,\n [\"selectedStart\", \"selectedEnd\", \"singleSelected\", \"range\", \"today\"],\n [\n \"var(--swui-calendar-wrapper-range-background)\",\n \"var(--swui-calendar-wrapper-range-background)\",\n \"var(--swui-calendar-wrapper-range-background)\",\n \"var(--swui-calendar-wrapper-range-border)\",\n \"var(--lhds-color-ui-500)\",\n ],\n borderColor\n ),\n borderTopLeftRadius: dayHighlightSelect(\n dayState,\n defaultHighlights,\n [\"selectedStart\", \"singleSelected\", \"today\"],\n [\n \"var(--swui-calendar-day-border-radius)\",\n \"var(--swui-calendar-day-border-radius)\",\n \"var(--swui-calendar-day-border-radius)\",\n ],\n \"unset\"\n ),\n borderBottomLeftRadius: dayHighlightSelect(\n dayState,\n defaultHighlights,\n [\"selectedStart\", \"singleSelected\", \"today\"],\n [\n \"var(--swui-calendar-day-border-radius)\",\n \"var(--swui-calendar-day-border-radius)\",\n \"var(--swui-calendar-day-border-radius)\",\n ],\n \"unset\"\n ),\n borderTopRightRadius: dayHighlightSelect(\n dayState,\n defaultHighlights,\n [\"selectedEnd\", \"singleSelected\", \"today\"],\n [\n \"var(--swui-calendar-day-border-radius)\",\n \"var(--swui-calendar-day-border-radius)\",\n \"var(--swui-calendar-day-border-radius)\",\n ],\n \"unset\"\n ),\n borderBottomRightRadius: dayHighlightSelect(\n dayState,\n defaultHighlights,\n [\"selectedEnd\", \"singleSelected\", \"today\"],\n [\n \"var(--swui-calendar-day-border-radius)\",\n \"var(--swui-calendar-day-border-radius)\",\n \"var(--swui-calendar-day-border-radius)\",\n ],\n \"unset\"\n ),\n boxSizing: \"border-box\",\n };\n };\n\ninterface DefaultTextColors {\n disabledColor: string;\n inOtherMonthColor: string;\n selectedColor: string;\n rangeTextColor?: string;\n}\n\nexport const defaultTextPropsProvider = ({\n selectedColor,\n disabledColor,\n inOtherMonthColor,\n rangeTextColor,\n}: DefaultTextColors): TextPropsProvider<unknown> => {\n return (defaultHighlights, dayState, day, _, month) => {\n const isOtherMonth = day.month !== month.monthInYear;\n const color = dayHighlightSelect(\n dayState,\n defaultHighlights,\n [isOtherMonth, \"selected\", \"range\", \"enabled\", \"disabled\"],\n [\n inOtherMonthColor,\n selectedColor,\n rangeTextColor,\n undefined,\n disabledColor,\n ]\n );\n return {\n color,\n };\n };\n};\n\nexport const defaultCalendarTheme: CalendarTheme = {\n width: \"var(--swui-calendar-day-width)\",\n height: \"var(--swui-calendar-day-height)\",\n WeekNumber: {\n backgroundColor: \"var(--swui-calendar-week-number-bg-color)\",\n textColor: \"var(--swui-calendar-week-number-text-color)\",\n clickableTextColor: \"var(--swui-calendar-week-number-clickable-text-color)\",\n },\n WeekDay: {\n textColor: \"var(--swui-calendar-week-day-text-color)\",\n clickableTextColor: \"var(--swui-calendar-week-day-clickable-text-color)\",\n },\n CalendarDay: {\n tdStyle: defaultWrapperStyleProvider({\n selectedBackground: \"var(--swui-calendar-wrapper-selected-background)\",\n rangeBackground: \"var(--swui-calendar-wrapper-range-background)\",\n todayBackground: \"var(--swui-calendar-wrapper-today-background)\",\n }),\n textProps: defaultTextPropsProvider({\n selectedColor: \"var(--swui-calendar-text-selected-color)\",\n disabledColor: \"var(--swui-calendar-text-disabled-color)\",\n inOtherMonthColor: \"var(--swui-calendar-text-in-other-month-color)\",\n }),\n },\n CalendarMonth: {\n headerTextColor: \"var(--swui-calendar-week-day-text-color)\",\n },\n};\n\nexport const extranetCalendarTheme: CalendarTheme = {\n ...defaultCalendarTheme,\n width: \"37px\",\n height: \"37px\",\n};\n","import { Box, Clickable, Text } from \"@stenajs-webui/core\";\nimport * as React from \"react\";\nimport { OnClickWeekDay } from \"../../../types/CalendarTypes\";\nimport { DayData } from \"../../../util/calendar/CalendarDataFactory\";\nimport { CalendarTheme } from \"../CalendarTheme\";\n\nexport interface WeekDayCellProps {\n onClickWeekDay?: OnClickWeekDay;\n day: DayData;\n theme: CalendarTheme;\n}\n\nexport const WeekDayCell = ({\n onClickWeekDay,\n day,\n theme,\n}: WeekDayCellProps) => {\n const content = (\n <Box\n width={theme.width}\n height={theme.height}\n justifyContent={\"center\"}\n alignItems={\"center\"}\n >\n <Text\n size={\"small\"}\n color={\n onClickWeekDay\n ? theme.WeekDay.clickableTextColor\n : theme.WeekDay.textColor\n }\n >\n {day.name}\n </Text>\n </Box>\n );\n\n if (onClickWeekDay) {\n return (\n <Clickable\n borderRadius={\"var(--swui-calendar-day-border-radius)\"}\n onClick={(ev) => onClickWeekDay(day.dayOfWeek, ev)}\n disableFocusHighlight={!onClickWeekDay}\n >\n {content}\n </Clickable>\n );\n }\n\n return content;\n};\n","import styled from \"@emotion/styled\";\nimport { Box, Text } from \"@stenajs-webui/core\";\nimport * as React from \"react\";\nimport {\n CalendarDayProps,\n DayState,\n DayStateHighlight,\n} from \"../../../types/CalendarTypes\";\nimport { dayHighlightSelect } from \"../../../util/calendar/StateHelper\";\n\nexport const CalendarDay = function CalendarDay<T>({\n day,\n week,\n month,\n dayState,\n userData,\n onClickDay,\n theme,\n extraDayContent: ExtraDayContent,\n defaultHighlights,\n}: CalendarDayProps<T>) {\n const content = (\n <Box\n width={\"100%\"}\n height={\"100%\"}\n justifyContent={\"center\"}\n alignItems={\"center\"}\n >\n <Text\n {...(theme.CalendarDay.textProps &&\n theme.CalendarDay.textProps(\n defaultHighlights,\n dayState,\n day,\n week,\n month,\n userData\n ))}\n >\n {day.dayOfMonth}\n </Text>\n </Box>\n );\n\n const WrapperTd = styled.td({\n ...(theme.CalendarDay.tdStyle &&\n theme.CalendarDay.tdStyle(\n defaultHighlights,\n dayState,\n day,\n week,\n month,\n userData\n )),\n });\n\n const InnerWrapperDiv = styled.div({\n ...(theme.CalendarDay.innerWrapperStyle &&\n theme.CalendarDay.innerWrapperStyle(\n defaultHighlights,\n dayState,\n day,\n week,\n month,\n userData\n )),\n width: \"100%\",\n height: \"100%\",\n });\n\n const CellWrapperDiv = styled.div({\n ...(theme.CalendarDay.cellWrapperStyle &&\n theme.CalendarDay.cellWrapperStyle(\n defaultHighlights,\n dayState,\n day,\n week,\n month,\n userData\n )),\n width: \"100%\",\n height: \"100%\",\n position: \"relative\",\n });\n\n const disabled = isDisabled(defaultHighlights, dayState);\n\n return (\n <WrapperTd\n onClick={disabled ? undefined : (ev) => onClickDay?.(day, userData, ev)}\n >\n <InnerWrapperDiv>\n <CellWrapperDiv>\n {day.month === month.monthInYear && (\n <>\n {ExtraDayContent && (\n <ExtraDayContent\n week={week}\n month={month}\n day={day}\n dayState={dayState}\n theme={theme}\n userData={userData}\n />\n )}\n {content}\n </>\n )}\n </CellWrapperDiv>\n </InnerWrapperDiv>\n </WrapperTd>\n );\n};\n\nconst isDisabled = (\n defaultHighlights: Array<DayStateHighlight> | undefined,\n dayState: DayState | undefined\n): boolean =>\n !!dayHighlightSelect<boolean>(\n dayState,\n defaultHighlights,\n [\"disabled\"],\n [true],\n false\n );\n","import { Box, Clickable, Text } from \"@stenajs-webui/core\";\nimport * as React from \"react\";\nimport { OnClickWeek } from \"../../../types/CalendarTypes\";\nimport { WeekData } from \"../../../util/calendar/CalendarDataFactory\";\nimport { CalendarTheme } from \"../CalendarTheme\";\n\nexport interface WeekNumberCellProps {\n week: WeekData;\n onClickWeek?: OnClickWeek;\n theme: CalendarTheme;\n background?: JSX.Element;\n prefix?: string;\n backgroundColor?: string;\n}\n\nexport const WeekNumberCell: React.FC<WeekNumberCellProps> = ({\n onClickWeek,\n theme,\n week,\n background,\n backgroundColor,\n prefix,\n}) => {\n const content = (\n <Box\n width={theme.width}\n height={theme.height}\n justifyContent={\"center\"}\n alignItems={\"center\"}\n >\n {background && <Box position={\"absolute\"}>{background}</Box>}\n <Box position={\"absolute\"}>\n <Text\n color={\n onClickWeek\n ? theme.WeekNumber.clickableTextColor\n : theme.WeekNumber.textColor\n }\n >\n {prefix}\n {week.weekNumber}\n </Text>\n </Box>\n </Box>\n );\n return (\n <Box\n background={backgroundColor || theme.WeekNumber.backgroundColor}\n position={\"relative\"}\n >\n {onClickWeek ? (\n <Clickable\n borderRadius={\"var(--swui-calendar-day-border-radius)\"}\n onClick={(ev) => onClickWeek(week, ev)}\n disableFocusHighlight={!onClickWeek}\n >\n {content}\n </Clickable>\n ) : (\n content\n )}\n </Box>\n );\n};\n","import { isAfter, isBefore, isSameDay } from \"date-fns\";\n\nexport const isDateInMinMaxRange = (\n date: Date,\n min: Date | undefined,\n max: Date | undefined\n): boolean => {\n if (min && isBefore(date, min)) {\n return isSameDay(date, min);\n }\n if (max && isAfter(date, max)) {\n return isSameDay(date, max);\n }\n return true;\n};\n","import * as React from \"react\";\nimport { useMemo } from \"react\";\nimport {\n CalendarDayProps,\n OptionalMinMaxDates,\n} from \"../../types/CalendarTypes\";\nimport { addDayStateHighlightsOnSingleDay } from \"../../util/calendar/StateModifier\";\nimport { isDateInMinMaxRange } from \"../../util/date/DateMinMaxValidator\";\n\ninterface DisabledDayWrapperProps<T>\n extends CalendarDayProps<T>,\n OptionalMinMaxDates {\n dayComponent: React.ComponentType<CalendarDayProps<T>>;\n}\n\nexport const DisabledDayWrapper = function DisabledDayWrapper<T>({\n dayComponent: DayComponent,\n minDate,\n maxDate,\n dayState,\n day,\n ...props\n}: DisabledDayWrapperProps<T>) {\n const activeDayState = useMemo(\n () =>\n !isDateInMinMaxRange(day.date, minDate, maxDate)\n ? addDayStateHighlightsOnSingleDay(dayState, [\"disabled\"])\n : dayState,\n [day.date, dayState, maxDate, minDate]\n );\n\n return <DayComponent day={day} {...props} dayState={activeDayState} />;\n};\n","import { Box, Row, Text } from \"@stenajs-webui/core\";\nimport * as React from \"react\";\nimport {\n CalendarDayProps,\n CalendarOnClicks,\n CalendarUserMonthData,\n DayState,\n DayStateHighlight,\n ExtraDayContentProps,\n OptionalMinMaxDates,\n Renderers,\n} from \"../../types/CalendarTypes\";\nimport {\n DayData,\n MonthData,\n WeekData,\n} from \"../../util/calendar/CalendarDataFactory\";\nimport { CalendarTheme, defaultCalendarTheme } from \"./CalendarTheme\";\nimport { WeekDayCell } from \"./renderers/WeekDayCell\";\nimport { CalendarDay } from \"./renderers/CalendarDay\";\nimport { FlatButton, stenaAngleDown } from \"@stenajs-webui/elements\";\nimport { WeekNumberCell } from \"./renderers/WeekNumberCell\";\nimport { DisabledDayWrapper } from \"./DisabledDayWrapper\";\n\nexport interface CalendarMonthProps<T>\n extends CalendarOnClicks<T>,\n Renderers,\n OptionalMinMaxDates {\n month: MonthData;\n dayComponent?: React.ComponentType<CalendarDayProps<T>>;\n userDataPerWeek?: CalendarUserMonthData<T>;\n statePerWeek?: CalendarUserMonthData<DayState>;\n theme?: CalendarTheme;\n headerRightContent?: React.ReactElement<{}>;\n extraDayContent?: React.ComponentType<ExtraDayContentProps<T>>;\n defaultHighlights?: Array<DayStateHighlight>;\n showWeekNumber: boolean;\n}\n\nexport function CalendarMonth<T>({\n month,\n dayComponent = CalendarDay,\n statePerWeek,\n userDataPerWeek,\n minDate,\n maxDate,\n onClickDay,\n onClickWeek,\n onClickWeekDay,\n onClickMonth,\n renderWeekNumber,\n renderWeekDay,\n headerRightContent,\n theme = defaultCalendarTheme,\n extraDayContent,\n defaultHighlights,\n showWeekNumber,\n}: CalendarMonthProps<T>) {\n return (\n <>\n <Box alignItems={\"stretch\"}>\n <Row\n justifyContent={headerRightContent ? \"space-between\" : \"center\"}\n alignItems={\"center\"}\n >\n <Row justifyContent={\"center\"} alignItems={\"center\"}>\n {onClickMonth ? (\n <FlatButton\n onClick={() => onClickMonth(month)}\n label={month.name + \" \" + String(month.year)}\n rightIcon={stenaAngleDown}\n />\n ) : (\n <Text whiteSpace={\"nowrap\"}>\n {month.name} {month.year}\n </Text>\n )}\n </Row>\n\n {headerRightContent && (\n <Box alignItems={\"center\"}>{headerRightContent}</Box>\n )}\n </Row>\n\n <table>\n <tbody>\n <tr>\n {showWeekNumber && (\n <td>\n <Box width={theme.width} height={theme.height} />\n </td>\n )}\n {month.weeks[0].days.map((day: DayData) => (\n <td key={day.name}>\n {renderWeekDay ? (\n renderWeekDay(day.name, theme, onClickWeekDay)\n ) : (\n <WeekDayCell\n day={day}\n onClickWeekDay={onClickWeekDay}\n theme={theme}\n />\n )}\n </td>\n ))}\n </tr>\n {month.weeks.map((week: WeekData) => (\n <>\n <tr key={week.weekNumber}>\n {showWeekNumber && (\n <td>\n {renderWeekNumber ? (\n renderWeekNumber(week, theme, onClickWeek)\n ) : (\n <WeekNumberCell\n week={week}\n onClickWeek={onClickWeek}\n theme={theme}\n />\n )}\n </td>\n )}\n {week.days.map((day) => (\n <DisabledDayWrapper\n dayComponent={dayComponent}\n key={day.dateString}\n day={day}\n week={week}\n month={month}\n dayState={\n statePerWeek &&\n statePerWeek[week.weekNumber] &&\n statePerWeek[week.weekNumber][day.dayOfMonth]\n }\n userData={\n userDataPerWeek &&\n userDataPerWeek[week.weekNumber] &&\n userDataPerWeek[week.weekNumber][day.dayOfMonth]\n }\n onClickDay={onClickDay}\n theme={theme}\n extraDayContent={extraDayContent}\n defaultHighlights={defaultHighlights}\n minDate={minDate}\n maxDate={maxDate}\n />\n ))}\n </tr>\n </>\n ))}\n </tbody>\n </table>\n </Box>\n </>\n );\n}\n","import { Row, Spacing } from \"@stenajs-webui/core\";\nimport { getMonth, getYear, parse } from \"date-fns\";\nimport { enGB } from \"date-fns/locale\";\nimport { chunk } from \"lodash-es\";\nimport * as React from \"react\";\nimport { useMemo } from \"react\";\nimport { useHighlightToday } from \"../../features/today-state/UseHighlightToday\";\nimport {\n CalendarOnClicks,\n CalendarProps,\n CalendarUserData,\n DayState,\n Renderers,\n} from \"../../types/CalendarTypes\";\nimport {\n calculateOverflowingMonth,\n getMonthInYear,\n getMonthsInYear,\n MonthData,\n} from \"../../util/calendar/CalendarDataFactory\";\nimport cx from \"classnames\";\nimport styles from \"./Calendar.module.css\";\n\nimport { CalendarMonth } from \"./CalendarMonth\";\nimport { CalendarTheme, defaultCalendarTheme } from \"./CalendarTheme\";\nimport { CalendarDay } from \"./renderers/CalendarDay\";\n\ninterface CalendarPanelProps<T>\n extends CalendarProps<T>,\n CalendarOnClicks<T>,\n Renderers {\n year: number;\n month: number;\n monthRows: Array<Array<MonthData>>;\n userDataPerMonth?: CalendarUserData<T>;\n statePerMonth?: CalendarUserData<DayState>;\n width?: string;\n height?: string;\n theme?: CalendarTheme;\n}\n\nfunction CalendarPanel<T>({\n monthRows,\n dayComponent = CalendarDay,\n userDataPerMonth,\n statePerMonth,\n minDate,\n maxDate,\n onClickDay,\n onClickWeekDay,\n onClickWeek,\n onClickMonth,\n renderWeekDay,\n renderWeekNumber,\n headerRightContent,\n extraDayContent,\n defaultHighlights,\n showWeekNumber,\n theme = defaultCalendarTheme,\n}: CalendarPanelProps<T>) {\n const minDateObj = useMemo(\n () => (minDate ? parse(minDate, \"yyyy-MM-dd\", new Date()) : undefined),\n [minDate]\n );\n\n const maxDateObj = useMemo(\n () => (maxDate ? parse(maxDate, \"yyyy-MM-dd\", new Date()) : undefined),\n [maxDate]\n );\n\n return (\n <div\n className={cx(\n styles.calendar,\n showWeekNumber && styles.weekNumberVisible\n )}\n >\n {monthRows.map((monthRow, rowIndex) => (\n <Spacing key={rowIndex}>\n <Row gap={2}>\n {monthRow.map((month) => (\n <CalendarMonth<T>\n key={month.name}\n month={month}\n dayComponent={dayComponent}\n userDataPerWeek={\n userDataPerMonth && userDataPerMonth[month.monthString]\n }\n statePerWeek={statePerMonth && statePerMonth[month.monthString]}\n onClickDay={onClickDay}\n onClickWeekDay={onClickWeekDay}\n onClickWeek={onClickWeek}\n onClickMonth={onClickMonth}\n theme={theme}\n renderWeekNumber={renderWeekNumber}\n renderWeekDay={renderWeekDay}\n headerRightContent={headerRightContent}\n extraDayContent={extraDayContent}\n defaultHighlights={defaultHighlights}\n minDate={minDateObj}\n maxDate={maxDateObj}\n showWeekNumber={showWeekNumber ?? false}\n />\n ))}\n </Row>\n </Spacing>\n ))}\n </div>\n );\n}\n\nexport function Calendar<T>(props: CalendarProps<T>) {\n const initialDate = getInitialDate(props.year, props.month, props.date);\n const { year, month } = calculateOverflowingMonth(\n initialDate.year,\n initialDate.month\n );\n const monthRows = getMonthRows(\n year,\n month,\n props.locale ?? enGB,\n props.numMonths,\n props.monthsPerRow\n );\n\n const statePerMonth = useHighlightToday(\n props.highlightToday,\n props.statePerMonth\n );\n\n return (\n <CalendarPanel<T>\n year={year}\n month={month}\n monthRows={monthRows}\n {...props}\n statePerMonth={statePerMonth}\n />\n );\n}\n\nconst getInitialDate = (year?: number, month?: number, date?: Date) => {\n if (month && year) {\n return {\n month,\n year,\n };\n }\n if (date) {\n return {\n month: getMonth(date),\n year: getYear(date),\n };\n }\n const now = new Date();\n return {\n month: getMonth(now),\n year: getYear(now),\n };\n};\n\nconst getMonthRows = (\n year: number,\n month: number,\n locale: Locale,\n numMonths?: number,\n monthsPerRow?: number\n): Array<Array<MonthData>> => {\n if (numMonths == null) {\n return [[getMonthInYear(year, month, locale)]];\n }\n if (monthsPerRow == null) {\n return [getMonthsInYear(year, month, numMonths, locale)];\n }\n return chunk(getMonthsInYear(year, month, numMonths, locale), monthsPerRow);\n};\n","import { startCase } from \"lodash-es\";\nimport * as React from \"react\";\nimport { useMemo } from \"react\";\nimport { Row } from \"@stenajs-webui/core\";\nimport { FlatButton, PrimaryButton } from \"@stenajs-webui/elements\";\nimport { format } from \"date-fns\";\nimport { Month } from \"../../util/calendar/CalendarDataFactory\";\n\ninterface MonthPickerCellProps {\n year: number;\n month: Month;\n onClick: () => void;\n selected: boolean;\n locale: Locale;\n}\n\nexport const MonthPickerCell: React.FC<MonthPickerCellProps> = ({\n month,\n year,\n onClick,\n selected,\n locale,\n}) => {\n const label = useMemo(() => {\n const now = new Date(year, month, 1);\n return startCase(format(now, \"MMM\", { locale }));\n }, [locale, year, month]);\n\n return (\n <Row justifyContent={\"center\"}>\n {selected ? (\n <PrimaryButton label={label} onClick={onClick} />\n ) : (\n <FlatButton label={label} onClick={onClick} />\n )}\n </Row>\n );\n};\n","import { enGB } from \"date-fns/locale\";\nimport * as React from \"react\";\nimport { Month } from \"../../util/calendar/CalendarDataFactory\";\nimport { ValueAndOnValueChangeProps } from \"@stenajs-webui/forms\";\nimport { Column, Heading, Row } from \"@stenajs-webui/core\";\nimport { MonthPickerCell } from \"./MonthPickerCell\";\n\nexport interface MonthPickerValue {\n month: Month;\n year: number;\n}\n\nexport interface MonthPickerProps\n extends ValueAndOnValueChangeProps<MonthPickerValue> {\n locale?: Locale;\n firstMonth: Date;\n numMonths: number;\n}\n\nexport const MonthPicker: React.FC<MonthPickerProps> = ({\n value,\n onValueChange,\n locale = enGB,\n firstMonth,\n numMonths,\n}) => {\n const input = createMonths(firstMonth, numMonths);\n\n return (\n <Column gap={1} maxWidth={\"336px\"}>\n {input.years.map(({ year, months }) => (\n <>\n <Heading variant={\"h4\"}>{year}</Heading>\n <Row gap={1} flexWrap={\"wrap\"}>\n {months.map((month) => (\n <MonthPickerCell\n key={month}\n month={month}\n year={year}\n locale={locale}\n selected={value?.month === month && value?.year === year}\n onClick={() => onValueChange?.({ month, year })}\n />\n ))}\n </Row>\n </>\n ))}\n </Column>\n );\n};\n\ninterface MonthInput {\n years: Array<YearInput>;\n}\n\ninterface YearInput {\n year: number;\n months: Array<Month>;\n}\n\nconst createMonths = (firstMonth: Date, numMonths: number): MonthInput => {\n let currentYear = firstMonth.getFullYear();\n let currentMonth = firstMonth.getMonth();\n\n const input: MonthInput = {\n years: [{ year: currentYear, months: [currentMonth] }],\n };\n\n for (let i = 1; i < numMonths; i++) {\n if (currentMonth === Month.DECEMBER) {\n currentYear++;\n currentMonth = 0;\n input.years.push({ year: currentYear, months: [currentMonth] });\n } else {\n currentMonth++;\n input.years[input.years.length - 1].months.push(currentMonth);\n }\n }\n\n return input;\n};\n\nexport const createFirstDate = (date: Date): MonthPickerValue => {\n return {\n year: date.getFullYear(),\n month: date.getMonth(),\n };\n};\n","import { PresetPage } from \"./CalendarPreset\";\nimport { addDays, subDays } from \"date-fns\";\n\nexport const createStandardDateRangePresets = (\n now: Date\n): Array<PresetPage> => [\n {\n label: \"Past\",\n presets: [\n { label: \"Last 3 days\", startDate: now, endDate: subDays(now, 2) },\n { label: \"Last 7 days\", startDate: now, endDate: subDays(now, 6) },\n { label: \"Last 30 days\", startDate: now, endDate: subDays(now, 29) },\n { label: \"Last 45 days\", startDate: now, endDate: subDays(now, 44) },\n ],\n },\n {\n label: \"Future\",\n presets: [\n { label: \"Next 3 days\", startDate: now, endDate: addDays(now, 2) },\n { label: \"Next 7 days\", startDate: now, endDate: addDays(now, 6) },\n { label: \"Next 30 days\", startDate: now, endDate: addDays(now, 29) },\n { label: \"Next 45 days\", startDate: now, endDate: addDays(now, 44) },\n ],\n },\n];\n","import * as React from \"react\";\nimport { useMemo, useState } from \"react\";\nimport { createStandardDateRangePresets } from \"./PresetFactory\";\nimport { Column, Row, Space, Text } from \"@stenajs-webui/core\";\nimport {\n FlatButton,\n PrimaryButton,\n stenaAngleLeft,\n stenaAngleRight,\n} from \"@stenajs-webui/elements\";\nimport { CalendarPreset } from \"./CalendarPreset\";\n\nexport interface PresetPickerProps {\n onClickPreset: (preset: CalendarPreset) => void;\n}\n\nexport const PresetPicker: React.FC<PresetPickerProps> = ({\n onClickPreset,\n}) => {\n const [pageIndex, setPageIndex] = useState(0);\n const pages = useMemo(() => createStandardDateRangePresets(new Date()), []);\n\n const currentPage = pages[pageIndex] ?? pages[0];\n\n return (\n <Column>\n <Row\n justifyContent={\"space-between\"}\n alignItems={\"center\"}\n width={\"200px\"}\n >\n <FlatButton\n size={\"small\"}\n leftIcon={stenaAngleLeft}\n disabled={pageIndex === 0}\n onClick={() => setPageIndex(pageIndex - 1)}\n />\n <Text>{currentPage.label}</Text>\n <FlatButton\n size={\"small\"}\n leftIcon={stenaAngleRight}\n disabled={pageIndex === pages.length - 1}\n onClick={() => setPageIndex(pageIndex + 1)}\n />\n </Row>\n <Space />\n <Column alignItems={\"center\"}>\n {currentPage.presets.map((preset) => (\n <React.Fragment key={preset.label}>\n <PrimaryButton\n label={preset.label}\n onClick={() => onClickPreset(preset)}\n />\n <Space />\n </React.Fragment>\n ))}\n </Column>\n </Column>\n );\n};\n","import { Box } from \"@stenajs-webui/core\";\nimport { PrimaryButton } from \"@stenajs-webui/elements\";\nimport * as React from \"react\";\nimport { ReactNode, useCallback } from \"react\";\nimport { Calendar } from \"../../components/calendar/Calendar\";\nimport {\n CalendarProps,\n RenderMonthPickerArgs,\n} from \"../../types/CalendarTypes\";\nimport {\n createFirstDate,\n MonthPicker,\n MonthPickerValue,\n} from \"../month-picker/MonthPicker\";\nimport { CalendarPreset } from \"../preset-picker/CalendarPreset\";\nimport { PresetPicker } from \"../preset-picker/PresetPicker\";\nimport { CalendarPanelType } from \"./CalendarPanelType\";\n\ninterface CalendarWithMonthYearPickersProps<T>\n extends Omit<CalendarProps<T>, \"date\" | \"year\" | \"month\"> {\n dateInFocus: Date;\n setDateInFocus: (dateInFocus: Date) => void;\n currentPanel: CalendarPanelType;\n setCurrentPanel: (currentPanel: CalendarPanelType) => void;\n onSelectPreset: (preset: CalendarPreset) => void;\n renderMonthPicker?: (args: RenderMonthPickerArgs) => ReactNode;\n}\n\nexport const CalendarWithMonthYearPickers =\n function CalendarWithMonthYearPickers<T>({\n locale,\n dateInFocus,\n setDateInFocus,\n currentPanel,\n setCurrentPanel,\n renderMonthPicker,\n ...props\n }: CalendarWithMonthYearPickersProps<T>) {\n const onChangeSelectedMonth = useCallback(\n (selectedMonth: MonthPickerValue) => {\n const newDate = dateInFocus ? new Date(dateInFocus) : new Date();\n newDate.setMonth(selectedMonth.month);\n newDate.setFullYear(selectedMonth.year);\n if (setDateInFocus) {\n setDateInFocus(newDate);\n }\n setCurrentPanel(\"calendar\");\n },\n [dateInFocus, setDateInFocus, setCurrentPanel]\n );\n\n const onClickMonth = useCallback(() => {\n setCurrentPanel(\"month\");\n }, [setCurrentPanel]);\n\n switch (currentPanel) {\n case \"calendar\":\n return (\n <Calendar<T>\n {...props}\n date={dateInFocus}\n onClickMonth={onClickMonth}\n locale={locale}\n />\n );\n case \"month\":\n return renderMonthPicker ? (\n renderMonthPicker({\n value: createFirstDate(dateInFocus),\n onValueChange: onChangeSelectedMonth,\n locale: locale,\n firstMonth: new Date(),\n numMonths: 24,\n dateInFocus,\n })\n ) : (\n <MonthPicker\n value={createFirstDate(dateInFocus)}\n onValueChange={onChangeSelectedMonth}\n locale={locale}\n firstMonth={new Date()}\n numMonths={24}\n />\n );\n case \"presets\":\n return <PresetPicker onClickPreset={() => {}} />;\n\n default:\n return (\n <Box>\n <PrimaryButton\n label={\"Show calendar\"}\n onClick={() => setCurrentPanel(\"calendar\")}\n />\n </Box>\n );\n }\n };\n","import { addMonths, addYears, subMonths, subYears } from \"date-fns\";\nimport { useCallback } from \"react\";\n\nexport const useSelectedMonthStepperLogic = (\n dateInFocus: Date,\n setDateInFocus?: (dateInFocus: Date) => void,\n monthsPerRow?: number,\n numMonths?: number\n) => {\n const nextMonth = useCallback(() => {\n const d = addMonths(dateInFocus, monthsPerRow ?? numMonths ?? 1);\n setDateInFocus?.(d);\n }, [setDateInFocus, dateInFocus, monthsPerRow, numMonths]);\n\n const nextYear = useCallback(() => {\n const d = addYears(dateInFocus, 1);\n setDateInFocus?.(d);\n }, [setDateInFocus, dateInFocus]);\n\n const prevMonth = useCallback(() => {\n const d = subMonths(dateInFocus, monthsPerRow ?? numMonths ?? 1);\n setDateInFocus?.(d);\n }, [setDateInFocus, dateInFocus, monthsPerRow, numMonths]);\n\n const prevYear = useCallback(() => {\n const d = subYears(dateInFocus, 1);\n setDateInFocus?.(d);\n }, [setDateInFocus, dateInFocus]);\n\n return {\n nextMonth,\n prevMonth,\n nextYear,\n prevYear,\n };\n};\n","import { Indent, Row, Space } from \"@stenajs-webui/core\";\nimport {\n SecondaryButton,\n stenaAngleLeftDouble,\n stenaAngleRightDouble,\n stenaArrowLeft,\n stenaArrowRight,\n} from \"@stenajs-webui/elements\";\nimport * as React from \"react\";\nimport { ReactNode } from \"react\";\nimport { CalendarTheme } from \"../../components/calendar/CalendarTheme\";\n\nexport interface WithMonthSwitcherBelowProps {\n theme: CalendarTheme;\n nextMonth: () => void;\n prevMonth: () => void;\n nextYear: () => void;\n prevYear: () => void;\n children?: ReactNode;\n}\n\nexport const WithMonthSwitcherBelow: React.FC<WithMonthSwitcherBelowProps> = ({\n children,\n prevMonth,\n nextMonth,\n prevYear,\n nextYear,\n}) => (\n <div>\n {children}\n <Indent>\n <Row gap={1}>\n <SecondaryButton onClick={prevYear} leftIcon={stenaAngleLeftDouble} />\n <SecondaryButton onClick={prevMonth} leftIcon={stenaArrowLeft} />\n <Indent num={2} />\n <SecondaryButton onClick={nextMonth} leftIcon={stenaArrowRight} />\n <SecondaryButton onClick={nextYear} leftIcon={stenaAngleRightDouble} />\n </Row>\n </Indent>\n <Space />\n </div>\n);\n","import { Column, Row } from \"@stenajs-webui/core\";\nimport {\n SecondaryButton,\n stenaArrowLeft,\n stenaArrowRight,\n} from \"@stenajs-webui/elements\";\nimport * as React from \"react\";\nimport { Calendar } from \"../../components/calendar/Calendar\";\nimport { defaultCalendarTheme } from \"../../components/calendar/CalendarTheme\";\nimport {\n CalendarProps,\n RenderMonthPickerArgs,\n} from \"../../types/CalendarTypes\";\nimport { CalendarPanelType } from \"../calendar-with-month-year-pickers/CalendarPanelType\";\nimport { CalendarWithMonthYearPickers } from \"../calendar-with-month-year-pickers/CalendarWithMonthYearPickers\";\nimport { CalendarPreset } from \"../preset-picker/CalendarPreset\";\nimport { useSelectedMonthStepperLogic } from \"./hooks/UseSelectedMonthStepperLogic\";\nimport { WithMonthSwitcherBelow } from \"./MonthSwitcherBelow\";\nimport { ReactNode } from \"react\";\n\nexport type MonthSwitcherPlacement = \"header\" | \"below\";\n\nexport interface CalendarWithMonthSwitcherProps<T> extends CalendarProps<T> {\n monthSwitcherPlacement?: MonthSwitcherPlacement;\n dateInFocus: Date;\n setDateInFocus: (dateInFocus: Date) => void;\n currentPanel: CalendarPanelType;\n setCurrentPanel: (currentPanel: CalendarPanelType) => void;\n onSelectPreset?: (preset: CalendarPreset) => void;\n renderMonthPicker?: (args: RenderMonthPickerArgs) => ReactNode;\n}\n\nconst noop = () => {};\n\nexport function CalendarWithMonthSwitcher<T>({\n monthSwitcherPlacement,\n theme = defaultCalendarTheme,\n dateInFocus,\n setDateInFocus,\n currentPanel,\n setCurrentPanel,\n onSelectPreset = noop,\n renderMonthPicker,\n ...calendarProps\n}: CalendarWithMonthSwitcherProps<T>) {\n const { nextMonth, prevMonth, nextYear, prevYear } =\n useSelectedMonthStepperLogic(\n dateInFocus,\n setDateInFocus,\n calendarProps.monthsPerRow,\n calendarProps.numMonths\n );\n\n const placement = fallbackIfNoPlacement(\n monthSwitcherPlacement,\n calendarProps.numMonths\n );\n\n switch (placement) {\n case \"below\": {\n return (\n <WithMonthSwitcherBelow\n theme={theme}\n nextMonth={nextMonth}\n prevMonth={prevMonth}\n nextYear={nextYear}\n prevYear={prevYear}\n >\n <Calendar<T> {...calendarProps} theme={theme} date={dateInFocus} />\n </WithMonthSwitcherBelow>\n );\n }\n case \"header\": {\n return (\n <Column>\n <CalendarWithMonthYearPickers<T>\n {...calendarProps}\n theme={theme}\n renderMonthPicker={renderMonthPicker}\n dateInFocus={dateInFocus}\n setDateInFocus={setDateInFocus}\n currentPanel={currentPanel}\n setCurrentPanel={setCurrentPanel}\n onSelectPreset={onSelectPreset}\n headerRightContent={\n <Row alignItems={\"center\"} gap={1}>\n <SecondaryButton\n onClick={prevMonth}\n leftIcon={stenaArrowLeft}\n />\n <SecondaryButton\n onClick={nextMonth}\n leftIcon={stenaArrowRight}\n />\n </Row>\n }\n />\n </Column>\n );\n }\n default: {\n return (\n <Calendar<T> {...calendarProps} theme={theme} date={dateInFocus} />\n );\n }\n }\n}\n\nconst fallbackIfNoPlacement = (\n monthSwitcherPlacement: MonthSwitcherPlacement | undefined,\n numMonths: number | undefined\n): MonthSwitcherPlacement => {\n return monthSwitcherPlacement || (numMonths || 1) > 1 ? \"below\" : \"header\";\n};\n","import { DateRange, DateStringRange } from \"../../types/DateRange\";\nimport { format, parse } from \"date-fns\";\n\nexport const dateRangeToStrings = (dateRange: DateRange): DateStringRange => ({\n startDate: dateRange.startDate\n ? format(dateRange.startDate, \"yyyy-MM-dd\")\n : undefined,\n endDate: dateRange.endDate\n ? format(dateRange.endDate, \"yyyy-MM-dd\")\n : undefined,\n});\n\nexport const stringsToDateRange = ({\n startDate,\n endDate,\n}: DateStringRange): DateRange => {\n const now = new Date();\n return {\n startDate: startDate ? parse(startDate, \"yyyy-MM-dd\", now) : undefined,\n endDate: endDate ? parse(endDate, \"yyyy-MM-dd\", now) : undefined,\n };\n};\n","import { isAfter, isSameDay } from \"date-fns\";\nimport { DateRange, DateStringRange } from \"../../types/DateRange\";\nimport { dateRangeToStrings, stringsToDateRange } from \"./DateRangeTransformer\";\n\nexport const isDateRangeInvalid = ({\n startDate,\n endDate,\n}: DateRange): boolean =>\n Boolean(\n startDate &&\n endDate &&\n !isSameDay(startDate, endDate) &&\n isAfter(startDate, endDate)\n );\n\nexport const toggleDatesIfEndIsEarlierThanStart = (\n dateRange: DateRange\n): DateRange => {\n if (isDateRangeInvalid(dateRange)) {\n return {\n startDate: dateRange.endDate,\n endDate: dateRange.startDate,\n };\n }\n return dateRange;\n};\n\nexport const toggleDateStringsIfEndIsEarlierThanStart = (\n dateRange: DateStringRange\n): DateStringRange => {\n if (dateRange.startDate && dateRange.endDate) {\n return dateRangeToStrings(\n toggleDatesIfEndIsEarlierThanStart(stringsToDateRange(dateRange))\n );\n }\n return dateRange;\n};\n","import { useCallback } from \"react\";\nimport { DateRangeFocusedInput } from \"../../../components/calendar-types/date-range-calendar/DateRangeCalendar\";\nimport { OnClickDay } from \"../../../types/CalendarTypes\";\nimport { DayData } from \"../../../util/calendar/CalendarDataFactory\";\nimport {\n isDateRangeInvalid,\n toggleDatesIfEndIsEarlierThanStart,\n} from \"../../../util/date-range/DateRangeValidator\";\nimport { DateRange } from \"../../../types/DateRange\";\n\nexport const useDateRangeOnClickDayHandler = <T>(\n value: DateRange | undefined,\n onValueChange: ((dateRange: DateRange) => void) | undefined,\n focusedInput: DateRangeFocusedInput,\n setFocusedInput: (focusedInput: DateRangeFocusedInput) => void\n): OnClickDay<T> => {\n return useCallback(\n (day: DayData) => {\n const dateRange = {\n startDate: focusedInput === \"startDate\" ? day.date : value?.startDate,\n endDate: focusedInput === \"endDate\" ? day.date : value?.endDate,\n };\n\n if (!isDateRangeInvalid(dateRange)) {\n setFocusedInput(focusedInput === \"startDate\" ? \"endDate\" : \"startDate\");\n }\n onValueChange?.(toggleDatesIfEndIsEarlierThanStart(dateRange));\n },\n [\n focusedInput,\n onValueChange,\n setFocusedInput,\n value?.endDate,\n value?.startDate,\n ]\n );\n};\n","import { CalendarPanelType } from \"../calendar-with-month-year-pickers/CalendarPanelType\";\nimport { useCallback, useState } from \"react\";\n\nexport type OnChangePanel = (panel: CalendarPanelType) => void;\n\nexport interface UseInternalPanelStateProps {\n onChangePanel?: OnChangePanel;\n}\n\nexport const useInternalPanelState = (\n onChangePanel: OnChangePanel | undefined\n) => {\n const [currentPanel, _setCurrentPanel] =\n useState<CalendarPanelType>(\"calendar\");\n\n const setCurrentPanel = useCallback(\n (currentPanel: CalendarPanelType) => {\n _setCurrentPanel(currentPanel);\n onChangePanel?.(currentPanel);\n },\n [onChangePanel]\n );\n\n return {\n currentPanel,\n setCurrentPanel,\n };\n};\n","import { useMemo, useState } from \"react\";\nimport { useDateRangeOnClickDayHandler } from \"../../../../features/date-range/hooks/UseDateRangeOnClickDayHandler\";\nimport { DateRangeCalendarProps } from \"../DateRangeCalendar\";\nimport { CalendarWithMonthSwitcherProps } from \"../../../../features/month-switcher/CalendarWithMonthSwitcher\";\nimport { buildDayStateForDateRange } from \"../../../../util/calendar/StateModifier\";\nimport { useInternalPanelState } from \"../../../../features/internal-panel-state/UseInternalPanelState\";\n\nexport const useDateRangeSelection = <T>({\n focusedInput,\n value,\n onValueChange,\n setFocusedInput,\n statePerMonth,\n onChangePanel,\n initialDateInFocus,\n}: DateRangeCalendarProps<T>): CalendarWithMonthSwitcherProps<T> => {\n const { currentPanel, setCurrentPanel } =\n useInternalPanelState(onChangePanel);\n const [dateInFocus, setDateInFocus] = useState(\n () => initialDateInFocus ?? new Date()\n );\n\n const onClickDay = useDateRangeOnClickDayHandler(\n value,\n onValueChange,\n focusedInput,\n setFocusedInput\n );\n\n const statePerMonthWithSelection = useMemo(\n () =>\n buildDayStateForDateRange(\n statePerMonth,\n value?.startDate,\n value?.endDate\n ),\n [statePerMonth, value?.endDate, value?.startDate]\n );\n\n return {\n onClickDay,\n statePerMonth: statePerMonthWithSelection,\n currentPanel,\n setCurrentPanel,\n setDateInFocus,\n dateInFocus,\n };\n};\n","import * as React from \"react\";\nimport { CalendarWithMonthSwitcher } from \"../../../features/month-switcher/CalendarWithMonthSwitcher\";\nimport { useDateRangeSelection } from \"./hooks/UseDateRangeSelection\";\nimport { InternalPanelAndFocusStateProps } from \"../../../types/InternalPanelAndFocusStateProps\";\nimport { ValueAndOnValueChangeProps } from \"@stenajs-webui/forms\";\nimport { DateRange } from \"../../../types/DateRange\";\n\nexport type DateRangeFocusedInput = \"startDate\" | \"endDate\" | undefined;\n\nexport interface DateRangeCalendarProps<T>\n extends InternalPanelAndFocusStateProps<T>,\n ValueAndOnValueChangeProps<DateRange> {\n focusedInput?: DateRangeFocusedInput;\n setFocusedInput: (focusedInput: DateRangeFocusedInput) => void;\n initialDateInFocus?: Date;\n}\n\nexport function DateRangeCalendar<T>(props: DateRangeCalendarProps<T>) {\n const dateRangeSelectionProps = useDateRangeSelection(props);\n return (\n <CalendarWithMonthSwitcher<T> {...props} {...dateRangeSelectionProps} />\n );\n}\n\nexport type DateRangeInputCalendarProps<T> = Omit<\n DateRangeCalendarProps<T>,\n | \"startDateInFocus\"\n | \"value\"\n | \"onValueChange\"\n | \"focusedInput\"\n | \"setFocusedInput\"\n | \"theme\"\n | \"currentPanel\"\n | \"setCurrentPanel\"\n>;\n","import { useState } from \"react\";\nimport { DateRangeFocusedInput } from \"../DateRangeCalendar\";\n\nexport const useDateRangeCalendarState = () => {\n const [startDate, setStartDate] = useState<Date | undefined>();\n const [endDate, setEndDate] = useState<Date | undefined>();\n const [focusedInput, setFocusedInput] =\n useState<DateRangeFocusedInput>(\"startDate\");\n return {\n startDate,\n setStartDate,\n endDate,\n setEndDate,\n focusedInput,\n setFocusedInput,\n };\n};\n","import { useCallback, useMemo, useState } from \"react\";\nimport { OnClickDay } from \"../../../types/CalendarTypes\";\nimport { addDayStateHighlights } from \"../../../util/calendar/StateModifier\";\nimport { SingleDateCalendarProps } from \"./SingleDateCalendar\";\nimport { CalendarWithMonthSwitcherProps } from \"../../../features/month-switcher/CalendarWithMonthSwitcher\";\nimport { useInternalPanelState } from \"../../../features/internal-panel-state/UseInternalPanelState\";\n\nexport const useSingleDateSelection = <T>({\n onChange,\n value,\n statePerMonth,\n onChangePanel,\n}: SingleDateCalendarProps<T>): CalendarWithMonthSwitcherProps<T> => {\n const { currentPanel, setCurrentPanel } =\n useInternalPanelState(onChangePanel);\n\n const [dateInFocus, setDateInFocus] = useState(() => value ?? new Date());\n\n const onClickDay: OnClickDay<T> = useCallback(\n (day) => {\n if (onChange) {\n onChange(day.date);\n }\n },\n [onChange]\n );\n\n const statePerMonthWithSelectedDate = useMemo(\n () =>\n value\n ? addDayStateHighlights(statePerMonth, value, [\n \"selected\",\n \"singleSelected\",\n ])\n : statePerMonth,\n [statePerMonth, value]\n );\n\n return {\n onClickDay,\n statePerMonth: statePerMonthWithSelectedDate,\n date: value,\n currentPanel,\n setCurrentPanel,\n dateInFocus,\n setDateInFocus,\n };\n};\n","import * as React from \"react\";\nimport { CalendarWithMonthSwitcher } from \"../../../features/month-switcher/CalendarWithMonthSwitcher\";\n\nimport { useSingleDateSelection } from \"./UseSingleDateSelection\";\nimport { InternalPanelAndFocusStateProps } from \"../../../types/InternalPanelAndFocusStateProps\";\n\nexport interface SingleDateCalendarProps<T>\n extends InternalPanelAndFocusStateProps<T> {\n value: Date | undefined;\n onChange: (value: Date | undefined) => void;\n}\n\nexport function SingleDateCalendar<T>(props: SingleDateCalendarProps<T>) {\n const singleDateSelectionProps = useSingleDateSelection(props);\n return (\n <CalendarWithMonthSwitcher<T> {...props} {...singleDateSelectionProps} />\n );\n}\n","import { isSameDay } from \"date-fns\";\nimport { useCallback, useMemo, useState } from \"react\";\nimport { OnClickDay } from \"../../../types/CalendarTypes\";\nimport { addDayStateHighlights } from \"../../../util/calendar/StateModifier\";\nimport { MultiDateCalendarProps } from \"./MultiDateCalendar\";\nimport { CalendarWithMonthSwitcherProps } from \"../../../features/month-switcher/CalendarWithMonthSwitcher\";\nimport { useInternalPanelState } from \"../../../features/internal-panel-state/UseInternalPanelState\";\n\nexport const useMultiDateSelection = <T>({\n onChange,\n value,\n statePerMonth,\n onChangePanel,\n}: MultiDateCalendarProps<T>): CalendarWithMonthSwitcherProps<T> => {\n const { currentPanel, setCurrentPanel } =\n useInternalPanelState(onChangePanel);\n\n const [dateInFocus, setDateInFocus] = useState(() => new Date());\n\n const onClickDay: OnClickDay<T> = useCallback(\n (day) => {\n if (!onChange) {\n return;\n }\n const isSelected = value && value.find((d) => isSameDay(d, day.date));\n if (value && isSelected) {\n onChange(value.filter((v) => !isSameDay(v, day.date)));\n } else {\n onChange([...(value || []), day.date]);\n }\n },\n [onChange, value]\n );\n const statePerMonthWithSelectedDate = useMemo(() => {\n if (!value) {\n return statePerMonth;\n }\n return value.reduce(\n (stateSum, date) => addDayStateHighlights(stateSum, date, [\"selected\"]),\n statePerMonth\n );\n }, [statePerMonth, value]);\n\n return {\n onClickDay,\n statePerMonth: statePerMonthWithSelectedDate,\n currentPanel,\n setCurrentPanel,\n dateInFocus,\n setDateInFocus,\n };\n};\n","import * as React from \"react\";\nimport { CalendarWithMonthSwitcher } from \"../../../features/month-switcher/CalendarWithMonthSwitcher\";\nimport { useMultiDateSelection } from \"./UseMultiDateSelection\";\nimport { UseInternalPanelStateProps } from \"../../../features/internal-panel-state/UseInternalPanelState\";\nimport { InternalPanelAndFocusStateProps } from \"../../../types/InternalPanelAndFocusStateProps\";\n\nexport interface MultiDateCalendarProps<T>\n extends InternalPanelAndFocusStateProps<T>,\n UseInternalPanelStateProps {\n value?: Array<Date>;\n onChange?: (value: Array<Date>) => void;\n}\n\nexport function MultiDateCalendar<T>(props: MultiDateCalendarProps<T>) {\n const selectionProps = useMultiDateSelection(props);\n return <CalendarWithMonthSwitcher<T> {...props} {...selectionProps} />;\n}\n","import { setWeek, startOfWeek } from \"date-fns\";\nimport { enGB } from \"date-fns/locale\";\nimport { useCallback, useMemo, useState } from \"react\";\nimport { useInternalPanelState } from \"../../../features/internal-panel-state/UseInternalPanelState\";\nimport { CalendarWithMonthSwitcherProps } from \"../../../features/month-switcher/CalendarWithMonthSwitcher\";\nimport { OnClickDay, OnClickWeek } from \"../../../types/CalendarTypes\";\nimport {\n getWeekForDate,\n WeekData,\n} from \"../../../util/calendar/CalendarDataFactory\";\nimport { addWeekRangeHighlights } from \"../../../util/calendar/StateModifier\";\nimport { SingleWeekCalendarProps } from \"./SingleWeekCalendar\";\n\nexport const useSingleWeekSelection = <T>({\n onChange,\n value,\n statePerMonth,\n onChangePanel,\n locale = enGB,\n}: SingleWeekCalendarProps<T>): CalendarWithMonthSwitcherProps<T> => {\n const [dateInFocus, setDateInFocus] = useState(() => {\n const week = getWeekDataFromWeekString(value, locale);\n if (!week) {\n return new Date();\n }\n return week.days[0].date;\n });\n const { currentPanel, setCurrentPanel } =\n useInternalPanelState(onChangePanel);\n\n const onClickDay = useCallback<OnClickDay<T>>(\n (day) => {\n if (onChange) {\n onChange(getWeekStringFromWeekData(getWeekForDate(day.date, locale)));\n }\n },\n [locale, onChange]\n );\n const onClickWeek = useCallback<OnClickWeek>(\n (week) => {\n if (onChange) {\n onChange(getWeekStringFromWeekData(week));\n }\n },\n [onChange]\n );\n\n const statePerMonthWithSelection = useMemo(() => {\n const weekData = getWeekDataFromWeekString(value, locale);\n return weekData\n ? addWeekRangeHighlights(statePerMonth, weekData)\n : statePerMonth;\n }, [value, locale, statePerMonth]);\n\n const date = useMemo(() => {\n const week = getWeekDataFromWeekString(value, locale);\n if (!week) {\n return new Date();\n }\n return week.days[0].date;\n }, [locale, value]);\n\n return {\n statePerMonth: statePerMonthWithSelection,\n date,\n dateInFocus,\n setDateInFocus,\n onClickDay,\n onClickWeek,\n currentPanel,\n setCurrentPanel,\n };\n};\n\nconst getWeekStringFromWeekData = (\n week: WeekData | undefined\n): string | undefined => {\n if (!week) {\n return undefined;\n }\n return `${week.endYear}-${week.weekNumber}`;\n};\n\nconst getWeekDataFromWeekString = (\n week: string | undefined,\n locale: Locale\n): WeekData | undefined => {\n if (!week) {\n return undefined;\n }\n const parts = week.split(\"-\");\n const weekNumber = parseInt(parts[1], 10);\n const year = parseInt(parts[0], 10);\n const date = new Date();\n date.setFullYear(year);\n const firstDateOfWeek = startOfWeek(setWeek(date, weekNumber), { locale });\n return getWeekForDate(firstDateOfWeek, locale);\n};\n","import * as React from \"react\";\nimport { CalendarWithMonthSwitcher } from \"../../../features/month-switcher/CalendarWithMonthSwitcher\";\nimport { useSingleWeekSelection } from \"./UseSingleWeekSelection\";\nimport { InternalPanelAndFocusStateProps } from \"../../../types/InternalPanelAndFocusStateProps\";\n\nexport type SingleWeekValue = string;\n\nexport interface SingleWeekCalendarProps<T>\n extends InternalPanelAndFocusStateProps<T> {\n value: SingleWeekValue | undefined;\n onChange: (value: SingleWeekValue | undefined) => void;\n}\n\nexport function SingleWeekCalendar<T>(props: SingleWeekCalendarProps<T>) {\n const singleWeekSelectionProps = useSingleWeekSelection(props);\n return (\n <CalendarWithMonthSwitcher<T> {...props} {...singleWeekSelectionProps} />\n );\n}\n","import { PopoverPlacement } from \"@stenajs-webui/tooltip\";\n\nexport const defaultPopoverPlacement: PopoverPlacement = \"bottom\";\n","import { useTippyInstance } from \"@stenajs-webui/tooltip\";\nimport { useCallback } from \"react\";\n\nexport const useCalendarPopoverUpdater = () => {\n const [tippyRef, tippyInstanceRef] = useTippyInstance();\n\n const onChangePanel = useCallback(() => {\n tippyInstanceRef.current?.popperInstance?.update();\n }, [tippyInstanceRef]);\n\n return {\n onChangePanel,\n tippyRef,\n };\n};\n","import { useCallback, useState } from \"react\";\n\nexport const useDateInput = (\n onChange?: (date: Date | undefined) => void,\n onClose?: () => void,\n openOnMount?: boolean\n) => {\n const [showingCalendar, setShowingCalendar] = useState(openOnMount || false);\n\n const showCalendar = useCallback(() => {\n setShowingCalendar(true);\n return true;\n }, [setShowingCalendar]);\n\n const hideCalendar = useCallback(() => {\n setShowingCalendar(false);\n if (onClose) {\n onClose();\n }\n }, [setShowingCalendar, onClose]);\n\n const onSelectDate = useCallback(\n (date: Date | undefined) => {\n if (onChange) {\n onChange(date);\n }\n setTimeout(hideCalendar, 150);\n },\n [onChange, hideCalendar]\n );\n\n return {\n showCalendar,\n hideCalendar,\n showingCalendar,\n onSelectDate,\n };\n};\n","export const defaultMaxDate = \"2999-12-31\";\n","import { Box } from \"@stenajs-webui/core\";\nimport { stenaCalendar, TextInputButton } from \"@stenajs-webui/elements\";\nimport { TextInput, TextInputProps } from \"@stenajs-webui/forms\";\nimport { Popover } from \"@stenajs-webui/tooltip\";\nimport { format } from \"date-fns\";\nimport * as React from \"react\";\nimport { defaultPopoverPlacement } from \"../../../config/DefaultPopoverPlacement\";\nimport { useCalendarPopoverUpdater } from \"../../../features/internal-panel-state/UseCalendarPopoverUpdater\";\nimport { DateFormats } from \"../../../util/date/DateFormats\";\nimport { SingleDateCalendar } from \"../../calendar-types/single-date-calendar/SingleDateCalendar\";\nimport {\n CalendarTheme,\n defaultCalendarTheme,\n} from \"../../calendar/CalendarTheme\";\nimport { DateTextInputCalendarProps } from \"../date-text-input/DateTextInput\";\nimport { useDateInput } from \"./UseDateInput\";\nimport { OptionalMinMaxDatesAsString } from \"../../../types/CalendarTypes\";\nimport { defaultMaxDate } from \"../../../config/DefaultMaxDate\";\n\nexport interface DateInputProps<T = {}> extends OptionalMinMaxDatesAsString {\n /** The current value */\n value?: Date;\n /** onChange handler for when the user selects a date. */\n onChange?: (date: Date | undefined) => void;\n /** Variant of the input field. */\n variant?: TextInputProps[\"variant\"];\n /** If true, calendar will be open when component mounts. */\n openOnMount?: boolean;\n /** Is invoked when user closes the calendar popup. */\n onClose?: () => void;\n /**\n * The date format in the input field. See date-fns docs.\n * @default YYYY-MM-dd\n */\n displayFormat?: string;\n /**\n * Placeholder when no date has been selected.\n * @default Enter date\n */\n placeholder?: string;\n /**\n * Portal target, HTML element. If not set, portal is not used.\n */\n portalTarget?: HTMLElement | null;\n /**\n * Z-index of the calendar overlay.\n * @default 100\n */\n zIndex?: number;\n /**\n * Width of the input element.\n * * @default 125px\n */\n width?: string;\n /**\n * The calendar theme to use.\n */\n calendarTheme?: CalendarTheme;\n /** Props to be passed to Calendar, see SingleDateCalendar. */\n calendarProps?: DateTextInputCalendarProps<T>;\n /**\n * Disables the TextInput, Calendar and Popover.\n */\n disabled?: boolean;\n}\n\nexport const DateInput: React.FC<DateInputProps> = ({\n displayFormat = DateFormats.fullDate,\n placeholder = \"Enter date\",\n value,\n zIndex = 100,\n calendarTheme = defaultCalendarTheme,\n calendarProps,\n openOnMount,\n onClose,\n onChange,\n portalTarget,\n variant,\n width,\n minDate,\n maxDate = defaultMaxDate,\n disabled,\n}) => {\n const { hideCalendar, showingCalendar, onSelectDate, showCalendar } =\n useDateInput(onChange, onClose, openOnMount);\n\n const { tippyRef, onChangePanel } = useCalendarPopoverUpdater();\n\n return (\n <Box width={width}>\n <Popover\n arrow={false}\n lazy\n visible={showingCalendar}\n onClickOutside={hideCalendar}\n placement={defaultPopoverPlacement}\n zIndex={zIndex}\n appendTo={portalTarget ?? \"parent\"}\n tippyRef={tippyRef}\n disabled={disabled}\n content={\n <SingleDateCalendar\n {...calendarProps}\n onChange={onSelectDate}\n value={value}\n theme={calendarTheme}\n onChangePanel={onChangePanel}\n minDate={minDate}\n maxDate={maxDate}\n />\n }\n >\n <TextInput\n type={\"date\"}\n onFocus={showCalendar}\n buttonRight={\n <TextInputButton onClick={showCalendar} icon={stenaCalendar} />\n }\n value={value ? format(value, displayFormat) : \"\"}\n placeholder={placeholder}\n size={9}\n disabled={disabled}\n autoFocus={openOnMount}\n variant={variant}\n min={minDate}\n max={maxDate}\n />\n </Popover>\n </Box>\n );\n};\n","import { useCallback, useMemo, useRef, useState } from \"react\";\nimport { DateRangeFocusedInput } from \"../../../calendar-types/date-range-calendar/DateRangeCalendar\";\nimport { DayData } from \"../../../../util/calendar/CalendarDataFactory\";\nimport { isAfter } from \"date-fns\";\nimport { DateRange } from \"../../../../types/DateRange\";\n\nexport const useDateRangeInput = (\n value: DateRange | undefined,\n onValueChange: ((dateRange: DateRange) => void) | undefined\n) => {\n const startDateInputRef = useRef<HTMLInputElement>(null);\n const endDateInputRef = useRef<HTMLInputElement>(null);\n\n const [showingCalendar, setShowingCalendar] = useState(false);\n const [focusedInput, setFocusedInput] = useState<\n DateRangeFocusedInput | undefined\n >(undefined);\n\n const showCalendarStartDate = useCallback(() => {\n setFocusedInput(\"startDate\");\n setShowingCalendar(true);\n return true;\n }, [setFocusedInput, setShowingCalendar]);\n\n const showCalendarEndDate = useCallback(() => {\n setFocusedInput(\"endDate\");\n setShowingCalendar(true);\n return true;\n }, [setFocusedInput, setShowingCalendar]);\n\n const hideCalendar = useCallback(() => {\n setShowingCalendar(false);\n }, [setShowingCalendar]);\n\n const onClickDay = useCallback(\n (day: DayData) => {\n if (focusedInput === \"startDate\") {\n onValueChange?.({\n startDate: day.date,\n endDate: value?.endDate,\n });\n if (!value?.endDate) {\n setFocusedInput(\"endDate\");\n endDateInputRef.current && endDateInputRef.current.focus();\n } else {\n setTimeout(hideCalendar, 150);\n }\n } else if (focusedInput === \"endDate\") {\n onValueChange?.({\n startDate: value?.startDate,\n endDate: day.date,\n });\n if (!value?.startDate) {\n setFocusedInput(\"startDate\");\n startDateInputRef.current && startDateInputRef.current.focus();\n } else {\n setTimeout(hideCalendar, 150);\n }\n }\n },\n [focusedInput, onValueChange, setFocusedInput, hideCalendar, value]\n );\n\n const startDateIsAfterEnd = useMemo(\n () =>\n value?.startDate &&\n value?.endDate &&\n isAfter(value.startDate, value.endDate),\n [value?.startDate, value?.endDate]\n );\n\n return {\n showingCalendar,\n hideCalendar,\n showCalendarEndDate,\n showCalendarStartDate,\n focusedInput,\n setFocusedInput,\n startDateInputRef,\n endDateInputRef,\n onClickDay,\n startDateIsAfterEnd,\n };\n};\n","import { Row, Space } from \"@stenajs-webui/core\";\nimport { TextInput, ValueAndOnValueChangeProps } from \"@stenajs-webui/forms\";\nimport { format } from \"date-fns\";\nimport * as React from \"react\";\nimport { useMemo, useState } from \"react\";\nimport { cssColor } from \"@stenajs-webui/theme\";\nimport { defaultPopoverPlacement } from \"../../../config/DefaultPopoverPlacement\";\nimport { DateFormats } from \"../../../util/date/DateFormats\";\nimport { DateRangeInputCalendarProps } from \"../../calendar-types/date-range-calendar/DateRangeCalendar\";\nimport {\n CalendarTheme,\n defaultCalendarTheme,\n} from \"../../calendar/CalendarTheme\";\nimport { useDateRangeInput } from \"./hooks/UseDateRangeInput\";\nimport {\n Icon,\n stenaArrowWideRight,\n stenaCalendar,\n} from \"@stenajs-webui/elements\";\nimport { CalendarWithMonthSwitcher } from \"../../../features/month-switcher/CalendarWithMonthSwitcher\";\nimport { CalendarPanelType } from \"../../../features/calendar-with-month-year-pickers/CalendarPanelType\";\nimport { Popover } from \"@stenajs-webui/tooltip\";\nimport { buildDayStateForDateRange } from \"../../../util/calendar/StateModifier\";\nimport { OptionalMinMaxDatesAsString } from \"../../../types/CalendarTypes\";\nimport { DateRange } from \"../../../types/DateRange\";\nimport { defaultMaxDate } from \"../../../config/DefaultMaxDate\";\n\nexport interface DateRangeInputProps<T>\n extends OptionalMinMaxDatesAsString,\n ValueAndOnValueChangeProps<DateRange> {\n /**\n * The date format in the input field. See date-fns docs.\n * @default YYYY-MM-dd\n */\n displayFormat?: string;\n\n /**\n * Placeholder for start date field when no date has been selected.\n * @default Start date\n */\n placeholderStartDate?: string;\n\n /**\n * Placeholder for end date field when no date has been selected.\n * @default End date\n */\n placeholderEndDate?: string;\n /**\n * Portal target, HTML element. If not set, portal is not used.\n */\n portalTarget?: HTMLElement | null;\n\n /**\n * Z-index of the calendar overlay.\n * @default 100\n */\n zIndex?: number;\n\n /**\n * Width of the input element.\n * * @default 125px\n */\n width?: string;\n\n /**\n * The calendar theme to use.\n */\n calendarTheme?: CalendarTheme;\n\n /** Props to be passed to DateRangeCalendar, see DateRangeCalendar. */\n calendarProps?: DateRangeInputCalendarProps<T>;\n\n /**\n * Disables the Popover and both TextInputs.\n */\n disabled?: boolean;\n}\n\n/**\n * @deprecated Please use DateRangeDualTextInput instead.\n */\nexport function DateRangeInput<T>({\n displayFormat = DateFormats.fullDate,\n placeholderStartDate = \"Start date\",\n placeholderEndDate = \"End date\",\n portalTarget,\n value,\n onValueChange,\n zIndex = 100,\n width,\n calendarTheme = defaultCalendarTheme,\n calendarProps,\n minDate,\n maxDate = defaultMaxDate,\n disabled,\n}: DateRangeInputProps<T>): React.ReactElement<DateRangeInputProps<T>> {\n const [currentPanel, setCurrentPanel] =\n useState<CalendarPanelType>(\"calendar\");\n\n const {\n hideCalendar,\n showCalendarEndDate,\n showCalendarStartDate,\n showingCalendar,\n focusedInput,\n startDateInputRef,\n endDateInputRef,\n onClickDay,\n startDateIsAfterEnd,\n } = useDateRangeInput(value, onValueChange);\n\n const [dateInFocus, setDateInFocus] = useState(\n () => (focusedInput && value?.[focusedInput]) ?? new Date()\n );\n const statePerMonth = useMemo(\n () =>\n buildDayStateForDateRange(undefined, value?.startDate, value?.endDate),\n [value]\n );\n\n return (\n <Popover\n arrow={false}\n lazy\n disabled={disabled}\n visible={showingCalendar}\n zIndex={zIndex}\n placement={defaultPopoverPlacement}\n appendTo={portalTarget ?? \"parent\"}\n onClickOutside={hideCalendar}\n content={\n <CalendarWithMonthSwitcher\n {...calendarProps}\n dateInFocus={dateInFocus}\n setDateInFocus={setDateInFocus}\n statePerMonth={statePerMonth}\n theme={calendarTheme}\n onClickDay={onClickDay}\n currentPanel={currentPanel}\n setCurrentPanel={setCurrentPanel}\n minDate={minDate}\n maxDate={maxDate}\n />\n }\n >\n <Row alignItems={\"center\"}>\n <TextInput\n iconLeft={stenaCalendar}\n onFocus={showCalendarStartDate}\n value={value?.startDate ? format(value.startDate, displayFormat) : \"\"}\n placeholder={placeholderStartDate}\n width={width}\n disabled={disabled}\n inputRef={startDateInputRef}\n size={9}\n variant={startDateIsAfterEnd ? \"error\" : undefined}\n />\n <Space />\n <Icon\n icon={stenaArrowWideRight}\n color={cssColor(\"--lhds-color-ui-500\")}\n size={14}\n />\n <Space />\n <TextInput\n iconLeft={stenaCalendar}\n onFocus={showCalendarEndDate}\n value={value?.endDate ? format(value.endDate, displayFormat) : \"\"}\n placeholder={placeholderEndDate}\n width={width}\n disabled={disabled}\n inputRef={endDateInputRef}\n size={9}\n variant={startDateIsAfterEnd ? \"error\" : undefined}\n />\n </Row>\n </Popover>\n );\n}\n","import { Box, Omit, Row } from \"@stenajs-webui/core\";\nimport { FlatButton, stenaCalendar } from \"@stenajs-webui/elements\";\nimport { TextInput, TextInputProps } from \"@stenajs-webui/forms\";\nimport { Popover } from \"@stenajs-webui/tooltip\";\nimport { format, isValid, parse } from \"date-fns\";\nimport * as React from \"react\";\nimport { useCallback, useState } from \"react\";\nimport { defaultPopoverPlacement } from \"../../../config/DefaultPopoverPlacement\";\nimport { useCalendarPopoverUpdater } from \"../../../features/internal-panel-state/UseCalendarPopoverUpdater\";\nimport { DateFormats } from \"../../../util/date/DateFormats\";\nimport {\n SingleDateCalendar,\n SingleDateCalendarProps,\n} from \"../../calendar-types/single-date-calendar/SingleDateCalendar\";\nimport {\n CalendarTheme,\n defaultCalendarTheme,\n} from \"../../calendar/CalendarTheme\";\nimport { OptionalMinMaxDatesAsString } from \"../../../types/CalendarTypes\";\nimport { defaultMaxDate } from \"../../../config/DefaultMaxDate\";\n\nexport type DateTextInputCalendarProps<T> = Omit<\n SingleDateCalendarProps<T>,\n \"value\" | \"onChange\" | \"theme\"\n>;\n\nexport interface DateTextInputProps<T>\n extends Omit<TextInputProps, \"onChange\" | \"theme\" | \"min\" | \"max\">,\n OptionalMinMaxDatesAsString {\n /** Props to be passed to Calendar, see SingleDateCalendar. */\n calendarProps?: DateTextInputCalendarProps<T>;\n /** Close calendar when date is selected, @default true */\n closeOnCalendarSelectDate?: boolean;\n /** Valid date format, @default YYYY-MM-DD */\n dateFormat?: string;\n /** Make the icon not clickable, @default false */\n disableCalender?: boolean;\n /** Show or hide the calender icon, @default false */\n hideCalenderIcon?: boolean;\n /** Placeholder for the input, @default YYYY-MM-DD */\n placeholder?: string;\n /** Portal target, HTML element. If not set, portal is not used. */\n portalTarget?: HTMLElement | null;\n /** Z-index of the calendar overlay, @default 100 */\n zIndex?: number;\n /** The date text input theme to use. */\n calendarTheme?: CalendarTheme;\n}\n\nexport const DateTextInput: React.FC<DateTextInputProps<{}>> = ({\n calendarProps,\n closeOnCalendarSelectDate = true,\n dateFormat = DateFormats.fullDate,\n disableCalender = false,\n onValueChange,\n placeholder = \"yyyy-mm-dd\",\n portalTarget,\n value,\n width = \"130px\",\n zIndex = 100,\n calendarTheme = defaultCalendarTheme,\n hideCalenderIcon = false,\n minDate,\n maxDate = defaultMaxDate,\n variant,\n ...props\n}) => {\n const [open, setOpen] = useState(false);\n const { tippyRef, onChangePanel } = useCalendarPopoverUpdater();\n\n const toggleCalendar = useCallback(() => {\n setOpen(!open);\n }, [setOpen, open]);\n\n const hideCalendar = useCallback(() => {\n setOpen(false);\n }, [setOpen]);\n\n const onValueChangeHandler = useCallback(\n (value: string) => {\n if (onValueChange) {\n onValueChange(value);\n }\n },\n [onValueChange]\n );\n\n const onCalendarSelectDate = useCallback(\n (date: Date | undefined) => {\n if (date) {\n onValueChangeHandler(format(date, dateFormat));\n if (closeOnCalendarSelectDate) {\n setTimeout(() => setOpen(!open), 200);\n }\n }\n },\n [onValueChangeHandler, dateFormat, closeOnCalendarSelectDate, setOpen, open]\n );\n\n const inValidInput = !!value && !/^[-/\\\\.0-9]+$/.test(value);\n\n const dateIsValid = !!value && isValid(parse(value, dateFormat, new Date()));\n\n const userInputCorrectLength = !!value && value.length >= dateFormat.length;\n\n const invalid: boolean =\n (userInputCorrectLength && !dateIsValid) || inValidInput;\n\n return (\n <Box width={width}>\n <Popover\n arrow={false}\n lazy\n visible={open}\n zIndex={zIndex}\n appendTo={portalTarget ?? \"parent\"}\n placement={defaultPopoverPlacement}\n onClickOutside={hideCalendar}\n tippyRef={tippyRef}\n content={\n <SingleDateCalendar\n {...calendarProps}\n onChange={onCalendarSelectDate}\n onChangePanel={onChangePanel}\n value={\n value && dateIsValid\n ? parse(value, dateFormat, new Date())\n : undefined\n }\n minDate={minDate}\n maxDate={maxDate}\n theme={calendarTheme}\n />\n }\n >\n <TextInput\n {...props}\n variant={invalid ? \"error\" : variant}\n disableContentPaddingRight\n contentRight={\n !hideCalenderIcon ? (\n <Row alignItems={\"center\"} indent={0.5}>\n <FlatButton\n size={\"small\"}\n disabled={props.disabled || disableCalender}\n leftIcon={stenaCalendar}\n onClick={toggleCalendar}\n />\n </Row>\n ) : undefined\n }\n onValueChange={onValueChangeHandler}\n placeholder={placeholder}\n value={value || \"\"}\n min={minDate}\n max={maxDate}\n size={10}\n />\n </Popover>\n </Box>\n );\n};\n","export interface FormatTimeStringResult {\n time: string;\n success: boolean;\n}\n\nexport const formatHours = (hours: string): string => {\n if (hours === \"\") {\n return \"00\";\n }\n\n const h = parseInt(hours, 10);\n\n if (isNaN(h)) {\n throw new Error(\"Hours is not a number\");\n }\n\n if (h < 0 || h > 23) {\n throw new Error(\"Hours is an invalid number\");\n }\n\n switch (hours.length) {\n case 1:\n return `0${h}`;\n case 2:\n return hours;\n default:\n throw new Error(\"Invalid hour string\");\n }\n};\n\nexport const formatMinutes = (minutes: string): string => {\n if (minutes === \"\") {\n return \"00\";\n }\n\n const m = parseInt(minutes, 10);\n\n if (isNaN(m)) {\n throw new Error(\"Minutes is not a number\");\n }\n\n if (m < 0 || m > 59) {\n throw new Error(\"Minutes is an invalid number\");\n }\n\n switch (minutes.length) {\n case 1:\n return `0${m}`;\n case 2:\n return minutes;\n default:\n throw new Error(\"Invalid minute string\");\n }\n};\n\nexport const formatTimeString = (time: string): FormatTimeStringResult => {\n if (!validUserInput(time)) {\n return { time, success: false };\n }\n\n const arr = time && time.split(/-|:|,|;|[/]|[.]| /); // consider all these chars as user input separator\n if (arr && arr.length === 2) {\n try {\n const hours = formatHours(arr[0]);\n const minutes = formatMinutes(arr[1]);\n return { time: `${hours}:${minutes}`, success: true };\n } catch {\n return { time, success: false };\n }\n } else if (arr && arr.length === 1) {\n let hours = 0;\n let minutes = 0;\n switch (time.length) {\n case 1:\n return { time: `0${time}:00`, success: true };\n case 2:\n const timeNumber = parseInt(arr[0], 10);\n if (timeNumber >= 0 && timeNumber < 24) {\n return { time: `${time}:00`, success: true };\n } else if (timeNumber >= 24 && timeNumber < 59) {\n return { time: `00:${time}`, success: true };\n }\n return { time, success: false };\n case 3:\n minutes = parseInt(time.substr(1, 2), 10);\n if (minutes >= 0 && minutes <= 59) {\n return {\n time: `0${time.substr(0, 1)}:${time.substr(1, 2)}`,\n success: true,\n };\n }\n return { time, success: false };\n case 4:\n hours = parseInt(time.substr(0, 2), 10);\n minutes = parseInt(time.substr(2, 2), 10);\n if (hours < 0 || hours > 23) {\n return { time, success: false };\n }\n if (minutes < 0 || minutes > 59) {\n return { time, success: false };\n }\n return {\n time: `${time.substr(0, 2)}:${time.substr(2, 2)}`,\n success: true,\n };\n default:\n return { time, success: false };\n }\n }\n\n return { time, success: false };\n};\n\nexport const validUserInput = (input: string | undefined): boolean => {\n if (input) {\n return /^[-:.,/; 0-9]+$/.test(input);\n }\n\n return true;\n};\n","import { Omit } from \"@stenajs-webui/core\";\nimport { TextInput, TextInputProps } from \"@stenajs-webui/forms\";\nimport * as React from \"react\";\nimport { ChangeEventHandler, useCallback, useState } from \"react\";\nimport {\n formatTimeString,\n validUserInput,\n} from \"../../../util/time/TimeStringFormatValidator\";\n\nimport { stenaClock } from \"@stenajs-webui/elements\";\n\nexport interface TimeTextInputProps extends Omit<TextInputProps, \"onChange\"> {\n /** Show placeholder when true */\n showPlaceholder?: boolean;\n /** Show icon when true */\n useIcon?: boolean;\n /** Variant of the input field. */\n variant?: TextInputProps[\"variant\"];\n}\n\n/**\n * @deprecated\n */\nexport const TimeTextInput: React.FC<TimeTextInputProps> = ({\n onValueChange,\n showPlaceholder = true,\n useIcon = true,\n value,\n width = \"85px\",\n variant,\n ...props\n}) => {\n const [valid, setValid] = useState(() => validUserInput(value));\n\n const timeFormat = \"hh:mm\";\n\n const onBlur = useCallback(() => {\n if (value) {\n const formattedResult = formatTimeString(value);\n setValid(formattedResult.success);\n if (formattedResult.success) {\n if (onValueChange) {\n onValueChange(formattedResult.time);\n }\n }\n }\n }, [value, onValueChange, setValid]);\n\n const onChangeHandler = useCallback<ChangeEventHandler<HTMLInputElement>>(\n (ev) => {\n const time = ev.target.value;\n const validInput = validUserInput(time);\n\n setValid(validInput && time.length <= timeFormat.length);\n\n if (onValueChange) {\n onValueChange(time);\n }\n },\n [onValueChange, setValid]\n );\n\n return (\n <TextInput\n {...props}\n type={\"time\"}\n variant={!valid ? \"error\" : variant}\n iconLeft={useIcon ? stenaClock : undefined}\n value={value}\n placeholder={showPlaceholder ? timeFormat : undefined}\n onChange={onChangeHandler}\n onBlur={onBlur}\n width={width}\n />\n );\n};\n","import { IconDefinition } from \"@fortawesome/fontawesome-svg-core\";\nimport {\n Box,\n BoxProps,\n ButtonElementProps,\n Indent,\n Row,\n SeparatorLine,\n} from \"@stenajs-webui/core\";\nimport {\n FlatButton,\n Icon,\n stenaCalendar,\n stenaAngleDown,\n} from \"@stenajs-webui/elements\";\nimport {\n TextInput,\n TextInputBox,\n TextInputBoxProps,\n TextInputProps,\n} from \"@stenajs-webui/forms\";\nimport { debounce } from \"lodash-es\";\nimport * as React from \"react\";\nimport { FocusEventHandler, useCallback, useMemo, useRef } from \"react\";\nimport { cssColor } from \"@stenajs-webui/theme\";\n\nexport interface DualTextInputProps {\n onEsc?: TextInputProps[\"onEsc\"];\n onEnter?: TextInputProps[\"onEnter\"];\n widthLeft?: BoxProps[\"width\"];\n widthRight?: BoxProps[\"width\"];\n valueLeft?: TextInputProps[\"value\"];\n valueRight?: TextInputProps[\"value\"];\n minLeft?: string;\n maxLeft?: string;\n minRight?: string;\n maxRight?: string;\n typeLeft?: TextInputProps[\"type\"];\n typeRight?: TextInputProps[\"type\"];\n separatorIcon?: IconDefinition;\n placeholderLeft?: TextInputProps[\"placeholder\"];\n placeholderRight?: TextInputProps[\"placeholder\"];\n onValueChangeLeft?: TextInputProps[\"onValueChange\"];\n onValueChangeRight?: TextInputProps[\"onValueChange\"];\n onChangeLeft?: TextInputProps[\"onChange\"];\n onChangeRight?: TextInputProps[\"onChange\"];\n onClickLeft?: TextInputProps[\"onClick\"];\n onClickRight?: TextInputProps[\"onClick\"];\n onClickCalendar?: ButtonElementProps[\"onClick\"];\n onClickArrowDown?: ButtonElementProps[\"onClick\"];\n onFocusLeft?: TextInputProps[\"onFocus\"];\n onFocusRight?: TextInputProps[\"onFocus\"];\n onBlur?: () => void;\n onBlurLeft?: TextInputProps[\"onBlur\"];\n onBlurRight?: TextInputProps[\"onBlur\"];\n inputRefLeft?: TextInputProps[\"inputRef\"];\n inputRefRight?: TextInputProps[\"inputRef\"];\n variantLeft?: TextInputProps[\"variant\"];\n variantRight?: TextInputProps[\"variant\"];\n variant?: TextInputBoxProps[\"variant\"];\n showPresets?: false;\n autoFocusLeft?: boolean;\n autoFocusRight?: boolean;\n disabled?: boolean;\n}\n\nexport const DualTextInput: React.FC<DualTextInputProps> = ({\n autoFocusLeft,\n autoFocusRight,\n onEsc,\n onEnter,\n onValueChangeLeft,\n onValueChangeRight,\n separatorIcon,\n placeholderLeft,\n placeholderRight,\n typeLeft,\n typeRight,\n onChangeLeft,\n onChangeRight,\n valueLeft,\n valueRight,\n minLeft,\n maxLeft,\n minRight,\n maxRight,\n onClickLeft,\n onClickRight,\n onClickCalendar,\n onClickArrowDown,\n onBlurLeft,\n onBlurRight,\n onFocusLeft,\n onFocusRight,\n inputRefLeft,\n inputRefRight,\n variant,\n variantLeft,\n variantRight,\n onBlur,\n showPresets,\n widthLeft,\n widthRight,\n disabled,\n}) => {\n const focusCounter = useRef(0);\n\n const tryTriggerOnBlur = useMemo(\n () =>\n debounce((focusCounter: number) => {\n if (focusCounter === 0) {\n onBlur?.();\n }\n }, 10),\n [onBlur]\n );\n\n const focusLeftHandler = useCallback<FocusEventHandler<HTMLInputElement>>(\n (ev) => {\n focusCounter.current++;\n tryTriggerOnBlur(focusCounter.current);\n if (onFocusLeft) {\n onFocusLeft(ev);\n }\n },\n [onFocusLeft, focusCounter, tryTriggerOnBlur]\n );\n\n const focusRightHandler = useCallback<FocusEventHandler<HTMLInputElement>>(\n (ev) => {\n focusCounter.current++;\n tryTriggerOnBlur(focusCounter.current);\n if (onFocusRight) {\n onFocusRight(ev);\n }\n },\n [onFocusRight, focusCounter, tryTriggerOnBlur]\n );\n\n const blurLeftHandler = useCallback<FocusEventHandler<HTMLInputElement>>(\n (ev) => {\n focusCounter.current--;\n tryTriggerOnBlur(focusCounter.current);\n if (onBlurLeft) {\n onBlurLeft(ev);\n }\n },\n [onBlurLeft, focusCounter, tryTriggerOnBlur]\n );\n\n const blurRightHandler = useCallback<FocusEventHandler<HTMLInputElement>>(\n (ev) => {\n focusCounter.current--;\n tryTriggerOnBlur(focusCounter.current);\n if (onBlurRight) {\n onBlurRight(ev);\n }\n },\n [onBlurRight, focusCounter, tryTriggerOnBlur]\n );\n\n return (\n <Box>\n <TextInputBox\n disableContentPaddingRight\n disabled={disabled}\n variant={variant}\n contentRight={\n <Row alignItems={\"center\"}>\n <Indent num={0.5}>\n <FlatButton\n leftIcon={stenaCalendar}\n onClick={onClickCalendar}\n disabled={disabled}\n size={\"small\"}\n />\n </Indent>\n\n {showPresets ? (\n <>\n <Row height={\"22px\"}>\n <SeparatorLine vertical />\n </Row>\n\n <Indent num={0.5}>\n <FlatButton\n leftIcon={stenaAngleDown}\n onClick={onClickArrowDown}\n disabled={disabled}\n size={\"small\"}\n />\n </Indent>\n </>\n ) : null}\n </Row>\n }\n >\n <Box width={widthLeft}>\n <TextInput\n onEsc={onEsc}\n onEnter={onEnter}\n onClick={onClickLeft}\n disabled={disabled}\n hideBorder\n placeholder={placeholderLeft}\n value={valueLeft}\n onValueChange={onValueChangeLeft}\n onChange={onChangeLeft}\n onBlur={blurLeftHandler}\n onFocus={focusLeftHandler}\n inputRef={inputRefLeft}\n variant={variantLeft}\n type={typeLeft}\n autoFocus={autoFocusLeft}\n min={minLeft}\n max={maxLeft}\n />\n </Box>\n <Row indent={0.5} alignItems={\"center\"} justifyContent={\"center\"}>\n <Icon\n icon={separatorIcon}\n size={12}\n color={cssColor(\"--lhds-color-ui-500\")}\n />\n </Row>\n <Box width={widthRight}>\n <TextInput\n onEsc={onEsc}\n onEnter={onEnter}\n onClick={onClickRight}\n disabled={disabled}\n hideBorder\n placeholder={placeholderRight}\n value={valueRight}\n onValueChange={onValueChangeRight}\n onChange={onChangeRight}\n onBlur={blurRightHandler}\n onFocus={focusRightHandler}\n inputRef={inputRefRight}\n variant={variantRight}\n type={typeRight}\n autoFocus={autoFocusRight}\n min={minRight}\n max={maxRight}\n />\n </Box>\n </TextInputBox>\n </Box>\n );\n};\n","import { parseIntElseUndefined } from \"@stenajs-webui/core\";\nimport { formatHours, formatMinutes } from \"./TimeStringFormatValidator\";\n\nexport const transformNumberTimeToString = (\n time: number | undefined | null\n): string | undefined => {\n if (time == null) {\n return undefined;\n }\n const timeStr = time.toString();\n if (timeStr.length === 3) {\n return `${timeStr.substr(0, 1)}:${timeStr.substr(1, 2)}`;\n }\n if (timeStr.length === 4) {\n return `${timeStr.substr(0, 2)}:${timeStr.substr(2, 2)}`;\n }\n if (timeStr.length === 2) {\n return `0:${timeStr}`;\n }\n if (timeStr.length === 1) {\n return `0:0${timeStr}`;\n }\n throw new Error(\"Invalid time number.\");\n};\n\nexport const transformTimeStringToNumber = (\n time: string | undefined | null\n): number | null => {\n if (time == null) {\n throw new Error(\"Time is not set.\");\n }\n if (time === \"\") {\n throw new Error(\"Time is empty.\");\n }\n const parts = time.split(\":\");\n if (parts.length !== 2) {\n throw new Error(\"Invalid time.\");\n }\n\n if (parts[1].length !== 2) {\n throw new Error(\"Invalid time.\");\n }\n\n if (parts[0].length < 1 || parts[0].length > 2) {\n throw new Error(\"Invalid time.\");\n }\n\n const hours = parseInt(parts[0], 10);\n const minutes = parseInt(parts[1], 10);\n\n if (isNaN(hours)) {\n throw new Error(\"Invalid time.\");\n }\n if (isNaN(minutes)) {\n throw new Error(\"Invalid time.\");\n }\n if (hours < 0 || hours > 23) {\n throw new Error(\"Invalid time.\");\n }\n if (minutes < 0 || minutes > 59) {\n throw new Error(\"Invalid time.\");\n }\n return hours * 100 + minutes;\n};\n\nexport const isValidTimeString = (time: string | undefined): boolean => {\n try {\n transformTimeStringToNumber(time);\n return true;\n } catch (e) {\n return false;\n }\n};\n\nexport const getHoursAndMinutesFromTimeString = (\n value: string | undefined\n): {\n hour: number | undefined;\n minute: number | undefined;\n} => {\n if (value && isValidTimeString(value)) {\n const p = value.split(\":\");\n return {\n hour: parseIntElseUndefined(p[0]),\n minute: parseIntElseUndefined(p[1]),\n };\n }\n return {\n hour: undefined,\n minute: undefined,\n };\n};\n\nexport const transformTimeInDateToTimeString = (date: Date): string =>\n `${formatHours(String(date.getHours()))}:${formatMinutes(\n String(date.getMinutes())\n )}`;\n","import { Row } from \"@stenajs-webui/core\";\nimport { FlatButton, PrimaryButton } from \"@stenajs-webui/elements\";\nimport * as React from \"react\";\nimport { MutableRefObject, RefObject, useEffect, useRef } from \"react\";\nimport { padStart } from \"lodash-es\";\n\nexport interface TimePickerCellProps {\n item: number;\n selected?: boolean;\n onClick: (label: number) => void;\n columnRef: RefObject<HTMLDivElement>;\n canScrollRef: MutableRefObject<boolean>;\n}\n\nexport const TimePickerCell: React.FC<TimePickerCellProps> = ({\n onClick,\n item,\n selected,\n columnRef,\n canScrollRef,\n}) => {\n const ref = useRef<HTMLDivElement>(null);\n\n useEffect(\n function scrollToSelectedItem() {\n if (\n selected &&\n columnRef.current &&\n ref.current &&\n canScrollRef.current\n ) {\n const targetScroll = ref.current.scrollHeight * Math.max(item - 2, 0);\n columnRef.current.scrollTo(0, targetScroll);\n canScrollRef.current = false;\n }\n },\n [columnRef, item, selected, canScrollRef]\n );\n\n return (\n <Row\n width={\"64px\"}\n justifyContent={\"center\"}\n spacing={0.5}\n indent={0.5}\n ref={ref}\n >\n {selected ? (\n <PrimaryButton\n label={padStart(String(item), 2, \"0\")}\n onClick={() => onClick && onClick(item)}\n />\n ) : (\n <FlatButton\n label={String(item).padStart(2, \"0\")}\n onClick={() => onClick && onClick(item)}\n />\n )}\n </Row>\n );\n};\n","import { Column } from \"@stenajs-webui/core\";\nimport * as React from \"react\";\nimport { MutableRefObject, useRef } from \"react\";\nimport styles from \"./TimePicker.module.css\";\nimport { TimePickerCell } from \"./TimePickerCell\";\n\ninterface Props {\n items: Array<number>;\n onClick: (item: number) => void;\n selectedItem: number | undefined;\n canScrollRef: MutableRefObject<boolean>;\n}\n\nexport const TimePickerColumn: React.FC<Props> = ({\n onClick,\n items,\n selectedItem,\n canScrollRef,\n}) => {\n const columnRef = useRef<HTMLDivElement>(null);\n\n return (\n <Column className={styles.timePickerColumn} ref={columnRef}>\n {items.map((item) => (\n <TimePickerCell\n key={item}\n item={item}\n onClick={onClick}\n selected={item === selectedItem}\n columnRef={columnRef}\n canScrollRef={canScrollRef}\n />\n ))}\n </Column>\n );\n};\n","import { Indent, Row } from \"@stenajs-webui/core\";\nimport { ValueAndOnValueChangeProps } from \"@stenajs-webui/forms\";\nimport { range } from \"lodash-es\";\nimport * as React from \"react\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport {\n formatHours,\n formatMinutes,\n} from \"../../util/time/TimeStringFormatValidator\";\nimport { getHoursAndMinutesFromTimeString } from \"../../util/time/TimeTransformer\";\nimport styles from \"./TimePicker.module.css\";\nimport { TimePickerColumn } from \"./TimePickerColumn\";\n\nexport interface TimePickerProps extends ValueAndOnValueChangeProps<string> {}\n\nconst hours = range(0, 24);\nconst minutes = range(0, 60);\n\nexport const TimePicker: React.FC<TimePickerProps> = ({\n value,\n onValueChange,\n}) => {\n const canScrollRef = useRef(true);\n const [hour, setHour] = useState<number | undefined>(undefined);\n const [minute, setMinute] = useState<number | undefined>(undefined);\n\n useEffect(() => {\n if (value) {\n const { minute, hour } = getHoursAndMinutesFromTimeString(value);\n setHour(hour);\n setMinute(minute);\n }\n }, [value]);\n\n const onClickHour = useCallback(\n (h: number) => {\n setHour(h);\n onValueChange?.(\n `${formatHours(String(h ?? 0))}:${formatMinutes(String(minute ?? 0))}`\n );\n },\n [minute, onValueChange]\n );\n\n const onClickMinutes = useCallback(\n (m: number) => {\n setMinute(m);\n onValueChange?.(\n `${formatHours(String(hour ?? 0))}:${formatMinutes(String(m ?? 0))}`\n );\n },\n [hour, onValueChange]\n );\n\n return (\n <Row className={styles.timePicker}>\n <TimePickerColumn\n items={hours}\n onClick={onClickHour}\n selectedItem={hour}\n canScrollRef={canScrollRef}\n />\n <Indent />\n <TimePickerColumn\n items={minutes}\n onClick={onClickMinutes}\n selectedItem={minute}\n canScrollRef={canScrollRef}\n />\n </Row>\n );\n};\n","import { RefObject, useEffect } from \"react\";\n\nexport const useDateRangeEffects = (\n date: Date | undefined | null,\n setDateInFocus: (date: Date) => void,\n dateInputRef: RefObject<HTMLInputElement>\n) => {\n useEffect(\n function moveFocusedDateWhenDateChanges() {\n if (date) {\n setDateInFocus(date);\n }\n },\n [date, setDateInFocus]\n );\n\n useEffect(\n function updateDateFieldWhenValueChanges() {\n if (dateInputRef.current) {\n if (date) {\n dateInputRef.current.valueAsDate = new Date(\n Date.UTC(date.getFullYear(), date.getMonth(), date.getDate())\n );\n } else {\n dateInputRef.current.valueAsDate = null;\n }\n }\n },\n [date, dateInputRef]\n );\n};\n","import { ChangeEvent, RefObject, useCallback } from \"react\";\nimport { getHoursAndMinutesFromTimeString } from \"../../../../util/time/TimeTransformer\";\nimport { DateTimeInputProps } from \"../DateTimeInput\";\nimport { UseInputStatesResult } from \"./UseInputStates\";\n\nexport const useDateRangeHandlers = (\n date: Date | undefined | null,\n onValueChange: DateTimeInputProps[\"onValueChange\"],\n {\n setDateInFocus,\n showCalendarInternal,\n hideCalendarInternal,\n setFirstFocusedInput,\n setCurrentPanel,\n localTime,\n setLocalTime,\n localDate,\n setLocalDate,\n }: UseInputStatesResult,\n dateInputRef: RefObject<HTMLInputElement>\n) => {\n const onChangeDate = useCallback(\n (incomingDate: Date | null) => {\n if (!incomingDate) {\n return;\n }\n const newDate = new Date(incomingDate);\n\n if (date) {\n // Full date is available\n\n newDate.setHours(date.getHours());\n newDate.setMinutes(date.getMinutes());\n\n onValueChange?.(newDate);\n setLocalDate(undefined);\n } else if (localTime) {\n // Only time has been selected\n const { minute, hour } = getHoursAndMinutesFromTimeString(localTime);\n\n newDate.setHours(hour ?? 0);\n newDate.setMinutes(minute ?? 0);\n\n onValueChange?.(newDate);\n setLocalDate(undefined);\n } else {\n // Nothing has been selected\n setLocalDate(newDate);\n }\n setDateInFocus(newDate);\n if (dateInputRef.current) {\n dateInputRef.current.valueAsDate = new Date(\n Date.UTC(newDate.getFullYear(), newDate.getMonth(), newDate.getDate())\n );\n }\n },\n [date, dateInputRef, localTime, onValueChange, setDateInFocus, setLocalDate]\n );\n\n const onChangeTime = useCallback(\n (time: string) => {\n if (!time) {\n return;\n }\n\n if (date) {\n // Full date is available\n const newTime = getHoursAndMinutesFromTimeString(time);\n const newDate = new Date(date);\n\n newDate.setHours(newTime.hour || 0);\n newDate.setMinutes(newTime.minute || 0);\n\n onValueChange?.(newDate);\n setLocalTime(undefined);\n } else if (localDate) {\n // Only date has already been selected\n const newTime = getHoursAndMinutesFromTimeString(time);\n const newDate = new Date(localDate);\n\n newDate.setHours(newTime.hour || 0);\n newDate.setMinutes(newTime.minute || 0);\n\n onValueChange?.(newDate);\n setLocalTime(undefined);\n } else {\n // Nothing has been selected\n setLocalTime(time);\n }\n },\n [onValueChange, date, localDate, setLocalTime]\n );\n\n const inputLeftChangeHandler = useCallback(\n (ev: ChangeEvent<HTMLInputElement>) => {\n if (ev.target.value[0] !== \"0\") {\n onChangeDate(ev.target.valueAsDate);\n }\n },\n [onChangeDate]\n );\n\n const inputRightChangeHandler = useCallback(\n (ev: ChangeEvent<HTMLInputElement>) => onChangeTime(ev.target.value),\n [onChangeTime]\n );\n\n const showCalendar = useCallback(() => {\n if (date) {\n setDateInFocus(date);\n } else {\n setDateInFocus(new Date());\n }\n setCurrentPanel(\"calendar\");\n showCalendarInternal();\n }, [date, setCurrentPanel, showCalendarInternal, setDateInFocus]);\n\n const hideCalendar = useCallback(() => {\n setFirstFocusedInput(undefined);\n hideCalendarInternal();\n }, [setFirstFocusedInput, hideCalendarInternal]);\n\n return {\n inputLeftChangeHandler,\n inputRightChangeHandler,\n hideCalendar,\n showCalendar,\n onChangeTime,\n onChangeDate,\n };\n};\n","import { useBoolean } from \"@stenajs-webui/core\";\nimport { useState } from \"react\";\nimport { DateRangeFocusedInput } from \"../../../calendar-types/date-range-calendar/DateRangeCalendar\";\nimport { CalendarPanelType } from \"../../../../features/calendar-with-month-year-pickers/CalendarPanelType\";\n\nexport type UseInputStatesResult = ReturnType<typeof useInputStates>;\n\nexport const useInputStates = (date: Date | undefined | null) => {\n const [localDate, setLocalDate] = useState<Date | undefined>(undefined);\n const [localTime, setLocalTime] = useState<string | undefined>(undefined);\n\n const [isCalendarVisible, showCalendarInternal, hideCalendarInternal] =\n useBoolean(false);\n\n const [isTimePickerVisible, showTimePicker, hideTimePicker] =\n useBoolean(false);\n\n const [firstFocusedInput, setFirstFocusedInput] = useState<\n DateRangeFocusedInput | undefined\n >(undefined);\n\n const [dateInFocus, setDateInFocus] = useState<Date>(\n () => date ?? new Date()\n );\n\n const [currentPanel, setCurrentPanel] =\n useState<CalendarPanelType>(\"calendar\");\n\n return {\n isCalendarVisible,\n showCalendarInternal,\n hideCalendarInternal,\n firstFocusedInput,\n setFirstFocusedInput,\n dateInFocus,\n setDateInFocus,\n currentPanel,\n setCurrentPanel,\n isTimePickerVisible,\n showTimePicker,\n hideTimePicker,\n localDate,\n setLocalDate,\n localTime,\n setLocalTime,\n };\n};\n","import * as React from \"react\";\nimport { RefObject, useCallback } from \"react\";\nimport { DayData } from \"../../../../util/calendar/CalendarDataFactory\";\nimport { UseInputStatesResult } from \"./UseInputStates\";\n\nexport const useUserInputHandlers = (\n onChangeDate: (incomingDate: Date | null) => void,\n dateInputRef: RefObject<HTMLInputElement>,\n showCalendar: () => void,\n hideCalendar: () => void,\n {\n isCalendarVisible,\n setCurrentPanel,\n showTimePicker,\n hideTimePicker,\n }: UseInputStatesResult\n) => {\n const onFocusLeft = useCallback(() => {\n if (!isCalendarVisible) {\n showCalendar();\n }\n setCurrentPanel(\"calendar\");\n hideTimePicker();\n }, [hideTimePicker, isCalendarVisible, setCurrentPanel, showCalendar]);\n\n const onFocusRight = useCallback(() => {\n hideCalendar();\n showTimePicker();\n }, [hideCalendar, showTimePicker]);\n\n const onClickDay = useCallback(\n (day: DayData) => {\n onChangeDate(day.date);\n hideCalendar();\n showTimePicker();\n },\n [onChangeDate, hideCalendar, showTimePicker]\n );\n\n const onClickArrowButton = useCallback(() => {\n setCurrentPanel(\"presets\");\n showCalendar();\n }, [setCurrentPanel, showCalendar]);\n\n const onClickCalendarButton = useCallback(() => {\n if (isCalendarVisible) {\n hideCalendar();\n } else {\n dateInputRef.current?.focus();\n setCurrentPanel(\"calendar\");\n showCalendar();\n }\n }, [\n isCalendarVisible,\n hideCalendar,\n dateInputRef,\n setCurrentPanel,\n showCalendar,\n ]);\n\n const onKeyDownHandler = useCallback(\n (ev: React.KeyboardEvent<HTMLDivElement>) => {\n if (ev.key === \"Escape\") {\n hideCalendar();\n }\n },\n [hideCalendar]\n );\n\n return {\n onFocusLeft,\n onFocusRight,\n onClickDay,\n onClickArrowButton,\n onClickCalendarButton,\n onKeyDownHandler,\n };\n};\n","import { Box, Column, Row, Space, useDelayedFalse } from \"@stenajs-webui/core\";\nimport { PrimaryButton } from \"@stenajs-webui/elements\";\nimport {\n TextInputProps,\n ValueAndOnValueChangeProps,\n} from \"@stenajs-webui/forms\";\nimport { Popover } from \"@stenajs-webui/tooltip\";\nimport * as React from \"react\";\nimport { useCallback, useMemo, useRef } from \"react\";\nimport { defaultPopoverPlacement } from \"../../../config/DefaultPopoverPlacement\";\nimport {\n DualTextInput,\n DualTextInputProps,\n} from \"../../../features/dual-text-input/DualTextInput\";\nimport { CalendarWithMonthSwitcher } from \"../../../features/month-switcher/CalendarWithMonthSwitcher\";\nimport { TimePicker } from \"../../../features/time-picker/TimePicker\";\nimport { addDayStateHighlights } from \"../../../util/calendar/StateModifier\";\nimport { transformTimeInDateToTimeString } from \"../../../util/time/TimeTransformer\";\nimport { useDateRangeEffects } from \"./hooks/UseDateRangeEffects\";\nimport { useDateRangeHandlers } from \"./hooks/UseDateRangeHandlers\";\nimport { useInputStates } from \"./hooks/UseInputStates\";\nimport { useUserInputHandlers } from \"./hooks/UseUserInputHandlers\";\nimport { OptionalMinMaxDatesAsString } from \"../../../types/CalendarTypes\";\nimport { defaultMaxDate } from \"../../../config/DefaultMaxDate\";\nimport { stenaClock } from \"@stenajs-webui/elements\";\n\nexport interface DateTimeInputProps\n extends ValueAndOnValueChangeProps<Date | null>,\n OptionalMinMaxDatesAsString,\n Pick<DualTextInputProps, \"widthLeft\" | \"widthRight\" | \"variant\"> {\n onEsc?: () => void;\n onEnter?: () => void;\n onBlur?: () => void;\n autoFocus?: boolean;\n disabled?: boolean;\n}\n\nexport const DateTimeInput: React.FC<DateTimeInputProps> = ({\n value,\n onValueChange,\n onEnter,\n onEsc,\n onBlur,\n autoFocus,\n minDate,\n widthLeft = 128,\n widthRight = 80,\n maxDate = defaultMaxDate,\n variant,\n disabled,\n}) => {\n const dateInputRef: TextInputProps[\"inputRef\"] = useRef(null);\n const timeInputRef: TextInputProps[\"inputRef\"] = useRef(null);\n\n const states = useInputStates(value);\n\n const {\n setCurrentPanel,\n currentPanel,\n isCalendarVisible,\n dateInFocus,\n setDateInFocus,\n isTimePickerVisible,\n hideTimePicker,\n localTime,\n localDate,\n } = states;\n\n const {\n showCalendar,\n hideCalendar,\n inputLeftChangeHandler,\n inputRightChangeHandler,\n onChangeTime,\n onChangeDate,\n } = useDateRangeHandlers(value, onValueChange, states, dateInputRef);\n\n const {\n onKeyDownHandler,\n onFocusRight,\n onFocusLeft,\n onClickDay,\n onClickCalendarButton,\n onClickArrowButton,\n } = useUserInputHandlers(\n onChangeDate,\n dateInputRef,\n showCalendar,\n hideCalendar,\n states\n );\n\n useDateRangeEffects(value, setDateInFocus, dateInputRef);\n\n const statePerMonth = useMemo(() => {\n const dateToHighlight = value || localDate;\n if (!dateToHighlight) {\n return {};\n }\n return addDayStateHighlights(undefined, dateToHighlight, [\n \"singleSelected\",\n \"selected\",\n ]);\n }, [localDate, value]);\n\n const hideAll = useCallback(() => {\n hideCalendar();\n hideTimePicker();\n }, [hideCalendar, hideTimePicker]);\n\n const timeValue = useMemo<string | undefined>(\n () => (value ? transformTimeInDateToTimeString(value) : localTime),\n [value, localTime]\n );\n\n const delayedIsCalendarVisible = useDelayedFalse(isCalendarVisible, 300);\n const delayedIsTimePickerVisible = useDelayedFalse(isTimePickerVisible, 300);\n\n return (\n <Box onKeyDown={onKeyDownHandler}>\n <Popover\n arrow={false}\n lazy\n disabled={disabled}\n placement={defaultPopoverPlacement}\n visible={isCalendarVisible || isTimePickerVisible}\n onClickOutside={hideAll}\n content={\n (delayedIsCalendarVisible || delayedIsTimePickerVisible) && (\n <Column>\n {delayedIsCalendarVisible ? (\n <CalendarWithMonthSwitcher\n statePerMonth={statePerMonth}\n onClickDay={onClickDay}\n dateInFocus={dateInFocus}\n setDateInFocus={setDateInFocus}\n currentPanel={currentPanel}\n setCurrentPanel={setCurrentPanel}\n minDate={minDate}\n maxDate={maxDate}\n />\n ) : delayedIsTimePickerVisible ? (\n <Column>\n <Column overflow={\"hidden\"} height={\"250px\"}>\n <TimePicker\n value={timeValue ?? \"\"}\n onValueChange={onChangeTime}\n />\n </Column>\n <Space />\n <Row justifyContent={\"flex-end\"}>\n <PrimaryButton label={\"Done\"} onClick={hideTimePicker} />\n </Row>\n </Column>\n ) : null}\n </Column>\n )\n }\n >\n <DualTextInput\n autoFocusLeft={autoFocus}\n onEsc={onEsc}\n onEnter={onEnter}\n onBlur={onBlur}\n disabled={disabled}\n separatorIcon={stenaClock}\n typeLeft={\"date\"}\n typeRight={\"time\"}\n placeholderLeft={\"yyyy-mm-dd\"}\n placeholderRight={\"hh:mm\"}\n onChangeLeft={inputLeftChangeHandler}\n onChangeRight={inputRightChangeHandler}\n onClickArrowDown={onClickArrowButton}\n onClickCalendar={onClickCalendarButton}\n onFocusLeft={onFocusLeft}\n onFocusRight={onFocusRight}\n onClickLeft={onFocusLeft}\n onClickRight={onFocusRight}\n inputRefLeft={dateInputRef}\n inputRefRight={timeInputRef}\n valueRight={timeValue ?? \"\"}\n widthLeft={widthLeft}\n widthRight={widthRight}\n minLeft={minDate}\n maxLeft={maxDate}\n variant={variant}\n />\n </Popover>\n </Box>\n );\n};\n","import * as React from \"react\";\nimport { Row } from \"@stenajs-webui/core\";\nimport { FlatButton, PrimaryButton } from \"@stenajs-webui/elements\";\nimport { ValueAndOnValueChangeProps } from \"@stenajs-webui/forms\";\n\ninterface Props extends ValueAndOnValueChangeProps<number> {\n year: number;\n}\n\nexport const YearPickerCell: React.FC<Props> = ({\n value,\n onValueChange,\n year,\n}) => {\n const label = String(year);\n return (\n <Row justifyContent={\"center\"}>\n {value === year ? (\n <PrimaryButton label={label} onClick={() => onValueChange?.(year)} />\n ) : (\n <FlatButton label={label} onClick={() => onValueChange?.(year)} />\n )}\n </Row>\n );\n};\n","import * as React from \"react\";\nimport { useEffect, useMemo, useState } from \"react\";\nimport { ValueAndOnValueChangeProps } from \"@stenajs-webui/forms\";\nimport { Column, Row } from \"@stenajs-webui/core\";\nimport { YearPickerCell } from \"./YearPickerCell\";\nimport {\n FlatButton,\n stenaArrowLeft,\n stenaArrowRight,\n} from \"@stenajs-webui/elements\";\nimport { chunk, range } from \"lodash-es\";\n\nexport interface YearPickerProps extends ValueAndOnValueChangeProps<number> {\n initialLastYear?: number;\n}\n\nexport const YearPicker: React.FC<YearPickerProps> = ({\n value,\n onValueChange,\n initialLastYear,\n}) => {\n const [lastYear, setLastYear] = useState(() => {\n if (value) {\n return value + 4;\n }\n return initialLastYear ?? new Date().getFullYear() + 4;\n });\n\n const yearRows = useMemo(() => {\n const startYear = lastYear - 11;\n return chunk(range(startYear, lastYear + 1), 3);\n }, [lastYear]);\n\n useEffect(() => {\n setLastYear((prev) => calculateLastYearInFocus(value, prev));\n }, [value]);\n\n return (\n <Row>\n <Column justifyContent={\"center\"}>\n <FlatButton\n leftIcon={stenaArrowLeft}\n onClick={() => setLastYear(lastYear - 3)}\n />\n </Column>\n <Column gap={1}>\n {yearRows.map((yearRow) => (\n <Row key={yearRow[0]} gap={1}>\n {yearRow.map((year) => (\n <YearPickerCell\n key={year}\n year={year}\n onValueChange={onValueChange}\n value={value}\n />\n ))}\n </Row>\n ))}\n </Column>\n <Column justifyContent={\"center\"}>\n <FlatButton\n leftIcon={stenaArrowRight}\n onClick={() => setLastYear(lastYear + 3)}\n />\n </Column>\n </Row>\n );\n};\n\nconst calculateLastYearInFocus = (\n value: number | undefined,\n lastYear: number\n): number => {\n if (value == null) {\n return lastYear;\n }\n if (value > lastYear) {\n const yearDiff = value - lastYear;\n const remaining = yearDiff % 3;\n const yearsToAdd = yearDiff - remaining + 3;\n return lastYear + yearsToAdd;\n }\n const startYear = lastYear - 11;\n if (value < startYear) {\n const yearDiff = startYear - value;\n const remaining = yearDiff % 3;\n const yearsToSubtract = yearDiff - remaining + 3;\n return lastYear - yearsToSubtract;\n }\n\n return lastYear;\n};\n","import { RefObject, useEffect } from \"react\";\n\nexport const useDateRangeEffects = (\n startDate: Date | undefined,\n endDate: Date | undefined,\n setDateInFocus: (date: Date) => void,\n startDateInputRef: RefObject<HTMLInputElement>,\n endDateInputRef: RefObject<HTMLInputElement>\n) => {\n useEffect(\n function moveFocusedDateWhenStartDateChanges() {\n if (startDate) {\n setDateInFocus(startDate);\n }\n },\n [startDate, setDateInFocus]\n );\n\n useEffect(\n function moveFocusedDateWhenEndDateChanges() {\n if (endDate) {\n setDateInFocus(endDate);\n }\n },\n [endDate, setDateInFocus]\n );\n\n useEffect(\n function updateStartDateFieldWhenValueChanges() {\n if (startDateInputRef.current) {\n if (startDate) {\n startDateInputRef.current.valueAsDate = new Date(\n Date.UTC(\n startDate.getFullYear(),\n startDate.getMonth(),\n startDate.getDate()\n )\n );\n } else {\n startDateInputRef.current.valueAsDate = null;\n }\n }\n },\n [startDate, startDateInputRef]\n );\n\n useEffect(\n function updateEndDateFieldWhenValueChanges() {\n if (endDateInputRef.current) {\n if (endDate) {\n endDateInputRef.current.valueAsDate = new Date(\n Date.UTC(\n endDate.getFullYear(),\n endDate.getMonth(),\n endDate.getDate()\n )\n );\n } else {\n endDateInputRef.current.valueAsDate = null;\n }\n }\n },\n [endDate, endDateInputRef]\n );\n};\n","import { ChangeEvent, useCallback } from \"react\";\nimport { DateRangeDualTextInputProps } from \"../DateRangeDualTextInput\";\nimport { UseInputStatesResult } from \"./UseInputStates\";\n\nexport const useDateRangeHandlers = (\n startDate: Date | undefined,\n endDate: Date | undefined,\n onValueChange: DateRangeDualTextInputProps[\"onValueChange\"],\n {\n setDateInFocus,\n showCalendarInternal,\n hideCalendarInternal,\n setFirstFocusedInput,\n setCurrentPanel,\n }: UseInputStatesResult\n) => {\n const inputLeftChangeHandler = useCallback(\n (ev: ChangeEvent<HTMLInputElement>) => {\n if (ev.target.value[0] !== \"0\") {\n onValueChange?.({\n startDate: ev.target.valueAsDate ?? undefined,\n endDate,\n });\n }\n },\n [onValueChange, endDate]\n );\n\n const inputRightChangeHandler = useCallback(\n (ev: ChangeEvent<HTMLInputElement>) => {\n if (ev.target.value[0] !== \"0\") {\n onValueChange?.({\n startDate,\n endDate: ev.target.valueAsDate ?? undefined,\n });\n }\n },\n [onValueChange, startDate]\n );\n\n const showCalendar = useCallback(() => {\n if (startDate) {\n setDateInFocus(startDate);\n } else if (endDate) {\n setDateInFocus(endDate);\n } else {\n setDateInFocus(new Date());\n }\n setCurrentPanel(\"calendar\");\n showCalendarInternal();\n }, [\n startDate,\n endDate,\n setCurrentPanel,\n showCalendarInternal,\n setDateInFocus,\n ]);\n\n const hideCalendar = useCallback(() => {\n setFirstFocusedInput(undefined);\n hideCalendarInternal();\n }, [setFirstFocusedInput, hideCalendarInternal]);\n\n return {\n inputLeftChangeHandler,\n inputRightChangeHandler,\n hideCalendar,\n setDateInFocus,\n setCurrentPanel,\n showCalendar,\n };\n};\n","import { useBoolean } from \"@stenajs-webui/core\";\nimport { useState } from \"react\";\nimport { DateRangeFocusedInput } from \"../../../calendar-types/date-range-calendar/DateRangeCalendar\";\nimport { CalendarPanelType } from \"../../../../features/calendar-with-month-year-pickers/CalendarPanelType\";\n\nexport type UseInputStatesResult = ReturnType<typeof useInputStates>;\n\nexport const useInputStates = (\n startDate: Date | undefined,\n endDate: Date | undefined\n) => {\n const [isCalendarVisible, showCalendarInternal, hideCalendarInternal] =\n useBoolean(false);\n\n const [firstFocusedInput, setFirstFocusedInput] = useState<\n DateRangeFocusedInput | undefined\n >(undefined);\n\n const [focusedInput, setFocusedInput] =\n useState<DateRangeFocusedInput>(\"startDate\");\n\n const [dateInFocus, setDateInFocus] = useState<Date>(() => {\n const fromValue =\n focusedInput === \"startDate\"\n ? startDate\n : focusedInput === \"endDate\"\n ? endDate\n : undefined;\n\n return fromValue ?? new Date();\n });\n\n const [currentPanel, setCurrentPanel] =\n useState<CalendarPanelType>(\"calendar\");\n\n return {\n isCalendarVisible,\n showCalendarInternal,\n hideCalendarInternal,\n firstFocusedInput,\n setFirstFocusedInput,\n focusedInput,\n setFocusedInput,\n dateInFocus,\n setDateInFocus,\n currentPanel,\n setCurrentPanel,\n };\n};\n","import { isAfter } from \"date-fns\";\nimport * as React from \"react\";\nimport { RefObject, useCallback } from \"react\";\nimport { DayData } from \"../../../../util/calendar/CalendarDataFactory\";\nimport { DateRangeDualTextInputProps } from \"../DateRangeDualTextInput\";\nimport { UseInputStatesResult } from \"./UseInputStates\";\n\nexport const useUserInputHandlers = (\n startDate: Date | undefined,\n endDate: Date | undefined,\n onValueChange: DateRangeDualTextInputProps[\"onValueChange\"],\n startDateInputRef: RefObject<HTMLInputElement>,\n endDateInputRef: RefObject<HTMLInputElement>,\n showCalendar: () => void,\n hideCalendar: () => void,\n {\n firstFocusedInput,\n setFirstFocusedInput,\n isCalendarVisible,\n setFocusedInput,\n focusedInput,\n setCurrentPanel,\n }: UseInputStatesResult\n) => {\n const onFocusLeft = useCallback(() => {\n if (firstFocusedInput == null) {\n setFirstFocusedInput(\"startDate\");\n }\n setFocusedInput(\"startDate\");\n if (!isCalendarVisible) {\n showCalendar();\n }\n }, [\n isCalendarVisible,\n setFocusedInput,\n showCalendar,\n setFirstFocusedInput,\n firstFocusedInput,\n ]);\n\n const onFocusRight = useCallback(() => {\n if (firstFocusedInput == null) {\n setFirstFocusedInput(\"endDate\");\n }\n setFocusedInput(\"endDate\");\n if (!isCalendarVisible) {\n showCalendar();\n }\n }, [\n isCalendarVisible,\n setFocusedInput,\n showCalendar,\n setFirstFocusedInput,\n firstFocusedInput,\n ]);\n\n const onClickDay = useCallback(\n (day: DayData) => {\n if (focusedInput === \"startDate\") {\n if (endDate != null && isAfter(day.date, endDate)) {\n onValueChange?.({\n startDate: day.date,\n endDate: undefined,\n });\n setFocusedInput(\"endDate\");\n endDateInputRef.current?.focus();\n } else {\n onValueChange?.({\n startDate: day.date,\n endDate,\n });\n if (firstFocusedInput === \"startDate\") {\n setFocusedInput(\"endDate\");\n endDateInputRef.current?.focus();\n } else {\n setTimeout(hideCalendar, 50);\n }\n }\n } else if (focusedInput === \"endDate\") {\n if (!startDate) {\n onValueChange?.({\n startDate,\n endDate: day.date,\n });\n setFocusedInput(\"startDate\");\n startDateInputRef.current?.focus();\n } else if (isAfter(startDate, day.date)) {\n onValueChange?.({\n startDate: day.date,\n endDate: undefined,\n });\n setFocusedInput(\"endDate\");\n endDateInputRef.current?.focus();\n } else {\n onValueChange?.({\n startDate,\n endDate: day.date,\n });\n setTimeout(hideCalendar, 50);\n }\n }\n },\n [\n focusedInput,\n onValueChange,\n endDate,\n firstFocusedInput,\n setFocusedInput,\n endDateInputRef,\n hideCalendar,\n startDate,\n startDateInputRef,\n ]\n );\n\n const onClickArrowButton = useCallback(() => {\n setCurrentPanel(\"presets\");\n showCalendar();\n }, [setCurrentPanel, showCalendar]);\n\n const onClickCalendarButton = useCallback(() => {\n if (isCalendarVisible) {\n hideCalendar();\n } else {\n setFocusedInput(\"startDate\");\n setFirstFocusedInput(\"startDate\");\n startDateInputRef.current?.focus();\n setCurrentPanel(\"calendar\");\n showCalendar();\n }\n }, [\n isCalendarVisible,\n hideCalendar,\n setFocusedInput,\n setFirstFocusedInput,\n startDateInputRef,\n setCurrentPanel,\n showCalendar,\n ]);\n\n const onKeyDownHandler = useCallback(\n (ev: React.KeyboardEvent<HTMLDivElement>) => {\n if (ev.key === \"Escape\") {\n hideCalendar();\n }\n },\n [hideCalendar]\n );\n\n return {\n onFocusLeft,\n onFocusRight,\n onClickDay,\n onClickArrowButton,\n onClickCalendarButton,\n onKeyDownHandler,\n };\n};\n","import { Box, useDelayedFalse } from \"@stenajs-webui/core\";\nimport { stenaArrowRight } from \"@stenajs-webui/elements\";\nimport {\n TextInputProps,\n ValueAndOnValueChangeProps,\n} from \"@stenajs-webui/forms\";\nimport { Popover } from \"@stenajs-webui/tooltip\";\nimport { isAfter } from \"date-fns\";\nimport * as React from \"react\";\nimport { useMemo, useRef } from \"react\";\nimport { defaultPopoverPlacement } from \"../../../config/DefaultPopoverPlacement\";\nimport {\n DualTextInput,\n DualTextInputProps,\n} from \"../../../features/dual-text-input/DualTextInput\";\nimport { CalendarWithMonthSwitcher } from \"../../../features/month-switcher/CalendarWithMonthSwitcher\";\nimport { buildDayStateForSingleMonth } from \"../../../util/calendar/StateModifier\";\nimport { useDateRangeEffects } from \"./hooks/UseDateRangeEffects\";\nimport { useDateRangeHandlers } from \"./hooks/UseDateRangeHandlers\";\nimport { useInputStates } from \"./hooks/UseInputStates\";\nimport { useUserInputHandlers } from \"./hooks/UseUserInputHandlers\";\nimport { DateRangeInputCalendarProps } from \"../../calendar-types/date-range-calendar/DateRangeCalendar\";\nimport { OptionalMinMaxDatesAsString } from \"../../../types/CalendarTypes\";\nimport { DateRange } from \"../../../types/DateRange\";\nimport { defaultMaxDate } from \"../../../config/DefaultMaxDate\";\n\nexport interface DateRangeDualTextInputProps<TData = unknown>\n extends ValueAndOnValueChangeProps<DateRange>,\n OptionalMinMaxDatesAsString,\n Pick<DualTextInputProps, \"widthLeft\" | \"widthRight\" | \"variant\"> {\n onEsc?: () => void;\n onEnter?: () => void;\n onBlur?: () => void;\n autoFocus?: boolean;\n calendarProps?: DateRangeInputCalendarProps<TData>;\n disabled?: boolean;\n}\n\nexport function DateRangeDualTextInput<TData>({\n value,\n onValueChange,\n autoFocus,\n onBlur,\n onEnter,\n onEsc,\n minDate,\n maxDate = defaultMaxDate,\n calendarProps,\n widthLeft = 128,\n widthRight = 128,\n variant,\n disabled,\n}: DateRangeDualTextInputProps<TData>) {\n const { startDate, endDate } = value || {};\n\n const startDateInputRef: TextInputProps[\"inputRef\"] = useRef(null);\n const endDateInputRef: TextInputProps[\"inputRef\"] = useRef(null);\n\n const states = useInputStates(startDate, endDate);\n\n const {\n dateInFocus,\n setDateInFocus,\n isCalendarVisible,\n currentPanel,\n setCurrentPanel,\n } = states;\n\n const {\n showCalendar,\n hideCalendar,\n inputLeftChangeHandler,\n inputRightChangeHandler,\n } = useDateRangeHandlers(startDate, endDate, onValueChange, states);\n\n const {\n onKeyDownHandler,\n onFocusRight,\n onFocusLeft,\n onClickDay,\n onClickCalendarButton,\n onClickArrowButton,\n } = useUserInputHandlers(\n startDate,\n endDate,\n onValueChange,\n startDateInputRef,\n endDateInputRef,\n showCalendar,\n hideCalendar,\n states\n );\n\n useDateRangeEffects(\n startDate,\n endDate,\n setDateInFocus,\n startDateInputRef,\n endDateInputRef\n );\n\n const startDateIsAfterEnd = useMemo(\n () => startDate && endDate && isAfter(startDate, endDate),\n [startDate, endDate]\n );\n\n const statePerMonth = useMemo(\n () =>\n buildDayStateForSingleMonth(\n calendarProps?.statePerMonth,\n startDate,\n endDate,\n dateInFocus\n ),\n [calendarProps?.statePerMonth, startDate, endDate, dateInFocus]\n );\n\n const delayedIsCalendarVisible = useDelayedFalse(isCalendarVisible, 300);\n\n return (\n <Box onKeyDown={onKeyDownHandler}>\n <Popover\n arrow={false}\n lazy\n disabled={disabled}\n placement={defaultPopoverPlacement}\n onClickOutside={hideCalendar}\n visible={isCalendarVisible}\n content={\n delayedIsCalendarVisible && (\n <CalendarWithMonthSwitcher\n onClickDay={onClickDay}\n dateInFocus={dateInFocus}\n setDateInFocus={setDateInFocus}\n currentPanel={currentPanel}\n setCurrentPanel={setCurrentPanel}\n minDate={minDate}\n maxDate={maxDate}\n {...calendarProps}\n statePerMonth={statePerMonth}\n />\n )\n }\n >\n <DualTextInput\n autoFocusLeft={autoFocus}\n onEsc={onEsc}\n onEnter={onEnter}\n onBlur={onBlur}\n disabled={disabled}\n separatorIcon={stenaArrowRight}\n typeLeft={\"date\"}\n typeRight={\"date\"}\n placeholderLeft={\"Start date\"}\n placeholderRight={\"End date\"}\n onChangeLeft={inputLeftChangeHandler}\n onChangeRight={inputRightChangeHandler}\n onClickArrowDown={onClickArrowButton}\n onClickCalendar={onClickCalendarButton}\n onFocusLeft={onFocusLeft}\n onFocusRight={onFocusRight}\n onClickLeft={onFocusLeft}\n onClickRight={onFocusRight}\n inputRefLeft={startDateInputRef}\n inputRefRight={endDateInputRef}\n variant={startDateIsAfterEnd ? \"error\" : variant}\n widthLeft={widthLeft}\n widthRight={widthRight}\n minLeft={minDate}\n maxLeft={maxDate}\n minRight={minDate}\n maxRight={maxDate}\n />\n </Popover>\n </Box>\n );\n}\n"],"names":["DateFormats","buildDayStateForDateRange","statePerMonth","start","end","isAfter","eachDayOfInterval","result","date","isFirstInRange","isSameDay","isLastInRange","addDayStateHighlights","state","buildDayStateForSingleMonth","dateInFocus","buildDayStateForRange","startOfMonth","endOfMonth","startLimit","endLimit","max","subDays","min","addDays","setDayStateValue","values","monthString","format","weekNumber","getISOWeek","dayInMonth","getDate","setDayStateValueFunction","setter","calendarState","highlights","month","dayState","addDayStateHighlightsOnSingleDay","addWeekStateHighlights","week","day","weekState","newHighlights","newWeekState","addWeekRangeHighlights","startDate","endDate","last","useHighlightToday","enabled","useMemo","Month","Month2","WeekDay","WeekDay2","getMonthsInYear","year","startMonth","numMonths","locale","months","i","getMonthInYear","yearToUse","monthToUse","firstDayOfMonth","startCase","getWeeksForMonth","forceSixWeeks","firstDayOfFirstWeek","startOfWeek","weeks","getWeekForDate","addWeeks","firstDayOfWeek","isLastWeekOfMonth","getMonth","getWeek","getYear","getDaysForWeekForDate","createDay","dayOfWeek","getISODay","addHours","d","calculateOverflowingMonth","dayHasHighlight","defaultHighlights","highlight","dayHighlightSelect","highlightsOrBoolean","returnValues","fallbackValue","defaultWrapperStyleProvider","selectedBackground","todayBackground","rangeBackground","borderColor","_","defaultTextPropsProvider","selectedColor","disabledColor","inOtherMonthColor","rangeTextColor","isOtherMonth","defaultCalendarTheme","extranetCalendarTheme","WeekDayCell","onClickWeekDay","theme","content","jsx","Box","Text","Clickable","ev","CalendarDay","userData","onClickDay","ExtraDayContent","WrapperTd","styled","InnerWrapperDiv","CellWrapperDiv","disabled","isDisabled","jsxs","Fragment","WeekNumberCell","onClickWeek","background","backgroundColor","prefix","isDateInMinMaxRange","isBefore","DisabledDayWrapper","DayComponent","minDate","maxDate","props","activeDayState","CalendarMonth","dayComponent","statePerWeek","userDataPerWeek","onClickMonth","renderWeekNumber","renderWeekDay","headerRightContent","extraDayContent","showWeekNumber","Row","FlatButton","stenaAngleDown","CalendarPanel","monthRows","userDataPerMonth","minDateObj","parse","maxDateObj","cx","styles","monthRow","rowIndex","Spacing","Calendar","initialDate","getInitialDate","getMonthRows","enGB","now","monthsPerRow","chunk","MonthPickerCell","onClick","selected","label","PrimaryButton","MonthPicker","value","onValueChange","firstMonth","input","createMonths","Column","Heading","currentYear","currentMonth","createFirstDate","createStandardDateRangePresets","PresetPicker","onClickPreset","pageIndex","setPageIndex","useState","pages","currentPage","stenaAngleLeft","stenaAngleRight","Space","preset","React","CalendarWithMonthYearPickers","setDateInFocus","currentPanel","setCurrentPanel","renderMonthPicker","onChangeSelectedMonth","useCallback","selectedMonth","newDate","useSelectedMonthStepperLogic","nextMonth","addMonths","nextYear","addYears","prevMonth","subMonths","prevYear","subYears","WithMonthSwitcherBelow","children","Indent","SecondaryButton","stenaAngleLeftDouble","stenaArrowLeft","stenaArrowRight","stenaAngleRightDouble","noop","CalendarWithMonthSwitcher","monthSwitcherPlacement","onSelectPreset","calendarProps","fallbackIfNoPlacement","dateRangeToStrings","dateRange","stringsToDateRange","isDateRangeInvalid","toggleDatesIfEndIsEarlierThanStart","toggleDateStringsIfEndIsEarlierThanStart","useDateRangeOnClickDayHandler","focusedInput","setFocusedInput","useInternalPanelState","onChangePanel","_setCurrentPanel","useDateRangeSelection","initialDateInFocus","statePerMonthWithSelection","DateRangeCalendar","dateRangeSelectionProps","useDateRangeCalendarState","setStartDate","setEndDate","useSingleDateSelection","onChange","statePerMonthWithSelectedDate","SingleDateCalendar","singleDateSelectionProps","useMultiDateSelection","isSelected","v","stateSum","MultiDateCalendar","selectionProps","useSingleWeekSelection","getWeekDataFromWeekString","getWeekStringFromWeekData","weekData","parts","firstDateOfWeek","setWeek","SingleWeekCalendar","singleWeekSelectionProps","defaultPopoverPlacement","useCalendarPopoverUpdater","tippyRef","tippyInstanceRef","useTippyInstance","_b","_a","useDateInput","onClose","openOnMount","showingCalendar","setShowingCalendar","showCalendar","hideCalendar","onSelectDate","defaultMaxDate","DateInput","displayFormat","placeholder","zIndex","calendarTheme","portalTarget","variant","width","Popover","TextInput","TextInputButton","stenaCalendar","useDateRangeInput","startDateInputRef","useRef","endDateInputRef","showCalendarStartDate","showCalendarEndDate","startDateIsAfterEnd","DateRangeInput","placeholderStartDate","placeholderEndDate","Icon","stenaArrowWideRight","cssColor","DateTextInput","closeOnCalendarSelectDate","dateFormat","disableCalender","hideCalenderIcon","open","setOpen","toggleCalendar","onValueChangeHandler","onCalendarSelectDate","inValidInput","dateIsValid","isValid","invalid","formatHours","hours","h","formatMinutes","minutes","m","formatTimeString","time","validUserInput","arr","timeNumber","TimeTextInput","showPlaceholder","useIcon","valid","setValid","timeFormat","onBlur","formattedResult","onChangeHandler","validInput","stenaClock","DualTextInput","autoFocusLeft","autoFocusRight","onEsc","onEnter","onValueChangeLeft","onValueChangeRight","separatorIcon","placeholderLeft","placeholderRight","typeLeft","typeRight","onChangeLeft","onChangeRight","valueLeft","valueRight","minLeft","maxLeft","minRight","maxRight","onClickLeft","onClickRight","onClickCalendar","onClickArrowDown","onBlurLeft","onBlurRight","onFocusLeft","onFocusRight","inputRefLeft","inputRefRight","variantLeft","variantRight","showPresets","widthLeft","widthRight","focusCounter","tryTriggerOnBlur","debounce","focusLeftHandler","focusRightHandler","blurLeftHandler","blurRightHandler","TextInputBox","SeparatorLine","transformTimeStringToNumber","isValidTimeString","getHoursAndMinutesFromTimeString","p","parseIntElseUndefined","transformTimeInDateToTimeString","TimePickerCell","item","columnRef","canScrollRef","ref","useEffect","targetScroll","padStart","TimePickerColumn","items","selectedItem","range","TimePicker","hour","setHour","minute","setMinute","onClickHour","onClickMinutes","useDateRangeEffects","dateInputRef","useDateRangeHandlers","showCalendarInternal","hideCalendarInternal","setFirstFocusedInput","localTime","setLocalTime","localDate","setLocalDate","onChangeDate","incomingDate","onChangeTime","newTime","inputLeftChangeHandler","inputRightChangeHandler","useInputStates","isCalendarVisible","useBoolean","isTimePickerVisible","showTimePicker","hideTimePicker","firstFocusedInput","useUserInputHandlers","onClickArrowButton","onClickCalendarButton","onKeyDownHandler","DateTimeInput","autoFocus","timeInputRef","states","dateToHighlight","hideAll","timeValue","delayedIsCalendarVisible","useDelayedFalse","delayedIsTimePickerVisible","YearPickerCell","YearPicker","initialLastYear","lastYear","setLastYear","yearRows","startYear","prev","calculateLastYearInFocus","yearRow","yearDiff","remaining","yearsToAdd","yearsToSubtract","_d","_c","DateRangeDualTextInput"],"mappings":"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A,gDACA,gDACA,4CACA,0BACF,EACAU,CACF,EACA,oBAAqBR,EACnBrD,EACAmD,EACA,CAAC,gBAAiB,iBAAkB,OAAO,EAC3C,CACE,yCACA,yCACA,wCACF,EACA,OACF,EACA,uBAAwBE,EACtBrD,EACAmD,EACA,CAAC,gBAAiB,iBAAkB,OAAO,EAC3C,CACE,yCACA,yCACA,wCACF,EACA,OACF,EACA,qBAAsBE,EACpBrD,EACAmD,EACA,CAAC,cAAe,iBAAkB,OAAO,EACzC,CACE,yCACA,yCACA,wCACF,EACA,OACF,EACA,wBAAyBE,EACvBrD,EACAmD,EACA,CAAC,cAAe,iBAAkB,OAAO,EACzC,CACE,yCACA,yCACA,wCACF,EACA,OACF,EACA,UAAW,YAAA,GAWJY,GAA2B,CAAC,CACvC,cAAAC,EACA,cAAAC,EACA,kBAAAC,EACA,eAAAC,CACF,IACS,CAAChB,EAAmBnD,EAAUI,EAAK0D,EAAG/D,IAAU,CAC/C,MAAAqE,EAAehE,EAAI,QAAUL,EAAM,YAalC,MAAA,CACL,MAbYsD,EACZrD,EACAmD,EACA,CAACiB,EAAc,WAAY,QAAS,UAAW,UAAU,EACzD,CACEF,EACAF,EACAG,EACA,OACAF,CACF,CAAA,CAGA,CACF,EAISI,EAAsC,CACjD,MAAO,iCACP,OAAQ,kCACR,WAAY,CACV,gBAAiB,4CACjB,UAAW,8CACX,mBAAoB,uDACtB,EACA,QAAS,CACP,UAAW,2CACX,mBAAoB,oDACtB,EACA,YAAa,CACX,QAASZ,GAA4B,CACnC,mBAAoB,mDACpB,gBAAiB,gDACjB,gBAAiB,+CAAA,CAClB,EACD,UAAWM,GAAyB,CAClC,cAAe,2CACf,cAAe,2CACf,kBAAmB,gDAAA,CACpB,CACH,EACA,cAAe,CACb,gBAAiB,0CACnB,CACF,EAEaO,GAAuC,CAClD,GAAGD,EACH,MAAO,OACP,OAAQ,MACV,ECjNaE,GAAc,CAAC,CAC1B,eAAAC,EACA,IAAApE,EACA,MAAAqE,CACF,IAAwB,CACtB,MAAMC,EACJC,EAAA,IAACC,EAAA,IAAA,CACC,MAAOH,EAAM,MACb,OAAQA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"}
1
+ {"version":3,"file":"index.js","sources":["../src/util/date/DateFormats.ts","../src/util/calendar/StateModifier.ts","../src/features/today-state/UseHighlightToday.ts","../src/util/calendar/CalendarDataFactory.ts","../src/util/calendar/StateHelper.ts","../src/components/calendar/CalendarTheme.tsx","../src/components/calendar/renderers/WeekDayCell.tsx","../src/components/calendar/renderers/CalendarDay.tsx","../src/components/calendar/renderers/WeekNumberCell.tsx","../src/util/date/DateMinMaxValidator.ts","../src/components/calendar/DisabledDayWrapper.tsx","../src/components/calendar/CalendarMonth.tsx","../src/components/calendar/Calendar.tsx","../src/features/month-picker/MonthPickerCell.tsx","../src/features/month-picker/MonthPicker.tsx","../src/features/preset-picker/PresetFactory.ts","../src/features/preset-picker/PresetPicker.tsx","../src/features/calendar-with-month-year-pickers/CalendarWithMonthYearPickers.tsx","../src/features/month-switcher/hooks/UseSelectedMonthStepperLogic.ts","../src/features/month-switcher/MonthSwitcherBelow.tsx","../src/features/month-switcher/CalendarWithMonthSwitcher.tsx","../src/util/date-range/DateRangeTransformer.ts","../src/util/date-range/DateRangeValidator.ts","../src/features/date-range/hooks/UseDateRangeOnClickDayHandler.ts","../src/features/internal-panel-state/UseInternalPanelState.tsx","../src/components/calendar-types/date-range-calendar/hooks/UseDateRangeSelection.ts","../src/components/calendar-types/date-range-calendar/DateRangeCalendar.tsx","../src/components/calendar-types/date-range-calendar/hooks/UseDateRangeCalendarState.ts","../src/components/calendar-types/single-date-calendar/UseSingleDateSelection.ts","../src/components/calendar-types/single-date-calendar/SingleDateCalendar.tsx","../src/components/calendar-types/multi-date-calendar/UseMultiDateSelection.ts","../src/components/calendar-types/multi-date-calendar/MultiDateCalendar.tsx","../src/components/calendar-types/single-week-calendar/UseSingleWeekSelection.ts","../src/components/calendar-types/single-week-calendar/SingleWeekCalendar.tsx","../src/config/DefaultPopoverPlacement.ts","../src/features/internal-panel-state/UseCalendarPopoverUpdater.ts","../src/components/input-types/date-input/UseDateInput.tsx","../src/config/DefaultMaxDate.ts","../src/components/input-types/date-input/DateInput.tsx","../src/components/input-types/date-range-input/hooks/UseDateRangeInput.tsx","../src/components/input-types/date-range-input/DateRangeInput.tsx","../src/components/input-types/date-text-input/DateTextInput.tsx","../src/util/time/TimeStringFormatValidator.ts","../src/components/input-types/time-text-input/TimeTextInput.tsx","../src/features/dual-text-input/DualTextInput.tsx","../src/util/time/TimeTransformer.ts","../src/features/time-picker/TimePickerCell.tsx","../src/features/time-picker/TimePickerColumn.tsx","../src/features/time-picker/TimePicker.tsx","../src/components/input-types/date-time-input/hooks/UseDateRangeEffects.ts","../src/components/input-types/date-time-input/hooks/UseDateRangeHandlers.ts","../src/components/input-types/date-time-input/hooks/UseInputStates.ts","../src/components/input-types/date-time-input/hooks/UseUserInputHandlers.ts","../src/components/input-types/date-time-input/DateTimeInput.tsx","../src/features/year-picker/YearPickerCell.tsx","../src/features/year-picker/YearPicker.tsx","../src/components/input-types/date-range-dual-text-input/hooks/UseDateRangeEffects.ts","../src/components/input-types/date-range-dual-text-input/hooks/UseDateRangeHandlers.ts","../src/components/input-types/date-range-dual-text-input/hooks/UseInputStates.ts","../src/components/input-types/date-range-dual-text-input/hooks/UseUserInputHandlers.ts","../src/components/input-types/date-range-dual-text-input/DateRangeDualTextInput.tsx"],"sourcesContent":["export const DateFormats = {\n yearAndMonth: \"yyyy-MM\",\n fullDate: \"yyyy-MM-dd\",\n fullMonthName: \"LLLL\",\n fullDateAndTime: \"yyyy-MM-dd HH:mm\",\n fullDateAndTimeSystem: \"yyyy-MM-ddTHH:MM\",\n weekDayName: \"EEEE\", // Tuesday\n weekDayNameShort: \"EEE\", // Tue\n dateAndMonth: \"d MMM\", // 2 Jan\n monthAndDate: \"MMM do\", // Jan 2nd\n};\n","import {\n addDays,\n eachDayOfInterval,\n endOfMonth,\n format,\n getDate,\n getISOWeek,\n isAfter,\n isSameDay,\n max,\n min,\n startOfMonth,\n subDays,\n} from \"date-fns\";\nimport { last } from \"lodash-es\";\nimport {\n CalendarState,\n CalendarUserData,\n DayState,\n DayStateHighlight,\n StateForWeek,\n} from \"../../types/CalendarTypes\";\nimport { DateFormats } from \"../date/DateFormats\";\nimport { WeekData } from \"./CalendarDataFactory\";\n\nexport const buildDayStateForDateRange = (\n statePerMonth: CalendarUserData<DayState> = {},\n start?: Date,\n end?: Date\n): CalendarUserData<DayState> | undefined => {\n if (start && end && isAfter(end, start)) {\n return eachDayOfInterval({ start, end }).reduce(\n (result: CalendarUserData<DayState>, date: Date) => {\n const isFirstInRange = isSameDay(date, start);\n const isLastInRange = isSameDay(date, end);\n const highlights = isFirstInRange\n ? [\"selected\", \"selectedStart\", \"range\"]\n : isLastInRange\n ? [\"selected\", \"selectedEnd\", \"range\"]\n : [\"range\"];\n return addDayStateHighlights(result, date, highlights);\n },\n statePerMonth\n );\n }\n\n let state = statePerMonth;\n\n if (start) {\n state = addDayStateHighlights(state, start, [\"selected\", \"singleSelected\"]);\n }\n\n if (end) {\n state = addDayStateHighlights(state, end, [\"selected\", \"singleSelected\"]);\n }\n\n return state;\n};\n\nexport const buildDayStateForSingleMonth = (\n statePerMonth: CalendarUserData<DayState> = {},\n start: Date | undefined,\n end: Date | undefined,\n dateInFocus: Date\n): CalendarUserData<DayState> | undefined =>\n buildDayStateForRange(\n statePerMonth,\n start,\n end,\n startOfMonth(dateInFocus),\n endOfMonth(dateInFocus)\n );\n\nexport const buildDayStateForRange = (\n statePerMonth: CalendarUserData<DayState> = {},\n start: Date | undefined,\n end: Date | undefined,\n startLimit: Date,\n endLimit: Date\n): CalendarUserData<DayState> | undefined => {\n if (start && end) {\n return buildDayStateForDateRange(\n statePerMonth,\n max([start, subDays(startLimit, 1)]),\n min([end, addDays(endLimit, 1)])\n );\n } else {\n return buildDayStateForDateRange(statePerMonth, start, end);\n }\n};\n\nexport const setDayStateValue = (\n state: CalendarUserData<DayState> | undefined,\n date: Date,\n values: Partial<DayState>\n): CalendarUserData<DayState> => {\n const monthString = format(date, DateFormats.yearAndMonth);\n const weekNumber = getISOWeek(date);\n const dayInMonth = getDate(date);\n return {\n ...state,\n [monthString]: {\n ...(state && state[monthString]),\n [weekNumber]: {\n ...(state && state[monthString] && state[monthString][weekNumber]),\n [dayInMonth]: {\n ...(state &&\n state[monthString] &&\n state[monthString][weekNumber] &&\n state[monthString][weekNumber][dayInMonth]),\n ...values,\n },\n },\n },\n };\n};\n\nexport const setDayStateValueFunction = (\n state: CalendarUserData<DayState> | undefined,\n date: Date,\n setter: (dayState: DayState | undefined) => Partial<DayState>\n): CalendarUserData<DayState> => {\n const monthString = format(date, DateFormats.yearAndMonth);\n const weekNumber = getISOWeek(date);\n const dayInMonth = getDate(date);\n return {\n ...state,\n [monthString]: {\n ...(state && state[monthString]),\n [weekNumber]: {\n ...(state && state[monthString] && state[monthString][weekNumber]),\n [dayInMonth]: {\n ...(state &&\n state[monthString] &&\n state[monthString][weekNumber] &&\n state[monthString][weekNumber][dayInMonth]),\n ...setter(\n state &&\n state[monthString] &&\n state[monthString][weekNumber] &&\n state[monthString][weekNumber][dayInMonth]\n ),\n },\n },\n },\n };\n};\n\nexport const addDayStateHighlights = (\n calendarState: CalendarState | undefined,\n date: Date,\n highlights: Array<DayStateHighlight>\n): CalendarUserData<DayState> => {\n const month = date.getMonth() + 1;\n const monthString = `${date.getFullYear()}-${month < 10 ? \"0\" : \"\"}${month}`;\n const weekNumber = getISOWeek(date);\n const dayInMonth = getDate(date);\n const dayState: DayState | undefined =\n calendarState &&\n calendarState[monthString] &&\n calendarState[monthString][weekNumber] &&\n calendarState[monthString][weekNumber][dayInMonth];\n\n return {\n ...calendarState,\n [monthString]: {\n ...(calendarState && calendarState[monthString]),\n [weekNumber]: {\n ...(calendarState &&\n calendarState[monthString] &&\n calendarState[monthString][weekNumber]),\n [dayInMonth]: addDayStateHighlightsOnSingleDay(dayState, highlights),\n },\n },\n };\n};\n\nexport const addDayStateHighlightsOnSingleDay = (\n dayState: DayState | undefined,\n highlights: Array<DayStateHighlight>\n): DayState => {\n return {\n ...dayState,\n highlights: [...(dayState?.highlights ?? []), ...highlights],\n };\n};\n\nexport const addWeekStateHighlights = (\n calendarState: CalendarState | undefined,\n week: WeekData,\n highlights: Array<DayStateHighlight>\n): CalendarUserData<DayState> => {\n const date = week.days[0].date;\n const month = date.getMonth() + 1;\n const monthString = `${date.getFullYear()}-${month < 10 ? \"0\" : \"\"}${month}`;\n const weekNumber = week.weekNumber;\n\n let state = calendarState;\n week.days.forEach((day) => {\n state = addDayStateHighlights(state, day.date, highlights);\n });\n\n const weekState =\n state && state[monthString] ? state[monthString][weekNumber] : undefined;\n\n const newHighlights: Array<DayStateHighlight> =\n weekState && weekState.highlights\n ? [...weekState.highlights, ...highlights]\n : highlights;\n\n const newWeekState: StateForWeek = {\n ...weekState,\n highlights: newHighlights,\n };\n\n return {\n ...state,\n [monthString]: {\n ...(calendarState && calendarState[monthString]),\n [weekNumber]: newWeekState,\n },\n };\n};\n\nexport const addWeekRangeHighlights = (\n calendarState: CalendarState | undefined,\n week: WeekData\n): CalendarUserData<DayState> => {\n if (!week.days.length) {\n return { ...calendarState };\n }\n const startDate = week.days[0].date;\n const endDate = last(week.days)?.date;\n return {\n ...buildDayStateForDateRange(calendarState, startDate, endDate),\n };\n};\n","import { useMemo } from \"react\";\nimport { CalendarState } from \"../../types/CalendarTypes\";\nimport { addDayStateHighlights } from \"../../util/calendar/StateModifier\";\n\nexport const useHighlightToday = (\n enabled: boolean | undefined,\n statePerMonth: CalendarState | undefined\n) => {\n return useMemo(() => {\n return enabled\n ? addDayStateHighlights(statePerMonth, new Date(), [\"today\"])\n : statePerMonth;\n }, [enabled, statePerMonth]);\n};\n","import {\n addDays,\n addHours,\n addWeeks,\n eachDayOfInterval,\n endOfMonth,\n format,\n getDate,\n getISODay,\n getMonth,\n getWeek,\n getYear,\n isSameDay,\n Locale,\n startOfMonth,\n startOfWeek,\n} from \"date-fns\";\nimport { startCase } from \"lodash-es\";\nimport { DateFormats } from \"../date/DateFormats\";\n\nexport enum Month {\n JANUARY = 0,\n FEBRUARY,\n MARCH,\n APRIL,\n MAY,\n JUNE,\n JULY,\n AUGUST,\n SEPTEMBER,\n OCTOBER,\n NOVEMBER,\n DECEMBER,\n}\n\nexport enum WeekDay {\n SUNDAY = 0,\n MONDAY,\n TUESDAY,\n WEDNESDAY,\n THURSDAY,\n FRIDAY,\n SATURDAY,\n}\n\nexport interface DayData {\n name: string;\n date: Date; // YYYY-MM\n dateString: string; // YYYY-MM\n weekNumber: number;\n year: number; // 2018\n month: number; // 0-11\n dayOfMonth: number; // 1-31\n dayOfWeek: number; // 1-7\n isFirstDayOfWeek: boolean;\n isLastDayOfWeek: boolean;\n isFirstDayOfMonth: boolean;\n isLastDayOfMonth: boolean;\n}\n\nexport interface WeekData {\n weekNumber: number;\n startMonth: number;\n startYear: number;\n endMonth: number;\n endYear: number;\n isLastWeekOfMonth: boolean;\n days: Array<DayData>;\n}\n\nexport interface MonthData {\n monthString: string;\n name: string;\n year: number;\n monthInYear: number;\n weeks: Array<WeekData>;\n}\n\nexport const getMonthsInYear = (\n year: number,\n startMonth: number,\n numMonths: number,\n locale: Locale\n): Array<MonthData> => {\n const months = [];\n for (let i = 0; i < numMonths; i++) {\n months.push(getMonthInYear(year, startMonth + i, locale));\n }\n return months;\n};\n\nexport const getMonthInYear = (\n year: number,\n month: number,\n locale: Locale\n): MonthData => {\n const yearToUse = year + Math.floor(month / 12);\n const monthToUse = month % 12;\n const firstDayOfMonth = new Date(yearToUse, monthToUse, 1);\n return {\n monthString: format(firstDayOfMonth, DateFormats.yearAndMonth),\n name: startCase(\n format(firstDayOfMonth, DateFormats.fullMonthName, { locale })\n ),\n year: yearToUse,\n monthInYear: monthToUse,\n weeks: getWeeksForMonth(yearToUse, monthToUse, locale),\n };\n};\n\nexport const getWeeksForMonth = (\n year: number,\n month: number,\n locale: Locale,\n forceSixWeeks: boolean = true\n): Array<WeekData> => {\n const firstDayOfMonth = new Date(year, month, 1);\n const firstDayOfFirstWeek = startOfWeek(firstDayOfMonth, { locale });\n\n const weeks = [];\n\n for (let i = 0; i < 6; i++) {\n const week = getWeekForDate(addWeeks(firstDayOfFirstWeek, i), locale);\n if (i > 0 && week.startMonth !== month && !forceSixWeeks) {\n return weeks;\n }\n weeks.push(week);\n }\n return weeks;\n};\n\nexport const getWeekForDate = (\n firstDayOfWeek: Date,\n locale: Locale\n): WeekData => {\n const isLastWeekOfMonth =\n getMonth(addDays(firstDayOfWeek, 7)) !== getMonth(firstDayOfWeek);\n return {\n weekNumber: getWeek(firstDayOfWeek, { locale }),\n startMonth: getMonth(firstDayOfWeek),\n startYear: getYear(firstDayOfWeek),\n endMonth: getMonth(addDays(firstDayOfWeek, 6)),\n endYear: getYear(addDays(firstDayOfWeek, 6)),\n days: getDaysForWeekForDate(firstDayOfWeek, locale),\n isLastWeekOfMonth,\n };\n};\n\nexport const createDay = (date: Date, locale: Locale): DayData => {\n const dayOfWeek = getISODay(date);\n return {\n date,\n name: format(date, \"EEE\", locale ? { locale } : undefined),\n dateString: format(addHours(date, 12), DateFormats.fullDate),\n weekNumber: getWeek(date, { locale }),\n year: getYear(date),\n month: getMonth(date),\n dayOfMonth: getDate(date),\n dayOfWeek,\n isFirstDayOfWeek: dayOfWeek === 1,\n isLastDayOfWeek: dayOfWeek === 7,\n isFirstDayOfMonth: isSameDay(startOfMonth(date), date),\n isLastDayOfMonth: isSameDay(endOfMonth(date), date),\n };\n};\n\nexport const getDaysForWeekForDate = (\n firstDayOfWeek: Date,\n locale: Locale\n): Array<DayData> => {\n return eachDayOfInterval({\n start: firstDayOfWeek,\n end: addDays(firstDayOfWeek, 6),\n }).map((d) => createDay(d, locale));\n};\n\nexport const calculateOverflowingMonth = (\n year: number,\n month: number\n): { year: number; month: number } => {\n if (month > Month.DECEMBER) {\n return { year: year + Math.floor(month / 12), month: month % 12 };\n }\n if (month < Month.JANUARY) {\n return { year: year + Math.floor(month / 12), month: 12 + (month % 12) };\n }\n return { year, month };\n};\n","import { DayState, DayStateHighlight } from \"../../types/CalendarTypes\";\n\nexport const dayHasHighlight = (\n dayState: DayState | undefined,\n defaultHighlights: Array<DayStateHighlight> | undefined,\n highlight: string\n): boolean => {\n if (defaultHighlights && defaultHighlights.indexOf(highlight) >= 0) {\n return true;\n }\n if (\n dayState &&\n dayState.highlights &&\n dayState.highlights.indexOf(highlight) >= 0\n ) {\n return true;\n }\n return false;\n};\n\nexport const dayHighlightSelect = <T>(\n dayState: DayState | undefined,\n defaultHighlights: Array<DayStateHighlight> | undefined,\n highlightsOrBoolean: Array<string | boolean>,\n returnValues: Array<T>,\n fallbackValue?: T\n): T | undefined => {\n if (highlightsOrBoolean.length !== returnValues.length) {\n throw new Error(\n \"Select highlight failed, number of values do not equal number of highlights.\"\n );\n }\n if (highlightsOrBoolean.length === 0) {\n return fallbackValue;\n }\n for (let i = 0; i < highlightsOrBoolean.length; i++) {\n if (typeof highlightsOrBoolean[i] === \"boolean\" && highlightsOrBoolean[i]) {\n return returnValues[i];\n }\n if (\n typeof highlightsOrBoolean[i] === \"string\" &&\n dayHasHighlight(\n dayState,\n defaultHighlights,\n highlightsOrBoolean[i] as string\n )\n ) {\n return returnValues[i];\n }\n }\n return fallbackValue;\n};\n","import { IconDefinition } from \"@fortawesome/fontawesome-svg-core\";\nimport { TextProps } from \"@stenajs-webui/core\";\nimport { CSSProperties } from \"react\";\nimport { DayState, DayStateHighlight } from \"../../types/CalendarTypes\";\n\nimport {\n DayData,\n MonthData,\n WeekData,\n} from \"../../util/calendar/CalendarDataFactory\";\nimport { dayHighlightSelect } from \"../../util/calendar/StateHelper\";\n\nexport interface CalendarTheme<TUserData = unknown> {\n width: string;\n height: string;\n WeekNumber: WeekNumberTheme;\n WeekDay: WeekDayTheme;\n CalendarDay: CalendarDayTheme<TUserData>;\n CalendarMonth: CalendarMonthTheme;\n}\n\nexport interface WeekNumberTheme {\n backgroundColor: string;\n textColor?: string;\n clickableTextColor?: string;\n}\n\nexport interface CalendarMonthTheme {\n headerTextColor?: string;\n cellSpacing?: string;\n headerLeftIcon?: IconDefinition;\n headerRightIcon?: IconDefinition;\n}\n\nexport interface WeekDayTheme {\n textColor?: string;\n clickableTextColor?: string;\n}\n\nexport type CalendarStyleProvider<TUserData, TResult> = (\n defaultHighlights: Array<DayStateHighlight> | undefined,\n dayState: DayState | undefined,\n day: DayData,\n week: WeekData,\n month: MonthData,\n userData?: TUserData\n) => TResult;\n\nexport type CalendarWrapperStyleProvider<TUserData> = CalendarStyleProvider<\n TUserData,\n CSSProperties | undefined\n>;\n\ntype TextPropsProvider<TUserData> = CalendarStyleProvider<\n TUserData,\n TextProps | undefined\n>;\n\nexport interface CalendarDayTheme<TUserData> {\n tdStyle?: CalendarWrapperStyleProvider<TUserData>;\n innerWrapperStyle?: CalendarWrapperStyleProvider<TUserData>;\n cellWrapperStyle?: CalendarWrapperStyleProvider<TUserData>;\n textProps?: TextPropsProvider<TUserData>;\n}\n\nexport interface CalendarDefaultWrapperColors {\n selectedBackground: string;\n rangeBackground: string;\n todayBackground: string;\n borderColor?: string;\n borderRadius?: string;\n rangeBorderRadius?: string;\n}\n\nexport const defaultWrapperStyleProvider =\n ({\n selectedBackground,\n todayBackground,\n rangeBackground,\n borderColor = \"transparent\",\n }: CalendarDefaultWrapperColors): CalendarWrapperStyleProvider<unknown> =>\n (defaultHighlights, dayState, day, _, month) => {\n const backgroundColor = dayHighlightSelect(\n dayState,\n defaultHighlights,\n [\"selected\", \"range\", \"today\", day.month === month.monthInYear],\n [selectedBackground, rangeBackground, todayBackground, \"#fff\"],\n \"transparent\"\n );\n\n return {\n backgroundColor,\n borderWidth: \"1px\",\n borderStyle: \"solid\",\n borderColor: dayHighlightSelect(\n dayState,\n defaultHighlights,\n [\"selectedStart\", \"selectedEnd\", \"singleSelected\", \"range\", \"today\"],\n [\n \"var(--swui-calendar-wrapper-range-background)\",\n \"var(--swui-calendar-wrapper-range-background)\",\n \"var(--swui-calendar-wrapper-range-background)\",\n \"var(--swui-calendar-wrapper-range-border)\",\n \"var(--lhds-color-ui-500)\",\n ],\n borderColor\n ),\n borderTopLeftRadius: dayHighlightSelect(\n dayState,\n defaultHighlights,\n [\"selectedStart\", \"singleSelected\", \"today\"],\n [\n \"var(--swui-calendar-day-border-radius)\",\n \"var(--swui-calendar-day-border-radius)\",\n \"var(--swui-calendar-day-border-radius)\",\n ],\n \"unset\"\n ),\n borderBottomLeftRadius: dayHighlightSelect(\n dayState,\n defaultHighlights,\n [\"selectedStart\", \"singleSelected\", \"today\"],\n [\n \"var(--swui-calendar-day-border-radius)\",\n \"var(--swui-calendar-day-border-radius)\",\n \"var(--swui-calendar-day-border-radius)\",\n ],\n \"unset\"\n ),\n borderTopRightRadius: dayHighlightSelect(\n dayState,\n defaultHighlights,\n [\"selectedEnd\", \"singleSelected\", \"today\"],\n [\n \"var(--swui-calendar-day-border-radius)\",\n \"var(--swui-calendar-day-border-radius)\",\n \"var(--swui-calendar-day-border-radius)\",\n ],\n \"unset\"\n ),\n borderBottomRightRadius: dayHighlightSelect(\n dayState,\n defaultHighlights,\n [\"selectedEnd\", \"singleSelected\", \"today\"],\n [\n \"var(--swui-calendar-day-border-radius)\",\n \"var(--swui-calendar-day-border-radius)\",\n \"var(--swui-calendar-day-border-radius)\",\n ],\n \"unset\"\n ),\n boxSizing: \"border-box\",\n };\n };\n\ninterface DefaultTextColors {\n disabledColor: string;\n inOtherMonthColor: string;\n selectedColor: string;\n rangeTextColor?: string;\n}\n\nexport const defaultTextPropsProvider = ({\n selectedColor,\n disabledColor,\n inOtherMonthColor,\n rangeTextColor,\n}: DefaultTextColors): TextPropsProvider<unknown> => {\n return (defaultHighlights, dayState, day, _, month) => {\n const isOtherMonth = day.month !== month.monthInYear;\n const color = dayHighlightSelect(\n dayState,\n defaultHighlights,\n [isOtherMonth, \"selected\", \"range\", \"enabled\", \"disabled\"],\n [\n inOtherMonthColor,\n selectedColor,\n rangeTextColor,\n undefined,\n disabledColor,\n ]\n );\n return {\n color,\n };\n };\n};\n\nexport const defaultCalendarTheme: CalendarTheme = {\n width: \"var(--swui-calendar-day-width)\",\n height: \"var(--swui-calendar-day-height)\",\n WeekNumber: {\n backgroundColor: \"var(--swui-calendar-week-number-bg-color)\",\n textColor: \"var(--swui-calendar-week-number-text-color)\",\n clickableTextColor: \"var(--swui-calendar-week-number-clickable-text-color)\",\n },\n WeekDay: {\n textColor: \"var(--swui-calendar-week-day-text-color)\",\n clickableTextColor: \"var(--swui-calendar-week-day-clickable-text-color)\",\n },\n CalendarDay: {\n tdStyle: defaultWrapperStyleProvider({\n selectedBackground: \"var(--swui-calendar-wrapper-selected-background)\",\n rangeBackground: \"var(--swui-calendar-wrapper-range-background)\",\n todayBackground: \"var(--swui-calendar-wrapper-today-background)\",\n }),\n textProps: defaultTextPropsProvider({\n selectedColor: \"var(--swui-calendar-text-selected-color)\",\n disabledColor: \"var(--swui-calendar-text-disabled-color)\",\n inOtherMonthColor: \"var(--swui-calendar-text-in-other-month-color)\",\n }),\n },\n CalendarMonth: {\n headerTextColor: \"var(--swui-calendar-week-day-text-color)\",\n },\n};\n\nexport const extranetCalendarTheme: CalendarTheme = {\n ...defaultCalendarTheme,\n width: \"37px\",\n height: \"37px\",\n};\n","import { Box, Clickable, Text } from \"@stenajs-webui/core\";\nimport * as React from \"react\";\nimport { OnClickWeekDay } from \"../../../types/CalendarTypes\";\nimport { DayData } from \"../../../util/calendar/CalendarDataFactory\";\nimport { CalendarTheme } from \"../CalendarTheme\";\n\nexport interface WeekDayCellProps {\n onClickWeekDay?: OnClickWeekDay;\n day: DayData;\n theme: CalendarTheme;\n}\n\nexport const WeekDayCell = ({\n onClickWeekDay,\n day,\n theme,\n}: WeekDayCellProps) => {\n const content = (\n <Box\n width={theme.width}\n height={theme.height}\n justifyContent={\"center\"}\n alignItems={\"center\"}\n >\n <Text\n size={\"small\"}\n color={\n onClickWeekDay\n ? theme.WeekDay.clickableTextColor\n : theme.WeekDay.textColor\n }\n >\n {day.name}\n </Text>\n </Box>\n );\n\n if (onClickWeekDay) {\n return (\n <Clickable\n borderRadius={\"var(--swui-calendar-day-border-radius)\"}\n onClick={(ev) => onClickWeekDay(day.dayOfWeek, ev)}\n disableFocusHighlight={!onClickWeekDay}\n >\n {content}\n </Clickable>\n );\n }\n\n return content;\n};\n","import styled from \"@emotion/styled\";\nimport { Box, Text } from \"@stenajs-webui/core\";\nimport * as React from \"react\";\nimport {\n CalendarDayProps,\n DayState,\n DayStateHighlight,\n} from \"../../../types/CalendarTypes\";\nimport { dayHighlightSelect } from \"../../../util/calendar/StateHelper\";\n\nexport const CalendarDay = function CalendarDay<T>({\n day,\n week,\n month,\n dayState,\n userData,\n onClickDay,\n theme,\n extraDayContent: ExtraDayContent,\n defaultHighlights,\n}: CalendarDayProps<T>) {\n const content = (\n <Box\n width={\"100%\"}\n height={\"100%\"}\n justifyContent={\"center\"}\n alignItems={\"center\"}\n >\n <Text\n {...(theme.CalendarDay.textProps &&\n theme.CalendarDay.textProps(\n defaultHighlights,\n dayState,\n day,\n week,\n month,\n userData\n ))}\n >\n {day.dayOfMonth}\n </Text>\n </Box>\n );\n\n const WrapperTd = styled.td({\n ...(theme.CalendarDay.tdStyle &&\n theme.CalendarDay.tdStyle(\n defaultHighlights,\n dayState,\n day,\n week,\n month,\n userData\n )),\n });\n\n const InnerWrapperDiv = styled.div({\n ...(theme.CalendarDay.innerWrapperStyle &&\n theme.CalendarDay.innerWrapperStyle(\n defaultHighlights,\n dayState,\n day,\n week,\n month,\n userData\n )),\n width: \"100%\",\n height: \"100%\",\n });\n\n const CellWrapperDiv = styled.div({\n ...(theme.CalendarDay.cellWrapperStyle &&\n theme.CalendarDay.cellWrapperStyle(\n defaultHighlights,\n dayState,\n day,\n week,\n month,\n userData\n )),\n width: \"100%\",\n height: \"100%\",\n position: \"relative\",\n });\n\n const disabled = isDisabled(defaultHighlights, dayState);\n\n return (\n <WrapperTd\n onClick={disabled ? undefined : (ev) => onClickDay?.(day, userData, ev)}\n >\n <InnerWrapperDiv>\n <CellWrapperDiv>\n {day.month === month.monthInYear && (\n <>\n {ExtraDayContent && (\n <ExtraDayContent\n week={week}\n month={month}\n day={day}\n dayState={dayState}\n theme={theme}\n userData={userData}\n />\n )}\n {content}\n </>\n )}\n </CellWrapperDiv>\n </InnerWrapperDiv>\n </WrapperTd>\n );\n};\n\nconst isDisabled = (\n defaultHighlights: Array<DayStateHighlight> | undefined,\n dayState: DayState | undefined\n): boolean =>\n !!dayHighlightSelect<boolean>(\n dayState,\n defaultHighlights,\n [\"disabled\"],\n [true],\n false\n );\n","import { Box, Clickable, Text } from \"@stenajs-webui/core\";\nimport * as React from \"react\";\nimport { OnClickWeek } from \"../../../types/CalendarTypes\";\nimport { WeekData } from \"../../../util/calendar/CalendarDataFactory\";\nimport { CalendarTheme } from \"../CalendarTheme\";\n\nexport interface WeekNumberCellProps {\n week: WeekData;\n onClickWeek?: OnClickWeek;\n theme: CalendarTheme;\n background?: JSX.Element;\n prefix?: string;\n backgroundColor?: string;\n}\n\nexport const WeekNumberCell: React.FC<WeekNumberCellProps> = ({\n onClickWeek,\n theme,\n week,\n background,\n backgroundColor,\n prefix,\n}) => {\n const content = (\n <Box\n width={theme.width}\n height={theme.height}\n justifyContent={\"center\"}\n alignItems={\"center\"}\n >\n {background && <Box position={\"absolute\"}>{background}</Box>}\n <Box position={\"absolute\"}>\n <Text\n color={\n onClickWeek\n ? theme.WeekNumber.clickableTextColor\n : theme.WeekNumber.textColor\n }\n >\n {prefix}\n {week.weekNumber}\n </Text>\n </Box>\n </Box>\n );\n return (\n <Box\n background={backgroundColor || theme.WeekNumber.backgroundColor}\n position={\"relative\"}\n >\n {onClickWeek ? (\n <Clickable\n borderRadius={\"var(--swui-calendar-day-border-radius)\"}\n onClick={(ev) => onClickWeek(week, ev)}\n disableFocusHighlight={!onClickWeek}\n >\n {content}\n </Clickable>\n ) : (\n content\n )}\n </Box>\n );\n};\n","import { isAfter, isBefore, isSameDay } from \"date-fns\";\n\nexport const isDateInMinMaxRange = (\n date: Date,\n min: Date | undefined,\n max: Date | undefined\n): boolean => {\n if (min && isBefore(date, min)) {\n return isSameDay(date, min);\n }\n if (max && isAfter(date, max)) {\n return isSameDay(date, max);\n }\n return true;\n};\n","import * as React from \"react\";\nimport { useMemo } from \"react\";\nimport {\n CalendarDayProps,\n OptionalMinMaxDates,\n} from \"../../types/CalendarTypes\";\nimport { addDayStateHighlightsOnSingleDay } from \"../../util/calendar/StateModifier\";\nimport { isDateInMinMaxRange } from \"../../util/date/DateMinMaxValidator\";\n\ninterface DisabledDayWrapperProps<T>\n extends CalendarDayProps<T>,\n OptionalMinMaxDates {\n dayComponent: React.ComponentType<CalendarDayProps<T>>;\n}\n\nexport const DisabledDayWrapper = function DisabledDayWrapper<T>({\n dayComponent: DayComponent,\n minDate,\n maxDate,\n dayState,\n day,\n ...props\n}: DisabledDayWrapperProps<T>) {\n const activeDayState = useMemo(\n () =>\n !isDateInMinMaxRange(day.date, minDate, maxDate)\n ? addDayStateHighlightsOnSingleDay(dayState, [\"disabled\"])\n : dayState,\n [day.date, dayState, maxDate, minDate]\n );\n\n return <DayComponent day={day} {...props} dayState={activeDayState} />;\n};\n","import { Box, Row, Text } from \"@stenajs-webui/core\";\nimport * as React from \"react\";\nimport {\n CalendarDayProps,\n CalendarOnClicks,\n CalendarUserMonthData,\n DayState,\n DayStateHighlight,\n ExtraDayContentProps,\n OptionalMinMaxDates,\n Renderers,\n} from \"../../types/CalendarTypes\";\nimport {\n DayData,\n MonthData,\n WeekData,\n} from \"../../util/calendar/CalendarDataFactory\";\nimport { CalendarTheme, defaultCalendarTheme } from \"./CalendarTheme\";\nimport { WeekDayCell } from \"./renderers/WeekDayCell\";\nimport { CalendarDay } from \"./renderers/CalendarDay\";\nimport { FlatButton, stenaAngleDown } from \"@stenajs-webui/elements\";\nimport { WeekNumberCell } from \"./renderers/WeekNumberCell\";\nimport { DisabledDayWrapper } from \"./DisabledDayWrapper\";\n\nexport interface CalendarMonthProps<T>\n extends CalendarOnClicks<T>,\n Renderers,\n OptionalMinMaxDates {\n month: MonthData;\n dayComponent?: React.ComponentType<CalendarDayProps<T>>;\n userDataPerWeek?: CalendarUserMonthData<T>;\n statePerWeek?: CalendarUserMonthData<DayState>;\n theme?: CalendarTheme;\n headerRightContent?: React.ReactElement<{}>;\n extraDayContent?: React.ComponentType<ExtraDayContentProps<T>>;\n defaultHighlights?: Array<DayStateHighlight>;\n showWeekNumber: boolean;\n}\n\nexport function CalendarMonth<T>({\n month,\n dayComponent = CalendarDay,\n statePerWeek,\n userDataPerWeek,\n minDate,\n maxDate,\n onClickDay,\n onClickWeek,\n onClickWeekDay,\n onClickMonth,\n renderWeekNumber,\n renderWeekDay,\n headerRightContent,\n theme = defaultCalendarTheme,\n extraDayContent,\n defaultHighlights,\n showWeekNumber,\n}: CalendarMonthProps<T>) {\n return (\n <>\n <Box alignItems={\"stretch\"}>\n <Row\n justifyContent={headerRightContent ? \"space-between\" : \"center\"}\n alignItems={\"center\"}\n >\n <Row justifyContent={\"center\"} alignItems={\"center\"}>\n {onClickMonth ? (\n <FlatButton\n onClick={() => onClickMonth(month)}\n label={month.name + \" \" + String(month.year)}\n rightIcon={stenaAngleDown}\n />\n ) : (\n <Text whiteSpace={\"nowrap\"}>\n {month.name} {month.year}\n </Text>\n )}\n </Row>\n\n {headerRightContent && (\n <Box alignItems={\"center\"}>{headerRightContent}</Box>\n )}\n </Row>\n\n <table>\n <tbody>\n <tr>\n {showWeekNumber && (\n <td>\n <Box width={theme.width} height={theme.height} />\n </td>\n )}\n {month.weeks[0].days.map((day: DayData) => (\n <td key={day.name}>\n {renderWeekDay ? (\n renderWeekDay(day.name, theme, onClickWeekDay)\n ) : (\n <WeekDayCell\n day={day}\n onClickWeekDay={onClickWeekDay}\n theme={theme}\n />\n )}\n </td>\n ))}\n </tr>\n {month.weeks.map((week: WeekData) => (\n <>\n <tr key={week.weekNumber}>\n {showWeekNumber && (\n <td>\n {renderWeekNumber ? (\n renderWeekNumber(week, theme, onClickWeek)\n ) : (\n <WeekNumberCell\n week={week}\n onClickWeek={onClickWeek}\n theme={theme}\n />\n )}\n </td>\n )}\n {week.days.map((day) => (\n <DisabledDayWrapper\n dayComponent={dayComponent}\n key={day.dateString}\n day={day}\n week={week}\n month={month}\n dayState={\n statePerWeek &&\n statePerWeek[week.weekNumber] &&\n statePerWeek[week.weekNumber][day.dayOfMonth]\n }\n userData={\n userDataPerWeek &&\n userDataPerWeek[week.weekNumber] &&\n userDataPerWeek[week.weekNumber][day.dayOfMonth]\n }\n onClickDay={onClickDay}\n theme={theme}\n extraDayContent={extraDayContent}\n defaultHighlights={defaultHighlights}\n minDate={minDate}\n maxDate={maxDate}\n />\n ))}\n </tr>\n </>\n ))}\n </tbody>\n </table>\n </Box>\n </>\n );\n}\n","import { Row, Spacing } from \"@stenajs-webui/core\";\nimport { getMonth, getYear, Locale, parse } from \"date-fns\";\nimport { enGB } from \"date-fns/locale\";\nimport { chunk } from \"lodash-es\";\nimport * as React from \"react\";\nimport { useMemo } from \"react\";\nimport { useHighlightToday } from \"../../features/today-state/UseHighlightToday\";\nimport {\n CalendarOnClicks,\n CalendarProps,\n CalendarUserData,\n DayState,\n Renderers,\n} from \"../../types/CalendarTypes\";\nimport {\n calculateOverflowingMonth,\n getMonthInYear,\n getMonthsInYear,\n MonthData,\n} from \"../../util/calendar/CalendarDataFactory\";\nimport cx from \"classnames\";\nimport styles from \"./Calendar.module.css\";\n\nimport { CalendarMonth } from \"./CalendarMonth\";\nimport { CalendarTheme, defaultCalendarTheme } from \"./CalendarTheme\";\nimport { CalendarDay } from \"./renderers/CalendarDay\";\n\ninterface CalendarPanelProps<T>\n extends CalendarProps<T>,\n CalendarOnClicks<T>,\n Renderers {\n year: number;\n month: number;\n monthRows: Array<Array<MonthData>>;\n userDataPerMonth?: CalendarUserData<T>;\n statePerMonth?: CalendarUserData<DayState>;\n width?: string;\n height?: string;\n theme?: CalendarTheme;\n}\n\nfunction CalendarPanel<T>({\n monthRows,\n dayComponent = CalendarDay,\n userDataPerMonth,\n statePerMonth,\n minDate,\n maxDate,\n onClickDay,\n onClickWeekDay,\n onClickWeek,\n onClickMonth,\n renderWeekDay,\n renderWeekNumber,\n headerRightContent,\n extraDayContent,\n defaultHighlights,\n showWeekNumber,\n theme = defaultCalendarTheme,\n}: CalendarPanelProps<T>) {\n const minDateObj = useMemo(\n () => (minDate ? parse(minDate, \"yyyy-MM-dd\", new Date()) : undefined),\n [minDate]\n );\n\n const maxDateObj = useMemo(\n () => (maxDate ? parse(maxDate, \"yyyy-MM-dd\", new Date()) : undefined),\n [maxDate]\n );\n\n return (\n <div\n className={cx(\n styles.calendar,\n showWeekNumber && styles.weekNumberVisible\n )}\n >\n {monthRows.map((monthRow, rowIndex) => (\n <Spacing key={rowIndex}>\n <Row gap={2}>\n {monthRow.map((month) => (\n <CalendarMonth<T>\n key={month.name}\n month={month}\n dayComponent={dayComponent}\n userDataPerWeek={\n userDataPerMonth && userDataPerMonth[month.monthString]\n }\n statePerWeek={statePerMonth && statePerMonth[month.monthString]}\n onClickDay={onClickDay}\n onClickWeekDay={onClickWeekDay}\n onClickWeek={onClickWeek}\n onClickMonth={onClickMonth}\n theme={theme}\n renderWeekNumber={renderWeekNumber}\n renderWeekDay={renderWeekDay}\n headerRightContent={headerRightContent}\n extraDayContent={extraDayContent}\n defaultHighlights={defaultHighlights}\n minDate={minDateObj}\n maxDate={maxDateObj}\n showWeekNumber={showWeekNumber ?? false}\n />\n ))}\n </Row>\n </Spacing>\n ))}\n </div>\n );\n}\n\nexport function Calendar<T>(props: CalendarProps<T>) {\n const initialDate = getInitialDate(props.year, props.month, props.date);\n const { year, month } = calculateOverflowingMonth(\n initialDate.year,\n initialDate.month\n );\n const monthRows = getMonthRows(\n year,\n month,\n props.locale ?? enGB,\n props.numMonths,\n props.monthsPerRow\n );\n\n const statePerMonth = useHighlightToday(\n props.highlightToday,\n props.statePerMonth\n );\n\n return (\n <CalendarPanel<T>\n year={year}\n month={month}\n monthRows={monthRows}\n {...props}\n statePerMonth={statePerMonth}\n />\n );\n}\n\nconst getInitialDate = (year?: number, month?: number, date?: Date) => {\n if (month && year) {\n return {\n month,\n year,\n };\n }\n if (date) {\n return {\n month: getMonth(date),\n year: getYear(date),\n };\n }\n const now = new Date();\n return {\n month: getMonth(now),\n year: getYear(now),\n };\n};\n\nconst getMonthRows = (\n year: number,\n month: number,\n locale: Locale,\n numMonths?: number,\n monthsPerRow?: number\n): Array<Array<MonthData>> => {\n if (numMonths == null) {\n return [[getMonthInYear(year, month, locale)]];\n }\n if (monthsPerRow == null) {\n return [getMonthsInYear(year, month, numMonths, locale)];\n }\n return chunk(getMonthsInYear(year, month, numMonths, locale), monthsPerRow);\n};\n","import { startCase } from \"lodash-es\";\nimport * as React from \"react\";\nimport { useMemo } from \"react\";\nimport { Row } from \"@stenajs-webui/core\";\nimport { FlatButton, PrimaryButton } from \"@stenajs-webui/elements\";\nimport { format, Locale } from \"date-fns\";\nimport { Month } from \"../../util/calendar/CalendarDataFactory\";\n\ninterface MonthPickerCellProps {\n year: number;\n month: Month;\n onClick: () => void;\n selected: boolean;\n locale: Locale;\n}\n\nexport const MonthPickerCell: React.FC<MonthPickerCellProps> = ({\n month,\n year,\n onClick,\n selected,\n locale,\n}) => {\n const label = useMemo(() => {\n const now = new Date(year, month, 1);\n return startCase(format(now, \"MMM\", { locale }));\n }, [locale, year, month]);\n\n return (\n <Row justifyContent={\"center\"}>\n {selected ? (\n <PrimaryButton label={label} onClick={onClick} />\n ) : (\n <FlatButton label={label} onClick={onClick} />\n )}\n </Row>\n );\n};\n","import { enGB } from \"date-fns/locale\";\nimport * as React from \"react\";\nimport { Month } from \"../../util/calendar/CalendarDataFactory\";\nimport { ValueAndOnValueChangeProps } from \"@stenajs-webui/forms\";\nimport { Column, Heading, Row } from \"@stenajs-webui/core\";\nimport { MonthPickerCell } from \"./MonthPickerCell\";\nimport { Locale } from \"date-fns\";\n\nexport interface MonthPickerValue {\n month: Month;\n year: number;\n}\n\nexport interface MonthPickerProps\n extends ValueAndOnValueChangeProps<MonthPickerValue> {\n locale?: Locale;\n firstMonth: Date;\n numMonths: number;\n}\n\nexport const MonthPicker: React.FC<MonthPickerProps> = ({\n value,\n onValueChange,\n locale = enGB,\n firstMonth,\n numMonths,\n}) => {\n const input = createMonths(firstMonth, numMonths);\n\n return (\n <Column gap={1} maxWidth={\"336px\"}>\n {input.years.map(({ year, months }) => (\n <>\n <Heading variant={\"h4\"}>{year}</Heading>\n <Row gap={1} flexWrap={\"wrap\"}>\n {months.map((month) => (\n <MonthPickerCell\n key={month}\n month={month}\n year={year}\n locale={locale}\n selected={value?.month === month && value?.year === year}\n onClick={() => onValueChange?.({ month, year })}\n />\n ))}\n </Row>\n </>\n ))}\n </Column>\n );\n};\n\ninterface MonthInput {\n years: Array<YearInput>;\n}\n\ninterface YearInput {\n year: number;\n months: Array<Month>;\n}\n\nconst createMonths = (firstMonth: Date, numMonths: number): MonthInput => {\n let currentYear = firstMonth.getFullYear();\n let currentMonth = firstMonth.getMonth();\n\n const input: MonthInput = {\n years: [{ year: currentYear, months: [currentMonth] }],\n };\n\n for (let i = 1; i < numMonths; i++) {\n if (currentMonth === Month.DECEMBER) {\n currentYear++;\n currentMonth = 0;\n input.years.push({ year: currentYear, months: [currentMonth] });\n } else {\n currentMonth++;\n input.years[input.years.length - 1].months.push(currentMonth);\n }\n }\n\n return input;\n};\n\nexport const createFirstDate = (date: Date): MonthPickerValue => {\n return {\n year: date.getFullYear(),\n month: date.getMonth(),\n };\n};\n","import { PresetPage } from \"./CalendarPreset\";\nimport { addDays, subDays } from \"date-fns\";\n\nexport const createStandardDateRangePresets = (\n now: Date\n): Array<PresetPage> => [\n {\n label: \"Past\",\n presets: [\n { label: \"Last 3 days\", startDate: now, endDate: subDays(now, 2) },\n { label: \"Last 7 days\", startDate: now, endDate: subDays(now, 6) },\n { label: \"Last 30 days\", startDate: now, endDate: subDays(now, 29) },\n { label: \"Last 45 days\", startDate: now, endDate: subDays(now, 44) },\n ],\n },\n {\n label: \"Future\",\n presets: [\n { label: \"Next 3 days\", startDate: now, endDate: addDays(now, 2) },\n { label: \"Next 7 days\", startDate: now, endDate: addDays(now, 6) },\n { label: \"Next 30 days\", startDate: now, endDate: addDays(now, 29) },\n { label: \"Next 45 days\", startDate: now, endDate: addDays(now, 44) },\n ],\n },\n];\n","import * as React from \"react\";\nimport { useMemo, useState } from \"react\";\nimport { createStandardDateRangePresets } from \"./PresetFactory\";\nimport { Column, Row, Space, Text } from \"@stenajs-webui/core\";\nimport {\n FlatButton,\n PrimaryButton,\n stenaAngleLeft,\n stenaAngleRight,\n} from \"@stenajs-webui/elements\";\nimport { CalendarPreset } from \"./CalendarPreset\";\n\nexport interface PresetPickerProps {\n onClickPreset: (preset: CalendarPreset) => void;\n}\n\nexport const PresetPicker: React.FC<PresetPickerProps> = ({\n onClickPreset,\n}) => {\n const [pageIndex, setPageIndex] = useState(0);\n const pages = useMemo(() => createStandardDateRangePresets(new Date()), []);\n\n const currentPage = pages[pageIndex] ?? pages[0];\n\n return (\n <Column>\n <Row\n justifyContent={\"space-between\"}\n alignItems={\"center\"}\n width={\"200px\"}\n >\n <FlatButton\n size={\"small\"}\n leftIcon={stenaAngleLeft}\n disabled={pageIndex === 0}\n onClick={() => setPageIndex(pageIndex - 1)}\n />\n <Text>{currentPage.label}</Text>\n <FlatButton\n size={\"small\"}\n leftIcon={stenaAngleRight}\n disabled={pageIndex === pages.length - 1}\n onClick={() => setPageIndex(pageIndex + 1)}\n />\n </Row>\n <Space />\n <Column alignItems={\"center\"}>\n {currentPage.presets.map((preset) => (\n <React.Fragment key={preset.label}>\n <PrimaryButton\n label={preset.label}\n onClick={() => onClickPreset(preset)}\n />\n <Space />\n </React.Fragment>\n ))}\n </Column>\n </Column>\n );\n};\n","import { Box } from \"@stenajs-webui/core\";\nimport { PrimaryButton } from \"@stenajs-webui/elements\";\nimport * as React from \"react\";\nimport { ReactNode, useCallback } from \"react\";\nimport { Calendar } from \"../../components/calendar/Calendar\";\nimport {\n CalendarProps,\n RenderMonthPickerArgs,\n} from \"../../types/CalendarTypes\";\nimport {\n createFirstDate,\n MonthPicker,\n MonthPickerValue,\n} from \"../month-picker/MonthPicker\";\nimport { CalendarPreset } from \"../preset-picker/CalendarPreset\";\nimport { PresetPicker } from \"../preset-picker/PresetPicker\";\nimport { CalendarPanelType } from \"./CalendarPanelType\";\n\ninterface CalendarWithMonthYearPickersProps<T>\n extends Omit<CalendarProps<T>, \"date\" | \"year\" | \"month\"> {\n dateInFocus: Date;\n setDateInFocus: (dateInFocus: Date) => void;\n currentPanel: CalendarPanelType;\n setCurrentPanel: (currentPanel: CalendarPanelType) => void;\n onSelectPreset: (preset: CalendarPreset) => void;\n renderMonthPicker?: (args: RenderMonthPickerArgs) => ReactNode;\n}\n\nexport const CalendarWithMonthYearPickers =\n function CalendarWithMonthYearPickers<T>({\n locale,\n dateInFocus,\n setDateInFocus,\n currentPanel,\n setCurrentPanel,\n renderMonthPicker,\n ...props\n }: CalendarWithMonthYearPickersProps<T>) {\n const onChangeSelectedMonth = useCallback(\n (selectedMonth: MonthPickerValue) => {\n const newDate = dateInFocus ? new Date(dateInFocus) : new Date();\n newDate.setMonth(selectedMonth.month);\n newDate.setFullYear(selectedMonth.year);\n if (setDateInFocus) {\n setDateInFocus(newDate);\n }\n setCurrentPanel(\"calendar\");\n },\n [dateInFocus, setDateInFocus, setCurrentPanel]\n );\n\n const onClickMonth = useCallback(() => {\n setCurrentPanel(\"month\");\n }, [setCurrentPanel]);\n\n switch (currentPanel) {\n case \"calendar\":\n return (\n <Calendar<T>\n {...props}\n date={dateInFocus}\n onClickMonth={onClickMonth}\n locale={locale}\n />\n );\n case \"month\":\n return renderMonthPicker ? (\n renderMonthPicker({\n value: createFirstDate(dateInFocus),\n onValueChange: onChangeSelectedMonth,\n locale: locale,\n firstMonth: new Date(),\n numMonths: 24,\n dateInFocus,\n })\n ) : (\n <MonthPicker\n value={createFirstDate(dateInFocus)}\n onValueChange={onChangeSelectedMonth}\n locale={locale}\n firstMonth={new Date()}\n numMonths={24}\n />\n );\n case \"presets\":\n return <PresetPicker onClickPreset={() => {}} />;\n\n default:\n return (\n <Box>\n <PrimaryButton\n label={\"Show calendar\"}\n onClick={() => setCurrentPanel(\"calendar\")}\n />\n </Box>\n );\n }\n };\n","import { addMonths, addYears, subMonths, subYears } from \"date-fns\";\nimport { useCallback } from \"react\";\n\nexport const useSelectedMonthStepperLogic = (\n dateInFocus: Date,\n setDateInFocus?: (dateInFocus: Date) => void,\n monthsPerRow?: number,\n numMonths?: number\n) => {\n const nextMonth = useCallback(() => {\n const d = addMonths(dateInFocus, monthsPerRow ?? numMonths ?? 1);\n setDateInFocus?.(d);\n }, [setDateInFocus, dateInFocus, monthsPerRow, numMonths]);\n\n const nextYear = useCallback(() => {\n const d = addYears(dateInFocus, 1);\n setDateInFocus?.(d);\n }, [setDateInFocus, dateInFocus]);\n\n const prevMonth = useCallback(() => {\n const d = subMonths(dateInFocus, monthsPerRow ?? numMonths ?? 1);\n setDateInFocus?.(d);\n }, [setDateInFocus, dateInFocus, monthsPerRow, numMonths]);\n\n const prevYear = useCallback(() => {\n const d = subYears(dateInFocus, 1);\n setDateInFocus?.(d);\n }, [setDateInFocus, dateInFocus]);\n\n return {\n nextMonth,\n prevMonth,\n nextYear,\n prevYear,\n };\n};\n","import { Indent, Row, Space } from \"@stenajs-webui/core\";\nimport {\n SecondaryButton,\n stenaAngleLeftDouble,\n stenaAngleRightDouble,\n stenaArrowLeft,\n stenaArrowRight,\n} from \"@stenajs-webui/elements\";\nimport * as React from \"react\";\nimport { ReactNode } from \"react\";\nimport { CalendarTheme } from \"../../components/calendar/CalendarTheme\";\n\nexport interface WithMonthSwitcherBelowProps {\n theme: CalendarTheme;\n nextMonth: () => void;\n prevMonth: () => void;\n nextYear: () => void;\n prevYear: () => void;\n children?: ReactNode;\n}\n\nexport const WithMonthSwitcherBelow: React.FC<WithMonthSwitcherBelowProps> = ({\n children,\n prevMonth,\n nextMonth,\n prevYear,\n nextYear,\n}) => (\n <div>\n {children}\n <Indent>\n <Row gap={1}>\n <SecondaryButton onClick={prevYear} leftIcon={stenaAngleLeftDouble} />\n <SecondaryButton onClick={prevMonth} leftIcon={stenaArrowLeft} />\n <Indent num={2} />\n <SecondaryButton onClick={nextMonth} leftIcon={stenaArrowRight} />\n <SecondaryButton onClick={nextYear} leftIcon={stenaAngleRightDouble} />\n </Row>\n </Indent>\n <Space />\n </div>\n);\n","import { Column, Row } from \"@stenajs-webui/core\";\nimport {\n SecondaryButton,\n stenaArrowLeft,\n stenaArrowRight,\n} from \"@stenajs-webui/elements\";\nimport * as React from \"react\";\nimport { Calendar } from \"../../components/calendar/Calendar\";\nimport { defaultCalendarTheme } from \"../../components/calendar/CalendarTheme\";\nimport {\n CalendarProps,\n RenderMonthPickerArgs,\n} from \"../../types/CalendarTypes\";\nimport { CalendarPanelType } from \"../calendar-with-month-year-pickers/CalendarPanelType\";\nimport { CalendarWithMonthYearPickers } from \"../calendar-with-month-year-pickers/CalendarWithMonthYearPickers\";\nimport { CalendarPreset } from \"../preset-picker/CalendarPreset\";\nimport { useSelectedMonthStepperLogic } from \"./hooks/UseSelectedMonthStepperLogic\";\nimport { WithMonthSwitcherBelow } from \"./MonthSwitcherBelow\";\nimport { ReactNode } from \"react\";\n\nexport type MonthSwitcherPlacement = \"header\" | \"below\";\n\nexport interface CalendarWithMonthSwitcherProps<T> extends CalendarProps<T> {\n monthSwitcherPlacement?: MonthSwitcherPlacement;\n dateInFocus: Date;\n setDateInFocus: (dateInFocus: Date) => void;\n currentPanel: CalendarPanelType;\n setCurrentPanel: (currentPanel: CalendarPanelType) => void;\n onSelectPreset?: (preset: CalendarPreset) => void;\n renderMonthPicker?: (args: RenderMonthPickerArgs) => ReactNode;\n}\n\nconst noop = () => {};\n\nexport function CalendarWithMonthSwitcher<T>({\n monthSwitcherPlacement,\n theme = defaultCalendarTheme,\n dateInFocus,\n setDateInFocus,\n currentPanel,\n setCurrentPanel,\n onSelectPreset = noop,\n renderMonthPicker,\n ...calendarProps\n}: CalendarWithMonthSwitcherProps<T>) {\n const { nextMonth, prevMonth, nextYear, prevYear } =\n useSelectedMonthStepperLogic(\n dateInFocus,\n setDateInFocus,\n calendarProps.monthsPerRow,\n calendarProps.numMonths\n );\n\n const placement = fallbackIfNoPlacement(\n monthSwitcherPlacement,\n calendarProps.numMonths\n );\n\n switch (placement) {\n case \"below\": {\n return (\n <WithMonthSwitcherBelow\n theme={theme}\n nextMonth={nextMonth}\n prevMonth={prevMonth}\n nextYear={nextYear}\n prevYear={prevYear}\n >\n <Calendar<T> {...calendarProps} theme={theme} date={dateInFocus} />\n </WithMonthSwitcherBelow>\n );\n }\n case \"header\": {\n return (\n <Column>\n <CalendarWithMonthYearPickers<T>\n {...calendarProps}\n theme={theme}\n renderMonthPicker={renderMonthPicker}\n dateInFocus={dateInFocus}\n setDateInFocus={setDateInFocus}\n currentPanel={currentPanel}\n setCurrentPanel={setCurrentPanel}\n onSelectPreset={onSelectPreset}\n headerRightContent={\n <Row alignItems={\"center\"} gap={1}>\n <SecondaryButton\n onClick={prevMonth}\n leftIcon={stenaArrowLeft}\n />\n <SecondaryButton\n onClick={nextMonth}\n leftIcon={stenaArrowRight}\n />\n </Row>\n }\n />\n </Column>\n );\n }\n default: {\n return (\n <Calendar<T> {...calendarProps} theme={theme} date={dateInFocus} />\n );\n }\n }\n}\n\nconst fallbackIfNoPlacement = (\n monthSwitcherPlacement: MonthSwitcherPlacement | undefined,\n numMonths: number | undefined\n): MonthSwitcherPlacement => {\n return monthSwitcherPlacement || (numMonths || 1) > 1 ? \"below\" : \"header\";\n};\n","import { DateRange, DateStringRange } from \"../../types/DateRange\";\nimport { format, parse } from \"date-fns\";\n\nexport const dateRangeToStrings = (dateRange: DateRange): DateStringRange => ({\n startDate: dateRange.startDate\n ? format(dateRange.startDate, \"yyyy-MM-dd\")\n : undefined,\n endDate: dateRange.endDate\n ? format(dateRange.endDate, \"yyyy-MM-dd\")\n : undefined,\n});\n\nexport const stringsToDateRange = ({\n startDate,\n endDate,\n}: DateStringRange): DateRange => {\n const now = new Date();\n return {\n startDate: startDate ? parse(startDate, \"yyyy-MM-dd\", now) : undefined,\n endDate: endDate ? parse(endDate, \"yyyy-MM-dd\", now) : undefined,\n };\n};\n","import { isAfter, isSameDay } from \"date-fns\";\nimport { DateRange, DateStringRange } from \"../../types/DateRange\";\nimport { dateRangeToStrings, stringsToDateRange } from \"./DateRangeTransformer\";\n\nexport const isDateRangeInvalid = ({\n startDate,\n endDate,\n}: DateRange): boolean =>\n Boolean(\n startDate &&\n endDate &&\n !isSameDay(startDate, endDate) &&\n isAfter(startDate, endDate)\n );\n\nexport const toggleDatesIfEndIsEarlierThanStart = (\n dateRange: DateRange\n): DateRange => {\n if (isDateRangeInvalid(dateRange)) {\n return {\n startDate: dateRange.endDate,\n endDate: dateRange.startDate,\n };\n }\n return dateRange;\n};\n\nexport const toggleDateStringsIfEndIsEarlierThanStart = (\n dateRange: DateStringRange\n): DateStringRange => {\n if (dateRange.startDate && dateRange.endDate) {\n return dateRangeToStrings(\n toggleDatesIfEndIsEarlierThanStart(stringsToDateRange(dateRange))\n );\n }\n return dateRange;\n};\n","import { useCallback } from \"react\";\nimport { DateRangeFocusedInput } from \"../../../components/calendar-types/date-range-calendar/DateRangeCalendar\";\nimport { OnClickDay } from \"../../../types/CalendarTypes\";\nimport { DayData } from \"../../../util/calendar/CalendarDataFactory\";\nimport {\n isDateRangeInvalid,\n toggleDatesIfEndIsEarlierThanStart,\n} from \"../../../util/date-range/DateRangeValidator\";\nimport { DateRange } from \"../../../types/DateRange\";\n\nexport const useDateRangeOnClickDayHandler = <T>(\n value: DateRange | undefined,\n onValueChange: ((dateRange: DateRange) => void) | undefined,\n focusedInput: DateRangeFocusedInput,\n setFocusedInput: (focusedInput: DateRangeFocusedInput) => void\n): OnClickDay<T> => {\n return useCallback(\n (day: DayData) => {\n const dateRange = {\n startDate: focusedInput === \"startDate\" ? day.date : value?.startDate,\n endDate: focusedInput === \"endDate\" ? day.date : value?.endDate,\n };\n\n if (!isDateRangeInvalid(dateRange)) {\n setFocusedInput(focusedInput === \"startDate\" ? \"endDate\" : \"startDate\");\n }\n onValueChange?.(toggleDatesIfEndIsEarlierThanStart(dateRange));\n },\n [\n focusedInput,\n onValueChange,\n setFocusedInput,\n value?.endDate,\n value?.startDate,\n ]\n );\n};\n","import { CalendarPanelType } from \"../calendar-with-month-year-pickers/CalendarPanelType\";\nimport { useCallback, useState } from \"react\";\n\nexport type OnChangePanel = (panel: CalendarPanelType) => void;\n\nexport interface UseInternalPanelStateProps {\n onChangePanel?: OnChangePanel;\n}\n\nexport const useInternalPanelState = (\n onChangePanel: OnChangePanel | undefined\n) => {\n const [currentPanel, _setCurrentPanel] =\n useState<CalendarPanelType>(\"calendar\");\n\n const setCurrentPanel = useCallback(\n (currentPanel: CalendarPanelType) => {\n _setCurrentPanel(currentPanel);\n onChangePanel?.(currentPanel);\n },\n [onChangePanel]\n );\n\n return {\n currentPanel,\n setCurrentPanel,\n };\n};\n","import { useMemo, useState } from \"react\";\nimport { useDateRangeOnClickDayHandler } from \"../../../../features/date-range/hooks/UseDateRangeOnClickDayHandler\";\nimport { DateRangeCalendarProps } from \"../DateRangeCalendar\";\nimport { CalendarWithMonthSwitcherProps } from \"../../../../features/month-switcher/CalendarWithMonthSwitcher\";\nimport { buildDayStateForDateRange } from \"../../../../util/calendar/StateModifier\";\nimport { useInternalPanelState } from \"../../../../features/internal-panel-state/UseInternalPanelState\";\n\nexport const useDateRangeSelection = <T>({\n focusedInput,\n value,\n onValueChange,\n setFocusedInput,\n statePerMonth,\n onChangePanel,\n initialDateInFocus,\n}: DateRangeCalendarProps<T>): CalendarWithMonthSwitcherProps<T> => {\n const { currentPanel, setCurrentPanel } =\n useInternalPanelState(onChangePanel);\n const [dateInFocus, setDateInFocus] = useState(\n () => initialDateInFocus ?? new Date()\n );\n\n const onClickDay = useDateRangeOnClickDayHandler(\n value,\n onValueChange,\n focusedInput,\n setFocusedInput\n );\n\n const statePerMonthWithSelection = useMemo(\n () =>\n buildDayStateForDateRange(\n statePerMonth,\n value?.startDate,\n value?.endDate\n ),\n [statePerMonth, value?.endDate, value?.startDate]\n );\n\n return {\n onClickDay,\n statePerMonth: statePerMonthWithSelection,\n currentPanel,\n setCurrentPanel,\n setDateInFocus,\n dateInFocus,\n };\n};\n","import * as React from \"react\";\nimport { CalendarWithMonthSwitcher } from \"../../../features/month-switcher/CalendarWithMonthSwitcher\";\nimport { useDateRangeSelection } from \"./hooks/UseDateRangeSelection\";\nimport { InternalPanelAndFocusStateProps } from \"../../../types/InternalPanelAndFocusStateProps\";\nimport { ValueAndOnValueChangeProps } from \"@stenajs-webui/forms\";\nimport { DateRange } from \"../../../types/DateRange\";\n\nexport type DateRangeFocusedInput = \"startDate\" | \"endDate\" | undefined;\n\nexport interface DateRangeCalendarProps<T>\n extends InternalPanelAndFocusStateProps<T>,\n ValueAndOnValueChangeProps<DateRange> {\n focusedInput?: DateRangeFocusedInput;\n setFocusedInput: (focusedInput: DateRangeFocusedInput) => void;\n initialDateInFocus?: Date;\n}\n\nexport function DateRangeCalendar<T>(props: DateRangeCalendarProps<T>) {\n const dateRangeSelectionProps = useDateRangeSelection(props);\n return (\n <CalendarWithMonthSwitcher<T> {...props} {...dateRangeSelectionProps} />\n );\n}\n\nexport type DateRangeInputCalendarProps<T> = Omit<\n DateRangeCalendarProps<T>,\n | \"startDateInFocus\"\n | \"value\"\n | \"onValueChange\"\n | \"focusedInput\"\n | \"setFocusedInput\"\n | \"theme\"\n | \"currentPanel\"\n | \"setCurrentPanel\"\n>;\n","import { useState } from \"react\";\nimport { DateRangeFocusedInput } from \"../DateRangeCalendar\";\n\nexport const useDateRangeCalendarState = () => {\n const [startDate, setStartDate] = useState<Date | undefined>();\n const [endDate, setEndDate] = useState<Date | undefined>();\n const [focusedInput, setFocusedInput] =\n useState<DateRangeFocusedInput>(\"startDate\");\n return {\n startDate,\n setStartDate,\n endDate,\n setEndDate,\n focusedInput,\n setFocusedInput,\n };\n};\n","import { useCallback, useMemo, useState } from \"react\";\nimport { OnClickDay } from \"../../../types/CalendarTypes\";\nimport { addDayStateHighlights } from \"../../../util/calendar/StateModifier\";\nimport { SingleDateCalendarProps } from \"./SingleDateCalendar\";\nimport { CalendarWithMonthSwitcherProps } from \"../../../features/month-switcher/CalendarWithMonthSwitcher\";\nimport { useInternalPanelState } from \"../../../features/internal-panel-state/UseInternalPanelState\";\n\nexport const useSingleDateSelection = <T>({\n onChange,\n value,\n statePerMonth,\n onChangePanel,\n}: SingleDateCalendarProps<T>): CalendarWithMonthSwitcherProps<T> => {\n const { currentPanel, setCurrentPanel } =\n useInternalPanelState(onChangePanel);\n\n const [dateInFocus, setDateInFocus] = useState(() => value ?? new Date());\n\n const onClickDay: OnClickDay<T> = useCallback(\n (day) => {\n if (onChange) {\n onChange(day.date);\n }\n },\n [onChange]\n );\n\n const statePerMonthWithSelectedDate = useMemo(\n () =>\n value\n ? addDayStateHighlights(statePerMonth, value, [\n \"selected\",\n \"singleSelected\",\n ])\n : statePerMonth,\n [statePerMonth, value]\n );\n\n return {\n onClickDay,\n statePerMonth: statePerMonthWithSelectedDate,\n date: value,\n currentPanel,\n setCurrentPanel,\n dateInFocus,\n setDateInFocus,\n };\n};\n","import * as React from \"react\";\nimport { CalendarWithMonthSwitcher } from \"../../../features/month-switcher/CalendarWithMonthSwitcher\";\n\nimport { useSingleDateSelection } from \"./UseSingleDateSelection\";\nimport { InternalPanelAndFocusStateProps } from \"../../../types/InternalPanelAndFocusStateProps\";\n\nexport interface SingleDateCalendarProps<T>\n extends InternalPanelAndFocusStateProps<T> {\n value: Date | undefined;\n onChange: (value: Date | undefined) => void;\n}\n\nexport function SingleDateCalendar<T>(props: SingleDateCalendarProps<T>) {\n const singleDateSelectionProps = useSingleDateSelection(props);\n return (\n <CalendarWithMonthSwitcher<T> {...props} {...singleDateSelectionProps} />\n );\n}\n","import { isSameDay } from \"date-fns\";\nimport { useCallback, useMemo, useState } from \"react\";\nimport { OnClickDay } from \"../../../types/CalendarTypes\";\nimport { addDayStateHighlights } from \"../../../util/calendar/StateModifier\";\nimport { MultiDateCalendarProps } from \"./MultiDateCalendar\";\nimport { CalendarWithMonthSwitcherProps } from \"../../../features/month-switcher/CalendarWithMonthSwitcher\";\nimport { useInternalPanelState } from \"../../../features/internal-panel-state/UseInternalPanelState\";\n\nexport const useMultiDateSelection = <T>({\n onChange,\n value,\n statePerMonth,\n onChangePanel,\n}: MultiDateCalendarProps<T>): CalendarWithMonthSwitcherProps<T> => {\n const { currentPanel, setCurrentPanel } =\n useInternalPanelState(onChangePanel);\n\n const [dateInFocus, setDateInFocus] = useState(() => new Date());\n\n const onClickDay: OnClickDay<T> = useCallback(\n (day) => {\n if (!onChange) {\n return;\n }\n const isSelected = value && value.find((d) => isSameDay(d, day.date));\n if (value && isSelected) {\n onChange(value.filter((v) => !isSameDay(v, day.date)));\n } else {\n onChange([...(value || []), day.date]);\n }\n },\n [onChange, value]\n );\n const statePerMonthWithSelectedDate = useMemo(() => {\n if (!value) {\n return statePerMonth;\n }\n return value.reduce(\n (stateSum, date) => addDayStateHighlights(stateSum, date, [\"selected\"]),\n statePerMonth\n );\n }, [statePerMonth, value]);\n\n return {\n onClickDay,\n statePerMonth: statePerMonthWithSelectedDate,\n currentPanel,\n setCurrentPanel,\n dateInFocus,\n setDateInFocus,\n };\n};\n","import * as React from \"react\";\nimport { CalendarWithMonthSwitcher } from \"../../../features/month-switcher/CalendarWithMonthSwitcher\";\nimport { useMultiDateSelection } from \"./UseMultiDateSelection\";\nimport { UseInternalPanelStateProps } from \"../../../features/internal-panel-state/UseInternalPanelState\";\nimport { InternalPanelAndFocusStateProps } from \"../../../types/InternalPanelAndFocusStateProps\";\n\nexport interface MultiDateCalendarProps<T>\n extends InternalPanelAndFocusStateProps<T>,\n UseInternalPanelStateProps {\n value?: Array<Date>;\n onChange?: (value: Array<Date>) => void;\n}\n\nexport function MultiDateCalendar<T>(props: MultiDateCalendarProps<T>) {\n const selectionProps = useMultiDateSelection(props);\n return <CalendarWithMonthSwitcher<T> {...props} {...selectionProps} />;\n}\n","import { Locale, setWeek, startOfWeek } from \"date-fns\";\nimport { enGB } from \"date-fns/locale\";\nimport { useCallback, useMemo, useState } from \"react\";\nimport { useInternalPanelState } from \"../../../features/internal-panel-state/UseInternalPanelState\";\nimport { CalendarWithMonthSwitcherProps } from \"../../../features/month-switcher/CalendarWithMonthSwitcher\";\nimport { OnClickDay, OnClickWeek } from \"../../../types/CalendarTypes\";\nimport {\n getWeekForDate,\n WeekData,\n} from \"../../../util/calendar/CalendarDataFactory\";\nimport { addWeekRangeHighlights } from \"../../../util/calendar/StateModifier\";\nimport { SingleWeekCalendarProps } from \"./SingleWeekCalendar\";\n\nexport const useSingleWeekSelection = <T>({\n onChange,\n value,\n statePerMonth,\n onChangePanel,\n locale = enGB,\n}: SingleWeekCalendarProps<T>): CalendarWithMonthSwitcherProps<T> => {\n const [dateInFocus, setDateInFocus] = useState(() => {\n const week = getWeekDataFromWeekString(value, locale);\n if (!week) {\n return new Date();\n }\n return week.days[0].date;\n });\n const { currentPanel, setCurrentPanel } =\n useInternalPanelState(onChangePanel);\n\n const onClickDay = useCallback<OnClickDay<T>>(\n (day) => {\n if (onChange) {\n onChange(getWeekStringFromWeekData(getWeekForDate(day.date, locale)));\n }\n },\n [locale, onChange]\n );\n const onClickWeek = useCallback<OnClickWeek>(\n (week) => {\n if (onChange) {\n onChange(getWeekStringFromWeekData(week));\n }\n },\n [onChange]\n );\n\n const statePerMonthWithSelection = useMemo(() => {\n const weekData = getWeekDataFromWeekString(value, locale);\n return weekData\n ? addWeekRangeHighlights(statePerMonth, weekData)\n : statePerMonth;\n }, [value, locale, statePerMonth]);\n\n const date = useMemo(() => {\n const week = getWeekDataFromWeekString(value, locale);\n if (!week) {\n return new Date();\n }\n return week.days[0].date;\n }, [locale, value]);\n\n return {\n statePerMonth: statePerMonthWithSelection,\n date,\n dateInFocus,\n setDateInFocus,\n onClickDay,\n onClickWeek,\n currentPanel,\n setCurrentPanel,\n };\n};\n\nconst getWeekStringFromWeekData = (\n week: WeekData | undefined\n): string | undefined => {\n if (!week) {\n return undefined;\n }\n return `${week.endYear}-${week.weekNumber}`;\n};\n\nconst getWeekDataFromWeekString = (\n week: string | undefined,\n locale: Locale\n): WeekData | undefined => {\n if (!week) {\n return undefined;\n }\n const parts = week.split(\"-\");\n const weekNumber = parseInt(parts[1], 10);\n const year = parseInt(parts[0], 10);\n const date = new Date();\n date.setFullYear(year);\n const firstDateOfWeek = startOfWeek(setWeek(date, weekNumber), { locale });\n return getWeekForDate(firstDateOfWeek, locale);\n};\n","import * as React from \"react\";\nimport { CalendarWithMonthSwitcher } from \"../../../features/month-switcher/CalendarWithMonthSwitcher\";\nimport { useSingleWeekSelection } from \"./UseSingleWeekSelection\";\nimport { InternalPanelAndFocusStateProps } from \"../../../types/InternalPanelAndFocusStateProps\";\n\nexport type SingleWeekValue = string;\n\nexport interface SingleWeekCalendarProps<T>\n extends InternalPanelAndFocusStateProps<T> {\n value: SingleWeekValue | undefined;\n onChange: (value: SingleWeekValue | undefined) => void;\n}\n\nexport function SingleWeekCalendar<T>(props: SingleWeekCalendarProps<T>) {\n const singleWeekSelectionProps = useSingleWeekSelection(props);\n return (\n <CalendarWithMonthSwitcher<T> {...props} {...singleWeekSelectionProps} />\n );\n}\n","import { PopoverPlacement } from \"@stenajs-webui/tooltip\";\n\nexport const defaultPopoverPlacement: PopoverPlacement = \"bottom\";\n","import { useTippyInstance } from \"@stenajs-webui/tooltip\";\nimport { useCallback } from \"react\";\n\nexport const useCalendarPopoverUpdater = () => {\n const [tippyRef, tippyInstanceRef] = useTippyInstance();\n\n const onChangePanel = useCallback(() => {\n tippyInstanceRef.current?.popperInstance?.update();\n }, [tippyInstanceRef]);\n\n return {\n onChangePanel,\n tippyRef,\n };\n};\n","import { useCallback, useState } from \"react\";\n\nexport const useDateInput = (\n onChange?: (date: Date | undefined) => void,\n onClose?: () => void,\n openOnMount?: boolean\n) => {\n const [showingCalendar, setShowingCalendar] = useState(openOnMount || false);\n\n const showCalendar = useCallback(() => {\n setShowingCalendar(true);\n return true;\n }, [setShowingCalendar]);\n\n const hideCalendar = useCallback(() => {\n setShowingCalendar(false);\n if (onClose) {\n onClose();\n }\n }, [setShowingCalendar, onClose]);\n\n const onSelectDate = useCallback(\n (date: Date | undefined) => {\n if (onChange) {\n onChange(date);\n }\n setTimeout(hideCalendar, 150);\n },\n [onChange, hideCalendar]\n );\n\n return {\n showCalendar,\n hideCalendar,\n showingCalendar,\n onSelectDate,\n };\n};\n","export const defaultMaxDate = \"2999-12-31\";\n","import { Box } from \"@stenajs-webui/core\";\nimport { stenaCalendar, TextInputButton } from \"@stenajs-webui/elements\";\nimport { TextInput, TextInputProps } from \"@stenajs-webui/forms\";\nimport { Popover } from \"@stenajs-webui/tooltip\";\nimport { format } from \"date-fns\";\nimport * as React from \"react\";\nimport { defaultPopoverPlacement } from \"../../../config/DefaultPopoverPlacement\";\nimport { useCalendarPopoverUpdater } from \"../../../features/internal-panel-state/UseCalendarPopoverUpdater\";\nimport { DateFormats } from \"../../../util/date/DateFormats\";\nimport { SingleDateCalendar } from \"../../calendar-types/single-date-calendar/SingleDateCalendar\";\nimport {\n CalendarTheme,\n defaultCalendarTheme,\n} from \"../../calendar/CalendarTheme\";\nimport { DateTextInputCalendarProps } from \"../date-text-input/DateTextInput\";\nimport { useDateInput } from \"./UseDateInput\";\nimport { OptionalMinMaxDatesAsString } from \"../../../types/CalendarTypes\";\nimport { defaultMaxDate } from \"../../../config/DefaultMaxDate\";\n\nexport interface DateInputProps<T = {}> extends OptionalMinMaxDatesAsString {\n /** The current value */\n value?: Date;\n /** onChange handler for when the user selects a date. */\n onChange?: (date: Date | undefined) => void;\n /** Variant of the input field. */\n variant?: TextInputProps[\"variant\"];\n /** If true, calendar will be open when component mounts. */\n openOnMount?: boolean;\n /** Is invoked when user closes the calendar popup. */\n onClose?: () => void;\n /**\n * The date format in the input field. See date-fns docs.\n * @default YYYY-MM-dd\n */\n displayFormat?: string;\n /**\n * Placeholder when no date has been selected.\n * @default Enter date\n */\n placeholder?: string;\n /**\n * Portal target, HTML element. If not set, portal is not used.\n */\n portalTarget?: HTMLElement | null;\n /**\n * Z-index of the calendar overlay.\n * @default 100\n */\n zIndex?: number;\n /**\n * Width of the input element.\n * * @default 125px\n */\n width?: string;\n /**\n * The calendar theme to use.\n */\n calendarTheme?: CalendarTheme;\n /** Props to be passed to Calendar, see SingleDateCalendar. */\n calendarProps?: DateTextInputCalendarProps<T>;\n /**\n * Disables the TextInput, Calendar and Popover.\n */\n disabled?: boolean;\n}\n\nexport const DateInput: React.FC<DateInputProps> = ({\n displayFormat = DateFormats.fullDate,\n placeholder = \"Enter date\",\n value,\n zIndex = 100,\n calendarTheme = defaultCalendarTheme,\n calendarProps,\n openOnMount,\n onClose,\n onChange,\n portalTarget,\n variant,\n width,\n minDate,\n maxDate = defaultMaxDate,\n disabled,\n}) => {\n const { hideCalendar, showingCalendar, onSelectDate, showCalendar } =\n useDateInput(onChange, onClose, openOnMount);\n\n const { tippyRef, onChangePanel } = useCalendarPopoverUpdater();\n\n return (\n <Box width={width}>\n <Popover\n arrow={false}\n lazy\n visible={showingCalendar}\n onClickOutside={hideCalendar}\n placement={defaultPopoverPlacement}\n zIndex={zIndex}\n appendTo={portalTarget ?? \"parent\"}\n tippyRef={tippyRef}\n disabled={disabled}\n content={\n <SingleDateCalendar\n {...calendarProps}\n onChange={onSelectDate}\n value={value}\n theme={calendarTheme}\n onChangePanel={onChangePanel}\n minDate={minDate}\n maxDate={maxDate}\n />\n }\n >\n <TextInput\n type={\"date\"}\n onFocus={showCalendar}\n buttonRight={\n <TextInputButton onClick={showCalendar} icon={stenaCalendar} />\n }\n value={value ? format(value, displayFormat) : \"\"}\n placeholder={placeholder}\n size={9}\n disabled={disabled}\n autoFocus={openOnMount}\n variant={variant}\n min={minDate}\n max={maxDate}\n />\n </Popover>\n </Box>\n );\n};\n","import { useCallback, useMemo, useRef, useState } from \"react\";\nimport { DateRangeFocusedInput } from \"../../../calendar-types/date-range-calendar/DateRangeCalendar\";\nimport { DayData } from \"../../../../util/calendar/CalendarDataFactory\";\nimport { isAfter } from \"date-fns\";\nimport { DateRange } from \"../../../../types/DateRange\";\n\nexport const useDateRangeInput = (\n value: DateRange | undefined,\n onValueChange: ((dateRange: DateRange) => void) | undefined\n) => {\n const startDateInputRef = useRef<HTMLInputElement>(null);\n const endDateInputRef = useRef<HTMLInputElement>(null);\n\n const [showingCalendar, setShowingCalendar] = useState(false);\n const [focusedInput, setFocusedInput] = useState<\n DateRangeFocusedInput | undefined\n >(undefined);\n\n const showCalendarStartDate = useCallback(() => {\n setFocusedInput(\"startDate\");\n setShowingCalendar(true);\n return true;\n }, [setFocusedInput, setShowingCalendar]);\n\n const showCalendarEndDate = useCallback(() => {\n setFocusedInput(\"endDate\");\n setShowingCalendar(true);\n return true;\n }, [setFocusedInput, setShowingCalendar]);\n\n const hideCalendar = useCallback(() => {\n setShowingCalendar(false);\n }, [setShowingCalendar]);\n\n const onClickDay = useCallback(\n (day: DayData) => {\n if (focusedInput === \"startDate\") {\n onValueChange?.({\n startDate: day.date,\n endDate: value?.endDate,\n });\n if (!value?.endDate) {\n setFocusedInput(\"endDate\");\n endDateInputRef.current && endDateInputRef.current.focus();\n } else {\n setTimeout(hideCalendar, 150);\n }\n } else if (focusedInput === \"endDate\") {\n onValueChange?.({\n startDate: value?.startDate,\n endDate: day.date,\n });\n if (!value?.startDate) {\n setFocusedInput(\"startDate\");\n startDateInputRef.current && startDateInputRef.current.focus();\n } else {\n setTimeout(hideCalendar, 150);\n }\n }\n },\n [focusedInput, onValueChange, setFocusedInput, hideCalendar, value]\n );\n\n const startDateIsAfterEnd = useMemo(\n () =>\n value?.startDate &&\n value?.endDate &&\n isAfter(value.startDate, value.endDate),\n [value?.startDate, value?.endDate]\n );\n\n return {\n showingCalendar,\n hideCalendar,\n showCalendarEndDate,\n showCalendarStartDate,\n focusedInput,\n setFocusedInput,\n startDateInputRef,\n endDateInputRef,\n onClickDay,\n startDateIsAfterEnd,\n };\n};\n","import { Row, Space } from \"@stenajs-webui/core\";\nimport { TextInput, ValueAndOnValueChangeProps } from \"@stenajs-webui/forms\";\nimport { format } from \"date-fns\";\nimport * as React from \"react\";\nimport { useMemo, useState } from \"react\";\nimport { cssColor } from \"@stenajs-webui/theme\";\nimport { defaultPopoverPlacement } from \"../../../config/DefaultPopoverPlacement\";\nimport { DateFormats } from \"../../../util/date/DateFormats\";\nimport { DateRangeInputCalendarProps } from \"../../calendar-types/date-range-calendar/DateRangeCalendar\";\nimport {\n CalendarTheme,\n defaultCalendarTheme,\n} from \"../../calendar/CalendarTheme\";\nimport { useDateRangeInput } from \"./hooks/UseDateRangeInput\";\nimport {\n Icon,\n stenaArrowWideRight,\n stenaCalendar,\n} from \"@stenajs-webui/elements\";\nimport { CalendarWithMonthSwitcher } from \"../../../features/month-switcher/CalendarWithMonthSwitcher\";\nimport { CalendarPanelType } from \"../../../features/calendar-with-month-year-pickers/CalendarPanelType\";\nimport { Popover } from \"@stenajs-webui/tooltip\";\nimport { buildDayStateForDateRange } from \"../../../util/calendar/StateModifier\";\nimport { OptionalMinMaxDatesAsString } from \"../../../types/CalendarTypes\";\nimport { DateRange } from \"../../../types/DateRange\";\nimport { defaultMaxDate } from \"../../../config/DefaultMaxDate\";\n\nexport interface DateRangeInputProps<T>\n extends OptionalMinMaxDatesAsString,\n ValueAndOnValueChangeProps<DateRange> {\n /**\n * The date format in the input field. See date-fns docs.\n * @default YYYY-MM-dd\n */\n displayFormat?: string;\n\n /**\n * Placeholder for start date field when no date has been selected.\n * @default Start date\n */\n placeholderStartDate?: string;\n\n /**\n * Placeholder for end date field when no date has been selected.\n * @default End date\n */\n placeholderEndDate?: string;\n /**\n * Portal target, HTML element. If not set, portal is not used.\n */\n portalTarget?: HTMLElement | null;\n\n /**\n * Z-index of the calendar overlay.\n * @default 100\n */\n zIndex?: number;\n\n /**\n * Width of the input element.\n * * @default 125px\n */\n width?: string;\n\n /**\n * The calendar theme to use.\n */\n calendarTheme?: CalendarTheme;\n\n /** Props to be passed to DateRangeCalendar, see DateRangeCalendar. */\n calendarProps?: DateRangeInputCalendarProps<T>;\n\n /**\n * Disables the Popover and both TextInputs.\n */\n disabled?: boolean;\n}\n\n/**\n * @deprecated Please use DateRangeDualTextInput instead.\n */\nexport function DateRangeInput<T>({\n displayFormat = DateFormats.fullDate,\n placeholderStartDate = \"Start date\",\n placeholderEndDate = \"End date\",\n portalTarget,\n value,\n onValueChange,\n zIndex = 100,\n width,\n calendarTheme = defaultCalendarTheme,\n calendarProps,\n minDate,\n maxDate = defaultMaxDate,\n disabled,\n}: DateRangeInputProps<T>): React.ReactElement<DateRangeInputProps<T>> {\n const [currentPanel, setCurrentPanel] =\n useState<CalendarPanelType>(\"calendar\");\n\n const {\n hideCalendar,\n showCalendarEndDate,\n showCalendarStartDate,\n showingCalendar,\n focusedInput,\n startDateInputRef,\n endDateInputRef,\n onClickDay,\n startDateIsAfterEnd,\n } = useDateRangeInput(value, onValueChange);\n\n const [dateInFocus, setDateInFocus] = useState(\n () => (focusedInput && value?.[focusedInput]) ?? new Date()\n );\n const statePerMonth = useMemo(\n () =>\n buildDayStateForDateRange(undefined, value?.startDate, value?.endDate),\n [value]\n );\n\n return (\n <Popover\n arrow={false}\n lazy\n disabled={disabled}\n visible={showingCalendar}\n zIndex={zIndex}\n placement={defaultPopoverPlacement}\n appendTo={portalTarget ?? \"parent\"}\n onClickOutside={hideCalendar}\n content={\n <CalendarWithMonthSwitcher\n {...calendarProps}\n dateInFocus={dateInFocus}\n setDateInFocus={setDateInFocus}\n statePerMonth={statePerMonth}\n theme={calendarTheme}\n onClickDay={onClickDay}\n currentPanel={currentPanel}\n setCurrentPanel={setCurrentPanel}\n minDate={minDate}\n maxDate={maxDate}\n />\n }\n >\n <Row alignItems={\"center\"}>\n <TextInput\n iconLeft={stenaCalendar}\n onFocus={showCalendarStartDate}\n value={value?.startDate ? format(value.startDate, displayFormat) : \"\"}\n placeholder={placeholderStartDate}\n width={width}\n disabled={disabled}\n inputRef={startDateInputRef}\n size={9}\n variant={startDateIsAfterEnd ? \"error\" : undefined}\n />\n <Space />\n <Icon\n icon={stenaArrowWideRight}\n color={cssColor(\"--lhds-color-ui-500\")}\n size={14}\n />\n <Space />\n <TextInput\n iconLeft={stenaCalendar}\n onFocus={showCalendarEndDate}\n value={value?.endDate ? format(value.endDate, displayFormat) : \"\"}\n placeholder={placeholderEndDate}\n width={width}\n disabled={disabled}\n inputRef={endDateInputRef}\n size={9}\n variant={startDateIsAfterEnd ? \"error\" : undefined}\n />\n </Row>\n </Popover>\n );\n}\n","import { Box, Omit, Row } from \"@stenajs-webui/core\";\nimport { FlatButton, stenaCalendar } from \"@stenajs-webui/elements\";\nimport { TextInput, TextInputProps } from \"@stenajs-webui/forms\";\nimport { Popover } from \"@stenajs-webui/tooltip\";\nimport { format, isValid, parse } from \"date-fns\";\nimport * as React from \"react\";\nimport { useCallback, useState } from \"react\";\nimport { defaultPopoverPlacement } from \"../../../config/DefaultPopoverPlacement\";\nimport { useCalendarPopoverUpdater } from \"../../../features/internal-panel-state/UseCalendarPopoverUpdater\";\nimport { DateFormats } from \"../../../util/date/DateFormats\";\nimport {\n SingleDateCalendar,\n SingleDateCalendarProps,\n} from \"../../calendar-types/single-date-calendar/SingleDateCalendar\";\nimport {\n CalendarTheme,\n defaultCalendarTheme,\n} from \"../../calendar/CalendarTheme\";\nimport { OptionalMinMaxDatesAsString } from \"../../../types/CalendarTypes\";\nimport { defaultMaxDate } from \"../../../config/DefaultMaxDate\";\n\nexport type DateTextInputCalendarProps<T> = Omit<\n SingleDateCalendarProps<T>,\n \"value\" | \"onChange\" | \"theme\"\n>;\n\nexport interface DateTextInputProps<T>\n extends Omit<TextInputProps, \"onChange\" | \"theme\" | \"min\" | \"max\">,\n OptionalMinMaxDatesAsString {\n /** Props to be passed to Calendar, see SingleDateCalendar. */\n calendarProps?: DateTextInputCalendarProps<T>;\n /** Close calendar when date is selected, @default true */\n closeOnCalendarSelectDate?: boolean;\n /** Valid date format, @default YYYY-MM-DD */\n dateFormat?: string;\n /** Make the icon not clickable, @default false */\n disableCalender?: boolean;\n /** Show or hide the calender icon, @default false */\n hideCalenderIcon?: boolean;\n /** Placeholder for the input, @default YYYY-MM-DD */\n placeholder?: string;\n /** Portal target, HTML element. If not set, portal is not used. */\n portalTarget?: HTMLElement | null;\n /** Z-index of the calendar overlay, @default 100 */\n zIndex?: number;\n /** The date text input theme to use. */\n calendarTheme?: CalendarTheme;\n}\n\nexport const DateTextInput: React.FC<DateTextInputProps<{}>> = ({\n calendarProps,\n closeOnCalendarSelectDate = true,\n dateFormat = DateFormats.fullDate,\n disableCalender = false,\n onValueChange,\n placeholder = \"yyyy-mm-dd\",\n portalTarget,\n value,\n width = \"130px\",\n zIndex = 100,\n calendarTheme = defaultCalendarTheme,\n hideCalenderIcon = false,\n minDate,\n maxDate = defaultMaxDate,\n variant,\n ...props\n}) => {\n const [open, setOpen] = useState(false);\n const { tippyRef, onChangePanel } = useCalendarPopoverUpdater();\n\n const toggleCalendar = useCallback(() => {\n setOpen(!open);\n }, [setOpen, open]);\n\n const hideCalendar = useCallback(() => {\n setOpen(false);\n }, [setOpen]);\n\n const onValueChangeHandler = useCallback(\n (value: string) => {\n if (onValueChange) {\n onValueChange(value);\n }\n },\n [onValueChange]\n );\n\n const onCalendarSelectDate = useCallback(\n (date: Date | undefined) => {\n if (date) {\n onValueChangeHandler(format(date, dateFormat));\n if (closeOnCalendarSelectDate) {\n setTimeout(() => setOpen(!open), 200);\n }\n }\n },\n [onValueChangeHandler, dateFormat, closeOnCalendarSelectDate, setOpen, open]\n );\n\n const inValidInput = !!value && !/^[-/\\\\.0-9]+$/.test(value);\n\n const dateIsValid = !!value && isValid(parse(value, dateFormat, new Date()));\n\n const userInputCorrectLength = !!value && value.length >= dateFormat.length;\n\n const invalid: boolean =\n (userInputCorrectLength && !dateIsValid) || inValidInput;\n\n return (\n <Box width={width}>\n <Popover\n arrow={false}\n lazy\n visible={open}\n zIndex={zIndex}\n appendTo={portalTarget ?? \"parent\"}\n placement={defaultPopoverPlacement}\n onClickOutside={hideCalendar}\n tippyRef={tippyRef}\n content={\n <SingleDateCalendar\n {...calendarProps}\n onChange={onCalendarSelectDate}\n onChangePanel={onChangePanel}\n value={\n value && dateIsValid\n ? parse(value, dateFormat, new Date())\n : undefined\n }\n minDate={minDate}\n maxDate={maxDate}\n theme={calendarTheme}\n />\n }\n >\n <TextInput\n {...props}\n variant={invalid ? \"error\" : variant}\n disableContentPaddingRight\n contentRight={\n !hideCalenderIcon ? (\n <Row alignItems={\"center\"} indent={0.5}>\n <FlatButton\n size={\"small\"}\n disabled={props.disabled || disableCalender}\n leftIcon={stenaCalendar}\n onClick={toggleCalendar}\n />\n </Row>\n ) : undefined\n }\n onValueChange={onValueChangeHandler}\n placeholder={placeholder}\n value={value || \"\"}\n min={minDate}\n max={maxDate}\n size={10}\n />\n </Popover>\n </Box>\n );\n};\n","export interface FormatTimeStringResult {\n time: string;\n success: boolean;\n}\n\nexport const formatHours = (hours: string): string => {\n if (hours === \"\") {\n return \"00\";\n }\n\n const h = parseInt(hours, 10);\n\n if (isNaN(h)) {\n throw new Error(\"Hours is not a number\");\n }\n\n if (h < 0 || h > 23) {\n throw new Error(\"Hours is an invalid number\");\n }\n\n switch (hours.length) {\n case 1:\n return `0${h}`;\n case 2:\n return hours;\n default:\n throw new Error(\"Invalid hour string\");\n }\n};\n\nexport const formatMinutes = (minutes: string): string => {\n if (minutes === \"\") {\n return \"00\";\n }\n\n const m = parseInt(minutes, 10);\n\n if (isNaN(m)) {\n throw new Error(\"Minutes is not a number\");\n }\n\n if (m < 0 || m > 59) {\n throw new Error(\"Minutes is an invalid number\");\n }\n\n switch (minutes.length) {\n case 1:\n return `0${m}`;\n case 2:\n return minutes;\n default:\n throw new Error(\"Invalid minute string\");\n }\n};\n\nexport const formatTimeString = (time: string): FormatTimeStringResult => {\n if (!validUserInput(time)) {\n return { time, success: false };\n }\n\n const arr = time && time.split(/-|:|,|;|[/]|[.]| /); // consider all these chars as user input separator\n if (arr && arr.length === 2) {\n try {\n const hours = formatHours(arr[0]);\n const minutes = formatMinutes(arr[1]);\n return { time: `${hours}:${minutes}`, success: true };\n } catch {\n return { time, success: false };\n }\n } else if (arr && arr.length === 1) {\n let hours = 0;\n let minutes = 0;\n switch (time.length) {\n case 1:\n return { time: `0${time}:00`, success: true };\n case 2:\n const timeNumber = parseInt(arr[0], 10);\n if (timeNumber >= 0 && timeNumber < 24) {\n return { time: `${time}:00`, success: true };\n } else if (timeNumber >= 24 && timeNumber < 59) {\n return { time: `00:${time}`, success: true };\n }\n return { time, success: false };\n case 3:\n minutes = parseInt(time.substr(1, 2), 10);\n if (minutes >= 0 && minutes <= 59) {\n return {\n time: `0${time.substr(0, 1)}:${time.substr(1, 2)}`,\n success: true,\n };\n }\n return { time, success: false };\n case 4:\n hours = parseInt(time.substr(0, 2), 10);\n minutes = parseInt(time.substr(2, 2), 10);\n if (hours < 0 || hours > 23) {\n return { time, success: false };\n }\n if (minutes < 0 || minutes > 59) {\n return { time, success: false };\n }\n return {\n time: `${time.substr(0, 2)}:${time.substr(2, 2)}`,\n success: true,\n };\n default:\n return { time, success: false };\n }\n }\n\n return { time, success: false };\n};\n\nexport const validUserInput = (input: string | undefined): boolean => {\n if (input) {\n return /^[-:.,/; 0-9]+$/.test(input);\n }\n\n return true;\n};\n","import { Omit } from \"@stenajs-webui/core\";\nimport { TextInput, TextInputProps } from \"@stenajs-webui/forms\";\nimport * as React from \"react\";\nimport { ChangeEventHandler, useCallback, useState } from \"react\";\nimport {\n formatTimeString,\n validUserInput,\n} from \"../../../util/time/TimeStringFormatValidator\";\n\nimport { stenaClock } from \"@stenajs-webui/elements\";\n\nexport interface TimeTextInputProps extends Omit<TextInputProps, \"onChange\"> {\n /** Show placeholder when true */\n showPlaceholder?: boolean;\n /** Show icon when true */\n useIcon?: boolean;\n /** Variant of the input field. */\n variant?: TextInputProps[\"variant\"];\n}\n\n/**\n * @deprecated\n */\nexport const TimeTextInput: React.FC<TimeTextInputProps> = ({\n onValueChange,\n showPlaceholder = true,\n useIcon = true,\n value,\n width = \"85px\",\n variant,\n ...props\n}) => {\n const [valid, setValid] = useState(() => validUserInput(value));\n\n const timeFormat = \"hh:mm\";\n\n const onBlur = useCallback(() => {\n if (value) {\n const formattedResult = formatTimeString(value);\n setValid(formattedResult.success);\n if (formattedResult.success) {\n if (onValueChange) {\n onValueChange(formattedResult.time);\n }\n }\n }\n }, [value, onValueChange, setValid]);\n\n const onChangeHandler = useCallback<ChangeEventHandler<HTMLInputElement>>(\n (ev) => {\n const time = ev.target.value;\n const validInput = validUserInput(time);\n\n setValid(validInput && time.length <= timeFormat.length);\n\n if (onValueChange) {\n onValueChange(time);\n }\n },\n [onValueChange, setValid]\n );\n\n return (\n <TextInput\n {...props}\n type={\"time\"}\n variant={!valid ? \"error\" : variant}\n iconLeft={useIcon ? stenaClock : undefined}\n value={value}\n placeholder={showPlaceholder ? timeFormat : undefined}\n onChange={onChangeHandler}\n onBlur={onBlur}\n width={width}\n />\n );\n};\n","import { IconDefinition } from \"@fortawesome/fontawesome-svg-core\";\nimport {\n Box,\n BoxProps,\n ButtonElementProps,\n Indent,\n Row,\n SeparatorLine,\n} from \"@stenajs-webui/core\";\nimport {\n FlatButton,\n Icon,\n stenaCalendar,\n stenaAngleDown,\n} from \"@stenajs-webui/elements\";\nimport {\n TextInput,\n TextInputBox,\n TextInputBoxProps,\n TextInputProps,\n} from \"@stenajs-webui/forms\";\nimport { debounce } from \"lodash-es\";\nimport * as React from \"react\";\nimport { FocusEventHandler, useCallback, useMemo, useRef } from \"react\";\nimport { cssColor } from \"@stenajs-webui/theme\";\n\nexport interface DualTextInputProps {\n onEsc?: TextInputProps[\"onEsc\"];\n onEnter?: TextInputProps[\"onEnter\"];\n widthLeft?: BoxProps[\"width\"];\n widthRight?: BoxProps[\"width\"];\n valueLeft?: TextInputProps[\"value\"];\n valueRight?: TextInputProps[\"value\"];\n minLeft?: string;\n maxLeft?: string;\n minRight?: string;\n maxRight?: string;\n typeLeft?: TextInputProps[\"type\"];\n typeRight?: TextInputProps[\"type\"];\n separatorIcon?: IconDefinition;\n placeholderLeft?: TextInputProps[\"placeholder\"];\n placeholderRight?: TextInputProps[\"placeholder\"];\n onValueChangeLeft?: TextInputProps[\"onValueChange\"];\n onValueChangeRight?: TextInputProps[\"onValueChange\"];\n onChangeLeft?: TextInputProps[\"onChange\"];\n onChangeRight?: TextInputProps[\"onChange\"];\n onClickLeft?: TextInputProps[\"onClick\"];\n onClickRight?: TextInputProps[\"onClick\"];\n onClickCalendar?: ButtonElementProps[\"onClick\"];\n onClickArrowDown?: ButtonElementProps[\"onClick\"];\n onFocusLeft?: TextInputProps[\"onFocus\"];\n onFocusRight?: TextInputProps[\"onFocus\"];\n onBlur?: () => void;\n onBlurLeft?: TextInputProps[\"onBlur\"];\n onBlurRight?: TextInputProps[\"onBlur\"];\n inputRefLeft?: TextInputProps[\"inputRef\"];\n inputRefRight?: TextInputProps[\"inputRef\"];\n variantLeft?: TextInputProps[\"variant\"];\n variantRight?: TextInputProps[\"variant\"];\n variant?: TextInputBoxProps[\"variant\"];\n showPresets?: false;\n autoFocusLeft?: boolean;\n autoFocusRight?: boolean;\n disabled?: boolean;\n}\n\nexport const DualTextInput: React.FC<DualTextInputProps> = ({\n autoFocusLeft,\n autoFocusRight,\n onEsc,\n onEnter,\n onValueChangeLeft,\n onValueChangeRight,\n separatorIcon,\n placeholderLeft,\n placeholderRight,\n typeLeft,\n typeRight,\n onChangeLeft,\n onChangeRight,\n valueLeft,\n valueRight,\n minLeft,\n maxLeft,\n minRight,\n maxRight,\n onClickLeft,\n onClickRight,\n onClickCalendar,\n onClickArrowDown,\n onBlurLeft,\n onBlurRight,\n onFocusLeft,\n onFocusRight,\n inputRefLeft,\n inputRefRight,\n variant,\n variantLeft,\n variantRight,\n onBlur,\n showPresets,\n widthLeft,\n widthRight,\n disabled,\n}) => {\n const focusCounter = useRef(0);\n\n const tryTriggerOnBlur = useMemo(\n () =>\n debounce((focusCounter: number) => {\n if (focusCounter === 0) {\n onBlur?.();\n }\n }, 10),\n [onBlur]\n );\n\n const focusLeftHandler = useCallback<FocusEventHandler<HTMLInputElement>>(\n (ev) => {\n focusCounter.current++;\n tryTriggerOnBlur(focusCounter.current);\n if (onFocusLeft) {\n onFocusLeft(ev);\n }\n },\n [onFocusLeft, focusCounter, tryTriggerOnBlur]\n );\n\n const focusRightHandler = useCallback<FocusEventHandler<HTMLInputElement>>(\n (ev) => {\n focusCounter.current++;\n tryTriggerOnBlur(focusCounter.current);\n if (onFocusRight) {\n onFocusRight(ev);\n }\n },\n [onFocusRight, focusCounter, tryTriggerOnBlur]\n );\n\n const blurLeftHandler = useCallback<FocusEventHandler<HTMLInputElement>>(\n (ev) => {\n focusCounter.current--;\n tryTriggerOnBlur(focusCounter.current);\n if (onBlurLeft) {\n onBlurLeft(ev);\n }\n },\n [onBlurLeft, focusCounter, tryTriggerOnBlur]\n );\n\n const blurRightHandler = useCallback<FocusEventHandler<HTMLInputElement>>(\n (ev) => {\n focusCounter.current--;\n tryTriggerOnBlur(focusCounter.current);\n if (onBlurRight) {\n onBlurRight(ev);\n }\n },\n [onBlurRight, focusCounter, tryTriggerOnBlur]\n );\n\n return (\n <Box>\n <TextInputBox\n disableContentPaddingRight\n disabled={disabled}\n variant={variant}\n contentRight={\n <Row alignItems={\"center\"}>\n <Indent num={0.5}>\n <FlatButton\n leftIcon={stenaCalendar}\n onClick={onClickCalendar}\n disabled={disabled}\n size={\"small\"}\n />\n </Indent>\n\n {showPresets ? (\n <>\n <Row height={\"22px\"}>\n <SeparatorLine vertical />\n </Row>\n\n <Indent num={0.5}>\n <FlatButton\n leftIcon={stenaAngleDown}\n onClick={onClickArrowDown}\n disabled={disabled}\n size={\"small\"}\n />\n </Indent>\n </>\n ) : null}\n </Row>\n }\n >\n <Box width={widthLeft}>\n <TextInput\n onEsc={onEsc}\n onEnter={onEnter}\n onClick={onClickLeft}\n disabled={disabled}\n hideBorder\n placeholder={placeholderLeft}\n value={valueLeft}\n onValueChange={onValueChangeLeft}\n onChange={onChangeLeft}\n onBlur={blurLeftHandler}\n onFocus={focusLeftHandler}\n inputRef={inputRefLeft}\n variant={variantLeft}\n type={typeLeft}\n autoFocus={autoFocusLeft}\n min={minLeft}\n max={maxLeft}\n />\n </Box>\n <Row indent={0.5} alignItems={\"center\"} justifyContent={\"center\"}>\n <Icon\n icon={separatorIcon}\n size={12}\n color={cssColor(\"--lhds-color-ui-500\")}\n />\n </Row>\n <Box width={widthRight}>\n <TextInput\n onEsc={onEsc}\n onEnter={onEnter}\n onClick={onClickRight}\n disabled={disabled}\n hideBorder\n placeholder={placeholderRight}\n value={valueRight}\n onValueChange={onValueChangeRight}\n onChange={onChangeRight}\n onBlur={blurRightHandler}\n onFocus={focusRightHandler}\n inputRef={inputRefRight}\n variant={variantRight}\n type={typeRight}\n autoFocus={autoFocusRight}\n min={minRight}\n max={maxRight}\n />\n </Box>\n </TextInputBox>\n </Box>\n );\n};\n","import { parseIntElseUndefined } from \"@stenajs-webui/core\";\nimport { formatHours, formatMinutes } from \"./TimeStringFormatValidator\";\n\nexport const transformNumberTimeToString = (\n time: number | undefined | null\n): string | undefined => {\n if (time == null) {\n return undefined;\n }\n const timeStr = time.toString();\n if (timeStr.length === 3) {\n return `${timeStr.substr(0, 1)}:${timeStr.substr(1, 2)}`;\n }\n if (timeStr.length === 4) {\n return `${timeStr.substr(0, 2)}:${timeStr.substr(2, 2)}`;\n }\n if (timeStr.length === 2) {\n return `0:${timeStr}`;\n }\n if (timeStr.length === 1) {\n return `0:0${timeStr}`;\n }\n throw new Error(\"Invalid time number.\");\n};\n\nexport const transformTimeStringToNumber = (\n time: string | undefined | null\n): number | null => {\n if (time == null) {\n throw new Error(\"Time is not set.\");\n }\n if (time === \"\") {\n throw new Error(\"Time is empty.\");\n }\n const parts = time.split(\":\");\n if (parts.length !== 2) {\n throw new Error(\"Invalid time.\");\n }\n\n if (parts[1].length !== 2) {\n throw new Error(\"Invalid time.\");\n }\n\n if (parts[0].length < 1 || parts[0].length > 2) {\n throw new Error(\"Invalid time.\");\n }\n\n const hours = parseInt(parts[0], 10);\n const minutes = parseInt(parts[1], 10);\n\n if (isNaN(hours)) {\n throw new Error(\"Invalid time.\");\n }\n if (isNaN(minutes)) {\n throw new Error(\"Invalid time.\");\n }\n if (hours < 0 || hours > 23) {\n throw new Error(\"Invalid time.\");\n }\n if (minutes < 0 || minutes > 59) {\n throw new Error(\"Invalid time.\");\n }\n return hours * 100 + minutes;\n};\n\nexport const isValidTimeString = (time: string | undefined): boolean => {\n try {\n transformTimeStringToNumber(time);\n return true;\n } catch (e) {\n return false;\n }\n};\n\nexport const getHoursAndMinutesFromTimeString = (\n value: string | undefined\n): {\n hour: number | undefined;\n minute: number | undefined;\n} => {\n if (value && isValidTimeString(value)) {\n const p = value.split(\":\");\n return {\n hour: parseIntElseUndefined(p[0]),\n minute: parseIntElseUndefined(p[1]),\n };\n }\n return {\n hour: undefined,\n minute: undefined,\n };\n};\n\nexport const transformTimeInDateToTimeString = (date: Date): string =>\n `${formatHours(String(date.getHours()))}:${formatMinutes(\n String(date.getMinutes())\n )}`;\n","import { Row } from \"@stenajs-webui/core\";\nimport { FlatButton, PrimaryButton } from \"@stenajs-webui/elements\";\nimport * as React from \"react\";\nimport { MutableRefObject, RefObject, useEffect, useRef } from \"react\";\nimport { padStart } from \"lodash-es\";\n\nexport interface TimePickerCellProps {\n item: number;\n selected?: boolean;\n onClick: (label: number) => void;\n columnRef: RefObject<HTMLDivElement>;\n canScrollRef: MutableRefObject<boolean>;\n}\n\nexport const TimePickerCell: React.FC<TimePickerCellProps> = ({\n onClick,\n item,\n selected,\n columnRef,\n canScrollRef,\n}) => {\n const ref = useRef<HTMLDivElement>(null);\n\n useEffect(\n function scrollToSelectedItem() {\n if (\n selected &&\n columnRef.current &&\n ref.current &&\n canScrollRef.current\n ) {\n const targetScroll = ref.current.scrollHeight * Math.max(item - 2, 0);\n columnRef.current.scrollTo(0, targetScroll);\n canScrollRef.current = false;\n }\n },\n [columnRef, item, selected, canScrollRef]\n );\n\n return (\n <Row\n width={\"64px\"}\n justifyContent={\"center\"}\n spacing={0.5}\n indent={0.5}\n ref={ref}\n >\n {selected ? (\n <PrimaryButton\n label={padStart(String(item), 2, \"0\")}\n onClick={() => onClick && onClick(item)}\n />\n ) : (\n <FlatButton\n label={String(item).padStart(2, \"0\")}\n onClick={() => onClick && onClick(item)}\n />\n )}\n </Row>\n );\n};\n","import { Column } from \"@stenajs-webui/core\";\nimport * as React from \"react\";\nimport { MutableRefObject, useRef } from \"react\";\nimport styles from \"./TimePicker.module.css\";\nimport { TimePickerCell } from \"./TimePickerCell\";\n\ninterface Props {\n items: Array<number>;\n onClick: (item: number) => void;\n selectedItem: number | undefined;\n canScrollRef: MutableRefObject<boolean>;\n}\n\nexport const TimePickerColumn: React.FC<Props> = ({\n onClick,\n items,\n selectedItem,\n canScrollRef,\n}) => {\n const columnRef = useRef<HTMLDivElement>(null);\n\n return (\n <Column className={styles.timePickerColumn} ref={columnRef}>\n {items.map((item) => (\n <TimePickerCell\n key={item}\n item={item}\n onClick={onClick}\n selected={item === selectedItem}\n columnRef={columnRef}\n canScrollRef={canScrollRef}\n />\n ))}\n </Column>\n );\n};\n","import { Indent, Row } from \"@stenajs-webui/core\";\nimport { ValueAndOnValueChangeProps } from \"@stenajs-webui/forms\";\nimport { range } from \"lodash-es\";\nimport * as React from \"react\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport {\n formatHours,\n formatMinutes,\n} from \"../../util/time/TimeStringFormatValidator\";\nimport { getHoursAndMinutesFromTimeString } from \"../../util/time/TimeTransformer\";\nimport styles from \"./TimePicker.module.css\";\nimport { TimePickerColumn } from \"./TimePickerColumn\";\n\nexport interface TimePickerProps extends ValueAndOnValueChangeProps<string> {}\n\nconst hours = range(0, 24);\nconst minutes = range(0, 60);\n\nexport const TimePicker: React.FC<TimePickerProps> = ({\n value,\n onValueChange,\n}) => {\n const canScrollRef = useRef(true);\n const [hour, setHour] = useState<number | undefined>(undefined);\n const [minute, setMinute] = useState<number | undefined>(undefined);\n\n useEffect(() => {\n if (value) {\n const { minute, hour } = getHoursAndMinutesFromTimeString(value);\n setHour(hour);\n setMinute(minute);\n }\n }, [value]);\n\n const onClickHour = useCallback(\n (h: number) => {\n setHour(h);\n onValueChange?.(\n `${formatHours(String(h ?? 0))}:${formatMinutes(String(minute ?? 0))}`\n );\n },\n [minute, onValueChange]\n );\n\n const onClickMinutes = useCallback(\n (m: number) => {\n setMinute(m);\n onValueChange?.(\n `${formatHours(String(hour ?? 0))}:${formatMinutes(String(m ?? 0))}`\n );\n },\n [hour, onValueChange]\n );\n\n return (\n <Row className={styles.timePicker}>\n <TimePickerColumn\n items={hours}\n onClick={onClickHour}\n selectedItem={hour}\n canScrollRef={canScrollRef}\n />\n <Indent />\n <TimePickerColumn\n items={minutes}\n onClick={onClickMinutes}\n selectedItem={minute}\n canScrollRef={canScrollRef}\n />\n </Row>\n );\n};\n","import { RefObject, useEffect } from \"react\";\n\nexport const useDateRangeEffects = (\n date: Date | undefined | null,\n setDateInFocus: (date: Date) => void,\n dateInputRef: RefObject<HTMLInputElement>\n) => {\n useEffect(\n function moveFocusedDateWhenDateChanges() {\n if (date) {\n setDateInFocus(date);\n }\n },\n [date, setDateInFocus]\n );\n\n useEffect(\n function updateDateFieldWhenValueChanges() {\n if (dateInputRef.current) {\n if (date) {\n dateInputRef.current.valueAsDate = new Date(\n Date.UTC(date.getFullYear(), date.getMonth(), date.getDate())\n );\n } else {\n dateInputRef.current.valueAsDate = null;\n }\n }\n },\n [date, dateInputRef]\n );\n};\n","import { ChangeEvent, RefObject, useCallback } from \"react\";\nimport { getHoursAndMinutesFromTimeString } from \"../../../../util/time/TimeTransformer\";\nimport { DateTimeInputProps } from \"../DateTimeInput\";\nimport { UseInputStatesResult } from \"./UseInputStates\";\n\nexport const useDateRangeHandlers = (\n date: Date | undefined | null,\n onValueChange: DateTimeInputProps[\"onValueChange\"],\n {\n setDateInFocus,\n showCalendarInternal,\n hideCalendarInternal,\n setFirstFocusedInput,\n setCurrentPanel,\n localTime,\n setLocalTime,\n localDate,\n setLocalDate,\n }: UseInputStatesResult,\n dateInputRef: RefObject<HTMLInputElement>\n) => {\n const onChangeDate = useCallback(\n (incomingDate: Date | null) => {\n if (!incomingDate) {\n return;\n }\n const newDate = new Date(incomingDate);\n\n if (date) {\n // Full date is available\n\n newDate.setHours(date.getHours());\n newDate.setMinutes(date.getMinutes());\n\n onValueChange?.(newDate);\n setLocalDate(undefined);\n } else if (localTime) {\n // Only time has been selected\n const { minute, hour } = getHoursAndMinutesFromTimeString(localTime);\n\n newDate.setHours(hour ?? 0);\n newDate.setMinutes(minute ?? 0);\n\n onValueChange?.(newDate);\n setLocalDate(undefined);\n } else {\n // Nothing has been selected\n setLocalDate(newDate);\n }\n setDateInFocus(newDate);\n if (dateInputRef.current) {\n dateInputRef.current.valueAsDate = new Date(\n Date.UTC(newDate.getFullYear(), newDate.getMonth(), newDate.getDate())\n );\n }\n },\n [date, dateInputRef, localTime, onValueChange, setDateInFocus, setLocalDate]\n );\n\n const onChangeTime = useCallback(\n (time: string) => {\n if (!time) {\n return;\n }\n\n if (date) {\n // Full date is available\n const newTime = getHoursAndMinutesFromTimeString(time);\n const newDate = new Date(date);\n\n newDate.setHours(newTime.hour || 0);\n newDate.setMinutes(newTime.minute || 0);\n\n onValueChange?.(newDate);\n setLocalTime(undefined);\n } else if (localDate) {\n // Only date has already been selected\n const newTime = getHoursAndMinutesFromTimeString(time);\n const newDate = new Date(localDate);\n\n newDate.setHours(newTime.hour || 0);\n newDate.setMinutes(newTime.minute || 0);\n\n onValueChange?.(newDate);\n setLocalTime(undefined);\n } else {\n // Nothing has been selected\n setLocalTime(time);\n }\n },\n [onValueChange, date, localDate, setLocalTime]\n );\n\n const inputLeftChangeHandler = useCallback(\n (ev: ChangeEvent<HTMLInputElement>) => {\n if (ev.target.value[0] !== \"0\") {\n onChangeDate(ev.target.valueAsDate);\n }\n },\n [onChangeDate]\n );\n\n const inputRightChangeHandler = useCallback(\n (ev: ChangeEvent<HTMLInputElement>) => onChangeTime(ev.target.value),\n [onChangeTime]\n );\n\n const showCalendar = useCallback(() => {\n if (date) {\n setDateInFocus(date);\n } else {\n setDateInFocus(new Date());\n }\n setCurrentPanel(\"calendar\");\n showCalendarInternal();\n }, [date, setCurrentPanel, showCalendarInternal, setDateInFocus]);\n\n const hideCalendar = useCallback(() => {\n setFirstFocusedInput(undefined);\n hideCalendarInternal();\n }, [setFirstFocusedInput, hideCalendarInternal]);\n\n return {\n inputLeftChangeHandler,\n inputRightChangeHandler,\n hideCalendar,\n showCalendar,\n onChangeTime,\n onChangeDate,\n };\n};\n","import { useBoolean } from \"@stenajs-webui/core\";\nimport { useState } from \"react\";\nimport { DateRangeFocusedInput } from \"../../../calendar-types/date-range-calendar/DateRangeCalendar\";\nimport { CalendarPanelType } from \"../../../../features/calendar-with-month-year-pickers/CalendarPanelType\";\n\nexport type UseInputStatesResult = ReturnType<typeof useInputStates>;\n\nexport const useInputStates = (date: Date | undefined | null) => {\n const [localDate, setLocalDate] = useState<Date | undefined>(undefined);\n const [localTime, setLocalTime] = useState<string | undefined>(undefined);\n\n const [isCalendarVisible, showCalendarInternal, hideCalendarInternal] =\n useBoolean(false);\n\n const [isTimePickerVisible, showTimePicker, hideTimePicker] =\n useBoolean(false);\n\n const [firstFocusedInput, setFirstFocusedInput] = useState<\n DateRangeFocusedInput | undefined\n >(undefined);\n\n const [dateInFocus, setDateInFocus] = useState<Date>(\n () => date ?? new Date()\n );\n\n const [currentPanel, setCurrentPanel] =\n useState<CalendarPanelType>(\"calendar\");\n\n return {\n isCalendarVisible,\n showCalendarInternal,\n hideCalendarInternal,\n firstFocusedInput,\n setFirstFocusedInput,\n dateInFocus,\n setDateInFocus,\n currentPanel,\n setCurrentPanel,\n isTimePickerVisible,\n showTimePicker,\n hideTimePicker,\n localDate,\n setLocalDate,\n localTime,\n setLocalTime,\n };\n};\n","import * as React from \"react\";\nimport { RefObject, useCallback } from \"react\";\nimport { DayData } from \"../../../../util/calendar/CalendarDataFactory\";\nimport { UseInputStatesResult } from \"./UseInputStates\";\n\nexport const useUserInputHandlers = (\n onChangeDate: (incomingDate: Date | null) => void,\n dateInputRef: RefObject<HTMLInputElement>,\n showCalendar: () => void,\n hideCalendar: () => void,\n {\n isCalendarVisible,\n setCurrentPanel,\n showTimePicker,\n hideTimePicker,\n }: UseInputStatesResult\n) => {\n const onFocusLeft = useCallback(() => {\n if (!isCalendarVisible) {\n showCalendar();\n }\n setCurrentPanel(\"calendar\");\n hideTimePicker();\n }, [hideTimePicker, isCalendarVisible, setCurrentPanel, showCalendar]);\n\n const onFocusRight = useCallback(() => {\n hideCalendar();\n showTimePicker();\n }, [hideCalendar, showTimePicker]);\n\n const onClickDay = useCallback(\n (day: DayData) => {\n onChangeDate(day.date);\n hideCalendar();\n showTimePicker();\n },\n [onChangeDate, hideCalendar, showTimePicker]\n );\n\n const onClickArrowButton = useCallback(() => {\n setCurrentPanel(\"presets\");\n showCalendar();\n }, [setCurrentPanel, showCalendar]);\n\n const onClickCalendarButton = useCallback(() => {\n if (isCalendarVisible) {\n hideCalendar();\n } else {\n dateInputRef.current?.focus();\n setCurrentPanel(\"calendar\");\n showCalendar();\n }\n }, [\n isCalendarVisible,\n hideCalendar,\n dateInputRef,\n setCurrentPanel,\n showCalendar,\n ]);\n\n const onKeyDownHandler = useCallback(\n (ev: React.KeyboardEvent<HTMLDivElement>) => {\n if (ev.key === \"Escape\") {\n hideCalendar();\n }\n },\n [hideCalendar]\n );\n\n return {\n onFocusLeft,\n onFocusRight,\n onClickDay,\n onClickArrowButton,\n onClickCalendarButton,\n onKeyDownHandler,\n };\n};\n","import { Box, Column, Row, Space, useDelayedFalse } from \"@stenajs-webui/core\";\nimport { PrimaryButton } from \"@stenajs-webui/elements\";\nimport {\n TextInputProps,\n ValueAndOnValueChangeProps,\n} from \"@stenajs-webui/forms\";\nimport { Popover } from \"@stenajs-webui/tooltip\";\nimport * as React from \"react\";\nimport { useCallback, useMemo, useRef } from \"react\";\nimport { defaultPopoverPlacement } from \"../../../config/DefaultPopoverPlacement\";\nimport {\n DualTextInput,\n DualTextInputProps,\n} from \"../../../features/dual-text-input/DualTextInput\";\nimport { CalendarWithMonthSwitcher } from \"../../../features/month-switcher/CalendarWithMonthSwitcher\";\nimport { TimePicker } from \"../../../features/time-picker/TimePicker\";\nimport { addDayStateHighlights } from \"../../../util/calendar/StateModifier\";\nimport { transformTimeInDateToTimeString } from \"../../../util/time/TimeTransformer\";\nimport { useDateRangeEffects } from \"./hooks/UseDateRangeEffects\";\nimport { useDateRangeHandlers } from \"./hooks/UseDateRangeHandlers\";\nimport { useInputStates } from \"./hooks/UseInputStates\";\nimport { useUserInputHandlers } from \"./hooks/UseUserInputHandlers\";\nimport { OptionalMinMaxDatesAsString } from \"../../../types/CalendarTypes\";\nimport { defaultMaxDate } from \"../../../config/DefaultMaxDate\";\nimport { stenaClock } from \"@stenajs-webui/elements\";\n\nexport interface DateTimeInputProps\n extends ValueAndOnValueChangeProps<Date | null>,\n OptionalMinMaxDatesAsString,\n Pick<DualTextInputProps, \"widthLeft\" | \"widthRight\" | \"variant\"> {\n onEsc?: () => void;\n onEnter?: () => void;\n onBlur?: () => void;\n autoFocus?: boolean;\n disabled?: boolean;\n}\n\nexport const DateTimeInput: React.FC<DateTimeInputProps> = ({\n value,\n onValueChange,\n onEnter,\n onEsc,\n onBlur,\n autoFocus,\n minDate,\n widthLeft = 128,\n widthRight = 80,\n maxDate = defaultMaxDate,\n variant,\n disabled,\n}) => {\n const dateInputRef: TextInputProps[\"inputRef\"] = useRef(null);\n const timeInputRef: TextInputProps[\"inputRef\"] = useRef(null);\n\n const states = useInputStates(value);\n\n const {\n setCurrentPanel,\n currentPanel,\n isCalendarVisible,\n dateInFocus,\n setDateInFocus,\n isTimePickerVisible,\n hideTimePicker,\n localTime,\n localDate,\n } = states;\n\n const {\n showCalendar,\n hideCalendar,\n inputLeftChangeHandler,\n inputRightChangeHandler,\n onChangeTime,\n onChangeDate,\n } = useDateRangeHandlers(value, onValueChange, states, dateInputRef);\n\n const {\n onKeyDownHandler,\n onFocusRight,\n onFocusLeft,\n onClickDay,\n onClickCalendarButton,\n onClickArrowButton,\n } = useUserInputHandlers(\n onChangeDate,\n dateInputRef,\n showCalendar,\n hideCalendar,\n states\n );\n\n useDateRangeEffects(value, setDateInFocus, dateInputRef);\n\n const statePerMonth = useMemo(() => {\n const dateToHighlight = value || localDate;\n if (!dateToHighlight) {\n return {};\n }\n return addDayStateHighlights(undefined, dateToHighlight, [\n \"singleSelected\",\n \"selected\",\n ]);\n }, [localDate, value]);\n\n const hideAll = useCallback(() => {\n hideCalendar();\n hideTimePicker();\n }, [hideCalendar, hideTimePicker]);\n\n const timeValue = useMemo<string | undefined>(\n () => (value ? transformTimeInDateToTimeString(value) : localTime),\n [value, localTime]\n );\n\n const delayedIsCalendarVisible = useDelayedFalse(isCalendarVisible, 300);\n const delayedIsTimePickerVisible = useDelayedFalse(isTimePickerVisible, 300);\n\n return (\n <Box onKeyDown={onKeyDownHandler}>\n <Popover\n arrow={false}\n lazy\n disabled={disabled}\n placement={defaultPopoverPlacement}\n visible={isCalendarVisible || isTimePickerVisible}\n onClickOutside={hideAll}\n content={\n (delayedIsCalendarVisible || delayedIsTimePickerVisible) && (\n <Column>\n {delayedIsCalendarVisible ? (\n <CalendarWithMonthSwitcher\n statePerMonth={statePerMonth}\n onClickDay={onClickDay}\n dateInFocus={dateInFocus}\n setDateInFocus={setDateInFocus}\n currentPanel={currentPanel}\n setCurrentPanel={setCurrentPanel}\n minDate={minDate}\n maxDate={maxDate}\n />\n ) : delayedIsTimePickerVisible ? (\n <Column>\n <Column overflow={\"hidden\"} height={\"250px\"}>\n <TimePicker\n value={timeValue ?? \"\"}\n onValueChange={onChangeTime}\n />\n </Column>\n <Space />\n <Row justifyContent={\"flex-end\"}>\n <PrimaryButton label={\"Done\"} onClick={hideTimePicker} />\n </Row>\n </Column>\n ) : null}\n </Column>\n )\n }\n >\n <DualTextInput\n autoFocusLeft={autoFocus}\n onEsc={onEsc}\n onEnter={onEnter}\n onBlur={onBlur}\n disabled={disabled}\n separatorIcon={stenaClock}\n typeLeft={\"date\"}\n typeRight={\"time\"}\n placeholderLeft={\"yyyy-mm-dd\"}\n placeholderRight={\"hh:mm\"}\n onChangeLeft={inputLeftChangeHandler}\n onChangeRight={inputRightChangeHandler}\n onClickArrowDown={onClickArrowButton}\n onClickCalendar={onClickCalendarButton}\n onFocusLeft={onFocusLeft}\n onFocusRight={onFocusRight}\n onClickLeft={onFocusLeft}\n onClickRight={onFocusRight}\n inputRefLeft={dateInputRef}\n inputRefRight={timeInputRef}\n valueRight={timeValue ?? \"\"}\n widthLeft={widthLeft}\n widthRight={widthRight}\n minLeft={minDate}\n maxLeft={maxDate}\n variant={variant}\n />\n </Popover>\n </Box>\n );\n};\n","import * as React from \"react\";\nimport { Row } from \"@stenajs-webui/core\";\nimport { FlatButton, PrimaryButton } from \"@stenajs-webui/elements\";\nimport { ValueAndOnValueChangeProps } from \"@stenajs-webui/forms\";\n\ninterface Props extends ValueAndOnValueChangeProps<number> {\n year: number;\n}\n\nexport const YearPickerCell: React.FC<Props> = ({\n value,\n onValueChange,\n year,\n}) => {\n const label = String(year);\n return (\n <Row justifyContent={\"center\"}>\n {value === year ? (\n <PrimaryButton label={label} onClick={() => onValueChange?.(year)} />\n ) : (\n <FlatButton label={label} onClick={() => onValueChange?.(year)} />\n )}\n </Row>\n );\n};\n","import * as React from \"react\";\nimport { useEffect, useMemo, useState } from \"react\";\nimport { ValueAndOnValueChangeProps } from \"@stenajs-webui/forms\";\nimport { Column, Row } from \"@stenajs-webui/core\";\nimport { YearPickerCell } from \"./YearPickerCell\";\nimport {\n FlatButton,\n stenaArrowLeft,\n stenaArrowRight,\n} from \"@stenajs-webui/elements\";\nimport { chunk, range } from \"lodash-es\";\n\nexport interface YearPickerProps extends ValueAndOnValueChangeProps<number> {\n initialLastYear?: number;\n}\n\nexport const YearPicker: React.FC<YearPickerProps> = ({\n value,\n onValueChange,\n initialLastYear,\n}) => {\n const [lastYear, setLastYear] = useState(() => {\n if (value) {\n return value + 4;\n }\n return initialLastYear ?? new Date().getFullYear() + 4;\n });\n\n const yearRows = useMemo(() => {\n const startYear = lastYear - 11;\n return chunk(range(startYear, lastYear + 1), 3);\n }, [lastYear]);\n\n useEffect(() => {\n setLastYear((prev) => calculateLastYearInFocus(value, prev));\n }, [value]);\n\n return (\n <Row>\n <Column justifyContent={\"center\"}>\n <FlatButton\n leftIcon={stenaArrowLeft}\n onClick={() => setLastYear(lastYear - 3)}\n />\n </Column>\n <Column gap={1}>\n {yearRows.map((yearRow) => (\n <Row key={yearRow[0]} gap={1}>\n {yearRow.map((year) => (\n <YearPickerCell\n key={year}\n year={year}\n onValueChange={onValueChange}\n value={value}\n />\n ))}\n </Row>\n ))}\n </Column>\n <Column justifyContent={\"center\"}>\n <FlatButton\n leftIcon={stenaArrowRight}\n onClick={() => setLastYear(lastYear + 3)}\n />\n </Column>\n </Row>\n );\n};\n\nconst calculateLastYearInFocus = (\n value: number | undefined,\n lastYear: number\n): number => {\n if (value == null) {\n return lastYear;\n }\n if (value > lastYear) {\n const yearDiff = value - lastYear;\n const remaining = yearDiff % 3;\n const yearsToAdd = yearDiff - remaining + 3;\n return lastYear + yearsToAdd;\n }\n const startYear = lastYear - 11;\n if (value < startYear) {\n const yearDiff = startYear - value;\n const remaining = yearDiff % 3;\n const yearsToSubtract = yearDiff - remaining + 3;\n return lastYear - yearsToSubtract;\n }\n\n return lastYear;\n};\n","import { RefObject, useEffect } from \"react\";\n\nexport const useDateRangeEffects = (\n startDate: Date | undefined,\n endDate: Date | undefined,\n setDateInFocus: (date: Date) => void,\n startDateInputRef: RefObject<HTMLInputElement>,\n endDateInputRef: RefObject<HTMLInputElement>\n) => {\n useEffect(\n function moveFocusedDateWhenStartDateChanges() {\n if (startDate) {\n setDateInFocus(startDate);\n }\n },\n [startDate, setDateInFocus]\n );\n\n useEffect(\n function moveFocusedDateWhenEndDateChanges() {\n if (endDate) {\n setDateInFocus(endDate);\n }\n },\n [endDate, setDateInFocus]\n );\n\n useEffect(\n function updateStartDateFieldWhenValueChanges() {\n if (startDateInputRef.current) {\n if (startDate) {\n startDateInputRef.current.valueAsDate = new Date(\n Date.UTC(\n startDate.getFullYear(),\n startDate.getMonth(),\n startDate.getDate()\n )\n );\n } else {\n startDateInputRef.current.valueAsDate = null;\n }\n }\n },\n [startDate, startDateInputRef]\n );\n\n useEffect(\n function updateEndDateFieldWhenValueChanges() {\n if (endDateInputRef.current) {\n if (endDate) {\n endDateInputRef.current.valueAsDate = new Date(\n Date.UTC(\n endDate.getFullYear(),\n endDate.getMonth(),\n endDate.getDate()\n )\n );\n } else {\n endDateInputRef.current.valueAsDate = null;\n }\n }\n },\n [endDate, endDateInputRef]\n );\n};\n","import { ChangeEvent, useCallback } from \"react\";\nimport { DateRangeDualTextInputProps } from \"../DateRangeDualTextInput\";\nimport { UseInputStatesResult } from \"./UseInputStates\";\n\nexport const useDateRangeHandlers = (\n startDate: Date | undefined,\n endDate: Date | undefined,\n onValueChange: DateRangeDualTextInputProps[\"onValueChange\"],\n {\n setDateInFocus,\n showCalendarInternal,\n hideCalendarInternal,\n setFirstFocusedInput,\n setCurrentPanel,\n }: UseInputStatesResult\n) => {\n const inputLeftChangeHandler = useCallback(\n (ev: ChangeEvent<HTMLInputElement>) => {\n if (ev.target.value[0] !== \"0\") {\n onValueChange?.({\n startDate: ev.target.valueAsDate ?? undefined,\n endDate,\n });\n }\n },\n [onValueChange, endDate]\n );\n\n const inputRightChangeHandler = useCallback(\n (ev: ChangeEvent<HTMLInputElement>) => {\n if (ev.target.value[0] !== \"0\") {\n onValueChange?.({\n startDate,\n endDate: ev.target.valueAsDate ?? undefined,\n });\n }\n },\n [onValueChange, startDate]\n );\n\n const showCalendar = useCallback(() => {\n if (startDate) {\n setDateInFocus(startDate);\n } else if (endDate) {\n setDateInFocus(endDate);\n } else {\n setDateInFocus(new Date());\n }\n setCurrentPanel(\"calendar\");\n showCalendarInternal();\n }, [\n startDate,\n endDate,\n setCurrentPanel,\n showCalendarInternal,\n setDateInFocus,\n ]);\n\n const hideCalendar = useCallback(() => {\n setFirstFocusedInput(undefined);\n hideCalendarInternal();\n }, [setFirstFocusedInput, hideCalendarInternal]);\n\n return {\n inputLeftChangeHandler,\n inputRightChangeHandler,\n hideCalendar,\n setDateInFocus,\n setCurrentPanel,\n showCalendar,\n };\n};\n","import { useBoolean } from \"@stenajs-webui/core\";\nimport { useState } from \"react\";\nimport { DateRangeFocusedInput } from \"../../../calendar-types/date-range-calendar/DateRangeCalendar\";\nimport { CalendarPanelType } from \"../../../../features/calendar-with-month-year-pickers/CalendarPanelType\";\n\nexport type UseInputStatesResult = ReturnType<typeof useInputStates>;\n\nexport const useInputStates = (\n startDate: Date | undefined,\n endDate: Date | undefined\n) => {\n const [isCalendarVisible, showCalendarInternal, hideCalendarInternal] =\n useBoolean(false);\n\n const [firstFocusedInput, setFirstFocusedInput] = useState<\n DateRangeFocusedInput | undefined\n >(undefined);\n\n const [focusedInput, setFocusedInput] =\n useState<DateRangeFocusedInput>(\"startDate\");\n\n const [dateInFocus, setDateInFocus] = useState<Date>(() => {\n const fromValue =\n focusedInput === \"startDate\"\n ? startDate\n : focusedInput === \"endDate\"\n ? endDate\n : undefined;\n\n return fromValue ?? new Date();\n });\n\n const [currentPanel, setCurrentPanel] =\n useState<CalendarPanelType>(\"calendar\");\n\n return {\n isCalendarVisible,\n showCalendarInternal,\n hideCalendarInternal,\n firstFocusedInput,\n setFirstFocusedInput,\n focusedInput,\n setFocusedInput,\n dateInFocus,\n setDateInFocus,\n currentPanel,\n setCurrentPanel,\n };\n};\n","import { isAfter } from \"date-fns\";\nimport * as React from \"react\";\nimport { RefObject, useCallback } from \"react\";\nimport { DayData } from \"../../../../util/calendar/CalendarDataFactory\";\nimport { DateRangeDualTextInputProps } from \"../DateRangeDualTextInput\";\nimport { UseInputStatesResult } from \"./UseInputStates\";\n\nexport const useUserInputHandlers = (\n startDate: Date | undefined,\n endDate: Date | undefined,\n onValueChange: DateRangeDualTextInputProps[\"onValueChange\"],\n startDateInputRef: RefObject<HTMLInputElement>,\n endDateInputRef: RefObject<HTMLInputElement>,\n showCalendar: () => void,\n hideCalendar: () => void,\n {\n firstFocusedInput,\n setFirstFocusedInput,\n isCalendarVisible,\n setFocusedInput,\n focusedInput,\n setCurrentPanel,\n }: UseInputStatesResult\n) => {\n const onFocusLeft = useCallback(() => {\n if (firstFocusedInput == null) {\n setFirstFocusedInput(\"startDate\");\n }\n setFocusedInput(\"startDate\");\n if (!isCalendarVisible) {\n showCalendar();\n }\n }, [\n isCalendarVisible,\n setFocusedInput,\n showCalendar,\n setFirstFocusedInput,\n firstFocusedInput,\n ]);\n\n const onFocusRight = useCallback(() => {\n if (firstFocusedInput == null) {\n setFirstFocusedInput(\"endDate\");\n }\n setFocusedInput(\"endDate\");\n if (!isCalendarVisible) {\n showCalendar();\n }\n }, [\n isCalendarVisible,\n setFocusedInput,\n showCalendar,\n setFirstFocusedInput,\n firstFocusedInput,\n ]);\n\n const onClickDay = useCallback(\n (day: DayData) => {\n if (focusedInput === \"startDate\") {\n if (endDate != null && isAfter(day.date, endDate)) {\n onValueChange?.({\n startDate: day.date,\n endDate: undefined,\n });\n setFocusedInput(\"endDate\");\n endDateInputRef.current?.focus();\n } else {\n onValueChange?.({\n startDate: day.date,\n endDate,\n });\n if (firstFocusedInput === \"startDate\") {\n setFocusedInput(\"endDate\");\n endDateInputRef.current?.focus();\n } else {\n setTimeout(hideCalendar, 50);\n }\n }\n } else if (focusedInput === \"endDate\") {\n if (!startDate) {\n onValueChange?.({\n startDate,\n endDate: day.date,\n });\n setFocusedInput(\"startDate\");\n startDateInputRef.current?.focus();\n } else if (isAfter(startDate, day.date)) {\n onValueChange?.({\n startDate: day.date,\n endDate: undefined,\n });\n setFocusedInput(\"endDate\");\n endDateInputRef.current?.focus();\n } else {\n onValueChange?.({\n startDate,\n endDate: day.date,\n });\n setTimeout(hideCalendar, 50);\n }\n }\n },\n [\n focusedInput,\n onValueChange,\n endDate,\n firstFocusedInput,\n setFocusedInput,\n endDateInputRef,\n hideCalendar,\n startDate,\n startDateInputRef,\n ]\n );\n\n const onClickArrowButton = useCallback(() => {\n setCurrentPanel(\"presets\");\n showCalendar();\n }, [setCurrentPanel, showCalendar]);\n\n const onClickCalendarButton = useCallback(() => {\n if (isCalendarVisible) {\n hideCalendar();\n } else {\n setFocusedInput(\"startDate\");\n setFirstFocusedInput(\"startDate\");\n startDateInputRef.current?.focus();\n setCurrentPanel(\"calendar\");\n showCalendar();\n }\n }, [\n isCalendarVisible,\n hideCalendar,\n setFocusedInput,\n setFirstFocusedInput,\n startDateInputRef,\n setCurrentPanel,\n showCalendar,\n ]);\n\n const onKeyDownHandler = useCallback(\n (ev: React.KeyboardEvent<HTMLDivElement>) => {\n if (ev.key === \"Escape\") {\n hideCalendar();\n }\n },\n [hideCalendar]\n );\n\n return {\n onFocusLeft,\n onFocusRight,\n onClickDay,\n onClickArrowButton,\n onClickCalendarButton,\n onKeyDownHandler,\n };\n};\n","import { Box, useDelayedFalse } from \"@stenajs-webui/core\";\nimport { stenaArrowRight } from \"@stenajs-webui/elements\";\nimport {\n TextInputProps,\n ValueAndOnValueChangeProps,\n} from \"@stenajs-webui/forms\";\nimport { Popover } from \"@stenajs-webui/tooltip\";\nimport { isAfter } from \"date-fns\";\nimport * as React from \"react\";\nimport { useMemo, useRef } from \"react\";\nimport { defaultPopoverPlacement } from \"../../../config/DefaultPopoverPlacement\";\nimport {\n DualTextInput,\n DualTextInputProps,\n} from \"../../../features/dual-text-input/DualTextInput\";\nimport { CalendarWithMonthSwitcher } from \"../../../features/month-switcher/CalendarWithMonthSwitcher\";\nimport { buildDayStateForSingleMonth } from \"../../../util/calendar/StateModifier\";\nimport { useDateRangeEffects } from \"./hooks/UseDateRangeEffects\";\nimport { useDateRangeHandlers } from \"./hooks/UseDateRangeHandlers\";\nimport { useInputStates } from \"./hooks/UseInputStates\";\nimport { useUserInputHandlers } from \"./hooks/UseUserInputHandlers\";\nimport { DateRangeInputCalendarProps } from \"../../calendar-types/date-range-calendar/DateRangeCalendar\";\nimport { OptionalMinMaxDatesAsString } from \"../../../types/CalendarTypes\";\nimport { DateRange } from \"../../../types/DateRange\";\nimport { defaultMaxDate } from \"../../../config/DefaultMaxDate\";\n\nexport interface DateRangeDualTextInputProps<TData = unknown>\n extends ValueAndOnValueChangeProps<DateRange>,\n OptionalMinMaxDatesAsString,\n Pick<DualTextInputProps, \"widthLeft\" | \"widthRight\" | \"variant\"> {\n onEsc?: () => void;\n onEnter?: () => void;\n onBlur?: () => void;\n autoFocus?: boolean;\n calendarProps?: DateRangeInputCalendarProps<TData>;\n disabled?: boolean;\n}\n\nexport function DateRangeDualTextInput<TData>({\n value,\n onValueChange,\n autoFocus,\n onBlur,\n onEnter,\n onEsc,\n minDate,\n maxDate = defaultMaxDate,\n calendarProps,\n widthLeft = 128,\n widthRight = 128,\n variant,\n disabled,\n}: DateRangeDualTextInputProps<TData>) {\n const { startDate, endDate } = value || {};\n\n const startDateInputRef: TextInputProps[\"inputRef\"] = useRef(null);\n const endDateInputRef: TextInputProps[\"inputRef\"] = useRef(null);\n\n const states = useInputStates(startDate, endDate);\n\n const {\n dateInFocus,\n setDateInFocus,\n isCalendarVisible,\n currentPanel,\n setCurrentPanel,\n } = states;\n\n const {\n showCalendar,\n hideCalendar,\n inputLeftChangeHandler,\n inputRightChangeHandler,\n } = useDateRangeHandlers(startDate, endDate, onValueChange, states);\n\n const {\n onKeyDownHandler,\n onFocusRight,\n onFocusLeft,\n onClickDay,\n onClickCalendarButton,\n onClickArrowButton,\n } = useUserInputHandlers(\n startDate,\n endDate,\n onValueChange,\n startDateInputRef,\n endDateInputRef,\n showCalendar,\n hideCalendar,\n states\n );\n\n useDateRangeEffects(\n startDate,\n endDate,\n setDateInFocus,\n startDateInputRef,\n endDateInputRef\n );\n\n const startDateIsAfterEnd = useMemo(\n () => startDate && endDate && isAfter(startDate, endDate),\n [startDate, endDate]\n );\n\n const statePerMonth = useMemo(\n () =>\n buildDayStateForSingleMonth(\n calendarProps?.statePerMonth,\n startDate,\n endDate,\n dateInFocus\n ),\n [calendarProps?.statePerMonth, startDate, endDate, dateInFocus]\n );\n\n const delayedIsCalendarVisible = useDelayedFalse(isCalendarVisible, 300);\n\n return (\n <Box onKeyDown={onKeyDownHandler}>\n <Popover\n arrow={false}\n lazy\n disabled={disabled}\n placement={defaultPopoverPlacement}\n onClickOutside={hideCalendar}\n visible={isCalendarVisible}\n content={\n delayedIsCalendarVisible && (\n <CalendarWithMonthSwitcher\n onClickDay={onClickDay}\n dateInFocus={dateInFocus}\n setDateInFocus={setDateInFocus}\n currentPanel={currentPanel}\n setCurrentPanel={setCurrentPanel}\n minDate={minDate}\n maxDate={maxDate}\n {...calendarProps}\n statePerMonth={statePerMonth}\n />\n )\n }\n >\n <DualTextInput\n autoFocusLeft={autoFocus}\n onEsc={onEsc}\n onEnter={onEnter}\n onBlur={onBlur}\n disabled={disabled}\n separatorIcon={stenaArrowRight}\n typeLeft={\"date\"}\n typeRight={\"date\"}\n placeholderLeft={\"Start date\"}\n placeholderRight={\"End date\"}\n onChangeLeft={inputLeftChangeHandler}\n onChangeRight={inputRightChangeHandler}\n onClickArrowDown={onClickArrowButton}\n onClickCalendar={onClickCalendarButton}\n onFocusLeft={onFocusLeft}\n onFocusRight={onFocusRight}\n onClickLeft={onFocusLeft}\n onClickRight={onFocusRight}\n inputRefLeft={startDateInputRef}\n inputRefRight={endDateInputRef}\n variant={startDateIsAfterEnd ? \"error\" : variant}\n widthLeft={widthLeft}\n widthRight={widthRight}\n minLeft={minDate}\n maxLeft={maxDate}\n minRight={minDate}\n maxRight={maxDate}\n />\n </Popover>\n </Box>\n );\n}\n"],"names":["DateFormats","buildDayStateForDateRange","statePerMonth","start","end","isAfter","eachDayOfInterval","result","date","isFirstInRange","isSameDay","isLastInRange","addDayStateHighlights","state","buildDayStateForSingleMonth","dateInFocus","buildDayStateForRange","startOfMonth","endOfMonth","startLimit","endLimit","max","subDays","min","addDays","setDayStateValue","values","monthString","format","weekNumber","getISOWeek","dayInMonth","getDate","setDayStateValueFunction","setter","calendarState","highlights","month","dayState","addDayStateHighlightsOnSingleDay","addWeekStateHighlights","week","day","weekState","newHighlights","newWeekState","addWeekRangeHighlights","startDate","endDate","last","useHighlightToday","enabled","useMemo","Month","Month2","WeekDay","WeekDay2","getMonthsInYear","year","startMonth","numMonths","locale","months","i","getMonthInYear","yearToUse","monthToUse","firstDayOfMonth","startCase","getWeeksForMonth","forceSixWeeks","firstDayOfFirstWeek","startOfWeek","weeks","getWeekForDate","addWeeks","firstDayOfWeek","isLastWeekOfMonth","getMonth","getWeek","getYear","getDaysForWeekForDate","createDay","dayOfWeek","getISODay","addHours","d","calculateOverflowingMonth","dayHasHighlight","defaultHighlights","highlight","dayHighlightSelect","highlightsOrBoolean","returnValues","fallbackValue","defaultWrapperStyleProvider","selectedBackground","todayBackground","rangeBackground","borderColor","_","defaultTextPropsProvider","selectedColor","disabledColor","inOtherMonthColor","rangeTextColor","isOtherMonth","defaultCalendarTheme","extranetCalendarTheme","WeekDayCell","onClickWeekDay","theme","content","jsx","Box","Text","Clickable","ev","CalendarDay","userData","onClickDay","ExtraDayContent","WrapperTd","styled","InnerWrapperDiv","CellWrapperDiv","disabled","isDisabled","jsxs","Fragment","WeekNumberCell","onClickWeek","background","backgroundColor","prefix","isDateInMinMaxRange","isBefore","DisabledDayWrapper","DayComponent","minDate","maxDate","props","activeDayState","CalendarMonth","dayComponent","statePerWeek","userDataPerWeek","onClickMonth","renderWeekNumber","renderWeekDay","headerRightContent","extraDayContent","showWeekNumber","Row","FlatButton","stenaAngleDown","CalendarPanel","monthRows","userDataPerMonth","minDateObj","parse","maxDateObj","cx","styles","monthRow","rowIndex","Spacing","Calendar","initialDate","getInitialDate","getMonthRows","enGB","now","monthsPerRow","chunk","MonthPickerCell","onClick","selected","label","PrimaryButton","MonthPicker","value","onValueChange","firstMonth","input","createMonths","Column","Heading","currentYear","currentMonth","createFirstDate","createStandardDateRangePresets","PresetPicker","onClickPreset","pageIndex","setPageIndex","useState","pages","currentPage","stenaAngleLeft","stenaAngleRight","Space","preset","React","CalendarWithMonthYearPickers","setDateInFocus","currentPanel","setCurrentPanel","renderMonthPicker","onChangeSelectedMonth","useCallback","selectedMonth","newDate","useSelectedMonthStepperLogic","nextMonth","addMonths","nextYear","addYears","prevMonth","subMonths","prevYear","subYears","WithMonthSwitcherBelow","children","Indent","SecondaryButton","stenaAngleLeftDouble","stenaArrowLeft","stenaArrowRight","stenaAngleRightDouble","noop","CalendarWithMonthSwitcher","monthSwitcherPlacement","onSelectPreset","calendarProps","fallbackIfNoPlacement","dateRangeToStrings","dateRange","stringsToDateRange","isDateRangeInvalid","toggleDatesIfEndIsEarlierThanStart","toggleDateStringsIfEndIsEarlierThanStart","useDateRangeOnClickDayHandler","focusedInput","setFocusedInput","useInternalPanelState","onChangePanel","_setCurrentPanel","useDateRangeSelection","initialDateInFocus","statePerMonthWithSelection","DateRangeCalendar","dateRangeSelectionProps","useDateRangeCalendarState","setStartDate","setEndDate","useSingleDateSelection","onChange","statePerMonthWithSelectedDate","SingleDateCalendar","singleDateSelectionProps","useMultiDateSelection","isSelected","v","stateSum","MultiDateCalendar","selectionProps","useSingleWeekSelection","getWeekDataFromWeekString","getWeekStringFromWeekData","weekData","parts","firstDateOfWeek","setWeek","SingleWeekCalendar","singleWeekSelectionProps","defaultPopoverPlacement","useCalendarPopoverUpdater","tippyRef","tippyInstanceRef","useTippyInstance","_b","_a","useDateInput","onClose","openOnMount","showingCalendar","setShowingCalendar","showCalendar","hideCalendar","onSelectDate","defaultMaxDate","DateInput","displayFormat","placeholder","zIndex","calendarTheme","portalTarget","variant","width","Popover","TextInput","TextInputButton","stenaCalendar","useDateRangeInput","startDateInputRef","useRef","endDateInputRef","showCalendarStartDate","showCalendarEndDate","startDateIsAfterEnd","DateRangeInput","placeholderStartDate","placeholderEndDate","Icon","stenaArrowWideRight","cssColor","DateTextInput","closeOnCalendarSelectDate","dateFormat","disableCalender","hideCalenderIcon","open","setOpen","toggleCalendar","onValueChangeHandler","onCalendarSelectDate","inValidInput","dateIsValid","isValid","invalid","formatHours","hours","h","formatMinutes","minutes","m","formatTimeString","time","validUserInput","arr","timeNumber","TimeTextInput","showPlaceholder","useIcon","valid","setValid","timeFormat","onBlur","formattedResult","onChangeHandler","validInput","stenaClock","DualTextInput","autoFocusLeft","autoFocusRight","onEsc","onEnter","onValueChangeLeft","onValueChangeRight","separatorIcon","placeholderLeft","placeholderRight","typeLeft","typeRight","onChangeLeft","onChangeRight","valueLeft","valueRight","minLeft","maxLeft","minRight","maxRight","onClickLeft","onClickRight","onClickCalendar","onClickArrowDown","onBlurLeft","onBlurRight","onFocusLeft","onFocusRight","inputRefLeft","inputRefRight","variantLeft","variantRight","showPresets","widthLeft","widthRight","focusCounter","tryTriggerOnBlur","debounce","focusLeftHandler","focusRightHandler","blurLeftHandler","blurRightHandler","TextInputBox","SeparatorLine","transformTimeStringToNumber","isValidTimeString","getHoursAndMinutesFromTimeString","p","parseIntElseUndefined","transformTimeInDateToTimeString","TimePickerCell","item","columnRef","canScrollRef","ref","useEffect","targetScroll","padStart","TimePickerColumn","items","selectedItem","range","TimePicker","hour","setHour","minute","setMinute","onClickHour","onClickMinutes","useDateRangeEffects","dateInputRef","useDateRangeHandlers","showCalendarInternal","hideCalendarInternal","setFirstFocusedInput","localTime","setLocalTime","localDate","setLocalDate","onChangeDate","incomingDate","onChangeTime","newTime","inputLeftChangeHandler","inputRightChangeHandler","useInputStates","isCalendarVisible","useBoolean","isTimePickerVisible","showTimePicker","hideTimePicker","firstFocusedInput","useUserInputHandlers","onClickArrowButton","onClickCalendarButton","onKeyDownHandler","DateTimeInput","autoFocus","timeInputRef","states","dateToHighlight","hideAll","timeValue","delayedIsCalendarVisible","useDelayedFalse","delayedIsTimePickerVisible","YearPickerCell","YearPicker","initialLastYear","lastYear","setLastYear","yearRows","startYear","prev","calculateLastYearInFocus","yearRow","yearDiff","remaining","yearsToAdd","yearsToSubtract","_d","_c","DateRangeDualTextInput"],"mappings":"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A,gDACA,gDACA,4CACA,0BACF,EACAU,CACF,EACA,oBAAqBR,EACnBrD,EACAmD,EACA,CAAC,gBAAiB,iBAAkB,OAAO,EAC3C,CACE,yCACA,yCACA,wCACF,EACA,OACF,EACA,uBAAwBE,EACtBrD,EACAmD,EACA,CAAC,gBAAiB,iBAAkB,OAAO,EAC3C,CACE,yCACA,yCACA,wCACF,EACA,OACF,EACA,qBAAsBE,EACpBrD,EACAmD,EACA,CAAC,cAAe,iBAAkB,OAAO,EACzC,CACE,yCACA,yCACA,wCACF,EACA,OACF,EACA,wBAAyBE,EACvBrD,EACAmD,EACA,CAAC,cAAe,iBAAkB,OAAO,EACzC,CACE,yCACA,yCACA,wCACF,EACA,OACF,EACA,UAAW,YAAA,GAWJY,GAA2B,CAAC,CACvC,cAAAC,EACA,cAAAC,EACA,kBAAAC,EACA,eAAAC,CACF,IACS,CAAChB,EAAmBnD,EAAUI,EAAK0D,EAAG/D,IAAU,CAC/C,MAAAqE,EAAehE,EAAI,QAAUL,EAAM,YAalC,MAAA,CACL,MAbYsD,EACZrD,EACAmD,EACA,CAACiB,EAAc,WAAY,QAAS,UAAW,UAAU,EACzD,CACEF,EACAF,EACAG,EACA,OACAF,CACF,CAAA,CAGA,CACF,EAISI,EAAsC,CACjD,MAAO,iCACP,OAAQ,kCACR,WAAY,CACV,gBAAiB,4CACjB,UAAW,8CACX,mBAAoB,uDACtB,EACA,QAAS,CACP,UAAW,2CACX,mBAAoB,oDACtB,EACA,YAAa,CACX,QAASZ,GAA4B,CACnC,mBAAoB,mDACpB,gBAAiB,gDACjB,gBAAiB,+CAAA,CAClB,EACD,UAAWM,GAAyB,CAClC,cAAe,2CACf,cAAe,2CACf,kBAAmB,gDAAA,CACpB,CACH,EACA,cAAe,CACb,gBAAiB,0CACnB,CACF,EAEaO,GAAuC,CAClD,GAAGD,EACH,MAAO,OACP,OAAQ,MACV,ECjNaE,GAAc,CAAC,CAC1B,eAAAC,EACA,IAAApE,EACA,MAAAqE,CACF,IAAwB,CACtB,MAAMC,EACJC,EAAA,IAACC,EAAA,IAAA,CACC,MAAOH,EAAM,MACb,OAAQA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"}