diff --git a/src/components/PricingView.tsx b/src/components/PricingView.tsx index 753ee8b..c02441f 100644 --- a/src/components/PricingView.tsx +++ b/src/components/PricingView.tsx @@ -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('pricing-unitsOuterFilter', []); + const [itemToLogisticFilter, setItemToLogisticFilter] = usePersistentState('pricing-itemToLogisticFilter', []); const [outerWFilter, setOuterWFilter] = usePersistentState('pricing-outerWFilter', []); const [outerLFilter, setOuterLFilter] = usePersistentState('pricing-outerLFilter', []); const [outerHFilter, setOuterHFilter] = usePersistentState('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, {isPinned('itemToLogistic') && } Item to Logistic + + + {openFilter === 'logistic' && ( + 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} + /> + )} { e.stopPropagation(); handleResizeStart(e, 'itemToLogistic', columnWidths.itemToLogistic); }} /> @@ -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' )} > @@ -1425,8 +1456,8 @@ export function PricingView({ data, headers, onSaveRow, onCaptureState, onEdit, {openFilter === 'unitsOuter' && ( 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' )} > @@ -1464,8 +1495,8 @@ export function PricingView({ data, headers, onSaveRow, onCaptureState, onEdit, {openFilter === 'outerW' && ( 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' )} > @@ -1503,8 +1534,8 @@ export function PricingView({ data, headers, onSaveRow, onCaptureState, onEdit, {openFilter === 'outerL' && ( 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' )} > @@ -1542,8 +1573,8 @@ export function PricingView({ data, headers, onSaveRow, onCaptureState, onEdit, {openFilter === 'outerH' && ( setOuterHFilter(prev => prev.includes(val) ? prev.filter(v => v !== val) : [...prev, val])} onSelectAll={vals => setOuterHFilter(vals)} onClear={() => { setOuterHFilter([]); setOpenFilter(null); }}