|
|
|
@ -21,6 +21,9 @@ class CustomDrawer extends StatelessWidget { |
|
|
|
final prefs = await SharedPreferences.getInstance(); |
|
|
|
await prefs.remove('username'); |
|
|
|
await prefs.remove('role'); |
|
|
|
await prefs.remove('user_id'); |
|
|
|
|
|
|
|
userController.clearUserData(); |
|
|
|
} |
|
|
|
|
|
|
|
CustomDrawer({super.key}); |
|
|
|
@ -29,10 +32,26 @@ class CustomDrawer extends StatelessWidget { |
|
|
|
Widget build(BuildContext context) { |
|
|
|
return Drawer( |
|
|
|
backgroundColor: Colors.white, |
|
|
|
child: ListView( |
|
|
|
child: FutureBuilder( |
|
|
|
future: _buildDrawerItems(), |
|
|
|
builder: (context, snapshot) { |
|
|
|
if (snapshot.connectionState == ConnectionState.done) { |
|
|
|
return ListView( |
|
|
|
padding: EdgeInsets.zero, |
|
|
|
children: [ |
|
|
|
// Header avec informations utilisateur |
|
|
|
children: snapshot.data as List<Widget>, |
|
|
|
); |
|
|
|
} else { |
|
|
|
return const Center(child: CircularProgressIndicator()); |
|
|
|
} |
|
|
|
}, |
|
|
|
), |
|
|
|
); |
|
|
|
} |
|
|
|
|
|
|
|
Future<List<Widget>> _buildDrawerItems() async { |
|
|
|
List<Widget> drawerItems = []; |
|
|
|
|
|
|
|
drawerItems.add( |
|
|
|
GetBuilder<UserController>( |
|
|
|
builder: (controller) => Container( |
|
|
|
padding: const EdgeInsets.only(top: 50, left: 20, bottom: 20), |
|
|
|
@ -54,7 +73,7 @@ class CustomDrawer extends StatelessWidget { |
|
|
|
crossAxisAlignment: CrossAxisAlignment.start, |
|
|
|
children: [ |
|
|
|
Text( |
|
|
|
controller.name, |
|
|
|
controller.name.isNotEmpty ? controller.name : 'Utilisateur', |
|
|
|
style: const TextStyle( |
|
|
|
color: Colors.white, |
|
|
|
fontSize: 18, |
|
|
|
@ -62,14 +81,7 @@ class CustomDrawer extends StatelessWidget { |
|
|
|
), |
|
|
|
), |
|
|
|
Text( |
|
|
|
controller.email, |
|
|
|
style: const TextStyle( |
|
|
|
color: Colors.white70, |
|
|
|
fontSize: 14, |
|
|
|
), |
|
|
|
), |
|
|
|
Text( |
|
|
|
controller.role, |
|
|
|
controller.role.isNotEmpty ? controller.role : 'Aucun rôle', |
|
|
|
style: const TextStyle( |
|
|
|
color: Colors.white70, |
|
|
|
fontSize: 12, |
|
|
|
@ -81,9 +93,10 @@ class CustomDrawer extends StatelessWidget { |
|
|
|
), |
|
|
|
), |
|
|
|
), |
|
|
|
); |
|
|
|
|
|
|
|
// Section Accueil |
|
|
|
_buildDrawerItem( |
|
|
|
drawerItems.add( |
|
|
|
await _buildDrawerItem( |
|
|
|
icon: Icons.home, |
|
|
|
title: "Accueil", |
|
|
|
color: Colors.blue, |
|
|
|
@ -91,20 +104,10 @@ class CustomDrawer extends StatelessWidget { |
|
|
|
permissionRoute: '/accueil', |
|
|
|
onTap: () => Get.to(const AccueilPage()), |
|
|
|
), |
|
|
|
); |
|
|
|
|
|
|
|
// Section Utilisateurs |
|
|
|
const Padding( |
|
|
|
padding: EdgeInsets.only(left: 20, top: 15, bottom: 5), |
|
|
|
child: Text( |
|
|
|
"GESTION UTILISATEURS", |
|
|
|
style: TextStyle( |
|
|
|
color: Colors.grey, |
|
|
|
fontSize: 12, |
|
|
|
fontWeight: FontWeight.bold, |
|
|
|
), |
|
|
|
), |
|
|
|
), |
|
|
|
_buildDrawerItem( |
|
|
|
List<Widget> gestionUtilisateursItems = [ |
|
|
|
await _buildDrawerItem( |
|
|
|
icon: Icons.person_add, |
|
|
|
title: "Ajouter un utilisateur", |
|
|
|
color: Colors.green, |
|
|
|
@ -112,20 +115,22 @@ class CustomDrawer extends StatelessWidget { |
|
|
|
permissionRoute: '/ajouter-utilisateur', |
|
|
|
onTap: () => Get.to(const RegistrationPage()), |
|
|
|
), |
|
|
|
_buildDrawerItem( |
|
|
|
await _buildDrawerItem( |
|
|
|
icon: Icons.supervised_user_circle, |
|
|
|
title: "Gérer les utilisateurs", |
|
|
|
color: Color.fromARGB(255, 4, 54, 95), |
|
|
|
color: const Color.fromARGB(255, 4, 54, 95), |
|
|
|
permissionAction: 'update', |
|
|
|
permissionRoute: '/modifier-utilisateur', |
|
|
|
onTap: () => Get.to(const ListUserPage()), |
|
|
|
), |
|
|
|
]; |
|
|
|
|
|
|
|
// Section Produits |
|
|
|
if (gestionUtilisateursItems.any((item) => item is ListTile)) { |
|
|
|
drawerItems.add( |
|
|
|
const Padding( |
|
|
|
padding: EdgeInsets.only(left: 20, top: 15, bottom: 5), |
|
|
|
child: Text( |
|
|
|
"GESTION PRODUITS", |
|
|
|
"GESTION UTILISATEURS", |
|
|
|
style: TextStyle( |
|
|
|
color: Colors.grey, |
|
|
|
fontSize: 12, |
|
|
|
@ -133,7 +138,12 @@ class CustomDrawer extends StatelessWidget { |
|
|
|
), |
|
|
|
), |
|
|
|
), |
|
|
|
_buildDrawerItem( |
|
|
|
); |
|
|
|
drawerItems.addAll(gestionUtilisateursItems); |
|
|
|
} |
|
|
|
|
|
|
|
List<Widget> gestionProduitsItems = [ |
|
|
|
await _buildDrawerItem( |
|
|
|
icon: Icons.inventory, |
|
|
|
title: "Gestion des produits", |
|
|
|
color: Colors.indigoAccent, |
|
|
|
@ -141,7 +151,7 @@ class CustomDrawer extends StatelessWidget { |
|
|
|
permissionRoute: '/ajouter-produit', |
|
|
|
onTap: () => Get.to(const ProductManagementPage()), |
|
|
|
), |
|
|
|
_buildDrawerItem( |
|
|
|
await _buildDrawerItem( |
|
|
|
icon: Icons.storage, |
|
|
|
title: "Gestion de stock", |
|
|
|
color: Colors.blueAccent, |
|
|
|
@ -149,12 +159,14 @@ class CustomDrawer extends StatelessWidget { |
|
|
|
permissionRoute: '/gestion-stock', |
|
|
|
onTap: () => Get.to(const GestionStockPage()), |
|
|
|
), |
|
|
|
]; |
|
|
|
|
|
|
|
// Section Commandes |
|
|
|
if (gestionProduitsItems.any((item) => item is ListTile)) { |
|
|
|
drawerItems.add( |
|
|
|
const Padding( |
|
|
|
padding: EdgeInsets.only(left: 20, top: 15, bottom: 5), |
|
|
|
child: Text( |
|
|
|
"GESTION COMMANDES", |
|
|
|
"GESTION PRODUITS", |
|
|
|
style: TextStyle( |
|
|
|
color: Colors.grey, |
|
|
|
fontSize: 12, |
|
|
|
@ -162,7 +174,12 @@ class CustomDrawer extends StatelessWidget { |
|
|
|
), |
|
|
|
), |
|
|
|
), |
|
|
|
_buildDrawerItem( |
|
|
|
); |
|
|
|
drawerItems.addAll(gestionProduitsItems); |
|
|
|
} |
|
|
|
|
|
|
|
List<Widget> gestionCommandesItems = [ |
|
|
|
await _buildDrawerItem( |
|
|
|
icon: Icons.add_shopping_cart, |
|
|
|
title: "Nouvelle commande", |
|
|
|
color: Colors.orange, |
|
|
|
@ -170,7 +187,7 @@ class CustomDrawer extends StatelessWidget { |
|
|
|
permissionRoute: '/nouvelle-commande', |
|
|
|
onTap: () => Get.to(const NouvelleCommandePage()), |
|
|
|
), |
|
|
|
_buildDrawerItem( |
|
|
|
await _buildDrawerItem( |
|
|
|
icon: Icons.list_alt, |
|
|
|
title: "Gérer les commandes", |
|
|
|
color: Colors.deepPurple, |
|
|
|
@ -178,12 +195,14 @@ class CustomDrawer extends StatelessWidget { |
|
|
|
permissionRoute: '/gerer-commandes', |
|
|
|
onTap: () => Get.to(const GestionCommandesPage()), |
|
|
|
), |
|
|
|
]; |
|
|
|
|
|
|
|
// Section Rapports |
|
|
|
if (gestionCommandesItems.any((item) => item is ListTile)) { |
|
|
|
drawerItems.add( |
|
|
|
const Padding( |
|
|
|
padding: EdgeInsets.only(left: 20, top: 15, bottom: 5), |
|
|
|
child: Text( |
|
|
|
"RAPPORTS", |
|
|
|
"GESTION COMMANDES", |
|
|
|
style: TextStyle( |
|
|
|
color: Colors.grey, |
|
|
|
fontSize: 12, |
|
|
|
@ -191,7 +210,12 @@ class CustomDrawer extends StatelessWidget { |
|
|
|
), |
|
|
|
), |
|
|
|
), |
|
|
|
_buildDrawerItem( |
|
|
|
); |
|
|
|
drawerItems.addAll(gestionCommandesItems); |
|
|
|
} |
|
|
|
|
|
|
|
List<Widget> rapportsItems = [ |
|
|
|
await _buildDrawerItem( |
|
|
|
icon: Icons.bar_chart, |
|
|
|
title: "Bilan mensuel", |
|
|
|
color: Colors.teal, |
|
|
|
@ -199,7 +223,7 @@ class CustomDrawer extends StatelessWidget { |
|
|
|
permissionRoute: '/bilan', |
|
|
|
onTap: () => Get.to(const BilanMois()), |
|
|
|
), |
|
|
|
_buildDrawerItem( |
|
|
|
await _buildDrawerItem( |
|
|
|
icon: Icons.history, |
|
|
|
title: "Historique", |
|
|
|
color: Colors.blue, |
|
|
|
@ -207,12 +231,14 @@ class CustomDrawer extends StatelessWidget { |
|
|
|
permissionRoute: '/historique', |
|
|
|
onTap: () => Get.to(HistoryPage()), |
|
|
|
), |
|
|
|
]; |
|
|
|
|
|
|
|
// Section Administration |
|
|
|
if (rapportsItems.any((item) => item is ListTile)) { |
|
|
|
drawerItems.add( |
|
|
|
const Padding( |
|
|
|
padding: EdgeInsets.only(left: 20, top: 15, bottom: 5), |
|
|
|
child: Text( |
|
|
|
"ADMINISTRATION", |
|
|
|
"RAPPORTS", |
|
|
|
style: TextStyle( |
|
|
|
color: Colors.grey, |
|
|
|
fontSize: 12, |
|
|
|
@ -220,7 +246,12 @@ class CustomDrawer extends StatelessWidget { |
|
|
|
), |
|
|
|
), |
|
|
|
), |
|
|
|
_buildDrawerItem( |
|
|
|
); |
|
|
|
drawerItems.addAll(rapportsItems); |
|
|
|
} |
|
|
|
|
|
|
|
List<Widget> administrationItems = [ |
|
|
|
await _buildDrawerItem( |
|
|
|
icon: Icons.admin_panel_settings, |
|
|
|
title: "Gérer les rôles", |
|
|
|
color: Colors.redAccent, |
|
|
|
@ -228,13 +259,31 @@ class CustomDrawer extends StatelessWidget { |
|
|
|
permissionRoute: '/gerer-roles', |
|
|
|
onTap: () => Get.to(const RoleListPage()), |
|
|
|
), |
|
|
|
]; |
|
|
|
|
|
|
|
// Déconnexion |
|
|
|
const Divider(), |
|
|
|
_buildDrawerItem( |
|
|
|
icon: Icons.logout, |
|
|
|
title: "Déconnexion", |
|
|
|
color: Colors.red, |
|
|
|
if (administrationItems.any((item) => item is ListTile)) { |
|
|
|
drawerItems.add( |
|
|
|
const Padding( |
|
|
|
padding: EdgeInsets.only(left: 20, top: 15, bottom: 5), |
|
|
|
child: Text( |
|
|
|
"ADMINISTRATION", |
|
|
|
style: TextStyle( |
|
|
|
color: Colors.grey, |
|
|
|
fontSize: 12, |
|
|
|
fontWeight: FontWeight.bold, |
|
|
|
), |
|
|
|
), |
|
|
|
), |
|
|
|
); |
|
|
|
drawerItems.addAll(administrationItems); |
|
|
|
} |
|
|
|
|
|
|
|
drawerItems.add(const Divider()); |
|
|
|
|
|
|
|
drawerItems.add( |
|
|
|
ListTile( |
|
|
|
leading: const Icon(Icons.logout, color: Colors.red), |
|
|
|
title: const Text("Déconnexion"), |
|
|
|
onTap: () { |
|
|
|
Get.defaultDialog( |
|
|
|
title: "Déconnexion", |
|
|
|
@ -249,8 +298,8 @@ class CustomDrawer extends StatelessWidget { |
|
|
|
backgroundColor: Colors.red, |
|
|
|
), |
|
|
|
child: const Text("Oui"), |
|
|
|
onPressed: () { |
|
|
|
clearUserData(); |
|
|
|
onPressed: () async { |
|
|
|
await clearUserData(); |
|
|
|
Get.offAll(const LoginPage()); |
|
|
|
}, |
|
|
|
), |
|
|
|
@ -258,45 +307,33 @@ class CustomDrawer extends StatelessWidget { |
|
|
|
); |
|
|
|
}, |
|
|
|
), |
|
|
|
], |
|
|
|
), |
|
|
|
); |
|
|
|
|
|
|
|
return drawerItems; |
|
|
|
} |
|
|
|
|
|
|
|
Widget _buildDrawerItem({ |
|
|
|
Future<Widget> _buildDrawerItem({ |
|
|
|
required IconData icon, |
|
|
|
required String title, |
|
|
|
required Color color, |
|
|
|
String? permissionAction, |
|
|
|
String? permissionRoute, |
|
|
|
required VoidCallback onTap, |
|
|
|
}) { |
|
|
|
}) async { |
|
|
|
if (permissionAction != null && permissionRoute != null) { |
|
|
|
bool hasPermission = await userController.hasPermission(permissionAction, permissionRoute); |
|
|
|
if (!hasPermission) { |
|
|
|
return const SizedBox.shrink(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
return ListTile( |
|
|
|
leading: Icon(icon, color: color), |
|
|
|
title: Text(title), |
|
|
|
trailing: permissionAction != null |
|
|
|
? const Icon(Icons.chevron_right, color: Colors.grey) |
|
|
|
: null, |
|
|
|
onTap: () async { |
|
|
|
if (permissionAction != null && permissionRoute != null) { |
|
|
|
bool hasPermission = await userController.hasPermission(permissionAction, permissionRoute); |
|
|
|
if (hasPermission) { |
|
|
|
onTap(); |
|
|
|
} else { |
|
|
|
Get.snackbar( |
|
|
|
"Accès refusé", |
|
|
|
"Vous n'avez pas les droits pour accéder à cette page", |
|
|
|
backgroundColor: Colors.red, |
|
|
|
colorText: Colors.white, |
|
|
|
icon: const Icon(Icons.error), |
|
|
|
duration: const Duration(seconds: 3), |
|
|
|
snackPosition: SnackPosition.TOP, |
|
|
|
); |
|
|
|
} |
|
|
|
} else { |
|
|
|
onTap(); |
|
|
|
} |
|
|
|
}, |
|
|
|
onTap: onTap, |
|
|
|
); |
|
|
|
} |
|
|
|
} |