@mintplayer/scheduler-wc 1.0.1 → 1.1.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 (40) hide show
  1. package/package.json +1 -1
  2. package/src/components/mp-scheduler.d.ts +16 -41
  3. package/src/components/mp-scheduler.js +126 -575
  4. package/src/components/mp-scheduler.js.map +1 -1
  5. package/src/drag/drag-manager.d.ts +90 -0
  6. package/src/drag/drag-manager.js +201 -0
  7. package/src/drag/drag-manager.js.map +1 -0
  8. package/src/drag/drag-preview.d.ts +42 -0
  9. package/src/drag/drag-preview.js +87 -0
  10. package/src/drag/drag-preview.js.map +1 -0
  11. package/src/drag/drag-state-machine.d.ts +102 -0
  12. package/src/drag/drag-state-machine.js +320 -0
  13. package/src/drag/drag-state-machine.js.map +1 -0
  14. package/src/drag/drag-types.d.ts +104 -0
  15. package/src/drag/drag-types.js +8 -0
  16. package/src/drag/drag-types.js.map +1 -0
  17. package/src/drag/index.d.ts +4 -0
  18. package/src/drag/index.js +5 -0
  19. package/src/drag/index.js.map +1 -0
  20. package/src/events/event-types.d.ts +43 -0
  21. package/src/events/event-types.js +2 -0
  22. package/src/events/event-types.js.map +1 -0
  23. package/src/events/index.d.ts +2 -0
  24. package/src/events/index.js +3 -0
  25. package/src/events/index.js.map +1 -0
  26. package/src/events/scheduler-event-emitter.d.ts +46 -0
  27. package/src/events/scheduler-event-emitter.js +70 -0
  28. package/src/events/scheduler-event-emitter.js.map +1 -0
  29. package/src/input/index.d.ts +2 -0
  30. package/src/input/index.js +3 -0
  31. package/src/input/index.js.map +1 -0
  32. package/src/input/input-handler.d.ts +93 -0
  33. package/src/input/input-handler.js +340 -0
  34. package/src/input/input-handler.js.map +1 -0
  35. package/src/input/pointer-event.d.ts +39 -0
  36. package/src/input/pointer-event.js +41 -0
  37. package/src/input/pointer-event.js.map +1 -0
  38. package/src/styles/scheduler.styles.d.ts +1 -1
  39. package/src/styles/scheduler.styles.js +14 -0
  40. package/src/styles/scheduler.styles.js.map +1 -1
@@ -0,0 +1,320 @@
1
+ import { DEFAULT_DRAG_CONFIG, } from './drag-types';
2
+ import { DragPreviewCalculator } from './drag-preview';
3
+ import { getPointerDistance } from '../input/pointer-event';
4
+ /**
5
+ * Explicit state machine for drag operations.
6
+ *
7
+ * States:
8
+ * - idle: No drag operation in progress
9
+ * - pending: Pointer is down, waiting for movement to exceed threshold
10
+ * - active: Drag is in progress, preview is being updated
11
+ * - completing: Drag just finished, result is available
12
+ *
13
+ * Transitions:
14
+ * - idle + POINTER_DOWN (on valid target) → pending
15
+ * - pending + POINTER_MOVE (threshold exceeded) → active
16
+ * - pending + POINTER_UP → idle (treated as click)
17
+ * - pending + CANCEL → idle
18
+ * - active + POINTER_MOVE → active (update preview)
19
+ * - active + POINTER_UP → completing
20
+ * - active + CANCEL → idle
21
+ * - completing → idle (after result is consumed)
22
+ */
23
+ export class DragStateMachine {
24
+ constructor(config = {}) {
25
+ this.state = { phase: 'idle' };
26
+ this.config = Object.assign(Object.assign({}, DEFAULT_DRAG_CONFIG), config);
27
+ this.previewCalculator = new DragPreviewCalculator(this.config);
28
+ }
29
+ /**
30
+ * Get current state (read-only).
31
+ */
32
+ getState() {
33
+ return this.state;
34
+ }
35
+ /**
36
+ * Get the current phase.
37
+ */
38
+ getPhase() {
39
+ return this.state.phase;
40
+ }
41
+ /**
42
+ * Check if drag is currently active.
43
+ */
44
+ isActive() {
45
+ return this.state.phase === 'active';
46
+ }
47
+ /**
48
+ * Check if drag is pending (waiting for threshold).
49
+ */
50
+ isPending() {
51
+ return this.state.phase === 'pending';
52
+ }
53
+ /**
54
+ * Check if in any drag-related state (pending or active).
55
+ */
56
+ isDragging() {
57
+ return this.state.phase === 'pending' || this.state.phase === 'active';
58
+ }
59
+ /**
60
+ * Get the preview event if in active state.
61
+ */
62
+ getPreview() {
63
+ return this.state.phase === 'active' ? this.state.preview : null;
64
+ }
65
+ /**
66
+ * Get the completion result if in completing state.
67
+ */
68
+ getCompletionResult() {
69
+ return this.state.phase === 'completing' ? this.state.result : null;
70
+ }
71
+ /**
72
+ * Process an event and transition to new state.
73
+ * Returns true if state changed.
74
+ */
75
+ send(event) {
76
+ const previousPhase = this.state.phase;
77
+ this.state = this.transition(event);
78
+ return this.state.phase !== previousPhase;
79
+ }
80
+ /**
81
+ * Reset to idle state.
82
+ */
83
+ reset() {
84
+ this.state = { phase: 'idle' };
85
+ }
86
+ /**
87
+ * Consume the completion result and return to idle.
88
+ * Call this after handling a completed drag.
89
+ */
90
+ consumeResult() {
91
+ if (this.state.phase === 'completing') {
92
+ const result = this.state.result;
93
+ this.state = { phase: 'idle' };
94
+ return result;
95
+ }
96
+ return null;
97
+ }
98
+ /**
99
+ * Pure transition function.
100
+ * Given current state and event, returns new state.
101
+ */
102
+ transition(event) {
103
+ switch (this.state.phase) {
104
+ case 'idle':
105
+ return this.transitionFromIdle(event);
106
+ case 'pending':
107
+ return this.transitionFromPending(event);
108
+ case 'active':
109
+ return this.transitionFromActive(event);
110
+ case 'completing':
111
+ return this.transitionFromCompleting(event);
112
+ default:
113
+ return this.state;
114
+ }
115
+ }
116
+ /**
117
+ * Transitions from idle state.
118
+ */
119
+ transitionFromIdle(event) {
120
+ var _a;
121
+ if (event.type !== 'POINTER_DOWN') {
122
+ return this.state;
123
+ }
124
+ const { target, position, slot, slotElement, immediate } = event;
125
+ // Determine operation type from target
126
+ const operationType = this.getOperationType(target);
127
+ if (!operationType) {
128
+ return this.state;
129
+ }
130
+ // Get the event being dragged (if any)
131
+ const schedulerEvent = (_a = target.event) !== null && _a !== void 0 ? _a : null;
132
+ // Check if this event is draggable
133
+ if (schedulerEvent && schedulerEvent.draggable === false) {
134
+ return this.state;
135
+ }
136
+ // For touch-initiated drags, skip pending and go directly to active
137
+ if (immediate) {
138
+ // For move operations without a slot, create one from the event's times
139
+ let startSlot = slot;
140
+ if (!startSlot && schedulerEvent && operationType === 'move') {
141
+ startSlot = {
142
+ start: schedulerEvent.start,
143
+ end: schedulerEvent.end,
144
+ };
145
+ }
146
+ if (startSlot) {
147
+ const preview = this.previewCalculator.calculatePreview(operationType, startSlot, startSlot, schedulerEvent);
148
+ if (preview) {
149
+ return {
150
+ phase: 'active',
151
+ operationType,
152
+ event: schedulerEvent,
153
+ startSlot,
154
+ currentSlot: startSlot,
155
+ preview,
156
+ originalEvent: schedulerEvent !== null && schedulerEvent !== void 0 ? schedulerEvent : undefined,
157
+ };
158
+ }
159
+ }
160
+ }
161
+ return {
162
+ phase: 'pending',
163
+ operationType,
164
+ event: schedulerEvent,
165
+ startPosition: position,
166
+ startSlot: slot,
167
+ slotElement,
168
+ };
169
+ }
170
+ /**
171
+ * Transitions from pending state.
172
+ */
173
+ transitionFromPending(event) {
174
+ var _a;
175
+ if (this.state.phase !== 'pending')
176
+ return this.state;
177
+ switch (event.type) {
178
+ case 'POINTER_MOVE': {
179
+ const distance = getPointerDistance(this.state.startPosition, event.position);
180
+ if (distance < this.config.dragThreshold) {
181
+ // Not enough movement, stay in pending
182
+ return this.state;
183
+ }
184
+ // Threshold exceeded - activate drag
185
+ return this.activateDrag(event.slot);
186
+ }
187
+ case 'POINTER_UP': {
188
+ // Released before threshold - treat as click
189
+ return {
190
+ phase: 'completing',
191
+ result: {
192
+ type: this.state.operationType,
193
+ preview: this.getInitialPreview(),
194
+ event: this.state.event,
195
+ originalEvent: (_a = this.state.event) !== null && _a !== void 0 ? _a : undefined,
196
+ wasClick: true,
197
+ },
198
+ };
199
+ }
200
+ case 'CANCEL':
201
+ return { phase: 'idle' };
202
+ default:
203
+ return this.state;
204
+ }
205
+ }
206
+ /**
207
+ * Transitions from active state.
208
+ */
209
+ transitionFromActive(event) {
210
+ var _a;
211
+ if (this.state.phase !== 'active')
212
+ return this.state;
213
+ switch (event.type) {
214
+ case 'POINTER_MOVE': {
215
+ if (!event.slot) {
216
+ // No valid slot under pointer, keep current state
217
+ return this.state;
218
+ }
219
+ // Calculate new preview
220
+ const preview = this.previewCalculator.calculatePreview(this.state.operationType, this.state.startSlot, event.slot, (_a = this.state.originalEvent) !== null && _a !== void 0 ? _a : null);
221
+ if (!preview) {
222
+ return this.state;
223
+ }
224
+ return Object.assign(Object.assign({}, this.state), { currentSlot: event.slot, preview });
225
+ }
226
+ case 'POINTER_UP': {
227
+ return {
228
+ phase: 'completing',
229
+ result: {
230
+ type: this.state.operationType,
231
+ preview: this.state.preview,
232
+ event: this.state.event,
233
+ originalEvent: this.state.originalEvent,
234
+ wasClick: false,
235
+ },
236
+ };
237
+ }
238
+ case 'CANCEL':
239
+ return { phase: 'idle' };
240
+ default:
241
+ return this.state;
242
+ }
243
+ }
244
+ /**
245
+ * Transitions from completing state.
246
+ */
247
+ transitionFromCompleting(event) {
248
+ // Any event from completing goes to idle
249
+ // (The result should be consumed via consumeResult first)
250
+ if (event.type === 'CANCEL' || event.type === 'POINTER_DOWN') {
251
+ return { phase: 'idle' };
252
+ }
253
+ return this.state;
254
+ }
255
+ /**
256
+ * Activate drag from pending state.
257
+ */
258
+ activateDrag(currentSlot) {
259
+ var _a, _b;
260
+ if (this.state.phase !== 'pending') {
261
+ return this.state;
262
+ }
263
+ const startSlot = (_a = this.state.startSlot) !== null && _a !== void 0 ? _a : currentSlot;
264
+ if (!startSlot) {
265
+ return { phase: 'idle' };
266
+ }
267
+ const slot = currentSlot !== null && currentSlot !== void 0 ? currentSlot : startSlot;
268
+ // Calculate initial preview
269
+ const preview = this.previewCalculator.calculatePreview(this.state.operationType, startSlot, slot, this.state.event);
270
+ if (!preview) {
271
+ return { phase: 'idle' };
272
+ }
273
+ return {
274
+ phase: 'active',
275
+ operationType: this.state.operationType,
276
+ event: this.state.event,
277
+ startSlot,
278
+ currentSlot: slot,
279
+ preview,
280
+ originalEvent: (_b = this.state.event) !== null && _b !== void 0 ? _b : undefined,
281
+ };
282
+ }
283
+ /**
284
+ * Get operation type from pointer target.
285
+ */
286
+ getOperationType(target) {
287
+ switch (target.type) {
288
+ case 'resize-handle':
289
+ return target.resizeHandle === 'start' ? 'resize-start' : 'resize-end';
290
+ case 'event':
291
+ return 'move';
292
+ case 'slot':
293
+ return 'create';
294
+ default:
295
+ return null;
296
+ }
297
+ }
298
+ /**
299
+ * Get initial preview for a pending drag (used for click detection).
300
+ */
301
+ getInitialPreview() {
302
+ if (this.state.phase !== 'pending') {
303
+ return { start: new Date(), end: new Date() };
304
+ }
305
+ if (this.state.event) {
306
+ return {
307
+ start: this.state.event.start,
308
+ end: this.state.event.end,
309
+ };
310
+ }
311
+ if (this.state.startSlot) {
312
+ return {
313
+ start: this.state.startSlot.start,
314
+ end: this.state.startSlot.end,
315
+ };
316
+ }
317
+ return { start: new Date(), end: new Date() };
318
+ }
319
+ }
320
+ //# sourceMappingURL=drag-state-machine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drag-state-machine.js","sourceRoot":"","sources":["../../../../../libs/mp-scheduler-wc/src/drag/drag-state-machine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,104 @@
1
+ import { DragOperationType, PreviewEvent, SchedulerEvent, TimeSlot } from '@mintplayer/scheduler-core';
2
+ /**
3
+ * Simple position with x/y coordinates.
4
+ */
5
+ export interface Position {
6
+ x: number;
7
+ y: number;
8
+ }
9
+ /**
10
+ * Result of analyzing what element the pointer is over.
11
+ */
12
+ export interface PointerTarget {
13
+ /** Type of target element */
14
+ type: 'event' | 'resize-handle' | 'slot' | 'none';
15
+ /** The scheduler event if pointer is over an event */
16
+ event?: SchedulerEvent;
17
+ /** The slot element if pointer is over a slot */
18
+ slotElement?: HTMLElement;
19
+ /** The resize handle type if pointer is over a resize handle */
20
+ resizeHandle?: 'start' | 'end';
21
+ }
22
+ /**
23
+ * Drag operation phases - explicit state machine states.
24
+ *
25
+ * - idle: No drag operation in progress
26
+ * - pending: Pointer down, waiting for movement to exceed threshold
27
+ * - active: Drag in progress, preview is being updated
28
+ * - completing: Pointer up, finalizing the operation
29
+ */
30
+ export type DragPhase = 'idle' | 'pending' | 'active' | 'completing';
31
+ /**
32
+ * State machine state with discriminated union.
33
+ * The `phase` field determines which other fields are valid.
34
+ */
35
+ export type DragMachineState = {
36
+ phase: 'idle';
37
+ } | {
38
+ phase: 'pending';
39
+ operationType: DragOperationType;
40
+ event: SchedulerEvent | null;
41
+ startPosition: Position;
42
+ startSlot: TimeSlot | null;
43
+ slotElement?: HTMLElement;
44
+ } | {
45
+ phase: 'active';
46
+ operationType: DragOperationType;
47
+ event: SchedulerEvent | null;
48
+ startSlot: TimeSlot;
49
+ currentSlot: TimeSlot;
50
+ preview: PreviewEvent;
51
+ originalEvent?: SchedulerEvent;
52
+ } | {
53
+ phase: 'completing';
54
+ result: DragCompletionResult;
55
+ };
56
+ /**
57
+ * Result of a completed drag operation.
58
+ */
59
+ export interface DragCompletionResult {
60
+ /** Type of operation that was completed */
61
+ type: DragOperationType;
62
+ /** The final preview (new event position) */
63
+ preview: PreviewEvent;
64
+ /** The event that was moved/resized (null for create) */
65
+ event: SchedulerEvent | null;
66
+ /** Original event before modification */
67
+ originalEvent?: SchedulerEvent;
68
+ /** Whether this was a click (no actual drag occurred) */
69
+ wasClick: boolean;
70
+ }
71
+ /**
72
+ * Events that can trigger state transitions in the drag state machine.
73
+ */
74
+ export type DragMachineEvent = {
75
+ type: 'POINTER_DOWN';
76
+ target: PointerTarget;
77
+ position: Position;
78
+ slot: TimeSlot | null;
79
+ slotElement?: HTMLElement;
80
+ /** If true, skip pending state and go directly to active (for touch drags) */
81
+ immediate?: boolean;
82
+ } | {
83
+ type: 'POINTER_MOVE';
84
+ position: Position;
85
+ slot: TimeSlot | null;
86
+ } | {
87
+ type: 'POINTER_UP';
88
+ position: Position;
89
+ } | {
90
+ type: 'CANCEL';
91
+ };
92
+ /**
93
+ * Configuration for the drag state machine.
94
+ */
95
+ export interface DragConfig {
96
+ /** Pixels of movement before drag activates (default: 5) */
97
+ dragThreshold: number;
98
+ /** Minimum event duration in milliseconds (default: 30 minutes) */
99
+ minDurationMs: number;
100
+ }
101
+ /**
102
+ * Default drag configuration.
103
+ */
104
+ export declare const DEFAULT_DRAG_CONFIG: DragConfig;
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Default drag configuration.
3
+ */
4
+ export const DEFAULT_DRAG_CONFIG = {
5
+ dragThreshold: 5,
6
+ minDurationMs: 30 * 60 * 1000, // 30 minutes
7
+ };
8
+ //# sourceMappingURL=drag-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drag-types.js","sourceRoot":"","sources":["../../../../../libs/mp-scheduler-wc/src/drag/drag-types.ts"],"names":[],"mappings":"AAuHA;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAe;IAC7C,aAAa,EAAE,CAAC;IAChB,aAAa,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,aAAa;CAC7C,CAAC"}
@@ -0,0 +1,4 @@
1
+ export * from './drag-types';
2
+ export * from './drag-preview';
3
+ export * from './drag-state-machine';
4
+ export * from './drag-manager';
@@ -0,0 +1,5 @@
1
+ export * from './drag-types';
2
+ export * from './drag-preview';
3
+ export * from './drag-state-machine';
4
+ export * from './drag-manager';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../libs/mp-scheduler-wc/src/drag/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,sBAAsB,CAAC;AACrC,cAAc,gBAAgB,CAAC"}
@@ -0,0 +1,43 @@
1
+ import { SchedulerEvent, ViewType } from '@mintplayer/scheduler-core';
2
+ /**
3
+ * All custom events the scheduler can emit.
4
+ * Using a discriminated union for type safety.
5
+ */
6
+ export type SchedulerCustomEvent = {
7
+ type: 'event-click';
8
+ event: SchedulerEvent;
9
+ originalEvent: Event;
10
+ } | {
11
+ type: 'event-dblclick';
12
+ event: SchedulerEvent;
13
+ originalEvent: Event;
14
+ } | {
15
+ type: 'event-create';
16
+ event: SchedulerEvent;
17
+ originalEvent: Event;
18
+ } | {
19
+ type: 'event-update';
20
+ event: SchedulerEvent;
21
+ oldEvent: SchedulerEvent;
22
+ originalEvent: Event;
23
+ } | {
24
+ type: 'event-delete';
25
+ event: SchedulerEvent;
26
+ } | {
27
+ type: 'date-click';
28
+ date: Date;
29
+ originalEvent: Event;
30
+ } | {
31
+ type: 'view-change';
32
+ view: ViewType;
33
+ date: Date;
34
+ } | {
35
+ type: 'selection-change';
36
+ selectedEvent: SchedulerEvent | null;
37
+ };
38
+ /**
39
+ * Type helper to extract the detail type for a specific event.
40
+ */
41
+ export type EventDetail<T extends SchedulerCustomEvent['type']> = Omit<Extract<SchedulerCustomEvent, {
42
+ type: T;
43
+ }>, 'type'>;
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=event-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-types.js","sourceRoot":"","sources":["../../../../../libs/mp-scheduler-wc/src/events/event-types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export * from './event-types';
2
+ export * from './scheduler-event-emitter';
@@ -0,0 +1,3 @@
1
+ export * from './event-types';
2
+ export * from './scheduler-event-emitter';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../libs/mp-scheduler-wc/src/events/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,2BAA2B,CAAC"}
@@ -0,0 +1,46 @@
1
+ import { SchedulerCustomEvent, EventDetail } from './event-types';
2
+ /**
3
+ * Handles dispatching custom events from the scheduler.
4
+ * Centralizes event emission logic for consistency.
5
+ */
6
+ export declare class SchedulerEventEmitter {
7
+ private readonly host;
8
+ constructor(host: HTMLElement);
9
+ /**
10
+ * Emit a scheduler custom event.
11
+ * The event will bubble up through the DOM.
12
+ */
13
+ emit(event: SchedulerCustomEvent): void;
14
+ /**
15
+ * Emit an event-click event.
16
+ */
17
+ emitEventClick(event: EventDetail<'event-click'>['event'], originalEvent: Event): void;
18
+ /**
19
+ * Emit an event-dblclick event.
20
+ */
21
+ emitEventDblClick(event: EventDetail<'event-dblclick'>['event'], originalEvent: Event): void;
22
+ /**
23
+ * Emit an event-create event.
24
+ */
25
+ emitEventCreate(event: EventDetail<'event-create'>['event'], originalEvent: Event): void;
26
+ /**
27
+ * Emit an event-update event.
28
+ */
29
+ emitEventUpdate(event: EventDetail<'event-update'>['event'], oldEvent: EventDetail<'event-update'>['oldEvent'], originalEvent: Event): void;
30
+ /**
31
+ * Emit an event-delete event.
32
+ */
33
+ emitEventDelete(event: EventDetail<'event-delete'>['event']): void;
34
+ /**
35
+ * Emit a date-click event.
36
+ */
37
+ emitDateClick(date: Date, originalEvent: Event): void;
38
+ /**
39
+ * Emit a view-change event.
40
+ */
41
+ emitViewChange(view: EventDetail<'view-change'>['view'], date: EventDetail<'view-change'>['date']): void;
42
+ /**
43
+ * Emit a selection-change event.
44
+ */
45
+ emitSelectionChange(selectedEvent: EventDetail<'selection-change'>['selectedEvent']): void;
46
+ }
@@ -0,0 +1,70 @@
1
+ import { __rest } from "tslib";
2
+ /**
3
+ * Handles dispatching custom events from the scheduler.
4
+ * Centralizes event emission logic for consistency.
5
+ */
6
+ export class SchedulerEventEmitter {
7
+ constructor(host) {
8
+ this.host = host;
9
+ }
10
+ /**
11
+ * Emit a scheduler custom event.
12
+ * The event will bubble up through the DOM.
13
+ */
14
+ emit(event) {
15
+ const { type } = event, detail = __rest(event, ["type"]);
16
+ this.host.dispatchEvent(new CustomEvent(type, {
17
+ detail,
18
+ bubbles: true,
19
+ }));
20
+ }
21
+ /**
22
+ * Emit an event-click event.
23
+ */
24
+ emitEventClick(event, originalEvent) {
25
+ this.emit({ type: 'event-click', event, originalEvent });
26
+ }
27
+ /**
28
+ * Emit an event-dblclick event.
29
+ */
30
+ emitEventDblClick(event, originalEvent) {
31
+ this.emit({ type: 'event-dblclick', event, originalEvent });
32
+ }
33
+ /**
34
+ * Emit an event-create event.
35
+ */
36
+ emitEventCreate(event, originalEvent) {
37
+ this.emit({ type: 'event-create', event, originalEvent });
38
+ }
39
+ /**
40
+ * Emit an event-update event.
41
+ */
42
+ emitEventUpdate(event, oldEvent, originalEvent) {
43
+ this.emit({ type: 'event-update', event, oldEvent, originalEvent });
44
+ }
45
+ /**
46
+ * Emit an event-delete event.
47
+ */
48
+ emitEventDelete(event) {
49
+ this.emit({ type: 'event-delete', event });
50
+ }
51
+ /**
52
+ * Emit a date-click event.
53
+ */
54
+ emitDateClick(date, originalEvent) {
55
+ this.emit({ type: 'date-click', date, originalEvent });
56
+ }
57
+ /**
58
+ * Emit a view-change event.
59
+ */
60
+ emitViewChange(view, date) {
61
+ this.emit({ type: 'view-change', view, date });
62
+ }
63
+ /**
64
+ * Emit a selection-change event.
65
+ */
66
+ emitSelectionChange(selectedEvent) {
67
+ this.emit({ type: 'selection-change', selectedEvent });
68
+ }
69
+ }
70
+ //# sourceMappingURL=scheduler-event-emitter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scheduler-event-emitter.js","sourceRoot":"","sources":["../../../../../libs/mp-scheduler-wc/src/events/scheduler-event-emitter.ts"],"names":[],"mappings":";AAEA;;;GAGG;AACH,MAAM,OAAO,qBAAqB;IAChC,YAA6B,IAAiB;QAAjB,SAAI,GAAJ,IAAI,CAAa;IAAG,CAAC;IAElD;;;OAGG;IACH,IAAI,CAAC,KAA2B;QAC9B,MAAM,EAAE,IAAI,KAAgB,KAAK,EAAhB,MAAM,UAAK,KAAK,EAA3B,QAAmB,CAAQ,CAAC;QAClC,IAAI,CAAC,IAAI,CAAC,aAAa,CACrB,IAAI,WAAW,CAAC,IAAI,EAAE;YACpB,MAAM;YACN,OAAO,EAAE,IAAI;SACd,CAAC,CACH,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,cAAc,CACZ,KAA0C,EAC1C,aAAoB;QAEpB,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC,CAAC;IAC3D,CAAC;IAED;;OAEG;IACH,iBAAiB,CACf,KAA6C,EAC7C,aAAoB;QAEpB,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC,CAAC;IAC9D,CAAC;IAED;;OAEG;IACH,eAAe,CACb,KAA2C,EAC3C,aAAoB;QAEpB,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC,CAAC;IAC5D,CAAC;IAED;;OAEG;IACH,eAAe,CACb,KAA2C,EAC3C,QAAiD,EACjD,aAAoB;QAEpB,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,CAAC,CAAC;IACtE,CAAC;IAED;;OAEG;IACH,eAAe,CAAC,KAA2C;QACzD,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC,CAAC;IAC7C,CAAC;IAED;;OAEG;IACH,aAAa,CAAC,IAAU,EAAE,aAAoB;QAC5C,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,CAAC;IACzD,CAAC;IAED;;OAEG;IACH,cAAc,CACZ,IAAwC,EACxC,IAAwC;QAExC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IACjD,CAAC;IAED;;OAEG;IACH,mBAAmB,CACjB,aAA+D;QAE/D,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,aAAa,EAAE,CAAC,CAAC;IACzD,CAAC;CACF"}
@@ -0,0 +1,2 @@
1
+ export * from './pointer-event';
2
+ export * from './input-handler';
@@ -0,0 +1,3 @@
1
+ export * from './pointer-event';
2
+ export * from './input-handler';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../libs/mp-scheduler-wc/src/input/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC"}