Events data
Events data
@mantine/schedule의 이벤트 데이터 구조와 각 콜백의 페이로드 형식을 설명하는 문서예요. start와 end는 Date 인스턴스 또는 YYYY-MM-DD HH:mm:ss 형식의 문자열(모든 Mantine 날짜 컴포넌트가 사용하는 DateTimeStringValue 타입)을 받아요.
출처: 문서
본문
ScheduleSingleEventData
반복이 없는 일회성 이벤트예요. 가장 흔한 형태예요:
import type { ScheduleSingleEventData } from '@mantine/schedule';
const event: ScheduleSingleEventData = {
id: 'meeting-1',
title: 'Team sync',
start: '2024-01-15 10:00:00',
end: '2024-01-15 11:00:00',
color: 'blue',
};
ScheduleRecurringSeriesEventData
반복 시리즈의 원본 이벤트예요. RFC 5545 반복 규칙을 가진 recurrence 필드를 추가해요:
import type { ScheduleRecurringSeriesEventData } from '@mantine/schedule';
const series: ScheduleRecurringSeriesEventData = {
id: 'weekly-planning',
title: 'Weekly planning',
start: '2024-01-15 10:00:00',
end: '2024-01-15 11:00:00',
color: 'blue',
recurrence: {
rrule: 'FREQ=WEEKLY;BYDAY=MO;COUNT=12',
exdate: ['2024-02-12 10:00:00'],
dtstart: '2024-01-15 10:00:00',
},
};
recurrence 객체는 다음과 같은 모양이에요:
interface ScheduleRecurrenceData {
/** Recurrence rule string, for example: `FREQ=WEEKLY;BYDAY=MO,WE` */
rrule: string;
/** Exception datetimes in `YYYY-MM-DD HH:mm:ss` or valid date string format */
exdate?: DateTimeStringValue[];
/** Optional explicit series start datetime */
dtstart?: DateTimeStringValue;
}
반복 규칙과 시리즈 확장에 대한 자세한 내용은 반복 이벤트 가이드를 참고해요.
ScheduleRecurringOverrideEventData
오버라이드 이벤트는 시리즈에서 생성된 단일 발생(occurrence)을 대체해요:
import type { ScheduleRecurringOverrideEventData } from '@mantine/schedule';
const override: ScheduleRecurringOverrideEventData = {
id: 'weekly-planning-override',
title: 'Weekly planning (moved)',
start: '2024-01-17 16:00:00',
end: '2024-01-17 17:00:00',
color: 'grape',
recurringEventId: 'weekly-planning',
recurrenceId: '2024-01-15 10:00:00',
};
recurringEventId– 부모 시리즈 이벤트의 idrecurrenceId–YYYY-MM-DD HH:mm:ss형식의 원래 발생 날짜시간
EventPayload
payload 필드를 사용해 이벤트에 임의의 데이터를 붙일 수 있어요. payload는 라이브러리 내부에서 사용되지 않아요. 콜백(onEventClick, onEventDrop 등)과 커스텀 이벤트 렌더러(renderEventBody)에서 접근할 수 있는 애플리케이션별 데이터를 의미해요:
import type { ScheduleEventData } from '@mantine/schedule';
interface MyEventPayload {
description: string;
attendees: string[];
location?: string;
}
const event: ScheduleEventData = {
id: 'meeting-1',
title: 'Team sync',
start: '2024-01-15 10:00:00',
end: '2024-01-15 11:00:00',
color: 'blue',
payload: {
description: 'Weekly planning meeting',
attendees: ['Alice', 'Bob'],
location: 'Conference room A',
},
};
EventPayload 자체는 그냥 Record<string, any>예요. 보통 ScheduleEventData의 제네릭 인자로 직접 만든 payload 타입을 전달해요.
반복 인스턴스 메타데이터 (Recurring instance metadata)
반복 시리즈가 표시된 날짜 범위에 대해 확장되면, 각 생성된 이벤트는 recurringInstance 메타데이터 객체를 포함해요. 이 객체는 라이브러리가 추가해요. 직접 설정하지 않아도 되지만, 콜백과 커스텀 렌더러에서 읽어 생성된 발생과 일반 이벤트를 구분할 수 있어요:
interface RecurringInstanceMeta {
/** If true, event is generated from recurrence rule */
isRecurringInstance: boolean;
/** Parent series event id */
recurringEventId: string | number;
/** Original occurrence datetime key */
recurrenceId: DateTimeStringValue;
/** Original occurrence dates before any drag/drop updates */
originalStart: DateTimeStringValue;
originalEnd: DateTimeStringValue;
}
onEventClick에서 메타데이터를 읽는 예시예요:
<DayView
onEventClick={(event) => {
if (event.recurringInstance?.isRecurringInstance) {
console.log('Clicked generated occurrence of', event.recurringInstance.recurringEventId);
} else {
console.log('Clicked regular event', event.id);
}
}}
/>
콜백 페이로드 (Callback payloads)
모든 이벤트 콜백은 사용자가 상호작용한 대상을 설명하는 구조화된 데이터를 받아요. 다음 섹션들은 각 콜백이 받는 정확한 페이로드를 문서화해요.
onEventClick
모든 뷰에서 이벤트를 클릭할 때 호출돼요:
onEventClick?: (
event: ScheduleEventData,
e: React.MouseEvent
) => void;
event– 클릭한 이벤트예요. 생성된 발생이라면recurringInstance메타데이터를 포함해요.e– 네이티브 React 마우스 이벤트예요.
onEventDrop
드래그 후 이벤트를 드롭할 때 호출돼요(withEventsDragAndDrop 필요):
onEventDrop?: (data: {
eventId: string | number;
newStart: DateTimeStringValue;
newEnd: DateTimeStringValue;
event: ScheduleEventData;
}) => void;
eventId– 드롭된 이벤트의 id (event.id와 동일)예요. 생성된 반복 인스턴스의 경우 합성된 발생 id(<seriesId>::<recurrenceId>)이며 시리즈 id가 아니에요. 발생을 처리할 때 부모 시리즈 id를 얻으려면event.recurringInstance?.recurringEventId를 사용해요.newStart/newEnd–YYYY-MM-DD HH:mm:ss형식의 새 날짜시간 값이에요.event– 해당 시점에recurringInstance메타데이터를 포함한 전체 이벤트 데이터예요.
onEventResize
이벤트를 위나 아래 가장자리를 끌어 리사이즈할 때 호출돼요(withEventResize 필요):
onEventResize?: (data: {
eventId: string | number;
newStart: DateTimeStringValue;
newEnd: DateTimeStringValue;
event: ScheduleEventData;
}) => void;
페이로드는 생성된 반복 인스턴스의 eventId에 대한 주의사항을 포함해 onEventDrop과 동일한 모양이에요.
onEventDragStart / onEventDragEnd
이벤트 드래그가 시작되거나 끝날 때 호출돼요:
onEventDragStart?: (event: ScheduleEventData) => void;
onEventDragEnd?: () => void;
onEventDragEnd는 성공적인 드롭과 취소된 드래그 모두에서 호출돼요. 새 위치가 필요하면 onEventDrop을 사용해요.
onTimeSlotClick
DayView 또는 WeekView에서 타임 슬롯을 클릭할 때 호출돼요:
onTimeSlotClick?: (data: {
slotStart: DateTimeStringValue;
slotEnd: DateTimeStringValue;
nativeEvent: React.MouseEvent;
}) => void;
slotStart/slotEnd–YYYY-MM-DD HH:mm:ss형식의 슬롯 범위예요. 슬롯 길이는 뷰의intervalMinutesprop이 제어해요.
onAllDaySlotClick
DayView 또는 WeekView에서 종일 슬롯을 클릭할 때 호출돼요:
onAllDaySlotClick?: (
date: DateStringValue,
event: React.MouseEvent
) => void;
date–YYYY-MM-DD형식의 클릭한 날짜예요.
onDayClick
MonthView 또는 YearView에서 날짜를 클릭할 때 호출돼요:
onDayClick?: (
date: DateStringValue,
event: React.MouseEvent
) => void;
date–YYYY-MM-DD형식의 클릭한 날짜예요.
onSlotDragEnd
타임 슬롯이나 날짜 셀을 가로질러 드래그해 슬롯 범위를 선택할 때 호출돼요(withDragSlotSelect 필요):
onSlotDragEnd?: (
rangeStart: DateTimeStringValue,
rangeEnd: DateTimeStringValue
) => void;
rangeStart/rangeEnd–YYYY-MM-DD HH:mm:ss형식의 선택한 범위예요.
onExternalEventDrop
일정 바깥에서 항목을 끌어 슬롯에 드롭할 때 호출돼요:
onExternalEventDrop?: (
dataTransfer: DataTransfer,
dropDateTime: DateTimeStringValue
) => void;
dataTransfer– 외부 항목이onDragStart핸들러 중 설정한 네이티브DataTransfer객체예요.dataTransfer.getData(type)로 커스텀 데이터를 읽어요.dropDateTime–YYYY-MM-DD HH:mm:ss형식의 드롭 대상 날짜시간이에요.
canDragEvent / canResizeEvent
권한 콜백이에요. 특정 이벤트의 드래그나 리사이즈를 막으려면 false를 반환해요:
canDragEvent?: (event: ScheduleEventData) => boolean;
canResizeEvent?: (event: ScheduleEventData) => boolean;
날짜 및 시간 값 형식 (Date and time value formats)
이벤트 데이터와 콜백 페이로드는 다음 문자열 형식을 일관되게 사용해요:
DateStringValue–YYYY-MM-DD(예:2024-01-15)DateTimeStringValue–YYYY-MM-DD HH:mm:ss(예:2024-01-15 10:00:00)
이 타입들은 @mantine/dates와 @mantine/schedule에서 공유되며 두 패키지 모두에서 내보내져요.