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.withOpacity(0.05) : Colors.transparent; return InkWell( // Envelopper le contenu dans un InkWell onTap: onTap, // Utiliser le callback onTap hoverColor: theme.colorScheme.primary.withOpacity(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, ), ], ), ), ], ), ), ); } // 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(); } } }