@mantine/schedule 9.4.1 → 9.4.2

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.
Files changed (48) hide show
  1. package/cjs/components/DayView/DayView.cjs +6 -2
  2. package/cjs/components/DayView/DayView.cjs.map +1 -1
  3. package/cjs/components/ResourcesDayView/ResourcesDayView.cjs +26 -18
  4. package/cjs/components/ResourcesDayView/ResourcesDayView.cjs.map +1 -1
  5. package/cjs/components/ResourcesDayView/get-resources-day-view-events/get-resources-day-view-events.cjs +5 -3
  6. package/cjs/components/ResourcesDayView/get-resources-day-view-events/get-resources-day-view-events.cjs.map +1 -1
  7. package/cjs/components/ResourcesWeekView/ResourcesWeekView.cjs +26 -18
  8. package/cjs/components/ResourcesWeekView/ResourcesWeekView.cjs.map +1 -1
  9. package/cjs/components/ResourcesWeekView/get-resources-week-view-events/get-resources-week-view-events.cjs +3 -2
  10. package/cjs/components/ResourcesWeekView/get-resources-week-view-events/get-resources-week-view-events.cjs.map +1 -1
  11. package/cjs/components/ScheduleEvent/ScheduleEvent.module.cjs.map +1 -1
  12. package/cjs/components/WeekView/WeekView.cjs +7 -3
  13. package/cjs/components/WeekView/WeekView.cjs.map +1 -1
  14. package/cjs/index.cjs +2 -0
  15. package/cjs/utils/clamp-interval-minutes/clamp-interval-minutes.cjs +13 -4
  16. package/cjs/utils/clamp-interval-minutes/clamp-interval-minutes.cjs.map +1 -1
  17. package/cjs/utils/get-time-axis-event-style/get-time-axis-event-style.cjs +21 -0
  18. package/cjs/utils/get-time-axis-event-style/get-time-axis-event-style.cjs.map +1 -0
  19. package/esm/components/DayView/DayView.mjs +6 -2
  20. package/esm/components/DayView/DayView.mjs.map +1 -1
  21. package/esm/components/ResourcesDayView/ResourcesDayView.mjs +26 -18
  22. package/esm/components/ResourcesDayView/ResourcesDayView.mjs.map +1 -1
  23. package/esm/components/ResourcesDayView/get-resources-day-view-events/get-resources-day-view-events.mjs +5 -3
  24. package/esm/components/ResourcesDayView/get-resources-day-view-events/get-resources-day-view-events.mjs.map +1 -1
  25. package/esm/components/ResourcesWeekView/ResourcesWeekView.mjs +26 -18
  26. package/esm/components/ResourcesWeekView/ResourcesWeekView.mjs.map +1 -1
  27. package/esm/components/ResourcesWeekView/get-resources-week-view-events/get-resources-week-view-events.mjs +3 -2
  28. package/esm/components/ResourcesWeekView/get-resources-week-view-events/get-resources-week-view-events.mjs.map +1 -1
  29. package/esm/components/ScheduleEvent/ScheduleEvent.module.mjs.map +1 -1
  30. package/esm/components/WeekView/WeekView.mjs +7 -3
  31. package/esm/components/WeekView/WeekView.mjs.map +1 -1
  32. package/esm/index.mjs +2 -1
  33. package/esm/utils/clamp-interval-minutes/clamp-interval-minutes.mjs +13 -4
  34. package/esm/utils/clamp-interval-minutes/clamp-interval-minutes.mjs.map +1 -1
  35. package/esm/utils/get-time-axis-event-style/get-time-axis-event-style.mjs +21 -0
  36. package/esm/utils/get-time-axis-event-style/get-time-axis-event-style.mjs.map +1 -0
  37. package/lib/components/DayView/DayView.d.ts +1 -1
  38. package/lib/components/ResourcesDayView/ResourcesDayView.d.ts +6 -2
  39. package/lib/components/ResourcesDayView/get-resources-day-view-events/get-resources-day-view-events.d.ts +2 -1
  40. package/lib/components/ResourcesWeekView/ResourcesWeekView.d.ts +6 -1
  41. package/lib/components/ResourcesWeekView/get-resources-week-view-events/get-resources-week-view-events.d.ts +2 -1
  42. package/lib/components/WeekView/WeekView.d.ts +1 -1
  43. package/lib/utils/clamp-interval-minutes/clamp-interval-minutes.d.ts +10 -1
  44. package/lib/utils/get-time-axis-event-style/get-time-axis-event-style.d.ts +26 -0
  45. package/lib/utils/index.d.ts +1 -0
  46. package/package.json +4 -4
  47. package/styles.css +16 -1
  48. package/styles.layer.css +16 -1
@@ -8,7 +8,7 @@ const require_get_day_positioned_events = require("../../DayView/get-day-view-ev
8
8
  let dayjs = require("dayjs");
9
9
  dayjs = require_runtime.__toESM(dayjs);
10
10
  //#region packages/@mantine/schedule/src/components/ResourcesDayView/get-resources-day-view-events/get-resources-day-view-events.ts
11
- function getResourcesDayViewEvents({ events, resources, date, startTime, endTime }) {
11
+ function getResourcesDayViewEvents({ events, resources, date, startTime, endTime, intervalMinutes }) {
12
12
  const result = {
13
13
  regularEvents: {},
14
14
  allDayEvents: {},
@@ -70,7 +70,8 @@ function getResourcesDayViewEvents({ events, resources, date, startTime, endTime
70
70
  events: eventsByResource[resource.id],
71
71
  startTime,
72
72
  endTime,
73
- date
73
+ date,
74
+ intervalMinutes
74
75
  });
75
76
  for (const event of positioned) if (event.position.allDay) result.allDayEvents[resource.id].push(event);
76
77
  else result.regularEvents[resource.id].push(event);
@@ -103,7 +104,8 @@ function getResourcesDayViewEvents({ events, resources, date, startTime, endTime
103
104
  const { top, height } = require_get_day_position.getDayPosition({
104
105
  event: clippedEvent,
105
106
  startTime,
106
- endTime
107
+ endTime,
108
+ intervalMinutes
107
109
  });
108
110
  if (height <= 0) continue;
109
111
  result.backgroundTimedEvents[resource.id].push({
@@ -1 +1 @@
1
- {"version":3,"file":"get-resources-day-view-events.cjs","names":["isEventInTimeRange","validateEvent","getDayPositionedEvents","isAllDayEvent","getDayPosition"],"sources":["../../../../src/components/ResourcesDayView/get-resources-day-view-events/get-resources-day-view-events.ts"],"sourcesContent":["import dayjs from 'dayjs';\nimport {\n AnyDateValue,\n DayPositionedEventData,\n ScheduleEventData,\n ScheduleResourceData,\n} from '../../../types';\nimport { getDayPosition, isAllDayEvent, isEventInTimeRange, validateEvent } from '../../../utils';\nimport { getDayPositionedEvents } from '../../DayView/get-day-view-events/get-day-positioned-events';\n\ninterface GetResourcesDayViewEventsInput {\n events: ScheduleEventData[] | undefined;\n resources: ScheduleResourceData[];\n date: AnyDateValue;\n startTime?: string;\n endTime?: string;\n}\n\nexport interface ResourcesDayViewEventsResult {\n regularEvents: Record<string | number, DayPositionedEventData[]>;\n allDayEvents: Record<string | number, DayPositionedEventData[]>;\n backgroundTimedEvents: Record<string | number, DayPositionedEventData[]>;\n backgroundAllDayEvents: Record<string | number, DayPositionedEventData[]>;\n}\n\nexport function getResourcesDayViewEvents({\n events,\n resources,\n date,\n startTime,\n endTime,\n}: GetResourcesDayViewEventsInput): ResourcesDayViewEventsResult {\n const result: ResourcesDayViewEventsResult = {\n regularEvents: {},\n allDayEvents: {},\n backgroundTimedEvents: {},\n backgroundAllDayEvents: {},\n };\n\n for (const resource of resources) {\n result.regularEvents[resource.id] = [];\n result.allDayEvents[resource.id] = [];\n result.backgroundTimedEvents[resource.id] = [];\n result.backgroundAllDayEvents[resource.id] = [];\n }\n\n if (events === undefined) {\n return result;\n }\n\n const dayStart = dayjs(date).startOf('day');\n const dayEnd = dayjs(date).endOf('day');\n\n const eventsByResource: Record<string | number, ScheduleEventData[]> = {};\n const backgroundByResource: Record<string | number, ScheduleEventData[]> = {};\n\n for (const resource of resources) {\n eventsByResource[resource.id] = [];\n backgroundByResource[resource.id] = [];\n }\n\n const ids = new Set<string | number>();\n\n for (const event of events) {\n if (event.resourceId === undefined) {\n continue;\n }\n\n if (!(event.resourceId in eventsByResource)) {\n continue;\n }\n\n const eventStart = dayjs(event.start);\n const eventEnd = dayjs(event.end);\n\n const isOnDay = eventStart.isSame(dayStart, 'day');\n const overlapsDay = eventStart.isBefore(dayEnd) && eventEnd.isAfter(dayStart);\n\n if (isOnDay || overlapsDay) {\n if (isOnDay && !isEventInTimeRange({ event, startTime, endTime })) {\n continue;\n }\n\n const validated = validateEvent(event);\n\n if (!ids.has(event.id)) {\n ids.add(event.id);\n } else {\n throw new Error(\n `[@mantine/schedule] ResourcesDayView: Duplicated event ids found: ${event.id}`\n );\n }\n\n if (event.display === 'background') {\n backgroundByResource[event.resourceId].push(validated);\n } else if (isOnDay) {\n eventsByResource[event.resourceId].push(validated);\n } else {\n const clippedStart = eventStart.isBefore(dayStart) ? dayStart : eventStart;\n const clippedEnd = eventEnd.isAfter(dayEnd) ? dayEnd : eventEnd;\n\n const clippedEvent = {\n ...validated,\n start: clippedStart.format('YYYY-MM-DD HH:mm:ss'),\n end: clippedEnd.format('YYYY-MM-DD HH:mm:ss'),\n };\n\n if (isEventInTimeRange({ event: clippedEvent, startTime, endTime })) {\n eventsByResource[event.resourceId].push(clippedEvent);\n }\n }\n }\n }\n\n for (const resource of resources) {\n const positioned = getDayPositionedEvents({\n events: eventsByResource[resource.id],\n startTime,\n endTime,\n date,\n });\n\n for (const event of positioned) {\n if (event.position.allDay) {\n result.allDayEvents[resource.id].push(event);\n } else {\n result.regularEvents[resource.id].push(event);\n }\n }\n\n for (const event of backgroundByResource[resource.id]) {\n const eventStart = dayjs(event.start);\n const eventEnd = dayjs(event.end);\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 allDay = isAllDayEvent({ event: clippedEvent, date });\n\n if (allDay) {\n result.backgroundAllDayEvents[resource.id].push({\n ...event,\n position: {\n top: 0,\n height: 100,\n allDay: true,\n width: 100,\n offset: 0,\n column: 0,\n overlaps: 1,\n },\n });\n } else {\n const { top, height } = getDayPosition({ event: clippedEvent, startTime, endTime });\n if (height <= 0) {\n continue;\n }\n result.backgroundTimedEvents[resource.id].push({\n ...event,\n position: { top, height, allDay: false, width: 100, offset: 0, column: 0, overlaps: 1 },\n });\n }\n }\n }\n\n return result;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"get-resources-day-view-events.cjs","names":["isEventInTimeRange","validateEvent","getDayPositionedEvents","isAllDayEvent","getDayPosition"],"sources":["../../../../src/components/ResourcesDayView/get-resources-day-view-events/get-resources-day-view-events.ts"],"sourcesContent":["import dayjs from 'dayjs';\nimport {\n AnyDateValue,\n DayPositionedEventData,\n ScheduleEventData,\n ScheduleResourceData,\n} from '../../../types';\nimport { getDayPosition, isAllDayEvent, isEventInTimeRange, validateEvent } from '../../../utils';\nimport { getDayPositionedEvents } from '../../DayView/get-day-view-events/get-day-positioned-events';\n\ninterface GetResourcesDayViewEventsInput {\n events: ScheduleEventData[] | undefined;\n resources: ScheduleResourceData[];\n date: AnyDateValue;\n startTime?: string;\n endTime?: string;\n intervalMinutes?: number;\n}\n\nexport interface ResourcesDayViewEventsResult {\n regularEvents: Record<string | number, DayPositionedEventData[]>;\n allDayEvents: Record<string | number, DayPositionedEventData[]>;\n backgroundTimedEvents: Record<string | number, DayPositionedEventData[]>;\n backgroundAllDayEvents: Record<string | number, DayPositionedEventData[]>;\n}\n\nexport function getResourcesDayViewEvents({\n events,\n resources,\n date,\n startTime,\n endTime,\n intervalMinutes,\n}: GetResourcesDayViewEventsInput): ResourcesDayViewEventsResult {\n const result: ResourcesDayViewEventsResult = {\n regularEvents: {},\n allDayEvents: {},\n backgroundTimedEvents: {},\n backgroundAllDayEvents: {},\n };\n\n for (const resource of resources) {\n result.regularEvents[resource.id] = [];\n result.allDayEvents[resource.id] = [];\n result.backgroundTimedEvents[resource.id] = [];\n result.backgroundAllDayEvents[resource.id] = [];\n }\n\n if (events === undefined) {\n return result;\n }\n\n const dayStart = dayjs(date).startOf('day');\n const dayEnd = dayjs(date).endOf('day');\n\n const eventsByResource: Record<string | number, ScheduleEventData[]> = {};\n const backgroundByResource: Record<string | number, ScheduleEventData[]> = {};\n\n for (const resource of resources) {\n eventsByResource[resource.id] = [];\n backgroundByResource[resource.id] = [];\n }\n\n const ids = new Set<string | number>();\n\n for (const event of events) {\n if (event.resourceId === undefined) {\n continue;\n }\n\n if (!(event.resourceId in eventsByResource)) {\n continue;\n }\n\n const eventStart = dayjs(event.start);\n const eventEnd = dayjs(event.end);\n\n const isOnDay = eventStart.isSame(dayStart, 'day');\n const overlapsDay = eventStart.isBefore(dayEnd) && eventEnd.isAfter(dayStart);\n\n if (isOnDay || overlapsDay) {\n if (isOnDay && !isEventInTimeRange({ event, startTime, endTime })) {\n continue;\n }\n\n const validated = validateEvent(event);\n\n if (!ids.has(event.id)) {\n ids.add(event.id);\n } else {\n throw new Error(\n `[@mantine/schedule] ResourcesDayView: Duplicated event ids found: ${event.id}`\n );\n }\n\n if (event.display === 'background') {\n backgroundByResource[event.resourceId].push(validated);\n } else if (isOnDay) {\n eventsByResource[event.resourceId].push(validated);\n } else {\n const clippedStart = eventStart.isBefore(dayStart) ? dayStart : eventStart;\n const clippedEnd = eventEnd.isAfter(dayEnd) ? dayEnd : eventEnd;\n\n const clippedEvent = {\n ...validated,\n start: clippedStart.format('YYYY-MM-DD HH:mm:ss'),\n end: clippedEnd.format('YYYY-MM-DD HH:mm:ss'),\n };\n\n if (isEventInTimeRange({ event: clippedEvent, startTime, endTime })) {\n eventsByResource[event.resourceId].push(clippedEvent);\n }\n }\n }\n }\n\n for (const resource of resources) {\n const positioned = getDayPositionedEvents({\n events: eventsByResource[resource.id],\n startTime,\n endTime,\n date,\n intervalMinutes,\n });\n\n for (const event of positioned) {\n if (event.position.allDay) {\n result.allDayEvents[resource.id].push(event);\n } else {\n result.regularEvents[resource.id].push(event);\n }\n }\n\n for (const event of backgroundByResource[resource.id]) {\n const eventStart = dayjs(event.start);\n const eventEnd = dayjs(event.end);\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 allDay = isAllDayEvent({ event: clippedEvent, date });\n\n if (allDay) {\n result.backgroundAllDayEvents[resource.id].push({\n ...event,\n position: {\n top: 0,\n height: 100,\n allDay: true,\n width: 100,\n offset: 0,\n column: 0,\n overlaps: 1,\n },\n });\n } else {\n const { top, height } = getDayPosition({\n event: clippedEvent,\n startTime,\n endTime,\n intervalMinutes,\n });\n if (height <= 0) {\n continue;\n }\n result.backgroundTimedEvents[resource.id].push({\n ...event,\n position: { top, height, allDay: false, width: 100, offset: 0, column: 0, overlaps: 1 },\n });\n }\n }\n }\n\n return result;\n}\n"],"mappings":"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"}
@@ -10,6 +10,7 @@ const require_previous_week = require("../../utils/previous-week/previous-week.c
10
10
  const require_get_current_time_position = require("../../utils/get-current-time-position/get-current-time-position.cjs");
11
11
  const require_is_in_time_range = require("../../utils/is-in-time-range/is-in-time-range.cjs");
12
12
  const require_is_all_day_event = require("../../utils/is-all-day-event/is-all-day-event.cjs");
13
+ const require_get_time_axis_event_style = require("../../utils/get-time-axis-event-style/get-time-axis-event-style.cjs");
13
14
  const require_calculate_drop_time = require("../../utils/calculate-drop-time/calculate-drop-time.cjs");
14
15
  const require_get_business_hours_mod = require("../../utils/get-business-hours-mod/get-business-hours-mod.cjs");
15
16
  const require_get_ordered_resources = require("../../utils/get-ordered-resources/get-ordered-resources.cjs");
@@ -42,6 +43,7 @@ const defaultProps = {
42
43
  endTime: "23:59:59",
43
44
  slotLabelFormat: "HH:mm",
44
45
  intervalMinutes: 60,
46
+ minEventSize: 1,
45
47
  withHeader: true,
46
48
  weekLabelFormat: "MMM DD",
47
49
  weekdayFormat: "ddd D",
@@ -64,7 +66,7 @@ const varsResolver = (0, _mantine_core.createVarsResolver)((_theme, { radius, sl
64
66
  } }));
65
67
  const ResourcesWeekView = (0, _mantine_core.factory)((_props) => {
66
68
  const props = (0, _mantine_core.useProps)("ResourcesWeekView", defaultProps, _props);
67
- const { classNames, className, style, styles, unstyled, attributes, vars, startTime, endTime, date, onDateChange, resources, intervalMinutes, slotLabelFormat, radius, startScrollDateTime, scrollAreaProps, locale, withCurrentTimeIndicator: _withCurrentTimeIndicator, withCurrentTimeBubble, __staticSelector, withHeader, onViewChange, previousControlProps, nextControlProps, todayControlProps, viewSelectProps, weekLabelFormat, renderWeekLabel, events, slotWidth, rowHeight, labels, highlightBusinessHours, businessHours, renderEventBody, renderEvent, renderResourceLabel, groups, renderGroupLabel, groupLabelWidth, withEventsDragAndDrop, onEventDrop, canDragEvent, onEventDragStart, onEventDragEnd, withEventResize, onEventResize, canResizeEvent, onTimeSlotClick, onEventClick, withDragSlotSelect, onSlotDragEnd, mode, onExternalEventDrop, recurrenceExpansionLimit, maxEventsPerTimeSlot: _maxEventsPerTimeSlot, moreEventsProps, firstDayOfWeek, weekendDays, withWeekendDays, weekdayFormat, highlightToday, ...others } = props;
69
+ const { classNames, className, style, styles, unstyled, attributes, vars, startTime, endTime, date, onDateChange, resources, intervalMinutes, minEventSize, slotLabelFormat, radius, startScrollDateTime, scrollAreaProps, locale, withCurrentTimeIndicator: _withCurrentTimeIndicator, withCurrentTimeBubble, getCurrentTime, __staticSelector, withHeader, onViewChange, previousControlProps, nextControlProps, todayControlProps, viewSelectProps, weekLabelFormat, renderWeekLabel, events, slotWidth, rowHeight, labels, highlightBusinessHours, businessHours, renderEventBody, renderEvent, renderResourceLabel, groups, renderGroupLabel, groupLabelWidth, withEventsDragAndDrop, onEventDrop, canDragEvent, onEventDragStart, onEventDragEnd, withEventResize, onEventResize, canResizeEvent, onTimeSlotClick, onEventClick, withDragSlotSelect, onSlotDragEnd, mode, onExternalEventDrop, recurrenceExpansionLimit, maxEventsPerTimeSlot: _maxEventsPerTimeSlot, moreEventsProps, firstDayOfWeek, weekendDays, withWeekendDays, weekdayFormat, highlightToday, ...others } = props;
68
70
  const maxEventsPerTimeSlot = _maxEventsPerTimeSlot !== void 0 ? Math.max(1, _maxEventsPerTimeSlot) : void 0;
69
71
  const getStyles = (0, _mantine_core.useStyles)({
70
72
  name: __staticSelector,
@@ -116,27 +118,27 @@ const ResourcesWeekView = (0, _mantine_core.factory)((_props) => {
116
118
  ctx
117
119
  ]);
118
120
  const totalSlotsPerDay = slots.length;
119
- const isToday = weekdays.some((day) => (0, dayjs.default)(day).isSame((0, dayjs.default)(), "day"));
121
+ const resolveNow = () => getCurrentTime ? (0, dayjs.default)(getCurrentTime()) : (0, dayjs.default)();
122
+ const now = resolveNow();
123
+ const isToday = weekdays.some((day) => (0, dayjs.default)(day).isSame(now, "day"));
120
124
  const withCurrentTimeIndicator = _withCurrentTimeIndicator ?? isToday;
121
- const [timeIndicatorOffset, setTimeIndicatorOffset] = (0, react.useState)(require_get_current_time_position.getCurrentTimePosition({
125
+ const [, setTimeIndicatorTick] = (0, react.useState)(0);
126
+ (0, _mantine_hooks.useInterval)(() => setTimeIndicatorTick((tick) => tick + 1), 6e4, { autoInvoke: true });
127
+ const timeIndicatorOffset = require_get_current_time_position.getCurrentTimePosition({
122
128
  startTime,
123
129
  endTime,
124
- intervalMinutes
125
- }));
126
- (0, _mantine_hooks.useInterval)(() => setTimeIndicatorOffset(require_get_current_time_position.getCurrentTimePosition({
127
- startTime,
128
- endTime,
129
- intervalMinutes
130
- })), 6e4, { autoInvoke: true });
131
- const todayDayIndex = weekdays.findIndex((day) => (0, dayjs.default)(day).isSame((0, dayjs.default)(), "day"));
130
+ intervalMinutes,
131
+ now
132
+ });
133
+ const todayDayIndex = weekdays.findIndex((day) => (0, dayjs.default)(day).isSame(now, "day"));
132
134
  const showTimeIndicator = withCurrentTimeIndicator && todayDayIndex >= 0 && require_is_in_time_range.isInTimeRange({
133
- date: (0, dayjs.default)().toDate(),
135
+ date: now.toDate(),
134
136
  startTime,
135
137
  endTime
136
138
  });
137
139
  const formattedCurrentTime = withCurrentTimeBubble ? require_format_date.formatDate({
138
140
  locale: ctx.getLocale(locale),
139
- date: (0, dayjs.default)(),
141
+ date: now,
140
142
  format: slotLabelFormat
141
143
  }) : "";
142
144
  const handleExternalDrop = (0, react.useCallback)((e, target) => {
@@ -228,6 +230,7 @@ const ResourcesWeekView = (0, _mantine_core.factory)((_props) => {
228
230
  weekdays,
229
231
  startTime,
230
232
  endTime,
233
+ intervalMinutes,
231
234
  expansionLimit: recurrenceExpansionLimit
232
235
  }), [
233
236
  events,
@@ -235,11 +238,12 @@ const ResourcesWeekView = (0, _mantine_core.factory)((_props) => {
235
238
  weekdays,
236
239
  startTime,
237
240
  endTime,
241
+ intervalMinutes,
238
242
  recurrenceExpansionLimit
239
243
  ]);
240
244
  const dayLabels = weekdays.map((day) => {
241
245
  const d = (0, dayjs.default)(day);
242
- const today = d.isSame((0, dayjs.default)(), "day") && highlightToday;
246
+ const today = d.isSame(now, "day") && highlightToday;
243
247
  const weekend = ctx.getWeekendDays(weekendDays).includes(d.day());
244
248
  return /* @__PURE__ */ (0, react.createElement)(_mantine_core.Box, {
245
249
  ...getStyles("resourcesWeekViewDayLabel"),
@@ -379,9 +383,12 @@ const ResourcesWeekView = (0, _mantine_core.factory)((_props) => {
379
383
  __vars: eventColors ? { "--event-color": eventColors.color } : void 0,
380
384
  "data-resizing": isThisEventResizing || void 0,
381
385
  style: {
382
- left: `calc(${eventLeft}% + 1px)`,
386
+ ...require_get_time_axis_event_style.getTimeAxisEventStyle({
387
+ start: eventLeft,
388
+ span: eventWidth,
389
+ minSize: minEventSize
390
+ }),
383
391
  top: adjustPosition ? `calc((100% - 22px) * ${event.position.column} / ${maxEventsPerTimeSlot})` : `${event.position.offset}%`,
384
- width: `calc(${eventWidth}% - 2px)`,
385
392
  height: adjustPosition ? `calc((100% - 22px) / ${maxEventsPerTimeSlot})` : `${event.position.width}%`
386
393
  },
387
394
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_ScheduleEvent.ScheduleEvent, {
@@ -399,7 +406,8 @@ const ResourcesWeekView = (0, _mantine_core.factory)((_props) => {
399
406
  } : void 0,
400
407
  style: {
401
408
  width: "100%",
402
- height: "100%"
409
+ height: "100%",
410
+ padding: 0
403
411
  }
404
412
  }), isResizable && mode !== "static" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
405
413
  ...getStyles("resourcesWeekViewResizeHandle"),
@@ -579,7 +587,7 @@ const ResourcesWeekView = (0, _mantine_core.factory)((_props) => {
579
587
  navigationHandlers: {
580
588
  previous: () => require_previous_week.previousWeek(date, ctx.getFirstDayOfWeek(firstDayOfWeek)),
581
589
  next: () => require_next_week.nextWeek(date, ctx.getFirstDayOfWeek(firstDayOfWeek)),
582
- today: () => require_to_date_string.toDateString((0, dayjs.default)())
590
+ today: () => require_to_date_string.toDateString(resolveNow())
583
591
  },
584
592
  control: {
585
593
  miw: 180,
@@ -1 +1 @@
1
- {"version":3,"file":"ResourcesWeekView.cjs","names":["getDayTimeIntervals","getOrderedResources","getWeekDays","getCurrentTimePosition","isInTimeRange","formatDate","useDragDropHandlers","calculateDropTime","getGroupToResourceIdMap","useSlotDragSelect","useHorizontalEventResize","getResourcesWeekViewEvents","Box","getBusinessHoursMod","classes","getIndexFromDragPoint","isAllDayEvent","ScheduleEvent","getOverlapClusters","MoreEvents","ResourcesWeekViewRow","getWeekLabel","ScheduleHeaderBase","previousWeek","nextWeek","toDateString","ScrollArea","getLabel","DragContext"],"sources":["../../../src/components/ResourcesWeekView/ResourcesWeekView.tsx"],"sourcesContent":["import dayjs from 'dayjs';\nimport { useCallback, useMemo, useRef, useState } from 'react';\nimport {\n Box,\n BoxProps,\n createVarsResolver,\n DataAttributes,\n ElementProps,\n factory,\n Factory,\n getRadius,\n MantineRadius,\n rem,\n ScrollArea,\n ScrollAreaProps,\n StylesApiProps,\n useMantineTheme,\n useProps,\n useResolvedStylesApi,\n useStyles,\n} from '@mantine/core';\nimport { useDatesContext } from '@mantine/dates';\nimport { useInterval, useIsomorphicEffect, useMergedRef } from '@mantine/hooks';\nimport { useDragDropHandlers } from '../../hooks/use-drag-drop-handlers';\nimport { useHorizontalEventResize } from '../../hooks/use-horizontal-event-resize';\nimport { useSlotDragSelect } from '../../hooks/use-slot-drag-select';\nimport { getLabel, ScheduleLabelsOverride } from '../../labels';\nimport {\n DateLabelFormat,\n DateStringValue,\n DateTimeStringValue,\n DayOfWeek,\n ScheduleEventData,\n ScheduleMode,\n ScheduleResourceData,\n ScheduleResourceGroup,\n ScheduleViewLevel,\n} from '../../types';\nimport {\n calculateDropTime,\n formatDate,\n getBusinessHoursMod,\n getCurrentTimePosition,\n getDayTimeIntervals,\n getGroupToResourceIdMap,\n getIndexFromDragPoint,\n getOrderedResources,\n getWeekDays,\n handleResourcesGridKeyDown,\n isAllDayEvent,\n isInTimeRange,\n nextWeek,\n previousWeek,\n ResourcesGridControlsRef,\n toDateString,\n} from '../../utils';\nimport { DragContext, DragContextValue } from '../DragContext/DragContext';\nimport { MoreEvents, MoreEventsProps, MoreEventsStylesNames } from '../MoreEvents/MoreEvents';\nimport { getOverlapClusters } from '../ResourcesDayView/get-overlap-clusters/get-overlap-clusters';\nimport { RenderEvent, RenderEventBody, ScheduleEvent } from '../ScheduleEvent/ScheduleEvent';\nimport { CombinedScheduleHeaderStylesNames } from '../ScheduleHeader/ScheduleHeader';\nimport { ScheduleHeaderBase } from '../ScheduleHeader/ScheduleHeaderBase';\nimport { ViewSelectProps } from '../ScheduleHeader/ViewSelect/ViewSelect';\nimport { getWeekLabel } from '../WeekView/get-week-label/get-week-label';\nimport { getResourcesWeekViewEvents } from './get-resources-week-view-events/get-resources-week-view-events';\nimport { ResourcesWeekViewRow } from './ResourcesWeekViewRow';\nimport classes from './ResourcesWeekView.module.css';\n\nexport type ResourcesWeekViewStylesNames =\n | 'resourcesWeekView'\n | 'resourcesWeekViewRoot'\n | 'resourcesWeekViewInner'\n | 'resourcesWeekViewHeaderRows'\n | 'resourcesWeekViewHeaderContent'\n | 'resourcesWeekViewDayLabelsRow'\n | 'resourcesWeekViewDayLabel'\n | 'resourcesWeekViewTimeLabelsRow'\n | 'resourcesWeekViewScrollArea'\n | 'resourcesWeekViewCorner'\n | 'resourcesWeekViewTimeLabel'\n | 'resourcesWeekViewResourceLabel'\n | 'resourcesWeekViewRow'\n | 'resourcesWeekViewRowSlot'\n | 'resourcesWeekViewRowSlots'\n | 'resourcesWeekViewBackgroundEvent'\n | 'resourcesWeekViewAllDayEvent'\n | 'resourcesWeekViewCurrentTimeIndicator'\n | 'resourcesWeekViewCurrentTimeIndicatorLine'\n | 'resourcesWeekViewCurrentTimeIndicatorThumb'\n | 'resourcesWeekViewCurrentTimeIndicatorTimeBubble'\n | 'resourcesWeekViewEventWrapper'\n | 'resourcesWeekViewResizeHandle'\n | 'resourcesWeekViewGroupColumn'\n | 'resourcesWeekViewGroupColumnEmpty'\n | MoreEventsStylesNames\n | CombinedScheduleHeaderStylesNames;\n\nexport type ResourcesWeekViewCssVariables = {\n resourcesWeekView:\n | '--resources-week-view-radius'\n | '--resources-week-view-slot-width'\n | '--resources-week-view-row-height'\n | '--resources-week-view-group-label-width';\n};\n\nexport interface ResourcesWeekViewProps\n extends BoxProps, StylesApiProps<ResourcesWeekViewFactory>, ElementProps<'div'> {\n __staticSelector?: string;\n date: Date | string;\n onDateChange?: (value: DateStringValue) => void;\n resources: ScheduleResourceData[];\n startTime?: string;\n endTime?: string;\n intervalMinutes?: number;\n slotLabelFormat?: DateLabelFormat;\n radius?: MantineRadius;\n /** Date and time to scroll to on initial render, in `YYYY-MM-DD HH:mm:ss` format */\n startScrollDateTime?: string;\n scrollAreaProps?: Partial<ScrollAreaProps> & DataAttributes;\n locale?: string;\n withCurrentTimeIndicator?: boolean;\n withCurrentTimeBubble?: boolean;\n withHeader?: boolean;\n onViewChange?: (view: ScheduleViewLevel) => void;\n previousControlProps?: React.ComponentProps<'button'> & DataAttributes;\n nextControlProps?: React.ComponentProps<'button'> & DataAttributes;\n todayControlProps?: React.ComponentProps<'button'> & DataAttributes;\n viewSelectProps?: Partial<ViewSelectProps> & DataAttributes;\n weekLabelFormat?: DateLabelFormat;\n renderWeekLabel?: (params: {\n weekStart: DateStringValue;\n weekEnd: DateStringValue;\n }) => React.ReactNode;\n events?: ScheduleEventData[];\n slotWidth?: React.CSSProperties['width'];\n rowHeight?: React.CSSProperties['height'];\n labels?: ScheduleLabelsOverride;\n highlightBusinessHours?: boolean;\n businessHours?: [string, string];\n renderEventBody?: RenderEventBody;\n renderEvent?: RenderEvent;\n renderResourceLabel?: (resource: ScheduleResourceData) => React.ReactNode;\n\n /** List of resource groups to display as a column to the left of resource labels */\n groups?: ScheduleResourceGroup[];\n\n /** Function to customize group label rendering */\n renderGroupLabel?: (group: ScheduleResourceGroup) => React.ReactNode;\n\n /** Width of the group label column @default 80px */\n groupLabelWidth?: React.CSSProperties['width'];\n\n withEventsDragAndDrop?: boolean;\n onEventDrop?: (data: {\n eventId: string | number;\n newStart: DateTimeStringValue;\n newEnd: DateTimeStringValue;\n event: ScheduleEventData;\n resourceId?: string | number;\n }) => void;\n canDragEvent?: (event: ScheduleEventData) => boolean;\n onEventDragStart?: (event: ScheduleEventData) => void;\n onEventDragEnd?: () => void;\n onTimeSlotClick?: (data: {\n slotStart: DateTimeStringValue;\n slotEnd: DateTimeStringValue;\n nativeEvent: React.MouseEvent<HTMLButtonElement>;\n resourceId?: string | number;\n }) => void;\n onEventClick?: (event: ScheduleEventData, e: React.MouseEvent<HTMLButtonElement>) => void;\n withDragSlotSelect?: boolean;\n onSlotDragEnd?: (data: {\n rangeStart: DateTimeStringValue;\n rangeEnd: DateTimeStringValue;\n resourceId?: string | number;\n }) => void;\n mode?: ScheduleMode;\n onExternalEventDrop?: (data: {\n dataTransfer: DataTransfer;\n dropDateTime: DateTimeStringValue;\n resourceId?: string | number;\n }) => void;\n\n /** If true, events can be resized by dragging their left/right edges @default false */\n withEventResize?: boolean;\n\n /** Called when event is resized */\n onEventResize?: (data: {\n eventId: string | number;\n newStart: DateTimeStringValue;\n newEnd: DateTimeStringValue;\n event: ScheduleEventData;\n }) => void;\n\n /** Function to determine if event can be resized */\n canResizeEvent?: (event: ScheduleEventData) => boolean;\n\n recurrenceExpansionLimit?: number;\n\n /** Maximum number of events visible per time slot before \"+more\" indicator shows, minimum value is 1 @default 2 */\n maxEventsPerTimeSlot?: number;\n\n /** Props passed down to `MoreEvents` component */\n moreEventsProps?: Partial<MoreEventsProps>;\n\n firstDayOfWeek?: DayOfWeek;\n weekendDays?: DayOfWeek[];\n withWeekendDays?: boolean;\n weekdayFormat?: DateLabelFormat;\n highlightToday?: boolean;\n}\n\nexport type ResourcesWeekViewFactory = Factory<{\n props: ResourcesWeekViewProps;\n ref: HTMLDivElement;\n stylesNames: ResourcesWeekViewStylesNames;\n vars: ResourcesWeekViewCssVariables;\n}>;\n\nconst defaultProps = {\n __staticSelector: 'ResourcesWeekView',\n startTime: '00:00:00',\n endTime: '23:59:59',\n slotLabelFormat: 'HH:mm',\n intervalMinutes: 60,\n withHeader: true,\n weekLabelFormat: 'MMM DD',\n weekdayFormat: 'ddd D',\n highlightBusinessHours: false,\n businessHours: ['09:00:00', '17:00:00'],\n withEventsDragAndDrop: false,\n withEventResize: false,\n withDragSlotSelect: false,\n withWeekendDays: true,\n withCurrentTimeBubble: true,\n highlightToday: true,\n mode: 'default',\n maxEventsPerTimeSlot: 2,\n} satisfies Partial<ResourcesWeekViewProps>;\n\nconst varsResolver = createVarsResolver<ResourcesWeekViewFactory>(\n (_theme, { radius, slotWidth, rowHeight, groupLabelWidth }) => ({\n resourcesWeekView: {\n '--resources-week-view-radius': radius ? getRadius(radius) : undefined,\n '--resources-week-view-slot-width': rem(slotWidth),\n '--resources-week-view-row-height': rem(rowHeight),\n '--resources-week-view-group-label-width': rem(groupLabelWidth),\n },\n })\n);\n\nexport const ResourcesWeekView = factory<ResourcesWeekViewFactory>((_props) => {\n const props = useProps('ResourcesWeekView', defaultProps, _props);\n const {\n classNames,\n className,\n style,\n styles,\n unstyled,\n attributes,\n vars,\n startTime,\n endTime,\n date,\n onDateChange,\n resources,\n intervalMinutes,\n slotLabelFormat,\n radius,\n startScrollDateTime,\n scrollAreaProps,\n locale,\n withCurrentTimeIndicator: _withCurrentTimeIndicator,\n withCurrentTimeBubble,\n __staticSelector,\n withHeader,\n onViewChange,\n previousControlProps,\n nextControlProps,\n todayControlProps,\n viewSelectProps,\n weekLabelFormat,\n renderWeekLabel,\n events,\n slotWidth,\n rowHeight,\n labels,\n highlightBusinessHours,\n businessHours,\n renderEventBody,\n renderEvent,\n renderResourceLabel,\n groups,\n renderGroupLabel,\n groupLabelWidth,\n withEventsDragAndDrop,\n onEventDrop,\n canDragEvent,\n onEventDragStart,\n onEventDragEnd,\n withEventResize,\n onEventResize,\n canResizeEvent,\n onTimeSlotClick,\n onEventClick,\n withDragSlotSelect,\n onSlotDragEnd,\n mode,\n onExternalEventDrop,\n recurrenceExpansionLimit,\n maxEventsPerTimeSlot: _maxEventsPerTimeSlot,\n moreEventsProps,\n firstDayOfWeek,\n weekendDays,\n withWeekendDays,\n weekdayFormat,\n highlightToday,\n ...others\n } = props;\n\n const maxEventsPerTimeSlot =\n _maxEventsPerTimeSlot !== undefined ? Math.max(1, _maxEventsPerTimeSlot) : undefined;\n\n const getStyles = useStyles<ResourcesWeekViewFactory>({\n name: __staticSelector,\n classes,\n props,\n className,\n style,\n classNames,\n styles,\n unstyled,\n vars,\n varsResolver,\n attributes,\n rootSelector: 'resourcesWeekView',\n });\n\n const { resolvedClassNames, resolvedStyles } = useResolvedStylesApi<ResourcesWeekViewFactory>({\n classNames,\n styles,\n props,\n });\n\n const stylesApiProps = {\n classNames: resolvedClassNames,\n styles: resolvedStyles,\n attributes,\n __staticSelector,\n radius,\n };\n\n const theme = useMantineTheme();\n const [scrolled, setScrolled] = useState(false);\n const [scrolledX, setScrolledX] = useState(false);\n const ctx = useDatesContext();\n const slots = getDayTimeIntervals({ startTime, endTime, intervalMinutes });\n const { orderedResources, groupRanges, resourceGroupMap } = useMemo(\n () => getOrderedResources(resources, groups),\n [resources, groups]\n );\n const hasGroups = groupRanges.length > 0;\n\n const weekdays = useMemo(\n () =>\n getWeekDays({\n week: date,\n withWeekendDays,\n weekendDays: ctx.getWeekendDays(weekendDays),\n firstDayOfWeek: ctx.getFirstDayOfWeek(firstDayOfWeek),\n }),\n [date, withWeekendDays, weekendDays, firstDayOfWeek, ctx]\n );\n\n const totalSlotsPerDay = slots.length;\n\n const isToday = weekdays.some((day) => dayjs(day).isSame(dayjs(), 'day'));\n const withCurrentTimeIndicator = _withCurrentTimeIndicator ?? isToday;\n\n const [timeIndicatorOffset, setTimeIndicatorOffset] = useState(\n getCurrentTimePosition({ startTime, endTime, intervalMinutes })\n );\n useInterval(\n () => setTimeIndicatorOffset(getCurrentTimePosition({ startTime, endTime, intervalMinutes })),\n 60000,\n { autoInvoke: true }\n );\n\n const todayDayIndex = weekdays.findIndex((day) => dayjs(day).isSame(dayjs(), 'day'));\n const showTimeIndicator =\n withCurrentTimeIndicator &&\n todayDayIndex >= 0 &&\n isInTimeRange({ date: dayjs().toDate(), startTime, endTime });\n const formattedCurrentTime = withCurrentTimeBubble\n ? formatDate({ locale: ctx.getLocale(locale), date: dayjs(), format: slotLabelFormat })\n : '';\n\n type DropTargetSlot = { resourceId: string | number; slotIndex: number };\n\n const handleExternalDrop = useCallback(\n (e: React.DragEvent, target: DropTargetSlot) => {\n if (!onExternalEventDrop) {\n return;\n }\n const dayIndex = Math.floor(target.slotIndex / totalSlotsPerDay);\n const slotInDay = target.slotIndex % totalSlotsPerDay;\n const slotDay = weekdays[dayIndex];\n if (slotDay) {\n onExternalEventDrop({\n dataTransfer: e.dataTransfer,\n dropDateTime: `${dayjs(slotDay).format('YYYY-MM-DD')} ${slots[slotInDay].startTime}`,\n resourceId: target.resourceId,\n });\n }\n },\n [onExternalEventDrop, slots, weekdays, totalSlotsPerDay]\n );\n\n const lastDropResourceId = useRef<string | number | undefined>(undefined);\n\n const handleInternalEventDrop = useCallback(\n (data: {\n eventId: string | number;\n newStart: DateTimeStringValue;\n newEnd: DateTimeStringValue;\n event: ScheduleEventData;\n }) => {\n onEventDrop?.({ ...data, resourceId: lastDropResourceId.current });\n },\n [onEventDrop]\n );\n\n const dragDrop = useDragDropHandlers<DropTargetSlot>({\n enabled: withEventsDragAndDrop,\n mode,\n onEventDrop: handleInternalEventDrop,\n canDragEvent,\n onEventDragStart,\n onEventDragEnd,\n calculateDropTarget: (target: DropTargetSlot, draggedEvent: ScheduleEventData) => {\n lastDropResourceId.current = target.resourceId;\n const dayIndex = Math.floor(target.slotIndex / totalSlotsPerDay);\n const slotInDay = target.slotIndex % totalSlotsPerDay;\n const slotTime = slots[slotInDay].startTime;\n const targetDay = weekdays[dayIndex] || weekdays[0];\n return calculateDropTime({\n draggedEvent,\n targetDate: targetDay,\n targetSlotTime: slotTime,\n intervalMinutes,\n });\n },\n onExternalDrop: onExternalEventDrop ? handleExternalDrop : undefined,\n });\n\n const groupToResourceId = useMemo(() => getGroupToResourceIdMap(resources), [resources]);\n\n const slotDragSelect = useSlotDragSelect({\n enabled: withDragSlotSelect && mode !== 'static',\n onDragEnd: (startIndex, endIndex, group) => {\n if (!onSlotDragEnd) {\n return;\n }\n const startDayIndex = Math.floor(startIndex / totalSlotsPerDay);\n const startSlotInDay = startIndex % totalSlotsPerDay;\n const endDayIndex = Math.floor(endIndex / totalSlotsPerDay);\n const endSlotInDay = endIndex % totalSlotsPerDay;\n const startDay = weekdays[startDayIndex];\n const endDay = weekdays[endDayIndex];\n if (startDay && endDay) {\n onSlotDragEnd({\n rangeStart: `${dayjs(startDay).format('YYYY-MM-DD')} ${slots[startSlotInDay].startTime}`,\n rangeEnd: `${dayjs(endDay).format('YYYY-MM-DD')} ${slots[endSlotInDay].endTime}`,\n resourceId: groupToResourceId.get(group) ?? group,\n });\n }\n },\n });\n\n const eventResize = useHorizontalEventResize({\n enabled: withEventResize,\n mode,\n startTime,\n endTime,\n intervalMinutes,\n onEventResize,\n canResizeEvent,\n });\n\n const withDragHandlers = (withEventsDragAndDrop || !!onExternalEventDrop) && mode !== 'static';\n\n const handleTimeSlotClick = (\n resourceId: string | number,\n day: string,\n slotTime: string,\n e: React.MouseEvent<HTMLButtonElement>\n ) => {\n if (!onTimeSlotClick) {\n return;\n }\n const slotIndex = slots.findIndex((s) => s.startTime === slotTime);\n if (slotIndex === -1) {\n return;\n }\n const slot = slots[slotIndex];\n const dayStr = dayjs(day).format('YYYY-MM-DD');\n onTimeSlotClick({\n slotStart: `${dayStr} ${slot.startTime}`,\n slotEnd: `${dayStr} ${slot.endTime}`,\n nativeEvent: e,\n resourceId,\n });\n };\n\n const weekViewEvents = useMemo(\n () =>\n getResourcesWeekViewEvents({\n events,\n resources,\n weekdays,\n startTime,\n endTime,\n expansionLimit: recurrenceExpansionLimit,\n }),\n [events, resources, weekdays, startTime, endTime, recurrenceExpansionLimit]\n );\n\n const dayLabels = weekdays.map((day) => {\n const d = dayjs(day);\n const today = d.isSame(dayjs(), 'day') && highlightToday;\n const weekend = ctx.getWeekendDays(weekendDays).includes(d.day() as DayOfWeek);\n\n return (\n <Box\n {...getStyles('resourcesWeekViewDayLabel')}\n key={day}\n mod={{ today, weekend }}\n style={{ width: `calc(var(--resources-week-view-slot-width) * ${totalSlotsPerDay})` }}\n >\n {formatDate({ date: d, locale: ctx.getLocale(locale), format: weekdayFormat })}\n </Box>\n );\n });\n\n const timeLabels = weekdays.flatMap((day) =>\n slots.map((interval) => {\n const dayStr = dayjs(day).format('YYYY-MM-DD');\n const intervalTime = dayjs(`${dayStr} ${interval.startTime}`);\n const label = formatDate({\n date: intervalTime,\n locale: ctx.getLocale(locale),\n format: slotLabelFormat,\n });\n\n return (\n <Box\n {...getStyles('resourcesWeekViewTimeLabel')}\n key={`${day}-${interval.startTime}`}\n mod={{\n 'hour-start': interval.isHourStart,\n ...getBusinessHoursMod({\n time: interval.startTime,\n businessHours,\n highlightBusinessHours,\n }),\n }}\n >\n {label}\n </Box>\n );\n })\n );\n\n const slotsRef: ResourcesGridControlsRef = useRef<HTMLButtonElement[][]>([]);\n const rowSlotsContainersRef = useRef<(HTMLDivElement | null)[]>([]);\n const viewportRef = useRef<HTMLDivElement>(null);\n const mergedViewportRef = useMergedRef(viewportRef, scrollAreaProps?.viewportRef);\n\n const firstSlotIndex = { resourceIndex: 0, slotIndex: 0 };\n\n useIsomorphicEffect(() => {\n if (!startScrollDateTime || !viewportRef.current) {\n return;\n }\n const parsed = dayjs(startScrollDateTime);\n const targetDayStr = parsed.format('YYYY-MM-DD 00:00:00');\n const targetTime = parsed.format('HH:mm:ss');\n const dayIndex = weekdays.indexOf(targetDayStr);\n if (dayIndex < 0) {\n return;\n }\n const slotInDay = slots.findIndex((s) => s.startTime >= targetTime);\n if (slotInDay < 0) {\n return;\n }\n const flatIndex = dayIndex * totalSlotsPerDay + slotInDay;\n const firstResourceSlots = slotsRef.current[0];\n if (!firstResourceSlots || firstResourceSlots.length === 0) {\n return;\n }\n const targetSlot = firstResourceSlots[flatIndex];\n if (!targetSlot) {\n return;\n }\n const slotRect = targetSlot.getBoundingClientRect();\n const viewportRect = viewportRef.current.getBoundingClientRect();\n const cornerEl = viewportRef.current.querySelector(`.${classes.resourcesWeekViewCorner}`);\n const labelWidth = cornerEl ? cornerEl.getBoundingClientRect().width : 0;\n viewportRef.current.scrollTo({\n left: slotRect.left - viewportRect.left - labelWidth,\n top: 0,\n });\n }, []);\n\n const getSlotIndexFromDragPoint = useCallback((event: React.DragEvent, resourceIndex: number) => {\n return getIndexFromDragPoint(slotsRef.current[resourceIndex] ?? [], event.clientX);\n }, []);\n\n const handleSlotKeyDown = (\n event: React.KeyboardEvent<HTMLButtonElement>,\n resourceIndex: number,\n slotIndex: number\n ) => {\n handleResourcesGridKeyDown({\n controlsRef: slotsRef,\n resourceIndex,\n slotIndex,\n event,\n });\n };\n\n const dayWidthPercent = 100 / weekdays.length;\n\n const rows = orderedResources.map((resource, resourceIndex) => {\n const eventNodes: React.ReactNode[] = [];\n const resourceAllDayBars = weekViewEvents.allDayBars[resource.id] ?? [];\n const maxAllDayCount = resourceAllDayBars.reduce((max, bar) => Math.max(max, bar.row + 1), 0);\n\n weekdays.forEach((day, dayIndex) => {\n const dayEvents = weekViewEvents.byDay[day];\n if (!dayEvents) {\n return;\n }\n\n const dayOffsetPercent = (dayIndex / weekdays.length) * 100;\n\n const bgEvents = [\n ...(dayEvents.backgroundTimedEvents[resource.id] || []),\n ...(dayEvents.backgroundAllDayEvents[resource.id] || []),\n ];\n for (const event of bgEvents) {\n const colors = theme.variantColorResolver({\n color: event.color || theme.primaryColor,\n theme,\n variant: 'light',\n autoContrast: true,\n });\n\n const bgEventBody =\n typeof renderEventBody === 'function' ? renderEventBody(event) : event.title;\n\n const bgEventProps = {\n key: `bg-${event.id}-${day}`,\n ...getStyles('resourcesWeekViewBackgroundEvent', {\n style: {\n left: `${dayOffsetPercent + (event.position.top / 100) * dayWidthPercent}%`,\n width: `${(event.position.height / 100) * dayWidthPercent}%`,\n top: 0,\n height: '100%',\n },\n }),\n __vars: {\n '--bg-event-bg': colors.background,\n '--bg-event-color': colors.color,\n },\n children: bgEventBody,\n };\n\n if (typeof renderEvent === 'function') {\n eventNodes.push(renderEvent(event, bgEventProps as any));\n } else {\n eventNodes.push(<Box {...bgEventProps} />);\n }\n }\n\n const allRegularEvents = (dayEvents.regularEvents[resource.id] || []).filter(\n (event) => !isAllDayEvent({ event, date: day })\n );\n\n const visibleEvents =\n maxEventsPerTimeSlot !== undefined\n ? allRegularEvents.filter((event) => event.position.column < maxEventsPerTimeSlot)\n : allRegularEvents;\n\n for (const event of visibleEvents) {\n const isDraggable = dragDrop.isDraggableEvent(event);\n const isResizable = eventResize.isResizableEvent(event);\n const resizePosition = eventResize.getResizePosition(event.id);\n const isThisEventResizing = resizePosition !== null;\n const activeEdge =\n isThisEventResizing && eventResize.resizingEdge ? eventResize.resizingEdge : null;\n\n const effectiveTop = resizePosition ? resizePosition.left : event.position.top;\n const effectiveHeight = resizePosition ? resizePosition.width : event.position.height;\n const eventLeft = dayOffsetPercent + (effectiveTop / 100) * dayWidthPercent;\n const eventWidth = (effectiveHeight / 100) * dayWidthPercent;\n\n const eventColors = isResizable\n ? theme.variantColorResolver({\n color: event.color || theme.primaryColor,\n theme,\n variant: event.variant || 'light',\n autoContrast: true,\n })\n : null;\n\n const adjustPosition =\n maxEventsPerTimeSlot !== undefined && event.position.overlaps > maxEventsPerTimeSlot;\n\n const eventDate = dayjs(day).format('YYYY-MM-DD');\n\n eventNodes.push(\n <Box\n key={`${event.id}-${day}`}\n {...getStyles('resourcesWeekViewEventWrapper')}\n __vars={eventColors ? { '--event-color': eventColors.color } : undefined}\n data-resizing={isThisEventResizing || undefined}\n style={{\n left: `calc(${eventLeft}% + 1px)`,\n top: adjustPosition\n ? `calc((100% - 22px) * ${event.position.column} / ${maxEventsPerTimeSlot})`\n : `${event.position.offset}%`,\n width: `calc(${eventWidth}% - 2px)`,\n height: adjustPosition\n ? `calc((100% - 22px) / ${maxEventsPerTimeSlot})`\n : `${event.position.width}%`,\n }}\n >\n <ScheduleEvent\n event={event}\n autoSize\n nowrap\n draggable={isDraggable}\n isResizing={isThisEventResizing}\n renderEventBody={renderEventBody}\n renderEvent={renderEvent}\n radius={radius}\n mode={mode}\n onClick={\n onEventClick\n ? (e) => {\n if (!eventResize.wasResizing()) {\n onEventClick(event, e);\n }\n }\n : undefined\n }\n style={{ width: '100%', height: '100%' }}\n />\n {isResizable && mode !== 'static' && (\n <>\n <div\n {...getStyles('resourcesWeekViewResizeHandle')}\n data-edge=\"start\"\n data-active={activeEdge === 'start' || undefined}\n onPointerDown={(e) => {\n const container = rowSlotsContainersRef.current[resourceIndex];\n if (container) {\n eventResize.handleResizeStart({\n event,\n edge: 'start',\n container,\n originalLeft: event.position.top,\n originalWidth: event.position.height,\n eventDate,\n dayIndex,\n dayCount: weekdays.length,\n pointerEvent: e,\n });\n }\n }}\n />\n <div\n {...getStyles('resourcesWeekViewResizeHandle')}\n data-edge=\"end\"\n data-active={activeEdge === 'end' || undefined}\n onPointerDown={(e) => {\n const container = rowSlotsContainersRef.current[resourceIndex];\n if (container) {\n eventResize.handleResizeStart({\n event,\n edge: 'end',\n container,\n originalLeft: event.position.top,\n originalWidth: event.position.height,\n eventDate,\n dayIndex,\n dayCount: weekdays.length,\n pointerEvent: e,\n });\n }\n }}\n />\n </>\n )}\n </Box>\n );\n }\n\n if (maxEventsPerTimeSlot !== undefined) {\n const clusters = getOverlapClusters(allRegularEvents);\n for (const cluster of clusters) {\n const hiddenCount = cluster.filter(\n (e) => e.position.column >= maxEventsPerTimeSlot\n ).length;\n\n if (hiddenCount > 0 && mode !== 'static') {\n const leftPercent =\n dayOffsetPercent +\n (Math.min(...cluster.map((e) => e.position.top)) / 100) * dayWidthPercent;\n const rightPercent =\n dayOffsetPercent +\n (Math.max(...cluster.map((e) => e.position.top + e.position.height)) / 100) *\n dayWidthPercent;\n\n eventNodes.push(\n <MoreEvents\n key={`more-${resource.id}-${day}-${cluster[0].id}`}\n events={cluster}\n moreEventsCount={hiddenCount}\n mode={mode}\n labels={labels}\n renderEventBody={renderEventBody}\n renderEvent={renderEvent}\n onEventClick={onEventClick}\n style={{\n position: 'absolute',\n left: `calc(${leftPercent}% + 1px)`,\n width: `calc(${rightPercent - leftPercent}% - 2px)`,\n bottom: 0,\n height: '22px',\n paddingInline: 4,\n zIndex: 4,\n }}\n {...stylesApiProps}\n {...moreEventsProps}\n />\n );\n }\n }\n }\n });\n\n const stickyLabelOffset = hasGroups\n ? 'calc(var(--resources-week-view-group-label-width) + var(--resources-week-view-resource-label-width) + 5px)'\n : 'calc(var(--resources-week-view-resource-label-width) + 5px)';\n\n resourceAllDayBars.forEach((bar) => {\n const leftPercent = bar.startDayIndex * dayWidthPercent;\n const widthPercent = (bar.endDayIndex - bar.startDayIndex + 1) * dayWidthPercent;\n\n eventNodes.push(\n <div\n key={`all-day-${bar.event.id}-${bar.startDayIndex}`}\n {...getStyles('resourcesWeekViewAllDayEvent', {\n style: {\n left: `calc(${leftPercent}% + 1px)`,\n width: `calc(${widthPercent}% - 2px)`,\n top: `calc(${bar.row} * (var(--resources-week-view-all-day-height) + 2px) + 2px)`,\n },\n })}\n >\n <ScheduleEvent\n event={bar.event}\n autoSize\n nowrap\n renderEventBody={(barEvent) => (\n <span\n style={{\n position: 'sticky',\n insetInlineStart: stickyLabelOffset,\n display: 'inline-block',\n maxWidth: '100%',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n }}\n >\n {renderEventBody ? renderEventBody(barEvent) : barEvent.title}\n </span>\n )}\n renderEvent={renderEvent}\n radius={radius}\n mode={mode}\n onClick={onEventClick ? (e) => onEventClick(bar.event, e) : undefined}\n style={{ width: '100%', height: '100%', overflow: 'visible' }}\n styles={{\n eventInner: {\n display: 'block',\n overflow: 'visible',\n lineHeight: 'var(--resources-week-view-all-day-height)',\n },\n }}\n />\n </div>\n );\n });\n\n return (\n <ResourcesWeekViewRow\n key={resource.id}\n resource={resource}\n resourceIndex={resourceIndex}\n weekdays={weekdays}\n slots={slots}\n getStyles={getStyles}\n labels={labels}\n highlightBusinessHours={highlightBusinessHours}\n businessHours={businessHours}\n withEventsDragAndDrop={withDragHandlers}\n mode={mode}\n slotsRef={slotsRef}\n firstSlotIndex={firstSlotIndex}\n onSlotKeyDown={handleSlotKeyDown}\n onSlotClick={handleTimeSlotClick}\n onRowSlotsDragOver={(event, resourceId, resIdx) => {\n const slotIndex = getSlotIndexFromDragPoint(event, resIdx);\n if (slotIndex !== null) {\n dragDrop.handleDragOver(event, { resourceId, slotIndex });\n }\n }}\n onRowSlotsDragLeave={dragDrop.handleDragLeave}\n onRowSlotsDrop={(event, resourceId, resIdx) => {\n const slotIndex = getSlotIndexFromDragPoint(event, resIdx);\n if (slotIndex !== null) {\n dragDrop.handleDrop(event, { resourceId, slotIndex });\n }\n }}\n dropTargetSlotIndex={\n dragDrop.dropTarget?.resourceId === resource.id\n ? dragDrop.dropTarget.slotIndex\n : undefined\n }\n withDragSlotSelect={withDragSlotSelect}\n onSlotPointerDown={slotDragSelect.handleSlotPointerDown}\n isSlotDragSelected={slotDragSelect.isSlotSelected}\n rowSlotsContainerRef={(node) => {\n rowSlotsContainersRef.current[resourceIndex] = node;\n }}\n renderResourceLabel={renderResourceLabel}\n renderGroupLabel={renderGroupLabel}\n scrolledX={scrolledX}\n groupInfo={hasGroups ? resourceGroupMap[resourceIndex] : undefined}\n allDayCount={maxAllDayCount}\n >\n {eventNodes}\n </ResourcesWeekViewRow>\n );\n });\n\n const headerLabel = getWeekLabel({\n weekdays,\n locale: ctx.getLocale(locale),\n weekLabelFormat: weekLabelFormat!,\n renderWeekLabel,\n });\n\n const indicatorLeftPercent =\n todayDayIndex >= 0 ? ((todayDayIndex + timeIndicatorOffset / 100) / weekdays.length) * 100 : 0;\n\n const content = (\n <Box\n {...getStyles('resourcesWeekView')}\n mod={{\n static: mode === 'static',\n 'slot-dragging': slotDragSelect.isDragging,\n resizing: eventResize.isResizing,\n 'event-interaction': eventResize.isResizing || dragDrop.dragContextValue.isDragging,\n }}\n {...others}\n >\n {withHeader && (\n <ScheduleHeaderBase\n view=\"week\"\n navigationHandlers={{\n previous: () => previousWeek(date, ctx.getFirstDayOfWeek(firstDayOfWeek)),\n next: () => nextWeek(date, ctx.getFirstDayOfWeek(firstDayOfWeek)),\n today: () => toDateString(dayjs()),\n }}\n control={{\n miw: 180,\n title: headerLabel,\n }}\n labels={labels}\n onDateChange={onDateChange}\n onViewChange={onViewChange}\n previousControlProps={previousControlProps}\n nextControlProps={nextControlProps}\n todayControlProps={todayControlProps}\n viewSelectProps={{ views: ['day', 'week', 'month'] as const, ...viewSelectProps }}\n stylesApiProps={stylesApiProps}\n />\n )}\n\n <Box {...getStyles('resourcesWeekViewRoot')}>\n <ScrollArea\n scrollbarSize={4}\n {...scrollAreaProps}\n {...getStyles('resourcesWeekViewScrollArea', {\n className: scrollAreaProps?.className,\n style: scrollAreaProps?.style,\n })}\n onScrollPositionChange={(position) => {\n scrollAreaProps?.onScrollPositionChange?.(position);\n setScrolled(position.y !== 0);\n setScrolledX(position.x !== 0);\n }}\n viewportRef={mergedViewportRef}\n >\n <div {...getStyles('resourcesWeekViewInner')}>\n <div {...getStyles('resourcesWeekViewHeaderRows')}>\n <div\n {...getStyles('resourcesWeekViewCorner')}\n key=\"corner\"\n style={\n hasGroups\n ? {\n flexBasis:\n 'calc(var(--resources-week-view-resource-label-width) + var(--resources-week-view-group-label-width))',\n minWidth:\n 'calc(var(--resources-week-view-resource-label-width) + var(--resources-week-view-group-label-width))',\n }\n : undefined\n }\n >\n {getLabel('resources', labels)}\n </div>\n <div {...getStyles('resourcesWeekViewHeaderContent')}>\n <div {...getStyles('resourcesWeekViewDayLabelsRow')}>{dayLabels}</div>\n <Box {...getStyles('resourcesWeekViewTimeLabelsRow')} mod={{ scrolled }}>\n {timeLabels}\n </Box>\n </div>\n </div>\n\n {rows}\n\n {showTimeIndicator && (\n <Box\n {...getStyles('resourcesWeekViewCurrentTimeIndicator')}\n __vars={{\n '--indicator-left-offset': hasGroups\n ? `calc(var(--resources-week-view-resource-label-width) + var(--resources-week-view-group-label-width) + (100% - var(--resources-week-view-resource-label-width) - var(--resources-week-view-group-label-width)) * ${indicatorLeftPercent} / 100)`\n : `calc(var(--resources-week-view-resource-label-width) + (100% - var(--resources-week-view-resource-label-width)) * ${indicatorLeftPercent} / 100)`,\n '--_time-bubble-width': formattedCurrentTime\n ?.toString()\n .toLowerCase()\n .includes('m')\n ? '64px'\n : '46px',\n }}\n >\n {withCurrentTimeBubble && (\n <div {...getStyles('resourcesWeekViewCurrentTimeIndicatorTimeBubble')}>\n {formattedCurrentTime}\n </div>\n )}\n {!withCurrentTimeBubble && (\n <div {...getStyles('resourcesWeekViewCurrentTimeIndicatorThumb')} />\n )}\n <div {...getStyles('resourcesWeekViewCurrentTimeIndicatorLine')} />\n </Box>\n )}\n </div>\n </ScrollArea>\n </Box>\n </Box>\n );\n\n const dragContextValue = useMemo<DragContextValue>(\n () => dragDrop.dragContextValue,\n [dragDrop.dragContextValue]\n );\n\n if (withEventsDragAndDrop) {\n return <DragContext.Provider value={dragContextValue}>{content}</DragContext.Provider>;\n }\n\n return content;\n});\n\nResourcesWeekView.displayName = '@mantine/schedule/ResourcesWeekView';\nResourcesWeekView.classes = classes;\nResourcesWeekView.varsResolver = varsResolver;\n"],"mappings":"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"}
1
+ {"version":3,"file":"ResourcesWeekView.cjs","names":["getDayTimeIntervals","getOrderedResources","getWeekDays","getCurrentTimePosition","isInTimeRange","formatDate","useDragDropHandlers","calculateDropTime","getGroupToResourceIdMap","useSlotDragSelect","useHorizontalEventResize","getResourcesWeekViewEvents","Box","getBusinessHoursMod","classes","getIndexFromDragPoint","isAllDayEvent","getTimeAxisEventStyle","ScheduleEvent","getOverlapClusters","MoreEvents","ResourcesWeekViewRow","getWeekLabel","ScheduleHeaderBase","previousWeek","nextWeek","toDateString","ScrollArea","getLabel","DragContext"],"sources":["../../../src/components/ResourcesWeekView/ResourcesWeekView.tsx"],"sourcesContent":["import dayjs from 'dayjs';\nimport { useCallback, useMemo, useRef, useState } from 'react';\nimport {\n Box,\n BoxProps,\n createVarsResolver,\n DataAttributes,\n ElementProps,\n factory,\n Factory,\n getRadius,\n MantineRadius,\n rem,\n ScrollArea,\n ScrollAreaProps,\n StylesApiProps,\n useMantineTheme,\n useProps,\n useResolvedStylesApi,\n useStyles,\n} from '@mantine/core';\nimport { useDatesContext } from '@mantine/dates';\nimport { useInterval, useIsomorphicEffect, useMergedRef } from '@mantine/hooks';\nimport { useDragDropHandlers } from '../../hooks/use-drag-drop-handlers';\nimport { useHorizontalEventResize } from '../../hooks/use-horizontal-event-resize';\nimport { useSlotDragSelect } from '../../hooks/use-slot-drag-select';\nimport { getLabel, ScheduleLabelsOverride } from '../../labels';\nimport {\n AnyDateValue,\n DateLabelFormat,\n DateStringValue,\n DateTimeStringValue,\n DayOfWeek,\n ScheduleEventData,\n ScheduleMode,\n ScheduleResourceData,\n ScheduleResourceGroup,\n ScheduleViewLevel,\n} from '../../types';\nimport {\n calculateDropTime,\n formatDate,\n getBusinessHoursMod,\n getCurrentTimePosition,\n getDayTimeIntervals,\n getGroupToResourceIdMap,\n getIndexFromDragPoint,\n getOrderedResources,\n getTimeAxisEventStyle,\n getWeekDays,\n handleResourcesGridKeyDown,\n isAllDayEvent,\n isInTimeRange,\n nextWeek,\n previousWeek,\n ResourcesGridControlsRef,\n toDateString,\n} from '../../utils';\nimport { DragContext, DragContextValue } from '../DragContext/DragContext';\nimport { MoreEvents, MoreEventsProps, MoreEventsStylesNames } from '../MoreEvents/MoreEvents';\nimport { getOverlapClusters } from '../ResourcesDayView/get-overlap-clusters/get-overlap-clusters';\nimport { RenderEvent, RenderEventBody, ScheduleEvent } from '../ScheduleEvent/ScheduleEvent';\nimport { CombinedScheduleHeaderStylesNames } from '../ScheduleHeader/ScheduleHeader';\nimport { ScheduleHeaderBase } from '../ScheduleHeader/ScheduleHeaderBase';\nimport { ViewSelectProps } from '../ScheduleHeader/ViewSelect/ViewSelect';\nimport { getWeekLabel } from '../WeekView/get-week-label/get-week-label';\nimport { getResourcesWeekViewEvents } from './get-resources-week-view-events/get-resources-week-view-events';\nimport { ResourcesWeekViewRow } from './ResourcesWeekViewRow';\nimport classes from './ResourcesWeekView.module.css';\n\nexport type ResourcesWeekViewStylesNames =\n | 'resourcesWeekView'\n | 'resourcesWeekViewRoot'\n | 'resourcesWeekViewInner'\n | 'resourcesWeekViewHeaderRows'\n | 'resourcesWeekViewHeaderContent'\n | 'resourcesWeekViewDayLabelsRow'\n | 'resourcesWeekViewDayLabel'\n | 'resourcesWeekViewTimeLabelsRow'\n | 'resourcesWeekViewScrollArea'\n | 'resourcesWeekViewCorner'\n | 'resourcesWeekViewTimeLabel'\n | 'resourcesWeekViewResourceLabel'\n | 'resourcesWeekViewRow'\n | 'resourcesWeekViewRowSlot'\n | 'resourcesWeekViewRowSlots'\n | 'resourcesWeekViewBackgroundEvent'\n | 'resourcesWeekViewAllDayEvent'\n | 'resourcesWeekViewCurrentTimeIndicator'\n | 'resourcesWeekViewCurrentTimeIndicatorLine'\n | 'resourcesWeekViewCurrentTimeIndicatorThumb'\n | 'resourcesWeekViewCurrentTimeIndicatorTimeBubble'\n | 'resourcesWeekViewEventWrapper'\n | 'resourcesWeekViewResizeHandle'\n | 'resourcesWeekViewGroupColumn'\n | 'resourcesWeekViewGroupColumnEmpty'\n | MoreEventsStylesNames\n | CombinedScheduleHeaderStylesNames;\n\nexport type ResourcesWeekViewCssVariables = {\n resourcesWeekView:\n | '--resources-week-view-radius'\n | '--resources-week-view-slot-width'\n | '--resources-week-view-row-height'\n | '--resources-week-view-group-label-width';\n};\n\nexport interface ResourcesWeekViewProps\n extends BoxProps, StylesApiProps<ResourcesWeekViewFactory>, ElementProps<'div'> {\n __staticSelector?: string;\n date: Date | string;\n onDateChange?: (value: DateStringValue) => void;\n resources: ScheduleResourceData[];\n startTime?: string;\n endTime?: string;\n /** Number of minutes for each interval in the week view. Must divide evenly into an hour (e.g. `15`, `30`) or be a whole number of hours (e.g. `120`, `240`) @default 60 */\n intervalMinutes?: number;\n /** Minimum on-screen size of an event along the time axis, in px. Prevents very short events from collapsing. Larger values make brief events easier to see but extend them past their real start time. @default 1 */\n minEventSize?: number;\n slotLabelFormat?: DateLabelFormat;\n radius?: MantineRadius;\n /** Date and time to scroll to on initial render, in `YYYY-MM-DD HH:mm:ss` format */\n startScrollDateTime?: string;\n scrollAreaProps?: Partial<ScrollAreaProps> & DataAttributes;\n locale?: string;\n withCurrentTimeIndicator?: boolean;\n withCurrentTimeBubble?: boolean;\n\n /** A function to get the current time, called on every tick. Can be used to display the current time indicator in a different timezone. @default () => dayjs() */\n getCurrentTime?: () => AnyDateValue;\n\n withHeader?: boolean;\n onViewChange?: (view: ScheduleViewLevel) => void;\n previousControlProps?: React.ComponentProps<'button'> & DataAttributes;\n nextControlProps?: React.ComponentProps<'button'> & DataAttributes;\n todayControlProps?: React.ComponentProps<'button'> & DataAttributes;\n viewSelectProps?: Partial<ViewSelectProps> & DataAttributes;\n weekLabelFormat?: DateLabelFormat;\n renderWeekLabel?: (params: {\n weekStart: DateStringValue;\n weekEnd: DateStringValue;\n }) => React.ReactNode;\n events?: ScheduleEventData[];\n slotWidth?: React.CSSProperties['width'];\n rowHeight?: React.CSSProperties['height'];\n labels?: ScheduleLabelsOverride;\n highlightBusinessHours?: boolean;\n businessHours?: [string, string];\n renderEventBody?: RenderEventBody;\n renderEvent?: RenderEvent;\n renderResourceLabel?: (resource: ScheduleResourceData) => React.ReactNode;\n\n /** List of resource groups to display as a column to the left of resource labels */\n groups?: ScheduleResourceGroup[];\n\n /** Function to customize group label rendering */\n renderGroupLabel?: (group: ScheduleResourceGroup) => React.ReactNode;\n\n /** Width of the group label column @default 80px */\n groupLabelWidth?: React.CSSProperties['width'];\n\n withEventsDragAndDrop?: boolean;\n onEventDrop?: (data: {\n eventId: string | number;\n newStart: DateTimeStringValue;\n newEnd: DateTimeStringValue;\n event: ScheduleEventData;\n resourceId?: string | number;\n }) => void;\n canDragEvent?: (event: ScheduleEventData) => boolean;\n onEventDragStart?: (event: ScheduleEventData) => void;\n onEventDragEnd?: () => void;\n onTimeSlotClick?: (data: {\n slotStart: DateTimeStringValue;\n slotEnd: DateTimeStringValue;\n nativeEvent: React.MouseEvent<HTMLButtonElement>;\n resourceId?: string | number;\n }) => void;\n onEventClick?: (event: ScheduleEventData, e: React.MouseEvent<HTMLButtonElement>) => void;\n withDragSlotSelect?: boolean;\n onSlotDragEnd?: (data: {\n rangeStart: DateTimeStringValue;\n rangeEnd: DateTimeStringValue;\n resourceId?: string | number;\n }) => void;\n mode?: ScheduleMode;\n onExternalEventDrop?: (data: {\n dataTransfer: DataTransfer;\n dropDateTime: DateTimeStringValue;\n resourceId?: string | number;\n }) => void;\n\n /** If true, events can be resized by dragging their left/right edges @default false */\n withEventResize?: boolean;\n\n /** Called when event is resized */\n onEventResize?: (data: {\n eventId: string | number;\n newStart: DateTimeStringValue;\n newEnd: DateTimeStringValue;\n event: ScheduleEventData;\n }) => void;\n\n /** Function to determine if event can be resized */\n canResizeEvent?: (event: ScheduleEventData) => boolean;\n\n recurrenceExpansionLimit?: number;\n\n /** Maximum number of events visible per time slot before \"+more\" indicator shows, minimum value is 1 @default 2 */\n maxEventsPerTimeSlot?: number;\n\n /** Props passed down to `MoreEvents` component */\n moreEventsProps?: Partial<MoreEventsProps>;\n\n firstDayOfWeek?: DayOfWeek;\n weekendDays?: DayOfWeek[];\n withWeekendDays?: boolean;\n weekdayFormat?: DateLabelFormat;\n highlightToday?: boolean;\n}\n\nexport type ResourcesWeekViewFactory = Factory<{\n props: ResourcesWeekViewProps;\n ref: HTMLDivElement;\n stylesNames: ResourcesWeekViewStylesNames;\n vars: ResourcesWeekViewCssVariables;\n}>;\n\nconst defaultProps = {\n __staticSelector: 'ResourcesWeekView',\n startTime: '00:00:00',\n endTime: '23:59:59',\n slotLabelFormat: 'HH:mm',\n intervalMinutes: 60,\n minEventSize: 1,\n withHeader: true,\n weekLabelFormat: 'MMM DD',\n weekdayFormat: 'ddd D',\n highlightBusinessHours: false,\n businessHours: ['09:00:00', '17:00:00'],\n withEventsDragAndDrop: false,\n withEventResize: false,\n withDragSlotSelect: false,\n withWeekendDays: true,\n withCurrentTimeBubble: true,\n highlightToday: true,\n mode: 'default',\n maxEventsPerTimeSlot: 2,\n} satisfies Partial<ResourcesWeekViewProps>;\n\nconst varsResolver = createVarsResolver<ResourcesWeekViewFactory>(\n (_theme, { radius, slotWidth, rowHeight, groupLabelWidth }) => ({\n resourcesWeekView: {\n '--resources-week-view-radius': radius ? getRadius(radius) : undefined,\n '--resources-week-view-slot-width': rem(slotWidth),\n '--resources-week-view-row-height': rem(rowHeight),\n '--resources-week-view-group-label-width': rem(groupLabelWidth),\n },\n })\n);\n\nexport const ResourcesWeekView = factory<ResourcesWeekViewFactory>((_props) => {\n const props = useProps('ResourcesWeekView', defaultProps, _props);\n const {\n classNames,\n className,\n style,\n styles,\n unstyled,\n attributes,\n vars,\n startTime,\n endTime,\n date,\n onDateChange,\n resources,\n intervalMinutes,\n minEventSize,\n slotLabelFormat,\n radius,\n startScrollDateTime,\n scrollAreaProps,\n locale,\n withCurrentTimeIndicator: _withCurrentTimeIndicator,\n withCurrentTimeBubble,\n getCurrentTime,\n __staticSelector,\n withHeader,\n onViewChange,\n previousControlProps,\n nextControlProps,\n todayControlProps,\n viewSelectProps,\n weekLabelFormat,\n renderWeekLabel,\n events,\n slotWidth,\n rowHeight,\n labels,\n highlightBusinessHours,\n businessHours,\n renderEventBody,\n renderEvent,\n renderResourceLabel,\n groups,\n renderGroupLabel,\n groupLabelWidth,\n withEventsDragAndDrop,\n onEventDrop,\n canDragEvent,\n onEventDragStart,\n onEventDragEnd,\n withEventResize,\n onEventResize,\n canResizeEvent,\n onTimeSlotClick,\n onEventClick,\n withDragSlotSelect,\n onSlotDragEnd,\n mode,\n onExternalEventDrop,\n recurrenceExpansionLimit,\n maxEventsPerTimeSlot: _maxEventsPerTimeSlot,\n moreEventsProps,\n firstDayOfWeek,\n weekendDays,\n withWeekendDays,\n weekdayFormat,\n highlightToday,\n ...others\n } = props;\n\n const maxEventsPerTimeSlot =\n _maxEventsPerTimeSlot !== undefined ? Math.max(1, _maxEventsPerTimeSlot) : undefined;\n\n const getStyles = useStyles<ResourcesWeekViewFactory>({\n name: __staticSelector,\n classes,\n props,\n className,\n style,\n classNames,\n styles,\n unstyled,\n vars,\n varsResolver,\n attributes,\n rootSelector: 'resourcesWeekView',\n });\n\n const { resolvedClassNames, resolvedStyles } = useResolvedStylesApi<ResourcesWeekViewFactory>({\n classNames,\n styles,\n props,\n });\n\n const stylesApiProps = {\n classNames: resolvedClassNames,\n styles: resolvedStyles,\n attributes,\n __staticSelector,\n radius,\n };\n\n const theme = useMantineTheme();\n const [scrolled, setScrolled] = useState(false);\n const [scrolledX, setScrolledX] = useState(false);\n const ctx = useDatesContext();\n const slots = getDayTimeIntervals({ startTime, endTime, intervalMinutes });\n const { orderedResources, groupRanges, resourceGroupMap } = useMemo(\n () => getOrderedResources(resources, groups),\n [resources, groups]\n );\n const hasGroups = groupRanges.length > 0;\n\n const weekdays = useMemo(\n () =>\n getWeekDays({\n week: date,\n withWeekendDays,\n weekendDays: ctx.getWeekendDays(weekendDays),\n firstDayOfWeek: ctx.getFirstDayOfWeek(firstDayOfWeek),\n }),\n [date, withWeekendDays, weekendDays, firstDayOfWeek, ctx]\n );\n\n const totalSlotsPerDay = slots.length;\n\n const resolveNow = () => (getCurrentTime ? dayjs(getCurrentTime()) : dayjs());\n const now = resolveNow();\n const isToday = weekdays.some((day) => dayjs(day).isSame(now, 'day'));\n const withCurrentTimeIndicator = _withCurrentTimeIndicator ?? isToday;\n\n const [, setTimeIndicatorTick] = useState(0);\n useInterval(() => setTimeIndicatorTick((tick) => tick + 1), 60000, { autoInvoke: true });\n const timeIndicatorOffset = getCurrentTimePosition({ startTime, endTime, intervalMinutes, now });\n\n const todayDayIndex = weekdays.findIndex((day) => dayjs(day).isSame(now, 'day'));\n const showTimeIndicator =\n withCurrentTimeIndicator &&\n todayDayIndex >= 0 &&\n isInTimeRange({ date: now.toDate(), startTime, endTime });\n const formattedCurrentTime = withCurrentTimeBubble\n ? formatDate({ locale: ctx.getLocale(locale), date: now, format: slotLabelFormat })\n : '';\n\n type DropTargetSlot = { resourceId: string | number; slotIndex: number };\n\n const handleExternalDrop = useCallback(\n (e: React.DragEvent, target: DropTargetSlot) => {\n if (!onExternalEventDrop) {\n return;\n }\n const dayIndex = Math.floor(target.slotIndex / totalSlotsPerDay);\n const slotInDay = target.slotIndex % totalSlotsPerDay;\n const slotDay = weekdays[dayIndex];\n if (slotDay) {\n onExternalEventDrop({\n dataTransfer: e.dataTransfer,\n dropDateTime: `${dayjs(slotDay).format('YYYY-MM-DD')} ${slots[slotInDay].startTime}`,\n resourceId: target.resourceId,\n });\n }\n },\n [onExternalEventDrop, slots, weekdays, totalSlotsPerDay]\n );\n\n const lastDropResourceId = useRef<string | number | undefined>(undefined);\n\n const handleInternalEventDrop = useCallback(\n (data: {\n eventId: string | number;\n newStart: DateTimeStringValue;\n newEnd: DateTimeStringValue;\n event: ScheduleEventData;\n }) => {\n onEventDrop?.({ ...data, resourceId: lastDropResourceId.current });\n },\n [onEventDrop]\n );\n\n const dragDrop = useDragDropHandlers<DropTargetSlot>({\n enabled: withEventsDragAndDrop,\n mode,\n onEventDrop: handleInternalEventDrop,\n canDragEvent,\n onEventDragStart,\n onEventDragEnd,\n calculateDropTarget: (target: DropTargetSlot, draggedEvent: ScheduleEventData) => {\n lastDropResourceId.current = target.resourceId;\n const dayIndex = Math.floor(target.slotIndex / totalSlotsPerDay);\n const slotInDay = target.slotIndex % totalSlotsPerDay;\n const slotTime = slots[slotInDay].startTime;\n const targetDay = weekdays[dayIndex] || weekdays[0];\n return calculateDropTime({\n draggedEvent,\n targetDate: targetDay,\n targetSlotTime: slotTime,\n intervalMinutes,\n });\n },\n onExternalDrop: onExternalEventDrop ? handleExternalDrop : undefined,\n });\n\n const groupToResourceId = useMemo(() => getGroupToResourceIdMap(resources), [resources]);\n\n const slotDragSelect = useSlotDragSelect({\n enabled: withDragSlotSelect && mode !== 'static',\n onDragEnd: (startIndex, endIndex, group) => {\n if (!onSlotDragEnd) {\n return;\n }\n const startDayIndex = Math.floor(startIndex / totalSlotsPerDay);\n const startSlotInDay = startIndex % totalSlotsPerDay;\n const endDayIndex = Math.floor(endIndex / totalSlotsPerDay);\n const endSlotInDay = endIndex % totalSlotsPerDay;\n const startDay = weekdays[startDayIndex];\n const endDay = weekdays[endDayIndex];\n if (startDay && endDay) {\n onSlotDragEnd({\n rangeStart: `${dayjs(startDay).format('YYYY-MM-DD')} ${slots[startSlotInDay].startTime}`,\n rangeEnd: `${dayjs(endDay).format('YYYY-MM-DD')} ${slots[endSlotInDay].endTime}`,\n resourceId: groupToResourceId.get(group) ?? group,\n });\n }\n },\n });\n\n const eventResize = useHorizontalEventResize({\n enabled: withEventResize,\n mode,\n startTime,\n endTime,\n intervalMinutes,\n onEventResize,\n canResizeEvent,\n });\n\n const withDragHandlers = (withEventsDragAndDrop || !!onExternalEventDrop) && mode !== 'static';\n\n const handleTimeSlotClick = (\n resourceId: string | number,\n day: string,\n slotTime: string,\n e: React.MouseEvent<HTMLButtonElement>\n ) => {\n if (!onTimeSlotClick) {\n return;\n }\n const slotIndex = slots.findIndex((s) => s.startTime === slotTime);\n if (slotIndex === -1) {\n return;\n }\n const slot = slots[slotIndex];\n const dayStr = dayjs(day).format('YYYY-MM-DD');\n onTimeSlotClick({\n slotStart: `${dayStr} ${slot.startTime}`,\n slotEnd: `${dayStr} ${slot.endTime}`,\n nativeEvent: e,\n resourceId,\n });\n };\n\n const weekViewEvents = useMemo(\n () =>\n getResourcesWeekViewEvents({\n events,\n resources,\n weekdays,\n startTime,\n endTime,\n intervalMinutes,\n expansionLimit: recurrenceExpansionLimit,\n }),\n [events, resources, weekdays, startTime, endTime, intervalMinutes, recurrenceExpansionLimit]\n );\n\n const dayLabels = weekdays.map((day) => {\n const d = dayjs(day);\n const today = d.isSame(now, 'day') && highlightToday;\n const weekend = ctx.getWeekendDays(weekendDays).includes(d.day() as DayOfWeek);\n\n return (\n <Box\n {...getStyles('resourcesWeekViewDayLabel')}\n key={day}\n mod={{ today, weekend }}\n style={{ width: `calc(var(--resources-week-view-slot-width) * ${totalSlotsPerDay})` }}\n >\n {formatDate({ date: d, locale: ctx.getLocale(locale), format: weekdayFormat })}\n </Box>\n );\n });\n\n const timeLabels = weekdays.flatMap((day) =>\n slots.map((interval) => {\n const dayStr = dayjs(day).format('YYYY-MM-DD');\n const intervalTime = dayjs(`${dayStr} ${interval.startTime}`);\n const label = formatDate({\n date: intervalTime,\n locale: ctx.getLocale(locale),\n format: slotLabelFormat,\n });\n\n return (\n <Box\n {...getStyles('resourcesWeekViewTimeLabel')}\n key={`${day}-${interval.startTime}`}\n mod={{\n 'hour-start': interval.isHourStart,\n ...getBusinessHoursMod({\n time: interval.startTime,\n businessHours,\n highlightBusinessHours,\n }),\n }}\n >\n {label}\n </Box>\n );\n })\n );\n\n const slotsRef: ResourcesGridControlsRef = useRef<HTMLButtonElement[][]>([]);\n const rowSlotsContainersRef = useRef<(HTMLDivElement | null)[]>([]);\n const viewportRef = useRef<HTMLDivElement>(null);\n const mergedViewportRef = useMergedRef(viewportRef, scrollAreaProps?.viewportRef);\n\n const firstSlotIndex = { resourceIndex: 0, slotIndex: 0 };\n\n useIsomorphicEffect(() => {\n if (!startScrollDateTime || !viewportRef.current) {\n return;\n }\n const parsed = dayjs(startScrollDateTime);\n const targetDayStr = parsed.format('YYYY-MM-DD 00:00:00');\n const targetTime = parsed.format('HH:mm:ss');\n const dayIndex = weekdays.indexOf(targetDayStr);\n if (dayIndex < 0) {\n return;\n }\n const slotInDay = slots.findIndex((s) => s.startTime >= targetTime);\n if (slotInDay < 0) {\n return;\n }\n const flatIndex = dayIndex * totalSlotsPerDay + slotInDay;\n const firstResourceSlots = slotsRef.current[0];\n if (!firstResourceSlots || firstResourceSlots.length === 0) {\n return;\n }\n const targetSlot = firstResourceSlots[flatIndex];\n if (!targetSlot) {\n return;\n }\n const slotRect = targetSlot.getBoundingClientRect();\n const viewportRect = viewportRef.current.getBoundingClientRect();\n const cornerEl = viewportRef.current.querySelector(`.${classes.resourcesWeekViewCorner}`);\n const labelWidth = cornerEl ? cornerEl.getBoundingClientRect().width : 0;\n viewportRef.current.scrollTo({\n left: slotRect.left - viewportRect.left - labelWidth,\n top: 0,\n });\n }, []);\n\n const getSlotIndexFromDragPoint = useCallback((event: React.DragEvent, resourceIndex: number) => {\n return getIndexFromDragPoint(slotsRef.current[resourceIndex] ?? [], event.clientX);\n }, []);\n\n const handleSlotKeyDown = (\n event: React.KeyboardEvent<HTMLButtonElement>,\n resourceIndex: number,\n slotIndex: number\n ) => {\n handleResourcesGridKeyDown({\n controlsRef: slotsRef,\n resourceIndex,\n slotIndex,\n event,\n });\n };\n\n const dayWidthPercent = 100 / weekdays.length;\n\n const rows = orderedResources.map((resource, resourceIndex) => {\n const eventNodes: React.ReactNode[] = [];\n const resourceAllDayBars = weekViewEvents.allDayBars[resource.id] ?? [];\n const maxAllDayCount = resourceAllDayBars.reduce((max, bar) => Math.max(max, bar.row + 1), 0);\n\n weekdays.forEach((day, dayIndex) => {\n const dayEvents = weekViewEvents.byDay[day];\n if (!dayEvents) {\n return;\n }\n\n const dayOffsetPercent = (dayIndex / weekdays.length) * 100;\n\n const bgEvents = [\n ...(dayEvents.backgroundTimedEvents[resource.id] || []),\n ...(dayEvents.backgroundAllDayEvents[resource.id] || []),\n ];\n for (const event of bgEvents) {\n const colors = theme.variantColorResolver({\n color: event.color || theme.primaryColor,\n theme,\n variant: 'light',\n autoContrast: true,\n });\n\n const bgEventBody =\n typeof renderEventBody === 'function' ? renderEventBody(event) : event.title;\n\n const bgEventProps = {\n key: `bg-${event.id}-${day}`,\n ...getStyles('resourcesWeekViewBackgroundEvent', {\n style: {\n left: `${dayOffsetPercent + (event.position.top / 100) * dayWidthPercent}%`,\n width: `${(event.position.height / 100) * dayWidthPercent}%`,\n top: 0,\n height: '100%',\n },\n }),\n __vars: {\n '--bg-event-bg': colors.background,\n '--bg-event-color': colors.color,\n },\n children: bgEventBody,\n };\n\n if (typeof renderEvent === 'function') {\n eventNodes.push(renderEvent(event, bgEventProps as any));\n } else {\n eventNodes.push(<Box {...bgEventProps} />);\n }\n }\n\n const allRegularEvents = (dayEvents.regularEvents[resource.id] || []).filter(\n (event) => !isAllDayEvent({ event, date: day })\n );\n\n const visibleEvents =\n maxEventsPerTimeSlot !== undefined\n ? allRegularEvents.filter((event) => event.position.column < maxEventsPerTimeSlot)\n : allRegularEvents;\n\n for (const event of visibleEvents) {\n const isDraggable = dragDrop.isDraggableEvent(event);\n const isResizable = eventResize.isResizableEvent(event);\n const resizePosition = eventResize.getResizePosition(event.id);\n const isThisEventResizing = resizePosition !== null;\n const activeEdge =\n isThisEventResizing && eventResize.resizingEdge ? eventResize.resizingEdge : null;\n\n const effectiveTop = resizePosition ? resizePosition.left : event.position.top;\n const effectiveHeight = resizePosition ? resizePosition.width : event.position.height;\n const eventLeft = dayOffsetPercent + (effectiveTop / 100) * dayWidthPercent;\n const eventWidth = (effectiveHeight / 100) * dayWidthPercent;\n\n const eventColors = isResizable\n ? theme.variantColorResolver({\n color: event.color || theme.primaryColor,\n theme,\n variant: event.variant || 'light',\n autoContrast: true,\n })\n : null;\n\n const adjustPosition =\n maxEventsPerTimeSlot !== undefined && event.position.overlaps > maxEventsPerTimeSlot;\n\n const eventDate = dayjs(day).format('YYYY-MM-DD');\n\n eventNodes.push(\n <Box\n key={`${event.id}-${day}`}\n {...getStyles('resourcesWeekViewEventWrapper')}\n __vars={eventColors ? { '--event-color': eventColors.color } : undefined}\n data-resizing={isThisEventResizing || undefined}\n style={{\n ...getTimeAxisEventStyle({\n start: eventLeft,\n span: eventWidth,\n minSize: minEventSize,\n }),\n top: adjustPosition\n ? `calc((100% - 22px) * ${event.position.column} / ${maxEventsPerTimeSlot})`\n : `${event.position.offset}%`,\n height: adjustPosition\n ? `calc((100% - 22px) / ${maxEventsPerTimeSlot})`\n : `${event.position.width}%`,\n }}\n >\n <ScheduleEvent\n event={event}\n autoSize\n nowrap\n draggable={isDraggable}\n isResizing={isThisEventResizing}\n renderEventBody={renderEventBody}\n renderEvent={renderEvent}\n radius={radius}\n mode={mode}\n onClick={\n onEventClick\n ? (e) => {\n if (!eventResize.wasResizing()) {\n onEventClick(event, e);\n }\n }\n : undefined\n }\n style={{ width: '100%', height: '100%', padding: 0 }}\n />\n {isResizable && mode !== 'static' && (\n <>\n <div\n {...getStyles('resourcesWeekViewResizeHandle')}\n data-edge=\"start\"\n data-active={activeEdge === 'start' || undefined}\n onPointerDown={(e) => {\n const container = rowSlotsContainersRef.current[resourceIndex];\n if (container) {\n eventResize.handleResizeStart({\n event,\n edge: 'start',\n container,\n originalLeft: event.position.top,\n originalWidth: event.position.height,\n eventDate,\n dayIndex,\n dayCount: weekdays.length,\n pointerEvent: e,\n });\n }\n }}\n />\n <div\n {...getStyles('resourcesWeekViewResizeHandle')}\n data-edge=\"end\"\n data-active={activeEdge === 'end' || undefined}\n onPointerDown={(e) => {\n const container = rowSlotsContainersRef.current[resourceIndex];\n if (container) {\n eventResize.handleResizeStart({\n event,\n edge: 'end',\n container,\n originalLeft: event.position.top,\n originalWidth: event.position.height,\n eventDate,\n dayIndex,\n dayCount: weekdays.length,\n pointerEvent: e,\n });\n }\n }}\n />\n </>\n )}\n </Box>\n );\n }\n\n if (maxEventsPerTimeSlot !== undefined) {\n const clusters = getOverlapClusters(allRegularEvents);\n for (const cluster of clusters) {\n const hiddenCount = cluster.filter(\n (e) => e.position.column >= maxEventsPerTimeSlot\n ).length;\n\n if (hiddenCount > 0 && mode !== 'static') {\n const leftPercent =\n dayOffsetPercent +\n (Math.min(...cluster.map((e) => e.position.top)) / 100) * dayWidthPercent;\n const rightPercent =\n dayOffsetPercent +\n (Math.max(...cluster.map((e) => e.position.top + e.position.height)) / 100) *\n dayWidthPercent;\n\n eventNodes.push(\n <MoreEvents\n key={`more-${resource.id}-${day}-${cluster[0].id}`}\n events={cluster}\n moreEventsCount={hiddenCount}\n mode={mode}\n labels={labels}\n renderEventBody={renderEventBody}\n renderEvent={renderEvent}\n onEventClick={onEventClick}\n style={{\n position: 'absolute',\n left: `calc(${leftPercent}% + 1px)`,\n width: `calc(${rightPercent - leftPercent}% - 2px)`,\n bottom: 0,\n height: '22px',\n paddingInline: 4,\n zIndex: 4,\n }}\n {...stylesApiProps}\n {...moreEventsProps}\n />\n );\n }\n }\n }\n });\n\n const stickyLabelOffset = hasGroups\n ? 'calc(var(--resources-week-view-group-label-width) + var(--resources-week-view-resource-label-width) + 5px)'\n : 'calc(var(--resources-week-view-resource-label-width) + 5px)';\n\n resourceAllDayBars.forEach((bar) => {\n const leftPercent = bar.startDayIndex * dayWidthPercent;\n const widthPercent = (bar.endDayIndex - bar.startDayIndex + 1) * dayWidthPercent;\n\n eventNodes.push(\n <div\n key={`all-day-${bar.event.id}-${bar.startDayIndex}`}\n {...getStyles('resourcesWeekViewAllDayEvent', {\n style: {\n left: `calc(${leftPercent}% + 1px)`,\n width: `calc(${widthPercent}% - 2px)`,\n top: `calc(${bar.row} * (var(--resources-week-view-all-day-height) + 2px) + 2px)`,\n },\n })}\n >\n <ScheduleEvent\n event={bar.event}\n autoSize\n nowrap\n renderEventBody={(barEvent) => (\n <span\n style={{\n position: 'sticky',\n insetInlineStart: stickyLabelOffset,\n display: 'inline-block',\n maxWidth: '100%',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n }}\n >\n {renderEventBody ? renderEventBody(barEvent) : barEvent.title}\n </span>\n )}\n renderEvent={renderEvent}\n radius={radius}\n mode={mode}\n onClick={onEventClick ? (e) => onEventClick(bar.event, e) : undefined}\n style={{ width: '100%', height: '100%', overflow: 'visible' }}\n styles={{\n eventInner: {\n display: 'block',\n overflow: 'visible',\n lineHeight: 'var(--resources-week-view-all-day-height)',\n },\n }}\n />\n </div>\n );\n });\n\n return (\n <ResourcesWeekViewRow\n key={resource.id}\n resource={resource}\n resourceIndex={resourceIndex}\n weekdays={weekdays}\n slots={slots}\n getStyles={getStyles}\n labels={labels}\n highlightBusinessHours={highlightBusinessHours}\n businessHours={businessHours}\n withEventsDragAndDrop={withDragHandlers}\n mode={mode}\n slotsRef={slotsRef}\n firstSlotIndex={firstSlotIndex}\n onSlotKeyDown={handleSlotKeyDown}\n onSlotClick={handleTimeSlotClick}\n onRowSlotsDragOver={(event, resourceId, resIdx) => {\n const slotIndex = getSlotIndexFromDragPoint(event, resIdx);\n if (slotIndex !== null) {\n dragDrop.handleDragOver(event, { resourceId, slotIndex });\n }\n }}\n onRowSlotsDragLeave={dragDrop.handleDragLeave}\n onRowSlotsDrop={(event, resourceId, resIdx) => {\n const slotIndex = getSlotIndexFromDragPoint(event, resIdx);\n if (slotIndex !== null) {\n dragDrop.handleDrop(event, { resourceId, slotIndex });\n }\n }}\n dropTargetSlotIndex={\n dragDrop.dropTarget?.resourceId === resource.id\n ? dragDrop.dropTarget.slotIndex\n : undefined\n }\n withDragSlotSelect={withDragSlotSelect}\n onSlotPointerDown={slotDragSelect.handleSlotPointerDown}\n isSlotDragSelected={slotDragSelect.isSlotSelected}\n rowSlotsContainerRef={(node) => {\n rowSlotsContainersRef.current[resourceIndex] = node;\n }}\n renderResourceLabel={renderResourceLabel}\n renderGroupLabel={renderGroupLabel}\n scrolledX={scrolledX}\n groupInfo={hasGroups ? resourceGroupMap[resourceIndex] : undefined}\n allDayCount={maxAllDayCount}\n >\n {eventNodes}\n </ResourcesWeekViewRow>\n );\n });\n\n const headerLabel = getWeekLabel({\n weekdays,\n locale: ctx.getLocale(locale),\n weekLabelFormat: weekLabelFormat!,\n renderWeekLabel,\n });\n\n const indicatorLeftPercent =\n todayDayIndex >= 0 ? ((todayDayIndex + timeIndicatorOffset / 100) / weekdays.length) * 100 : 0;\n\n const content = (\n <Box\n {...getStyles('resourcesWeekView')}\n mod={{\n static: mode === 'static',\n 'slot-dragging': slotDragSelect.isDragging,\n resizing: eventResize.isResizing,\n 'event-interaction': eventResize.isResizing || dragDrop.dragContextValue.isDragging,\n }}\n {...others}\n >\n {withHeader && (\n <ScheduleHeaderBase\n view=\"week\"\n navigationHandlers={{\n previous: () => previousWeek(date, ctx.getFirstDayOfWeek(firstDayOfWeek)),\n next: () => nextWeek(date, ctx.getFirstDayOfWeek(firstDayOfWeek)),\n today: () => toDateString(resolveNow()),\n }}\n control={{\n miw: 180,\n title: headerLabel,\n }}\n labels={labels}\n onDateChange={onDateChange}\n onViewChange={onViewChange}\n previousControlProps={previousControlProps}\n nextControlProps={nextControlProps}\n todayControlProps={todayControlProps}\n viewSelectProps={{ views: ['day', 'week', 'month'] as const, ...viewSelectProps }}\n stylesApiProps={stylesApiProps}\n />\n )}\n\n <Box {...getStyles('resourcesWeekViewRoot')}>\n <ScrollArea\n scrollbarSize={4}\n {...scrollAreaProps}\n {...getStyles('resourcesWeekViewScrollArea', {\n className: scrollAreaProps?.className,\n style: scrollAreaProps?.style,\n })}\n onScrollPositionChange={(position) => {\n scrollAreaProps?.onScrollPositionChange?.(position);\n setScrolled(position.y !== 0);\n setScrolledX(position.x !== 0);\n }}\n viewportRef={mergedViewportRef}\n >\n <div {...getStyles('resourcesWeekViewInner')}>\n <div {...getStyles('resourcesWeekViewHeaderRows')}>\n <div\n {...getStyles('resourcesWeekViewCorner')}\n key=\"corner\"\n style={\n hasGroups\n ? {\n flexBasis:\n 'calc(var(--resources-week-view-resource-label-width) + var(--resources-week-view-group-label-width))',\n minWidth:\n 'calc(var(--resources-week-view-resource-label-width) + var(--resources-week-view-group-label-width))',\n }\n : undefined\n }\n >\n {getLabel('resources', labels)}\n </div>\n <div {...getStyles('resourcesWeekViewHeaderContent')}>\n <div {...getStyles('resourcesWeekViewDayLabelsRow')}>{dayLabels}</div>\n <Box {...getStyles('resourcesWeekViewTimeLabelsRow')} mod={{ scrolled }}>\n {timeLabels}\n </Box>\n </div>\n </div>\n\n {rows}\n\n {showTimeIndicator && (\n <Box\n {...getStyles('resourcesWeekViewCurrentTimeIndicator')}\n __vars={{\n '--indicator-left-offset': hasGroups\n ? `calc(var(--resources-week-view-resource-label-width) + var(--resources-week-view-group-label-width) + (100% - var(--resources-week-view-resource-label-width) - var(--resources-week-view-group-label-width)) * ${indicatorLeftPercent} / 100)`\n : `calc(var(--resources-week-view-resource-label-width) + (100% - var(--resources-week-view-resource-label-width)) * ${indicatorLeftPercent} / 100)`,\n '--_time-bubble-width': formattedCurrentTime\n ?.toString()\n .toLowerCase()\n .includes('m')\n ? '64px'\n : '46px',\n }}\n >\n {withCurrentTimeBubble && (\n <div {...getStyles('resourcesWeekViewCurrentTimeIndicatorTimeBubble')}>\n {formattedCurrentTime}\n </div>\n )}\n {!withCurrentTimeBubble && (\n <div {...getStyles('resourcesWeekViewCurrentTimeIndicatorThumb')} />\n )}\n <div {...getStyles('resourcesWeekViewCurrentTimeIndicatorLine')} />\n </Box>\n )}\n </div>\n </ScrollArea>\n </Box>\n </Box>\n );\n\n const dragContextValue = useMemo<DragContextValue>(\n () => dragDrop.dragContextValue,\n [dragDrop.dragContextValue]\n );\n\n if (withEventsDragAndDrop) {\n return <DragContext.Provider value={dragContextValue}>{content}</DragContext.Provider>;\n }\n\n return content;\n});\n\nResourcesWeekView.displayName = '@mantine/schedule/ResourcesWeekView';\nResourcesWeekView.classes = classes;\nResourcesWeekView.varsResolver = varsResolver;\n"],"mappings":"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"}
@@ -23,7 +23,7 @@ function assignAllDayRows(bars) {
23
23
  bar.row = row;
24
24
  }
25
25
  }
26
- function getResourcesWeekViewEvents({ events, resources, weekdays, startTime, endTime, expansionLimit }) {
26
+ function getResourcesWeekViewEvents({ events, resources, weekdays, startTime, endTime, intervalMinutes, expansionLimit }) {
27
27
  const expandedEvents = require_expand_recurring_events.expandRecurringEvents({
28
28
  events,
29
29
  rangeStart: (0, dayjs.default)(weekdays[0]).startOf("day").toDate(),
@@ -57,7 +57,8 @@ function getResourcesWeekViewEvents({ events, resources, weekdays, startTime, en
57
57
  resources,
58
58
  date: day,
59
59
  startTime,
60
- endTime
60
+ endTime,
61
+ intervalMinutes
61
62
  });
62
63
  }
63
64
  const allDayBars = {};
@@ -1 +1 @@
1
- {"version":3,"file":"get-resources-week-view-events.cjs","names":["expandRecurringEvents","isMultidayEvent","getResourcesDayViewEvents","calculateEventDays","getEventEndDate"],"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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"}
1
+ {"version":3,"file":"get-resources-week-view-events.cjs","names":["expandRecurringEvents","isMultidayEvent","getResourcesDayViewEvents","calculateEventDays","getEventEndDate"],"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 intervalMinutes?: number;\n expansionLimit?: number;\n}\n\nexport function getResourcesWeekViewEvents({\n events,\n resources,\n weekdays,\n startTime,\n endTime,\n intervalMinutes,\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 intervalMinutes,\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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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ScheduleEvent.module.cjs","names":[],"sources":["../../../src/components/ScheduleEvent/ScheduleEvent.module.css"],"sourcesContent":[".event {\n padding: 1px;\n pointer-events: none;\n display: flex;\n flex-direction: column;\n flex: 1 0 auto;\n position: relative;\n z-index: 3;\n\n &:where([data-auto-size]) {\n container-type: size;\n }\n\n &:where([data-draggable]) .eventInner {\n cursor: grab;\n\n &:active {\n cursor: grabbing;\n }\n }\n\n &:where([data-dragging]) {\n opacity: 0.2;\n\n .eventInner {\n cursor: grabbing;\n }\n }\n\n &:where([data-any-dragging]:not([data-dragging])) {\n pointer-events: none;\n\n .eventInner {\n pointer-events: none;\n }\n }\n\n &:where([data-static]) {\n pointer-events: none;\n cursor: default;\n }\n\n &:where([data-resizing]) {\n z-index: 10;\n\n .eventInner {\n @mixin hover {\n background-color: var(--event-bg);\n }\n }\n }\n\n &:where([data-hanging='start'], [data-hanging='both']) {\n &::before {\n content: '';\n position: absolute;\n inset-block: 2px;\n inset-inline-start: 2px;\n width: 2px;\n background-color: var(--event-color);\n border-radius: 10px;\n opacity: 0.3;\n }\n\n .eventInner {\n padding-inline-start: 6px;\n border-start-start-radius: 0;\n border-end-start-radius: 0;\n }\n }\n\n &:where([data-hanging='end'], [data-hanging='both']) {\n &::after {\n content: '';\n position: absolute;\n inset-block: 2px;\n inset-inline-end: 2px;\n width: 2px;\n background-color: var(--event-color);\n border-radius: 10px;\n opacity: 0.3;\n }\n\n .eventInner {\n padding-inline-end: 6px;\n border-start-end-radius: 0;\n border-end-end-radius: 0;\n }\n }\n\n &:where([data-clip-start]) {\n .eventInner {\n padding-inline-start: 12px;\n border-start-start-radius: 0;\n border-end-start-radius: 0;\n clip-path: polygon(10px 0, 100% 0, 100% 100%, 10px 100%, 0 50%);\n }\n }\n\n &:where([data-clip-end]) {\n .eventInner {\n padding-inline-end: 12px;\n border-start-end-radius: 0;\n border-end-end-radius: 0;\n clip-path: polygon(0 0, calc(100% - 10px) 0, 100% 50%, calc(100% - 10px) 100%, 0 100%);\n }\n }\n\n &:where([data-clip-start][data-clip-end]) {\n .eventInner {\n clip-path: polygon(\n 10px 0,\n calc(100% - 10px) 0,\n 100% 50%,\n calc(100% - 10px) 100%,\n 10px 100%,\n 0 50%\n );\n }\n }\n}\n\n.eventInner {\n background-color: var(--event-bg);\n color: var(--event-color);\n pointer-events: all;\n border-radius: var(--event-radius);\n font-weight: var(--mantine-font-weight-medium);\n font-size: 12px;\n line-height: 1;\n padding: 3px 4px;\n width: 100%;\n height: 100%;\n cursor: pointer;\n user-select: none;\n overflow: hidden;\n\n &:where([data-nowrap]) {\n white-space: nowrap;\n text-overflow: ellipsis;\n line-height: 1.25;\n }\n\n &:where([data-size='md']) {\n font-size: 14px;\n padding: 4px 6px;\n }\n\n @mixin hover {\n background-color: var(--event-hover);\n }\n\n &:where([data-auto-size]) {\n @container (max-height: 18px) {\n font-size: 9px;\n padding-block: 0px;\n display: flex;\n flex-direction: column;\n justify-content: center;\n }\n }\n\n .event[data-static] & {\n cursor: default;\n pointer-events: none;\n\n @mixin hover {\n background-color: var(--event-bg);\n }\n }\n\n :where([data-slot-dragging]) & {\n pointer-events: none;\n }\n}\n\n.eventResizeHandle {\n position: absolute;\n left: 50%;\n transform: translateX(-50%);\n width: 40%;\n max-width: 40px;\n height: 4px;\n border-radius: 2px;\n cursor: ns-resize;\n pointer-events: all;\n z-index: 4;\n touch-action: none;\n background-color: var(--event-color);\n opacity: 0;\n transition: opacity 100ms ease;\n\n &::before {\n content: '';\n position: absolute;\n inset: -4px -6px;\n }\n\n &:where([data-edge='top']) {\n top: -2px;\n }\n\n &:where([data-edge='bottom']) {\n bottom: -2px;\n }\n\n .event:where(:hover, [data-resizing]) & {\n opacity: 0.5;\n }\n\n @mixin hover {\n opacity: 0.8;\n }\n}\n"],"mappings":""}
1
+ {"version":3,"file":"ScheduleEvent.module.cjs","names":[],"sources":["../../../src/components/ScheduleEvent/ScheduleEvent.module.css"],"sourcesContent":[".event {\n padding: 1px;\n pointer-events: none;\n display: flex;\n flex-direction: column;\n flex: 1 0 auto;\n position: relative;\n z-index: 3;\n\n &:where([data-auto-size]) {\n container-type: size;\n }\n\n &:where([data-draggable]) .eventInner {\n cursor: grab;\n\n &:active {\n cursor: grabbing;\n }\n }\n\n &:where([data-dragging]) {\n opacity: 0.2;\n\n .eventInner {\n cursor: grabbing;\n }\n }\n\n &:where([data-any-dragging]:not([data-dragging])) {\n pointer-events: none;\n\n .eventInner {\n pointer-events: none;\n }\n }\n\n &:where([data-static]) {\n pointer-events: none;\n cursor: default;\n }\n\n &:where([data-resizing]) {\n z-index: 10;\n\n .eventInner {\n @mixin hover {\n background-color: var(--event-bg);\n }\n }\n }\n\n &:where([data-hanging='start'], [data-hanging='both']) {\n &::before {\n content: '';\n position: absolute;\n inset-block: 2px;\n inset-inline-start: 2px;\n width: 2px;\n background-color: var(--event-color);\n border-radius: 10px;\n opacity: 0.3;\n }\n\n .eventInner {\n padding-inline-start: 6px;\n border-start-start-radius: 0;\n border-end-start-radius: 0;\n }\n }\n\n &:where([data-hanging='end'], [data-hanging='both']) {\n &::after {\n content: '';\n position: absolute;\n inset-block: 2px;\n inset-inline-end: 2px;\n width: 2px;\n background-color: var(--event-color);\n border-radius: 10px;\n opacity: 0.3;\n }\n\n .eventInner {\n padding-inline-end: 6px;\n border-start-end-radius: 0;\n border-end-end-radius: 0;\n }\n }\n\n &:where([data-clip-start]) {\n .eventInner {\n padding-inline-start: 12px;\n border-start-start-radius: 0;\n border-end-start-radius: 0;\n clip-path: polygon(10px 0, 100% 0, 100% 100%, 10px 100%, 0 50%);\n }\n }\n\n &:where([data-clip-end]) {\n .eventInner {\n padding-inline-end: 12px;\n border-start-end-radius: 0;\n border-end-end-radius: 0;\n clip-path: polygon(0 0, calc(100% - 10px) 0, 100% 50%, calc(100% - 10px) 100%, 0 100%);\n }\n }\n\n &:where([data-clip-start][data-clip-end]) {\n .eventInner {\n clip-path: polygon(\n 10px 0,\n calc(100% - 10px) 0,\n 100% 50%,\n calc(100% - 10px) 100%,\n 10px 100%,\n 0 50%\n );\n }\n }\n}\n\n.eventInner {\n background-color: var(--event-bg);\n color: var(--event-color);\n pointer-events: all;\n border-radius: min(var(--event-radius), 50%);\n font-weight: var(--mantine-font-weight-medium);\n font-size: 12px;\n line-height: 1;\n padding: 3px 4px;\n width: 100%;\n height: 100%;\n cursor: pointer;\n user-select: none;\n overflow: hidden;\n\n &:where([data-nowrap]) {\n white-space: nowrap;\n text-overflow: ellipsis;\n line-height: 1.25;\n }\n\n &:where([data-size='md']) {\n font-size: 14px;\n padding: 4px 6px;\n }\n\n @mixin hover {\n background-color: var(--event-hover);\n }\n\n &:where([data-auto-size]) {\n @container (max-width: 12px) {\n padding-inline: 0;\n }\n\n @container (min-width: 16px) {\n width: calc(100% - 2px);\n margin-inline: auto;\n }\n\n @container (max-height: 18px) {\n font-size: 9px;\n padding-block: 0px;\n display: flex;\n flex-direction: column;\n justify-content: center;\n }\n }\n\n .event[data-static] & {\n cursor: default;\n pointer-events: none;\n\n @mixin hover {\n background-color: var(--event-bg);\n }\n }\n\n :where([data-slot-dragging]) & {\n pointer-events: none;\n }\n}\n\n.eventResizeHandle {\n position: absolute;\n left: 50%;\n transform: translateX(-50%);\n width: 40%;\n max-width: 40px;\n height: 4px;\n border-radius: 2px;\n cursor: ns-resize;\n pointer-events: all;\n z-index: 4;\n touch-action: none;\n background-color: var(--event-color);\n opacity: 0;\n transition: opacity 100ms ease;\n\n &::before {\n content: '';\n position: absolute;\n inset: -4px -6px;\n }\n\n &:where([data-edge='top']) {\n top: -2px;\n }\n\n &:where([data-edge='bottom']) {\n bottom: -2px;\n }\n\n .event:where(:hover, [data-resizing]) & {\n opacity: 0.5;\n }\n\n @mixin hover {\n opacity: 0.8;\n }\n}\n"],"mappings":""}
@@ -9,6 +9,7 @@ const require_get_week_days = require("../../utils/get-week-days/get-week-days.c
9
9
  const require_next_week = require("../../utils/next-week/next-week.cjs");
10
10
  const require_previous_week = require("../../utils/previous-week/previous-week.cjs");
11
11
  const require_is_all_day_event = require("../../utils/is-all-day-event/is-all-day-event.cjs");
12
+ const require_get_time_axis_event_style = require("../../utils/get-time-axis-event-style/get-time-axis-event-style.cjs");
12
13
  const require_calculate_drop_time = require("../../utils/calculate-drop-time/calculate-drop-time.cjs");
13
14
  const require_get_business_hours_mod = require("../../utils/get-business-hours-mod/get-business-hours-mod.cjs");
14
15
  const require_expand_recurring_events = require("../../utils/expand-recurring-events/expand-recurring-events.cjs");
@@ -388,10 +389,13 @@ const WeekView = (0, _mantine_core.factory)((_props) => {
388
389
  } : void 0,
389
390
  style: {
390
391
  position: "absolute",
391
- top: `calc(${eventTop}% + 1px)`,
392
+ ...require_get_time_axis_event_style.getTimeAxisEventStyle({
393
+ start: eventTop,
394
+ span: eventHeight,
395
+ axis: "vertical"
396
+ }),
392
397
  left: `${event.position.offset}%`,
393
- width: `${event.position.width}%`,
394
- height: `calc(${eventHeight}% - 1px)`
398
+ width: `${event.position.width}%`
395
399
  }
396
400
  }, event.id);
397
401
  });