feat: Geschenk- und Honigwissen-Hinweise auf der Produktseite, Umlaut-Suche fixen
- Produktdetailseite: dezenter Hinweis direkt bei der Kaufentscheidung, dass beim Checkout eine persoenliche Geschenknachricht hinterlegt werden kann (Feature existierte bereits, war aber nur im Checkout-Formular selbst sichtbar — zu spaet, um Mengen-/Produktwahl noch zu beeinflussen) - Produktdetailseite (Honig): kontextuelle Links zu passenden Honigwissen-Artikeln (Kristallisation immer, Fruehtracht/Sommertracht wenn aus Harvest.type erkennbar) direkt bei den Produktdetails statt einer isolierten, von der Kaufseite aus unverlinkten Wissenssektion - Suche (Shop-Uebersicht + Live-Suchvorschlaege) gleicht jetzt deutsche Umlaute/scharfes S gegen ihre ASCII-Transliteration ab (z.B. "Bluete" findet "Bluete"-Produkte, "kraeftig" findet "kräftig") — vorher lieferte eine Suche in der jeweils anderen Schreibweise keine Treffer, obwohl der Katalog durchgaengig echte Umlaute verwendet; Logik in neuer, reiner lib/search-match.ts mit eigenen Tests ausgelagert - Bewusst NICHT angefasst: Newsletter-Rabattanreiz (fehlt, aber Prozentsatz/ Mechanik ist eine Owner-Entscheidung) und Trust-Badges am Kaufabschluss (bereits vorhanden auf Produktseite/Warenkorb/Checkout) Verifikation: pnpm exec tsc --noEmit clean, pnpm test 151/151 (15 Dateien, +9 neue Tests fuer search-match), pnpm build erfolgreich.
This commit is contained in:
1 parent
de0f6ee249
commit
a579ebabeb
7 files changed
+114
-6
No files matched your search
+6
-5
@@ -1,5 +1,6 @@
|
||||
import { prisma } from "@/lib/prisma";
|
||||
import { asStringArray } from "@/lib/json-array";
|
||||
import { matchesSearchQuery } from "@/lib/search-match";
|
||||
import type { Product, Harvest, Batch, ProductCategory, Prisma } from "@/generated/prisma/client";
|
||||
|
||||
// tasteTags/images sind im Schema als Json modelliert (MySQL-Kompatibilitaet,
|
||||
@@ -70,12 +71,12 @@ export async function getActiveProducts(
|
||||
// ueberschaubaren Katalogsgroesse wird deshalb hier statt in der DB-Query
|
||||
// gefiltert. Das behebt zugleich, dass mehrwortige, gemischt geschriebene
|
||||
// Tags wie "reines Bienenwachs" bei case-insensitiver Suche nie trafen.
|
||||
const words = trimmed.toLowerCase().split(/\s+/).filter(Boolean);
|
||||
// matchesSearchQuery gleicht zusaetzlich Umlaute/ASCII-Transliteration ab
|
||||
// (z.B. "Bluete" <-> "Blüte"), da Produktnamen/-tags durchgaengig echte
|
||||
// Umlaute verwenden, aber nicht jede Kundin/jeder Kunde sie eintippt.
|
||||
return products.filter((product) => {
|
||||
const haystack = [product.name, product.description, ...product.tasteTags]
|
||||
.join(" ")
|
||||
.toLowerCase();
|
||||
return words.every((word) => haystack.includes(word));
|
||||
const haystack = [product.name, product.description, ...product.tasteTags].join(" ");
|
||||
return matchesSearchQuery(haystack, trimmed);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user