From fffe8cd202d98a6cf5eef04921318104357cb89a Mon Sep 17 00:00:00 2001 From: Julien Martin Date: Wed, 25 Feb 2026 16:37:15 +0100 Subject: [PATCH] merge: squash develop into master (#44 Dashboard Gestionnaire - Structure) Co-authored-by: Cursor --- frontend/lib/config/app_router.dart | 5 ++ .../admin_dashboardScreen.dart | 2 +- frontend/lib/screens/auth/login_screen.dart | 4 +- .../gestionnaire_dashboard_screen.dart | 47 +++++++++++++++++++ .../lib/widgets/admin/dashboard_admin.dart | 42 +++++++++++------ .../widgets/admin/user_management_panel.dart | 20 +++++--- 6 files changed, 98 insertions(+), 22 deletions(-) create mode 100644 frontend/lib/screens/gestionnaire/gestionnaire_dashboard_screen.dart diff --git a/frontend/lib/config/app_router.dart b/frontend/lib/config/app_router.dart index d5e2ad6..8408cf4 100644 --- a/frontend/lib/config/app_router.dart +++ b/frontend/lib/config/app_router.dart @@ -20,6 +20,7 @@ import '../screens/auth/am_register_step3_screen.dart'; import '../screens/auth/am_register_step4_screen.dart'; import '../screens/home/home_screen.dart'; import '../screens/administrateurs/admin_dashboardScreen.dart'; +import '../screens/gestionnaire/gestionnaire_dashboard_screen.dart'; import '../screens/home/parent_screen/ParentDashboardScreen.dart'; import '../screens/unknown_screen.dart'; @@ -53,6 +54,10 @@ class AppRouter { path: '/admin-dashboard', builder: (BuildContext context, GoRouterState state) => const AdminDashboardScreen(), ), + GoRoute( + path: '/gestionnaire-dashboard', + builder: (BuildContext context, GoRouterState state) => const GestionnaireDashboardScreen(), + ), GoRoute( path: '/parent-dashboard', builder: (BuildContext context, GoRouterState state) => const ParentDashboardScreen(), diff --git a/frontend/lib/screens/administrateurs/admin_dashboardScreen.dart b/frontend/lib/screens/administrateurs/admin_dashboardScreen.dart index 892eb8b..43d3ca6 100644 --- a/frontend/lib/screens/administrateurs/admin_dashboardScreen.dart +++ b/frontend/lib/screens/administrateurs/admin_dashboardScreen.dart @@ -106,6 +106,6 @@ class _AdminDashboardScreenState extends State { selectedSettingsTabIndex: settingsSubIndex, ); } - return const AdminUserManagementPanel(); + return const UserManagementPanel(); } } diff --git a/frontend/lib/screens/auth/login_screen.dart b/frontend/lib/screens/auth/login_screen.dart index 8efaf2e..96064e7 100644 --- a/frontend/lib/screens/auth/login_screen.dart +++ b/frontend/lib/screens/auth/login_screen.dart @@ -131,9 +131,11 @@ class _LoginPageState extends State with WidgetsBindingObserver { switch (role.toLowerCase()) { case 'super_admin': case 'administrateur': - case 'gestionnaire': context.go('/admin-dashboard'); break; + case 'gestionnaire': + context.go('/gestionnaire-dashboard'); + break; case 'parent': context.go('/parent-dashboard'); break; diff --git a/frontend/lib/screens/gestionnaire/gestionnaire_dashboard_screen.dart b/frontend/lib/screens/gestionnaire/gestionnaire_dashboard_screen.dart new file mode 100644 index 0000000..f712dca --- /dev/null +++ b/frontend/lib/screens/gestionnaire/gestionnaire_dashboard_screen.dart @@ -0,0 +1,47 @@ +import 'package:flutter/material.dart'; +import 'package:p_tits_pas/widgets/admin/dashboard_admin.dart'; +import 'package:p_tits_pas/widgets/admin/user_management_panel.dart'; +import 'package:p_tits_pas/widgets/app_footer.dart'; + +/// Dashboard gestionnaire – même shell que l'admin, sans onglet Paramètres. +/// Réutilise [UserManagementPanel]. +class GestionnaireDashboardScreen extends StatefulWidget { + const GestionnaireDashboardScreen({super.key}); + + @override + State createState() => + _GestionnaireDashboardScreenState(); +} + +class _GestionnaireDashboardScreenState extends State { + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: PreferredSize( + preferredSize: const Size.fromHeight(60.0), + child: Container( + decoration: BoxDecoration( + border: Border( + bottom: BorderSide(color: Colors.grey.shade300), + ), + ), + child: DashboardAppBarAdmin( + selectedIndex: 0, + onTabChange: (_) {}, + showSettingsTab: false, + roleLabel: 'Gestionnaire', + setupCompleted: true, + ), + ), + ), + body: Column( + children: [ + Expanded( + child: UserManagementPanel(showAdministrateursTab: false), + ), + const AppFooter(), + ], + ), + ); + } +} diff --git a/frontend/lib/widgets/admin/dashboard_admin.dart b/frontend/lib/widgets/admin/dashboard_admin.dart index ff1aa3b..13bbb43 100644 --- a/frontend/lib/widgets/admin/dashboard_admin.dart +++ b/frontend/lib/widgets/admin/dashboard_admin.dart @@ -3,17 +3,22 @@ import 'package:go_router/go_router.dart'; import 'package:p_tits_pas/services/auth_service.dart'; /// Barre du dashboard admin : onglets Gestion des utilisateurs | Paramètres + déconnexion. +/// Pour le dashboard gestionnaire : [showSettingsTab] = false, [roleLabel] = 'Gestionnaire'. class DashboardAppBarAdmin extends StatelessWidget implements PreferredSizeWidget { final int selectedIndex; final ValueChanged onTabChange; final bool setupCompleted; + final bool showSettingsTab; + final String roleLabel; const DashboardAppBarAdmin({ Key? key, required this.selectedIndex, required this.onTabChange, this.setupCompleted = true, + this.showSettingsTab = true, + this.roleLabel = 'Admin', }) : super(key: key); @override @@ -39,8 +44,10 @@ class DashboardAppBarAdmin extends StatelessWidget children: [ _buildNavItem(context, 'Gestion des utilisateurs', 0, enabled: setupCompleted), - const SizedBox(width: 24), - _buildNavItem(context, 'Paramètres', 1, enabled: true), + if (showSettingsTab) ...[ + const SizedBox(width: 24), + _buildNavItem(context, 'Paramètres', 1, enabled: true), + ], ], ), ), @@ -48,12 +55,12 @@ class DashboardAppBarAdmin extends StatelessWidget ], ), actions: [ - const Padding( - padding: EdgeInsets.symmetric(horizontal: 16), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 16), child: Center( child: Text( - 'Admin', - style: TextStyle( + roleLabel, + style: const TextStyle( color: Colors.black, fontSize: 16, fontWeight: FontWeight.w500, @@ -132,7 +139,8 @@ class DashboardAppBarAdmin extends StatelessWidget } } -/// Sous-barre : Gestionnaires | Parents | Assistantes maternelles | Administrateurs. +/// Sous-barre : Gestionnaires | Parents | Assistantes maternelles | [Administrateurs]. +/// [subTabCount] = 3 pour masquer l'onglet Administrateurs (dashboard gestionnaire). class DashboardUserManagementSubBar extends StatelessWidget { final int selectedSubIndex; final ValueChanged onSubTabChange; @@ -141,6 +149,14 @@ class DashboardUserManagementSubBar extends StatelessWidget { final Widget? filterControl; final VoidCallback? onAddPressed; final String addLabel; + final int subTabCount; + + static const List _tabLabels = [ + 'Gestionnaires', + 'Parents', + 'Assistantes maternelles', + 'Administrateurs', + ]; const DashboardUserManagementSubBar({ Key? key, @@ -151,6 +167,7 @@ class DashboardUserManagementSubBar extends StatelessWidget { this.filterControl, this.onAddPressed, this.addLabel = '+ Ajouter', + this.subTabCount = 4, }) : super(key: key); @override @@ -164,13 +181,10 @@ class DashboardUserManagementSubBar extends StatelessWidget { padding: const EdgeInsets.symmetric(horizontal: 24, vertical: 6), child: Row( children: [ - _buildSubNavItem(context, 'Gestionnaires', 0), - const SizedBox(width: 12), - _buildSubNavItem(context, 'Parents', 1), - const SizedBox(width: 12), - _buildSubNavItem(context, 'Assistantes maternelles', 2), - const SizedBox(width: 12), - _buildSubNavItem(context, 'Administrateurs', 3), + for (int i = 0; i < subTabCount; i++) ...[ + if (i > 0) const SizedBox(width: 12), + _buildSubNavItem(context, _tabLabels[i], i), + ], const SizedBox(width: 36), _pillField( width: 320, diff --git a/frontend/lib/widgets/admin/user_management_panel.dart b/frontend/lib/widgets/admin/user_management_panel.dart index 63bc921..18ba940 100644 --- a/frontend/lib/widgets/admin/user_management_panel.dart +++ b/frontend/lib/widgets/admin/user_management_panel.dart @@ -6,15 +6,20 @@ import 'package:p_tits_pas/widgets/admin/dashboard_admin.dart'; import 'package:p_tits_pas/widgets/admin/gestionnaire_management_widget.dart'; import 'package:p_tits_pas/widgets/admin/parent_managmant_widget.dart'; -class AdminUserManagementPanel extends StatefulWidget { - const AdminUserManagementPanel({super.key}); +class UserManagementPanel extends StatefulWidget { + /// Afficher l'onglet Administrateurs (sinon 3 onglets : Gestionnaires, Parents, AM). + final bool showAdministrateursTab; + + const UserManagementPanel({ + super.key, + this.showAdministrateursTab = true, + }); @override - State createState() => - _AdminUserManagementPanelState(); + State createState() => _UserManagementPanelState(); } -class _AdminUserManagementPanelState extends State { +class _UserManagementPanelState extends State { int _subIndex = 0; int _gestionnaireRefreshTick = 0; int _adminRefreshTick = 0; @@ -44,8 +49,9 @@ class _AdminUserManagementPanelState extends State { } void _onSubTabChange(int index) { + final maxIndex = widget.showAdministrateursTab ? 3 : 2; setState(() { - _subIndex = index; + _subIndex = index.clamp(0, maxIndex); _searchController.clear(); _parentStatus = null; _amCapacityController.clear(); @@ -161,6 +167,7 @@ class _AdminUserManagementPanelState extends State { @override Widget build(BuildContext context) { + final subTabCount = widget.showAdministrateursTab ? 4 : 3; return Column( children: [ DashboardUserManagementSubBar( @@ -171,6 +178,7 @@ class _AdminUserManagementPanelState extends State { filterControl: _subBarFilterControl(), onAddPressed: _handleAddPressed, addLabel: 'Ajouter', + subTabCount: subTabCount, ), Expanded(child: _buildBody()), ],