# 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() ```typescript 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 ```typescript 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 `overlapType` og `stackedWidth` data 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 1. Tilføj eventsOverlapInTime() private metode 2. Modificer detectOverlap() metode med ny logik 3. Fjern data attributter i createStackedEvent() 4. 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