@marco.colia/react-fast-scheduler 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/constants.ts","../src/components/utils.ts","../src/components/Scheduler.tsx"],"names":["format","React","pointerMin","nextEndMin","jsxs","jsx"],"mappings":"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","file":"index.cjs","sourcesContent":["const OPEN_TIME = '09:00';\nconst CLOSE_TIME = '18:00';\n\nconst STEP_MIN = 15;\nconst MIN_EVENT_MIN = 15;\nconst DEFAULT_CREATE_MIN = 30;\n\nconst PX_PER_MIN = 2; // visual scale\nconst HEADER_H = 56;\nconst GUTTER_W = 72;\nconst TOP_PAD = 12;\nconst BOTTOM_PAD = 24;\n\nconst RESOURCE_MIN_W = 420; // columns expand to fill available width; min width enables x-scroll when needed\nconst RESOURCE_MIN_W_TW = 'min-w-[400px] lg:w-full'; // columns expand to fill available width; min width enables x-scroll when needed\nconst LANE_GAP = 6;\n\nexport {\n OPEN_TIME,\n CLOSE_TIME,\n STEP_MIN,\n MIN_EVENT_MIN,\n DEFAULT_CREATE_MIN,\n PX_PER_MIN,\n HEADER_H,\n GUTTER_W,\n TOP_PAD,\n BOTTOM_PAD,\n RESOURCE_MIN_W,\n LANE_GAP,\n RESOURCE_MIN_W_TW,\n}","import { format } from \"date-fns\";\nimport { STEP_MIN } from \"./constants\";\n\ntype NameLike = {\n firstName?: string | null;\n lastName?: string | null;\n};\n\ntype TimeBlockLike<TId extends string | number = string | number> = {\n id: TId;\n startMin: number;\n endMin: number;\n};\n\ntype LaidOut<T extends TimeBlockLike> = T & {\n lane: number;\n lanes: number;\n};\n\nconst clamp = (n: number, min: number, max: number) => {\n return Math.max(min, Math.min(max, n));\n};\n\nconst snap = (mins: number, stepMin = STEP_MIN) => {\n return Math.round(mins / stepMin) * stepMin;\n};\n\nconst parseHHMM = (hhmm: string) => {\n const [h, m] = hhmm.split(\":\").map(Number);\n return h * 60 + m;\n};\n\nconst fullName = <T extends NameLike>(u: T) => {\n return `${u.firstName ?? \"\"} ${u.lastName ?? \"\"}`.trim();\n};\n\nconst dayISO = (d: Date) => {\n return format(d, \"yyyy-MM-dd\");\n};\n\nconst shiftDays = (d: Date, delta: number) => {\n return new Date(d.getFullYear(), d.getMonth(), d.getDate() + delta);\n};\n\nconst dateAtMinute = (\n selectedDate: Date,\n dayStartAbs: number,\n minuteFromStart: number\n) => {\n const base = new Date(\n selectedDate.getFullYear(),\n selectedDate.getMonth(),\n selectedDate.getDate(),\n 0,\n 0,\n 0,\n 0\n );\n const abs = dayStartAbs + minuteFromStart;\n const hh = Math.floor(abs / 60);\n const mm = abs % 60;\n base.setHours(hh, mm, 0, 0);\n return base;\n};\n\nconst minutesFromDayStart = (dayStartAbs: number, dt: Date) => {\n return dt.getHours() * 60 + dt.getMinutes() - dayStartAbs;\n};\n\nconst overlaps = (a: TimeBlockLike, b: TimeBlockLike) => {\n return a.startMin < b.endMin && b.startMin < a.endMin;\n};\n\nconst layoutOverlaps = <T extends TimeBlockLike>(blocks: T[]): LaidOut<T>[] => {\n const sorted = [...blocks].sort((a, b) => a.startMin - b.startMin || a.endMin - b.endMin);\n\n const groups: T[][] = [];\n let active: T[] = [];\n let current: T[] = [];\n\n for (const e of sorted) {\n active = active.filter((x) => x.endMin > e.startMin);\n const conflicts = active.some((x) => overlaps(x, e));\n\n if (!conflicts && current.length > 0) {\n groups.push(current);\n current = [];\n }\n current.push(e);\n active.push(e);\n }\n if (current.length) {\n groups.push(current);\n }\n\n const out: LaidOut<T>[] = [];\n\n for (const group of groups) {\n const g = [...group].sort((a, b) => a.startMin - b.startMin || a.endMin - b.endMin);\n const laneEnd: number[] = [];\n const laneOf = new Map<T[\"id\"], number>();\n\n for (const e of g) {\n let placed = false;\n for (let i = 0; i < laneEnd.length; i++) {\n if (laneEnd[i] <= e.startMin) {\n laneEnd[i] = e.endMin;\n laneOf.set(e.id, i);\n placed = true;\n break;\n }\n }\n if (!placed) {\n laneEnd.push(e.endMin);\n laneOf.set(e.id, laneEnd.length - 1);\n }\n }\n\n const lanes = laneEnd.length;\n for (const e of g) {\n out.push({ ...e, lane: laneOf.get(e.id) ?? 0, lanes });\n }\n }\n\n return out;\n};\n\nexport {\n clamp,\n snap,\n parseHHMM,\n fullName,\n dayISO,\n shiftDays,\n dateAtMinute,\n minutesFromDayStart,\n overlaps,\n layoutOverlaps,\n};\n","import * as React from \"react\";\nimport { BOTTOM_PAD, GUTTER_W, MIN_EVENT_MIN, PX_PER_MIN, RESOURCE_MIN_W, STEP_MIN, TOP_PAD } from \"./constants\";\nimport { clamp, dateAtMinute, dayISO, fullName, layoutOverlaps, minutesFromDayStart, overlaps, parseHHMM, shiftDays, snap } from \"./utils\";\nimport type { BaseSchedulerResource, SchedulerDragState, SchedulerEvent, SchedulerId, SchedulerProps } from \"../types/scheduler\";\n\nfunction isNameLike(resource: unknown): resource is { firstName?: string | null; lastName?: string | null } {\n if (!resource || typeof resource !== \"object\") {\n return false;\n }\n const maybe = resource as { firstName?: unknown; lastName?: unknown };\n return typeof maybe.firstName === \"string\" || typeof maybe.lastName === \"string\";\n}\n\nexport function Scheduler<TAppointment, TResource extends BaseSchedulerResource<TResourceId>, TResourceId extends SchedulerId>({\n resources,\n appointments,\n selectedDate,\n onSelectedDateChange,\n adapter,\n onPersistMoveResize,\n onAppointmentChange,\n renderResourceHeader,\n renderAppointment,\n getResourceAppointmentBackground,\n renderDatePicker,\n prevButtonLabel = \"Prev\",\n nextButtonLabel = \"Next\",\n dayStart = \"09:00\",\n dayEnd = \"18:00\"\n}: SchedulerProps<TAppointment, TResource, TResourceId>) {\n const [drag, setDrag] = React.useState<SchedulerDragState<TResourceId>>({ kind: \"none\" });\n const colRefs = React.useRef<Record<string, HTMLDivElement | null>>({});\n const suppressClickRef = React.useRef(false);\n\n const dayStartAbs = parseHHMM(dayStart);\n const dayEndAbs = parseHHMM(dayEnd);\n const dayMinutes = Math.max(0, dayEndAbs - dayStartAbs);\n const gridHeight = TOP_PAD + dayMinutes * PX_PER_MIN + BOTTOM_PAD;\n const gridMinWidth = GUTTER_W + Math.max(resources.length, 1) * RESOURCE_MIN_W;\n const selectedISO = React.useMemo(() => dayISO(selectedDate), [selectedDate]);\n\n const renderAppts = React.useMemo<SchedulerEvent<TAppointment, TResourceId>[]>(() => {\n return appointments\n .map((appointment) => {\n const start = new Date(adapter.getStart(appointment));\n const end = new Date(adapter.getEnd(appointment));\n return {\n raw: appointment,\n id: adapter.getId(appointment),\n resourceId: adapter.getResourceId(appointment),\n start,\n end,\n startMin: clamp(minutesFromDayStart(dayStartAbs, start), 0, dayMinutes),\n endMin: clamp(minutesFromDayStart(dayStartAbs, end), 0, dayMinutes),\n title: adapter.getTitle(appointment)\n };\n })\n .filter((appointment) => dayISO(appointment.start) === selectedISO);\n }, [appointments, adapter, dayStartAbs, dayMinutes, selectedISO]);\n\n const appointmentMap = React.useMemo(() => {\n return new Map(renderAppts.map((appointment) => [appointment.id, appointment]));\n }, [renderAppts]);\n\n const effectiveAppts = React.useMemo<SchedulerEvent<TAppointment, TResourceId>[]>(() => {\n if (drag.kind === \"none\") {\n return renderAppts;\n }\n return renderAppts.map((appointment) => {\n if (appointment.id !== drag.appointmentId) {\n return appointment;\n }\n return {\n ...appointment,\n resourceId: drag.resourceId,\n startMin: drag.startMin,\n endMin: drag.endMin,\n start: dateAtMinute(selectedDate, dayStartAbs, drag.startMin),\n end: dateAtMinute(selectedDate, dayStartAbs, drag.endMin)\n };\n });\n }, [drag, renderAppts, selectedDate, dayStartAbs]);\n\n const laidOutByResource = React.useMemo(() => {\n const byResource = new Map<TResourceId, ReturnType<typeof layoutOverlaps<SchedulerEvent<TAppointment, TResourceId>>>>();\n for (const resource of resources) {\n const events = effectiveAppts.filter((appointment) => appointment.resourceId === resource.id);\n byResource.set(resource.id, layoutOverlaps(events));\n }\n return byResource;\n }, [effectiveAppts, resources]);\n\n const appointmentBgByResource = React.useMemo(() => {\n const map = new Map<TResourceId, string | undefined>();\n if (!getResourceAppointmentBackground) {\n return map;\n }\n for (const resource of resources) {\n map.set(resource.id, getResourceAppointmentBackground(resource));\n }\n return map;\n }, [getResourceAppointmentBackground, resources]);\n\n const pointerToMin = (resourceId: TResourceId, clientY: number) => {\n const col = colRefs.current[String(resourceId)];\n if (!col) {\n return 0;\n }\n const y = clientY - col.getBoundingClientRect().top - TOP_PAD;\n return clamp(snap(y / PX_PER_MIN), 0, dayMinutes);\n };\n\n const pointerToResourceId = (clientX: number, fallbackResourceId: TResourceId) => {\n for (const resource of resources) {\n const col = colRefs.current[String(resource.id)];\n if (!col) {\n continue;\n }\n const rect = col.getBoundingClientRect();\n if (clientX >= rect.left && clientX <= rect.right) {\n return resource.id;\n }\n }\n return fallbackResourceId;\n };\n\n const hasOverlap = (appointmentId: SchedulerId, resourceId: TResourceId, startMin: number, endMin: number) => {\n const events = renderAppts.filter((appointment) => appointment.resourceId === resourceId && appointment.id !== appointmentId);\n return events.some((appointment) => overlaps(appointment, { id: appointmentId, startMin, endMin }));\n };\n\n const persistDrag = async (state: Exclude<SchedulerDragState<TResourceId>, { kind: \"none\" }>) => {\n const target = appointmentMap.get(state.appointmentId);\n if (!target) {\n return;\n }\n if (hasOverlap(state.appointmentId, state.resourceId, state.startMin, state.endMin)) {\n return;\n }\n const next = {\n resourceId: state.resourceId,\n start: dateAtMinute(selectedDate, dayStartAbs, state.startMin),\n end: dateAtMinute(selectedDate, dayStartAbs, state.endMin)\n };\n\n if (onAppointmentChange) {\n await onAppointmentChange({\n kind: state.kind,\n appointment: target.raw,\n previous: {\n resourceId: target.resourceId,\n start: target.start,\n end: target.end\n },\n next\n });\n return;\n }\n\n if (onPersistMoveResize) {\n await onPersistMoveResize({\n appointment: target.raw,\n resourceId: next.resourceId,\n start: next.start,\n end: next.end\n });\n }\n };\n\n const onApptPointerDown = (event: React.PointerEvent, appointment: SchedulerEvent<TAppointment, TResourceId>) => {\n if (event.button !== 0) {\n return;\n }\n event.stopPropagation();\n suppressClickRef.current = false;\n const pointerMin = pointerToMin(appointment.resourceId, event.clientY);\n setDrag({\n kind: \"move\",\n appointmentId: appointment.id,\n pointerId: event.pointerId,\n resourceId: appointment.resourceId,\n durationMin: Math.max(MIN_EVENT_MIN, appointment.endMin - appointment.startMin),\n offsetMin: pointerMin - appointment.startMin,\n startMin: appointment.startMin,\n endMin: appointment.endMin\n });\n };\n\n const onResizePointerDown = (event: React.PointerEvent, appointment: SchedulerEvent<TAppointment, TResourceId>) => {\n if (event.button !== 0) {\n return;\n }\n event.stopPropagation();\n suppressClickRef.current = false;\n setDrag({\n kind: \"resize\",\n appointmentId: appointment.id,\n pointerId: event.pointerId,\n resourceId: appointment.resourceId,\n startMin: appointment.startMin,\n endMin: appointment.endMin\n });\n };\n\n const onGlobalPointerMove = (event: React.PointerEvent<HTMLElement>) => {\n if (drag.kind === \"none\") {\n return;\n }\n\n if (drag.kind === \"move\") {\n const nextResourceId = pointerToResourceId(event.clientX, drag.resourceId);\n const pointerMin = pointerToMin(nextResourceId, event.clientY);\n const rawStart = pointerMin - drag.offsetMin;\n const nextStartMin = clamp(snap(rawStart), 0, dayMinutes - drag.durationMin);\n const nextEndMin = nextStartMin + drag.durationMin;\n if (nextStartMin !== drag.startMin || nextEndMin !== drag.endMin || nextResourceId !== drag.resourceId) {\n suppressClickRef.current = true;\n setDrag({\n ...drag,\n resourceId: nextResourceId,\n startMin: nextStartMin,\n endMin: nextEndMin\n });\n }\n return;\n }\n\n const pointerMin = pointerToMin(drag.resourceId, event.clientY);\n const nextEndMin = clamp(snap(pointerMin), drag.startMin + MIN_EVENT_MIN, dayMinutes);\n if (nextEndMin !== drag.endMin) {\n suppressClickRef.current = true;\n setDrag({\n ...drag,\n endMin: nextEndMin\n });\n }\n };\n\n const onGlobalPointerUp = () => {\n if (drag.kind === \"none\") {\n return;\n }\n const current = drag;\n setDrag({ kind: \"none\" });\n if (suppressClickRef.current) {\n void persistDrag(current);\n }\n };\n\n return (\n <section\n className={`rfs-root ${drag.kind === \"move\" ? \"rfs-root--drag-move\" : \"\"} ${drag.kind === \"resize\" ? \"rfs-root--drag-resize\" : \"\"}`}\n onPointerMove={onGlobalPointerMove}\n onPointerUp={onGlobalPointerUp}\n onPointerCancel={onGlobalPointerUp}\n >\n <div className=\"rfs-toolbar\">\n <button className=\"rfs-btn\" type=\"button\" onClick={() => onSelectedDateChange(shiftDays(selectedDate, -1))}>\n {prevButtonLabel}\n </button>\n {renderDatePicker ? (\n renderDatePicker({ selectedDate, onSelectedDateChange })\n ) : (\n <strong className=\"rfs-date-label\">{selectedISO}</strong>\n )}\n <button className=\"rfs-btn\" type=\"button\" onClick={() => onSelectedDateChange(shiftDays(selectedDate, 1))}>\n {nextButtonLabel}\n </button>\n </div>\n\n <div className=\"rfs-shell\">\n <div style={{ minWidth: gridMinWidth }}>\n <div className=\"rfs-header\">\n <div className=\"rfs-gutter\" style={{ width: GUTTER_W }} />\n {resources.map((resource) => (\n <div key={String(resource.id)} className=\"rfs-resource-header\" style={{ minWidth: RESOURCE_MIN_W, flex: 1 }}>\n {renderResourceHeader(resource)}\n {isNameLike(resource) ? <div className=\"rfs-resource-subtitle\">{fullName(resource)}</div> : null}\n </div>\n ))}\n </div>\n <div className=\"rfs-body\">\n <div className=\"rfs-times\" style={{ width: GUTTER_W, height: gridHeight }}>\n {Array.from({ length: Math.floor(dayMinutes / 60) + 1 }).map((_, i) => (\n <div key={`tick-${i}`} className=\"rfs-time-tick\" style={{ top: TOP_PAD + i * 60 * PX_PER_MIN }}>\n {String(Math.floor((dayStartAbs + i * 60) / 60)).padStart(2, \"0\")}:\n {String((dayStartAbs + i * 60) % 60).padStart(2, \"0\")}\n </div>\n ))}\n </div>\n <div className=\"rfs-grid\">\n {resources.map((resource) => (\n <div key={String(resource.id)} className=\"rfs-col\" style={{ minWidth: RESOURCE_MIN_W, flex: 1 }}>\n <div\n ref={(el) => {\n colRefs.current[String(resource.id)] = el;\n }}\n className=\"rfs-col-inner\"\n style={{ height: gridHeight }}\n >\n {Array.from({ length: Math.floor(dayMinutes / 60) + 1 }).map((_, i) => (\n <div\n key={`major-${String(resource.id)}-${i}`}\n className=\"rfs-hour-line\"\n style={{ top: TOP_PAD + i * 60 * PX_PER_MIN }}\n />\n ))}\n {Array.from({ length: Math.floor(dayMinutes / STEP_MIN) + 1 }).map((_, i) => (\n <div\n key={`minor-${String(resource.id)}-${i}`}\n className=\"rfs-slot-line\"\n style={{ top: TOP_PAD + i * STEP_MIN * PX_PER_MIN }}\n />\n ))}\n {(laidOutByResource.get(resource.id) ?? []).map((appointment) => {\n const laneWidthPct = 100 / appointment.lanes;\n const top = TOP_PAD + appointment.startMin * PX_PER_MIN;\n const height = Math.max(MIN_EVENT_MIN * PX_PER_MIN, (appointment.endMin - appointment.startMin) * PX_PER_MIN);\n const appointmentBackgroundColor = appointmentBgByResource.get(resource.id);\n return (\n <div\n key={String(appointment.id)}\n className=\"rfs-card-slot\"\n style={{\n top,\n left: `${laneWidthPct * appointment.lane}%`,\n width: `${laneWidthPct}%`,\n height\n }}\n >\n {renderAppointment({\n appointment,\n onPointerDown: (event) => onApptPointerDown(event, appointment),\n onResizePointerDown: (event) => onResizePointerDown(event, appointment),\n appointmentBackgroundColor,\n drag,\n suppressClickRef\n })}\n </div>\n );\n })}\n </div>\n </div>\n ))}\n </div>\n </div>\n </div>\n </div>\n </section>\n );\n}\n"]}
@@ -0,0 +1,97 @@
1
+ import React, { RefObject } from 'react';
2
+ import * as react_jsx_runtime from 'react/jsx-runtime';
3
+
4
+ type SchedulerAppointmentAdapter<TAppointment, TResourceId extends string | number> = {
5
+ getId: (item: TAppointment) => number | string;
6
+ getResourceId: (item: TAppointment) => TResourceId;
7
+ getStart: (item: TAppointment) => Date | string;
8
+ getEnd: (item: TAppointment) => Date | string;
9
+ getTitle: (item: TAppointment) => string;
10
+ };
11
+ type SchedulerId = string | number;
12
+ type BaseSchedulerResource<TId extends SchedulerId = number> = {
13
+ id: TId;
14
+ label: string;
15
+ };
16
+ type SchedulerEvent<TAppointment, TResourceId extends SchedulerId> = {
17
+ raw: TAppointment;
18
+ id: SchedulerId;
19
+ resourceId: TResourceId;
20
+ start: Date;
21
+ end: Date;
22
+ startMin: number;
23
+ endMin: number;
24
+ title: string;
25
+ };
26
+ type SchedulerDragState<TResourceId extends SchedulerId> = {
27
+ kind: "none";
28
+ } | {
29
+ kind: "move";
30
+ appointmentId: SchedulerId;
31
+ pointerId: number;
32
+ resourceId: TResourceId;
33
+ offsetMin: number;
34
+ durationMin: number;
35
+ startMin: number;
36
+ endMin: number;
37
+ } | {
38
+ kind: "resize";
39
+ appointmentId: SchedulerId;
40
+ pointerId: number;
41
+ resourceId: TResourceId;
42
+ startMin: number;
43
+ endMin: number;
44
+ };
45
+ type RenderSchedulerAppt<TAppointment, TResourceId extends SchedulerId> = SchedulerEvent<TAppointment, TResourceId>;
46
+ type SchedulerProps<TAppointment, TResource extends BaseSchedulerResource<TResourceId>, TResourceId extends SchedulerId> = {
47
+ resources: TResource[];
48
+ appointments: TAppointment[];
49
+ selectedDate: Date;
50
+ onSelectedDateChange: (date: Date) => void;
51
+ adapter: SchedulerAppointmentAdapter<TAppointment, TResourceId>;
52
+ onPersistMoveResize?: (args: {
53
+ appointment: TAppointment;
54
+ resourceId: TResourceId;
55
+ start: Date;
56
+ end: Date;
57
+ }) => Promise<void> | void;
58
+ onAppointmentChange?: (args: {
59
+ kind: "move" | "resize";
60
+ appointment: TAppointment;
61
+ previous: {
62
+ resourceId: TResourceId;
63
+ start: Date;
64
+ end: Date;
65
+ };
66
+ next: {
67
+ resourceId: TResourceId;
68
+ start: Date;
69
+ end: Date;
70
+ };
71
+ }) => Promise<void> | void;
72
+ renderResourceHeader: (resource: TResource) => React.ReactNode;
73
+ renderAppointment: (args: {
74
+ appointment: SchedulerEvent<TAppointment, TResourceId> & {
75
+ lane: number;
76
+ lanes: number;
77
+ };
78
+ onPointerDown: (e: React.PointerEvent) => void;
79
+ onResizePointerDown: (e: React.PointerEvent) => void;
80
+ appointmentBackgroundColor?: string;
81
+ drag: SchedulerDragState<TResourceId>;
82
+ suppressClickRef: RefObject<boolean>;
83
+ }) => React.ReactNode;
84
+ getResourceAppointmentBackground?: (resource: TResource) => string | undefined;
85
+ renderDatePicker?: (args: {
86
+ selectedDate: Date;
87
+ onSelectedDateChange: (date: Date) => void;
88
+ }) => React.ReactNode;
89
+ prevButtonLabel?: React.ReactNode;
90
+ nextButtonLabel?: React.ReactNode;
91
+ dayStart?: string;
92
+ dayEnd?: string;
93
+ };
94
+
95
+ declare function Scheduler<TAppointment, TResource extends BaseSchedulerResource<TResourceId>, TResourceId extends SchedulerId>({ resources, appointments, selectedDate, onSelectedDateChange, adapter, onPersistMoveResize, onAppointmentChange, renderResourceHeader, renderAppointment, getResourceAppointmentBackground, renderDatePicker, prevButtonLabel, nextButtonLabel, dayStart, dayEnd }: SchedulerProps<TAppointment, TResource, TResourceId>): react_jsx_runtime.JSX.Element;
96
+
97
+ export { type BaseSchedulerResource, type RenderSchedulerAppt, Scheduler, type SchedulerAppointmentAdapter, type SchedulerDragState, type SchedulerEvent, type SchedulerId, type SchedulerProps };
@@ -0,0 +1,97 @@
1
+ import React, { RefObject } from 'react';
2
+ import * as react_jsx_runtime from 'react/jsx-runtime';
3
+
4
+ type SchedulerAppointmentAdapter<TAppointment, TResourceId extends string | number> = {
5
+ getId: (item: TAppointment) => number | string;
6
+ getResourceId: (item: TAppointment) => TResourceId;
7
+ getStart: (item: TAppointment) => Date | string;
8
+ getEnd: (item: TAppointment) => Date | string;
9
+ getTitle: (item: TAppointment) => string;
10
+ };
11
+ type SchedulerId = string | number;
12
+ type BaseSchedulerResource<TId extends SchedulerId = number> = {
13
+ id: TId;
14
+ label: string;
15
+ };
16
+ type SchedulerEvent<TAppointment, TResourceId extends SchedulerId> = {
17
+ raw: TAppointment;
18
+ id: SchedulerId;
19
+ resourceId: TResourceId;
20
+ start: Date;
21
+ end: Date;
22
+ startMin: number;
23
+ endMin: number;
24
+ title: string;
25
+ };
26
+ type SchedulerDragState<TResourceId extends SchedulerId> = {
27
+ kind: "none";
28
+ } | {
29
+ kind: "move";
30
+ appointmentId: SchedulerId;
31
+ pointerId: number;
32
+ resourceId: TResourceId;
33
+ offsetMin: number;
34
+ durationMin: number;
35
+ startMin: number;
36
+ endMin: number;
37
+ } | {
38
+ kind: "resize";
39
+ appointmentId: SchedulerId;
40
+ pointerId: number;
41
+ resourceId: TResourceId;
42
+ startMin: number;
43
+ endMin: number;
44
+ };
45
+ type RenderSchedulerAppt<TAppointment, TResourceId extends SchedulerId> = SchedulerEvent<TAppointment, TResourceId>;
46
+ type SchedulerProps<TAppointment, TResource extends BaseSchedulerResource<TResourceId>, TResourceId extends SchedulerId> = {
47
+ resources: TResource[];
48
+ appointments: TAppointment[];
49
+ selectedDate: Date;
50
+ onSelectedDateChange: (date: Date) => void;
51
+ adapter: SchedulerAppointmentAdapter<TAppointment, TResourceId>;
52
+ onPersistMoveResize?: (args: {
53
+ appointment: TAppointment;
54
+ resourceId: TResourceId;
55
+ start: Date;
56
+ end: Date;
57
+ }) => Promise<void> | void;
58
+ onAppointmentChange?: (args: {
59
+ kind: "move" | "resize";
60
+ appointment: TAppointment;
61
+ previous: {
62
+ resourceId: TResourceId;
63
+ start: Date;
64
+ end: Date;
65
+ };
66
+ next: {
67
+ resourceId: TResourceId;
68
+ start: Date;
69
+ end: Date;
70
+ };
71
+ }) => Promise<void> | void;
72
+ renderResourceHeader: (resource: TResource) => React.ReactNode;
73
+ renderAppointment: (args: {
74
+ appointment: SchedulerEvent<TAppointment, TResourceId> & {
75
+ lane: number;
76
+ lanes: number;
77
+ };
78
+ onPointerDown: (e: React.PointerEvent) => void;
79
+ onResizePointerDown: (e: React.PointerEvent) => void;
80
+ appointmentBackgroundColor?: string;
81
+ drag: SchedulerDragState<TResourceId>;
82
+ suppressClickRef: RefObject<boolean>;
83
+ }) => React.ReactNode;
84
+ getResourceAppointmentBackground?: (resource: TResource) => string | undefined;
85
+ renderDatePicker?: (args: {
86
+ selectedDate: Date;
87
+ onSelectedDateChange: (date: Date) => void;
88
+ }) => React.ReactNode;
89
+ prevButtonLabel?: React.ReactNode;
90
+ nextButtonLabel?: React.ReactNode;
91
+ dayStart?: string;
92
+ dayEnd?: string;
93
+ };
94
+
95
+ declare function Scheduler<TAppointment, TResource extends BaseSchedulerResource<TResourceId>, TResourceId extends SchedulerId>({ resources, appointments, selectedDate, onSelectedDateChange, adapter, onPersistMoveResize, onAppointmentChange, renderResourceHeader, renderAppointment, getResourceAppointmentBackground, renderDatePicker, prevButtonLabel, nextButtonLabel, dayStart, dayEnd }: SchedulerProps<TAppointment, TResource, TResourceId>): react_jsx_runtime.JSX.Element;
96
+
97
+ export { type BaseSchedulerResource, type RenderSchedulerAppt, Scheduler, type SchedulerAppointmentAdapter, type SchedulerDragState, type SchedulerEvent, type SchedulerId, type SchedulerProps };