Selaa lähdekoodia

Buscador productos en pedido form

OscarGil03 1 vuosi sitten
vanhempi
commit
23d40ed69d

+ 5 - 1
lib/viewmodels/producto_view_model.dart

@@ -28,13 +28,17 @@ class ProductoViewModel<T> extends ChangeNotifier {
   Future<List<Producto>> fetchRegistros(
       {CategoriaProducto? categoriaProducto,
       String? q,
-      bool segmentar = false}) async {
+      bool segmentar = false,
+      int limitee = 10}) async {
     Map<String, String> parametros = {
       "ordenar": "nombre-asc",
       "pagina": "$pagina",
       "limite": "$limite",
       "expand": "categoria"
     };
+    if (limitee == -1) {
+      parametros['limite'] = limitee.toString();
+    }
     if (_busqueda.isNotEmpty) {
       parametros["q"] = _busqueda;
     }

+ 5 - 2
lib/viewmodels/toping_view_model.dart

@@ -23,7 +23,7 @@ class TopingViewModel extends ChangeNotifier {
 
   int pagina = 1;
   int totalPaginas = 1;
-  int limite = 25;
+  int limite = 10;
 
   setBusqueda(String value) {
     _busqueda = value;
@@ -40,13 +40,16 @@ class TopingViewModel extends ChangeNotifier {
   }
 
   Future<List<Toping>> fetchRegistros(
-      {String? q, bool segmentar = false}) async {
+      {String? q, bool segmentar = false, int limitee = 10}) async {
     Map<String, String> parametros = {
       "ordenar": "id-desc",
       "pagina": "$pagina",
       "limite": "$limite",
       "expand": "mediaToping,categoriaToping"
     };
+    if (limitee == -1) {
+      parametros['limite'] = limitee.toString();
+    }
     if (_busqueda.isNotEmpty) {
       parametros["q"] = _busqueda;
     }

+ 101 - 1
lib/views/pedido/pedido_form.dart

@@ -2,12 +2,15 @@ import 'dart:async';
 
 import 'package:flutter/foundation.dart';
 import 'package:flutter/material.dart';
+import 'package:provider/provider.dart';
 import 'package:yoshi_papas_app/widgets/widgets_components.dart';
 import '../../themes/themes.dart';
 import '../../models/models.dart';
 import '../../viewmodels/viewmodels.dart';
 import 'package:collection/collection.dart';
 
+import '../../widgets/widgets.dart';
+
 class PedidoForm extends StatefulWidget {
   @override
   _PedidoFormState createState() => _PedidoFormState();
@@ -23,6 +26,7 @@ class ItemCarrito {
 }
 
 class _PedidoFormState extends State<PedidoForm> {
+  final _busqueda = TextEditingController(text: '');
   CategoriaProductoViewModel cvm = CategoriaProductoViewModel();
   ProductoViewModel pvm = ProductoViewModel();
   bool _isLoading = false;
@@ -51,6 +55,7 @@ class _PedidoFormState extends State<PedidoForm> {
   Map<int, List<int>> selectedToppingsByCategory = {};
   Map<String, bool> toppingOptions = {};
   List<int> _selectedToppings = [];
+  bool _estadoBusqueda = false;
 
   double calcularTotalPedido() {
     double total = 0;
@@ -68,6 +73,16 @@ class _PedidoFormState extends State<PedidoForm> {
     _cargarTopingsDisponibles();
   }
 
+  void _limpiarBusqueda() async {
+    setState(() {
+      _busqueda.text = '';
+      _estadoBusqueda = false;
+    });
+    // Carga nuevamente las categorías y productos iniciales.
+    await cargarCategoriasIniciales();
+    // Opcionalmente, puedes llamar a una función específica para cargar productos iniciales si tienes una.
+  }
+
   void _cargarCategoriasDeTopings() async {
     var categoriasObtenidas = await _categoriaTopingViewModel.fetchRegistros();
     setState(() {
@@ -154,6 +169,45 @@ class _PedidoFormState extends State<PedidoForm> {
     }
   }
 
+  Future<void> realizarBusqueda() async {
+    setState(() {
+      _isLoading = true;
+      _estadoBusqueda = true; // Establecer estado de búsqueda
+    });
+    _busqueda.text = _busqueda.text.trim();
+
+    // Buscar productos basados en el texto de búsqueda
+    //var productosResultantes = await pvm.fetchRegistros(q: _busqueda.text);
+    _busqueda.text = _busqueda.text.trim();
+    await Provider.of<ProductoViewModel>(context, listen: false)
+        .setIsLoading(true);
+    await Provider.of<ProductoViewModel>(context, listen: false)
+        .setBusqueda(_busqueda.text);
+    var productosResultantes =
+        await Provider.of<ProductoViewModel>(context, listen: false)
+            .fetchRegistros();
+    await Provider.of<ProductoViewModel>(context, listen: false)
+        .setBusqueda("");
+    await Provider.of<ProductoViewModel>(context, listen: false)
+        .setIsLoading(false);
+
+    // Extraer los IDs únicos de las categorías de los productos resultantes
+    var idsCategoriasUnicos =
+        productosResultantes.map((p) => p.idCategoria).toSet();
+
+    // Filtrar las categorías localmente para incluir solo las que coinciden con los IDs extraídos
+    var categoriasFiltradas = cvm.categoriaProductos
+        .where((categoria) => idsCategoriasUnicos.contains(categoria.id))
+        .toList();
+
+    setState(() {
+      _isLoading = false;
+      productos = productosResultantes;
+      categorias = categoriasFiltradas;
+      categoriaSeleccionada = categorias.isNotEmpty ? categorias.first : null;
+    });
+  }
+
   @override
   void dispose() {
     horizontalScrollController.dispose();
@@ -180,7 +234,8 @@ class _PedidoFormState extends State<PedidoForm> {
       _isLoading = true;
       categoriaSeleccionada = categoria;
     });
-    productos = await pvm.fetchRegistros(categoriaProducto: categoria);
+    productos =
+        await pvm.fetchRegistros(categoriaProducto: categoria, limitee: -1);
     if (!mounted) return;
     setState(() => _isLoading = false);
   }
@@ -475,6 +530,38 @@ class _PedidoFormState extends State<PedidoForm> {
     // Asumiendo que tienes un método para obtener los productos según la categoría seleccionada
     return Column(
       children: [
+        Row(
+          children: [
+            Expanded(
+              flex: 8,
+              child: AppTextField(
+                prefixIcon: const Icon(Icons.search),
+                etiqueta: 'Búsqueda por nombre...',
+                controller: _busqueda,
+                hintText: 'Búsqueda por nombre...',
+                suffixIcon: IconButton(
+                  icon: Icon(
+                    Icons.cancel,
+                    color: AppTheme.primary,
+                  ),
+                  onPressed: () {
+                    _limpiarBusqueda();
+                  },
+                ),
+              ),
+            ),
+            const SizedBox(width: 10),
+            Expanded(
+              flex: 2,
+              child: botonElevated(
+                accion: () async {
+                  realizarBusqueda();
+                },
+              ),
+            ),
+          ],
+        ),
+        const SizedBox(height: 5),
         _buildCategoryButtons(),
         const SizedBox(height: 10),
         Expanded(
@@ -486,6 +573,12 @@ class _PedidoFormState extends State<PedidoForm> {
             itemCount: productos.length,
             itemBuilder: (context, index) {
               final producto = productos[index];
+              String nombreCategoria = categorias
+                  .firstWhere(
+                    (cat) => cat.id == producto.idCategoria,
+                    orElse: () => CategoriaProducto(nombre: "Desconocida"),
+                  )
+                  .nombre!;
               return Card(
                 child: InkWell(
                   onTap: () {
@@ -518,6 +611,13 @@ class _PedidoFormState extends State<PedidoForm> {
                             fontWeight: FontWeight.bold,
                             color: Color(0xFF008000)),
                       ),
+                      _estadoBusqueda
+                          ? Text(
+                              nombreCategoria,
+                              style: const TextStyle(
+                                  fontSize: 16, fontWeight: FontWeight.bold),
+                            )
+                          : Container()
                     ],
                   ),
                 ),