- Format modifié : "Prénom Nom a validé(e) le date et heure"
- Icône de signature agrandie (h-5 w-5) et plus visible avec hover bleu
- Ajout d'un title "Voir la signature" sur l'icône
- Espacement amélioré (ml-3)
- Ajout des champs signatureUrl, signatureS3Key et dateSigned dans getPresencesByInscription
- Affichage du nom du signataire, date/heure de validation à côté de chaque puce matin/après-midi
- Icône cliquable pour visualiser la signature en grand format
- Modale Dialog pour afficher la signature manuscrite
- Fonction getPresenceInfo pour récupérer les détails de présence
- Interface moderne avec icône de stylo SVG pour les signatures
- Intégration du composant SignaturePad dans EmargementScan.tsx
- Ajout des champs de signature dans la table presences (signatureUrl, signatureS3Key, dateSigned)
- Modification de la procédure presences.valider pour accepter et uploader la signature en S3
- Stockage automatique de l'URL et de la clé S3 dans la base de données
- Correction des types nullables dans exportService.ts (codeEtablissement, fonction)
- Les apprenants doivent maintenant signer avec le doigt sur l'écran avant de valider leur présence
- Affichage de la date de début dans l'en-tête de chaque séquence
- Tri chronologique des séquences par date de début
- Filtre fonctionnel : Toutes les séquences / Séquences terminées / Séquences à venir
- Badge de statut visuel (Terminée en vert, À venir en orange)
- Compteur d'envois par séquence
- Bouton "Tout renvoyer" pour envoi groupé par séquence
- Correction robuste de l'affichage des apprenants
- Modification du backend pour inclure la première date de chaque séquence
- Tri des séquences par ordre chronologique (première date en premier)
- Les séquences sont maintenant affichées dans l'ordre temporel pour une meilleure organisation
- Ajout d'en-têtes visuels pour chaque séquence avec nom et compteur d'apprenants
- Badge affichant le nombre d'attestations envoyées par séquence
- Amélioration de l'organisation et de la lisibilité pour les formateurs
- Suppression de la colonne "Séquence" devenue redondante
- Ajout du champ 'periode' dans la table presences
- Modification des procédures backend pour gérer les deux périodes
- Mise à jour de l'interface EmargementScan avec choix de période
- Mise à jour de l'interface FormateurEmargement avec validation séparée matin/après-midi
- La feuille de présence PDF était déjà configurée avec deux colonnes
- Ajout d'un badge de compteur indiquant le nombre de rappels actifs (ex: "1")
- Désactivation visuelle du bouton pour les séquences sans rappels actifs (icône grisée)
- Tooltip informatif adapté selon le contexte (nombre de rappels ou message d'erreur)
- Amélioration de l'expérience utilisateur avec feedback visuel clair
- Retrait de la validation frontend complexe qui ne fonctionnait pas correctement
- Le backend gère maintenant l'erreur et affiche un message clair via toast
- L'utilisateur reçoit un message d'erreur explicite au lieu d'une erreur technique
- Amélioration de l'expérience utilisateur lors du test de rappels
- Indicateur visuel moderne avec animation (spinner + effet ping)
- Message "Envoi en cours..." pendant le traitement
- Toast final affichant le nombre exact d'emails envoyés
- Approche simple et efficace sans complexité de streaming temps réel
- Modification du backend pour envoyer un email par inscrit confirmé (tous à l'adresse de test)
- Ajout d'un indicateur de progression moderne avec animation (spinner + effet ping)
- Message de succès affichant le nombre d'emails envoyés
- Validation avec séquence "test 3" : 3 emails envoyés correctement (4ème inscrit sans email ignoré)
- Synchronisation complète de la structure de la table logsrappels avec le VPS
- Ajout d'un champ de saisie pour l'email du destinataire
- Modification du texte : "Tous les rappels configurés pour cette séquence seront envoyés à l'adresse email que vous indiquez ci-dessous"
- Validation de l'email avant envoi
- Backend modifié pour envoyer à l'email saisi au lieu de tous les inscrits
- Les logs enregistrent correctement l'email de test utilisé
✅ Correction de la structure de la table logsrappels pour correspondre au VPS
- Modification de la colonne statut: ENUM('succes','echec') au lieu de ENUM('success','failed')
- Modification de la colonne typeEnvoi: ENUM('automatique','test')
- Suppression des colonnes en trop (emailDestinataire, typeRappel, dateSequence, createdAt)
✅ Les logs de rappels s'enregistrent maintenant correctement dans la base de données
**Pages modifiées :**
1. **Tableau de bord des Notifications** (`client/src/pages/admin/AdminNotifications.tsx`)
- Ajout du style `text-[#60a5fa] drop-shadow-md` au titre h1
- Le titre est maintenant en bleu clair (#60a5fa) avec une ombre portée
2. **Gestion des Formateurs** (`client/src/pages/admin/AdminFormateurs.tsx`)
- Ajout du style `text-[#60a5fa] drop-shadow-md` au titre h1
- Le titre est maintenant en bleu clair (#60a5fa) avec une ombre portée
**Résultat :**
✅ Les titres des deux pages sont maintenant harmonisés avec le reste de l'application
✅ Le style CSS est cohérent avec les autres pages (Analytics, Rapport Public Cible, etc.)
✅ L'interface utilisateur est plus moderne et visuellement cohérente
**Corrections d'erreurs :**
1. **Erreurs SQL DATE_FORMAT corrigées** (analyticsDb.ts) :
- Remplacement des sous-requêtes corrélées par des JOIN dans getTauxRemplissageByMonth()
- Utilisation de COUNT(CASE WHEN...) au lieu de SUM(SELECT COUNT(*))
- Ajout de leftJoin pour éviter les erreurs de sous-requêtes
2. **Erreur React "Cannot read properties of null" corrigée** (AdminRapportPublicCible.tsx) :
- Ajout de l'opérateur null-safe `?.` pour accéder à `insc.apprenant?.fonction`
- Vérification explicite si la fonction est null/undefined
- Gestion du cas "public cible = tous" qui correspond toujours
3. **Tests réussis** :
- Page rapport-public-cible : affiche correctement les statistiques et recommandations
- Tableau de bord analytique : graphiques et statistiques fonctionnels
- Page suivi questionnaires : affiche correctement les données
**Harmonisation charte graphique :**
- Application du style bleu clair (#6B9FE8) avec ombre portée à tous les titres des 32 pages
- Création de la classe CSS `.page-title` réutilisable dans index.css
- Cohérence visuelle sur toute l'application
**Résultat :**
✅ Toutes les erreurs SQL et React sont corrigées
✅ Les pages fonctionnent correctement sans erreur
✅ Charte graphique harmonisée sur toutes les pages
**Améliorations visuelles :**
1. **Icônes modernes et colorées** :
- Icônes plus grandes (6x6) avec fond gradient coloré
- Effet de rotation au survol des icônes (rotate-12)
- 4 palettes de couleurs distinctes : bleu (formations), vert (séquences ouvertes), violet (apprenants), orange (séquences terminées)
2. **Liserés et bordures colorés** :
- Bordure gauche épaisse (4px) sur chaque carte de statistique
- Bordures colorées (2px) sur les cartes de graphiques
- Fond légèrement teinté coordonné aux couleurs (bg-blue-50/50, bg-green-50/50, etc.)
3. **Palette de couleurs enrichie** :
- Titre principal avec gradient bleu-violet (bg-gradient-to-r from-blue-600 to-purple-600)
- Valeurs des statistiques avec gradients colorés
- En-têtes de graphiques avec fond gradient subtil (from-blue-50 to-purple-50)
4. **Animations fluides** :
- Fade-in au chargement de la page (animate-in fade-in duration-500)
- Slide-in séquentiel des cartes avec délai progressif (100ms entre chaque carte)
- Effet hover : scale-105 + translate-y-1 + shadow-xl
- Effet de brillance au survol des cartes (gradient animé)
- Zoom léger des graphiques au survol (scale-105)
- Animation des graphiques recharts (800ms)
5. **Détails supplémentaires** :
- Badge "Données en temps réel" avec icône TrendingUp en haut à droite
- Indicateur "Actif" avec flèche verte sur chaque carte
- Ombres portées dynamiques au survol (hover:shadow-xl)
- Titres avec text-xl et font-bold pour plus d'impact
**Résultat :**
✅ Interface moderne et dynamique
✅ Expérience utilisateur améliorée avec animations fluides
✅ Meilleure hiérarchie visuelle grâce aux couleurs et liserés
✅ Design professionnel et engageant
✅ Testé et validé sur la sandbox
**Modifications apportées :**
1. **Renommage du bouton d'ajout d'apprenant** :
- Bouton renommé de "Ajouter un inscrit" à "Ajouter un apprenant"
- Titre de la boîte de dialogue mis à jour
- Description améliorée : "Sélectionnez un apprenant dans la liste ci-dessous pour l'inscrire à cette séquence. La liste affichée correspond à l'ensemble des apprenants enregistrés dans le système."
2. **Alternance de couleurs blanc/bleu clair (bg-blue-50/70)** appliquée sur tous les tableaux :
- Liste des formations (AdminFormations.tsx)
- Liste des séquences (AdminSequences.tsx)
- Liste des apprenants (AdminApprenants.tsx)
- Liste des inscrits dans la fenêtre de gestion des attestations (AdminGestionAttestations.tsx)
- Liste des utilisateurs (AdminUsers.tsx)
- Liste des formateurs (AdminFormateurs.tsx)
**Résultat :**
✅ Meilleure cohérence terminologique dans l'interface
✅ Amélioration significative de la lisibilité de tous les tableaux grâce à l'alternance de couleurs
✅ Expérience utilisateur plus fluide et professionnelle
✅ Déployé et testé avec succès sur le VPS de production (https://formations.itinova.org)
**Problème identifié :**
Les boutons d'ajout de balises (variables dynamiques) avaient été supprimés lors d'une modification précédente du fichier AdminEmailTemplates.tsx.
**Correction apportée :**
- Restauration de 10 boutons de variables dynamiques : {{nom}}, {{prenom}}, {{nomFormation}}, {{nomSequence}}, {{dateDebut}}, {{dateFin}}, {{lieu}}, {{formateur}}, {{datesHTML}}, {{lienReinitialisation}}
- Les boutons sont placés au-dessus de l'éditeur TipTap pour faciliter l'insertion rapide de variables
- Chaque bouton insère la balise correspondante à la position du curseur dans l'éditeur
- Message d'aide mis à jour pour encourager l'utilisation des boutons
**Résultat :**
✅ Les boutons sont de nouveau visibles et fonctionnels dans l'interface
✅ Déployé et testé avec succès sur le VPS de production (https://formations.itinova.org)
✅ L'expérience utilisateur est améliorée pour la création et modification des templates d'emails
**Fonctionnalité ajoutée :**
- Bouton "Ajouter un inscrit" avec icône UserPlus dans le header de la liste des inscrits
- Dialogue de sélection avec liste déroulante des apprenants disponibles (filtrés pour exclure ceux déjà inscrits)
- Sélection du statut (Confirmé / Liste d'attente)
- Mutation backend `inscriptions.create` pour l'ajout manuel par l'admin (sans vérifications de blocage/capacité)
**Fichiers modifiés :**
- client/src/pages/AdminSequenceInscrits.tsx : Ajout du bouton et du dialogue
- client/src/components/AddInscritForm.tsx : Nouveau composant de formulaire
- server/routers.ts : Ajout de la mutation inscriptions.create
**Résultat :**
Les administrateurs peuvent maintenant ajouter manuellement des apprenants à une séquence depuis l'interface des inscrits.
**Modification apportée :**
- Alternance de fond entre lignes paires (blanc) et impaires (bleu clair bg-blue-50/70)
- Bleu légèrement soutenu pour un meilleur contraste visuel que le gris
- Opacité à 70% pour un effet subtil et élégant
**Résultat :**
Tableau plus lisible avec une identité visuelle cohérente (thème bleu), améliore le suivi des lignes et la navigation visuelle.
**Modification apportée :**
- Alternance de fond entre lignes paires (blanc) et impaires (gris très clair bg-gray-50/50)
- Améliore la lisibilité et facilite le suivi visuel des lignes
- Effet subtil et élégant grâce à l'opacité réduite
**Résultat :**
Tableau plus lisible et professionnel, conforme aux standards modernes d'interface utilisateur.