# Feedback in-app (chat widget) L'application embarque un widget de feedback permettant à n'importe quel utilisateur de signaler un bug ou de proposer une idée d'amélioration, sans quitter l'app. ## Côté utilisateur ### Bouton flottant (FAB) Un bouton circulaire bleu flottant en **bas-droite** de l'écran (icône bulle), visible sur toutes les pages. Au clic, ouvre une modale chat. ### Modale chat - **Champ de type** : Bug / Proposition (radio) - **Champ message** : textarea multiligne, auto-scroll en bas après chaque envoi - **Bouton « Envoyer »** - **Historique** : les messages précédents (envoyés par l'user) et les réponses admin sont affichés sous forme de bulles type chat ### Notification visuelle Si un admin a répondu mais que l'user n'a pas encore consulté, l'**icône du FAB** change de couleur (orange) pour indiquer un nouveau message. ## Côté admin ### Page `/feedback` Liste de tous les feedbacks reçus, triés par date desc : - **Statut** : new (bleu) / in_progress (orange) / resolved (vert) - **Type** : Bug / Proposition - **Auteur** : nom complet + email - **Message** - **Page d'origine** (URL de l'app où l'user était au moment du clic) - **Réponse admin** (textarea) - **3 boutons d'envoi** : - **Envoyer uniquement** : envoie le message à l'user (visible dans son chat) sans changer le statut - **Envoyer + Marquer en cours** : `status → in_progress` - **Envoyer + Marquer résolu** : `status → resolved` Cliquer sur une ligne ouvre directement le panneau d'édition. ### Email de notification À la création d'un feedback, un email est envoyé à l'adresse configurée en **/params → Configuration email → Email admin (feedback in-app)**. Si cette adresse est vide, aucun email n'est envoyé. L'email contient : - Type + message - Page d'origine - Lien direct vers `/feedback` pour répondre ### Réponse → email vers l'auteur Quand l'admin clique sur « Envoyer + … », l'app : 1. Met à jour `FeedbackMessage.admin_response` + `response_sent_at` 2. Envoie un email à `FeedbackMessage.user_email` avec la réponse 3. Met à jour le statut selon le bouton choisi 4. Côté user, la réponse apparaît en bulle dans le chat à la prochaine ouverture ## Modèle de données Table `FeedbackMessage` (`src/db.py`) : ``` id, created_at, created_by (username), user_email, type ("bug"|"feature"), message, context_url, status ("new"|"in_progress"|"resolved"), admin_response, response_sent_at ``` ## Configuration Tout est centralisé dans `/params → Configuration email` : - SMTP (hôte, port, login, password, sender) — partagé avec l'envoi de récap d'absences - **Email admin (feedback in-app)** — destinataire des notifs feedback ## Notes techniques - Le titre de la modale est `"Feedback"` (anciennement « Aide & feedback EPTM », renommé après que Edge traduisait l'objet automatiquement). - Pour éviter la traduction auto du navigateur sur les textes critiques, l'app utilise : - `` global - `` + `translate="no"` injecté au boot - Classe `notranslate` + `custom_attrs={"translate": "no"}` sur les composants concernés