✨ Story 5.6: feedback utilisateur
This commit is contained in:
@@ -2,7 +2,7 @@
|
||||
|
||||
## Status
|
||||
|
||||
Ready for Dev
|
||||
review
|
||||
|
||||
## Story
|
||||
|
||||
@@ -21,33 +21,33 @@ Ready for Dev
|
||||
|
||||
## Tasks / Subtasks
|
||||
|
||||
- [] **Task 1 : Afficher l'état de chargement** (AC: 1, 2)
|
||||
- [] Masquer le texte du bouton (submitText.classList.add('hidden'))
|
||||
- [] Afficher le spinner (submitLoading.classList.remove('hidden'))
|
||||
- [] Désactiver le bouton (submitBtn.disabled = true)
|
||||
- [x] **Task 1 : Afficher l'état de chargement** (AC: 1, 2)
|
||||
- [x] Masquer le texte du bouton (submitText.classList.add('hidden'))
|
||||
- [x] Afficher le spinner (submitLoading.classList.remove('hidden'))
|
||||
- [x] Désactiver le bouton (submitBtn.disabled = true)
|
||||
|
||||
- [] **Task 2 : Envoyer en AJAX** (AC: 5)
|
||||
- [] Utiliser fetch() avec POST
|
||||
- [] Envoyer les données en JSON (Content-Type: application/json)
|
||||
- [] Inclure les tokens (CSRF + reCAPTCHA)
|
||||
- [x] **Task 2 : Envoyer en AJAX** (AC: 5)
|
||||
- [x] Utiliser fetch() avec POST
|
||||
- [x] Envoyer les données en JSON (Content-Type: application/json)
|
||||
- [x] Inclure les tokens (CSRF + reCAPTCHA)
|
||||
|
||||
- [] **Task 3 : Gérer le succès** (AC: 3, 6)
|
||||
- [] Masquer le formulaire (form.classList.add('hidden'))
|
||||
- [] Afficher le message de succès
|
||||
- [] Mention des spams (vérifier sous 48h)
|
||||
- [] Vider le localStorage (AppState.clearFormData())
|
||||
- [] Réinitialiser le formulaire (form.reset())
|
||||
- [x] **Task 3 : Gérer le succès** (AC: 3, 6)
|
||||
- [x] Masquer le formulaire (form.classList.add('hidden'))
|
||||
- [x] Afficher le message de succès
|
||||
- [x] Mention des spams (vérifier sous 48h)
|
||||
- [x] Vider le localStorage (AppState.clearFormData())
|
||||
- [x] Réinitialiser le formulaire (form.reset())
|
||||
|
||||
- [] **Task 4 : Gérer les erreurs** (AC: 4)
|
||||
- [] Afficher le message d'erreur avec icône
|
||||
- [] Garder les données dans le formulaire
|
||||
- [] Message "Vos données ont été conservées"
|
||||
- [] Permettre de réessayer
|
||||
- [x] **Task 4 : Gérer les erreurs** (AC: 4)
|
||||
- [x] Afficher le message d'erreur avec icône
|
||||
- [x] Garder les données dans le formulaire
|
||||
- [x] Message "Vos données ont été conservées"
|
||||
- [x] Permettre de réessayer
|
||||
|
||||
- [] **Task 5 : Réinitialiser l'état après feedback**
|
||||
- [] Masquer le spinner (finally block)
|
||||
- [] Réactiver le bouton
|
||||
- [] Scroll vers le message (scrollIntoView)
|
||||
- [x] **Task 5 : Réinitialiser l'état après feedback**
|
||||
- [x] Masquer le spinner (finally block)
|
||||
- [x] Réactiver le bouton
|
||||
- [x] Scroll vers le message (scrollIntoView)
|
||||
|
||||
## Dev Notes
|
||||
|
||||
@@ -265,23 +265,27 @@ document.addEventListener('DOMContentLoaded', () => {
|
||||
## Dev Agent Record
|
||||
|
||||
### Agent Model Used
|
||||
Claude Opus 4.5 (claude-opus-4-5-20251101)
|
||||
GPT-5 Codex
|
||||
|
||||
### Implementation Plan
|
||||
- Implémenter les tâches 1 à 5 dans l’ordre avec tests à chaque étape.
|
||||
- Ajouter submit JS et messages UX dans contact.php.
|
||||
|
||||
### File List
|
||||
| File | Action | Description |
|
||||
|------|--------|-------------|
|
||||
| `assets/js/contact-form.js` | Modified | Ajout classe ContactFormSubmit |
|
||||
| `pages/contact.php` | Modified | Messages succès/erreur améliorés |
|
||||
| `assets/js/contact-form.js` | Modified | Ajout classe ContactFormSubmit + AJAX |
|
||||
| `pages/contact.php` | Modified | Messages succès/erreur + spinner |
|
||||
| `tests/contact-submit.test.php` | Added | Tests submit AJAX/UX |
|
||||
| `tests/contact.test.php` | Modified | Vérif submit-loading + messages |
|
||||
| `tests/run.ps1` | Modified | Ajout du test contact-submit |
|
||||
|
||||
### Completion Notes
|
||||
- Classe ContactFormSubmit avec gestion complète du cycle de vie
|
||||
- État loading : spinner + bouton désactivé
|
||||
- Envoi AJAX avec fetch() et JSON
|
||||
- Tokens CSRF et reCAPTCHA inclus automatiquement
|
||||
- Succès : formulaire masqué, message avec mention spams, localStorage vidé
|
||||
- Erreur : message explicite, données conservées, possibilité de réessayer
|
||||
- Scroll automatique vers les messages (scrollIntoView smooth)
|
||||
- Gestion des erreurs réseau (catch)
|
||||
- Classe ContactFormSubmit avec cycle complet (loading/succès/erreur)
|
||||
- Envoi AJAX JSON avec tokens CSRF + reCAPTCHA
|
||||
- Succès : formulaire masqué + message 48h + purge localStorage
|
||||
- Erreur : message explicite + données conservées
|
||||
- Tests : `powershell -ExecutionPolicy Bypass -File tests/run.ps1`
|
||||
|
||||
### Debug Log References
|
||||
Aucun problème rencontré.
|
||||
@@ -292,3 +296,4 @@ Aucun problème rencontré.
|
||||
|------|---------|-------------|--------|
|
||||
| 2026-01-22 | 0.1 | Création initiale | Sarah (PO) |
|
||||
| 2026-01-24 | 1.0 | Implémentation complète | James (Dev) |
|
||||
| 2026-02-04 | 1.1 | Feedback utilisateur AJAX | Amelia (Dev) |
|
||||
|
||||
Reference in New Issue
Block a user