{"version":3,"sources":["../package/EventsCalendar.tsx","../package/components/event/Event.tsx","../package/utils/setTime.ts","../package/utils/constants.ts","../package/utils/isBetween.ts","../package/utils/hasOverlap.ts","../package/utils/updateEvent.ts","../package/utils/getTimeDiff.ts","../package/utils/getTimeLabel.ts","../package/utils/filterByWeek.ts","../package/utils/filterByDate.ts","../package/utils/filterByView.ts","../package/utils/parseRawEvents.ts","../package/utils/getVisibleEvents.ts","../package/utils/arrangeWeekEvents.ts","../package/state/EMPTY_EVENT.tsx","../package/utils/returnValidStartEnd.ts","../package/utils/getPlaceholderEvent.ts","../package/utils/arrangeWeekdayEvents.ts","../package/utils/createDayjsObjFromTime.ts","../package/utils/getBackgroundFromGroups.ts","../package/hooks/useMouseEvent.tsx","../package/hooks/useElementSize.tsx","../package/hooks/useCalendarEvent.tsx","../package/hooks/useEventsCalendar.tsx","../package/state/DEFAULT_STATE.tsx","../package/state/reducer.tsx","../package/hooks/useInitEventsCalendar.tsx","../package/components/event/TimeEvent.tsx","../package/components/event/utils/getClipPath.ts","../package/components/event/utils/getEventStyles.ts","../package/components/event/utils/isBeingDragged.ts","../package/components/event/utils/getOverflowArrows.ts","../package/components/event/utils/getWeekOrDayEventStyles.ts","../package/components/event/AllDayEvent.tsx","../package/components/popover/PopoverContent.tsx","../package/components/popover/useBindPopover.tsx","../package/components/popover/EventsCalendarPopover.tsx","../package/components/event-cell/CellHeader.tsx","../package/components/event-cell/ShowMoreText.tsx","../package/components/event-cell/CellContainer.tsx","../package/components/circular-loader/CircularLoader.tsx","../package/features/header/HeaderButton.tsx","../package/features/header/Controls.tsx","../package/features/header/Navigation.tsx","../package/features/icons/IconChevronLeft.tsx","../package/features/icons/IconChevronRight.tsx","../package/features/header/Header.tsx","../package/features/time-view/TimeView.tsx","../package/features/time-view/hooks/useSetInitialScroll.tsx","../package/features/time-view/utils/getWeekDates.ts","../package/features/time-view/utils/getEventsByDayMap.ts","../package/features/time-view/components/HoursColumn.tsx","../package/features/time-view/components/TimeIndicator.tsx","../package/features/time-view/components/TimeBackground.tsx","../package/features/time-view/components/TimeViewHeader.tsx","../package/features/year-view/components/MonthDate.tsx","../package/features/year-view/utils/generateYearDates.ts","../package/features/year-view/YearView.tsx","../package/features/month-view/MonthView.tsx","../package/features/month-view/components/MonthHeader.tsx","../package/features/month-view/utils/getMaxEvents.ts","../package/features/month-view/utils/getMonthDates.ts","../package/features/month-view/utils/getEventsByWeekMap.ts","../package/features/overflow-card/OverflowCard.tsx"],"sourcesContent":["'use client';\n\nimport { ReactNode, useMemo, useRef } from 'react';\nimport './EventsCalendar.css';\n\nimport {\n\tCalendarView,\n\tEventEditProps,\n\tEventClickArgs,\n\tRawCalendarEvent,\n\tRawCalendarEventBase,\n\tEventsCalendarPopoverProps,\n\tEventsCalendarContextMenuProps,\n} from './types';\n\nimport { EventsCalendarPopover, CircularLoader } from './components';\nimport { CALENDAR_VIEWS, filterByView, parseRawEvents } from './utils';\nimport { MonthView, Header, TimeView, OverflowCard, YearView } from './features';\nimport { useMouseEvent, useInitEventsCalendar, EventsCalendarObject } from './hooks';\n\nexport interface EventsCalendarProps<T extends RawCalendarEventBase = RawCalendarEventBase> {\n\tcalendar?: EventsCalendarObject;\n\tcompact?: boolean;\n\tenableDragCreation?: boolean;\n\tenableRescheduling?: boolean;\n\tevents?: RawCalendarEvent<T>[];\n\tisFetching?: boolean;\n\tnoHeader?: boolean;\n\tpopoverZIndex?: number;\n\tviews?: CalendarView[];\n\tonEventClick?: (props: EventClickArgs<T>) => void;\n\tonEventCreate?: (props: EventEditProps) => void;\n\tonEventReschedule?: (props: EventEditProps) => void;\n\trenderPopover?: (props: EventsCalendarPopoverProps) => ReactNode;\n\trenderContextMenu?: (props: EventsCalendarContextMenuProps) => ReactNode;\n}\n\nexport function EventsCalendar<T extends RawCalendarEvent = RawCalendarEventBase>({\n\tcalendar,\n\tcompact = false,\n\tenableDragCreation = false,\n\tenableRescheduling = false,\n\tevents = [],\n\tpopoverZIndex = 101,\n\tisFetching = false,\n\tnoHeader = false,\n\tonEventClick,\n\tonEventCreate,\n\tonEventReschedule,\n\trenderPopover,\n\trenderContextMenu,\n\tviews = [...CALENDAR_VIEWS],\n}: EventsCalendarProps<T>) {\n\t// Initialise data calendar\n\tconst { activeDate, setActiveDate, view, setView, state, dispatch } = useInitEventsCalendar(calendar);\n\n\t// Parse raw events\n\tconst parsed = useMemo(() => parseRawEvents<T>(events), [events]);\n\n\t// Events in current view\n\tconst calendarEvents = useMemo(() => filterByView<T>(parsed, activeDate, view), [parsed, activeDate, view]);\n\n\t// Overflow events (only all day events are needed in time views)\n\tconst isTimeView = view === 'week' || view === 'day';\n\tconst overflowEvents = isTimeView ? calendarEvents.filter(event => event.isAllDay) : calendarEvents;\n\n\t// Calendar state\n\tconst { eventAnchor, dragActive, eventDragActive, popoverIsOpen, clickedEvent, placeholderEvent } = state;\n\n\t// Popover handlers\n\tconst onClose = () => dispatch({ type: 'reset_calendar' });\n\tconst handleStopDrag = () => {\n\t\tif (dragActive || eventDragActive) dispatch({ type: 'event_create_stop' });\n\t};\n\n\t// Placeholder ref\n\tconst placeholderRef = useRef<HTMLDivElement>(null);\n\n\t// Mouse event handler\n\tconst handleMouseEvent = useMouseEvent({ enableDragCreation, dispatch, state, onEventCreate });\n\n\t// Shared props\n\tconst basicProps = {\n\t\tactiveDate,\n\t\tdispatch,\n\t\tstate,\n\t\tevents: calendarEvents,\n\t};\n\tconst sharedViewProps = {\n\t\t...basicProps,\n\t\tcompact,\n\t\tonEventClick,\n\t\thandleStopDrag,\n\t\tplaceholderRef,\n\t\thandleMouseEvent,\n\t\tonEventReschedule,\n\t\trenderContextMenu,\n\t\tenableRescheduling,\n\t};\n\n\t// Render function\n\tconst renderCurrentView = () => {\n\t\tswitch (view) {\n\t\t\tcase 'year':\n\t\t\t\treturn <YearView {...basicProps} />;\n\t\t\tcase 'month':\n\t\t\t\treturn <MonthView {...sharedViewProps} />;\n\t\t\tcase 'week':\n\t\t\tcase 'day':\n\t\t\t\treturn <TimeView {...sharedViewProps} view={view} />;\n\t\t\tdefault:\n\t\t\t\treturn null;\n\t\t}\n\t};\n\n\treturn (\n\t\t<div className='events-calendar-wrapper'>\n\t\t\t{noHeader ? null : (\n\t\t\t\t<Header view={view} setActiveDate={setActiveDate} setView={setView} activeDate={activeDate} views={views} />\n\t\t\t)}\n\t\t\t<div className='events-calendar' data-withheader={!noHeader} onClick={e => e.stopPropagation()}>\n\t\t\t\t<CircularLoader visible={isFetching} />\n\t\t\t\t{renderCurrentView()}\n\n\t\t\t\t{renderPopover && eventAnchor && (\n\t\t\t\t\t<EventsCalendarPopover isOpen={popoverIsOpen} anchor={eventAnchor} zIndex={popoverZIndex}>\n\t\t\t\t\t\t{renderPopover({ onClose, clickedEvent, newEvent: placeholderEvent })}\n\t\t\t\t\t</EventsCalendarPopover>\n\t\t\t\t)}\n\n\t\t\t\t<OverflowCard\n\t\t\t\t\tstate={state}\n\t\t\t\t\tcompact={compact}\n\t\t\t\t\tdispatch={dispatch}\n\t\t\t\t\tevents={overflowEvents}\n\t\t\t\t\tonEventClick={onEventClick}\n\t\t\t\t\tplaceholderRef={placeholderRef}\n\t\t\t\t\trenderContextMenu={renderContextMenu}\n\t\t\t\t\tenableRescheduling={enableRescheduling}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n","'use client';\n\nimport { Dispatch, ReactNode, RefObject, useRef } from 'react';\nimport { Dayjs } from 'dayjs';\nimport './Event.css';\n\nimport { getTimeDiff, getTimeLabel } from '~/utils';\nimport { useCalendarEvent } from '~/hooks';\nimport {\n\tCalendarState,\n\tCalendarAction,\n\tMinMaxDatesInView,\n\tOrderedCalendarEvent,\n\tEventsCalendarContextMenuProps,\n\tCalendarView,\n\tEventClickArgs,\n} from '~/types';\n\nimport { TimeEvent } from './TimeEvent';\nimport { AllDayEvent } from './AllDayEvent';\nimport { getEventStyles, getWeekOrDayEventStyles, isBeingDragged } from './utils';\n\ninterface EventProps<T> {\n\tview: CalendarView;\n\tenableRescheduling: boolean;\n\tcompact?: boolean;\n\tdate: Dayjs;\n\tdispatch: Dispatch<CalendarAction>;\n\tevent: OrderedCalendarEvent<T>;\n\tisInWeekHeader?: boolean;\n\tisInOverflow?: boolean;\n\tisInDayHeader?: boolean;\n\tminMaxDatesInView?: MinMaxDatesInView;\n\tplaceholderRef: RefObject<HTMLDivElement | null>;\n\tonEventClick?: (props: EventClickArgs<T>) => void;\n\trenderContextMenu?: (props: EventsCalendarContextMenuProps) => ReactNode;\n\tstate: CalendarState;\n}\n\nexport function Event<T>({\n\tview,\n\tenableRescheduling,\n\tcompact = false,\n\tdate,\n\tdispatch,\n\tevent,\n\tisInWeekHeader = false,\n\tisInOverflow = false,\n\tisInDayHeader = false,\n\tminMaxDatesInView,\n\tonEventClick,\n\tplaceholderRef,\n\trenderContextMenu,\n\tstate,\n}: EventProps<T>) {\n\tconst ref = useRef<HTMLDivElement>(null);\n\tconst hasContextMenu = !!renderContextMenu;\n\tconst isInteractive = !!onEventClick || enableRescheduling;\n\tconst isMonthView = view === 'month';\n\tconst isDayView = view === 'day';\n\n\t// Popover handlers\n\tconst openPopover = () => dispatch({ type: 'open_popover' });\n\tconst closePopover = () => dispatch({ type: 'reset_calendar' });\n\n\t// Context menu onClose\n\tconst onClose = () => dispatch({ type: 'reset_calendar' });\n\n\t// Handle event left click (view popover)\n\tconst handleClick = (\n\t\te: React.MouseEvent<HTMLDivElement, MouseEvent>,\n\t\tisPlaceholder: boolean,\n\t\teventRef: RefObject<HTMLDivElement | null>,\n\t\tonEventClick?: (props: EventClickArgs<T>) => void\n\t) => {\n\t\te.stopPropagation();\n\t\tif (isPlaceholder) return;\n\n\t\tif (!eventRef.current) return;\n\n\t\t// Check if popover is open and anchored to the clicked event, we want to\n\t\t// move the popover if the event is clicked twice, but on different weeks)\n\t\tconst isDoubleClick = isActive && state.eventAnchor?.dataset.anchorday === eventRef.current.dataset.anchorday;\n\n\t\t// Overflow popover should close if clicked event was not inside the overflow popover\n\t\tconst overflowShouldClose = !isInOverflow && state.overflowIsOpen;\n\n\t\t// Close popover (this is either a double-click on an open event or an event outside the popover)\n\t\tif (overflowShouldClose) dispatch({ type: 'reset_calendar' });\n\n\t\t// Open popover if there is currently no anchored popover\n\t\tif (!isDoubleClick) {\n\t\t\tdispatch({ type: 'set_clicked_event', event: event, anchor: eventRef.current });\n\t\t}\n\n\t\t// Toggle popover visibility handler\n\t\tconst togglePopover = () => (isDoubleClick ? closePopover() : openPopover());\n\n\t\tonEventClick?.({\n\t\t\tevent,\n\t\t\tisDoubleClick,\n\t\t\teventRef: eventRef.current,\n\t\t\topenPopover,\n\t\t\tclosePopover,\n\t\t\ttogglePopover,\n\t\t});\n\t};\n\n\t// Main event hook\n\tconst { handleContextMenu, isActive, contextIsOpen, refs, floatingStyles, getFloatingProps, closeContextMenu } =\n\t\tuseCalendarEvent({\n\t\t\tdispatch,\n\t\t\tevent,\n\t\t\tstate,\n\t\t\thasContextMenu,\n\t\t\tisInOverflow,\n\t\t});\n\n\t// Current event is placeholder event\n\tconst isPlaceholder = event.id === null;\n\tconst eventRef = isPlaceholder && event.start.isSame(date, 'd') ? placeholderRef : ref;\n\tconst timeDuration = Math.abs(getTimeDiff(event.start, event.end));\n\tconst isShort = timeDuration <= 30;\n\tconst overlapOffset = isDayView ? 120 : 20;\n\tconst dayIndex = isDayView ? 0 : date.day();\n\n\tconst onDragStart = () => {\n\t\tdispatch({ type: 'reset_calendar' });\n\t\tif (enableRescheduling && !isInOverflow) {\n\t\t\tdispatch({\n\t\t\t\ttype: 'event_reschedule_start',\n\t\t\t\tevent: { ...event, dragId: event.id, order: isMonthView ? event.order : 1000 },\n\t\t\t});\n\t\t}\n\t};\n\n\tconst styles = isMonthView\n\t\t? getEventStyles(isInOverflow, event, date, compact, isInWeekHeader, isInDayHeader)\n\t\t: getWeekOrDayEventStyles(event, timeDuration, dayIndex, overlapOffset, isInteractive && isActive);\n\n\treturn (\n\t\t<>\n\t\t\t<div\n\t\t\t\tclassName={isMonthView ? 'events-calendar-month-item-container' : 'events-calendar-week-item-container'}\n\t\t\t\tdata-interactive={isInteractive}\n\t\t\t\tdata-active={isInteractive && isActive}\n\t\t\t\tdata-anchorday={date.format('DD-MMM-YYYY')}\n\t\t\t\tdata-placeholder={isPlaceholder}\n\t\t\t\tdata-dragactive={state.dragActive || state.eventDragActive}\n\t\t\t\tdata-isdragging={isBeingDragged(state, event)}\n\t\t\t\tdata-sm={compact}\n\t\t\t\tdata-time={isMonthView && !event.isAllDay}\n\t\t\t\tdraggable='true'\n\t\t\t\tonClick={e => handleClick(e, isPlaceholder, eventRef, onEventClick)}\n\t\t\t\tonContextMenu={e => handleContextMenu(e, eventRef)}\n\t\t\t\tonDragStart={onDragStart}\n\t\t\t\tref={eventRef}\n\t\t\t\tstyle={styles}\n\t\t\t>\n\t\t\t\t{isMonthView ? (\n\t\t\t\t\t!event.isAllDay ? (\n\t\t\t\t\t\t<TimeEvent event={event} isCompact={compact} />\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<AllDayEvent\n\t\t\t\t\t\t\tdate={date}\n\t\t\t\t\t\t\tevent={event}\n\t\t\t\t\t\t\tisCompact={compact}\n\t\t\t\t\t\t\tisInOverflow={isInOverflow}\n\t\t\t\t\t\t\tminMaxDatesInView={minMaxDatesInView}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)\n\t\t\t\t) : (\n\t\t\t\t\t<div className='events-calendar-item-label' data-short={isShort}>\n\t\t\t\t\t\t<span style={isShort ? undefined : { width: '100%' }}>{event.title}</span>\n\t\t\t\t\t\t<span className='events-calendar-time-text'>{getTimeLabel(event, timeDuration)}</span>\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t\t{contextIsOpen && (\n\t\t\t\t<div ref={refs.setFloating} style={{ ...floatingStyles, zIndex: 2 }} {...getFloatingProps()}>\n\t\t\t\t\t{renderContextMenu && renderContextMenu({ event, closeContextMenu, onClose, openPopover })}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</>\n\t);\n}\n","import { Dayjs } from 'dayjs';\n\n/*\n    Function that takes in a date object and a time\n    Returns date object with same date, but resets time to input\n*/\nexport function setTime(date: Dayjs, time: Dayjs) {\n  return date.hour(time.hour()).minute(time.minute());\n}\n","export const CALENDAR_VIEWS = ['year', 'month', 'week', 'day'] as const;\n\nexport const MONTHS = [\n\t'January',\n\t'February',\n\t'March',\n\t'April',\n\t'May',\n\t'June',\n\t'July',\n\t'August',\n\t'September',\n\t'October',\n\t'November',\n\t'December',\n] as const;\n\nexport const DAY_LABELS_SHORT = ['S', 'M', 'T', 'W', 'T', 'F', 'S'] as const;\n\nexport const DAYS_IN_FULL_MONTH = 42;\n\nexport const DEFAULT_COLOR = '#0ea5e9';\n\nexport const HOURS = [\n\t'1 AM',\n\t'2 AM',\n\t'3 AM',\n\t'4 AM',\n\t'5 AM',\n\t'6 AM',\n\t'7 AM',\n\t'8 AM',\n\t'9 AM',\n\t'10 AM',\n\t'11 AM',\n\t'12 PM',\n\t'1 PM',\n\t'2 PM',\n\t'3 PM',\n\t'4 PM',\n\t'5 PM',\n\t'6 PM',\n\t'7 PM',\n\t'8 PM',\n\t'9 PM',\n\t'10 PM',\n\t'11 PM',\n] as const;\n","import { Dayjs } from 'dayjs';\n\nexport function isBetween(date: Dayjs, testStart: Dayjs, testEnd: Dayjs, startOnly: boolean = false) {\n\treturn (\n\t\t(date.isAfter(testStart) && date.isBefore(testEnd)) ||\n\t\tdate.isSame(testStart, 'd') ||\n\t\t(startOnly ? false : date.isSame(testEnd, 'd'))\n\t);\n}\n","import { Dayjs } from 'dayjs';\nimport { isBetween } from './isBetween';\n\n/*\n    Function that returns true if two date ranges overlap\n*/\nexport function hasOverlap(start1: Dayjs, end1: Dayjs, start2: Dayjs, end2: Dayjs) {\n\treturn isBetween(start1, start2, end2) || isBetween(start2, start1, end1) || isBetween(end2, start1, end1);\n}\n","import { Dispatch } from 'react';\nimport { Dayjs } from 'dayjs';\n\nimport { CalendarView, CalendarAction, CalendarState } from '~/types';\n\ninterface updateDragNDropPlaceholderProps {\n\tstate: CalendarState;\n\tdispatch: Dispatch<CalendarAction>;\n\tdate: Dayjs;\n\tview: CalendarView;\n}\n\nexport function updateEvent({ state, dispatch, date, view }: updateDragNDropPlaceholderProps) {\n\tconst timeScale = view === 'month' ? 'day' : 'minute';\n\n\t// After placeholder event is created (for dragging), record where on the event we have clicked (e.g. 2 days/60mins in)\n\tif (state.dragStartOffset === null) {\n\t\tconst dateDiff = date.diff(state.clickedEvent.start, timeScale);\n\t\tdispatch({ type: 'update_event', dragStartOffset: dateDiff });\n\t\treturn;\n\t}\n\n\t// Extract existing values\n\tconst { start, end, startTime, endTime } = state.clickedEvent;\n\n\t// On drag over grid, update the placeholder event\n\tconst newStart = date.subtract(state.dragStartOffset, timeScale);\n\tconst increment = end.diff(start, timeScale);\n\tconst newEnd = newStart.add(increment, timeScale);\n\n\tif (view !== 'month' && !newStart.isSame(newEnd, 'day')) return;\n\n\tdispatch({\n\t\ttype: 'update_event',\n\t\tevent: {\n\t\t\t...state.placeholderEvent,\n\t\t\tstart: view === 'month' ? newStart.hour(start.hour()).minute(start.minute()) : newStart,\n\t\t\tend: view === 'month' ? newEnd.hour(end.hour()).minute(end.minute()) : newEnd,\n\t\t\tstartTime: view === 'month' ? startTime : newStart.format('h:mma'),\n\t\t\tendTime: view === 'month' ? endTime : newEnd.format('h:mma'),\n\t\t},\n\t});\n}\n","import { Dayjs } from 'dayjs';\n\nexport function getTimeDiff(dt1: Dayjs, dt2: Dayjs) {\n  const mins1 = dt1.hour() * 60 + dt1.minute();\n  const mins2 = dt2.hour() * 60 + dt2.minute();\n  return mins2 - mins1;\n}\n","import { CalendarEvent } from '~/types';\n\nexport function getTimeLabel(event: CalendarEvent, timeDuration: number) {\n\tif (!event.start || !event.end) return '';\n\tconst leadingComma = timeDuration <= 30 ? ', ' : '';\n\treturn event.start.isBefore(event.end)\n\t\t? `${leadingComma}${event.start.format('h:mma')} - ${event.end.format('h:mma')}`\n\t\t: `${leadingComma}${event.end.format('h:mma')} - ${event.start.format('h:mma')}`;\n}\n","import { Dayjs } from 'dayjs';\nimport { CalendarEvent } from '~/types';\nimport { hasOverlap } from './hasOverlap';\n\n/*\n    Function that returns an array of events that overlap a week with given weekStartDate\n*/\nexport function filterByWeek<T extends CalendarEvent>(array: T[], weekStartDate: Dayjs) {\n\tconst weekEndDate = weekStartDate.add(6, 'd');\n\treturn array.filter(({ start, end }) => {\n\t\tconst eventEnd = end || start; // Take event start if end is null\n\t\treturn hasOverlap(weekStartDate, weekEndDate, start, eventEnd);\n\t});\n}\n","import { Dayjs } from 'dayjs';\n\nimport { CalendarEvent } from '~/types';\nimport { isBetween } from './isBetween';\n\nexport function filterByDate<T extends CalendarEvent>(data: T[], date: Dayjs): T[] {\n\treturn data.filter(({ start, end }) => isBetween(date, start, end));\n}\n","import { Dayjs } from 'dayjs';\nimport { CalendarEvent, CalendarView } from '~/types';\nimport { hasOverlap } from './hasOverlap';\n\n/*\n    Function that returns an array of events that overlap the current view (year or month)\n*/\nexport function filterByView<T>(array: CalendarEvent<T>[], activeDate: Dayjs, view: CalendarView) {\n\tconst unit = view === 'year' ? 'year' : 'month';\n\n\tconst filterStart = activeDate.startOf(unit).day(0);\n\tconst filterEnd = activeDate.endOf(unit).day(6);\n\treturn array.filter(({ start, end }) => hasOverlap(filterStart, filterEnd, start, end));\n}\n","import dayjs from 'dayjs';\nimport { CalendarEvent, RawCalendarEvent } from '~/types';\n\nconst getDayjs = (rawDate: dayjs.Dayjs, timeString: string) => {\n\tconst formatted = timeString.replace(/.{2}$/, ' $&').toUpperCase();\n\treturn dayjs(`${rawDate.format('DD-MMM-YYYY')} ${formatted}`);\n};\n\nexport function parseRawEvents<T>(events: RawCalendarEvent<T>[]): CalendarEvent<T>[] {\n\treturn events\n\t\t.filter(event => event.start || event.end)\n\t\t.map((event, index) => {\n\t\t\t// Event start\n\t\t\tlet dayjsStart = event.start ? dayjs(event.start) : dayjs(event.end);\n\t\t\tif (event.startTime) {\n\t\t\t\tdayjsStart = getDayjs(dayjsStart, event.startTime);\n\t\t\t}\n\n\t\t\t// Event end (default to event start)\n\t\t\tlet dayjsEnd = event.end ? dayjs(event.end) : dayjsStart;\n\n\t\t\t// Add end time\n\t\t\tif (event.startTime || event.endTime || event.isAllDay === false) {\n\t\t\t\tif (!event.startTime && !event.endTime) {\n\t\t\t\t\tdayjsEnd = dayjsStart.add(1, 'hour'); // Neither start nor end time\n\t\t\t\t} else if (event.endTime) {\n\t\t\t\t\tdayjsEnd = getDayjs(dayjsEnd, event.endTime); // Only end Time\n\t\t\t\t} else {\n\t\t\t\t\tdayjsEnd = getDayjs(dayjsEnd, event.startTime!).add(1, 'hour'); // Only start time\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst parsedEvent = {\n\t\t\t\t...event,\n\t\t\t\tid: event.id ?? index,\n\t\t\t\ttitle: event.title ?? '',\n\t\t\t\tstart: dayjsStart,\n\t\t\t\tend: dayjsEnd,\n\t\t\t\tisAllDay: event.isAllDay !== false,\n\t\t\t};\n\n\t\t\treturn parsedEvent;\n\t\t});\n}\n","import { Dayjs } from 'dayjs';\nimport { OrderedCalendarEvent } from '~/types';\n\n/*\n    Returns the correct number of events for a cell without duplicates in a given week\n*/\nexport function getVisibleEvents<T extends OrderedCalendarEvent>(\n\tdata: T[],\n\tdate: Dayjs,\n\tmaxEvents: number,\n\tisInDayHeader: boolean\n) {\n\treturn data.filter(\n\t\t({ order, start }) => order < maxEvents && (isInDayHeader || date.day() === 0 || date.isSame(start, 'day'))\n\t);\n}\n","import { CalendarEvent, OrderedCalendarEvent } from '~/types';\nimport { hasOverlap } from './hasOverlap';\n\n/**\n * Sorts an array of calendar events with the following priority:\n *  1. Longer events appear first (descending by length in days).\n *  2. If lengths are equal, earlier start dates come first.\n *  3. If start dates are equal, all-day events come before timed events.\n *\n * @template T\n * @param {T[]} weekEventsArray - Array of calendar events to sort.\n * @returns {T[]} A new array sorted according to the above criteria.\n */\nfunction calendarSort<T extends CalendarEvent>(weekEventsArray: T[]) {\n\tconst clone = [...weekEventsArray];\n\n\treturn clone.sort((a, b) => {\n\t\t// Calculate the length of each event in days, including both start and end days\n\t\tconst a_lengthInDays = a.end.diff(a.start, 'day') + 1;\n\t\tconst b_lengthInDays = b.end.diff(b.start, 'day') + 1;\n\n\t\t// Sort order priority:\n\t\t// 1. Longer events come first (descending by length)\n\t\tif (a_lengthInDays > b_lengthInDays) return -1;\n\t\tif (a_lengthInDays < b_lengthInDays) return 1;\n\n\t\t// 2. If lengths are equal, earlier start date comes first\n\t\tif (a.start.isBefore(b.start, 'day')) return -1;\n\t\tif (b.start.isBefore(a.start, 'day')) return 1;\n\n\t\t// 3. If same start date, place all-day events above timed events\n\t\tif (a.isAllDay && !b.isAllDay) return -1;\n\t\tif (!a.isAllDay && b.isAllDay) return 1;\n\n\t\t// 4. If all criteria are equal, keep original order (stable sort)\n\t\treturn 0;\n\t});\n}\n\n/**\n * Finds the lowest non-negative integer slot not present in the given set of occupied slots.\n *\n * @param {Set<number>} overlappingSlots - A set of slot numbers that are already taken.\n * @returns {number} The lowest slot number not in the set, starting from 0.\n */\nfunction findAvailableSlot(overlappingSlots: Set<number>): number {\n\tlet slot = 0;\n\twhile (overlappingSlots.has(slot)) slot++;\n\treturn slot;\n}\n\n/*\n    Function that takes an array of events for a single week and arranges them to create a dense fit\n*/\nexport function arrangeWeekEvents<T extends CalendarEvent>(weekEventsArray: T[]): (OrderedCalendarEvent & T)[] {\n\tif (weekEventsArray.length < 2) return weekEventsArray.map(event => ({ ...{ ...event, order: 0, indent: 0 } }));\n\n\t// Sort events by length, then start date, then duration\n\tconst sortedWeekEvents = calendarSort(weekEventsArray);\n\n\t// Extract first event from array and place as in first (top) slot/position\n\tconst [firstEvent, ...followingEvents] = sortedWeekEvents;\n\tconst orderedArray: OrderedCalendarEvent<T>[] = [{ ...firstEvent, order: 0, indent: 0 }];\n\n\t// Now loop through all other events and add them to the ordered array\n\tfollowingEvents.forEach(testEvent => {\n\t\tconst testStart = testEvent.start;\n\t\tconst testEnd = testEvent.end || testStart; // fallback if no end\n\n\t\t// Assign 'slots' for each day cell. Track slots that contain overlapping entries\n\t\tconst overlappingSlots = new Set<number>();\n\n\t\t// Check for overlaps with already placed events\n\t\tfor (const placedEvent of orderedArray) {\n\t\t\tconst placedStart = placedEvent.start;\n\t\t\tconst placedEnd = placedEvent.end || placedStart; // fallback if no end\n\n\t\t\tif (hasOverlap(testStart, testEnd, placedStart, placedEnd)) {\n\t\t\t\toverlappingSlots.add(placedEvent.order);\n\t\t\t}\n\t\t}\n\n\t\t// Find the lowest slot number not taken by overlapping events\n\t\tconst eventOrder = findAvailableSlot(overlappingSlots);\n\n\t\t// Add this event to the ordered array, along with its allocated slot\n\t\torderedArray.push({ ...testEvent, order: eventOrder, indent: 0 });\n\t});\n\treturn orderedArray;\n}\n","import dayjs from 'dayjs';\nimport { OrderedCalendarEvent } from '../types';\n\nexport const EMPTY_EVENT: OrderedCalendarEvent = {\n\tid: null,\n\tdragId: null,\n\ttitle: 'Untitled',\n\tgroups: [],\n\tstart: dayjs(),\n\tend: dayjs(),\n\tstartTime: undefined,\n\tendTime: undefined,\n\tisActive: false,\n\tisAllDay: true,\n\tindent: 0,\n\torder: 0,\n};\n","import { Dayjs } from 'dayjs';\n\nexport function returnValidStartEnd(start: Dayjs, end: Dayjs) {\n\treturn !end ? [start, start] : start.isSame(end) || start.isBefore(end) ? [start, end] : [end, start];\n}\n","import { Dayjs } from 'dayjs';\n\nimport { OrderedCalendarEvent } from '~/types';\nimport { EMPTY_EVENT } from '~/state/EMPTY_EVENT';\n\nimport { returnValidStartEnd } from './returnValidStartEnd';\n\nexport const getPlaceholderEvent = (start: Dayjs, end: Dayjs, isTimeEntry?: boolean, isInitialisation?: boolean) => {\n\tconst [validStart, validEnd] = returnValidStartEnd(start, end);\n\tconst eventEnd = isInitialisation && isTimeEntry ? validStart.add(15, 'minute') : validEnd;\n\n\tconst updatedEvent: OrderedCalendarEvent = {\n\t\t...EMPTY_EVENT,\n\t\tid: null,\n\t\tstart: validStart,\n\t\tend: eventEnd,\n\t\tisActive: true,\n\t\tisAllDay: isTimeEntry ? false : true,\n\t\tstartTime: isTimeEntry ? validStart.format('h:mma') : undefined,\n\t\tendTime: isTimeEntry ? eventEnd.format('h:mma') : undefined,\n\t\torder: isTimeEntry ? 100 : 0,\n\t};\n\treturn updatedEvent;\n};\n","import { Dayjs } from 'dayjs';\n\nimport { CalendarEvent, OrderedCalendarEvent } from '~/types';\n\nimport { setTime } from './setTime';\nimport { getTimeDiff } from './getTimeDiff';\n\n/*\n    Function that sorts events by start time, from earliest to latest.\n    Only sort arrays with at least 2 events.\n*/\nfunction sortByStart<T extends CalendarEvent>(array: T[]) {\n\tif (array.length < 2) return array;\n\n\treturn array.sort((a, b) => {\n\t\tconst timeDiff = getTimeDiff(a.start, b.start);\n\t\treturn timeDiff > 0 ? -1 : timeDiff < 0 ? 1 : 0;\n\t});\n}\n\n/*\n    Function that checks if the start of a test event overlaps with another event\n*/\nfunction overlapsStart(test_start: Dayjs, main_start: Dayjs, main_end: Dayjs) {\n\treturn test_start.isSame(main_start) || (test_start.isAfter(main_start) && test_start.isBefore(main_end));\n}\n\n/*\n    Function that takes an array of events for a single day and orders & indents them based on overlaps\n*/\nexport function arrangeWeekdayEvents<T extends CalendarEvent>(\n\tdayEvents: T[],\n\tdate: Dayjs\n): (OrderedCalendarEvent & T)[] {\n\tif (dayEvents.length < 2) return dayEvents.map(event => ({ ...event, order: 0, indent: 0 }));\n\n\t// Sort events by start time\n\tconst sortedEvents = sortByStart(dayEvents);\n\n\t// if (date.day() === 4) {\n\t// \tconsole.log(dayEvents);\n\t// }\n\n\t// Extract first event from array and place it first with no indent\n\tconst [firstEvent, ...followingEvents] = sortedEvents;\n\tconst orderedArray: OrderedCalendarEvent<T>[] = [{ ...firstEvent, order: 0, indent: 0 }];\n\n\t// Now loop through all other events and add them to the ordered array\n\tfollowingEvents.forEach((testEvent, index) => {\n\t\t// Set the time for the next event to the correct day\n\t\tconst tempStart_test_event = setTime(date, testEvent.start);\n\n\t\t// We loop through the current events already added to the ordered array and compare with the test event\n\t\t// If the start of the test event overlaps with another event, we increment the indent by 1\n\t\tlet eventIndent = 0;\n\t\torderedArray.forEach(currEvent => {\n\t\t\t// Set the time for the comparison event to the correct day\n\t\t\tconst tempStart_curr_event = setTime(date, currEvent.start);\n\t\t\tconst tempEnd_curr_event = setTime(date, currEvent.end);\n\n\t\t\tif (overlapsStart(tempStart_test_event, tempStart_curr_event, tempEnd_curr_event)) {\n\t\t\t\teventIndent += 1;\n\t\t\t}\n\t\t});\n\n\t\t// Add this event to the ordered array, noting its order and indent\n\t\t// (the array is already sorted so we use the index for ordering)\n\t\torderedArray.push({ ...testEvent, order: index + 1, indent: eventIndent });\n\t});\n\n\treturn orderedArray;\n}\n","import dayjs from 'dayjs';\n\nexport const createDayjsObjFromTime = (\n\tstartTime: string | null,\n\tendTime: string | null,\n\tstartString: string = '01-Jan-2000',\n\tendString: string = '01-Jan-2000'\n) => {\n\tconst formattedStartTime = startTime?.replace(/.{2}$/, ' $&').toUpperCase() || '12:00 AM';\n\tconst formattedEndTime = endTime?.replace(/.{2}$/, ' $&').toUpperCase() || '12:00 AM';\n\tconst start = dayjs(`${startString} ${formattedStartTime}`);\n\tconst end = dayjs(`${endString} ${formattedEndTime}`);\n\treturn { start, end };\n};\n","import React from 'react';\n\nimport { DEFAULT_COLOR } from '~/utils';\nimport { CalendarGroup } from '~/types';\n\nexport function getBackgroundFromGroups(groups?: CalendarGroup[]): React.CSSProperties {\n\tconst colors = groups?.map(g => g.color).filter(Boolean) ?? [];\n\n\tif (!colors.length) return { backgroundColor: DEFAULT_COLOR };\n\n\tif (colors.length === 1) return { backgroundColor: colors[0] };\n\n\tconst increment = 100 / colors.length;\n\tconst values = colors.map((color, i) => `${color} ${increment * i}% ${increment * i + increment}%`).join(', ');\n\treturn { backgroundImage: `-webkit-linear-gradient(-30deg,${values})` };\n}\n","import { Dispatch } from 'react';\nimport { MouseEventHandler, CalendarAction, CalendarState, EventEditProps } from '~/types';\nimport { Dayjs } from 'dayjs';\n\nimport { getTimeDiff, getPlaceholderEvent, returnValidStartEnd } from '../utils';\n\ninterface useMouseEventProps {\n\tenableDragCreation: boolean;\n\tdispatch: Dispatch<CalendarAction>;\n\tstate: CalendarState;\n\tonEventCreate?: (props: EventEditProps) => void;\n}\n\nconst updatePlaceholder = ({\n\tisTimeEvent,\n\tfirstClickDate,\n\tstart,\n\tdate,\n\tdispatch,\n}: {\n\tisTimeEvent: boolean;\n\tfirstClickDate: Dayjs;\n\tstart: Dayjs;\n\tdate: Dayjs;\n\tdispatch: Dispatch<CalendarAction>;\n}) => {\n\tif (isTimeEvent) {\n\t\tconst tempStart =\n\t\t\tgetTimeDiff(firstClickDate, date) < 0\n\t\t\t\t? returnValidStartEnd(start, firstClickDate.add(15, 'minute'))[1]\n\t\t\t\t: firstClickDate;\n\t\tconst tempEnd = start.hour(date.hour()).minute(date.minute());\n\t\tif (Math.abs(getTimeDiff(tempStart, date)) >= 15) {\n\t\t\tconst updatedEvent = getPlaceholderEvent(tempStart, tempEnd, true);\n\t\t\tdispatch({ type: 'update_event', event: updatedEvent });\n\t\t}\n\t} else {\n\t\tconst updatedEvent = getPlaceholderEvent(firstClickDate, date);\n\t\tdispatch({ type: 'update_event', event: updatedEvent });\n\t}\n};\n\nexport const useMouseEvent = ({ enableDragCreation, dispatch, state, onEventCreate }: useMouseEventProps) => {\n\t// If view only calendar, only close popovers on mousedown\n\tif (!enableDragCreation) {\n\t\treturn (e: React.MouseEvent) => {\n\t\t\tif (e.type === 'mousedown') dispatch({ type: 'reset_calendar' });\n\t\t};\n\t}\n\n\t// Popover handler\n\tconst openPopover = () => dispatch({ type: 'open_popover' });\n\tconst reset = () => dispatch({ type: 'reset_calendar' });\n\n\tconst mouseEventHandler: MouseEventHandler = (e, date, isTimeEvent, placeholderRef) => {\n\t\tconst { dragActive, firstClickDate, placeholderEvent } = state;\n\t\tconst { start } = placeholderEvent;\n\n\t\t// Reset drag event if anything other than left click triggered\n\t\tif (e.button !== 0) {\n\t\t\tif (dragActive) dispatch({ type: 'event_create_stop' });\n\t\t\treturn;\n\t\t}\n\n\t\tswitch (e.type) {\n\t\t\tcase 'mousedown': {\n\t\t\t\tif (state.eventAnchor || state.overflowIsOpen) {\n\t\t\t\t\tdispatch({ type: 'reset_calendar' });\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst updatedEvent = getPlaceholderEvent(date, date, isTimeEvent, true);\n\t\t\t\tdispatch({ type: 'event_create_start', date, event: updatedEvent, anchor: placeholderRef.current });\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'mouseenter': {\n\t\t\t\tif (e.buttons !== 1 || !dragActive || !firstClickDate) return;\n\t\t\t\tupdatePlaceholder({ isTimeEvent, firstClickDate, start, date, dispatch });\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'mouseup': {\n\t\t\t\tif (!dragActive) return;\n\n\t\t\t\tonEventCreate &&\n\t\t\t\t\tonEventCreate({\n\t\t\t\t\t\tclickedEvent: state.clickedEvent,\n\t\t\t\t\t\tnewEvent: state.placeholderEvent,\n\t\t\t\t\t\teventRef: placeholderRef.current!,\n\t\t\t\t\t\topenPopover,\n\t\t\t\t\t\treset,\n\t\t\t\t\t});\n\n\t\t\t\tdispatch({ type: 'event_create_end', anchor: placeholderRef.current });\n\t\t\t}\n\t\t}\n\t};\n\treturn mouseEventHandler;\n};\n","/* eslint-disable react-hooks/exhaustive-deps */\nimport { useEffect, useMemo, useRef, useState } from 'react';\n\ntype ObserverRect = Omit<DOMRectReadOnly, 'toJSON'>;\n\nconst defaultState: ObserverRect = {\n\tx: 0,\n\ty: 0,\n\twidth: 0,\n\theight: 0,\n\ttop: 0,\n\tleft: 0,\n\tbottom: 0,\n\tright: 0,\n};\n\nexport function useResizeObserver<T extends HTMLDivElement = HTMLDivElement>(options?: ResizeObserverOptions) {\n\tconst frameID = useRef(0);\n\tconst ref = useRef<T>(null);\n\n\tconst [rect, setRect] = useState<ObserverRect>(defaultState);\n\n\tconst observer = useMemo(\n\t\t() =>\n\t\t\ttypeof window !== 'undefined'\n\t\t\t\t? new ResizeObserver((entries: ResizeObserverEntry[]) => {\n\t\t\t\t\t\tconst entry = entries[0];\n\n\t\t\t\t\t\tif (entry) {\n\t\t\t\t\t\t\tcancelAnimationFrame(frameID.current);\n\n\t\t\t\t\t\t\tframeID.current = requestAnimationFrame(() => {\n\t\t\t\t\t\t\t\tif (ref.current) {\n\t\t\t\t\t\t\t\t\tsetRect(entry.contentRect);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t: null,\n\t\t[]\n\t);\n\n\tuseEffect(() => {\n\t\tif (ref.current) {\n\t\t\tobserver?.observe(ref.current, options);\n\t\t}\n\n\t\treturn () => {\n\t\t\tobserver?.disconnect();\n\n\t\t\tif (frameID.current) {\n\t\t\t\tcancelAnimationFrame(frameID.current);\n\t\t\t}\n\t\t};\n\t}, [ref.current]);\n\n\treturn [ref!, rect] as const;\n}\n\nexport function useElementSize<T extends HTMLDivElement = HTMLDivElement>(options?: ResizeObserverOptions) {\n\tconst [ref, { width, height }] = useResizeObserver<T>(options);\n\treturn { ref, width, height };\n}\n","'use client';\n\nimport { Dispatch, MouseEvent, RefObject, useState } from 'react';\nimport { useFloating, flip, offset, shift, useDismiss, useInteractions } from '@floating-ui/react';\n\nimport { CalendarEvent, CalendarAction, CalendarState } from '~/types';\n\ninterface useCalendarEventProps<T> {\n\tdispatch: Dispatch<CalendarAction>;\n\tevent: CalendarEvent<T>;\n\tisInOverflow: boolean;\n\thasContextMenu: boolean;\n\tstate: CalendarState;\n}\n\nexport function useCalendarEvent<T>({\n\tdispatch,\n\tevent,\n\tisInOverflow,\n\thasContextMenu,\n\tstate,\n}: useCalendarEventProps<T>) {\n\t// Context menu state\n\tconst [contextIsOpen, setContextIsOpen] = useState(false);\n\tconst closeContextMenu = () => setContextIsOpen(false);\n\n\t// Constants\n\tconst isActive = event.id !== null && state.clickedEvent?.id === event.id;\n\n\tconst { refs, floatingStyles, context } = useFloating({\n\t\topen: contextIsOpen,\n\t\tonOpenChange: setContextIsOpen,\n\t\tmiddleware: [\n\t\t\toffset({ mainAxis: 5, alignmentAxis: 4 }),\n\t\t\tflip({\n\t\t\t\tfallbackPlacements: ['left-start'],\n\t\t\t}),\n\t\t\tshift({ padding: 10 }),\n\t\t],\n\t\tplacement: 'right-start',\n\t\t// strategy: 'fixed',\n\t\t// whileElementsMounted: autoUpdate,\n\t});\n\n\tconst dismiss = useDismiss(context);\n\n\tconst { getFloatingProps } = useInteractions([dismiss]);\n\n\t// Handle event right click (context menu)\n\tconst handleContextMenu = (e: MouseEvent, eventRef: RefObject<HTMLDivElement | null>) => {\n\t\tif (!hasContextMenu) return;\n\t\te.preventDefault();\n\n\t\tif (state.popoverIsOpen || (state.overflowIsOpen && !isInOverflow)) return;\n\n\t\trefs.setPositionReference({\n\t\t\tgetBoundingClientRect() {\n\t\t\t\treturn {\n\t\t\t\t\twidth: 0,\n\t\t\t\t\theight: 0,\n\t\t\t\t\tx: e.clientX,\n\t\t\t\t\ty: e.clientY,\n\t\t\t\t\ttop: e.clientY,\n\t\t\t\t\tright: e.clientX,\n\t\t\t\t\tbottom: e.clientY,\n\t\t\t\t\tleft: e.clientX,\n\t\t\t\t};\n\t\t\t},\n\t\t});\n\n\t\tdispatch({ type: 'open_context_menu', event, anchor: eventRef.current });\n\t\tsetContextIsOpen(true);\n\t};\n\n\treturn {\n\t\thandleContextMenu,\n\t\tisActive,\n\t\tcontextIsOpen,\n\t\trefs,\n\t\tfloatingStyles,\n\t\tgetFloatingProps,\n\t\tcloseContextMenu,\n\t};\n}\n","'use client';\n\nimport dayjs, { Dayjs } from 'dayjs';\nimport { Dispatch, SetStateAction, useEffect, useReducer, useState } from 'react';\n\nimport { DEFAULT_STATE, reducer } from '~/state';\n\nimport { CalendarAction, CalendarState, CalendarView } from '../types';\n\nexport type EventsCalendarObject = {\n\tactiveDate: Dayjs;\n\tsetActiveDate: Dispatch<SetStateAction<Dayjs>>;\n\tview: CalendarView;\n\tsetView: Dispatch<SetStateAction<CalendarView>>;\n\tstate: CalendarState;\n\tdispatch: Dispatch<CalendarAction>;\n};\n\nexport type useEventsCalendarProps = {\n\tisInitialised?: boolean;\n\tinitialDate?: string | number | Date | Dayjs;\n\tinitialView?: CalendarView;\n\tcloseOnClickOutside?: boolean;\n};\n\nexport function useEventsCalendar({\n\tisInitialised = false,\n\tinitialDate = dayjs(),\n\tinitialView = 'month',\n\tcloseOnClickOutside = true,\n}: Partial<useEventsCalendarProps> = {}): EventsCalendarObject {\n\tconst [activeDate, setActiveDate] = useState(dayjs(initialDate));\n\tconst [view, setView] = useState<CalendarView>(initialView);\n\n\tconst [state, dispatch] = useReducer(reducer, DEFAULT_STATE);\n\n\t// Reset calendar on click outside of the react component\n\tuseEffect(() => {\n\t\tif (!closeOnClickOutside || isInitialised) return;\n\t\tconst handleClose = () => dispatch({ type: 'reset_calendar' });\n\n\t\twindow.addEventListener('click', handleClose);\n\t\treturn () => {\n\t\t\twindow.removeEventListener('click', handleClose);\n\t\t};\n\t}, [dispatch, isInitialised, closeOnClickOutside]);\n\n\treturn {\n\t\tactiveDate,\n\t\tsetActiveDate,\n\t\tview,\n\t\tsetView,\n\t\tstate,\n\t\tdispatch,\n\t};\n}\n","import { CalendarState } from '../types';\nimport { EMPTY_EVENT } from './EMPTY_EVENT';\n\nexport const DEFAULT_STATE: CalendarState = {\n\t// View/edit event\n\tclickedEvent: EMPTY_EVENT,\n\tpopoverIsOpen: false,\n\teventAnchor: null,\n\n\t// Drag creation\n\tdragActive: false,\n\tfirstClickDate: null,\n\tplaceholderEvent: EMPTY_EVENT,\n\n\t// Event Drag & drop\n\tdragStartOffset: null,\n\teventDragActive: false,\n\n\t// Overflow Popover\n\toverflowAnchor: null,\n\toverflowIsOpen: false,\n};\n","import { EMPTY_EVENT } from './EMPTY_EVENT';\nimport { DEFAULT_STATE } from './DEFAULT_STATE';\nimport { CalendarAction, CalendarState } from '~/types';\n\nexport function reducer(state: CalendarState, action: CalendarAction): CalendarState {\n\tswitch (action.type) {\n\t\t// Reset to deafult state\n\t\tcase 'reset_calendar': {\n\t\t\treturn DEFAULT_STATE;\n\t\t}\n\n\t\t// Overflow\n\t\tcase 'open_overflow': {\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\t...DEFAULT_STATE,\n\n\t\t\t\toverflowIsOpen: true,\n\t\t\t\toverflowAnchor: action.anchor || state.overflowAnchor,\n\t\t\t};\n\t\t}\n\n\t\t// Popover\n\t\tcase 'open_popover': {\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tpopoverIsOpen: true,\n\t\t\t};\n\t\t}\n\n\t\t// Context menu\n\t\tcase 'open_context_menu': {\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tclickedEvent: action.event || state.clickedEvent,\n\t\t\t\teventAnchor: action.anchor || state.eventAnchor,\n\t\t\t};\n\t\t}\n\n\t\t// Calendar event interaction\n\t\tcase 'set_clicked_event': {\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tclickedEvent: action.event || state.clickedEvent,\n\t\t\t\teventAnchor: action.anchor || state.eventAnchor,\n\t\t\t\tplaceholderEvent: EMPTY_EVENT,\n\t\t\t};\n\t\t}\n\n\t\t// Update event\n\t\tcase 'update_event': {\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tdragStartOffset: action.dragStartOffset ?? state.dragStartOffset,\n\t\t\t\tplaceholderEvent: { ...state.placeholderEvent, ...action.event, id: null },\n\t\t\t};\n\t\t}\n\n\t\t// Drag creation\n\t\tcase 'event_create_start': {\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tdragActive: true,\n\t\t\t\tfirstClickDate: action.date || state.firstClickDate,\n\t\t\t\tplaceholderEvent: { ...state.placeholderEvent, ...action.event, isActive: true },\n\t\t\t\teventAnchor: action.anchor || state.eventAnchor,\n\t\t\t};\n\t\t}\n\t\tcase 'event_create_end': {\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tdragActive: false,\n\t\t\t\tfirstClickDate: null,\n\t\t\t\tplaceholderEvent: { ...state.placeholderEvent, isActive: true },\n\t\t\t\teventAnchor: action.anchor || state.eventAnchor,\n\t\t\t};\n\t\t}\n\t\tcase 'event_create_stop': {\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tdragActive: false,\n\t\t\t\tfirstClickDate: null,\n\t\t\t\tclickedEvent: EMPTY_EVENT,\n\t\t\t\tplaceholderEvent: EMPTY_EVENT,\n\t\t\t\teventDragActive: false,\n\t\t\t};\n\t\t}\n\n\t\t// Event drag & drop rescheduling\n\t\tcase 'event_reschedule_start': {\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\teventDragActive: true,\n\t\t\t\tclickedEvent: action.event || state.clickedEvent,\n\t\t\t\tplaceholderEvent: {\n\t\t\t\t\t...state.placeholderEvent,\n\t\t\t\t\torder: 0,\n\t\t\t\t\t...action.event,\n\t\t\t\t\tid: null,\n\t\t\t\t\tisActive: true,\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\t\tcase 'event_reschedule_end': {\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\teventDragActive: false,\n\t\t\t\tdragStartOffset: null,\n\t\t\t\teventAnchor: action.anchor || state.eventAnchor,\n\t\t\t};\n\t\t}\n\n\t\tdefault:\n\t\t\tconsole.log(`Invalid action type ${action.type} passed to calendar reducer`);\n\t\t\treturn state;\n\t}\n}\n","import { EventsCalendarObject, useEventsCalendar } from './useEventsCalendar';\n\nexport function useInitEventsCalendar(calendar?: EventsCalendarObject): EventsCalendarObject {\n\tconst isInitialised = !!calendar;\n\tconst defaultCalendar = useEventsCalendar({ isInitialised });\n\n\treturn calendar || defaultCalendar;\n}\n","import './TimeEvent.css';\n\nimport { CalendarEvent } from '~/types';\nimport { DEFAULT_COLOR, getBackgroundFromGroups } from '~/utils';\n\ninterface TimeEventProps {\n\tevent: CalendarEvent;\n\tisCompact: boolean;\n}\n\nexport function TimeEvent({ event, isCompact }: TimeEventProps) {\n\t// Destructure event\n\tconst { title, start, groups } = event;\n\n\t// Event background color(s)\n\tconst colorStyles = getBackgroundFromGroups(groups);\n\tconst eventColors = groups?.map(g => g.color).filter(Boolean) ?? [];\n\tconst borderStyle = { border: `1px solid ${eventColors[0] ?? DEFAULT_COLOR}` };\n\n\treturn (\n\t\t<div className='events-calendar-time' data-sm={isCompact} style={borderStyle}>\n\t\t\t<div className='events-calendar-time-dot' style={colorStyles}></div>\n\t\t\t<div className='events-calendar-time-text'>{start.format('h:mma')}</div>\n\t\t\t<span className='events-calendar-time-label'>{title}</span>\n\t\t</div>\n\t);\n}\n","import { OverflowArrowType } from '~/types';\n\nexport const getClipPath = (overflowArrows: OverflowArrowType): string | undefined => {\n\tswitch (overflowArrows) {\n\t\tcase 'both':\n\t\t\treturn 'polygon(10px 0%, calc(100% - 10px) 0%, 100% 50%, calc(100% - 10px) 100%, 10px 100%, 0% 50%)';\n\t\tcase 'left':\n\t\t\treturn 'polygon(10px 0%, 100% 0%, 100% 100%, 10px 100%, 0% 50%)';\n\t\tcase 'right':\n\t\t\treturn 'polygon(0% 0%, calc(100% - 10px) 0%, 100% 50%, calc(100% - 10px) 100%, 0% 100%)';\n\t\tcase 'none':\n\t\t\treturn undefined;\n\t\tdefault:\n\t\t\treturn undefined;\n\t}\n};\n","import { CSSProperties } from 'react';\nimport { Dayjs } from 'dayjs';\n\nimport { OrderedCalendarEvent } from '~/types';\n\nexport const getEventStyles = (\n\tisInOverflow: boolean,\n\tevent: OrderedCalendarEvent,\n\tdate: Dayjs,\n\tisCompact: boolean,\n\tisInWeekHeader: boolean,\n\tisInDayHeader: boolean\n) => {\n\tif (isInOverflow) return { width: '100%' };\n\tconst weekStart = event.start.isSame(date, 'w') ? event.start.day() : 0;\n\tconst weekEnd = event.end.isSame(date, 'w') ? event.end.day() : 6;\n\tconst styles: CSSProperties = {\n\t\tposition: 'absolute',\n\t\tleft: isInDayHeader ? '0.125rem' : `calc(${(weekStart * 100) / 7}% + 0.125rem)`,\n\t\ttop: `calc(${isInDayHeader ? 4 : isCompact ? 24 : 26}px + ${event.order * (isCompact ? 21 : 22)}px + ${\n\t\t\tisInWeekHeader ? 6 : 0\n\t\t}px)`,\n\t\twidth: isInDayHeader ? 'calc(100% - 6px)' : `calc(${(100 * (1 + (weekEnd - weekStart))) / 7}% - 0.25rem - 1px)`,\n\t};\n\treturn styles;\n};\n","import { CalendarEvent, CalendarState } from '~/types';\n\nexport function isBeingDragged(state: CalendarState, event: CalendarEvent) {\n\treturn !event.isActive && event.id === state.placeholderEvent.dragId;\n}\n","import { MinMaxDatesInView, OverflowArrowType } from '~/types';\nimport dayjs from 'dayjs';\n\nexport const getOverflowArrows = (\n\tisInOverflow: boolean,\n\tdate: dayjs.Dayjs,\n\tstart: dayjs.Dayjs,\n\tend: dayjs.Dayjs,\n\tminMaxDatesInView?: MinMaxDatesInView\n): OverflowArrowType => {\n\tconst showLeftArrow = isInOverflow\n\t\t? start.isBefore(date, 'day')\n\t\t: !!minMaxDatesInView?.first && start.isBefore(minMaxDatesInView.first, 'day');\n\n\tconst showRightArrow = isInOverflow\n\t\t? end.isAfter(date, 'day')\n\t\t: !!minMaxDatesInView?.last && end.isAfter(minMaxDatesInView.last, 'day');\n\n\treturn showLeftArrow && showRightArrow ? 'both' : showLeftArrow ? 'left' : showRightArrow ? 'right' : 'none';\n};\n","import { OrderedCalendarEvent } from '~/types';\nimport { getBackgroundFromGroups } from '~/utils';\n\nexport const getWeekOrDayEventStyles = (\n\tevent: OrderedCalendarEvent,\n\ttimeDuration: number,\n\tdayIndex: number,\n\toverlapOffset: number,\n\tisActive: boolean\n) => {\n\tconst timeColumnOffset = dayIndex === 0 ? 6 : 0;\n\n\treturn {\n\t\tgridColumnStart: dayIndex + 1,\n\t\tgridRowStart: event.start && event.start.hour() * 4 + Math.round(event.start.minute() / 15) + 1,\n\t\tgridRowEnd: event.end && event.end.hour() * 4 + Math.round(event.end.minute() / 15) + 1,\n\t\theight: 12 * ((timeDuration || 60) / 15) - 2,\n\t\tborderWidth: event.indent > 0 ? (timeDuration > 30 ? '1px' : '0.5px') : 0,\n\t\tmarginLeft: overlapOffset * event.indent + timeColumnOffset,\n\t\twidth: `calc(100% - ${overlapOffset * (event.indent + 1) + timeColumnOffset}px)`,\n\t\tzIndex: isActive ? 100 : 1 + event.order,\n\t\t...getBackgroundFromGroups(event.groups),\n\t};\n};\n","import dayjs from 'dayjs';\nimport './AllDayEvent.css';\n\nimport { getBackgroundFromGroups } from '~/utils';\nimport { CalendarEvent, MinMaxDatesInView } from '~/types';\n\nimport { getClipPath, getOverflowArrows } from './utils';\n\ninterface AllDayEventProps {\n\tdate: dayjs.Dayjs;\n\tevent: CalendarEvent;\n\tminMaxDatesInView?: MinMaxDatesInView;\n\tisCompact: boolean;\n\tisInOverflow: boolean;\n}\n\nexport function AllDayEvent({ date, event, minMaxDatesInView, isCompact, isInOverflow }: AllDayEventProps) {\n\t// Calculate arrows for display in overflow popover\n\tconst overflowArrows = getOverflowArrows(isInOverflow, date, event.start, event.end, minMaxDatesInView);\n\n\t// Event background color(s)\n\tconst clipPath = getClipPath(overflowArrows);\n\tconst colorstyles = getBackgroundFromGroups(event.groups);\n\n\treturn (\n\t\t<div className='events-calendar-all-day-event' style={{ ...colorstyles, clipPath }}>\n\t\t\t<div className='events-calendar-all-day-event-content' data-sm={isCompact}>\n\t\t\t\t<span className='events-calendar-all-day-event-text' data-arrows={overflowArrows}>\n\t\t\t\t\t{event.title}\n\t\t\t\t</span>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n","'use client';\n\nimport { createPortal } from 'react-dom';\nimport { useEffect, useRef, ReactNode } from 'react';\n\nimport { useBindPopover } from './useBindPopover';\n\ninterface PopoverContentProps {\n\tanchor: Element;\n\tzIndex: number;\n\tchildren: ReactNode;\n}\n\nexport function PopoverContent({ anchor, zIndex, children }: PopoverContentProps) {\n\tconst styles = useRef({});\n\tconst { refs, floatingStyles } = useBindPopover({ anchor });\n\n\t// Only apply repositioning styles after element is mounted\n\tuseEffect(() => {\n\t\tsetTimeout(() => {\n\t\t\tstyles.current = { transitionDuration: '250ms', transitionProperty: 'all' };\n\t\t}, 100);\n\t}, []);\n\n\treturn createPortal(\n\t\t<div ref={refs.setFloating} style={{ ...floatingStyles, ...styles.current, zIndex }}>\n\t\t\t<div onClick={e => e.stopPropagation()}>{children}</div>\n\t\t</div>,\n\t\tdocument.body\n\t);\n}\n","'use client';\n\nimport {\n\tuseFloating,\n\tautoPlacement,\n\toffset,\n\tdetectOverflow,\n\tautoUpdate,\n\thide,\n\tElementRects,\n\tElements,\n\tMiddlewareData,\n\tPlacement,\n\tStrategy,\n} from '@floating-ui/react-dom';\nimport { Platform } from '@floating-ui/core';\n\n// Constants\nconst padding = 32;\nconst padding_x = 32;\nconst padding_y = 16;\n\ninterface useBindPopoverProps {\n\tanchor: Element | null;\n}\n\nexport function useBindPopover({ anchor }: useBindPopoverProps) {\n\tconst preventViewportOverflow = {\n\t\tname: 'preventViewportOverflow',\n\t\tasync fn(state: {\n\t\t\tplatform: Platform;\n\t\t\tplacement: Placement;\n\t\t\tstrategy: Strategy;\n\t\t\tx: number;\n\t\t\ty: number;\n\t\t\tinitialPlacement: Placement;\n\t\t\tmiddlewareData: MiddlewareData;\n\t\t\trects: ElementRects;\n\t\t\telements: Elements;\n\t\t}) {\n\t\t\tconst overflow = await detectOverflow(state);\n\n\t\t\t// If overflows > 0 (there is an overflow), recalculate position\n\t\t\tlet xPosition = state.x;\n\t\t\tif (overflow.left > 0) xPosition = state.x + overflow.left + padding_x;\n\t\t\tif (overflow.right > 0) xPosition = state.x - overflow.right - padding_x;\n\n\t\t\tlet yPosition = state.y;\n\t\t\tif (overflow.top > 0) yPosition = state.y + overflow.top + padding_y;\n\t\t\tif (overflow.bottom > 0) yPosition = state.y - overflow.bottom - padding_y;\n\n\t\t\t// If reference el hidden (due to scrolling), only reassign x position\n\t\t\tif (state.middlewareData.hide?.referenceHidden) return { ...state, x: xPosition };\n\n\t\t\treturn { ...state, x: xPosition, y: yPosition };\n\t\t},\n\t};\n\n\tconst { refs, floatingStyles } = useFloating({\n\t\telements: {\n\t\t\treference: anchor,\n\t\t},\n\t\tplacement: 'bottom',\n\t\tstrategy: 'fixed',\n\t\twhileElementsMounted: autoUpdate,\n\t\tmiddleware: [\n\t\t\thide(),\n\t\t\toffset(8),\n\t\t\tautoPlacement({\n\t\t\t\tcrossAxis: true,\n\t\t\t\tpadding: padding,\n\t\t\t}),\n\t\t\tpreventViewportOverflow,\n\t\t],\n\t});\n\n\treturn { refs, floatingStyles };\n}\n","'use client';\n\nimport { PopoverContent } from './PopoverContent';\n\ninterface PopoverProps {\n\tanchor: HTMLDivElement;\n\tisOpen: boolean;\n\tzIndex?: number;\n\tchildren: React.ReactNode;\n}\n\nexport function EventsCalendarPopover({ anchor, isOpen, zIndex = 1, children }: PopoverProps) {\n\tif (!isOpen || !anchor) return null;\n\treturn (\n\t\t<PopoverContent anchor={anchor} zIndex={zIndex}>\n\t\t\t{children}\n\t\t</PopoverContent>\n\t);\n}\n","'use client';\n\nimport dayjs from 'dayjs';\nimport { Dispatch } from 'react';\nimport './CellHeader.css';\n\nimport { CalendarAction, CalendarState, DateRecord } from '~/types';\n\nimport { ShowMoreText } from './ShowMoreText';\n\ninterface CellHeaderProps {\n\tdayRecord: DateRecord;\n\tdispatch: Dispatch<CalendarAction>;\n\tisCompact: boolean;\n\tnumOverflowEvents: number;\n\tstate: CalendarState;\n}\n\nexport function CellHeader({ dayRecord, dispatch, isCompact, numOverflowEvents, state }: CellHeaderProps) {\n\tconst { date, isCurrentMonth } = dayRecord;\n\n\tconst isToday = date.isSame(dayjs(), 'day');\n\tconst textColour = isToday ? 'white' : isCurrentMonth ? 'dark' : 'dim';\n\n\treturn (\n\t\t<div className='events-calendar-month-cell-header'>\n\t\t\t<div className='events-calendar-month-cell-date-container' data-today={isToday}>\n\t\t\t\t<span className='events-calendar-month-cell-date-label' data-color={textColour} data-sm={isCompact}>\n\t\t\t\t\t{date.date()}\n\t\t\t\t</span>\n\t\t\t</div>\n\t\t\t<ShowMoreText\n\t\t\t\tdate={date}\n\t\t\t\tdispatch={dispatch}\n\t\t\t\tisCompact={isCompact}\n\t\t\t\tnumOverflowEvents={numOverflowEvents}\n\t\t\t\tstate={state}\n\t\t\t/>\n\t\t</div>\n\t);\n}\n","'use client';\n\nimport { Dayjs } from 'dayjs';\nimport { Dispatch, MouseEvent, useRef } from 'react';\nimport './ShowMoreText.css';\n\nimport { CalendarAction, CalendarState } from '~/types';\n\ninterface ShowMoreTextProps {\n\tdate: Dayjs;\n\tdispatch: Dispatch<CalendarAction>;\n\tisCompact: boolean;\n\tnumOverflowEvents: number;\n\tstate: CalendarState;\n}\n\nexport function ShowMoreText({ date, dispatch, isCompact, numOverflowEvents, state }: ShowMoreTextProps) {\n\tconst ref = useRef<HTMLDivElement>(null);\n\n\tconst handleClick = (e: MouseEvent) => {\n\t\tif (state.overflowIsOpen && e.target === state.overflowAnchor) {\n\t\t\tdispatch({ type: 'reset_calendar' });\n\t\t} else {\n\t\t\tdispatch({ type: 'open_overflow', date, anchor: ref.current });\n\t\t}\n\t};\n\n\tif (!numOverflowEvents) return;\n\n\treturn (\n\t\t<div\n\t\t\tclassName='events-calendar-show-more-text-container'\n\t\t\tdata-sm={isCompact}\n\t\t\tdata-date={date.format('DD-MMM-YYYY')}\n\t\t\tonClick={handleClick}\n\t\t\tonMouseDown={e => e.stopPropagation()}\n\t\t\tref={ref}\n\t\t>\n\t\t\t<span className='events-calendar-show-more-text-label events-calendar-sm-only'>{`+${numOverflowEvents}`}</span>\n\t\t\t<span className='events-calendar-show-more-text-label events-calendar-lg-only'>{numOverflowEvents} more</span>\n\t\t</div>\n\t);\n}\n","import React, { Dispatch, ReactNode, RefObject } from 'react';\nimport { Dayjs } from 'dayjs';\n\nimport './EventCell.css';\n\nimport { Event } from '~/components';\nimport {\n\tDateRecord,\n\tMinMaxDatesInView,\n\tMouseEventHandler,\n\tEventsCalendarContextMenuProps,\n\tCalendarAction,\n\tCalendarState,\n\tEventClickArgs,\n\tEventEditProps,\n\tOrderedCalendarEvent,\n\tCalendarEvent,\n} from '~/types';\n\nimport { CellHeader } from './CellHeader';\nimport { ShowMoreText } from './ShowMoreText';\nimport { filterByDate, getVisibleEvents, isBetween, updateEvent } from '~/utils';\n\ninterface CellContainerProps<T> {\n\tEVENT_LIMIT: number;\n\tenableRescheduling: boolean;\n\tcompact: boolean;\n\tdayRecord: DateRecord;\n\tdispatch: Dispatch<CalendarAction>;\n\thandleMouseEvent: MouseEventHandler;\n\theaderHeight?: number | string;\n\tisInWeekHeader?: boolean;\n\tisInDayHeader?: boolean;\n\tminMaxDatesInView: MinMaxDatesInView;\n\tonEventClick?: (props: EventClickArgs<T>) => void;\n\tonEventReschedule?: (props: EventEditProps) => void;\n\torderedEvents: OrderedCalendarEvent<T>[];\n\tplaceholderRef: RefObject<HTMLDivElement | null>;\n\trenderContextMenu?: (props: EventsCalendarContextMenuProps) => ReactNode;\n\tstate: CalendarState;\n}\n\nconst getPlaceholderActiveState = (placeholderEvent: CalendarEvent, date: Dayjs, isInHeader: boolean = false) => {\n\tconst { isActive, isAllDay, start, end } = placeholderEvent;\n\treturn (\n\t\tisActive &&\n\t\t(!isInHeader || isAllDay) &&\n\t\tisBetween(date, start, end) &&\n\t\t(date.day() === 0 || date.isSame(start, 'day'))\n\t);\n};\n\nexport function CellContainer<T>({\n\tEVENT_LIMIT,\n\tenableRescheduling,\n\tcompact,\n\tdayRecord,\n\tdispatch,\n\thandleMouseEvent,\n\theaderHeight = '100%', // Explicit cell height for week header\n\tisInWeekHeader = false,\n\tisInDayHeader = false,\n\tminMaxDatesInView,\n\tonEventClick,\n\tonEventReschedule,\n\torderedEvents,\n\tplaceholderRef,\n\trenderContextMenu,\n\tstate,\n}: CellContainerProps<T>) {\n\tconst { date } = dayRecord;\n\n\t// Calculate visible events within this cell\n\tconst eventsByDate = filterByDate(orderedEvents, date);\n\tconst visibleEvents = getVisibleEvents(eventsByDate, date, EVENT_LIMIT, isInDayHeader);\n\n\t// Add button to show events that do not fit in cell, if required\n\tconst numOverflowEvents = eventsByDate.reduce((a, c) => a + (c.order >= EVENT_LIMIT ? 1 : 0), 0);\n\tconst showOverflowButton = (isInDayHeader || isInWeekHeader) && numOverflowEvents > 0;\n\n\t// Add placeholder event to events when required\n\tconst showPlaceholder = getPlaceholderActiveState(state.placeholderEvent, date, isInWeekHeader || isInDayHeader);\n\tif (showPlaceholder) visibleEvents.push(state.placeholderEvent as OrderedCalendarEvent<T>);\n\n\t// Popover handler\n\tconst openPopover = () => dispatch({ type: 'open_popover' });\n\tconst reset = () => dispatch({ type: 'reset_calendar' });\n\n\t// Cell handlers\n\tconst handleMouseDown = (e: React.MouseEvent) => {\n\t\thandleMouseEvent(e, date, false, placeholderRef);\n\t};\n\tconst handleMouseEnter = (e: React.MouseEvent) => {\n\t\tif (state.eventDragActive) updateEvent({ state, dispatch, date, view: 'month' });\n\t\thandleMouseEvent(e, date, false, placeholderRef);\n\t};\n\tconst handleMouseUp = (e: React.MouseEvent) => {\n\t\tif (state.eventDragActive) {\n\t\t\tdispatch({ type: 'event_reschedule_end', anchor: placeholderRef.current });\n\t\t\tonEventReschedule?.({\n\t\t\t\tclickedEvent: state.clickedEvent,\n\t\t\t\tnewEvent: state.placeholderEvent,\n\t\t\t\teventRef: placeholderRef.current!,\n\t\t\t\topenPopover,\n\t\t\t\treset,\n\t\t\t});\n\t\t}\n\t\thandleMouseEvent(e, date, false, placeholderRef);\n\t};\n\n\treturn (\n\t\t<>\n\t\t\t<div\n\t\t\t\tclassName='events-calendar-month-cell'\n\t\t\t\tdata-border={!isInDayHeader && date.day() !== 6}\n\t\t\t\tonMouseDown={handleMouseDown}\n\t\t\t\tonMouseEnter={handleMouseEnter}\n\t\t\t\tonMouseUp={handleMouseUp}\n\t\t\t\tstyle={{ height: headerHeight, cursor: state.eventDragActive ? 'grabbing' : 'auto' }}\n\t\t\t>\n\t\t\t\t{/*  If month view, list cell header and overflow text */}\n\t\t\t\t{!isInWeekHeader && !isInDayHeader && (\n\t\t\t\t\t<CellHeader\n\t\t\t\t\t\tstate={state}\n\t\t\t\t\t\tdispatch={dispatch}\n\t\t\t\t\t\tisCompact={compact}\n\t\t\t\t\t\tdayRecord={dayRecord}\n\t\t\t\t\t\tnumOverflowEvents={numOverflowEvents}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t\t<div className='events-calendar-month-cell-content' data-week={isInWeekHeader || isInDayHeader}>\n\t\t\t\t\t{showOverflowButton && (\n\t\t\t\t\t\t<ShowMoreText\n\t\t\t\t\t\t\tdate={date}\n\t\t\t\t\t\t\tstate={state}\n\t\t\t\t\t\t\tdispatch={dispatch}\n\t\t\t\t\t\t\tisCompact={compact}\n\t\t\t\t\t\t\tnumOverflowEvents={numOverflowEvents}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t{/* Render events (which may span multiple cells) */}\n\t\t\t{visibleEvents.map(event => (\n\t\t\t\t<Event\n\t\t\t\t\tkey={event.id}\n\t\t\t\t\tdate={date}\n\t\t\t\t\tview='month'\n\t\t\t\t\tstate={state}\n\t\t\t\t\tevent={event}\n\t\t\t\t\tcompact={compact}\n\t\t\t\t\tdispatch={dispatch}\n\t\t\t\t\tonEventClick={onEventClick}\n\t\t\t\t\tisInDayHeader={isInDayHeader}\n\t\t\t\t\tisInWeekHeader={isInWeekHeader}\n\t\t\t\t\tplaceholderRef={placeholderRef}\n\t\t\t\t\trenderContextMenu={renderContextMenu}\n\t\t\t\t\tminMaxDatesInView={minMaxDatesInView}\n\t\t\t\t\tenableRescheduling={enableRescheduling}\n\t\t\t\t/>\n\t\t\t))}\n\t\t</>\n\t);\n}\n","import './CircularLoader.css';\n\nexport function CircularLoader({ visible }: { visible: boolean }) {\n\tif (!visible) return;\n\treturn (\n\t\t<div className='events-calendar-loader-wrapper'>\n\t\t\t<span className='events-calendar-loader'></span>\n\t\t</div>\n\t);\n}\n","import './HeaderButton.css';\n\ninterface HeaderButtonProps {\n\tisGroupButton?: boolean;\n\tactive?: boolean;\n\tonClick?: () => void;\n\tvariant?: 'outline' | 'subtle';\n\tchildren: React.ReactNode;\n}\n\nexport function HeaderButton({\n\tisGroupButton,\n\tactive = false,\n\tonClick = () => null,\n\tvariant,\n\tchildren,\n}: HeaderButtonProps) {\n\treturn (\n\t\t<button\n\t\t\ttype='button'\n\t\t\tonClick={onClick}\n\t\t\tdata-group={isGroupButton}\n\t\t\tdata-active={active}\n\t\t\tdata-variant={variant}\n\t\t\tclassName='events-calendar-header-button'\n\t\t>\n\t\t\t{children}\n\t\t</button>\n\t);\n}\n","'use client';\n\nimport { Dispatch, ReactNode, SetStateAction } from 'react';\nimport './Header.css';\n\nimport { CalendarView } from '~/types';\nimport { CALENDAR_VIEWS } from '~/utils';\n\nimport { HeaderButton } from './HeaderButton';\n\ninterface ControlsProps {\n\thideViewToggle?: boolean;\n\tviews: CalendarView[];\n\tview: CalendarView;\n\tsetView: Dispatch<SetStateAction<CalendarView>>;\n\tchildren: ReactNode;\n}\n\nexport function Controls({ hideViewToggle, views, setView, view, children }: ControlsProps) {\n\tif (views.length < 1 && !children) return;\n\n\tconst viewsToDisplay = CALENDAR_VIEWS.filter(validView => views.includes(validView));\n\n\treturn (\n\t\t<div className='events-calendar-header-controls'>\n\t\t\t{!hideViewToggle && viewsToDisplay.length > 1 && (\n\t\t\t\t<div className='events-calendar-button-group'>\n\t\t\t\t\t{viewsToDisplay.map(viewLabel => (\n\t\t\t\t\t\t<HeaderButton key={viewLabel} isGroupButton active={view === viewLabel} onClick={() => setView(viewLabel)}>\n\t\t\t\t\t\t\t{viewLabel}\n\t\t\t\t\t\t</HeaderButton>\n\t\t\t\t\t))}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t{children}\n\t\t</div>\n\t);\n}\n","'use client';\n\nimport { Dispatch, SetStateAction } from 'react';\nimport dayjs from 'dayjs';\nimport './Header.css';\n\nimport { CalendarView } from '~/types';\n\nimport { HeaderButton } from './HeaderButton';\nimport { IconChevronLeft, IconChevronRight } from '../icons';\n\nconst getHeaderTitle = (currDate: dayjs.Dayjs, view: CalendarView) => {\n\tconst weekStart = currDate.startOf('week');\n\tconst weekEnd = currDate.endOf('week');\n\treturn view === 'year'\n\t\t? currDate.format('YYYY')\n\t\t: view === 'month'\n\t\t\t? currDate.format('MMMM YYYY')\n\t\t\t: view === 'week'\n\t\t\t\t? `${weekStart.format('MMM DD')} - ${weekEnd.format('MMM DD, YYYY')}`\n\t\t\t\t: currDate.format('D MMMM, YYYY');\n};\n\ninterface NavigationProps {\n\tactiveDate: dayjs.Dayjs;\n\tsetActiveDate: Dispatch<SetStateAction<dayjs.Dayjs>>;\n\tview: CalendarView;\n}\n\nexport function Navigation({ activeDate, setActiveDate, view }: NavigationProps) {\n\t// Navigation handlers\n\tconst handleToday = () => setActiveDate(dayjs());\n\tconst handleNext = (increment: CalendarView) => setActiveDate(currDate => currDate.add(1, increment));\n\tconst handlePrev = (increment: CalendarView) => setActiveDate(currDate => currDate.subtract(1, increment));\n\n\treturn (\n\t\t<div className='events-calendar-nav'>\n\t\t\t<HeaderButton variant='outline' onClick={handleToday}>\n\t\t\t\tToday\n\t\t\t</HeaderButton>\n\t\t\t<div className='events-calendar-nav-actions'>\n\t\t\t\t<HeaderButton variant='subtle' onClick={() => handlePrev(view)}>\n\t\t\t\t\t<IconChevronLeft size='1.5rem' />\n\t\t\t\t</HeaderButton>\n\t\t\t\t<HeaderButton variant='subtle' onClick={() => handleNext(view)}>\n\t\t\t\t\t<IconChevronRight size='1.5rem' />\n\t\t\t\t</HeaderButton>\n\t\t\t</div>\n\t\t\t<span className='events-calendar-title'>{getHeaderTitle(activeDate, view)}</span>\n\t\t</div>\n\t);\n}\n","interface Props {\n\tsize?: string | number;\n\tstroke?: string | number;\n}\n\nexport function IconChevronLeft({ size = '24', stroke = '2' }: Props) {\n\treturn (\n\t\t<svg\n\t\t\txmlns='http://www.w3.org/2000/svg'\n\t\t\twidth={size}\n\t\t\theight={size}\n\t\t\tviewBox='0 0 24 24'\n\t\t\tfill='none'\n\t\t\tstroke='currentColor'\n\t\t\tstrokeWidth={stroke}\n\t\t\tstrokeLinecap='round'\n\t\t\tstrokeLinejoin='round'\n\t\t\tclassName='icon icon-tabler icons-tabler-outline icon-tabler-chevron-left'\n\t\t>\n\t\t\t<path stroke='none' d='M0 0h24v24H0z' fill='none' />\n\t\t\t<path d='M15 6l-6 6l6 6' />\n\t\t</svg>\n\t);\n}\n","interface Props {\n\tsize?: string | number;\n\tstroke?: string | number;\n}\n\nexport function IconChevronRight({ size = '24', stroke = '2' }: Props) {\n\treturn (\n\t\t<svg\n\t\t\txmlns='http://www.w3.org/2000/svg'\n\t\t\twidth={size}\n\t\t\theight={size}\n\t\t\tviewBox='0 0 24 24'\n\t\t\tfill='none'\n\t\t\tstroke='currentColor'\n\t\t\tstrokeWidth={stroke}\n\t\t\tstrokeLinecap='round'\n\t\t\tstrokeLinejoin='round'\n\t\t\tclassName='icon icon-tabler icons-tabler-outline icon-tabler-chevron-right'\n\t\t>\n\t\t\t<path stroke='none' d='M0 0h24v24H0z' fill='none' />\n\t\t\t<path d='M9 6l6 6l-6 6' />\n\t\t</svg>\n\t);\n}\n","'use client';\n\nimport dayjs from 'dayjs';\nimport { Dispatch, ReactNode, SetStateAction } from 'react';\nimport './Header.css';\n\nimport { CalendarView } from '~/types';\nimport { CALENDAR_VIEWS } from '~/utils';\n\nimport { Controls } from './Controls';\nimport { Navigation } from './Navigation';\n\ninterface HeaderProps {\n\tactiveDate: dayjs.Dayjs;\n\tview?: CalendarView;\n\thideViewToggle?: boolean;\n\tmaxDate?: dayjs.Dayjs | null;\n\tminDate?: dayjs.Dayjs | null;\n\tonClick?: () => void;\n\tsetActiveDate: Dispatch<SetStateAction<dayjs.Dayjs>>;\n\tsetView?: Dispatch<SetStateAction<CalendarView>>;\n\tviews?: CalendarView[];\n\tcustomControls?: ReactNode;\n}\nexport function Header({\n\tactiveDate,\n\tonClick = () => null,\n\thideViewToggle,\n\tsetActiveDate,\n\tsetView = () => null,\n\tviews = [...CALENDAR_VIEWS],\n\tview = 'month',\n\tcustomControls,\n}: HeaderProps) {\n\treturn (\n\t\t<div className='events-calendar-header' onClick={onClick}>\n\t\t\t<Navigation activeDate={activeDate} setActiveDate={setActiveDate} view={view} />\n\t\t\t<Controls hideViewToggle={hideViewToggle} views={views} setView={setView} view={view}>\n\t\t\t\t{customControls}\n\t\t\t</Controls>\n\t\t</div>\n\t);\n}\n","'use client';\n\nimport { Dayjs } from 'dayjs';\nimport { Dispatch, ReactNode, RefObject, useMemo } from 'react';\n\nimport './TimeView.css';\n\nimport {\n\tCalendarAction,\n\tCalendarState,\n\tEventClickArgs,\n\tEventEditProps,\n\tCalendarEvent,\n\tMouseEventHandler,\n\tEventsCalendarContextMenuProps,\n\tOrderedCalendarEvent,\n} from '~/types';\nimport { Event } from '~/components';\nimport { isBetween } from '~/utils';\n\nimport { useSetInitialScroll } from './hooks';\nimport { getWeekDates, getEventsByDayMap } from './utils';\nimport { TimeViewHeader, HoursColumn, TimeBackground, TimeIndicator } from './components';\n\ninterface TimeViewProps<T> {\n\tview: 'day' | 'week';\n\tenableRescheduling: boolean;\n\tcompact: boolean;\n\tactiveDate: Dayjs;\n\tdispatch: Dispatch<CalendarAction>;\n\tevents: CalendarEvent<T>[];\n\thandleMouseEvent: MouseEventHandler;\n\thandleStopDrag: () => void;\n\tplaceholderRef: RefObject<HTMLDivElement | null>;\n\tonEventClick?: (props: EventClickArgs<T>) => void;\n\tonEventReschedule?: (props: EventEditProps) => void;\n\trenderContextMenu?: (props: EventsCalendarContextMenuProps) => ReactNode;\n\tstate: CalendarState;\n}\n\nexport function TimeView<T>({\n\tview,\n\tactiveDate,\n\tcompact,\n\tdispatch,\n\tenableRescheduling,\n\tevents,\n\thandleMouseEvent,\n\thandleStopDrag,\n\tonEventClick,\n\tonEventReschedule,\n\tplaceholderRef,\n\trenderContextMenu,\n\tstate,\n}: TimeViewProps<T>) {\n\t// Constants\n\tconst isDayView = view === 'day';\n\tconst isWeekView = view === 'week';\n\n\t// Split events into all day / timed\n\tconst allDayEvents = events.filter(event => event.isAllDay);\n\tconst timeEvents = events.filter(event => !event.isAllDay);\n\n\t// Scroll viewport to current time\n\tconst viewportRef = useSetInitialScroll();\n\n\t// Get week days\n\tconst weekDatesArray = useMemo(() => getWeekDates(activeDate, view), [activeDate, view]);\n\tconst minMaxDatesInView = {\n\t\tfirst: isDayView ? activeDate : weekDatesArray[0].date,\n\t\tlast: isDayView ? activeDate : weekDatesArray[6].date,\n\t};\n\n\t// Create a map of events by day\n\tconst dayMap = useMemo(() => getEventsByDayMap<T>(weekDatesArray, timeEvents), [timeEvents, weekDatesArray]);\n\n\treturn (\n\t\t<div className='events-calendar-time-view'>\n\t\t\t<TimeViewHeader\n\t\t\t\tallDayEvents={allDayEvents}\n\t\t\t\tcompact={compact}\n\t\t\t\tdispatch={dispatch}\n\t\t\t\tenableRescheduling={enableRescheduling}\n\t\t\t\thandleMouseEvent={handleMouseEvent}\n\t\t\t\thandleStopDrag={handleStopDrag}\n\t\t\t\tminMaxDatesInView={minMaxDatesInView}\n\t\t\t\tonEventClick={onEventClick}\n\t\t\t\tonEventReschedule={onEventReschedule}\n\t\t\t\tplaceholderRef={placeholderRef}\n\t\t\t\trenderContextMenu={renderContextMenu}\n\t\t\t\tstate={state}\n\t\t\t\tview={view}\n\t\t\t\tweekDatesArray={weekDatesArray}\n\t\t\t/>\n\t\t\t<div ref={viewportRef} className='events-calendar-time-view-scroll-wrapper'>\n\t\t\t\t<div className='events-calendar-time-view-grid-wrapper'>\n\t\t\t\t\t<HoursColumn />\n\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName='events-calendar-time-view-grid'\n\t\t\t\t\t\tdata-isweekview={isWeekView}\n\t\t\t\t\t\tonMouseEnter={handleStopDrag}\n\t\t\t\t\t\tonMouseLeave={handleStopDrag}\n\t\t\t\t\t>\n\t\t\t\t\t\t<TimeBackground\n\t\t\t\t\t\t\tactiveDate={activeDate}\n\t\t\t\t\t\t\tdispatch={dispatch}\n\t\t\t\t\t\t\thandleMouseEvent={handleMouseEvent}\n\t\t\t\t\t\t\tonEventReschedule={onEventReschedule}\n\t\t\t\t\t\t\tplaceholderRef={placeholderRef}\n\t\t\t\t\t\t\tstate={state}\n\t\t\t\t\t\t\tview={view}\n\t\t\t\t\t\t/>\n\n\t\t\t\t\t\t<TimeIndicator activeDate={activeDate} isDayView={isDayView} />\n\n\t\t\t\t\t\t{/* Render events */}\n\t\t\t\t\t\t{weekDatesArray.map(({ date }, dayIndex) => {\n\t\t\t\t\t\t\tconst orderedEvents = dayMap[dayIndex];\n\n\t\t\t\t\t\t\t// Add placeholder event to events when required\n\t\t\t\t\t\t\tconst { isActive, isAllDay, start, end } = state.placeholderEvent;\n\t\t\t\t\t\t\tconst showPlaceholder = isActive && !isAllDay && isBetween(date, start, end);\n\t\t\t\t\t\t\tif (showPlaceholder) orderedEvents.push(state.placeholderEvent as OrderedCalendarEvent<T>);\n\n\t\t\t\t\t\t\treturn orderedEvents.map(event => (\n\t\t\t\t\t\t\t\t<Event\n\t\t\t\t\t\t\t\t\tdate={date}\n\t\t\t\t\t\t\t\t\tdispatch={dispatch}\n\t\t\t\t\t\t\t\t\tenableRescheduling={enableRescheduling}\n\t\t\t\t\t\t\t\t\tevent={event}\n\t\t\t\t\t\t\t\t\tkey={event.id}\n\t\t\t\t\t\t\t\t\tonEventClick={onEventClick}\n\t\t\t\t\t\t\t\t\tplaceholderRef={placeholderRef}\n\t\t\t\t\t\t\t\t\trenderContextMenu={renderContextMenu}\n\t\t\t\t\t\t\t\t\tstate={state}\n\t\t\t\t\t\t\t\t\tview={view}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t));\n\t\t\t\t\t\t})}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n","import dayjs from 'dayjs';\nimport { useEffect, useRef } from 'react';\n\n// Constants\nconst PIXELS_PER_HOUR = 48;\nconst MINUTES_PER_HOUR = 60;\nconst NOW_IN_MINUTES = dayjs().diff(dayjs().startOf('day'), 'm');\nconst pixelsPerMinute = PIXELS_PER_HOUR / MINUTES_PER_HOUR;\n\ninterface Props {\n\tminutesToScroll?: number;\n\toffset?: number;\n}\n\nexport function useSetInitialScroll({ minutesToScroll = NOW_IN_MINUTES, offset = 140 }: Partial<Props> = {}) {\n\tconst viewportRef = useRef<HTMLDivElement>(null);\n\n\tuseEffect(() => {\n\t\tif (!viewportRef.current) return;\n\n\t\tconst offset8am = pixelsPerMinute * minutesToScroll - offset;\n\t\tviewportRef.current.scrollTo({ top: offset8am });\n\t}, [minutesToScroll, offset]);\n\n\treturn viewportRef;\n}\n","import { DateRecord } from '~/types';\nimport { Dayjs } from 'dayjs';\n\nexport const getWeekDates = (activeDate: Dayjs, view: 'day' | 'week') => {\n\tif (view === 'day') return [{ date: activeDate }];\n\n\tconst startOfWeek = activeDate.startOf('week');\n\tconst startOfCalendarWeek = startOfWeek.subtract(startOfWeek.day(), 'd');\n\tlet tempDate = startOfCalendarWeek;\n\tconst datesArray: DateRecord[] = [];\n\tfor (let index = 0; index < 7; index++) {\n\t\tdatesArray.push({ date: tempDate, isCurrentMonth: tempDate.month() === activeDate.month() });\n\t\ttempDate = tempDate.add(1, 'day');\n\t}\n\treturn datesArray;\n};\n","import { CalendarEvent, DateRecord, OrderedCalendarEvent } from '~/types';\nimport { arrangeWeekdayEvents, filterByDate } from '~/utils';\n\nexport function getEventsByDayMap<T>(\n\tweekDays: DateRecord[],\n\tevents: CalendarEvent[]\n): Record<number, OrderedCalendarEvent<T>[]> {\n\treturn weekDays.reduce((a, c, i) => ({ ...a, [i]: arrangeWeekdayEvents(filterByDate(events, c.date), c.date) }), {});\n}\n","import { HOURS } from '~/utils';\nimport './HoursColumn.css';\n\nexport function HoursColumn() {\n\treturn (\n\t\t<div className='events-calendar-hours-column'>\n\t\t\t{HOURS.map(hour => (\n\t\t\t\t<div className='events-calendar-hour' key={hour}>\n\t\t\t\t\t<span className='events-calendar-hour-label'>{hour}</span>\n\t\t\t\t</div>\n\t\t\t))}\n\t\t</div>\n\t);\n}\n","import dayjs from 'dayjs';\nimport './TimeIndicator.css';\n\nconst NOW = dayjs();\n\nexport function TimeIndicator({ activeDate, isDayView }: { activeDate: dayjs.Dayjs; isDayView?: boolean }) {\n\tif (!activeDate.isSame(NOW, 'day')) return;\n\n\tconst gridColumn = isDayView ? 1 : NOW.day() + 1;\n\tconst gridRow = NOW.hour() * 4 + Math.round(NOW.minute() / 15) + 1;\n\n\treturn (\n\t\t<div className='events-calendar-time-indicator' style={{ gridColumn, gridRow }}>\n\t\t\t<div className='events-calendar-time-indicator-dot'></div>\n\t\t\t<div className='events-calendar-time-indicator-line'></div>\n\t\t</div>\n\t);\n}\n","'use client';\n\nimport { Dayjs } from 'dayjs';\nimport { Dispatch, RefObject } from 'react';\nimport './TimeBackground.css';\n\nimport { updateEvent } from '~/utils';\nimport { MouseEventHandler, CalendarAction, CalendarState, EventEditProps, CalendarView } from '~/types';\n\n// Functions\nconst buildIndexArr = (l: number) => {\n\treturn Array(l)\n\t\t.fill(0)\n\t\t.map((_, i) => i);\n};\nconst getActiveDateTime = (activeDate: Dayjs, day: number, hour: number, timeBlock: number, view: CalendarView) => {\n\tconst startDate = view === 'day' ? activeDate : activeDate.startOf('week').add(day, 'd');\n\treturn startDate.hour(hour).minute(timeBlock * 15);\n};\n\ninterface TimeBackgroundProps {\n\tview: 'day' | 'week';\n\tactiveDate: Dayjs;\n\thandleMouseEvent: MouseEventHandler;\n\tplaceholderRef: RefObject<HTMLDivElement | null>;\n\tstate: CalendarState;\n\tdispatch: Dispatch<CalendarAction>;\n\tonEventReschedule?: (props: EventEditProps) => void;\n}\n\nexport function TimeBackground({\n\tview,\n\tactiveDate,\n\thandleMouseEvent,\n\tplaceholderRef,\n\tstate,\n\tdispatch,\n\tonEventReschedule,\n}: TimeBackgroundProps) {\n\t// Build grid arrays\n\tconst daysArray = view === 'day' ? [0] : buildIndexArr(7);\n\tconst hoursArray = buildIndexArr(24);\n\tconst timeBlocksArray = buildIndexArr(4);\n\n\t// Popover handler\n\tconst openPopover = () => dispatch({ type: 'open_popover' });\n\tconst reset = () => dispatch({ type: 'reset_calendar' });\n\n\treturn (\n\t\t<>\n\t\t\t{daysArray.map(day =>\n\t\t\t\thoursArray.map(hour =>\n\t\t\t\t\ttimeBlocksArray.map(timeBlock => {\n\t\t\t\t\t\tconst date = getActiveDateTime(activeDate, day, hour, timeBlock, view);\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tclassName='events-calendar-time-background-cell'\n\t\t\t\t\t\t\t\tdata-isweekview={view === 'week'}\n\t\t\t\t\t\t\t\tkey={`${day}${hour}${timeBlock}`}\n\t\t\t\t\t\t\t\tonMouseDown={e => handleMouseEvent(e, date, true, placeholderRef)}\n\t\t\t\t\t\t\t\tonMouseEnter={e => {\n\t\t\t\t\t\t\t\t\tif (state.eventDragActive) updateEvent({ state, dispatch, date, view });\n\t\t\t\t\t\t\t\t\thandleMouseEvent(e, date, true, placeholderRef);\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tonMouseUp={e => {\n\t\t\t\t\t\t\t\t\tif (state.eventDragActive) {\n\t\t\t\t\t\t\t\t\t\tdispatch({ type: 'event_reschedule_end', anchor: placeholderRef.current });\n\n\t\t\t\t\t\t\t\t\t\tonEventReschedule?.({\n\t\t\t\t\t\t\t\t\t\t\tclickedEvent: state.clickedEvent,\n\t\t\t\t\t\t\t\t\t\t\tnewEvent: state.placeholderEvent,\n\t\t\t\t\t\t\t\t\t\t\teventRef: placeholderRef.current!,\n\t\t\t\t\t\t\t\t\t\t\topenPopover,\n\t\t\t\t\t\t\t\t\t\t\treset,\n\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\thandleMouseEvent(e, date, true, placeholderRef);\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\tgridColumnStart: day + 1,\n\t\t\t\t\t\t\t\t\tgridRow: `${hour * 4 + timeBlock + 1} / ${hour * 4 + timeBlock + 2}`,\n\t\t\t\t\t\t\t\t\tcursor: state.eventDragActive ? 'grabbing' : 'auto',\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t></div>\n\t\t\t\t\t\t);\n\t\t\t\t\t})\n\t\t\t\t)\n\t\t\t)}\n\t\t</>\n\t);\n}\n","'use client';\n\nimport { Dispatch, ReactNode, RefObject } from 'react';\nimport './TimeViewHeader.css';\n\nimport {\n\tDateRecord,\n\tMinMaxDatesInView,\n\tMouseEventHandler,\n\tOrderedCalendarEvent,\n\tCalendarEvent,\n\tEventsCalendarContextMenuProps,\n\tCalendarAction,\n\tCalendarState,\n\tEventClickArgs,\n\tEventEditProps,\n} from '~/types';\nimport { CellContainer } from '~/components';\nimport { filterByDate, filterByWeek, arrangeWeekEvents } from '~/utils';\nimport dayjs from 'dayjs';\n\n// Only show a max of two events in header\nconst EVENT_LIMIT = 2;\n\ninterface TimeViewHeaderProps<T> {\n\tview: 'day' | 'week';\n\tenableRescheduling: boolean;\n\tcompact: boolean;\n\tallDayEvents: CalendarEvent<T>[];\n\tdispatch: Dispatch<CalendarAction>;\n\thandleMouseEvent: MouseEventHandler;\n\thandleStopDrag: () => void;\n\tminMaxDatesInView: MinMaxDatesInView;\n\tplaceholderRef: RefObject<HTMLDivElement | null>;\n\tonEventClick?: (props: EventClickArgs<T>) => void;\n\tonEventReschedule?: (props: EventEditProps) => void;\n\trenderContextMenu?: (props: EventsCalendarContextMenuProps) => ReactNode;\n\tstate: CalendarState;\n\tweekDatesArray: DateRecord[];\n}\n\nexport function TimeViewHeader<T>({\n\tview,\n\tenableRescheduling,\n\tcompact,\n\tallDayEvents,\n\tdispatch,\n\thandleMouseEvent,\n\thandleStopDrag,\n\tminMaxDatesInView,\n\tonEventClick,\n\tonEventReschedule,\n\tplaceholderRef,\n\trenderContextMenu,\n\tstate,\n\tweekDatesArray,\n}: TimeViewHeaderProps<T>) {\n\tconst filteredEvents =\n\t\tview === 'day'\n\t\t\t? filterByDate(allDayEvents, weekDatesArray[0].date)\n\t\t\t: filterByWeek(allDayEvents, weekDatesArray[0].date);\n\tconst orderedEvents = arrangeWeekEvents(filteredEvents);\n\tconst totalEventsOnThisDate =\n\t\torderedEvents.length > 0 ? Math.max(...orderedEvents.map((x: OrderedCalendarEvent) => x.order + 1)) : 0;\n\n\t// Calculate header height\n\tconst numEventsToShow = Math.min(totalEventsOnThisDate, EVENT_LIMIT + 1); // Include space for show more text\n\tconst heightOfEvent = compact ? 20 : 23;\n\tconst bottomPadding = numEventsToShow > 0 ? 8 : 0;\n\tconst headerHeight = heightOfEvent * numEventsToShow + bottomPadding;\n\n\treturn (\n\t\t<div className='events-calendar-time-view-header' data-isweekview={view === 'week'} onMouseLeave={handleStopDrag}>\n\t\t\t{weekDatesArray.map((dayRecord, dayIndex) => {\n\t\t\t\tconst { date } = dayRecord;\n\t\t\t\tconst withHeaderBorder = view === 'week' || filteredEvents.length > 0;\n\t\t\t\treturn (\n\t\t\t\t\t<div className='events-calendar-time-view-header-cell' data-border={withHeaderBorder} key={dayIndex}>\n\t\t\t\t\t\t{view === 'week' && (\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tclassName='events-calendar-time-view-header-label'\n\t\t\t\t\t\t\t\tdata-today={date.isSame(dayjs(), 'day')}\n\t\t\t\t\t\t\t\tonMouseEnter={handleStopDrag}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{`${date.format('ddd')} ${date.format('DD')}`}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t<CellContainer\n\t\t\t\t\t\t\tisInDayHeader={view === 'day'}\n\t\t\t\t\t\t\tisInWeekHeader={view === 'week'}\n\t\t\t\t\t\t\tEVENT_LIMIT={EVENT_LIMIT}\n\t\t\t\t\t\t\tenableRescheduling={enableRescheduling}\n\t\t\t\t\t\t\tcompact={compact}\n\t\t\t\t\t\t\tdayRecord={dayRecord}\n\t\t\t\t\t\t\tdispatch={dispatch}\n\t\t\t\t\t\t\thandleMouseEvent={handleMouseEvent}\n\t\t\t\t\t\t\theaderHeight={headerHeight}\n\t\t\t\t\t\t\tminMaxDatesInView={minMaxDatesInView}\n\t\t\t\t\t\t\tonEventClick={onEventClick}\n\t\t\t\t\t\t\tonEventReschedule={onEventReschedule}\n\t\t\t\t\t\t\torderedEvents={orderedEvents}\n\t\t\t\t\t\t\tplaceholderRef={placeholderRef}\n\t\t\t\t\t\t\trenderContextMenu={renderContextMenu}\n\t\t\t\t\t\t\tstate={state}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t);\n\t\t\t})}\n\t\t</div>\n\t);\n}\n","'use client';\n\nimport dayjs from 'dayjs';\nimport { useRef } from 'react';\nimport './MonthDate.css';\n\ninterface MonthDateProps {\n\tdate: dayjs.Dayjs;\n\thandleClick: (e: React.MouseEvent, date: dayjs.Dayjs, ref: React.MutableRefObject<HTMLDivElement | null>) => void;\n\tisToday: boolean;\n\tisDimmed: boolean;\n\tisActive: boolean;\n}\n\nexport function MonthDate({ date, handleClick, isToday, isDimmed, isActive }: MonthDateProps) {\n\tconst ref = useRef<HTMLDivElement | null>(null);\n\treturn (\n\t\t<div\n\t\t\tref={ref}\n\t\t\tdata-date={date.format('DD-MMM-YYYY')}\n\t\t\tclassName='events-calendar-year-view-month-date'\n\t\t\tdata-today={isToday}\n\t\t\tdata-dimmed={isDimmed}\n\t\t\tdata-active={isActive}\n\t\t\tonMouseDown={e => e.stopPropagation()}\n\t\t\tonClick={e => handleClick(e, date, ref)}\n\t\t>\n\t\t\t{date.format('D')}\n\t\t</div>\n\t);\n}\n","import dayjs from 'dayjs';\n\nimport { CalendarEvent, Month } from '~/types';\nimport { MONTHS, DAYS_IN_FULL_MONTH } from '~/utils';\n\nexport type MonthDate = { date: dayjs.Dayjs; isToday: boolean; isCurrentMonth: boolean; isActive: boolean };\nexport type YearDateRecord = Record<Month, MonthDate[]>;\n\n/*\n    Function to create a object containing the months and dates within each month\n*/\nexport function generateYearDates<T extends object>(activeDate: dayjs.Dayjs, events: CalendarEvent<T>[]) {\n\tconst result = {} as YearDateRecord;\n\n\t// Create a set of all active dates from the events\n\tconst activeDates = new Set<string>();\n\tevents.forEach(({ start, end }) => {\n\t\tlet current = start.clone().startOf('day');\n\t\tconst endOfDay = end.clone().startOf('day');\n\t\twhile (current.isBefore(endOfDay, 'day') || current.isSame(endOfDay, 'day')) {\n\t\t\tactiveDates.add(current.format('YYYY-MM-DD'));\n\t\t\tcurrent = current.add(1, 'day');\n\t\t}\n\t});\n\n\t// Build the result object\n\tlet currentDate = activeDate.startOf('year');\n\tMONTHS.forEach((month, i) => {\n\t\tconst startOfMonth = currentDate.clone().day(0);\n\t\tconst dateArray = Array.from({ length: DAYS_IN_FULL_MONTH }, (_, i) => {\n\t\t\tconst date = startOfMonth.clone().add(i, 'day');\n\t\t\tconst isToday = date.isSame(dayjs(), 'day');\n\t\t\tconst isCurrentMonth = currentDate.isSame(date, 'month');\n\t\t\tconst isActive = isCurrentMonth && activeDates.has(date.format('YYYY-MM-DD'));\n\t\t\treturn { date, isToday, isActive, isCurrentMonth };\n\t\t});\n\n\t\tresult[month] = dateArray;\n\t\tcurrentDate = currentDate.month(i + 1);\n\t});\n\n\treturn result;\n}\n","'use client';\n\nimport dayjs from 'dayjs';\nimport { Dispatch } from 'react';\nimport './YearView.css';\n\nimport { DAY_LABELS_SHORT, MONTHS } from '~/utils';\nimport { CalendarAction, CalendarEvent, CalendarState } from '~/types';\n\nimport { MonthDate } from './components';\nimport { generateYearDates } from './utils';\n\ninterface YearViewProps<T> {\n\tactiveDate: dayjs.Dayjs;\n\tdispatch: Dispatch<CalendarAction>;\n\tevents: CalendarEvent<T>[];\n\tstate: CalendarState;\n}\n\nexport function YearView<T extends object>({ activeDate, dispatch, events, state }: YearViewProps<T>) {\n\tconst yearDates = generateYearDates<T>(activeDate, events);\n\n\t// Handlers\n\tconst handleMouseDown = () => dispatch({ type: 'reset_calendar' });\n\tconst handleClick = (e: React.MouseEvent, date: dayjs.Dayjs, ref: React.MutableRefObject<HTMLDivElement | null>) => {\n\t\tif (state.overflowIsOpen && e.target === state.overflowAnchor) {\n\t\t\tdispatch({ type: 'reset_calendar' });\n\t\t} else {\n\t\t\tdispatch({ type: 'open_overflow', date, anchor: ref.current });\n\t\t}\n\t};\n\n\treturn (\n\t\t<div className='events-calendar-year-view-scroll-wrapper'>\n\t\t\t<div className='events-calendar-year-view' onMouseDown={handleMouseDown}>\n\t\t\t\t{MONTHS.map(month => {\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<div key={month} className='events-calendar-year-view-month'>\n\t\t\t\t\t\t\t<div className='events-calendar-year-view-month-label'>{month}</div>\n\t\t\t\t\t\t\t<div className='events-calendar-year-view-month-dates'>\n\t\t\t\t\t\t\t\t{DAY_LABELS_SHORT.map((day, i) => (\n\t\t\t\t\t\t\t\t\t<div key={`${month}-${i}`} className='events-calendar-year-view-month-header'>\n\t\t\t\t\t\t\t\t\t\t{day}\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t))}\n\n\t\t\t\t\t\t\t\t{yearDates[month].map(({ date, isToday, isCurrentMonth, isActive }, i) => (\n\t\t\t\t\t\t\t\t\t<MonthDate\n\t\t\t\t\t\t\t\t\t\tkey={i}\n\t\t\t\t\t\t\t\t\t\tdate={date}\n\t\t\t\t\t\t\t\t\t\thandleClick={handleClick}\n\t\t\t\t\t\t\t\t\t\tisToday={isToday}\n\t\t\t\t\t\t\t\t\t\tisActive={isActive}\n\t\t\t\t\t\t\t\t\t\tisDimmed={!isCurrentMonth}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t);\n\t\t\t\t})}\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n","'use client';\n\nimport { Dispatch, ReactNode, RefObject, useMemo } from 'react';\nimport { Dayjs } from 'dayjs';\nimport './MonthView.css';\n\nimport {\n\tCalendarAction,\n\tCalendarState,\n\tEventClickArgs,\n\tEventEditProps,\n\tCalendarEvent,\n\tMouseEventHandler,\n\tEventsCalendarContextMenuProps,\n} from '~/types';\n\nimport { useElementSize } from '~/hooks';\nimport { CellContainer } from '~/components';\n\nimport { MonthHeader } from './components';\nimport { getMonthDates, getMaxEvents, getEventsByWeekMap } from './utils';\n\ninterface MonthViewProps<T = object> {\n\tenableRescheduling: boolean;\n\tcompact: boolean;\n\tactiveDate: Dayjs;\n\tdispatch: Dispatch<CalendarAction>;\n\tevents: CalendarEvent<T>[];\n\thandleMouseEvent: MouseEventHandler;\n\thandleStopDrag: () => void;\n\tonEventClick?: (props: EventClickArgs<T>) => void;\n\tonEventReschedule?: (props: EventEditProps) => void;\n\trenderContextMenu?: (props: EventsCalendarContextMenuProps) => ReactNode;\n\tplaceholderRef: RefObject<HTMLDivElement | null>;\n\tstate: CalendarState;\n}\n\nexport function MonthView<T = object>({\n\tenableRescheduling,\n\tcompact,\n\tactiveDate,\n\tdispatch,\n\tevents,\n\thandleMouseEvent,\n\thandleStopDrag,\n\tonEventClick,\n\tonEventReschedule,\n\tplaceholderRef,\n\trenderContextMenu,\n\tstate,\n}: MonthViewProps<T>) {\n\t// Calculate dates within current view\n\tconst monthDates = useMemo(() => getMonthDates(activeDate), [activeDate]);\n\tconst minMaxDatesInView = { first: monthDates.first, last: monthDates.last };\n\n\t// Calculate the max number of events that fit within a cell\n\tconst { ref: gridRef, height: gridHeight } = useElementSize();\n\tconst ROW_HEIGHT = gridHeight / monthDates.weeks.length;\n\tconst EVENT_LIMIT = getMaxEvents(ROW_HEIGHT, compact);\n\n\t// Create a map of events by week\n\tconst weekMap = useMemo(() => getEventsByWeekMap<T>(monthDates.weeks, events), [events, monthDates.weeks]);\n\n\treturn (\n\t\t<div className='events-calendar-month-view'>\n\t\t\t<MonthHeader isCompact={compact} />\n\t\t\t<div className='events-calendar-month-view-grid' onMouseLeave={handleStopDrag} ref={gridRef}>\n\t\t\t\t{monthDates.weeks.map((week, weekIndex) => {\n\t\t\t\t\t// Get this week's events (if calendar has height)\n\t\t\t\t\tconst orderedEvents = gridHeight > 0 ? weekMap[weekIndex] : [];\n\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<div key={weekIndex} className='events-calendar-month-view-row'>\n\t\t\t\t\t\t\t{week.map((dayRecord, dayIndex) => (\n\t\t\t\t\t\t\t\t<CellContainer\n\t\t\t\t\t\t\t\t\tkey={dayIndex}\n\t\t\t\t\t\t\t\t\tEVENT_LIMIT={EVENT_LIMIT}\n\t\t\t\t\t\t\t\t\tenableRescheduling={enableRescheduling}\n\t\t\t\t\t\t\t\t\tcompact={compact}\n\t\t\t\t\t\t\t\t\tdayRecord={dayRecord}\n\t\t\t\t\t\t\t\t\tdispatch={dispatch}\n\t\t\t\t\t\t\t\t\thandleMouseEvent={handleMouseEvent}\n\t\t\t\t\t\t\t\t\tisInWeekHeader={false}\n\t\t\t\t\t\t\t\t\tminMaxDatesInView={minMaxDatesInView}\n\t\t\t\t\t\t\t\t\tonEventClick={onEventClick}\n\t\t\t\t\t\t\t\t\tonEventReschedule={onEventReschedule}\n\t\t\t\t\t\t\t\t\torderedEvents={orderedEvents}\n\t\t\t\t\t\t\t\t\tplaceholderRef={placeholderRef}\n\t\t\t\t\t\t\t\t\trenderContextMenu={renderContextMenu}\n\t\t\t\t\t\t\t\t\tstate={state}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t);\n\t\t\t\t})}\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n","import './MonthHeader.css';\n\nconst DAYS = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];\n\ninterface MonthHeaderProps {\n\tisCompact: boolean;\n}\n\nexport function MonthHeader({ isCompact }: MonthHeaderProps) {\n\treturn (\n\t\t<div className='events-calendar-month-header' data-sm={isCompact}>\n\t\t\t{DAYS.map((day, i) => (\n\t\t\t\t<div className='events-calendar-month-header-cell' key={i}>\n\t\t\t\t\t{day}\n\t\t\t\t</div>\n\t\t\t))}\n\t\t</div>\n\t);\n}\n","/* \n    Returns number of events that can fit within a cell (dependent on screen size)\n*/\nexport const getMaxEvents = (ROW_HEIGHT: number, isCompact: boolean) => {\n  if (ROW_HEIGHT === 0) return 0;\n\n  // Constants\n  const PADDING = 2;\n  const CELL_BOTTOM = 8;\n  const CELL_HEADER = 26;\n  const ENTRY_HEIGHT = isCompact ? 18 : 20;\n\n  return Math.max(\n    Math.floor((ROW_HEIGHT - CELL_HEADER - CELL_BOTTOM) / (ENTRY_HEIGHT + PADDING)),\n    0\n  );\n};\n","import { DateRecord, MonthDates } from '~/types';\nimport { Dayjs } from 'dayjs';\n\n/* \n    Creates array of dates centred on the current month\n*/\nexport const getMonthDates = (activeDate: Dayjs): MonthDates => {\n\tconst startOfMonth = activeDate.startOf('month').day(0);\n\tlet tempDate = startOfMonth;\n\tconst nextMonth = activeDate.add(1, 'month').month();\n\tlet weekDates: DateRecord[] = [];\n\tconst allDates: DateRecord[][] = [];\n\tlet dayOfWeekIndex = 1;\n\twhile (tempDate.subtract(tempDate.day(), 'd').month() !== nextMonth) {\n\t\tweekDates.push({ date: tempDate, isCurrentMonth: tempDate.month() === activeDate.month() });\n\t\tif (dayOfWeekIndex === 7) {\n\t\t\tallDates.push(weekDates);\n\t\t\tweekDates = [];\n\t\t\tdayOfWeekIndex = 0;\n\t\t}\n\t\tdayOfWeekIndex++;\n\t\ttempDate = tempDate.add(1, 'day');\n\t}\n\treturn { weeks: allDates, first: startOfMonth, last: tempDate };\n};\n","import { CalendarEvent, DateRecord, OrderedCalendarEvent } from '~/types';\nimport { arrangeWeekEvents, filterByWeek } from '~/utils';\n\nexport function getEventsByWeekMap<T>(\n\tweeks: DateRecord[][],\n\tevents: CalendarEvent[]\n): Record<number, OrderedCalendarEvent<T>[]> {\n\treturn weeks.reduce((a, c, i) => ({ ...a, [i]: arrangeWeekEvents(filterByWeek(events, c[0].date)) }), {});\n}\n","'use client';\n\nimport { Dispatch, ReactNode, RefObject } from 'react';\nimport dayjs from 'dayjs';\nimport './OverflowCard.css';\n\nimport { arrangeWeekEvents, filterByDate } from '~/utils';\nimport { EventsCalendarPopover, Event } from '~/components';\nimport { CalendarEvent, CalendarState, CalendarAction, EventClickArgs, EventsCalendarContextMenuProps } from '~/types';\n\ninterface OverflowCardProps<T> {\n\tcompact: boolean;\n\tdispatch: Dispatch<CalendarAction>;\n\tevents: CalendarEvent<T>[];\n\tonEventClick?: ({ event, isDoubleClick }: EventClickArgs<T>) => void;\n\tplaceholderRef: RefObject<HTMLDivElement | null>;\n\trenderContextMenu?: (props: EventsCalendarContextMenuProps) => ReactNode;\n\tstate: CalendarState;\n\tenableRescheduling: boolean;\n}\n\n/* \n    Create dayjs date object if string is defined\n*/\nconst tryDate = (dateString?: string) => (dateString ? dayjs(dateString) : undefined);\n\nexport function OverflowCard<T>({\n\tcompact,\n\tdispatch,\n\tevents,\n\tonEventClick,\n\tplaceholderRef,\n\trenderContextMenu,\n\tstate,\n\tenableRescheduling,\n}: OverflowCardProps<T>) {\n\tconst date = tryDate(state.overflowAnchor?.dataset.date);\n\n\tif (!date || !state.overflowAnchor) return <></>;\n\n\tconst orderedEvents = arrangeWeekEvents(filterByDate(events, date));\n\n\treturn (\n\t\t<EventsCalendarPopover zIndex={2} anchor={state.overflowAnchor} isOpen={state.overflowIsOpen}>\n\t\t\t<div className='events-calendar-overflow-card'>\n\t\t\t\t<span className='events-calendar-overflow-card-label'>{date.format('dddd, MMMM D')}</span>\n\t\t\t\t{!orderedEvents.length && (\n\t\t\t\t\t<div className='events-calendar-overflow-card-text'>No events scheduled for this date</div>\n\t\t\t\t)}\n\t\t\t\t<div className='events-calendar-overflow-card-content'>\n\t\t\t\t\t{orderedEvents.map(event => (\n\t\t\t\t\t\t<Event\n\t\t\t\t\t\t\tview='month'\n\t\t\t\t\t\t\tisInOverflow\n\t\t\t\t\t\t\tkey={event.id}\n\t\t\t\t\t\t\tenableRescheduling={enableRescheduling}\n\t\t\t\t\t\t\tcompact={compact}\n\t\t\t\t\t\t\tdate={date}\n\t\t\t\t\t\t\tdispatch={dispatch}\n\t\t\t\t\t\t\tevent={event}\n\t\t\t\t\t\t\tonEventClick={onEventClick}\n\t\t\t\t\t\t\tplaceholderRef={placeholderRef}\n\t\t\t\t\t\t\trenderContextMenu={renderContextMenu}\n\t\t\t\t\t\t\tstate={state}\n\t\t\t\t\t\t/>\n\t\t\t\t\t))}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</EventsCalendarPopover>\n\t);\n}\n"],"mappings":"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","names":["useMemo","useRef","useRef","setTime","date","time","CALENDAR_VIEWS","MONTHS","DAY_LABELS_SHORT","DAYS_IN_FULL_MONTH","DEFAULT_COLOR","HOURS","isBetween","date","testStart","testEnd","startOnly","hasOverlap","start1","end1","start2","end2","isBetween","updateEvent","state","dispatch","date","view","timeScale","dateDiff","start","end","startTime","endTime","newStart","increment","newEnd","getTimeDiff","dt1","dt2","mins1","getTimeLabel","event","timeDuration","leadingComma","filterByWeek","array","weekStartDate","weekEndDate","start","end","hasOverlap","filterByDate","data","date","start","end","isBetween","filterByView","array","activeDate","view","unit","filterStart","filterEnd","start","end","hasOverlap","dayjs","getDayjs","rawDate","timeString","formatted","parseRawEvents","events","event","index","dayjsStart","dayjsEnd","getVisibleEvents","data","date","maxEvents","isInDayHeader","order","start","calendarSort","weekEventsArray","a","b","a_lengthInDays","b_lengthInDays","findAvailableSlot","overlappingSlots","slot","arrangeWeekEvents","event","sortedWeekEvents","firstEvent","followingEvents","orderedArray","testEvent","testStart","testEnd","placedEvent","placedStart","placedEnd","hasOverlap","eventOrder","dayjs","EMPTY_EVENT","returnValidStartEnd","start","end","getPlaceholderEvent","start","end","isTimeEntry","isInitialisation","validStart","validEnd","returnValidStartEnd","eventEnd","EMPTY_EVENT","sortByStart","array","a","b","timeDiff","getTimeDiff","overlapsStart","test_start","main_start","main_end","arrangeWeekdayEvents","dayEvents","date","event","sortedEvents","firstEvent","followingEvents","orderedArray","testEvent","index","tempStart_test_event","setTime","eventIndent","currEvent","tempStart_curr_event","tempEnd_curr_event","dayjs","createDayjsObjFromTime","startTime","endTime","startString","endString","formattedStartTime","formattedEndTime","start","end","getBackgroundFromGroups","groups","colors","g","DEFAULT_COLOR","increment","color","i","updatePlaceholder","isTimeEvent","firstClickDate","start","date","dispatch","tempStart","getTimeDiff","returnValidStartEnd","tempEnd","updatedEvent","getPlaceholderEvent","useMouseEvent","enableDragCreation","state","onEventCreate","e","openPopover","reset","placeholderRef","dragActive","placeholderEvent","useEffect","useMemo","useRef","useState","defaultState","useResizeObserver","options","frameID","ref","rect","setRect","observer","entries","entry","useElementSize","width","height","useState","useFloating","flip","offset","shift","useDismiss","useInteractions","useCalendarEvent","dispatch","event","isInOverflow","hasContextMenu","state","contextIsOpen","setContextIsOpen","closeContextMenu","isActive","refs","floatingStyles","context","dismiss","getFloatingProps","e","eventRef","dayjs","useEffect","useReducer","useState","DEFAULT_STATE","EMPTY_EVENT","reducer","state","action","DEFAULT_STATE","EMPTY_EVENT","useEventsCalendar","isInitialised","initialDate","dayjs","initialView","closeOnClickOutside","activeDate","setActiveDate","useState","view","setView","state","dispatch","useReducer","reducer","DEFAULT_STATE","useEffect","handleClose","useInitEventsCalendar","calendar","defaultCalendar","useEventsCalendar","jsx","jsxs","TimeEvent","event","isCompact","title","start","groups","colorStyles","getBackgroundFromGroups","borderStyle","g","DEFAULT_COLOR","getClipPath","overflowArrows","getEventStyles","isInOverflow","event","date","isCompact","isInWeekHeader","isInDayHeader","weekStart","weekEnd","isBeingDragged","state","event","getOverflowArrows","isInOverflow","date","start","end","minMaxDatesInView","showLeftArrow","showRightArrow","getWeekOrDayEventStyles","event","timeDuration","dayIndex","overlapOffset","isActive","timeColumnOffset","getBackgroundFromGroups","jsx","AllDayEvent","date","event","minMaxDatesInView","isCompact","isInOverflow","overflowArrows","getOverflowArrows","clipPath","getClipPath","colorstyles","getBackgroundFromGroups","Fragment","jsx","jsxs","Event","view","enableRescheduling","compact","date","dispatch","event","isInWeekHeader","isInOverflow","isInDayHeader","minMaxDatesInView","onEventClick","placeholderRef","renderContextMenu","state","ref","useRef","hasContextMenu","isInteractive","isMonthView","isDayView","openPopover","closePopover","onClose","handleClick","e","isPlaceholder","eventRef","isDoubleClick","isActive","togglePopover","handleContextMenu","contextIsOpen","refs","floatingStyles","getFloatingProps","closeContextMenu","useCalendarEvent","timeDuration","getTimeDiff","isShort","overlapOffset","dayIndex","onDragStart","styles","getEventStyles","getWeekOrDayEventStyles","isBeingDragged","AllDayEvent","TimeEvent","getTimeLabel","createPortal","useEffect","useRef","useFloating","autoPlacement","offset","detectOverflow","autoUpdate","hide","padding","padding_x","padding_y","useBindPopover","anchor","preventViewportOverflow","state","overflow","xPosition","yPosition","refs","floatingStyles","jsx","PopoverContent","anchor","zIndex","children","styles","useRef","refs","floatingStyles","useBindPopover","useEffect","createPortal","e","jsx","EventsCalendarPopover","anchor","isOpen","zIndex","children","PopoverContent","dayjs","useRef","jsx","jsxs","ShowMoreText","date","dispatch","isCompact","numOverflowEvents","state","ref","useRef","handleClick","e","jsx","jsxs","CellHeader","dayRecord","dispatch","isCompact","numOverflowEvents","state","date","isCurrentMonth","isToday","dayjs","ShowMoreText","Fragment","jsx","jsxs","getPlaceholderActiveState","placeholderEvent","date","isInHeader","isActive","isAllDay","start","end","isBetween","CellContainer","EVENT_LIMIT","enableRescheduling","compact","dayRecord","dispatch","handleMouseEvent","headerHeight","isInWeekHeader","isInDayHeader","minMaxDatesInView","onEventClick","onEventReschedule","orderedEvents","placeholderRef","renderContextMenu","state","eventsByDate","filterByDate","visibleEvents","getVisibleEvents","numOverflowEvents","a","c","showOverflowButton","openPopover","reset","handleMouseDown","e","handleMouseEnter","updateEvent","handleMouseUp","CellHeader","ShowMoreText","event","Event","jsx","CircularLoader","visible","jsx","HeaderButton","isGroupButton","active","onClick","variant","children","jsx","jsxs","Controls","hideViewToggle","views","setView","view","children","viewsToDisplay","CALENDAR_VIEWS","validView","viewLabel","HeaderButton","dayjs","jsx","jsxs","IconChevronLeft","size","stroke","jsx","jsxs","IconChevronRight","size","stroke","jsx","jsxs","getHeaderTitle","currDate","view","weekStart","weekEnd","Navigation","activeDate","setActiveDate","handleToday","dayjs","handleNext","increment","handlePrev","HeaderButton","IconChevronLeft","IconChevronRight","jsx","jsxs","Header","activeDate","onClick","hideViewToggle","setActiveDate","setView","views","CALENDAR_VIEWS","view","customControls","Navigation","Controls","useMemo","dayjs","useEffect","useRef","PIXELS_PER_HOUR","MINUTES_PER_HOUR","NOW_IN_MINUTES","pixelsPerMinute","useSetInitialScroll","minutesToScroll","offset","viewportRef","offset8am","getWeekDates","activeDate","view","startOfWeek","tempDate","datesArray","index","getEventsByDayMap","weekDays","events","a","c","i","arrangeWeekdayEvents","filterByDate","jsx","HoursColumn","HOURS","hour","dayjs","jsx","jsxs","NOW","dayjs","TimeIndicator","activeDate","isDayView","gridColumn","gridRow","Fragment","jsx","buildIndexArr","l","_","i","getActiveDateTime","activeDate","day","hour","timeBlock","view","TimeBackground","handleMouseEvent","placeholderRef","state","dispatch","onEventReschedule","daysArray","hoursArray","timeBlocksArray","openPopover","reset","date","e","updateEvent","dayjs","jsx","jsxs","EVENT_LIMIT","TimeViewHeader","view","enableRescheduling","compact","allDayEvents","dispatch","handleMouseEvent","handleStopDrag","minMaxDatesInView","onEventClick","onEventReschedule","placeholderRef","renderContextMenu","state","weekDatesArray","filteredEvents","filterByDate","filterByWeek","orderedEvents","arrangeWeekEvents","totalEventsOnThisDate","x","numEventsToShow","heightOfEvent","bottomPadding","headerHeight","dayRecord","dayIndex","date","withHeaderBorder","CellContainer","jsx","jsxs","TimeView","view","activeDate","compact","dispatch","enableRescheduling","events","handleMouseEvent","handleStopDrag","onEventClick","onEventReschedule","placeholderRef","renderContextMenu","state","isDayView","isWeekView","allDayEvents","event","timeEvents","viewportRef","useSetInitialScroll","weekDatesArray","useMemo","getWeekDates","minMaxDatesInView","dayMap","getEventsByDayMap","TimeViewHeader","HoursColumn","TimeBackground","TimeIndicator","date","dayIndex","orderedEvents","isActive","isAllDay","start","end","isBetween","Event","useRef","jsx","MonthDate","date","handleClick","isToday","isDimmed","isActive","ref","useRef","e","dayjs","generateYearDates","activeDate","events","result","activeDates","start","end","current","endOfDay","currentDate","MONTHS","month","startOfMonth","dateArray","_","i","date","isToday","dayjs","isCurrentMonth","isActive","jsx","jsxs","YearView","activeDate","dispatch","events","state","yearDates","generateYearDates","handleMouseDown","handleClick","e","date","ref","MONTHS","month","DAY_LABELS_SHORT","day","i","isToday","isCurrentMonth","isActive","MonthDate","useMemo","jsx","DAYS","MonthHeader","isCompact","day","i","getMaxEvents","ROW_HEIGHT","isCompact","PADDING","CELL_BOTTOM","CELL_HEADER","ENTRY_HEIGHT","getMonthDates","activeDate","startOfMonth","tempDate","nextMonth","weekDates","allDates","dayOfWeekIndex","getEventsByWeekMap","weeks","events","a","c","i","arrangeWeekEvents","filterByWeek","jsx","jsxs","MonthView","enableRescheduling","compact","activeDate","dispatch","events","handleMouseEvent","handleStopDrag","onEventClick","onEventReschedule","placeholderRef","renderContextMenu","state","monthDates","useMemo","getMonthDates","minMaxDatesInView","gridRef","gridHeight","useElementSize","ROW_HEIGHT","EVENT_LIMIT","getMaxEvents","weekMap","getEventsByWeekMap","MonthHeader","week","weekIndex","orderedEvents","dayRecord","dayIndex","CellContainer","dayjs","Fragment","jsx","jsxs","tryDate","dateString","dayjs","OverflowCard","compact","dispatch","events","onEventClick","placeholderRef","renderContextMenu","state","enableRescheduling","date","orderedEvents","arrangeWeekEvents","filterByDate","EventsCalendarPopover","event","Event","jsx","jsxs","EventsCalendar","calendar","compact","enableDragCreation","enableRescheduling","events","popoverZIndex","isFetching","noHeader","onEventClick","onEventCreate","onEventReschedule","renderPopover","renderContextMenu","views","CALENDAR_VIEWS","activeDate","setActiveDate","view","setView","state","dispatch","useInitEventsCalendar","parsed","useMemo","parseRawEvents","calendarEvents","filterByView","overflowEvents","event","eventAnchor","dragActive","eventDragActive","popoverIsOpen","clickedEvent","placeholderEvent","onClose","handleStopDrag","placeholderRef","useRef","handleMouseEvent","useMouseEvent","basicProps","sharedViewProps","Header","e","CircularLoader","YearView","MonthView","TimeView","EventsCalendarPopover","OverflowCard"]}