{"version":3,"file":"get-resources-week-view-events.mjs","names":[],"sources":["../../../../src/components/ResourcesWeekView/get-resources-week-view-events/get-resources-week-view-events.ts"],"sourcesContent":["import dayjs from 'dayjs';\nimport { ScheduleEventData, ScheduleResourceData } from '../../../types';\nimport { expandRecurringEvents, isMultidayEvent } from '../../../utils';\nimport {\n  getResourcesDayViewEvents,\n  ResourcesDayViewEventsResult,\n} from '../../ResourcesDayView/get-resources-day-view-events/get-resources-day-view-events';\nimport { calculateEventDays } from '../../WeekView/get-week-view-events/calculate-event-days';\nimport { getEventEndDate } from '../../WeekView/get-week-view-events/get-event-end-date';\n\n/** A single all-day bar (single-day all-day event or a multi-day event) spanning one or more\n * consecutive visible weekdays, placed on a shared row so overlapping bars do not collide. */\nexport interface ResourcesWeekViewAllDayBar {\n  /** The original event, with its declared start/end preserved for display and interaction */\n  event: ScheduleEventData;\n  /** Index of the first visible weekday the bar covers */\n  startDayIndex: number;\n  /** Index of the last visible weekday the bar covers */\n  endDayIndex: number;\n  /** Row within the all-day band, assigned so overlapping bars stack instead of overlapping */\n  row: number;\n}\n\nexport interface ResourcesWeekViewEventsResult {\n  byDay: Record<string, ResourcesDayViewEventsResult>;\n  /** All-day bars per resource, each spanning the days it covers as a single continuous bar */\n  allDayBars: Record<string | number, ResourcesWeekViewAllDayBar[]>;\n}\n\n/** Assigns each bar the lowest row whose previously placed bars all end before this bar starts,\n * so bars overlapping in days are stacked on separate rows (mutates `bar.row`). */\nfunction assignAllDayRows(bars: ResourcesWeekViewAllDayBar[]): void {\n  const order = bars\n    .map((bar, index) => ({ bar, index }))\n    .sort(\n      (a, b) =>\n        a.bar.startDayIndex - b.bar.startDayIndex ||\n        a.bar.endDayIndex - b.bar.endDayIndex ||\n        a.index - b.index\n    );\n\n  const rowEnds: number[] = [];\n  for (const { bar } of order) {\n    let row = 0;\n    while (row < rowEnds.length && rowEnds[row] >= bar.startDayIndex) {\n      row += 1;\n    }\n    rowEnds[row] = bar.endDayIndex;\n    bar.row = row;\n  }\n}\n\ninterface GetResourcesWeekViewEventsInput {\n  events: ScheduleEventData[] | undefined;\n  resources: ScheduleResourceData[];\n  weekdays: string[];\n  startTime?: string;\n  endTime?: string;\n  expansionLimit?: number;\n}\n\nexport function getResourcesWeekViewEvents({\n  events,\n  resources,\n  weekdays,\n  startTime,\n  endTime,\n  expansionLimit,\n}: GetResourcesWeekViewEventsInput): ResourcesWeekViewEventsResult {\n  const rangeStart = dayjs(weekdays[0]).startOf('day').toDate();\n  const rangeEnd = dayjs(weekdays[weekdays.length - 1])\n    .endOf('day')\n    .toDate();\n\n  const expandedEvents = expandRecurringEvents({\n    events,\n    rangeStart,\n    rangeEnd,\n    expansionLimit,\n  });\n\n  if (expandedEvents) {\n    const seenIds = new Set<string | number>();\n    for (const event of expandedEvents) {\n      if (seenIds.has(event.id)) {\n        throw new Error(\n          `[@mantine/schedule] ResourcesWeekView: Duplicated event ids found: ${event.id}`\n        );\n      }\n      seenIds.add(event.id);\n    }\n  }\n\n  const byDay: Record<string, ResourcesDayViewEventsResult> = {};\n\n  const assignedIds = new Set<string | number>();\n\n  // Multi-day regular events are rendered as a single all-day bar spanning the days they cover\n  // (matching the base WeekView, which treats any multi-day event as all-day), so they are excluded\n  // from the per-day timed flow and collected as spanning bars below.\n  const isSpanningRegularEvent = (event: ScheduleEventData) =>\n    event.display !== 'background' && isMultidayEvent(event);\n\n  for (const day of weekdays) {\n    const dayEvents = expandedEvents?.filter((event) => {\n      if (assignedIds.has(event.id) || isSpanningRegularEvent(event)) {\n        return false;\n      }\n\n      const eventStart = dayjs(event.start);\n      const dayStart = dayjs(day).startOf('day');\n\n      if (eventStart.isSame(dayStart, 'day')) {\n        assignedIds.add(event.id);\n        return true;\n      }\n\n      if (\n        event.display === 'background' &&\n        eventStart.isBefore(dayjs(day).endOf('day')) &&\n        dayjs(event.end).isAfter(dayStart)\n      ) {\n        return true;\n      }\n\n      return false;\n    });\n\n    byDay[day] = getResourcesDayViewEvents({\n      events: dayEvents,\n      resources,\n      date: day,\n      startTime,\n      endTime,\n    });\n  }\n\n  const allDayBars: Record<string | number, ResourcesWeekViewAllDayBar[]> = {};\n  for (const resource of resources) {\n    allDayBars[resource.id] = [];\n  }\n\n  // Single-day all-day events keep the per-day classification done by getResourcesDayViewEvents and\n  // become single-day bars.\n  weekdays.forEach((day, dayIndex) => {\n    for (const resource of resources) {\n      for (const positioned of byDay[day].allDayEvents[resource.id] ?? []) {\n        allDayBars[resource.id].push({\n          event: positioned,\n          startDayIndex: dayIndex,\n          endDayIndex: dayIndex,\n          row: 0,\n        });\n      }\n    }\n  });\n\n  // Multi-day regular events become a single bar spanning the visible days they cover.\n  if (expandedEvents) {\n    for (const event of expandedEvents) {\n      if (\n        !isSpanningRegularEvent(event) ||\n        event.resourceId === undefined ||\n        !(event.resourceId in allDayBars)\n      ) {\n        continue;\n      }\n\n      const actualEndDate = getEventEndDate(event);\n      const eventWeekDays = calculateEventDays({ event, weekDays: weekdays, actualEndDate });\n      if (eventWeekDays.length === 0) {\n        continue;\n      }\n\n      allDayBars[event.resourceId].push({\n        event,\n        startDayIndex: weekdays.indexOf(eventWeekDays[0]),\n        endDayIndex: weekdays.indexOf(eventWeekDays[eventWeekDays.length - 1]),\n        row: 0,\n      });\n    }\n  }\n\n  for (const resource of resources) {\n    assignAllDayRows(allDayBars[resource.id]);\n  }\n\n  return { byDay, allDayBars };\n}\n"],"mappings":"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"}