Add proposal, design, specs and tasks for the fix-timezone-double-conversion change. Documents the root cause (icsDateToJsDate returning fake UTC causing double browser offset), the Intl.DateTimeFormat-based solution, and 40+ test scenarios covering DST, cross-timezone, half-hour offsets, and round-trip conversions. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2.3 KiB
2.3 KiB
Why
Le scheduler affiche les événements avec un décalage d'une heure par rapport à l'heure réelle. La cause : une double application de l'offset timezone lors de la conversion des dates ICS vers l'affichage. Le pattern "fake UTC" utilisé pour communiquer avec ts-ics fuit dans le chemin d'affichage, où local.date (fake UTC) est lu avec getHours() (qui ajoute l'offset navigateur), créant un décalage de ±N heures selon la timezone. Ce bug corrompt aussi les données lors de drag & drop, car l'utilisateur corrige visuellement des positions déjà décalées.
What Changes
- Corriger
icsDateToJsDate()pour retourner le vrai UTC (icsDate.date) au lieu du fake UTC (icsDate.local.date), corrigeant l'affichage scheduler - Ajouter un helper
getDateComponentsInTimezone(date, timezone)utilisantIntl.DateTimeFormatpour extraire les composants date/heure dans n'importe quel timezone cible - Refactorer
jsDateToIcsDate()pour supprimer le paramètreisFakeUtcet utiliser le nouveau helper — le fake UTC n'est plus créé par copie aveugle mais par conversion explicite via Intl API - Nettoyer
toIcsEvent()pour supprimer la variableisFakeUtcet la logique conditionnelle associée - Conserver le pattern fake UTC uniquement au point d'entrée vers ts-ics (
jsDateToIcsDateetEventModal.handleSave), car ts-ics utilisegetUTCHours()pour générer l'ICS — c'est une contrainte de la librairie, pas un choix d'architecture
Capabilities
New Capabilities
timezone-conversion: Gestion correcte des conversions de dates entre timezones dans l'adapter CalDAV ↔ EventCalendar, incluant le support cross-timezone et DST via Intl API
Modified Capabilities
(aucune capability existante modifiée au niveau des specs)
Impact
- Code frontend :
EventCalendarAdapter.ts(3 méthodes modifiées, 1 ajoutée),toIcsEventsimplifié - Pas de changement :
EventModal.tsx,dateFormatters.ts,useSchedulerHandlers.ts, backend Django, CalDAV server - Pas de changement d'API : le format ICS envoyé au CalDAV server reste identique (DTSTART avec TZID)
- Dépendances : aucune nouvelle dépendance (utilise
Intl.DateTimeFormatnatif du navigateur) - Risque : faible — le changement est isolé dans l'adapter, les tests existants couvrent le round-trip