/** * OverlapDetector - Ren tidbaseret overlap detection * Ingen DOM manipulation, kun tidsberegninger */ export class OverlapDetector { /** * Resolver hvilke events et givent event overlapper med i en kolonne * @param event - CalendarEvent der skal checkes for overlap * @param columnEvents - Array af CalendarEvent objekter i kolonnen * @returns Array af events som det givne event overlapper med */ resolveOverlap(event, columnEvents) { return columnEvents.filter(existingEvent => { // To events overlapper hvis: // event starter før existing slutter OG // event slutter efter existing starter return event.start < existingEvent.end && event.end > existingEvent.start; }); } /** * Dekorerer events med stack linking data * @param newEvent - Det nye event der skal tilføjes * @param overlappingEvents - Events som det nye event overlapper med * @returns OverlapResult med overlappende events og stack links */ decorateWithStackLinks(newEvent, overlappingEvents) { const stackLinks = new Map(); if (overlappingEvents.length === 0) { return { overlappingEvents: [], stackLinks }; } // Kombiner nyt event med eksisterende og sortér efter start tid (tidligste første) const allEvents = [...overlappingEvents, newEvent].sort((a, b) => a.start.getTime() - b.start.getTime()); // Opret sammenhængende kæde - alle events bindes sammen allEvents.forEach((event, index) => { const stackLink = { stackLevel: index, prev: index > 0 ? allEvents[index - 1].id : undefined, next: index < allEvents.length - 1 ? allEvents[index + 1].id : undefined }; stackLinks.set(event.id, stackLink); }); overlappingEvents.push(newEvent); return { overlappingEvents, stackLinks }; } } //# sourceMappingURL=OverlapDetector.js.map