From 18c1d1eba710f674f641244773e4e1d2acb9f315 Mon Sep 17 00:00:00 2001 From: Julien Martin Date: Fri, 17 Jul 2026 16:12:53 +0200 Subject: [PATCH] =?UTF-8?q?fix(#148):=20d=C3=A9sactiver=20=C2=AB=20Rattach?= =?UTF-8?q?er=20un=20enfant=20=C2=BB=20si=20capacit=C3=A9=20AM=20pleine.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Le lien du footer est grisé avec tooltip quand enfants ≥ capacité max ; il se réactive après détachement. Co-authored-by: Cursor --- .../admin/common/admin_am_edit_modal.dart | 23 +++++++++++++++---- 1 file changed, 18 insertions(+), 5 deletions(-) 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 c612436..706250e 100644 --- a/frontend/lib/widgets/admin/common/admin_am_edit_modal.dart +++ b/frontend/lib/widgets/admin/common/admin_am_edit_modal.dart @@ -238,6 +238,13 @@ class _AdminAmEditModalState extends State int? _capaciteMax() => _parseIntField(_capaciteCtrl); + /// True si plus aucune place d'accueil (enfants ≥ capacité max). + bool get _capacityFull { + final max = _capaciteMax(); + if (max == null) return false; + return _children.length >= max; + } + int? _computedPlacesAvailable() => amExpectedPlacesAvailable( maxChildren: _capaciteMax(), childrenCount: _children.length, @@ -466,7 +473,7 @@ class _AdminAmEditModalState extends State } Future _attachChild() async { - if (!mounted) return; + if (_capacityFull || !mounted) return; final selected = await AdminSelectEnfantModal.show( context, excludeIds: _children.map((c) => c.id).toSet(), @@ -745,6 +752,7 @@ class _AdminAmEditModalState extends State Widget _buildFooter() { final isChildrenTab = _tabCtrl.index == 2; + final canAttachChild = !_saving && !_capacityFull; return Row( children: [ TextButton( @@ -753,10 +761,15 @@ class _AdminAmEditModalState extends State ), const Spacer(), if (isChildrenTab) - TextButton.icon( - onPressed: _attachChild, - icon: const Icon(Icons.link, size: 18), - label: const Text('Rattacher un enfant'), + Tooltip( + message: _capacityFull + ? 'Capacité maximale atteinte' + : 'Rattacher un enfant', + child: TextButton.icon( + onPressed: canAttachChild ? _attachChild : null, + icon: const Icon(Icons.link, size: 18), + label: const Text('Rattacher un enfant'), + ), ), if (isChildrenTab) const SizedBox(width: 12), ElevatedButton(