membre add

This commit is contained in:
d6soft
2025-06-11 09:27:25 +02:00
parent f3f1a9c5e8
commit 4244b961fd
40 changed files with 144003 additions and 143144 deletions

View File

@@ -5,11 +5,13 @@ import 'package:hive_flutter/hive_flutter.dart';
import 'package:geosector_app/core/data/models/amicale_model.dart';
import 'package:geosector_app/core/data/models/membre_model.dart';
import 'package:geosector_app/core/data/models/user_model.dart';
import 'package:geosector_app/presentation/widgets/user_form_dialog.dart';
import 'package:geosector_app/core/repositories/user_repository.dart';
import 'package:geosector_app/core/repositories/amicale_repository.dart';
import 'package:geosector_app/core/repositories/membre_repository.dart';
import 'package:geosector_app/presentation/widgets/amicale_table_widget.dart';
import 'package:geosector_app/presentation/widgets/membre_table_widget.dart';
import 'package:geosector_app/core/utils/api_exception.dart';
/// Class pour dessiner les petits points blancs sur le fond
class DotsPainter extends CustomPainter {
@@ -93,30 +95,86 @@ class _AdminAmicalePageState extends State<AdminAmicalePage> {
}
void _handleEditMembre(MembreModel membre) {
showDialog(
context: context,
builder: (context) => UserFormDialog(
title: 'Modifier le membre',
user: membre.toUserModel(),
showRoleSelector: true,
showActiveCheckbox: true, // Activer la checkbox
allowUsernameEdit: true, // Permettre l'édition du username
// allowSectNameEdit sera automatiquement true via UserForm
availableRoles: const [
RoleOption(
value: 1,
label: 'Membre',
description: 'Peut consulter et distribuer dans ses secteurs',
),
RoleOption(
value: 2,
label: 'Administrateur',
description: 'Peut gérer l\'amicale et ses membres',
),
],
onSubmit: (updatedUser) async {
try {
// Convertir le UserModel mis à jour vers MembreModel
final updatedMembre = MembreModel.fromUserModel(updatedUser, membre);
// Utiliser directement updateMembre qui passe par l'API /users
final success = await widget.membreRepository.updateMembre(updatedMembre);
if (success && mounted) {
Navigator.of(context).pop();
ApiException.showSuccess(context, 'Membre ${updatedMembre.firstName} ${updatedMembre.name} mis à jour');
} else if (!success && mounted) {
ApiException.showError(context, Exception('Erreur lors de la mise à jour'));
}
} catch (e) {
debugPrint('❌ Erreur mise à jour membre: $e');
if (mounted) {
ApiException.showError(context, e);
}
}
},
),
);
}
void _handleDeleteMembre(MembreModel membre) {
showDialog(
context: context,
builder: (context) => AlertDialog(
title: const Text('Modifier le membre'),
content: Text('Voulez-vous modifier le membre ${membre.firstName} ${membre.name} ?'),
title: const Text('Confirmer la suppression'),
content: Text('Voulez-vous vraiment supprimer le membre ${membre.firstName} ${membre.name} ?\n\nCette action est irréversible.'),
actions: [
TextButton(
onPressed: () => Navigator.of(context).pop(),
child: const Text('Annuler'),
),
ElevatedButton(
onPressed: () {
onPressed: () async {
Navigator.of(context).pop();
// TODO: Naviguer vers la page de modification
// Navigator.of(context).push(
// MaterialPageRoute(
// builder: (context) => EditMembrePage(
// membre: membre,
// membreRepository: widget.membreRepository,
// ),
// ),
// );
try {
// Utiliser la méthode qui passe par l'API
final success = await widget.membreRepository.deleteMembre(membre.id);
if (success && mounted) {
ApiException.showSuccess(context, 'Membre ${membre.firstName} ${membre.name} supprimé avec succès');
} else if (!success && mounted) {
ApiException.showError(context, Exception('Erreur lors de la suppression'));
}
} catch (e) {
if (mounted) {
ApiException.showError(context, e);
}
}
},
child: const Text('Modifier'),
style: ElevatedButton.styleFrom(
backgroundColor: Colors.red,
foregroundColor: Colors.white,
),
child: const Text('Supprimer'),
),
],
),
@@ -126,15 +184,82 @@ class _AdminAmicalePageState extends State<AdminAmicalePage> {
void _handleAddMembre() {
if (_currentUser?.fkEntite == null) return;
// TODO: Naviguer vers la page d'ajout de membre
// Navigator.of(context).push(
// MaterialPageRoute(
// builder: (context) => AddMembrePage(
// amicaleId: _currentUser!.fkEntite!,
// membreRepository: widget.membreRepository,
// ),
// ),
// );
// Créer un UserModel vide avec les valeurs par défaut
final newUser = UserModel(
id: 0, // ID temporaire pour nouveau membre
username: '',
firstName: '',
name: '',
sectName: '',
phone: '',
mobile: '',
email: '',
fkTitre: 1, // Par défaut M.
fkEntite: _currentUser!.fkEntite!, // Association à l'amicale courante
role: 1, // Par défaut membre
isActive: true, // Par défaut actif
createdAt: DateTime.now(),
lastSyncedAt: DateTime.now(),
);
showDialog(
context: context,
builder: (context) => UserFormDialog(
title: 'Ajouter un nouveau membre',
user: newUser,
showRoleSelector: true,
showActiveCheckbox: true,
allowUsernameEdit: true,
availableRoles: const [
RoleOption(
value: 1,
label: 'Membre',
description: 'Peut consulter et distribuer dans ses secteurs',
),
RoleOption(
value: 2,
label: 'Administrateur',
description: 'Peut gérer l\'amicale et ses membres',
),
],
onSubmit: (newUserData) async {
try {
// Créer un nouveau MembreModel directement
final newMembre = MembreModel(
id: 0, // L'API assignera un vrai ID
username: newUserData.username,
firstName: newUserData.firstName,
name: newUserData.name,
sectName: newUserData.sectName,
phone: newUserData.phone,
mobile: newUserData.mobile,
email: newUserData.email,
fkTitre: newUserData.fkTitre,
fkEntite: newUserData.fkEntite!,
role: newUserData.role,
isActive: newUserData.isActive,
dateNaissance: newUserData.dateNaissance,
dateEmbauche: newUserData.dateEmbauche,
createdAt: DateTime.now(),
);
final createdMembre = await widget.membreRepository.createMembre(newMembre);
if (createdMembre != null && mounted) {
Navigator.of(context).pop();
ApiException.showSuccess(context, 'Membre ${createdMembre.firstName} ${createdMembre.name} ajouté avec succès');
} else if (mounted) {
ApiException.showError(context, Exception('Erreur lors de la création du membre'));
}
} catch (e) {
debugPrint('❌ Erreur création membre: $e');
if (mounted) {
ApiException.showError(context, e);
}
}
},
),
);
}
@override
@@ -328,7 +453,7 @@ class _AdminAmicalePageState extends State<AdminAmicalePage> {
child: MembreTableWidget(
membres: membres,
onEdit: _handleEditMembre,
onDelete: null, // Géré par l'admin principal
onDelete: _handleDeleteMembre,
membreRepository: widget.membreRepository,
),
),