Calendar/overlap-fix-plan.md
Janus Knudsen 6afea2571b Fixes event overlap detection and stacking logic
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.
2025-09-04 19:22:26 +02:00

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 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