diff --git a/src/pages/ProductDetails.tsx b/src/pages/ProductDetails.tsx index 93c7569..06e85d5 100644 --- a/src/pages/ProductDetails.tsx +++ b/src/pages/ProductDetails.tsx @@ -7,6 +7,7 @@ import DateRangePicker from '../components/DateRangePicker'; import SkuPlanningModal from '../components/SkuPlanningModal'; import ProductTypeBadge from '../components/ProductTypeBadge'; import RefreshStatus from '../components/RefreshStatus'; +import PaginationControls from '../components/PaginationControls'; import type { CutProductOverride, CuttingSettings, DateRange, ProductComposition, ProductDetailsAnalytics } from '../types'; import { fetchCuttingSettings, fetchProductComposition, fetchProductDetailsAnalytics, saveCuttingSettings } from '../dataService'; import { parseProductName } from '../productParsing'; @@ -139,6 +140,8 @@ const ProductDetails = () => { const [planningSettings, setPlanningSettings] = useState({ familyYields: {}, productOverrides: {} }); const [isPlanningModalOpen, setIsPlanningModalOpen] = useState(false); const [isSavingPlanning, setIsSavingPlanning] = useState(false); + const [variantCurrentPage, setVariantCurrentPage] = useState(1); + const [variantItemsPerPage, setVariantItemsPerPage] = useState(5); useEffect(() => { let isMounted = true; @@ -179,6 +182,7 @@ const ProductDetails = () => { if (isMounted) { setDetails(productDetails); setComposition(productComposition); + setVariantCurrentPage(1); setIsLoading(false); setIsCompositionLoading(false); } @@ -331,6 +335,10 @@ const ProductDetails = () => { : formatDateBucketLongLabel(selectedProductPoint.date, dateBucket) : ''; const maxVariantQuantity = Math.max(...variantBreakdown.map(variant => variant.quantitySold), 0); + const variantTotalPages = Math.ceil(variantBreakdown.length / variantItemsPerPage); + const safeVariantCurrentPage = Math.min(variantCurrentPage, variantTotalPages || 1); + const variantStartIndex = (safeVariantCurrentPage - 1) * variantItemsPerPage; + const paginatedVariantBreakdown = variantBreakdown.slice(variantStartIndex, variantStartIndex + variantItemsPerPage); return (
@@ -606,7 +614,7 @@ const ProductDetails = () => {
) : (
- {variantBreakdown.map(variant => { + {paginatedVariantBreakdown.map(variant => { const width = maxVariantQuantity ? Math.max(4, (variant.quantitySold / maxVariantQuantity) * 100) : 0; const metadata = parseProductName(variant.name); @@ -614,7 +622,9 @@ const ProductDetails = () => {
-
{variant.name}
+ + {variant.name} +
#{variant.id} {metadata.color && ( @@ -655,6 +665,25 @@ const ProductDetails = () => { })}
)} + {variantBreakdown.length > variantItemsPerPage && ( + { + setVariantItemsPerPage(pageSize); + setVariantCurrentPage(1); + }} + className="mt-5 border-t border-dark-border pt-4" + /> + )}