From bcf7787f37392b13a54497b7478a94ec8661ecd9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cau=C3=AA=20Faleiros?= Date: Tue, 11 Aug 2026 13:17:10 -0300 Subject: [PATCH] Paginate production order preview --- src/pages/Cutting.tsx | 89 ++++++++++++++++++++++++++----------------- 1 file changed, 53 insertions(+), 36 deletions(-) diff --git a/src/pages/Cutting.tsx b/src/pages/Cutting.tsx index f215938..297764f 100644 --- a/src/pages/Cutting.tsx +++ b/src/pages/Cutting.tsx @@ -159,6 +159,8 @@ const Cutting = () => { const [itemsPerPage, setItemsPerPage] = useState(10); const [isGeneratingOrders, setIsGeneratingOrders] = useState(false); const [isOrderPreviewOpen, setIsOrderPreviewOpen] = useState(false); + const [previewPage, setPreviewPage] = useState(1); + const [previewItemsPerPage, setPreviewItemsPerPage] = useState(10); const [editingCutRow, setEditingCutRow] = useState(null); const [quickCutEdit, setQuickCutEdit] = useState({}); const [isQuickCutEditSaving, setIsQuickCutEditSaving] = useState(false); @@ -364,6 +366,14 @@ const Cutting = () => { rowsAvailableForOrder.reduce((total, row) => total + row.suggestedCutQuantity, 0) ), [rowsAvailableForOrder]); + const previewRowsWithIssues = useMemo(() => ( + rowsAvailableForOrder.filter(row => row.issues.length).length + ), [rowsAvailableForOrder]); + const previewTotalPages = Math.ceil(rowsAvailableForOrder.length / previewItemsPerPage); + const safePreviewPage = Math.min(previewPage, previewTotalPages || 1); + const previewStartIndex = (safePreviewPage - 1) * previewItemsPerPage; + const paginatedPreviewRows = rowsAvailableForOrder.slice(previewStartIndex, previewStartIndex + previewItemsPerPage); + const totalPages = Math.ceil(filteredRows.length / itemsPerPage); const safeCurrentPage = Math.min(currentPage, totalPages || 1); const startIndex = (safeCurrentPage - 1) * itemsPerPage; @@ -587,6 +597,7 @@ const Cutting = () => { } setGenerationMessage(''); + setPreviewPage(1); setIsOrderPreviewOpen(true); }; @@ -777,60 +788,51 @@ const Cutting = () => { -
-
-

OPs previstas

-

{formatNumber(rowsAvailableForOrder.length)}

-
-
-

Unidades totais

-

{formatNumber(orderPreviewTotalUnits)} un.

-
-
-

Cobertura alvo

-

{formatNumber(targetCoverageDays)} dias

-
+
+ {[ + ['OPs a criar', formatNumber(rowsAvailableForOrder.length), 'text-dark-text'], + ['Unidades para cortar', `${formatNumber(orderPreviewTotalUnits)} un.`, 'text-brand-primary'], + ['Cobertura alvo', `${formatNumber(targetCoverageDays)} dias`, 'text-dark-text'], + ['Revisar dados', formatNumber(previewRowsWithIssues), previewRowsWithIssues ? 'text-amber-300' : 'text-dark-text'] + ].map(([label, value, tone]) =>

{label}

{value}

)}
- +
+ + + + + + + - - - - - + + + + - {rowsAvailableForOrder.map(row => ( + {paginatedPreviewRows.map(row => ( - - - - + + + ))} @@ -838,6 +840,21 @@ const Cutting = () => {
SKU ProdutoFamíliaVariaçãoNecessidadeDadosCortar agoraDemandaDisponívelRevisar
#{row.id}
{row.name}
-
- Média: {formatNumber(row.dailySales, 2)} un./dia · Estoque: {formatNumber(row.stock)} un. -
-
- - {row.family.materialLabel} - - -
+
+ #{row.id} + {row.family.materialLabel} - + {row.size || '-'}
- {formatNumber(row.suggestedCutQuantity)} un. - {formatNumber(row.suggestedCutQuantity)} un.{formatNumber(row.projectedDemand, 1)} un.
{formatNumber(row.availableQuantity)} un.
{row.openProductionQuantity ?
{formatNumber(row.openProductionQuantity)} em OP
: null}
{renderIssueBadge(row)}
+ { setPreviewItemsPerPage(pageSize); setPreviewPage(1); }} + className="border-t border-dark-border px-4 py-3" + /> +

OPs abertas já existentes para o mesmo plano e SKU serão ignoradas.