@mantine/dates
Version:
Calendars, date and time pickers based on Mantine components
1 lines • 9.95 kB
Source Map (JSON)
{"version":3,"file":"MiniCalendar.mjs","names":["classes"],"sources":["../../../src/components/MiniCalendar/MiniCalendar.tsx"],"sourcesContent":["import dayjs from 'dayjs';\nimport {\n AccordionChevron,\n Box,\n BoxProps,\n createVarsResolver,\n DataAttributes,\n ElementProps,\n factory,\n Factory,\n getSize,\n MantineSize,\n StylesApiProps,\n UnstyledButton,\n useProps,\n useStyles,\n} from '@mantine/core';\nimport { useUncontrolled } from '@mantine/hooks';\nimport { toDateString } from '../../utils';\nimport { useDatesContext } from '../DatesProvider';\nimport classes from './MiniCalendar.module.css';\n\nexport type MiniCalendarStylesNames =\n | 'root'\n | 'control'\n | 'days'\n | 'day'\n | 'dayMonth'\n | 'dayNumber';\n\nexport type MiniCalendarCssVariables = {\n root: '--mini-calendar-font-size';\n};\n\nexport interface MiniCalendarProps\n extends BoxProps, StylesApiProps<MiniCalendarFactory>, ElementProps<'div', 'onChange'> {\n /** Controlled component date value, start date of the interval */\n date?: Date | string;\n\n /** Uncontrolled component default value, start date of the interval */\n defaultDate?: Date | string;\n\n /** Called with date in `YYYY-MM-DD` format when date internal changes */\n onDateChange?: (date: string) => void;\n\n /** Selected date, controlled value */\n value?: Date | string | null;\n\n /** Called with date in `YYYY-MM-DD` format when date changes */\n onChange?: (date: string) => void;\n\n /** Maximum date that can be selected, date object or date string in `YYYY-MM-DD` format */\n maxDate?: Date | string;\n\n /** Minimum date that can be selected, date object or date string in `YYYY-MM-DD` format */\n minDate?: Date | string;\n\n /** Number of days to display in the calendar @default 7 */\n numberOfDays?: number;\n\n /** Dayjs format string for month label @default MMM */\n monthLabelFormat?: string;\n\n /** Called when the next button is clicked */\n onNext?: () => void;\n\n /** Called when the previous button is clicked */\n onPrevious?: () => void;\n\n /** Props passed down to the day component */\n getDayProps?: (date: string) => Record<string, any>;\n\n /** Component size @default 'sm' */\n size?: MantineSize;\n\n /** Props passed to previous control button */\n previousControlProps?: React.ComponentProps<'button'> & DataAttributes;\n\n /** Props passed to next control button */\n nextControlProps?: React.ComponentProps<'button'> & DataAttributes;\n\n /** dayjs locale used for formatting */\n locale?: string;\n}\n\nexport type MiniCalendarFactory = Factory<{\n props: MiniCalendarProps;\n ref: HTMLDivElement;\n stylesNames: MiniCalendarStylesNames;\n vars: MiniCalendarCssVariables;\n}>;\n\nconst defaultProps = {\n size: 'sm',\n numberOfDays: 7,\n monthLabelFormat: 'MMM',\n} satisfies Partial<MiniCalendarProps>;\n\nconst varsResolver = createVarsResolver<MiniCalendarFactory>((_theme, { size }) => ({\n root: {\n '--mini-calendar-font-size': getSize(size, 'mantine-font-size'),\n },\n}));\n\nexport const MiniCalendar = factory<MiniCalendarFactory>((_props) => {\n const props = useProps('MiniCalendar', defaultProps, _props);\n const {\n classNames,\n className,\n style,\n styles,\n unstyled,\n vars,\n attributes,\n date,\n defaultDate,\n onDateChange,\n value,\n onChange,\n onNext,\n onPrevious,\n getDayProps,\n numberOfDays,\n size,\n minDate,\n maxDate,\n monthLabelFormat,\n nextControlProps,\n previousControlProps,\n locale,\n ...others\n } = props;\n\n const getStyles = useStyles<MiniCalendarFactory>({\n name: 'MiniCalendar',\n classes,\n props,\n className,\n style,\n classNames,\n styles,\n unstyled,\n vars,\n varsResolver,\n attributes,\n });\n\n const ctx = useDatesContext();\n const _locale = ctx.getLocale(locale);\n\n const [_date, setDate] = useUncontrolled({\n value: toDateString(date),\n defaultValue: toDateString(defaultDate),\n finalValue: toDateString(value) || dayjs().format('YYYY-MM-DD'),\n onChange: onDateChange,\n });\n\n const handleNext = () => {\n onNext?.();\n const nextDate = dayjs(_date).add(numberOfDays, 'days');\n setDate(toDateString(nextDate));\n };\n\n const handlePrevious = () => {\n onPrevious?.();\n const previousDate = dayjs(_date).subtract(numberOfDays, 'days');\n setDate(toDateString(previousDate));\n };\n\n const previousDisabled = minDate\n ? dayjs(_date).subtract(1, 'days').isBefore(dayjs(minDate))\n : false;\n\n const nextDisabled = maxDate\n ? dayjs(_date).add(numberOfDays, 'days').isAfter(dayjs(maxDate))\n : false;\n\n const range = Array(numberOfDays)\n .fill(0)\n .map((_, index) => dayjs(_date).add(index, 'days'))\n .map((date) => {\n const disabled =\n (minDate && date.isBefore(dayjs(minDate), 'day')) ||\n (maxDate && date.isAfter(dayjs(maxDate), 'day')) ||\n false;\n\n const dayProps = getDayProps?.(toDateString(date));\n\n return (\n <UnstyledButton\n key={date.toString()}\n disabled={disabled}\n aria-label={date.format('YYYY-MM-DD')}\n data-disabled={disabled || undefined}\n data-selected={value && dayjs(date).isSame(value, 'day') ? true : undefined}\n {...dayProps}\n onClick={(event) => {\n dayProps?.onClick?.(event);\n onChange?.(toDateString(date));\n }}\n {...getStyles('day', {\n active: !disabled,\n className: dayProps?.className,\n style: dayProps?.style,\n })}\n >\n <span {...getStyles('dayMonth')}>{date.locale(_locale).format(monthLabelFormat)}</span>\n <span {...getStyles('dayNumber')}>{date.date()}</span>\n </UnstyledButton>\n );\n });\n\n return (\n <Box size={size} {...getStyles('root')} {...others}>\n <UnstyledButton\n size={size}\n onClick={handlePrevious}\n disabled={previousDisabled}\n data-disabled={previousDisabled || undefined}\n data-direction=\"previous\"\n {...previousControlProps}\n {...getStyles('control', {\n active: !previousDisabled,\n className: previousControlProps?.className,\n style: previousControlProps?.style,\n })}\n >\n {previousControlProps?.children || <AccordionChevron data-chevron size={size} />}\n </UnstyledButton>\n\n <div {...getStyles('days')}>{range}</div>\n\n <UnstyledButton\n size={size}\n onClick={handleNext}\n disabled={nextDisabled}\n data-disabled={nextDisabled || undefined}\n data-direction=\"next\"\n {...nextControlProps}\n {...getStyles('control', {\n active: !nextDisabled,\n className: nextControlProps?.className,\n style: nextControlProps?.style,\n })}\n >\n {nextControlProps?.children || <AccordionChevron data-chevron size={size} />}\n </UnstyledButton>\n </Box>\n );\n});\n\nMiniCalendar.displayName = '@mantine/dates/MiniCalendar';\nMiniCalendar.classes = classes;\nMiniCalendar.varsResolver = varsResolver;\n\nexport namespace MiniCalendar {\n export type Props = MiniCalendarProps;\n export type StylesNames = MiniCalendarStylesNames;\n export type Factory = MiniCalendarFactory;\n export type CssVariables = MiniCalendarCssVariables;\n}\n"],"mappings":"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"}