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