From 0d6f6d2e966991ceebb00b45f1c67a10f2eb0357 Mon Sep 17 00:00:00 2001 From: beatz174-bit Date: Sun, 23 Nov 2025 09:54:54 +1000 Subject: [PATCH] Improve pick list product search --- src/screens/AddItemScreen.test.tsx | 3 +- src/screens/AddItemScreen.tsx | 62 ++++++++++++++++++------------ 2 files changed, 38 insertions(+), 27 deletions(-) diff --git a/src/screens/AddItemScreen.test.tsx b/src/screens/AddItemScreen.test.tsx index 44c3ea8..c11b174 100644 --- a/src/screens/AddItemScreen.test.tsx +++ b/src/screens/AddItemScreen.test.tsx @@ -55,9 +55,8 @@ describe('AddItemScreen product search', () => { ); await user.type(screen.getByPlaceholderText(/search products/i), 'cola'); - await user.click(screen.getByLabelText(/product/i)); - expect(screen.getByRole('option', { name: /cola \(drinks\)/i })).toBeVisible(); + expect(await screen.findByRole('option', { name: /cola \(drinks\)/i })).toBeVisible(); expect(screen.queryByRole('option', { name: /chips \(snacks\)/i })).not.toBeInTheDocument(); }); }); diff --git a/src/screens/AddItemScreen.tsx b/src/screens/AddItemScreen.tsx index 69879b3..62b2759 100644 --- a/src/screens/AddItemScreen.tsx +++ b/src/screens/AddItemScreen.tsx @@ -1,7 +1,7 @@ import { + Autocomplete, Button, Container, - MenuItem, Stack, TextField, Typography, @@ -20,7 +20,7 @@ export const AddItemScreen = () => { const db = useDatabase(); const items = usePickItems(id); const products = useProducts(); - const [productId, setProductId] = useState(''); + const [selectedProduct, setSelectedProduct] = useState(null); const [query, setQuery] = useState(''); const [units, setUnits] = useState(1); const [bulk, setBulk] = useState(0); @@ -47,13 +47,15 @@ export const AddItemScreen = () => { }, [availableProducts, query]); useEffect(() => { - if (!productId) return; - if (!filteredProducts.some((product) => product.id === productId)) { - setProductId(''); + if (!selectedProduct) return; + if (!filteredProducts.some((product) => product.id === selectedProduct.id)) { + setSelectedProduct(null); } - }, [filteredProducts, productId]); + }, [filteredProducts, selectedProduct]); const addItem = async () => { + const productId = selectedProduct?.id; + if (!id || !productId || existingProductIds.has(productId)) return; await db.pickItems.add({ id: uuidv4(), @@ -74,28 +76,38 @@ export const AddItemScreen = () => { Add Item - setQuery(event.target.value)} - InputProps={{ startAdornment: {} }} - /> - `${option.name} (${option.category})`} + isOptionEqualToValue={(option, value) => option.id === value.id} + value={selectedProduct} + onChange={(_, value) => setSelectedProduct(value)} + inputValue={query} + onInputChange={(_, value) => setQuery(value)} + filterOptions={(options) => options} + noOptionsText={query.trim() ? 'No matching products' : 'No products available'} fullWidth - value={productId} - onChange={(event) => setProductId(event.target.value)} - > - {filteredProducts.map((product) => ( - - {product.name} ({product.category}) - - ))} - + renderInput={(params) => ( + + + + + {params.InputProps.startAdornment} + + ), + }} + /> + )} + /> -