import 'package:flutter/material.dart'; import 'package:geosector_app/app.dart'; import 'package:geosector_app/core/data/models/amicale_model.dart'; import 'package:geosector_app/core/repositories/region_repository.dart'; import 'package:geosector_app/core/repositories/user_repository.dart'; import 'package:geosector_app/presentation/widgets/amicale_row_widget.dart'; import 'package:geosector_app/presentation/widgets/amicale_form.dart'; import 'package:provider/provider.dart'; /// Widget de tableau pour afficher une liste d'amicales /// /// Ce widget affiche un tableau avec les colonnes : /// - ID /// - Nom /// - Code Postal /// - Région /// - Actions (boutons selon les droits de l'utilisateur) /// /// Lorsqu'on clique sur une ligne, une modale s'affiche avec le formulaire EntiteForm class AmicaleTableWidget extends StatelessWidget { final List amicales; final Function(AmicaleModel)? onDelete; final bool isLoading; final String? emptyMessage; final bool readOnly; const AmicaleTableWidget({ Key? key, required this.amicales, this.onDelete, this.isLoading = false, this.emptyMessage, this.readOnly = false, }) : super(key: key); @override Widget build(BuildContext context) { final theme = Theme.of(context); return Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ // En-tête du tableau - utiliser AmicaleRowWidget pour l'en-tête AmicaleRowWidget( amicale: AmicaleModel( id: 0, name: '', codePostal: '', ville: '', libRegion: '', ), isHeader: true, onTap: null, onDelete: null, ), // Corps du tableau Container( decoration: BoxDecoration( color: theme.colorScheme.surface, borderRadius: const BorderRadius.only( bottomLeft: Radius.circular(8), bottomRight: Radius.circular(8), ), border: Border.all( color: theme.colorScheme.primary.withOpacity(0.1), width: 1, ), ), child: _buildTableContent(context), ), ], ); } Widget _buildTableContent(BuildContext context) { // Afficher un indicateur de chargement si isLoading est true if (isLoading) { return const Padding( padding: EdgeInsets.symmetric(vertical: 32.0), child: Center(child: CircularProgressIndicator()), ); } // Afficher un message si la liste est vide if (amicales.isEmpty) { return Padding( padding: const EdgeInsets.symmetric(vertical: 32.0), child: Center( child: Text( emptyMessage ?? 'Aucune amicale trouvée', style: Theme.of(context).textTheme.bodyLarge?.copyWith( color: Theme.of(context).colorScheme.onSurface.withOpacity(0.6), ), ), ), ); } // Afficher la liste des amicales return ListView.builder( shrinkWrap: true, physics: const NeverScrollableScrollPhysics(), itemCount: amicales.length, itemBuilder: (context, index) { final amicale = amicales[index]; return AmicaleRowWidget( amicale: amicale, isAlternate: index % 2 == 1, // Alterner les couleurs onTap: (selectedAmicale) => _showAmicaleDetails(context, selectedAmicale), onDelete: onDelete, ); }, ); } // Afficher une modale avec le formulaire EntiteForm void _showAmicaleDetails(BuildContext context, AmicaleModel amicale) { // Utiliser l'instance globale de userRepository définie dans app.dart final userRepo = userRepository; // Créer une instance de RegionRepository final regionRepo = RegionRepository(); showDialog( context: context, builder: (dialogContext) => MultiProvider( providers: [ // Fournir les repositories nécessaires au formulaire Provider.value(value: userRepo), Provider.value(value: regionRepo), ], child: Dialog( shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(16), ), child: Container( width: MediaQuery.of(dialogContext).size.width * 0.6, padding: const EdgeInsets.all(24), child: SingleChildScrollView( child: Column( mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( 'Détails de l\'amicale', style: Theme.of(dialogContext) .textTheme .headlineSmall ?.copyWith( fontWeight: FontWeight.bold, color: Theme.of(dialogContext).colorScheme.primary, ), ), IconButton( icon: const Icon(Icons.close), onPressed: () => Navigator.of(dialogContext).pop(), ), ], ), const SizedBox(height: 16), // Formulaire EntiteForm en mode lecture seule AmicaleForm( amicale: amicale, readOnly: readOnly, onSubmit: (updatedAmicale) { Navigator.of(dialogContext).pop(); // Ici, vous pourriez ajouter une logique pour mettre à jour l'amicale }, ), ], ), ), ), ), ), ); } }