import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:yoshi_papas_app/themes/themes.dart'; import 'package:yoshi_papas_app/views/pedido/pedido_csv.dart'; import 'package:yoshi_papas_app/views/pedido/pedido_detalle_screen.dart'; import '../../models/models.dart'; import '../../viewmodels/viewmodels.dart'; import '../../widgets/app_textfield.dart'; import '../../widgets/pagination_buttons.dart'; import '../../widgets/widgets_components.dart'; import 'pedido_form.dart'; // Asumiendo que tienes un formulario para los pedidos similar al de los productos. class PedidoScreen extends StatefulWidget { const PedidoScreen({Key? key}) : super(key: key); @override State createState() => _PedidoScreenState(); } class _PedidoScreenState extends State { final _busqueda = TextEditingController(text: ''); ScrollController horizontalScrollController = ScrollController(); @override void initState() { super.initState(); WidgetsBinding.instance.addPostFrameCallback((_) { Provider.of(context, listen: false).fetchLocalPedidos(); }); } void exportCSV() async { // Obtiene los pedidos actuales del estado de PedidoViewModel List pedidos = Provider.of(context, listen: false).pedidos; // Llamada a la función de exportación que debes definir en otro lugar y que crea el CSV exportarPedidosACSV(pedidos); ScaffoldMessenger.of(context).showSnackBar( SnackBar(content: Text('Exportación de CSV completada!'))); } void go(Pedido item) async { // Obtener el pedido completo con productos antes de navegar Pedido? pedidoCompleto = await Provider.of(context, listen: false) .fetchPedidoConProductos(item.id); if (pedidoCompleto != null) { Navigator.push( context, MaterialPageRoute( builder: (context) => PedidoDetalleScreen(pedido: pedidoCompleto), ), ); } else { print("Error al cargar el pedido con productos"); } } @override Widget build(BuildContext context) { final pvm = Provider.of(context); double screenWidth = MediaQuery.of(context).size.width; final isMobile = screenWidth < 1250; final double? columnSpacing = isMobile ? null : 0; TextStyle estilo = const TextStyle(fontWeight: FontWeight.bold); List registros = []; for (Pedido item in pvm.pedidos) { registros.add(DataRow(cells: [ DataCell( Row(mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ PopupMenuButton( itemBuilder: (context) => [ PopupMenuItem( child: const Text('Editar'), onTap: () => go(item), ), PopupMenuItem( child: const Text('Cancelar Pedido'), onTap: () async { bool confirmado = await showDialog( context: context, builder: (context) { return AlertDialog( title: const Text("Cancelar Pedido"), content: const Text( '¿Estás seguro de que deseas cancelar este pedido?'), actions: [ TextButton( onPressed: () => Navigator.of(context).pop(false), child: const Text('No'), ), TextButton( onPressed: () => Navigator.of(context).pop(false), child: const Text('Sí'), ), ], ); }, ) ?? false; if (confirmado) { // bool result = await Provider.of(context, // listen: false) // .cancelarPedido(item.id!); // if (result) { // ScaffoldMessenger.of(context).showSnackBar( // SnackBar( // content: Text("Pedido cancelado correctamente")), // ); // } else { // ScaffoldMessenger.of(context).showSnackBar( // SnackBar(content: Text("Error al cancelar el pedido")), // ); // } } }, ) ], icon: const Icon(Icons.more_vert), ), ])), DataCell( Text(item.id.toString()), // Ajusta de acuerdo a tu modelo de Pedido. onTap: () => go(item), ), DataCell( Text(item.nombreCliente ?? "Sin nombre"), // Ajusta de acuerdo a tu modelo de Pedido. onTap: () => go(item), ), DataCell( Text(item.comentarios ?? "Sin comentarios"), // Ajusta de acuerdo a tu modelo de Pedido. onTap: () => go(item), ), // Continúa con las demás celdas que necesites mostrar ])); } return Scaffold( appBar: AppBar( title: const Text('Pedidos'), actions: [ IconButton( icon: const Icon(Icons.save_alt), onPressed: exportCSV, tooltip: 'Exportar a CSV', ), ], ), floatingActionButton: FloatingActionButton.extended( onPressed: () async { await Navigator.push( context, MaterialPageRoute( builder: (context) => PedidoForm(), ), ).then((_) => Provider.of(context, listen: false) .fetchLocalPedidos()); }, icon: const Icon(Icons.add, size: 30), // Incrementa el tamaño del ícono label: const Text( "Agregar Pedido", style: TextStyle( fontSize: 20, // Incrementa el tamaño del texto ), ), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(8), ), materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, backgroundColor: AppTheme.primary, foregroundColor: AppTheme.tertiary, ), body: Column( children: [ Expanded( child: ListView( padding: const EdgeInsets.fromLTRB(8, 0, 8, 0), children: [ const SizedBox(height: 8), tarjeta( Padding( padding: const EdgeInsets.all(8.0), child: LayoutBuilder( builder: (context, constraints) { if (screenWidth > 1000) { return Row( children: [ Expanded( flex: 10, child: Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ BusquedaTextField(), ], )), SizedBox(width: 5), BotonBuscar() ], ); } else { return Column( children: [ Row( children: [BusquedaTextField()], ), SizedBox(height: 15), Row( children: [BotonBuscar()], ), ], ); } }, ), ), ), const SizedBox(height: 8), pvm.isLoading ? const Center(child: CircularProgressIndicator()) : Container(), tarjeta( Column( children: [ LayoutBuilder(builder: (context, constraints) { return SingleChildScrollView( scrollDirection: Axis.vertical, child: Scrollbar( controller: horizontalScrollController, interactive: true, thumbVisibility: true, thickness: 10.0, // Esto es opcional para cambiar el grosor child: SingleChildScrollView( controller: horizontalScrollController, scrollDirection: Axis.horizontal, child: ConstrainedBox( constraints: BoxConstraints( minWidth: isMobile ? constraints.maxWidth : screenWidth), child: DataTable( columnSpacing: columnSpacing, sortAscending: true, sortColumnIndex: 1, columns: [ DataColumn(label: Text(" ", style: estilo)), DataColumn( label: Text("FOLIO", style: estilo)), DataColumn( label: Text("NOMBRE", style: estilo)), DataColumn( label: Text("COMENTARIOS", style: estilo)), ], rows: registros, ), ), ), ), ); }), ], ), ), // PaginationButtons( // currentPage: pvm.pagina, // totalPages: pvm.totalPaginas, // onPageChanged: (i) => pvm.cambiarPagina(i), // ) ], ), ), ], ), ); } Widget BusquedaTextField() { return Expanded( flex: 4, child: AppTextField( prefixIcon: const Icon(Icons.search), etiqueta: 'Búsqueda por folio...', controller: _busqueda, hintText: 'Búsqueda por folio...', ), ); } Widget BotonBuscar() { return Expanded( flex: 2, child: botonElevated( accion: () async { // PedidoViewModel mvm = // Provider.of(context, listen: false); // await mvm.setIsLoading(true); // await mvm.setBusqueda(_busqueda.text); // await mvm.fetchPedidos(q: _busqueda.text); // await mvm.setBusqueda(""); // await mvm.setIsLoading(false); }, ), ); } }