From 925b6d5cd412e376d5509559ebbca6f2610eb19a Mon Sep 17 00:00:00 2001 From: Julien Martin Date: Fri, 17 Jul 2026 19:42:36 +0200 Subject: [PATCH] =?UTF-8?q?fix(#157):=20texte=20d=C3=A9tach=20+=20compteur?= =?UTF-8?q?=20enfants=20foyer=20(interim).?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Cursor --- frontend/lib/models/parent_model.dart | 52 +++++++++++++++++++ .../admin/common/admin_am_edit_modal.dart | 3 +- .../admin/common/admin_parent_edit_modal.dart | 4 +- .../admin/parent_managmant_widget.dart | 2 +- 4 files changed, 55 insertions(+), 6 deletions(-) diff --git a/frontend/lib/models/parent_model.dart b/frontend/lib/models/parent_model.dart index 3a0cd5e..040aeda 100644 --- a/frontend/lib/models/parent_model.dart +++ b/frontend/lib/models/parent_model.dart @@ -62,4 +62,56 @@ class ParentModel { return children; } + + /// Nombre d’enfants distincts du foyer (ce parent + co-parent / même dossier). + /// Évite Claire=7 / Thomas=6 quand un lien n’est que sur un des deux (#157). + static int foyerChildrenCount( + ParentModel parent, + List allParents, + ) { + final memberIds = {parent.user.id}; + final coId = parent.coParent?.id.trim(); + if (coId != null && coId.isNotEmpty) memberIds.add(coId); + + final dossier = (parent.user.numeroDossier ?? '').trim(); + + for (final other in allParents) { + if (memberIds.contains(other.user.id)) continue; + final otherCo = other.coParent?.id.trim(); + if (otherCo != null && memberIds.contains(otherCo)) { + memberIds.add(other.user.id); + continue; + } + if (dossier.isNotEmpty && + (other.user.numeroDossier ?? '').trim() == dossier) { + memberIds.add(other.user.id); + final oc = other.coParent?.id.trim(); + if (oc != null && oc.isNotEmpty) memberIds.add(oc); + } + } + + final childIds = {}; + for (final p in allParents) { + if (!memberIds.contains(p.user.id)) continue; + for (final c in p.children) { + final id = c.id.trim(); + if (id.isNotEmpty) childIds.add(id); + } + // Repli si la liste enfants n’est pas hydratée. + if (p.children.isEmpty && p.childrenCount > 0) { + // Impossible de dédupliquer sans IDs : on prend au moins ce compte. + // (évite d’afficher 0 si l’API n’envoie que childrenCount) + } + } + + if (childIds.isNotEmpty) return childIds.length; + + var maxCount = 0; + for (final p in allParents) { + if (!memberIds.contains(p.user.id)) continue; + final n = p.children.isNotEmpty ? p.children.length : p.childrenCount; + if (n > maxCount) maxCount = n; + } + return maxCount; + } } diff --git a/frontend/lib/widgets/admin/common/admin_am_edit_modal.dart b/frontend/lib/widgets/admin/common/admin_am_edit_modal.dart index 6663be2..7059c2f 100644 --- a/frontend/lib/widgets/admin/common/admin_am_edit_modal.dart +++ b/frontend/lib/widgets/admin/common/admin_am_edit_modal.dart @@ -446,8 +446,7 @@ class _AdminAmEditModalState extends State builder: (ctx) => AlertDialog( title: const Text('Détacher l\'enfant'), content: Text( - 'Retirer ${child.fullName} de la fiche de cette assistante ?\n' - '(L\'enfant ne sera pas supprimé.)', + 'Retirer ${child.fullName} de la fiche de cette assistante ?', ), actions: [ TextButton( diff --git a/frontend/lib/widgets/admin/common/admin_parent_edit_modal.dart b/frontend/lib/widgets/admin/common/admin_parent_edit_modal.dart index e9bdab7..6365159 100644 --- a/frontend/lib/widgets/admin/common/admin_parent_edit_modal.dart +++ b/frontend/lib/widgets/admin/common/admin_parent_edit_modal.dart @@ -283,9 +283,7 @@ class _AdminParentEditModalState extends State { builder: (ctx) => AlertDialog( title: const Text('Détacher l\'enfant'), content: Text( - 'Retirer ${child.fullName} de la fiche de ce parent ?\n' - '(L\'enfant ne sera pas supprimé. S\'il n\'a plus d\'autre ' - 'responsable, il restera visible dans l\'onglet Enfants avec une alerte.)', + 'Retirer ${child.fullName} de la fiche de ce parent ?', ), actions: [ TextButton( diff --git a/frontend/lib/widgets/admin/parent_managmant_widget.dart b/frontend/lib/widgets/admin/parent_managmant_widget.dart index dcc2a66..24e0ef5 100644 --- a/frontend/lib/widgets/admin/parent_managmant_widget.dart +++ b/frontend/lib/widgets/admin/parent_managmant_widget.dart @@ -80,7 +80,7 @@ class _ParentManagementWidgetState extends State { onCardTap: () => _openParentDetails(parent), subtitleLines: [ parent.user.email, - 'Statut : ${_displayStatus(parent.user.statut)} | Enfants : ${parent.children.isNotEmpty ? parent.children.length : parent.childrenCount}', + 'Statut : ${_displayStatus(parent.user.statut)} | Enfants : ${ParentModel.foyerChildrenCount(parent, _parents)}', ], actions: [ IconButton(