52 lines
No EOL
2.1 KiB
JavaScript
52 lines
No EOL
2.1 KiB
JavaScript
/**
|
|
* 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
|