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 1018b86537
commit 0e98a94374
63 changed files with 104136 additions and 87983 deletions

View File

@@ -97,6 +97,9 @@ class _AdminAmicalePageState extends State<AdminAmicalePage> {
}
void _handleEditMembre(MembreModel membre) {
// Récupérer l'amicale actuelle
final amicale = widget.amicaleRepository.getUserAmicale(_currentUser!.fkEntite!);
showDialog(
context: context,
builder: (context) => UserFormDialog(
@@ -104,8 +107,9 @@ class _AdminAmicalePageState extends State<AdminAmicalePage> {
user: membre.toUserModel(),
showRoleSelector: true,
showActiveCheckbox: true, // Activer la checkbox
allowUsernameEdit: true, // Permettre l'édition du username
// allowSectNameEdit sera automatiquement true via UserForm
allowUsernameEdit: amicale?.chkUsernameManuel == true, // Conditionnel selon amicale
amicale: amicale, // Passer l'amicale
isAdmin: true, // Car on est dans la page admin
availableRoles: const [
RoleOption(
value: 1,
@@ -118,23 +122,22 @@ class _AdminAmicalePageState extends State<AdminAmicalePage> {
description: 'Peut gérer l\'amicale et ses membres',
),
],
onSubmit: (updatedUser) async {
onSubmit: (updatedUser, {String? password}) 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);
final success = await widget.membreRepository.updateMembre(
updatedMembre,
password: password,
);
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');
@@ -557,9 +560,6 @@ class _AdminAmicalePageState extends State<AdminAmicalePage> {
if (success && mounted) {
ApiException.showSuccess(context,
'Membre ${membre.firstName} ${membre.name} désactivé avec succès');
} else if (mounted) {
ApiException.showError(
context, Exception('Erreur lors de la désactivation'));
}
} catch (e) {
if (mounted) {
@@ -571,6 +571,9 @@ class _AdminAmicalePageState extends State<AdminAmicalePage> {
void _handleAddMembre() {
if (_currentUser?.fkEntite == null) return;
// Récupérer l'amicale actuelle
final amicale = widget.amicaleRepository.getUserAmicale(_currentUser!.fkEntite!);
// Créer un UserModel vide avec les valeurs par défaut
final newUser = UserModel(
id: 0, // ID temporaire pour nouveau membre
@@ -596,7 +599,9 @@ class _AdminAmicalePageState extends State<AdminAmicalePage> {
user: newUser,
showRoleSelector: true,
showActiveCheckbox: true,
allowUsernameEdit: true,
allowUsernameEdit: amicale?.chkUsernameManuel == true, // Conditionnel selon amicale
amicale: amicale, // Passer l'amicale
isAdmin: true, // Car on est dans la page admin
availableRoles: const [
RoleOption(
value: 1,
@@ -609,7 +614,7 @@ class _AdminAmicalePageState extends State<AdminAmicalePage> {
description: 'Peut gérer l\'amicale et ses membres',
),
],
onSubmit: (newUserData) async {
onSubmit: (newUserData, {String? password}) async {
try {
// Créer un nouveau MembreModel directement
final newMembre = MembreModel(
@@ -631,8 +636,10 @@ class _AdminAmicalePageState extends State<AdminAmicalePage> {
);
// Créer le membre via l'API (retourne maintenant le membre créé)
final createdMembre =
await widget.membreRepository.createMembre(newMembre);
final createdMembre = await widget.membreRepository.createMembre(
newMembre,
password: password,
);
if (createdMembre != null && mounted) {
// Fermer le dialog