From b059ea3128cfc65dbda4215ef2f9a21d2216d2ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cau=C3=AA=20Faleiros?= Date: Mon, 10 Aug 2026 10:36:41 -0300 Subject: [PATCH] Paginate registration lists --- src/pages/Registrations.tsx | 79 +++++++++++++++++++++++++++++++++++-- 1 file changed, 75 insertions(+), 4 deletions(-) diff --git a/src/pages/Registrations.tsx b/src/pages/Registrations.tsx index 242bfe0..69d3720 100644 --- a/src/pages/Registrations.tsx +++ b/src/pages/Registrations.tsx @@ -11,11 +11,13 @@ import { saveCatalogProduct, saveConsumptionReference } from '../dataService'; +import PaginationControls from '../components/PaginationControls'; import type { CatalogCategory, CatalogProduct, CatalogProductType, CatalogSummary, ConsumptionReference } from '../types'; import { formatColorLabel } from '../displayFormatters'; type RegistrationTab = 'products' | 'categories' | 'references'; type SaveStatus = 'idle' | 'saving' | 'saved' | 'error'; +type RegistrationPagination = Record; const emptyCatalog: CatalogSummary = { categories: [], @@ -111,6 +113,11 @@ const Registrations = () => { const [isLoading, setIsLoading] = useState(true); const [activeTab, setActiveTab] = useState('products'); const [productFilter, setProductFilter] = useState<'all' | CatalogProductType>('all'); + const [pagination, setPagination] = useState({ + products: { page: 1, pageSize: 20 }, + categories: { page: 1, pageSize: 20 }, + references: { page: 1, pageSize: 20 }, + }); const [status, setStatus] = useState('idle'); const [feedback, setFeedback] = useState(''); const appliedSkuPrefillRef = useRef(''); @@ -247,6 +254,28 @@ const Registrations = () => { return catalog.products.filter(product => product.type === productFilter); }, [catalog.products, productFilter]); + const updatePagination = (tab: RegistrationTab, patch: Partial) => { + setPagination(current => ({ + ...current, + [tab]: { ...current[tab], ...patch } + })); + }; + + const productTotalPages = Math.ceil(filteredProducts.length / pagination.products.pageSize); + const safeProductPage = Math.min(pagination.products.page, productTotalPages || 1); + const productStartIndex = (safeProductPage - 1) * pagination.products.pageSize; + const paginatedProducts = filteredProducts.slice(productStartIndex, productStartIndex + pagination.products.pageSize); + + const categoryTotalPages = Math.ceil(catalog.categories.length / pagination.categories.pageSize); + const safeCategoryPage = Math.min(pagination.categories.page, categoryTotalPages || 1); + const categoryStartIndex = (safeCategoryPage - 1) * pagination.categories.pageSize; + const paginatedCategories = catalog.categories.slice(categoryStartIndex, categoryStartIndex + pagination.categories.pageSize); + + const referenceTotalPages = Math.ceil(catalog.consumptionReferences.length / pagination.references.pageSize); + const safeReferencePage = Math.min(pagination.references.page, referenceTotalPages || 1); + const referenceStartIndex = (safeReferencePage - 1) * pagination.references.pageSize; + const paginatedReferences = catalog.consumptionReferences.slice(referenceStartIndex, referenceStartIndex + pagination.references.pageSize); + const runAction = async (action: () => Promise, successMessage: string) => { setStatus('saving'); setFeedback(''); @@ -473,7 +502,10 @@ const Registrations = () => {
- {filteredProducts.map(product => ( + {paginatedProducts.map(product => (
@@ -512,6 +544,19 @@ const Registrations = () => {
Nenhum produto cadastrado.
)}
+ updatePagination('products', { page })} + onPageSizeChange={(pageSize) => updatePagination('products', { page: 1, pageSize })} + />
@@ -662,7 +707,7 @@ const Registrations = () => {
- {catalog.categories.map(category => ( + {paginatedCategories.map(category => (

{category.name}

@@ -675,6 +720,19 @@ const Registrations = () => { ))} {!catalog.categories.length &&
Nenhuma categoria cadastrada.
}
+ updatePagination('categories', { page })} + onPageSizeChange={(pageSize) => updatePagination('categories', { page: 1, pageSize })} + />
@@ -710,7 +768,7 @@ const Registrations = () => {
- {catalog.consumptionReferences.map(reference => ( + {paginatedReferences.map(reference => (
@@ -768,6 +826,19 @@ const Registrations = () => {
)}
+ updatePagination('references', { page })} + onPageSizeChange={(pageSize) => updatePagination('references', { page: 1, pageSize })} + />