From cd621de5d3b4eb417bbaad0e1a235dbb4808e336 Mon Sep 17 00:00:00 2001 From: Christian Vidal Wolf Date: Fri, 24 Apr 2026 20:26:36 +0200 Subject: [PATCH] fix: implement exhaustive safety checks for filters and sorting to prevent white screen crashes --- src/components/PricingView.tsx | 35 ++++++++++++++++++---------------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/src/components/PricingView.tsx b/src/components/PricingView.tsx index e9ada70..5e2e81e 100644 --- a/src/components/PricingView.tsx +++ b/src/components/PricingView.tsx @@ -448,10 +448,13 @@ export function PricingView({ data, headers, onSaveRow, onCaptureState, onEdit, case 'outerW': colIndex = COLUMNS.OUTER_W; break; case 'outerL': colIndex = COLUMNS.OUTER_L; break; case 'outerH': colIndex = COLUMNS.OUTER_H; break; + case 'itemToLogistic': colIndex = COLUMNS.ITEM_TO_LOGISTIC; break; default: return filteredRows; } } + if (colIndex === undefined || colIndex === null) return filteredRows; + const sorted = [...filteredRows].sort((a, b) => { const valA = a.row[colIndex]; const valB = b.row[colIndex]; @@ -1260,8 +1263,8 @@ export function PricingView({ data, headers, onSaveRow, onCaptureState, onEdit, triggerId="filter-trigger-line" uniqueValues={uniqueLines || []} selectedValues={lineMultiFilter || []} - onToggle={val => setLineMultiFilter(prev => prev.includes(val) ? prev.filter(v => v !== val) : [...prev, val])} - onSelectAll={vals => setLineMultiFilter(vals)} + onToggle={val => setLineMultiFilter(prev => (prev || []).includes(val) ? (prev || []).filter(v => v !== val) : [...(prev || []), val])} + onSelectAll={vals => setLineMultiFilter(vals || [])} onClear={() => { setLineMultiFilter([]); setOpenFilter(null); }} onClose={() => setOpenFilter(null)} zIndex={500} @@ -1298,8 +1301,8 @@ export function PricingView({ data, headers, onSaveRow, onCaptureState, onEdit, triggerId="filter-trigger-class" uniqueValues={uniqueClassifications || []} selectedValues={classificationFilter || []} - onToggle={val => setClassificationFilter(prev => prev.includes(val) ? prev.filter(v => v !== val) : [...prev, val])} - onSelectAll={vals => setClassificationFilter(vals)} + onToggle={val => setClassificationFilter(prev => (prev || []).includes(val) ? (prev || []).filter(v => v !== val) : [...(prev || []), val])} + onSelectAll={vals => setClassificationFilter(vals || [])} onClear={() => { setClassificationFilter([]); setOpenFilter(null); }} onClose={() => setOpenFilter(null)} zIndex={50} @@ -1328,8 +1331,8 @@ export function PricingView({ data, headers, onSaveRow, onCaptureState, onEdit, triggerId="filter-trigger-type" uniqueValues={uniqueProductTypes || []} selectedValues={productTypeFilter || []} - onToggle={(val: string) => setProductTypeFilter((prev: string[]) => prev.includes(val) ? prev.filter((v: string) => v !== val) : [...prev, val])} - onSelectAll={vals => setProductTypeFilter(vals)} + onToggle={(val: string) => setProductTypeFilter((prev: string[]) => (prev || []).includes(val) ? (prev || []).filter((v: string) => v !== val) : [...(prev || []), val])} + onSelectAll={vals => setProductTypeFilter(vals || [])} onClear={() => { setProductTypeFilter([]); setOpenFilter(null); }} onClose={() => setOpenFilter(null)} zIndex={50} @@ -1366,8 +1369,8 @@ export function PricingView({ data, headers, onSaveRow, onCaptureState, onEdit, triggerId="filter-trigger-logistic" uniqueValues={uniqueItemToLogistic || []} selectedValues={itemToLogisticFilter || []} - onToggle={val => setItemToLogisticFilter(prev => prev.includes(val) ? prev.filter(v => v !== val) : [...prev, val])} - onSelectAll={vals => setItemToLogisticFilter(vals)} + onToggle={val => setItemToLogisticFilter(prev => (prev || []).includes(val) ? (prev || []).filter(v => v !== val) : [...(prev || []), val])} + onSelectAll={vals => setItemToLogisticFilter(vals || [])} onClear={() => { setItemToLogisticFilter([]); setOpenFilter(null); }} onClose={() => setOpenFilter(null)} zIndex={50} @@ -1458,8 +1461,8 @@ export function PricingView({ data, headers, onSaveRow, onCaptureState, onEdit, triggerId="filter-trigger-unitsOuter" uniqueValues={uniqueUnitsOuter || []} selectedValues={unitsOuterFilter || []} - onToggle={val => setUnitsOuterFilter(prev => prev.includes(val) ? prev.filter(v => v !== val) : [...prev, val])} - onSelectAll={vals => setUnitsOuterFilter(vals)} + onToggle={val => setUnitsOuterFilter(prev => (prev || []).includes(val) ? (prev || []).filter(v => v !== val) : [...(prev || []), val])} + onSelectAll={vals => setUnitsOuterFilter(vals || [])} onClear={() => { setUnitsOuterFilter([]); setOpenFilter(null); }} onClose={() => setOpenFilter(null)} zIndex={50} @@ -1497,8 +1500,8 @@ export function PricingView({ data, headers, onSaveRow, onCaptureState, onEdit, triggerId="filter-trigger-outerW" uniqueValues={uniqueOuterW || []} selectedValues={outerWFilter || []} - onToggle={val => setOuterWFilter(prev => prev.includes(val) ? prev.filter(v => v !== val) : [...prev, val])} - onSelectAll={vals => setOuterWFilter(vals)} + onToggle={val => setOuterWFilter(prev => (prev || []).includes(val) ? (prev || []).filter(v => v !== val) : [...(prev || []), val])} + onSelectAll={vals => setOuterWFilter(vals || [])} onClear={() => { setOuterWFilter([]); setOpenFilter(null); }} onClose={() => setOpenFilter(null)} zIndex={50} @@ -1536,8 +1539,8 @@ export function PricingView({ data, headers, onSaveRow, onCaptureState, onEdit, triggerId="filter-trigger-outerL" uniqueValues={uniqueOuterL || []} selectedValues={outerLFilter || []} - onToggle={val => setOuterLFilter(prev => prev.includes(val) ? prev.filter(v => v !== val) : [...prev, val])} - onSelectAll={vals => setOuterLFilter(vals)} + onToggle={val => setOuterLFilter(prev => (prev || []).includes(val) ? (prev || []).filter(v => v !== val) : [...(prev || []), val])} + onSelectAll={vals => setOuterLFilter(vals || [])} onClear={() => { setOuterLFilter([]); setOpenFilter(null); }} onClose={() => setOpenFilter(null)} zIndex={50} @@ -1575,8 +1578,8 @@ export function PricingView({ data, headers, onSaveRow, onCaptureState, onEdit, triggerId="filter-trigger-outerH" uniqueValues={uniqueOuterH || []} selectedValues={outerHFilter || []} - onToggle={val => setOuterHFilter(prev => prev.includes(val) ? prev.filter(v => v !== val) : [...prev, val])} - onSelectAll={vals => setOuterHFilter(vals)} + onToggle={val => setOuterHFilter(prev => (prev || []).includes(val) ? (prev || []).filter(v => v !== val) : [...(prev || []), val])} + onSelectAll={vals => setOuterHFilter(vals || [])} onClear={() => { setOuterHFilter([]); setOpenFilter(null); }} onClose={() => setOpenFilter(null)} zIndex={50}