fix: implement exhaustive safety checks for filters and sorting to prevent white screen crashes

This commit is contained in:
Christian Vidal Wolf
2026-04-24 20:26:36 +02:00
parent a452283fbb
commit cd621de5d3
+19 -16
View File
@@ -448,10 +448,13 @@ export function PricingView({ data, headers, onSaveRow, onCaptureState, onEdit,
case 'outerW': colIndex = COLUMNS.OUTER_W; break; case 'outerW': colIndex = COLUMNS.OUTER_W; break;
case 'outerL': colIndex = COLUMNS.OUTER_L; break; case 'outerL': colIndex = COLUMNS.OUTER_L; break;
case 'outerH': colIndex = COLUMNS.OUTER_H; break; case 'outerH': colIndex = COLUMNS.OUTER_H; break;
case 'itemToLogistic': colIndex = COLUMNS.ITEM_TO_LOGISTIC; break;
default: return filteredRows; default: return filteredRows;
} }
} }
if (colIndex === undefined || colIndex === null) return filteredRows;
const sorted = [...filteredRows].sort((a, b) => { const sorted = [...filteredRows].sort((a, b) => {
const valA = a.row[colIndex]; const valA = a.row[colIndex];
const valB = b.row[colIndex]; const valB = b.row[colIndex];
@@ -1260,8 +1263,8 @@ export function PricingView({ data, headers, onSaveRow, onCaptureState, onEdit,
triggerId="filter-trigger-line" triggerId="filter-trigger-line"
uniqueValues={uniqueLines || []} uniqueValues={uniqueLines || []}
selectedValues={lineMultiFilter || []} selectedValues={lineMultiFilter || []}
onToggle={val => setLineMultiFilter(prev => prev.includes(val) ? prev.filter(v => v !== val) : [...prev, val])} onToggle={val => setLineMultiFilter(prev => (prev || []).includes(val) ? (prev || []).filter(v => v !== val) : [...(prev || []), val])}
onSelectAll={vals => setLineMultiFilter(vals)} onSelectAll={vals => setLineMultiFilter(vals || [])}
onClear={() => { setLineMultiFilter([]); setOpenFilter(null); }} onClear={() => { setLineMultiFilter([]); setOpenFilter(null); }}
onClose={() => setOpenFilter(null)} onClose={() => setOpenFilter(null)}
zIndex={500} zIndex={500}
@@ -1298,8 +1301,8 @@ export function PricingView({ data, headers, onSaveRow, onCaptureState, onEdit,
triggerId="filter-trigger-class" triggerId="filter-trigger-class"
uniqueValues={uniqueClassifications || []} uniqueValues={uniqueClassifications || []}
selectedValues={classificationFilter || []} selectedValues={classificationFilter || []}
onToggle={val => setClassificationFilter(prev => prev.includes(val) ? prev.filter(v => v !== val) : [...prev, val])} onToggle={val => setClassificationFilter(prev => (prev || []).includes(val) ? (prev || []).filter(v => v !== val) : [...(prev || []), val])}
onSelectAll={vals => setClassificationFilter(vals)} onSelectAll={vals => setClassificationFilter(vals || [])}
onClear={() => { setClassificationFilter([]); setOpenFilter(null); }} onClear={() => { setClassificationFilter([]); setOpenFilter(null); }}
onClose={() => setOpenFilter(null)} onClose={() => setOpenFilter(null)}
zIndex={50} zIndex={50}
@@ -1328,8 +1331,8 @@ export function PricingView({ data, headers, onSaveRow, onCaptureState, onEdit,
triggerId="filter-trigger-type" triggerId="filter-trigger-type"
uniqueValues={uniqueProductTypes || []} uniqueValues={uniqueProductTypes || []}
selectedValues={productTypeFilter || []} selectedValues={productTypeFilter || []}
onToggle={(val: string) => setProductTypeFilter((prev: string[]) => prev.includes(val) ? prev.filter((v: string) => v !== val) : [...prev, val])} onToggle={(val: string) => setProductTypeFilter((prev: string[]) => (prev || []).includes(val) ? (prev || []).filter((v: string) => v !== val) : [...(prev || []), val])}
onSelectAll={vals => setProductTypeFilter(vals)} onSelectAll={vals => setProductTypeFilter(vals || [])}
onClear={() => { setProductTypeFilter([]); setOpenFilter(null); }} onClear={() => { setProductTypeFilter([]); setOpenFilter(null); }}
onClose={() => setOpenFilter(null)} onClose={() => setOpenFilter(null)}
zIndex={50} zIndex={50}
@@ -1366,8 +1369,8 @@ export function PricingView({ data, headers, onSaveRow, onCaptureState, onEdit,
triggerId="filter-trigger-logistic" triggerId="filter-trigger-logistic"
uniqueValues={uniqueItemToLogistic || []} uniqueValues={uniqueItemToLogistic || []}
selectedValues={itemToLogisticFilter || []} selectedValues={itemToLogisticFilter || []}
onToggle={val => setItemToLogisticFilter(prev => prev.includes(val) ? prev.filter(v => v !== val) : [...prev, val])} onToggle={val => setItemToLogisticFilter(prev => (prev || []).includes(val) ? (prev || []).filter(v => v !== val) : [...(prev || []), val])}
onSelectAll={vals => setItemToLogisticFilter(vals)} onSelectAll={vals => setItemToLogisticFilter(vals || [])}
onClear={() => { setItemToLogisticFilter([]); setOpenFilter(null); }} onClear={() => { setItemToLogisticFilter([]); setOpenFilter(null); }}
onClose={() => setOpenFilter(null)} onClose={() => setOpenFilter(null)}
zIndex={50} zIndex={50}
@@ -1458,8 +1461,8 @@ export function PricingView({ data, headers, onSaveRow, onCaptureState, onEdit,
triggerId="filter-trigger-unitsOuter" triggerId="filter-trigger-unitsOuter"
uniqueValues={uniqueUnitsOuter || []} uniqueValues={uniqueUnitsOuter || []}
selectedValues={unitsOuterFilter || []} selectedValues={unitsOuterFilter || []}
onToggle={val => setUnitsOuterFilter(prev => prev.includes(val) ? prev.filter(v => v !== val) : [...prev, val])} onToggle={val => setUnitsOuterFilter(prev => (prev || []).includes(val) ? (prev || []).filter(v => v !== val) : [...(prev || []), val])}
onSelectAll={vals => setUnitsOuterFilter(vals)} onSelectAll={vals => setUnitsOuterFilter(vals || [])}
onClear={() => { setUnitsOuterFilter([]); setOpenFilter(null); }} onClear={() => { setUnitsOuterFilter([]); setOpenFilter(null); }}
onClose={() => setOpenFilter(null)} onClose={() => setOpenFilter(null)}
zIndex={50} zIndex={50}
@@ -1497,8 +1500,8 @@ export function PricingView({ data, headers, onSaveRow, onCaptureState, onEdit,
triggerId="filter-trigger-outerW" triggerId="filter-trigger-outerW"
uniqueValues={uniqueOuterW || []} uniqueValues={uniqueOuterW || []}
selectedValues={outerWFilter || []} selectedValues={outerWFilter || []}
onToggle={val => setOuterWFilter(prev => prev.includes(val) ? prev.filter(v => v !== val) : [...prev, val])} onToggle={val => setOuterWFilter(prev => (prev || []).includes(val) ? (prev || []).filter(v => v !== val) : [...(prev || []), val])}
onSelectAll={vals => setOuterWFilter(vals)} onSelectAll={vals => setOuterWFilter(vals || [])}
onClear={() => { setOuterWFilter([]); setOpenFilter(null); }} onClear={() => { setOuterWFilter([]); setOpenFilter(null); }}
onClose={() => setOpenFilter(null)} onClose={() => setOpenFilter(null)}
zIndex={50} zIndex={50}
@@ -1536,8 +1539,8 @@ export function PricingView({ data, headers, onSaveRow, onCaptureState, onEdit,
triggerId="filter-trigger-outerL" triggerId="filter-trigger-outerL"
uniqueValues={uniqueOuterL || []} uniqueValues={uniqueOuterL || []}
selectedValues={outerLFilter || []} selectedValues={outerLFilter || []}
onToggle={val => setOuterLFilter(prev => prev.includes(val) ? prev.filter(v => v !== val) : [...prev, val])} onToggle={val => setOuterLFilter(prev => (prev || []).includes(val) ? (prev || []).filter(v => v !== val) : [...(prev || []), val])}
onSelectAll={vals => setOuterLFilter(vals)} onSelectAll={vals => setOuterLFilter(vals || [])}
onClear={() => { setOuterLFilter([]); setOpenFilter(null); }} onClear={() => { setOuterLFilter([]); setOpenFilter(null); }}
onClose={() => setOpenFilter(null)} onClose={() => setOpenFilter(null)}
zIndex={50} zIndex={50}
@@ -1575,8 +1578,8 @@ export function PricingView({ data, headers, onSaveRow, onCaptureState, onEdit,
triggerId="filter-trigger-outerH" triggerId="filter-trigger-outerH"
uniqueValues={uniqueOuterH || []} uniqueValues={uniqueOuterH || []}
selectedValues={outerHFilter || []} selectedValues={outerHFilter || []}
onToggle={val => setOuterHFilter(prev => prev.includes(val) ? prev.filter(v => v !== val) : [...prev, val])} onToggle={val => setOuterHFilter(prev => (prev || []).includes(val) ? (prev || []).filter(v => v !== val) : [...(prev || []), val])}
onSelectAll={vals => setOuterHFilter(vals)} onSelectAll={vals => setOuterHFilter(vals || [])}
onClear={() => { setOuterHFilter([]); setOpenFilter(null); }} onClear={() => { setOuterHFilter([]); setOpenFilter(null); }}
onClose={() => setOpenFilter(null)} onClose={() => setOpenFilter(null)}
zIndex={50} zIndex={50}