# Documentation du Widget EntiteForm Cette documentation décrit le widget `EntiteForm` créé pour la création et la modification des entités (amicales) dans l'application GeoSector. ## Description Le widget `EntiteForm` est un formulaire complet permettant de créer ou modifier une entité (amicale). Il gère l'affichage de tous les champs nécessaires, la validation des données et les restrictions d'accès basées sur le rôle de l'utilisateur. ## Propriétés - `amicale` (AmicaleModel?, optionnel) : Le modèle d'amicale à modifier. Si null, le formulaire sera en mode création. - `onSubmit` (Function(AmicaleModel)?, optionnel) : Callback appelé lorsque le formulaire est soumis avec succès. - `readOnly` (bool, défaut: false) : Si true, tous les champs du formulaire seront en lecture seule. ## Champs du formulaire Le formulaire inclut les champs suivants : ### Informations générales - **Nom** : Nom de l'amicale (obligatoire) ### Adresse - **Adresse ligne 1** : Première ligne d'adresse - **Adresse ligne 2** : Seconde ligne d'adresse (optionnelle) - **Code Postal** : Code postal (validation pour 5 chiffres) - **Ville** : Nom de la ville - **Région** : Sélection de la région via un dropdown ### Contact - **Téléphone fixe** : Numéro de téléphone fixe (validation pour 10 chiffres) - **Téléphone mobile** : Numéro de téléphone mobile (validation pour 10 chiffres) - **Email** : Adresse email (obligatoire, avec validation de format) ### Informations avancées (visibles uniquement pour les administrateurs ou si déjà remplies) - **GPS Latitude** : Coordonnée GPS latitude - **GPS Longitude** : Coordonnée GPS longitude - **Stripe ID** : Identifiant Stripe pour les paiements ### Options - **Mode démo** : Indique si l'amicale est en mode démo - **Copie des mails reçus** : Indique si l'amicale reçoit une copie des emails - **Accepte les SMS** : Indique si l'amicale accepte les SMS - **Actif** : Indique si l'amicale est active ## Restrictions d'accès Certains champs sont soumis à des restrictions d'accès basées sur le rôle de l'utilisateur : - Les champs suivants sont en lecture seule pour les utilisateurs avec un rôle ≤ 2 : - fkRegion/libRegion - gpsLat - gpsLng - stripeId - chkDemo - chkActive ## Exemple d'utilisation Un exemple complet d'utilisation est disponible dans le fichier `app/lib/presentation/widgets/examples/entite_form_example.dart`. ### Utilisation simple ```dart // Création d'une nouvelle amicale EntiteForm( onSubmit: (amicale) { // Gérer la soumission print('Nouvelle amicale: ${amicale.name}'); }, ) // Modification d'une amicale existante EntiteForm( amicale: amicaleExistante, onSubmit: (amicale) { // Gérer la soumission print('Amicale modifiée: ${amicale.name}'); }, ) // Affichage en lecture seule EntiteForm( amicale: amicaleExistante, readOnly: true, ) ``` ### Utilisation avec gestion d'état ```dart class _MyWidgetState extends State { AmicaleModel? _amicale; bool _isLoading = true; @override void initState() { super.initState(); _loadAmicale(); } Future _loadAmicale() async { setState(() { _isLoading = true; }); try { if (widget.amicaleId != null) { // Récupérer l'amicale depuis le repository final amicaleRepository = Provider.of(context, listen: false); final amicale = amicaleRepository.getAmicaleById(widget.amicaleId!); setState(() { _amicale = amicale; _isLoading = false; }); } else { // Création d'une nouvelle amicale setState(() { _amicale = null; _isLoading = false; }); } } catch (e) { debugPrint('Erreur lors du chargement de l\'amicale: $e'); setState(() { _isLoading = false; }); } } void _handleSubmit(AmicaleModel amicale) async { try { final amicaleRepository = Provider.of(context, listen: false); // Sauvegarder l'amicale final savedAmicale = await amicaleRepository.saveAmicale(amicale); // Afficher un message de confirmation ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: Text('Amicale ${savedAmicale.name} sauvegardée avec succès'), backgroundColor: Colors.green, ), ); } catch (e) { debugPrint('Erreur lors de la sauvegarde de l\'amicale: $e'); ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: Text('Erreur lors de la sauvegarde: $e'), backgroundColor: Colors.red, ), ); } } @override Widget build(BuildContext context) { return _isLoading ? const Center(child: CircularProgressIndicator()) : EntiteForm( amicale: _amicale, onSubmit: _handleSubmit, ); } } ``` ## Intégration avec le système de rôles Le widget utilise le `UserRepository` pour déterminer le rôle de l'utilisateur actuel et appliquer les restrictions d'accès en conséquence. Assurez-vous que le `UserRepository` est disponible dans l'arbre des widgets via un `Provider`. ```dart // Dans le widget parent return MultiProvider( providers: [ Provider( create: (context) => userRepository, ), Provider( create: (context) => amicaleRepository, ), ], child: MyWidget(), ); ``` ## Personnalisation Le widget utilise le thème de l'application pour le style. Vous pouvez personnaliser l'apparence en modifiant le thème ou en étendant le widget pour créer votre propre version personnalisée. ## Validation des données Le formulaire inclut une validation pour les champs suivants : - **Nom** : Ne peut pas être vide - **Code Postal** : Doit contenir 5 chiffres s'il est rempli - **Téléphone fixe** : Doit contenir 10 chiffres s'il est rempli - **Téléphone mobile** : Doit contenir 10 chiffres s'il est rempli - **Email** : Ne peut pas être vide et doit contenir un '@' et un '.'