@mantine/schedule 9.0.0 → 9.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/cjs/components/DayView/DayView.cjs +4 -2
  2. package/cjs/components/DayView/DayView.cjs.map +1 -1
  3. package/cjs/components/MonthView/MonthView.cjs +2 -1
  4. package/cjs/components/MonthView/MonthView.cjs.map +1 -1
  5. package/cjs/components/WeekView/WeekView.cjs +4 -2
  6. package/cjs/components/WeekView/WeekView.cjs.map +1 -1
  7. package/cjs/components/YearView/YearView.cjs.map +1 -1
  8. package/cjs/hooks/use-auto-scroll-on-drag.cjs +5 -10
  9. package/cjs/hooks/use-auto-scroll-on-drag.cjs.map +1 -1
  10. package/cjs/hooks/use-drag-drop-handlers.cjs +13 -8
  11. package/cjs/hooks/use-drag-drop-handlers.cjs.map +1 -1
  12. package/cjs/hooks/use-event-resize.cjs +3 -4
  13. package/cjs/hooks/use-event-resize.cjs.map +1 -1
  14. package/cjs/hooks/use-slot-drag-select.cjs +2 -3
  15. package/cjs/hooks/use-slot-drag-select.cjs.map +1 -1
  16. package/esm/components/DayView/DayView.mjs +4 -2
  17. package/esm/components/DayView/DayView.mjs.map +1 -1
  18. package/esm/components/MonthView/MonthView.mjs +2 -1
  19. package/esm/components/MonthView/MonthView.mjs.map +1 -1
  20. package/esm/components/WeekView/WeekView.mjs +4 -2
  21. package/esm/components/WeekView/WeekView.mjs.map +1 -1
  22. package/esm/components/YearView/YearView.mjs.map +1 -1
  23. package/esm/hooks/use-auto-scroll-on-drag.mjs +6 -11
  24. package/esm/hooks/use-auto-scroll-on-drag.mjs.map +1 -1
  25. package/esm/hooks/use-drag-drop-handlers.mjs +14 -9
  26. package/esm/hooks/use-drag-drop-handlers.mjs.map +1 -1
  27. package/esm/hooks/use-event-resize.mjs +4 -5
  28. package/esm/hooks/use-event-resize.mjs.map +1 -1
  29. package/esm/hooks/use-slot-drag-select.mjs +3 -4
  30. package/esm/hooks/use-slot-drag-select.mjs.map +1 -1
  31. package/lib/components/DayView/DayView.d.ts +6 -0
  32. package/lib/components/DayView/index.d.ts +0 -6
  33. package/lib/components/MonthView/MonthView.d.ts +6 -0
  34. package/lib/components/MonthView/index.d.ts +0 -6
  35. package/lib/components/WeekView/WeekView.d.ts +6 -0
  36. package/lib/components/WeekView/index.d.ts +0 -6
  37. package/lib/components/YearView/YearView.d.ts +6 -0
  38. package/lib/components/YearView/index.d.ts +0 -6
  39. package/package.json +4 -4
@@ -1 +1 @@
1
- {"version":3,"file":"WeekView.cjs","names":["getDayTimeIntervals","useDragDropHandlers","calculateDropTime","useSlotDragSelect","useEventResize","getWeekDays","getWeekViewEvents","expandRecurringEvents","formatDate","Box","getBusinessHoursMod","UnstyledButton","getLabel","toDateString","isAllDayEvent","ScheduleEvent","WeekViewDay","ScheduleHeaderBase","previousWeek","nextWeek","getWeekLabel","ScrollArea","getWeekNumber","CurrentTimeIndicator","DragContext","classes"],"sources":["../../../src/components/WeekView/WeekView.tsx"],"sourcesContent":["import dayjs from 'dayjs';\nimport { useCallback, useMemo, useRef, useState } from 'react';\nimport {\n Box,\n BoxProps,\n createVarsResolver,\n DataAttributes,\n ElementProps,\n factory,\n Factory,\n getRadius,\n MantineRadius,\n rem,\n ScrollArea,\n ScrollAreaAutosizeProps,\n StylesApiProps,\n UnstyledButton,\n useMantineTheme,\n useProps,\n useResolvedStylesApi,\n useStyles,\n} from '@mantine/core';\nimport { useDatesContext } from '@mantine/dates';\nimport { useIsomorphicEffect, useMergedRef } from '@mantine/hooks';\nimport { useAutoScrollOnDrag } from '../../hooks/use-auto-scroll-on-drag';\nimport { useDragDropHandlers } from '../../hooks/use-drag-drop-handlers';\nimport { useEventResize } from '../../hooks/use-event-resize';\nimport { useSlotDragSelect } from '../../hooks/use-slot-drag-select';\nimport { getLabel, ScheduleLabelsOverride } from '../../labels';\nimport {\n DateLabelFormat,\n DateStringValue,\n DateTimeStringValue,\n DayOfWeek,\n ScheduleEventData,\n ScheduleMode,\n ScheduleViewLevel,\n} from '../../types';\nimport {\n calculateDropTime,\n expandRecurringEvents,\n formatDate,\n getBusinessHoursMod,\n getDayTimeIntervals,\n getWeekDays,\n getWeekNumber,\n isAllDayEvent,\n nextWeek,\n previousWeek,\n toDateString,\n} from '../../utils';\nimport {\n CurrentTimeIndicator,\n CurrentTimeIndicatorStylesNames,\n} from '../CurrentTimeIndicator/CurrentTimeIndicator';\nimport { DragContext, DragContextValue } from '../DragContext/DragContext';\nimport { RenderEvent, RenderEventBody, ScheduleEvent } from '../ScheduleEvent/ScheduleEvent';\nimport { CombinedScheduleHeaderStylesNames } from '../ScheduleHeader/ScheduleHeader';\nimport { ScheduleHeaderBase } from '../ScheduleHeader/ScheduleHeaderBase';\nimport { ViewSelectProps } from '../ScheduleHeader/ViewSelect/ViewSelect';\nimport { getWeekLabel } from './get-week-label/get-week-label';\nimport { getWeekViewEvents } from './get-week-view-events/get-week-view-events';\nimport { handleWeekViewKeyDown, WeekViewControlsRef } from './handle-week-view-key-down';\nimport { WeekViewDay } from './WeekViewDay';\nimport classes from './WeekView.module.css';\n\nexport type WeekViewStylesNames =\n | 'weekView'\n | 'weekViewRoot'\n | 'weekViewHeader'\n | 'weekViewInner'\n | 'weekViewAllDaySlotsEvents'\n | 'weekViewAllDaySlots'\n | 'weekViewAllDaySlotsList'\n | 'weekViewAllDaySlot'\n | 'weekViewAllDaySlotsLabel'\n | 'weekViewScrollArea'\n | 'weekViewCorner'\n | 'weekViewSlotLabels'\n | 'weekViewSlotLabel'\n | 'weekViewDayLabel'\n | 'weekViewDayWeekday'\n | 'weekViewDay'\n | 'weekViewDayNumber'\n | 'weekViewDaySlot'\n | 'weekViewDaySlots'\n | 'weekViewWeekLabel'\n | 'weekViewWeekNumber'\n | 'weekViewBackgroundEvent'\n | CurrentTimeIndicatorStylesNames\n | CombinedScheduleHeaderStylesNames;\n\nexport type WeekViewCssVariables = {\n weekView: '--week-view-radius' | '--week-view-slot-height' | '--week-view-all-day-slots-height';\n};\n\nexport interface WeekViewProps\n extends BoxProps, StylesApiProps<WeekViewFactory>, ElementProps<'div'> {\n __staticSelector?: string;\n\n /** Week to display, Date object or date string in `YYYY-MM-DD` format */\n date: Date | string;\n\n /** Called with the new date value when a date is selected */\n onDateChange?: (value: DateStringValue) => void;\n\n /** Start time for the day view, in `HH:mm:ss` format @default 00:00:00 */\n startTime?: string;\n\n /** End time for the day view, in `HH:mm:ss` format @default 23:59:59 */\n endTime?: string;\n\n /** Number of minutes for each interval in the day view @default 60 */\n intervalMinutes?: number;\n\n /** Dayjs format for slot labels or a callback function that returns formatted value @default HH:mm */\n slotLabelFormat?: DateLabelFormat;\n\n /** Number 0-6, where 0 – Sunday and 6 – Saturday. @default 1 – Monday */\n firstDayOfWeek?: DayOfWeek;\n\n /** `dayjs` format for weekdays names. @default 'ddd' */\n weekdayFormat?: DateLabelFormat;\n\n /** Indices of weekend days, 0-6, where 0 is Sunday and 6 is Saturday. The default value is defined by `DatesProvider`. */\n weekendDays?: DayOfWeek[];\n\n /** If set to false, weekend days are hidden @default true */\n withWeekendDays?: boolean;\n\n /** If set to true, highlights today in the weekday row @default false */\n highlightToday?: boolean;\n\n /** Key of `theme.radius` or any valid CSS value to set `border-radius` @default theme.defaultRadius */\n radius?: MantineRadius;\n\n /** Props passed down to the `ScrollArea.Autosize` component */\n scrollAreaProps?: ScrollAreaAutosizeProps & DataAttributes;\n\n /** Locale passed down to dayjs, overrides value defined on `DatesProvider` */\n locale?: string;\n\n /** If set, the week number is displayed at the top left corner @default true */\n withWeekNumber?: boolean;\n\n /** If set, displays a line indicating the current time @default true */\n withCurrentTimeIndicator?: boolean;\n\n /** If set, the time indicator displays the current time in the bubble @default true */\n withCurrentTimeBubble?: boolean;\n\n /** If set, displays all-day slots at the top of the view @default true */\n withAllDaySlots?: boolean;\n\n /** If set, the header is displayed @default true */\n withHeader?: boolean;\n\n /** Called when view level select button is clicked */\n onViewChange?: (view: ScheduleViewLevel) => void;\n\n /** Props passed to previous month control */\n previousControlProps?: React.ComponentProps<'button'> & DataAttributes;\n\n /** Props passed to next month control */\n nextControlProps?: React.ComponentProps<'button'> & DataAttributes;\n\n /** Props passed to today control */\n todayControlProps?: React.ComponentProps<'button'> & DataAttributes;\n\n /** Props passed to view level select */\n viewSelectProps?: Partial<ViewSelectProps> & DataAttributes;\n\n /** Format for week label @default 'MMM DD' */\n weekLabelFormat?: DateLabelFormat;\n\n /** List of events to display in the week view */\n events?: ScheduleEventData[];\n\n /** Height of 1hr slot @default 64px */\n slotHeight?: React.CSSProperties['height'];\n\n /** Height of all-day slot @default 48px */\n allDaySlotHeight?: React.CSSProperties['height'];\n\n /** Labels override */\n labels?: ScheduleLabelsOverride;\n\n /** If set to true, highlights business hours with white background @default false */\n highlightBusinessHours?: boolean;\n\n /** Business hours range in `HH:mm:ss` format @default ['09:00:00', '17:00:00'] */\n businessHours?: [string, string];\n\n /** Function to customize event body, `event` object is passed as first argument */\n renderEventBody?: RenderEventBody;\n\n /** Function to fully customize event rendering, receives all props that would be passed to the root element including children */\n renderEvent?: RenderEvent;\n\n /** If true, events can be dragged and dropped @default false */\n withEventsDragAndDrop?: boolean;\n\n /** Called when event is dropped at new time */\n onEventDrop?: (data: {\n eventId: string | number;\n newStart: DateTimeStringValue;\n newEnd: DateTimeStringValue;\n event: ScheduleEventData;\n }) => void;\n\n /** Function to determine if event can be dragged */\n canDragEvent?: (event: ScheduleEventData) => boolean;\n\n /** Called when any event drag starts */\n onEventDragStart?: (event: ScheduleEventData) => void;\n\n /** Called when any event drag ends */\n onEventDragEnd?: () => void;\n\n /** Called when time slot is clicked */\n onTimeSlotClick?: (data: {\n slotStart: DateTimeStringValue;\n slotEnd: DateTimeStringValue;\n nativeEvent: React.MouseEvent<HTMLButtonElement>;\n }) => void;\n\n /** Called when all-day slot is clicked */\n onAllDaySlotClick?: (day: DateStringValue, event: React.MouseEvent<HTMLButtonElement>) => void;\n\n /** Called when event is clicked */\n onEventClick?: (event: ScheduleEventData, e: React.MouseEvent<HTMLButtonElement>) => void;\n\n /** If set, enables drag-to-select time slot ranges @default false */\n withDragSlotSelect?: boolean;\n\n /** Called when a time slot range is selected by dragging */\n onSlotDragEnd?: (rangeStart: DateTimeStringValue, rangeEnd: DateTimeStringValue) => void;\n\n /** Interaction mode: 'default' allows all interactions, 'static' disables event interactions @default default */\n mode?: ScheduleMode;\n\n /** Time to scroll to on initial render, in `HH:mm:ss` format */\n startScrollTime?: string;\n\n /** Function to customize week label in the header */\n renderWeekLabel?: (params: {\n weekStart: DateStringValue;\n weekEnd: DateStringValue;\n }) => React.ReactNode;\n\n /** Called when an external item is dropped onto the schedule. Receives the `DataTransfer` object and the drop target datetime. */\n onExternalEventDrop?: (dataTransfer: DataTransfer, dropDateTime: DateTimeStringValue) => void;\n\n /** If true, events can be resized by dragging their edges @default false */\n withEventResize?: boolean;\n\n /** Called when event is resized */\n onEventResize?: (data: {\n eventId: string | number;\n newStart: DateTimeStringValue;\n newEnd: DateTimeStringValue;\n event: ScheduleEventData;\n }) => void;\n\n /** Function to determine if event can be resized */\n canResizeEvent?: (event: ScheduleEventData) => boolean;\n\n /** Max number of generated recurring instances per recurring series @default 2000 */\n recurrenceExpansionLimit?: number;\n\n /** Function to get additional props for each time slot. Receives slot start and end datetime strings. Returned props are spread onto the slot element. Event handlers returned by this function are composed with internal handlers (e.g. onClick) rather than overriding them. */\n getTimeSlotProps?: (data: {\n start: DateTimeStringValue;\n end: DateTimeStringValue;\n }) => Record<string, any> | undefined;\n}\n\nexport type WeekViewFactory = Factory<{\n props: WeekViewProps;\n ref: HTMLDivElement;\n stylesNames: WeekViewStylesNames;\n vars: WeekViewCssVariables;\n}>;\n\nconst defaultProps = {\n __staticSelector: 'WeekView',\n withWeekendDays: true,\n withCurrentTimeIndicator: true,\n startTime: '00:00:00',\n endTime: '23:59:59',\n slotLabelFormat: 'HH:mm',\n intervalMinutes: 60,\n weekdayFormat: 'ddd',\n withWeekNumber: true,\n withCurrentTimeBubble: true,\n withAllDaySlots: true,\n withHeader: true,\n weekLabelFormat: 'MMM DD',\n highlightBusinessHours: false,\n businessHours: ['09:00:00', '17:00:00'],\n withEventsDragAndDrop: false,\n withDragSlotSelect: false,\n withEventResize: false,\n mode: 'default',\n} satisfies Partial<WeekViewProps>;\n\nconst varsResolver = createVarsResolver<WeekViewFactory>(\n (_theme, { radius, allDaySlotHeight, slotHeight }) => ({\n weekView: {\n '--week-view-radius': radius !== undefined ? getRadius(radius) : undefined,\n '--week-view-all-day-slots-height': rem(allDaySlotHeight),\n '--week-view-slot-height': rem(slotHeight),\n },\n })\n);\n\nexport const WeekView = factory<WeekViewFactory>((_props) => {\n const props = useProps('WeekView', defaultProps, _props);\n const {\n classNames,\n className,\n style,\n styles,\n unstyled,\n attributes,\n vars,\n startTime,\n endTime,\n date,\n onDateChange,\n intervalMinutes,\n slotLabelFormat,\n withWeekendDays,\n weekendDays,\n firstDayOfWeek,\n weekdayFormat,\n radius,\n highlightToday,\n withCurrentTimeIndicator,\n scrollAreaProps,\n locale,\n withWeekNumber,\n withCurrentTimeBubble,\n withAllDaySlots,\n __staticSelector,\n withHeader,\n onViewChange,\n previousControlProps,\n nextControlProps,\n todayControlProps,\n viewSelectProps,\n weekLabelFormat,\n events,\n allDaySlotHeight,\n slotHeight,\n labels,\n highlightBusinessHours,\n businessHours,\n renderEventBody,\n renderEvent,\n withEventsDragAndDrop,\n onEventDrop,\n canDragEvent,\n onEventDragStart,\n onEventDragEnd,\n onTimeSlotClick,\n onAllDaySlotClick,\n onEventClick,\n withDragSlotSelect,\n onSlotDragEnd,\n mode,\n startScrollTime,\n renderWeekLabel,\n onExternalEventDrop,\n withEventResize,\n onEventResize,\n canResizeEvent,\n recurrenceExpansionLimit,\n getTimeSlotProps,\n ...others\n } = props;\n\n const getStyles = useStyles<WeekViewFactory>({\n name: __staticSelector,\n classes,\n props,\n className,\n style,\n classNames,\n styles,\n unstyled,\n vars,\n varsResolver,\n attributes,\n rootSelector: 'weekView',\n });\n\n const { resolvedClassNames, resolvedStyles } = useResolvedStylesApi<WeekViewFactory>({\n classNames,\n styles,\n props,\n });\n\n const stylesApiProps = {\n classNames: resolvedClassNames,\n styles: resolvedStyles,\n attributes,\n __staticSelector,\n radius,\n };\n\n const theme = useMantineTheme();\n const [scrolled, setScrolled] = useState(false);\n const ctx = useDatesContext();\n const slots = getDayTimeIntervals({ startTime, endTime, intervalMinutes });\n const viewportRef = useRef<HTMLDivElement>(null);\n\n useAutoScrollOnDrag({\n viewportRef,\n enabled: (withEventsDragAndDrop || !!onExternalEventDrop) && mode !== 'static',\n });\n\n type DropTargetSlot = { day: string; slotIndex: number };\n\n const handleExternalDrop = useCallback(\n (e: React.DragEvent, target: DropTargetSlot) => {\n if (!onExternalEventDrop) {\n return;\n }\n const slotDate = dayjs(target.day).format('YYYY-MM-DD');\n onExternalEventDrop(e.dataTransfer, `${slotDate} ${slots[target.slotIndex].startTime}`);\n },\n [onExternalEventDrop, slots]\n );\n\n const handleExternalAllDayDrop = useCallback(\n (e: React.DragEvent, day: string) => {\n if (!onExternalEventDrop) {\n return;\n }\n onExternalEventDrop(e.dataTransfer, `${dayjs(day).format('YYYY-MM-DD')} 00:00:00`);\n },\n [onExternalEventDrop]\n );\n\n const dragDrop = useDragDropHandlers<DropTargetSlot>({\n enabled: withEventsDragAndDrop,\n mode,\n onEventDrop,\n canDragEvent,\n onEventDragStart,\n onEventDragEnd,\n calculateDropTarget: (target: DropTargetSlot, draggedEvent: ScheduleEventData) => {\n const slotTime = slots[target.slotIndex].startTime;\n return calculateDropTime({\n draggedEvent,\n targetDate: target.day,\n targetSlotTime: slotTime,\n intervalMinutes,\n });\n },\n onExternalDrop: onExternalEventDrop ? handleExternalDrop : undefined,\n });\n\n const allDayDragDrop = useDragDropHandlers<string>({\n enabled: withEventsDragAndDrop,\n mode,\n onEventDrop,\n canDragEvent,\n onEventDragStart,\n onEventDragEnd,\n calculateDropTarget: (targetDay: string, draggedEvent: ScheduleEventData) => {\n const eventDuration = dayjs(draggedEvent.end).diff(dayjs(draggedEvent.start), 'millisecond');\n const newStart = dayjs(targetDay).startOf('day');\n return { start: newStart.toDate(), end: newStart.add(eventDuration, 'millisecond').toDate() };\n },\n onExternalDrop: onExternalEventDrop ? handleExternalAllDayDrop : undefined,\n });\n\n const slotDragSelect = useSlotDragSelect({\n enabled: withDragSlotSelect && mode !== 'static',\n onDragEnd: (startIndex, endIndex, group) => {\n if (!onSlotDragEnd) {\n return;\n }\n const slotDate = dayjs(group).format('YYYY-MM-DD');\n onSlotDragEnd(\n `${slotDate} ${slots[startIndex].startTime}`,\n `${slotDate} ${slots[endIndex].endTime}`\n );\n },\n });\n\n const eventResize = useEventResize({\n enabled: withEventResize,\n mode,\n startTime,\n endTime,\n intervalMinutes,\n onEventResize,\n canResizeEvent,\n });\n\n const withDragHandlers = (withEventsDragAndDrop || !!onExternalEventDrop) && mode !== 'static';\n\n const handleTimeSlotClick = (\n day: string,\n slotTime: string,\n e: React.MouseEvent<HTMLButtonElement>\n ) => {\n if (!onTimeSlotClick) {\n return;\n }\n\n const slotDate = dayjs(day).format('YYYY-MM-DD');\n const slotIndex = slots.findIndex((s) => s.startTime === slotTime);\n if (slotIndex === -1) {\n return;\n }\n\n const slot = slots[slotIndex];\n onTimeSlotClick({\n slotStart: `${slotDate} ${slot.startTime}`,\n slotEnd: `${slotDate} ${slot.endTime}`,\n nativeEvent: e,\n });\n };\n\n const weekdays = getWeekDays({\n week: date,\n withWeekendDays,\n weekendDays: ctx.getWeekendDays(weekendDays),\n firstDayOfWeek: ctx.getFirstDayOfWeek(firstDayOfWeek),\n });\n\n const expandedEvents = expandRecurringEvents({\n events,\n rangeStart: dayjs(weekdays[0]).startOf('day').toDate(),\n rangeEnd: dayjs(weekdays[weekdays.length - 1])\n .endOf('day')\n .toDate(),\n expansionLimit: recurrenceExpansionLimit,\n });\n\n const weekEvents = getWeekViewEvents({\n date,\n events: expandedEvents,\n startTime,\n endTime,\n firstDayOfWeek: ctx.getFirstDayOfWeek(firstDayOfWeek),\n weekendDays: ctx.getWeekendDays(weekendDays),\n withWeekendDays,\n });\n\n const timeValues = slots.map((interval) => {\n const intervalTime = dayjs(`${dayjs(date).format('YYYY-MM-DD')} ${interval.startTime}`);\n const label = formatDate({\n date: intervalTime,\n locale: ctx.getLocale(locale),\n format: slotLabelFormat,\n });\n\n return (\n <Box\n {...getStyles('weekViewSlotLabel')}\n key={interval.startTime}\n mod={{\n 'hour-start': interval.isHourStart,\n ...getBusinessHoursMod({\n time: interval.startTime,\n businessHours,\n highlightBusinessHours,\n }),\n }}\n >\n {label}\n </Box>\n );\n });\n\n const slotsRef: WeekViewControlsRef = useRef<HTMLButtonElement[][]>([]);\n const allDaySlotsRef = useRef<HTMLButtonElement[]>([]);\n const weekdaysRef = useRef<HTMLButtonElement[]>([]);\n const daySlotsContainersRef = useRef<(HTMLDivElement | null)[]>([]);\n const mergedViewportRef = useMergedRef(viewportRef, scrollAreaProps?.viewportRef);\n\n const firstSlotIndex = { dayIndex: 0, slotIndex: 0 };\n\n useIsomorphicEffect(() => {\n if (!startScrollTime || !viewportRef.current) {\n return;\n }\n\n const firstDaySlots = slotsRef.current[0];\n if (!firstDaySlots || firstDaySlots.length === 0) {\n return;\n }\n\n const targetIndex = slots.findIndex((s) => s.startTime >= startScrollTime);\n if (targetIndex < 0) {\n return;\n }\n\n const targetSlot = firstDaySlots[targetIndex];\n if (!targetSlot) {\n return;\n }\n\n const slotRect = targetSlot.getBoundingClientRect();\n const viewportRect = viewportRef.current.getBoundingClientRect();\n viewportRef.current.scrollTo({ left: 0, top: slotRect.top - viewportRect.top });\n }, []);\n\n const getSlotIndexFromDragPoint = useCallback((event: React.DragEvent, dayIndex: number) => {\n const daySlots = slotsRef.current[dayIndex] ?? [];\n const slotIndex = daySlots.findIndex((slotNode) => {\n if (!slotNode) {\n return false;\n }\n\n const rect = slotNode.getBoundingClientRect();\n return event.clientY >= rect.top && event.clientY <= rect.bottom;\n });\n\n if (slotIndex >= 0) {\n return slotIndex;\n }\n\n const firstSlot = daySlots[0];\n const lastSlot = daySlots[daySlots.length - 1];\n\n if (!firstSlot || !lastSlot) {\n return null;\n }\n\n const firstRect = firstSlot.getBoundingClientRect();\n const lastRect = lastSlot.getBoundingClientRect();\n\n if (event.clientY < firstRect.top) {\n return 0;\n }\n\n if (event.clientY > lastRect.bottom) {\n return daySlots.length - 1;\n }\n\n return null;\n }, []);\n\n const handleSlotKeyDown = (\n event: React.KeyboardEvent<HTMLButtonElement>,\n dayIndex: number,\n slotIndex: number\n ) => {\n handleWeekViewKeyDown({\n controlsRef: slotsRef,\n dayIndex,\n slotIndex,\n event,\n });\n };\n\n const handleAllDaySlotKeyDown = (\n event: React.KeyboardEvent<HTMLButtonElement>,\n dayIndex: number\n ) => {\n const direction = event.key;\n if (direction === 'ArrowRight' && dayIndex < weekdays.length - 1) {\n event.preventDefault();\n allDaySlotsRef.current[dayIndex + 1]?.focus();\n } else if (direction === 'ArrowLeft' && dayIndex > 0) {\n event.preventDefault();\n allDaySlotsRef.current[dayIndex - 1]?.focus();\n } else if (direction === 'ArrowDown') {\n event.preventDefault();\n slotsRef.current?.[dayIndex]?.[0]?.focus();\n }\n };\n\n const handleWeekdayKeyDown = (\n event: React.KeyboardEvent<HTMLButtonElement>,\n dayIndex: number\n ) => {\n const direction = event.key;\n if (direction === 'ArrowRight' && dayIndex < weekdays.length - 1) {\n event.preventDefault();\n weekdaysRef.current[dayIndex + 1]?.focus();\n } else if (direction === 'ArrowLeft' && dayIndex > 0) {\n event.preventDefault();\n weekdaysRef.current[dayIndex - 1]?.focus();\n }\n };\n\n const currentWeekdayIndex = withCurrentTimeIndicator\n ? weekdays.findIndex((day) => dayjs(day).isSame(dayjs(), 'date'))\n : -1;\n\n const weekdaysLabels = weekdays.map((day, dayIndex) => (\n <UnstyledButton\n {...getStyles('weekViewDayLabel')}\n key={day}\n ref={(node) => {\n weekdaysRef.current[dayIndex] = node!;\n }}\n aria-label={`${getLabel('weekday', labels)} ${dayjs(day).format('YYYY-MM-DD')}`}\n mod={{\n today: dayjs(day).isSame(dayjs(), 'day') && !!highlightToday,\n weekend: ctx.getWeekendDays(weekendDays).includes(dayjs(day).day() as DayOfWeek),\n static: mode === 'static',\n }}\n tabIndex={mode === 'static' ? -1 : dayIndex === 0 ? 0 : -1}\n onKeyDown={mode === 'static' ? undefined : (event) => handleWeekdayKeyDown(event, dayIndex)}\n onClick={\n mode === 'static'\n ? undefined\n : () => {\n onViewChange?.('day');\n onDateChange?.(toDateString(day));\n }\n }\n >\n <Box {...getStyles('weekViewDayWeekday')} key=\"weekday\">\n {formatDate({ locale: ctx.getLocale(locale), date: day, format: weekdayFormat })}\n </Box>\n <div {...getStyles('weekViewDayNumber')} key=\"date\">\n {dayjs(day).date()}\n </div>\n </UnstyledButton>\n ));\n\n const days = weekdays.map((day, dayIndex) => {\n const allBgEvents = weekEvents.backgroundEvents[day] || [];\n\n const backgroundEventNodes = allBgEvents\n .filter((event) => !event.position.allDay)\n .map((event) => {\n const colors = theme.variantColorResolver({\n color: event.color || theme.primaryColor,\n theme,\n variant: 'light',\n autoContrast: true,\n });\n\n const bgEventBody =\n typeof renderEventBody === 'function' ? renderEventBody(event) : event.title;\n\n const bgEventProps = {\n key: `bg-${event.id}`,\n ...getStyles('weekViewBackgroundEvent', {\n style: {\n top: `${event.position.top}%`,\n height: `${event.position.height}%`,\n width: '100%',\n },\n }),\n __vars: {\n '--bg-event-bg': colors.background,\n '--bg-event-color': colors.color,\n },\n children: bgEventBody,\n };\n\n if (typeof renderEvent === 'function') {\n return renderEvent(event, bgEventProps as any);\n }\n\n return <Box {...bgEventProps} />;\n });\n\n const dayEvents = (weekEvents.regularEvents[day] || []).map((event) => {\n const eventIsAllDay = isAllDayEvent({ event, date: day });\n const isDraggable = !eventIsAllDay && dragDrop.isDraggableEvent(event);\n const isResizable = !eventIsAllDay && eventResize.isResizableEvent(event);\n const resizePosition = eventResize.getResizePosition(event.id);\n const eventTop = resizePosition ? resizePosition.top : event.position.top;\n const eventHeight = resizePosition ? resizePosition.height : event.position.height;\n\n return (\n <ScheduleEvent\n key={event.id}\n event={event}\n autoSize\n hanging={event.position.hanging}\n draggable={isDraggable}\n withResize={isResizable}\n isResizing={resizePosition !== null}\n onResizeStart={\n isResizable\n ? (edge, e) => {\n const container = daySlotsContainersRef.current[dayIndex];\n if (container) {\n eventResize.handleResizeStart({\n event,\n edge,\n container,\n originalTop: event.position.top,\n originalHeight: event.position.height,\n eventDate: dayjs(day).format('YYYY-MM-DD'),\n pointerEvent: e,\n });\n }\n }\n : undefined\n }\n renderEventBody={renderEventBody}\n renderEvent={renderEvent}\n radius={radius}\n mode={mode}\n onClick={onEventClick ? (e) => onEventClick(event, e) : undefined}\n style={{\n position: 'absolute',\n top: `calc(${eventTop}% + 1px)`,\n left: `${event.position.offset}%`,\n width: `${event.position.width}%`,\n height: `calc(${eventHeight}% - 1px)`,\n }}\n />\n );\n });\n\n return (\n <WeekViewDay\n key={day}\n day={day}\n dayIndex={dayIndex}\n slots={slots}\n getStyles={getStyles}\n weekendDays={weekendDays}\n highlightBusinessHours={highlightBusinessHours}\n businessHours={businessHours}\n labels={labels}\n withEventsDragAndDrop={withDragHandlers}\n mode={mode}\n slotsRef={slotsRef}\n firstSlotIndex={firstSlotIndex}\n onSlotKeyDown={handleSlotKeyDown}\n onSlotClick={handleTimeSlotClick}\n onFirstSlotArrowUp={\n withAllDaySlots\n ? (dayIdx) => {\n allDaySlotsRef.current[dayIdx]?.focus();\n }\n : undefined\n }\n onDaySlotsDragOver={(event, dayStr, dayIdx) => {\n const slotIndex = getSlotIndexFromDragPoint(event, dayIdx);\n if (slotIndex !== null) {\n dragDrop.handleDragOver(event, { day: dayStr, slotIndex });\n }\n }}\n onDaySlotsDragLeave={dragDrop.handleDragLeave}\n onDaySlotsDrop={(event, dayStr, dayIdx) => {\n const slotIndex = getSlotIndexFromDragPoint(event, dayIdx);\n if (slotIndex !== null) {\n dragDrop.handleDrop(event, { day: dayStr, slotIndex });\n }\n }}\n dropTargetSlotIndex={\n dragDrop.dropTarget?.day === day ? dragDrop.dropTarget.slotIndex : undefined\n }\n withDragSlotSelect={withDragSlotSelect}\n onSlotPointerDown={slotDragSelect.handleSlotPointerDown}\n isSlotDragSelected={slotDragSelect.isSlotSelected}\n daySlotsContainerRef={(node) => {\n daySlotsContainersRef.current[dayIndex] = node;\n }}\n getTimeSlotProps={getTimeSlotProps}\n >\n {backgroundEventNodes}\n {dayEvents}\n </WeekViewDay>\n );\n });\n\n const allDaySlots = weekdays.map((day, dayIndex) => (\n <UnstyledButton\n aria-label={`${getLabel('allDay', labels)} ${dayjs(day).format('YYYY-MM-DD')}`}\n key={day}\n ref={(node) => {\n allDaySlotsRef.current[dayIndex] = node!;\n }}\n tabIndex={dayIndex === 0 ? 0 : -1}\n onKeyDown={(event) => handleAllDaySlotKeyDown(event, dayIndex)}\n onClick={\n mode === 'static' || !onAllDaySlotClick\n ? undefined\n : (e) => onAllDaySlotClick(dayjs(day).format('YYYY-MM-DD'), e)\n }\n onDragOver={withDragHandlers ? (e) => allDayDragDrop.handleDragOver(e, day) : undefined}\n onDragLeave={withDragHandlers ? allDayDragDrop.handleDragLeave : undefined}\n onDrop={withDragHandlers ? (e) => allDayDragDrop.handleDrop(e, day) : undefined}\n {...getStyles('weekViewDaySlot')}\n mod={{ 'drop-target': allDayDragDrop.isDropTarget(day) }}\n />\n ));\n\n const allDayEventIds = useMemo(\n () => new Set(weekEvents.allDayEvents.map((e) => e.id)),\n [weekEvents.allDayEvents]\n );\n\n const allDayEvents = weekEvents.allDayEvents.map((event) => (\n <ScheduleEvent\n key={event.id}\n event={event}\n autoSize\n nowrap\n hanging={event.position.hanging}\n draggable={allDayDragDrop.isDraggableEvent(event)}\n renderEvent={renderEvent}\n mode={mode}\n onClick={onEventClick ? (e) => onEventClick(event, e) : undefined}\n style={{\n position: 'absolute',\n zIndex: 2,\n top: `calc(${event.position.row * 50}% + 1px)`,\n left: `calc(${event.position.offset}% + 1px)`,\n width: `calc(${event.position.width}% - 1px)`,\n height: 'calc(50% - 2px)',\n maxHeight: 'calc(50% - 2px)',\n }}\n />\n ));\n\n const allDayBackgroundEventNodes = weekdays.flatMap((day, dayIndex) => {\n const allDayBgEvents = (weekEvents.backgroundEvents[day] || []).filter(\n (event) => event.position.allDay\n );\n const dayWidth = 100 / weekdays.length;\n const dayOffset = dayIndex * dayWidth;\n\n return allDayBgEvents.map((event) => {\n const colors = theme.variantColorResolver({\n color: event.color || theme.primaryColor,\n theme,\n variant: 'light',\n autoContrast: true,\n });\n\n const bgEventBody =\n typeof renderEventBody === 'function' ? renderEventBody(event) : event.title;\n\n const bgEventProps = {\n key: `bg-allday-${event.id}-${day}`,\n ...getStyles('weekViewBackgroundEvent', {\n style: {\n top: 0,\n height: '100%',\n left: `${dayOffset}%`,\n width: `${dayWidth}%`,\n },\n }),\n __vars: {\n '--bg-event-bg': colors.background,\n '--bg-event-color': colors.color,\n },\n children: bgEventBody,\n };\n\n if (typeof renderEvent === 'function') {\n return renderEvent(event, bgEventProps as any);\n }\n\n return <Box {...bgEventProps} />;\n });\n });\n\n // Extra rows show on hover = total rows - 2 visible rows (starts from 0, so -1)\n const extraRows = Math.max(...weekEvents.allDayEvents.map((event) => event.position.row), 1) - 1;\n\n const content = (\n <Box\n {...getStyles('weekView')}\n mod={{ static: mode === 'static', 'slot-dragging': slotDragSelect.isDragging }}\n {...others}\n >\n {withHeader && (\n <ScheduleHeaderBase\n view=\"week\"\n navigationHandlers={{\n previous: () => previousWeek(date, ctx.getFirstDayOfWeek(firstDayOfWeek)),\n next: () => nextWeek(date, ctx.getFirstDayOfWeek(firstDayOfWeek)),\n today: () => toDateString(dayjs()),\n }}\n control={{\n miw: 140,\n title: getWeekLabel({\n weekdays,\n locale: ctx.getLocale(locale),\n weekLabelFormat,\n renderWeekLabel,\n }),\n }}\n labels={labels}\n onDateChange={onDateChange}\n onViewChange={onViewChange}\n previousControlProps={previousControlProps}\n nextControlProps={nextControlProps}\n todayControlProps={todayControlProps}\n viewSelectProps={viewSelectProps}\n stylesApiProps={stylesApiProps}\n />\n )}\n\n <Box\n {...getStyles('weekViewRoot')}\n __vars={{\n '--indicator-offset-index':\n currentWeekdayIndex === -1 ? undefined : `${currentWeekdayIndex + 1}`,\n '--number-of-days': withWeekendDays\n ? '7'\n : `${7 - ctx.getWeekendDays(weekendDays).length}`,\n }}\n mod={{ 'with-weekends': withWeekendDays }}\n >\n <ScrollArea.Autosize\n scrollbarSize={4}\n {...scrollAreaProps}\n {...getStyles('weekViewScrollArea', {\n className: scrollAreaProps?.className,\n style: scrollAreaProps?.style,\n })}\n onScrollPositionChange={(position) => {\n scrollAreaProps?.onScrollPositionChange?.(position);\n setScrolled(position.y !== 0);\n }}\n viewportRef={mergedViewportRef}\n >\n <Box {...getStyles('weekViewHeader')} mod={{ scrolled }}>\n <div {...getStyles('weekViewCorner')} key=\"corner\">\n {withWeekNumber && (\n <>\n <div {...getStyles('weekViewWeekLabel')}>{getLabel('week', labels)}</div>\n <div {...getStyles('weekViewWeekNumber')}>{getWeekNumber(date)}</div>\n </>\n )}\n </div>\n\n {weekdaysLabels}\n </Box>\n\n {withAllDaySlots && (\n <div {...getStyles('weekViewAllDaySlots')}>\n <div {...getStyles('weekViewAllDaySlotsLabel')}>{getLabel('allDay', labels)}</div>\n <div {...getStyles('weekViewAllDaySlotsList')}>\n {allDayBackgroundEventNodes}\n <Box\n {...getStyles('weekViewAllDaySlotsEvents')}\n __vars={{ '--extra-rows': `${extraRows}` }}\n >\n {allDayEvents}\n </Box>\n {allDaySlots}\n </div>\n </div>\n )}\n\n <div {...getStyles('weekViewInner')}>\n <div {...getStyles('weekViewSlotLabels')}>{timeValues}</div>\n\n {withCurrentTimeIndicator && currentWeekdayIndex !== -1 && (\n <CurrentTimeIndicator\n startOffset=\"calc(100% - (100% / var(--number-of-days)) * (var(--number-of-days) - var(--indicator-offset-index) + 1) + ((var(--number-of-days) - var(--indicator-offset-index) + 1) * var(--indicator-labels-offset)))\"\n endOffset=\"calc((100% / var(--number-of-days)) * (var(--number-of-days) - var(--indicator-offset-index)) - (var(--number-of-days) - var(--indicator-offset-index)) * var(--indicator-labels-offset))\"\n timeBubbleStartOffset=\"calc(var(--week-view-slots-label-width) - var(--time-bubble-width))\"\n currentTimeFormat={slotLabelFormat}\n withTimeBubble={withCurrentTimeBubble}\n withThumb={withCurrentTimeBubble ? currentWeekdayIndex !== 0 : true}\n locale={locale}\n startTime={startTime}\n endTime={endTime}\n {...stylesApiProps}\n />\n )}\n {days}\n </div>\n </ScrollArea.Autosize>\n </Box>\n </Box>\n );\n\n const mergedDragContextValue = useMemo<DragContextValue>(\n () => ({\n isDragging:\n dragDrop.dragContextValue.isDragging || allDayDragDrop.dragContextValue.isDragging,\n draggedEventId:\n dragDrop.dragContextValue.draggedEventId ?? allDayDragDrop.dragContextValue.draggedEventId,\n draggedEvent:\n dragDrop.dragContextValue.draggedEvent ?? allDayDragDrop.dragContextValue.draggedEvent,\n dropTarget:\n dragDrop.dragContextValue.dropTarget ?? allDayDragDrop.dragContextValue.dropTarget,\n onDragStart: (event: ScheduleEventData) => {\n if (allDayEventIds.has(event.id)) {\n allDayDragDrop.handleDragStart(event);\n } else {\n dragDrop.handleDragStart(event);\n }\n },\n onDragEnd: () => {\n dragDrop.handleDragEnd();\n allDayDragDrop.handleDragEnd();\n },\n setDropTarget: dragDrop.dragContextValue.setDropTarget,\n }),\n [dragDrop.dragContextValue, allDayDragDrop.dragContextValue, allDayEventIds]\n );\n\n if (withEventsDragAndDrop) {\n return <DragContext.Provider value={mergedDragContextValue}>{content}</DragContext.Provider>;\n }\n\n return content;\n});\n\nWeekView.displayName = '@mantine/schedule/WeekView';\nWeekView.classes = classes;\nWeekView.varsResolver = varsResolver;\n"],"mappings":"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"}
1
+ {"version":3,"file":"WeekView.cjs","names":["getDayTimeIntervals","useDragDropHandlers","calculateDropTime","useSlotDragSelect","useEventResize","getWeekDays","getWeekViewEvents","expandRecurringEvents","formatDate","Box","getBusinessHoursMod","UnstyledButton","getLabel","toDateString","isAllDayEvent","ScheduleEvent","WeekViewDay","ScheduleHeaderBase","previousWeek","nextWeek","getWeekLabel","ScrollArea","getWeekNumber","CurrentTimeIndicator","DragContext","classes"],"sources":["../../../src/components/WeekView/WeekView.tsx"],"sourcesContent":["import dayjs from 'dayjs';\nimport { useCallback, useMemo, useRef, useState } from 'react';\nimport {\n Box,\n BoxProps,\n createVarsResolver,\n DataAttributes,\n ElementProps,\n factory,\n Factory,\n getRadius,\n MantineRadius,\n rem,\n ScrollArea,\n ScrollAreaAutosizeProps,\n StylesApiProps,\n UnstyledButton,\n useMantineTheme,\n useProps,\n useResolvedStylesApi,\n useStyles,\n} from '@mantine/core';\nimport { useDatesContext } from '@mantine/dates';\nimport { useIsomorphicEffect, useMergedRef } from '@mantine/hooks';\nimport { useAutoScrollOnDrag } from '../../hooks/use-auto-scroll-on-drag';\nimport { useDragDropHandlers } from '../../hooks/use-drag-drop-handlers';\nimport { useEventResize } from '../../hooks/use-event-resize';\nimport { useSlotDragSelect } from '../../hooks/use-slot-drag-select';\nimport { getLabel, ScheduleLabelsOverride } from '../../labels';\nimport {\n DateLabelFormat,\n DateStringValue,\n DateTimeStringValue,\n DayOfWeek,\n ScheduleEventData,\n ScheduleMode,\n ScheduleViewLevel,\n} from '../../types';\nimport {\n calculateDropTime,\n expandRecurringEvents,\n formatDate,\n getBusinessHoursMod,\n getDayTimeIntervals,\n getWeekDays,\n getWeekNumber,\n isAllDayEvent,\n nextWeek,\n previousWeek,\n toDateString,\n} from '../../utils';\nimport {\n CurrentTimeIndicator,\n CurrentTimeIndicatorStylesNames,\n} from '../CurrentTimeIndicator/CurrentTimeIndicator';\nimport { DragContext, DragContextValue } from '../DragContext/DragContext';\nimport { RenderEvent, RenderEventBody, ScheduleEvent } from '../ScheduleEvent/ScheduleEvent';\nimport { CombinedScheduleHeaderStylesNames } from '../ScheduleHeader/ScheduleHeader';\nimport { ScheduleHeaderBase } from '../ScheduleHeader/ScheduleHeaderBase';\nimport { ViewSelectProps } from '../ScheduleHeader/ViewSelect/ViewSelect';\nimport { getWeekLabel } from './get-week-label/get-week-label';\nimport { getWeekViewEvents } from './get-week-view-events/get-week-view-events';\nimport { handleWeekViewKeyDown, WeekViewControlsRef } from './handle-week-view-key-down';\nimport { WeekViewDay } from './WeekViewDay';\nimport classes from './WeekView.module.css';\n\nexport type WeekViewStylesNames =\n | 'weekView'\n | 'weekViewRoot'\n | 'weekViewHeader'\n | 'weekViewInner'\n | 'weekViewAllDaySlotsEvents'\n | 'weekViewAllDaySlots'\n | 'weekViewAllDaySlotsList'\n | 'weekViewAllDaySlot'\n | 'weekViewAllDaySlotsLabel'\n | 'weekViewScrollArea'\n | 'weekViewCorner'\n | 'weekViewSlotLabels'\n | 'weekViewSlotLabel'\n | 'weekViewDayLabel'\n | 'weekViewDayWeekday'\n | 'weekViewDay'\n | 'weekViewDayNumber'\n | 'weekViewDaySlot'\n | 'weekViewDaySlots'\n | 'weekViewWeekLabel'\n | 'weekViewWeekNumber'\n | 'weekViewBackgroundEvent'\n | CurrentTimeIndicatorStylesNames\n | CombinedScheduleHeaderStylesNames;\n\nexport type WeekViewCssVariables = {\n weekView: '--week-view-radius' | '--week-view-slot-height' | '--week-view-all-day-slots-height';\n};\n\nexport interface WeekViewProps\n extends BoxProps, StylesApiProps<WeekViewFactory>, ElementProps<'div'> {\n __staticSelector?: string;\n\n /** Week to display, Date object or date string in `YYYY-MM-DD` format */\n date: Date | string;\n\n /** Called with the new date value when a date is selected */\n onDateChange?: (value: DateStringValue) => void;\n\n /** Start time for the day view, in `HH:mm:ss` format @default 00:00:00 */\n startTime?: string;\n\n /** End time for the day view, in `HH:mm:ss` format @default 23:59:59 */\n endTime?: string;\n\n /** Number of minutes for each interval in the day view @default 60 */\n intervalMinutes?: number;\n\n /** Dayjs format for slot labels or a callback function that returns formatted value @default HH:mm */\n slotLabelFormat?: DateLabelFormat;\n\n /** Number 0-6, where 0 – Sunday and 6 – Saturday. @default 1 – Monday */\n firstDayOfWeek?: DayOfWeek;\n\n /** `dayjs` format for weekdays names. @default 'ddd' */\n weekdayFormat?: DateLabelFormat;\n\n /** Indices of weekend days, 0-6, where 0 is Sunday and 6 is Saturday. The default value is defined by `DatesProvider`. */\n weekendDays?: DayOfWeek[];\n\n /** If set to false, weekend days are hidden @default true */\n withWeekendDays?: boolean;\n\n /** If set to true, highlights today in the weekday row @default false */\n highlightToday?: boolean;\n\n /** Key of `theme.radius` or any valid CSS value to set `border-radius` @default theme.defaultRadius */\n radius?: MantineRadius;\n\n /** Props passed down to the `ScrollArea.Autosize` component */\n scrollAreaProps?: ScrollAreaAutosizeProps & DataAttributes;\n\n /** Locale passed down to dayjs, overrides value defined on `DatesProvider` */\n locale?: string;\n\n /** If set, the week number is displayed at the top left corner @default true */\n withWeekNumber?: boolean;\n\n /** If set, displays a line indicating the current time @default true */\n withCurrentTimeIndicator?: boolean;\n\n /** If set, the time indicator displays the current time in the bubble @default true */\n withCurrentTimeBubble?: boolean;\n\n /** If set, displays all-day slots at the top of the view @default true */\n withAllDaySlots?: boolean;\n\n /** If set, the header is displayed @default true */\n withHeader?: boolean;\n\n /** Called when view level select button is clicked */\n onViewChange?: (view: ScheduleViewLevel) => void;\n\n /** Props passed to previous month control */\n previousControlProps?: React.ComponentProps<'button'> & DataAttributes;\n\n /** Props passed to next month control */\n nextControlProps?: React.ComponentProps<'button'> & DataAttributes;\n\n /** Props passed to today control */\n todayControlProps?: React.ComponentProps<'button'> & DataAttributes;\n\n /** Props passed to view level select */\n viewSelectProps?: Partial<ViewSelectProps> & DataAttributes;\n\n /** Format for week label @default 'MMM DD' */\n weekLabelFormat?: DateLabelFormat;\n\n /** List of events to display in the week view */\n events?: ScheduleEventData[];\n\n /** Height of 1hr slot @default 64px */\n slotHeight?: React.CSSProperties['height'];\n\n /** Height of all-day slot @default 48px */\n allDaySlotHeight?: React.CSSProperties['height'];\n\n /** Labels override */\n labels?: ScheduleLabelsOverride;\n\n /** If set to true, highlights business hours with white background @default false */\n highlightBusinessHours?: boolean;\n\n /** Business hours range in `HH:mm:ss` format @default ['09:00:00', '17:00:00'] */\n businessHours?: [string, string];\n\n /** Function to customize event body, `event` object is passed as first argument */\n renderEventBody?: RenderEventBody;\n\n /** Function to fully customize event rendering, receives all props that would be passed to the root element including children */\n renderEvent?: RenderEvent;\n\n /** If true, events can be dragged and dropped @default false */\n withEventsDragAndDrop?: boolean;\n\n /** Called when event is dropped at new time */\n onEventDrop?: (data: {\n eventId: string | number;\n newStart: DateTimeStringValue;\n newEnd: DateTimeStringValue;\n event: ScheduleEventData;\n }) => void;\n\n /** Function to determine if event can be dragged */\n canDragEvent?: (event: ScheduleEventData) => boolean;\n\n /** Called when any event drag starts */\n onEventDragStart?: (event: ScheduleEventData) => void;\n\n /** Called when any event drag ends */\n onEventDragEnd?: () => void;\n\n /** Called when time slot is clicked */\n onTimeSlotClick?: (data: {\n slotStart: DateTimeStringValue;\n slotEnd: DateTimeStringValue;\n nativeEvent: React.MouseEvent<HTMLButtonElement>;\n }) => void;\n\n /** Called when all-day slot is clicked */\n onAllDaySlotClick?: (day: DateStringValue, event: React.MouseEvent<HTMLButtonElement>) => void;\n\n /** Called when event is clicked */\n onEventClick?: (event: ScheduleEventData, e: React.MouseEvent<HTMLButtonElement>) => void;\n\n /** If set, enables drag-to-select time slot ranges @default false */\n withDragSlotSelect?: boolean;\n\n /** Called when a time slot range is selected by dragging */\n onSlotDragEnd?: (rangeStart: DateTimeStringValue, rangeEnd: DateTimeStringValue) => void;\n\n /** Interaction mode: 'default' allows all interactions, 'static' disables event interactions @default default */\n mode?: ScheduleMode;\n\n /** Time to scroll to on initial render, in `HH:mm:ss` format */\n startScrollTime?: string;\n\n /** Function to customize week label in the header */\n renderWeekLabel?: (params: {\n weekStart: DateStringValue;\n weekEnd: DateStringValue;\n }) => React.ReactNode;\n\n /** Called when an external item is dropped onto the schedule. Receives the `DataTransfer` object and the drop target datetime. */\n onExternalEventDrop?: (dataTransfer: DataTransfer, dropDateTime: DateTimeStringValue) => void;\n\n /** If true, events can be resized by dragging their edges @default false */\n withEventResize?: boolean;\n\n /** Called when event is resized */\n onEventResize?: (data: {\n eventId: string | number;\n newStart: DateTimeStringValue;\n newEnd: DateTimeStringValue;\n event: ScheduleEventData;\n }) => void;\n\n /** Function to determine if event can be resized */\n canResizeEvent?: (event: ScheduleEventData) => boolean;\n\n /** Max number of generated recurring instances per recurring series @default 2000 */\n recurrenceExpansionLimit?: number;\n\n /** Function to get additional props for each time slot. Receives slot start and end datetime strings. Returned props are spread onto the slot element. Event handlers returned by this function are composed with internal handlers (e.g. onClick) rather than overriding them. */\n getTimeSlotProps?: (data: {\n start: DateTimeStringValue;\n end: DateTimeStringValue;\n }) => Record<string, any> | undefined;\n}\n\nexport type WeekViewFactory = Factory<{\n props: WeekViewProps;\n ref: HTMLDivElement;\n stylesNames: WeekViewStylesNames;\n vars: WeekViewCssVariables;\n}>;\n\nconst defaultProps = {\n __staticSelector: 'WeekView',\n withWeekendDays: true,\n withCurrentTimeIndicator: true,\n startTime: '00:00:00',\n endTime: '23:59:59',\n slotLabelFormat: 'HH:mm',\n intervalMinutes: 60,\n weekdayFormat: 'ddd',\n withWeekNumber: true,\n withCurrentTimeBubble: true,\n withAllDaySlots: true,\n withHeader: true,\n weekLabelFormat: 'MMM DD',\n highlightBusinessHours: false,\n businessHours: ['09:00:00', '17:00:00'],\n withEventsDragAndDrop: false,\n withDragSlotSelect: false,\n withEventResize: false,\n mode: 'default',\n} satisfies Partial<WeekViewProps>;\n\nconst varsResolver = createVarsResolver<WeekViewFactory>(\n (_theme, { radius, allDaySlotHeight, slotHeight }) => ({\n weekView: {\n '--week-view-radius': radius !== undefined ? getRadius(radius) : undefined,\n '--week-view-all-day-slots-height': rem(allDaySlotHeight),\n '--week-view-slot-height': rem(slotHeight),\n },\n })\n);\n\nexport const WeekView = factory<WeekViewFactory>((_props) => {\n const props = useProps('WeekView', defaultProps, _props);\n const {\n classNames,\n className,\n style,\n styles,\n unstyled,\n attributes,\n vars,\n startTime,\n endTime,\n date,\n onDateChange,\n intervalMinutes,\n slotLabelFormat,\n withWeekendDays,\n weekendDays,\n firstDayOfWeek,\n weekdayFormat,\n radius,\n highlightToday,\n withCurrentTimeIndicator,\n scrollAreaProps,\n locale,\n withWeekNumber,\n withCurrentTimeBubble,\n withAllDaySlots,\n __staticSelector,\n withHeader,\n onViewChange,\n previousControlProps,\n nextControlProps,\n todayControlProps,\n viewSelectProps,\n weekLabelFormat,\n events,\n allDaySlotHeight,\n slotHeight,\n labels,\n highlightBusinessHours,\n businessHours,\n renderEventBody,\n renderEvent,\n withEventsDragAndDrop,\n onEventDrop,\n canDragEvent,\n onEventDragStart,\n onEventDragEnd,\n onTimeSlotClick,\n onAllDaySlotClick,\n onEventClick,\n withDragSlotSelect,\n onSlotDragEnd,\n mode,\n startScrollTime,\n renderWeekLabel,\n onExternalEventDrop,\n withEventResize,\n onEventResize,\n canResizeEvent,\n recurrenceExpansionLimit,\n getTimeSlotProps,\n ...others\n } = props;\n\n const getStyles = useStyles<WeekViewFactory>({\n name: __staticSelector,\n classes,\n props,\n className,\n style,\n classNames,\n styles,\n unstyled,\n vars,\n varsResolver,\n attributes,\n rootSelector: 'weekView',\n });\n\n const { resolvedClassNames, resolvedStyles } = useResolvedStylesApi<WeekViewFactory>({\n classNames,\n styles,\n props,\n });\n\n const stylesApiProps = {\n classNames: resolvedClassNames,\n styles: resolvedStyles,\n attributes,\n __staticSelector,\n radius,\n };\n\n const theme = useMantineTheme();\n const [scrolled, setScrolled] = useState(false);\n const ctx = useDatesContext();\n const slots = getDayTimeIntervals({ startTime, endTime, intervalMinutes });\n const viewportRef = useRef<HTMLDivElement>(null);\n\n useAutoScrollOnDrag({\n viewportRef,\n enabled: (withEventsDragAndDrop || !!onExternalEventDrop) && mode !== 'static',\n });\n\n type DropTargetSlot = { day: string; slotIndex: number };\n\n const handleExternalDrop = useCallback(\n (e: React.DragEvent, target: DropTargetSlot) => {\n if (!onExternalEventDrop) {\n return;\n }\n const slotDate = dayjs(target.day).format('YYYY-MM-DD');\n onExternalEventDrop(e.dataTransfer, `${slotDate} ${slots[target.slotIndex].startTime}`);\n },\n [onExternalEventDrop, slots]\n );\n\n const handleExternalAllDayDrop = useCallback(\n (e: React.DragEvent, day: string) => {\n if (!onExternalEventDrop) {\n return;\n }\n onExternalEventDrop(e.dataTransfer, `${dayjs(day).format('YYYY-MM-DD')} 00:00:00`);\n },\n [onExternalEventDrop]\n );\n\n const dragDrop = useDragDropHandlers<DropTargetSlot>({\n enabled: withEventsDragAndDrop,\n mode,\n onEventDrop,\n canDragEvent,\n onEventDragStart,\n onEventDragEnd,\n calculateDropTarget: (target: DropTargetSlot, draggedEvent: ScheduleEventData) => {\n const slotTime = slots[target.slotIndex].startTime;\n return calculateDropTime({\n draggedEvent,\n targetDate: target.day,\n targetSlotTime: slotTime,\n intervalMinutes,\n });\n },\n onExternalDrop: onExternalEventDrop ? handleExternalDrop : undefined,\n });\n\n const allDayDragDrop = useDragDropHandlers<string>({\n enabled: withEventsDragAndDrop,\n mode,\n onEventDrop,\n canDragEvent,\n onEventDragStart,\n onEventDragEnd,\n calculateDropTarget: (targetDay: string, draggedEvent: ScheduleEventData) => {\n const eventDuration = dayjs(draggedEvent.end).diff(dayjs(draggedEvent.start), 'millisecond');\n const newStart = dayjs(targetDay).startOf('day');\n return { start: newStart.toDate(), end: newStart.add(eventDuration, 'millisecond').toDate() };\n },\n onExternalDrop: onExternalEventDrop ? handleExternalAllDayDrop : undefined,\n });\n\n const slotDragSelect = useSlotDragSelect({\n enabled: withDragSlotSelect && mode !== 'static',\n onDragEnd: (startIndex, endIndex, group) => {\n if (!onSlotDragEnd) {\n return;\n }\n const slotDate = dayjs(group).format('YYYY-MM-DD');\n onSlotDragEnd(\n `${slotDate} ${slots[startIndex].startTime}`,\n `${slotDate} ${slots[endIndex].endTime}`\n );\n },\n });\n\n const eventResize = useEventResize({\n enabled: withEventResize,\n mode,\n startTime,\n endTime,\n intervalMinutes,\n onEventResize,\n canResizeEvent,\n });\n\n const withDragHandlers = (withEventsDragAndDrop || !!onExternalEventDrop) && mode !== 'static';\n\n const handleTimeSlotClick = (\n day: string,\n slotTime: string,\n e: React.MouseEvent<HTMLButtonElement>\n ) => {\n if (!onTimeSlotClick) {\n return;\n }\n\n const slotDate = dayjs(day).format('YYYY-MM-DD');\n const slotIndex = slots.findIndex((s) => s.startTime === slotTime);\n if (slotIndex === -1) {\n return;\n }\n\n const slot = slots[slotIndex];\n onTimeSlotClick({\n slotStart: `${slotDate} ${slot.startTime}`,\n slotEnd: `${slotDate} ${slot.endTime}`,\n nativeEvent: e,\n });\n };\n\n const weekdays = getWeekDays({\n week: date,\n withWeekendDays,\n weekendDays: ctx.getWeekendDays(weekendDays),\n firstDayOfWeek: ctx.getFirstDayOfWeek(firstDayOfWeek),\n });\n\n const expandedEvents = expandRecurringEvents({\n events,\n rangeStart: dayjs(weekdays[0]).startOf('day').toDate(),\n rangeEnd: dayjs(weekdays[weekdays.length - 1])\n .endOf('day')\n .toDate(),\n expansionLimit: recurrenceExpansionLimit,\n });\n\n const weekEvents = getWeekViewEvents({\n date,\n events: expandedEvents,\n startTime,\n endTime,\n firstDayOfWeek: ctx.getFirstDayOfWeek(firstDayOfWeek),\n weekendDays: ctx.getWeekendDays(weekendDays),\n withWeekendDays,\n });\n\n const timeValues = slots.map((interval) => {\n const intervalTime = dayjs(`${dayjs(date).format('YYYY-MM-DD')} ${interval.startTime}`);\n const label = formatDate({\n date: intervalTime,\n locale: ctx.getLocale(locale),\n format: slotLabelFormat,\n });\n\n return (\n <Box\n {...getStyles('weekViewSlotLabel')}\n key={interval.startTime}\n mod={{\n 'hour-start': interval.isHourStart,\n ...getBusinessHoursMod({\n time: interval.startTime,\n businessHours,\n highlightBusinessHours,\n }),\n }}\n >\n {label}\n </Box>\n );\n });\n\n const slotsRef: WeekViewControlsRef = useRef<HTMLButtonElement[][]>([]);\n const allDaySlotsRef = useRef<HTMLButtonElement[]>([]);\n const weekdaysRef = useRef<HTMLButtonElement[]>([]);\n const daySlotsContainersRef = useRef<(HTMLDivElement | null)[]>([]);\n const mergedViewportRef = useMergedRef(viewportRef, scrollAreaProps?.viewportRef);\n\n const firstSlotIndex = { dayIndex: 0, slotIndex: 0 };\n\n useIsomorphicEffect(() => {\n if (!startScrollTime || !viewportRef.current) {\n return;\n }\n\n const firstDaySlots = slotsRef.current[0];\n if (!firstDaySlots || firstDaySlots.length === 0) {\n return;\n }\n\n const targetIndex = slots.findIndex((s) => s.startTime >= startScrollTime);\n if (targetIndex < 0) {\n return;\n }\n\n const targetSlot = firstDaySlots[targetIndex];\n if (!targetSlot) {\n return;\n }\n\n const slotRect = targetSlot.getBoundingClientRect();\n const viewportRect = viewportRef.current.getBoundingClientRect();\n viewportRef.current.scrollTo({ left: 0, top: slotRect.top - viewportRect.top });\n }, []);\n\n const getSlotIndexFromDragPoint = useCallback((event: React.DragEvent, dayIndex: number) => {\n const daySlots = slotsRef.current[dayIndex] ?? [];\n const slotIndex = daySlots.findIndex((slotNode) => {\n if (!slotNode) {\n return false;\n }\n\n const rect = slotNode.getBoundingClientRect();\n return event.clientY >= rect.top && event.clientY <= rect.bottom;\n });\n\n if (slotIndex >= 0) {\n return slotIndex;\n }\n\n const firstSlot = daySlots[0];\n const lastSlot = daySlots[daySlots.length - 1];\n\n if (!firstSlot || !lastSlot) {\n return null;\n }\n\n const firstRect = firstSlot.getBoundingClientRect();\n const lastRect = lastSlot.getBoundingClientRect();\n\n if (event.clientY < firstRect.top) {\n return 0;\n }\n\n if (event.clientY > lastRect.bottom) {\n return daySlots.length - 1;\n }\n\n return null;\n }, []);\n\n const handleSlotKeyDown = (\n event: React.KeyboardEvent<HTMLButtonElement>,\n dayIndex: number,\n slotIndex: number\n ) => {\n handleWeekViewKeyDown({\n controlsRef: slotsRef,\n dayIndex,\n slotIndex,\n event,\n });\n };\n\n const handleAllDaySlotKeyDown = (\n event: React.KeyboardEvent<HTMLButtonElement>,\n dayIndex: number\n ) => {\n const direction = event.key;\n if (direction === 'ArrowRight' && dayIndex < weekdays.length - 1) {\n event.preventDefault();\n allDaySlotsRef.current[dayIndex + 1]?.focus();\n } else if (direction === 'ArrowLeft' && dayIndex > 0) {\n event.preventDefault();\n allDaySlotsRef.current[dayIndex - 1]?.focus();\n } else if (direction === 'ArrowDown') {\n event.preventDefault();\n slotsRef.current?.[dayIndex]?.[0]?.focus();\n }\n };\n\n const handleWeekdayKeyDown = (\n event: React.KeyboardEvent<HTMLButtonElement>,\n dayIndex: number\n ) => {\n const direction = event.key;\n if (direction === 'ArrowRight' && dayIndex < weekdays.length - 1) {\n event.preventDefault();\n weekdaysRef.current[dayIndex + 1]?.focus();\n } else if (direction === 'ArrowLeft' && dayIndex > 0) {\n event.preventDefault();\n weekdaysRef.current[dayIndex - 1]?.focus();\n }\n };\n\n const currentWeekdayIndex = withCurrentTimeIndicator\n ? weekdays.findIndex((day) => dayjs(day).isSame(dayjs(), 'date'))\n : -1;\n\n const weekdaysLabels = weekdays.map((day, dayIndex) => (\n <UnstyledButton\n {...getStyles('weekViewDayLabel')}\n key={day}\n ref={(node) => {\n weekdaysRef.current[dayIndex] = node!;\n }}\n aria-label={`${getLabel('weekday', labels)} ${dayjs(day).format('YYYY-MM-DD')}`}\n mod={{\n today: dayjs(day).isSame(dayjs(), 'day') && !!highlightToday,\n weekend: ctx.getWeekendDays(weekendDays).includes(dayjs(day).day() as DayOfWeek),\n static: mode === 'static',\n }}\n tabIndex={mode === 'static' ? -1 : dayIndex === 0 ? 0 : -1}\n onKeyDown={mode === 'static' ? undefined : (event) => handleWeekdayKeyDown(event, dayIndex)}\n onClick={\n mode === 'static'\n ? undefined\n : () => {\n onViewChange?.('day');\n onDateChange?.(toDateString(day));\n }\n }\n >\n <Box {...getStyles('weekViewDayWeekday')} key=\"weekday\">\n {formatDate({ locale: ctx.getLocale(locale), date: day, format: weekdayFormat })}\n </Box>\n <div {...getStyles('weekViewDayNumber')} key=\"date\">\n {dayjs(day).date()}\n </div>\n </UnstyledButton>\n ));\n\n const days = weekdays.map((day, dayIndex) => {\n const allBgEvents = weekEvents.backgroundEvents[day] || [];\n\n const backgroundEventNodes = allBgEvents\n .filter((event) => !event.position.allDay)\n .map((event) => {\n const colors = theme.variantColorResolver({\n color: event.color || theme.primaryColor,\n theme,\n variant: 'light',\n autoContrast: true,\n });\n\n const bgEventBody =\n typeof renderEventBody === 'function' ? renderEventBody(event) : event.title;\n\n const bgEventProps = {\n key: `bg-${event.id}`,\n ...getStyles('weekViewBackgroundEvent', {\n style: {\n top: `${event.position.top}%`,\n height: `${event.position.height}%`,\n width: '100%',\n },\n }),\n __vars: {\n '--bg-event-bg': colors.background,\n '--bg-event-color': colors.color,\n },\n children: bgEventBody,\n };\n\n if (typeof renderEvent === 'function') {\n return renderEvent(event, bgEventProps as any);\n }\n\n const { key: bgEventKey, ...restBgEventProps } = bgEventProps;\n return <Box key={bgEventKey} {...restBgEventProps} />;\n });\n\n const dayEvents = (weekEvents.regularEvents[day] || []).map((event) => {\n const eventIsAllDay = isAllDayEvent({ event, date: day });\n const isDraggable = !eventIsAllDay && dragDrop.isDraggableEvent(event);\n const isResizable = !eventIsAllDay && eventResize.isResizableEvent(event);\n const resizePosition = eventResize.getResizePosition(event.id);\n const eventTop = resizePosition ? resizePosition.top : event.position.top;\n const eventHeight = resizePosition ? resizePosition.height : event.position.height;\n\n return (\n <ScheduleEvent\n key={event.id}\n event={event}\n autoSize\n hanging={event.position.hanging}\n draggable={isDraggable}\n withResize={isResizable}\n isResizing={resizePosition !== null}\n onResizeStart={\n isResizable\n ? (edge, e) => {\n const container = daySlotsContainersRef.current[dayIndex];\n if (container) {\n eventResize.handleResizeStart({\n event,\n edge,\n container,\n originalTop: event.position.top,\n originalHeight: event.position.height,\n eventDate: dayjs(day).format('YYYY-MM-DD'),\n pointerEvent: e,\n });\n }\n }\n : undefined\n }\n renderEventBody={renderEventBody}\n renderEvent={renderEvent}\n radius={radius}\n mode={mode}\n onClick={onEventClick ? (e) => onEventClick(event, e) : undefined}\n style={{\n position: 'absolute',\n top: `calc(${eventTop}% + 1px)`,\n left: `${event.position.offset}%`,\n width: `${event.position.width}%`,\n height: `calc(${eventHeight}% - 1px)`,\n }}\n />\n );\n });\n\n return (\n <WeekViewDay\n key={day}\n day={day}\n dayIndex={dayIndex}\n slots={slots}\n getStyles={getStyles}\n weekendDays={weekendDays}\n highlightBusinessHours={highlightBusinessHours}\n businessHours={businessHours}\n labels={labels}\n withEventsDragAndDrop={withDragHandlers}\n mode={mode}\n slotsRef={slotsRef}\n firstSlotIndex={firstSlotIndex}\n onSlotKeyDown={handleSlotKeyDown}\n onSlotClick={handleTimeSlotClick}\n onFirstSlotArrowUp={\n withAllDaySlots\n ? (dayIdx) => {\n allDaySlotsRef.current[dayIdx]?.focus();\n }\n : undefined\n }\n onDaySlotsDragOver={(event, dayStr, dayIdx) => {\n const slotIndex = getSlotIndexFromDragPoint(event, dayIdx);\n if (slotIndex !== null) {\n dragDrop.handleDragOver(event, { day: dayStr, slotIndex });\n }\n }}\n onDaySlotsDragLeave={dragDrop.handleDragLeave}\n onDaySlotsDrop={(event, dayStr, dayIdx) => {\n const slotIndex = getSlotIndexFromDragPoint(event, dayIdx);\n if (slotIndex !== null) {\n dragDrop.handleDrop(event, { day: dayStr, slotIndex });\n }\n }}\n dropTargetSlotIndex={\n dragDrop.dropTarget?.day === day ? dragDrop.dropTarget.slotIndex : undefined\n }\n withDragSlotSelect={withDragSlotSelect}\n onSlotPointerDown={slotDragSelect.handleSlotPointerDown}\n isSlotDragSelected={slotDragSelect.isSlotSelected}\n daySlotsContainerRef={(node) => {\n daySlotsContainersRef.current[dayIndex] = node;\n }}\n getTimeSlotProps={getTimeSlotProps}\n >\n {backgroundEventNodes}\n {dayEvents}\n </WeekViewDay>\n );\n });\n\n const allDaySlots = weekdays.map((day, dayIndex) => (\n <UnstyledButton\n aria-label={`${getLabel('allDay', labels)} ${dayjs(day).format('YYYY-MM-DD')}`}\n key={day}\n ref={(node) => {\n allDaySlotsRef.current[dayIndex] = node!;\n }}\n tabIndex={dayIndex === 0 ? 0 : -1}\n onKeyDown={(event) => handleAllDaySlotKeyDown(event, dayIndex)}\n onClick={\n mode === 'static' || !onAllDaySlotClick\n ? undefined\n : (e) => onAllDaySlotClick(dayjs(day).format('YYYY-MM-DD'), e)\n }\n onDragOver={withDragHandlers ? (e) => allDayDragDrop.handleDragOver(e, day) : undefined}\n onDragLeave={withDragHandlers ? allDayDragDrop.handleDragLeave : undefined}\n onDrop={withDragHandlers ? (e) => allDayDragDrop.handleDrop(e, day) : undefined}\n {...getStyles('weekViewDaySlot')}\n mod={{ 'drop-target': allDayDragDrop.isDropTarget(day) }}\n />\n ));\n\n const allDayEventIds = useMemo(\n () => new Set(weekEvents.allDayEvents.map((e) => e.id)),\n [weekEvents.allDayEvents]\n );\n\n const allDayEvents = weekEvents.allDayEvents.map((event) => (\n <ScheduleEvent\n key={event.id}\n event={event}\n autoSize\n nowrap\n hanging={event.position.hanging}\n draggable={allDayDragDrop.isDraggableEvent(event)}\n renderEvent={renderEvent}\n mode={mode}\n onClick={onEventClick ? (e) => onEventClick(event, e) : undefined}\n style={{\n position: 'absolute',\n zIndex: 2,\n top: `calc(${event.position.row * 50}% + 1px)`,\n left: `calc(${event.position.offset}% + 1px)`,\n width: `calc(${event.position.width}% - 1px)`,\n height: 'calc(50% - 2px)',\n maxHeight: 'calc(50% - 2px)',\n }}\n />\n ));\n\n const allDayBackgroundEventNodes = weekdays.flatMap((day, dayIndex) => {\n const allDayBgEvents = (weekEvents.backgroundEvents[day] || []).filter(\n (event) => event.position.allDay\n );\n const dayWidth = 100 / weekdays.length;\n const dayOffset = dayIndex * dayWidth;\n\n return allDayBgEvents.map((event) => {\n const colors = theme.variantColorResolver({\n color: event.color || theme.primaryColor,\n theme,\n variant: 'light',\n autoContrast: true,\n });\n\n const bgEventBody =\n typeof renderEventBody === 'function' ? renderEventBody(event) : event.title;\n\n const bgEventProps = {\n key: `bg-allday-${event.id}-${day}`,\n ...getStyles('weekViewBackgroundEvent', {\n style: {\n top: 0,\n height: '100%',\n left: `${dayOffset}%`,\n width: `${dayWidth}%`,\n },\n }),\n __vars: {\n '--bg-event-bg': colors.background,\n '--bg-event-color': colors.color,\n },\n children: bgEventBody,\n };\n\n if (typeof renderEvent === 'function') {\n return renderEvent(event, bgEventProps as any);\n }\n\n const { key: bgEventKey, ...restBgEventProps } = bgEventProps;\n return <Box key={bgEventKey} {...restBgEventProps} />;\n });\n });\n\n // Extra rows show on hover = total rows - 2 visible rows (starts from 0, so -1)\n const extraRows = Math.max(...weekEvents.allDayEvents.map((event) => event.position.row), 1) - 1;\n\n const content = (\n <Box\n {...getStyles('weekView')}\n mod={{ static: mode === 'static', 'slot-dragging': slotDragSelect.isDragging }}\n {...others}\n >\n {withHeader && (\n <ScheduleHeaderBase\n view=\"week\"\n navigationHandlers={{\n previous: () => previousWeek(date, ctx.getFirstDayOfWeek(firstDayOfWeek)),\n next: () => nextWeek(date, ctx.getFirstDayOfWeek(firstDayOfWeek)),\n today: () => toDateString(dayjs()),\n }}\n control={{\n miw: 140,\n title: getWeekLabel({\n weekdays,\n locale: ctx.getLocale(locale),\n weekLabelFormat,\n renderWeekLabel,\n }),\n }}\n labels={labels}\n onDateChange={onDateChange}\n onViewChange={onViewChange}\n previousControlProps={previousControlProps}\n nextControlProps={nextControlProps}\n todayControlProps={todayControlProps}\n viewSelectProps={viewSelectProps}\n stylesApiProps={stylesApiProps}\n />\n )}\n\n <Box\n {...getStyles('weekViewRoot')}\n __vars={{\n '--indicator-offset-index':\n currentWeekdayIndex === -1 ? undefined : `${currentWeekdayIndex + 1}`,\n '--number-of-days': withWeekendDays\n ? '7'\n : `${7 - ctx.getWeekendDays(weekendDays).length}`,\n }}\n mod={{ 'with-weekends': withWeekendDays }}\n >\n <ScrollArea.Autosize\n scrollbarSize={4}\n {...scrollAreaProps}\n {...getStyles('weekViewScrollArea', {\n className: scrollAreaProps?.className,\n style: scrollAreaProps?.style,\n })}\n onScrollPositionChange={(position) => {\n scrollAreaProps?.onScrollPositionChange?.(position);\n setScrolled(position.y !== 0);\n }}\n viewportRef={mergedViewportRef}\n >\n <Box {...getStyles('weekViewHeader')} mod={{ scrolled }}>\n <div {...getStyles('weekViewCorner')} key=\"corner\">\n {withWeekNumber && (\n <>\n <div {...getStyles('weekViewWeekLabel')}>{getLabel('week', labels)}</div>\n <div {...getStyles('weekViewWeekNumber')}>{getWeekNumber(date)}</div>\n </>\n )}\n </div>\n\n {weekdaysLabels}\n </Box>\n\n {withAllDaySlots && (\n <div {...getStyles('weekViewAllDaySlots')}>\n <div {...getStyles('weekViewAllDaySlotsLabel')}>{getLabel('allDay', labels)}</div>\n <div {...getStyles('weekViewAllDaySlotsList')}>\n {allDayBackgroundEventNodes}\n <Box\n {...getStyles('weekViewAllDaySlotsEvents')}\n __vars={{ '--extra-rows': `${extraRows}` }}\n >\n {allDayEvents}\n </Box>\n {allDaySlots}\n </div>\n </div>\n )}\n\n <div {...getStyles('weekViewInner')}>\n <div {...getStyles('weekViewSlotLabels')}>{timeValues}</div>\n\n {withCurrentTimeIndicator && currentWeekdayIndex !== -1 && (\n <CurrentTimeIndicator\n startOffset=\"calc(100% - (100% / var(--number-of-days)) * (var(--number-of-days) - var(--indicator-offset-index) + 1) + ((var(--number-of-days) - var(--indicator-offset-index) + 1) * var(--indicator-labels-offset)))\"\n endOffset=\"calc((100% / var(--number-of-days)) * (var(--number-of-days) - var(--indicator-offset-index)) - (var(--number-of-days) - var(--indicator-offset-index)) * var(--indicator-labels-offset))\"\n timeBubbleStartOffset=\"calc(var(--week-view-slots-label-width) - var(--time-bubble-width))\"\n currentTimeFormat={slotLabelFormat}\n withTimeBubble={withCurrentTimeBubble}\n withThumb={withCurrentTimeBubble ? currentWeekdayIndex !== 0 : true}\n locale={locale}\n startTime={startTime}\n endTime={endTime}\n {...stylesApiProps}\n />\n )}\n {days}\n </div>\n </ScrollArea.Autosize>\n </Box>\n </Box>\n );\n\n const mergedDragContextValue = useMemo<DragContextValue>(\n () => ({\n isDragging:\n dragDrop.dragContextValue.isDragging || allDayDragDrop.dragContextValue.isDragging,\n draggedEventId:\n dragDrop.dragContextValue.draggedEventId ?? allDayDragDrop.dragContextValue.draggedEventId,\n draggedEvent:\n dragDrop.dragContextValue.draggedEvent ?? allDayDragDrop.dragContextValue.draggedEvent,\n dropTarget:\n dragDrop.dragContextValue.dropTarget ?? allDayDragDrop.dragContextValue.dropTarget,\n onDragStart: (event: ScheduleEventData) => {\n if (allDayEventIds.has(event.id)) {\n allDayDragDrop.handleDragStart(event);\n } else {\n dragDrop.handleDragStart(event);\n }\n },\n onDragEnd: () => {\n dragDrop.handleDragEnd();\n allDayDragDrop.handleDragEnd();\n },\n setDropTarget: dragDrop.dragContextValue.setDropTarget,\n }),\n [dragDrop.dragContextValue, allDayDragDrop.dragContextValue, allDayEventIds]\n );\n\n if (withEventsDragAndDrop) {\n return <DragContext.Provider value={mergedDragContextValue}>{content}</DragContext.Provider>;\n }\n\n return content;\n});\n\nWeekView.displayName = '@mantine/schedule/WeekView';\nWeekView.classes = classes;\nWeekView.varsResolver = varsResolver;\n\nexport namespace WeekView {\n export type Props = WeekViewProps;\n export type Factory = WeekViewFactory;\n export type StylesNames = WeekViewStylesNames;\n export type CssVariables = WeekViewCssVariables;\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"YearView.cjs","names":["getYearViewEvents","expandRecurringEvents","getMonthDays","isSameMonth","getMonthsByQuarter","YearViewMonth","Box","ScheduleHeaderBase","toDateString","classes"],"sources":["../../../src/components/YearView/YearView.tsx"],"sourcesContent":["import dayjs from 'dayjs';\nimport { useRef } from 'react';\nimport {\n Box,\n BoxProps,\n createVarsResolver,\n DataAttributes,\n ElementProps,\n factory,\n Factory,\n getRadius,\n MantineRadius,\n StylesApiProps,\n useProps,\n useResolvedStylesApi,\n useStyles,\n} from '@mantine/core';\nimport { useDatesContext } from '@mantine/dates';\nimport { DateStringValue, ScheduleEventData, ScheduleMode, ScheduleViewLevel } from '../../types';\nimport {\n expandRecurringEvents,\n getMonthDays,\n getMonthsByQuarter,\n isSameMonth,\n toDateString,\n} from '../../utils';\nimport { MonthYearSelectProps } from '../ScheduleHeader/MonthYearSelect/MonthYearSelect';\nimport { CombinedScheduleHeaderStylesNames } from '../ScheduleHeader/ScheduleHeader';\nimport { ScheduleHeaderBase } from '../ScheduleHeader/ScheduleHeaderBase';\nimport { ViewSelectProps } from '../ScheduleHeader/ViewSelect/ViewSelect';\nimport { getYearViewEvents } from './get-year-view-events/get-year-view-events';\nimport { handleYearViewKeyDown, YearViewControlsRef } from './handle-year-view-key-down';\nimport { YearViewMonth, YearViewMonthSettings } from './YearViewMonth';\nimport classes from './YearView.module.css';\n\nexport type YearViewStylesNames =\n | 'yearView'\n | 'yearViewMonths'\n | 'yearViewMonth'\n | 'yearViewWeekday'\n | 'yearViewDay'\n | 'yearViewWeek'\n | 'yearViewWeekNumber'\n | 'yearViewWeekdays'\n | 'yearViewWeekdaysCorner'\n | 'yearViewMonthCaption'\n | 'yearViewDayIndicators'\n | 'yearViewDayIndicator'\n | CombinedScheduleHeaderStylesNames;\n\nexport type YearViewCssVariables = {\n yearView: '--year-view-radius';\n};\n\nexport interface YearViewProps\n extends YearViewMonthSettings, BoxProps, StylesApiProps<YearViewFactory>, ElementProps<'div'> {\n __staticSelector?: string;\n\n /** Date to display, Date object or date string in `YYYY-MM-DD 00:00:00` format */\n date: Date | string;\n\n /** Called with the new date value when a date is selected */\n onDateChange?: (value: DateStringValue) => void;\n\n /** Events to display, must be a stable reference */\n events?: ScheduleEventData[];\n\n /** Key of `theme.radius` or any valid CSS value to set `border-radius` @default theme.defaultRadius */\n radius?: MantineRadius;\n\n /** If set, highlights the current day @default true */\n highlightToday?: boolean;\n\n /** If set, the header is displayed @default true */\n withHeader?: boolean;\n\n /** Props passed down to `MonthYearSelect` component in the header */\n monthYearSelectProps?: Partial<MonthYearSelectProps>;\n\n /** Called when view level select button is clicked */\n onViewChange?: (view: ScheduleViewLevel) => void;\n\n /** Props passed to previous month control */\n previousControlProps?: React.ComponentProps<'button'> & DataAttributes;\n\n /** Props passed to next month control */\n nextControlProps?: React.ComponentProps<'button'> & DataAttributes;\n\n /** Props passed to today control */\n todayControlProps?: React.ComponentProps<'button'> & DataAttributes;\n\n /** Props passed to view level select */\n viewSelectProps?: Partial<ViewSelectProps> & DataAttributes;\n\n /** Interaction mode: 'default' allows all interactions, 'static' disables event interactions @default default */\n mode?: ScheduleMode;\n\n /** Max number of generated recurring instances per recurring series @default 2000 */\n recurrenceExpansionLimit?: number;\n}\n\nexport type YearViewFactory = Factory<{\n props: YearViewProps;\n ref: HTMLDivElement;\n stylesNames: YearViewStylesNames;\n vars: YearViewCssVariables;\n}>;\n\nconst defaultProps = {\n __staticSelector: 'YearView',\n monthLabelFormat: 'MMMM',\n withWeekDays: true,\n highlightToday: true,\n withHeader: true,\n withOutsideDays: true,\n mode: 'default',\n} satisfies Partial<YearViewProps>;\n\nconst varsResolver = createVarsResolver<YearViewFactory>((_theme, { radius }) => ({\n yearView: { '--year-view-radius': radius !== undefined ? getRadius(radius) : undefined },\n}));\n\nexport const YearView = factory<YearViewFactory>((_props) => {\n const props = useProps('YearView', defaultProps, _props);\n const {\n // YearView props\n date,\n onDateChange,\n events,\n\n // YearViewMonth settings\n monthLabelFormat,\n withWeekNumbers,\n withWeekDays,\n locale,\n firstDayOfWeek,\n weekdayFormat,\n weekendDays,\n onMonthClick,\n onDayClick,\n onWeekNumberClick,\n getDayProps,\n getWeekNumberProps,\n highlightToday,\n labels,\n withOutsideDays,\n\n // ScheduleHeader props\n withHeader,\n monthYearSelectProps,\n onViewChange,\n previousControlProps,\n nextControlProps,\n todayControlProps,\n viewSelectProps,\n\n // System props\n __staticSelector,\n classNames,\n className,\n style,\n styles,\n unstyled,\n vars,\n attributes,\n radius,\n mode,\n recurrenceExpansionLimit,\n ...others\n } = props;\n\n const ctx = useDatesContext();\n\n const getStyles = useStyles<YearViewFactory>({\n name: __staticSelector,\n classes,\n props,\n className,\n style,\n classNames,\n styles,\n unstyled,\n vars,\n varsResolver,\n attributes,\n rootSelector: 'yearView',\n });\n\n const { resolvedClassNames, resolvedStyles } = useResolvedStylesApi<YearViewFactory>({\n classNames,\n styles,\n props,\n });\n\n const stylesApiProps = {\n classNames: resolvedClassNames,\n styles: resolvedStyles,\n attributes,\n __staticSelector,\n radius,\n };\n\n const expandedEvents = expandRecurringEvents({\n events,\n rangeStart: dayjs(date).startOf('year').toDate(),\n rangeEnd: dayjs(date).endOf('year').toDate(),\n expansionLimit: recurrenceExpansionLimit,\n });\n\n const groupedEvents = getYearViewEvents({ date, events: expandedEvents });\n\n // [monthIndex][weekIndex][dayIndex]\n const daysRef = useRef<HTMLButtonElement[][][]>([]) as YearViewControlsRef;\n\n const getFirstDayIndex = (month: string): { weekIndex: number; dayIndex: number } | undefined => {\n const weeks = getMonthDays({\n month: dayjs(month).format('YYYY-MM-DD'),\n firstDayOfWeek: ctx.getFirstDayOfWeek(firstDayOfWeek),\n consistentWeeks: true,\n });\n\n for (let weekIndex = 0; weekIndex < weeks.length; weekIndex++) {\n const week = weeks[weekIndex];\n for (let dayIndex = 0; dayIndex < week.length; dayIndex++) {\n const dayDate = week[dayIndex];\n if (isSameMonth(dayDate, month)) {\n return { weekIndex, dayIndex };\n }\n }\n }\n\n return undefined;\n };\n\n let globalMonthIndex = 0;\n const months = getMonthsByQuarter(dayjs(date).format('YYYY-MM-DD'))\n .flat()\n .map((month) => {\n const currentMonthIndex = globalMonthIndex;\n globalMonthIndex++;\n\n return (\n <YearViewMonth\n key={month}\n month={month}\n getStyles={getStyles}\n monthLabelFormat={monthLabelFormat}\n withWeekNumbers={withWeekNumbers}\n withWeekDays={withWeekDays}\n locale={locale}\n firstDayOfWeek={firstDayOfWeek}\n weekdayFormat={\n weekdayFormat ||\n ((date) => dayjs(date).locale(ctx.getLocale(locale)).format('dd').slice(0, 1))\n }\n weekendDays={weekendDays}\n getDayProps={getDayProps}\n getWeekNumberProps={getWeekNumberProps}\n onMonthClick={onMonthClick}\n onDayClick={onDayClick}\n onWeekNumberClick={onWeekNumberClick}\n highlightToday={highlightToday}\n groupedEvents={groupedEvents}\n mode={mode}\n withOutsideDays={withOutsideDays}\n firstDayIndex={getFirstDayIndex(month)}\n __getDayRef={(weekIndex, dayIndex, node) => {\n if (!Array.isArray(daysRef.current[currentMonthIndex])) {\n daysRef.current[currentMonthIndex] = [];\n }\n if (!Array.isArray(daysRef.current[currentMonthIndex][weekIndex])) {\n daysRef.current[currentMonthIndex][weekIndex] = [];\n }\n daysRef.current[currentMonthIndex][weekIndex][dayIndex] = node;\n }}\n __onDayKeyDown={(event, payload) => {\n handleYearViewKeyDown({\n controlsRef: daysRef,\n monthIndex: currentMonthIndex,\n weekIndex: payload.weekIndex,\n dayIndex: payload.dayIndex,\n event,\n });\n }}\n />\n );\n });\n\n return (\n <Box {...getStyles('yearView')} mod={{ static: mode === 'static' }} {...others}>\n {withHeader && (\n <ScheduleHeaderBase\n view=\"year\"\n navigationHandlers={{\n previous: () => toDateString(dayjs(date).subtract(1, 'year').startOf('year')),\n next: () => toDateString(dayjs(date).add(1, 'year').startOf('year')),\n today: () => toDateString(dayjs()),\n }}\n control={{\n monthYearSelect: {\n locale,\n withMonths: false,\n yearValue: dayjs(date).get('year'),\n monthValue: dayjs(date).get('month'),\n onYearChange: (year) =>\n onDateChange?.(toDateString(dayjs(date).set('year', year).startOf('year'))),\n ...monthYearSelectProps,\n },\n }}\n labels={labels}\n onDateChange={onDateChange}\n onViewChange={onViewChange}\n previousControlProps={previousControlProps}\n nextControlProps={nextControlProps}\n todayControlProps={todayControlProps}\n viewSelectProps={viewSelectProps}\n stylesApiProps={stylesApiProps}\n />\n )}\n\n <div {...getStyles('yearViewMonths')}>{months}</div>\n </Box>\n );\n});\n\nYearView.displayName = '@mantine/schedule/YearView';\nYearView.classes = classes;\nYearView.varsResolver = varsResolver;\n"],"mappings":"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"}
1
+ {"version":3,"file":"YearView.cjs","names":["getYearViewEvents","expandRecurringEvents","getMonthDays","isSameMonth","getMonthsByQuarter","YearViewMonth","Box","ScheduleHeaderBase","toDateString","classes"],"sources":["../../../src/components/YearView/YearView.tsx"],"sourcesContent":["import dayjs from 'dayjs';\nimport { useRef } from 'react';\nimport {\n Box,\n BoxProps,\n createVarsResolver,\n DataAttributes,\n ElementProps,\n factory,\n Factory,\n getRadius,\n MantineRadius,\n StylesApiProps,\n useProps,\n useResolvedStylesApi,\n useStyles,\n} from '@mantine/core';\nimport { useDatesContext } from '@mantine/dates';\nimport { DateStringValue, ScheduleEventData, ScheduleMode, ScheduleViewLevel } from '../../types';\nimport {\n expandRecurringEvents,\n getMonthDays,\n getMonthsByQuarter,\n isSameMonth,\n toDateString,\n} from '../../utils';\nimport { MonthYearSelectProps } from '../ScheduleHeader/MonthYearSelect/MonthYearSelect';\nimport { CombinedScheduleHeaderStylesNames } from '../ScheduleHeader/ScheduleHeader';\nimport { ScheduleHeaderBase } from '../ScheduleHeader/ScheduleHeaderBase';\nimport { ViewSelectProps } from '../ScheduleHeader/ViewSelect/ViewSelect';\nimport { getYearViewEvents } from './get-year-view-events/get-year-view-events';\nimport { handleYearViewKeyDown, YearViewControlsRef } from './handle-year-view-key-down';\nimport { YearViewMonth, YearViewMonthSettings } from './YearViewMonth';\nimport classes from './YearView.module.css';\n\nexport type YearViewStylesNames =\n | 'yearView'\n | 'yearViewMonths'\n | 'yearViewMonth'\n | 'yearViewWeekday'\n | 'yearViewDay'\n | 'yearViewWeek'\n | 'yearViewWeekNumber'\n | 'yearViewWeekdays'\n | 'yearViewWeekdaysCorner'\n | 'yearViewMonthCaption'\n | 'yearViewDayIndicators'\n | 'yearViewDayIndicator'\n | CombinedScheduleHeaderStylesNames;\n\nexport type YearViewCssVariables = {\n yearView: '--year-view-radius';\n};\n\nexport interface YearViewProps\n extends YearViewMonthSettings, BoxProps, StylesApiProps<YearViewFactory>, ElementProps<'div'> {\n __staticSelector?: string;\n\n /** Date to display, Date object or date string in `YYYY-MM-DD 00:00:00` format */\n date: Date | string;\n\n /** Called with the new date value when a date is selected */\n onDateChange?: (value: DateStringValue) => void;\n\n /** Events to display, must be a stable reference */\n events?: ScheduleEventData[];\n\n /** Key of `theme.radius` or any valid CSS value to set `border-radius` @default theme.defaultRadius */\n radius?: MantineRadius;\n\n /** If set, highlights the current day @default true */\n highlightToday?: boolean;\n\n /** If set, the header is displayed @default true */\n withHeader?: boolean;\n\n /** Props passed down to `MonthYearSelect` component in the header */\n monthYearSelectProps?: Partial<MonthYearSelectProps>;\n\n /** Called when view level select button is clicked */\n onViewChange?: (view: ScheduleViewLevel) => void;\n\n /** Props passed to previous month control */\n previousControlProps?: React.ComponentProps<'button'> & DataAttributes;\n\n /** Props passed to next month control */\n nextControlProps?: React.ComponentProps<'button'> & DataAttributes;\n\n /** Props passed to today control */\n todayControlProps?: React.ComponentProps<'button'> & DataAttributes;\n\n /** Props passed to view level select */\n viewSelectProps?: Partial<ViewSelectProps> & DataAttributes;\n\n /** Interaction mode: 'default' allows all interactions, 'static' disables event interactions @default default */\n mode?: ScheduleMode;\n\n /** Max number of generated recurring instances per recurring series @default 2000 */\n recurrenceExpansionLimit?: number;\n}\n\nexport type YearViewFactory = Factory<{\n props: YearViewProps;\n ref: HTMLDivElement;\n stylesNames: YearViewStylesNames;\n vars: YearViewCssVariables;\n}>;\n\nconst defaultProps = {\n __staticSelector: 'YearView',\n monthLabelFormat: 'MMMM',\n withWeekDays: true,\n highlightToday: true,\n withHeader: true,\n withOutsideDays: true,\n mode: 'default',\n} satisfies Partial<YearViewProps>;\n\nconst varsResolver = createVarsResolver<YearViewFactory>((_theme, { radius }) => ({\n yearView: { '--year-view-radius': radius !== undefined ? getRadius(radius) : undefined },\n}));\n\nexport const YearView = factory<YearViewFactory>((_props) => {\n const props = useProps('YearView', defaultProps, _props);\n const {\n // YearView props\n date,\n onDateChange,\n events,\n\n // YearViewMonth settings\n monthLabelFormat,\n withWeekNumbers,\n withWeekDays,\n locale,\n firstDayOfWeek,\n weekdayFormat,\n weekendDays,\n onMonthClick,\n onDayClick,\n onWeekNumberClick,\n getDayProps,\n getWeekNumberProps,\n highlightToday,\n labels,\n withOutsideDays,\n\n // ScheduleHeader props\n withHeader,\n monthYearSelectProps,\n onViewChange,\n previousControlProps,\n nextControlProps,\n todayControlProps,\n viewSelectProps,\n\n // System props\n __staticSelector,\n classNames,\n className,\n style,\n styles,\n unstyled,\n vars,\n attributes,\n radius,\n mode,\n recurrenceExpansionLimit,\n ...others\n } = props;\n\n const ctx = useDatesContext();\n\n const getStyles = useStyles<YearViewFactory>({\n name: __staticSelector,\n classes,\n props,\n className,\n style,\n classNames,\n styles,\n unstyled,\n vars,\n varsResolver,\n attributes,\n rootSelector: 'yearView',\n });\n\n const { resolvedClassNames, resolvedStyles } = useResolvedStylesApi<YearViewFactory>({\n classNames,\n styles,\n props,\n });\n\n const stylesApiProps = {\n classNames: resolvedClassNames,\n styles: resolvedStyles,\n attributes,\n __staticSelector,\n radius,\n };\n\n const expandedEvents = expandRecurringEvents({\n events,\n rangeStart: dayjs(date).startOf('year').toDate(),\n rangeEnd: dayjs(date).endOf('year').toDate(),\n expansionLimit: recurrenceExpansionLimit,\n });\n\n const groupedEvents = getYearViewEvents({ date, events: expandedEvents });\n\n // [monthIndex][weekIndex][dayIndex]\n const daysRef = useRef<HTMLButtonElement[][][]>([]) as YearViewControlsRef;\n\n const getFirstDayIndex = (month: string): { weekIndex: number; dayIndex: number } | undefined => {\n const weeks = getMonthDays({\n month: dayjs(month).format('YYYY-MM-DD'),\n firstDayOfWeek: ctx.getFirstDayOfWeek(firstDayOfWeek),\n consistentWeeks: true,\n });\n\n for (let weekIndex = 0; weekIndex < weeks.length; weekIndex++) {\n const week = weeks[weekIndex];\n for (let dayIndex = 0; dayIndex < week.length; dayIndex++) {\n const dayDate = week[dayIndex];\n if (isSameMonth(dayDate, month)) {\n return { weekIndex, dayIndex };\n }\n }\n }\n\n return undefined;\n };\n\n let globalMonthIndex = 0;\n const months = getMonthsByQuarter(dayjs(date).format('YYYY-MM-DD'))\n .flat()\n .map((month) => {\n const currentMonthIndex = globalMonthIndex;\n globalMonthIndex++;\n\n return (\n <YearViewMonth\n key={month}\n month={month}\n getStyles={getStyles}\n monthLabelFormat={monthLabelFormat}\n withWeekNumbers={withWeekNumbers}\n withWeekDays={withWeekDays}\n locale={locale}\n firstDayOfWeek={firstDayOfWeek}\n weekdayFormat={\n weekdayFormat ||\n ((date) => dayjs(date).locale(ctx.getLocale(locale)).format('dd').slice(0, 1))\n }\n weekendDays={weekendDays}\n getDayProps={getDayProps}\n getWeekNumberProps={getWeekNumberProps}\n onMonthClick={onMonthClick}\n onDayClick={onDayClick}\n onWeekNumberClick={onWeekNumberClick}\n highlightToday={highlightToday}\n groupedEvents={groupedEvents}\n mode={mode}\n withOutsideDays={withOutsideDays}\n firstDayIndex={getFirstDayIndex(month)}\n __getDayRef={(weekIndex, dayIndex, node) => {\n if (!Array.isArray(daysRef.current[currentMonthIndex])) {\n daysRef.current[currentMonthIndex] = [];\n }\n if (!Array.isArray(daysRef.current[currentMonthIndex][weekIndex])) {\n daysRef.current[currentMonthIndex][weekIndex] = [];\n }\n daysRef.current[currentMonthIndex][weekIndex][dayIndex] = node;\n }}\n __onDayKeyDown={(event, payload) => {\n handleYearViewKeyDown({\n controlsRef: daysRef,\n monthIndex: currentMonthIndex,\n weekIndex: payload.weekIndex,\n dayIndex: payload.dayIndex,\n event,\n });\n }}\n />\n );\n });\n\n return (\n <Box {...getStyles('yearView')} mod={{ static: mode === 'static' }} {...others}>\n {withHeader && (\n <ScheduleHeaderBase\n view=\"year\"\n navigationHandlers={{\n previous: () => toDateString(dayjs(date).subtract(1, 'year').startOf('year')),\n next: () => toDateString(dayjs(date).add(1, 'year').startOf('year')),\n today: () => toDateString(dayjs()),\n }}\n control={{\n monthYearSelect: {\n locale,\n withMonths: false,\n yearValue: dayjs(date).get('year'),\n monthValue: dayjs(date).get('month'),\n onYearChange: (year) =>\n onDateChange?.(toDateString(dayjs(date).set('year', year).startOf('year'))),\n ...monthYearSelectProps,\n },\n }}\n labels={labels}\n onDateChange={onDateChange}\n onViewChange={onViewChange}\n previousControlProps={previousControlProps}\n nextControlProps={nextControlProps}\n todayControlProps={todayControlProps}\n viewSelectProps={viewSelectProps}\n stylesApiProps={stylesApiProps}\n />\n )}\n\n <div {...getStyles('yearViewMonths')}>{months}</div>\n </Box>\n );\n});\n\nYearView.displayName = '@mantine/schedule/YearView';\nYearView.classes = classes;\nYearView.varsResolver = varsResolver;\n\nexport namespace YearView {\n export type Props = YearViewProps;\n export type Factory = YearViewFactory;\n export type StylesNames = YearViewStylesNames;\n export type CssVariables = YearViewCssVariables;\n}\n"],"mappings":"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"}
@@ -7,14 +7,14 @@ const MAX_SCROLL_SPEED = 8;
7
7
  function useAutoScrollOnDrag({ viewportRef, enabled }) {
8
8
  const rafId = (0, react.useRef)(null);
9
9
  const scrollDirection = (0, react.useRef)(0);
10
- const stopScroll = (0, react.useCallback)(() => {
10
+ const stopScroll = (0, react.useEffectEvent)(() => {
11
11
  if (rafId.current !== null) {
12
12
  cancelAnimationFrame(rafId.current);
13
13
  rafId.current = null;
14
14
  }
15
15
  scrollDirection.current = 0;
16
- }, []);
17
- const startScroll = (0, react.useCallback)(() => {
16
+ });
17
+ const startScroll = (0, react.useEffectEvent)(() => {
18
18
  if (rafId.current !== null) return;
19
19
  const tick = () => {
20
20
  const viewport = viewportRef.current;
@@ -26,7 +26,7 @@ function useAutoScrollOnDrag({ viewportRef, enabled }) {
26
26
  rafId.current = requestAnimationFrame(tick);
27
27
  };
28
28
  rafId.current = requestAnimationFrame(tick);
29
- }, [viewportRef]);
29
+ });
30
30
  (0, react.useEffect)(() => {
31
31
  if (!enabled) return;
32
32
  const viewport = viewportRef.current;
@@ -59,12 +59,7 @@ function useAutoScrollOnDrag({ viewportRef, enabled }) {
59
59
  viewport.removeEventListener("dragend", handleDragEnd);
60
60
  viewport.removeEventListener("drop", handleDragEnd);
61
61
  };
62
- }, [
63
- enabled,
64
- viewportRef,
65
- startScroll,
66
- stopScroll
67
- ]);
62
+ }, [enabled, viewportRef]);
68
63
  }
69
64
  //#endregion
70
65
  exports.useAutoScrollOnDrag = useAutoScrollOnDrag;
@@ -1 +1 @@
1
- {"version":3,"file":"use-auto-scroll-on-drag.cjs","names":[],"sources":["../../src/hooks/use-auto-scroll-on-drag.ts"],"sourcesContent":["import { useCallback, useEffect, useRef } from 'react';\n\nconst EDGE_THRESHOLD = 50;\nconst MAX_SCROLL_SPEED = 8;\n\ninterface UseAutoScrollOnDragOptions {\n viewportRef: React.RefObject<HTMLDivElement | null>;\n enabled: boolean;\n}\n\nexport function useAutoScrollOnDrag({ viewportRef, enabled }: UseAutoScrollOnDragOptions) {\n const rafId = useRef<number | null>(null);\n const scrollDirection = useRef<number>(0);\n\n const stopScroll = useCallback(() => {\n if (rafId.current !== null) {\n cancelAnimationFrame(rafId.current);\n rafId.current = null;\n }\n scrollDirection.current = 0;\n }, []);\n\n const startScroll = useCallback(() => {\n if (rafId.current !== null) {\n return;\n }\n\n const tick = () => {\n const viewport = viewportRef.current;\n if (!viewport || scrollDirection.current === 0) {\n rafId.current = null;\n return;\n }\n\n viewport.scrollTop += scrollDirection.current;\n rafId.current = requestAnimationFrame(tick);\n };\n\n rafId.current = requestAnimationFrame(tick);\n }, [viewportRef]);\n\n useEffect(() => {\n if (!enabled) {\n return undefined;\n }\n\n const viewport = viewportRef.current;\n if (!viewport) {\n return undefined;\n }\n\n const handleDragOver = (event: DragEvent) => {\n const rect = viewport.getBoundingClientRect();\n const distanceFromTop = event.clientY - rect.top;\n const distanceFromBottom = rect.bottom - event.clientY;\n\n if (distanceFromTop < EDGE_THRESHOLD) {\n const proximity = 1 - distanceFromTop / EDGE_THRESHOLD;\n scrollDirection.current = -Math.ceil(proximity * MAX_SCROLL_SPEED);\n startScroll();\n } else if (distanceFromBottom < EDGE_THRESHOLD) {\n const proximity = 1 - distanceFromBottom / EDGE_THRESHOLD;\n scrollDirection.current = Math.ceil(proximity * MAX_SCROLL_SPEED);\n startScroll();\n } else {\n stopScroll();\n }\n };\n\n const handleDragEnd = () => {\n stopScroll();\n };\n\n viewport.addEventListener('dragover', handleDragOver);\n viewport.addEventListener('dragleave', handleDragEnd);\n viewport.addEventListener('dragend', handleDragEnd);\n viewport.addEventListener('drop', handleDragEnd);\n\n return () => {\n stopScroll();\n viewport.removeEventListener('dragover', handleDragOver);\n viewport.removeEventListener('dragleave', handleDragEnd);\n viewport.removeEventListener('dragend', handleDragEnd);\n viewport.removeEventListener('drop', handleDragEnd);\n };\n }, [enabled, viewportRef, startScroll, stopScroll]);\n}\n"],"mappings":";;;;AAEA,MAAM,iBAAiB;AACvB,MAAM,mBAAmB;AAOzB,SAAgB,oBAAoB,EAAE,aAAa,WAAuC;CACxF,MAAM,SAAA,GAAA,MAAA,QAA8B,KAAK;CACzC,MAAM,mBAAA,GAAA,MAAA,QAAiC,EAAE;CAEzC,MAAM,cAAA,GAAA,MAAA,mBAA+B;AACnC,MAAI,MAAM,YAAY,MAAM;AAC1B,wBAAqB,MAAM,QAAQ;AACnC,SAAM,UAAU;;AAElB,kBAAgB,UAAU;IACzB,EAAE,CAAC;CAEN,MAAM,eAAA,GAAA,MAAA,mBAAgC;AACpC,MAAI,MAAM,YAAY,KACpB;EAGF,MAAM,aAAa;GACjB,MAAM,WAAW,YAAY;AAC7B,OAAI,CAAC,YAAY,gBAAgB,YAAY,GAAG;AAC9C,UAAM,UAAU;AAChB;;AAGF,YAAS,aAAa,gBAAgB;AACtC,SAAM,UAAU,sBAAsB,KAAK;;AAG7C,QAAM,UAAU,sBAAsB,KAAK;IAC1C,CAAC,YAAY,CAAC;AAEjB,EAAA,GAAA,MAAA,iBAAgB;AACd,MAAI,CAAC,QACH;EAGF,MAAM,WAAW,YAAY;AAC7B,MAAI,CAAC,SACH;EAGF,MAAM,kBAAkB,UAAqB;GAC3C,MAAM,OAAO,SAAS,uBAAuB;GAC7C,MAAM,kBAAkB,MAAM,UAAU,KAAK;GAC7C,MAAM,qBAAqB,KAAK,SAAS,MAAM;AAE/C,OAAI,kBAAkB,gBAAgB;IACpC,MAAM,YAAY,IAAI,kBAAkB;AACxC,oBAAgB,UAAU,CAAC,KAAK,KAAK,YAAY,iBAAiB;AAClE,iBAAa;cACJ,qBAAqB,gBAAgB;IAC9C,MAAM,YAAY,IAAI,qBAAqB;AAC3C,oBAAgB,UAAU,KAAK,KAAK,YAAY,iBAAiB;AACjE,iBAAa;SAEb,aAAY;;EAIhB,MAAM,sBAAsB;AAC1B,eAAY;;AAGd,WAAS,iBAAiB,YAAY,eAAe;AACrD,WAAS,iBAAiB,aAAa,cAAc;AACrD,WAAS,iBAAiB,WAAW,cAAc;AACnD,WAAS,iBAAiB,QAAQ,cAAc;AAEhD,eAAa;AACX,eAAY;AACZ,YAAS,oBAAoB,YAAY,eAAe;AACxD,YAAS,oBAAoB,aAAa,cAAc;AACxD,YAAS,oBAAoB,WAAW,cAAc;AACtD,YAAS,oBAAoB,QAAQ,cAAc;;IAEpD;EAAC;EAAS;EAAa;EAAa;EAAW,CAAC"}
1
+ {"version":3,"file":"use-auto-scroll-on-drag.cjs","names":[],"sources":["../../src/hooks/use-auto-scroll-on-drag.ts"],"sourcesContent":["import { useEffect, useEffectEvent, useRef } from 'react';\n\nconst EDGE_THRESHOLD = 50;\nconst MAX_SCROLL_SPEED = 8;\n\ninterface UseAutoScrollOnDragOptions {\n viewportRef: React.RefObject<HTMLDivElement | null>;\n enabled: boolean;\n}\n\nexport function useAutoScrollOnDrag({ viewportRef, enabled }: UseAutoScrollOnDragOptions) {\n const rafId = useRef<number | null>(null);\n const scrollDirection = useRef<number>(0);\n\n const stopScroll = useEffectEvent(() => {\n if (rafId.current !== null) {\n cancelAnimationFrame(rafId.current);\n rafId.current = null;\n }\n scrollDirection.current = 0;\n });\n\n const startScroll = useEffectEvent(() => {\n if (rafId.current !== null) {\n return;\n }\n\n const tick = () => {\n const viewport = viewportRef.current;\n if (!viewport || scrollDirection.current === 0) {\n rafId.current = null;\n return;\n }\n\n viewport.scrollTop += scrollDirection.current;\n rafId.current = requestAnimationFrame(tick);\n };\n\n rafId.current = requestAnimationFrame(tick);\n });\n\n useEffect(() => {\n if (!enabled) {\n return undefined;\n }\n\n const viewport = viewportRef.current;\n if (!viewport) {\n return undefined;\n }\n\n const handleDragOver = (event: DragEvent) => {\n const rect = viewport.getBoundingClientRect();\n const distanceFromTop = event.clientY - rect.top;\n const distanceFromBottom = rect.bottom - event.clientY;\n\n if (distanceFromTop < EDGE_THRESHOLD) {\n const proximity = 1 - distanceFromTop / EDGE_THRESHOLD;\n scrollDirection.current = -Math.ceil(proximity * MAX_SCROLL_SPEED);\n startScroll();\n } else if (distanceFromBottom < EDGE_THRESHOLD) {\n const proximity = 1 - distanceFromBottom / EDGE_THRESHOLD;\n scrollDirection.current = Math.ceil(proximity * MAX_SCROLL_SPEED);\n startScroll();\n } else {\n stopScroll();\n }\n };\n\n const handleDragEnd = () => {\n stopScroll();\n };\n\n viewport.addEventListener('dragover', handleDragOver);\n viewport.addEventListener('dragleave', handleDragEnd);\n viewport.addEventListener('dragend', handleDragEnd);\n viewport.addEventListener('drop', handleDragEnd);\n\n return () => {\n stopScroll();\n viewport.removeEventListener('dragover', handleDragOver);\n viewport.removeEventListener('dragleave', handleDragEnd);\n viewport.removeEventListener('dragend', handleDragEnd);\n viewport.removeEventListener('drop', handleDragEnd);\n };\n }, [enabled, viewportRef]);\n}\n"],"mappings":";;;;AAEA,MAAM,iBAAiB;AACvB,MAAM,mBAAmB;AAOzB,SAAgB,oBAAoB,EAAE,aAAa,WAAuC;CACxF,MAAM,SAAA,GAAA,MAAA,QAA8B,KAAK;CACzC,MAAM,mBAAA,GAAA,MAAA,QAAiC,EAAE;CAEzC,MAAM,cAAA,GAAA,MAAA,sBAAkC;AACtC,MAAI,MAAM,YAAY,MAAM;AAC1B,wBAAqB,MAAM,QAAQ;AACnC,SAAM,UAAU;;AAElB,kBAAgB,UAAU;GAC1B;CAEF,MAAM,eAAA,GAAA,MAAA,sBAAmC;AACvC,MAAI,MAAM,YAAY,KACpB;EAGF,MAAM,aAAa;GACjB,MAAM,WAAW,YAAY;AAC7B,OAAI,CAAC,YAAY,gBAAgB,YAAY,GAAG;AAC9C,UAAM,UAAU;AAChB;;AAGF,YAAS,aAAa,gBAAgB;AACtC,SAAM,UAAU,sBAAsB,KAAK;;AAG7C,QAAM,UAAU,sBAAsB,KAAK;GAC3C;AAEF,EAAA,GAAA,MAAA,iBAAgB;AACd,MAAI,CAAC,QACH;EAGF,MAAM,WAAW,YAAY;AAC7B,MAAI,CAAC,SACH;EAGF,MAAM,kBAAkB,UAAqB;GAC3C,MAAM,OAAO,SAAS,uBAAuB;GAC7C,MAAM,kBAAkB,MAAM,UAAU,KAAK;GAC7C,MAAM,qBAAqB,KAAK,SAAS,MAAM;AAE/C,OAAI,kBAAkB,gBAAgB;IACpC,MAAM,YAAY,IAAI,kBAAkB;AACxC,oBAAgB,UAAU,CAAC,KAAK,KAAK,YAAY,iBAAiB;AAClE,iBAAa;cACJ,qBAAqB,gBAAgB;IAC9C,MAAM,YAAY,IAAI,qBAAqB;AAC3C,oBAAgB,UAAU,KAAK,KAAK,YAAY,iBAAiB;AACjE,iBAAa;SAEb,aAAY;;EAIhB,MAAM,sBAAsB;AAC1B,eAAY;;AAGd,WAAS,iBAAiB,YAAY,eAAe;AACrD,WAAS,iBAAiB,aAAa,cAAc;AACrD,WAAS,iBAAiB,WAAW,cAAc;AACnD,WAAS,iBAAiB,QAAQ,cAAc;AAEhD,eAAa;AACX,eAAY;AACZ,YAAS,oBAAoB,YAAY,eAAe;AACxD,YAAS,oBAAoB,aAAa,cAAc;AACxD,YAAS,oBAAoB,WAAW,cAAc;AACtD,YAAS,oBAAoB,QAAQ,cAAc;;IAEpD,CAAC,SAAS,YAAY,CAAC"}
@@ -13,22 +13,25 @@ let react = require("react");
13
13
  */
14
14
  function useDragDropHandlers(options) {
15
15
  const { enabled, mode, onEventDrop, canDragEvent, onEventDragStart, onEventDragEnd, calculateDropTarget, onExternalDrop } = options;
16
+ const stableOnEventDrop = (0, react.useEffectEvent)(onEventDrop || (() => {}));
17
+ const stableOnEventDragStart = (0, react.useEffectEvent)(onEventDragStart || (() => {}));
18
+ const stableOnEventDragEnd = (0, react.useEffectEvent)(onEventDragEnd || (() => {}));
19
+ const stableOnExternalDrop = (0, react.useEffectEvent)(onExternalDrop || (() => {}));
16
20
  const dragState = require_use_drag_state.useDragState();
17
21
  const [dropTarget, setDropTarget] = (0, react.useState)(null);
18
22
  const handleDragEnd = (0, react.useCallback)(() => {
19
23
  dragState.endDrag();
20
24
  setDropTarget(null);
21
- onEventDragEnd?.();
22
- }, [dragState, onEventDragEnd]);
25
+ stableOnEventDragEnd();
26
+ }, [dragState]);
23
27
  const handleDragStart = (0, react.useCallback)((event) => {
24
28
  if (!enabled || mode === "static") return;
25
29
  dragState.startDrag(event);
26
- onEventDragStart?.(event);
30
+ stableOnEventDragStart(event);
27
31
  }, [
28
32
  enabled,
29
33
  mode,
30
- dragState,
31
- onEventDragStart
34
+ dragState
32
35
  ]);
33
36
  const handleDragOver = (0, react.useCallback)((event, target) => {
34
37
  if (mode === "static") return;
@@ -57,7 +60,7 @@ function useDragDropHandlers(options) {
57
60
  const isInternalDrag = dragState.state.isDragging && event.dataTransfer.types.includes("application/json");
58
61
  if (isInternalDrag && enabled && dragState.state.draggedEvent && onEventDrop) {
59
62
  const { start, end } = calculateDropTarget(target, dragState.state.draggedEvent);
60
- onEventDrop({
63
+ stableOnEventDrop({
61
64
  eventId: dragState.state.draggedEventId,
62
65
  newStart: (0, dayjs.default)(start).format("YYYY-MM-DD HH:mm:ss"),
63
66
  newEnd: (0, dayjs.default)(end).format("YYYY-MM-DD HH:mm:ss"),
@@ -68,7 +71,7 @@ function useDragDropHandlers(options) {
68
71
  }
69
72
  if (!isInternalDrag && onExternalDrop) {
70
73
  if (dragState.state.isDragging) handleDragEnd();
71
- onExternalDrop(event, target);
74
+ stableOnExternalDrop(event, target);
72
75
  setDropTarget(null);
73
76
  return;
74
77
  }
@@ -79,7 +82,9 @@ function useDragDropHandlers(options) {
79
82
  onEventDrop,
80
83
  onExternalDrop,
81
84
  calculateDropTarget,
82
- handleDragEnd
85
+ handleDragEnd,
86
+ stableOnEventDrop,
87
+ stableOnExternalDrop
83
88
  ]);
84
89
  const isDraggableEvent = (0, react.useCallback)((event) => {
85
90
  return enabled && mode !== "static" && event.display !== "background" && (canDragEvent ? canDragEvent(event) : true);
@@ -1 +1 @@
1
- {"version":3,"file":"use-drag-drop-handlers.cjs","names":["useDragState"],"sources":["../../src/hooks/use-drag-drop-handlers.ts"],"sourcesContent":["import dayjs from 'dayjs';\nimport { useCallback, useState } from 'react';\nimport { DragContextValue } from '../components/DragContext/DragContext';\nimport { DateTimeStringValue, ScheduleEventData, ScheduleMode } from '../types';\nimport { useDragState } from './use-drag-state';\n\nexport interface UseDragDropHandlersOptions<T = any> {\n /** Whether drag and drop is enabled */\n enabled: boolean;\n\n /** Schedule interaction mode */\n mode: ScheduleMode;\n\n /** Called when event is dropped at new location */\n onEventDrop?: (data: {\n eventId: string | number;\n newStart: DateTimeStringValue;\n newEnd: DateTimeStringValue;\n event: ScheduleEventData;\n }) => void;\n\n /** Function to determine if event can be dragged */\n canDragEvent?: (event: ScheduleEventData) => boolean;\n\n /** Called when any event drag starts */\n onEventDragStart?: (event: ScheduleEventData) => void;\n\n /** Called when any event drag ends */\n onEventDragEnd?: () => void;\n\n /**\n * Function to calculate drop target dates from drop location.\n * Receives the target location and the dragged event.\n */\n calculateDropTarget: (target: T, draggedEvent: ScheduleEventData) => { start: Date; end: Date };\n\n /** Called when an external item is dropped onto the schedule */\n onExternalDrop?: (e: React.DragEvent, target: T) => void;\n}\n\nexport interface DragDropHandlers<T = any> {\n /** Context value for DragContext.Provider */\n dragContextValue: DragContextValue;\n\n /** Current drop target */\n dropTarget: T | null;\n\n /** Handle drag start event */\n handleDragStart: (event: ScheduleEventData) => void;\n\n /** Handle drag end event */\n handleDragEnd: () => void;\n\n /** Handle drag over event */\n handleDragOver: (e: React.DragEvent, target: T) => void;\n\n /** Handle drag leave event */\n handleDragLeave: () => void;\n\n /** Handle drop event */\n handleDrop: (e: React.DragEvent, target: T) => void;\n\n /** Check if event is draggable */\n isDraggableEvent: (event: ScheduleEventData) => boolean;\n\n /** Check if target is the current drop target */\n isDropTarget: (target: T) => boolean;\n}\n\n/**\n * Hook that provides unified drag-drop handlers for Schedule views.\n * Handles drag state management and event drops across Day, Week, and Month views.\n *\n * @template T - Type of the drop target (e.g., slot index, day string, etc.)\n */\nexport function useDragDropHandlers<T = any>(\n options: UseDragDropHandlersOptions<T>\n): DragDropHandlers<T> {\n const {\n enabled,\n mode,\n onEventDrop,\n canDragEvent,\n onEventDragStart,\n onEventDragEnd,\n calculateDropTarget,\n onExternalDrop,\n } = options;\n\n const dragState = useDragState();\n const [dropTarget, setDropTarget] = useState<T | null>(null);\n\n const handleDragEnd = useCallback(() => {\n dragState.endDrag();\n setDropTarget(null);\n onEventDragEnd?.();\n }, [dragState, onEventDragEnd]);\n\n const handleDragStart = useCallback(\n (event: ScheduleEventData) => {\n if (!enabled || mode === 'static') {\n return;\n }\n dragState.startDrag(event);\n onEventDragStart?.(event);\n },\n [enabled, mode, dragState, onEventDragStart]\n );\n\n const handleDragOver = useCallback(\n (event: React.DragEvent, target: T) => {\n if (mode === 'static') {\n return;\n }\n\n let isInternalDrag = dragState.state.isDragging;\n\n if (isInternalDrag && !event.dataTransfer.types.includes('application/json')) {\n handleDragEnd();\n isInternalDrag = false;\n }\n\n if (isInternalDrag && !enabled) {\n return;\n }\n\n if (!isInternalDrag && !onExternalDrop) {\n return;\n }\n\n event.preventDefault();\n event.dataTransfer.dropEffect = isInternalDrag ? 'move' : 'copy';\n setDropTarget(target);\n },\n [enabled, mode, dragState.state.isDragging, onExternalDrop, handleDragEnd]\n );\n\n const handleDragLeave = useCallback(() => {\n setDropTarget(null);\n }, []);\n\n const handleDrop = useCallback(\n (event: React.DragEvent, target: T) => {\n event.preventDefault();\n\n const isInternalDrag =\n dragState.state.isDragging && event.dataTransfer.types.includes('application/json');\n\n if (isInternalDrag && enabled && dragState.state.draggedEvent && onEventDrop) {\n const { start, end } = calculateDropTarget(target, dragState.state.draggedEvent);\n onEventDrop({\n eventId: dragState.state.draggedEventId!,\n newStart: dayjs(start).format('YYYY-MM-DD HH:mm:ss'),\n newEnd: dayjs(end).format('YYYY-MM-DD HH:mm:ss'),\n event: dragState.state.draggedEvent,\n });\n handleDragEnd();\n return;\n }\n\n if (!isInternalDrag && onExternalDrop) {\n if (dragState.state.isDragging) {\n handleDragEnd();\n }\n onExternalDrop(event, target);\n setDropTarget(null);\n return;\n }\n\n setDropTarget(null);\n },\n [enabled, dragState.state, onEventDrop, onExternalDrop, calculateDropTarget, handleDragEnd]\n );\n\n const isDraggableEvent = useCallback(\n (event: ScheduleEventData) => {\n return (\n enabled &&\n mode !== 'static' &&\n event.display !== 'background' &&\n (canDragEvent ? canDragEvent(event) : true)\n );\n },\n [enabled, mode, canDragEvent]\n );\n\n const isDropTarget = useCallback(\n (target: T) => {\n // Handle complex target comparison (for WeekView with day + slotIndex)\n if (dropTarget && typeof dropTarget === 'object' && typeof target === 'object') {\n return JSON.stringify(dropTarget) === JSON.stringify(target);\n }\n return dropTarget === target;\n },\n [dropTarget]\n );\n\n const dragContextValue: DragContextValue = {\n isDragging: dragState.state.isDragging,\n draggedEventId: dragState.state.draggedEventId,\n draggedEvent: dragState.state.draggedEvent,\n dropTarget: dragState.state.dropTarget,\n onDragStart: handleDragStart,\n onDragEnd: handleDragEnd,\n setDropTarget: dragState.setDropTarget,\n };\n\n return {\n dragContextValue,\n dropTarget,\n handleDragStart,\n handleDragEnd,\n handleDragOver,\n handleDragLeave,\n handleDrop,\n isDraggableEvent,\n isDropTarget,\n };\n}\n"],"mappings":";;;;;;;;;;;;;AA2EA,SAAgB,oBACd,SACqB;CACrB,MAAM,EACJ,SACA,MACA,aACA,cACA,kBACA,gBACA,qBACA,mBACE;CAEJ,MAAM,YAAYA,uBAAAA,cAAc;CAChC,MAAM,CAAC,YAAY,kBAAA,GAAA,MAAA,UAAoC,KAAK;CAE5D,MAAM,iBAAA,GAAA,MAAA,mBAAkC;AACtC,YAAU,SAAS;AACnB,gBAAc,KAAK;AACnB,oBAAkB;IACjB,CAAC,WAAW,eAAe,CAAC;CAE/B,MAAM,mBAAA,GAAA,MAAA,cACH,UAA6B;AAC5B,MAAI,CAAC,WAAW,SAAS,SACvB;AAEF,YAAU,UAAU,MAAM;AAC1B,qBAAmB,MAAM;IAE3B;EAAC;EAAS;EAAM;EAAW;EAAiB,CAC7C;CAED,MAAM,kBAAA,GAAA,MAAA,cACH,OAAwB,WAAc;AACrC,MAAI,SAAS,SACX;EAGF,IAAI,iBAAiB,UAAU,MAAM;AAErC,MAAI,kBAAkB,CAAC,MAAM,aAAa,MAAM,SAAS,mBAAmB,EAAE;AAC5E,kBAAe;AACf,oBAAiB;;AAGnB,MAAI,kBAAkB,CAAC,QACrB;AAGF,MAAI,CAAC,kBAAkB,CAAC,eACtB;AAGF,QAAM,gBAAgB;AACtB,QAAM,aAAa,aAAa,iBAAiB,SAAS;AAC1D,gBAAc,OAAO;IAEvB;EAAC;EAAS;EAAM,UAAU,MAAM;EAAY;EAAgB;EAAc,CAC3E;CAED,MAAM,mBAAA,GAAA,MAAA,mBAAoC;AACxC,gBAAc,KAAK;IAClB,EAAE,CAAC;CAEN,MAAM,cAAA,GAAA,MAAA,cACH,OAAwB,WAAc;AACrC,QAAM,gBAAgB;EAEtB,MAAM,iBACJ,UAAU,MAAM,cAAc,MAAM,aAAa,MAAM,SAAS,mBAAmB;AAErF,MAAI,kBAAkB,WAAW,UAAU,MAAM,gBAAgB,aAAa;GAC5E,MAAM,EAAE,OAAO,QAAQ,oBAAoB,QAAQ,UAAU,MAAM,aAAa;AAChF,eAAY;IACV,SAAS,UAAU,MAAM;IACzB,WAAA,GAAA,MAAA,SAAgB,MAAM,CAAC,OAAO,sBAAsB;IACpD,SAAA,GAAA,MAAA,SAAc,IAAI,CAAC,OAAO,sBAAsB;IAChD,OAAO,UAAU,MAAM;IACxB,CAAC;AACF,kBAAe;AACf;;AAGF,MAAI,CAAC,kBAAkB,gBAAgB;AACrC,OAAI,UAAU,MAAM,WAClB,gBAAe;AAEjB,kBAAe,OAAO,OAAO;AAC7B,iBAAc,KAAK;AACnB;;AAGF,gBAAc,KAAK;IAErB;EAAC;EAAS,UAAU;EAAO;EAAa;EAAgB;EAAqB;EAAc,CAC5F;CAED,MAAM,oBAAA,GAAA,MAAA,cACH,UAA6B;AAC5B,SACE,WACA,SAAS,YACT,MAAM,YAAY,iBACjB,eAAe,aAAa,MAAM,GAAG;IAG1C;EAAC;EAAS;EAAM;EAAa,CAC9B;CAED,MAAM,gBAAA,GAAA,MAAA,cACH,WAAc;AAEb,MAAI,cAAc,OAAO,eAAe,YAAY,OAAO,WAAW,SACpE,QAAO,KAAK,UAAU,WAAW,KAAK,KAAK,UAAU,OAAO;AAE9D,SAAO,eAAe;IAExB,CAAC,WAAW,CACb;AAYD,QAAO;EACL,kBAXyC;GACzC,YAAY,UAAU,MAAM;GAC5B,gBAAgB,UAAU,MAAM;GAChC,cAAc,UAAU,MAAM;GAC9B,YAAY,UAAU,MAAM;GAC5B,aAAa;GACb,WAAW;GACX,eAAe,UAAU;GAC1B;EAIC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD"}
1
+ {"version":3,"file":"use-drag-drop-handlers.cjs","names":["useDragState"],"sources":["../../src/hooks/use-drag-drop-handlers.ts"],"sourcesContent":["import dayjs from 'dayjs';\nimport { useCallback, useEffectEvent, useState } from 'react';\nimport { DragContextValue } from '../components/DragContext/DragContext';\nimport { DateTimeStringValue, ScheduleEventData, ScheduleMode } from '../types';\nimport { useDragState } from './use-drag-state';\n\nexport interface UseDragDropHandlersOptions<T = any> {\n /** Whether drag and drop is enabled */\n enabled: boolean;\n\n /** Schedule interaction mode */\n mode: ScheduleMode;\n\n /** Called when event is dropped at new location */\n onEventDrop?: (data: {\n eventId: string | number;\n newStart: DateTimeStringValue;\n newEnd: DateTimeStringValue;\n event: ScheduleEventData;\n }) => void;\n\n /** Function to determine if event can be dragged */\n canDragEvent?: (event: ScheduleEventData) => boolean;\n\n /** Called when any event drag starts */\n onEventDragStart?: (event: ScheduleEventData) => void;\n\n /** Called when any event drag ends */\n onEventDragEnd?: () => void;\n\n /**\n * Function to calculate drop target dates from drop location.\n * Receives the target location and the dragged event.\n */\n calculateDropTarget: (target: T, draggedEvent: ScheduleEventData) => { start: Date; end: Date };\n\n /** Called when an external item is dropped onto the schedule */\n onExternalDrop?: (e: React.DragEvent, target: T) => void;\n}\n\nexport interface DragDropHandlers<T = any> {\n /** Context value for DragContext.Provider */\n dragContextValue: DragContextValue;\n\n /** Current drop target */\n dropTarget: T | null;\n\n /** Handle drag start event */\n handleDragStart: (event: ScheduleEventData) => void;\n\n /** Handle drag end event */\n handleDragEnd: () => void;\n\n /** Handle drag over event */\n handleDragOver: (e: React.DragEvent, target: T) => void;\n\n /** Handle drag leave event */\n handleDragLeave: () => void;\n\n /** Handle drop event */\n handleDrop: (e: React.DragEvent, target: T) => void;\n\n /** Check if event is draggable */\n isDraggableEvent: (event: ScheduleEventData) => boolean;\n\n /** Check if target is the current drop target */\n isDropTarget: (target: T) => boolean;\n}\n\n/**\n * Hook that provides unified drag-drop handlers for Schedule views.\n * Handles drag state management and event drops across Day, Week, and Month views.\n *\n * @template T - Type of the drop target (e.g., slot index, day string, etc.)\n */\nexport function useDragDropHandlers<T = any>(\n options: UseDragDropHandlersOptions<T>\n): DragDropHandlers<T> {\n const {\n enabled,\n mode,\n onEventDrop,\n canDragEvent,\n onEventDragStart,\n onEventDragEnd,\n calculateDropTarget,\n onExternalDrop,\n } = options;\n\n const stableOnEventDrop = useEffectEvent(onEventDrop || (() => {}));\n const stableOnEventDragStart = useEffectEvent(onEventDragStart || (() => {}));\n const stableOnEventDragEnd = useEffectEvent(onEventDragEnd || (() => {}));\n const stableOnExternalDrop = useEffectEvent(onExternalDrop || (() => {}));\n\n const dragState = useDragState();\n const [dropTarget, setDropTarget] = useState<T | null>(null);\n\n const handleDragEnd = useCallback(() => {\n dragState.endDrag();\n setDropTarget(null);\n stableOnEventDragEnd();\n }, [dragState]);\n\n const handleDragStart = useCallback(\n (event: ScheduleEventData) => {\n if (!enabled || mode === 'static') {\n return;\n }\n dragState.startDrag(event);\n stableOnEventDragStart(event);\n },\n [enabled, mode, dragState]\n );\n\n const handleDragOver = useCallback(\n (event: React.DragEvent, target: T) => {\n if (mode === 'static') {\n return;\n }\n\n let isInternalDrag = dragState.state.isDragging;\n\n if (isInternalDrag && !event.dataTransfer.types.includes('application/json')) {\n handleDragEnd();\n isInternalDrag = false;\n }\n\n if (isInternalDrag && !enabled) {\n return;\n }\n\n if (!isInternalDrag && !onExternalDrop) {\n return;\n }\n\n event.preventDefault();\n event.dataTransfer.dropEffect = isInternalDrag ? 'move' : 'copy';\n setDropTarget(target);\n },\n [enabled, mode, dragState.state.isDragging, onExternalDrop, handleDragEnd]\n );\n\n const handleDragLeave = useCallback(() => {\n setDropTarget(null);\n }, []);\n\n const handleDrop = useCallback(\n (event: React.DragEvent, target: T) => {\n event.preventDefault();\n\n const isInternalDrag =\n dragState.state.isDragging && event.dataTransfer.types.includes('application/json');\n\n if (isInternalDrag && enabled && dragState.state.draggedEvent && onEventDrop) {\n const { start, end } = calculateDropTarget(target, dragState.state.draggedEvent);\n stableOnEventDrop({\n eventId: dragState.state.draggedEventId!,\n newStart: dayjs(start).format('YYYY-MM-DD HH:mm:ss'),\n newEnd: dayjs(end).format('YYYY-MM-DD HH:mm:ss'),\n event: dragState.state.draggedEvent,\n });\n handleDragEnd();\n return;\n }\n\n if (!isInternalDrag && onExternalDrop) {\n if (dragState.state.isDragging) {\n handleDragEnd();\n }\n stableOnExternalDrop(event, target);\n setDropTarget(null);\n return;\n }\n\n setDropTarget(null);\n },\n [\n enabled,\n dragState.state,\n onEventDrop,\n onExternalDrop,\n calculateDropTarget,\n handleDragEnd,\n stableOnEventDrop,\n stableOnExternalDrop,\n ]\n );\n\n const isDraggableEvent = useCallback(\n (event: ScheduleEventData) => {\n return (\n enabled &&\n mode !== 'static' &&\n event.display !== 'background' &&\n (canDragEvent ? canDragEvent(event) : true)\n );\n },\n [enabled, mode, canDragEvent]\n );\n\n const isDropTarget = useCallback(\n (target: T) => {\n // Handle complex target comparison (for WeekView with day + slotIndex)\n if (dropTarget && typeof dropTarget === 'object' && typeof target === 'object') {\n return JSON.stringify(dropTarget) === JSON.stringify(target);\n }\n return dropTarget === target;\n },\n [dropTarget]\n );\n\n const dragContextValue: DragContextValue = {\n isDragging: dragState.state.isDragging,\n draggedEventId: dragState.state.draggedEventId,\n draggedEvent: dragState.state.draggedEvent,\n dropTarget: dragState.state.dropTarget,\n onDragStart: handleDragStart,\n onDragEnd: handleDragEnd,\n setDropTarget: dragState.setDropTarget,\n };\n\n return {\n dragContextValue,\n dropTarget,\n handleDragStart,\n handleDragEnd,\n handleDragOver,\n handleDragLeave,\n handleDrop,\n isDraggableEvent,\n isDropTarget,\n };\n}\n"],"mappings":"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"}
@@ -8,8 +8,7 @@ let react = require("react");
8
8
  function useEventResize({ enabled = false, mode = "default", startTime, endTime, intervalMinutes, onEventResize, canResizeEvent }) {
9
9
  const [resizeState, setResizeState] = (0, react.useState)(null);
10
10
  const resizeRef = (0, react.useRef)(null);
11
- const onEventResizeRef = (0, react.useRef)(onEventResize);
12
- onEventResizeRef.current = onEventResize;
11
+ const stableOnEventResize = (0, react.useEffectEvent)(onEventResize || (() => {}));
13
12
  const parsedStartTime = require_parse_time_string.parseTimeString(startTime);
14
13
  const parsedEndTime = require_parse_time_string.parseTimeString(endTime);
15
14
  const startMinutes = parsedStartTime.hours * 60 + parsedStartTime.minutes;
@@ -80,7 +79,7 @@ function useEventResize({ enabled = false, mode = "default", startTime, endTime,
80
79
  };
81
80
  const handlePointerUp = () => {
82
81
  const state = resizeRef.current;
83
- if (state && onEventResizeRef.current) {
82
+ if (state) {
84
83
  if (state.currentTop !== state.originalTop || state.currentHeight !== state.originalHeight) {
85
84
  let newStart;
86
85
  let newEnd;
@@ -91,7 +90,7 @@ function useEventResize({ enabled = false, mode = "default", startTime, endTime,
91
90
  newStart = state.originalStart;
92
91
  newEnd = percentToDateTime(state.currentTop + state.currentHeight, state.eventDate);
93
92
  }
94
- onEventResizeRef.current({
93
+ stableOnEventResize({
95
94
  eventId: state.eventId,
96
95
  newStart,
97
96
  newEnd,
@@ -1 +1 @@
1
- {"version":3,"file":"use-event-resize.cjs","names":["parseTimeString"],"sources":["../../src/hooks/use-event-resize.ts"],"sourcesContent":["import dayjs from 'dayjs';\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport { DateTimeStringValue, ScheduleEventData, ScheduleMode } from '../types';\nimport { parseTimeString } from '../utils/parse-time-string/parse-time-string';\n\ntype ResizeEdge = 'top' | 'bottom';\n\ninterface ResizeState {\n eventId: string | number;\n event: ScheduleEventData;\n edge: ResizeEdge;\n container: HTMLElement;\n originalTop: number;\n originalHeight: number;\n currentTop: number;\n currentHeight: number;\n eventDate: string;\n originalStart: DateTimeStringValue;\n originalEnd: DateTimeStringValue;\n}\n\nexport interface UseEventResizeInput {\n enabled?: boolean;\n mode?: ScheduleMode;\n startTime: string;\n endTime: string;\n intervalMinutes: number;\n onEventResize?: (data: {\n eventId: string | number;\n newStart: DateTimeStringValue;\n newEnd: DateTimeStringValue;\n event: ScheduleEventData;\n }) => void;\n canResizeEvent?: (event: ScheduleEventData) => boolean;\n}\n\nexport function useEventResize({\n enabled = false,\n mode = 'default',\n startTime,\n endTime,\n intervalMinutes,\n onEventResize,\n canResizeEvent,\n}: UseEventResizeInput) {\n const [resizeState, setResizeState] = useState<ResizeState | null>(null);\n const resizeRef = useRef<ResizeState | null>(null);\n const onEventResizeRef = useRef(onEventResize);\n onEventResizeRef.current = onEventResize;\n\n const parsedStartTime = parseTimeString(startTime);\n const parsedEndTime = parseTimeString(endTime);\n const startMinutes = parsedStartTime.hours * 60 + parsedStartTime.minutes;\n const endMinutes = parsedEndTime.hours * 60 + parsedEndTime.minutes;\n const totalMinutes = endMinutes - startMinutes;\n const minHeightPercent = (intervalMinutes / totalMinutes) * 100;\n\n const clampAndSnap = useCallback(\n (minutes: number): number => {\n const snapped = Math.round(minutes / intervalMinutes) * intervalMinutes;\n return Math.max(0, Math.min(totalMinutes, snapped));\n },\n [totalMinutes, intervalMinutes]\n );\n\n const percentToDateTime = useCallback(\n (percent: number, eventDate: string): DateTimeStringValue => {\n const minutes = (percent / 100) * totalMinutes;\n const snappedMinutes = clampAndSnap(minutes);\n const totalMins = startMinutes + snappedMinutes;\n const hours = Math.floor(totalMins / 60);\n const mins = totalMins % 60;\n return `${eventDate} ${String(hours).padStart(2, '0')}:${String(mins).padStart(2, '0')}:00`;\n },\n [totalMinutes, startMinutes, clampAndSnap]\n );\n\n const snapPercent = useCallback(\n (percent: number): number => {\n const minutes = (percent / 100) * totalMinutes;\n const snappedMinutes = clampAndSnap(minutes);\n return (snappedMinutes / totalMinutes) * 100;\n },\n [totalMinutes, clampAndSnap]\n );\n\n const handleResizeStart = useCallback(\n ({\n event,\n edge,\n container,\n originalTop,\n originalHeight,\n eventDate,\n pointerEvent,\n }: {\n event: ScheduleEventData;\n edge: ResizeEdge;\n container: HTMLElement;\n originalTop: number;\n originalHeight: number;\n eventDate: string;\n pointerEvent: React.PointerEvent;\n }) => {\n if (!enabled || mode === 'static') {\n return;\n }\n\n pointerEvent.preventDefault();\n pointerEvent.stopPropagation();\n\n const state: ResizeState = {\n eventId: event.id,\n event,\n edge,\n container,\n originalTop,\n originalHeight,\n currentTop: originalTop,\n currentHeight: originalHeight,\n eventDate,\n originalStart: dayjs(event.start).format('YYYY-MM-DD HH:mm:ss'),\n originalEnd: dayjs(event.end).format('YYYY-MM-DD HH:mm:ss'),\n };\n\n resizeRef.current = state;\n setResizeState(state);\n },\n [enabled, mode]\n );\n\n const isResizing = resizeState !== null;\n\n useEffect(() => {\n if (!isResizing) {\n return undefined;\n }\n\n const savedUserSelect = document.body.style.userSelect;\n document.body.style.userSelect = 'none';\n\n const handlePointerMove = (e: PointerEvent) => {\n const state = resizeRef.current;\n if (!state) {\n return;\n }\n\n const containerRect = state.container.getBoundingClientRect();\n const relativeY = e.clientY - containerRect.top;\n const rawPercent = Math.max(0, Math.min(100, (relativeY / containerRect.height) * 100));\n const snappedPercent = snapPercent(rawPercent);\n\n let newTop = state.originalTop;\n let newHeight = state.originalHeight;\n\n if (state.edge === 'bottom') {\n newHeight = Math.max(minHeightPercent, snappedPercent - state.originalTop);\n } else {\n const originalBottom = state.originalTop + state.originalHeight;\n newTop = Math.min(snappedPercent, originalBottom - minHeightPercent);\n newHeight = originalBottom - newTop;\n }\n\n resizeRef.current = { ...state, currentTop: newTop, currentHeight: newHeight };\n setResizeState(resizeRef.current);\n };\n\n const handlePointerUp = () => {\n const state = resizeRef.current;\n if (state && onEventResizeRef.current) {\n if (\n state.currentTop !== state.originalTop ||\n state.currentHeight !== state.originalHeight\n ) {\n let newStart: DateTimeStringValue;\n let newEnd: DateTimeStringValue;\n\n if (state.edge === 'top') {\n newStart = percentToDateTime(state.currentTop, state.eventDate);\n newEnd = state.originalEnd;\n } else {\n newStart = state.originalStart;\n newEnd = percentToDateTime(state.currentTop + state.currentHeight, state.eventDate);\n }\n\n onEventResizeRef.current({\n eventId: state.eventId,\n newStart,\n newEnd,\n event: state.event,\n });\n }\n }\n resizeRef.current = null;\n setResizeState(null);\n };\n\n document.addEventListener('pointermove', handlePointerMove);\n document.addEventListener('pointerup', handlePointerUp);\n\n return () => {\n document.body.style.userSelect = savedUserSelect;\n document.removeEventListener('pointermove', handlePointerMove);\n document.removeEventListener('pointerup', handlePointerUp);\n };\n }, [isResizing]);\n\n const getResizePosition = useCallback(\n (eventId: string | number) => {\n if (!resizeState || resizeState.eventId !== eventId) {\n return null;\n }\n return { top: resizeState.currentTop, height: resizeState.currentHeight };\n },\n [resizeState]\n );\n\n const isResizableEvent = useCallback(\n (event: ScheduleEventData) => {\n if (!enabled || mode === 'static' || event.display === 'background') {\n return false;\n }\n return canResizeEvent ? canResizeEvent(event) : true;\n },\n [enabled, mode, canResizeEvent]\n );\n\n return {\n handleResizeStart,\n isResizing,\n resizingEventId: resizeState?.eventId ?? null,\n getResizePosition,\n isResizableEvent,\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"use-event-resize.cjs","names":["parseTimeString"],"sources":["../../src/hooks/use-event-resize.ts"],"sourcesContent":["import dayjs from 'dayjs';\nimport { useCallback, useEffect, useEffectEvent, useRef, useState } from 'react';\nimport { DateTimeStringValue, ScheduleEventData, ScheduleMode } from '../types';\nimport { parseTimeString } from '../utils/parse-time-string/parse-time-string';\n\ntype ResizeEdge = 'top' | 'bottom';\n\ninterface ResizeState {\n eventId: string | number;\n event: ScheduleEventData;\n edge: ResizeEdge;\n container: HTMLElement;\n originalTop: number;\n originalHeight: number;\n currentTop: number;\n currentHeight: number;\n eventDate: string;\n originalStart: DateTimeStringValue;\n originalEnd: DateTimeStringValue;\n}\n\nexport interface UseEventResizeInput {\n enabled?: boolean;\n mode?: ScheduleMode;\n startTime: string;\n endTime: string;\n intervalMinutes: number;\n onEventResize?: (data: {\n eventId: string | number;\n newStart: DateTimeStringValue;\n newEnd: DateTimeStringValue;\n event: ScheduleEventData;\n }) => void;\n canResizeEvent?: (event: ScheduleEventData) => boolean;\n}\n\nexport function useEventResize({\n enabled = false,\n mode = 'default',\n startTime,\n endTime,\n intervalMinutes,\n onEventResize,\n canResizeEvent,\n}: UseEventResizeInput) {\n const [resizeState, setResizeState] = useState<ResizeState | null>(null);\n const resizeRef = useRef<ResizeState | null>(null);\n const stableOnEventResize = useEffectEvent(onEventResize || (() => {}));\n\n const parsedStartTime = parseTimeString(startTime);\n const parsedEndTime = parseTimeString(endTime);\n const startMinutes = parsedStartTime.hours * 60 + parsedStartTime.minutes;\n const endMinutes = parsedEndTime.hours * 60 + parsedEndTime.minutes;\n const totalMinutes = endMinutes - startMinutes;\n const minHeightPercent = (intervalMinutes / totalMinutes) * 100;\n\n const clampAndSnap = useCallback(\n (minutes: number): number => {\n const snapped = Math.round(minutes / intervalMinutes) * intervalMinutes;\n return Math.max(0, Math.min(totalMinutes, snapped));\n },\n [totalMinutes, intervalMinutes]\n );\n\n const percentToDateTime = useCallback(\n (percent: number, eventDate: string): DateTimeStringValue => {\n const minutes = (percent / 100) * totalMinutes;\n const snappedMinutes = clampAndSnap(minutes);\n const totalMins = startMinutes + snappedMinutes;\n const hours = Math.floor(totalMins / 60);\n const mins = totalMins % 60;\n return `${eventDate} ${String(hours).padStart(2, '0')}:${String(mins).padStart(2, '0')}:00`;\n },\n [totalMinutes, startMinutes, clampAndSnap]\n );\n\n const snapPercent = useCallback(\n (percent: number): number => {\n const minutes = (percent / 100) * totalMinutes;\n const snappedMinutes = clampAndSnap(minutes);\n return (snappedMinutes / totalMinutes) * 100;\n },\n [totalMinutes, clampAndSnap]\n );\n\n const handleResizeStart = useCallback(\n ({\n event,\n edge,\n container,\n originalTop,\n originalHeight,\n eventDate,\n pointerEvent,\n }: {\n event: ScheduleEventData;\n edge: ResizeEdge;\n container: HTMLElement;\n originalTop: number;\n originalHeight: number;\n eventDate: string;\n pointerEvent: React.PointerEvent;\n }) => {\n if (!enabled || mode === 'static') {\n return;\n }\n\n pointerEvent.preventDefault();\n pointerEvent.stopPropagation();\n\n const state: ResizeState = {\n eventId: event.id,\n event,\n edge,\n container,\n originalTop,\n originalHeight,\n currentTop: originalTop,\n currentHeight: originalHeight,\n eventDate,\n originalStart: dayjs(event.start).format('YYYY-MM-DD HH:mm:ss'),\n originalEnd: dayjs(event.end).format('YYYY-MM-DD HH:mm:ss'),\n };\n\n resizeRef.current = state;\n setResizeState(state);\n },\n [enabled, mode]\n );\n\n const isResizing = resizeState !== null;\n\n useEffect(() => {\n if (!isResizing) {\n return undefined;\n }\n\n const savedUserSelect = document.body.style.userSelect;\n document.body.style.userSelect = 'none';\n\n const handlePointerMove = (e: PointerEvent) => {\n const state = resizeRef.current;\n if (!state) {\n return;\n }\n\n const containerRect = state.container.getBoundingClientRect();\n const relativeY = e.clientY - containerRect.top;\n const rawPercent = Math.max(0, Math.min(100, (relativeY / containerRect.height) * 100));\n const snappedPercent = snapPercent(rawPercent);\n\n let newTop = state.originalTop;\n let newHeight = state.originalHeight;\n\n if (state.edge === 'bottom') {\n newHeight = Math.max(minHeightPercent, snappedPercent - state.originalTop);\n } else {\n const originalBottom = state.originalTop + state.originalHeight;\n newTop = Math.min(snappedPercent, originalBottom - minHeightPercent);\n newHeight = originalBottom - newTop;\n }\n\n resizeRef.current = { ...state, currentTop: newTop, currentHeight: newHeight };\n setResizeState(resizeRef.current);\n };\n\n const handlePointerUp = () => {\n const state = resizeRef.current;\n if (state) {\n if (\n state.currentTop !== state.originalTop ||\n state.currentHeight !== state.originalHeight\n ) {\n let newStart: DateTimeStringValue;\n let newEnd: DateTimeStringValue;\n\n if (state.edge === 'top') {\n newStart = percentToDateTime(state.currentTop, state.eventDate);\n newEnd = state.originalEnd;\n } else {\n newStart = state.originalStart;\n newEnd = percentToDateTime(state.currentTop + state.currentHeight, state.eventDate);\n }\n\n stableOnEventResize({\n eventId: state.eventId,\n newStart,\n newEnd,\n event: state.event,\n });\n }\n }\n resizeRef.current = null;\n setResizeState(null);\n };\n\n document.addEventListener('pointermove', handlePointerMove);\n document.addEventListener('pointerup', handlePointerUp);\n\n return () => {\n document.body.style.userSelect = savedUserSelect;\n document.removeEventListener('pointermove', handlePointerMove);\n document.removeEventListener('pointerup', handlePointerUp);\n };\n }, [isResizing]);\n\n const getResizePosition = useCallback(\n (eventId: string | number) => {\n if (!resizeState || resizeState.eventId !== eventId) {\n return null;\n }\n return { top: resizeState.currentTop, height: resizeState.currentHeight };\n },\n [resizeState]\n );\n\n const isResizableEvent = useCallback(\n (event: ScheduleEventData) => {\n if (!enabled || mode === 'static' || event.display === 'background') {\n return false;\n }\n return canResizeEvent ? canResizeEvent(event) : true;\n },\n [enabled, mode, canResizeEvent]\n );\n\n return {\n handleResizeStart,\n isResizing,\n resizingEventId: resizeState?.eventId ?? null,\n getResizePosition,\n isResizableEvent,\n };\n}\n"],"mappings":"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"}
@@ -5,8 +5,7 @@ let react = require("react");
5
5
  function useSlotDragSelect({ enabled = true, onDragEnd }) {
6
6
  const [selectedRange, setSelectedRange] = (0, react.useState)(null);
7
7
  const dragRef = (0, react.useRef)(null);
8
- const onDragEndRef = (0, react.useRef)(onDragEnd);
9
- onDragEndRef.current = onDragEnd;
8
+ const stableOnDragEnd = (0, react.useEffectEvent)(onDragEnd || (() => {}));
10
9
  const handleSlotPointerDown = (0, react.useCallback)((_event, index, group) => {
11
10
  if (!enabled) return;
12
11
  dragRef.current = {
@@ -50,7 +49,7 @@ function useSlotDragSelect({ enabled = true, onDragEnd }) {
50
49
  const handlePointerUp = () => {
51
50
  if (dragRef.current) {
52
51
  const { startIndex, currentIndex, group } = dragRef.current;
53
- if (startIndex !== currentIndex) onDragEndRef.current?.(Math.min(startIndex, currentIndex), Math.max(startIndex, currentIndex), group);
52
+ if (startIndex !== currentIndex) stableOnDragEnd(Math.min(startIndex, currentIndex), Math.max(startIndex, currentIndex), group);
54
53
  }
55
54
  dragRef.current = null;
56
55
  setSelectedRange(null);