Recherche dynamique, filtre Sans garde côté AM, confirmation de transfert et détachement préalable pour laisser le point de vigilance places sur l'AM d'origine. Co-authored-by: Cursor <cursoragent@cursor.com>
69 lines
2.5 KiB
Dart
69 lines
2.5 KiB
Dart
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<EnfantAdminModel?> show(
|
|
BuildContext context, {
|
|
Set<String> 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<EnfantAdminModel>(
|
|
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<EnfantAdminModel>(
|
|
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: 6),
|
|
actions: [
|
|
IconButton(
|
|
icon: const Icon(Icons.add_link),
|
|
tooltip: 'Rattacher',
|
|
onPressed: onSelect,
|
|
),
|
|
],
|
|
);
|
|
},
|
|
);
|
|
}
|
|
}
|