From 760f4feca3c2928033810d1aaa7cf0713bd809c1 Mon Sep 17 00:00:00 2001 From: Julien Martin Date: Mon, 12 May 2025 13:04:29 +0200 Subject: [PATCH] =?UTF-8?q?feat(ui):=20Am=C3=A9lioration=20des=20cartes=20?= =?UTF-8?q?de=20r=C3=A9capitulatif=20parents=20et=20enfants\n\n-=20Labes?= =?UTF-8?q?=20plus=20grands=20et=20espacement=20augment=C3=A9=20pour=20les?= =?UTF-8?q?=20cartes=20parents\n-=20Labels=20plus=20grands=20pour=20les=20?= =?UTF-8?q?champs=20enfants\n-=20Titre=20enfant=20int=C3=A9gr=C3=A9=20et?= =?UTF-8?q?=20centr=C3=A9=20dans=20la=20carte\n-=20Image=20enfant=20sans?= =?UTF-8?q?=20cadre=20blanc,=20occupant=20toute=20la=20hauteur\n-=20Bouton?= =?UTF-8?q?=20de=20modification=20bien=20positionn=C3=A9\n-=20Affichage=20?= =?UTF-8?q?des=20consentements=20en=20lecture=20seule=20sous=20la=20fiche?= =?UTF-8?q?=20enfant?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../auth/parent_register_step5_screen.dart | 167 ++++++++++++++---- 1 file changed, 133 insertions(+), 34 deletions(-) diff --git a/frontend/lib/screens/auth/parent_register_step5_screen.dart b/frontend/lib/screens/auth/parent_register_step5_screen.dart index 05101fd..b4de1ad 100644 --- a/frontend/lib/screens/auth/parent_register_step5_screen.dart +++ b/frontend/lib/screens/auth/parent_register_step5_screen.dart @@ -3,16 +3,16 @@ 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 'package:flutter/foundation.dart' show kIsWeb; // 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}) { - const double detailFontSize = 18.0; +Widget _buildDisplayFieldValue(BuildContext context, String label, String value, {bool multiLine = false, double fieldHeight = 50.0, double labelFontSize = 18.0}) { const FontWeight labelFontWeight = FontWeight.w600; return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text(label, style: GoogleFonts.merienda(fontSize: detailFontSize, fontWeight: labelFontWeight)), + Text(label, style: GoogleFonts.merienda(fontSize: labelFontSize, fontWeight: labelFontWeight)), const SizedBox(height: 4), Container( width: double.infinity, // Prendra la largeur allouée par son parent (Expanded) @@ -30,7 +30,7 @@ Widget _buildDisplayFieldValue(BuildContext context, String label, String value, ), child: Text( value.isNotEmpty ? value : '-', - style: GoogleFonts.merienda(fontSize: detailFontSize), + style: GoogleFonts.merienda(fontSize: labelFontSize), maxLines: multiLine ? null : 1, // Permet plusieurs lignes si multiLine est true overflow: multiLine ? TextOverflow.visible : TextOverflow.ellipsis, ), @@ -46,28 +46,29 @@ class ParentRegisterStep5Screen extends StatelessWidget { // Méthode pour construire la carte Parent 1 Widget _buildParent1Card(BuildContext context, ParentData data) { - const double verticalSpacing = 15.0; // Espacement vertical entre les "champs" + const double verticalSpacing = 28.0; // Espacement vertical augmenté + const double labelFontSize = 22.0; // Taille de label augmentée List details = [ Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Expanded(child: _buildDisplayFieldValue(context, "Nom:", data.lastName)), - const SizedBox(width: 20), // Espace entre les champs dans la Row - Expanded(child: _buildDisplayFieldValue(context, "Prénom:", data.firstName)), + Expanded(child: _buildDisplayFieldValue(context, "Nom:", data.lastName, labelFontSize: labelFontSize)), + const SizedBox(width: 20), + Expanded(child: _buildDisplayFieldValue(context, "Prénom:", data.firstName, labelFontSize: labelFontSize)), ], ), const SizedBox(height: verticalSpacing), Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Expanded(child: _buildDisplayFieldValue(context, "Téléphone:", data.phone)), + Expanded(child: _buildDisplayFieldValue(context, "Téléphone:", data.phone, labelFontSize: labelFontSize)), const SizedBox(width: 20), - Expanded(child: _buildDisplayFieldValue(context, "Email:", data.email, multiLine: true)), // Email peut nécessiter plusieurs lignes + Expanded(child: _buildDisplayFieldValue(context, "Email:", data.email, multiLine: true, labelFontSize: labelFontSize)), ], ), const SizedBox(height: verticalSpacing), - _buildDisplayFieldValue(context, "Adresse:", "${data.address}\n${data.postalCode} ${data.city}".trim(), multiLine: true, fieldHeight: 80), // fieldHeight est une suggestion pour 2 lignes + _buildDisplayFieldValue(context, "Adresse:", "${data.address}\n${data.postalCode} ${data.city}".trim(), multiLine: true, fieldHeight: 80, labelFontSize: labelFontSize), ]; return _SummaryCard( backgroundImagePath: CardColorHorizontal.peach.path, @@ -79,28 +80,28 @@ class ParentRegisterStep5Screen extends StatelessWidget { // Méthode pour construire la carte Parent 2 Widget _buildParent2Card(BuildContext context, ParentData data) { - const double verticalSpacing = 15.0; - // Structure similaire à _buildParent1Card + const double verticalSpacing = 28.0; + const double labelFontSize = 22.0; List details = [ Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Expanded(child: _buildDisplayFieldValue(context, "Nom:", data.lastName)), + Expanded(child: _buildDisplayFieldValue(context, "Nom:", data.lastName, labelFontSize: labelFontSize)), const SizedBox(width: 20), - Expanded(child: _buildDisplayFieldValue(context, "Prénom:", data.firstName)), + Expanded(child: _buildDisplayFieldValue(context, "Prénom:", data.firstName, labelFontSize: labelFontSize)), ], ), const SizedBox(height: verticalSpacing), Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Expanded(child: _buildDisplayFieldValue(context, "Téléphone:", data.phone)), + Expanded(child: _buildDisplayFieldValue(context, "Téléphone:", data.phone, labelFontSize: labelFontSize)), const SizedBox(width: 20), - Expanded(child: _buildDisplayFieldValue(context, "Email:", data.email, multiLine: true)), + Expanded(child: _buildDisplayFieldValue(context, "Email:", data.email, multiLine: true, labelFontSize: labelFontSize)), ], ), const SizedBox(height: verticalSpacing), - _buildDisplayFieldValue(context, "Adresse:", "${data.address}\n${data.postalCode} ${data.city}".trim(), multiLine: true, fieldHeight: 80), + _buildDisplayFieldValue(context, "Adresse:", "${data.address}\n${data.postalCode} ${data.city}".trim(), multiLine: true, fieldHeight: 80, labelFontSize: labelFontSize), ]; return _SummaryCard( backgroundImagePath: CardColorHorizontal.blue.path, @@ -116,27 +117,125 @@ class ParentRegisterStep5Screen extends StatelessWidget { int index = entry.key; ChildData child = entry.value; - // Convertir CardColorVertical en CardColorHorizontal pour le récapitulatif - // Ceci suppose que les noms de couleurs correspondent entre les deux enums. CardColorHorizontal cardColorHorizontal = CardColorHorizontal.values.firstWhere( (e) => e.name == child.cardColor.name, - orElse: () => CardColorHorizontal.lavender, // Couleur par défaut si non trouvée + orElse: () => CardColorHorizontal.lavender, ); - List details = [ - _buildDetailRow('Prénom', child.firstName), - _buildDetailRow('Nom', child.lastName), - _buildDetailRow(child.isUnbornChild ? 'Date Prév.' : 'Naissance', child.dob), - _buildDetailRow('Cons. Photo', child.photoConsent ? 'Oui' : 'Non'), - _buildDetailRow('Naiss. Mult.', child.multipleBirth ? 'Oui' : 'Non'), - ]; return Padding( - padding: const EdgeInsets.only(bottom: 20.0), // Espace entre les cartes enfants - child: _SummaryCard( - backgroundImagePath: cardColorHorizontal.path, // Utiliser la couleur convertie - title: 'Enfant ${index + 1}' + (child.isUnbornChild ? ' (à naître)' : ''), - content: details, - onEdit: () { /* TODO: Naviguer vers step3 et focus l'enfant index */ }, + padding: const EdgeInsets.only(bottom: 20.0), + child: Stack( + children: [ + AspectRatio( + aspectRatio: 2.0, + child: Container( + padding: const EdgeInsets.symmetric(vertical: 20.0, horizontal: 25.0), + decoration: BoxDecoration( + image: DecorationImage( + image: AssetImage(cardColorHorizontal.path), + fit: BoxFit.cover, + ), + borderRadius: BorderRadius.circular(15), + ), + child: Column( + children: [ + // Titre centré dans la carte + Row( + children: [ + Expanded( + child: Text( + 'Enfant ${index + 1}' + (child.isUnbornChild ? ' (à naître)' : ''), + style: GoogleFonts.merienda(fontSize: 28, fontWeight: FontWeight.w600), + textAlign: TextAlign.center, + ), + ), + IconButton( + icon: const Icon(Icons.edit, color: Colors.black54, size: 28), + onPressed: () { + Navigator.of(context).pushNamed( + '/parent-register/step3', + arguments: { + 'registrationData': registrationData, + 'childIndex': index, + }, + ); + }, + tooltip: 'Modifier', + ), + ], + ), + const SizedBox(height: 18), + Expanded( + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + // IMAGE SANS CADRE BLANC, PREND LA HAUTEUR + Expanded( + flex: 1, + child: Center( + child: ClipRRect( + borderRadius: BorderRadius.circular(18), + child: AspectRatio( + aspectRatio: 1, + child: (child.imageFile != null) + ? (kIsWeb + ? Image.network(child.imageFile!.path, fit: BoxFit.cover) + : Image.file(child.imageFile!, fit: BoxFit.cover)) + : Image.asset('assets/images/photo.png', fit: BoxFit.contain), + ), + ), + ), + ), + const SizedBox(width: 32), + // INFOS À DROITE (2/3) + Expanded( + flex: 2, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + _buildDisplayFieldValue(context, 'Prénom :', child.firstName, labelFontSize: 22.0), + const SizedBox(height: 12), + _buildDisplayFieldValue(context, 'Nom :', child.lastName, labelFontSize: 22.0), + const SizedBox(height: 12), + _buildDisplayFieldValue(context, child.isUnbornChild ? 'Date de naissance :' : 'Date de naissance :', child.dob, labelFontSize: 22.0), + ], + ), + ), + ], + ), + ), + const SizedBox(height: 18), + // Ligne des consentements + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Row( + children: [ + Checkbox( + value: child.photoConsent, + onChanged: null, + ), + Text('Consentement photo', style: GoogleFonts.merienda(fontSize: 16)), + ], + ), + const SizedBox(width: 32), + Row( + children: [ + Checkbox( + value: child.multipleBirth, + onChanged: null, + ), + Text('Naissance multiple', style: GoogleFonts.merienda(fontSize: 16)), + ], + ), + ], + ), + ], + ), + ), + ), + ], ), ); }).toList();