From 9ebb845caee324502f8e8b9597a22dc235c04e59 Mon Sep 17 00:00:00 2001 From: dahoud <41957584+DahoudG@users.noreply.github.com> Date: Thu, 16 Apr 2026 19:57:32 +0000 Subject: [PATCH] feat(dashboards): ajouter RefreshIndicator pull-to-refresh sur 4 dashboards MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Le SuperAdmin dashboard avait déjà RefreshIndicator+Completer. Les 4 autres (OrgAdmin, ActiveMember, SimpleMember, Moderator) n'en avaient pas. Ajout sur chacun : - RefreshIndicator avec couleur thème (gold pour OrgAdmin, unionGreen pour les autres) - AlwaysScrollableScrollPhysics (permet pull-to-refresh même si contenu < écran) - onRefresh dispatche LoadDashboardData avec orgId + userId du contexte courant - Délai 1.2s pour laisser le BLoC recharger avant de masquer l'indicateur --- .../active_member_dashboard.dart | 17 +++++++++++++++-- .../role_dashboards/moderator_dashboard.dart | 17 +++++++++++++++-- .../role_dashboards/org_admin_dashboard.dart | 15 +++++++++++++-- .../simple_member_dashboard.dart | 17 +++++++++++++++-- 4 files changed, 58 insertions(+), 8 deletions(-) diff --git a/lib/features/dashboard/presentation/pages/role_dashboards/active_member_dashboard.dart b/lib/features/dashboard/presentation/pages/role_dashboards/active_member_dashboard.dart index e61eda6..65b4225 100644 --- a/lib/features/dashboard/presentation/pages/role_dashboards/active_member_dashboard.dart +++ b/lib/features/dashboard/presentation/pages/role_dashboards/active_member_dashboard.dart @@ -40,7 +40,19 @@ class ActiveMemberDashboard extends StatelessWidget { : null; final stats = dashboardData?.stats; - return SingleChildScrollView( + return RefreshIndicator( + color: UnionFlowColors.unionGreen, + onRefresh: () async { + final orgCtx = user?.organizationContexts.isNotEmpty == true + ? user!.organizationContexts.first : null; + context.read().add(LoadDashboardData( + organizationId: orgCtx?.organizationId ?? '', + userId: user?.id ?? '', + )); + await Future.delayed(const Duration(milliseconds: 1200)); + }, + child: SingleChildScrollView( + physics: const AlwaysScrollableScrollPhysics(), padding: const EdgeInsets.all(12), child: Column( crossAxisAlignment: CrossAxisAlignment.start, @@ -220,7 +232,8 @@ class ActiveMemberDashboard extends StatelessWidget { ), ], ), - ); + ), // SingleChildScrollView + ); // RefreshIndicator }, ); }, diff --git a/lib/features/dashboard/presentation/pages/role_dashboards/moderator_dashboard.dart b/lib/features/dashboard/presentation/pages/role_dashboards/moderator_dashboard.dart index 19c8492..914d986 100644 --- a/lib/features/dashboard/presentation/pages/role_dashboards/moderator_dashboard.dart +++ b/lib/features/dashboard/presentation/pages/role_dashboards/moderator_dashboard.dart @@ -43,7 +43,19 @@ class ModeratorDashboard extends StatelessWidget { : null; final stats = dashboardData?.stats; - return SingleChildScrollView( + return RefreshIndicator( + color: UnionFlowColors.unionGreen, + onRefresh: () async { + final orgCtx = user?.organizationContexts.isNotEmpty == true + ? user!.organizationContexts.first : null; + context.read().add(LoadDashboardData( + organizationId: orgCtx?.organizationId ?? '', + userId: user?.id ?? '', + )); + await Future.delayed(const Duration(milliseconds: 1200)); + }, + child: SingleChildScrollView( + physics: const AlwaysScrollableScrollPhysics(), padding: const EdgeInsets.all(12), child: Column( crossAxisAlignment: CrossAxisAlignment.start, @@ -350,7 +362,8 @@ class ModeratorDashboard extends StatelessWidget { ), ], ), - ); + ), // SingleChildScrollView + ); // RefreshIndicator }, ); }, diff --git a/lib/features/dashboard/presentation/pages/role_dashboards/org_admin_dashboard.dart b/lib/features/dashboard/presentation/pages/role_dashboards/org_admin_dashboard.dart index 7ccebfb..de12123 100644 --- a/lib/features/dashboard/presentation/pages/role_dashboards/org_admin_dashboard.dart +++ b/lib/features/dashboard/presentation/pages/role_dashboards/org_admin_dashboard.dart @@ -50,7 +50,17 @@ class OrgAdminDashboard extends StatelessWidget { : null; final stats = dashboardData?.stats; - return SingleChildScrollView( + return RefreshIndicator( + color: UnionFlowColors.gold, + onRefresh: () async { + context.read().add(LoadDashboardData( + organizationId: orgContext?.organizationId ?? '', + userId: user?.id ?? '', + )); + await Future.delayed(const Duration(milliseconds: 1200)); + }, + child: SingleChildScrollView( + physics: const AlwaysScrollableScrollPhysics(), padding: const EdgeInsets.all(12), child: Column( crossAxisAlignment: CrossAxisAlignment.start, @@ -276,7 +286,8 @@ class OrgAdminDashboard extends StatelessWidget { ), ], ), - ); + ), // SingleChildScrollView + ); // RefreshIndicator }, ); }, diff --git a/lib/features/dashboard/presentation/pages/role_dashboards/simple_member_dashboard.dart b/lib/features/dashboard/presentation/pages/role_dashboards/simple_member_dashboard.dart index 1f085a2..c764e00 100644 --- a/lib/features/dashboard/presentation/pages/role_dashboards/simple_member_dashboard.dart +++ b/lib/features/dashboard/presentation/pages/role_dashboards/simple_member_dashboard.dart @@ -39,7 +39,19 @@ class SimpleMemberDashboard extends StatelessWidget { : null; final stats = dashboardData?.stats; - return SingleChildScrollView( + return RefreshIndicator( + color: UnionFlowColors.unionGreen, + onRefresh: () async { + final orgCtx = user?.organizationContexts.isNotEmpty == true + ? user!.organizationContexts.first : null; + context.read().add(LoadDashboardData( + organizationId: orgCtx?.organizationId ?? '', + userId: user?.id ?? '', + )); + await Future.delayed(const Duration(milliseconds: 1200)); + }, + child: SingleChildScrollView( + physics: const AlwaysScrollableScrollPhysics(), padding: const EdgeInsets.all(12), child: Column( crossAxisAlignment: CrossAxisAlignment.start, @@ -180,7 +192,8 @@ class SimpleMemberDashboard extends StatelessWidget { ], ], ), - ); + ), // SingleChildScrollView + ); // RefreshIndicator }, ); },