Déplace les composants Admin* du dashboard partagé vers widgets/dashboard/ (ChildDetailModal, AmEditModal, UserCard, Select*, …). Conserve AdminManagementWidget et screens/administrateurs. Rename mécanique, aucun changement de comportement. Co-authored-by: Cursor <cursoragent@cursor.com>
84 lines
2.7 KiB
Dart
84 lines
2.7 KiB
Dart
import 'package:flutter/material.dart';
|
||
import 'package:p_tits_pas/widgets/dashboard/user_card.dart';
|
||
import 'package:p_tits_pas/widgets/admin/common/suppression_confirm_dialog.dart';
|
||
|
||
/// Carte dossier unifiée (#153) — fond neutre, accent couleur sur l’icône.
|
||
class DossierListCard extends StatelessWidget {
|
||
final String numeroDossier;
|
||
final String namesLine;
|
||
final bool isFamille;
|
||
final VoidCallback onOpen;
|
||
/// Photo AM (si absente → icône fallback).
|
||
final String? photoUrl;
|
||
final VoidCallback? onDelete;
|
||
/// Warning vigilance (ex. dossier sans enfant #160).
|
||
final String? vigilanceTooltip;
|
||
/// Nombre d’enfants (famille) — affiché à côté des noms.
|
||
final int? enfantsCount;
|
||
final bool sansEnfant;
|
||
|
||
/// Lavande — Famille / Parents.
|
||
static const Color familleAccent = Color(0xFFB289C9);
|
||
|
||
/// Menthe logo — AM.
|
||
static const Color amAccent = Color(0xFF5A9D94);
|
||
|
||
const DossierListCard({
|
||
super.key,
|
||
required this.numeroDossier,
|
||
required this.namesLine,
|
||
required this.isFamille,
|
||
required this.onOpen,
|
||
this.photoUrl,
|
||
this.onDelete,
|
||
this.vigilanceTooltip,
|
||
this.enfantsCount,
|
||
this.sansEnfant = false,
|
||
});
|
||
|
||
@override
|
||
Widget build(BuildContext context) {
|
||
final accent = isFamille ? familleAccent : amAccent;
|
||
final num = numeroDossier.trim().isEmpty ? '–' : numeroDossier.trim();
|
||
final names = namesLine.trim();
|
||
final avatar = (photoUrl ?? '').trim();
|
||
final emptyKids = isFamille && (sansEnfant || enfantsCount == 0);
|
||
final count = enfantsCount;
|
||
final countLabel = (!isFamille || count == null)
|
||
? null
|
||
: (count <= 1 ? '$count enfant' : '$count enfants');
|
||
|
||
final subtitle = <String>[
|
||
if (names.isNotEmpty) names,
|
||
if (emptyKids) 'Sans enfant',
|
||
if (!emptyKids && countLabel != null) countLabel,
|
||
];
|
||
|
||
return UserCard(
|
||
title: num,
|
||
subtitleLines: subtitle,
|
||
avatarUrl: !isFamille && avatar.isNotEmpty ? avatar : null,
|
||
fallbackIcon:
|
||
isFamille ? Icons.family_restroom_outlined : Icons.face,
|
||
// N° = titre neutre (comme Parents / AM) ; accent = icône seule.
|
||
avatarIconColor: accent,
|
||
infoColor: emptyKids ? Colors.red.shade700 : Colors.black87,
|
||
onCardTap: onOpen,
|
||
vigilanceTooltip: emptyKids
|
||
? (vigilanceTooltip ??
|
||
'Aucun enfant rattaché à ce dossier famille')
|
||
: vigilanceTooltip,
|
||
borderColor: emptyKids ? Colors.red.shade300 : null,
|
||
actions: [
|
||
IconButton(
|
||
tooltip: 'Ouvrir',
|
||
icon: Icon(Icons.open_in_new, size: 20, color: accent),
|
||
onPressed: onOpen,
|
||
),
|
||
if (onDelete != null)
|
||
suppressionIconButton(onPressed: onDelete),
|
||
],
|
||
);
|
||
}
|
||
}
|