feat: implement multi-word AND search in all views and initialize RuFlo V3

This commit is contained in:
Christian Vidal Wolf
2026-04-24 12:20:14 +02:00
parent b662acddd7
commit 97fe06eedd
11 changed files with 639 additions and 37 deletions
+19 -12
View File
@@ -114,12 +114,16 @@ export function PricingView({ data, headers, onSaveRow, onCaptureState, onEdit,
const searchSuggestions = useMemo(() => {
if (!search && selectedSearchItems.size === 0) return data.slice(0, 50);
if (!search) return [];
const s = search.toLowerCase();
return data.filter(r =>
String(r[COLUMNS.ARTICLE_NO] || '').toLowerCase().includes(s) ||
String(r[COLUMNS.ARTICLE_NAME] || '').toLowerCase().includes(s)
).slice(0, 50);
}, [data, search, selectedSearchItems]);
const terms = search.toLowerCase().split(/\s+/).filter(Boolean);
if (terms.length === 0) return data.slice(0, 50);
return data.filter(r => {
const articleNo = String(r[COLUMNS.ARTICLE_NO] || '').toLowerCase();
const articleName = String(r[COLUMNS.ARTICLE_NAME] || '').toLowerCase();
return terms.every(term => articleNo.includes(term) || articleName.includes(term));
}).slice(0, 50);
}, [data, search, selectedSearchItems, COLUMNS]);
const handleSearchItemClick = (index: number) => {
const newSelected = new Set(selectedSearchItems);
@@ -310,13 +314,16 @@ export function PricingView({ data, headers, onSaveRow, onCaptureState, onEdit,
case 'units_errors': result = analyzedRows.filter(r => r.unitErrors.length > 0); break;
}
// Global search (SKU + Name)
// Global search (SKU + Name) - Multi-word AND support
if (search) {
const s = search.toLowerCase();
result = result.filter(r =>
String(r.row[COLUMNS.ARTICLE_NO] || '').toLowerCase().includes(s) ||
String(r.row[COLUMNS.ARTICLE_NAME] || '').toLowerCase().includes(s)
);
const terms = search.toLowerCase().split(/\s+/).filter(Boolean);
if (terms.length > 0) {
result = result.filter(r => {
const articleNo = String(r.row[COLUMNS.ARTICLE_NO] || '').toLowerCase();
const articleName = String(r.row[COLUMNS.ARTICLE_NAME] || '').toLowerCase();
return terms.every(term => articleNo.includes(term) || articleName.includes(term));
});
}
}
// Selected items from search dropdown