import 'package:flutter/material.dart'; import 'package:geosector_app/core/data/models/membre_model.dart'; class MembreRowWidget extends StatelessWidget { final MembreModel membre; final Function(MembreModel)? onEdit; final Function(MembreModel)? onDelete; final Function(MembreModel)? onResetPassword; final bool isAlternate; final VoidCallback? onTap; final bool isMobile; const MembreRowWidget({ super.key, required this.membre, this.onEdit, this.onDelete, this.onResetPassword, this.isAlternate = false, this.onTap, this.isMobile = false, }); @override Widget build(BuildContext context) { final theme = Theme.of(context); // Couleur de fond alternée final backgroundColor = isAlternate ? theme.colorScheme.primary.withValues(alpha: 0.05) : Colors.transparent; return InkWell( // Envelopper le contenu dans un InkWell onTap: onTap, // Utiliser le callback onTap hoverColor: theme.colorScheme.primary.withValues(alpha: 0.15), child: Container( padding: const EdgeInsets.symmetric(vertical: 8.0, horizontal: 16.0), decoration: BoxDecoration( color: backgroundColor, ), child: Row( children: [ // ID - masqué en mobile if (!isMobile) Expanded( flex: 1, child: Text( membre.id.toString() ?? '', style: theme.textTheme.bodyMedium, ), ), // Identifiant (username) - masqué en mobile if (!isMobile) Expanded( flex: 2, child: Text( membre.username ?? '', style: theme.textTheme.bodyMedium, ), ), // Prénom Expanded( flex: isMobile ? 2 : 2, child: Text( membre.firstName ?? '', style: theme.textTheme.bodyMedium, ), ), // Nom Expanded( flex: isMobile ? 2 : 2, child: Text( membre.name ?? '', style: theme.textTheme.bodyMedium, ), ), // Email - masqué en mobile if (!isMobile) Expanded( flex: 3, child: Text( membre.email ?? '', style: theme.textTheme.bodyMedium, ), ), // Rôle - masqué en mobile if (!isMobile) Expanded( flex: 1, child: Text( _getRoleName(membre.role), style: theme.textTheme.bodyMedium, ), ), // Statut Expanded( flex: 1, child: Center( child: Tooltip( message: membre.isActive == true ? 'Actif' : 'Inactif', child: Icon( membre.isActive == true ? Icons.check_circle : Icons.cancel, color: membre.isActive == true ? Colors.green : Colors.red, size: 24, ), ), ), ), // Actions if (onEdit != null || onDelete != null || onResetPassword != null) Expanded( flex: isMobile ? 2 : 2, child: Row( mainAxisAlignment: MainAxisAlignment.end, children: [ // Bouton reset password (uniquement pour les membres actifs) if (onResetPassword != null && membre.isActive == true) IconButton( icon: Icon(Icons.lock_reset, size: isMobile ? 20 : 22), onPressed: () => onResetPassword!(membre), tooltip: 'Réinitialiser le mot de passe', color: theme.colorScheme.primary, ), if (onDelete != null) IconButton( icon: Icon(Icons.delete, size: isMobile ? 20 : 22), onPressed: () => onDelete!(membre), tooltip: 'Supprimer', color: theme.colorScheme.error, ), ], ), ), ], ), ), ); } // Afficher les détails du membre dans une boîte de dialogue void _showMembreDetails(BuildContext context) { showDialog( context: context, builder: (context) => AlertDialog( title: Text('${membre.firstName ?? ''} ${membre.name ?? ''}'), content: Column( mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, children: [ _buildDetailRow('ID', membre.id.toString()), _buildDetailRow('Email', membre.email), _buildDetailRow('Username', membre.username ?? 'Non défini'), _buildDetailRow('Rôle', _getRoleName(membre.role)), _buildDetailRow('Titre', membre.fkTitre?.toString() ?? 'Non défini'), _buildDetailRow('Secteur', membre.sectName ?? 'Non défini'), _buildDetailRow('Statut', membre.isActive ? 'Actif' : 'Inactif'), _buildDetailRow('Téléphone', membre.phone ?? 'Non défini'), _buildDetailRow('Mobile', membre.mobile ?? 'Non défini'), if (membre.dateNaissance != null) _buildDetailRow('Date de naissance', '${membre.dateNaissance!.day}/${membre.dateNaissance!.month}/${membre.dateNaissance!.year}'), if (membre.dateEmbauche != null) _buildDetailRow('Date d\'embauche', '${membre.dateEmbauche!.day}/${membre.dateEmbauche!.month}/${membre.dateEmbauche!.year}'), ], ), actions: [ TextButton( onPressed: () => Navigator.of(context).pop(), child: const Text('Fermer'), ), ], ), ); } Widget _buildDetailRow(String label, String value) { return Padding( padding: const EdgeInsets.symmetric(vertical: 4.0), child: Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ SizedBox( width: 120, child: Text( '$label:', style: const TextStyle(fontWeight: FontWeight.bold), ), ), Expanded( child: Text(value), ), ], ), ); } Color _getStatusColor(bool? isActive) { return isActive == true ? Colors.green : Colors.red; } // Méthode pour convertir l'ID de rôle en nom lisible String _getRoleName(int roleId) { switch (roleId) { case 1: return 'Membre'; case 2: return 'Admin'; case 9: return 'Super'; default: return roleId.toString(); } } }