feat(admin): validation AM/famille, À valider au survol, nettoyage logs

- À valider : ligne avec survol type AdminUserCard, icône Ouvrir centrée et plus grande (iconSize 34).
- Wizard AM : titres Identité et coordonnées / Dossier professionnel / Présentation ; photo à gauche, grille droite [2,2,2,2] (NIR, naissance, agrément, capacité) ; AppUser champs naissance ; dates dd/MM/yyyy via formatIsoDateFr ; ValidationDetailSection titre optionnel.
- Wizard famille : titre étape 4 « Présentation ».
- Suppression des debugPrint liés médias / images / dossier (api_config, auth_network_image, dossier_unifie, user_service, validation_family).

Made-with: Cursor
This commit is contained in:
2026-04-13 17:22:08 +02:00
parent f442c85cb6
commit 0befd4eb2a
10 changed files with 212 additions and 199 deletions
-9
View File
@@ -1,4 +1,3 @@
import 'package:flutter/foundation.dart';
import 'package:p_tits_pas/models/user.dart';
/// Réponse unifiée GET /dossiers/:numeroDossier. Ticket #119, #107.
@@ -213,14 +212,6 @@ class EnfantDossier {
factory EnfantDossier.fromJson(Map<String, dynamic> json) {
final rawPhoto = json['photo_url'] ?? json['photoUrl'];
final resolvedPhoto = _optionalPhotoUrl(rawPhoto);
if (kDebugMode) {
debugPrint(
'[PetitsPas/dossier] EnfantDossier.fromJson id=${json['id']} '
'prénom=${json['first_name'] ?? json['prenom']} | '
'photo_url brute=$rawPhoto (${rawPhoto?.runtimeType}) → '
'résolu=${resolvedPhoto ?? ""}',
);
}
return EnfantDossier(
id: json['id']?.toString() ?? '',
firstName: (json['first_name'] ?? json['prenom'])?.toString(),
+24
View File
@@ -16,6 +16,9 @@ class AppUser {
final String? relaisId;
final String? relaisNom;
final String? numeroDossier;
final String? dateNaissance;
final String? lieuNaissanceVille;
final String? lieuNaissancePays;
AppUser({
required this.id,
@@ -35,6 +38,9 @@ class AppUser {
this.relaisId,
this.relaisNom,
this.numeroDossier,
this.dateNaissance,
this.lieuNaissanceVille,
this.lieuNaissancePays,
});
static String _str(dynamic v) {
@@ -78,9 +84,24 @@ class AppUser {
?.toString(),
relaisNom: relaisMap['nom']?.toString(),
numeroDossier: json['numero_dossier'] is String ? json['numero_dossier'] as String : null,
dateNaissance: _optionalDateString(json['date_naissance']),
lieuNaissanceVille: json['lieu_naissance_ville'] is String
? json['lieu_naissance_ville'] as String
: null,
lieuNaissancePays: json['lieu_naissance_pays'] is String
? json['lieu_naissance_pays'] as String
: null,
);
}
static String? _optionalDateString(dynamic v) {
if (v == null) return null;
if (v is String) return v.isEmpty ? null : v;
if (v is DateTime) return v.toIso8601String().split('T').first;
final s = v.toString();
return s.isEmpty ? null : s;
}
Map<String, dynamic> toJson() {
return {
'id': id,
@@ -100,6 +121,9 @@ class AppUser {
'relais_id': relaisId,
'relais_nom': relaisNom,
'numero_dossier': numeroDossier,
'date_naissance': dateNaissance,
'lieu_naissance_ville': lieuNaissanceVille,
'lieu_naissance_pays': lieuNaissancePays,
};
}