{"version":3,"file":"get-week-positioned-events.cjs","names":["getWeekDays","sortEvents","getEventEndDate","calculateEventDays","getHangingStatus","isAllDayEvent","getDayPosition","findAvailableColumn","calculateAllDayEventOffset","assignEventRows","calculateAllDayEventWidth"],"sources":["../../../../src/components/WeekView/get-week-view-events/get-week-positioned-events.ts"],"sourcesContent":["import dayjs from 'dayjs';\nimport {\n  AnyDateValue,\n  DateStringValue,\n  DayOfWeek,\n  ScheduleEventData,\n  WeekPositionedEventData,\n} from '../../../types';\nimport { getDayPosition, getWeekDays, isAllDayEvent, sortEvents } from '../../../utils';\nimport { assignEventRows } from './assign-event-rows';\nimport { calculateAllDayEventOffset } from './calculate-all-day-event-offset';\nimport { calculateAllDayEventWidth } from './calculate-all-day-event-width';\nimport { calculateEventDays } from './calculate-event-days';\nimport { calculateRegularEventOverlaps } from './calculate-regular-event-overlaps';\nimport { findAvailableColumn } from './find-available-column';\nimport { getEventEndDate } from './get-event-end-date';\nimport { getHangingStatus } from './get-hanging-status';\n\nexport interface GetWeekPositionedEventsInput {\n  /** Date (week start) at which events are positioned, used to check if events are all-day */\n  date: AnyDateValue;\n\n  /** List of all events that belong to the given week, extra events must be filtered out before passing to the function */\n  events: ScheduleEventData[];\n\n  /** Start time of the week view, used to calculate event positions */\n  startTime?: string;\n\n  /** End time of the week view, used to calculate event positions */\n  endTime?: string;\n\n  /** Number of minutes per time slot, used to align the canvas to whole slots */\n  intervalMinutes?: number;\n\n  /** First day of the week, 0 - Sunday, 1 - Monday, etc., used to calculate events positions */\n  firstDayOfWeek?: DayOfWeek;\n\n  /** Indices of weekend days, 0-6, where 0 is Sunday and 6 is Saturday */\n  weekendDays?: DayOfWeek[];\n\n  /** If set to false, weekend days are hidden @default true */\n  withWeekendDays?: boolean;\n}\n\n/** Events grouped by week day date (YYYY-MM-DD 00:00:00) and by columns */\nexport interface GroupedWeekEvents {\n  allDayEvents: WeekPositionedEventData[];\n  regularEvents: Record<DateStringValue, WeekPositionedEventData[]>;\n  backgroundEvents: Record<DateStringValue, WeekPositionedEventData[]>;\n}\n\nexport function getWeekPositionedEvents({\n  date,\n  events,\n  startTime,\n  endTime,\n  intervalMinutes,\n  firstDayOfWeek = 1,\n  weekendDays = [0, 6],\n  withWeekendDays = true,\n}: GetWeekPositionedEventsInput): GroupedWeekEvents {\n  const weekDays = getWeekDays({ week: date, firstDayOfWeek, withWeekendDays, weekendDays });\n  const visibleDaysCount = weekDays.length;\n  const weekStartDate = dayjs(weekDays[0]);\n  const weekEndDate = dayjs(weekDays[weekDays.length - 1]);\n\n  const grouped: GroupedWeekEvents = {\n    allDayEvents: [],\n    regularEvents: Object.fromEntries(weekDays.map((day) => [day, []])),\n    backgroundEvents: Object.fromEntries(weekDays.map((day) => [day, []])),\n  };\n\n  const columns = new Map<string, ScheduleEventData[]>();\n  const allDayColumns = new Map<string, ScheduleEventData[]>();\n  const sorted = sortEvents(events);\n\n  for (const event of sorted) {\n    if (event.display === 'background') {\n      const eventStartDate = dayjs(event.start).startOf('day');\n      const actualEndDate = getEventEndDate(event);\n      const eventWeekDays = calculateEventDays({ event, weekDays, actualEndDate });\n      const hanging = getHangingStatus({ eventStartDate, actualEndDate, weekDays });\n\n      for (const day of eventWeekDays) {\n        const visibleDayIndex = weekDays.indexOf(day);\n        if (visibleDayIndex === -1) {\n          continue;\n        }\n\n        const dayStart = dayjs(day);\n        const dayEnd = dayStart.endOf('day');\n        const eventStart = dayjs(event.start);\n        const eventEnd = dayjs(event.end);\n\n        const clippedStart = eventStart.isBefore(dayStart) ? dayStart : eventStart;\n        const clippedEnd = eventEnd.isAfter(dayEnd) ? dayEnd : eventEnd;\n\n        const clippedEvent = {\n          ...event,\n          start: clippedStart.format('YYYY-MM-DD HH:mm:ss'),\n          end: clippedEnd.format('YYYY-MM-DD HH:mm:ss'),\n        };\n\n        const isAllDay = isAllDayEvent({ event: clippedEvent, date: day });\n        const verticalPosition = isAllDay\n          ? { top: 0, height: 100 }\n          : getDayPosition({ event: clippedEvent, startTime, endTime, intervalMinutes });\n\n        if (!isAllDay && verticalPosition.height <= 0) {\n          continue;\n        }\n\n        const dayWeekOffset = (visibleDayIndex / visibleDaysCount) * 100;\n\n        grouped.backgroundEvents[day].push({\n          ...event,\n          position: {\n            ...verticalPosition,\n            allDay: isAllDay,\n            column: 0,\n            width: 100,\n            offset: 0,\n            overlaps: 1,\n            weekOffset: dayWeekOffset,\n            row: 0,\n            hanging,\n          },\n        });\n      }\n\n      continue;\n    }\n    const eventStartDate = dayjs(event.start).startOf('day');\n    const actualEndDate = getEventEndDate(event);\n    const eventWeekDays = calculateEventDays({ event, weekDays, actualEndDate });\n\n    if (eventWeekDays.length === 0) {\n      continue;\n    }\n\n    const isMultiday = actualEndDate.isAfter(eventStartDate);\n    const hanging = getHangingStatus({ eventStartDate, actualEndDate, weekDays });\n    const isActuallyAllDay = eventWeekDays.some((day) => isAllDayEvent({ event, date: day }));\n    const allDay = isMultiday || isActuallyAllDay;\n\n    const columnMap = allDay ? allDayColumns : columns;\n    const column = findAvailableColumn({\n      columns: columnMap,\n      event,\n      allDay,\n      allWeekDays: weekDays,\n    });\n\n    const columnKey = `col-${column}`;\n    if (!columnMap.has(columnKey)) {\n      columnMap.set(columnKey, []);\n    }\n    columnMap.get(columnKey)!.push(event);\n\n    const verticalPosition = allDay\n      ? { top: 0, height: 100 }\n      : getDayPosition({ event, startTime, endTime, intervalMinutes });\n\n    if (allDay) {\n      const offset = calculateAllDayEventOffset({\n        eventStartDate,\n        weekStartDate,\n        weekDays,\n        visibleDaysCount,\n        hangingStart: hanging === 'start' || hanging === 'both',\n      });\n\n      grouped.allDayEvents.push({\n        ...event,\n        position: {\n          ...verticalPosition,\n          allDay,\n          column,\n          width: 0,\n          offset,\n          overlaps: 0,\n          row: 0,\n          hanging,\n        },\n      });\n    } else {\n      for (const day of eventWeekDays) {\n        const visibleDayIndex = weekDays.indexOf(day);\n\n        if (visibleDayIndex === -1) {\n          continue;\n        }\n\n        const dayWeekOffset = (visibleDayIndex / visibleDaysCount) * 100;\n\n        grouped.regularEvents[day].push({\n          ...event,\n          position: {\n            ...verticalPosition,\n            allDay,\n            column,\n            width: 0,\n            offset: 0,\n            overlaps: 0,\n            weekOffset: dayWeekOffset,\n            row: 0,\n            hanging,\n          },\n        });\n      }\n    }\n  }\n\n  for (const day of weekDays) {\n    calculateRegularEventOverlaps(grouped.regularEvents[day]);\n  }\n\n  if (grouped.allDayEvents.length > 0) {\n    const eventRows = assignEventRows(grouped.allDayEvents);\n    const assignedRows = new Set<number>();\n\n    for (const event of grouped.allDayEvents) {\n      const row = eventRows.get(event)!;\n      event.position.row = row;\n      assignedRows.add(row);\n    }\n\n    const rowCount = Math.max(...assignedRows) + 1;\n\n    for (const event of grouped.allDayEvents) {\n      const eventStartDate = dayjs(event.start).startOf('day');\n      const actualEndDate = getEventEndDate(event);\n\n      event.position.width = calculateAllDayEventWidth({\n        eventStartDate,\n        actualEndDate,\n        weekStartDate,\n        weekEndDate,\n        weekDays,\n        visibleDaysCount,\n      });\n\n      event.position.overlaps = rowCount;\n    }\n  }\n\n  return grouped;\n}\n"],"mappings":"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"}