Skip to content

Commit 610f51b

Browse files
[scheduler][styled] Create UI to pick the recurrent event update behavior (#19948)
Co-authored-by: delangle <[email protected]>
1 parent 7f8ac32 commit 610f51b

File tree

27 files changed

+646
-146
lines changed

27 files changed

+646
-146
lines changed

docs/data/scheduler/event-calendar/ExternalDragAndDrop.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,12 +66,13 @@ export default function ExternalDragAndDrop() {
6666
return dropTargetForElements({
6767
element: externalEventsContainerRef.current,
6868
canDrop: (arg) => isValidDropTarget(arg.source.data),
69-
onDragEnter: ({ source: { data } }) => {
69+
onDragEnter: (args) => {
70+
const data = args.source.data;
7071
if (!isValidDropTarget(data)) {
7172
return;
7273
}
7374

74-
const { start, end, ...eventData } = data.event;
75+
const { start, end, ...eventData } = data.originalOccurrence;
7576

7677
setPlaceholder({
7778
...eventData,

docs/data/scheduler/event-calendar/ExternalDragAndDrop.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,12 +69,13 @@ export default function ExternalDragAndDrop() {
6969
return dropTargetForElements({
7070
element: externalEventsContainerRef.current,
7171
canDrop: (arg) => isValidDropTarget(arg.source.data),
72-
onDragEnter: ({ source: { data } }) => {
72+
onDragEnter: (args) => {
73+
const data = args.source.data as any;
7374
if (!isValidDropTarget(data)) {
7475
return;
7576
}
7677

77-
const { start, end, ...eventData } = data.event;
78+
const { start, end, ...eventData } = data.originalOccurrence;
7879

7980
setPlaceholder({
8081
...eventData,

docs/next-env.d.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/// <reference types="next" />
22
/// <reference types="next/image-types/global" />
3-
/// <reference path="./.next/types/routes.d.ts" />
3+
/// <reference path="./export/types/routes.d.ts" />
44

55
// NOTE: This file should not be edited
66
// see https://nextjs.org/docs/pages/api-reference/config/typescript for more information.

packages/x-scheduler-headless/src/calendar-grid/day-event/CalendarGridDayEvent.tsx

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { useButton } from '../../base-ui-copy/utils/useButton';
77
import { useRenderElement } from '../../base-ui-copy/utils/useRenderElement';
88
import { BaseUIComponentProps, NonNativeButtonProps } from '../../base-ui-copy/utils/types';
99
import { useDraggableEvent } from '../../utils/useDraggableEvent';
10-
import { CalendarEvent, CalendarEventId, SchedulerValidDate } from '../../models';
10+
import { CalendarEventId, CalendarEventOccurrence, SchedulerValidDate } from '../../models';
1111
import { useAdapter, diffIn } from '../../use-adapter';
1212
import { useCalendarGridDayRowContext } from '../day-row/CalendarGridDayRowContext';
1313
import { selectors } from '../../use-event-calendar/EventCalendarStore.selectors';
@@ -76,11 +76,20 @@ export const CalendarGridDayEvent = React.forwardRef(function CalendarGridDayEve
7676
return adapter.addDays(eventStartInRow, Math.ceil(positionX * eventDayLengthInRow) - 1);
7777
});
7878

79+
const firstEventOfSeries = selectors.event(store.state, eventId)!;
80+
const originalOccurrence: CalendarEventOccurrence = {
81+
...firstEventOfSeries,
82+
id: eventId,
83+
key: occurrenceKey,
84+
start,
85+
end,
86+
};
87+
7988
const getSharedDragData: CalendarGridDayEventContext['getSharedDragData'] = useEventCallback(
8089
() => ({
8190
eventId,
8291
occurrenceKey,
83-
event: selectors.event(store.state, eventId)!,
92+
originalOccurrence,
8493
start,
8594
end,
8695
}),
@@ -157,7 +166,7 @@ export namespace CalendarGridDayEvent {
157166
export interface SharedDragData {
158167
eventId: CalendarEventId;
159168
occurrenceKey: string;
160-
event: CalendarEvent;
169+
originalOccurrence: CalendarEventOccurrence;
161170
start: SchedulerValidDate;
162171
end: SchedulerValidDate;
163172
}

packages/x-scheduler-headless/src/calendar-grid/time-event/CalendarGridTimeEvent.tsx

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import { CalendarGridTimeEventContext } from './CalendarGridTimeEventContext';
1414
import { useAdapter } from '../../use-adapter/useAdapter';
1515
import { useEventCalendarStoreContext } from '../../use-event-calendar-store-context';
1616
import { selectors } from '../../use-event-calendar';
17-
import { CalendarEvent, CalendarEventId, SchedulerValidDate } from '../../models';
17+
import { CalendarEventId, CalendarEventOccurrence, SchedulerValidDate } from '../../models';
1818
import { useCalendarGridRootContext } from '../root/CalendarGridRootContext';
1919

2020
export const CalendarGridTimeEvent = React.forwardRef(function CalendarGridTimeEvent(
@@ -66,11 +66,22 @@ export const CalendarGridTimeEvent = React.forwardRef(function CalendarGridTimeE
6666
adapter.toJsDate(columnStart).getTime() - adapter.toJsDate(start).getTime(),
6767
0,
6868
);
69+
70+
const event = selectors.event(store.state, eventId)!;
71+
72+
const originalOccurrence: CalendarEventOccurrence = {
73+
...event,
74+
key: occurrenceKey,
75+
id: eventId,
76+
start,
77+
end,
78+
};
79+
6980
const offsetInsideColumn = getCursorPositionInElementMs({ input, elementRef: ref });
7081
return {
7182
eventId,
7283
occurrenceKey,
73-
event: selectors.event(store.state, eventId)!,
84+
originalOccurrence,
7485
start,
7586
end,
7687
initialCursorPositionInEventMs: offsetBeforeColumnStart + offsetInsideColumn,
@@ -159,7 +170,7 @@ export namespace CalendarGridTimeEvent {
159170
export interface SharedDragData {
160171
eventId: CalendarEventId;
161172
occurrenceKey: string;
162-
event: CalendarEvent;
173+
originalOccurrence: CalendarEventOccurrence;
163174
start: SchedulerValidDate;
164175
end: SchedulerValidDate;
165176
initialCursorPositionInEventMs: number;

packages/x-scheduler-headless/src/constants/constants.ts

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { CalendarEventColor, RecurringEventUpdateScope } from '../models';
1+
import { CalendarEventColor } from '../models';
22

33
export const EVENT_CREATION_PRECISION_MINUTE = 30;
44

@@ -7,9 +7,6 @@ export const EVENT_CREATION_DEFAULT_LENGTH_MINUTE = 30;
77
// TODO: Add a color prop to the SchedulerStore and move DEFAULT_EVENT_COLOR there.
88
export const DEFAULT_EVENT_COLOR: CalendarEventColor = 'jade';
99

10-
export const SCHEDULER_RECURRING_EDITING_SCOPE: RecurringEventUpdateScope =
11-
(typeof window !== 'undefined' && (window as any).SCHEDULER_RECURRING_EDITING_SCOPE) || 'all';
12-
1310
export const EVENT_DRAG_PRECISION_MINUTE = 15;
1411

1512
export const EVENT_DRAG_PRECISION_MS = EVENT_DRAG_PRECISION_MINUTE * 60 * 1000;

packages/x-scheduler-headless/src/models/event.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,7 @@ export interface CalendarOccurrencePlaceholderInternalDragOrResize
170170
/**
171171
* The data of the event to use when dropping the event outside of the Event Calendar.
172172
*/
173-
originalEvent: CalendarEvent;
173+
originalOccurrence: CalendarEventOccurrence;
174174
}
175175

176176
export interface CalendarOccurrencePlaceholderExternalDrag

packages/x-scheduler-headless/src/use-event-calendar/tests/core.EventCalendarStore.test.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ describe('Core - EventCalendarStore', () => {
3434
canDropEventsToTheOutside: false,
3535
showCurrentTimeIndicator: true,
3636
eventColor: 'jade',
37+
pendingUpdateRecurringEventParameters: null,
3738
preferences: DEFAULT_PREFERENCES,
3839
preferencesMenuConfig: DEFAULT_PREFERENCES_MENU_CONFIG,
3940
viewConfig: null,

packages/x-scheduler-headless/src/use-event-calendar/tests/selectors.EventCalendarStore.test.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,8 @@ describe('EventCalendarStore.selectors', () => {
5454
surfaceType: 'day-grid',
5555
start: adapter.startOfDay(day),
5656
end: adapter.endOfDay(day),
57-
originalEvent: {
57+
originalOccurrence: {
58+
key: 'event-id-key',
5859
id: 'event-id',
5960
title: 'Event',
6061
start: adapter.startOfDay(day),
@@ -122,8 +123,9 @@ describe('EventCalendarStore.selectors', () => {
122123
surfaceType: 'time-grid',
123124
start: adapter.startOfDay(day),
124125
end: adapter.endOfDay(day),
125-
originalEvent: {
126+
originalOccurrence: {
126127
id: 'event-id',
128+
key: 'event-id-key',
127129
title: 'Event',
128130
start: adapter.startOfDay(day),
129131
end: adapter.endOfDay(day),

packages/x-scheduler-headless/src/use-timeline/tests/core.TimelineStore.test.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ describe('Core - TimelineStore', () => {
2727
showCurrentTimeIndicator: true,
2828
occurrencePlaceholder: null,
2929
visibleDate: adapter.startOfDay(adapter.date()),
30+
pendingUpdateRecurringEventParameters: null,
3031
preferences: DEFAULT_PREFERENCES,
3132
view: 'time',
3233
views: ['time', 'days', 'weeks', 'months', 'years'],

0 commit comments

Comments
 (0)