Centralisation et simplification de l'architecture de navigation : CRÉATIONS : - navigation_config.dart : Configuration centralisée de la navigation * Toutes les destinations (admin/user) * Logique de navigation (index → route) * Résolution inverse (route → index) * Titres et utilitaires - backgrounds/dots_painter.dart : Painter de points décoratifs * Extrait depuis AppScaffold et AdminScaffold * Paramétrable (opacité, densité, seed) * Réutilisable - backgrounds/gradient_background.dart : Fond dégradé * Gère les couleurs admin (rouge) / user (vert) * Option pour afficher/masquer les points * Widget indépendant SIMPLIFICATIONS : - app_scaffold.dart : 426 → 192 lignes (-55%) * Utilise NavigationConfig au lieu de NavigationHelper * Utilise GradientBackground au lieu de code dupliqué * Suppression de DotsPainter local - dashboard_layout.dart : 140 → 77 lignes (-45%) * Suppression validations excessives (try/catch, vérifications) * Code épuré et plus lisible SUPPRESSIONS : - admin_scaffold.dart : Supprimé (207 lignes) * Obsolète depuis unification avec AppScaffold * Code dupliqué avec AppScaffold * AdminNavigationHelper fusionné dans NavigationConfig RÉSULTATS : - Avant : 773 lignes (AppScaffold + AdminScaffold + DashboardLayout) - Après : 623 lignes (tout inclus) - Réduction nette : -150 lignes (-19%) - Architecture plus claire et maintenable - Aucune duplication de code - Navigation centralisée en un seul endroit Résout tâche #74 du PLANNING-2026-Q1.md 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
78 lines
2.4 KiB
Dart
Executable File
78 lines
2.4 KiB
Dart
Executable File
import 'package:flutter/material.dart';
|
|
import 'package:geosector_app/presentation/widgets/dashboard_app_bar.dart';
|
|
import 'package:geosector_app/presentation/widgets/responsive_navigation.dart';
|
|
import 'package:geosector_app/core/theme/app_theme.dart'; // Pour les couleurs du thème
|
|
|
|
/// Layout commun pour les tableaux de bord utilisateur et administrateur
|
|
/// Combine DashboardAppBar et ResponsiveNavigation
|
|
class DashboardLayout extends StatelessWidget {
|
|
/// Le contenu principal à afficher
|
|
final Widget body;
|
|
|
|
/// Le titre de la page
|
|
final String title;
|
|
|
|
/// L'index de la page sélectionnée
|
|
final int selectedIndex;
|
|
|
|
/// Callback appelé lorsqu'un élément de navigation est sélectionné
|
|
final Function(int) onDestinationSelected;
|
|
|
|
/// Liste des destinations de navigation
|
|
final List<NavigationDestination> destinations;
|
|
|
|
/// Actions supplémentaires à afficher dans l'AppBar
|
|
final List<Widget>? additionalActions;
|
|
|
|
/// Widgets à afficher en bas de la sidebar
|
|
final List<Widget>? sidebarBottomItems;
|
|
|
|
/// Indique si l'utilisateur est un administrateur
|
|
final bool isAdmin;
|
|
|
|
/// Callback appelé lorsque le bouton de déconnexion est pressé
|
|
final VoidCallback? onLogoutPressed;
|
|
|
|
const DashboardLayout({
|
|
super.key,
|
|
required this.body,
|
|
required this.title,
|
|
required this.selectedIndex,
|
|
required this.onDestinationSelected,
|
|
required this.destinations,
|
|
this.additionalActions,
|
|
this.sidebarBottomItems,
|
|
this.isAdmin = false,
|
|
this.onLogoutPressed,
|
|
});
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
// Scaffold avec fond transparent (le fond est géré par AppScaffold)
|
|
return Scaffold(
|
|
key: ValueKey('dashboard_scaffold_$selectedIndex'),
|
|
backgroundColor: Colors.transparent,
|
|
appBar: DashboardAppBar(
|
|
key: ValueKey('dashboard_appbar_$selectedIndex'),
|
|
title: title,
|
|
pageTitle: destinations[selectedIndex].label,
|
|
isAdmin: isAdmin,
|
|
onLogoutPressed: onLogoutPressed,
|
|
),
|
|
body: ResponsiveNavigation(
|
|
key: ValueKey('responsive_nav_$selectedIndex'),
|
|
title: title,
|
|
body: body,
|
|
selectedIndex: selectedIndex,
|
|
onDestinationSelected: onDestinationSelected,
|
|
destinations: destinations,
|
|
showNewPassageButton: false,
|
|
onNewPassagePressed: null,
|
|
sidebarBottomItems: sidebarBottomItems,
|
|
isAdmin: isAdmin,
|
|
showAppBar: false,
|
|
),
|
|
);
|
|
}
|
|
}
|