85 lines
3.1 KiB
Markdown
85 lines
3.1 KiB
Markdown
|
|
# 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
|