From 4042d5823ea98e5c15ed044bdec3c878caa6bbce Mon Sep 17 00:00:00 2001 From: Hanim Date: Tue, 12 Aug 2025 15:49:46 +0200 Subject: [PATCH] feat: Implement Parent Registration Step 4 and Step 5 Screens - Added ParentRegisterStep4Screen for capturing motivation and CGU acceptance. - Integrated custom checkbox and text field widgets for better UI. - Implemented modal dialog for displaying CGU text. - Created ParentRegisterStep5Screen for summarizing registration data. - Added functionality to display parent and child details with edit options. - Included confirmation modal upon submission of the registration request. --- frontend/CONTRIBUTING.md | 74 +++++++++++++++++++ frontend/README.md | 53 +++++++++++++ frontend/android/local.properties | 3 +- frontend/lib/navigation/app_router.dart | 10 +-- .../auth/am/am_register_step1_sceen.dart | 18 +++++ .../parent_register_step1_screen.dart | 8 +- .../parent_register_step2_screen.dart | 8 +- .../parent_register_step3_screen.dart | 12 +-- .../parent_register_step4_screen.dart | 6 +- .../parent_register_step5_screen.dart | 8 +- 10 files changed, 173 insertions(+), 27 deletions(-) create mode 100644 frontend/CONTRIBUTING.md create mode 100644 frontend/lib/screens/auth/am/am_register_step1_sceen.dart rename frontend/lib/screens/auth/{ => parent}/parent_register_step1_screen.dart (96%) rename frontend/lib/screens/auth/{ => parent}/parent_register_step2_screen.dart (97%) rename frontend/lib/screens/auth/{ => parent}/parent_register_step3_screen.dart (97%) rename frontend/lib/screens/auth/{ => parent}/parent_register_step4_screen.dart (98%) rename frontend/lib/screens/auth/{ => parent}/parent_register_step5_screen.dart (98%) diff --git a/frontend/CONTRIBUTING.md b/frontend/CONTRIBUTING.md new file mode 100644 index 0000000..f61eefb --- /dev/null +++ b/frontend/CONTRIBUTING.md @@ -0,0 +1,74 @@ +# 🚀 Guide de contribution – Projet P'titsPas (Flutter) + +Bienvenue ! Ce guide explique comment collaborer efficacement sur ce projet Flutter. + +--- + +## 📌 Branches Git + +Le projet suit une stratégie de branches simple et efficace : + +| Branche | Rôle | +|---------------|---------------------------------------------| +| `main` | Production (version stable déployée) | +| `develop` | Intégration (version en cours de test) | +| `feature/XXX` | Développement d’une nouvelle fonctionnalité | +| `fix/XXX` | Correction de bug | +| `hotfix/XXX` | Patch urgent sur `main` | + +--- + +## ✅ Cycle de développement + +1. **Crée une branche à partir de `develop`** + ```bash + git checkout develop + git pull origin develop + git checkout -b feature/FRONT-XXX-nom-fonctionnalite + +2. Travaille localement + commit régulièrement + + Commits clairs et concis : + Nom de la branche: Fonctionnalité push + + ```bash + git commit -m "FRONT-021: ajout du widget zone enfants" + ``` + +3. Pousse ta branche + + Exemple + ```bash + git push origin feature/FRONT-XXX-nom + + +4. Ouvre une Pull Request vers develop + + Ps : **La PR vers develop est faite lorsque une fonctionnalité du ticket à été fait et testé ou lorsque tous le ticket est finis** + - Titre : [FRONT-021] Widget zone enfants + + - Description : ce que tu as fait, ce qu’il reste à tester + - Lie le ticket associé (ex: Fixes #21) + +5. Relecture & Merge + - Au moins 1 review nécessaire + - Pas de commit direct sur develop ou main + +6. Une fois merge, supprime la branche distante: + + PS: **La branche est supprimé que lorsque tout le ticket a été consommé** + ```bash + git push origin --delete feature/FRONT-XXX-nom + ``` + +🧼 Règles de bonne conduite + +- Une PR = une seule fonctionnalité ou correction + +- Code commenté si logique complexe + +- Garder les noms de variables/dossiers clairs et en anglais + +- Pas de code mort ou non utilisé + +- Tester les commandes du workflow(dans le .github) afin d'être sur de ne pas avoir des erreur dans le code et pour etre sur de passer les tests du Workflow \ No newline at end of file diff --git a/frontend/README.md b/frontend/README.md index 9e6f97c..1151cd8 100644 --- a/frontend/README.md +++ b/frontend/README.md @@ -14,3 +14,56 @@ A few resources to get you started if this is your first Flutter project: For help getting started with Flutter development, view the [online documentation](https://docs.flutter.dev/), which offers tutorials, samples, guidance on mobile development, and a full API reference. + +### Workflow Git + +Le projet suit un **Git Flow simplifié** avec 3 branches principales : + +- `main` : version stable et déployée en production +- `develop` : version intégrée et testée avant passage en production +- `feature/*`, `fix/*`, `hotfix/*` : branches spécifiques au développement + +**Cycle standard :** +```bash +# Création d’une feature +git checkout develop +git checkout -b feature/FRONT-021-zone-enfants + +# Développement +git add . +git commit -m "FRONT-021: Widget zone enfants" +git push origin feature/FRONT-021-zone-enfants + +# Pull Request => vers develop +# Merge → suppression de la branche +Voir CONTRIBUTING.md pour les conventions détaillées. +``` +### Structure du projet Flutter + +Le projet suit une architecture modulaire MVC simplifiée compatible avec Provider (ou Riverpod léger). + +```plaintext +lib/ +├── main.dart # Point d’entrée +├── routes/ # go_router ou auto_route +├── models/ # Classes de données (User, Parent, Enfant, etc.) +├── services/ # Requêtes HTTP, AuthService, StorageService +├── utils/ # Helpers, validateurs, formatteurs +├── widgets/ # Composants UI réutilisables +├── screens/ # Pages par grande fonctionnalité +│ ├── auth/ # Connexion, inscription, mot de passe oublié +│ ├── registration/ # Création parent / assistante maternelle +│ ├── dashboard/ # Tableau de bord parent / AM / gestionnaire +│ ├── profile/ # Gestion des infos utilisateur +│ └── children/ # Fiches enfants +``` + +### Architecture choisie +🟩 Type : MVC Modulaire avec Provider (ou Riverpod léger) + +Avantages : + +- Simple à prendre en main +- Rapide à structurer +- Permet la séparation des features +- Adaptée à un projet Flutter Web PWA diff --git a/frontend/android/local.properties b/frontend/android/local.properties index 189af7a..0290669 100644 --- a/frontend/android/local.properties +++ b/frontend/android/local.properties @@ -1 +1,2 @@ -flutter.sdk=C:\\Users\\marti\\dev\\flutter \ No newline at end of file +flutter.sdk=C:\\Users\\myhan\\flutter +sdk.dir=C:\\Users\\myhan\\AppData\\Local\\Android\\Sdk \ No newline at end of file diff --git a/frontend/lib/navigation/app_router.dart b/frontend/lib/navigation/app_router.dart index 70b55a2..397113d 100644 --- a/frontend/lib/navigation/app_router.dart +++ b/frontend/lib/navigation/app_router.dart @@ -2,11 +2,11 @@ import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; import '../screens/auth/login_screen.dart'; import '../screens/auth/register_choice_screen.dart'; -import '../screens/auth/parent_register_step1_screen.dart'; -import '../screens/auth/parent_register_step2_screen.dart'; -import '../screens/auth/parent_register_step3_screen.dart'; -import '../screens/auth/parent_register_step4_screen.dart'; -import '../screens/auth/parent_register_step5_screen.dart'; +import '../screens/auth/parent/parent_register_step1_screen.dart'; +import '../screens/auth/parent/parent_register_step2_screen.dart'; +import '../screens/auth/parent/parent_register_step3_screen.dart'; +import '../screens/auth/parent/parent_register_step4_screen.dart'; +import '../screens/auth/parent/parent_register_step5_screen.dart'; import '../screens/home/home_screen.dart'; import '../models/user_registration_data.dart'; diff --git a/frontend/lib/screens/auth/am/am_register_step1_sceen.dart b/frontend/lib/screens/auth/am/am_register_step1_sceen.dart new file mode 100644 index 0000000..9fb1909 --- /dev/null +++ b/frontend/lib/screens/auth/am/am_register_step1_sceen.dart @@ -0,0 +1,18 @@ + +import 'package:flutter/material.dart'; + +class AmRegisterStep1Screen extends StatelessWidget { + const AmRegisterStep1Screen({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: const Text('Étape 1 - Inscription AM'), + ), + body: const Center( + child: Text('Contenu de l\'étape 1'), + ), + ); + } +} \ No newline at end of file diff --git a/frontend/lib/screens/auth/parent_register_step1_screen.dart b/frontend/lib/screens/auth/parent/parent_register_step1_screen.dart similarity index 96% rename from frontend/lib/screens/auth/parent_register_step1_screen.dart rename to frontend/lib/screens/auth/parent/parent_register_step1_screen.dart index 0463967..6f04062 100644 --- a/frontend/lib/screens/auth/parent_register_step1_screen.dart +++ b/frontend/lib/screens/auth/parent/parent_register_step1_screen.dart @@ -1,10 +1,10 @@ import 'package:flutter/material.dart'; import 'package:google_fonts/google_fonts.dart'; import 'dart:math' as math; // Pour la rotation du chevron -import '../../models/user_registration_data.dart'; // Import du modèle de données -import '../../utils/data_generator.dart'; // Import du générateur de données -import '../../widgets/custom_app_text_field.dart'; // Import du widget CustomAppTextField -import '../../models/card_assets.dart'; // Import des enums de cartes +import '../../../models/user_registration_data.dart'; // Import du modèle de données +import '../../../utils/data_generator.dart'; // Import du générateur de données +import '../../../widgets/custom_app_text_field.dart'; // Import du widget CustomAppTextField +import '../../../models/card_assets.dart'; // Import des enums de cartes class ParentRegisterStep1Screen extends StatefulWidget { const ParentRegisterStep1Screen({super.key}); diff --git a/frontend/lib/screens/auth/parent_register_step2_screen.dart b/frontend/lib/screens/auth/parent/parent_register_step2_screen.dart similarity index 97% rename from frontend/lib/screens/auth/parent_register_step2_screen.dart rename to frontend/lib/screens/auth/parent/parent_register_step2_screen.dart index a7ecaf2..f1008c0 100644 --- a/frontend/lib/screens/auth/parent_register_step2_screen.dart +++ b/frontend/lib/screens/auth/parent/parent_register_step2_screen.dart @@ -1,10 +1,10 @@ import 'package:flutter/material.dart'; import 'package:google_fonts/google_fonts.dart'; import 'dart:math' as math; // Pour la rotation du chevron -import '../../models/user_registration_data.dart'; // Import du modèle -import '../../utils/data_generator.dart'; // Import du générateur -import '../../widgets/custom_app_text_field.dart'; // Import du widget -import '../../models/card_assets.dart'; // Import des enums de cartes +import '../../../models/user_registration_data.dart'; // Import du modèle +import '../../../utils/data_generator.dart'; // Import du générateur +import '../../../widgets/custom_app_text_field.dart'; // Import du widget +import '../../../models/card_assets.dart'; // Import des enums de cartes class ParentRegisterStep2Screen extends StatefulWidget { final UserRegistrationData registrationData; // Accepte les données de l'étape 1 diff --git a/frontend/lib/screens/auth/parent_register_step3_screen.dart b/frontend/lib/screens/auth/parent/parent_register_step3_screen.dart similarity index 97% rename from frontend/lib/screens/auth/parent_register_step3_screen.dart rename to frontend/lib/screens/auth/parent/parent_register_step3_screen.dart index ac9daff..4797050 100644 --- a/frontend/lib/screens/auth/parent_register_step3_screen.dart +++ b/frontend/lib/screens/auth/parent/parent_register_step3_screen.dart @@ -2,16 +2,16 @@ import 'package:flutter/material.dart'; import 'package:google_fonts/google_fonts.dart'; import 'dart:math' as math; // Pour la rotation du chevron import 'package:flutter/gestures.dart'; // Pour PointerDeviceKind -import '../../widgets/hover_relief_widget.dart'; // Import du nouveau widget +import '../../../widgets/hover_relief_widget.dart'; // Import du nouveau widget import 'package:image_picker/image_picker.dart'; // import 'package:image_cropper/image_cropper.dart'; // Supprimé import 'dart:io' show File, Platform; // Ajout de Platform import 'package:flutter/foundation.dart' show kIsWeb; // Import pour kIsWeb -import '../../widgets/custom_app_text_field.dart'; // Import du nouveau widget TextField -import '../../widgets/app_custom_checkbox.dart'; // Import du nouveau widget Checkbox -import '../../models/user_registration_data.dart'; // Import du modèle de données -import '../../utils/data_generator.dart'; // Import du générateur -import '../../models/card_assets.dart'; // Import des enums de cartes +import '../../../widgets/custom_app_text_field.dart'; // Import du nouveau widget TextField +import '../../../widgets/app_custom_checkbox.dart'; // Import du nouveau widget Checkbox +import '../../../models/user_registration_data.dart'; // Import du modèle de données +import '../../../utils/data_generator.dart'; // Import du générateur +import '../../../models/card_assets.dart'; // Import des enums de cartes // La classe _ChildFormData est supprimée car on utilise ChildData du modèle diff --git a/frontend/lib/screens/auth/parent_register_step4_screen.dart b/frontend/lib/screens/auth/parent/parent_register_step4_screen.dart similarity index 98% rename from frontend/lib/screens/auth/parent_register_step4_screen.dart rename to frontend/lib/screens/auth/parent/parent_register_step4_screen.dart index 62ae003..c4a009e 100644 --- a/frontend/lib/screens/auth/parent_register_step4_screen.dart +++ b/frontend/lib/screens/auth/parent/parent_register_step4_screen.dart @@ -4,9 +4,9 @@ import 'package:p_tits_pas/widgets/custom_decorated_text_field.dart'; // Import import 'dart:math' as math; // Pour la rotation du chevron import 'package:p_tits_pas/widgets/app_custom_checkbox.dart'; // Import de la checkbox personnalisée // import 'package:p_tits_pas/models/placeholder_registration_data.dart'; // Remplacé -import '../../models/user_registration_data.dart'; // Import du vrai modèle -import '../../utils/data_generator.dart'; // Import du générateur -import '../../models/card_assets.dart'; // Import des enums de cartes +import '../../../models/user_registration_data.dart'; // Import du vrai modèle +import '../../../utils/data_generator.dart'; // Import du générateur +import '../../../models/card_assets.dart'; // Import des enums de cartes class ParentRegisterStep4Screen extends StatefulWidget { final UserRegistrationData registrationData; // Accepte les données diff --git a/frontend/lib/screens/auth/parent_register_step5_screen.dart b/frontend/lib/screens/auth/parent/parent_register_step5_screen.dart similarity index 98% rename from frontend/lib/screens/auth/parent_register_step5_screen.dart rename to frontend/lib/screens/auth/parent/parent_register_step5_screen.dart index 24a914c..adedd3c 100644 --- a/frontend/lib/screens/auth/parent_register_step5_screen.dart +++ b/frontend/lib/screens/auth/parent/parent_register_step5_screen.dart @@ -1,10 +1,10 @@ import 'package:flutter/material.dart'; import 'package:google_fonts/google_fonts.dart'; -import '../../models/user_registration_data.dart'; // Utilisation du vrai modèle -import '../../widgets/image_button.dart'; // Import du ImageButton -import '../../models/card_assets.dart'; // Import des enums de cartes +import '../../../models/user_registration_data.dart'; // Utilisation du vrai modèle +import '../../../widgets/image_button.dart'; // Import du ImageButton +import '../../../models/card_assets.dart'; // Import des enums de cartes import 'package:flutter/foundation.dart' show kIsWeb; -import '../../widgets/custom_decorated_text_field.dart'; // Import du CustomDecoratedTextField +import '../../../widgets/custom_decorated_text_field.dart'; // Import du CustomDecoratedTextField // Nouvelle méthode helper pour afficher un champ de type "lecture seule" stylisé Widget _buildDisplayFieldValue(BuildContext context, String label, String value, {bool multiLine = false, double fieldHeight = 50.0, double labelFontSize = 18.0}) {