@mantine/schedule 9.5.1 → 9.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cjs/_virtual/_rolldown/runtime.cjs +1 -1
- package/cjs/components/AgendaView/AgendaView.cjs +7 -6
- package/cjs/components/AgendaView/AgendaView.cjs.map +1 -1
- package/cjs/components/AgendaView/get-agenda-view-events.cjs.map +1 -1
- package/cjs/components/CurrentTimeIndicator/CurrentTimeIndicator.cjs +3 -2
- package/cjs/components/CurrentTimeIndicator/CurrentTimeIndicator.cjs.map +1 -1
- package/cjs/components/DayView/DayView.cjs +144 -78
- package/cjs/components/DayView/DayView.cjs.map +1 -1
- package/cjs/components/DayView/DayView.module.cjs +2 -1
- package/cjs/components/DayView/DayView.module.cjs.map +1 -1
- package/cjs/components/DayView/get-day-view-events/get-day-view-events.cjs.map +1 -1
- package/cjs/components/DragContext/DragContext.cjs.map +1 -1
- package/cjs/components/MobileMonthView/MobileMonthView.cjs +7 -6
- package/cjs/components/MobileMonthView/MobileMonthView.cjs.map +1 -1
- package/cjs/components/MobileMonthView/get-mobile-month-view-events.cjs.map +1 -1
- package/cjs/components/MonthView/MonthView.cjs +24 -34
- package/cjs/components/MonthView/MonthView.cjs.map +1 -1
- package/cjs/components/MonthView/MonthView.module.cjs.map +1 -1
- package/cjs/components/MonthView/get-month-view-events/find-available-row.cjs.map +1 -1
- package/cjs/components/MonthView/get-month-view-events/get-month-positioned-events.cjs +4 -2
- package/cjs/components/MonthView/get-month-view-events/get-month-positioned-events.cjs.map +1 -1
- package/cjs/components/MonthView/get-month-view-events/get-month-view-events.cjs.map +1 -1
- package/cjs/components/MonthView/get-month-view-events/get-weeks-in-range.cjs +3 -2
- package/cjs/components/MonthView/get-month-view-events/get-weeks-in-range.cjs.map +1 -1
- package/cjs/components/MonthView/get-renderable-month-event-segments.cjs +1 -1
- package/cjs/components/MonthView/get-renderable-month-event-segments.cjs.map +1 -1
- package/cjs/components/MoreEvents/MoreEvents.cjs.map +1 -1
- package/cjs/components/ResourcesDayView/ResourcesDayView.cjs +136 -52
- package/cjs/components/ResourcesDayView/ResourcesDayView.cjs.map +1 -1
- package/cjs/components/ResourcesDayView/ResourcesDayView.module.cjs +2 -1
- package/cjs/components/ResourcesDayView/ResourcesDayView.module.cjs.map +1 -1
- package/cjs/components/ResourcesDayView/ResourcesDayViewColumn.cjs.map +1 -1
- package/cjs/components/ResourcesDayView/get-resources-day-view-events/get-resources-day-view-events.cjs.map +1 -1
- package/cjs/components/ResourcesMonthView/ResourcesMonthView.cjs.map +1 -1
- package/cjs/components/ResourcesSchedule/ResourcesSchedule.cjs +3 -1
- package/cjs/components/ResourcesSchedule/ResourcesSchedule.cjs.map +1 -1
- package/cjs/components/ResourcesWeekView/ResourcesWeekView.cjs +150 -59
- package/cjs/components/ResourcesWeekView/ResourcesWeekView.cjs.map +1 -1
- package/cjs/components/ResourcesWeekView/ResourcesWeekView.module.cjs +2 -1
- package/cjs/components/ResourcesWeekView/ResourcesWeekView.module.cjs.map +1 -1
- package/cjs/components/ResourcesWeekView/ResourcesWeekViewRow.cjs.map +1 -1
- package/cjs/components/ResourcesWeekView/get-resources-week-view-events/get-resources-week-view-events.cjs +6 -3
- package/cjs/components/ResourcesWeekView/get-resources-week-view-events/get-resources-week-view-events.cjs.map +1 -1
- package/cjs/components/Schedule/Schedule.cjs +4 -1
- package/cjs/components/Schedule/Schedule.cjs.map +1 -1
- package/cjs/components/ScheduleBackgroundEvent/ScheduleBackgroundEvent.cjs +53 -0
- package/cjs/components/ScheduleBackgroundEvent/ScheduleBackgroundEvent.cjs.map +1 -0
- package/cjs/components/ScheduleEvent/ScheduleEvent.cjs.map +1 -1
- package/cjs/components/ScheduleHeader/HeaderControl/HeaderControl.cjs +15 -14
- package/cjs/components/ScheduleHeader/HeaderControl/HeaderControl.cjs.map +1 -1
- package/cjs/components/ScheduleHeader/MonthYearSelect/MonthYearSelect.cjs.map +1 -1
- package/cjs/components/ScheduleHeader/ScheduleHeader.cjs.map +1 -1
- package/cjs/components/ScheduleHeader/ScheduleHeaderBase.cjs.map +1 -1
- package/cjs/components/ScheduleHeader/ScheduleHeaderContext.cjs.map +1 -1
- package/cjs/components/ScheduleHeader/ViewSelect/ViewSelect.cjs.map +1 -1
- package/cjs/components/WeekView/WeekView.cjs +159 -82
- package/cjs/components/WeekView/WeekView.cjs.map +1 -1
- package/cjs/components/WeekView/WeekView.module.cjs +2 -1
- package/cjs/components/WeekView/WeekView.module.cjs.map +1 -1
- package/cjs/components/WeekView/WeekViewDay.cjs.map +1 -1
- package/cjs/components/WeekView/get-week-label/get-week-label.cjs.map +1 -1
- package/cjs/components/WeekView/get-week-view-events/calculate-all-day-event-offset.cjs.map +1 -1
- package/cjs/components/WeekView/get-week-view-events/calculate-all-day-event-width.cjs.map +1 -1
- package/cjs/components/WeekView/get-week-view-events/calculate-event-days.cjs.map +1 -1
- package/cjs/components/WeekView/get-week-view-events/find-available-column.cjs +5 -10
- package/cjs/components/WeekView/get-week-view-events/find-available-column.cjs.map +1 -1
- package/cjs/components/WeekView/get-week-view-events/get-event-end-date.cjs.map +1 -1
- package/cjs/components/WeekView/get-week-view-events/get-hanging-status.cjs.map +1 -1
- package/cjs/components/WeekView/get-week-view-events/get-week-positioned-events.cjs +5 -3
- package/cjs/components/WeekView/get-week-view-events/get-week-positioned-events.cjs.map +1 -1
- package/cjs/components/YearView/YearView.cjs +7 -6
- package/cjs/components/YearView/YearView.cjs.map +1 -1
- package/cjs/components/YearView/YearViewMonth.cjs.map +1 -1
- package/cjs/components/YearView/get-visible-week-days.cjs.map +1 -1
- package/cjs/components/YearView/get-year-view-events/get-year-view-events.cjs.map +1 -1
- package/cjs/hooks/use-auto-scroll-on-drag.cjs.map +1 -1
- package/cjs/hooks/use-day-grid-event-resize.cjs.map +1 -1
- package/cjs/hooks/use-drag-drop-handlers.cjs +13 -2
- package/cjs/hooks/use-drag-drop-handlers.cjs.map +1 -1
- package/cjs/hooks/use-drag-state.cjs.map +1 -1
- package/cjs/hooks/use-event-resize.cjs +30 -15
- package/cjs/hooks/use-event-resize.cjs.map +1 -1
- package/cjs/hooks/use-horizontal-event-resize.cjs +30 -15
- package/cjs/hooks/use-horizontal-event-resize.cjs.map +1 -1
- package/cjs/hooks/use-slot-drag-select.cjs.map +1 -1
- package/cjs/index.cjs +2 -0
- package/cjs/utils/calculate-drop-time/calculate-drop-time.cjs +25 -4
- package/cjs/utils/calculate-drop-time/calculate-drop-time.cjs.map +1 -1
- package/cjs/utils/calculate-month-drop-date/calculate-month-drop-date.cjs.map +1 -1
- package/cjs/utils/calculate-month-resize-dates/calculate-month-resize-dates.cjs.map +1 -1
- package/cjs/utils/expand-recurring-events/expand-recurring-events.cjs +20 -8
- package/cjs/utils/expand-recurring-events/expand-recurring-events.cjs.map +1 -1
- package/cjs/utils/format-date/format-date.cjs.map +1 -1
- package/cjs/utils/get-current-time-position/get-current-time-position.cjs.map +1 -1
- package/cjs/utils/get-day-position/get-day-position.cjs.map +1 -1
- package/cjs/utils/get-end-of-week/get-end-of-week.cjs.map +1 -1
- package/cjs/utils/get-month-days/get-month-days.cjs +4 -2
- package/cjs/utils/get-month-days/get-month-days.cjs.map +1 -1
- package/cjs/utils/get-month-range/get-month-range.cjs.map +1 -1
- package/cjs/utils/get-months-by-quarter/get-months-by-quarter.cjs.map +1 -1
- package/cjs/utils/get-months-list/get-months-list.cjs.map +1 -1
- package/cjs/utils/get-start-of-week/get-start-of-week.cjs.map +1 -1
- package/cjs/utils/get-week-days/get-week-days.cjs.map +1 -1
- package/cjs/utils/get-week-number/get-week-number.cjs +4 -1
- package/cjs/utils/get-week-number/get-week-number.cjs.map +1 -1
- package/cjs/utils/get-weekdays-names/get-weekdays-names.cjs.map +1 -1
- package/cjs/utils/is-after-min-date/is-after-min-date.cjs.map +1 -1
- package/cjs/utils/is-all-day-event/is-all-day-event.cjs.map +1 -1
- package/cjs/utils/is-before-max-date/is-before-max-date.cjs.map +1 -1
- package/cjs/utils/is-event-in-time-range/is-event-in-time-range.cjs.map +1 -1
- package/cjs/utils/is-events-overlap/is-events-overlap.cjs +16 -4
- package/cjs/utils/is-events-overlap/is-events-overlap.cjs.map +1 -1
- package/cjs/utils/is-in-time-range/is-in-time-range.cjs.map +1 -1
- package/cjs/utils/is-multiday-event/is-multiday-event.cjs.map +1 -1
- package/cjs/utils/is-same-month/is-same-month.cjs.map +1 -1
- package/cjs/utils/is-within-week/is-within-week.cjs.map +1 -1
- package/cjs/utils/next-week/next-week.cjs.map +1 -1
- package/cjs/utils/previous-week/previous-week.cjs.map +1 -1
- package/cjs/utils/sort-events/sort-events.cjs.map +1 -1
- package/cjs/utils/to-date-string/to-date-string.cjs.map +1 -1
- package/cjs/utils/validate-event/validate-event.cjs.map +1 -1
- package/esm/components/AgendaView/AgendaView.mjs +7 -6
- package/esm/components/AgendaView/AgendaView.mjs.map +1 -1
- package/esm/components/CurrentTimeIndicator/CurrentTimeIndicator.mjs +4 -3
- package/esm/components/CurrentTimeIndicator/CurrentTimeIndicator.mjs.map +1 -1
- package/esm/components/DayView/DayView.mjs +145 -79
- package/esm/components/DayView/DayView.mjs.map +1 -1
- package/esm/components/DayView/DayView.module.mjs +2 -1
- package/esm/components/DayView/DayView.module.mjs.map +1 -1
- package/esm/components/MobileMonthView/MobileMonthView.mjs +7 -6
- package/esm/components/MobileMonthView/MobileMonthView.mjs.map +1 -1
- package/esm/components/MonthView/MonthView.mjs +25 -35
- package/esm/components/MonthView/MonthView.mjs.map +1 -1
- package/esm/components/MonthView/MonthView.module.mjs.map +1 -1
- package/esm/components/MonthView/get-month-view-events/get-month-positioned-events.mjs +4 -2
- package/esm/components/MonthView/get-month-view-events/get-month-positioned-events.mjs.map +1 -1
- package/esm/components/MonthView/get-month-view-events/get-weeks-in-range.mjs +3 -2
- package/esm/components/MonthView/get-month-view-events/get-weeks-in-range.mjs.map +1 -1
- package/esm/components/MonthView/get-renderable-month-event-segments.mjs +1 -1
- package/esm/components/MonthView/get-renderable-month-event-segments.mjs.map +1 -1
- package/esm/components/MoreEvents/MoreEvents.mjs.map +1 -1
- package/esm/components/ResourcesDayView/ResourcesDayView.mjs +138 -54
- package/esm/components/ResourcesDayView/ResourcesDayView.mjs.map +1 -1
- package/esm/components/ResourcesDayView/ResourcesDayView.module.mjs +2 -1
- package/esm/components/ResourcesDayView/ResourcesDayView.module.mjs.map +1 -1
- package/esm/components/ResourcesDayView/ResourcesDayViewColumn.mjs.map +1 -1
- package/esm/components/ResourcesMonthView/ResourcesMonthView.mjs.map +1 -1
- package/esm/components/ResourcesSchedule/ResourcesSchedule.mjs +3 -1
- package/esm/components/ResourcesSchedule/ResourcesSchedule.mjs.map +1 -1
- package/esm/components/ResourcesWeekView/ResourcesWeekView.mjs +152 -61
- package/esm/components/ResourcesWeekView/ResourcesWeekView.mjs.map +1 -1
- package/esm/components/ResourcesWeekView/ResourcesWeekView.module.mjs +2 -1
- package/esm/components/ResourcesWeekView/ResourcesWeekView.module.mjs.map +1 -1
- package/esm/components/ResourcesWeekView/ResourcesWeekViewRow.mjs.map +1 -1
- package/esm/components/ResourcesWeekView/get-resources-week-view-events/get-resources-week-view-events.mjs +6 -3
- package/esm/components/ResourcesWeekView/get-resources-week-view-events/get-resources-week-view-events.mjs.map +1 -1
- package/esm/components/Schedule/Schedule.mjs +4 -1
- package/esm/components/Schedule/Schedule.mjs.map +1 -1
- package/esm/components/ScheduleBackgroundEvent/ScheduleBackgroundEvent.mjs +53 -0
- package/esm/components/ScheduleBackgroundEvent/ScheduleBackgroundEvent.mjs.map +1 -0
- package/esm/components/ScheduleEvent/ScheduleEvent.mjs.map +1 -1
- package/esm/components/ScheduleHeader/HeaderControl/HeaderControl.mjs +15 -14
- package/esm/components/ScheduleHeader/HeaderControl/HeaderControl.mjs.map +1 -1
- package/esm/components/ScheduleHeader/MonthYearSelect/MonthYearSelect.mjs.map +1 -1
- package/esm/components/ScheduleHeader/ScheduleHeader.mjs.map +1 -1
- package/esm/components/ScheduleHeader/ScheduleHeaderBase.mjs.map +1 -1
- package/esm/components/ScheduleHeader/ViewSelect/ViewSelect.mjs.map +1 -1
- package/esm/components/WeekView/WeekView.mjs +160 -83
- package/esm/components/WeekView/WeekView.mjs.map +1 -1
- package/esm/components/WeekView/WeekView.module.mjs +2 -1
- package/esm/components/WeekView/WeekView.module.mjs.map +1 -1
- package/esm/components/WeekView/WeekViewDay.mjs.map +1 -1
- package/esm/components/WeekView/get-week-view-events/find-available-column.mjs +5 -10
- package/esm/components/WeekView/get-week-view-events/find-available-column.mjs.map +1 -1
- package/esm/components/WeekView/get-week-view-events/get-week-positioned-events.mjs +5 -3
- package/esm/components/WeekView/get-week-view-events/get-week-positioned-events.mjs.map +1 -1
- package/esm/components/YearView/YearView.mjs +7 -6
- package/esm/components/YearView/YearView.mjs.map +1 -1
- package/esm/components/YearView/YearViewMonth.mjs.map +1 -1
- package/esm/hooks/use-drag-drop-handlers.mjs +13 -2
- package/esm/hooks/use-drag-drop-handlers.mjs.map +1 -1
- package/esm/hooks/use-event-resize.mjs +30 -15
- package/esm/hooks/use-event-resize.mjs.map +1 -1
- package/esm/hooks/use-horizontal-event-resize.mjs +30 -15
- package/esm/hooks/use-horizontal-event-resize.mjs.map +1 -1
- package/esm/index.mjs +2 -1
- package/esm/utils/calculate-drop-time/calculate-drop-time.mjs +25 -4
- package/esm/utils/calculate-drop-time/calculate-drop-time.mjs.map +1 -1
- package/esm/utils/expand-recurring-events/expand-recurring-events.mjs +20 -8
- package/esm/utils/expand-recurring-events/expand-recurring-events.mjs.map +1 -1
- package/esm/utils/get-month-days/get-month-days.mjs +4 -2
- package/esm/utils/get-month-days/get-month-days.mjs.map +1 -1
- package/esm/utils/get-week-number/get-week-number.mjs +4 -1
- package/esm/utils/get-week-number/get-week-number.mjs.map +1 -1
- package/esm/utils/is-events-overlap/is-events-overlap.mjs +16 -4
- package/esm/utils/is-events-overlap/is-events-overlap.mjs.map +1 -1
- package/lib/components/DayView/DayView.d.ts +7 -1
- package/lib/components/MonthView/MonthView.d.ts +2 -0
- package/lib/components/ResourcesDayView/ResourcesDayView.d.ts +7 -1
- package/lib/components/ResourcesDayView/ResourcesDayViewColumn.d.ts +1 -1
- package/lib/components/ResourcesSchedule/ResourcesSchedule.d.ts +3 -1
- package/lib/components/ResourcesWeekView/ResourcesWeekView.d.ts +7 -1
- package/lib/components/ResourcesWeekView/ResourcesWeekViewRow.d.ts +1 -1
- package/lib/components/Schedule/Schedule.d.ts +3 -1
- package/lib/components/ScheduleBackgroundEvent/ScheduleBackgroundEvent.d.ts +19 -0
- package/lib/components/ScheduleBackgroundEvent/index.d.ts +2 -0
- package/lib/components/ScheduleHeader/HeaderControl/HeaderControl.d.ts +3 -3
- package/lib/components/ScheduleHeader/ScheduleHeaderBase.d.ts +1 -1
- package/lib/components/WeekView/WeekView.d.ts +7 -1
- package/lib/components/WeekView/WeekViewDay.d.ts +1 -1
- package/lib/components/WeekView/get-week-view-events/find-available-column.d.ts +7 -3
- package/lib/components/YearView/YearViewMonth.d.ts +1 -1
- package/lib/hooks/use-drag-drop-handlers.d.ts +10 -1
- package/lib/hooks/use-event-resize.d.ts +2 -1
- package/lib/hooks/use-horizontal-event-resize.d.ts +2 -1
- package/lib/index.d.mts +1 -0
- package/lib/index.d.ts +1 -0
- package/lib/types.d.ts +1 -1
- package/lib/utils/calculate-drop-time/calculate-drop-time.d.ts +11 -1
- package/package.json +8 -5
- package/styles.css +160 -0
- package/styles.layer.css +160 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"expand-recurring-events.mjs","names":[],"sources":["../../../src/utils/expand-recurring-events/expand-recurring-events.ts"],"sourcesContent":["import dayjs from 'dayjs';\nimport * as rruleAll from 'rrule';\n\nconst RRule = (\n 'default' in rruleAll ? (rruleAll as any).default.RRule : rruleAll.RRule\n) as typeof rruleAll.RRule;\nimport { DateTimeStringValue, ScheduleEventData, ScheduleRecurrenceData } from '../../types';\nimport { validateEvent } from '../validate-event/validate-event';\n\ninterface ExpandRecurringEventsInput {\n events: ScheduleEventData[] | undefined;\n rangeStart: Date | string;\n rangeEnd: Date | string;\n expansionLimit?: number;\n}\n\nfunction getRecurrenceKey(recurringEventId: string | number, recurrenceId: DateTimeStringValue) {\n return `${recurringEventId}::${recurrenceId}`;\n}\n\nfunction overlapsRange(\n eventStart: dayjs.Dayjs,\n eventEnd: dayjs.Dayjs,\n rangeStart: dayjs.Dayjs,\n rangeEnd: dayjs.Dayjs\n) {\n return (\n (eventEnd.isAfter(rangeStart) || eventEnd.isSame(rangeStart)) &&\n (eventStart.isBefore(rangeEnd) || eventStart.isSame(rangeEnd))\n );\n}\n\nfunction getExdateSet(recurrence: ScheduleRecurrenceData | undefined) {\n if (!recurrence?.exdate) {\n return new Set<string>();\n }\n\n const values = recurrence.exdate\n .map((value) => dayjs(value))\n .filter((value) => value.isValid())\n .map((value) => value.format('YYYY-MM-DD HH:mm:ss'));\n\n return new Set(values);\n}\n\nfunction getRRuleString(rule: string) {\n const normalized = rule.trim();\n if (!normalized.includes('\\n')) {\n return normalized.startsWith('RRULE:') ? normalized.replace(/^RRULE:/, '') : normalized;\n }\n\n const rruleLine = normalized\n .split('\\n')\n .map((line) => line.trim())\n .find((line) => line.startsWith('RRULE:'));\n\n return rruleLine ? rruleLine.replace(/^RRULE:/, '') : normalized;\n}\n\nfunction getOccurrenceStartsInRange(\n event: ScheduleEventData,\n rangeStart: dayjs.Dayjs,\n rangeEnd: dayjs.Dayjs,\n expansionLimit: number,\n durationMs: number\n) {\n const dtstart = dayjs(event.recurrence?.dtstart || event.start);\n if (!dtstart.isValid() || !event.recurrence) {\n return [];\n }\n\n try {\n const options = RRule.parseString(getRRuleString(event.recurrence.rrule));\n options.dtstart = dtstart.toDate();\n const rule = new RRule(options);\n\n const searchStart = rangeStart.subtract(Math.max(0, durationMs), 'millisecond').toDate();\n const results = rule.between(searchStart, rangeEnd.toDate(), true);\n return results.slice(0, expansionLimit).map((value) => dayjs(value));\n } catch {\n return [];\n }\n}\n\nfunction isEventInRange(event: ScheduleEventData, rangeStart: dayjs.Dayjs, rangeEnd: dayjs.Dayjs) {\n const start = dayjs(event.start);\n const end = dayjs(event.end);\n\n if (!start.isValid() || !end.isValid()) {\n return false;\n }\n\n return overlapsRange(start, end, rangeStart, rangeEnd);\n}\n\nfunction createGeneratedInstance(\n event: ScheduleEventData,\n occurrenceStart: dayjs.Dayjs,\n durationMs: number\n): ScheduleEventData {\n const occurrenceEnd = occurrenceStart.add(durationMs, 'millisecond');\n const recurrenceId = occurrenceStart.format('YYYY-MM-DD HH:mm:ss');\n const { recurrence, ...eventWithoutRecurrence } = event;\n\n return {\n ...eventWithoutRecurrence,\n id: `${event.id}::${recurrenceId}`,\n start: occurrenceStart.format('YYYY-MM-DD HH:mm:ss'),\n end: occurrenceEnd.format('YYYY-MM-DD HH:mm:ss'),\n recurringEventId: event.id,\n recurrenceId,\n recurringInstance: {\n isRecurringInstance: true,\n recurringEventId: event.id,\n recurrenceId,\n originalStart: occurrenceStart.format('YYYY-MM-DD HH:mm:ss'),\n originalEnd: occurrenceEnd.format('YYYY-MM-DD HH:mm:ss'),\n },\n };\n}\n\nconst DEFAULT_EXPANSION_LIMIT = 2000;\n\nexport function expandRecurringEvents({\n events,\n rangeStart,\n rangeEnd,\n expansionLimit = DEFAULT_EXPANSION_LIMIT,\n}: ExpandRecurringEventsInput): ScheduleEventData[] {\n if (!events || events.length === 0) {\n return [];\n }\n\n const start = dayjs(rangeStart);\n const end = dayjs(rangeEnd);\n\n if (!start.isValid() || !end.isValid()) {\n return [];\n }\n\n const regularEvents: ScheduleEventData[] = [];\n const recurringEvents: ScheduleEventData[] = [];\n const overrides = new Map<string, ScheduleEventData>();\n\n for (const event of events) {\n if (event.recurringEventId && event.recurrenceId) {\n overrides.set(getRecurrenceKey(event.recurringEventId, event.recurrenceId), event);\n continue;\n }\n\n if (event.recurrence?.rrule) {\n recurringEvents.push(event);\n continue;\n }\n\n regularEvents.push(event);\n }\n\n const output: ScheduleEventData[] = [];\n const consumedOverrideIds = new Set<string | number>();\n\n for (const event of regularEvents) {\n if (isEventInRange(event, start, end)) {\n output.push(validateEvent(event));\n }\n }\n\n for (const event of recurringEvents) {\n const eventStart = dayjs(event.recurrence?.dtstart || event.start);\n const eventEnd = dayjs(event.end);\n\n if (!eventStart.isValid() || !eventEnd.isValid()) {\n continue;\n }\n\n const durationMs = eventEnd.diff(dayjs(event.start), 'millisecond');\n if (durationMs < 0) {\n continue;\n }\n\n const exdate = getExdateSet(event.recurrence);\n const starts = getOccurrenceStartsInRange(event, start, end, expansionLimit, durationMs);\n\n for (const occurrenceStart of starts) {\n const recurrenceId = occurrenceStart.format('YYYY-MM-DD HH:mm:ss');\n if (exdate.has(recurrenceId)) {\n continue;\n }\n\n const overrideKey = getRecurrenceKey(event.id, recurrenceId);\n const override = overrides.get(overrideKey);\n if (override) {\n if (isEventInRange(override, start, end)) {\n output.push(validateEvent(override));\n consumedOverrideIds.add(override.id);\n }\n continue;\n }\n\n const generated = createGeneratedInstance(event, occurrenceStart, durationMs);\n if (overlapsRange(dayjs(generated.start), dayjs(generated.end), start, end)) {\n output.push(validateEvent(generated));\n }\n }\n }\n\n for (const override of overrides.values()) {\n if (consumedOverrideIds.has(override.id)) {\n continue;\n }\n if (isEventInRange(override, start, end)) {\n output.push(validateEvent(override));\n }\n }\n\n return output;\n}\n\nexport { DEFAULT_EXPANSION_LIMIT };\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"expand-recurring-events.mjs","names":[],"sources":["../../../src/utils/expand-recurring-events/expand-recurring-events.ts"],"sourcesContent":["import dayjs from 'dayjs';\nimport * as rruleAll from 'rrule';\n\nconst RRule = (\n 'default' in rruleAll ? (rruleAll as any).default.RRule : rruleAll.RRule\n) as typeof rruleAll.RRule;\nimport { DateTimeStringValue, ScheduleEventData, ScheduleRecurrenceData } from '../../types';\nimport { validateEvent } from '../validate-event/validate-event';\n\ninterface ExpandRecurringEventsInput {\n events: ScheduleEventData[] | undefined;\n rangeStart: Date | string;\n rangeEnd: Date | string;\n expansionLimit?: number;\n}\n\nfunction getRecurrenceKey(recurringEventId: string | number, recurrenceId: DateTimeStringValue) {\n return `${recurringEventId}::${recurrenceId}`;\n}\n\nfunction overlapsRange(\n eventStart: dayjs.Dayjs,\n eventEnd: dayjs.Dayjs,\n rangeStart: dayjs.Dayjs,\n rangeEnd: dayjs.Dayjs\n) {\n return (\n (eventEnd.isAfter(rangeStart) || eventEnd.isSame(rangeStart)) &&\n (eventStart.isBefore(rangeEnd) || eventStart.isSame(rangeEnd))\n );\n}\n\nfunction getExdateSet(recurrence: ScheduleRecurrenceData | undefined) {\n if (!recurrence?.exdate) {\n return new Set<string>();\n }\n\n const values = recurrence.exdate\n .map((value) => dayjs(value))\n .filter((value) => value.isValid())\n .map((value) => value.format('YYYY-MM-DD HH:mm:ss'));\n\n return new Set(values);\n}\n\nfunction toWallClockDate(value: dayjs.Dayjs) {\n return new Date(\n Date.UTC(\n value.year(),\n value.month(),\n value.date(),\n value.hour(),\n value.minute(),\n value.second(),\n value.millisecond()\n )\n );\n}\n\nfunction fromWallClockDate(value: Date) {\n const result = new Date(2000, 0, 1, 12);\n result.setFullYear(value.getUTCFullYear(), value.getUTCMonth(), value.getUTCDate());\n result.setHours(\n value.getUTCHours(),\n value.getUTCMinutes(),\n value.getUTCSeconds(),\n value.getUTCMilliseconds()\n );\n\n return dayjs(result);\n}\n\nfunction getWallClockDurationMs(start: dayjs.Dayjs, end: dayjs.Dayjs) {\n return toWallClockDate(end).getTime() - toWallClockDate(start).getTime();\n}\n\nfunction getRRuleString(rule: string) {\n const normalized = rule.trim();\n if (!normalized.includes('\\n')) {\n return normalized.startsWith('RRULE:') ? normalized.replace(/^RRULE:/, '') : normalized;\n }\n\n const rruleLine = normalized\n .split('\\n')\n .map((line) => line.trim())\n .find((line) => line.startsWith('RRULE:'));\n\n return rruleLine ? rruleLine.replace(/^RRULE:/, '') : normalized;\n}\n\nfunction getOccurrenceStartsInRange(\n event: ScheduleEventData,\n rangeStart: dayjs.Dayjs,\n rangeEnd: dayjs.Dayjs,\n expansionLimit: number,\n durationMs: number\n) {\n const dtstart = dayjs(event.recurrence?.dtstart || event.start);\n if (!dtstart.isValid() || !event.recurrence) {\n return [];\n }\n\n try {\n const options = RRule.parseString(getRRuleString(event.recurrence.rrule));\n options.dtstart = toWallClockDate(dtstart);\n const rule = new RRule(options);\n\n const searchStart = new Date(toWallClockDate(rangeStart).getTime() - Math.max(0, durationMs));\n const results = rule.between(searchStart, toWallClockDate(rangeEnd), true);\n return results.slice(0, expansionLimit);\n } catch {\n return [];\n }\n}\n\nfunction isEventInRange(event: ScheduleEventData, rangeStart: dayjs.Dayjs, rangeEnd: dayjs.Dayjs) {\n const start = dayjs(event.start);\n const end = dayjs(event.end);\n\n if (!start.isValid() || !end.isValid()) {\n return false;\n }\n\n return overlapsRange(start, end, rangeStart, rangeEnd);\n}\n\nfunction createGeneratedInstance(\n event: ScheduleEventData,\n occurrenceStart: dayjs.Dayjs,\n occurrenceEnd: dayjs.Dayjs\n): ScheduleEventData {\n const recurrenceId = occurrenceStart.format('YYYY-MM-DD HH:mm:ss');\n const { recurrence, ...eventWithoutRecurrence } = event;\n\n return {\n ...eventWithoutRecurrence,\n id: `${event.id}::${recurrenceId}`,\n start: occurrenceStart.format('YYYY-MM-DD HH:mm:ss'),\n end: occurrenceEnd.format('YYYY-MM-DD HH:mm:ss'),\n recurringEventId: event.id,\n recurrenceId,\n recurringInstance: {\n isRecurringInstance: true,\n recurringEventId: event.id,\n recurrenceId,\n originalStart: occurrenceStart.format('YYYY-MM-DD HH:mm:ss'),\n originalEnd: occurrenceEnd.format('YYYY-MM-DD HH:mm:ss'),\n },\n };\n}\n\nconst DEFAULT_EXPANSION_LIMIT = 2000;\n\nexport function expandRecurringEvents({\n events,\n rangeStart,\n rangeEnd,\n expansionLimit = DEFAULT_EXPANSION_LIMIT,\n}: ExpandRecurringEventsInput): ScheduleEventData[] {\n if (!events || events.length === 0) {\n return [];\n }\n\n const start = dayjs(rangeStart);\n const end = dayjs(rangeEnd);\n\n if (!start.isValid() || !end.isValid()) {\n return [];\n }\n\n const regularEvents: ScheduleEventData[] = [];\n const recurringEvents: ScheduleEventData[] = [];\n const overrides = new Map<string, ScheduleEventData>();\n\n for (const event of events) {\n if (event.recurringEventId && event.recurrenceId) {\n overrides.set(getRecurrenceKey(event.recurringEventId, event.recurrenceId), event);\n continue;\n }\n\n if (event.recurrence?.rrule) {\n recurringEvents.push(event);\n continue;\n }\n\n regularEvents.push(event);\n }\n\n const output: ScheduleEventData[] = [];\n const consumedOverrideIds = new Set<string | number>();\n\n for (const event of regularEvents) {\n if (isEventInRange(event, start, end)) {\n output.push(validateEvent(event));\n }\n }\n\n for (const event of recurringEvents) {\n const eventStart = dayjs(event.recurrence?.dtstart || event.start);\n const eventEnd = dayjs(event.end);\n\n if (!eventStart.isValid() || !eventEnd.isValid()) {\n continue;\n }\n\n const durationMs = getWallClockDurationMs(dayjs(event.start), eventEnd);\n if (durationMs < 0) {\n continue;\n }\n\n const exdate = getExdateSet(event.recurrence);\n const starts = getOccurrenceStartsInRange(event, start, end, expansionLimit, durationMs);\n\n for (const wallClockStart of starts) {\n const occurrenceStart = fromWallClockDate(wallClockStart);\n const recurrenceId = occurrenceStart.format('YYYY-MM-DD HH:mm:ss');\n if (exdate.has(recurrenceId)) {\n continue;\n }\n\n const overrideKey = getRecurrenceKey(event.id, recurrenceId);\n const override = overrides.get(overrideKey);\n if (override) {\n if (isEventInRange(override, start, end)) {\n output.push(validateEvent(override));\n consumedOverrideIds.add(override.id);\n }\n continue;\n }\n\n const occurrenceEnd = fromWallClockDate(new Date(wallClockStart.getTime() + durationMs));\n const generated = createGeneratedInstance(event, occurrenceStart, occurrenceEnd);\n if (overlapsRange(dayjs(generated.start), dayjs(generated.end), start, end)) {\n output.push(validateEvent(generated));\n }\n }\n }\n\n for (const override of overrides.values()) {\n if (consumedOverrideIds.has(override.id)) {\n continue;\n }\n if (isEventInRange(override, start, end)) {\n output.push(validateEvent(override));\n }\n }\n\n return output;\n}\n\nexport { DEFAULT_EXPANSION_LIMIT };\n"],"mappings":"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"}
|
|
@@ -4,9 +4,11 @@ import { getEndOfWeek } from "../get-end-of-week/get-end-of-week.mjs";
|
|
|
4
4
|
import dayjs from "dayjs";
|
|
5
5
|
//#region packages/@mantine/schedule/src/utils/get-month-days/get-month-days.ts
|
|
6
6
|
function getMonthDays({ month, firstDayOfWeek = 1, consistentWeeks }) {
|
|
7
|
-
const
|
|
7
|
+
const day = dayjs(month).subtract(dayjs(month).date() - 1, "day");
|
|
8
|
+
const start = dayjs(day.format("YYYY-MM-DD"));
|
|
8
9
|
const startOfMonth = start.format("YYYY-MM-DD");
|
|
9
|
-
const
|
|
10
|
+
const endOfMonth = start.add(+start.daysInMonth() - 1, "day").format("YYYY-MM-DD");
|
|
11
|
+
const endDate = getEndOfWeek(endOfMonth, firstDayOfWeek);
|
|
10
12
|
const weeks = [];
|
|
11
13
|
let date = dayjs(getStartOfWeek({
|
|
12
14
|
date: startOfMonth,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-month-days.mjs","names":[],"sources":["../../../src/utils/get-month-days/get-month-days.ts"],"sourcesContent":["import dayjs from 'dayjs';\nimport { AnyDateValue, DateStringValue, DayOfWeek } from '../../types';\nimport { getEndOfWeek } from '../get-end-of-week/get-end-of-week';\nimport { getStartOfWeek } from '../get-start-of-week/get-start-of-week';\n\ninterface GetMonthDaysInput {\n month: AnyDateValue;\n firstDayOfWeek: DayOfWeek | undefined;\n consistentWeeks: boolean | undefined;\n}\n\nexport function getMonthDays({\n month,\n firstDayOfWeek = 1,\n consistentWeeks,\n}: GetMonthDaysInput): DateStringValue[][] {\n const day = dayjs(month).subtract(dayjs(month).date() - 1, 'day');\n const start = dayjs(day.format('YYYY-MM-DD'));\n const startOfMonth = start.format('YYYY-MM-DD');\n const endOfMonth = start.add(+start.daysInMonth() - 1, 'day').format('YYYY-MM-DD');\n const endDate = getEndOfWeek(endOfMonth, firstDayOfWeek);\n const weeks: DateStringValue[][] = [];\n\n let date = dayjs(getStartOfWeek({ date: startOfMonth, firstDayOfWeek }));\n\n while (dayjs(date).isBefore(endDate, 'day')) {\n const days: DateStringValue[] = [];\n\n for (let i = 0; i < 7; i += 1) {\n days.push(date.format('YYYY-MM-DD 00:00:00'));\n date = date.add(1, 'day');\n }\n\n weeks.push(days);\n }\n\n if (consistentWeeks && weeks.length < 6) {\n const lastWeek = weeks[weeks.length - 1];\n const lastDay = lastWeek[lastWeek.length - 1];\n let nextDay = dayjs(lastDay).add(1, 'day');\n\n while (weeks.length < 6) {\n const days: DateStringValue[] = [];\n\n for (let i = 0; i < 7; i += 1) {\n days.push(nextDay.format('YYYY-MM-DD 00:00:00'));\n nextDay = nextDay.add(1, 'day');\n }\n\n weeks.push(days);\n }\n }\n\n return weeks;\n}\n"],"mappings":";;;;;AAWA,SAAgB,aAAa,EAC3B,OACA,iBAAiB,GACjB,mBACyC;
|
|
1
|
+
{"version":3,"file":"get-month-days.mjs","names":[],"sources":["../../../src/utils/get-month-days/get-month-days.ts"],"sourcesContent":["import dayjs from 'dayjs';\nimport { AnyDateValue, DateStringValue, DayOfWeek } from '../../types';\nimport { getEndOfWeek } from '../get-end-of-week/get-end-of-week';\nimport { getStartOfWeek } from '../get-start-of-week/get-start-of-week';\n\ninterface GetMonthDaysInput {\n month: AnyDateValue;\n firstDayOfWeek: DayOfWeek | undefined;\n consistentWeeks: boolean | undefined;\n}\n\nexport function getMonthDays({\n month,\n firstDayOfWeek = 1,\n consistentWeeks,\n}: GetMonthDaysInput): DateStringValue[][] {\n const day = dayjs(month).subtract(dayjs(month).date() - 1, 'day');\n const start = dayjs(day.format('YYYY-MM-DD'));\n const startOfMonth = start.format('YYYY-MM-DD');\n const endOfMonth = start.add(+start.daysInMonth() - 1, 'day').format('YYYY-MM-DD');\n const endDate = getEndOfWeek(endOfMonth, firstDayOfWeek);\n const weeks: DateStringValue[][] = [];\n\n let date = dayjs(getStartOfWeek({ date: startOfMonth, firstDayOfWeek }));\n\n while (dayjs(date).isBefore(endDate, 'day')) {\n const days: DateStringValue[] = [];\n\n for (let i = 0; i < 7; i += 1) {\n days.push(date.format('YYYY-MM-DD 00:00:00'));\n date = date.add(1, 'day');\n }\n\n weeks.push(days);\n }\n\n if (consistentWeeks && weeks.length < 6) {\n const lastWeek = weeks[weeks.length - 1];\n const lastDay = lastWeek[lastWeek.length - 1];\n let nextDay = dayjs(lastDay).add(1, 'day');\n\n while (weeks.length < 6) {\n const days: DateStringValue[] = [];\n\n for (let i = 0; i < 7; i += 1) {\n days.push(nextDay.format('YYYY-MM-DD 00:00:00'));\n nextDay = nextDay.add(1, 'day');\n }\n\n weeks.push(days);\n }\n }\n\n return weeks;\n}\n"],"mappings":";;;;;AAWA,SAAgB,aAAa,EAC3B,OACA,iBAAiB,GACjB,mBACyC;CACzC,MAAM,MAAM,MAAM,KAAK,CAAC,CAAC,SAAS,MAAM,KAAK,CAAC,CAAC,KAAK,IAAI,GAAG,KAAK;CAChE,MAAM,QAAQ,MAAM,IAAI,OAAO,YAAY,CAAC;CAC5C,MAAM,eAAe,MAAM,OAAO,YAAY;CAC9C,MAAM,aAAa,MAAM,IAAI,CAAC,MAAM,YAAY,IAAI,GAAG,KAAK,CAAC,CAAC,OAAO,YAAY;CACjF,MAAM,UAAU,aAAa,YAAY,cAAc;CACvD,MAAM,QAA6B,CAAC;CAEpC,IAAI,OAAO,MAAM,eAAe;EAAE,MAAM;EAAc;CAAe,CAAC,CAAC;CAEvE,OAAO,MAAM,IAAI,CAAC,CAAC,SAAS,SAAS,KAAK,GAAG;EAC3C,MAAM,OAA0B,CAAC;EAEjC,KAAK,IAAI,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG;GAC7B,KAAK,KAAK,KAAK,OAAO,qBAAqB,CAAC;GAC5C,OAAO,KAAK,IAAI,GAAG,KAAK;EAC1B;EAEA,MAAM,KAAK,IAAI;CACjB;CAEA,IAAI,mBAAmB,MAAM,SAAS,GAAG;EACvC,MAAM,WAAW,MAAM,MAAM,SAAS;EACtC,MAAM,UAAU,SAAS,SAAS,SAAS;EAC3C,IAAI,UAAU,MAAM,OAAO,CAAC,CAAC,IAAI,GAAG,KAAK;EAEzC,OAAO,MAAM,SAAS,GAAG;GACvB,MAAM,OAA0B,CAAC;GAEjC,KAAK,IAAI,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG;IAC7B,KAAK,KAAK,QAAQ,OAAO,qBAAqB,CAAC;IAC/C,UAAU,QAAQ,IAAI,GAAG,KAAK;GAChC;GAEA,MAAM,KAAK,IAAI;EACjB;CACF;CAEA,OAAO;AACT"}
|
|
@@ -4,7 +4,10 @@ import isoWeek from "dayjs/plugin/isoWeek.js";
|
|
|
4
4
|
//#region packages/@mantine/schedule/src/utils/get-week-number/get-week-number.ts
|
|
5
5
|
dayjs.extend(isoWeek);
|
|
6
6
|
function getWeekNumber(week) {
|
|
7
|
-
if (Array.isArray(week))
|
|
7
|
+
if (Array.isArray(week)) {
|
|
8
|
+
const monday = week.find((date) => dayjs(date).day() === 1);
|
|
9
|
+
return dayjs(monday).isoWeek();
|
|
10
|
+
}
|
|
8
11
|
return dayjs(week).isoWeek();
|
|
9
12
|
}
|
|
10
13
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-week-number.mjs","names":[],"sources":["../../../src/utils/get-week-number/get-week-number.ts"],"sourcesContent":["import dayjs from 'dayjs';\nimport isoWeek from 'dayjs/plugin/isoWeek.js';\nimport { AnyDateValue } from '../../types';\n\ndayjs.extend(isoWeek);\n\nexport function getWeekNumber(week: AnyDateValue | AnyDateValue[]): number {\n if (Array.isArray(week)) {\n const monday = week.find((date) => dayjs(date).day() === 1);\n return dayjs(monday).isoWeek();\n }\n\n return dayjs(week).isoWeek();\n}\n"],"mappings":";;;;AAIA,MAAM,OAAO,OAAO;AAEpB,SAAgB,cAAc,MAA6C;CACzE,IAAI,MAAM,QAAQ,IAAI,
|
|
1
|
+
{"version":3,"file":"get-week-number.mjs","names":[],"sources":["../../../src/utils/get-week-number/get-week-number.ts"],"sourcesContent":["import dayjs from 'dayjs';\nimport isoWeek from 'dayjs/plugin/isoWeek.js';\nimport { AnyDateValue } from '../../types';\n\ndayjs.extend(isoWeek);\n\nexport function getWeekNumber(week: AnyDateValue | AnyDateValue[]): number {\n if (Array.isArray(week)) {\n const monday = week.find((date) => dayjs(date).day() === 1);\n return dayjs(monday).isoWeek();\n }\n\n return dayjs(week).isoWeek();\n}\n"],"mappings":";;;;AAIA,MAAM,OAAO,OAAO;AAEpB,SAAgB,cAAc,MAA6C;CACzE,IAAI,MAAM,QAAQ,IAAI,GAAG;EACvB,MAAM,SAAS,KAAK,MAAM,SAAS,MAAM,IAAI,CAAC,CAAC,IAAI,MAAM,CAAC;EAC1D,OAAO,MAAM,MAAM,CAAC,CAAC,QAAQ;CAC/B;CAEA,OAAO,MAAM,IAAI,CAAC,CAAC,QAAQ;AAC7B"}
|
|
@@ -1,12 +1,24 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import dayjs from "dayjs";
|
|
3
3
|
//#region packages/@mantine/schedule/src/utils/is-events-overlap/is-events-overlap.ts
|
|
4
|
+
const timestampsCache = /* @__PURE__ */ new WeakMap();
|
|
5
|
+
function getTimestamps(event) {
|
|
6
|
+
const cached = timestampsCache.get(event);
|
|
7
|
+
if (cached && cached.start === event.start && cached.end === event.end) return cached;
|
|
8
|
+
const timestamps = {
|
|
9
|
+
start: event.start,
|
|
10
|
+
end: event.end,
|
|
11
|
+
startTimestamp: dayjs(event.start).valueOf(),
|
|
12
|
+
endTimestamp: dayjs(event.end).valueOf()
|
|
13
|
+
};
|
|
14
|
+
timestampsCache.set(event, timestamps);
|
|
15
|
+
return timestamps;
|
|
16
|
+
}
|
|
4
17
|
/** Returns true if two events overlap in time */
|
|
5
18
|
function isEventsOverlap(event1, event2) {
|
|
6
|
-
const
|
|
7
|
-
const
|
|
8
|
-
|
|
9
|
-
return start1 < dayjs(event2.end).valueOf() && start2 < end1;
|
|
19
|
+
const first = getTimestamps(event1);
|
|
20
|
+
const second = getTimestamps(event2);
|
|
21
|
+
return first.startTimestamp < second.endTimestamp && second.startTimestamp < first.endTimestamp;
|
|
10
22
|
}
|
|
11
23
|
//#endregion
|
|
12
24
|
export { isEventsOverlap };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"is-events-overlap.mjs","names":[],"sources":["../../../src/utils/is-events-overlap/is-events-overlap.ts"],"sourcesContent":["import dayjs from 'dayjs';\nimport { ScheduleEventData } from '../../types';\n\
|
|
1
|
+
{"version":3,"file":"is-events-overlap.mjs","names":[],"sources":["../../../src/utils/is-events-overlap/is-events-overlap.ts"],"sourcesContent":["import dayjs from 'dayjs';\nimport { ScheduleEventData } from '../../types';\n\ninterface CachedTimestamps {\n start: ScheduleEventData['start'];\n end: ScheduleEventData['end'];\n startTimestamp: number;\n endTimestamp: number;\n}\n\nconst timestampsCache = new WeakMap<ScheduleEventData, CachedTimestamps>();\n\nfunction getTimestamps(event: ScheduleEventData): CachedTimestamps {\n const cached = timestampsCache.get(event);\n\n if (cached && cached.start === event.start && cached.end === event.end) {\n return cached;\n }\n\n const timestamps: CachedTimestamps = {\n start: event.start,\n end: event.end,\n startTimestamp: dayjs(event.start).valueOf(),\n endTimestamp: dayjs(event.end).valueOf(),\n };\n\n timestampsCache.set(event, timestamps);\n\n return timestamps;\n}\n\n/** Returns true if two events overlap in time */\nexport function isEventsOverlap(event1: ScheduleEventData, event2: ScheduleEventData) {\n const first = getTimestamps(event1);\n const second = getTimestamps(event2);\n return first.startTimestamp < second.endTimestamp && second.startTimestamp < first.endTimestamp;\n}\n"],"mappings":";;;AAUA,MAAM,kCAAkB,IAAI,QAA6C;AAEzE,SAAS,cAAc,OAA4C;CACjE,MAAM,SAAS,gBAAgB,IAAI,KAAK;CAExC,IAAI,UAAU,OAAO,UAAU,MAAM,SAAS,OAAO,QAAQ,MAAM,KACjE,OAAO;CAGT,MAAM,aAA+B;EACnC,OAAO,MAAM;EACb,KAAK,MAAM;EACX,gBAAgB,MAAM,MAAM,KAAK,CAAC,CAAC,QAAQ;EAC3C,cAAc,MAAM,MAAM,GAAG,CAAC,CAAC,QAAQ;CACzC;CAEA,gBAAgB,IAAI,OAAO,UAAU;CAErC,OAAO;AACT;;AAGA,SAAgB,gBAAgB,QAA2B,QAA2B;CACpF,MAAM,QAAQ,cAAc,MAAM;CAClC,MAAM,SAAS,cAAc,MAAM;CACnC,OAAO,MAAM,iBAAiB,OAAO,gBAAgB,OAAO,iBAAiB,MAAM;AACrF"}
|
|
@@ -8,7 +8,7 @@ import { RenderEvent, RenderEventBody, ScheduleEventStylesNames } from '../Sched
|
|
|
8
8
|
import { MonthYearSelectStylesNames } from '../ScheduleHeader/MonthYearSelect/MonthYearSelect';
|
|
9
9
|
import { CombinedScheduleHeaderStylesNames } from '../ScheduleHeader/ScheduleHeader';
|
|
10
10
|
import { ViewSelectProps } from '../ScheduleHeader/ViewSelect/ViewSelect';
|
|
11
|
-
export type DayViewStylesNames = 'dayView' | 'dayViewInner' | 'dayViewScrollArea' | 'dayViewAllDay' | 'dayViewAllDayEvents' | 'dayViewSlot' | 'dayViewSlots' | 'dayViewTimeSlots' | 'dayViewSlotLabel' | 'dayViewSlotLabels' | 'dayViewBackgroundEvent' | MoreEventsStylesNames | ScheduleEventStylesNames | Exclude<CombinedScheduleHeaderStylesNames, MonthYearSelectStylesNames> | CurrentTimeIndicatorStylesNames | AgendaViewStylesNames;
|
|
11
|
+
export type DayViewStylesNames = 'dayView' | 'dayViewInner' | 'dayViewScrollArea' | 'dayViewAllDay' | 'dayViewAllDayEvents' | 'dayViewSlot' | 'dayViewSlots' | 'dayViewTimeSlots' | 'dayViewSlotLabel' | 'dayViewSlotLabels' | 'dayViewBackgroundEvent' | 'dayViewDragPreview' | MoreEventsStylesNames | ScheduleEventStylesNames | Exclude<CombinedScheduleHeaderStylesNames, MonthYearSelectStylesNames> | CurrentTimeIndicatorStylesNames | AgendaViewStylesNames;
|
|
12
12
|
export type DayViewCssVariables = {
|
|
13
13
|
dayView: '--day-view-radius' | '--day-view-slot-height' | '--day-view-all-day-slot-height';
|
|
14
14
|
};
|
|
@@ -85,6 +85,8 @@ export interface DayViewProps extends BoxProps, StylesApiProps<DayViewFactory>,
|
|
|
85
85
|
}) => void;
|
|
86
86
|
/** Function to determine if event can be dragged */
|
|
87
87
|
canDragEvent?: (event: ScheduleEventData) => boolean;
|
|
88
|
+
/** Snap step for moving events by drag and drop, in minutes. Must divide evenly into an hour (e.g. `15`, `30`) or be a whole number of hours. When not set, `intervalMinutes` is used. @default intervalMinutes */
|
|
89
|
+
eventDragInterval?: number;
|
|
88
90
|
/** Called when any event drag starts */
|
|
89
91
|
onEventDragStart?: (event: ScheduleEventData) => void;
|
|
90
92
|
/** Called when any event drag ends */
|
|
@@ -99,6 +101,8 @@ export interface DayViewProps extends BoxProps, StylesApiProps<DayViewFactory>,
|
|
|
99
101
|
onAllDaySlotClick?: (date: DateStringValue, event: React.MouseEvent<HTMLButtonElement>) => void;
|
|
100
102
|
/** Called when event is clicked */
|
|
101
103
|
onEventClick?: (event: ScheduleEventData, e: React.MouseEvent<HTMLButtonElement>) => void;
|
|
104
|
+
/** If set, background events (`display: 'background'`) can be clicked and trigger `onEventClick` @default false */
|
|
105
|
+
withInteractiveBackgroundEvents?: boolean;
|
|
102
106
|
/** If set, enables drag-to-select time slot ranges @default false */
|
|
103
107
|
withDragSlotSelect?: boolean;
|
|
104
108
|
/** Called when a time slot range is selected by dragging */
|
|
@@ -120,6 +124,8 @@ export interface DayViewProps extends BoxProps, StylesApiProps<DayViewFactory>,
|
|
|
120
124
|
}) => void;
|
|
121
125
|
/** Function to determine if event can be resized */
|
|
122
126
|
canResizeEvent?: (event: ScheduleEventData) => boolean;
|
|
127
|
+
/** Snap step for resizing events, in minutes. Must divide evenly into an hour (e.g. `15`, `30`) or be a whole number of hours. When not set, `intervalMinutes` is used. @default intervalMinutes */
|
|
128
|
+
eventResizeInterval?: number;
|
|
123
129
|
/** Max number of generated recurring instances per recurring series @default 2000 */
|
|
124
130
|
recurrenceExpansionLimit?: number;
|
|
125
131
|
/** Function to get additional props for each time slot. Receives slot start and end datetime strings. Returned props are spread onto the slot element. Event handlers returned by this function are composed with internal handlers (e.g. onClick) rather than overriding them. */
|
|
@@ -86,6 +86,8 @@ export interface MonthViewProps extends BoxProps, StylesApiProps<MonthViewFactor
|
|
|
86
86
|
onEventDragEnd?: () => void;
|
|
87
87
|
/** Called when event is clicked */
|
|
88
88
|
onEventClick?: (event: ScheduleEventData, e: React.MouseEvent<HTMLButtonElement>) => void;
|
|
89
|
+
/** If set, background events (`display: 'background'`) can be clicked and trigger `onEventClick` @default false */
|
|
90
|
+
withInteractiveBackgroundEvents?: boolean;
|
|
89
91
|
/** If set, enables drag-to-select day ranges @default false */
|
|
90
92
|
withDragSlotSelect?: boolean;
|
|
91
93
|
/** Called when a day range is selected by dragging */
|
|
@@ -5,7 +5,7 @@ import { MoreEventsProps, MoreEventsStylesNames } from '../MoreEvents/MoreEvents
|
|
|
5
5
|
import { RenderEvent, RenderEventBody } from '../ScheduleEvent/ScheduleEvent';
|
|
6
6
|
import { CombinedScheduleHeaderStylesNames } from '../ScheduleHeader/ScheduleHeader';
|
|
7
7
|
import { ViewSelectProps } from '../ScheduleHeader/ViewSelect/ViewSelect';
|
|
8
|
-
export type ResourcesDayViewStylesNames = 'resourcesDayView' | 'resourcesDayViewRoot' | 'resourcesDayViewInner' | 'resourcesDayViewTimeLabelsRow' | 'resourcesDayViewScrollArea' | 'resourcesDayViewCorner' | 'resourcesDayViewTimeLabel' | 'resourcesDayViewResourceLabel' | 'resourcesDayViewRow' | 'resourcesDayViewRowSlot' | 'resourcesDayViewRowSlots' | 'resourcesDayViewBackgroundEvent' | 'resourcesDayViewAllDayEvent' | 'resourcesDayViewCurrentTimeIndicator' | 'resourcesDayViewCurrentTimeIndicatorLine' | 'resourcesDayViewCurrentTimeIndicatorThumb' | 'resourcesDayViewCurrentTimeIndicatorTimeBubble' | 'resourcesDayViewEventWrapper' | 'resourcesDayViewResizeHandle' | 'resourcesDayViewGroupColumn' | 'resourcesDayViewGroupColumnEmpty' | MoreEventsStylesNames | CombinedScheduleHeaderStylesNames;
|
|
8
|
+
export type ResourcesDayViewStylesNames = 'resourcesDayView' | 'resourcesDayViewRoot' | 'resourcesDayViewInner' | 'resourcesDayViewTimeLabelsRow' | 'resourcesDayViewScrollArea' | 'resourcesDayViewCorner' | 'resourcesDayViewTimeLabel' | 'resourcesDayViewResourceLabel' | 'resourcesDayViewRow' | 'resourcesDayViewRowSlot' | 'resourcesDayViewRowSlots' | 'resourcesDayViewBackgroundEvent' | 'resourcesDayViewAllDayEvent' | 'resourcesDayViewCurrentTimeIndicator' | 'resourcesDayViewCurrentTimeIndicatorLine' | 'resourcesDayViewCurrentTimeIndicatorThumb' | 'resourcesDayViewCurrentTimeIndicatorTimeBubble' | 'resourcesDayViewEventWrapper' | 'resourcesDayViewDragPreview' | 'resourcesDayViewResizeHandle' | 'resourcesDayViewGroupColumn' | 'resourcesDayViewGroupColumnEmpty' | MoreEventsStylesNames | CombinedScheduleHeaderStylesNames;
|
|
9
9
|
export type ResourcesDayViewCssVariables = {
|
|
10
10
|
resourcesDayView: '--resources-day-view-radius' | '--resources-day-view-slot-width' | '--resources-day-view-row-height' | '--resources-day-view-group-label-width';
|
|
11
11
|
};
|
|
@@ -91,6 +91,8 @@ export interface ResourcesDayViewProps extends BoxProps, StylesApiProps<Resource
|
|
|
91
91
|
}) => void;
|
|
92
92
|
/** Function to determine if event can be dragged */
|
|
93
93
|
canDragEvent?: (event: ScheduleEventData) => boolean;
|
|
94
|
+
/** Snap step for moving events by drag and drop, in minutes. Must divide evenly into an hour (e.g. `15`, `30`) or be a whole number of hours. When not set, `intervalMinutes` is used. @default intervalMinutes */
|
|
95
|
+
eventDragInterval?: number;
|
|
94
96
|
/** Called when any event drag starts */
|
|
95
97
|
onEventDragStart?: (event: ScheduleEventData) => void;
|
|
96
98
|
/** Called when any event drag ends */
|
|
@@ -104,6 +106,8 @@ export interface ResourcesDayViewProps extends BoxProps, StylesApiProps<Resource
|
|
|
104
106
|
}) => void;
|
|
105
107
|
/** Called when event is clicked */
|
|
106
108
|
onEventClick?: (event: ScheduleEventData, e: React.MouseEvent<HTMLButtonElement>) => void;
|
|
109
|
+
/** If set, background events (`display: 'background'`) can be clicked and trigger `onEventClick` @default false */
|
|
110
|
+
withInteractiveBackgroundEvents?: boolean;
|
|
107
111
|
/** If set, enables drag-to-select time slot ranges @default false */
|
|
108
112
|
withDragSlotSelect?: boolean;
|
|
109
113
|
/** Called when a time slot range is selected by dragging, includes resourceId */
|
|
@@ -131,6 +135,8 @@ export interface ResourcesDayViewProps extends BoxProps, StylesApiProps<Resource
|
|
|
131
135
|
}) => void;
|
|
132
136
|
/** Function to determine if event can be resized */
|
|
133
137
|
canResizeEvent?: (event: ScheduleEventData) => boolean;
|
|
138
|
+
/** Snap step for resizing events, in minutes. Must divide evenly into an hour (e.g. `15`, `30`) or be a whole number of hours. When not set, `intervalMinutes` is used. @default intervalMinutes */
|
|
139
|
+
eventResizeInterval?: number;
|
|
134
140
|
/** Max number of generated recurring instances per recurring series @default 2000 */
|
|
135
141
|
recurrenceExpansionLimit?: number;
|
|
136
142
|
/** Maximum number of events visible per time slot before "+more" indicator shows, minimum value is 1 @default 2 */
|
|
@@ -36,4 +36,4 @@ export interface ResourcesDayViewRowProps {
|
|
|
36
36
|
groupInfo?: ResourceGroupInfo | null;
|
|
37
37
|
allDayCount?: number;
|
|
38
38
|
}
|
|
39
|
-
export declare function ResourcesDayViewRow({ resource, resourceIndex, date, slots, getStyles, children, labels, highlightBusinessHours, businessHours, withEventsDragAndDrop, onRowSlotsDragOver, onRowSlotsDragLeave, onRowSlotsDrop, onSlotClick, dropTargetSlotIndex, mode, slotsRef, firstSlotIndex, onSlotKeyDown, withDragSlotSelect, onSlotPointerDown, isSlotDragSelected, rowSlotsContainerRef, renderResourceLabel, renderGroupLabel, scrolledX, groupInfo, allDayCount, }: ResourcesDayViewRowProps): import("react
|
|
39
|
+
export declare function ResourcesDayViewRow({ resource, resourceIndex, date, slots, getStyles, children, labels, highlightBusinessHours, businessHours, withEventsDragAndDrop, onRowSlotsDragOver, onRowSlotsDragLeave, onRowSlotsDrop, onSlotClick, dropTargetSlotIndex, mode, slotsRef, firstSlotIndex, onSlotKeyDown, withDragSlotSelect, onSlotPointerDown, isSlotDragSelected, rowSlotsContainerRef, renderResourceLabel, renderGroupLabel, scrolledX, groupInfo, allDayCount, }: ResourcesDayViewRowProps): import("react").JSX.Element;
|
|
@@ -7,7 +7,7 @@ import { ResourcesWeekViewProps, ResourcesWeekViewStylesNames } from '../Resourc
|
|
|
7
7
|
import { RenderEventBody } from '../ScheduleEvent/ScheduleEvent';
|
|
8
8
|
export type ResourcesScheduleStylesNames = 'root' | ResourcesDayViewStylesNames | ResourcesWeekViewStylesNames | ResourcesMonthViewStylesNames;
|
|
9
9
|
export type ResourcesScheduleViewLevel = 'day' | 'week' | 'month';
|
|
10
|
-
type ResourcesScheduleCommonProps = 'date' | 'onDateChange' | 'resources' | 'events' | 'locale' | 'radius' | 'labels' | 'renderEventBody' | 'renderResourceLabel' | 'withEventsDragAndDrop' | 'onEventDrop' | 'canDragEvent' | 'onEventDragStart' | 'onEventDragEnd' | 'onTimeSlotClick' | 'onEventClick' | 'onDayClick' | 'withDragSlotSelect' | 'onSlotDragEnd' | 'view' | 'onViewChange' | 'mode' | 'onExternalEventDrop' | 'withEventResize' | 'onEventResize' | 'canResizeEvent' | 'recurrenceExpansionLimit';
|
|
10
|
+
type ResourcesScheduleCommonProps = 'date' | 'onDateChange' | 'resources' | 'events' | 'locale' | 'radius' | 'labels' | 'renderEventBody' | 'renderResourceLabel' | 'withEventsDragAndDrop' | 'onEventDrop' | 'canDragEvent' | 'onEventDragStart' | 'onEventDragEnd' | 'onTimeSlotClick' | 'onEventClick' | 'onDayClick' | 'withDragSlotSelect' | 'onSlotDragEnd' | 'view' | 'onViewChange' | 'mode' | 'onExternalEventDrop' | 'withEventResize' | 'onEventResize' | 'canResizeEvent' | 'recurrenceExpansionLimit' | 'withInteractiveBackgroundEvents';
|
|
11
11
|
type ResourcesScheduleViewProps<T> = Partial<Omit<T, ResourcesScheduleCommonProps>>;
|
|
12
12
|
export interface ResourcesScheduleProps extends BoxProps, StylesApiProps<ResourcesScheduleFactory>, ElementProps<'div'> {
|
|
13
13
|
__staticSelector?: string;
|
|
@@ -95,6 +95,8 @@ export interface ResourcesScheduleProps extends BoxProps, StylesApiProps<Resourc
|
|
|
95
95
|
}) => void;
|
|
96
96
|
/** Function to determine if event can be resized */
|
|
97
97
|
canResizeEvent?: (event: ScheduleEventData) => boolean;
|
|
98
|
+
/** If set, background events (`display: 'background'`) can be clicked and trigger `onEventClick`. Applies to `day` and `week` views only – `ResourcesMonthView` does not render background events separately. @default false */
|
|
99
|
+
withInteractiveBackgroundEvents?: boolean;
|
|
98
100
|
/** Max number of generated recurring instances @default 2000 */
|
|
99
101
|
recurrenceExpansionLimit?: number;
|
|
100
102
|
/** Props specific to ResourcesDayView */
|
|
@@ -5,7 +5,7 @@ import { MoreEventsProps, MoreEventsStylesNames } from '../MoreEvents/MoreEvents
|
|
|
5
5
|
import { RenderEvent, RenderEventBody } from '../ScheduleEvent/ScheduleEvent';
|
|
6
6
|
import { CombinedScheduleHeaderStylesNames } from '../ScheduleHeader/ScheduleHeader';
|
|
7
7
|
import { ViewSelectProps } from '../ScheduleHeader/ViewSelect/ViewSelect';
|
|
8
|
-
export type ResourcesWeekViewStylesNames = 'resourcesWeekView' | 'resourcesWeekViewRoot' | 'resourcesWeekViewInner' | 'resourcesWeekViewHeaderRows' | 'resourcesWeekViewHeaderContent' | 'resourcesWeekViewDayLabelsRow' | 'resourcesWeekViewDayLabel' | 'resourcesWeekViewTimeLabelsRow' | 'resourcesWeekViewScrollArea' | 'resourcesWeekViewCorner' | 'resourcesWeekViewTimeLabel' | 'resourcesWeekViewResourceLabel' | 'resourcesWeekViewRow' | 'resourcesWeekViewRowSlot' | 'resourcesWeekViewRowSlots' | 'resourcesWeekViewBackgroundEvent' | 'resourcesWeekViewAllDayEvent' | 'resourcesWeekViewCurrentTimeIndicator' | 'resourcesWeekViewCurrentTimeIndicatorLine' | 'resourcesWeekViewCurrentTimeIndicatorThumb' | 'resourcesWeekViewCurrentTimeIndicatorTimeBubble' | 'resourcesWeekViewEventWrapper' | 'resourcesWeekViewResizeHandle' | 'resourcesWeekViewGroupColumn' | 'resourcesWeekViewGroupColumnEmpty' | MoreEventsStylesNames | CombinedScheduleHeaderStylesNames;
|
|
8
|
+
export type ResourcesWeekViewStylesNames = 'resourcesWeekView' | 'resourcesWeekViewRoot' | 'resourcesWeekViewInner' | 'resourcesWeekViewHeaderRows' | 'resourcesWeekViewHeaderContent' | 'resourcesWeekViewDayLabelsRow' | 'resourcesWeekViewDayLabel' | 'resourcesWeekViewTimeLabelsRow' | 'resourcesWeekViewScrollArea' | 'resourcesWeekViewCorner' | 'resourcesWeekViewTimeLabel' | 'resourcesWeekViewResourceLabel' | 'resourcesWeekViewRow' | 'resourcesWeekViewRowSlot' | 'resourcesWeekViewRowSlots' | 'resourcesWeekViewBackgroundEvent' | 'resourcesWeekViewAllDayEvent' | 'resourcesWeekViewCurrentTimeIndicator' | 'resourcesWeekViewCurrentTimeIndicatorLine' | 'resourcesWeekViewCurrentTimeIndicatorThumb' | 'resourcesWeekViewCurrentTimeIndicatorTimeBubble' | 'resourcesWeekViewEventWrapper' | 'resourcesWeekViewDragPreview' | 'resourcesWeekViewResizeHandle' | 'resourcesWeekViewGroupColumn' | 'resourcesWeekViewGroupColumnEmpty' | MoreEventsStylesNames | CombinedScheduleHeaderStylesNames;
|
|
9
9
|
export type ResourcesWeekViewCssVariables = {
|
|
10
10
|
resourcesWeekView: '--resources-week-view-radius' | '--resources-week-view-slot-width' | '--resources-week-view-row-height' | '--resources-week-view-group-label-width';
|
|
11
11
|
};
|
|
@@ -65,6 +65,8 @@ export interface ResourcesWeekViewProps extends BoxProps, StylesApiProps<Resourc
|
|
|
65
65
|
resourceId?: string | number;
|
|
66
66
|
}) => void;
|
|
67
67
|
canDragEvent?: (event: ScheduleEventData) => boolean;
|
|
68
|
+
/** Snap step for moving events by drag and drop, in minutes. Must divide evenly into an hour (e.g. `15`, `30`) or be a whole number of hours. When not set, `intervalMinutes` is used. @default intervalMinutes */
|
|
69
|
+
eventDragInterval?: number;
|
|
68
70
|
onEventDragStart?: (event: ScheduleEventData) => void;
|
|
69
71
|
onEventDragEnd?: () => void;
|
|
70
72
|
onTimeSlotClick?: (data: {
|
|
@@ -74,6 +76,8 @@ export interface ResourcesWeekViewProps extends BoxProps, StylesApiProps<Resourc
|
|
|
74
76
|
resourceId?: string | number;
|
|
75
77
|
}) => void;
|
|
76
78
|
onEventClick?: (event: ScheduleEventData, e: React.MouseEvent<HTMLButtonElement>) => void;
|
|
79
|
+
/** If set, background events (`display: 'background'`) can be clicked and trigger `onEventClick` @default false */
|
|
80
|
+
withInteractiveBackgroundEvents?: boolean;
|
|
77
81
|
withDragSlotSelect?: boolean;
|
|
78
82
|
onSlotDragEnd?: (data: {
|
|
79
83
|
rangeStart: DateTimeStringValue;
|
|
@@ -97,6 +101,8 @@ export interface ResourcesWeekViewProps extends BoxProps, StylesApiProps<Resourc
|
|
|
97
101
|
}) => void;
|
|
98
102
|
/** Function to determine if event can be resized */
|
|
99
103
|
canResizeEvent?: (event: ScheduleEventData) => boolean;
|
|
104
|
+
/** Snap step for resizing events, in minutes. Must divide evenly into an hour (e.g. `15`, `30`) or be a whole number of hours. When not set, `intervalMinutes` is used. @default intervalMinutes */
|
|
105
|
+
eventResizeInterval?: number;
|
|
100
106
|
recurrenceExpansionLimit?: number;
|
|
101
107
|
/** Maximum number of events visible per time slot before "+more" indicator shows, minimum value is 1 @default 2 */
|
|
102
108
|
maxEventsPerTimeSlot?: number;
|
|
@@ -36,4 +36,4 @@ export interface ResourcesWeekViewRowProps {
|
|
|
36
36
|
groupInfo?: ResourceGroupInfo | null;
|
|
37
37
|
allDayCount?: number;
|
|
38
38
|
}
|
|
39
|
-
export declare function ResourcesWeekViewRow({ resource, resourceIndex, weekdays, slots, getStyles, children, labels, highlightBusinessHours, businessHours, withEventsDragAndDrop, onRowSlotsDragOver, onRowSlotsDragLeave, onRowSlotsDrop, onSlotClick, dropTargetSlotIndex, mode, slotsRef, firstSlotIndex, onSlotKeyDown, withDragSlotSelect, onSlotPointerDown, isSlotDragSelected, rowSlotsContainerRef, renderResourceLabel, renderGroupLabel, scrolledX, groupInfo, allDayCount, }: ResourcesWeekViewRowProps): import("react
|
|
39
|
+
export declare function ResourcesWeekViewRow({ resource, resourceIndex, weekdays, slots, getStyles, children, labels, highlightBusinessHours, businessHours, withEventsDragAndDrop, onRowSlotsDragOver, onRowSlotsDragLeave, onRowSlotsDrop, onSlotClick, dropTargetSlotIndex, mode, slotsRef, firstSlotIndex, onSlotKeyDown, withDragSlotSelect, onSlotPointerDown, isSlotDragSelected, rowSlotsContainerRef, renderResourceLabel, renderGroupLabel, scrolledX, groupInfo, allDayCount, }: ResourcesWeekViewRowProps): import("react").JSX.Element;
|
|
@@ -9,7 +9,7 @@ import { WeekViewProps, WeekViewStylesNames } from '../WeekView/WeekView';
|
|
|
9
9
|
import { YearViewProps, YearViewStylesNames } from '../YearView/YearView';
|
|
10
10
|
export type ScheduleStylesNames = 'root' | 'desktopView' | 'mobileView' | DayViewStylesNames | WeekViewStylesNames | MonthViewStylesNames | YearViewStylesNames | MobileMonthViewStylesNames;
|
|
11
11
|
export type ScheduleLayout = 'default' | 'responsive';
|
|
12
|
-
type ScheduleCommonProps = 'date' | 'onDateChange' | 'events' | 'locale' | 'radius' | 'labels' | 'renderEventBody' | 'withEventsDragAndDrop' | 'onEventDrop' | 'canDragEvent' | 'onEventDragStart' | 'onEventDragEnd' | 'onTimeSlotClick' | 'onAllDaySlotClick' | 'onEventClick' | 'onDayClick' | 'onMonthClick' | 'withDragSlotSelect' | 'onSlotDragEnd' | 'view' | 'onViewChange' | 'mode' | 'withAgenda' | 'onExternalEventDrop' | 'withEventResize' | 'onEventResize' | 'canResizeEvent' | 'recurrenceExpansionLimit';
|
|
12
|
+
type ScheduleCommonProps = 'date' | 'onDateChange' | 'events' | 'locale' | 'radius' | 'labels' | 'renderEventBody' | 'withEventsDragAndDrop' | 'onEventDrop' | 'canDragEvent' | 'onEventDragStart' | 'onEventDragEnd' | 'onTimeSlotClick' | 'onAllDaySlotClick' | 'onEventClick' | 'onDayClick' | 'onMonthClick' | 'withDragSlotSelect' | 'onSlotDragEnd' | 'view' | 'onViewChange' | 'mode' | 'withAgenda' | 'onExternalEventDrop' | 'withEventResize' | 'onEventResize' | 'canResizeEvent' | 'recurrenceExpansionLimit' | 'withInteractiveBackgroundEvents';
|
|
13
13
|
type ScheduleViewProps<T> = Partial<Omit<T, ScheduleCommonProps>>;
|
|
14
14
|
export interface ScheduleProps extends BoxProps, StylesApiProps<ScheduleFactory>, ElementProps<'div'> {
|
|
15
15
|
__staticSelector?: string;
|
|
@@ -84,6 +84,8 @@ export interface ScheduleProps extends BoxProps, StylesApiProps<ScheduleFactory>
|
|
|
84
84
|
}) => void;
|
|
85
85
|
/** Function to determine if event can be resized */
|
|
86
86
|
canResizeEvent?: (event: ScheduleEventData) => boolean;
|
|
87
|
+
/** If set, background events (`display: 'background'`) can be clicked and trigger `onEventClick`. Applies to `day`, `week` and `month` views only – `YearView` and the `MobileMonthView` used by `layout="responsive"` on small screens do not render background events at all. @default false */
|
|
88
|
+
withInteractiveBackgroundEvents?: boolean;
|
|
87
89
|
/** Max number of generated recurring instances per recurring series @default 2000 */
|
|
88
90
|
recurrenceExpansionLimit?: number;
|
|
89
91
|
/** Layout mode:
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { BoxProps, ElementProps } from '@mantine/core';
|
|
2
|
+
import { ScheduleEventData } from '../../types';
|
|
3
|
+
import { RenderEvent, RenderEventBody } from '../ScheduleEvent/ScheduleEvent';
|
|
4
|
+
export interface ScheduleBackgroundEventProps extends BoxProps, ElementProps<'div', 'onClick'> {
|
|
5
|
+
/** Background event to display */
|
|
6
|
+
event: ScheduleEventData;
|
|
7
|
+
/** If set, the root element is a `button` instead of a `div` and the event can be clicked @default false */
|
|
8
|
+
interactive?: boolean;
|
|
9
|
+
/** Called when the event is clicked, only when `interactive` is set */
|
|
10
|
+
onEventClick?: (event: ScheduleEventData, e: React.MouseEvent<HTMLButtonElement>) => void;
|
|
11
|
+
/** Function to fully customize event rendering */
|
|
12
|
+
renderEvent?: RenderEvent;
|
|
13
|
+
/** Function to customize event body */
|
|
14
|
+
renderEventBody?: RenderEventBody;
|
|
15
|
+
}
|
|
16
|
+
export declare function ScheduleBackgroundEvent(props: ScheduleBackgroundEventProps): import("react").JSX.Element;
|
|
17
|
+
export declare namespace ScheduleBackgroundEvent {
|
|
18
|
+
var displayName: string;
|
|
19
|
+
}
|
|
@@ -29,15 +29,15 @@ export declare const HeaderControl: import("@mantine/core").MantineComponent<{
|
|
|
29
29
|
stylesNames: HeaderControlStylesNames;
|
|
30
30
|
vars: HeaderControlCssVariables;
|
|
31
31
|
}>;
|
|
32
|
-
export declare function ScheduleHeaderNext(props: HeaderControlProps): import("react
|
|
32
|
+
export declare function ScheduleHeaderNext(props: HeaderControlProps): import("react").JSX.Element;
|
|
33
33
|
export declare namespace ScheduleHeaderNext {
|
|
34
34
|
var displayName: string;
|
|
35
35
|
}
|
|
36
|
-
export declare function ScheduleHeaderPrevious(props: HeaderControlProps): import("react
|
|
36
|
+
export declare function ScheduleHeaderPrevious(props: HeaderControlProps): import("react").JSX.Element;
|
|
37
37
|
export declare namespace ScheduleHeaderPrevious {
|
|
38
38
|
var displayName: string;
|
|
39
39
|
}
|
|
40
|
-
export declare function ScheduleHeaderToday(props: HeaderControlProps): import("react
|
|
40
|
+
export declare function ScheduleHeaderToday(props: HeaderControlProps): import("react").JSX.Element;
|
|
41
41
|
export declare namespace ScheduleHeaderToday {
|
|
42
42
|
var displayName: string;
|
|
43
43
|
}
|
|
@@ -53,5 +53,5 @@ export interface ScheduleHeaderBaseProps {
|
|
|
53
53
|
/** Whether the agenda view is currently active */
|
|
54
54
|
agendaActive?: boolean;
|
|
55
55
|
}
|
|
56
|
-
export declare function ScheduleHeaderBase({ view, navigationHandlers, control, labels, onDateChange, onViewChange, previousControlProps, nextControlProps, todayControlProps, viewSelectProps, stylesApiProps, onAgendaClick, agendaActive, }: ScheduleHeaderBaseProps): import("react
|
|
56
|
+
export declare function ScheduleHeaderBase({ view, navigationHandlers, control, labels, onDateChange, onViewChange, previousControlProps, nextControlProps, todayControlProps, viewSelectProps, stylesApiProps, onAgendaClick, agendaActive, }: ScheduleHeaderBaseProps): import("react").JSX.Element;
|
|
57
57
|
export {};
|
|
@@ -7,7 +7,7 @@ import { CurrentTimeIndicatorStylesNames } from '../CurrentTimeIndicator/Current
|
|
|
7
7
|
import { RenderEvent, RenderEventBody } from '../ScheduleEvent/ScheduleEvent';
|
|
8
8
|
import { CombinedScheduleHeaderStylesNames } from '../ScheduleHeader/ScheduleHeader';
|
|
9
9
|
import { ViewSelectProps } from '../ScheduleHeader/ViewSelect/ViewSelect';
|
|
10
|
-
export type WeekViewStylesNames = 'weekView' | 'weekViewRoot' | 'weekViewHeader' | 'weekViewInner' | 'weekViewAllDaySlotsEvents' | 'weekViewAllDaySlots' | 'weekViewAllDaySlotsList' | 'weekViewAllDaySlot' | 'weekViewAllDaySlotsLabel' | 'weekViewScrollArea' | 'weekViewCorner' | 'weekViewSlotLabels' | 'weekViewSlotLabel' | 'weekViewDayLabel' | 'weekViewDayWeekday' | 'weekViewDay' | 'weekViewDayNumber' | 'weekViewDaySlot' | 'weekViewDaySlots' | 'weekViewWeekLabel' | 'weekViewWeekNumber' | 'weekViewBackgroundEvent' | CurrentTimeIndicatorStylesNames | CombinedScheduleHeaderStylesNames | AgendaViewStylesNames;
|
|
10
|
+
export type WeekViewStylesNames = 'weekView' | 'weekViewRoot' | 'weekViewHeader' | 'weekViewInner' | 'weekViewAllDaySlotsEvents' | 'weekViewAllDaySlots' | 'weekViewAllDaySlotsList' | 'weekViewAllDaySlot' | 'weekViewAllDaySlotsLabel' | 'weekViewScrollArea' | 'weekViewCorner' | 'weekViewSlotLabels' | 'weekViewSlotLabel' | 'weekViewDayLabel' | 'weekViewDayWeekday' | 'weekViewDay' | 'weekViewDayNumber' | 'weekViewDaySlot' | 'weekViewDaySlots' | 'weekViewWeekLabel' | 'weekViewWeekNumber' | 'weekViewBackgroundEvent' | 'weekViewDragPreview' | CurrentTimeIndicatorStylesNames | CombinedScheduleHeaderStylesNames | AgendaViewStylesNames;
|
|
11
11
|
export type WeekViewCssVariables = {
|
|
12
12
|
weekView: '--week-view-radius' | '--week-view-slot-height' | '--week-view-all-day-slots-height';
|
|
13
13
|
};
|
|
@@ -96,6 +96,8 @@ export interface WeekViewProps extends BoxProps, StylesApiProps<WeekViewFactory>
|
|
|
96
96
|
}) => void;
|
|
97
97
|
/** Function to determine if event can be dragged */
|
|
98
98
|
canDragEvent?: (event: ScheduleEventData) => boolean;
|
|
99
|
+
/** Snap step for moving events by drag and drop, in minutes. Must divide evenly into an hour (e.g. `15`, `30`) or be a whole number of hours. When not set, `intervalMinutes` is used. @default intervalMinutes */
|
|
100
|
+
eventDragInterval?: number;
|
|
99
101
|
/** Called when any event drag starts */
|
|
100
102
|
onEventDragStart?: (event: ScheduleEventData) => void;
|
|
101
103
|
/** Called when any event drag ends */
|
|
@@ -110,6 +112,8 @@ export interface WeekViewProps extends BoxProps, StylesApiProps<WeekViewFactory>
|
|
|
110
112
|
onAllDaySlotClick?: (day: DateStringValue, event: React.MouseEvent<HTMLButtonElement>) => void;
|
|
111
113
|
/** Called when event is clicked */
|
|
112
114
|
onEventClick?: (event: ScheduleEventData, e: React.MouseEvent<HTMLButtonElement>) => void;
|
|
115
|
+
/** If set, background events (`display: 'background'`) can be clicked and trigger `onEventClick` @default false */
|
|
116
|
+
withInteractiveBackgroundEvents?: boolean;
|
|
113
117
|
/** If set, enables drag-to-select time slot ranges @default false */
|
|
114
118
|
withDragSlotSelect?: boolean;
|
|
115
119
|
/** Called when a time slot range is selected by dragging */
|
|
@@ -136,6 +140,8 @@ export interface WeekViewProps extends BoxProps, StylesApiProps<WeekViewFactory>
|
|
|
136
140
|
}) => void;
|
|
137
141
|
/** Function to determine if event can be resized */
|
|
138
142
|
canResizeEvent?: (event: ScheduleEventData) => boolean;
|
|
143
|
+
/** Snap step for resizing events, in minutes. Must divide evenly into an hour (e.g. `15`, `30`) or be a whole number of hours. When not set, `intervalMinutes` is used. @default intervalMinutes */
|
|
144
|
+
eventResizeInterval?: number;
|
|
139
145
|
/** Max number of generated recurring instances per recurring series @default 2000 */
|
|
140
146
|
recurrenceExpansionLimit?: number;
|
|
141
147
|
/** Function to get additional props for each time slot. Receives slot start and end datetime strings. Returned props are spread onto the slot element. Event handlers returned by this function are composed with internal handlers (e.g. onClick) rather than overriding them. */
|
|
@@ -64,4 +64,4 @@ export interface WeekViewDayProps {
|
|
|
64
64
|
end: DateTimeStringValue;
|
|
65
65
|
}) => Record<string, any> | undefined;
|
|
66
66
|
}
|
|
67
|
-
export declare function WeekViewDay({ day, dayIndex, slots, intervalMinutes, getStyles, weekendDays, children, labels, highlightBusinessHours, businessHours, withEventsDragAndDrop, onDaySlotsDragOver, onDaySlotsDragLeave, onDaySlotsDrop, onSlotClick, dropTargetSlotIndex, mode, slotsRef, firstSlotIndex, onSlotKeyDown, onFirstSlotArrowUp, withDragSlotSelect, onSlotPointerDown, isSlotDragSelected, daySlotsContainerRef, getTimeSlotProps, }: WeekViewDayProps): import("react
|
|
67
|
+
export declare function WeekViewDay({ day, dayIndex, slots, intervalMinutes, getStyles, weekendDays, children, labels, highlightBusinessHours, businessHours, withEventsDragAndDrop, onDaySlotsDragOver, onDaySlotsDragLeave, onDaySlotsDrop, onSlotClick, dropTargetSlotIndex, mode, slotsRef, firstSlotIndex, onSlotKeyDown, onFirstSlotArrowUp, withDragSlotSelect, onSlotPointerDown, isSlotDragSelected, daySlotsContainerRef, getTimeSlotProps, }: WeekViewDayProps): import("react").JSX.Element;
|
|
@@ -1,9 +1,13 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ScheduleEventData } from '../../../types';
|
|
2
|
+
/** An event stored in a positioning column together with its precomputed all-day flag. */
|
|
3
|
+
export interface ColumnEvent {
|
|
4
|
+
event: ScheduleEventData;
|
|
5
|
+
allDay: boolean;
|
|
6
|
+
}
|
|
2
7
|
interface FindAvailableColumnInput {
|
|
3
|
-
columns: Map<string,
|
|
8
|
+
columns: Map<string, ColumnEvent[]>;
|
|
4
9
|
event: ScheduleEventData;
|
|
5
10
|
allDay: boolean;
|
|
6
|
-
allWeekDays: DateStringValue[];
|
|
7
11
|
}
|
|
8
12
|
export declare function findAvailableColumn(input: FindAvailableColumnInput): number;
|
|
9
13
|
export {};
|
|
@@ -68,4 +68,4 @@ export interface YearViewMonthProps extends YearViewMonthSettings {
|
|
|
68
68
|
dayIndex: number;
|
|
69
69
|
};
|
|
70
70
|
}
|
|
71
|
-
export declare function YearViewMonth({ month, getStyles, monthLabelFormat, withWeekNumbers, withWeekDays, locale, firstDayOfWeek, weekdayFormat, weekendDays, withWeekendDays, getDayProps, onDayClick, onWeekNumberClick, onMonthClick, getWeekNumberProps, highlightToday, groupedEvents, mode, withOutsideDays, renderDay, __getDayRef, __onDayKeyDown, firstDayIndex, }: YearViewMonthProps): import("react
|
|
71
|
+
export declare function YearViewMonth({ month, getStyles, monthLabelFormat, withWeekNumbers, withWeekDays, locale, firstDayOfWeek, weekdayFormat, weekendDays, withWeekendDays, getDayProps, onDayClick, onWeekNumberClick, onMonthClick, getWeekNumberProps, highlightToday, groupedEvents, mode, withOutsideDays, renderDay, __getDayRef, __onDayKeyDown, firstDayIndex, }: YearViewMonthProps): import("react").JSX.Element;
|
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
import { DragContextValue } from '../components/DragContext/DragContext';
|
|
2
2
|
import { DateTimeStringValue, ScheduleEventData, ScheduleMode } from '../types';
|
|
3
|
+
export interface DragPreview<T = any> {
|
|
4
|
+
start: DateTimeStringValue;
|
|
5
|
+
end: DateTimeStringValue;
|
|
6
|
+
target: T;
|
|
7
|
+
}
|
|
3
8
|
export interface UseDragDropHandlersOptions<T = any> {
|
|
4
9
|
/** Whether drag and drop is enabled */
|
|
5
10
|
enabled: boolean;
|
|
@@ -41,13 +46,17 @@ export interface DragDropHandlers<T = any> {
|
|
|
41
46
|
/** Handle drag over event */
|
|
42
47
|
handleDragOver: (e: React.DragEvent, target: T) => void;
|
|
43
48
|
/** Handle drag leave event */
|
|
44
|
-
handleDragLeave: () => void;
|
|
49
|
+
handleDragLeave: (event?: React.DragEvent) => void;
|
|
45
50
|
/** Handle drop event */
|
|
46
51
|
handleDrop: (e: React.DragEvent, target: T) => void;
|
|
47
52
|
/** Check if event is draggable */
|
|
48
53
|
isDraggableEvent: (event: ScheduleEventData) => boolean;
|
|
49
54
|
/** Check if target is the current drop target */
|
|
50
55
|
isDropTarget: (target: T) => boolean;
|
|
56
|
+
/** Snapped drop preview used to render the drag ghost, or `null` when not dragging */
|
|
57
|
+
dragPreview: DragPreview<T> | null;
|
|
58
|
+
/** Sets the current drag preview */
|
|
59
|
+
setDragPreview: (preview: DragPreview<T> | null) => void;
|
|
51
60
|
}
|
|
52
61
|
/**
|
|
53
62
|
* Hook that provides unified drag-drop handlers for Schedule views.
|
|
@@ -6,6 +6,7 @@ export interface UseEventResizeInput {
|
|
|
6
6
|
startTime: string;
|
|
7
7
|
endTime: string;
|
|
8
8
|
intervalMinutes: number;
|
|
9
|
+
resizeIntervalMinutes?: number;
|
|
9
10
|
onEventResize?: (data: {
|
|
10
11
|
eventId: string | number;
|
|
11
12
|
newStart: DateTimeStringValue;
|
|
@@ -14,7 +15,7 @@ export interface UseEventResizeInput {
|
|
|
14
15
|
}) => void;
|
|
15
16
|
canResizeEvent?: (event: ScheduleEventData) => boolean;
|
|
16
17
|
}
|
|
17
|
-
export declare function useEventResize({ enabled, mode, startTime, endTime, intervalMinutes, onEventResize, canResizeEvent, }: UseEventResizeInput): {
|
|
18
|
+
export declare function useEventResize({ enabled, mode, startTime, endTime, intervalMinutes, resizeIntervalMinutes, onEventResize, canResizeEvent, }: UseEventResizeInput): {
|
|
18
19
|
handleResizeStart: ({ event, edge, container, originalTop, originalHeight, eventDate, pointerEvent, }: {
|
|
19
20
|
event: ScheduleEventData;
|
|
20
21
|
edge: ResizeEdge;
|
|
@@ -6,6 +6,7 @@ export interface UseHorizontalEventResizeInput {
|
|
|
6
6
|
startTime: string;
|
|
7
7
|
endTime: string;
|
|
8
8
|
intervalMinutes: number;
|
|
9
|
+
resizeIntervalMinutes?: number;
|
|
9
10
|
onEventResize?: (data: {
|
|
10
11
|
eventId: string | number;
|
|
11
12
|
newStart: DateTimeStringValue;
|
|
@@ -14,7 +15,7 @@ export interface UseHorizontalEventResizeInput {
|
|
|
14
15
|
}) => void;
|
|
15
16
|
canResizeEvent?: (event: ScheduleEventData) => boolean;
|
|
16
17
|
}
|
|
17
|
-
export declare function useHorizontalEventResize({ enabled, mode, startTime, endTime, intervalMinutes, onEventResize, canResizeEvent, }: UseHorizontalEventResizeInput): {
|
|
18
|
+
export declare function useHorizontalEventResize({ enabled, mode, startTime, endTime, intervalMinutes, resizeIntervalMinutes, onEventResize, canResizeEvent, }: UseHorizontalEventResizeInput): {
|
|
18
19
|
handleResizeStart: ({ event, edge, container, originalLeft, originalWidth, eventDate, dayIndex, dayCount, pointerEvent, }: {
|
|
19
20
|
event: ScheduleEventData;
|
|
20
21
|
edge: ResizeEdge;
|
package/lib/index.d.mts
CHANGED
|
@@ -12,6 +12,7 @@ export * from './components/ResourcesWeekView';
|
|
|
12
12
|
export * from './components/ResourcesMonthView';
|
|
13
13
|
export * from './components/ResourcesSchedule';
|
|
14
14
|
export * from './components/AgendaView';
|
|
15
|
+
export * from './components/ScheduleBackgroundEvent';
|
|
15
16
|
export * from './components/ScheduleEvent';
|
|
16
17
|
export * from './components/ScheduleHeader';
|
|
17
18
|
export * from './components/CurrentTimeIndicator';
|
package/lib/index.d.ts
CHANGED
|
@@ -12,6 +12,7 @@ export * from './components/ResourcesWeekView';
|
|
|
12
12
|
export * from './components/ResourcesMonthView';
|
|
13
13
|
export * from './components/ResourcesSchedule';
|
|
14
14
|
export * from './components/AgendaView';
|
|
15
|
+
export * from './components/ScheduleBackgroundEvent';
|
|
15
16
|
export * from './components/ScheduleEvent';
|
|
16
17
|
export * from './components/ScheduleHeader';
|
|
17
18
|
export * from './components/CurrentTimeIndicator';
|
package/lib/types.d.ts
CHANGED
|
@@ -68,7 +68,7 @@ interface ScheduleEventBase<Payload extends EventPayload = EventPayload> {
|
|
|
68
68
|
color: MantineColor;
|
|
69
69
|
/** Event variant, default is `'light'` */
|
|
70
70
|
variant?: 'filled' | 'light';
|
|
71
|
-
/** Event display mode. Background events render as full-width, non-interactive
|
|
71
|
+
/** Event display mode. Background events render as full-width blocks behind regular events, non-interactive unless `withInteractiveBackgroundEvents` is set on the view. @default 'default' */
|
|
72
72
|
display?: 'default' | 'background';
|
|
73
73
|
/** Additional event data, defined by the user, not used internally by the library */
|
|
74
74
|
payload?: Payload;
|
|
@@ -12,6 +12,16 @@ export interface CalculateDropTimeInput {
|
|
|
12
12
|
slotHeight?: number;
|
|
13
13
|
/** Minutes per slot */
|
|
14
14
|
intervalMinutes?: number;
|
|
15
|
+
/** Pointer offset along the time axis within the target slot, in px. Axis-agnostic alias for `mouseYOffset`; when both are set, `slotOffset` wins. */
|
|
16
|
+
slotOffset?: number;
|
|
17
|
+
/** Size of the target slot along the time axis, in px. Axis-agnostic alias for `slotHeight`; when both are set, `slotSize` wins. */
|
|
18
|
+
slotSize?: number;
|
|
19
|
+
/** Snap step for the resulting start time, in minutes. When set, the start snaps to this interval (absolute, from the day boundary) instead of the slot start. */
|
|
20
|
+
dragIntervalMinutes?: number;
|
|
21
|
+
/** Start time boundary of the schedule in HH:mm:ss format. When set together with `dragIntervalMinutes`, the snapped start is clamped to stay within the displayed range (the event may still extend past `endTime`, matching how overflowing events are clipped). */
|
|
22
|
+
startTime?: string;
|
|
23
|
+
/** End time boundary of the schedule in HH:mm:ss format. When set together with `dragIntervalMinutes`, the snapped start is clamped to stay within the displayed range (the event may still extend past `endTime`, matching how overflowing events are clipped). */
|
|
24
|
+
endTime?: string;
|
|
15
25
|
}
|
|
16
26
|
export interface CalculateDropTimeResult {
|
|
17
27
|
/** New start date/time for the event */
|
|
@@ -19,4 +29,4 @@ export interface CalculateDropTimeResult {
|
|
|
19
29
|
/** New end date/time for the event */
|
|
20
30
|
end: Date;
|
|
21
31
|
}
|
|
22
|
-
export declare function calculateDropTime({ draggedEvent, targetDate, targetSlotTime, mouseYOffset, slotHeight, intervalMinutes, }: CalculateDropTimeInput): CalculateDropTimeResult;
|
|
32
|
+
export declare function calculateDropTime({ draggedEvent, targetDate, targetSlotTime, mouseYOffset, slotHeight, intervalMinutes, slotOffset, slotSize, dragIntervalMinutes, startTime, endTime, }: CalculateDropTimeInput): CalculateDropTimeResult;
|