✨ Story 5.3: persistance localStorage
This commit is contained in:
@@ -2,7 +2,7 @@
|
||||
|
||||
## Status
|
||||
|
||||
Ready for Dev
|
||||
review
|
||||
|
||||
## Story
|
||||
|
||||
@@ -21,34 +21,34 @@ Ready for Dev
|
||||
|
||||
## Tasks / Subtasks
|
||||
|
||||
- [] **Task 1 : Créer le gestionnaire de stockage** (AC: 6)
|
||||
- [] Clé unique `portfolio_contact_form`
|
||||
- [] Méthodes save, load, clear
|
||||
- [] Gestion des erreurs (localStorage indisponible)
|
||||
- [x] **Task 1 : Créer le gestionnaire de stockage** (AC: 6)
|
||||
- [x] Clé unique `portfolio_contact_form`
|
||||
- [x] Méthodes save, load, clear
|
||||
- [x] Gestion des erreurs (localStorage indisponible)
|
||||
|
||||
- [] **Task 2 : Sauvegarder automatiquement** (AC: 1)
|
||||
- [] Écouter l'événement `input` sur chaque champ
|
||||
- [] Debounce pour éviter trop d'écritures (500ms)
|
||||
- [] Sauvegarder l'état complet
|
||||
- [x] **Task 2 : Sauvegarder automatiquement** (AC: 1)
|
||||
- [x] Écouter l'événement `input` sur chaque champ
|
||||
- [x] Debounce pour éviter trop d'écritures (500ms)
|
||||
- [x] Sauvegarder l'état complet
|
||||
|
||||
- [] **Task 3 : Restaurer au chargement** (AC: 2)
|
||||
- [] Charger les données au DOMContentLoaded
|
||||
- [] Pré-remplir chaque champ
|
||||
- [] Mettre à jour le compteur de caractères
|
||||
- [x] **Task 3 : Restaurer au chargement** (AC: 2)
|
||||
- [x] Charger les données au DOMContentLoaded
|
||||
- [x] Pré-remplir chaque champ
|
||||
- [x] Mettre à jour le compteur de caractères
|
||||
|
||||
- [] **Task 4 : Vider après envoi réussi** (AC: 3)
|
||||
- [] Appeler clear() après succès (événement formSuccess)
|
||||
- [] Réinitialiser le formulaire
|
||||
- [x] **Task 4 : Vider après envoi réussi** (AC: 3)
|
||||
- [x] Appeler clear() après succès (événement formSuccess)
|
||||
- [x] Réinitialiser le formulaire
|
||||
|
||||
- [] **Task 5 : Bouton "Effacer"** (AC: 4)
|
||||
- [] Écouter le clic sur le bouton (id="clear-form-btn")
|
||||
- [] Vider le localStorage
|
||||
- [] Réinitialiser le formulaire
|
||||
- [] Confirmation avec confirm()
|
||||
- [x] **Task 5 : Bouton "Effacer"** (AC: 4)
|
||||
- [x] Écouter le clic sur le bouton (id="clear-form-btn")
|
||||
- [x] Vider le localStorage
|
||||
- [x] Réinitialiser le formulaire
|
||||
- [x] Confirmation avec confirm()
|
||||
|
||||
- [] **Task 6 : Exclure les données sensibles** (AC: 5)
|
||||
- [] Ne pas stocker csrf_token, password, recaptcha_token
|
||||
- [] Documenté dans EXCLUDED_FIELDS
|
||||
- [x] **Task 6 : Exclure les données sensibles** (AC: 5)
|
||||
- [x] Ne pas stocker csrf_token, password, recaptcha_token
|
||||
- [x] Documenté dans EXCLUDED_FIELDS
|
||||
|
||||
## Dev Notes
|
||||
|
||||
@@ -270,7 +270,11 @@ Exemple de données stockées:
|
||||
## 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 à 6 dans l’ordre avec tests à chaque étape.
|
||||
- Intégrer le stockage dans `contact-form.js` et scripts dans la page.
|
||||
|
||||
### File List
|
||||
| File | Action | Description |
|
||||
@@ -278,16 +282,16 @@ Claude Opus 4.5 (claude-opus-4-5-20251101)
|
||||
| `assets/js/state.js` | Created | Objet AppState pour gestion localStorage |
|
||||
| `assets/js/contact-form.js` | Modified | Ajout classe ContactFormPersistence |
|
||||
| `pages/contact.php` | Modified | Bouton Effacer + script state.js |
|
||||
| `tests/contact-state.test.php` | Added | Tests persistance localStorage |
|
||||
| `tests/contact.test.php` | Modified | Vérification clear button + scripts |
|
||||
| `tests/run.ps1` | Modified | Ajout du test contact-state |
|
||||
|
||||
### Completion Notes
|
||||
- AppState avec clé unique `portfolio_contact_form`
|
||||
- Vérification disponibilité localStorage (try/catch)
|
||||
- Filtrage des champs sensibles (csrf_token, password, recaptcha_token)
|
||||
- Debounce de 500ms sur la sauvegarde
|
||||
- Restauration automatique au chargement de la page
|
||||
- Bouton "Effacer" avec confirmation et reset complet
|
||||
- Événement `formSuccess` pour vider après envoi réussi
|
||||
- Scripts chargés avec defer pour ne pas bloquer le rendu
|
||||
- AppState avec clé unique `portfolio_contact_form` et exclusions sensibles
|
||||
- Sauvegarde avec debounce 500ms + restauration au chargement
|
||||
- Bouton Effacer avec confirm + reset complet
|
||||
- Listener `formSuccess` pour purge post-envoi
|
||||
- Tests : `powershell -ExecutionPolicy Bypass -File tests/run.ps1`
|
||||
|
||||
### Debug Log References
|
||||
Aucun problème rencontré.
|
||||
@@ -298,3 +302,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 | Persistance localStorage | Amelia (Dev) |
|
||||
|
||||
Reference in New Issue
Block a user