Files
petitspas/frontend/lib/widgets/nir_text_field.dart
jmartinandCursor e3552667bc fix(#156): valider téléphone au blur et NIR en live.
Formatage NIR progressif + contrôles au fil de la saisie ; téléphone
validé à la perte de focus comme e-mail / CP.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-23 16:28:35 +02:00

73 lines
2.2 KiB
Dart
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import 'package:flutter/material.dart';
import '../utils/nir_utils.dart';
import 'custom_app_text_field.dart';
/// Champ de saisie dédié au NIR (Numéro d'Inscription au Répertoire 15 caractères).
/// Format affiché : 1 12 34 56 789 012 - 34 ou 1 12 34 2A 789 012 - 34 pour la Corse.
/// La valeur envoyée au [controller] est formatée ; utiliser [normalizeNir](controller.text) à la soumission.
class NirTextField extends StatelessWidget {
final TextEditingController controller;
final FocusNode? focusNode;
/// Si non null, impose lordre Tab parmi les descendants (ex. après « Pays de naissance »).
final double? focusTraversalOrder;
final String labelText;
final String hintText;
final String? Function(String?)? validator;
final double fieldWidth;
final double fieldHeight;
final double labelFontSize;
final double inputFontSize;
final bool enabled;
final bool readOnly;
final CustomAppTextFieldStyle style;
final double labelFieldSpacing;
const NirTextField({
super.key,
required this.controller,
this.focusNode,
this.focusTraversalOrder,
this.labelText = 'N° Sécurité Sociale (NIR)',
this.hintText = '13 chiffres + clé',
this.validator,
this.fieldWidth = double.infinity,
this.fieldHeight = 53.0,
this.labelFontSize = 18.0,
this.inputFontSize = 18.0,
this.enabled = true,
this.readOnly = false,
this.style = CustomAppTextFieldStyle.beige,
this.labelFieldSpacing = 6.0,
});
@override
Widget build(BuildContext context) {
final field = CustomAppTextField(
controller: controller,
focusNode: focusNode,
labelText: labelText,
hintText: hintText,
fieldWidth: fieldWidth,
fieldHeight: fieldHeight,
labelFontSize: labelFontSize,
inputFontSize: inputFontSize,
keyboardType: TextInputType.text,
validator: validator ?? validateNir,
inputFormatters: const [NirInputFormatter()],
enabled: enabled,
readOnly: readOnly,
style: style,
labelFieldSpacing: labelFieldSpacing,
);
final o = focusTraversalOrder;
if (o != null) {
return FocusTraversalOrder(
order: NumericFocusOrder(o),
child: field,
);
}
return field;
}
}