diff --git a/backlog/features.json b/backlog/features.json index c2750c1..0dcd34d 100644 --- a/backlog/features.json +++ b/backlog/features.json @@ -8146,7 +8146,7 @@ "description": "Admin orders page shows only 20 orders with no pagination. Add offset/limit controls, prev/next buttons, and total counter.", "priority": "med", "risk": "low", - "status": "pending", + "status": "in_progress", "created_at": "2026-08-26", "gates": { "reviewer": false, diff --git a/project/apps/admin/src/app/(dashboard)/orders/page.tsx b/project/apps/admin/src/app/(dashboard)/orders/page.tsx index 9a90c2c..a658a6e 100644 --- a/project/apps/admin/src/app/(dashboard)/orders/page.tsx +++ b/project/apps/admin/src/app/(dashboard)/orders/page.tsx @@ -65,6 +65,9 @@ export default function OrdersPage() { const [filterState, setFilterState] = useState(''); const [search, setSearch] = useState(''); const [debouncedSearch, setDebouncedSearch] = useState(''); + const [total, setTotal] = useState(0); + const [offset, setOffset] = useState(0); + const limit = 20; useEffect(() => { const t = setTimeout(() => setDebouncedSearch(search), 400); @@ -78,14 +81,21 @@ export default function OrdersPage() { const data = await ordersApi.list({ status: filterState || undefined, q: debouncedSearch || undefined, - limit: 20, + limit, + offset, }); setOrders(data.items); + setTotal(data.total); } catch (err) { setError(err instanceof Error ? err.message : 'Error al cargar'); } finally { setLoading(false); } + }, [filterState, debouncedSearch, offset]); + + // Reset to first page when filters change + useEffect(() => { + setOffset(0); }, [filterState, debouncedSearch]); useEffect(() => { load(); }, [load]); @@ -95,7 +105,7 @@ export default function OrdersPage() { {/* Header */}
{orders?.length ?? 0} pedidos
+{total} pedidos
+ Mostrando {offset + 1}–{Math.min(offset + limit, total)} de {total} +
+