diff --git a/src/components/PricingView.tsx b/src/components/PricingView.tsx index 77c52bf..8097b17 100644 --- a/src/components/PricingView.tsx +++ b/src/components/PricingView.tsx @@ -82,6 +82,7 @@ export function PricingView({ data, headers, onSaveRow, onCaptureState, onEdit, const [productTypeFilter, setProductTypeFilter] = useState([]); const [nameColFilter, setNameColFilter] = useState<{ terms: string[]; op: 'and' | 'or' }>({ terms: [''], op: 'and' }); const [articleNoColFilter, setArticleNoColFilter] = useState<{ terms: string[]; op: 'and' | 'or' }>({ terms: [''], op: 'and' }); + const [globalAdvancedFilter, setGlobalAdvancedFilter] = useState<{ terms: string[]; op: 'and' | 'or' }>({ terms: [''], op: 'and' }); const [openFilter, setOpenFilter] = useState(null); const [unitsOuterFilter, setUnitsOuterFilter] = useState([]); const [outerWFilter, setOuterWFilter] = useState([]); @@ -327,6 +328,20 @@ export function PricingView({ data, headers, onSaveRow, onCaptureState, onEdit, } } + // Global Advanced Filter (Multi-term AND/OR) + if (globalAdvancedFilter.terms.some(t => t.trim() !== '')) { + result = result.filter(r => { + const articleNo = String(r.row[COLUMNS.ARTICLE_NO] || '').toLowerCase(); + const articleName = String(r.row[COLUMNS.ARTICLE_NAME] || '').toLowerCase(); + const activeTerms = globalAdvancedFilter.terms.filter(t => t.trim() !== '').map(t => t.toLowerCase()); + if (activeTerms.length === 0) return true; + + return globalAdvancedFilter.op === 'and' + ? activeTerms.every(term => articleNo.includes(term) || articleName.includes(term)) + : activeTerms.some(term => articleNo.includes(term) || articleName.includes(term)); + }); + } + // Selected items from search dropdown if (searchMode === 'selected' && selectedSearchItems.size > 0) { result = result.filter(r => { @@ -400,7 +415,7 @@ export function PricingView({ data, headers, onSaveRow, onCaptureState, onEdit, } return result; - }, [analyzedRows, filterMode, search, nameColFilter, lineMultiFilter, classificationFilter, productTypeFilter, unitsOuterFilter, outerWFilter, outerLFilter, outerHFilter, dynamicColFilters, weightIssueFilter]); + }, [analyzedRows, filterMode, search, nameColFilter, articleNoColFilter, globalAdvancedFilter, lineMultiFilter, classificationFilter, productTypeFilter, unitsOuterFilter, outerWFilter, outerLFilter, outerHFilter, dynamicColFilters, weightIssueFilter, searchMode, selectedSearchItems]); // ── Sorted rows ────────────────────────────────────────────────────────── const sortedRows = useMemo(() => { @@ -796,13 +811,32 @@ export function PricingView({ data, headers, onSaveRow, onCaptureState, onEdit, > - ) : ( -
- -
)} + + + {openFilter === 'global' && ( +
+ setOpenFilter(null)} + /> +
+ )} + {/* Search Dropdown Panel */} {isSearchOpen && searchSuggestions.length > 0 && (