@stenajs-webui/calendar 20.6.11 → 20.7.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.
Files changed (25) hide show
  1. package/dist/components/calendar/CalendarTheme.d.ts +3 -3
  2. package/dist/components/calendar/DisabledDayWrapper.d.ts +1 -1
  3. package/dist/components/calendar/renderers/CalendarDay.d.ts +1 -1
  4. package/dist/components/calendar-types/date-range-calendar/DateRangeCalendar.d.ts +2 -2
  5. package/dist/components/calendar-types/single-week-calendar/SingleWeekCalendar.d.ts +1 -1
  6. package/dist/components/input-types/date-input/UseDateInput.d.ts +1 -1
  7. package/dist/components/input-types/date-range-dual-text-input/hooks/UseInputStates.d.ts +1 -1
  8. package/dist/components/input-types/date-text-input/DateTextInput.d.ts +1 -1
  9. package/dist/components/input-types/date-time-input/hooks/UseInputStates.d.ts +1 -1
  10. package/dist/features/calendar-with-month-year-pickers/CalendarPanelType.d.ts +1 -1
  11. package/dist/features/internal-panel-state/UseInternalPanelState.d.ts +1 -1
  12. package/dist/features/month-switcher/CalendarWithMonthSwitcher.d.ts +1 -1
  13. package/dist/features/month-switcher/hooks/UseSelectedMonthStepperLogic.d.ts +1 -1
  14. package/dist/features/preset-picker/CalendarPreset.d.ts +1 -1
  15. package/dist/index.d.ts +0 -2
  16. package/dist/index.es.js +1036 -1082
  17. package/dist/index.es.js.map +1 -1
  18. package/dist/index.js +1 -1
  19. package/dist/index.js.map +1 -1
  20. package/dist/types/CalendarTypes.d.ts +15 -15
  21. package/dist/types/InternalPanelAndFocusStateProps.d.ts +1 -1
  22. package/dist/util/calendar/StateHelper.d.ts +1 -1
  23. package/package.json +7 -7
  24. package/dist/components/calendar-types/date-range-exclusion-calendar/DateRangeExclusionCalendar.d.ts +0 -7
  25. package/dist/components/calendar-types/date-range-exclusion-calendar/UseDateRangeExclusionSelection.d.ts +0 -3
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/util/date/DateMinMaxValidator.ts","../src/components/calendar/DisabledDayWrapper.tsx","../src/components/calendar/renderers/WeekNumberCell.tsx","../src/components/calendar/CalendarWeek.tsx","../src/components/calendar/renderers/WeekDayCell.tsx","../src/components/calendar/renderers/CalendarDay.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/year-picker/YearPickerCell.tsx","../src/features/year-picker/YearPicker.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/util/date/DateListTools.ts","../src/components/calendar-types/date-range-exclusion-calendar/UseDateRangeExclusionSelection.ts","../src/components/calendar-types/date-range-exclusion-calendar/DateRangeExclusionCalendar.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/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 show?: boolean;\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 let style = {};\n\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 ...style,\n backgroundColor,\n borderTopLeftRadius: dayHighlightSelect(\n dayState,\n defaultHighlights,\n [\"selectedStart\", \"singleSelected\"],\n [\n \"var(--swui-calendar-day-border-radius)\",\n \"var(--swui-calendar-day-border-radius)\",\n ],\n borderColor\n ),\n borderBottomLeftRadius: dayHighlightSelect(\n dayState,\n defaultHighlights,\n [\"selectedStart\", \"singleSelected\"],\n [\n \"var(--swui-calendar-day-border-radius)\",\n \"var(--swui-calendar-day-border-radius)\",\n ],\n borderColor\n ),\n borderTopRightRadius: dayHighlightSelect(\n dayState,\n defaultHighlights,\n [\"selectedEnd\", \"singleSelected\"],\n [\n \"var(--swui-calendar-day-border-radius)\",\n \"var(--swui-calendar-day-border-radius)\",\n ],\n borderColor\n ),\n borderBottomRightRadius: dayHighlightSelect(\n dayState,\n defaultHighlights,\n [\"selectedEnd\", \"singleSelected\"],\n [\n \"var(--swui-calendar-day-border-radius)\",\n \"var(--swui-calendar-day-border-radius)\",\n ],\n borderColor\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 show: true,\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 { 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, 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 * as React from \"react\";\nimport {\n CalendarDayProps,\n CalendarUserWeekData,\n DayState,\n DayStateHighlight,\n ExtraDayContentProps,\n OnClickDay,\n OnClickWeek,\n OptionalMinMaxDates,\n RenderWeekNumber,\n} from \"../../types/CalendarTypes\";\nimport { MonthData, WeekData } from \"../../util/calendar/CalendarDataFactory\";\n\nimport { CalendarTheme } from \"./CalendarTheme\";\nimport { DisabledDayWrapper } from \"./DisabledDayWrapper\";\nimport { WeekNumberCell } from \"./renderers/WeekNumberCell\";\n\nexport interface CalendarWeekProps<T> extends OptionalMinMaxDates {\n dayComponent: React.ComponentType<CalendarDayProps<T>>;\n week: WeekData;\n month: MonthData;\n statePerWeekDay?: CalendarUserWeekData<DayState>;\n userDataPerWeekDay?: CalendarUserWeekData<T>;\n onClickWeek?: OnClickWeek;\n onClickDay?: OnClickDay<T>;\n theme: CalendarTheme;\n renderWeekNumber?: RenderWeekNumber;\n extraDayContent?: React.ComponentType<ExtraDayContentProps<T>>;\n defaultHighlights?: Array<DayStateHighlight>;\n}\n\nexport function CalendarWeek<T>({\n week,\n month,\n dayComponent,\n statePerWeekDay,\n userDataPerWeekDay,\n minDate,\n maxDate,\n onClickWeek,\n onClickDay,\n theme,\n renderWeekNumber,\n extraDayContent,\n defaultHighlights,\n}: CalendarWeekProps<T>) {\n return (\n <tr key={week.weekNumber}>\n {theme.WeekNumber.show && (\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={statePerWeekDay && statePerWeekDay[day.dayOfMonth]}\n userData={userDataPerWeekDay && userDataPerWeekDay[day.dayOfMonth]}\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","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, Clickable, 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 return (\n <WrapperTd>\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 {onClickDay && isClickable(defaultHighlights, dayState) ? (\n <Clickable\n onClick={(ev) => onClickDay(day, userData, ev)}\n style={{ width: \"100%\", height: \"100%\" }}\n borderRadius={\"var(--swui-calendar-day-border-radius)\"}\n >\n {content}\n </Clickable>\n ) : (\n <>{content}</>\n )}\n </>\n )}\n </CellWrapperDiv>\n </InnerWrapperDiv>\n </WrapperTd>\n );\n};\n\nconst isClickable = (\n defaultHighlights: Array<DayStateHighlight> | undefined,\n dayState: DayState | undefined\n): boolean =>\n !!dayHighlightSelect<boolean>(\n dayState,\n defaultHighlights,\n [\"enabled\", \"disabled\"],\n [true, false],\n true\n );\n","import { Box, Row, Space, 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 { CalendarWeek } from \"./CalendarWeek\";\nimport { WeekDayCell } from \"./renderers/WeekDayCell\";\nimport { CalendarDay } from \"./renderers/CalendarDay\";\nimport { FlatButton } from \"@stenajs-webui/elements\";\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 headerLeftContent?: React.ReactElement<{}>;\n headerRightContent?: React.ReactElement<{}>;\n extraDayContent?: React.ComponentType<ExtraDayContentProps<T>>;\n defaultHighlights?: Array<DayStateHighlight>;\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 onClickYear,\n renderWeekNumber,\n renderWeekDay,\n headerLeftContent,\n headerRightContent,\n theme = defaultCalendarTheme,\n extraDayContent,\n defaultHighlights,\n}: CalendarMonthProps<T>) {\n const showWeekNumber = theme.WeekNumber.show;\n\n return (\n <>\n <Box alignItems={\"stretch\"}>\n <Row\n justifyContent={\"space-between\"}\n alignItems={\"center\"}\n height={\"32px\"}\n >\n <Box alignItems={\"center\"}>{headerLeftContent}</Box>\n\n <Row alignItems={\"center\"}>\n <Row width={\"104px\"} justifyContent={\"center\"}>\n {onClickMonth ? (\n <FlatButton\n onClick={() => onClickMonth(month)}\n label={month.name}\n />\n ) : (\n <Text>{month.name}</Text>\n )}\n </Row>\n <Space />\n <Row width={\"64px\"} justifyContent={\"center\"}>\n {onClickYear ? (\n <FlatButton\n onClick={() => onClickYear(month.year)}\n label={String(month.year)}\n />\n ) : (\n <Text>{month.year}</Text>\n )}\n </Row>\n </Row>\n\n <Box alignItems={\"center\"}>{headerRightContent}</Box>\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 <CalendarWeek<T>\n key={week.weekNumber}\n month={month}\n week={week}\n dayComponent={dayComponent}\n statePerWeekDay={statePerWeek && statePerWeek[week.weekNumber]}\n userDataPerWeekDay={\n userDataPerWeek && userDataPerWeek[week.weekNumber]\n }\n onClickDay={onClickDay}\n onClickWeek={onClickWeek}\n theme={theme}\n renderWeekNumber={renderWeekNumber}\n extraDayContent={extraDayContent}\n defaultHighlights={defaultHighlights}\n minDate={minDate}\n maxDate={maxDate}\n />\n ))}\n </tbody>\n </table>\n </Box>\n </>\n );\n}\n","import { Row, Space, 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 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 onClickYear,\n renderWeekDay,\n renderWeekNumber,\n headerLeftContent,\n headerRightContent,\n extraDayContent,\n defaultHighlights,\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 className={styles.calendar}>\n {monthRows.map((monthRow, rowIndex) => (\n <Spacing key={rowIndex}>\n <Row>\n {monthRow.map((month, index) => (\n <React.Fragment key={month.name}>\n {index > 0 && <Space />}\n <CalendarMonth<T>\n month={month}\n dayComponent={dayComponent}\n userDataPerWeek={\n userDataPerMonth && userDataPerMonth[month.monthString]\n }\n statePerWeek={\n statePerMonth && statePerMonth[month.monthString]\n }\n onClickDay={onClickDay}\n onClickWeekDay={onClickWeekDay}\n onClickWeek={onClickWeek}\n onClickMonth={onClickMonth}\n onClickYear={onClickYear}\n theme={theme}\n renderWeekNumber={renderWeekNumber}\n renderWeekDay={renderWeekDay}\n headerLeftContent={headerLeftContent}\n headerRightContent={headerRightContent}\n extraDayContent={extraDayContent}\n defaultHighlights={defaultHighlights}\n minDate={minDateObj}\n maxDate={maxDateObj}\n />\n </React.Fragment>\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 { ValueAndOnValueChangeProps } from \"@stenajs-webui/forms\";\nimport { Month } from \"../../util/calendar/CalendarDataFactory\";\nimport { format } from \"date-fns\";\n\ninterface Props extends ValueAndOnValueChangeProps<Month> {\n month: Month;\n locale: Locale;\n}\n\nexport const MonthPickerCell: React.FC<Props> = ({\n value,\n onValueChange,\n month,\n locale,\n}) => {\n const label = useMemo(() => {\n const now = new Date(2000, month, 1);\n return startCase(format(now, \"MMM\", { locale }));\n }, [locale, month]);\n\n return (\n <Row justifyContent={\"center\"}>\n {value === month ? (\n <PrimaryButton\n label={label}\n onClick={() => onValueChange && onValueChange(month)}\n />\n ) : (\n <FlatButton\n label={label}\n onClick={() => onValueChange && onValueChange(month)}\n />\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, Row } from \"@stenajs-webui/core\";\nimport { MonthPickerCell } from \"./MonthPickerCell\";\n\nexport interface MonthPickerProps extends ValueAndOnValueChangeProps<Month> {\n locale?: Locale;\n}\n\nconst monthMatrix = [\n [Month.JANUARY, Month.FEBRUARY, Month.MARCH],\n [Month.APRIL, Month.MAY, Month.JUNE],\n [Month.JULY, Month.AUGUST, Month.SEPTEMBER],\n [Month.OCTOBER, Month.NOVEMBER, Month.DECEMBER],\n];\n\nexport const MonthPicker: React.FC<MonthPickerProps> = ({\n value,\n onValueChange,\n locale = enGB,\n}) => {\n return (\n <Column gap={1}>\n {monthMatrix.map((monthRow) => (\n <Row key={monthRow[0]} gap={1}>\n {monthRow.map((month) => (\n <MonthPickerCell\n key={month}\n month={month}\n onValueChange={onValueChange}\n value={value}\n locale={locale}\n />\n ))}\n </Row>\n ))}\n </Column>\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 * 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 { Box } from \"@stenajs-webui/core\";\nimport { PrimaryButton } from \"@stenajs-webui/elements\";\nimport * as React from \"react\";\nimport { useCallback } from \"react\";\nimport { Calendar } from \"../../components/calendar/Calendar\";\nimport { CalendarProps } from \"../../types/CalendarTypes\";\nimport { Month } from \"../../util/calendar/CalendarDataFactory\";\nimport { MonthPicker } from \"../month-picker/MonthPicker\";\nimport { CalendarPreset } from \"../preset-picker/CalendarPreset\";\nimport { PresetPicker } from \"../preset-picker/PresetPicker\";\nimport { YearPicker } from \"../year-picker/YearPicker\";\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}\n\nexport const CalendarWithMonthYearPickers =\n function CalendarWithMonthYearPickers<T>({\n locale,\n dateInFocus,\n setDateInFocus,\n currentPanel,\n setCurrentPanel,\n ...props\n }: CalendarWithMonthYearPickersProps<T>) {\n const onChangeSelectedMonth = useCallback(\n (selectedMonth: Month) => {\n const newDate = dateInFocus ? new Date(dateInFocus) : new Date();\n newDate.setMonth(selectedMonth);\n if (setDateInFocus) {\n setDateInFocus(newDate);\n }\n setCurrentPanel(\"calendar\");\n },\n [dateInFocus, setDateInFocus, setCurrentPanel]\n );\n\n const onChangeSelectedYear = useCallback(\n (selectedYear: number) => {\n const newDate = dateInFocus ? new Date(dateInFocus) : new Date();\n newDate.setFullYear(selectedYear);\n if (setDateInFocus) {\n setDateInFocus(newDate);\n }\n setCurrentPanel(\"calendar\");\n },\n [dateInFocus, setDateInFocus, setCurrentPanel]\n );\n\n const onClickYear = useCallback(() => {\n setCurrentPanel(\"year\");\n }, [setCurrentPanel]);\n\n const onClickMonth = useCallback(() => {\n setCurrentPanel(\"month\");\n }, [setCurrentPanel]);\n\n switch (currentPanel) {\n case \"calendar\":\n return (\n <>\n <Calendar<T>\n {...props}\n date={dateInFocus}\n onClickYear={onClickYear}\n onClickMonth={onClickMonth}\n locale={locale}\n />\n </>\n );\n case \"month\":\n return (\n <MonthPicker\n value={dateInFocus.getMonth()}\n onValueChange={onChangeSelectedMonth}\n locale={locale}\n />\n );\n case \"year\":\n return (\n <YearPicker\n value={dateInFocus.getFullYear()}\n onValueChange={onChangeSelectedYear}\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 FlatButton,\n stenaAngleLeft,\n stenaAngleLeftDouble,\n stenaAngleRight,\n stenaAngleRightDouble,\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>\n <FlatButton onClick={prevYear} leftIcon={stenaAngleLeftDouble} />\n <Space />\n <FlatButton onClick={prevMonth} leftIcon={stenaAngleLeft} />\n <Indent num={2} />\n <FlatButton onClick={nextMonth} leftIcon={stenaAngleRight} />\n <Space />\n <FlatButton onClick={nextYear} leftIcon={stenaAngleRightDouble} />\n </Row>\n </Indent>\n <Space />\n </div>\n);\n","import { Column, Row, Space } from \"@stenajs-webui/core\";\nimport {\n FlatButton,\n stenaAngleLeft,\n stenaAngleLeftDouble,\n stenaAngleRight,\n stenaAngleRightDouble,\n} from \"@stenajs-webui/elements\";\nimport * as React from \"react\";\nimport { Calendar } from \"../../components/calendar/Calendar\";\nimport { defaultCalendarTheme } from \"../../components/calendar/CalendarTheme\";\nimport { CalendarProps } 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\";\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 hideYearPagination?: boolean;\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 hideYearPagination = false,\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 dateInFocus={dateInFocus}\n setDateInFocus={setDateInFocus}\n currentPanel={currentPanel}\n setCurrentPanel={setCurrentPanel}\n onSelectPreset={onSelectPreset}\n headerLeftContent={\n <Row alignItems={\"center\"}>\n {!hideYearPagination && (\n <FlatButton\n onClick={prevYear}\n leftIcon={stenaAngleLeftDouble}\n />\n )}\n <Space />\n <FlatButton onClick={prevMonth} leftIcon={stenaAngleLeft} />\n </Row>\n }\n headerRightContent={\n <Row alignItems={\"center\"}>\n <FlatButton onClick={nextMonth} leftIcon={stenaAngleRight} />\n <Space />\n {!hideYearPagination && (\n <FlatButton\n onClick={nextYear}\n leftIcon={stenaAngleRightDouble}\n />\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 { isSameDay } from \"date-fns\";\n\nexport const addDateIfNotExists = (\n list: Array<Date>,\n date: Date\n): Array<Date> => {\n if (list.filter((item) => isSameDay(item, date)).length >= 1) {\n return list;\n }\n return [...list, date];\n};\n\nexport const removeDateIfExist = (list: Array<Date>, date: Date): Array<Date> =>\n list.filter((item) => !isSameDay(item, date));\n\nexport const listContainsDate = (list: Array<Date>, date: Date): boolean =>\n !!list.find((item) => isSameDay(item, date));\n","import { eachDayOfInterval } from \"date-fns\";\nimport { useCallback, useMemo, useState } from \"react\";\nimport { useDateRangeOnClickDayHandler } from \"../../../features/date-range/hooks/UseDateRangeOnClickDayHandler\";\nimport { CalendarState, OnClickDay } from \"../../../types/CalendarTypes\";\nimport { addDayStateHighlights } from \"../../../util/calendar/StateModifier\";\nimport {\n listContainsDate,\n removeDateIfExist,\n} from \"../../../util/date/DateListTools\";\nimport { DateRangeFocusedInput } from \"../date-range-calendar/DateRangeCalendar\";\nimport { DateRangeExclusionCalendarProps } from \"./DateRangeExclusionCalendar\";\nimport { CalendarWithMonthSwitcherProps } from \"../../../features/month-switcher/CalendarWithMonthSwitcher\";\nimport { useInternalPanelState } from \"../../../features/internal-panel-state/UseInternalPanelState\";\nimport { DateRange } from \"../../../types/DateRange\";\n\nexport const useDateRangeExclusionSelection = <T>({\n value,\n onValueChange,\n statePerMonth,\n onChangePanel,\n}: DateRangeExclusionCalendarProps<T>): CalendarWithMonthSwitcherProps<T> => {\n const [dateRange, setDateRange] = useState<DateRange | undefined>();\n const [focusedInput, setFocusedInput] =\n useState<DateRangeFocusedInput>(\"startDate\");\n const { currentPanel, setCurrentPanel } =\n useInternalPanelState(onChangePanel);\n\n const [dateInFocus, setDateInFocus] = useState(\n () => (focusedInput && value?.[focusedInput]) ?? new Date()\n );\n\n const onChangeHandler = useCallback(\n (value: DateRange) => {\n setDateRange(value);\n const { startDate, endDate } = value;\n if (onValueChange) {\n if (startDate && endDate) {\n const dates = eachDayOfInterval({ start: startDate, end: endDate });\n onValueChange(dates);\n } else if (startDate) {\n onValueChange([startDate]);\n } else if (endDate) {\n onValueChange([endDate]);\n }\n }\n },\n [onValueChange]\n );\n\n const onClickDayRange = useDateRangeOnClickDayHandler(\n dateRange,\n onChangeHandler,\n focusedInput,\n setFocusedInput\n );\n\n const onClickDay: OnClickDay<T> = useCallback(\n (day, userData, ev) => {\n if (onValueChange) {\n if (ev.ctrlKey || ev.metaKey) {\n if (!value) {\n onValueChange([day.date]);\n } else if (listContainsDate(value, day.date)) {\n onValueChange(removeDateIfExist(value, day.date));\n } else {\n onValueChange([...value, day.date]);\n }\n } else {\n onClickDayRange(day, userData, ev);\n }\n }\n },\n [onValueChange, onClickDayRange, value]\n );\n const statePerMonthWithSelectedDate = useMemo(() => {\n return addHighlighting(statePerMonth, value);\n }, [statePerMonth, value]);\n\n return {\n onClickDay,\n statePerMonth: statePerMonthWithSelectedDate,\n currentPanel,\n setCurrentPanel,\n dateInFocus,\n setDateInFocus,\n };\n};\n\nconst addHighlighting = (\n statePerMonth: CalendarState | undefined,\n dateList: Array<Date> | undefined\n): CalendarState | undefined => {\n if (!dateList) {\n return statePerMonth;\n }\n return dateList.reduce((statePerMonth, date) => {\n return addDayStateHighlights(statePerMonth, date, [\"selected\"]);\n }, statePerMonth);\n};\n","import * as React from \"react\";\nimport { CalendarWithMonthSwitcher } from \"../../../features/month-switcher/CalendarWithMonthSwitcher\";\nimport { useDateRangeExclusionSelection } from \"./UseDateRangeExclusionSelection\";\nimport { UseInternalPanelStateProps } from \"../../../features/internal-panel-state/UseInternalPanelState\";\nimport { InternalPanelAndFocusStateProps } from \"../../../types/InternalPanelAndFocusStateProps\";\nimport { ValueAndOnValueChangeProps } from \"@stenajs-webui/forms\";\n\nexport interface DateRangeExclusionCalendarProps<T>\n extends InternalPanelAndFocusStateProps<T>,\n UseInternalPanelStateProps,\n ValueAndOnValueChangeProps<Array<Date>> {}\n\nexport function DateRangeExclusionCalendar<T>(\n props: DateRangeExclusionCalendarProps<T>\n) {\n const selectionProps = useDateRangeExclusionSelection(props);\n return <CalendarWithMonthSwitcher<T> {...props} {...selectionProps} />;\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 { 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","getMonthInYear","yearToUse","monthToUse","firstDayOfMonth","startCase","getWeeksForMonth","forceSixWeeks","firstDayOfFirstWeek","startOfWeek","weeks","i","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","_","style","backgroundColor","defaultTextPropsProvider","selectedColor","disabledColor","inOtherMonthColor","rangeTextColor","isOtherMonth","defaultCalendarTheme","extranetCalendarTheme","isDateInMinMaxRange","isBefore","DisabledDayWrapper","DayComponent","minDate","maxDate","props","activeDayState","WeekNumberCell","onClickWeek","theme","background","prefix","content","jsxs","Box","jsx","Text","Clickable","ev","CalendarWeek","dayComponent","statePerWeekDay","userDataPerWeekDay","onClickDay","renderWeekNumber","extraDayContent","WeekDayCell","onClickWeekDay","CalendarDay","userData","ExtraDayContent","WrapperTd","styled","InnerWrapperDiv","CellWrapperDiv","Fragment","isClickable","CalendarMonth","statePerWeek","userDataPerWeek","onClickMonth","onClickYear","renderWeekDay","headerLeftContent","headerRightContent","showWeekNumber","Row","FlatButton","Space","CalendarPanel","monthRows","userDataPerMonth","minDateObj","parse","maxDateObj","styles","monthRow","rowIndex","Spacing","index","React","Calendar","initialDate","getInitialDate","getMonthRows","enGB","now","monthsPerRow","chunk","MonthPickerCell","value","onValueChange","label","PrimaryButton","monthMatrix","MonthPicker","Column","createStandardDateRangePresets","PresetPicker","onClickPreset","pageIndex","setPageIndex","useState","pages","currentPage","stenaAngleLeft","stenaAngleRight","preset","YearPickerCell","YearPicker","initialLastYear","lastYear","setLastYear","yearRows","startYear","range","useEffect","prev","calculateLastYearInFocus","stenaArrowLeft","yearRow","stenaArrowRight","yearDiff","remaining","yearsToAdd","yearsToSubtract","CalendarWithMonthYearPickers","setDateInFocus","currentPanel","setCurrentPanel","onChangeSelectedMonth","useCallback","selectedMonth","newDate","onChangeSelectedYear","selectedYear","useSelectedMonthStepperLogic","nextMonth","addMonths","nextYear","addYears","prevMonth","subMonths","prevYear","subYears","WithMonthSwitcherBelow","children","Indent","stenaAngleLeftDouble","stenaAngleRightDouble","noop","CalendarWithMonthSwitcher","monthSwitcherPlacement","onSelectPreset","hideYearPagination","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","removeDateIfExist","list","item","listContainsDate","useDateRangeExclusionSelection","setDateRange","onChangeHandler","dates","onClickDayRange","addHighlighting","dateList","DateRangeExclusionCalendar","defaultPopoverPlacement","useCalendarPopoverUpdater","tippyRef","tippyInstanceRef","useTippyInstance","_b","_a","useDateInput","onClose","openOnMount","showingCalendar","setShowingCalendar","showCalendar","hideCalendar","onSelectDate","defaultMaxDate","DateInput","displayFormat","placeholder","zIndex","calendarTheme","portalTarget","variant","width","disabled","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","input","TimeTextInput","showPlaceholder","useIcon","valid","setValid","timeFormat","onBlur","formattedResult","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","stenaAngleDown","transformTimeStringToNumber","isValidTimeString","getHoursAndMinutesFromTimeString","p","parseIntElseUndefined","transformTimeInDateToTimeString","TimePickerCell","onClick","selected","columnRef","canScrollRef","ref","targetScroll","padStart","TimePickerColumn","items","selectedItem","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","_d","_c","DateRangeDualTextInput"],"mappings":"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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/util/date/DateMinMaxValidator.ts","../src/components/calendar/DisabledDayWrapper.tsx","../src/components/calendar/renderers/WeekNumberCell.tsx","../src/components/calendar/CalendarWeek.tsx","../src/components/calendar/renderers/WeekDayCell.tsx","../src/components/calendar/renderers/CalendarDay.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/year-picker/YearPickerCell.tsx","../src/features/year-picker/YearPicker.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/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 show?: boolean;\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 let style = {};\n\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 ...style,\n backgroundColor,\n borderTopLeftRadius: dayHighlightSelect(\n dayState,\n defaultHighlights,\n [\"selectedStart\", \"singleSelected\"],\n [\n \"var(--swui-calendar-day-border-radius)\",\n \"var(--swui-calendar-day-border-radius)\",\n ],\n borderColor\n ),\n borderBottomLeftRadius: dayHighlightSelect(\n dayState,\n defaultHighlights,\n [\"selectedStart\", \"singleSelected\"],\n [\n \"var(--swui-calendar-day-border-radius)\",\n \"var(--swui-calendar-day-border-radius)\",\n ],\n borderColor\n ),\n borderTopRightRadius: dayHighlightSelect(\n dayState,\n defaultHighlights,\n [\"selectedEnd\", \"singleSelected\"],\n [\n \"var(--swui-calendar-day-border-radius)\",\n \"var(--swui-calendar-day-border-radius)\",\n ],\n borderColor\n ),\n borderBottomRightRadius: dayHighlightSelect(\n dayState,\n defaultHighlights,\n [\"selectedEnd\", \"singleSelected\"],\n [\n \"var(--swui-calendar-day-border-radius)\",\n \"var(--swui-calendar-day-border-radius)\",\n ],\n borderColor\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 show: true,\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 { 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, 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 * as React from \"react\";\nimport {\n CalendarDayProps,\n CalendarUserWeekData,\n DayState,\n DayStateHighlight,\n ExtraDayContentProps,\n OnClickDay,\n OnClickWeek,\n OptionalMinMaxDates,\n RenderWeekNumber,\n} from \"../../types/CalendarTypes\";\nimport { MonthData, WeekData } from \"../../util/calendar/CalendarDataFactory\";\n\nimport { CalendarTheme } from \"./CalendarTheme\";\nimport { DisabledDayWrapper } from \"./DisabledDayWrapper\";\nimport { WeekNumberCell } from \"./renderers/WeekNumberCell\";\n\nexport interface CalendarWeekProps<T> extends OptionalMinMaxDates {\n dayComponent: React.ComponentType<CalendarDayProps<T>>;\n week: WeekData;\n month: MonthData;\n statePerWeekDay?: CalendarUserWeekData<DayState>;\n userDataPerWeekDay?: CalendarUserWeekData<T>;\n onClickWeek?: OnClickWeek;\n onClickDay?: OnClickDay<T>;\n theme: CalendarTheme;\n renderWeekNumber?: RenderWeekNumber;\n extraDayContent?: React.ComponentType<ExtraDayContentProps<T>>;\n defaultHighlights?: Array<DayStateHighlight>;\n}\n\nexport function CalendarWeek<T>({\n week,\n month,\n dayComponent,\n statePerWeekDay,\n userDataPerWeekDay,\n minDate,\n maxDate,\n onClickWeek,\n onClickDay,\n theme,\n renderWeekNumber,\n extraDayContent,\n defaultHighlights,\n}: CalendarWeekProps<T>) {\n return (\n <tr key={week.weekNumber}>\n {theme.WeekNumber.show && (\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={statePerWeekDay && statePerWeekDay[day.dayOfMonth]}\n userData={userDataPerWeekDay && userDataPerWeekDay[day.dayOfMonth]}\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","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, Clickable, 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 return (\n <WrapperTd>\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 {onClickDay && isClickable(defaultHighlights, dayState) ? (\n <Clickable\n onClick={(ev) => onClickDay(day, userData, ev)}\n style={{ width: \"100%\", height: \"100%\" }}\n borderRadius={\"var(--swui-calendar-day-border-radius)\"}\n >\n {content}\n </Clickable>\n ) : (\n <>{content}</>\n )}\n </>\n )}\n </CellWrapperDiv>\n </InnerWrapperDiv>\n </WrapperTd>\n );\n};\n\nconst isClickable = (\n defaultHighlights: Array<DayStateHighlight> | undefined,\n dayState: DayState | undefined\n): boolean =>\n !!dayHighlightSelect<boolean>(\n dayState,\n defaultHighlights,\n [\"enabled\", \"disabled\"],\n [true, false],\n true\n );\n","import { Box, Row, Space, 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 { CalendarWeek } from \"./CalendarWeek\";\nimport { WeekDayCell } from \"./renderers/WeekDayCell\";\nimport { CalendarDay } from \"./renderers/CalendarDay\";\nimport { FlatButton } from \"@stenajs-webui/elements\";\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 headerLeftContent?: React.ReactElement<{}>;\n headerRightContent?: React.ReactElement<{}>;\n extraDayContent?: React.ComponentType<ExtraDayContentProps<T>>;\n defaultHighlights?: Array<DayStateHighlight>;\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 onClickYear,\n renderWeekNumber,\n renderWeekDay,\n headerLeftContent,\n headerRightContent,\n theme = defaultCalendarTheme,\n extraDayContent,\n defaultHighlights,\n}: CalendarMonthProps<T>) {\n const showWeekNumber = theme.WeekNumber.show;\n\n return (\n <>\n <Box alignItems={\"stretch\"}>\n <Row\n justifyContent={\"space-between\"}\n alignItems={\"center\"}\n height={\"32px\"}\n >\n <Box alignItems={\"center\"}>{headerLeftContent}</Box>\n\n <Row alignItems={\"center\"}>\n <Row width={\"104px\"} justifyContent={\"center\"}>\n {onClickMonth ? (\n <FlatButton\n onClick={() => onClickMonth(month)}\n label={month.name}\n />\n ) : (\n <Text>{month.name}</Text>\n )}\n </Row>\n <Space />\n <Row width={\"64px\"} justifyContent={\"center\"}>\n {onClickYear ? (\n <FlatButton\n onClick={() => onClickYear(month.year)}\n label={String(month.year)}\n />\n ) : (\n <Text>{month.year}</Text>\n )}\n </Row>\n </Row>\n\n <Box alignItems={\"center\"}>{headerRightContent}</Box>\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 <CalendarWeek<T>\n key={week.weekNumber}\n month={month}\n week={week}\n dayComponent={dayComponent}\n statePerWeekDay={statePerWeek && statePerWeek[week.weekNumber]}\n userDataPerWeekDay={\n userDataPerWeek && userDataPerWeek[week.weekNumber]\n }\n onClickDay={onClickDay}\n onClickWeek={onClickWeek}\n theme={theme}\n renderWeekNumber={renderWeekNumber}\n extraDayContent={extraDayContent}\n defaultHighlights={defaultHighlights}\n minDate={minDate}\n maxDate={maxDate}\n />\n ))}\n </tbody>\n </table>\n </Box>\n </>\n );\n}\n","import { Row, Space, 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 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 onClickYear,\n renderWeekDay,\n renderWeekNumber,\n headerLeftContent,\n headerRightContent,\n extraDayContent,\n defaultHighlights,\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 className={styles.calendar}>\n {monthRows.map((monthRow, rowIndex) => (\n <Spacing key={rowIndex}>\n <Row>\n {monthRow.map((month, index) => (\n <React.Fragment key={month.name}>\n {index > 0 && <Space />}\n <CalendarMonth<T>\n month={month}\n dayComponent={dayComponent}\n userDataPerWeek={\n userDataPerMonth && userDataPerMonth[month.monthString]\n }\n statePerWeek={\n statePerMonth && statePerMonth[month.monthString]\n }\n onClickDay={onClickDay}\n onClickWeekDay={onClickWeekDay}\n onClickWeek={onClickWeek}\n onClickMonth={onClickMonth}\n onClickYear={onClickYear}\n theme={theme}\n renderWeekNumber={renderWeekNumber}\n renderWeekDay={renderWeekDay}\n headerLeftContent={headerLeftContent}\n headerRightContent={headerRightContent}\n extraDayContent={extraDayContent}\n defaultHighlights={defaultHighlights}\n minDate={minDateObj}\n maxDate={maxDateObj}\n />\n </React.Fragment>\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 { ValueAndOnValueChangeProps } from \"@stenajs-webui/forms\";\nimport { Month } from \"../../util/calendar/CalendarDataFactory\";\nimport { format } from \"date-fns\";\n\ninterface Props extends ValueAndOnValueChangeProps<Month> {\n month: Month;\n locale: Locale;\n}\n\nexport const MonthPickerCell: React.FC<Props> = ({\n value,\n onValueChange,\n month,\n locale,\n}) => {\n const label = useMemo(() => {\n const now = new Date(2000, month, 1);\n return startCase(format(now, \"MMM\", { locale }));\n }, [locale, month]);\n\n return (\n <Row justifyContent={\"center\"}>\n {value === month ? (\n <PrimaryButton\n label={label}\n onClick={() => onValueChange && onValueChange(month)}\n />\n ) : (\n <FlatButton\n label={label}\n onClick={() => onValueChange && onValueChange(month)}\n />\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, Row } from \"@stenajs-webui/core\";\nimport { MonthPickerCell } from \"./MonthPickerCell\";\n\nexport interface MonthPickerProps extends ValueAndOnValueChangeProps<Month> {\n locale?: Locale;\n}\n\nconst monthMatrix = [\n [Month.JANUARY, Month.FEBRUARY, Month.MARCH],\n [Month.APRIL, Month.MAY, Month.JUNE],\n [Month.JULY, Month.AUGUST, Month.SEPTEMBER],\n [Month.OCTOBER, Month.NOVEMBER, Month.DECEMBER],\n];\n\nexport const MonthPicker: React.FC<MonthPickerProps> = ({\n value,\n onValueChange,\n locale = enGB,\n}) => {\n return (\n <Column gap={1}>\n {monthMatrix.map((monthRow) => (\n <Row key={monthRow[0]} gap={1}>\n {monthRow.map((month) => (\n <MonthPickerCell\n key={month}\n month={month}\n onValueChange={onValueChange}\n value={value}\n locale={locale}\n />\n ))}\n </Row>\n ))}\n </Column>\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 * 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 { Box } from \"@stenajs-webui/core\";\nimport { PrimaryButton } from \"@stenajs-webui/elements\";\nimport * as React from \"react\";\nimport { useCallback } from \"react\";\nimport { Calendar } from \"../../components/calendar/Calendar\";\nimport { CalendarProps } from \"../../types/CalendarTypes\";\nimport { Month } from \"../../util/calendar/CalendarDataFactory\";\nimport { MonthPicker } from \"../month-picker/MonthPicker\";\nimport { CalendarPreset } from \"../preset-picker/CalendarPreset\";\nimport { PresetPicker } from \"../preset-picker/PresetPicker\";\nimport { YearPicker } from \"../year-picker/YearPicker\";\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}\n\nexport const CalendarWithMonthYearPickers =\n function CalendarWithMonthYearPickers<T>({\n locale,\n dateInFocus,\n setDateInFocus,\n currentPanel,\n setCurrentPanel,\n ...props\n }: CalendarWithMonthYearPickersProps<T>) {\n const onChangeSelectedMonth = useCallback(\n (selectedMonth: Month) => {\n const newDate = dateInFocus ? new Date(dateInFocus) : new Date();\n newDate.setMonth(selectedMonth);\n if (setDateInFocus) {\n setDateInFocus(newDate);\n }\n setCurrentPanel(\"calendar\");\n },\n [dateInFocus, setDateInFocus, setCurrentPanel]\n );\n\n const onChangeSelectedYear = useCallback(\n (selectedYear: number) => {\n const newDate = dateInFocus ? new Date(dateInFocus) : new Date();\n newDate.setFullYear(selectedYear);\n if (setDateInFocus) {\n setDateInFocus(newDate);\n }\n setCurrentPanel(\"calendar\");\n },\n [dateInFocus, setDateInFocus, setCurrentPanel]\n );\n\n const onClickYear = useCallback(() => {\n setCurrentPanel(\"year\");\n }, [setCurrentPanel]);\n\n const onClickMonth = useCallback(() => {\n setCurrentPanel(\"month\");\n }, [setCurrentPanel]);\n\n switch (currentPanel) {\n case \"calendar\":\n return (\n <>\n <Calendar<T>\n {...props}\n date={dateInFocus}\n onClickYear={onClickYear}\n onClickMonth={onClickMonth}\n locale={locale}\n />\n </>\n );\n case \"month\":\n return (\n <MonthPicker\n value={dateInFocus.getMonth()}\n onValueChange={onChangeSelectedMonth}\n locale={locale}\n />\n );\n case \"year\":\n return (\n <YearPicker\n value={dateInFocus.getFullYear()}\n onValueChange={onChangeSelectedYear}\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 FlatButton,\n stenaAngleLeft,\n stenaAngleLeftDouble,\n stenaAngleRight,\n stenaAngleRightDouble,\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>\n <FlatButton onClick={prevYear} leftIcon={stenaAngleLeftDouble} />\n <Space />\n <FlatButton onClick={prevMonth} leftIcon={stenaAngleLeft} />\n <Indent num={2} />\n <FlatButton onClick={nextMonth} leftIcon={stenaAngleRight} />\n <Space />\n <FlatButton onClick={nextYear} leftIcon={stenaAngleRightDouble} />\n </Row>\n </Indent>\n <Space />\n </div>\n);\n","import { Column, Row, Space } from \"@stenajs-webui/core\";\nimport {\n FlatButton,\n stenaAngleLeft,\n stenaAngleLeftDouble,\n stenaAngleRight,\n stenaAngleRightDouble,\n} from \"@stenajs-webui/elements\";\nimport * as React from \"react\";\nimport { Calendar } from \"../../components/calendar/Calendar\";\nimport { defaultCalendarTheme } from \"../../components/calendar/CalendarTheme\";\nimport { CalendarProps } 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\";\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 hideYearPagination?: boolean;\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 hideYearPagination = false,\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 dateInFocus={dateInFocus}\n setDateInFocus={setDateInFocus}\n currentPanel={currentPanel}\n setCurrentPanel={setCurrentPanel}\n onSelectPreset={onSelectPreset}\n headerLeftContent={\n <Row alignItems={\"center\"}>\n {!hideYearPagination && (\n <FlatButton\n onClick={prevYear}\n leftIcon={stenaAngleLeftDouble}\n />\n )}\n <Space />\n <FlatButton onClick={prevMonth} leftIcon={stenaAngleLeft} />\n </Row>\n }\n headerRightContent={\n <Row alignItems={\"center\"}>\n <FlatButton onClick={nextMonth} leftIcon={stenaAngleRight} />\n <Space />\n {!hideYearPagination && (\n <FlatButton\n onClick={nextYear}\n leftIcon={stenaAngleRightDouble}\n />\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 { 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","getMonthInYear","yearToUse","monthToUse","firstDayOfMonth","startCase","getWeeksForMonth","forceSixWeeks","firstDayOfFirstWeek","startOfWeek","weeks","i","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","_","style","backgroundColor","defaultTextPropsProvider","selectedColor","disabledColor","inOtherMonthColor","rangeTextColor","isOtherMonth","defaultCalendarTheme","extranetCalendarTheme","isDateInMinMaxRange","isBefore","DisabledDayWrapper","DayComponent","minDate","maxDate","props","activeDayState","WeekNumberCell","onClickWeek","theme","background","prefix","content","jsxs","Box","jsx","Text","Clickable","ev","CalendarWeek","dayComponent","statePerWeekDay","userDataPerWeekDay","onClickDay","renderWeekNumber","extraDayContent","WeekDayCell","onClickWeekDay","CalendarDay","userData","ExtraDayContent","WrapperTd","styled","InnerWrapperDiv","CellWrapperDiv","Fragment","isClickable","CalendarMonth","statePerWeek","userDataPerWeek","onClickMonth","onClickYear","renderWeekDay","headerLeftContent","headerRightContent","showWeekNumber","Row","FlatButton","Space","CalendarPanel","monthRows","userDataPerMonth","minDateObj","parse","maxDateObj","styles","monthRow","rowIndex","Spacing","index","React","Calendar","initialDate","getInitialDate","getMonthRows","enGB","now","monthsPerRow","chunk","MonthPickerCell","value","onValueChange","label","PrimaryButton","monthMatrix","MonthPicker","Column","createStandardDateRangePresets","PresetPicker","onClickPreset","pageIndex","setPageIndex","useState","pages","currentPage","stenaAngleLeft","stenaAngleRight","preset","YearPickerCell","YearPicker","initialLastYear","lastYear","setLastYear","yearRows","startYear","range","useEffect","prev","calculateLastYearInFocus","stenaArrowLeft","yearRow","stenaArrowRight","yearDiff","remaining","yearsToAdd","yearsToSubtract","CalendarWithMonthYearPickers","setDateInFocus","currentPanel","setCurrentPanel","onChangeSelectedMonth","useCallback","selectedMonth","newDate","onChangeSelectedYear","selectedYear","useSelectedMonthStepperLogic","nextMonth","addMonths","nextYear","addYears","prevMonth","subMonths","prevYear","subYears","WithMonthSwitcherBelow","children","Indent","stenaAngleLeftDouble","stenaAngleRightDouble","noop","CalendarWithMonthSwitcher","monthSwitcherPlacement","onSelectPreset","hideYearPagination","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","disabled","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","input","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","stenaAngleDown","transformTimeStringToNumber","isValidTimeString","getHoursAndMinutesFromTimeString","p","parseIntElseUndefined","transformTimeInDateToTimeString","TimePickerCell","onClick","item","selected","columnRef","canScrollRef","ref","targetScroll","padStart","TimePickerColumn","items","selectedItem","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","_d","_c","DateRangeDualTextInput"],"mappings":"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"}