Calendar/overlap-fix-plan.md

85 lines
3.1 KiB
Markdown
Raw Normal View History

# 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