- Added routes for registration steps 2, 3, and 4 in app_router.dart. - Created AmRegisterStep2Screen for entering professional details including birth date, city, country, social security number, agreement number, and max children. - Implemented validation for social security number and max children fields. - Developed AmRegisterStep3Screen for entering a motivation message and accepting terms and conditions. - Created AmRegisterStep4Screen to display a summary of the registration data for review before submission. - Introduced SummaryCard widget for displaying user information in a structured format. - Enhanced DataGenerator utility to provide realistic data for testing.
270 lines
11 KiB
Dart
270 lines
11 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'package:google_fonts/google_fonts.dart';
|
|
import 'package:p_tits_pas/models/am_user_registration_data.dart';
|
|
import 'package:p_tits_pas/models/card_assets.dart';
|
|
import 'package:p_tits_pas/widgets/Summary.dart';
|
|
import 'package:p_tits_pas/widgets/custom_decorated_text_field.dart';
|
|
import 'package:p_tits_pas/widgets/image_button.dart';
|
|
|
|
Widget _buildDisplayFieldValue(BuildContext context, String label, String value, {bool multiLine = false, double fieldHeight = 50.0, double labelFontSize = 18.0}) {
|
|
const FontWeight labelFontWeight = FontWeight.w600;
|
|
|
|
// Ne pas afficher le label si labelFontSize est 0 ou si label est vide
|
|
bool showLabel = label.isNotEmpty && labelFontSize > 0;
|
|
|
|
return Column(
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
children: [
|
|
if (showLabel)
|
|
Text(label, style: GoogleFonts.merienda(fontSize: labelFontSize, fontWeight: labelFontWeight)),
|
|
if (showLabel)
|
|
const SizedBox(height: 4),
|
|
// Utiliser Expanded si multiLine et pas de hauteur fixe, sinon Container
|
|
multiLine && fieldHeight == null
|
|
? Expanded(
|
|
child: Container(
|
|
width: double.infinity,
|
|
padding: const EdgeInsets.symmetric(horizontal: 18.0, vertical: 12.0),
|
|
decoration: BoxDecoration(
|
|
image: const DecorationImage(
|
|
image: AssetImage('assets/images/input_field_bg.png'),
|
|
fit: BoxFit.fill,
|
|
),
|
|
),
|
|
child: SingleChildScrollView( // Pour le défilement si le texte dépasse
|
|
child: Text(
|
|
value.isNotEmpty ? value : '-',
|
|
style: GoogleFonts.merienda(fontSize: labelFontSize > 0 ? labelFontSize : 18.0), // Garder une taille de texte par défaut si label caché
|
|
maxLines: null, // Permettre un nombre illimité de lignes
|
|
),
|
|
),
|
|
),
|
|
)
|
|
: Container(
|
|
width: double.infinity,
|
|
height: multiLine ? null : fieldHeight,
|
|
constraints: multiLine ? BoxConstraints(minHeight: fieldHeight) : null,
|
|
padding: const EdgeInsets.symmetric(horizontal: 18.0, vertical: 12.0),
|
|
decoration: BoxDecoration(
|
|
image: const DecorationImage(
|
|
image: AssetImage('assets/images/input_field_bg.png'),
|
|
fit: BoxFit.fill,
|
|
),
|
|
),
|
|
child: Text(
|
|
value.isNotEmpty ? value : '-',
|
|
style: GoogleFonts.merienda(fontSize: labelFontSize > 0 ? labelFontSize : 18.0),
|
|
maxLines: multiLine ? null : 1,
|
|
overflow: multiLine ? TextOverflow.visible : TextOverflow.ellipsis,
|
|
),
|
|
),
|
|
],
|
|
);
|
|
}
|
|
|
|
class AmRegisterStep4Screen extends StatelessWidget {
|
|
final ChildminderRegistrationData registrationData;
|
|
|
|
const AmRegisterStep4Screen({super.key, required this.registrationData});
|
|
|
|
Widget _buildAm1Card(BuildContext context, ChildminderRegistrationData data) {
|
|
const double verticalSpacing = 28.0; // Espacement vertical augmenté
|
|
const double labelFontSize = 22.0; // Taille de label augmentée
|
|
|
|
List<Widget> details = [
|
|
Row(
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
children: [
|
|
Expanded(child: _buildDisplayFieldValue(context, "Nom:", data.identity.lastName, labelFontSize: labelFontSize)),
|
|
const SizedBox(width: 20),
|
|
Expanded(child: _buildDisplayFieldValue(context, "Prénom:", data.identity.firstName, labelFontSize: labelFontSize)),
|
|
],
|
|
),
|
|
const SizedBox(height: verticalSpacing),
|
|
Row(
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
children: [
|
|
Expanded(child: _buildDisplayFieldValue(context, "Téléphone:", data.identity.phone, labelFontSize: labelFontSize)),
|
|
const SizedBox(width: 20),
|
|
Expanded(child: _buildDisplayFieldValue(context, "Email:", data.identity.email, multiLine: true, labelFontSize: labelFontSize)),
|
|
],
|
|
),
|
|
const SizedBox(height: verticalSpacing),
|
|
Row(
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
children: [
|
|
Expanded(child: _buildDisplayFieldValue(context, "Adresse:", "${data.identity.address}\n${data.identity.postalCode} ${data.identity.city}".trim(), labelFontSize: labelFontSize)),
|
|
const SizedBox(width: 20),
|
|
],
|
|
),
|
|
];
|
|
return SummaryCard(
|
|
backgroundImagePath: CardColorHorizontal.peach.path,
|
|
title: 'Parent Principal',
|
|
content: details,
|
|
onEdit: () => Navigator.of(context).pushNamed('/am-register/step1', arguments: registrationData),
|
|
);
|
|
}
|
|
|
|
Widget _buildAm2Card(BuildContext context, ChildminderRegistrationData data) {
|
|
const double verticalSpacing = 28.0;
|
|
const double labelFontSize = 22.0;
|
|
|
|
List<Widget> myDetails = [
|
|
Row(
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
children: [
|
|
Expanded(child: _buildDisplayFieldValue(context, "Date de naissance:", data.professional.dateOfBirth, labelFontSize: labelFontSize)),
|
|
const SizedBox(width: 20),
|
|
Expanded(child: _buildDisplayFieldValue(context, "Ville de naissance:", data.professional.birthCity, labelFontSize: labelFontSize)),
|
|
],
|
|
),
|
|
const SizedBox(height: verticalSpacing),
|
|
Row(
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
children: [
|
|
Expanded(child: _buildDisplayFieldValue(context, "Pays de naissance:", data.professional.birthCountry, labelFontSize: labelFontSize)),
|
|
const SizedBox(width: 20),
|
|
Expanded(child: _buildDisplayFieldValue(context, "Numéro de sécurité sociale:", data.professional.socialSecurityNumber, labelFontSize: labelFontSize)),
|
|
],
|
|
),
|
|
const SizedBox(height: verticalSpacing),
|
|
Row(
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
children: [
|
|
Expanded(child: _buildDisplayFieldValue(context, "Numéro d'agrément:", data.professional.agreementNumber, labelFontSize: labelFontSize)),
|
|
const SizedBox(width: 20),
|
|
Expanded(child: _buildDisplayFieldValue(context, "Nombre d'enfants maximum:", data.professional.maxChildren.toString(), labelFontSize: labelFontSize)),
|
|
],
|
|
),
|
|
];
|
|
return SummaryCard(
|
|
backgroundImagePath: CardColorHorizontal.lavender.path,
|
|
title: 'Informations professionnelles',
|
|
content: myDetails,
|
|
onEdit: () => Navigator.of(context)
|
|
.pushNamed('/am-register/step2', arguments: registrationData),
|
|
);
|
|
}
|
|
|
|
Widget _buildMotivationCard(BuildContext context, ChildminderRegistrationData data) {
|
|
return SummaryCard(
|
|
backgroundImagePath: CardColorHorizontal.green.path,
|
|
title: 'Motivation',
|
|
content: [
|
|
Expanded(child: CustomDecoratedTextField(
|
|
controller: TextEditingController(text: data.presentationMessage),
|
|
hintText: 'Parlez-nous de votre motivation',
|
|
fieldHeight: 200,
|
|
maxLines: 10,
|
|
expandDynamically: true,
|
|
readOnly: true,
|
|
fontSize: 18.0,)),
|
|
],
|
|
onEdit: () => Navigator.of(context)
|
|
.pushNamed('/am-register/step3', arguments: registrationData),
|
|
);
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
final screenSize = MediaQuery.of(context).size;
|
|
return Scaffold(
|
|
body: Stack(
|
|
children: [
|
|
Positioned.fill(
|
|
child: Image.asset('assets/images/paper2.png', fit: BoxFit.cover, repeat: ImageRepeat.repeatY),
|
|
),
|
|
Center(
|
|
child: SingleChildScrollView(
|
|
padding: const EdgeInsets.all(40.0),
|
|
child: Padding(
|
|
padding: EdgeInsets.symmetric(horizontal: screenSize.width / 4.0),
|
|
child: Column(
|
|
mainAxisAlignment: MainAxisAlignment.center,
|
|
crossAxisAlignment: CrossAxisAlignment.center,
|
|
children: [
|
|
Text('Etape 4/4',
|
|
style: GoogleFonts.merienda(
|
|
fontSize: 16, color: Colors.black54)),
|
|
const SizedBox(height: 20),
|
|
Text('Récapitulatif de votre demande',
|
|
style: GoogleFonts.merienda(
|
|
fontSize: 22,
|
|
fontWeight: FontWeight.bold,
|
|
color: Colors.black87),
|
|
textAlign: TextAlign.center),
|
|
const SizedBox(height: 30),
|
|
_buildAm1Card(context, registrationData),
|
|
const SizedBox(height: 20),
|
|
if (registrationData.professional != null) ...[
|
|
_buildAm2Card(context, registrationData),
|
|
const SizedBox(height: 20),
|
|
],
|
|
_buildMotivationCard(context, registrationData),
|
|
const SizedBox(height: 40),
|
|
ImageButton(
|
|
bg: 'assets/images/btn_green.png',
|
|
text: 'Soumettre ma demande',
|
|
textColor: const Color(0xFF2D6A4F),
|
|
width: 350,
|
|
height: 50,
|
|
fontSize: 18,
|
|
onPressed: () {
|
|
// Vérification des données requises
|
|
_showConfirmationModal(context);
|
|
},
|
|
)
|
|
],
|
|
),
|
|
),
|
|
),
|
|
),
|
|
Positioned(
|
|
top: screenSize.height / 2 - 20,
|
|
left: 40,
|
|
child: IconButton(
|
|
icon: Transform.flip(
|
|
flipX: true,
|
|
child: Image.asset('assets/images/chevron_right.png',
|
|
height: 40)),
|
|
onPressed: () => Navigator.pop(context),
|
|
tooltip: 'Retour',
|
|
),
|
|
),
|
|
],
|
|
),
|
|
);
|
|
}
|
|
|
|
void _showConfirmationModal(BuildContext context) {
|
|
showDialog<void>(
|
|
context: context,
|
|
barrierDismissible: false,
|
|
builder: (BuildContext dialogContext) {
|
|
return AlertDialog(
|
|
title: Text(
|
|
'Demande enregistrée',
|
|
style: GoogleFonts.merienda(fontWeight: FontWeight.bold),
|
|
),
|
|
content: Text(
|
|
'Votre dossier a bien été pris en compte. Un gestionnaire le validera bientôt.',
|
|
style: GoogleFonts.merienda(fontSize: 14),
|
|
),
|
|
actions: <Widget>[
|
|
TextButton(
|
|
child: Text('OK',
|
|
style: GoogleFonts.merienda(fontWeight: FontWeight.bold)),
|
|
onPressed: () {
|
|
Navigator.of(dialogContext).pop();
|
|
Navigator.of(context)
|
|
.pushNamedAndRemoveUntil('/login', (route) => false);
|
|
},
|
|
),
|
|
],
|
|
);
|
|
},
|
|
);
|
|
}
|
|
}
|