Compare commits
2 Commits
7378bc9b43
...
914d336f73
| Author | SHA1 | Date | |
|---|---|---|---|
| 914d336f73 | |||
| a7268ad74f |
@ -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,
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Widget _buildSidebarItem({
|
||||
required IconData icon,
|
||||
required String title,
|
||||
required String route,
|
||||
required int index,
|
||||
}) {
|
||||
final isSelected = _selectedIndex == index;
|
||||
|
||||
return ListTile(
|
||||
leading: Icon(
|
||||
icon,
|
||||
color: isSelected ? Colors.green.shade700 : Colors.grey.shade600,
|
||||
),
|
||||
title: Text(
|
||||
title,
|
||||
style: TextStyle(
|
||||
color: isSelected ? Colors.green.shade700 : Colors.grey.shade700,
|
||||
fontWeight: isSelected ? FontWeight.w600 : FontWeight.normal,
|
||||
),
|
||||
),
|
||||
selected: isSelected,
|
||||
selectedTileColor: Colors.green.shade50,
|
||||
onTap: () {
|
||||
setState(() {
|
||||
_selectedIndex = index;
|
||||
});
|
||||
if (route != widget.currentRoute) {
|
||||
Navigator.pushReplacementNamed(context, route);
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final isDesktop = MediaQuery.of(context).size.width > 600;
|
||||
|
||||
return Scaffold(
|
||||
body: Column(
|
||||
children: [
|
||||
Expanded(child: widget.child),
|
||||
// Show desktop navigation on larger screens
|
||||
if (isDesktop)
|
||||
AppBottomNavigation(
|
||||
selectedIndex: _selectedIndex,
|
||||
onItemTapped: _onItemTapped,
|
||||
),
|
||||
],
|
||||
),
|
||||
// Show mobile navigation on smaller screens
|
||||
bottomNavigationBar:
|
||||
isDesktop
|
||||
? null
|
||||
: MobileBottomNavigation(
|
||||
currentRoute: widget.currentRoute ?? '/dashboard',
|
||||
selectedIndex: _selectedIndex,
|
||||
onItemTapped: _onItemTapped,
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@ -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(),
|
||||
// ),
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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…
Reference in New Issue
Block a user