{"version":3,"file":"ResourcesMonthView.cjs","names":["getOrderedResources","expandRecurringEvents","useDragDropHandlers","calculateMonthDropDate","getGroupToResourceIdMap","useSlotDragSelect","Box","formatDate","getIndexFromDragPoint","ScheduleEvent","MoreEvents","UnstyledButton","ScheduleHeaderBase","toDateString","ScrollArea","getLabel","DragContext","classes"],"sources":["../../../src/components/ResourcesMonthView/ResourcesMonthView.tsx"],"sourcesContent":["import dayjs from 'dayjs';\nimport { useCallback, useMemo, useRef } 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  ScrollAreaProps,\n  StylesApiProps,\n  UnstyledButton,\n  useProps,\n  useResolvedStylesApi,\n  useStyles,\n} from '@mantine/core';\nimport { useDatesContext } from '@mantine/dates';\nimport { useIsomorphicEffect, useMergedRef } from '@mantine/hooks';\nimport { useDragDropHandlers } from '../../hooks/use-drag-drop-handlers';\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  ScheduleResourceData,\n  ScheduleResourceGroup,\n  ScheduleViewLevel,\n} from '../../types';\nimport {\n  calculateMonthDropDate,\n  expandRecurringEvents,\n  formatDate,\n  getGroupToResourceIdMap,\n  getIndexFromDragPoint,\n  getOrderedResources,\n  toDateString,\n} from '../../utils';\nimport { DragContext } from '../DragContext/DragContext';\nimport { MoreEvents, MoreEventsProps, MoreEventsStylesNames } from '../MoreEvents/MoreEvents';\nimport { RenderEvent, RenderEventBody, ScheduleEvent } from '../ScheduleEvent/ScheduleEvent';\nimport { MonthYearSelectProps } from '../ScheduleHeader/MonthYearSelect/MonthYearSelect';\nimport { CombinedScheduleHeaderStylesNames } from '../ScheduleHeader/ScheduleHeader';\nimport { ScheduleHeaderBase } from '../ScheduleHeader/ScheduleHeaderBase';\nimport { ViewSelectProps } from '../ScheduleHeader/ViewSelect/ViewSelect';\nimport classes from './ResourcesMonthView.module.css';\n\nexport type ResourcesMonthViewStylesNames =\n  | 'resourcesMonthView'\n  | 'resourcesMonthViewRoot'\n  | 'resourcesMonthViewScrollArea'\n  | 'resourcesMonthViewDayLabelsRow'\n  | 'resourcesMonthViewCorner'\n  | 'resourcesMonthViewDayLabel'\n  | 'resourcesMonthViewDayLabelWeekday'\n  | 'resourcesMonthViewDayLabelNumber'\n  | 'resourcesMonthViewRow'\n  | 'resourcesMonthViewResourceLabel'\n  | 'resourcesMonthViewRowSlots'\n  | 'resourcesMonthViewCell'\n  | 'resourcesMonthViewInner'\n  | 'resourcesMonthViewGroupColumn'\n  | 'resourcesMonthViewGroupColumnEmpty'\n  | MoreEventsStylesNames\n  | CombinedScheduleHeaderStylesNames;\n\nexport type ResourcesMonthViewCssVariables = {\n  resourcesMonthView:\n    | '--resources-month-view-radius'\n    | '--resources-month-view-day-width'\n    | '--resources-month-view-row-height'\n    | '--resources-month-view-group-label-width';\n};\n\nexport interface ResourcesMonthViewProps\n  extends BoxProps, StylesApiProps<ResourcesMonthViewFactory>, ElementProps<'div'> {\n  __staticSelector?: string;\n\n  /** Date 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  /** List of resources to display as rows */\n  resources: ScheduleResourceData[];\n\n  /** Locale passed down to dayjs */\n  locale?: string;\n\n  /** `dayjs` format for weekdays in day column headers @default 'dd' */\n  weekdayFormat?: DateLabelFormat;\n\n  /** Indices of weekend days */\n  weekendDays?: DayOfWeek[];\n\n  /** If set to false, weekend days are hidden @default true */\n  withWeekendDays?: boolean;\n\n  /** Date to scroll to on initial render, in `YYYY-MM-DD` format */\n  startScrollDate?: string;\n\n  /** Called when a cell is clicked, includes resourceId */\n  onDayClick?: (data: {\n    date: DateStringValue;\n    nativeEvent: React.MouseEvent<HTMLButtonElement>;\n    resourceId?: string | number;\n  }) => void;\n\n  /** If set, highlights the current day @default true */\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  /** If set, the header is displayed @default true */\n  withHeader?: boolean;\n\n  /** Props passed down to `MonthYearSelect` component */\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 control */\n  previousControlProps?: React.ComponentProps<'button'> & DataAttributes;\n\n  /** Props passed to next 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  /** Events to display */\n  events?: ScheduleEventData[];\n\n  /** Width of each day column @default 40px */\n  dayWidth?: React.CSSProperties['width'];\n\n  /** Height of each resource row @default 48px */\n  rowHeight?: React.CSSProperties['height'];\n\n  /** Function to customize event body */\n  renderEventBody?: RenderEventBody;\n\n  /** Function to fully customize event rendering */\n  renderEvent?: RenderEvent;\n\n  /** Function to customize resource label rendering */\n  renderResourceLabel?: (resource: ScheduleResourceData) => React.ReactNode;\n\n  /** List of resource groups to display as a column to the left of resource labels */\n  groups?: ScheduleResourceGroup[];\n\n  /** Function to customize group label rendering */\n  renderGroupLabel?: (group: ScheduleResourceGroup) => React.ReactNode;\n\n  /** Width of the group label column @default 80px */\n  groupLabelWidth?: React.CSSProperties['width'];\n\n  /** If true, events can be dragged and dropped @default false */\n  withEventsDragAndDrop?: boolean;\n\n  /** Called when event is dropped, includes target resourceId */\n  onEventDrop?: (data: {\n    eventId: string | number;\n    newStart: DateTimeStringValue;\n    newEnd: DateTimeStringValue;\n    event: ScheduleEventData;\n    resourceId?: string | number;\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 event is clicked */\n  onEventClick?: (event: ScheduleEventData, e: React.MouseEvent<HTMLButtonElement>) => void;\n\n  /** If set, enables drag-to-select day ranges @default false */\n  withDragSlotSelect?: boolean;\n\n  /** Called when a day range is selected by dragging, includes resourceId */\n  onSlotDragEnd?: (data: {\n    rangeStart: DateTimeStringValue;\n    rangeEnd: DateTimeStringValue;\n    resourceId?: string | number;\n  }) => void;\n\n  /** Labels override for i18n */\n  labels?: ScheduleLabelsOverride;\n\n  /** Interaction mode @default default */\n  mode?: ScheduleMode;\n\n  /** Props passed down to `ScrollArea` component */\n  scrollAreaProps?: Partial<ScrollAreaProps> & DataAttributes;\n\n  /** Called when an external item is dropped */\n  onExternalEventDrop?: (data: {\n    dataTransfer: DataTransfer;\n    dropDateTime: DateTimeStringValue;\n    resourceId?: string | number;\n  }) => void;\n\n  /** Maximum number of events visible per cell before \"+more\" indicator @default 2 */\n  maxEventsPerTimeSlot?: number;\n\n  /** Props passed down to `MoreEvents` component */\n  moreEventsProps?: Partial<MoreEventsProps>;\n\n  /** Max number of generated recurring instances @default 2000 */\n  recurrenceExpansionLimit?: number;\n}\n\nexport type ResourcesMonthViewFactory = Factory<{\n  props: ResourcesMonthViewProps;\n  ref: HTMLDivElement;\n  stylesNames: ResourcesMonthViewStylesNames;\n  vars: ResourcesMonthViewCssVariables;\n}>;\n\nconst varsResolver = createVarsResolver<ResourcesMonthViewFactory>(\n  (_theme, { radius, dayWidth, rowHeight, groupLabelWidth }) => ({\n    resourcesMonthView: {\n      '--resources-month-view-radius': radius ? getRadius(radius) : undefined,\n      '--resources-month-view-day-width': rem(dayWidth),\n      '--resources-month-view-row-height': rem(rowHeight),\n      '--resources-month-view-group-label-width': rem(groupLabelWidth),\n    },\n  })\n);\n\nconst defaultProps = {\n  __staticSelector: 'ResourcesMonthView',\n  highlightToday: true,\n  withHeader: true,\n  weekdayFormat: 'ddd',\n  withWeekendDays: true,\n  withEventsDragAndDrop: false,\n  withDragSlotSelect: false,\n  mode: 'default',\n} satisfies Partial<ResourcesMonthViewProps>;\n\nfunction compareCellEvents(a: ScheduleEventData, b: ScheduleEventData): number {\n  const aStart = dayjs(a.start);\n  const bStart = dayjs(b.start);\n  const aSpan = dayjs(a.end).startOf('day').diff(aStart.startOf('day'), 'day');\n  const bSpan = dayjs(b.end).startOf('day').diff(bStart.startOf('day'), 'day');\n\n  if (aSpan !== bSpan) {\n    return bSpan - aSpan;\n  }\n\n  return aStart.valueOf() - bStart.valueOf();\n}\n\nfunction getFirstAvailableRow(usedRows: Set<number>, maxRows: number): number | null {\n  for (let row = 0; row < maxRows; row += 1) {\n    if (!usedRows.has(row)) {\n      return row;\n    }\n  }\n\n  return null;\n}\n\ninterface ResourcesMonthViewCellLayout {\n  visible: { event: ScheduleEventData; row: number }[];\n  hiddenCount: number;\n}\n\ninterface ResourcesMonthViewSegment {\n  event: ScheduleEventData;\n  startDayIndex: number;\n  endDayIndex: number;\n  row: number;\n  clipStart: boolean;\n  clipEnd: boolean;\n  hanging: 'start' | 'end' | 'both' | 'none';\n\n  /** True when any day the segment covers shows a \"+N more\" indicator (those days compress rows) */\n  hiddenInSpan: boolean;\n}\n\ninterface ResourcesMonthViewResourceLayout {\n  byDay: Record<string, ResourcesMonthViewCellLayout>;\n  segments: ResourcesMonthViewSegment[];\n}\n\nfunction isMultiDayEvent(event: ScheduleEventData): boolean {\n  return dayjs(event.end).startOf('day').isAfter(dayjs(event.start).startOf('day'));\n}\n\nexport const ResourcesMonthView = factory<ResourcesMonthViewFactory>((_props) => {\n  const props = useProps('ResourcesMonthView', defaultProps, _props);\n  const {\n    classNames,\n    className,\n    style,\n    styles,\n    unstyled,\n    attributes,\n    vars,\n    mod,\n    date,\n    onDateChange,\n    resources,\n    locale,\n    weekdayFormat,\n    weekendDays,\n    withWeekendDays,\n    startScrollDate,\n    __staticSelector,\n    onDayClick,\n    highlightToday,\n    radius,\n    withHeader,\n    monthYearSelectProps,\n    onViewChange,\n    todayControlProps,\n    nextControlProps,\n    previousControlProps,\n    viewSelectProps,\n    events,\n    dayWidth,\n    rowHeight,\n    renderResourceLabel,\n    groups,\n    renderGroupLabel,\n    groupLabelWidth,\n    renderEventBody,\n    renderEvent,\n    withEventsDragAndDrop,\n    onEventDrop,\n    canDragEvent,\n    onEventDragStart,\n    onEventDragEnd,\n    onEventClick,\n    withDragSlotSelect,\n    onSlotDragEnd,\n    labels,\n    mode,\n    scrollAreaProps,\n    onExternalEventDrop,\n    maxEventsPerTimeSlot: _maxEventsPerTimeSlot,\n    moreEventsProps,\n    recurrenceExpansionLimit,\n    ...others\n  } = props;\n\n  const maxEventsPerTimeSlot = Math.min(10, Math.max(1, _maxEventsPerTimeSlot ?? 2));\n\n  const getStyles = useStyles<ResourcesMonthViewFactory>({\n    name: __staticSelector,\n    classes,\n    props,\n    className,\n    style,\n    classNames,\n    styles,\n    unstyled,\n    attributes,\n    vars,\n    varsResolver,\n    rootSelector: 'resourcesMonthView',\n  });\n\n  const { resolvedClassNames, resolvedStyles } = useResolvedStylesApi<ResourcesMonthViewFactory>({\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 ctx = useDatesContext();\n  const resolvedWeekendDays = ctx.getWeekendDays(weekendDays);\n  const { orderedResources, groupRanges, resourceGroupMap } = useMemo(\n    () => getOrderedResources(resources, groups),\n    [resources, groups]\n  );\n  const hasGroups = groupRanges.length > 0;\n\n  const monthDays = useMemo(() => {\n    const start = dayjs(date).startOf('month');\n    const daysCount = start.endOf('month').date();\n    const weekendDayList = ctx.getWeekendDays(weekendDays);\n    const days: string[] = [];\n    for (let d = 1; d <= daysCount; d++) {\n      const day = start.date(d);\n      if (!withWeekendDays && weekendDayList.includes(day.day() as DayOfWeek)) {\n        continue;\n      }\n      days.push(day.format('YYYY-MM-DD'));\n    }\n    return days;\n  }, [date, withWeekendDays, weekendDays, ctx]);\n\n  const viewportRef = useRef<HTMLDivElement>(null);\n  const mergedViewportRef = useMergedRef(viewportRef, scrollAreaProps?.viewportRef);\n  const dayLabelRefs = useRef<(HTMLDivElement | null)[]>([]);\n\n  const resourceLabelRef = useRef<HTMLDivElement>(null);\n\n  const scrollToDay = useCallback(\n    (targetDate: string) => {\n      if (!viewportRef.current) {\n        return;\n      }\n      const targetIndex = monthDays.indexOf(targetDate);\n      if (targetIndex < 0) {\n        return;\n      }\n      const targetLabel = dayLabelRefs.current[targetIndex];\n      if (!targetLabel) {\n        return;\n      }\n      const labelRect = targetLabel.getBoundingClientRect();\n      const viewportRect = viewportRef.current.getBoundingClientRect();\n      const labelWidth = resourceLabelRef.current?.getBoundingClientRect().width ?? 0;\n      viewportRef.current.scrollTo({\n        left: labelRect.left - viewportRect.left - labelWidth,\n        top: 0,\n      });\n    },\n    [monthDays]\n  );\n\n  useIsomorphicEffect(() => {\n    if (startScrollDate) {\n      scrollToDay(startScrollDate);\n    }\n  }, []);\n\n  const expandedEvents = useMemo(\n    () =>\n      expandRecurringEvents({\n        events,\n        rangeStart: dayjs(date).startOf('month').toDate(),\n        rangeEnd: dayjs(date).endOf('month').toDate(),\n        expansionLimit: recurrenceExpansionLimit,\n      }),\n    [events, date, recurrenceExpansionLimit]\n  );\n\n  const { eventsByResourceAndDay, eventLayoutByResource } = useMemo(() => {\n    const eventsByResourceAndDay: Record<string | number, Record<string, ScheduleEventData[]>> = {};\n    for (const resource of resources) {\n      eventsByResourceAndDay[resource.id] = {};\n      for (const day of monthDays) {\n        eventsByResourceAndDay[resource.id][day] = [];\n      }\n    }\n\n    if (expandedEvents) {\n      for (const event of expandedEvents) {\n        if (event.resourceId === undefined || !(event.resourceId in eventsByResourceAndDay)) {\n          continue;\n        }\n\n        const eventStart = dayjs(event.start);\n        const eventEnd = dayjs(event.end);\n\n        for (const day of monthDays) {\n          const dayStart = dayjs(day).startOf('day');\n          const dayEnd = dayjs(day).endOf('day');\n\n          if (eventStart.isBefore(dayEnd) && eventEnd.isAfter(dayStart)) {\n            eventsByResourceAndDay[event.resourceId][day].push(event);\n          }\n        }\n      }\n    }\n\n    const eventLayoutByResource: Record<string | number, ResourcesMonthViewResourceLayout> = {};\n    const monthRangeStart = dayjs(monthDays[0]).startOf('day');\n    const monthEndExclusive = dayjs(monthDays[monthDays.length - 1])\n      .add(1, 'day')\n      .startOf('day');\n\n    for (const resource of resources) {\n      const byDay: Record<string, ResourcesMonthViewCellLayout> = {};\n      const lastRow = new Map<string | number, number>();\n      const rowByEventDay = new Map<string | number, Map<number, number>>();\n      const overlapByEvent = new Map<\n        string | number,\n        { event: ScheduleEventData; days: number[] }\n      >();\n\n      monthDays.forEach((day, dayIndex) => {\n        const dayEvents = eventsByResourceAndDay[resource.id][day];\n        dayEvents.sort(compareCellEvents);\n\n        for (const event of dayEvents) {\n          const overlap = overlapByEvent.get(event.id);\n          if (overlap) {\n            overlap.days.push(dayIndex);\n          } else {\n            overlapByEvent.set(event.id, { event, days: [dayIndex] });\n          }\n        }\n\n        const usedRows = new Set<number>();\n        const visible: ResourcesMonthViewCellLayout['visible'] = [];\n        let hiddenCount = 0;\n\n        for (const event of dayEvents) {\n          let row: number | null | undefined = lastRow.get(event.id);\n\n          if (row === undefined || row >= maxEventsPerTimeSlot || usedRows.has(row)) {\n            row = getFirstAvailableRow(usedRows, maxEventsPerTimeSlot);\n          }\n\n          if (row === null) {\n            hiddenCount += 1;\n            continue;\n          }\n\n          usedRows.add(row);\n          visible.push({ event, row });\n          if (!rowByEventDay.has(event.id)) {\n            rowByEventDay.set(event.id, new Map());\n          }\n          rowByEventDay.get(event.id)!.set(dayIndex, row);\n          lastRow.set(event.id, row);\n        }\n\n        byDay[day] = { visible, hiddenCount };\n      });\n\n      const segments: ResourcesMonthViewSegment[] = [];\n\n      for (const { event, days } of overlapByEvent.values()) {\n        if (!isMultiDayEvent(event)) {\n          continue;\n        }\n\n        const firstOverlap = days[0];\n        const lastOverlap = days[days.length - 1];\n        const rows = rowByEventDay.get(event.id);\n        const extendsBefore = dayjs(event.start).isBefore(monthRangeStart);\n        const extendsAfter = dayjs(event.end).isAfter(monthEndExclusive);\n        let run: { startDayIndex: number; endDayIndex: number; row: number } | null = null;\n\n        const flushRun = () => {\n          if (!run) {\n            return;\n          }\n          const clipStart = run.startDayIndex > firstOverlap;\n          const clipEnd = run.endDayIndex < lastOverlap;\n          const hangStart = !clipStart && extendsBefore;\n          const hangEnd = !clipEnd && extendsAfter;\n          let hiddenInSpan = false;\n          for (let dayIndex = run.startDayIndex; dayIndex <= run.endDayIndex; dayIndex += 1) {\n            if ((byDay[monthDays[dayIndex]]?.hiddenCount ?? 0) > 0) {\n              hiddenInSpan = true;\n              break;\n            }\n          }\n          segments.push({\n            event,\n            startDayIndex: run.startDayIndex,\n            endDayIndex: run.endDayIndex,\n            row: run.row,\n            clipStart,\n            clipEnd,\n            hanging: hangStart && hangEnd ? 'both' : hangStart ? 'start' : hangEnd ? 'end' : 'none',\n            hiddenInSpan,\n          });\n          run = null;\n        };\n\n        for (let dayIndex = firstOverlap; dayIndex <= lastOverlap; dayIndex += 1) {\n          const row = rows?.get(dayIndex);\n\n          if (row === undefined) {\n            flushRun();\n            continue;\n          }\n\n          if (run && run.row === row && run.endDayIndex === dayIndex - 1) {\n            run.endDayIndex = dayIndex;\n          } else {\n            flushRun();\n            run = { startDayIndex: dayIndex, endDayIndex: dayIndex, row };\n          }\n        }\n\n        flushRun();\n      }\n\n      eventLayoutByResource[resource.id] = { byDay, segments };\n    }\n\n    return { eventsByResourceAndDay, eventLayoutByResource };\n  }, [resources, monthDays, expandedEvents, maxEventsPerTimeSlot]);\n\n  type DropTargetCell = { day: string; resourceId: string | number };\n\n  const handleExternalDrop = useCallback(\n    (e: React.DragEvent, target: DropTargetCell) => {\n      if (!onExternalEventDrop) {\n        return;\n      }\n      onExternalEventDrop({\n        dataTransfer: e.dataTransfer,\n        dropDateTime: `${dayjs(target.day).format('YYYY-MM-DD')} 00:00:00`,\n        resourceId: target.resourceId,\n      });\n    },\n    [onExternalEventDrop]\n  );\n\n  const dragDrop = useDragDropHandlers<DropTargetCell>({\n    enabled: withEventsDragAndDrop,\n    mode,\n    onEventDrop: (data) => {\n      onEventDrop?.({ ...data, resourceId: lastDropResourceId.current });\n    },\n    canDragEvent,\n    onEventDragStart,\n    onEventDragEnd,\n    calculateDropTarget: (target: DropTargetCell, draggedEvent: ScheduleEventData) => {\n      lastDropResourceId.current = target.resourceId;\n      return calculateMonthDropDate({ draggedEvent, targetDay: target.day });\n    },\n    onExternalDrop: onExternalEventDrop ? handleExternalDrop : undefined,\n  });\n\n  const lastDropResourceId = useRef<string | number | undefined>(undefined);\n\n  const withDragHandlers = (withEventsDragAndDrop || !!onExternalEventDrop) && mode !== 'static';\n\n  const groupToResourceId = useMemo(() => getGroupToResourceIdMap(resources), [resources]);\n\n  const slotDragSelect = useSlotDragSelect({\n    enabled: withDragSlotSelect && mode !== 'static',\n    onDragEnd: (startIndex, endIndex, group) => {\n      if (!onSlotDragEnd) {\n        return;\n      }\n      const startDay = monthDays[startIndex];\n      const endDay = monthDays[endIndex];\n      if (startDay && endDay) {\n        onSlotDragEnd({\n          rangeStart: dayjs(startDay).startOf('day').format('YYYY-MM-DD HH:mm:ss'),\n          rangeEnd: dayjs(endDay).endOf('day').format('YYYY-MM-DD HH:mm:ss'),\n          resourceId: groupToResourceId.get(group) ?? group,\n        });\n      }\n    },\n  });\n\n  const dayLabels = monthDays.map((day, dayIndex) => {\n    const d = dayjs(day);\n    const weekend = resolvedWeekendDays.includes(d.day() as DayOfWeek);\n    const today = d.isSame(dayjs(), 'day') && highlightToday;\n\n    return (\n      <Box\n        {...getStyles('resourcesMonthViewDayLabel')}\n        key={day}\n        mod={{ weekend, today }}\n        ref={(node) => {\n          dayLabelRefs.current[dayIndex] = node;\n        }}\n      >\n        <span {...getStyles('resourcesMonthViewDayLabelWeekday')}>\n          {formatDate({ date: d, locale: ctx.getLocale(locale), format: weekdayFormat })}\n        </span>\n        <span {...getStyles('resourcesMonthViewDayLabelNumber')}>{d.date()}</span>\n      </Box>\n    );\n  });\n\n  const cellsRef = useRef<HTMLButtonElement[][]>([]);\n\n  const getDayIndexFromDragPoint = useCallback((event: React.DragEvent, resourceIndex: number) => {\n    return getIndexFromDragPoint(cellsRef.current[resourceIndex] ?? [], event.clientX);\n  }, []);\n\n  const handleCellKeyDown = (\n    event: React.KeyboardEvent<HTMLButtonElement>,\n    resourceIndex: number,\n    dayIndex: number\n  ) => {\n    const key = event.key;\n    let nextResourceIndex = resourceIndex;\n    let nextDayIndex = dayIndex;\n\n    if (key === 'ArrowRight') {\n      nextDayIndex = Math.min(dayIndex + 1, monthDays.length - 1);\n    } else if (key === 'ArrowLeft') {\n      nextDayIndex = Math.max(dayIndex - 1, 0);\n    } else if (key === 'ArrowDown') {\n      nextResourceIndex = Math.min(resourceIndex + 1, resources.length - 1);\n    } else if (key === 'ArrowUp') {\n      nextResourceIndex = Math.max(resourceIndex - 1, 0);\n    } else {\n      return;\n    }\n\n    event.preventDefault();\n    cellsRef.current[nextResourceIndex]?.[nextDayIndex]?.focus();\n  };\n\n  const rowHeightPercent = 100 / maxEventsPerTimeSlot;\n\n  const rows = orderedResources.map((resource, resourceIndex) => {\n    if (!cellsRef.current[resourceIndex]) {\n      cellsRef.current[resourceIndex] = [];\n    }\n\n    const slotGroup = String(resource.id);\n    const dropTarget = dragDrop.dropTarget;\n\n    const totalDays = monthDays.length;\n    const eventNodes: React.ReactNode[] = [];\n    const moreNodes: React.ReactNode[] = [];\n\n    const cells = monthDays.map((day, dayIndex) => {\n      const d = dayjs(day);\n      const weekend = ctx.getWeekendDays(weekendDays).includes(d.day() as DayOfWeek);\n      const isDropTarget =\n        dropTarget !== null &&\n        typeof dropTarget === 'object' &&\n        'day' in dropTarget &&\n        (dropTarget as DropTargetCell).day === day &&\n        (dropTarget as DropTargetCell).resourceId === resource.id;\n      const isDragSelected = slotDragSelect.isSlotSelected(dayIndex, slotGroup);\n      const dayEvents = eventsByResourceAndDay[resource.id]?.[day] || [];\n      const layout = eventLayoutByResource[resource.id]?.byDay[day];\n      const visibleEvents = layout?.visible ?? [];\n      const hiddenEventsCount = layout?.hiddenCount ?? 0;\n      const isFirstCell = resourceIndex === 0 && dayIndex === 0;\n      const dayLeftPercent = (dayIndex / totalDays) * 100;\n      const dayWidthPercent = 100 / totalDays;\n\n      const hasHiddenEvents = hiddenEventsCount > 0 && mode !== 'static';\n\n      visibleEvents.forEach(({ event, row }) => {\n        if (isMultiDayEvent(event)) {\n          return;\n        }\n\n        const isDraggable = dragDrop.isDraggableEvent(event);\n        const topValue = hasHiddenEvents\n          ? `calc((100% - 18px) * ${row} / ${maxEventsPerTimeSlot} + 1px)`\n          : `calc(${row * rowHeightPercent}% + 1px)`;\n        const heightValue = hasHiddenEvents\n          ? `calc((100% - 18px) / ${maxEventsPerTimeSlot} - 2px)`\n          : `calc(${rowHeightPercent}% - 2px)`;\n\n        eventNodes.push(\n          <ScheduleEvent\n            key={`${event.id}-${day}`}\n            event={event}\n            nowrap\n            autoSize\n            size=\"sm\"\n            draggable={isDraggable}\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: topValue,\n              left: `calc(${dayLeftPercent}% + 1px)`,\n              width: `calc(${dayWidthPercent}% - 2px)`,\n              height: heightValue,\n              zIndex: 3,\n            }}\n          />\n        );\n      });\n\n      if (hiddenEventsCount > 0 && mode !== 'static') {\n        moreNodes.push(\n          <MoreEvents\n            key={`more-${resource.id}-${day}`}\n            events={dayEvents}\n            moreEventsCount={hiddenEventsCount}\n            mode={mode}\n            labels={labels}\n            renderEventBody={renderEventBody}\n            renderEvent={renderEvent}\n            onEventClick={onEventClick}\n            style={{\n              position: 'absolute',\n              bottom: 1,\n              left: `calc(${dayLeftPercent}% + 1px)`,\n              width: `calc(${dayWidthPercent}% - 2px)`,\n              height: 18,\n              zIndex: 4,\n            }}\n            {...stylesApiProps}\n            {...moreEventsProps}\n          />\n        );\n      }\n\n      return (\n        <UnstyledButton\n          key={day}\n          ref={(node) => {\n            if (node) {\n              if (!cellsRef.current[resourceIndex]) {\n                cellsRef.current[resourceIndex] = [];\n              }\n              cellsRef.current[resourceIndex][dayIndex] = node;\n            }\n          }}\n          {...getStyles('resourcesMonthViewCell')}\n          aria-label={`${resource.label} ${d.format('MMMM D, YYYY')}`}\n          data-drag-slot-index={withDragSlotSelect && mode !== 'static' ? dayIndex : undefined}\n          data-drag-slot-group={withDragSlotSelect && mode !== 'static' ? slotGroup : undefined}\n          mod={{\n            weekend,\n            'drop-target': isDropTarget,\n            'drag-selected': isDragSelected,\n            static: mode === 'static',\n          }}\n          tabIndex={mode === 'static' ? -1 : isFirstCell ? 0 : -1}\n          onClick={\n            mode === 'static'\n              ? undefined\n              : (e) => onDayClick?.({ date: day, nativeEvent: e, resourceId: resource.id })\n          }\n          onKeyDown={\n            mode === 'static' ? undefined : (e) => handleCellKeyDown(e, resourceIndex, dayIndex)\n          }\n          onPointerDown={\n            withDragSlotSelect && mode !== 'static'\n              ? (e) =>\n                  slotDragSelect.handleSlotPointerDown(\n                    e as React.PointerEvent<HTMLButtonElement>,\n                    dayIndex,\n                    slotGroup\n                  )\n              : undefined\n          }\n          onDragOver={withDragHandlers ? (e) => e.preventDefault() : undefined}\n        />\n      );\n    });\n\n    const resourceSegments = eventLayoutByResource[resource.id]?.segments ?? [];\n\n    resourceSegments.forEach((segment) => {\n      const isDraggable = dragDrop.isDraggableEvent(segment.event);\n      const segmentLeftPercent = (segment.startDayIndex / totalDays) * 100;\n      const segmentWidthPercent =\n        ((segment.endDayIndex - segment.startDayIndex + 1) / totalDays) * 100;\n      const compressed = segment.hiddenInSpan && mode !== 'static';\n      const topValue = compressed\n        ? `calc((100% - 18px) * ${segment.row} / ${maxEventsPerTimeSlot} + 1px)`\n        : `calc(${segment.row * rowHeightPercent}% + 1px)`;\n      const heightValue = compressed\n        ? `calc((100% - 18px) / ${maxEventsPerTimeSlot} - 2px)`\n        : `calc(${rowHeightPercent}% - 2px)`;\n\n      eventNodes.push(\n        <ScheduleEvent\n          key={`${segment.event.id}-segment-${segment.startDayIndex}`}\n          event={segment.event}\n          nowrap\n          autoSize\n          size=\"sm\"\n          hanging={segment.hanging}\n          draggable={isDraggable}\n          renderEventBody={renderEventBody}\n          renderEvent={renderEvent}\n          radius={radius}\n          mode={mode}\n          mod={{ 'clip-start': segment.clipStart, 'clip-end': segment.clipEnd }}\n          onClick={onEventClick ? (e) => onEventClick(segment.event, e) : undefined}\n          style={{\n            position: 'absolute',\n            top: topValue,\n            left: `calc(${segmentLeftPercent}% + 1px)`,\n            width: `calc(${segmentWidthPercent}% - 2px)`,\n            height: heightValue,\n            zIndex: 3,\n          }}\n        />\n      );\n    });\n\n    const groupInfo = hasGroups ? resourceGroupMap[resourceIndex] : undefined;\n    const isGroupStart = groupInfo?.position === 'first' || groupInfo?.position === 'only';\n\n    const groupCell =\n      groupInfo !== undefined ? (\n        groupInfo !== null ? (\n          <Box\n            {...getStyles('resourcesMonthViewGroupColumn')}\n            mod={{ 'group-position': groupInfo.position }}\n          >\n            {isGroupStart && (\n              <span\n                style={\n                  groupInfo.count > 1\n                    ? {\n                        transform: `translateY(calc((${groupInfo.count - 1} * (var(--resources-month-view-row-height) + 1px)) / 2))`,\n                      }\n                    : undefined\n                }\n              >\n                {renderGroupLabel ? renderGroupLabel(groupInfo.group) : groupInfo.group.label}\n              </span>\n            )}\n          </Box>\n        ) : (\n          <Box {...getStyles('resourcesMonthViewGroupColumnEmpty')} />\n        )\n      ) : null;\n\n    return (\n      <div {...getStyles('resourcesMonthViewRow')} key={resource.id}>\n        {groupCell}\n        <div\n          {...getStyles('resourcesMonthViewResourceLabel')}\n          data-has-groups={hasGroups || undefined}\n        >\n          {renderResourceLabel ? renderResourceLabel(resource) : resource.label}\n        </div>\n        <div\n          {...getStyles('resourcesMonthViewRowSlots')}\n          onDragOver={\n            withDragHandlers\n              ? (e) => {\n                  const dayIndex = getDayIndexFromDragPoint(e, resourceIndex);\n                  if (dayIndex !== null && monthDays[dayIndex]) {\n                    dragDrop.handleDragOver(e, {\n                      day: monthDays[dayIndex],\n                      resourceId: resource.id,\n                    });\n                  }\n                }\n              : undefined\n          }\n          onDragLeave={withDragHandlers ? dragDrop.handleDragLeave : undefined}\n          onDrop={\n            withDragHandlers\n              ? (e) => {\n                  const dayIndex = getDayIndexFromDragPoint(e, resourceIndex);\n                  if (dayIndex !== null && monthDays[dayIndex]) {\n                    dragDrop.handleDrop(e, {\n                      day: monthDays[dayIndex],\n                      resourceId: resource.id,\n                    });\n                  }\n                }\n              : undefined\n          }\n        >\n          {eventNodes}\n          {moreNodes}\n          {cells}\n        </div>\n      </div>\n    );\n  });\n\n  const content = (\n    <Box\n      mod={[\n        {\n          static: mode === 'static',\n          'slot-dragging': slotDragSelect.isDragging,\n          'event-interaction': dragDrop.dragContextValue.isDragging,\n        },\n        mod,\n      ]}\n      {...getStyles('resourcesMonthView')}\n      {...others}\n    >\n      {withHeader && (\n        <ScheduleHeaderBase\n          view=\"month\"\n          navigationHandlers={{\n            previous: () => toDateString(dayjs(date).subtract(1, 'month').startOf('month')),\n            next: () => toDateString(dayjs(date).add(1, 'month').startOf('month')),\n            today: () => {\n              requestAnimationFrame(() => {\n                scrollToDay(dayjs().format('YYYY-MM-DD'));\n              });\n              return toDateString(dayjs());\n            },\n          }}\n          control={{\n            monthYearSelect: {\n              locale,\n              yearValue: dayjs(date).get('year'),\n              monthValue: dayjs(date).get('month'),\n              onYearChange: (year) =>\n                onDateChange?.(toDateString(dayjs(date).set('year', year).startOf('month'))),\n              onMonthChange: (month) =>\n                onDateChange?.(toDateString(dayjs(date).set('month', month).startOf('month'))),\n              ...monthYearSelectProps,\n            },\n          }}\n          labels={labels}\n          onDateChange={onDateChange}\n          onViewChange={onViewChange}\n          previousControlProps={previousControlProps}\n          nextControlProps={nextControlProps}\n          todayControlProps={todayControlProps}\n          viewSelectProps={{ views: ['day', 'week', 'month'] as const, ...viewSelectProps }}\n          stylesApiProps={stylesApiProps}\n        />\n      )}\n\n      <Box {...getStyles('resourcesMonthViewRoot')}>\n        <ScrollArea\n          scrollbars=\"x\"\n          scrollbarSize={4}\n          {...scrollAreaProps}\n          {...getStyles('resourcesMonthViewScrollArea', {\n            className: scrollAreaProps?.className,\n            style: scrollAreaProps?.style,\n          })}\n          viewportRef={mergedViewportRef}\n        >\n          <div {...getStyles('resourcesMonthViewInner')}>\n            <div {...getStyles('resourcesMonthViewDayLabelsRow')}>\n              <div\n                {...getStyles('resourcesMonthViewCorner')}\n                key=\"corner\"\n                ref={resourceLabelRef}\n                style={\n                  hasGroups\n                    ? {\n                        flexBasis:\n                          'calc(var(--resources-month-view-resource-label-width) + var(--resources-month-view-group-label-width))',\n                        minWidth:\n                          'calc(var(--resources-month-view-resource-label-width) + var(--resources-month-view-group-label-width))',\n                      }\n                    : undefined\n                }\n              >\n                {getLabel('resources', labels)}\n              </div>\n              {dayLabels}\n            </div>\n\n            {rows}\n          </div>\n        </ScrollArea>\n      </Box>\n    </Box>\n  );\n\n  if (withEventsDragAndDrop) {\n    return <DragContext.Provider value={dragDrop.dragContextValue}>{content}</DragContext.Provider>;\n  }\n\n  return content;\n});\n\nResourcesMonthView.displayName = '@mantine/schedule/ResourcesMonthView';\nResourcesMonthView.classes = classes;\nResourcesMonthView.varsResolver = varsResolver;\n"],"mappings":"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"}