import 'package:flutter/material.dart'; import 'package:p_tits_pas/models/enfant_admin_model.dart'; import 'package:p_tits_pas/services/user_service.dart'; import 'package:p_tits_pas/utils/enfant_status_utils.dart'; import 'package:p_tits_pas/widgets/admin/common/admin_enfant_user_card.dart'; import 'package:p_tits_pas/widgets/admin/common/admin_select_list_modal.dart'; /// Sélection d'un enfant à rattacher (fiche AM / fiche parent) — ticket #146. /// S'appuie sur [AdminSelectListModal] (shell partagé avec #147). class AdminSelectEnfantModal { AdminSelectEnfantModal._(); static Future show( BuildContext context, { Set excludeIds = const {}, String title = 'Rattacher un enfant', /// Affiché uniquement depuis la fiche AM : filtre les enfants déjà en garde. bool showSansGardeFilter = false, }) { return AdminSelectListModal.show( context, title: title, searchHint: 'Rechercher par nom ou prénom…', emptyMessage: 'Aucun enfant disponible à rattacher', noResultsMessage: showSansGardeFilter ? 'Aucun enfant sans garde pour cette recherche' : 'Aucun résultat pour cette recherche', toggleFilter: showSansGardeFilter ? AdminSelectToggleFilter( label: 'Sans garde', initialValue: true, whenEnabled: (e) => normalizeEnfantStatus(e.status) == 'sans_garde', ) : null, loadItems: () async { final list = await UserService.getEnfants(); return list .where((e) => !excludeIds.contains(e.id)) .toList() ..sort( (a, b) => a.fullName.toLowerCase().compareTo(b.fullName.toLowerCase()), ); }, matchesQuery: (e, q) { final name = e.fullName.toLowerCase(); final fn = (e.firstName ?? '').toLowerCase(); final ln = (e.lastName ?? '').toLowerCase(); return name.contains(q) || fn.contains(q) || ln.contains(q); }, itemBuilder: (context, e, onSelect) { return AdminEnfantUserCard.fromEnfant( e, onCardTap: onSelect, margin: const EdgeInsets.only(bottom: 4), contentPadding: const EdgeInsets.symmetric( horizontal: 10, vertical: 5, ), actions: [ IconButton( icon: const Icon(Icons.add_link), tooltip: 'Rattacher', onPressed: onSelect, ), ], ); }, ); } }