From 7b69f27ca5770196953114556d4601b4f01fe056 Mon Sep 17 00:00:00 2001 From: Julien Martin Date: Sat, 11 Jul 2026 23:18:40 +0200 Subject: [PATCH] feat(#142): ouvrir la modale au clic sur les cartes du dashboard admin. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Unifie le comportement des listes Parents, AM, Enfants, Gestionnaires, Admins et À valider avec le bouton d'action au survol. Co-authored-by: Cursor --- frontend/lib/widgets/admin/admin_management_widget.dart | 1 + .../admin/assistante_maternelle_management_widget.dart | 1 + .../lib/widgets/admin/common/admin_enfant_user_card.dart | 7 +++++++ frontend/lib/widgets/admin/common/admin_user_card.dart | 7 ++++++- frontend/lib/widgets/admin/enfant_management_widget.dart | 1 + .../lib/widgets/admin/gestionnaire_management_widget.dart | 1 + frontend/lib/widgets/admin/parent_managmant_widget.dart | 1 + frontend/lib/widgets/admin/pending_validation_widget.dart | 3 ++- 8 files changed, 20 insertions(+), 2 deletions(-) diff --git a/frontend/lib/widgets/admin/admin_management_widget.dart b/frontend/lib/widgets/admin/admin_management_widget.dart index 01f74d9..d0a2bed 100644 --- a/frontend/lib/widgets/admin/admin_management_widget.dart +++ b/frontend/lib/widgets/admin/admin_management_widget.dart @@ -122,6 +122,7 @@ class _AdminManagementWidgetState extends State { fallbackIcon: isSuperAdmin ? Icons.verified_user_outlined : Icons.manage_accounts_outlined, + onCardTap: () => _openAdminEditDialog(user), subtitleLines: [ user.email, 'Téléphone : ${user.telephone?.trim().isNotEmpty == true ? formatPhoneForDisplay(user.telephone!) : 'Non renseigné'}', diff --git a/frontend/lib/widgets/admin/assistante_maternelle_management_widget.dart b/frontend/lib/widgets/admin/assistante_maternelle_management_widget.dart index 5ee5ed1..dc28b11 100644 --- a/frontend/lib/widgets/admin/assistante_maternelle_management_widget.dart +++ b/frontend/lib/widgets/admin/assistante_maternelle_management_widget.dart @@ -83,6 +83,7 @@ class _AssistanteMaternelleManagementWidgetState avatarUrl: assistante.user.photoUrl, fallbackIcon: Icons.face, vigilanceTooltip: vigilance, + onCardTap: () => _openAssistanteDetails(assistante), subtitleLines: [ assistante.user.email, 'Zone : ${assistante.residenceCity ?? 'N/A'} | Capacité : ${assistante.maxChildren ?? 0}', diff --git a/frontend/lib/widgets/admin/common/admin_enfant_user_card.dart b/frontend/lib/widgets/admin/common/admin_enfant_user_card.dart index a6349b8..69dfa65 100644 --- a/frontend/lib/widgets/admin/common/admin_enfant_user_card.dart +++ b/frontend/lib/widgets/admin/common/admin_enfant_user_card.dart @@ -33,6 +33,7 @@ class AdminEnfantUserCard extends StatelessWidget { final String? photoUrl; final List subtitleLines; final List actions; + final VoidCallback? onCardTap; const AdminEnfantUserCard({ super.key, @@ -40,12 +41,14 @@ class AdminEnfantUserCard extends StatelessWidget { this.photoUrl, required this.subtitleLines, this.actions = const [], + this.onCardTap, }); factory AdminEnfantUserCard.fromEnfant( EnfantAdminModel enfant, { List extraSubtitleLines = const [], List actions = const [], + VoidCallback? onCardTap, }) { final parents = enfant.parentLinks .map((l) => l.parentName ?? 'Parent') @@ -64,6 +67,7 @@ class AdminEnfantUserCard extends StatelessWidget { ], ), actions: actions, + onCardTap: onCardTap, ); } @@ -71,6 +75,7 @@ class AdminEnfantUserCard extends StatelessWidget { ParentChildSummary child, { List extraSubtitleLines = const [], List actions = const [], + VoidCallback? onCardTap, }) { return AdminEnfantUserCard( title: child.fullName, @@ -82,6 +87,7 @@ class AdminEnfantUserCard extends StatelessWidget { extra: extraSubtitleLines, ), actions: actions, + onCardTap: onCardTap, ); } @@ -93,6 +99,7 @@ class AdminEnfantUserCard extends StatelessWidget { avatarUrl: photoUrl, subtitleLines: subtitleLines, actions: actions, + onCardTap: onCardTap, ); } } diff --git a/frontend/lib/widgets/admin/common/admin_user_card.dart b/frontend/lib/widgets/admin/common/admin_user_card.dart index 7caafe1..354ae68 100644 --- a/frontend/lib/widgets/admin/common/admin_user_card.dart +++ b/frontend/lib/widgets/admin/common/admin_user_card.dart @@ -13,6 +13,7 @@ class AdminUserCard extends StatefulWidget { final Color? titleColor; final Color? infoColor; final String? vigilanceTooltip; + final VoidCallback? onCardTap; const AdminUserCard({ super.key, @@ -26,6 +27,7 @@ class AdminUserCard extends StatefulWidget { this.titleColor, this.infoColor, this.vigilanceTooltip, + this.onCardTap, }); @override @@ -46,11 +48,14 @@ class _AdminUserCardState extends State { return MouseRegion( onEnter: (_) => setState(() => _isHovered = true), onExit: (_) => setState(() => _isHovered = false), + cursor: widget.onCardTap != null + ? SystemMouseCursors.click + : MouseCursor.defer, child: Material( color: Colors.transparent, borderRadius: BorderRadius.circular(10), child: InkWell( - onTap: () {}, + onTap: widget.onCardTap, borderRadius: BorderRadius.circular(10), hoverColor: const Color(0x149CC5C0), child: Card( diff --git a/frontend/lib/widgets/admin/enfant_management_widget.dart b/frontend/lib/widgets/admin/enfant_management_widget.dart index bc90aaf..9aaf59b 100644 --- a/frontend/lib/widgets/admin/enfant_management_widget.dart +++ b/frontend/lib/widgets/admin/enfant_management_widget.dart @@ -84,6 +84,7 @@ class _EnfantManagementWidgetState extends State { final enfant = filtered[index]; return AdminEnfantUserCard.fromEnfant( enfant, + onCardTap: () => _openEnfant(enfant), actions: [ IconButton( icon: const Icon(Icons.visibility_outlined), diff --git a/frontend/lib/widgets/admin/gestionnaire_management_widget.dart b/frontend/lib/widgets/admin/gestionnaire_management_widget.dart index 2692831..1ce89d6 100644 --- a/frontend/lib/widgets/admin/gestionnaire_management_widget.dart +++ b/frontend/lib/widgets/admin/gestionnaire_management_widget.dart @@ -88,6 +88,7 @@ class _GestionnaireManagementWidgetState title: user.fullName, fallbackIcon: Icons.assignment_ind_outlined, avatarUrl: user.photoUrl, + onCardTap: () => _openGestionnaireEditDialog(user), subtitleLines: [ user.email, 'Statut : ${user.statut ?? 'Inconnu'}', diff --git a/frontend/lib/widgets/admin/parent_managmant_widget.dart b/frontend/lib/widgets/admin/parent_managmant_widget.dart index becbd6c..dcc2a66 100644 --- a/frontend/lib/widgets/admin/parent_managmant_widget.dart +++ b/frontend/lib/widgets/admin/parent_managmant_widget.dart @@ -77,6 +77,7 @@ class _ParentManagementWidgetState extends State { title: parent.user.fullName, fallbackIcon: Icons.supervisor_account_outlined, avatarUrl: parent.user.photoUrl, + onCardTap: () => _openParentDetails(parent), subtitleLines: [ parent.user.email, 'Statut : ${_displayStatus(parent.user.statut)} | Enfants : ${parent.children.isNotEmpty ? parent.children.length : parent.childrenCount}', diff --git a/frontend/lib/widgets/admin/pending_validation_widget.dart b/frontend/lib/widgets/admin/pending_validation_widget.dart index e1e68a9..361a54c 100644 --- a/frontend/lib/widgets/admin/pending_validation_widget.dart +++ b/frontend/lib/widgets/admin/pending_validation_widget.dart @@ -321,11 +321,12 @@ class _PendingValidationRowState extends State<_PendingValidationRow> { return MouseRegion( onEnter: (_) => setState(() => _isHovered = true), onExit: (_) => setState(() => _isHovered = false), + cursor: SystemMouseCursors.click, child: Material( color: Colors.transparent, borderRadius: BorderRadius.circular(10), child: InkWell( - onTap: () {}, + onTap: widget.onOpen, borderRadius: BorderRadius.circular(10), hoverColor: const Color(0x149CC5C0), child: Card(