80 lines
3.1 KiB
Markdown
80 lines
3.1 KiB
Markdown
# 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 :
|
|
- `<meta name="google" content="notranslate">` global
|
|
- `<html lang="fr">` + `translate="no"` injecté au boot
|
|
- Classe `notranslate` + `custom_attrs={"translate": "no"}` sur les composants concernés
|