Skip to content
Snippets Groups Projects
Commit fec4efc2 authored by DAI Leslie's avatar DAI Leslie
Browse files

addclub liste des utilisateur pour président et coprez

parent 8c649657
No related branches found
No related tags found
No related merge requests found
import 'package:atlub/Mods/Theme_colors/colors.dart';
import 'package:atlub/Mods/forms_assets/send_button.dart';
import 'package:atlub/Mods/forms_assets/text_field.dart';
import 'package:flutter/material.dart';
import 'package:atlub/Services/database.dart';
import 'package:atlub/userprovider.dart';
import 'package:provider/provider.dart';
class AddClub extends StatefulWidget {
final String BDX; // BDX sélectionné
final String BDX;
const AddClub({super.key, required this.BDX});
@override
......@@ -16,39 +15,34 @@ class AddClub extends StatefulWidget {
class _AddClubState extends State<AddClub> {
final _formKey = GlobalKey<FormState>();
// Récupération des données
final clubController = TextEditingController();
final prezController = TextEditingController();
String selectedBDXType = ''; // Par défaut, vide
final coprezController = TextEditingController();
final descripController = TextEditingController();
String selectedBDXType = '';
String? selectedPrez;
String? selectedCoPrez;
// Initialisation de selectedBDXType avec la valeur de BDX passé en argument
@override
void initState() {
super.initState();
selectedBDXType = widget.BDX;
}
// Obligation de compléter les champs club et président
@override
void dispose() {
super.dispose();
clubController.dispose();
prezController.dispose();
descripController.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
final userinBDX = Provider.of<UserProvider>(context).userinBDX ?? {"BDA":false, "BDS":false, "BDD":false, "BDE":false};
final userinBDX = Provider.of<UserProvider>(context).userinBDX ?? {"BDA": false, "BDS": false, "BDD": false, "BDE": false};
return Scaffold(
appBar: AppBar(
backgroundColor: Colors.transparent,
iconTheme: IconThemeData(color: AppColor.deepBlue),
),
// Espace pour entrer le nom du club
body: SingleChildScrollView(
child: Form(
key: _formKey,
......@@ -58,19 +52,62 @@ class _AddClubState extends State<AddClub> {
children: [
const Text('Ajouter un club', style: TextStyle(color: AppColor.violetBlue, fontSize: 30, fontWeight: FontWeight.bold),),
const SizedBox(height: 30),
MyTextField(label: 'Club', hint: 'Entrez le nom du club', controller: clubController, isRequired : true),
MyTextField(label: 'Club', hint: 'Entrez le nom du club', controller: clubController, isRequired: true),
const SizedBox(height: 20),
// Espace pour entrer le nom (obligatoire) du président
MyTextField(label: 'Président', hint: 'Entrez le nom du président', controller: prezController, isRequired : true),
const SizedBox(height: 20),
// Espace pour entrer le nom du co-président (facultatif)
MyTextField(label: 'Co-président', hint: 'Entrez le nom du co-président', controller: coprezController),
FutureBuilder<Map<String, Map<String, dynamic>>>(
future: DatabaseService().getProfiles(),
builder: (context, snapshot) {
if (!snapshot.hasData) {
return CircularProgressIndicator();
}
Map<String, Map<String, dynamic>> profiles = snapshot.data!;
List<DropdownMenuItem<String>> profileItems = profiles.entries.map((entry) {
String profileId = entry.key;
Map<String, dynamic> profileData = entry.value;
String displayName = '${profileData['nom']} ${profileData['prenom']}';
return DropdownMenuItem<String>(
value: profileId,
child: Text(displayName),
);
}).toList();
return Column(
children: [
DropdownButtonFormField<String>(
items: profileItems,
onChanged: (value) {
setState(() {
selectedPrez = value;
});
},
decoration: InputDecoration(
labelText: "Président",
border: OutlineInputBorder(),
),
validator: (value) => value == null ? 'Président requis' : null,
),
const SizedBox(height: 20),
DropdownButtonFormField<String>(
items: profileItems,
onChanged: (value) {
setState(() {
selectedCoPrez = value;
});
},
decoration: InputDecoration(
labelText: "Co-président",
border: OutlineInputBorder(),
),
),
],
);
}
),
const SizedBox(height: 20),
MyTextField(label: 'Description', hint: 'Entrez la description du club', controller: descripController),
const SizedBox(height: 20),
// Espace pour sélectionner le BDX associé au club
Container(
margin: const EdgeInsets.only(bottom: 10),
child: DropdownButtonFormField(
......@@ -87,116 +124,55 @@ class _AddClubState extends State<AddClub> {
},
),
),
// Bouton "envoyer" pour envoyer les données à la base de données, très long onTap
SendButton(onTap: () {
if (_formKey.currentState!.validate()) {
final club = clubController.text;
final prez = prezController.text;
final coprez = coprezController.text;
final prez = selectedPrez;
final coprez = selectedCoPrez;
final descrip = descripController.text;
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text("Envoyé")));
FocusScope.of(context).requestFocus(FocusNode());
_formKey.currentState!.reset();
// Ajout à la base de données
DatabaseService db = DatabaseService();
/// VERIFICATION DES DONNEES
// Vérification du nom du club (qu'il n'existe pas déjà)
bool clubOk = true;
/// A FAIRE AVEC UNE FONCTION QUI RENVOIE LA LISTE DES CLUBS
/*
Future<Map<String, Map<String, dynamic>>> listClub = db.getClubs();
Future.wait([listClub]).then((List<dynamic?> results){
results.forEach((dynamic? result) {
print("result['nom'] : ${result["nom"]}");
if (result["nom"] == club){
clubOk = false;
}
});
});
*/
// Vérification du prez
bool prezOk = false;
Future<List<Map<String, dynamic>>> profil = db.searchProfiles(prez);
// Vérifier si le profil est vide
profil.then((List<Map<String, dynamic>> profiles) {
if (profiles.isEmpty) {
// Aucun profil trouvé
} else {
// Des profils ont été trouvés
prezOk = true;
}
}).catchError((error) {
// Gérer les erreurs éventuelles lors de la recherche de profil
print("Erreur lors de la recherche de profil: $error");
}).whenComplete(() {
// Cette logique sera exécutée une fois que la future sera résolue ou rejetée
// Vous pouvez effectuer d'autres opérations ici si nécessaire
// Vérification du coprez si le champ n'est pas nul
bool coprezOk = true;
if(coprez != ''){
Future<List<Map<String, dynamic>>> profil = db.searchProfiles(coprez);
// Vérifier si le profil est vide
profil.then((List<Map<String, dynamic>> profiles) {
if (profiles.isEmpty) {
// Aucun profil trouvé
coprezOk = false;
}
});
}
bool clubOk = true;
// Si tout est OK, on ajoute et tout
if(prezOk==true && coprezOk == true && clubOk == true){
// Ajouter le club et récupérer son ID
Future<dynamic> idclub = db.addclub(selectedBDXType, club, descrip);
// Récupérer l'ID du profil
Future<String?> idprez = db.getProfilIdFromName(prez);
Future<String?> idcoprez = db.getProfilIdFromName(coprez);
// Récupérer l'ID du club
// Attendre que les trois futures soient résolues
Future.wait([idprez, idcoprez, idclub]).then((List<dynamic?> results) {
String? idprez = results[0] as String?; // ID du profil
print(idprez);
String? idcoprez = results[1] as String?;
String idclub = results[2] as String; // ID du club
// Vérifier si les IDs de président ne sont pas nuls avant de les utiliser
if (idprez != null) {
// Ajouter le président "current"
db.addPresident(idprez, idclub, "current");
} else {
print("L'ID du président est null.");
}
if (idcoprez != null) {
// Ensuite, ajouter le président "co"
db.addPresident(idcoprez, idclub, "co");
} else {
print("L'ID du co-président est null.");
}
}).catchError((error) {
// Gérer les erreurs potentielles lors de la récupération de l'ID du profil ou du club
print("Une erreur s'est produite : $error");
});
}
});
bool prezOk = prez != null;
bool coprezOk = coprez != null ? true : false;
if (prezOk && coprezOk && clubOk) {
Future<dynamic> idclub = db.addclub(selectedBDXType, club, descrip);
Future<String?> idprez = db.getProfilIdFromName(prez!);
Future<String?> idcoprez = db.getProfilIdFromName(coprez ?? '');
Future.wait([idprez, idcoprez, idclub]).then((List<dynamic?> results) {
String? idprez = results[0] as String?;
String? idcoprez = results[1] as String?;
String idclub = results[2] as String;
if (idprez != null) {
db.addPresident(idprez, idclub, "current");
} else {
print("L'ID du président est null.");
}
if (idcoprez != null && coprez!.isNotEmpty) {
db.addPresident(idcoprez, idclub, "co");
} else {
print("L'ID du co-président est null.");
}
}).catchError((error) {
print("Une erreur s'est produite : $error");
});
}
Navigator.pop(context);
}
},),
}),
],
),
),
......@@ -205,3 +181,49 @@ class _AddClubState extends State<AddClub> {
);
}
}
class MyTextField extends StatelessWidget {
final String label;
final String hint;
final TextEditingController controller;
final bool isRequired;
const MyTextField({
required this.label,
required this.hint,
required this.controller,
this.isRequired = false,
});
@override
Widget build(BuildContext context) {
return TextFormField(
controller: controller,
decoration: InputDecoration(
labelText: label,
hintText: hint,
border: OutlineInputBorder(),
),
validator: (value) {
if (isRequired && (value == null || value.isEmpty)) {
return 'Champ requis';
}
return null;
},
);
}
}
class SendButton extends StatelessWidget {
final VoidCallback onTap;
const SendButton({required this.onTap});
@override
Widget build(BuildContext context) {
return ElevatedButton(
onPressed: onTap,
child: Text("Envoyer"),
);
}
}
......@@ -130,16 +130,15 @@ void downloadFile(String fileUrl, String fileName, BuildContext context) async {
}
Widget displayFile(String? postid) {
DatabaseService db = DatabaseService();
return FutureBuilder(
return FutureBuilder<String?>(
future: db.getfichierUrlFromFirestore(postid),
builder: (context, AsyncSnapshot<String?> snapshot) {
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return CircularProgressIndicator();
return Center(child: CircularProgressIndicator()); // Indicateur de chargement
} else if (snapshot.hasError) {
return Text('Error: ${snapshot.error}');
return Center(child: Text('Error: ${snapshot.error}')); // Afficher une erreur
} else if (!snapshot.hasData || snapshot.data == null || snapshot.data!.isEmpty) {
// Retourne un Container vide si aucune donnée n'est trouvée ou si l'URL est vide
return Container();
return Container(); // Afficher un Container vide si aucune donnée n'est trouvée
} else {
String fileUrl = snapshot.data!;
String fileName = Path.basename(Uri.parse(fileUrl).path);
......@@ -178,6 +177,7 @@ Widget displayFile(String? postid) {
Widget displayFileMessage(String messageid) {
DatabaseService db = DatabaseService();
return FutureBuilder(
......
......@@ -169,6 +169,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "2.1.0"
dropdown_search:
dependency: "direct main"
description:
name: dropdown_search
sha256: "4d1106c0a392a2cd9273e13a14055a3faa945f14e9e28bb2832a3a8a70e2e55d"
url: "https://pub.dev"
source: hosted
version: "4.0.1"
equatable:
dependency: transitive
description:
......
......@@ -31,6 +31,7 @@ dependencies:
flutter:
sdk: flutter
salomon_bottom_bar: ^3.3.2
dropdown_search: ^4.0.0
#file_picker: ^4.0.0
#file_picker: ^8.0.0+1
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment