mirror of
https://github.com/christianvidalwolf-prog/Craze-Data-check.git
synced 2026-08-03 15:05:23 +02:00
fix: resolve white screen crash in PricingView filters by adding comprehensive safety checks
This commit is contained in:
@@ -378,26 +378,26 @@ export function PricingView({ data, headers, onSaveRow, onCaptureState, onEdit,
|
||||
: activeTerms.some(term => sku.includes(term));
|
||||
});
|
||||
}
|
||||
if (lineMultiFilter.length > 0) {
|
||||
result = result.filter(r => lineMultiFilter.includes(String(r.row[COLUMNS.LINE] || '')));
|
||||
if ((lineMultiFilter || []).length > 0) {
|
||||
result = result.filter(r => (lineMultiFilter || []).includes(String(r.row[COLUMNS.LINE] || '')));
|
||||
}
|
||||
if (classificationFilter.length > 0) {
|
||||
result = result.filter(r => classificationFilter.includes(String(r.row[COLUMNS.CLASSIFICATION] || '')));
|
||||
if ((classificationFilter || []).length > 0) {
|
||||
result = result.filter(r => (classificationFilter || []).includes(String(r.row[COLUMNS.CLASSIFICATION] || '')));
|
||||
}
|
||||
if (productTypeFilter.length > 0) {
|
||||
result = result.filter(r => productTypeFilter.includes(String(r.row[COLUMNS.PRODUCT_TYPE] || '')));
|
||||
if ((productTypeFilter || []).length > 0) {
|
||||
result = result.filter(r => (productTypeFilter || []).includes(String(r.row[COLUMNS.PRODUCT_TYPE] || '')));
|
||||
}
|
||||
if (unitsOuterFilter.length > 0) {
|
||||
result = result.filter(r => unitsOuterFilter.includes(String(r.row[unitsOuterIdx] || '')));
|
||||
if ((unitsOuterFilter || []).length > 0) {
|
||||
result = result.filter(r => (unitsOuterFilter || []).includes(String(r.row[unitsOuterIdx] || '')));
|
||||
}
|
||||
if (outerWFilter.length > 0) {
|
||||
result = result.filter(r => outerWFilter.includes(String(r.row[COLUMNS.OUTER_W] || '')));
|
||||
if ((outerWFilter || []).length > 0) {
|
||||
result = result.filter(r => (outerWFilter || []).includes(String(r.row[COLUMNS.OUTER_W] || '')));
|
||||
}
|
||||
if (outerLFilter.length > 0) {
|
||||
result = result.filter(r => outerLFilter.includes(String(r.row[COLUMNS.OUTER_L] || '')));
|
||||
if ((outerLFilter || []).length > 0) {
|
||||
result = result.filter(r => (outerLFilter || []).includes(String(r.row[COLUMNS.OUTER_L] || '')));
|
||||
}
|
||||
if (outerHFilter.length > 0) {
|
||||
result = result.filter(r => outerHFilter.includes(String(r.row[COLUMNS.OUTER_H] || '')));
|
||||
if ((outerHFilter || []).length > 0) {
|
||||
result = result.filter(r => (outerHFilter || []).includes(String(r.row[COLUMNS.OUTER_H] || '')));
|
||||
}
|
||||
|
||||
// Dynamic column filters (SRP, container)
|
||||
@@ -1241,7 +1241,7 @@ export function PricingView({ data, headers, onSaveRow, onCaptureState, onEdit,
|
||||
onClick={(e) => { e.stopPropagation(); setOpenFilter(openFilter === 'line' ? null : 'line'); }}
|
||||
className={cn(
|
||||
'p-0.5 rounded hover:bg-slate-700 transition-colors shrink-0 filter-trigger-btn',
|
||||
lineMultiFilter.length > 0 ? 'text-blue-400 bg-blue-400/10' : 'text-slate-500 opacity-0 group-hover:opacity-100'
|
||||
(lineMultiFilter || []).length > 0 ? 'text-blue-400 bg-blue-400/10' : 'text-slate-500 opacity-0 group-hover:opacity-100'
|
||||
)}
|
||||
>
|
||||
<Filter className="w-3 h-3" />
|
||||
@@ -1250,8 +1250,8 @@ export function PricingView({ data, headers, onSaveRow, onCaptureState, onEdit,
|
||||
{openFilter === 'line' && (
|
||||
<ColumnFilterPopover
|
||||
triggerId="filter-trigger-line"
|
||||
uniqueValues={uniqueLines}
|
||||
selectedValues={lineMultiFilter}
|
||||
uniqueValues={uniqueLines || []}
|
||||
selectedValues={lineMultiFilter || []}
|
||||
onToggle={val => setLineMultiFilter(prev => prev.includes(val) ? prev.filter(v => v !== val) : [...prev, val])}
|
||||
onSelectAll={vals => setLineMultiFilter(vals)}
|
||||
onClear={() => { setLineMultiFilter([]); setOpenFilter(null); }}
|
||||
@@ -1279,7 +1279,7 @@ export function PricingView({ data, headers, onSaveRow, onCaptureState, onEdit,
|
||||
onClick={(e) => { e.stopPropagation(); setOpenFilter(openFilter === 'classification' ? null : 'classification'); }}
|
||||
className={cn(
|
||||
'p-0.5 rounded hover:bg-slate-700 transition-colors shrink-0 filter-trigger-btn',
|
||||
classificationFilter.length > 0 ? 'text-blue-400 bg-blue-400/10' : 'text-slate-500 opacity-0 group-hover:opacity-100'
|
||||
(classificationFilter || []).length > 0 ? 'text-blue-400 bg-blue-400/10' : 'text-slate-500 opacity-0 group-hover:opacity-100'
|
||||
)}
|
||||
>
|
||||
<Filter className="w-3 h-3" />
|
||||
@@ -1288,8 +1288,8 @@ export function PricingView({ data, headers, onSaveRow, onCaptureState, onEdit,
|
||||
{openFilter === 'classification' && (
|
||||
<ColumnFilterPopover
|
||||
triggerId="filter-trigger-class"
|
||||
uniqueValues={uniqueClassifications}
|
||||
selectedValues={classificationFilter}
|
||||
uniqueValues={uniqueClassifications || []}
|
||||
selectedValues={classificationFilter || []}
|
||||
onToggle={val => setClassificationFilter(prev => prev.includes(val) ? prev.filter(v => v !== val) : [...prev, val])}
|
||||
onSelectAll={vals => setClassificationFilter(vals)}
|
||||
onClear={() => { setClassificationFilter([]); setOpenFilter(null); }}
|
||||
@@ -1310,7 +1310,7 @@ export function PricingView({ data, headers, onSaveRow, onCaptureState, onEdit,
|
||||
<button
|
||||
id="filter-trigger-type"
|
||||
onClick={(e: React.MouseEvent) => { e.stopPropagation(); setOpenFilter(openFilter === 'productType' ? null : 'productType'); }}
|
||||
className={cn('ml-1 p-0.5 rounded transition-colors filter-trigger-btn', productTypeFilter.length > 0 ? 'text-purple-400 bg-purple-400/10' : 'text-slate-500 opacity-0 group-hover:opacity-100')}
|
||||
className={cn('ml-1 p-0.5 rounded transition-colors filter-trigger-btn', (productTypeFilter || []).length > 0 ? 'text-purple-400 bg-purple-400/10' : 'text-slate-500 opacity-0 group-hover:opacity-100')}
|
||||
>
|
||||
<Filter className="w-3 h-3" />
|
||||
</button>
|
||||
@@ -1318,8 +1318,8 @@ export function PricingView({ data, headers, onSaveRow, onCaptureState, onEdit,
|
||||
{openFilter === 'productType' && (
|
||||
<ColumnFilterPopover
|
||||
triggerId="filter-trigger-type"
|
||||
uniqueValues={uniqueProductTypes}
|
||||
selectedValues={productTypeFilter}
|
||||
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)}
|
||||
onClear={() => { setProductTypeFilter([]); setOpenFilter(null); }}
|
||||
@@ -1380,7 +1380,7 @@ export function PricingView({ data, headers, onSaveRow, onCaptureState, onEdit,
|
||||
<ColumnFilterPopover
|
||||
triggerId={`filter-trigger-${colKey}`}
|
||||
uniqueValues={dynamicColUniqueValues[col.index] || []}
|
||||
selectedValues={dynamicColFilters[col.index] || []}
|
||||
selectedValues={dynamicColFilters[col.index] || []}
|
||||
onToggle={val => setDynamicColFilters(prev => {
|
||||
const current = prev[col.index] || [];
|
||||
return current.includes(val)
|
||||
@@ -2150,7 +2150,8 @@ function TextFilterPopover({ value, onChange, onClose, triggerId }: {
|
||||
</button>
|
||||
</div>
|
||||
</div>,
|
||||
document.body && document.body);
|
||||
document.body
|
||||
);
|
||||
}
|
||||
|
||||
// ── Sort Icon Helper ───────────────────────────────────────────────────
|
||||
|
||||
Reference in New Issue
Block a user