mirror of
https://github.com/christianvidalwolf-prog/Craze-Data-check.git
synced 2026-08-03 15:35:23 +02:00
fix: add Item to Logistic filter and apply missing safety checks to dimension filters
This commit is contained in:
@@ -95,6 +95,7 @@ export function PricingView({ data, headers, onSaveRow, onCaptureState, onEdit,
|
||||
const [articleNoColFilter, setArticleNoColFilter] = usePersistentState<{ terms: string[]; op: 'and' | 'or' }>('pricing-articleNoColFilter', { terms: [''], op: 'and' });
|
||||
const [globalAdvancedFilter, setGlobalAdvancedFilter] = usePersistentState<{ terms: string[]; op: 'and' | 'or' }>('pricing-globalAdvancedFilter', { terms: [''], op: 'and' });
|
||||
const [unitsOuterFilter, setUnitsOuterFilter] = usePersistentState<string[]>('pricing-unitsOuterFilter', []);
|
||||
const [itemToLogisticFilter, setItemToLogisticFilter] = usePersistentState<string[]>('pricing-itemToLogisticFilter', []);
|
||||
const [outerWFilter, setOuterWFilter] = usePersistentState<string[]>('pricing-outerWFilter', []);
|
||||
const [outerLFilter, setOuterLFilter] = usePersistentState<string[]>('pricing-outerLFilter', []);
|
||||
const [outerHFilter, setOuterHFilter] = usePersistentState<string[]>('pricing-outerHFilter', []);
|
||||
@@ -307,6 +308,10 @@ export function PricingView({ data, headers, onSaveRow, onCaptureState, onEdit,
|
||||
Array.from(new Set(data.map(r => String(r[COLUMNS.OUTER_H] || '')))).filter(v => v).sort((a, b) => Number(a) - Number(b)),
|
||||
[data]);
|
||||
|
||||
const uniqueItemToLogistic = useMemo(() =>
|
||||
Array.from(new Set(data.map(r => String(r[COLUMNS.ITEM_TO_LOGISTIC] || '')))).filter(v => v).sort(),
|
||||
[data]);
|
||||
|
||||
// ── Filtered rows ─────────────────────────────────────────────────────────
|
||||
const filteredRows = useMemo(() => {
|
||||
let result = analyzedRows;
|
||||
@@ -399,6 +404,9 @@ export function PricingView({ data, headers, onSaveRow, onCaptureState, onEdit,
|
||||
if ((outerHFilter || []).length > 0) {
|
||||
result = result.filter(r => (outerHFilter || []).includes(String(r.row[COLUMNS.OUTER_H] || '')));
|
||||
}
|
||||
if ((itemToLogisticFilter || []).length > 0) {
|
||||
result = result.filter(r => (itemToLogisticFilter || []).includes(String(r.row[COLUMNS.ITEM_TO_LOGISTIC] || '')));
|
||||
}
|
||||
|
||||
// Dynamic column filters (SRP, container)
|
||||
(Object.keys(dynamicColFilters) as string[]).forEach(colIdx => {
|
||||
@@ -1342,6 +1350,29 @@ export function PricingView({ data, headers, onSaveRow, onCaptureState, onEdit,
|
||||
<span className="flex items-center gap-1">
|
||||
{isPinned('itemToLogistic') && <Pin className="w-3 h-3 text-blue-400 shrink-0" />}
|
||||
Item to Logistic <SortIcon current={sortConfig.key === 'itemToLogistic' ? sortConfig.direction : null} /></span>
|
||||
<button
|
||||
id="filter-trigger-logistic"
|
||||
onClick={(e) => { e.stopPropagation(); setOpenFilter(openFilter === 'logistic' ? null : 'logistic'); }}
|
||||
className={cn(
|
||||
'ml-1 p-0.5 rounded hover:bg-slate-700 transition-colors shrink-0 filter-trigger-btn',
|
||||
(itemToLogisticFilter || []).length > 0 ? 'text-pink-400 bg-pink-400/10' : 'text-slate-500 opacity-0 group-hover:opacity-100'
|
||||
)}
|
||||
>
|
||||
<Filter className="w-3 h-3" />
|
||||
</button>
|
||||
</span>
|
||||
{openFilter === 'logistic' && (
|
||||
<ColumnFilterPopover
|
||||
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)}
|
||||
onClear={() => { setItemToLogisticFilter([]); setOpenFilter(null); }}
|
||||
onClose={() => setOpenFilter(null)}
|
||||
zIndex={50}
|
||||
/>
|
||||
)}
|
||||
<ResizeHandle onMouseDown={e => { e.stopPropagation(); handleResizeStart(e, 'itemToLogistic', columnWidths.itemToLogistic); }} />
|
||||
</th>
|
||||
|
||||
@@ -1416,7 +1447,7 @@ export function PricingView({ data, headers, onSaveRow, onCaptureState, onEdit,
|
||||
onClick={(e) => { e.stopPropagation(); setOpenFilter(openFilter === 'unitsOuter' ? null : 'unitsOuter'); }}
|
||||
className={cn(
|
||||
'p-0.5 rounded hover:bg-slate-700 transition-colors shrink-0 filter-trigger-btn',
|
||||
unitsOuterFilter.length > 0 ? 'text-blue-400 bg-blue-400/10' : 'text-slate-500 opacity-0 group-hover:opacity-100'
|
||||
(unitsOuterFilter || []).length > 0 ? 'text-blue-400 bg-blue-400/10' : 'text-slate-500 opacity-0 group-hover:opacity-100'
|
||||
)}
|
||||
>
|
||||
<Filter className="w-3 h-3" />
|
||||
@@ -1425,8 +1456,8 @@ export function PricingView({ data, headers, onSaveRow, onCaptureState, onEdit,
|
||||
{openFilter === 'unitsOuter' && (
|
||||
<ColumnFilterPopover
|
||||
triggerId="filter-trigger-unitsOuter"
|
||||
uniqueValues={uniqueUnitsOuter}
|
||||
selectedValues={unitsOuterFilter}
|
||||
uniqueValues={uniqueUnitsOuter || []}
|
||||
selectedValues={unitsOuterFilter || []}
|
||||
onToggle={val => setUnitsOuterFilter(prev => prev.includes(val) ? prev.filter(v => v !== val) : [...prev, val])}
|
||||
onSelectAll={vals => setUnitsOuterFilter(vals)}
|
||||
onClear={() => { setUnitsOuterFilter([]); setOpenFilter(null); }}
|
||||
@@ -1455,7 +1486,7 @@ export function PricingView({ data, headers, onSaveRow, onCaptureState, onEdit,
|
||||
onClick={(e) => { e.stopPropagation(); setOpenFilter(openFilter === 'outerW' ? null : 'outerW'); }}
|
||||
className={cn(
|
||||
'p-0.5 rounded hover:bg-slate-700 transition-colors shrink-0 filter-trigger-btn',
|
||||
outerWFilter.length > 0 ? 'text-blue-400 bg-blue-400/10' : 'text-slate-500 opacity-0 group-hover:opacity-100'
|
||||
(outerWFilter || []).length > 0 ? 'text-blue-400 bg-blue-400/10' : 'text-slate-500 opacity-0 group-hover:opacity-100'
|
||||
)}
|
||||
>
|
||||
<Filter className="w-3 h-3" />
|
||||
@@ -1464,8 +1495,8 @@ export function PricingView({ data, headers, onSaveRow, onCaptureState, onEdit,
|
||||
{openFilter === 'outerW' && (
|
||||
<ColumnFilterPopover
|
||||
triggerId="filter-trigger-outerW"
|
||||
uniqueValues={uniqueOuterW}
|
||||
selectedValues={outerWFilter}
|
||||
uniqueValues={uniqueOuterW || []}
|
||||
selectedValues={outerWFilter || []}
|
||||
onToggle={val => setOuterWFilter(prev => prev.includes(val) ? prev.filter(v => v !== val) : [...prev, val])}
|
||||
onSelectAll={vals => setOuterWFilter(vals)}
|
||||
onClear={() => { setOuterWFilter([]); setOpenFilter(null); }}
|
||||
@@ -1494,7 +1525,7 @@ export function PricingView({ data, headers, onSaveRow, onCaptureState, onEdit,
|
||||
onClick={(e) => { e.stopPropagation(); setOpenFilter(openFilter === 'outerL' ? null : 'outerL'); }}
|
||||
className={cn(
|
||||
'p-0.5 rounded hover:bg-slate-700 transition-colors shrink-0 filter-trigger-btn',
|
||||
outerLFilter.length > 0 ? 'text-blue-400 bg-blue-400/10' : 'text-slate-500 opacity-0 group-hover:opacity-100'
|
||||
(outerLFilter || []).length > 0 ? 'text-blue-400 bg-blue-400/10' : 'text-slate-500 opacity-0 group-hover:opacity-100'
|
||||
)}
|
||||
>
|
||||
<Filter className="w-3 h-3" />
|
||||
@@ -1503,8 +1534,8 @@ export function PricingView({ data, headers, onSaveRow, onCaptureState, onEdit,
|
||||
{openFilter === 'outerL' && (
|
||||
<ColumnFilterPopover
|
||||
triggerId="filter-trigger-outerL"
|
||||
uniqueValues={uniqueOuterL}
|
||||
selectedValues={outerLFilter}
|
||||
uniqueValues={uniqueOuterL || []}
|
||||
selectedValues={outerLFilter || []}
|
||||
onToggle={val => setOuterLFilter(prev => prev.includes(val) ? prev.filter(v => v !== val) : [...prev, val])}
|
||||
onSelectAll={vals => setOuterLFilter(vals)}
|
||||
onClear={() => { setOuterLFilter([]); setOpenFilter(null); }}
|
||||
@@ -1533,7 +1564,7 @@ export function PricingView({ data, headers, onSaveRow, onCaptureState, onEdit,
|
||||
onClick={(e) => { e.stopPropagation(); setOpenFilter(openFilter === 'outerH' ? null : 'outerH'); }}
|
||||
className={cn(
|
||||
'p-0.5 rounded hover:bg-slate-700 transition-colors shrink-0 filter-trigger-btn',
|
||||
outerHFilter.length > 0 ? 'text-blue-400 bg-blue-400/10' : 'text-slate-500 opacity-0 group-hover:opacity-100'
|
||||
(outerHFilter || []).length > 0 ? 'text-blue-400 bg-blue-400/10' : 'text-slate-500 opacity-0 group-hover:opacity-100'
|
||||
)}
|
||||
>
|
||||
<Filter className="w-3 h-3" />
|
||||
@@ -1542,8 +1573,8 @@ export function PricingView({ data, headers, onSaveRow, onCaptureState, onEdit,
|
||||
{openFilter === 'outerH' && (
|
||||
<ColumnFilterPopover
|
||||
triggerId="filter-trigger-outerH"
|
||||
uniqueValues={uniqueOuterH}
|
||||
selectedValues={outerHFilter}
|
||||
uniqueValues={uniqueOuterH || []}
|
||||
selectedValues={outerHFilter || []}
|
||||
onToggle={val => setOuterHFilter(prev => prev.includes(val) ? prev.filter(v => v !== val) : [...prev, val])}
|
||||
onSelectAll={vals => setOuterHFilter(vals)}
|
||||
onClear={() => { setOuterHFilter([]); setOpenFilter(null); }}
|
||||
|
||||
Reference in New Issue
Block a user