feat: Livraison version 3.0.6

- Amélioration de la gestion des entités et des utilisateurs
- Mise à jour des modèles Amicale et Client avec champs supplémentaires
- Ajout du service de logging et amélioration du chargement UI
- Refactoring des formulaires utilisateur et amicale
- Intégration de file_picker et image_picker pour la gestion des fichiers
- Amélioration de la gestion des membres et de leur suppression
- Optimisation des performances de l'API
- Mise à jour de la documentation technique

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2025-08-08 20:33:54 +02:00
parent 599b9fcda0
commit 206c76c7db
69 changed files with 203569 additions and 174972 deletions

View File

@@ -8,6 +8,7 @@ class MembreRowWidget extends StatelessWidget {
final Function(MembreModel)? onResetPassword;
final bool isAlternate;
final VoidCallback? onTap;
final bool isMobile;
const MembreRowWidget({
super.key,
@@ -17,6 +18,7 @@ class MembreRowWidget extends StatelessWidget {
this.onResetPassword,
this.isAlternate = false,
this.onTap,
this.isMobile = false,
});
@override
@@ -37,20 +39,29 @@ class MembreRowWidget extends StatelessWidget {
),
child: Row(
children: [
// ... existing row content ...
// ID
Expanded(
flex: 1,
child: Text(
membre.id.toString() ?? '',
style: theme.textTheme.bodyMedium,
// 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: 2,
flex: isMobile ? 2 : 2,
child: Text(
membre.firstName ?? '',
style: theme.textTheme.bodyMedium,
@@ -59,47 +70,44 @@ class MembreRowWidget extends StatelessWidget {
// Nom
Expanded(
flex: 2,
flex: isMobile ? 2 : 2,
child: Text(
membre.name ?? '',
style: theme.textTheme.bodyMedium,
),
),
// Email
Expanded(
flex: 3,
child: Text(
membre.email ?? '',
style: theme.textTheme.bodyMedium,
// Email - masqué en mobile
if (!isMobile)
Expanded(
flex: 3,
child: Text(
membre.email ?? '',
style: theme.textTheme.bodyMedium,
),
),
),
// Rôle
Expanded(
flex: 1,
child: Text(
_getRoleName(membre.role),
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: Container(
padding: const EdgeInsets.symmetric(horizontal: 8.0, vertical: 4.0),
decoration: BoxDecoration(
color: _getStatusColor(membre.isActive),
borderRadius: BorderRadius.circular(12.0),
),
child: Text(
membre.isActive == true ? 'Actif' : 'Inactif',
style: theme.textTheme.bodySmall?.copyWith(
color: Colors.white,
fontWeight: FontWeight.w500,
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,
),
textAlign: TextAlign.center,
),
),
),
@@ -107,21 +115,21 @@ class MembreRowWidget extends StatelessWidget {
// Actions
if (onEdit != null || onDelete != null || onResetPassword != null)
Expanded(
flex: 2,
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: const Icon(Icons.lock_reset, size: 22),
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: const Icon(Icons.delete, size: 22),
icon: Icon(Icons.delete, size: isMobile ? 20 : 22),
onPressed: () => onDelete!(membre),
tooltip: 'Supprimer',
color: theme.colorScheme.error,