|
|
@ -3,7 +3,6 @@ import 'package:flutter/foundation.dart'; |
|
|
import 'package:flutter/material.dart'; |
|
|
import 'package:flutter/material.dart'; |
|
|
import 'package:http/http.dart' as http; |
|
|
import 'package:http/http.dart' as http; |
|
|
import 'dart:convert'; |
|
|
import 'dart:convert'; |
|
|
import './PlatEdit_screen.dart'; |
|
|
|
|
|
|
|
|
|
|
|
class OrdersManagementScreen extends StatefulWidget { |
|
|
class OrdersManagementScreen extends StatefulWidget { |
|
|
const OrdersManagementScreen({super.key}); |
|
|
const OrdersManagementScreen({super.key}); |
|
|
@ -17,18 +16,11 @@ class _OrdersManagementScreenState extends State<OrdersManagementScreen> { |
|
|
bool isLoading = true; |
|
|
bool isLoading = true; |
|
|
String? errorMessage; |
|
|
String? errorMessage; |
|
|
final String baseUrl = 'https://restaurant.careeracademy.mg/api'; |
|
|
final String baseUrl = 'https://restaurant.careeracademy.mg/api'; |
|
|
Map<int, MenuPlat>? menuMap; |
|
|
|
|
|
@override |
|
|
@override |
|
|
void initState() { |
|
|
void initState() { |
|
|
super.initState(); |
|
|
super.initState(); |
|
|
loadOrders(); |
|
|
loadOrders(); |
|
|
loadMenuMap(); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
Future<void> loadMenuMap() async { |
|
|
|
|
|
final loadedMenuMap = await fetchMenuMap(); |
|
|
|
|
|
|
|
|
|
|
|
menuMap = loadedMenuMap; |
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
Future<void> loadOrders() async { |
|
|
Future<void> loadOrders() async { |
|
|
@ -529,7 +521,6 @@ class _OrdersManagementScreenState extends State<OrdersManagementScreen> { |
|
|
onProcessPayment: processPayment, |
|
|
onProcessPayment: processPayment, |
|
|
onDelete: deleteOrder, |
|
|
onDelete: deleteOrder, |
|
|
onViewDetails: () => getOrderById(order.id), |
|
|
onViewDetails: () => getOrderById(order.id), |
|
|
menuMap: menuMap, |
|
|
|
|
|
); |
|
|
); |
|
|
}, |
|
|
}, |
|
|
), |
|
|
), |
|
|
@ -537,30 +528,6 @@ class _OrdersManagementScreenState extends State<OrdersManagementScreen> { |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
/// Récupère la liste des menus et la stocke dans un [Map] |
|
|
|
|
|
/// où la clé est l'ID du menu et la valeur est le [MenuPlat] correspondant. |
|
|
|
|
|
/// |
|
|
|
|
|
/// Si la requête échoue, lève une [Exception] avec un message d'erreur. |
|
|
|
|
|
Future<Map<int, MenuPlat>> fetchMenuMap() async { |
|
|
|
|
|
final response = await http.get( |
|
|
|
|
|
Uri.parse('https://restaurant.careeracademy.mg/api/menus'), |
|
|
|
|
|
); |
|
|
|
|
|
|
|
|
|
|
|
if (response.statusCode == 200) { |
|
|
|
|
|
final List<dynamic> menuList = json.decode(response.body); |
|
|
|
|
|
final Map<int, MenuPlat> menuMap = {}; |
|
|
|
|
|
|
|
|
|
|
|
for (var menu in menuList) { |
|
|
|
|
|
final menuPlat = MenuPlat.fromJson(menu); |
|
|
|
|
|
menuMap[menuPlat.id] = menuPlat; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
return menuMap; |
|
|
|
|
|
} else { |
|
|
|
|
|
throw Exception('Échec de la récupération des menus'); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
class OrderCard extends StatelessWidget { |
|
|
class OrderCard extends StatelessWidget { |
|
|
final Order order; |
|
|
final Order order; |
|
|
final Function(Order, String, {String? modePaiement}) onStatusUpdate; |
|
|
final Function(Order, String, {String? modePaiement}) onStatusUpdate; |
|
|
@ -568,19 +535,14 @@ class OrderCard extends StatelessWidget { |
|
|
final Function(Order) onDelete; |
|
|
final Function(Order) onDelete; |
|
|
final VoidCallback onViewDetails; |
|
|
final VoidCallback onViewDetails; |
|
|
|
|
|
|
|
|
// Add menuMap field to have access to menu names |
|
|
const OrderCard({ |
|
|
|
|
|
Key? key, |
|
|
// late Future<Map<int, MenuPlat>> menuMapFuture = fetchMenuMap(); |
|
|
|
|
|
final Map<int, MenuPlat> menuMap; |
|
|
|
|
|
OrderCard({ |
|
|
|
|
|
super.key, |
|
|
|
|
|
required this.order, |
|
|
required this.order, |
|
|
required this.onStatusUpdate, |
|
|
required this.onStatusUpdate, |
|
|
required this.onProcessPayment, |
|
|
required this.onProcessPayment, |
|
|
required this.onDelete, |
|
|
required this.onDelete, |
|
|
required this.onViewDetails, |
|
|
required this.onViewDetails, |
|
|
required this.menuMap, // Require menuMap in constructor |
|
|
}) : super(key: key); |
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
String _formatTime(DateTime dateTime) { |
|
|
String _formatTime(DateTime dateTime) { |
|
|
return '${dateTime.hour.toString().padLeft(2, '0')}:${dateTime.minute.toString().padLeft(2, '0')} •${dateTime.day.toString().padLeft(2, '0')}/${dateTime.month.toString().padLeft(2, '0')}/${dateTime.year} •1 personne'; |
|
|
return '${dateTime.hour.toString().padLeft(2, '0')}:${dateTime.minute.toString().padLeft(2, '0')} •${dateTime.day.toString().padLeft(2, '0')}/${dateTime.month.toString().padLeft(2, '0')}/${dateTime.year} •1 personne'; |
|
|
@ -699,7 +661,7 @@ class OrderCard extends StatelessWidget { |
|
|
mainAxisAlignment: MainAxisAlignment.spaceBetween, |
|
|
mainAxisAlignment: MainAxisAlignment.spaceBetween, |
|
|
children: [ |
|
|
children: [ |
|
|
Text( |
|
|
Text( |
|
|
'${item.quantite}x ${item.getNomById(menuMap)}', |
|
|
'${item.quantite}x ${item.menuId}', // You might want to resolve menu name |
|
|
style: const TextStyle( |
|
|
style: const TextStyle( |
|
|
fontSize: 14, |
|
|
fontSize: 14, |
|
|
color: Colors.black87, |
|
|
color: Colors.black87, |
|
|
@ -942,9 +904,4 @@ class OrderItem { |
|
|
commentaires: json['commentaires'], |
|
|
commentaires: json['commentaires'], |
|
|
); |
|
|
); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// Pass a Map of menus to get the name |
|
|
|
|
|
String getNomById(Map<int, MenuPlat> menuMap) { |
|
|
|
|
|
return menuMap[menuId]?.nom ?? 'Menu Item $menuId'; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
} |
|
|
|