Refactors event positioning and drag-and-drop

Centralizes event position calculations into `PositionUtils` for consistency and reusability across managers and renderers.

Improves drag-and-drop functionality by emitting events for all-day event conversion and streamlining position calculations during drag operations.

Introduces `AllDayManager` and `AllDayEventRenderer` to manage and render all-day events in the calendar header. This allows dragging events to the header to convert them to all-day events.
This commit is contained in:
Janus Knudsen 2025-09-13 00:39:56 +02:00
parent 8b96376d1f
commit 7054c0d40a
9 changed files with 404 additions and 72 deletions

View file

@ -1,6 +1,7 @@
import { CalendarEvent } from '../types/CalendarTypes';
import { calendarConfig } from '../core/CalendarConfig';
import { TimeFormatter } from '../utils/TimeFormatter';
import { PositionUtils } from '../utils/PositionUtils';
/**
* Abstract base class for event DOM elements
@ -47,22 +48,10 @@ export abstract class BaseEventElement {
}
/**
* Calculate event position for timed events
* Calculate event position for timed events using PositionUtils
*/
protected calculateEventPosition(): { top: number; height: number } {
const gridSettings = calendarConfig.getGridSettings();
const dayStartHour = gridSettings.dayStartHour;
const hourHeight = gridSettings.hourHeight;
const startMinutes = this.event.start.getHours() * 60 + this.event.start.getMinutes();
const endMinutes = this.event.end.getHours() * 60 + this.event.end.getMinutes();
const dayStartMinutes = dayStartHour * 60;
const top = ((startMinutes - dayStartMinutes) / 60) * hourHeight;
const durationMinutes = endMinutes - startMinutes;
const height = (durationMinutes / 60) * hourHeight;
return { top, height };
return PositionUtils.calculateEventPosition(this.event.start, this.event.end);
}
}