fix(am): ordre Tab formulaire pro et chevrons accessibles

- Ordre de focus explicite (NumericFocusOrder) pour l’inscription AM étape 2 : chaîne des champs jusqu’aux chevrons, Pays → NIR, places → Suivant (10) puis Précédent (11).

- FocusTraversalGroup avec OrderedTraversalPolicy sur le Scaffold pour respecter cet ordre (desktop / web).

- Champ pays : TextInputAction.next, onFieldSubmitted et onEditingComplete vers le NIR ; CustomAppTextField expose onEditingComplete.

- NirTextField : focusNode et focusTraversalOrder optionnels.

Made-with: Cursor
This commit is contained in:
2026-04-13 14:09:21 +02:00
parent d550e57cb8
commit a9ce4a6756
3 changed files with 160 additions and 72 deletions
+15 -1
View File
@@ -8,6 +8,9 @@ import 'custom_app_text_field.dart';
/// 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;
@@ -23,6 +26,8 @@ class NirTextField extends StatelessWidget {
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,
@@ -38,8 +43,9 @@ class NirTextField extends StatelessWidget {
@override
Widget build(BuildContext context) {
return CustomAppTextField(
final field = CustomAppTextField(
controller: controller,
focusNode: focusNode,
labelText: labelText,
hintText: hintText,
fieldWidth: fieldWidth,
@@ -54,5 +60,13 @@ class NirTextField extends StatelessWidget {
style: style,
labelFieldSpacing: labelFieldSpacing,
);
final o = focusTraversalOrder;
if (o != null) {
return FocusTraversalOrder(
order: NumericFocusOrder(o),
child: field,
);
}
return field;
}
}