@mantine/schedule 9.0.0-alpha.3 → 9.0.0-alpha.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cjs/components/CurrentTimeIndicator/CurrentTimeIndicator.cjs +1 -0
- package/cjs/components/CurrentTimeIndicator/CurrentTimeIndicator.cjs.map +1 -1
- package/cjs/components/DayView/DayView.cjs +146 -9
- package/cjs/components/DayView/DayView.cjs.map +1 -1
- package/cjs/components/DayView/DayView.module.css.cjs +1 -1
- package/cjs/components/DayView/get-day-view-events/get-day-positioned-events.cjs +1 -0
- package/cjs/components/DayView/get-day-view-events/get-day-positioned-events.cjs.map +1 -1
- package/cjs/components/DayView/get-day-view-events/get-day-view-events.cjs +62 -5
- package/cjs/components/DayView/get-day-view-events/get-day-view-events.cjs.map +1 -1
- package/cjs/components/MobileMonthView/MobileMonthView.cjs +9 -1
- package/cjs/components/MobileMonthView/MobileMonthView.cjs.map +1 -1
- package/cjs/components/MobileMonthView/get-mobile-month-view-events.cjs +4 -0
- package/cjs/components/MobileMonthView/get-mobile-month-view-events.cjs.map +1 -1
- package/cjs/components/MonthView/MonthView.cjs +76 -13
- package/cjs/components/MonthView/MonthView.cjs.map +1 -1
- package/cjs/components/MonthView/MonthView.module.css.cjs +1 -1
- package/cjs/components/MonthView/get-month-view-events/get-month-positioned-events.cjs +17 -1
- package/cjs/components/MonthView/get-month-view-events/get-month-positioned-events.cjs.map +1 -1
- package/cjs/components/MonthView/get-month-view-events/get-month-view-events.cjs +2 -1
- package/cjs/components/MonthView/get-month-view-events/get-month-view-events.cjs.map +1 -1
- package/cjs/components/MonthView/get-month-view-events/get-weeks-in-range.cjs +1 -0
- package/cjs/components/MonthView/get-month-view-events/get-weeks-in-range.cjs.map +1 -1
- package/cjs/components/Schedule/Schedule.cjs +11 -0
- package/cjs/components/Schedule/Schedule.cjs.map +1 -1
- package/cjs/components/ScheduleEvent/ScheduleEvent.cjs +36 -2
- package/cjs/components/ScheduleEvent/ScheduleEvent.cjs.map +1 -1
- package/cjs/components/ScheduleEvent/ScheduleEvent.module.css.cjs +1 -1
- package/cjs/components/ScheduleHeader/MonthYearSelect/MonthYearSelect.cjs +1 -0
- package/cjs/components/ScheduleHeader/MonthYearSelect/MonthYearSelect.cjs.map +1 -1
- package/cjs/components/ScheduleHeader/ScheduleHeader.cjs +1 -1
- package/cjs/components/ScheduleHeader/ScheduleHeader.cjs.map +1 -1
- package/cjs/components/ScheduleHeader/ScheduleHeaderBase.cjs.map +1 -1
- package/cjs/components/WeekView/WeekView.cjs +187 -18
- package/cjs/components/WeekView/WeekView.cjs.map +1 -1
- package/cjs/components/WeekView/WeekView.module.css.cjs +1 -1
- package/cjs/components/WeekView/WeekViewDay.cjs +4 -1
- package/cjs/components/WeekView/WeekViewDay.cjs.map +1 -1
- package/cjs/components/WeekView/get-week-label/get-week-label.cjs +1 -0
- package/cjs/components/WeekView/get-week-label/get-week-label.cjs.map +1 -1
- package/cjs/components/WeekView/get-week-view-events/assign-event-rows.cjs +1 -0
- package/cjs/components/WeekView/get-week-view-events/assign-event-rows.cjs.map +1 -1
- package/cjs/components/WeekView/get-week-view-events/calculate-regular-event-overlaps.cjs +1 -0
- package/cjs/components/WeekView/get-week-view-events/calculate-regular-event-overlaps.cjs.map +1 -1
- package/cjs/components/WeekView/get-week-view-events/filter-week-view-events.cjs +1 -0
- package/cjs/components/WeekView/get-week-view-events/filter-week-view-events.cjs.map +1 -1
- package/cjs/components/WeekView/get-week-view-events/find-available-column.cjs +1 -0
- package/cjs/components/WeekView/get-week-view-events/find-available-column.cjs.map +1 -1
- package/cjs/components/WeekView/get-week-view-events/get-week-positioned-events.cjs +47 -1
- package/cjs/components/WeekView/get-week-view-events/get-week-positioned-events.cjs.map +1 -1
- package/cjs/components/YearView/YearView.cjs +58 -55
- package/cjs/components/YearView/YearView.cjs.map +1 -1
- package/cjs/components/YearView/YearView.module.css.cjs +1 -1
- package/cjs/components/YearView/YearViewMonth.cjs +2 -0
- package/cjs/components/YearView/YearViewMonth.cjs.map +1 -1
- package/cjs/components/YearView/get-year-view-events/get-year-view-events.cjs +1 -0
- package/cjs/components/YearView/get-year-view-events/get-year-view-events.cjs.map +1 -1
- package/cjs/hooks/use-auto-scroll-on-drag.cjs +75 -0
- package/cjs/hooks/use-auto-scroll-on-drag.cjs.map +1 -0
- package/cjs/hooks/use-drag-drop-handlers.cjs +42 -19
- package/cjs/hooks/use-drag-drop-handlers.cjs.map +1 -1
- package/cjs/hooks/use-event-resize.cjs +165 -0
- package/cjs/hooks/use-event-resize.cjs.map +1 -0
- package/cjs/index.cjs +2 -0
- package/cjs/index.cjs.map +1 -1
- package/cjs/utils/expand-recurring-events/expand-recurring-events.cjs +158 -0
- package/cjs/utils/expand-recurring-events/expand-recurring-events.cjs.map +1 -0
- package/esm/components/CurrentTimeIndicator/CurrentTimeIndicator.mjs +1 -0
- package/esm/components/CurrentTimeIndicator/CurrentTimeIndicator.mjs.map +1 -1
- package/esm/components/DayView/DayView.mjs +147 -10
- package/esm/components/DayView/DayView.mjs.map +1 -1
- package/esm/components/DayView/DayView.module.css.mjs +1 -1
- package/esm/components/DayView/get-day-view-events/get-day-positioned-events.mjs +1 -0
- package/esm/components/DayView/get-day-view-events/get-day-positioned-events.mjs.map +1 -1
- package/esm/components/DayView/get-day-view-events/get-day-view-events.mjs +62 -5
- package/esm/components/DayView/get-day-view-events/get-day-view-events.mjs.map +1 -1
- package/esm/components/MobileMonthView/MobileMonthView.mjs +9 -1
- package/esm/components/MobileMonthView/MobileMonthView.mjs.map +1 -1
- package/esm/components/MobileMonthView/get-mobile-month-view-events.mjs +4 -0
- package/esm/components/MobileMonthView/get-mobile-month-view-events.mjs.map +1 -1
- package/esm/components/MonthView/MonthView.mjs +78 -15
- package/esm/components/MonthView/MonthView.mjs.map +1 -1
- package/esm/components/MonthView/MonthView.module.css.mjs +1 -1
- package/esm/components/MonthView/get-month-view-events/get-month-positioned-events.mjs +17 -1
- package/esm/components/MonthView/get-month-view-events/get-month-positioned-events.mjs.map +1 -1
- package/esm/components/MonthView/get-month-view-events/get-month-view-events.mjs +2 -1
- package/esm/components/MonthView/get-month-view-events/get-month-view-events.mjs.map +1 -1
- package/esm/components/MonthView/get-month-view-events/get-weeks-in-range.mjs +1 -0
- package/esm/components/MonthView/get-month-view-events/get-weeks-in-range.mjs.map +1 -1
- package/esm/components/Schedule/Schedule.mjs +11 -0
- package/esm/components/Schedule/Schedule.mjs.map +1 -1
- package/esm/components/ScheduleEvent/ScheduleEvent.mjs +38 -4
- package/esm/components/ScheduleEvent/ScheduleEvent.mjs.map +1 -1
- package/esm/components/ScheduleEvent/ScheduleEvent.module.css.mjs +1 -1
- package/esm/components/ScheduleHeader/MonthYearSelect/MonthYearSelect.mjs +1 -0
- package/esm/components/ScheduleHeader/MonthYearSelect/MonthYearSelect.mjs.map +1 -1
- package/esm/components/ScheduleHeader/ScheduleHeader.mjs +1 -1
- package/esm/components/ScheduleHeader/ScheduleHeader.mjs.map +1 -1
- package/esm/components/ScheduleHeader/ScheduleHeaderBase.mjs.map +1 -1
- package/esm/components/WeekView/WeekView.mjs +189 -20
- package/esm/components/WeekView/WeekView.mjs.map +1 -1
- package/esm/components/WeekView/WeekView.module.css.mjs +1 -1
- package/esm/components/WeekView/WeekViewDay.mjs +4 -1
- package/esm/components/WeekView/WeekViewDay.mjs.map +1 -1
- package/esm/components/WeekView/get-week-label/get-week-label.mjs +1 -0
- package/esm/components/WeekView/get-week-label/get-week-label.mjs.map +1 -1
- package/esm/components/WeekView/get-week-view-events/assign-event-rows.mjs +1 -0
- package/esm/components/WeekView/get-week-view-events/assign-event-rows.mjs.map +1 -1
- package/esm/components/WeekView/get-week-view-events/calculate-regular-event-overlaps.mjs +1 -0
- package/esm/components/WeekView/get-week-view-events/calculate-regular-event-overlaps.mjs.map +1 -1
- package/esm/components/WeekView/get-week-view-events/filter-week-view-events.mjs +1 -0
- package/esm/components/WeekView/get-week-view-events/filter-week-view-events.mjs.map +1 -1
- package/esm/components/WeekView/get-week-view-events/find-available-column.mjs +1 -0
- package/esm/components/WeekView/get-week-view-events/find-available-column.mjs.map +1 -1
- package/esm/components/WeekView/get-week-view-events/get-week-positioned-events.mjs +47 -1
- package/esm/components/WeekView/get-week-view-events/get-week-positioned-events.mjs.map +1 -1
- package/esm/components/YearView/YearView.mjs +58 -55
- package/esm/components/YearView/YearView.mjs.map +1 -1
- package/esm/components/YearView/YearView.module.css.mjs +1 -1
- package/esm/components/YearView/YearViewMonth.mjs +2 -0
- package/esm/components/YearView/YearViewMonth.mjs.map +1 -1
- package/esm/components/YearView/get-year-view-events/get-year-view-events.mjs +1 -0
- package/esm/components/YearView/get-year-view-events/get-year-view-events.mjs.map +1 -1
- package/esm/hooks/use-auto-scroll-on-drag.mjs +73 -0
- package/esm/hooks/use-auto-scroll-on-drag.mjs.map +1 -0
- package/esm/hooks/use-drag-drop-handlers.mjs +42 -19
- package/esm/hooks/use-drag-drop-handlers.mjs.map +1 -1
- package/esm/hooks/use-event-resize.mjs +159 -0
- package/esm/hooks/use-event-resize.mjs.map +1 -0
- package/esm/index.mjs +1 -0
- package/esm/index.mjs.map +1 -1
- package/esm/utils/expand-recurring-events/expand-recurring-events.mjs +151 -0
- package/esm/utils/expand-recurring-events/expand-recurring-events.mjs.map +1 -0
- package/lib/components/DayView/DayView.d.ts +14 -2
- package/lib/components/DayView/get-day-view-events/get-day-positioned-events.d.ts +1 -1
- package/lib/components/DayView/get-day-view-events/get-day-view-events.d.ts +4 -2
- package/lib/components/MobileMonthView/MobileMonthView.d.ts +2 -0
- package/lib/components/MonthView/MonthView.d.ts +9 -3
- package/lib/components/MonthView/get-month-view-events/get-month-positioned-events.d.ts +4 -0
- package/lib/components/Schedule/Schedule.d.ts +12 -2
- package/lib/components/ScheduleEvent/ScheduleEvent.d.ts +7 -1
- package/lib/components/WeekView/WeekView.d.ts +14 -2
- package/lib/components/WeekView/WeekViewDay.d.ts +3 -1
- package/lib/components/WeekView/get-week-view-events/get-week-positioned-events.d.ts +1 -0
- package/lib/components/YearView/YearView.d.ts +3 -1
- package/lib/hooks/use-auto-scroll-on-drag.d.ts +6 -0
- package/lib/hooks/use-drag-drop-handlers.d.ts +3 -1
- package/lib/hooks/use-event-resize.d.ts +22 -0
- package/lib/test-utils.d.ts +1 -1
- package/lib/types.d.ts +58 -8
- package/lib/utils/expand-recurring-events/expand-recurring-events.d.ts +10 -0
- package/lib/utils/index.d.ts +1 -0
- package/lib/utils/validate-event/validate-event.d.ts +1 -1
- package/package.json +9 -6
- package/styles.css +193 -82
- package/styles.layer.css +193 -82
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
3
|
-
import { useState,
|
|
3
|
+
import { useState, useRef, useCallback, createElement, useMemo } from 'react';
|
|
4
4
|
import dayjs from 'dayjs';
|
|
5
|
-
import { createVarsResolver, rem, getRadius, factory, useProps, useStyles, useResolvedStylesApi, Box, UnstyledButton, ScrollArea } from '@mantine/core';
|
|
5
|
+
import { createVarsResolver, rem, getRadius, factory, useProps, useStyles, useResolvedStylesApi, useMantineTheme, Box, UnstyledButton, ScrollArea } from '@mantine/core';
|
|
6
6
|
import { useDatesContext } from '@mantine/dates';
|
|
7
|
+
import { useMergedRef, useIsomorphicEffect } from '@mantine/hooks';
|
|
8
|
+
import { useAutoScrollOnDrag } from '../../hooks/use-auto-scroll-on-drag.mjs';
|
|
7
9
|
import { useDragDropHandlers } from '../../hooks/use-drag-drop-handlers.mjs';
|
|
10
|
+
import { useEventResize } from '../../hooks/use-event-resize.mjs';
|
|
8
11
|
import { useSlotDragSelect } from '../../hooks/use-slot-drag-select.mjs';
|
|
9
12
|
import { getLabel } from '../../labels.mjs';
|
|
10
13
|
import { formatDate } from '../../utils/format-date/format-date.mjs';
|
|
@@ -17,6 +20,7 @@ import { previousWeek } from '../../utils/previous-week/previous-week.mjs';
|
|
|
17
20
|
import { isAllDayEvent } from '../../utils/is-all-day-event/is-all-day-event.mjs';
|
|
18
21
|
import { calculateDropTime } from '../../utils/calculate-drop-time/calculate-drop-time.mjs';
|
|
19
22
|
import { getBusinessHoursMod } from '../../utils/get-business-hours-mod/get-business-hours-mod.mjs';
|
|
23
|
+
import { expandRecurringEvents } from '../../utils/expand-recurring-events/expand-recurring-events.mjs';
|
|
20
24
|
import { CurrentTimeIndicator } from '../CurrentTimeIndicator/CurrentTimeIndicator.mjs';
|
|
21
25
|
import { DragContext } from '../DragContext/DragContext.mjs';
|
|
22
26
|
import { ScheduleEvent } from '../ScheduleEvent/ScheduleEvent.mjs';
|
|
@@ -24,8 +28,8 @@ import { ScheduleHeaderBase } from '../ScheduleHeader/ScheduleHeaderBase.mjs';
|
|
|
24
28
|
import { getWeekLabel } from './get-week-label/get-week-label.mjs';
|
|
25
29
|
import { getWeekViewEvents } from './get-week-view-events/get-week-view-events.mjs';
|
|
26
30
|
import { handleWeekViewKeyDown } from './handle-week-view-key-down.mjs';
|
|
27
|
-
import classes from './WeekView.module.css.mjs';
|
|
28
31
|
import { WeekViewDay } from './WeekViewDay.mjs';
|
|
32
|
+
import classes from './WeekView.module.css.mjs';
|
|
29
33
|
|
|
30
34
|
const defaultProps = {
|
|
31
35
|
__staticSelector: "WeekView",
|
|
@@ -45,6 +49,7 @@ const defaultProps = {
|
|
|
45
49
|
businessHours: ["09:00:00", "17:00:00"],
|
|
46
50
|
withEventsDragAndDrop: false,
|
|
47
51
|
withDragSlotSelect: false,
|
|
52
|
+
withEventResize: false,
|
|
48
53
|
mode: "default"
|
|
49
54
|
};
|
|
50
55
|
const varsResolver = createVarsResolver(
|
|
@@ -111,7 +116,13 @@ const WeekView = factory((_props) => {
|
|
|
111
116
|
withDragSlotSelect,
|
|
112
117
|
onSlotDragEnd,
|
|
113
118
|
mode,
|
|
119
|
+
startScrollTime,
|
|
114
120
|
renderWeekLabel,
|
|
121
|
+
onExternalEventDrop,
|
|
122
|
+
withEventResize,
|
|
123
|
+
onEventResize,
|
|
124
|
+
canResizeEvent,
|
|
125
|
+
recurrenceExpansionLimit,
|
|
115
126
|
...others
|
|
116
127
|
} = props;
|
|
117
128
|
const getStyles = useStyles({
|
|
@@ -140,9 +151,34 @@ const WeekView = factory((_props) => {
|
|
|
140
151
|
__staticSelector,
|
|
141
152
|
radius
|
|
142
153
|
};
|
|
154
|
+
const theme = useMantineTheme();
|
|
143
155
|
const [scrolled, setScrolled] = useState(false);
|
|
144
156
|
const ctx = useDatesContext();
|
|
145
157
|
const slots = getDayTimeIntervals({ startTime, endTime, intervalMinutes });
|
|
158
|
+
const viewportRef = useRef(null);
|
|
159
|
+
useAutoScrollOnDrag({
|
|
160
|
+
viewportRef,
|
|
161
|
+
enabled: (withEventsDragAndDrop || !!onExternalEventDrop) && mode !== "static"
|
|
162
|
+
});
|
|
163
|
+
const handleExternalDrop = useCallback(
|
|
164
|
+
(e, target) => {
|
|
165
|
+
if (!onExternalEventDrop) {
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
const slotDate = dayjs(target.day).format("YYYY-MM-DD");
|
|
169
|
+
onExternalEventDrop(e.dataTransfer, `${slotDate} ${slots[target.slotIndex].startTime}`);
|
|
170
|
+
},
|
|
171
|
+
[onExternalEventDrop, slots]
|
|
172
|
+
);
|
|
173
|
+
const handleExternalAllDayDrop = useCallback(
|
|
174
|
+
(e, day) => {
|
|
175
|
+
if (!onExternalEventDrop) {
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
onExternalEventDrop(e.dataTransfer, `${dayjs(day).format("YYYY-MM-DD")} 00:00:00`);
|
|
179
|
+
},
|
|
180
|
+
[onExternalEventDrop]
|
|
181
|
+
);
|
|
146
182
|
const dragDrop = useDragDropHandlers({
|
|
147
183
|
enabled: withEventsDragAndDrop,
|
|
148
184
|
mode,
|
|
@@ -158,7 +194,8 @@ const WeekView = factory((_props) => {
|
|
|
158
194
|
targetSlotTime: slotTime,
|
|
159
195
|
intervalMinutes
|
|
160
196
|
});
|
|
161
|
-
}
|
|
197
|
+
},
|
|
198
|
+
onExternalDrop: onExternalEventDrop ? handleExternalDrop : void 0
|
|
162
199
|
});
|
|
163
200
|
const allDayDragDrop = useDragDropHandlers({
|
|
164
201
|
enabled: withEventsDragAndDrop,
|
|
@@ -171,7 +208,8 @@ const WeekView = factory((_props) => {
|
|
|
171
208
|
const eventDuration = dayjs(draggedEvent.end).diff(dayjs(draggedEvent.start), "millisecond");
|
|
172
209
|
const newStart = dayjs(targetDay).startOf("day");
|
|
173
210
|
return { start: newStart.toDate(), end: newStart.add(eventDuration, "millisecond").toDate() };
|
|
174
|
-
}
|
|
211
|
+
},
|
|
212
|
+
onExternalDrop: onExternalEventDrop ? handleExternalAllDayDrop : void 0
|
|
175
213
|
});
|
|
176
214
|
const slotDragSelect = useSlotDragSelect({
|
|
177
215
|
enabled: withDragSlotSelect && mode !== "static",
|
|
@@ -186,6 +224,16 @@ const WeekView = factory((_props) => {
|
|
|
186
224
|
);
|
|
187
225
|
}
|
|
188
226
|
});
|
|
227
|
+
const eventResize = useEventResize({
|
|
228
|
+
enabled: withEventResize,
|
|
229
|
+
mode,
|
|
230
|
+
startTime,
|
|
231
|
+
endTime,
|
|
232
|
+
intervalMinutes,
|
|
233
|
+
onEventResize,
|
|
234
|
+
canResizeEvent
|
|
235
|
+
});
|
|
236
|
+
const withDragHandlers = (withEventsDragAndDrop || !!onExternalEventDrop) && mode !== "static";
|
|
189
237
|
const handleTimeSlotClick = (day, slotTime, e) => {
|
|
190
238
|
if (!onTimeSlotClick) {
|
|
191
239
|
return;
|
|
@@ -198,9 +246,21 @@ const WeekView = factory((_props) => {
|
|
|
198
246
|
const slot = slots[slotIndex];
|
|
199
247
|
onTimeSlotClick(`${slotDate} ${slot.startTime}`, `${slotDate} ${slot.endTime}`, e);
|
|
200
248
|
};
|
|
249
|
+
const weekdays = getWeekDays({
|
|
250
|
+
week: date,
|
|
251
|
+
withWeekendDays,
|
|
252
|
+
weekendDays: ctx.getWeekendDays(weekendDays),
|
|
253
|
+
firstDayOfWeek: ctx.getFirstDayOfWeek(firstDayOfWeek)
|
|
254
|
+
});
|
|
255
|
+
const expandedEvents = expandRecurringEvents({
|
|
256
|
+
events,
|
|
257
|
+
rangeStart: dayjs(weekdays[0]).startOf("day").toDate(),
|
|
258
|
+
rangeEnd: dayjs(weekdays[weekdays.length - 1]).endOf("day").toDate(),
|
|
259
|
+
expansionLimit: recurrenceExpansionLimit
|
|
260
|
+
});
|
|
201
261
|
const weekEvents = getWeekViewEvents({
|
|
202
262
|
date,
|
|
203
|
-
events,
|
|
263
|
+
events: expandedEvents,
|
|
204
264
|
startTime,
|
|
205
265
|
endTime,
|
|
206
266
|
firstDayOfWeek: ctx.getFirstDayOfWeek(firstDayOfWeek),
|
|
@@ -231,16 +291,32 @@ const WeekView = factory((_props) => {
|
|
|
231
291
|
label
|
|
232
292
|
);
|
|
233
293
|
});
|
|
234
|
-
const weekdays = getWeekDays({
|
|
235
|
-
week: date,
|
|
236
|
-
withWeekendDays,
|
|
237
|
-
weekendDays: ctx.getWeekendDays(weekendDays),
|
|
238
|
-
firstDayOfWeek: ctx.getFirstDayOfWeek(firstDayOfWeek)
|
|
239
|
-
});
|
|
240
294
|
const slotsRef = useRef([]);
|
|
241
295
|
const allDaySlotsRef = useRef([]);
|
|
242
296
|
const weekdaysRef = useRef([]);
|
|
297
|
+
const daySlotsContainersRef = useRef([]);
|
|
298
|
+
const mergedViewportRef = useMergedRef(viewportRef, scrollAreaProps?.viewportRef);
|
|
243
299
|
const firstSlotIndex = { dayIndex: 0, slotIndex: 0 };
|
|
300
|
+
useIsomorphicEffect(() => {
|
|
301
|
+
if (!startScrollTime || !viewportRef.current) {
|
|
302
|
+
return;
|
|
303
|
+
}
|
|
304
|
+
const firstDaySlots = slotsRef.current[0];
|
|
305
|
+
if (!firstDaySlots || firstDaySlots.length === 0) {
|
|
306
|
+
return;
|
|
307
|
+
}
|
|
308
|
+
const targetIndex = slots.findIndex((s) => s.startTime >= startScrollTime);
|
|
309
|
+
if (targetIndex < 0) {
|
|
310
|
+
return;
|
|
311
|
+
}
|
|
312
|
+
const targetSlot = firstDaySlots[targetIndex];
|
|
313
|
+
if (!targetSlot) {
|
|
314
|
+
return;
|
|
315
|
+
}
|
|
316
|
+
const slotRect = targetSlot.getBoundingClientRect();
|
|
317
|
+
const viewportRect = viewportRef.current.getBoundingClientRect();
|
|
318
|
+
viewportRef.current.scrollTo({ left: 0, top: slotRect.top - viewportRect.top });
|
|
319
|
+
}, []);
|
|
244
320
|
const getSlotIndexFromDragPoint = useCallback((event, dayIndex) => {
|
|
245
321
|
const daySlots = slotsRef.current[dayIndex] ?? [];
|
|
246
322
|
const slotIndex = daySlots.findIndex((slotNode) => {
|
|
@@ -325,9 +401,42 @@ const WeekView = factory((_props) => {
|
|
|
325
401
|
/* @__PURE__ */ createElement("div", { ...getStyles("weekViewDayNumber"), key: "date" }, dayjs(day).date())
|
|
326
402
|
));
|
|
327
403
|
const days = weekdays.map((day, dayIndex) => {
|
|
404
|
+
const allBgEvents = weekEvents.backgroundEvents[day] || [];
|
|
405
|
+
const backgroundEventNodes = allBgEvents.filter((event) => !event.position.allDay).map((event) => {
|
|
406
|
+
const colors = theme.variantColorResolver({
|
|
407
|
+
color: event.color || theme.primaryColor,
|
|
408
|
+
theme,
|
|
409
|
+
variant: "light",
|
|
410
|
+
autoContrast: true
|
|
411
|
+
});
|
|
412
|
+
const bgEventBody = typeof renderEventBody === "function" ? renderEventBody(event) : event.title;
|
|
413
|
+
const bgEventProps = {
|
|
414
|
+
key: `bg-${event.id}`,
|
|
415
|
+
...getStyles("weekViewBackgroundEvent", {
|
|
416
|
+
style: {
|
|
417
|
+
top: `${event.position.top}%`,
|
|
418
|
+
height: `${event.position.height}%`,
|
|
419
|
+
width: "100%"
|
|
420
|
+
}
|
|
421
|
+
}),
|
|
422
|
+
__vars: {
|
|
423
|
+
"--bg-event-bg": colors.background,
|
|
424
|
+
"--bg-event-color": colors.color
|
|
425
|
+
},
|
|
426
|
+
children: bgEventBody
|
|
427
|
+
};
|
|
428
|
+
if (typeof renderEvent === "function") {
|
|
429
|
+
return renderEvent(event, bgEventProps);
|
|
430
|
+
}
|
|
431
|
+
return /* @__PURE__ */ jsx(Box, { ...bgEventProps });
|
|
432
|
+
});
|
|
328
433
|
const dayEvents = (weekEvents.regularEvents[day] || []).map((event) => {
|
|
329
434
|
const eventIsAllDay = isAllDayEvent({ event, date: day });
|
|
330
435
|
const isDraggable = !eventIsAllDay && dragDrop.isDraggableEvent(event);
|
|
436
|
+
const isResizable = !eventIsAllDay && eventResize.isResizableEvent(event);
|
|
437
|
+
const resizePosition = eventResize.getResizePosition(event.id);
|
|
438
|
+
const eventTop = resizePosition ? resizePosition.top : event.position.top;
|
|
439
|
+
const eventHeight = resizePosition ? resizePosition.height : event.position.height;
|
|
331
440
|
return /* @__PURE__ */ jsx(
|
|
332
441
|
ScheduleEvent,
|
|
333
442
|
{
|
|
@@ -335,6 +444,22 @@ const WeekView = factory((_props) => {
|
|
|
335
444
|
autoSize: true,
|
|
336
445
|
hanging: event.position.hanging,
|
|
337
446
|
draggable: isDraggable,
|
|
447
|
+
withResize: isResizable,
|
|
448
|
+
isResizing: resizePosition !== null,
|
|
449
|
+
onResizeStart: isResizable ? (edge, e) => {
|
|
450
|
+
const container = daySlotsContainersRef.current[dayIndex];
|
|
451
|
+
if (container) {
|
|
452
|
+
eventResize.handleResizeStart(
|
|
453
|
+
event,
|
|
454
|
+
edge,
|
|
455
|
+
container,
|
|
456
|
+
event.position.top,
|
|
457
|
+
event.position.height,
|
|
458
|
+
dayjs(day).format("YYYY-MM-DD"),
|
|
459
|
+
e
|
|
460
|
+
);
|
|
461
|
+
}
|
|
462
|
+
} : void 0,
|
|
338
463
|
renderEventBody,
|
|
339
464
|
renderEvent,
|
|
340
465
|
radius,
|
|
@@ -342,16 +467,16 @@ const WeekView = factory((_props) => {
|
|
|
342
467
|
onClick: onEventClick ? (e) => onEventClick(event, e) : void 0,
|
|
343
468
|
style: {
|
|
344
469
|
position: "absolute",
|
|
345
|
-
top: `calc(${
|
|
470
|
+
top: `calc(${eventTop}% + 1px)`,
|
|
346
471
|
left: `${event.position.offset}%`,
|
|
347
472
|
width: `${event.position.width}%`,
|
|
348
|
-
height: `calc(${
|
|
473
|
+
height: `calc(${eventHeight}% - 1px)`
|
|
349
474
|
}
|
|
350
475
|
},
|
|
351
476
|
event.id
|
|
352
477
|
);
|
|
353
478
|
});
|
|
354
|
-
return /* @__PURE__ */
|
|
479
|
+
return /* @__PURE__ */ jsxs(
|
|
355
480
|
WeekViewDay,
|
|
356
481
|
{
|
|
357
482
|
day,
|
|
@@ -362,7 +487,7 @@ const WeekView = factory((_props) => {
|
|
|
362
487
|
highlightBusinessHours,
|
|
363
488
|
businessHours,
|
|
364
489
|
labels,
|
|
365
|
-
withEventsDragAndDrop,
|
|
490
|
+
withEventsDragAndDrop: withDragHandlers,
|
|
366
491
|
mode,
|
|
367
492
|
slotsRef,
|
|
368
493
|
firstSlotIndex,
|
|
@@ -388,7 +513,13 @@ const WeekView = factory((_props) => {
|
|
|
388
513
|
withDragSlotSelect,
|
|
389
514
|
onSlotPointerDown: slotDragSelect.handleSlotPointerDown,
|
|
390
515
|
isSlotDragSelected: slotDragSelect.isSlotSelected,
|
|
391
|
-
|
|
516
|
+
daySlotsContainerRef: (node) => {
|
|
517
|
+
daySlotsContainersRef.current[dayIndex] = node;
|
|
518
|
+
},
|
|
519
|
+
children: [
|
|
520
|
+
backgroundEventNodes,
|
|
521
|
+
dayEvents
|
|
522
|
+
]
|
|
392
523
|
},
|
|
393
524
|
day
|
|
394
525
|
);
|
|
@@ -403,9 +534,9 @@ const WeekView = factory((_props) => {
|
|
|
403
534
|
tabIndex: dayIndex === 0 ? 0 : -1,
|
|
404
535
|
onKeyDown: (event) => handleAllDaySlotKeyDown(event, dayIndex),
|
|
405
536
|
onClick: mode === "static" || !onAllDaySlotClick ? void 0 : (e) => onAllDaySlotClick(dayjs(day).format("YYYY-MM-DD"), e),
|
|
406
|
-
onDragOver:
|
|
407
|
-
onDragLeave:
|
|
408
|
-
onDrop:
|
|
537
|
+
onDragOver: withDragHandlers ? (e) => allDayDragDrop.handleDragOver(e, day) : void 0,
|
|
538
|
+
onDragLeave: withDragHandlers ? allDayDragDrop.handleDragLeave : void 0,
|
|
539
|
+
onDrop: withDragHandlers ? (e) => allDayDragDrop.handleDrop(e, day) : void 0,
|
|
409
540
|
...getStyles("weekViewDaySlot"),
|
|
410
541
|
mod: { "drop-target": allDayDragDrop.isDropTarget(day) }
|
|
411
542
|
},
|
|
@@ -438,6 +569,42 @@ const WeekView = factory((_props) => {
|
|
|
438
569
|
},
|
|
439
570
|
event.id
|
|
440
571
|
));
|
|
572
|
+
const allDayBackgroundEventNodes = weekdays.flatMap((day, dayIndex) => {
|
|
573
|
+
const allDayBgEvents = (weekEvents.backgroundEvents[day] || []).filter(
|
|
574
|
+
(event) => event.position.allDay
|
|
575
|
+
);
|
|
576
|
+
const dayWidth = 100 / weekdays.length;
|
|
577
|
+
const dayOffset = dayIndex * dayWidth;
|
|
578
|
+
return allDayBgEvents.map((event) => {
|
|
579
|
+
const colors = theme.variantColorResolver({
|
|
580
|
+
color: event.color || theme.primaryColor,
|
|
581
|
+
theme,
|
|
582
|
+
variant: "light",
|
|
583
|
+
autoContrast: true
|
|
584
|
+
});
|
|
585
|
+
const bgEventBody = typeof renderEventBody === "function" ? renderEventBody(event) : event.title;
|
|
586
|
+
const bgEventProps = {
|
|
587
|
+
key: `bg-allday-${event.id}-${day}`,
|
|
588
|
+
...getStyles("weekViewBackgroundEvent", {
|
|
589
|
+
style: {
|
|
590
|
+
top: 0,
|
|
591
|
+
height: "100%",
|
|
592
|
+
left: `${dayOffset}%`,
|
|
593
|
+
width: `${dayWidth}%`
|
|
594
|
+
}
|
|
595
|
+
}),
|
|
596
|
+
__vars: {
|
|
597
|
+
"--bg-event-bg": colors.background,
|
|
598
|
+
"--bg-event-color": colors.color
|
|
599
|
+
},
|
|
600
|
+
children: bgEventBody
|
|
601
|
+
};
|
|
602
|
+
if (typeof renderEvent === "function") {
|
|
603
|
+
return renderEvent(event, bgEventProps);
|
|
604
|
+
}
|
|
605
|
+
return /* @__PURE__ */ jsx(Box, { ...bgEventProps });
|
|
606
|
+
});
|
|
607
|
+
});
|
|
441
608
|
const extraRows = Math.max(...weekEvents.allDayEvents.map((event) => event.position.row), 1) - 1;
|
|
442
609
|
const content = /* @__PURE__ */ jsxs(
|
|
443
610
|
Box,
|
|
@@ -496,6 +663,7 @@ const WeekView = factory((_props) => {
|
|
|
496
663
|
scrollAreaProps?.onScrollPositionChange?.(position);
|
|
497
664
|
setScrolled(position.y !== 0);
|
|
498
665
|
},
|
|
666
|
+
viewportRef: mergedViewportRef,
|
|
499
667
|
children: [
|
|
500
668
|
/* @__PURE__ */ jsxs(Box, { ...getStyles("weekViewHeader"), mod: { scrolled }, children: [
|
|
501
669
|
/* @__PURE__ */ createElement("div", { ...getStyles("weekViewCorner"), key: "corner" }, withWeekNumber && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
@@ -507,6 +675,7 @@ const WeekView = factory((_props) => {
|
|
|
507
675
|
withAllDaySlots && /* @__PURE__ */ jsxs("div", { ...getStyles("weekViewAllDaySlots"), children: [
|
|
508
676
|
/* @__PURE__ */ jsx("div", { ...getStyles("weekViewAllDaySlotsLabel"), children: getLabel("allDay", labels) }),
|
|
509
677
|
/* @__PURE__ */ jsxs("div", { ...getStyles("weekViewAllDaySlotsList"), children: [
|
|
678
|
+
allDayBackgroundEventNodes,
|
|
510
679
|
/* @__PURE__ */ jsx(
|
|
511
680
|
Box,
|
|
512
681
|
{
|