From 32b2e3eadaab15815d02db79ed000062ef23f71f Mon Sep 17 00:00:00 2001 From: beatz174-bit Date: Sun, 23 Nov 2025 15:00:05 +1000 Subject: [PATCH] Sort pick lists alphabetically --- src/screens/PickListsScreen.test.tsx | 54 ++++++++++++++++++++++++++++ src/screens/PickListsScreen.tsx | 21 ++++++++--- 2 files changed, 71 insertions(+), 4 deletions(-) create mode 100644 src/screens/PickListsScreen.test.tsx diff --git a/src/screens/PickListsScreen.test.tsx b/src/screens/PickListsScreen.test.tsx new file mode 100644 index 0000000..b253ca8 --- /dev/null +++ b/src/screens/PickListsScreen.test.tsx @@ -0,0 +1,54 @@ +import { MemoryRouter } from 'react-router-dom'; +import { render, screen, within } from '@testing-library/react'; +import { describe, expect, it, vi } from 'vitest'; +import { PickListsScreen } from './PickListsScreen'; + +const areasMock = [ + { id: 'area-1', name: 'Front Counter', created_at: 0, updated_at: 0 }, + { id: 'area-2', name: 'back room', created_at: 0, updated_at: 0 }, + { id: 'area-3', name: 'Cafe', created_at: 0, updated_at: 0 }, +]; + +const pickListsMock = [ + { id: 'list-2', area_id: 'area-2', created_at: 3 }, + { id: 'list-3', area_id: 'area-3', created_at: 4 }, + { id: 'list-1', area_id: 'area-1', created_at: 5 }, +]; + +vi.mock('../hooks/dataHooks', () => ({ + usePickLists: () => pickListsMock, + useAreas: () => areasMock, +})); + +vi.mock('../context/DBProvider', () => ({ + useDatabase: () => ({ + pickItems: { + where: () => ({ + equals: () => ({ delete: vi.fn() }), + }), + }, + pickLists: { + update: vi.fn(), + delete: vi.fn(), + where: () => ({ + equals: () => ({ delete: vi.fn() }), + }), + }, + }), +})); + +describe('PickListsScreen sorting', () => { + it('sorts pick lists alphabetically by area name', () => { + render( + + + , + ); + + const listItems = screen.getAllByRole('listitem'); + + expect(within(listItems[0]).getByText('back room')).toBeVisible(); + expect(within(listItems[1]).getByText('Cafe')).toBeVisible(); + expect(within(listItems[2]).getByText('Front Counter')).toBeVisible(); + }); +}); diff --git a/src/screens/PickListsScreen.tsx b/src/screens/PickListsScreen.tsx index 805c45d..5cad426 100644 --- a/src/screens/PickListsScreen.tsx +++ b/src/screens/PickListsScreen.tsx @@ -31,11 +31,24 @@ export const PickListsScreen = () => { const [areaId, setAreaId] = useState(''); const [notes, setNotes] = useState(''); - const sortedLists = useMemo(() => { - return [...lists].sort((a, b) => a.created_at - b.created_at); - }, [lists]); + const areaNameById = useMemo(() => { + const map = new Map(); + areas.forEach((area) => map.set(area.id, area.name)); + return map; + }, [areas]); - const getAreaName = (areaId: string) => areas.find((a) => a.id === areaId)?.name ?? 'Unknown area'; + const sortedLists = useMemo(() => { + const locale = new Intl.Collator(undefined, { sensitivity: 'base' }); + return [...lists].sort((a, b) => { + const nameA = areaNameById.get(a.area_id) ?? 'Unknown area'; + const nameB = areaNameById.get(b.area_id) ?? 'Unknown area'; + const nameComparison = locale.compare(nameA, nameB); + if (nameComparison !== 0) return nameComparison; + return a.created_at - b.created_at; + }); + }, [areaNameById, lists]); + + const getAreaName = (areaId: string) => areaNameById.get(areaId) ?? 'Unknown area'; const openEdit = (list: PickList) => { setEditingList(list);