{"version":3,"file":"get-month-positioned-events.mjs","names":[],"sources":["../../../../src/components/MonthView/get-month-view-events/get-month-positioned-events.ts"],"sourcesContent":["import dayjs from 'dayjs';\nimport {\n  AnyDateValue,\n  DateStringValue,\n  DayOfWeek,\n  MonthPositionedEventData,\n  ScheduleEventData,\n} from '../../../types';\nimport { addEventToDayGroups } from './add-event-to-day-groups';\nimport { calculateEventPositionInWeek } from './calculate-event-position-in-week';\nimport { findAvailableRow } from './find-available-row';\nimport { getWeeksInRange } from './get-weeks-in-range';\n\ninterface GetMonthPositionedEventsInput {\n  /** Date (month start) at which events are positioned */\n  date: AnyDateValue;\n\n  /** List of all events that belong to the given month, extra events must be filtered out before passing to the function */\n  events: ScheduleEventData[];\n\n  /** First day of the week, 0 - Sunday, 1 - Monday, etc., used to calculate events positions */\n  firstDayOfWeek?: DayOfWeek;\n\n  /** Range of dates for which events should be displayed (includes outside days if withOutsideDays is true) */\n  range?: {\n    start: DateStringValue;\n    end: DateStringValue;\n  };\n}\n\n/** Events grouped by week index and by day */\nexport interface GroupedMonthEvents {\n  /** Events grouped by week index (index within month) */\n  groupedByWeek: {\n    [weekIndex: string]: MonthPositionedEventData[];\n  };\n\n  /** Events grouped by day (YYYY-MM-DD format) */\n  groupedByDay: {\n    [date: string]: MonthPositionedEventData[];\n  };\n\n  /** Background events grouped by week index */\n  backgroundByWeek: {\n    [weekIndex: string]: MonthPositionedEventData[];\n  };\n}\n\nexport function getMonthPositionedEvents({\n  date,\n  events,\n  firstDayOfWeek = 1,\n  range,\n}: GetMonthPositionedEventsInput): GroupedMonthEvents {\n  const groupedByWeek: GroupedMonthEvents['groupedByWeek'] = {};\n  const backgroundByWeek: GroupedMonthEvents['backgroundByWeek'] = {};\n  const eventsAddedToDay = new Set<string>();\n\n  const rangeStart = range ? dayjs(range.start) : dayjs(date).startOf('month');\n  const rangeEnd = range ? dayjs(range.end) : dayjs(date).startOf('month').endOf('month');\n\n  const { weeks, groupedByDay } = getWeeksInRange({\n    rangeStart,\n    rangeEnd,\n    firstDayOfWeek,\n  });\n\n  for (let i = 0; i < weeks.length; i++) {\n    groupedByWeek[i.toString()] = [];\n    backgroundByWeek[i.toString()] = [];\n  }\n\n  for (const event of events) {\n    const eventStart = dayjs(event.start).startOf('day');\n    const rawEnd = dayjs(event.end);\n    const endAtMidnight = rawEnd.hour() === 0 && rawEnd.minute() === 0 && rawEnd.second() === 0;\n    const eventEnd = endAtMidnight\n      ? rawEnd.startOf('day').subtract(1, 'day')\n      : rawEnd.startOf('day');\n    const isMultiday = eventEnd.isAfter(eventStart);\n\n    for (let weekIdx = 0; weekIdx < weeks.length; weekIdx++) {\n      const week = weeks[weekIdx];\n      const weekStart = dayjs(week[0]).startOf('day');\n      const weekEnd = dayjs(week[6]).endOf('day');\n\n      if (\n        (eventStart.isBefore(weekEnd) || eventStart.isSame(weekEnd, 'day')) &&\n        (eventEnd.isAfter(weekStart) || eventEnd.isSame(weekStart, 'day'))\n      ) {\n        const { startDayIndex, daysSpanned, startOffset, width, hanging } =\n          calculateEventPositionInWeek({\n            eventStart,\n            eventEnd,\n            weekStart,\n            weekEnd,\n            isMultiday,\n          });\n\n        if (event.display === 'background') {\n          backgroundByWeek[weekIdx.toString()].push({\n            ...event,\n            position: {\n              startOffset,\n              width,\n              weekIndex: weekIdx,\n              row: 0,\n              hanging,\n            },\n          });\n          continue;\n        }\n\n        const row = findAvailableRow({\n          existingEvents: groupedByWeek[weekIdx.toString()],\n          startDayIndex,\n          daysSpanned,\n          weekStart,\n        });\n\n        const positionedEvent: MonthPositionedEventData = {\n          ...event,\n          position: {\n            startOffset,\n            width,\n            weekIndex: weekIdx,\n            row,\n            hanging,\n          },\n        };\n\n        groupedByWeek[weekIdx.toString()].push(positionedEvent);\n\n        addEventToDayGroups({\n          positionedEvent,\n          eventStart,\n          eventEnd,\n          groupedByDay,\n          eventsAddedToDay,\n          weekIdx,\n        });\n      }\n    }\n  }\n\n  return {\n    groupedByWeek,\n    groupedByDay,\n    backgroundByWeek,\n  };\n}\n"],"mappings":";;;;;;;AAgDA,SAAgB,yBAAyB,EACvC,MACA,QACA,iBAAiB,GACjB,SACoD;CACpD,MAAM,gBAAqD,CAAC;CAC5D,MAAM,mBAA2D,CAAC;CAClE,MAAM,mCAAmB,IAAI,IAAY;CAKzC,MAAM,EAAE,OAAO,iBAAiB,gBAAgB;EAC9C,YAJiB,QAAQ,MAAM,MAAM,KAAK,IAAI,MAAM,IAAI,CAAC,CAAC,QAAQ,OAAO;EAKzE,UAJe,QAAQ,MAAM,MAAM,GAAG,IAAI,MAAM,IAAI,CAAC,CAAC,QAAQ,OAAO,CAAC,CAAC,MAAM,OAAO;EAKpF;CACF,CAAC;CAED,KAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;EACrC,cAAc,EAAE,SAAS,KAAK,CAAC;EAC/B,iBAAiB,EAAE,SAAS,KAAK,CAAC;CACpC;CAEA,KAAK,MAAM,SAAS,QAAQ;EAC1B,MAAM,aAAa,MAAM,MAAM,KAAK,CAAC,CAAC,QAAQ,KAAK;EACnD,MAAM,SAAS,MAAM,MAAM,GAAG;EAE9B,MAAM,WADgB,OAAO,KAAK,MAAM,KAAK,OAAO,OAAO,MAAM,KAAK,OAAO,OAAO,MAAM,IAEtF,OAAO,QAAQ,KAAK,CAAC,CAAC,SAAS,GAAG,KAAK,IACvC,OAAO,QAAQ,KAAK;EACxB,MAAM,aAAa,SAAS,QAAQ,UAAU;EAE9C,KAAK,IAAI,UAAU,GAAG,UAAU,MAAM,QAAQ,WAAW;GACvD,MAAM,OAAO,MAAM;GACnB,MAAM,YAAY,MAAM,KAAK,EAAE,CAAC,CAAC,QAAQ,KAAK;GAC9C,MAAM,UAAU,MAAM,KAAK,EAAE,CAAC,CAAC,MAAM,KAAK;GAE1C,KACG,WAAW,SAAS,OAAO,KAAK,WAAW,OAAO,SAAS,KAAK,OAChE,SAAS,QAAQ,SAAS,KAAK,SAAS,OAAO,WAAW,KAAK,IAChE;IACA,MAAM,EAAE,eAAe,aAAa,aAAa,OAAO,YACtD,6BAA6B;KAC3B;KACA;KACA;KACA;KACA;IACF,CAAC;IAEH,IAAI,MAAM,YAAY,cAAc;KAClC,iBAAiB,QAAQ,SAAS,EAAE,CAAC,KAAK;MACxC,GAAG;MACH,UAAU;OACR;OACA;OACA,WAAW;OACX,KAAK;OACL;MACF;KACF,CAAC;KACD;IACF;IAEA,MAAM,MAAM,iBAAiB;KAC3B,gBAAgB,cAAc,QAAQ,SAAS;KAC/C;KACA;KACA;IACF,CAAC;IAED,MAAM,kBAA4C;KAChD,GAAG;KACH,UAAU;MACR;MACA;MACA,WAAW;MACX;MACA;KACF;IACF;IAEA,cAAc,QAAQ,SAAS,EAAE,CAAC,KAAK,eAAe;IAEtD,oBAAoB;KAClB;KACA;KACA;KACA;KACA;KACA;IACF,CAAC;GACH;EACF;CACF;CAEA,OAAO;EACL;EACA;EACA;CACF;AACF"}