192 lines
4.9 KiB
Dart
192 lines
4.9 KiB
Dart
/// Widget de menu latéral (drawer) du dashboard
|
|
/// Navigation principale de l'application
|
|
library dashboard_drawer;
|
|
|
|
import 'package:flutter/material.dart';
|
|
import '../../../../core/design_system/tokens/color_tokens.dart';
|
|
import '../../../../core/design_system/tokens/spacing_tokens.dart';
|
|
import '../../../../core/design_system/tokens/typography_tokens.dart';
|
|
|
|
/// Modèle de données pour un élément de menu
|
|
class DrawerMenuItem {
|
|
/// Icône de l'élément de menu
|
|
final IconData icon;
|
|
|
|
/// Titre de l'élément de menu
|
|
final String title;
|
|
|
|
/// Callback lors du tap sur l'élément
|
|
final VoidCallback? onTap;
|
|
|
|
/// Constructeur du modèle d'élément de menu
|
|
const DrawerMenuItem({
|
|
required this.icon,
|
|
required this.title,
|
|
this.onTap,
|
|
});
|
|
}
|
|
|
|
/// Widget de menu latéral
|
|
///
|
|
/// Affiche la navigation principale avec :
|
|
/// - Header avec profil utilisateur
|
|
/// - Menu de navigation structuré
|
|
/// - Actions secondaires
|
|
/// - Design Material avec gradient
|
|
class DashboardDrawer extends StatelessWidget {
|
|
/// Callback pour les actions de navigation
|
|
final Function(String route)? onNavigate;
|
|
|
|
/// Callback pour la déconnexion
|
|
final VoidCallback? onLogout;
|
|
|
|
/// Constructeur du menu latéral
|
|
const DashboardDrawer({
|
|
super.key,
|
|
this.onNavigate,
|
|
this.onLogout,
|
|
});
|
|
|
|
/// Génère la liste des éléments de menu principaux
|
|
List<DrawerMenuItem> _getMainMenuItems() {
|
|
return [
|
|
DrawerMenuItem(
|
|
icon: Icons.dashboard,
|
|
title: 'Dashboard',
|
|
onTap: () => onNavigate?.call('/dashboard'),
|
|
),
|
|
DrawerMenuItem(
|
|
icon: Icons.people,
|
|
title: 'Membres',
|
|
onTap: () => onNavigate?.call('/members'),
|
|
),
|
|
DrawerMenuItem(
|
|
icon: Icons.account_balance_wallet,
|
|
title: 'Cotisations',
|
|
onTap: () => onNavigate?.call('/cotisations'),
|
|
),
|
|
DrawerMenuItem(
|
|
icon: Icons.event,
|
|
title: 'Événements',
|
|
onTap: () => onNavigate?.call('/events'),
|
|
),
|
|
DrawerMenuItem(
|
|
icon: Icons.favorite,
|
|
title: 'Solidarité',
|
|
onTap: () => onNavigate?.call('/solidarity'),
|
|
),
|
|
];
|
|
}
|
|
|
|
/// Génère la liste des éléments de menu secondaires
|
|
List<DrawerMenuItem> _getSecondaryMenuItems() {
|
|
return [
|
|
DrawerMenuItem(
|
|
icon: Icons.analytics,
|
|
title: 'Rapports',
|
|
onTap: () => onNavigate?.call('/reports'),
|
|
),
|
|
DrawerMenuItem(
|
|
icon: Icons.settings,
|
|
title: 'Paramètres',
|
|
onTap: () => onNavigate?.call('/settings'),
|
|
),
|
|
DrawerMenuItem(
|
|
icon: Icons.help,
|
|
title: 'Aide',
|
|
onTap: () => onNavigate?.call('/help'),
|
|
),
|
|
];
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
final mainItems = _getMainMenuItems();
|
|
final secondaryItems = _getSecondaryMenuItems();
|
|
|
|
return Drawer(
|
|
child: ListView(
|
|
padding: EdgeInsets.zero,
|
|
children: [
|
|
_buildDrawerHeader(),
|
|
...mainItems.map((item) => _buildMenuItem(item)),
|
|
const Divider(),
|
|
...secondaryItems.map((item) => _buildMenuItem(item)),
|
|
const Divider(),
|
|
_buildLogoutItem(),
|
|
],
|
|
),
|
|
);
|
|
}
|
|
|
|
/// Construit l'en-tête du drawer avec profil utilisateur
|
|
Widget _buildDrawerHeader() {
|
|
return DrawerHeader(
|
|
decoration: const BoxDecoration(
|
|
gradient: LinearGradient(
|
|
colors: [ColorTokens.primary, ColorTokens.secondary],
|
|
begin: Alignment.topLeft,
|
|
end: Alignment.bottomRight,
|
|
),
|
|
),
|
|
child: Column(
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
children: [
|
|
const CircleAvatar(
|
|
radius: 30,
|
|
backgroundColor: Colors.white,
|
|
child: Icon(
|
|
Icons.person,
|
|
size: 35,
|
|
color: ColorTokens.primary,
|
|
),
|
|
),
|
|
const SizedBox(height: SpacingTokens.md),
|
|
Text(
|
|
'Utilisateur UnionFlow',
|
|
style: TypographyTokens.titleMedium.copyWith(
|
|
color: Colors.white,
|
|
fontWeight: FontWeight.w600,
|
|
),
|
|
),
|
|
Text(
|
|
'admin@unionflow.dev',
|
|
style: TypographyTokens.bodySmall.copyWith(
|
|
color: Colors.white.withOpacity(0.8),
|
|
),
|
|
),
|
|
],
|
|
),
|
|
);
|
|
}
|
|
|
|
/// Construit un élément de menu
|
|
Widget _buildMenuItem(DrawerMenuItem item) {
|
|
return ListTile(
|
|
leading: Icon(item.icon),
|
|
title: Text(
|
|
item.title,
|
|
style: TypographyTokens.bodyMedium,
|
|
),
|
|
onTap: item.onTap,
|
|
);
|
|
}
|
|
|
|
/// Construit l'élément de déconnexion
|
|
Widget _buildLogoutItem() {
|
|
return ListTile(
|
|
leading: const Icon(
|
|
Icons.logout,
|
|
color: ColorTokens.error,
|
|
),
|
|
title: Text(
|
|
'Déconnexion',
|
|
style: TypographyTokens.bodyMedium.copyWith(
|
|
color: ColorTokens.error,
|
|
),
|
|
),
|
|
onTap: onLogout,
|
|
);
|
|
}
|
|
}
|