Improves date handling and event stacking

Enhances date validation and timezone handling using DateService, ensuring data integrity and consistency.

Refactors event rendering and dragging to correctly handle date transformations.

Adds a test plan for event stacking and z-index management.

Fixes edge cases in navigation and date calculations for week/year boundaries and DST transitions.
This commit is contained in:
Janus C. H. Knudsen 2025-10-04 00:32:26 +02:00
parent a86a736340
commit 9bc082eed4
20 changed files with 1641 additions and 41 deletions

View file

@ -3,6 +3,7 @@ import { calendarConfig } from '../core/CalendarConfig';
import { TimeFormatter } from '../utils/TimeFormatter';
import { PositionUtils } from '../utils/PositionUtils';
import { EventLayout } from '../utils/AllDayLayoutEngine';
import { DateService } from '../utils/DateService';
/**
* Abstract base class for event DOM elements
@ -10,9 +11,12 @@ import { EventLayout } from '../utils/AllDayLayoutEngine';
export abstract class BaseEventElement {
protected element: HTMLElement;
protected event: CalendarEvent;
protected dateService: DateService;
protected constructor(event: CalendarEvent) {
this.event = event;
const timezone = calendarConfig.getTimezone?.();
this.dateService = new DateService(timezone);
this.element = this.createElement();
this.setDataAttributes();
}
@ -28,8 +32,8 @@ export abstract class BaseEventElement {
protected setDataAttributes(): void {
this.element.dataset.eventId = this.event.id;
this.element.dataset.title = this.event.title;
this.element.dataset.start = this.event.start.toISOString();
this.element.dataset.end = this.event.end.toISOString();
this.element.dataset.start = this.dateService.toUTC(this.event.start);
this.element.dataset.end = this.dateService.toUTC(this.event.end);
this.element.dataset.type = this.event.type;
this.element.dataset.duration = this.event.metadata?.duration?.toString() || '60';
}
@ -245,8 +249,8 @@ export class SwpAllDayEventElement extends BaseEventElement {
*/
private setAllDayAttributes(): void {
this.element.dataset.allday = "true";
this.element.dataset.start = this.event.start.toISOString();
this.element.dataset.end = this.event.end.toISOString();
this.element.dataset.start = this.dateService.toUTC(this.event.start);
this.element.dataset.end = this.dateService.toUTC(this.event.end);
}
/**