- 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
**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
**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)
- Page AdminSequences : ouvre en vue réduite par défaut
- DashboardLayout : seule la section "Gestion" est ouverte par défaut à la connexion
- Déployé sur le VPS de production
- Modification de la procédure testerRappel pour détecter automatiquement le premier rappel actif configuré pour la séquence
- Suppression du paramètre typeRappel (n'est plus nécessaire)
- Création de la fonction sendRappelEmail générique qui utilise le templateType du rappel configuré
- Le bouton frontend envoie maintenant le bon template (rappel 1, 3, 4, 5, 6, etc.) selon la configuration de la séquence
- Gestion des pièces jointes configurées dans le rappel
- Mise à jour du fichier todo.md pour marquer la tâche comme terminée
- Ajout du paramètre typeRappel: 'rappel' dans l'appel à testerRappelMutation
- Le backend attendait ce paramètre avec les valeurs 'rappel' ou 'rappelJ1'
- Le bouton envoie maintenant un rappel J-7 par défaut lors du test
- Mise à jour du fichier todo.md pour marquer la tâche comme terminée
- Ajout de la mutation testerRappelMutation connectée à la procédure tRPC rappels.testerRappel
- Ajout de l'icône Send dans les imports
- Ajout du bouton dans la colonne Actions du tableau des séquences (entre Edit et Delete)
- Le bouton envoie un email de test à l'administrateur avec les données de la séquence sélectionnée
- Validation : le bouton est désactivé si la séquence n'a pas de dates configurées
- Feedback utilisateur : toast de succès ou d'erreur après l'envoi
- Mise à jour du fichier todo.md pour marquer la tâche comme terminée
**Ajouts :**
- Template "Réinitialisation de mot de passe" (reset_password) ajouté à l'enum et au système
**Corrections de bugs :**
- Bug de mise à jour du type de template (ajout de key={selectedType} pour forcer remontage)
- Erreur SQL configuration SMTP (correction schéma emailConfig avec champs active, domainVerified, apiKey)
- Erreur de type formateurId (conversion string → number dans AdminSequences.tsx)
- Date de blocage non sauvegardée (ajout champ dateBlocage au schéma sequences)
- Table logsRappels incohérente (suppression colonnes obsolètes, correction enum statut)
**Schémas Drizzle mis à jour :**
- emailTemplates : ajout reset_password à l'enum type
- emailConfig : ajout active, domainVerified, correction apiKey
- sequences : ajout dateBlocage (datetime)
- logsRappels : structure nettoyée et conforme
**Déploiement VPS :**
- Toutes les migrations SQL exécutées avec succès
- Application redémarrée et fonctionnelle
- Historique des rappels prêt à fonctionner (table logsRappels corrigée)
- Ajout du champ formateur (number | null) dans le type FormData de AdminSequences.tsx
- Ajout du type "tous" dans publicCible pour supporter toutes les valeurs possibles
- Correction de FormateurCombobox pour accepter number | null au lieu de string
- Correction des erreurs null dans QuestionnaireReponse.tsx avec optional chaining
- Correction du type previewType dans AdminSequenceInscrits.tsx pour inclure "rappel_j1"
- Build de production testé et fonctionnel (✓ built in 14.69s)
Les quelques avertissements TypeScript restants (11) ne bloquent pas le build de production. L'application peut maintenant être publiée.
1. Bug décalage horaire dans le formulaire d'édition des séquences
- Correction de la fonction safeFormatDate pour utiliser les méthodes locales (getHours, getMinutes) au lieu des méthodes UTC
- Les heures saisies (ex: 9h00) s'affichent maintenant correctement dans le formulaire d'édition
2. Ajout du menu de navigation sur la page Import Excel
- Intégration du DashboardLayout wrapper dans AdminImportExcel.tsx
- Le menu latéral s'affiche maintenant correctement sur cette page
3. Déplacement du menu "Import Excel"
- Déplacé du bloc GESTION vers le bloc CONFIGURATION dans le menu de navigation
- Positionné après "Utilisateurs" et avant "Rappels" pour une meilleure organisation
- Correction du placeholder du formateur dans le formulaire de modification de séquence (suppression de "(optionnel)")
- Ajout d'une colonne "Formateur" dans le tableau de la liste des séquences
- Le formateur s'affiche maintenant dans la liste avec "-" si non assigné
- Tests réussis : le placeholder est correct et la colonne formateur est visible
✅ **1. Champ formateur dans nouvelle séquence**
Ajout du champ formateur avec autocomplétion dans le formulaire de création de séquence, permettant de sélectionner ou ajouter rapidement un formateur.
✅ **2. Placeholder du formateur**
Le placeholder affiche "Sélectionner un formateur" (déjà correct par défaut dans le composant).
✅ **3. Nom séquence + formation dans calendrier**
Le calendrier affiche maintenant le nom de la séquence ET le nom de la formation associée pour une meilleure identification visuelle.
✅ **1. "Tous" dans le formulaire nouvelle séquence**
Ajout de l'option "Tous" dans la liste des publics cible du formulaire de création de séquence, avec badge violet et labels correspondants.
✅ **2. Couleurs de la barre de progression**
Correction du composant Progress pour supporter `indicatorClassName`. La barre affiche maintenant les bonnes couleurs selon le taux de remplissage : vert (<70%), orange (70-90%), rouge (>90%).
✅ **3. Informations complètes dans le calendrier**
Enrichissement des cases du calendrier avec lieu, formateur et nombre d'inscrits pour chaque séquence, permettant une vue d'ensemble plus complète.
✅ **Fonctionnalités incluses**
**1. Gestion des formateurs**
- Table formateurs dans la base de données
- Composant FormateurCombobox avec autocomplétion
- Ajout rapide de nouveaux formateurs depuis le formulaire
- Champ formateur dans les séquences (création et modification)
- Affichage du formateur dans le tableau et les emails
**2. Barre de progression colorée**
- Composant CapacityProgressBar avec code couleur automatique
- Vert (<70%), Orange (70-90%), Rouge (>90%)
- Affichage "nbInscrits / capacité" + pourcentage
- Intégré dans le tableau des séquences
**3. Vue calendrier mensuel**
- Page AdminCalendrier avec navigation mois précédent/suivant
- Affichage des séquences sur leurs dates respectives
- Dialog de détails au clic sur une séquence
- Lien "Calendrier" dans le menu de navigation
**4. Système de rappels automatiques**
- Page AdminRappels pour configurer les rappels (J-15, J-7, J-1)
- Templates d'emails personnalisables avec variables dynamiques
- Activation/désactivation des rappels
- Infrastructure prête pour l'envoi automatique futur
**5. Améliorations diverses**
- Public cible "Tous" ajouté dans les options
- Formulaires de séquences réorganisés (pas de chevauchement)
- Affichage du formateur dans les emails d'invitation
- Colonne formateur dans le tableau des séquences
✅ **Problème résolu**
- Le fichier FormateurCombobox.tsx avait été perdu lors d'une manipulation précédente
- Fichier recréé avec toutes les fonctionnalités :
* Autocomplétion avec recherche en temps réel
* Ajout rapide de nouveaux formateurs depuis le composant
* Intégration complète avec tRPC
✅ **Import corrigé**
- Import ajouté dans AdminSequences.tsx
- Serveur redémarré pour détecter le nouveau fichier
Le formulaire de modification des séquences fonctionne maintenant correctement avec le champ formateur.
✅ **1. Fenêtre de modification agrandie**
- Largeur passée de max-w-3xl à max-w-4xl
- Les champs formateur et capacité ne se chevauchent plus
- Meilleure lisibilité de tous les champs du formulaire
✅ **2. Espacement amélioré dans la barre de progression**
- Ajout d'un gap de 4 unités entre la capacité et le pourcentage
- Meilleure séparation visuelle des informations
- Lecture plus claire du taux de remplissage
Ces ajustements améliorent l'ergonomie et la lisibilité de l'interface de gestion des séquences.
✅ Ajout de l'import manquant de useMemo depuis React
✅ La page Séquences fonctionne maintenant correctement sans erreur
Bug corrigé : L'erreur ReferenceError qui empêchait l'accès à la page de gestion des séquences a été résolue.
✅ **1. Indicateur visuel de remplissage**
- Composant CapacityProgressBar avec barre de progression colorée
- Affichage "X / Y" avec pourcentage
- Couleurs automatiques : vert (<70%), orange (70-90%), rouge (>90%)
- Intégré dans la colonne capacité du tableau des séquences
✅ **2. Vue calendrier mensuel**
- Nouvelle page AdminCalendrier accessible depuis le menu
- Calendrier mensuel avec navigation (mois précédent/suivant, aujourd'hui)
- Affichage des séquences sur leurs dates respectives
- Dialog de détails au clic sur une séquence
- Vue complète avec toutes les informations (lieu, formateur, capacité, dates)
✅ **3. Système de rappels automatiques personnalisables**
- Tables rappels et rappelsEnvoyes créées
- Procédures tRPC complètes (list, create, update, delete)
- Page AdminRappels avec interface de gestion
- Configuration de rappels multiples (J-15, J-7, J-1, etc.)
- Templates d'emails personnalisables avec variables dynamiques
- Activation/désactivation des rappels
- Infrastructure prête pour l'envoi automatique (nécessite service de planification externe)
Ces améliorations facilitent grandement la planification et le suivi des formations.
✅ **1. Affichage dans le tableau des séquences**
- Nouvelle colonne "Formateur" ajoutée au tableau de gestion
- Affiche le nom du formateur ou "-" si non renseigné
✅ **2. Liste prédéfinie avec autocomplétion**
- Nouvelle table `formateurs` dans la base de données
- Procédures tRPC (list, create, delete) pour gérer les formateurs
- Composant `FormateurCombobox` avec autocomplétion intelligente
- Possibilité d'ajouter rapidement un nouveau formateur depuis le formulaire
- Recherche en temps réel parmi les formateurs existants
✅ **3. Inclusion dans les emails d'invitation**
- Le nom du formateur est maintenant affiché dans les emails de confirmation d'inscription
- Affichage conditionnel (uniquement si un formateur est renseigné)
- Améliore la communication avec les apprenants
Ces améliorations standardisent la gestion des formateurs, évitent les doublons/fautes de frappe, et enrichissent l'information transmise aux apprenants.
✅ Base de données : colonne "formateur" ajoutée à la table sequences (VARCHAR 255, nullable)
✅ Backend : procédures tRPC mises à jour
- sequences.create : champ formateur ajouté (optionnel)
- sequences.update : champ formateur ajouté (optionnel)
✅ Frontend : formulaires mis à jour
- Formulaire de création : champ "Formateur" ajouté avec placeholder
- Formulaire de modification : champ "Formateur" ajouté avec placeholder
- Le champ est non obligatoire comme demandé
Le champ formateur permet maintenant de spécifier le nom du formateur pour chaque séquence de formation lors de la création ou de la modification.
✅ Ajout du champ "Public cible" dans le dialogue de modification des séquences
- Le champ est maintenant visible et modifiable lors de l'édition d'une séquence
- Support complet de l'option "Tous" ajoutée précédemment
✅ Affichage du nombre d'inscrits dans la colonne capacité
- Format : "nombre d'inscrits / capacité" (ex: "5 / 12")
- Mise à jour de la procédure sequences.list pour inclure le comptage des inscriptions confirmées
- Mise à jour du schéma de validation pour inclure "tous" dans publicCible
Les deux problèmes signalés sont maintenant corrigés et l'application est prête à l'emploi.
✅ Base de données : enum publicCible mis à jour avec la valeur "tous"
✅ Frontend mis à jour dans 4 fichiers :
- AdminSequences.tsx : ajout de "tous" dans les types TypeScript, options de sélection et badges (couleur violet)
- AdminSequenceInscrits.tsx : ajout de "tous" dans les fonctions de labels et badges
- AdminRapportPublicCible.tsx : ajout de "tous" dans les fonctions de labels et badges
- Inscription.tsx : ajout de "tous" dans le mapping, l'affichage et la logique d'alerte (pas d'alerte si public cible = "Tous")
Les séquences peuvent maintenant être créées avec le public cible "Tous", ce qui permet de cibler tous les profils sans distinction.