Improves drag-drop event system with type safety

Introduces dedicated TypeScript interfaces for all drag-and-drop event payloads, enhancing type safety and developer experience.

Centralizes drag event detection and emission within `DragDropManager`. Refactors `AllDayManager`, `HeaderManager`, and `EventRendererManager` to subscribe to these typed events, improving decoupling and clarifying responsibilities.

Resolves known inconsistencies in drag event payloads, especially for all-day event conversions. Adds a comprehensive analysis document (`docs/EventSystem-Analysis.md`) detailing the event system and planned improvements.
This commit is contained in:
Janus C. H. Knudsen 2025-09-21 15:48:13 +02:00
parent b4f5b29da3
commit c7dcfbbaed
7 changed files with 583 additions and 410 deletions

View file

@ -30,4 +30,59 @@ export interface TimeEvent {
};
}
export type CalendarEventData = AllDayEvent | TimeEvent;
export type CalendarEventData = AllDayEvent | TimeEvent;
/**
* Drag Event Payload Interfaces
* Type-safe interfaces for drag and drop events
*/
// Common position interface
export interface MousePosition {
x: number;
y: number;
}
// Drag start event payload
export interface DragStartEventPayload {
draggedElement: HTMLElement;
mousePosition: MousePosition;
mouseOffset: MousePosition;
column: string | null;
}
// Drag move event payload
export interface DragMoveEventPayload {
draggedElement: HTMLElement;
mousePosition: MousePosition;
mouseOffset: MousePosition;
snappedY: number;
column: string | null;
}
// Drag end event payload
export interface DragEndEventPayload {
draggedElement: HTMLElement;
mousePosition: MousePosition;
finalPosition: {
column: string | null;
snappedY: number;
};
target: 'swp-day-column' | 'swp-day-header' | null;
}
// Drag mouse enter header event payload
export interface DragMouseEnterHeaderEventPayload {
targetDate: string;
mousePosition: MousePosition;
originalElement: HTMLElement | null;
cloneElement: HTMLElement | null;
}
// Drag mouse leave header event payload
export interface DragMouseLeaveHeaderEventPayload {
targetDate: string | null;
mousePosition: MousePosition;
originalElement: HTMLElement| null;
cloneElement: HTMLElement| null;
}