Améliorations du Calendrier Visuel
Objectif
Améliorer l'interface calendrier pour une meilleure visualisation et gestion des sessions, événements et créneaux de disponibilité.
État Actuel ✅ COMPLÉTÉ
Le calendrier dispose actuellement de :
- ✅ 5 vues : Day, Week, Month, Year, Agenda
- ✅ Drag and drop pour sessions/événements (dans toutes les vues : Month, Week, Day)
- ✅ Affichage des sessions, événements Google Calendar, et créneaux de disponibilité
- ✅ Panels latéraux pour availability et bookings
- ✅ Vue semaine avec timeline horaire (WeekTimelineView) avec drag & drop
- ✅ Vue jour avec timeline horaire (DayTimelineView) avec drag & drop
- ✅ Recherche dans le calendrier avec navigation vers les résultats
- ✅ Filtres avancés (statut, type de session, contact, tags)
- ✅ Export iCal/ICS pour import dans d'autres calendriers
- ✅ Impression optimisée avec vue formatée
- ✅ Vue année pour planification à long terme
- ✅ Indicateurs visuels (badges pour sessions en retard, sans contact, sans devis/facture)
- ✅ Optimisation des performances (pas de rechargement de l'interface lors du changement de vue)
Améliorations Planifiées
Note : Toutes les améliorations planifiées ont été complétées. Cette section est conservée à titre de référence historique.
1. Vue Timeline pour la Semaine (Priorité Haute) ✅ COMPLÉTÉ
Objectif : Créer une vue timeline horaire pour la semaine avec colonnes pour chaque jour et lignes pour les heures.
Fonctionnalités :
- ✅ Timeline avec heures de 0h à 23h (ou plage configurable)
- ✅ Colonnes pour chaque jour de la semaine
- ✅ Positionnement précis des événements/sessions selon leur heure
- ✅ Visualisation des chevauchements
- ✅ Scroll vertical pour naviguer dans les heures
- ✅ Indicateurs visuels pour :
- Sessions (couleur selon statut/tag)
- Événements Google Calendar
- Créneaux de disponibilité (AVAILABLE/BLOCKED)
- Bookings publics
- ✅ Drag & drop pour déplacer les sessions et événements entre les jours
Avantages :
- Meilleure compréhension de l'emploi du temps
- Détection visuelle des conflits
- Planification plus facile
2. Vue Timeline Améliorée pour le Jour (Priorité Haute) ✅ COMPLÉTÉ
Objectif : Améliorer la vue jour avec une timeline horaire détaillée.
Fonctionnalités :
- ✅ Timeline avec heures (0h-23h)
- ✅ Positionnement précis selon l'heure
- ✅ Affichage de la durée des événements
- ✅ Zones de disponibilité visibles
- ✅ Drag & drop pour déplacer les sessions et événements
3. Visualisation des Chevauchements (Priorité Moyenne) ✅ COMPLÉTÉ
Objectif : Améliorer la détection et l'affichage des conflits.
Fonctionnalités :
- ✅ Détection automatique des chevauchements
- ✅ Indicateurs visuels (bordure rouge, warning icon)
- ✅ Tooltip avec détails du conflit
- ⏳ Suggestions de résolution (optionnel - future amélioration)
4. Légende et Filtres Visuels (Priorité Moyenne) ✅ COMPLÉTÉ
Objectif : Améliorer la compréhension des différents types d'éléments.
Fonctionnalités :
- ✅ Légende interactive avec icônes et couleurs
- ✅ Filtres visuels (masquer/afficher sessions, événements, disponibilités)
- ✅ Groupement par tags (implémenté via CalendarHeader)
- ⏳ Recherche dans le calendrier (future amélioration)
5. Vue Agenda/Liste ✅ COMPLÉTÉ
Objectif : Alternative à la vue timeline pour une vue chronologique simple.
Fonctionnalités :
- ✅ Liste chronologique des événements/sessions
- ✅ Groupement par jour
- ✅ Filtres (sessions, événements, disponibilité, bloqués)
- ✅ Affichage des créneaux horaires
- ✅ Mise en évidence du jour actuel
6. Drag & Drop dans les Vues Timeline ✅ COMPLÉTÉ
Objectif : Permettre le drag & drop des sessions et événements dans les vues timeline (Week et Day).
Fonctionnalités :
- ✅ Zones droppables dans WeekTimelineView (une par jour de la semaine)
- ✅ Zone droppable dans DayTimelineView (pour le jour affiché)
- ✅ Feedback visuel lors du survol (highlight avec ring-primary)
- ✅ Intégration avec le hook useCalendarDragAndDrop existant
- ✅ Support du drag & drop dans toutes les vues (Month, Week, Day)
Plan d'Implémentation
Phase 1 : Vue Timeline Semaine ✅ COMPLÉTÉ
- ✅ Créer le composant
WeekTimelineView - ✅ Implémenter la grille horaire (0h-23h)
- ✅ Positionner les événements/sessions selon leur heure
- ✅ Gérer le scroll horizontal et navigation
- ✅ Intégration dans CalendarPage
- ✅ Traductions (EN/FR)
- ✅ Accessibilité (boutons au lieu de divs)
Fonctionnalités implémentées :
- Timeline avec heures de 0h à 23h
- Colonnes pour chaque jour de la semaine
- Positionnement précis des événements/sessions selon leur heure
- Affichage des créneaux de disponibilité (AVAILABLE)
- Header sticky avec noms des jours
- Highlight du jour actuel
- Scroll horizontal pour navigation
- Support responsive
Phase 2 : Vue Timeline Jour ✅ COMPLÉTÉ
- ✅ Créer le composant
DayTimelineView - ✅ Implémenter la grille horaire (0h-23h)
- ✅ Positionner les événements/sessions selon leur heure
- ✅ Afficher les zones de disponibilité
- ✅ Intégration dans CalendarPage
- ✅ Support responsive
Fonctionnalités implémentées :
- Timeline avec heures de 0h à 23h
- Positionnement précis des événements/sessions
- Affichage des créneaux de disponibilité
- Header avec date formatée
- Highlight du jour actuel
- Scroll vertical pour navigation
Phase 3 : Visualisation des Chevauchements ✅ COMPLÉTÉ
- ✅ Fonction utilitaire de détection de chevauchements (
timeline-overlap.helper.ts) - ✅ Intégration dans WeekTimelineView avec détection par jour
- ✅ Intégration dans DayTimelineView
- ✅ Indicateurs visuels (bordure rouge
ring-2 ring-destructive) - ✅ Icône d'alerte (triangle d'avertissement) sur les items en conflit
- ✅ Tooltip avec nombre de conflits
- ✅ Traductions EN/FR pour les messages de conflit
Fonctionnalités implémentées :
- Détection automatique des chevauchements entre sessions et événements
- Exclusion des créneaux de disponibilité de la détection (pas de conflit)
- Bordure rouge (
ring-2 ring-destructive) autour des items en conflit - Icône d'alerte rouge en haut à droite des items en conflit (vues timeline)
- Tooltip affichant le nombre d'items en conflit
- Détection séparée par jour pour la vue semaine
- Détection des conflits dans la vue month avec bordure rouge
Phase 4 : Légende et Filtres Visuels ✅ COMPLÉTÉ
- ✅ Composant
CalendarLegendavec icônes et couleurs - ✅ Composant
CalendarFiltersavec boutons toggle - ✅ Intégration dans CalendarPage
- ✅ Application des filtres dans toutes les vues (Day, Week, Month)
- ✅ Traductions EN/FR
Fonctionnalités implémentées :
- Légende affichant les différents types d'éléments (sessions, événements, disponibilités, conflits)
- Légende simplifiée sans icône d'information
- Filtres avec dropdown Select (comme dans CalendarHeader)
- Options de filtre : Tous, Sessions, Événements, Disponibilité
- Filtres appliqués dynamiquement dans toutes les vues (Day, Week, Month)
- Support responsive (mobile et desktop)
Phase 5 : Vue Agenda/Liste ✅ COMPLÉTÉ
- ✅ Créer le composant
AgendaListView - ✅ Collecter et trier tous les éléments chronologiquement
- ✅ Grouper les éléments par jour
- ✅ Afficher les éléments avec leurs créneaux horaires
- ✅ Mise en évidence du jour actuel
- ✅ Intégration dans CalendarPage avec option "agenda" dans le sélecteur
- ✅ Application des filtres (sessions, événements, disponibilité, bloqués)
- ✅ Traductions EN/FR
Fonctionnalités implémentées :
- Liste chronologique de tous les événements, sessions et créneaux de disponibilité
- Groupement par jour avec en-tête de date formatée
- Affichage des créneaux horaires pour chaque élément
- Mise en évidence visuelle du jour actuel (bordure et fond colorés)
- Filtres appliqués (sessions, événements, disponible, bloqué)
- Support de la plage de dates (utilise monthStart/monthEnd)
- Utilisation des composants existants (DraggableEvent, DraggableSession, AvailabilitySlotDisplay)
Fichiers Créés/Modifiés/Supprimés
Créés
frontend/src/pages/calendar/CalendarPage/components/WeekTimelineView.tsx✅frontend/src/pages/calendar/CalendarPage/components/DayTimelineView.tsx✅frontend/src/pages/calendar/CalendarPage/components/timeline-overlap.helper.ts✅frontend/src/pages/calendar/CalendarPage/components/CalendarLegend.tsx✅frontend/src/pages/calendar/CalendarPage/components/CalendarFilters.tsx✅frontend/src/pages/calendar/CalendarPage/components/AgendaListView.tsx✅frontend/src/pages/calendar/CalendarPage/components/DroppableTimelineDay.tsx✅
Modifiés
frontend/src/pages/calendar/CalendarPage/components/index.ts(exports mis à jour)frontend/src/pages/calendar/CalendarPage/CalendarPage.tsx(intégration des nouvelles vues, ajout vue agenda)frontend/src/pages/calendar/CalendarPage/types.ts(ajout "agenda" au type CalendarView)frontend/src/pages/calendar/CalendarPage/components/CalendarHeader.tsx(ajout option "agenda" dans les sélecteurs de vue)frontend/src/pages/calendar/CalendarPage/components/DroppableDayCell.tsx(nettoyage - suppression isDayView/isWeekView)frontend/src/pages/calendar/CalendarPage/components/MonthView.tsx(nettoyage - suppression prop locale)frontend/src/pages/calendar/CalendarPage/components/WeekTimelineView.tsx(ajout détection chevauchements, ajout zones droppables pour drag & drop)frontend/src/pages/calendar/CalendarPage/components/DayTimelineView.tsx(ajout détection chevauchements, ajout zone droppable pour drag & drop)frontend/src/pages/calendar/CalendarPage/components/MonthView.tsx(ajout détection chevauchements)frontend/src/pages/calendar/CalendarPage/components/CalendarFilters.tsx(refonte avec dropdown Select)frontend/src/pages/calendar/CalendarPage/components/CalendarLegend.tsx(simplification, retrait tooltip)frontend/src/pages/calendar/CalendarPage/CalendarPage.tsx(intégration légende et filtres, application des filtres aux vues)frontend/src/i18n/locales/en/translation.json(ajout "time", sections "overlap", "legend", "filters", "calendar.view.agenda")frontend/src/i18n/locales/fr/translation.json(ajout "Heure", sections "overlap", "legend", "filters", "calendar.view.agenda")
Supprimés (code mort)
frontend/src/pages/calendar/CalendarPage/components/DayView.tsx❌ (remplacé par DayTimelineView)frontend/src/pages/calendar/CalendarPage/components/WeekView.tsx❌ (remplacé par WeekTimelineView)frontend/src/pages/calendar/CalendarPage/components/DraggableSessionCard.tsx❌ (utilisé uniquement dans DayView)docs/VERIFICATION_PLAN_AMELIORATIONS.md❌ (redondant)
Améliorations Récentes (2025)
Recherche et Filtres Avancés ✅ COMPLÉTÉ
- ✅ Recherche dans le calendrier : Composant
CalendarSearchavec recherche en temps r éel dans les sessions et événements, navigation vers la date du résultat - ✅ Filtres avancés : Composant
AdvancedCalendarFiltersavec filtres par :- Statut de session (draft, confirmed, completed, cancelled)
- Type de session (sélection multiple)
- Contact (sélection multiple)
- Tags (sélection multiple avec affichage des couleurs)
- ✅ Filtres de visibilité : Filtres simples pour afficher/masquer sessions, événements, disponibilités, bloqués
- ✅ Affichage des filtres actifs : Badges affichant les tags sélectionnés avec possibilité de les retirer individuellement
Export et Impression ✅ COMPLÉTÉ
- ✅ Export iCal/ICS : Bouton d'export générant un fichier
.icscompatible avec Google Calendar, Outlook, Apple Calendar - ✅ Impression optimisée : Vue
PrintCalendarViewformatée pour l'impression avec :- Affichage plein écran sans interface
- Légende intégrée
- Support de toutes les vues (Day, Week, Month, Year, Agenda)
- Styles CSS dédiés pour l'impression (
@media print)
Vue Année ✅ COMPLÉTÉ
- ✅ Vue annuelle : Composant
YearViewaffichant 12 mois en grille - ✅ Navigation : Navigation entre les années avec les boutons précédent/suivant
- ✅ Affichage compact : Résumé mensuel avec compteurs de sessions et événements
- ✅ Indicateurs visuels : Points colorés pour les jours avec contenu
Optimisations de Performance ✅ COMPLÉTÉ
- ✅ Gestion du cache React Query : Utilisation de
placeholderData: keepPreviousDataetstaleTimepour éviter les rechargements inutiles - ✅ Changement de vue optimisé : Seul le calendrier se recharge lors du changement de vue, le reste de l'interface reste stable
- ✅ Refactoring : Refactorisation de
CalendarPage.tsxen hooks et composants plus petits :useCalendarState.ts: Gestion centralisée de l'étatuseCalendarHandlers.ts: Gestion centralisée des handlersCalendarContent.tsx: Composant principal du contenuCalendarViewRenderer.tsx: Rendu conditionnel des vuesCalendarSidebar.tsx: Panneau latéralCalendarConnectRequired.tsx: Message de connexion Google CalendarCalendarDragOverlay.tsx: Overlay de drag & drop
Notes Techniques
- Utiliser
date-fnspour les manipulations de dates - Positionnement absolu pour les événements dans la timeline
- Calcul de la position basé sur l'heure de début et la durée
- Gestion du responsive (mobile vs desktop)
- Performance : Utilisation de React Query avec
placeholderDataetstaleTimepour optimiser les rechargements - Architecture : Refactoring en hooks et composants pour améliorer la maintenabilité (limite de 400 lignes par fichier)