Updates the event overlap detection to accurately determine when events overlap in time, fixing incorrect stacking behavior. Implements column sharing for events starting within 30 minutes of each other. Applies stacking only when events truly overlap in time but start times differ by more than 30 minutes. Removes unnecessary data attributes and simplifies styling for stacked events, improving code cleanliness and performance.
3.1 KiB
3.1 KiB
Overlap Detection Fix Plan
Problem Analysis
Den nuværende overlap detection logik i EventOverlapManager tjekker kun på tidsforskel mellem start tidspunkter, men ikke om events faktisk overlapper i tid. Dette resulterer i forkert stacking behavior.
Updated Overlap Logic Requirements
Scenario 1: Column Sharing (Flexbox)
Regel: Events med samme start tid ELLER start tid indenfor 30 minutter
- Eksempel: Event A (09:00-10:00) + Event B (09:15-10:30)
- Resultat: Deler pladsen med flexbox - ingen stacking
Scenario 2: Stacking
Regel: Events overlapper i tid MEN har >30 min forskel i start tid
- Eksempel: Product Planning (14:00-16:00) + Deep Work (15:00-15:30)
- Resultat: Stacking med reduceret bredde for kortere event
Scenario 3: Ingen Overlap
Regel: Events overlapper ikke i tid ELLER står alene
- Eksempel: Standalone 30 min event kl. 10:00-10:30
- Resultat: Normal rendering, fuld bredde
Implementation Plan
1. Fix EventOverlapManager.detectOverlap()
public detectOverlap(event1: CalendarEvent, event2: CalendarEvent): OverlapType {
// Først: Tjek om events overlapper i tid
if (!this.eventsOverlapInTime(event1, event2)) {
return OverlapType.NONE;
}
// Events overlapper i tid - nu tjek start tid forskel
const start1 = new Date(event1.start).getTime();
const start2 = new Date(event2.start).getTime();
const timeDiffMinutes = Math.abs(start1 - start2) / (1000 * 60);
// Indenfor 30 min start forskel = column sharing
if (timeDiffMinutes <= 30) {
return OverlapType.COLUMN_SHARING;
}
// Mere end 30 min start forskel = stacking
return OverlapType.STACKING;
}
2. Add eventsOverlapInTime() method
private eventsOverlapInTime(event1: CalendarEvent, event2: CalendarEvent): boolean {
const start1 = new Date(event1.start).getTime();
const end1 = new Date(event1.end).getTime();
const start2 = new Date(event2.start).getTime();
const end2 = new Date(event2.end).getTime();
// Events overlapper hvis de deler mindst ét tidspunkt
return !(end1 <= start2 || end2 <= start1);
}
3. Remove Unnecessary Data Attributes
- Fjern
overlapTypeogstackedWidthdata attributter fra createStackedEvent() - Simplificér removeStackedStyling() metoden
4. Test Scenarios
- Test med Product Planning (14:00-16:00) + Deep Work (15:00-15:30) = stacking
- Test med events indenfor 30 min start forskel = column sharing
- Test med standalone events = normal rendering
Changes Required
EventOverlapManager.ts
- Tilføj eventsOverlapInTime() private metode
- Modificer detectOverlap() metode med ny logik
- Fjern data attributter i createStackedEvent()
- Simplificér removeStackedStyling()
EventRenderer.ts
- Ingen ændringer nødvendige - bruger allerede EventOverlapManager
Expected Outcome
- Korrekt column sharing for events med start tid indenfor 30 min
- Korrekt stacking kun når events faktisk overlapper med >30 min start forskel
- Normale events renderes med fuld bredde når de står alene
- Renere kode uden unødvendige data attributter