@mantine/schedule 9.0.1 → 9.0.2

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.
@@ -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, 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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"}
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 justResizedRef = useRef(false);\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 justResizedRef.current = true;\n requestAnimationFrame(() => {\n justResizedRef.current = false;\n });\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 const wasResizing = useCallback(() => justResizedRef.current, []);\n\n return {\n handleResizeStart,\n isResizing,\n resizingEventId: resizeState?.eventId ?? null,\n getResizePosition,\n isResizableEvent,\n wasResizing,\n };\n}\n"],"mappings":"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"}
@@ -4,7 +4,9 @@ const require_validate_event = require("../validate-event/validate-event.cjs");
4
4
  let dayjs = require("dayjs");
5
5
  dayjs = require_runtime.__toESM(dayjs);
6
6
  let rrule = require("rrule");
7
+ rrule = require_runtime.__toESM(rrule);
7
8
  //#region packages/@mantine/schedule/src/utils/expand-recurring-events/expand-recurring-events.ts
9
+ const RRule = "default" in rrule ? rrule.default.RRule : rrule.RRule;
8
10
  function getRecurrenceKey(recurringEventId, recurrenceId) {
9
11
  return `${recurringEventId}::${recurrenceId}`;
10
12
  }
@@ -26,9 +28,9 @@ function getOccurrenceStartsInRange(event, rangeStart, rangeEnd, expansionLimit,
26
28
  const dtstart = (0, dayjs.default)(event.recurrence?.dtstart || event.start);
27
29
  if (!dtstart.isValid() || !event.recurrence) return [];
28
30
  try {
29
- const options = rrule.RRule.parseString(getRRuleString(event.recurrence.rrule));
31
+ const options = RRule.parseString(getRRuleString(event.recurrence.rrule));
30
32
  options.dtstart = dtstart.toDate();
31
- const rule = new rrule.RRule(options);
33
+ const rule = new RRule(options);
32
34
  const searchStart = rangeStart.subtract(Math.max(0, durationMs), "millisecond").toDate();
33
35
  return rule.between(searchStart, rangeEnd.toDate(), true).slice(0, expansionLimit).map((value) => (0, dayjs.default)(value));
34
36
  } catch {
@@ -1 +1 @@
1
- {"version":3,"file":"expand-recurring-events.cjs","names":["RRule","validateEvent"],"sources":["../../../src/utils/expand-recurring-events/expand-recurring-events.ts"],"sourcesContent":["import dayjs from 'dayjs';\nimport { RRule } from 'rrule';\nimport { DateTimeStringValue, ScheduleEventData, ScheduleRecurrenceData } from '../../types';\nimport { validateEvent } from '../validate-event/validate-event';\n\ninterface ExpandRecurringEventsInput {\n events: ScheduleEventData[] | undefined;\n rangeStart: Date | string;\n rangeEnd: Date | string;\n expansionLimit?: number;\n}\n\nfunction getRecurrenceKey(recurringEventId: string | number, recurrenceId: DateTimeStringValue) {\n return `${recurringEventId}::${recurrenceId}`;\n}\n\nfunction overlapsRange(\n eventStart: dayjs.Dayjs,\n eventEnd: dayjs.Dayjs,\n rangeStart: dayjs.Dayjs,\n rangeEnd: dayjs.Dayjs\n) {\n return (\n (eventEnd.isAfter(rangeStart) || eventEnd.isSame(rangeStart)) &&\n (eventStart.isBefore(rangeEnd) || eventStart.isSame(rangeEnd))\n );\n}\n\nfunction getExdateSet(recurrence: ScheduleRecurrenceData | undefined) {\n if (!recurrence?.exdate) {\n return new Set<string>();\n }\n\n const values = recurrence.exdate\n .map((value) => dayjs(value))\n .filter((value) => value.isValid())\n .map((value) => value.format('YYYY-MM-DD HH:mm:ss'));\n\n return new Set(values);\n}\n\nfunction getRRuleString(rule: string) {\n const normalized = rule.trim();\n if (!normalized.includes('\\n')) {\n return normalized.startsWith('RRULE:') ? normalized.replace(/^RRULE:/, '') : normalized;\n }\n\n const rruleLine = normalized\n .split('\\n')\n .map((line) => line.trim())\n .find((line) => line.startsWith('RRULE:'));\n\n return rruleLine ? rruleLine.replace(/^RRULE:/, '') : normalized;\n}\n\nfunction getOccurrenceStartsInRange(\n event: ScheduleEventData,\n rangeStart: dayjs.Dayjs,\n rangeEnd: dayjs.Dayjs,\n expansionLimit: number,\n durationMs: number\n) {\n const dtstart = dayjs(event.recurrence?.dtstart || event.start);\n if (!dtstart.isValid() || !event.recurrence) {\n return [];\n }\n\n try {\n const options = RRule.parseString(getRRuleString(event.recurrence.rrule));\n options.dtstart = dtstart.toDate();\n const rule = new RRule(options);\n\n const searchStart = rangeStart.subtract(Math.max(0, durationMs), 'millisecond').toDate();\n const results = rule.between(searchStart, rangeEnd.toDate(), true);\n return results.slice(0, expansionLimit).map((value) => dayjs(value));\n } catch {\n return [];\n }\n}\n\nfunction isEventInRange(event: ScheduleEventData, rangeStart: dayjs.Dayjs, rangeEnd: dayjs.Dayjs) {\n const start = dayjs(event.start);\n const end = dayjs(event.end);\n\n if (!start.isValid() || !end.isValid()) {\n return false;\n }\n\n return overlapsRange(start, end, rangeStart, rangeEnd);\n}\n\nfunction createGeneratedInstance(\n event: ScheduleEventData,\n occurrenceStart: dayjs.Dayjs,\n durationMs: number\n): ScheduleEventData {\n const occurrenceEnd = occurrenceStart.add(durationMs, 'millisecond');\n const recurrenceId = occurrenceStart.format('YYYY-MM-DD HH:mm:ss');\n const { recurrence, ...eventWithoutRecurrence } = event;\n\n return {\n ...eventWithoutRecurrence,\n id: `${event.id}::${recurrenceId}`,\n start: occurrenceStart.format('YYYY-MM-DD HH:mm:ss'),\n end: occurrenceEnd.format('YYYY-MM-DD HH:mm:ss'),\n recurringEventId: event.id,\n recurrenceId,\n recurringInstance: {\n isRecurringInstance: true,\n recurringEventId: event.id,\n recurrenceId,\n originalStart: occurrenceStart.format('YYYY-MM-DD HH:mm:ss'),\n originalEnd: occurrenceEnd.format('YYYY-MM-DD HH:mm:ss'),\n },\n };\n}\n\nconst DEFAULT_EXPANSION_LIMIT = 2000;\n\nexport function expandRecurringEvents({\n events,\n rangeStart,\n rangeEnd,\n expansionLimit = DEFAULT_EXPANSION_LIMIT,\n}: ExpandRecurringEventsInput): ScheduleEventData[] {\n if (!events || events.length === 0) {\n return [];\n }\n\n const start = dayjs(rangeStart);\n const end = dayjs(rangeEnd);\n\n if (!start.isValid() || !end.isValid()) {\n return [];\n }\n\n const regularEvents: ScheduleEventData[] = [];\n const recurringEvents: ScheduleEventData[] = [];\n const overrides = new Map<string, ScheduleEventData>();\n\n for (const event of events) {\n if (event.recurringEventId && event.recurrenceId) {\n overrides.set(getRecurrenceKey(event.recurringEventId, event.recurrenceId), event);\n continue;\n }\n\n if (event.recurrence?.rrule) {\n recurringEvents.push(event);\n continue;\n }\n\n regularEvents.push(event);\n }\n\n const output: ScheduleEventData[] = [];\n const consumedOverrideIds = new Set<string | number>();\n\n for (const event of regularEvents) {\n if (isEventInRange(event, start, end)) {\n output.push(validateEvent(event));\n }\n }\n\n for (const event of recurringEvents) {\n const eventStart = dayjs(event.recurrence?.dtstart || event.start);\n const eventEnd = dayjs(event.end);\n\n if (!eventStart.isValid() || !eventEnd.isValid()) {\n continue;\n }\n\n const durationMs = eventEnd.diff(dayjs(event.start), 'millisecond');\n if (durationMs < 0) {\n continue;\n }\n\n const exdate = getExdateSet(event.recurrence);\n const starts = getOccurrenceStartsInRange(event, start, end, expansionLimit, durationMs);\n\n for (const occurrenceStart of starts) {\n const recurrenceId = occurrenceStart.format('YYYY-MM-DD HH:mm:ss');\n if (exdate.has(recurrenceId)) {\n continue;\n }\n\n const overrideKey = getRecurrenceKey(event.id, recurrenceId);\n const override = overrides.get(overrideKey);\n if (override) {\n if (isEventInRange(override, start, end)) {\n output.push(validateEvent(override));\n consumedOverrideIds.add(override.id);\n }\n continue;\n }\n\n const generated = createGeneratedInstance(event, occurrenceStart, durationMs);\n if (overlapsRange(dayjs(generated.start), dayjs(generated.end), start, end)) {\n output.push(validateEvent(generated));\n }\n }\n }\n\n for (const override of overrides.values()) {\n if (consumedOverrideIds.has(override.id)) {\n continue;\n }\n if (isEventInRange(override, start, end)) {\n output.push(validateEvent(override));\n }\n }\n\n return output;\n}\n\nexport { DEFAULT_EXPANSION_LIMIT };\n"],"mappings":"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"}
1
+ {"version":3,"file":"expand-recurring-events.cjs","names":["rruleAll","validateEvent"],"sources":["../../../src/utils/expand-recurring-events/expand-recurring-events.ts"],"sourcesContent":["import dayjs from 'dayjs';\nimport * as rruleAll from 'rrule';\n\nconst RRule = (\n 'default' in rruleAll ? (rruleAll as any).default.RRule : rruleAll.RRule\n) as typeof rruleAll.RRule;\nimport { DateTimeStringValue, ScheduleEventData, ScheduleRecurrenceData } from '../../types';\nimport { validateEvent } from '../validate-event/validate-event';\n\ninterface ExpandRecurringEventsInput {\n events: ScheduleEventData[] | undefined;\n rangeStart: Date | string;\n rangeEnd: Date | string;\n expansionLimit?: number;\n}\n\nfunction getRecurrenceKey(recurringEventId: string | number, recurrenceId: DateTimeStringValue) {\n return `${recurringEventId}::${recurrenceId}`;\n}\n\nfunction overlapsRange(\n eventStart: dayjs.Dayjs,\n eventEnd: dayjs.Dayjs,\n rangeStart: dayjs.Dayjs,\n rangeEnd: dayjs.Dayjs\n) {\n return (\n (eventEnd.isAfter(rangeStart) || eventEnd.isSame(rangeStart)) &&\n (eventStart.isBefore(rangeEnd) || eventStart.isSame(rangeEnd))\n );\n}\n\nfunction getExdateSet(recurrence: ScheduleRecurrenceData | undefined) {\n if (!recurrence?.exdate) {\n return new Set<string>();\n }\n\n const values = recurrence.exdate\n .map((value) => dayjs(value))\n .filter((value) => value.isValid())\n .map((value) => value.format('YYYY-MM-DD HH:mm:ss'));\n\n return new Set(values);\n}\n\nfunction getRRuleString(rule: string) {\n const normalized = rule.trim();\n if (!normalized.includes('\\n')) {\n return normalized.startsWith('RRULE:') ? normalized.replace(/^RRULE:/, '') : normalized;\n }\n\n const rruleLine = normalized\n .split('\\n')\n .map((line) => line.trim())\n .find((line) => line.startsWith('RRULE:'));\n\n return rruleLine ? rruleLine.replace(/^RRULE:/, '') : normalized;\n}\n\nfunction getOccurrenceStartsInRange(\n event: ScheduleEventData,\n rangeStart: dayjs.Dayjs,\n rangeEnd: dayjs.Dayjs,\n expansionLimit: number,\n durationMs: number\n) {\n const dtstart = dayjs(event.recurrence?.dtstart || event.start);\n if (!dtstart.isValid() || !event.recurrence) {\n return [];\n }\n\n try {\n const options = RRule.parseString(getRRuleString(event.recurrence.rrule));\n options.dtstart = dtstart.toDate();\n const rule = new RRule(options);\n\n const searchStart = rangeStart.subtract(Math.max(0, durationMs), 'millisecond').toDate();\n const results = rule.between(searchStart, rangeEnd.toDate(), true);\n return results.slice(0, expansionLimit).map((value) => dayjs(value));\n } catch {\n return [];\n }\n}\n\nfunction isEventInRange(event: ScheduleEventData, rangeStart: dayjs.Dayjs, rangeEnd: dayjs.Dayjs) {\n const start = dayjs(event.start);\n const end = dayjs(event.end);\n\n if (!start.isValid() || !end.isValid()) {\n return false;\n }\n\n return overlapsRange(start, end, rangeStart, rangeEnd);\n}\n\nfunction createGeneratedInstance(\n event: ScheduleEventData,\n occurrenceStart: dayjs.Dayjs,\n durationMs: number\n): ScheduleEventData {\n const occurrenceEnd = occurrenceStart.add(durationMs, 'millisecond');\n const recurrenceId = occurrenceStart.format('YYYY-MM-DD HH:mm:ss');\n const { recurrence, ...eventWithoutRecurrence } = event;\n\n return {\n ...eventWithoutRecurrence,\n id: `${event.id}::${recurrenceId}`,\n start: occurrenceStart.format('YYYY-MM-DD HH:mm:ss'),\n end: occurrenceEnd.format('YYYY-MM-DD HH:mm:ss'),\n recurringEventId: event.id,\n recurrenceId,\n recurringInstance: {\n isRecurringInstance: true,\n recurringEventId: event.id,\n recurrenceId,\n originalStart: occurrenceStart.format('YYYY-MM-DD HH:mm:ss'),\n originalEnd: occurrenceEnd.format('YYYY-MM-DD HH:mm:ss'),\n },\n };\n}\n\nconst DEFAULT_EXPANSION_LIMIT = 2000;\n\nexport function expandRecurringEvents({\n events,\n rangeStart,\n rangeEnd,\n expansionLimit = DEFAULT_EXPANSION_LIMIT,\n}: ExpandRecurringEventsInput): ScheduleEventData[] {\n if (!events || events.length === 0) {\n return [];\n }\n\n const start = dayjs(rangeStart);\n const end = dayjs(rangeEnd);\n\n if (!start.isValid() || !end.isValid()) {\n return [];\n }\n\n const regularEvents: ScheduleEventData[] = [];\n const recurringEvents: ScheduleEventData[] = [];\n const overrides = new Map<string, ScheduleEventData>();\n\n for (const event of events) {\n if (event.recurringEventId && event.recurrenceId) {\n overrides.set(getRecurrenceKey(event.recurringEventId, event.recurrenceId), event);\n continue;\n }\n\n if (event.recurrence?.rrule) {\n recurringEvents.push(event);\n continue;\n }\n\n regularEvents.push(event);\n }\n\n const output: ScheduleEventData[] = [];\n const consumedOverrideIds = new Set<string | number>();\n\n for (const event of regularEvents) {\n if (isEventInRange(event, start, end)) {\n output.push(validateEvent(event));\n }\n }\n\n for (const event of recurringEvents) {\n const eventStart = dayjs(event.recurrence?.dtstart || event.start);\n const eventEnd = dayjs(event.end);\n\n if (!eventStart.isValid() || !eventEnd.isValid()) {\n continue;\n }\n\n const durationMs = eventEnd.diff(dayjs(event.start), 'millisecond');\n if (durationMs < 0) {\n continue;\n }\n\n const exdate = getExdateSet(event.recurrence);\n const starts = getOccurrenceStartsInRange(event, start, end, expansionLimit, durationMs);\n\n for (const occurrenceStart of starts) {\n const recurrenceId = occurrenceStart.format('YYYY-MM-DD HH:mm:ss');\n if (exdate.has(recurrenceId)) {\n continue;\n }\n\n const overrideKey = getRecurrenceKey(event.id, recurrenceId);\n const override = overrides.get(overrideKey);\n if (override) {\n if (isEventInRange(override, start, end)) {\n output.push(validateEvent(override));\n consumedOverrideIds.add(override.id);\n }\n continue;\n }\n\n const generated = createGeneratedInstance(event, occurrenceStart, durationMs);\n if (overlapsRange(dayjs(generated.start), dayjs(generated.end), start, end)) {\n output.push(validateEvent(generated));\n }\n }\n }\n\n for (const override of overrides.values()) {\n if (consumedOverrideIds.has(override.id)) {\n continue;\n }\n if (isEventInRange(override, start, end)) {\n output.push(validateEvent(override));\n }\n }\n\n return output;\n}\n\nexport { DEFAULT_EXPANSION_LIMIT };\n"],"mappings":"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"}
@@ -218,7 +218,9 @@ const DayView = factory((_props) => {
218
218
  });
219
219
  } : void 0,
220
220
  mode,
221
- onClick: onEventClick ? (e) => onEventClick(event, e) : void 0,
221
+ onClick: onEventClick ? (e) => {
222
+ if (!eventResize.wasResizing()) onEventClick(event, e);
223
+ } : void 0,
222
224
  ...stylesApiProps,
223
225
  style: {
224
226
  ...stylesApiProps.styles?.event,
@@ -1 +1 @@
1
- {"version":3,"file":"DayView.mjs","names":["classes"],"sources":["../../../src/components/DayView/DayView.tsx"],"sourcesContent":["import dayjs from 'dayjs';\nimport { useCallback, 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 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 ScheduleEventData,\n ScheduleMode,\n ScheduleViewLevel,\n} from '../../types';\nimport {\n calculateDropTime,\n clampIntervalMinutes,\n expandRecurringEvents,\n formatDate,\n getBusinessHoursMod,\n getDayTimeIntervals,\n getVisibleEvents,\n isAllDayEvent,\n toDateString,\n} from '../../utils';\nimport {\n CurrentTimeIndicator,\n CurrentTimeIndicatorStylesNames,\n} from '../CurrentTimeIndicator/CurrentTimeIndicator';\nimport { DragContext } from '../DragContext/DragContext';\nimport { MoreEvents, MoreEventsProps, MoreEventsStylesNames } from '../MoreEvents/MoreEvents';\nimport {\n RenderEvent,\n RenderEventBody,\n ScheduleEvent,\n ScheduleEventStylesNames,\n} from '../ScheduleEvent/ScheduleEvent';\nimport { MonthYearSelectStylesNames } from '../ScheduleHeader/MonthYearSelect/MonthYearSelect';\nimport { CombinedScheduleHeaderStylesNames } from '../ScheduleHeader/ScheduleHeader';\nimport { ScheduleHeaderBase } from '../ScheduleHeader/ScheduleHeaderBase';\nimport { ViewSelectProps } from '../ScheduleHeader/ViewSelect/ViewSelect';\nimport { getDayViewEvents } from './get-day-view-events/get-day-view-events';\nimport classes from './DayView.module.css';\n\nexport type DayViewStylesNames =\n | 'dayView'\n | 'dayViewInner'\n | 'dayViewScrollArea'\n | 'dayViewAllDay'\n | 'dayViewAllDayEvents'\n | 'dayViewSlot'\n | 'dayViewSlots'\n | 'dayViewTimeSlots'\n | 'dayViewSlotLabel'\n | 'dayViewSlotLabels'\n | 'dayViewBackgroundEvent'\n | MoreEventsStylesNames\n | ScheduleEventStylesNames\n | Exclude<CombinedScheduleHeaderStylesNames, MonthYearSelectStylesNames>\n | CurrentTimeIndicatorStylesNames;\n\nexport type DayViewCssVariables = {\n dayView: '--day-view-radius' | '--day-view-slot-height' | '--day-view-all-day-slot-height';\n};\n\nexport interface DayViewProps\n extends BoxProps, StylesApiProps<DayViewFactory>, ElementProps<'div'> {\n __staticSelector?: string;\n\n /** Day to display, Date object or date string in `YYYY-MM-DD` format */\n date: Date | DateStringValue;\n\n /** Called when date is changed */\n onDateChange?: (date: DateStringValue) => void;\n\n /** Events to display, must be a stable reference */\n events?: ScheduleEventData[];\n\n /** Time slots start time, in `HH:mm:ss` format @default 00:00:00 */\n startTime?: string;\n\n /** Time slots end time in `HH:mm:ss` format @default 23:59:59 */\n endTime?: string;\n\n /** Number of minutes for each time slot @default 15 */\n intervalMinutes?: number;\n\n /** If set, the all-day slot is displayed below the header @default true */\n withAllDaySlot?: boolean;\n\n /** Locale passed down to dayjs, overrides value defined on `DatesProvider` */\n locale?: string;\n\n /** Key of `theme.radius` or any valid CSS value to set `border-radius` @default theme.defaultRadius */\n radius?: MantineRadius;\n\n /** Dayjs format for slot labels or a callback function that returns formatted value @default HH:mm */\n slotLabelFormat?: DateLabelFormat;\n\n /** Date format in the header @default MMMM D, YYYY */\n headerFormat?: DateLabelFormat;\n\n /** If set, displays a line indicating the current time. By default, displayed only for the current day. */\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, 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 /** Height of 1hr slot @default 64px */\n slotHeight?: React.CSSProperties['height'];\n\n /** Height of all-day slot @default 44px */\n allDaySlotHeight?: React.CSSProperties['height'];\n\n /** Props passed down to the `ScrollArea.Autosize` component */\n scrollAreaProps?: ScrollAreaAutosizeProps & DataAttributes;\n\n /** Props passed down to `MoreEvents` component */\n moreEventsProps?: Partial<MoreEventsProps>;\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 /** 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 /** 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?: (date: 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 /** 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 DayViewFactory = Factory<{\n props: DayViewProps;\n ref: HTMLDivElement;\n stylesNames: DayViewStylesNames;\n vars: DayViewCssVariables;\n}>;\n\nconst defaultProps = {\n __staticSelector: 'DayView',\n startTime: '00:00:00',\n endTime: '23:59:59',\n intervalMinutes: 15,\n withAllDaySlot: true,\n slotLabelFormat: 'HH:mm',\n headerFormat: 'MMMM D, YYYY',\n withCurrentTimeBubble: true,\n withHeader: true,\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<DayViewProps>;\n\nconst varsResolver = createVarsResolver<DayViewFactory>(\n (_theme, { radius, slotHeight, allDaySlotHeight }) => ({\n dayView: {\n '--day-view-radius': radius !== undefined ? getRadius(radius) : undefined,\n '--day-view-slot-height': rem(slotHeight),\n '--day-view-all-day-slot-height': rem(allDaySlotHeight),\n },\n })\n);\n\nexport const DayView = factory<DayViewFactory>((_props) => {\n const props = useProps('DayView', defaultProps, _props);\n const {\n classNames,\n className,\n style,\n styles,\n unstyled,\n attributes,\n vars,\n __staticSelector,\n startTime,\n endTime,\n intervalMinutes,\n withAllDaySlot,\n date,\n locale,\n slotLabelFormat,\n headerFormat,\n withCurrentTimeIndicator = dayjs(date).isSame(dayjs(), 'day'),\n withCurrentTimeBubble,\n withHeader,\n radius,\n onDateChange,\n onViewChange,\n previousControlProps,\n nextControlProps,\n todayControlProps,\n viewSelectProps,\n slotHeight,\n allDaySlotHeight,\n scrollAreaProps,\n events,\n moreEventsProps,\n renderEventBody,\n renderEvent,\n labels,\n highlightBusinessHours,\n businessHours,\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 onExternalEventDrop,\n withEventResize,\n onEventResize,\n canResizeEvent,\n recurrenceExpansionLimit,\n getTimeSlotProps,\n ...others\n } = props;\n\n const getStyles = useStyles<DayViewFactory>({\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: 'dayView',\n });\n\n const { resolvedClassNames, resolvedStyles } = useResolvedStylesApi<DayViewFactory>({\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 ctx = useDatesContext();\n const slots = getDayTimeIntervals({ startTime, endTime, intervalMinutes });\n const slotsRef = useRef<HTMLButtonElement[]>([]);\n const viewportRef = useRef<HTMLDivElement>(null);\n const timeSlotsContainerRef = useRef<HTMLDivElement>(null);\n const mergedViewportRef = useMergedRef(viewportRef, scrollAreaProps?.viewportRef);\n\n useAutoScrollOnDrag({\n viewportRef,\n enabled: (withEventsDragAndDrop || !!onExternalEventDrop) && mode !== 'static',\n });\n\n useIsomorphicEffect(() => {\n if (!startScrollTime || !viewportRef.current || slotsRef.current.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 = slotsRef.current[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) => {\n const slotIndex = slotsRef.current.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 = slotsRef.current[0];\n const lastSlot = slotsRef.current[slotsRef.current.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 slotsRef.current.length - 1;\n }\n\n return null;\n }, []);\n\n const handleSlotKeyDown = (event: React.KeyboardEvent<HTMLButtonElement>, slotIndex: number) => {\n const direction = event.key;\n if (direction === 'ArrowDown' && slotIndex < slots.length - 1) {\n event.preventDefault();\n slotsRef.current[slotIndex + 1]?.focus();\n } else if (direction === 'ArrowUp' && slotIndex > 0) {\n event.preventDefault();\n slotsRef.current[slotIndex - 1]?.focus();\n }\n };\n\n const slotDragSelect = useSlotDragSelect({\n enabled: withDragSlotSelect && mode !== 'static',\n onDragEnd: (startIndex, endIndex) => {\n if (!onSlotDragEnd) {\n return;\n }\n const slotDate = dayjs(date).format('YYYY-MM-DD');\n onSlotDragEnd(\n `${slotDate} ${slots[startIndex].startTime}`,\n `${slotDate} ${slots[endIndex].endTime}`\n );\n },\n });\n\n const expandedEvents = expandRecurringEvents({\n events,\n rangeStart: dayjs(date).startOf('day').toDate(),\n rangeEnd: dayjs(date).endOf('day').toDate(),\n expansionLimit: recurrenceExpansionLimit,\n });\n\n const eventsData = getDayViewEvents({ events: expandedEvents, date, startTime, endTime });\n\n const handleExternalDrop = useCallback(\n (e: React.DragEvent, slotIndex: number) => {\n if (!onExternalEventDrop) {\n return;\n }\n const slotDate = dayjs(date).format('YYYY-MM-DD');\n onExternalEventDrop(e.dataTransfer, `${slotDate} ${slots[slotIndex].startTime}`);\n },\n [onExternalEventDrop, date, slots]\n );\n\n const dragDrop = useDragDropHandlers({\n enabled: withEventsDragAndDrop,\n mode,\n onEventDrop,\n canDragEvent,\n onEventDragStart,\n onEventDragEnd,\n calculateDropTarget: (slotIndex: number, draggedEvent: ScheduleEventData) => {\n const slotTime = slots[slotIndex].startTime;\n return calculateDropTime({\n draggedEvent,\n targetDate: date,\n targetSlotTime: slotTime,\n intervalMinutes,\n });\n },\n onExternalDrop: onExternalEventDrop ? handleExternalDrop : undefined,\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 eventsNodes = eventsData.regularEvents.map((event) => {\n const eventIsAllDay = isAllDayEvent({ event, date });\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 event={event}\n key={event.id}\n renderEventBody={renderEventBody}\n renderEvent={renderEvent}\n autoSize\n draggable={isDraggable}\n withResize={isResizable}\n isResizing={resizePosition !== null}\n onResizeStart={\n isResizable\n ? (edge, e) => {\n if (timeSlotsContainerRef.current) {\n eventResize.handleResizeStart({\n event,\n edge,\n container: timeSlotsContainerRef.current,\n originalTop: event.position.top,\n originalHeight: event.position.height,\n eventDate: dayjs(date).format('YYYY-MM-DD'),\n pointerEvent: e,\n });\n }\n }\n : undefined\n }\n mode={mode}\n onClick={onEventClick ? (e) => onEventClick(event, e) : undefined}\n {...stylesApiProps}\n style={{\n ...stylesApiProps.styles?.event,\n top: `${eventTop}%`,\n height: `${eventHeight}%`,\n insetInlineStart: `${event.position.offset}%`,\n width: `${event.position.width}%`,\n position: 'absolute',\n }}\n />\n );\n });\n\n const allDayEventsCount = getVisibleEvents({\n maxEvents: 2,\n totalEvents: eventsData.allDayEvents.length,\n });\n\n const allDayEventsNodes = eventsData.allDayEvents\n .slice(0, allDayEventsCount.visibleEventsCount)\n .map((event) => (\n <ScheduleEvent\n key={event.id}\n event={event}\n renderEventBody={renderEventBody}\n renderEvent={renderEvent}\n style={{ maxHeight: '50%' }}\n nowrap\n autoSize\n mode={mode}\n onClick={onEventClick ? (e) => onEventClick(event, e) : undefined}\n {...stylesApiProps}\n />\n ));\n\n const dayGroup = dayjs(date).format('YYYY-MM-DD');\n\n const items = slots.map((slot, index) => {\n const isDropTarget = dragDrop.isDropTarget(index);\n const isDragSelected = slotDragSelect.isSlotSelected(index, dayGroup);\n const slotStart = `${dayGroup} ${slot.startTime}` as DateTimeStringValue;\n const slotEnd = `${dayGroup} ${slot.endTime}` as DateTimeStringValue;\n const { onClick: externalOnClick, ...externalSlotProps } =\n getTimeSlotProps?.({ start: slotStart, end: slotEnd }) || {};\n\n const handleClick =\n mode === 'static'\n ? undefined\n : (event: React.MouseEvent<HTMLButtonElement>) => {\n onTimeSlotClick?.({\n slotStart,\n slotEnd,\n nativeEvent: event,\n });\n externalOnClick?.(event);\n };\n\n return (\n <UnstyledButton\n {...getStyles('dayViewSlot')}\n key={slot.startTime}\n ref={(node) => {\n slotsRef.current[index] = node!;\n }}\n mod={{\n 'hour-start': slot.isHourStart,\n ...getBusinessHoursMod({\n time: slot.startTime,\n businessHours,\n highlightBusinessHours,\n }),\n 'drop-target': isDropTarget,\n 'drag-selected': isDragSelected,\n static: mode === 'static',\n }}\n __vars={{ '--slot-size': `${clampIntervalMinutes(intervalMinutes) / 60}` }}\n aria-label={`${getLabel('timeSlot', labels)} ${slot.startTime} - ${slot.endTime}`}\n tabIndex={mode === 'static' ? -1 : index === 0 ? 0 : -1}\n data-drag-slot-index={withDragSlotSelect && mode !== 'static' ? index : undefined}\n data-drag-slot-group={withDragSlotSelect && mode !== 'static' ? dayGroup : undefined}\n onKeyDown={mode === 'static' ? undefined : (e) => handleSlotKeyDown(e, index)}\n onPointerDown={\n withDragSlotSelect && mode !== 'static'\n ? (e) => slotDragSelect.handleSlotPointerDown(e, index, dayGroup)\n : undefined\n }\n onClick={handleClick}\n onDragOver={withDragHandlers ? (event) => event.preventDefault() : undefined}\n {...externalSlotProps}\n />\n );\n });\n\n const slotsLabels = slots.reduce<React.ReactNode[]>((acc, slot) => {\n if (slot.isHourStart) {\n const slotTime = dayjs(`${dayjs(date).format('YYYY-MM-DD')} ${slot.startTime}`);\n const label = formatDate({\n locale: ctx.getLocale(locale),\n date: slotTime,\n format: slotLabelFormat,\n });\n\n acc.push(\n <Box\n {...getStyles('dayViewSlotLabel')}\n key={slot.startTime}\n mod={getBusinessHoursMod({\n time: slot.startTime,\n businessHours,\n highlightBusinessHours,\n })}\n >\n {label}\n </Box>\n );\n }\n return acc;\n }, []);\n\n const backgroundAllDayEventNodes = eventsData.backgroundAllDayEvents.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}`,\n ...getStyles('dayViewBackgroundEvent', {\n style: { top: 0, height: '100%', width: '100%' },\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 backgroundTimedEventNodes = eventsData.backgroundTimedEvents.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: event.id,\n ...getStyles('dayViewBackgroundEvent', {\n style: {\n top: `calc(${event.position.top}% + 1px)`,\n height: `calc(${event.position.height}% - 2px)`,\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 content = (\n <Box\n {...getStyles('dayView')}\n mod={{ static: mode === 'static', 'slot-dragging': slotDragSelect.isDragging }}\n {...others}\n >\n {withHeader && (\n <ScheduleHeaderBase\n view=\"day\"\n navigationHandlers={{\n previous: () => toDateString(dayjs(date).subtract(1, 'day')),\n next: () => toDateString(dayjs(date).add(1, 'day')),\n today: () => toDateString(dayjs()),\n }}\n control={{\n title: formatDate({ locale: ctx.getLocale(locale), date, format: headerFormat }),\n miw: 140,\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 <ScrollArea.Autosize\n scrollbarSize={4}\n {...scrollAreaProps}\n {...getStyles('dayViewScrollArea', {\n className: scrollAreaProps?.className,\n style: scrollAreaProps?.style,\n })}\n viewportRef={mergedViewportRef}\n >\n <Box {...getStyles('dayViewInner')}>\n <div {...getStyles('dayViewSlotLabels')}>\n {withAllDaySlot && (\n <Box {...getStyles('dayViewSlotLabel')} mod={{ 'all-day': true }}>\n {getLabel('allDay', labels)}\n </Box>\n )}\n {slotsLabels}\n </div>\n\n <div {...getStyles('dayViewSlots')}>\n {withAllDaySlot && (\n <div {...getStyles('dayViewAllDay')}>\n {backgroundAllDayEventNodes}\n <div {...getStyles('dayViewAllDayEvents')}>\n {allDayEventsNodes}\n {allDayEventsCount.hiddenEventsCount > 0 && (\n <MoreEvents\n events={eventsData.allDayEvents}\n moreEventsCount={allDayEventsCount.hiddenEventsCount}\n renderEventBody={renderEventBody}\n mode={mode}\n {...stylesApiProps}\n {...moreEventsProps}\n />\n )}\n </div>\n <UnstyledButton\n {...getStyles('dayViewSlot')}\n mod={{ 'all-day': true, static: mode === 'static' }}\n aria-label={`${getLabel('timeSlot', labels)} ${getLabel('allDay', labels)}`}\n onClick={\n mode === 'static' || !onAllDaySlotClick\n ? undefined\n : (e) => {\n onAllDaySlotClick(dayjs(date).format('YYYY-MM-DD'), e);\n }\n }\n />\n </div>\n )}\n\n <div\n ref={timeSlotsContainerRef}\n {...getStyles('dayViewTimeSlots')}\n onDragOver={\n withDragHandlers\n ? (event) => {\n const slotIndex = getSlotIndexFromDragPoint(event);\n if (slotIndex !== null) {\n dragDrop.handleDragOver(event, slotIndex);\n }\n }\n : undefined\n }\n onDragLeave={withDragHandlers ? dragDrop.handleDragLeave : undefined}\n onDrop={\n withDragHandlers\n ? (event) => {\n const slotIndex = getSlotIndexFromDragPoint(event);\n if (slotIndex !== null) {\n dragDrop.handleDrop(event, slotIndex);\n }\n }\n : undefined\n }\n >\n {backgroundTimedEventNodes}\n\n {eventsNodes}\n\n {withCurrentTimeIndicator && (\n <CurrentTimeIndicator\n startOffset=\"calc(var(--day-view-slot-labels-width) * -1)\"\n endOffset=\"0rem\"\n topOffset=\"0rem\"\n timeBubbleStartOffset=\"calc(var(--day-view-slot-labels-width) * -1 + 30px)\"\n currentTimeFormat={slotLabelFormat}\n withTimeBubble={withCurrentTimeBubble}\n withThumb={!withCurrentTimeBubble}\n locale={locale}\n startTime={startTime}\n endTime={endTime}\n {...stylesApiProps}\n />\n )}\n {items}\n </div>\n </div>\n </Box>\n </ScrollArea.Autosize>\n </Box>\n );\n\n if (withEventsDragAndDrop) {\n return <DragContext.Provider value={dragDrop.dragContextValue}>{content}</DragContext.Provider>;\n }\n\n return content;\n});\n\nDayView.displayName = '@mantine/schedule/DayView';\nDayView.classes = classes;\nDayView.varsResolver = varsResolver;\n\nexport namespace DayView {\n export type Props = DayViewProps;\n export type Factory = DayViewFactory;\n export type StylesNames = DayViewStylesNames;\n export type CssVariables = DayViewCssVariables;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"DayView.mjs","names":["classes"],"sources":["../../../src/components/DayView/DayView.tsx"],"sourcesContent":["import dayjs from 'dayjs';\nimport { useCallback, 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 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 ScheduleEventData,\n ScheduleMode,\n ScheduleViewLevel,\n} from '../../types';\nimport {\n calculateDropTime,\n clampIntervalMinutes,\n expandRecurringEvents,\n formatDate,\n getBusinessHoursMod,\n getDayTimeIntervals,\n getVisibleEvents,\n isAllDayEvent,\n toDateString,\n} from '../../utils';\nimport {\n CurrentTimeIndicator,\n CurrentTimeIndicatorStylesNames,\n} from '../CurrentTimeIndicator/CurrentTimeIndicator';\nimport { DragContext } from '../DragContext/DragContext';\nimport { MoreEvents, MoreEventsProps, MoreEventsStylesNames } from '../MoreEvents/MoreEvents';\nimport {\n RenderEvent,\n RenderEventBody,\n ScheduleEvent,\n ScheduleEventStylesNames,\n} from '../ScheduleEvent/ScheduleEvent';\nimport { MonthYearSelectStylesNames } from '../ScheduleHeader/MonthYearSelect/MonthYearSelect';\nimport { CombinedScheduleHeaderStylesNames } from '../ScheduleHeader/ScheduleHeader';\nimport { ScheduleHeaderBase } from '../ScheduleHeader/ScheduleHeaderBase';\nimport { ViewSelectProps } from '../ScheduleHeader/ViewSelect/ViewSelect';\nimport { getDayViewEvents } from './get-day-view-events/get-day-view-events';\nimport classes from './DayView.module.css';\n\nexport type DayViewStylesNames =\n | 'dayView'\n | 'dayViewInner'\n | 'dayViewScrollArea'\n | 'dayViewAllDay'\n | 'dayViewAllDayEvents'\n | 'dayViewSlot'\n | 'dayViewSlots'\n | 'dayViewTimeSlots'\n | 'dayViewSlotLabel'\n | 'dayViewSlotLabels'\n | 'dayViewBackgroundEvent'\n | MoreEventsStylesNames\n | ScheduleEventStylesNames\n | Exclude<CombinedScheduleHeaderStylesNames, MonthYearSelectStylesNames>\n | CurrentTimeIndicatorStylesNames;\n\nexport type DayViewCssVariables = {\n dayView: '--day-view-radius' | '--day-view-slot-height' | '--day-view-all-day-slot-height';\n};\n\nexport interface DayViewProps\n extends BoxProps, StylesApiProps<DayViewFactory>, ElementProps<'div'> {\n __staticSelector?: string;\n\n /** Day to display, Date object or date string in `YYYY-MM-DD` format */\n date: Date | DateStringValue;\n\n /** Called when date is changed */\n onDateChange?: (date: DateStringValue) => void;\n\n /** Events to display, must be a stable reference */\n events?: ScheduleEventData[];\n\n /** Time slots start time, in `HH:mm:ss` format @default 00:00:00 */\n startTime?: string;\n\n /** Time slots end time in `HH:mm:ss` format @default 23:59:59 */\n endTime?: string;\n\n /** Number of minutes for each time slot @default 15 */\n intervalMinutes?: number;\n\n /** If set, the all-day slot is displayed below the header @default true */\n withAllDaySlot?: boolean;\n\n /** Locale passed down to dayjs, overrides value defined on `DatesProvider` */\n locale?: string;\n\n /** Key of `theme.radius` or any valid CSS value to set `border-radius` @default theme.defaultRadius */\n radius?: MantineRadius;\n\n /** Dayjs format for slot labels or a callback function that returns formatted value @default HH:mm */\n slotLabelFormat?: DateLabelFormat;\n\n /** Date format in the header @default MMMM D, YYYY */\n headerFormat?: DateLabelFormat;\n\n /** If set, displays a line indicating the current time. By default, displayed only for the current day. */\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, 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 /** Height of 1hr slot @default 64px */\n slotHeight?: React.CSSProperties['height'];\n\n /** Height of all-day slot @default 44px */\n allDaySlotHeight?: React.CSSProperties['height'];\n\n /** Props passed down to the `ScrollArea.Autosize` component */\n scrollAreaProps?: ScrollAreaAutosizeProps & DataAttributes;\n\n /** Props passed down to `MoreEvents` component */\n moreEventsProps?: Partial<MoreEventsProps>;\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 /** 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 /** 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?: (date: 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 /** 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 DayViewFactory = Factory<{\n props: DayViewProps;\n ref: HTMLDivElement;\n stylesNames: DayViewStylesNames;\n vars: DayViewCssVariables;\n}>;\n\nconst defaultProps = {\n __staticSelector: 'DayView',\n startTime: '00:00:00',\n endTime: '23:59:59',\n intervalMinutes: 15,\n withAllDaySlot: true,\n slotLabelFormat: 'HH:mm',\n headerFormat: 'MMMM D, YYYY',\n withCurrentTimeBubble: true,\n withHeader: true,\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<DayViewProps>;\n\nconst varsResolver = createVarsResolver<DayViewFactory>(\n (_theme, { radius, slotHeight, allDaySlotHeight }) => ({\n dayView: {\n '--day-view-radius': radius !== undefined ? getRadius(radius) : undefined,\n '--day-view-slot-height': rem(slotHeight),\n '--day-view-all-day-slot-height': rem(allDaySlotHeight),\n },\n })\n);\n\nexport const DayView = factory<DayViewFactory>((_props) => {\n const props = useProps('DayView', defaultProps, _props);\n const {\n classNames,\n className,\n style,\n styles,\n unstyled,\n attributes,\n vars,\n __staticSelector,\n startTime,\n endTime,\n intervalMinutes,\n withAllDaySlot,\n date,\n locale,\n slotLabelFormat,\n headerFormat,\n withCurrentTimeIndicator = dayjs(date).isSame(dayjs(), 'day'),\n withCurrentTimeBubble,\n withHeader,\n radius,\n onDateChange,\n onViewChange,\n previousControlProps,\n nextControlProps,\n todayControlProps,\n viewSelectProps,\n slotHeight,\n allDaySlotHeight,\n scrollAreaProps,\n events,\n moreEventsProps,\n renderEventBody,\n renderEvent,\n labels,\n highlightBusinessHours,\n businessHours,\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 onExternalEventDrop,\n withEventResize,\n onEventResize,\n canResizeEvent,\n recurrenceExpansionLimit,\n getTimeSlotProps,\n ...others\n } = props;\n\n const getStyles = useStyles<DayViewFactory>({\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: 'dayView',\n });\n\n const { resolvedClassNames, resolvedStyles } = useResolvedStylesApi<DayViewFactory>({\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 ctx = useDatesContext();\n const slots = getDayTimeIntervals({ startTime, endTime, intervalMinutes });\n const slotsRef = useRef<HTMLButtonElement[]>([]);\n const viewportRef = useRef<HTMLDivElement>(null);\n const timeSlotsContainerRef = useRef<HTMLDivElement>(null);\n const mergedViewportRef = useMergedRef(viewportRef, scrollAreaProps?.viewportRef);\n\n useAutoScrollOnDrag({\n viewportRef,\n enabled: (withEventsDragAndDrop || !!onExternalEventDrop) && mode !== 'static',\n });\n\n useIsomorphicEffect(() => {\n if (!startScrollTime || !viewportRef.current || slotsRef.current.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 = slotsRef.current[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) => {\n const slotIndex = slotsRef.current.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 = slotsRef.current[0];\n const lastSlot = slotsRef.current[slotsRef.current.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 slotsRef.current.length - 1;\n }\n\n return null;\n }, []);\n\n const handleSlotKeyDown = (event: React.KeyboardEvent<HTMLButtonElement>, slotIndex: number) => {\n const direction = event.key;\n if (direction === 'ArrowDown' && slotIndex < slots.length - 1) {\n event.preventDefault();\n slotsRef.current[slotIndex + 1]?.focus();\n } else if (direction === 'ArrowUp' && slotIndex > 0) {\n event.preventDefault();\n slotsRef.current[slotIndex - 1]?.focus();\n }\n };\n\n const slotDragSelect = useSlotDragSelect({\n enabled: withDragSlotSelect && mode !== 'static',\n onDragEnd: (startIndex, endIndex) => {\n if (!onSlotDragEnd) {\n return;\n }\n const slotDate = dayjs(date).format('YYYY-MM-DD');\n onSlotDragEnd(\n `${slotDate} ${slots[startIndex].startTime}`,\n `${slotDate} ${slots[endIndex].endTime}`\n );\n },\n });\n\n const expandedEvents = expandRecurringEvents({\n events,\n rangeStart: dayjs(date).startOf('day').toDate(),\n rangeEnd: dayjs(date).endOf('day').toDate(),\n expansionLimit: recurrenceExpansionLimit,\n });\n\n const eventsData = getDayViewEvents({ events: expandedEvents, date, startTime, endTime });\n\n const handleExternalDrop = useCallback(\n (e: React.DragEvent, slotIndex: number) => {\n if (!onExternalEventDrop) {\n return;\n }\n const slotDate = dayjs(date).format('YYYY-MM-DD');\n onExternalEventDrop(e.dataTransfer, `${slotDate} ${slots[slotIndex].startTime}`);\n },\n [onExternalEventDrop, date, slots]\n );\n\n const dragDrop = useDragDropHandlers({\n enabled: withEventsDragAndDrop,\n mode,\n onEventDrop,\n canDragEvent,\n onEventDragStart,\n onEventDragEnd,\n calculateDropTarget: (slotIndex: number, draggedEvent: ScheduleEventData) => {\n const slotTime = slots[slotIndex].startTime;\n return calculateDropTime({\n draggedEvent,\n targetDate: date,\n targetSlotTime: slotTime,\n intervalMinutes,\n });\n },\n onExternalDrop: onExternalEventDrop ? handleExternalDrop : undefined,\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 eventsNodes = eventsData.regularEvents.map((event) => {\n const eventIsAllDay = isAllDayEvent({ event, date });\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 event={event}\n key={event.id}\n renderEventBody={renderEventBody}\n renderEvent={renderEvent}\n autoSize\n draggable={isDraggable}\n withResize={isResizable}\n isResizing={resizePosition !== null}\n onResizeStart={\n isResizable\n ? (edge, e) => {\n if (timeSlotsContainerRef.current) {\n eventResize.handleResizeStart({\n event,\n edge,\n container: timeSlotsContainerRef.current,\n originalTop: event.position.top,\n originalHeight: event.position.height,\n eventDate: dayjs(date).format('YYYY-MM-DD'),\n pointerEvent: e,\n });\n }\n }\n : undefined\n }\n mode={mode}\n onClick={\n onEventClick\n ? (e) => {\n if (!eventResize.wasResizing()) {\n onEventClick(event, e);\n }\n }\n : undefined\n }\n {...stylesApiProps}\n style={{\n ...stylesApiProps.styles?.event,\n top: `${eventTop}%`,\n height: `${eventHeight}%`,\n insetInlineStart: `${event.position.offset}%`,\n width: `${event.position.width}%`,\n position: 'absolute',\n }}\n />\n );\n });\n\n const allDayEventsCount = getVisibleEvents({\n maxEvents: 2,\n totalEvents: eventsData.allDayEvents.length,\n });\n\n const allDayEventsNodes = eventsData.allDayEvents\n .slice(0, allDayEventsCount.visibleEventsCount)\n .map((event) => (\n <ScheduleEvent\n key={event.id}\n event={event}\n renderEventBody={renderEventBody}\n renderEvent={renderEvent}\n style={{ maxHeight: '50%' }}\n nowrap\n autoSize\n mode={mode}\n onClick={onEventClick ? (e) => onEventClick(event, e) : undefined}\n {...stylesApiProps}\n />\n ));\n\n const dayGroup = dayjs(date).format('YYYY-MM-DD');\n\n const items = slots.map((slot, index) => {\n const isDropTarget = dragDrop.isDropTarget(index);\n const isDragSelected = slotDragSelect.isSlotSelected(index, dayGroup);\n const slotStart = `${dayGroup} ${slot.startTime}` as DateTimeStringValue;\n const slotEnd = `${dayGroup} ${slot.endTime}` as DateTimeStringValue;\n const { onClick: externalOnClick, ...externalSlotProps } =\n getTimeSlotProps?.({ start: slotStart, end: slotEnd }) || {};\n\n const handleClick =\n mode === 'static'\n ? undefined\n : (event: React.MouseEvent<HTMLButtonElement>) => {\n onTimeSlotClick?.({\n slotStart,\n slotEnd,\n nativeEvent: event,\n });\n externalOnClick?.(event);\n };\n\n return (\n <UnstyledButton\n {...getStyles('dayViewSlot')}\n key={slot.startTime}\n ref={(node) => {\n slotsRef.current[index] = node!;\n }}\n mod={{\n 'hour-start': slot.isHourStart,\n ...getBusinessHoursMod({\n time: slot.startTime,\n businessHours,\n highlightBusinessHours,\n }),\n 'drop-target': isDropTarget,\n 'drag-selected': isDragSelected,\n static: mode === 'static',\n }}\n __vars={{ '--slot-size': `${clampIntervalMinutes(intervalMinutes) / 60}` }}\n aria-label={`${getLabel('timeSlot', labels)} ${slot.startTime} - ${slot.endTime}`}\n tabIndex={mode === 'static' ? -1 : index === 0 ? 0 : -1}\n data-drag-slot-index={withDragSlotSelect && mode !== 'static' ? index : undefined}\n data-drag-slot-group={withDragSlotSelect && mode !== 'static' ? dayGroup : undefined}\n onKeyDown={mode === 'static' ? undefined : (e) => handleSlotKeyDown(e, index)}\n onPointerDown={\n withDragSlotSelect && mode !== 'static'\n ? (e) => slotDragSelect.handleSlotPointerDown(e, index, dayGroup)\n : undefined\n }\n onClick={handleClick}\n onDragOver={withDragHandlers ? (event) => event.preventDefault() : undefined}\n {...externalSlotProps}\n />\n );\n });\n\n const slotsLabels = slots.reduce<React.ReactNode[]>((acc, slot) => {\n if (slot.isHourStart) {\n const slotTime = dayjs(`${dayjs(date).format('YYYY-MM-DD')} ${slot.startTime}`);\n const label = formatDate({\n locale: ctx.getLocale(locale),\n date: slotTime,\n format: slotLabelFormat,\n });\n\n acc.push(\n <Box\n {...getStyles('dayViewSlotLabel')}\n key={slot.startTime}\n mod={getBusinessHoursMod({\n time: slot.startTime,\n businessHours,\n highlightBusinessHours,\n })}\n >\n {label}\n </Box>\n );\n }\n return acc;\n }, []);\n\n const backgroundAllDayEventNodes = eventsData.backgroundAllDayEvents.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}`,\n ...getStyles('dayViewBackgroundEvent', {\n style: { top: 0, height: '100%', width: '100%' },\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 backgroundTimedEventNodes = eventsData.backgroundTimedEvents.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: event.id,\n ...getStyles('dayViewBackgroundEvent', {\n style: {\n top: `calc(${event.position.top}% + 1px)`,\n height: `calc(${event.position.height}% - 2px)`,\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 content = (\n <Box\n {...getStyles('dayView')}\n mod={{ static: mode === 'static', 'slot-dragging': slotDragSelect.isDragging }}\n {...others}\n >\n {withHeader && (\n <ScheduleHeaderBase\n view=\"day\"\n navigationHandlers={{\n previous: () => toDateString(dayjs(date).subtract(1, 'day')),\n next: () => toDateString(dayjs(date).add(1, 'day')),\n today: () => toDateString(dayjs()),\n }}\n control={{\n title: formatDate({ locale: ctx.getLocale(locale), date, format: headerFormat }),\n miw: 140,\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 <ScrollArea.Autosize\n scrollbarSize={4}\n {...scrollAreaProps}\n {...getStyles('dayViewScrollArea', {\n className: scrollAreaProps?.className,\n style: scrollAreaProps?.style,\n })}\n viewportRef={mergedViewportRef}\n >\n <Box {...getStyles('dayViewInner')}>\n <div {...getStyles('dayViewSlotLabels')}>\n {withAllDaySlot && (\n <Box {...getStyles('dayViewSlotLabel')} mod={{ 'all-day': true }}>\n {getLabel('allDay', labels)}\n </Box>\n )}\n {slotsLabels}\n </div>\n\n <div {...getStyles('dayViewSlots')}>\n {withAllDaySlot && (\n <div {...getStyles('dayViewAllDay')}>\n {backgroundAllDayEventNodes}\n <div {...getStyles('dayViewAllDayEvents')}>\n {allDayEventsNodes}\n {allDayEventsCount.hiddenEventsCount > 0 && (\n <MoreEvents\n events={eventsData.allDayEvents}\n moreEventsCount={allDayEventsCount.hiddenEventsCount}\n renderEventBody={renderEventBody}\n mode={mode}\n {...stylesApiProps}\n {...moreEventsProps}\n />\n )}\n </div>\n <UnstyledButton\n {...getStyles('dayViewSlot')}\n mod={{ 'all-day': true, static: mode === 'static' }}\n aria-label={`${getLabel('timeSlot', labels)} ${getLabel('allDay', labels)}`}\n onClick={\n mode === 'static' || !onAllDaySlotClick\n ? undefined\n : (e) => {\n onAllDaySlotClick(dayjs(date).format('YYYY-MM-DD'), e);\n }\n }\n />\n </div>\n )}\n\n <div\n ref={timeSlotsContainerRef}\n {...getStyles('dayViewTimeSlots')}\n onDragOver={\n withDragHandlers\n ? (event) => {\n const slotIndex = getSlotIndexFromDragPoint(event);\n if (slotIndex !== null) {\n dragDrop.handleDragOver(event, slotIndex);\n }\n }\n : undefined\n }\n onDragLeave={withDragHandlers ? dragDrop.handleDragLeave : undefined}\n onDrop={\n withDragHandlers\n ? (event) => {\n const slotIndex = getSlotIndexFromDragPoint(event);\n if (slotIndex !== null) {\n dragDrop.handleDrop(event, slotIndex);\n }\n }\n : undefined\n }\n >\n {backgroundTimedEventNodes}\n\n {eventsNodes}\n\n {withCurrentTimeIndicator && (\n <CurrentTimeIndicator\n startOffset=\"calc(var(--day-view-slot-labels-width) * -1)\"\n endOffset=\"0rem\"\n topOffset=\"0rem\"\n timeBubbleStartOffset=\"calc(var(--day-view-slot-labels-width) * -1 + 30px)\"\n currentTimeFormat={slotLabelFormat}\n withTimeBubble={withCurrentTimeBubble}\n withThumb={!withCurrentTimeBubble}\n locale={locale}\n startTime={startTime}\n endTime={endTime}\n {...stylesApiProps}\n />\n )}\n {items}\n </div>\n </div>\n </Box>\n </ScrollArea.Autosize>\n </Box>\n );\n\n if (withEventsDragAndDrop) {\n return <DragContext.Provider value={dragDrop.dragContextValue}>{content}</DragContext.Provider>;\n }\n\n return content;\n});\n\nDayView.displayName = '@mantine/schedule/DayView';\nDayView.classes = classes;\nDayView.varsResolver = varsResolver;\n\nexport namespace DayView {\n export type Props = DayViewProps;\n export type Factory = DayViewFactory;\n export type StylesNames = DayViewStylesNames;\n export type CssVariables = DayViewCssVariables;\n}\n"],"mappings":"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"}
@@ -7,7 +7,8 @@ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
7
7
  //#region packages/@mantine/schedule/src/components/ScheduleEvent/ScheduleEvent.tsx
8
8
  const defaultProps = {
9
9
  __staticSelector: "ScheduleEvent",
10
- mode: "default"
10
+ mode: "default",
11
+ radius: "sm"
11
12
  };
12
13
  const varsResolver = createVarsResolver((theme, { event, variant, radius }) => {
13
14
  const colors = theme.variantColorResolver({
@@ -89,6 +90,7 @@ const ScheduleEvent = factory((_props) => {
89
90
  ] });
90
91
  const rootProps = {
91
92
  ...getStyles("event"),
93
+ "data-event-id": event.id,
92
94
  size,
93
95
  title: event.title,
94
96
  mod: [{
@@ -1 +1 @@
1
- {"version":3,"file":"ScheduleEvent.mjs","names":["classes"],"sources":["../../../src/components/ScheduleEvent/ScheduleEvent.tsx"],"sourcesContent":["import { use, useEffect, useRef } from 'react';\nimport {\n Box,\n BoxProps,\n createVarsResolver,\n ElementProps,\n factory,\n Factory,\n getRadius,\n MantineRadius,\n StylesApiProps,\n UnstyledButton,\n useProps,\n useStyles,\n} from '@mantine/core';\nimport { ScheduleEventData, ScheduleMode } from '../../types';\nimport { DragContext } from '../DragContext/DragContext';\nimport classes from './ScheduleEvent.module.css';\n\nexport type ScheduleEventStylesNames = 'event' | 'eventInner' | 'eventResizeHandle';\n\nexport type ScheduleEventVariant = 'filled' | 'light';\nexport type ScheduleEventCssVariables = {\n event: '--event-bg' | '--event-color' | '--event-radius' | '--event-hover';\n};\n\nexport type RenderEventBody = (event: ScheduleEventData<any>) => React.ReactNode;\n\nexport type RenderEvent = (\n event: ScheduleEventData,\n props: React.ComponentPropsWithoutRef<'button'> & { children: React.ReactNode }\n) => React.ReactElement;\n\nexport interface ScheduleEventProps\n extends BoxProps, StylesApiProps<ScheduleEventFactory>, ElementProps<'button'> {\n __staticSelector?: string;\n\n /** Event to display */\n event: 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, event has `white-space: nowrap` @default false */\n nowrap?: boolean;\n\n /** If set, event shrinks its font-size with limited height @default false */\n autoSize?: boolean;\n\n /** Event size @default 'sm' */\n size?: 'sm' | 'md' | (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 /** Event hanging position */\n hanging?: 'start' | 'end' | 'both' | 'none';\n\n /** If true, event can be dragged @default false */\n draggable?: boolean;\n\n /** Called when event drag starts */\n onEventDragStart?: (event: ScheduleEventData) => void;\n\n /** Called when event drag ends */\n onEventDragEnd?: () => void;\n\n /** If true, event is currently being dragged @default false */\n isDragging?: boolean;\n\n /** Interaction mode: 'default' allows all interactions, 'static' disables event interactions @default default */\n mode?: ScheduleMode;\n\n /** If true, event can be resized by dragging its edges @default false */\n withResize?: boolean;\n\n /** Called when resize starts on an edge */\n onResizeStart?: (edge: 'top' | 'bottom', e: React.PointerEvent) => void;\n\n /** If true, event is currently being resized @default false */\n isResizing?: boolean;\n}\n\nexport type ScheduleEventFactory = Factory<{\n props: ScheduleEventProps;\n ref: HTMLButtonElement;\n stylesNames: ScheduleEventStylesNames;\n vars: ScheduleEventCssVariables;\n variant: ScheduleEventVariant;\n}>;\n\nconst defaultProps = {\n __staticSelector: 'ScheduleEvent',\n mode: 'default',\n} satisfies Partial<ScheduleEventProps>;\n\nconst varsResolver = createVarsResolver<ScheduleEventFactory>(\n (theme, { event, variant, radius }) => {\n const colors = theme.variantColorResolver({\n color: event.color || theme.primaryColor,\n theme,\n variant: variant || event.variant || 'light',\n autoContrast: true,\n });\n\n return {\n event: {\n '--event-bg': colors.background,\n '--event-hover': colors.hover,\n '--event-color': colors.color,\n '--event-radius': getRadius(radius),\n },\n };\n }\n);\n\nexport const ScheduleEvent = factory<ScheduleEventFactory>((_props) => {\n const props = useProps('ScheduleEvent', defaultProps, _props);\n const {\n classNames,\n className,\n style,\n styles,\n unstyled,\n vars,\n attributes,\n children,\n nowrap,\n radius,\n color,\n __staticSelector,\n event,\n renderEventBody,\n renderEvent,\n size,\n autoSize,\n mod,\n hanging,\n draggable = false,\n onEventDragStart,\n onEventDragEnd,\n isDragging = false,\n mode,\n withResize = false,\n onResizeStart,\n isResizing = false,\n ...others\n } = props;\n\n const ctx = use(DragContext);\n\n const getStyles = useStyles<ScheduleEventFactory>({\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: 'event',\n });\n\n const handleDragStart = (e: React.DragEvent<HTMLButtonElement>) => {\n if (!draggable) {\n e.preventDefault();\n return;\n }\n\n e.dataTransfer.effectAllowed = 'move';\n e.dataTransfer.setData('application/json', JSON.stringify({ eventId: event.id }));\n onEventDragStart?.(event);\n ctx.onDragStart?.(event);\n };\n\n const handleDragEnd = () => {\n onEventDragEnd?.();\n ctx.onDragEnd?.();\n };\n\n const isCurrentlyDragging = isDragging || ctx.draggedEventId === event.id;\n const isAnyEventDragging = ctx.isDragging || false;\n\n const dragEndRef = useRef(ctx.onDragEnd);\n dragEndRef.current = ctx.onDragEnd;\n\n useEffect(() => {\n if (isCurrentlyDragging) {\n return () => {\n dragEndRef.current?.();\n };\n }\n return undefined;\n }, [isCurrentlyDragging]);\n\n const showResizeHandles = withResize && mode !== 'static';\n\n const eventChildren = (\n <>\n {showResizeHandles && (\n <Box\n {...getStyles('eventResizeHandle')}\n mod={{ edge: 'top' }}\n onPointerDown={(e: React.PointerEvent) => onResizeStart?.('top', e)}\n />\n )}\n <Box mod={{ nowrap, size, autoSize, hanging }} {...getStyles('eventInner')}>\n {typeof renderEventBody === 'function' ? renderEventBody(event) : event.title}\n </Box>\n {showResizeHandles && (\n <Box\n {...getStyles('eventResizeHandle')}\n mod={{ edge: 'bottom' }}\n onPointerDown={(e: React.PointerEvent) => onResizeStart?.('bottom', e)}\n />\n )}\n </>\n );\n\n const rootProps = {\n ...getStyles('event'),\n size,\n title: event.title,\n mod: [\n {\n autoSize,\n hanging,\n draggable,\n dragging: isCurrentlyDragging,\n 'any-dragging': isAnyEventDragging,\n static: mode === 'static',\n resizing: isResizing,\n resizable: showResizeHandles,\n },\n mod,\n ],\n draggable: draggable && mode !== 'static',\n tabIndex: mode === 'static' ? -1 : 0,\n onDragStart: mode === 'static' ? undefined : handleDragStart,\n onDragEnd: mode === 'static' ? undefined : handleDragEnd,\n onClick: mode === 'static' ? undefined : others.onClick,\n ...others,\n children: eventChildren,\n };\n\n if (typeof renderEvent === 'function') {\n return renderEvent(event, rootProps);\n }\n\n return <UnstyledButton {...rootProps} />;\n});\n\nScheduleEvent.displayName = '@mantine/schedule/ScheduleEvent';\nScheduleEvent.classes = classes;\nScheduleEvent.varsResolver = varsResolver;\n"],"mappings":"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"}
1
+ {"version":3,"file":"ScheduleEvent.mjs","names":["classes"],"sources":["../../../src/components/ScheduleEvent/ScheduleEvent.tsx"],"sourcesContent":["import { use, useEffect, useRef } from 'react';\nimport {\n Box,\n BoxProps,\n createVarsResolver,\n ElementProps,\n factory,\n Factory,\n getRadius,\n MantineRadius,\n StylesApiProps,\n UnstyledButton,\n useProps,\n useStyles,\n} from '@mantine/core';\nimport { ScheduleEventData, ScheduleMode } from '../../types';\nimport { DragContext } from '../DragContext/DragContext';\nimport classes from './ScheduleEvent.module.css';\n\nexport type ScheduleEventStylesNames = 'event' | 'eventInner' | 'eventResizeHandle';\n\nexport type ScheduleEventVariant = 'filled' | 'light';\nexport type ScheduleEventCssVariables = {\n event: '--event-bg' | '--event-color' | '--event-radius' | '--event-hover';\n};\n\nexport type RenderEventBody = (event: ScheduleEventData<any>) => React.ReactNode;\n\nexport type RenderEvent = (\n event: ScheduleEventData,\n props: React.ComponentPropsWithoutRef<'button'> & { children: React.ReactNode }\n) => React.ReactElement;\n\nexport interface ScheduleEventProps\n extends BoxProps, StylesApiProps<ScheduleEventFactory>, ElementProps<'button'> {\n __staticSelector?: string;\n\n /** Event to display */\n event: ScheduleEventData;\n\n /** Key of `theme.radius` or any valid CSS value to set border-radius @default 'sm' */\n radius?: MantineRadius;\n\n /** If set, event has `white-space: nowrap` @default false */\n nowrap?: boolean;\n\n /** If set, event shrinks its font-size with limited height @default false */\n autoSize?: boolean;\n\n /** Event size @default 'sm' */\n size?: 'sm' | 'md' | (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 /** Event hanging position */\n hanging?: 'start' | 'end' | 'both' | 'none';\n\n /** If true, event can be dragged @default false */\n draggable?: boolean;\n\n /** Called when event drag starts */\n onEventDragStart?: (event: ScheduleEventData) => void;\n\n /** Called when event drag ends */\n onEventDragEnd?: () => void;\n\n /** If true, event is currently being dragged @default false */\n isDragging?: boolean;\n\n /** Interaction mode: 'default' allows all interactions, 'static' disables event interactions @default default */\n mode?: ScheduleMode;\n\n /** If true, event can be resized by dragging its edges @default false */\n withResize?: boolean;\n\n /** Called when resize starts on an edge */\n onResizeStart?: (edge: 'top' | 'bottom', e: React.PointerEvent) => void;\n\n /** If true, event is currently being resized @default false */\n isResizing?: boolean;\n}\n\nexport type ScheduleEventFactory = Factory<{\n props: ScheduleEventProps;\n ref: HTMLButtonElement;\n stylesNames: ScheduleEventStylesNames;\n vars: ScheduleEventCssVariables;\n variant: ScheduleEventVariant;\n}>;\n\nconst defaultProps = {\n __staticSelector: 'ScheduleEvent',\n mode: 'default',\n radius: 'sm' as MantineRadius,\n} satisfies Partial<ScheduleEventProps>;\n\nconst varsResolver = createVarsResolver<ScheduleEventFactory>(\n (theme, { event, variant, radius }) => {\n const colors = theme.variantColorResolver({\n color: event.color || theme.primaryColor,\n theme,\n variant: variant || event.variant || 'light',\n autoContrast: true,\n });\n\n return {\n event: {\n '--event-bg': colors.background,\n '--event-hover': colors.hover,\n '--event-color': colors.color,\n '--event-radius': getRadius(radius),\n },\n };\n }\n);\n\nexport const ScheduleEvent = factory<ScheduleEventFactory>((_props) => {\n const props = useProps('ScheduleEvent', defaultProps, _props);\n const {\n classNames,\n className,\n style,\n styles,\n unstyled,\n vars,\n attributes,\n children,\n nowrap,\n radius,\n color,\n __staticSelector,\n event,\n renderEventBody,\n renderEvent,\n size,\n autoSize,\n mod,\n hanging,\n draggable = false,\n onEventDragStart,\n onEventDragEnd,\n isDragging = false,\n mode,\n withResize = false,\n onResizeStart,\n isResizing = false,\n ...others\n } = props;\n\n const ctx = use(DragContext);\n\n const getStyles = useStyles<ScheduleEventFactory>({\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: 'event',\n });\n\n const handleDragStart = (e: React.DragEvent<HTMLButtonElement>) => {\n if (!draggable) {\n e.preventDefault();\n return;\n }\n\n e.dataTransfer.effectAllowed = 'move';\n e.dataTransfer.setData('application/json', JSON.stringify({ eventId: event.id }));\n onEventDragStart?.(event);\n ctx.onDragStart?.(event);\n };\n\n const handleDragEnd = () => {\n onEventDragEnd?.();\n ctx.onDragEnd?.();\n };\n\n const isCurrentlyDragging = isDragging || ctx.draggedEventId === event.id;\n const isAnyEventDragging = ctx.isDragging || false;\n\n const dragEndRef = useRef(ctx.onDragEnd);\n dragEndRef.current = ctx.onDragEnd;\n\n useEffect(() => {\n if (isCurrentlyDragging) {\n return () => {\n dragEndRef.current?.();\n };\n }\n return undefined;\n }, [isCurrentlyDragging]);\n\n const showResizeHandles = withResize && mode !== 'static';\n\n const eventChildren = (\n <>\n {showResizeHandles && (\n <Box\n {...getStyles('eventResizeHandle')}\n mod={{ edge: 'top' }}\n onPointerDown={(e: React.PointerEvent) => onResizeStart?.('top', e)}\n />\n )}\n <Box mod={{ nowrap, size, autoSize, hanging }} {...getStyles('eventInner')}>\n {typeof renderEventBody === 'function' ? renderEventBody(event) : event.title}\n </Box>\n {showResizeHandles && (\n <Box\n {...getStyles('eventResizeHandle')}\n mod={{ edge: 'bottom' }}\n onPointerDown={(e: React.PointerEvent) => onResizeStart?.('bottom', e)}\n />\n )}\n </>\n );\n\n const rootProps = {\n ...getStyles('event'),\n 'data-event-id': event.id,\n size,\n title: event.title,\n mod: [\n {\n autoSize,\n hanging,\n draggable,\n dragging: isCurrentlyDragging,\n 'any-dragging': isAnyEventDragging,\n static: mode === 'static',\n resizing: isResizing,\n resizable: showResizeHandles,\n },\n mod,\n ],\n draggable: draggable && mode !== 'static',\n tabIndex: mode === 'static' ? -1 : 0,\n onDragStart: mode === 'static' ? undefined : handleDragStart,\n onDragEnd: mode === 'static' ? undefined : handleDragEnd,\n onClick: mode === 'static' ? undefined : others.onClick,\n ...others,\n children: eventChildren,\n };\n\n if (typeof renderEvent === 'function') {\n return renderEvent(event, rootProps);\n }\n\n return <UnstyledButton {...rootProps} />;\n});\n\nScheduleEvent.displayName = '@mantine/schedule/ScheduleEvent';\nScheduleEvent.classes = classes;\nScheduleEvent.varsResolver = varsResolver;\n"],"mappings":"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"}
@@ -373,7 +373,9 @@ const WeekView = factory((_props) => {
373
373
  renderEvent,
374
374
  radius,
375
375
  mode,
376
- onClick: onEventClick ? (e) => onEventClick(event, e) : void 0,
376
+ onClick: onEventClick ? (e) => {
377
+ if (!eventResize.wasResizing()) onEventClick(event, e);
378
+ } : void 0,
377
379
  style: {
378
380
  position: "absolute",
379
381
  top: `calc(${eventTop}% + 1px)`,