3 Commits 337dfef58a ... fd5f279b15

Author SHA1 Message Date
  c90Beretta fd5f279b15 Cambios de disenio y funcionalidad en el flujo de pestanias 1 month ago
  c90Beretta 9930f9b9f5 minor fixes 1 month ago
  c90Beretta be5653a1f4 Creacion Pedido Implementaciones de funcionalidad y cambios al disenio 1 month ago

+ 2 - 0
lib/main.dart

@@ -2,6 +2,7 @@ import 'package:flutter/material.dart';
 import 'package:flutter/services.dart';
 import 'package:provider/provider.dart';
 import 'package:sqflite_common_ffi/sqflite_ffi.dart';
+import 'package:turquessa_mesas_hoster/mvvm/viewmodels/creacion_pedido_view_model.dart';
 import 'package:turquessa_mesas_hoster/mvvm/views/pedido/creacion_pedido_screen.dart';
 import 'dart:io';
 
@@ -64,6 +65,7 @@ void main() async {
       ChangeNotifierProvider(
           create: (_) => MesaViewModel(mesaRepository: mesaRepository)),
       ChangeNotifierProvider(create: (_) => CategoriaProductoViewModel()),
+      ChangeNotifierProvider(create: (_) => CreacionPedidoViewModel())
       // Agrega aquí cualquier otro provider que necesites
     ], child: const MyApp()));
   });

+ 168 - 0
lib/mvvm/viewmodels/creacion_pedido_view_model.dart

@@ -0,0 +1,168 @@
+import 'package:flutter/material.dart';
+import 'package:turquessa_mesas_hoster/core/models/categoria_producto_model.dart';
+import 'package:turquessa_mesas_hoster/core/models/media_model.dart';
+import 'package:turquessa_mesas_hoster/core/models/pedido_model.dart';
+import 'package:turquessa_mesas_hoster/core/models/producto_model.dart';
+
+class CreacionPedidoViewModel extends ChangeNotifier {
+  // Lista de productos disponibles para elegir
+  final List<Producto> _productosDisponibles = <Producto>[
+    Producto(
+      id: 1, // Añadido id para facilitar la búsqueda
+      idCategoria: 1,
+      nombre: 'Café Latte',
+      descripcion: 'Café con leche y espuma',
+      imagen: 'https://example.com/cafe_latte.jpg',
+      venta: 1,
+      existencia: 50,
+      precio: 4.50,
+      verMenu: 1,
+      codigo: 'CL001',
+      descuento: '10%',
+      toping: 1,
+      topings: [
+        Producto(id: 1, nombre: 'Crema Batida', precio: 0.50),
+        Producto(id: 2, nombre: 'Chocolate', precio: 0.75),
+      ],
+      activo: 1,
+      media: [],
+      idWeb: 101,
+      sincronizado: 'Sí',
+    ),
+    Producto(
+      id: 2,
+      idCategoria: 1,
+      nombre: 'Pizza al horno',
+      descripcion: 'Pizza tradicional italiana',
+      imagen: 'https://example.com/pizza.jpg',
+      venta: 1,
+      existencia: 50,
+      precio: 4.50,
+      verMenu: 1,
+      codigo: 'PZ001',
+      descuento: '10%',
+      toping: 1,
+      topings: [
+        Producto(id: 3, nombre: 'Extra queso', precio: 0.50),
+        Producto(id: 4, nombre: 'Champiñones', precio: 0.75),
+      ],
+      activo: 1,
+      media: [],
+      idWeb: 102,
+      sincronizado: 'Sí',
+    ),
+    Producto(
+      id: 3,
+      idCategoria: 1,
+      nombre: 'Capuchino',
+      descripcion: 'Café con espuma de leche',
+      imagen: 'https://example.com/capuchino.jpg',
+      venta: 1,
+      existencia: 50,
+      precio: 4.50,
+      verMenu: 1,
+      codigo: 'CP001',
+      descuento: '10%',
+      toping: 1,
+      topings: [
+        Producto(id: 1, nombre: 'Crema Batida', precio: 0.50),
+        Producto(id: 5, nombre: 'Canela', precio: 0.25),
+      ],
+      activo: 1,
+      media: [],
+      idWeb: 103,
+      sincronizado: 'Sí',
+    ),
+    Producto(
+      id: 4,
+      idCategoria: 1,
+      nombre: 'Pastel de Chocolate',
+      descripcion: 'Pastel casero de chocolate',
+      imagen: 'https://example.com/pastel.jpg',
+      venta: 1,
+      existencia: 50,
+      precio: 4.50,
+      verMenu: 1,
+      codigo: 'PC001',
+      descuento: '10%',
+      toping: 1,
+      topings: [
+        Producto(id: 6, nombre: 'Helado', precio: 1.00),
+        Producto(id: 7, nombre: 'Frutos rojos', precio: 0.75),
+      ],
+      activo: 1,
+      media: [],
+      idWeb: 104,
+      sincronizado: 'Sí',
+    )
+  ];
+
+  // Lista del carrito que se mostrará en el DataTable
+  final List<Producto> _carrito = [];
+
+  // Getters
+  List<Producto> get productosDisponibles => _productosDisponibles;
+  List<Producto> get carrito => _carrito;
+
+  // Método para agregar un producto al carrito
+  void agregarAlCarrito(Producto producto) {
+    // Buscar si el producto ya está en el carrito
+    int index = _carrito.indexWhere((p) => p.id == producto.id);
+
+    if (index != -1) {
+      // Si ya existe en el carrito, incrementar cantidad
+      _carrito[index].venta = (_carrito[index].venta ?? 0) + 1;
+    } else {
+      // Si no existe, crear una copia del producto y añadirlo al carrito
+      final productoCarrito = Producto(
+        id: producto.id,
+        nombre: producto.nombre,
+        precio: producto.precio,
+        descripcion: producto.descripcion,
+        imagen: producto.imagen,
+        venta: 1, // Iniciar con cantidad 1
+        codigo: producto.codigo,
+        topings: producto.topings,
+        // Otros atributos que necesites copiar
+      );
+      _carrito.add(productoCarrito);
+    }
+    notifyListeners();
+  }
+
+  // Método para reducir la cantidad de un producto en el carrito
+  void reducirDelCarrito(Producto producto) {
+    int index = _carrito.indexWhere((p) => p.id == producto.id);
+
+    if (index != -1) {
+      if (_carrito[index].venta! > 1) {
+        // Reducir cantidad si es mayor que 1
+        _carrito[index].venta = _carrito[index].venta! - 1;
+      } else {
+        // Eliminar del carrito si la cantidad llega a 0
+        _carrito.removeAt(index);
+      }
+      notifyListeners();
+    }
+  }
+
+  // Método para eliminar un producto específico del carrito
+  void eliminarDelCarrito(Producto producto) {
+    _carrito.removeWhere((p) => p.id == producto.id);
+    notifyListeners();
+  }
+
+  // Método para limpiar todo el carrito
+  void limpiarCarrito() {
+    _carrito.clear();
+    notifyListeners();
+  }
+
+  // Método para calcular el total del carrito
+  double calcularTotalCarrito() {
+    return _carrito.fold(
+        0,
+        (total, producto) =>
+            total + ((producto.precio ?? 0) * (producto.venta ?? 0)));
+  }
+}

+ 101 - 36
lib/mvvm/views/home/home_screen.dart

@@ -2,6 +2,7 @@ import 'package:flutter/material.dart';
 import 'package:provider/provider.dart';
 import 'package:turquessa_mesas_hoster/core/models/mesa_model.dart';
 import 'package:turquessa_mesas_hoster/utils/widgets/custom_appbar.dart';
+import 'package:turquessa_mesas_hoster/utils/widgets/custom_card.dart';
 import 'package:turquessa_mesas_hoster/utils/widgets/navigation_rail.dart';
 
 import '../../../utils/widgets/ordenes_card.dart';
@@ -57,6 +58,7 @@ class Formulario extends State<HomeScreen> {
           children: [
             CustomNavigationRail(selectedIndex: _selectedIndex),
             Expanded(
+              flex: 1,
               child: Center(
                 child: Container(
                   decoration: const BoxDecoration(
@@ -65,7 +67,7 @@ class Formulario extends State<HomeScreen> {
                   child: GridView.builder(
                     gridDelegate:
                         const SliverGridDelegateWithFixedCrossAxisCount(
-                      crossAxisCount: 4,
+                      crossAxisCount: 3,
                       childAspectRatio: 1.0,
                       crossAxisSpacing: 10.0,
                       mainAxisSpacing: 10.0,
@@ -162,13 +164,40 @@ class TablaDetalles extends StatelessWidget {
                     const Icon(Icons.table_restaurant,
                         color: Colors.white, size: 24),
                     const SizedBox(width: 8),
-                    Text(
-                      table.nombre ?? 'Mesa sin nombre',
-                      style: const TextStyle(
-                        color: Colors.white,
-                        fontSize: 20,
-                        fontWeight: FontWeight.bold,
-                      ),
+                    Column(
+                      crossAxisAlignment: CrossAxisAlignment.start,
+                      children: [
+                        Text(
+                          table.nombre ?? 'Mesa sin nombre',
+                          style: const TextStyle(
+                            color: Colors.white,
+                            fontSize: 20,
+                            fontWeight: FontWeight.bold,
+                          ),
+                        ),
+                        const Row(
+                          crossAxisAlignment: CrossAxisAlignment.center,
+                          mainAxisSize: MainAxisSize.min,
+                          children: [
+                            Icon(
+                              Icons.access_time_rounded,
+                              color: Colors.white70,
+                              size: 16,
+                            ),
+                            Padding(
+                              padding: EdgeInsets.only(left: 4),
+                              child: Text(
+                                "03:56",
+                                style: TextStyle(
+                                  fontSize: 14,
+                                  color: Colors.white,
+                                  fontWeight: FontWeight.normal,
+                                ),
+                              ),
+                            ),
+                          ],
+                        )
+                      ],
                     ),
                   ],
                 ),
@@ -179,18 +208,16 @@ class TablaDetalles extends StatelessWidget {
                     color: Colors.white.withOpacity(0.2),
                     borderRadius: BorderRadius.circular(20),
                   ),
-                  child: Text(
-                    table.activa! ? 'Activa' : 'Inactiva',
-                    style: const TextStyle(
-                      color: Colors.white,
-                      fontWeight: FontWeight.bold,
-                    ),
-                  ),
+                  child: Text(table.activa! ? 'Activa' : 'Inactiva',
+                      style: const TextStyle(
+                        color: Colors.white,
+                        fontWeight: FontWeight.bold,
+                      )),
                 ),
               ],
             ),
           ),
-          // Contenido scrolleable
+
           Expanded(
             child: SingleChildScrollView(
               child: Padding(
@@ -198,19 +225,13 @@ class TablaDetalles extends StatelessWidget {
                 child: Column(
                   crossAxisAlignment: CrossAxisAlignment.start,
                   children: [
-                    Text(
-                      'ID: ${table.id}',
-                      style: const TextStyle(fontSize: 16),
-                    ),
-                    const SizedBox(height: 16),
                     Row(
                       children: [
-                        const Text('Estado: '),
                         Text(
-                          status.toString().split('.').last,
+                          "Estatus: ${status.toString().split('.').last}",
                           style: const TextStyle(
                             fontWeight: FontWeight.bold,
-                            color: Colors.blue,
+                            color: Colors.black,
                           ),
                         ),
                       ],
@@ -218,18 +239,62 @@ class TablaDetalles extends StatelessWidget {
                     // const SizedBox(height: 16),
                     // IconDataByStatus(status: status),
                     const SizedBox(height: 16),
-                    IconButton.outlined(
-                        style: const ButtonStyle(
-                            backgroundColor:
-                                MaterialStatePropertyAll(Colors.lightGreen)),
-                        onPressed: () {
-                          Navigator.of(context).pushNamed('creacion-pedido');
-                        },
-                        icon: const Icon(
-                          Icons.start_rounded,
-                          color: Colors.white,
-                        ))
-                    // const OrdenesScreen(),
+                    Container(
+                      padding: const EdgeInsets.all(16),
+                      decoration: BoxDecoration(
+                        color: Colors.white,
+                        boxShadow: [
+                          BoxShadow(
+                            color: Colors.grey.withOpacity(0.2),
+                            blurRadius: 1,
+                            spreadRadius: 1,
+                          )
+                        ],
+                        borderRadius: BorderRadius.circular(10),
+                        border: Border.all(color: Colors.grey.shade200),
+                      ),
+                      child: Column(children: [
+                        Row(
+                            mainAxisAlignment: MainAxisAlignment.spaceBetween,
+                            children: [
+                              const Text("Pedido Actual",
+                                  style: TextStyle(
+                                    fontWeight: FontWeight.bold,
+                                    color: Colors.black,
+                                  )),
+                              GestureDetector(
+                                onTap: () {
+                                  Navigator.of(context)
+                                      .pushNamed('creacion-pedido');
+                                },
+                                child: const Row(children: [
+                                  const Text("Ver detalle"),
+                                  const Icon(Icons.arrow_forward_ios_rounded),
+                                ]),
+                              )
+                            ]),
+                        const SizedBox(height: 10),
+                        const CustomProductCard(
+                          titulo: "Original Cheesse Meat burger with Chips",
+                          precio: "15.20",
+                          cantidad: 1,
+                        ),
+                        const SizedBox(height: 10),
+                        const CustomProductCard(
+                          titulo: "Original Cheesse Meat burger with Chips",
+                          precio: "15.20",
+                          cantidad: 1,
+                        ),
+                        const SizedBox(height: 10),
+                        const CustomProductCard(
+                          titulo: "Original Cheesse Meat burger with Chips",
+                          precio: "15.20",
+                          cantidad: 1,
+                        ),
+                      ]),
+                    ),
+
+                    //? const OrdenesScreen(),
                   ],
                 ),
               ),

+ 263 - 39
lib/mvvm/views/pedido/creacion_pedido_screen.dart

@@ -1,5 +1,10 @@
 import 'package:flutter/material.dart';
+import 'package:provider/provider.dart';
+import 'package:turquessa_mesas_hoster/core/models/producto_model.dart';
+import 'package:turquessa_mesas_hoster/mvvm/viewmodels/creacion_pedido_view_model.dart';
+import 'package:turquessa_mesas_hoster/utils/themes.dart';
 import 'package:turquessa_mesas_hoster/utils/widgets/custom_appbar.dart';
+import 'package:turquessa_mesas_hoster/utils/widgets/custom_card.dart';
 import 'package:turquessa_mesas_hoster/utils/widgets/navigation_rail.dart';
 
 class CreacionPedido extends StatefulWidget {
@@ -10,10 +15,19 @@ class CreacionPedido extends StatefulWidget {
 }
 
 class _CreacionPedidoState extends State<CreacionPedido> {
+  @override
+  void initState() {
+    // TODO: implement initState
+    super.initState();
+  }
+
   final _selectedIndex = 0;
 
   @override
   Widget build(BuildContext context) {
+    CreacionPedidoViewModel creacionPedidoViewModel =
+        Provider.of<CreacionPedidoViewModel>(context, listen: true);
+    List<Producto> listaPedido = creacionPedidoViewModel.productosDisponibles;
     return Container(
       decoration: const BoxDecoration(
           gradient: LinearGradient(
@@ -21,8 +35,8 @@ class _CreacionPedidoState extends State<CreacionPedido> {
               end: Alignment.topLeft,
               colors: [
             Color(0xFF7FD4D4),
-            Color(0xFFE5E5E5),
-            Color(0xFFFFFFFF),
+            Color.fromARGB(255, 141, 225, 225),
+            Color.fromARGB(255, 74, 156, 156),
           ])),
       child: Scaffold(
         backgroundColor: Colors.transparent,
@@ -33,55 +47,150 @@ class _CreacionPedidoState extends State<CreacionPedido> {
           children: [
             CustomNavigationRail(selectedIndex: _selectedIndex),
             Expanded(
-              flex: 5,
+              flex: 8,
               child: Container(
-                decoration: BoxDecoration(
-                  borderRadius: BorderRadius.circular(20),
+                decoration: const BoxDecoration(
                   color: Colors.white,
                 ),
-                child: Column(
+                child: const Column(
                   children: [
-                    const CategoryFilters(),
-                    Expanded(
-                      child: Container(
-                        padding: const EdgeInsets.all(8),
-                        child: GridView.builder(
-                          gridDelegate:
-                              const SliverGridDelegateWithFixedCrossAxisCount(
-                            crossAxisCount: 4,
-                            crossAxisSpacing: 10,
-                            mainAxisSpacing: 10,
-                          ),
-                          itemCount: 20,
-                          itemBuilder: (context, index) {
-                            return Container(
-                              decoration: BoxDecoration(
-                                color: Colors.grey.shade200,
-                                borderRadius: BorderRadius.circular(20),
-                              ),
-                              child: Center(
-                                child: Text(
-                                  'Item $index',
-                                  style: const TextStyle(fontSize: 20),
-                                ),
-                              ),
-                            );
-                          },
-                        ),
-                      ),
-                    ),
+                    CategoryFilters(),
+                    CategoryGrid(),
                   ],
                 ),
               ),
             ),
             Expanded(
-              flex: 3,
+              flex: 4,
               child: Container(
-                decoration: BoxDecoration(
-                  borderRadius: BorderRadius.circular(20),
+                decoration: const BoxDecoration(
                   color: Colors.white,
                 ),
-                child: const Text("test"),
+                child: Padding(
+                  padding: const EdgeInsets.all(8.0),
+                  child: Column(
+                    crossAxisAlignment: CrossAxisAlignment.start,
+                    children: [
+                      const Padding(
+                        padding: EdgeInsets.only(left: 10),
+                        child: Text(
+                          "Mesa 3: Palmeras",
+                          textAlign: TextAlign.start,
+                          style: TextStyle(
+                              fontSize: 40,
+                              fontWeight: FontWeight.bold,
+                              color: Colors.black),
+                        ),
+                      ),
+                      const Divider(),
+                      // En el DataTable
+                      SingleChildScrollView(
+                        scrollDirection: Axis.horizontal,
+                        child: SingleChildScrollView(
+                          scrollDirection: Axis.vertical,
+                          child: DataTable(
+                            columnSpacing: 16,
+                            horizontalMargin: 12,
+                            dataRowHeight: 60,
+                            headingRowHeight: 48,
+                            columns: const <DataColumn>[
+                              DataColumn(label: Text('Cant')),
+                              DataColumn(label: Text('Nombre')),
+                              DataColumn(label: Text('SubTotal')),
+                              DataColumn(label: Text('Acciones')),
+                            ],
+                            rows: creacionPedidoViewModel
+                                .carrito // Aquí usamos la lista de carrito
+                                .map(
+                                  (e) => DataRow(cells: [
+                                    DataCell(
+                                      Text(e.venta.toString()),
+                                    ),
+                                    DataCell(Text(e.nombre!)),
+                                    DataCell(
+                                      Text((e.precio! * e.venta!)
+                                          .toStringAsFixed(2)),
+                                    ),
+                                    DataCell(IconButton(
+                                      color: Colors.grey[600],
+                                      icon: const Icon(Icons.edit),
+                                      onPressed: () {
+                                        creacionPedidoViewModel
+                                            .eliminarDelCarrito(e);
+                                      },
+                                    )),
+                                  ]),
+                                )
+                                .toList(),
+                          ),
+                        ),
+                      ),
+                      Expanded(
+                        child: Column(
+                          children: [
+                            const SizedBox(
+                              height: 100,
+                              width: double.infinity,
+                            ),
+                            const Divider(),
+                            Row(
+                              mainAxisAlignment: MainAxisAlignment.spaceBetween,
+                              children: [
+                                const Text(
+                                  "Total",
+                                  style: TextStyle(
+                                      fontSize: 20,
+                                      fontWeight: FontWeight.bold),
+                                ),
+                                Text(
+                                  "\$${creacionPedidoViewModel.calcularTotalCarrito().toStringAsFixed(2)}",
+                                  style: const TextStyle(
+                                      fontSize: 20,
+                                      fontWeight: FontWeight.bold),
+                                ),
+                              ],
+                            ),
+                            const SizedBox(height: 10),
+                            Row(
+                              children: [
+                                Expanded(
+                                  flex: 9,
+                                  child: ElevatedButton(
+                                    style: const ButtonStyle(
+                                      backgroundColor: MaterialStatePropertyAll(
+                                          Colors.green),
+                                    ),
+                                    onPressed: () {},
+                                    child: const Text(
+                                      "Mandar a Preparacion",
+                                      style: TextStyle(color: Colors.white),
+                                    ),
+                                  ),
+                                ),
+                                Expanded(
+                                  flex: 1,
+                                  child: IconButton(
+                                    style: const ButtonStyle(
+                                        backgroundColor:
+                                            MaterialStatePropertyAll(
+                                                Colors.white),
+                                        iconColor: MaterialStatePropertyAll(
+                                            Colors.red)),
+                                    icon: const Icon(Icons.delete,
+                                        color: Colors.red),
+                                    onPressed: () {
+                                      creacionPedidoViewModel.limpiarCarrito();
+                                    },
+                                  ),
+                                ),
+                              ],
+                            ),
+                          ],
+                        ),
+                      ),
+                    ],
+                  ),
+                ),
               ),
             )
           ],
@@ -91,6 +200,121 @@ class _CreacionPedidoState extends State<CreacionPedido> {
   }
 }
 
+class CategoryGrid extends StatelessWidget {
+  const CategoryGrid({
+    super.key,
+  });
+
+  @override
+  Widget build(BuildContext context) {
+    CreacionPedidoViewModel creacionPedidoViewModel =
+        Provider.of<CreacionPedidoViewModel>(context);
+    List<Producto> listaProductos =
+        creacionPedidoViewModel.productosDisponibles;
+    return Expanded(
+      child: Container(
+        padding: const EdgeInsets.all(8),
+        child: GridView.builder(
+          gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
+            crossAxisCount: 3,
+            crossAxisSpacing: 10,
+            mainAxisSpacing: 15,
+          ),
+          itemCount: listaProductos.length,
+          itemBuilder: (context, index) {
+            int carritoIndex = creacionPedidoViewModel.carrito
+                .indexWhere((p) => p.id == listaProductos[index].id);
+            int cantidad = carritoIndex != -1
+                ? creacionPedidoViewModel.carrito[carritoIndex].venta!
+                : 0;
+
+            return Card(
+              shadowColor: Colors.grey.shade700,
+              surfaceTintColor: Colors.white,
+              child: Column(children: [
+                Padding(
+                  padding: const EdgeInsets.all(3),
+                  child: Container(
+                    height: 140,
+                    width: double.infinity,
+                    decoration: BoxDecoration(
+                      color: Colors.white,
+                      image: DecorationImage(
+                        image: NetworkImage(
+                            "https://picsum.photos/200/300?random=$index"),
+                        fit: BoxFit.cover,
+                      ),
+                    ),
+                  ),
+                ),
+                Center(
+                  child: Text(
+                    listaProductos[index].nombre ?? "Error",
+                    style: const TextStyle(
+                        fontWeight: FontWeight.bold,
+                        fontSize: 16,
+                        color: Colors.black),
+                  ),
+                ),
+                Text(
+                  "\$${listaProductos[index].precio}",
+                  textAlign: TextAlign.left,
+                  style: TextStyle(
+                    color: Colors.green[600],
+                    fontWeight: FontWeight.bold,
+                  ),
+                ),
+                const Spacer(),
+                Padding(
+                  padding: const EdgeInsets.symmetric(horizontal: 10),
+                  child: Row(
+                    mainAxisAlignment: MainAxisAlignment.spaceBetween,
+                    children: [
+                      IconButton(
+                          style: ButtonStyle(
+                              backgroundColor:
+                                  MaterialStatePropertyAll(AppTheme.primary)),
+                          onPressed: () {
+                            if (cantidad > 0) {
+                              creacionPedidoViewModel
+                                  .reducirDelCarrito(listaProductos[index]);
+                            }
+                          },
+                          icon: const Icon(
+                            Icons.remove,
+                            color: Colors.black,
+                          )),
+                      Text(
+                        "$cantidad",
+                        style: const TextStyle(
+                          fontSize: 20,
+                          fontWeight: FontWeight.bold,
+                        ),
+                      ),
+                      IconButton(
+                          style: ButtonStyle(
+                              backgroundColor:
+                                  MaterialStatePropertyAll(AppTheme.primary)),
+                          onPressed: () {
+                            creacionPedidoViewModel
+                                .agregarAlCarrito(listaProductos[index]);
+                          },
+                          icon: const Icon(
+                            Icons.add,
+                            color: Colors.black,
+                          )),
+                    ],
+                  ),
+                )
+              ]),
+            );
+          },
+        ),
+      ),
+    );
+  }
+}
+
 class CategoryFilters extends StatefulWidget {
   const CategoryFilters({super.key});
 

+ 87 - 0
lib/utils/widgets/custom_card.dart

@@ -0,0 +1,87 @@
+import 'package:flutter/material.dart';
+
+class CustomProductCard extends StatelessWidget {
+  final String? imageURL;
+  final String? titulo;
+  final String? precio;
+  final int? cantidad;
+  const CustomProductCard(
+      {super.key,
+      this.imageURL,
+      required this.titulo,
+      required this.precio,
+      required this.cantidad});
+
+  @override
+  Widget build(BuildContext context) {
+    return Container(
+      padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 10),
+      decoration: BoxDecoration(
+        color: Colors.white,
+        borderRadius: BorderRadius.circular(10),
+        border: Border.all(color: Colors.grey.shade200),
+      ),
+      child: Row(
+        children: [
+          // Imagen del producto
+          ClipRRect(
+            borderRadius: BorderRadius.circular(5),
+            child: Image.network(
+              'https://picsum.photos/200/300?random=3',
+              width: 80,
+              height: 80,
+              fit: BoxFit.cover,
+            ),
+          ),
+          const SizedBox(width: 10),
+          // Contenido del texto (título)
+          Expanded(
+            child: Column(
+              crossAxisAlignment: CrossAxisAlignment.start,
+              mainAxisSize: MainAxisSize.min,
+              children: [
+                Text(
+                  titulo ?? "Titulo Producto",
+                  softWrap: true,
+                  maxLines: 2,
+                  overflow: TextOverflow.ellipsis,
+                  style: const TextStyle(
+                    fontWeight: FontWeight.bold,
+                    fontSize: 14,
+                    color: Colors.black87,
+                  ),
+                ),
+                const SizedBox(height: 4),
+                // Precio
+                Row(
+                  mainAxisAlignment: MainAxisAlignment.spaceBetween,
+                  mainAxisSize: MainAxisSize.max,
+                  children: [
+                    Text(
+                      '\$$precio',
+                      style: TextStyle(
+                        fontSize: 16,
+                        fontWeight: FontWeight.bold,
+                        color: Colors.green[700],
+                      ),
+                    ),
+                    Text(
+                      "${cantidad}x",
+                      style: TextStyle(
+                        fontSize: 16,
+                        fontWeight: FontWeight.w500,
+                        color: Colors.grey[600],
+                      ),
+                    ),
+                  ],
+                ),
+              ],
+            ),
+          ),
+
+          // Cantidad
+        ],
+      ),
+    );
+  }
+}

+ 2 - 0
lib/utils/widgets/navigation_rail.dart

@@ -15,6 +15,8 @@ class Custom_NavigationRailState extends State<CustomNavigationRail> {
   @override
   Widget build(BuildContext context) {
     return NavigationRail(
+      minExtendedWidth: 100,
+      minWidth: 30,
       backgroundColor: Color.fromARGB(255, 25, 30, 41),
       selectedIndex: selectedIndex,
       onDestinationSelected: (int index) {