@mantine/dates
Version:
Calendars, date and time pickers based on Mantine components
1 lines • 10.6 kB
Source Map (JSON)
{"version":3,"file":"MiniCalendar.cjs","names":["useDatesContext","toDateString","UnstyledButton","Box","AccordionChevron","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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"}