Browse Source

commit_01

table
andrymodeste 4 months ago
parent
commit
914d336f73
  1. 172
      lib/layouts/main_layout.dart
  2. 25
      lib/main.dart
  3. 39
      lib/pages/tables.dart
  4. 46
      lib/widgets/bottom_navigation.dart
  5. 3
      lib/widgets/mobile_bottom_navigation.dart

172
lib/layouts/main_layout.dart

@ -1,14 +1,19 @@
import 'package:flutter/material.dart';
import '../widgets/bottom_navigation.dart';
import '../widgets/mobile_bottom_navigation.dart';
class MainLayout extends StatefulWidget {
final Widget child;
final int currentIndex;
final String? currentRoute;
const MainLayout({super.key, required this.child, this.currentIndex = 0});
const MainLayout({
super.key,
required this.child,
this.currentRoute,
// Remove the currentIndex parameter - it's not needed
});
@override
// ignore: library_private_types_in_public_api
_MainLayoutState createState() => _MainLayoutState();
}
@ -18,39 +23,24 @@ class _MainLayoutState extends State<MainLayout> {
@override
void initState() {
super.initState();
_selectedIndex = widget.currentIndex;
_selectedIndex = _getIndexFromRoute(widget.currentRoute ?? '/dashboard');
}
@override
Widget build(BuildContext context) {
final isDesktop = MediaQuery.of(context).size.width >= 768;
return Scaffold(
backgroundColor: Colors.grey.shade50,
body: Row(
children: [
// Desktop Sidebar
if (isDesktop) _buildDesktopSidebar(),
// Main Content
Expanded(
child: Column(
children: [
// Page Content
Expanded(child: widget.child),
// Bottom Navigation
AppBottomNavigation(
selectedIndex: _selectedIndex,
onItemTapped: _onItemTapped,
isDesktop: isDesktop,
),
],
),
),
],
),
);
int _getIndexFromRoute(String route) {
switch (route) {
case '/dashboard':
return 0;
case '/menu':
return 1;
case '/tables':
return 2;
case '/orders':
return 3;
case '/profile':
return 4;
default:
return 0;
}
}
void _onItemTapped(int index) {
@ -58,103 +48,57 @@ class _MainLayoutState extends State<MainLayout> {
_selectedIndex = index;
});
// Global navigation logic
String route;
switch (index) {
case 0:
Navigator.pushReplacementNamed(context, '/tables');
route = '/dashboard';
break;
case 1:
Navigator.pushReplacementNamed(context, '/commandes');
route = '/menu';
break;
case 2:
Navigator.pushReplacementNamed(context, '/categories');
route = '/tables';
break;
case 3:
Navigator.pushReplacementNamed(context, '/menus');
route = '/orders';
break;
}
case 4:
route = '/profile';
break;
default:
route = '/dashboard';
}
Widget _buildDesktopSidebar() {
return Container(
width: 250,
color: Colors.white,
child: Column(
children: [
Container(
padding: const EdgeInsets.all(20),
child: const Text(
'Restaurant App',
style: TextStyle(
fontSize: 20,
fontWeight: FontWeight.bold,
color: Colors.black87,
),
),
),
Expanded(
child: ListView(
children: [
_buildSidebarItem(
icon: Icons.table_restaurant,
title: 'Tables',
route: '/tables',
index: 0,
),
_buildSidebarItem(
icon: Icons.receipt_long_outlined,
title: 'Commandes',
route: '/commandes',
index: 1,
),
_buildSidebarItem(
icon: Icons.category_outlined,
title: 'Catégories',
route: '/categories',
index: 2,
),
_buildSidebarItem(
icon: Icons.restaurant_menu,
title: 'Menus',
route: '/menus',
index: 3,
),
],
),
),
],
),
);
if (route != widget.currentRoute) {
Navigator.pushReplacementNamed(context, route);
}
}
Widget _buildSidebarItem({
required IconData icon,
required String title,
required String route,
required int index,
}) {
final isSelected = _selectedIndex == index;
@override
Widget build(BuildContext context) {
final isDesktop = MediaQuery.of(context).size.width > 600;
return ListTile(
leading: Icon(
icon,
color: isSelected ? Colors.green.shade700 : Colors.grey.shade600,
return Scaffold(
body: Column(
children: [
Expanded(child: widget.child),
// Show desktop navigation on larger screens
if (isDesktop)
AppBottomNavigation(
selectedIndex: _selectedIndex,
onItemTapped: _onItemTapped,
),
title: Text(
title,
style: TextStyle(
color: isSelected ? Colors.green.shade700 : Colors.grey.shade700,
fontWeight: isSelected ? FontWeight.w600 : FontWeight.normal,
],
),
// Show mobile navigation on smaller screens
bottomNavigationBar:
isDesktop
? null
: MobileBottomNavigation(
currentRoute: widget.currentRoute ?? '/dashboard',
selectedIndex: _selectedIndex,
onItemTapped: _onItemTapped,
),
selected: isSelected,
selectedTileColor: Colors.green.shade50,
onTap: () {
setState(() {
_selectedIndex = index;
});
Navigator.pushReplacementNamed(context, route);
},
);
}
}

25
lib/main.dart

@ -23,14 +23,23 @@ class MyApp extends StatelessWidget {
initialRoute: '/tables',
routes: {
'/tables':
(context) =>
const MainLayout(currentIndex: 0, child: TablesScreen()),
// '/commandes':
// (context) => MainLayout(currentIndex: 1, child: CommandesScreen()),
// '/categories':
// (context) => MainLayout(currentIndex: 2, child: CategoriesScreen()),
// '/menus':
// (context) => MainLayout(currentIndex: 3, child: MenusScreen()),
(context) => const MainLayout(
currentRoute: '/tables',
child: TablesScreen(),
),
// Uncomment and update these as needed:
// '/commandes': (context) => const MainLayout(
// currentRoute: '/commandes',
// child: CommandesScreen(),
// ),
// '/categories': (context) => const MainLayout(
// currentRoute: '/categories',
// child: CategoriesScreen(),
// ),
// '/menus': (context) => const MainLayout(
// currentRoute: '/menus',
// child: MenusScreen(),
// ),
},
);
}

39
lib/pages/tables.dart

@ -253,7 +253,7 @@ class _TablesScreenState extends State<TablesScreen> {
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
SizedBox(height: 30),
const SizedBox(height: 30),
const Text(
'Sélectionner une table',
style: TextStyle(
@ -446,40 +446,39 @@ class _TablesScreenState extends State<TablesScreen> {
SizedBox(
width: double.infinity,
child: ElevatedButton(
onPressed:
isSelectable
onPressed: isSelectable
? () {
// Handle table selection
ScaffoldMessenger.of(
context,
).showSnackBar(
// Affiche un message
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(
'Table ${table.nom} sélectionnée',
content: Text('Table ${table.nom} sélectionnée'),
),
);
// Redirige vers MenuPage avec les paramètres requis
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => MenuPage(
tableId: table.id,
personne: table.capacity, // Ajout du paramètre manquant
),
),
);
}
: null,
style: ElevatedButton.styleFrom(
backgroundColor:
isSelectable
backgroundColor: isSelectable
? Colors.green.shade700
: Colors.grey.shade300,
foregroundColor: Colors.white,
padding: const EdgeInsets.symmetric(
vertical: 8,
),
padding: const EdgeInsets.symmetric(vertical: 8),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(
8,
),
borderRadius: BorderRadius.circular(8),
),
),
child: Text(
isSelectable
? 'Sélectionner'
: 'Indisponible',
isSelectable ? 'Sélectionner' : 'Indisponible',
style: const TextStyle(
color: Colors.white,
fontSize: 12,

46
lib/widgets/bottom_navigation.dart

@ -1,7 +1,7 @@
import 'package:flutter/material.dart';
class AppBottomNavigation extends StatelessWidget {
final int selectedIndex;
final int? selectedIndex;
final Function(int) onItemTapped;
final bool isDesktop;
@ -107,6 +107,50 @@ class AppBottomNavigation extends StatelessWidget {
),
),
const SizedBox(width: 20),
// Commandes Tab
GestureDetector(
onTap: () => onItemTapped(1),
child: Container(
padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8),
decoration: BoxDecoration(
color:
selectedIndex == 1
? Colors.green.shade700
: Colors.transparent,
borderRadius: BorderRadius.circular(20),
),
child: Row(
mainAxisSize: MainAxisSize.min,
children: [
Icon(
Icons.receipt_long_outlined,
color:
selectedIndex == 1
? Colors.white
: Colors.grey.shade600,
size: 16,
),
const SizedBox(width: 6),
Text(
'Categories',
style: TextStyle(
color:
selectedIndex == 1
? Colors.white
: Colors.grey.shade600,
fontWeight:
selectedIndex == 1
? FontWeight.w500
: FontWeight.normal,
),
),
],
),
),
),
const Spacer(),
// User Profile Section

3
lib/widgets/mobile_bottom_navigation.dart

@ -1,13 +1,14 @@
import 'package:flutter/material.dart';
class MobileBottomNavigation extends StatelessWidget {
final int selectedIndex;
final int? selectedIndex;
final Function(int) onItemTapped;
const MobileBottomNavigation({
super.key,
required this.selectedIndex,
required this.onItemTapped,
required String currentRoute,
});
@override

Loading…
Cancel
Save