import 'package:flutter/material.dart'; import 'package:geosector_app/core/data/models/amicale_model.dart'; import 'package:geosector_app/core/repositories/amicale_repository.dart'; import 'package:geosector_app/presentation/widgets/amicale_table_widget.dart'; import 'package:provider/provider.dart'; /// Exemple d'utilisation du widget AmicaleTableWidget /// /// Ce widget montre comment intégrer le tableau d'amicales dans une page /// et comment gérer les actions d'édition et de suppression. class AmicaleTableExample extends StatefulWidget { const AmicaleTableExample({Key? key}) : super(key: key); @override State createState() => _AmicaleTableExampleState(); } class _AmicaleTableExampleState extends State { bool _isLoading = true; List _amicales = []; String? _errorMessage; @override void initState() { super.initState(); _loadAmicales(); } Future _loadAmicales() async { setState(() { _isLoading = true; _errorMessage = null; }); try { // Récupérer les amicales depuis le repository final amicaleRepository = Provider.of(context, listen: false); final amicales = amicaleRepository.getAllAmicales(); setState(() { _amicales = amicales; _isLoading = false; }); } catch (e) { setState(() { _errorMessage = 'Erreur lors du chargement des amicales: $e'; _isLoading = false; }); } } void _handleEdit(AmicaleModel amicale) { // Afficher une boîte de dialogue de confirmation showDialog( context: context, builder: (context) => AlertDialog( title: const Text('Modifier l\'amicale'), content: Text('Voulez-vous modifier l\'amicale ${amicale.name} ?'), actions: [ TextButton( onPressed: () => Navigator.of(context).pop(), child: const Text('Annuler'), ), ElevatedButton( onPressed: () { Navigator.of(context).pop(); // Naviguer vers la page de modification // Navigator.of(context).push( // MaterialPageRoute( // builder: (context) => EditAmicalePage(amicale: amicale), // ), // ); }, child: const Text('Modifier'), ), ], ), ); } void _handleDelete(AmicaleModel amicale) { // Afficher une boîte de dialogue de confirmation showDialog( context: context, builder: (context) => AlertDialog( title: const Text('Supprimer l\'amicale'), content: Text( 'Êtes-vous sûr de vouloir supprimer l\'amicale ${amicale.name} ?'), actions: [ TextButton( onPressed: () => Navigator.of(context).pop(), child: const Text('Annuler'), ), ElevatedButton( style: ElevatedButton.styleFrom( backgroundColor: Colors.red, foregroundColor: Colors.white, ), onPressed: () { Navigator.of(context).pop(); _deleteAmicale(amicale); }, child: const Text('Supprimer'), ), ], ), ); } Future _deleteAmicale(AmicaleModel amicale) async { try { setState(() { _isLoading = true; }); // Supprimer l'amicale via le repository final amicaleRepository = Provider.of(context, listen: false); await amicaleRepository.deleteAmicale(amicale.id); // Recharger la liste await _loadAmicales(); // Afficher un message de succès if (mounted) { ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: Text('Amicale ${amicale.name} supprimée avec succès'), backgroundColor: Colors.green, ), ); } } catch (e) { setState(() { _isLoading = false; _errorMessage = 'Erreur lors de la suppression: $e'; }); // Afficher un message d'erreur if (mounted) { ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: Text('Erreur: $_errorMessage'), backgroundColor: Colors.red, ), ); } } } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: const Text('Liste des amicales'), actions: [ IconButton( icon: const Icon(Icons.refresh), onPressed: _loadAmicales, tooltip: 'Actualiser', ), ], ), body: Padding( padding: const EdgeInsets.all(16.0), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ // Titre et description Text( 'Gestion des amicales', style: Theme.of(context).textTheme.headlineSmall, ), const SizedBox(height: 8), Text( 'Consultez, modifiez ou supprimez les amicales selon vos droits d\'accès.', style: Theme.of(context).textTheme.bodyMedium, ), const SizedBox(height: 24), // Message d'erreur si présent if (_errorMessage != null) Container( padding: const EdgeInsets.all(12), margin: const EdgeInsets.only(bottom: 16), decoration: BoxDecoration( color: Colors.red.withOpacity(0.1), borderRadius: BorderRadius.circular(8), border: Border.all(color: Colors.red.withOpacity(0.3)), ), child: Row( children: [ const Icon(Icons.error_outline, color: Colors.red), const SizedBox(width: 12), Expanded( child: Text( _errorMessage!, style: const TextStyle(color: Colors.red), ), ), ], ), ), // Tableau des amicales Expanded( child: AmicaleTableWidget( amicales: _amicales, isLoading: _isLoading, onDelete: _handleDelete, emptyMessage: 'Aucune amicale trouvée. Veuillez en créer une nouvelle.', readOnly: false, // Permettre la modification dans la modale ), ), ], ), ), floatingActionButton: FloatingActionButton( onPressed: () { // Naviguer vers la page de création // Navigator.of(context).push( // MaterialPageRoute( // builder: (context) => CreateAmicalePage(), // ), // ); }, tooltip: 'Ajouter une amicale', child: const Icon(Icons.add), ), ); } }