@janus-scheduler/core 1.0.2 → 2.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.
Files changed (41) hide show
  1. package/LICENSE +15 -0
  2. package/README.md +94 -0
  3. package/dist/api/EventBus.d.ts +20 -0
  4. package/dist/api/EventBus.d.ts.map +1 -0
  5. package/dist/api/api.init.d.ts +3 -0
  6. package/dist/api/api.init.d.ts.map +1 -0
  7. package/dist/api/api.types.d.ts +309 -0
  8. package/dist/api/api.types.d.ts.map +1 -0
  9. package/dist/index.d.ts +16 -464
  10. package/dist/index.d.ts.map +1 -0
  11. package/dist/interactions/interactions.init.d.ts +1 -0
  12. package/dist/interactions/interactions.init.d.ts.map +1 -0
  13. package/dist/janus-scheduler.cjs +8 -0
  14. package/dist/janus-scheduler.cjs.map +1 -0
  15. package/dist/janus-scheduler.es.js +2426 -208
  16. package/dist/janus-scheduler.es.js.map +1 -1
  17. package/dist/models/assignments/assignments.d.ts +15 -0
  18. package/dist/models/assignments/assignments.d.ts.map +1 -0
  19. package/dist/models/events/event.d.ts +19 -0
  20. package/dist/models/events/event.d.ts.map +1 -0
  21. package/dist/models/resources/resources.d.ts +19 -0
  22. package/dist/models/resources/resources.d.ts.map +1 -0
  23. package/dist/rendering/rendering.init.d.ts +1 -0
  24. package/dist/rendering/rendering.init.d.ts.map +1 -0
  25. package/dist/services/SchedulerManager.service.d.ts +284 -0
  26. package/dist/services/SchedulerManager.service.d.ts.map +1 -0
  27. package/dist/store/index.d.ts +2 -0
  28. package/dist/store/index.d.ts.map +1 -0
  29. package/dist/store/scheduler.store.d.ts +45 -0
  30. package/dist/store/scheduler.store.d.ts.map +1 -0
  31. package/dist/types/event.types.d.ts +15 -0
  32. package/dist/types/event.types.d.ts.map +1 -0
  33. package/dist/utils/conflict.d.ts +54 -0
  34. package/dist/utils/conflict.d.ts.map +1 -0
  35. package/dist/utils/recurrence.d.ts +9 -0
  36. package/dist/utils/recurrence.d.ts.map +1 -0
  37. package/dist/utils/time.d.ts +42 -0
  38. package/dist/utils/time.d.ts.map +1 -0
  39. package/package.json +45 -14
  40. package/dist/janus-scheduler.cjs.js +0 -2
  41. package/dist/janus-scheduler.cjs.js.map +0 -1
package/LICENSE ADDED
@@ -0,0 +1,15 @@
1
+ ISC License
2
+
3
+ Copyright (c) 2026 Janus Scheduler
4
+
5
+ Permission to use, copy, modify, and/or distribute this software for any
6
+ purpose with or without fee is hereby granted, provided that the above
7
+ copyright notice and this permission notice appear in all copies.
8
+
9
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10
+ WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11
+ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12
+ ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13
+ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14
+ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15
+ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,94 @@
1
+ # @janus-scheduler/core
2
+
3
+ The framework-agnostic engine behind **Janus Scheduler**: a vanilla Zustand store, the `SchedulerManager` facade, domain models, timezone-aware conflict detection, and RRule recurrence expansion.
4
+
5
+ ```bash
6
+ npm install @janus-scheduler/core
7
+ ```
8
+
9
+ > **You probably don't need to install this directly.** It comes with every framework package (`@janus-scheduler/react`, `/angular`, `/solid`) and with `@janus-scheduler/app`, each of which re-exports everything here. Install it on its own only if you are building your own UI on top of the engine.
10
+
11
+ ## SchedulerManager
12
+
13
+ The public API. Every mutating method is **optimistic with automatic rollback**: it writes to the store immediately so the UI never lags, then fires the matching lifecycle hook. If that hook throws or its promise rejects, the store change is reverted and `onError` fires.
14
+
15
+ ```ts
16
+ import { SchedulerManager } from "@janus-scheduler/core";
17
+
18
+ const manager = new SchedulerManager({
19
+ onEventAdd: (event) => api.create(event), // reverted if this rejects
20
+ onEventUpdate: (event) => api.update(event),
21
+ onEventDelete: (id) => api.remove(id),
22
+ onError: ({ operation, error, reverted }) =>
23
+ console.error(operation, error, reverted),
24
+ });
25
+
26
+ manager.addResource({
27
+ id: "r1",
28
+ name: "Alice",
29
+ type: "person", // "person" requires a non-empty email
30
+ email: "alice@example.com",
31
+ });
32
+
33
+ manager.addEvent({
34
+ id: "e1",
35
+ title: "Standup",
36
+ startTime: "2026-09-02T09:00:00.000Z",
37
+ endTime: "2026-09-02T09:30:00.000Z",
38
+ resourceIds: ["r1"],
39
+ status: "confirmed",
40
+ });
41
+ ```
42
+
43
+ Events: `addEvent`, `batchAddEvents`, `updateEvent`, `deleteEvent`, `getEvent`, `getAllEvents`, `getEventsByResource`, `getEventsByDate`, `getEventCount`.
44
+ Resources: `addResource`, `updateResource`, `deleteResource`, `getResource`, `getAllResources`, `getResourceCount`.
45
+ Assignments: `addAssignment`, `deleteAssignment`, `getAssignmentsByEvent`, `getAssignmentsByResource`.
46
+ Undo: `canUndo`, `peekUndo`, `undo`, `subscribeUndo`.
47
+ Other: `getTimezone`, `clearAll`.
48
+
49
+ ## The store
50
+
51
+ `SchedulerManager` has **no `.store` property**. Import the store directly. `events` and `resources` are `Record<string, T>`, not arrays:
52
+
53
+ ```ts
54
+ import { schedulerStore } from "@janus-scheduler/core";
55
+
56
+ const unsubscribe = schedulerStore.subscribe((state) => {
57
+ console.log(Object.values(state.events));
58
+ });
59
+ ```
60
+
61
+ It is a module-level singleton — one scheduler per page. Do not write to it directly from application code; go through `SchedulerManager` so hooks and rollback still apply.
62
+
63
+ ## Conflict detection
64
+
65
+ ```ts
66
+ import {
67
+ computeTimelineConflicts,
68
+ checkSlotConflict,
69
+ } from "@janus-scheduler/core";
70
+ ```
71
+
72
+ Timezone-aware double-booking detection across resources. The UI packages use these to drive the warning banner and the blocking dialog.
73
+
74
+ ## Recurrence
75
+
76
+ ```ts
77
+ import { expandEvents } from "@janus-scheduler/core";
78
+ ```
79
+
80
+ Expands an event's `recurrenceRule` (an RRule string) into concrete occurrences. Occurrence ids follow `<parentId>_occ_<timestampMs>`, and `getEvent` / `updateEvent` / `deleteEvent` resolve them back to the parent automatically.
81
+
82
+ ## Timezone utilities
83
+
84
+ `getBrowserTimezone`, `isoToZonedDisplay`, `zonedInputToISO`, `getUtcMsForZonedDatetime`, `formatTimezoneLabel`, `getAllTimezones`.
85
+
86
+ Events are stored as UTC ISO strings; these convert to and from wall-clock date + time in a given IANA zone.
87
+
88
+ ## Documentation
89
+
90
+ Full docs and the framework packages: [Janus-scheduler/main-program](https://github.com/Janus-scheduler/main-program).
91
+
92
+ ## Licence
93
+
94
+ ISC
@@ -0,0 +1,20 @@
1
+ import { JanusEventMap } from './api.types';
2
+ type EventHandler<K extends keyof JanusEventMap> = (payload: JanusEventMap[K]) => void;
3
+ export declare class JanusEventBus {
4
+ private listeners;
5
+ /**
6
+ * Subscribe to a Janus Scheduler event.
7
+ */
8
+ on<K extends keyof JanusEventMap>(event: K, handler: EventHandler<K>): void;
9
+ /**
10
+ * Unsubscribe from a Janus Scheduler event.
11
+ */
12
+ off<K extends keyof JanusEventMap>(event: K, handler: EventHandler<K>): void;
13
+ /**
14
+ * Emit an event to all subscribers.
15
+ */
16
+ emit<K extends keyof JanusEventMap>(event: K, payload: JanusEventMap[K]): void;
17
+ }
18
+ export declare const janusEventBus: JanusEventBus;
19
+ export {};
20
+ //# sourceMappingURL=EventBus.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EventBus.d.ts","sourceRoot":"","sources":["../../src/api/EventBus.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,KAAK,YAAY,CAAC,CAAC,SAAS,MAAM,aAAa,IAAI,CACjD,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC,KACtB,IAAI,CAAC;AAEV,qBAAa,aAAa;IACxB,OAAO,CAAC,SAAS,CAEV;IAEP;;OAEG;IACH,EAAE,CAAC,CAAC,SAAS,MAAM,aAAa,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,IAAI;IAO3E;;OAEG;IACH,GAAG,CAAC,CAAC,SAAS,MAAM,aAAa,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,IAAI;IAS5E;;OAEG;IACH,IAAI,CAAC,CAAC,SAAS,MAAM,aAAa,EAChC,KAAK,EAAE,CAAC,EACR,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC,GACxB,IAAI;CAUR;AAED,eAAO,MAAM,aAAa,eAAsB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export * from './api.types';
2
+ export * from './EventBus';
3
+ //# sourceMappingURL=api.init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.init.d.ts","sourceRoot":"","sources":["../../src/api/api.init.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC"}
@@ -0,0 +1,309 @@
1
+ /**
2
+ * Color options for scheduler events.
3
+ * Used in both TimelineEvent and MonthEvent.
4
+ */
5
+ export type EventColor = "primary" | "orange" | "blue" | "yellow" | "purple" | "green" | "red" | "pink" | "indigo" | "cyan" | "teal";
6
+ /**
7
+ * The supported calendar views.
8
+ *
9
+ * "Day" and "Week" are the hour-grid (time-grid) views; "Month" is the
10
+ * calendar grid; "Timeline" is the horizontal resource/time-axis view;
11
+ * "Year" is the yearly grid view.
12
+ */
13
+ export type ViewType = "Timeline" | "Month" | "Week" | "Day" | "Year";
14
+ export interface TimelineEvent {
15
+ id: string;
16
+ title: string;
17
+ resourceId?: string;
18
+ startTime: string;
19
+ endTime: string;
20
+ /** Unix timestamp in ms — used for absolute positioning */
21
+ startMs: number;
22
+ /** Unix timestamp in ms — used for absolute positioning */
23
+ endMs: number;
24
+ color: EventColor;
25
+ date?: string;
26
+ allDay?: boolean;
27
+ recurrenceRule?: string;
28
+ }
29
+ export interface TimelineResource {
30
+ id: string;
31
+ name: string;
32
+ subtitle: string;
33
+ avatarType: "initials" | "icon" | "image";
34
+ avatar?: string;
35
+ avatarIcon?: string;
36
+ groupLabel?: string;
37
+ events: TimelineEvent[];
38
+ }
39
+ export interface EventMoveDetail {
40
+ event: TimelineEvent;
41
+ oldResourceId: string;
42
+ newResourceId: string;
43
+ newStartTime: string;
44
+ newEndTime: string;
45
+ hasConflict?: boolean;
46
+ conflictMessage?: string;
47
+ }
48
+ export interface EventResizeDetail {
49
+ event: TimelineEvent;
50
+ resourceId: string;
51
+ newStartTime: string;
52
+ newEndTime: string;
53
+ hasConflict?: boolean;
54
+ conflictMessage?: string;
55
+ }
56
+ export interface EventCreateDetail {
57
+ resourceId: string;
58
+ startTime: string;
59
+ endTime: string;
60
+ date: string;
61
+ hasConflict?: boolean;
62
+ conflictMessage?: string;
63
+ }
64
+ export interface MonthEvent {
65
+ id: string;
66
+ title: string;
67
+ color: EventColor;
68
+ date: string;
69
+ startTime?: string;
70
+ endTime?: string;
71
+ allDay?: boolean;
72
+ recurrenceRule?: string;
73
+ isMultiDay?: boolean;
74
+ spanPosition?: "start" | "middle" | "end" | "single";
75
+ startDate?: string;
76
+ endDate?: string;
77
+ }
78
+ /**
79
+ * Detailed payload emitted when a day cell, header, or overflow link is clicked in Month Grid.
80
+ */
81
+ export interface DayClickDetail {
82
+ /** "YYYY-MM-DD" */
83
+ date: string;
84
+ /** Exact click target source */
85
+ source?: "header" | "cell" | "more";
86
+ /** All month events occurring on this date */
87
+ events?: MonthEvent[];
88
+ /** The native browser click event if available */
89
+ jsEvent?: MouseEvent;
90
+ }
91
+ /**
92
+ * Payload emitted when a day header/number badge is clicked (typically navigates to Day View).
93
+ */
94
+ export interface DayHeaderClickDetail {
95
+ /** "YYYY-MM-DD" */
96
+ date: string;
97
+ jsEvent?: MouseEvent;
98
+ }
99
+ /**
100
+ * Payload emitted when an empty slot or cell body in the Month Grid is clicked to create an event.
101
+ */
102
+ export interface MonthSlotSelectDetail {
103
+ /** "YYYY-MM-DD" */
104
+ date: string;
105
+ jsEvent?: MouseEvent;
106
+ }
107
+ /**
108
+ * Payload emitted when the "+N more" overflow indicator on a Month Grid day cell is clicked.
109
+ */
110
+ export interface MonthMoreClickDetail {
111
+ /** "YYYY-MM-DD" */
112
+ date: string;
113
+ /** All events occurring on this day */
114
+ events: MonthEvent[];
115
+ /** Number of hidden events that could not fit in the cell row */
116
+ hiddenCount: number;
117
+ jsEvent?: MouseEvent;
118
+ }
119
+ /**
120
+ * A resource attached to an hour-grid event, resolved down to just what the
121
+ * event card needs to draw an avatar.
122
+ *
123
+ * Kept deliberately smaller than `TimelineResource`: the hour-grid views have
124
+ * no resource axis, so they never need a resource's own event list.
125
+ */
126
+ export interface TimeGridEventResource {
127
+ id: string;
128
+ name: string;
129
+ /** Image URL, when the resource has one. */
130
+ avatar?: string;
131
+ type?: "person" | "room" | "equipment";
132
+ }
133
+ /**
134
+ * One event segment as rendered by the hour-grid views (`<janus-day-grid>` /
135
+ * `<janus-week-grid>`).
136
+ *
137
+ * A single stored event produces one segment per calendar day it touches, with
138
+ * `startTime`/`endTime` already clamped to that day — so the view can position
139
+ * it without doing any timezone maths of its own.
140
+ */
141
+ export interface TimeGridEvent {
142
+ id: string;
143
+ title: string;
144
+ color: EventColor;
145
+ /** "YYYY-MM-DD" — the day column this segment belongs to. */
146
+ date: string;
147
+ /** "HH:MM" 24h, clamped to `date`. "00:00" when the event started earlier. */
148
+ startTime: string;
149
+ /** "HH:MM" 24h, clamped to `date`. "24:00" when the event ends later. */
150
+ endTime: string;
151
+ allDay?: boolean;
152
+ recurrenceRule?: string;
153
+ isMultiDay?: boolean;
154
+ spanPosition?: "start" | "middle" | "end" | "single";
155
+ /** "YYYY-MM-DD" of the underlying event's first day. */
156
+ startDate?: string;
157
+ /** "YYYY-MM-DD" of the underlying event's last day. */
158
+ endDate?: string;
159
+ /** Unix ms of the underlying (unclamped) event start. */
160
+ startMs?: number;
161
+ /** Unix ms of the underlying (unclamped) event end. */
162
+ endMs?: number;
163
+ /**
164
+ * Resources assigned to this event, resolved from the store's resource map.
165
+ * Rendered as round avatars on the event card.
166
+ */
167
+ resources?: TimeGridEventResource[];
168
+ }
169
+ /**
170
+ * Payload emitted when a Year Grid month card header (e.g. "March") is clicked.
171
+ */
172
+ export interface YearMonthHeaderClickDetail {
173
+ year: number;
174
+ month: number;
175
+ monthName: string;
176
+ /** "YYYY-MM-01" */
177
+ date: string;
178
+ jsEvent?: MouseEvent;
179
+ }
180
+ /**
181
+ * Payload emitted when a day cell is clicked in Year Grid.
182
+ */
183
+ export interface YearDayClickDetail {
184
+ /** "YYYY-MM-DD" */
185
+ date: string;
186
+ source: "cell";
187
+ year: number;
188
+ month: number;
189
+ day: number;
190
+ jsEvent?: MouseEvent;
191
+ }
192
+ /**
193
+ * Payload emitted when a resource header/card is clicked in Timeline.
194
+ */
195
+ export interface TimelineResourceClickDetail {
196
+ resource: TimelineResource;
197
+ jsEvent?: MouseEvent;
198
+ }
199
+ /**
200
+ * Payload emitted when a super-header date on the Timeline ruler is clicked.
201
+ */
202
+ export interface TimelineHeaderDateClickDetail {
203
+ /** "YYYY-MM-DD" */
204
+ date: string;
205
+ timestamp: number;
206
+ jsEvent?: MouseEvent;
207
+ }
208
+ /**
209
+ * Payload emitted when a conflict badge or banner item in Timeline is clicked.
210
+ */
211
+ export interface TimelineConflictClickDetail {
212
+ conflictingEventIds: string[];
213
+ messages: string[];
214
+ }
215
+ /**
216
+ * Payload emitted when the TopBar date label is clicked.
217
+ */
218
+ export interface TopbarDateLabelClickDetail {
219
+ navLabel: string;
220
+ view: ViewType;
221
+ jsEvent?: MouseEvent;
222
+ }
223
+ /**
224
+ * Fired when the user clicks/drags an empty region of an hour grid.
225
+ * Times are "HH:MM" in the scheduler's display timezone.
226
+ */
227
+ export interface SlotSelectDetail {
228
+ date: string;
229
+ startTime: string;
230
+ endTime: string;
231
+ allDay?: boolean;
232
+ jsEvent?: MouseEvent;
233
+ }
234
+ /**
235
+ * Fired when the user drags an event to a new time (and, in `<janus-week-grid>`,
236
+ * a new day column) in an hour grid.
237
+ *
238
+ * Unlike Timeline's `EventMoveDetail`, there is no resource axis here — moving
239
+ * an event only ever changes its date/time. Times are "HH:MM" in the
240
+ * scheduler's display timezone, matching {@link SlotSelectDetail}.
241
+ */
242
+ export interface TimeGridEventMoveDetail {
243
+ event: TimeGridEvent;
244
+ /** "YYYY-MM-DD" the event lived on before the drag. */
245
+ oldDate: string;
246
+ /** "YYYY-MM-DD" it was dropped on — equal to `oldDate` outside Week view. */
247
+ newDate: string;
248
+ newStartTime: string;
249
+ newEndTime: string;
250
+ }
251
+ /**
252
+ * Fired when the user drags an event's top or bottom edge to change its
253
+ * duration in an hour grid. Resizing never changes the date.
254
+ */
255
+ export interface TimeGridEventResizeDetail {
256
+ event: TimeGridEvent;
257
+ date: string;
258
+ newStartTime: string;
259
+ newEndTime: string;
260
+ }
261
+ export interface SchedulerSaveData {
262
+ /** Present when editing an existing event; null/undefined when creating a new one. */
263
+ id: string | null;
264
+ title: string;
265
+ startDate: string;
266
+ startTime: string;
267
+ endDate: string;
268
+ endTime: string;
269
+ participants: string[];
270
+ description: string;
271
+ activeColor: string;
272
+ /** IANA timezone the user was viewing when they entered the times. */
273
+ timezone: string;
274
+ allDay?: boolean;
275
+ recurrenceRule?: string;
276
+ }
277
+ export interface SchedulerDeleteData {
278
+ id: string | null;
279
+ title: string;
280
+ }
281
+ export interface JanusEventMap {
282
+ "event-click": TimelineEvent;
283
+ "add-event": void;
284
+ "day-click": {
285
+ date: string;
286
+ };
287
+ "slot-select": SlotSelectDetail;
288
+ "view-change": {
289
+ view: ViewType;
290
+ };
291
+ "allow-create-change": {
292
+ allowCreate: boolean;
293
+ };
294
+ "event-move": EventMoveDetail;
295
+ "event-resize": EventResizeDetail;
296
+ "event-create": EventCreateDetail;
297
+ save: SchedulerSaveData;
298
+ delete: SchedulerDeleteData;
299
+ close: void;
300
+ }
301
+ export interface ResourceTypeConfig {
302
+ [type: string]: {
303
+ label: string;
304
+ subtitle: string;
305
+ icon?: string;
306
+ order: number;
307
+ };
308
+ }
309
+ //# sourceMappingURL=api.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.types.d.ts","sourceRoot":"","sources":["../../src/api/api.types.ts"],"names":[],"mappings":"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"}