100 lines
2.9 KiB
Dart
100 lines
2.9 KiB
Dart
/// Widget de grille de statistiques du dashboard
|
|
/// Affiche les métriques principales dans une grille responsive
|
|
library dashboard_stats_grid;
|
|
|
|
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';
|
|
import 'dashboard_stats_card.dart';
|
|
|
|
/// Widget de grille de statistiques
|
|
///
|
|
/// Affiche les statistiques principales dans une grille 2x2 :
|
|
/// - Membres actifs
|
|
/// - Cotisations du mois
|
|
/// - Événements programmés
|
|
/// - Demandes de solidarité
|
|
///
|
|
/// Chaque carte est interactive et peut déclencher une navigation
|
|
class DashboardStatsGrid extends StatelessWidget {
|
|
/// Callback pour les actions sur les statistiques
|
|
final Function(String statType)? onStatTap;
|
|
|
|
/// Liste des statistiques à afficher
|
|
final List<DashboardStat>? stats;
|
|
|
|
/// Constructeur de la grille de statistiques
|
|
const DashboardStatsGrid({
|
|
super.key,
|
|
this.onStatTap,
|
|
this.stats,
|
|
});
|
|
|
|
/// Génère la liste des statistiques par défaut
|
|
List<DashboardStat> _getDefaultStats() {
|
|
return [
|
|
DashboardStat(
|
|
icon: Icons.people,
|
|
value: '25',
|
|
title: 'Membres',
|
|
color: ColorTokens.primary,
|
|
onTap: () => onStatTap?.call('members'),
|
|
),
|
|
DashboardStat(
|
|
icon: Icons.account_balance_wallet,
|
|
value: '15',
|
|
title: 'Cotisations',
|
|
color: ColorTokens.success,
|
|
onTap: () => onStatTap?.call('cotisations'),
|
|
),
|
|
DashboardStat(
|
|
icon: Icons.event,
|
|
value: '8',
|
|
title: 'Événements',
|
|
color: ColorTokens.tertiary,
|
|
onTap: () => onStatTap?.call('events'),
|
|
),
|
|
DashboardStat(
|
|
icon: Icons.favorite,
|
|
value: '3',
|
|
title: 'Solidarité',
|
|
color: ColorTokens.error,
|
|
onTap: () => onStatTap?.call('solidarity'),
|
|
),
|
|
];
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
final statsToShow = stats ?? _getDefaultStats();
|
|
|
|
return Column(
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
children: [
|
|
Text(
|
|
'Statistiques',
|
|
style: TypographyTokens.headlineSmall.copyWith(
|
|
fontWeight: FontWeight.w700,
|
|
),
|
|
),
|
|
const SizedBox(height: SpacingTokens.md),
|
|
GridView.builder(
|
|
shrinkWrap: true,
|
|
physics: const NeverScrollableScrollPhysics(),
|
|
gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
|
|
crossAxisCount: 2,
|
|
crossAxisSpacing: SpacingTokens.md,
|
|
mainAxisSpacing: SpacingTokens.md,
|
|
childAspectRatio: 1.4,
|
|
),
|
|
itemCount: statsToShow.length,
|
|
itemBuilder: (context, index) {
|
|
return DashboardStatsCard(stat: statsToShow[index]);
|
|
},
|
|
),
|
|
],
|
|
);
|
|
}
|
|
}
|