@mantine/dates
Version:
Calendars, date and time pickers based on Mantine components
1 lines • 20.6 kB
Source Map (JSON)
{"version":3,"file":"Calendar.mjs","names":[],"sources":["../../../src/components/Calendar/Calendar.tsx"],"sourcesContent":["import dayjs from 'dayjs';\nimport { useEffect, useImperativeHandle, useRef } from 'react';\nimport {\n Box,\n BoxProps,\n ElementProps,\n Factory,\n factory,\n StylesApiProps,\n useProps,\n useResolvedStylesApi,\n} from '@mantine/core';\nimport { useMergedRef, useUncontrolled } from '@mantine/hooks';\nimport { useUncontrolledDates } from '../../hooks';\nimport { CalendarLevel, DateStringValue } from '../../types';\nimport { toDateString } from '../../utils';\nimport { DecadeLevelSettings } from '../DecadeLevel';\nimport { DecadeLevelGroup, DecadeLevelGroupStylesNames } from '../DecadeLevelGroup';\nimport { MonthLevelSettings } from '../MonthLevel';\nimport { MonthLevelGroup, MonthLevelGroupStylesNames } from '../MonthLevelGroup';\nimport { YearLevelSettings } from '../YearLevel';\nimport { YearLevelGroup, YearLevelGroupStylesNames } from '../YearLevelGroup';\nimport { clampLevel } from './clamp-level/clamp-level';\n\nexport type CalendarStylesNames =\n | MonthLevelGroupStylesNames\n | YearLevelGroupStylesNames\n | DecadeLevelGroupStylesNames;\n\nexport interface CalendarAriaLabels {\n monthLevelControl?: string;\n yearLevelControl?: string;\n\n nextMonth?: string;\n previousMonth?: string;\n\n nextYear?: string;\n previousYear?: string;\n\n nextDecade?: string;\n previousDecade?: string;\n}\n\ntype OmittedSettings =\n | 'onNext'\n | 'onPrevious'\n | 'onLevelClick'\n | 'withNext'\n | 'withPrevious'\n | 'nextDisabled'\n | 'previousDisabled'\n | 'hasNextLevel';\n\nexport interface CalendarSettings\n extends\n Omit<DecadeLevelSettings, OmittedSettings>,\n Omit<YearLevelSettings, OmittedSettings>,\n Omit<MonthLevelSettings, OmittedSettings> {\n /** Initial displayed level in uncontrolled mode */\n defaultLevel?: CalendarLevel;\n\n /** Current displayed level displayed in controlled mode */\n level?: CalendarLevel;\n\n /** Called when level changes */\n onLevelChange?: (level: CalendarLevel) => void;\n\n /** Called when user selects year */\n onYearSelect?: (date: DateStringValue) => void;\n\n /** Called when user selects month */\n onMonthSelect?: (date: DateStringValue) => void;\n\n /** Called when mouse enters year control */\n onYearMouseEnter?: (event: React.MouseEvent<HTMLButtonElement>, date: DateStringValue) => void;\n\n /** Called when mouse enters month control */\n onMonthMouseEnter?: (event: React.MouseEvent<HTMLButtonElement>, date: DateStringValue) => void;\n}\n\nexport interface CalendarBaseProps {\n __staticSelector?: string;\n\n /** Prevents focus shift when buttons are clicked */\n __preventFocus?: boolean;\n\n /** Determines whether date should be updated when year control is clicked */\n __updateDateOnYearSelect?: boolean;\n\n /** Determines whether date should be updated when month control is clicked */\n __updateDateOnMonthSelect?: boolean;\n\n /** Assigns function to set date to the given ref */\n __setDateRef?: React.RefObject<((date: DateStringValue) => void) | null>;\n\n /** Assigns function to set level to the given ref */\n __setLevelRef?: React.RefObject<((level: CalendarLevel) => void) | null>;\n\n /** Initial displayed date in uncontrolled mode */\n defaultDate?: DateStringValue | Date;\n\n /** Displayed date in controlled mode */\n date?: DateStringValue | Date;\n\n /** Called when date changes */\n onDateChange?: (date: DateStringValue) => void;\n\n /** Number of columns displayed next to each other @default 1 */\n numberOfColumns?: number;\n\n /** Number of columns to scroll with next/prev buttons, same as `numberOfColumns` if not set explicitly */\n columnsToScroll?: number;\n\n /** `aria-label` attributes for controls on different levels */\n ariaLabels?: CalendarAriaLabels;\n\n /** Next button `aria-label` */\n nextLabel?: string;\n\n /** Previous button `aria-label` */\n previousLabel?: string;\n\n /** Determines whether the calendar should take the full width of its container @default false */\n fullWidth?: boolean;\n\n /** Called when the next decade button is clicked */\n onNextDecade?: (date: DateStringValue) => void;\n\n /** Called when the previous decade button is clicked */\n onPreviousDecade?: (date: DateStringValue) => void;\n\n /** Called when the next year button is clicked */\n onNextYear?: (date: DateStringValue) => void;\n\n /** Called when the previous year button is clicked */\n onPreviousYear?: (date: DateStringValue) => void;\n\n /** Called when the next month button is clicked */\n onNextMonth?: (date: DateStringValue) => void;\n\n /** Called when the previous month button is clicked */\n onPreviousMonth?: (date: DateStringValue) => void;\n}\n\nexport interface CalendarProps\n extends\n BoxProps,\n CalendarSettings,\n CalendarBaseProps,\n StylesApiProps<CalendarFactory>,\n ElementProps<'div'> {\n /** Max level that user can go up to (decade, year, month) @default 'decade' */\n maxLevel?: CalendarLevel;\n\n /** Min level that user can go down to (decade, year, month) @default 'month' */\n minLevel?: CalendarLevel;\n\n /** Determines whether days should be static, static days can be used to display month if it is not expected that user will interact with the component in any way */\n static?: boolean;\n\n /** Enable enhanced keyboard navigation (Ctrl/Cmd + Arrow keys for year navigation, Ctrl/Cmd + Shift + Arrow keys for decade navigation, Y key to open year view) */\n enableKeyboardNavigation?: boolean;\n}\n\nexport type CalendarFactory = Factory<{\n props: CalendarProps;\n ref: HTMLDivElement;\n stylesNames: CalendarStylesNames;\n}>;\n\nconst defaultProps = {\n maxLevel: 'decade',\n minLevel: 'month',\n __updateDateOnYearSelect: true,\n __updateDateOnMonthSelect: true,\n enableKeyboardNavigation: true,\n} satisfies Partial<CalendarProps>;\n\nexport const Calendar = factory<CalendarFactory>((_props) => {\n const props = useProps('Calendar', defaultProps, _props);\n const {\n // CalendarLevel props\n vars,\n maxLevel,\n minLevel,\n defaultLevel,\n level,\n onLevelChange,\n date,\n defaultDate,\n onDateChange,\n numberOfColumns,\n columnsToScroll,\n ariaLabels,\n nextLabel,\n previousLabel,\n onYearSelect,\n onMonthSelect,\n onYearMouseEnter,\n onMonthMouseEnter,\n headerControlsOrder,\n __updateDateOnYearSelect,\n __updateDateOnMonthSelect,\n __setDateRef,\n __setLevelRef,\n\n // MonthLevelGroup props\n firstDayOfWeek,\n weekdayFormat,\n weekendDays,\n getDayProps,\n excludeDate,\n renderDay,\n hideOutsideDates,\n hideWeekdays,\n getDayAriaLabel,\n monthLabelFormat,\n nextIcon,\n previousIcon,\n __onDayClick,\n __onDayMouseEnter,\n withCellSpacing,\n highlightToday,\n withWeekNumbers,\n\n // YearLevelGroup props\n monthsListFormat,\n getMonthControlProps,\n yearLabelFormat,\n\n // DecadeLevelGroup props\n yearsListFormat,\n getYearControlProps,\n decadeLabelFormat,\n\n // Other props\n classNames,\n styles,\n unstyled,\n minDate,\n maxDate,\n locale,\n __staticSelector,\n size,\n __preventFocus,\n __stopPropagation,\n onNextDecade,\n onPreviousDecade,\n onNextYear,\n onPreviousYear,\n onNextMonth,\n onPreviousMonth,\n static: isStatic,\n enableKeyboardNavigation,\n fullWidth,\n attributes,\n ref,\n ...others\n } = props;\n\n const { resolvedClassNames, resolvedStyles } = useResolvedStylesApi<CalendarFactory>({\n classNames,\n styles,\n props,\n });\n\n const [_level, setLevel] = useUncontrolled({\n value: level ? clampLevel(level, minLevel, maxLevel) : undefined,\n defaultValue: defaultLevel ? clampLevel(defaultLevel, minLevel, maxLevel) : undefined,\n finalValue: clampLevel(undefined, minLevel, maxLevel),\n onChange: onLevelChange,\n });\n\n const [_date, setDate] = useUncontrolledDates({\n type: 'default',\n value: toDateString(date),\n defaultValue: toDateString(defaultDate),\n onChange: onDateChange as any,\n });\n\n useImperativeHandle(__setDateRef, () => (date: DateStringValue) => {\n setDate(date);\n });\n\n useImperativeHandle(__setLevelRef, () => (level: CalendarLevel) => {\n setLevel(level);\n });\n\n const stylesApiProps = {\n __staticSelector: __staticSelector || 'Calendar',\n styles: resolvedStyles,\n classNames: resolvedClassNames,\n unstyled,\n size,\n attributes,\n };\n\n const _columnsToScroll = columnsToScroll || numberOfColumns || 1;\n\n const fallbackDateRef = useRef<DateStringValue | null>(null);\n if (fallbackDateRef.current === null) {\n const now = new Date();\n fallbackDateRef.current = (\n minDate && dayjs(now).isAfter(minDate) ? minDate : dayjs(now).format('YYYY-MM-DD')\n ) as DateStringValue;\n }\n const currentDate = _date || fallbackDateRef.current;\n\n const handleNextMonth = () => {\n const nextDate = dayjs(currentDate).add(_columnsToScroll, 'month').format('YYYY-MM-DD');\n onNextMonth?.(nextDate);\n setDate(nextDate);\n };\n\n const handlePreviousMonth = () => {\n const nextDate = dayjs(currentDate).subtract(_columnsToScroll, 'month').format('YYYY-MM-DD');\n onPreviousMonth?.(nextDate);\n setDate(nextDate);\n };\n\n const handleNextYear = () => {\n const nextDate = dayjs(currentDate).add(_columnsToScroll, 'year').format('YYYY-MM-DD');\n onNextYear?.(nextDate);\n setDate(nextDate);\n };\n\n const handlePreviousYear = () => {\n const nextDate = dayjs(currentDate).subtract(_columnsToScroll, 'year').format('YYYY-MM-DD');\n onPreviousYear?.(nextDate);\n setDate(nextDate);\n };\n\n const handleNextDecade = () => {\n const nextDate = dayjs(currentDate)\n .add(10 * _columnsToScroll, 'year')\n .format('YYYY-MM-DD');\n onNextDecade?.(nextDate);\n setDate(nextDate);\n };\n\n const handlePreviousDecade = () => {\n const nextDate = dayjs(currentDate)\n .subtract(10 * _columnsToScroll, 'year')\n .format('YYYY-MM-DD');\n onPreviousDecade?.(nextDate);\n setDate(nextDate);\n };\n\n const calendarRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!enableKeyboardNavigation || isStatic) {\n return;\n }\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (!calendarRef.current?.contains(document.activeElement)) {\n return;\n }\n\n const isCtrlOrCmd = event.ctrlKey || event.metaKey;\n const isShift = event.shiftKey;\n\n switch (event.key) {\n case 'ArrowUp':\n if (isCtrlOrCmd && isShift) {\n event.preventDefault();\n handlePreviousDecade();\n } else if (isCtrlOrCmd) {\n event.preventDefault();\n handlePreviousYear();\n }\n break;\n\n case 'ArrowDown':\n if (isCtrlOrCmd && isShift) {\n event.preventDefault();\n handleNextDecade();\n } else if (isCtrlOrCmd) {\n event.preventDefault();\n handleNextYear();\n }\n break;\n\n case 'y':\n case 'Y':\n if (_level === 'month') {\n event.preventDefault();\n setLevel('year');\n }\n break;\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n\n return () => {\n document.removeEventListener('keydown', handleKeyDown);\n };\n }, [\n enableKeyboardNavigation,\n isStatic,\n _level,\n handleNextYear,\n handlePreviousYear,\n handleNextDecade,\n handlePreviousDecade,\n ]);\n\n return (\n <Box\n ref={useMergedRef(calendarRef, ref)}\n size={size}\n data-calendar\n data-full-width={fullWidth || undefined}\n {...others}\n >\n {_level === 'month' && (\n <MonthLevelGroup\n month={currentDate}\n minDate={minDate}\n maxDate={maxDate}\n firstDayOfWeek={firstDayOfWeek}\n weekdayFormat={weekdayFormat}\n weekendDays={weekendDays}\n getDayProps={getDayProps}\n excludeDate={excludeDate}\n renderDay={renderDay}\n hideOutsideDates={hideOutsideDates}\n hideWeekdays={hideWeekdays}\n getDayAriaLabel={getDayAriaLabel}\n onNext={handleNextMonth}\n onPrevious={handlePreviousMonth}\n hasNextLevel={maxLevel !== 'month'}\n onLevelClick={() => setLevel('year')}\n numberOfColumns={numberOfColumns}\n locale={locale}\n levelControlAriaLabel={ariaLabels?.monthLevelControl}\n nextLabel={ariaLabels?.nextMonth ?? nextLabel}\n nextIcon={nextIcon}\n previousLabel={ariaLabels?.previousMonth ?? previousLabel}\n previousIcon={previousIcon}\n monthLabelFormat={monthLabelFormat}\n __onDayClick={__onDayClick}\n __onDayMouseEnter={__onDayMouseEnter}\n __preventFocus={__preventFocus}\n __stopPropagation={__stopPropagation}\n static={isStatic}\n withCellSpacing={withCellSpacing}\n highlightToday={highlightToday}\n withWeekNumbers={withWeekNumbers}\n headerControlsOrder={headerControlsOrder}\n fullWidth={fullWidth}\n {...stylesApiProps}\n />\n )}\n\n {_level === 'year' && (\n <YearLevelGroup\n year={currentDate}\n numberOfColumns={numberOfColumns}\n minDate={minDate}\n maxDate={maxDate}\n monthsListFormat={monthsListFormat}\n getMonthControlProps={getMonthControlProps}\n locale={locale}\n onNext={handleNextYear}\n onPrevious={handlePreviousYear}\n hasNextLevel={maxLevel !== 'month' && maxLevel !== 'year'}\n onLevelClick={() => setLevel('decade')}\n levelControlAriaLabel={ariaLabels?.yearLevelControl}\n nextLabel={ariaLabels?.nextYear ?? nextLabel}\n nextIcon={nextIcon}\n previousLabel={ariaLabels?.previousYear ?? previousLabel}\n previousIcon={previousIcon}\n yearLabelFormat={yearLabelFormat}\n __onControlMouseEnter={onMonthMouseEnter}\n __onControlClick={(_event, payload) => {\n __updateDateOnMonthSelect && setDate(payload);\n setLevel(clampLevel('month', minLevel, maxLevel));\n onMonthSelect?.(payload);\n }}\n __preventFocus={__preventFocus}\n __stopPropagation={__stopPropagation}\n withCellSpacing={withCellSpacing}\n headerControlsOrder={headerControlsOrder}\n fullWidth={fullWidth}\n {...stylesApiProps}\n />\n )}\n\n {_level === 'decade' && (\n <DecadeLevelGroup\n decade={currentDate}\n minDate={minDate}\n maxDate={maxDate}\n yearsListFormat={yearsListFormat}\n getYearControlProps={getYearControlProps}\n locale={locale}\n onNext={handleNextDecade}\n onPrevious={handlePreviousDecade}\n numberOfColumns={numberOfColumns}\n nextLabel={ariaLabels?.nextDecade ?? nextLabel}\n nextIcon={nextIcon}\n previousLabel={ariaLabels?.previousDecade ?? previousLabel}\n previousIcon={previousIcon}\n decadeLabelFormat={decadeLabelFormat}\n __onControlMouseEnter={onYearMouseEnter}\n __onControlClick={(_event, payload) => {\n __updateDateOnYearSelect && setDate(payload);\n setLevel(clampLevel('year', minLevel, maxLevel));\n onYearSelect?.(payload);\n }}\n __preventFocus={__preventFocus}\n __stopPropagation={__stopPropagation}\n withCellSpacing={withCellSpacing}\n headerControlsOrder={headerControlsOrder}\n fullWidth={fullWidth}\n {...stylesApiProps}\n />\n )}\n </Box>\n );\n});\n\nCalendar.classes = {\n ...DecadeLevelGroup.classes,\n ...YearLevelGroup.classes,\n ...MonthLevelGroup.classes,\n};\nCalendar.displayName = '@mantine/dates/Calendar';\n\nexport namespace Calendar {\n export type Props = CalendarProps;\n export type StylesNames = CalendarStylesNames;\n export type AriaLabels = CalendarAriaLabels;\n export type Settings = CalendarSettings;\n export type BaseProps = CalendarBaseProps;\n export type Factory = CalendarFactory;\n}\n"],"mappings":"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"}