From 8782d61718788e3018bac55aad415aa06aa1fc00 Mon Sep 17 00:00:00 2001 From: beatz174-bit Date: Sun, 23 Nov 2025 14:58:07 +1000 Subject: [PATCH] Sort pick list product search options alphabetically --- src/screens/ActivePickListScreen.test.tsx | 35 +++++++++++++++++++++++ src/screens/ActivePickListScreen.tsx | 14 +++++++-- 2 files changed, 46 insertions(+), 3 deletions(-) diff --git a/src/screens/ActivePickListScreen.test.tsx b/src/screens/ActivePickListScreen.test.tsx index 661e545..9e359ef 100644 --- a/src/screens/ActivePickListScreen.test.tsx +++ b/src/screens/ActivePickListScreen.test.tsx @@ -34,6 +34,17 @@ vi.mock('../hooks/dataHooks', () => ({ created_at: 0, updated_at: 0, }, + { + id: 'prod-3', + name: 'Apple Juice', + category: 'Drinks', + unit_type: 'unit', + bulk_name: 'box', + barcode: '333', + archived: false, + created_at: 0, + updated_at: 0, + }, ], usePickList: () => ({ id: 'list-1', area_id: 'area-1', created_at: 0 }), useAreas: () => [{ id: 'area-1', name: 'Front Counter', created_at: 0, updated_at: 0 }], @@ -100,6 +111,30 @@ describe('ActivePickListScreen product search', () => { }); }); + it('sorts the product options alphabetically', async () => { + const user = userEvent.setup(); + + render( + + + } /> + + , + ); + + const combobox = screen.getByRole('combobox'); + await user.click(combobox); + + const listbox = await screen.findByRole('listbox'); + const options = within(listbox).getAllByRole('option'); + + expect(options.map((option) => option.textContent)).toEqual([ + 'Apple Juice (Drinks)', + 'Chips (Snacks)', + 'Cola (Drinks)', + ]); + }); + it('updates an existing pick item when the same packaging is selected', async () => { pickItemsMock.mockReturnValue([ { diff --git a/src/screens/ActivePickListScreen.tsx b/src/screens/ActivePickListScreen.tsx index 69bacd8..b80cf79 100644 --- a/src/screens/ActivePickListScreen.tsx +++ b/src/screens/ActivePickListScreen.tsx @@ -48,15 +48,23 @@ export const ActivePickListScreen = () => { [areas, pickList?.area_id], ); + const sortedProducts = useMemo( + () => + [...products].sort((a, b) => + a.name.localeCompare(b.name, undefined, { sensitivity: 'base' }), + ), + [products], + ); + const filteredProducts = useMemo(() => { const normalizedQuery = query.trim().toLowerCase(); - if (!normalizedQuery) return products; + if (!normalizedQuery) return sortedProducts; - return products.filter((product) => { + return sortedProducts.filter((product) => { const searchableText = `${product.name} ${product.category} ${product.barcode ?? ''}`.toLowerCase(); return searchableText.includes(normalizedQuery); }); - }, [products, query]); + }, [sortedProducts, query]); useEffect(() => { if (!selectedProduct) return;