Tier-Familien-Seiten verfeinert, Foto-Karussell, Partnercode auf Sale-Ausschluss
Mehrere Feinschliff-Punkte auf den Tier-Familien-Seiten (z.B. "Hase"): - Abstand zwischen der Story-Box und der Kartenreihe verkleinert (vorher durch zwei separate Section-Umrandungen unnötig groß) — beide Bereiche teilen sich jetzt eine gemeinsame Section statt zwei gestapelte. - Platzhalter-Karten (Charaktere ohne Foto) bekommen jetzt exakt die gleiche Bildhöhe wie eine Karte mit echtem Foto (vorher griff nur die allgemeine Mindesthöhe, wirkte kleiner/anders proportioniert). - Neues optionales Feld `bannerName` an der Unterkategorie: überschreibt NUR die große Bannerüberschrift (Breadcrumb/Chips bleiben unverändert) — für "Hase" jetzt auf "HasiDog" gesetzt, den bekanntesten Charakter der Familie. - Unterkategorie-Seiten ganz ohne Produkte/Charaktere (z.B. Maschen- markierer, Holzknöpfe) zeigen jetzt schon 3 vorbereitete Platzhalter- Karten im selben Kartenstil statt nur einer nackten Textzeile — die Seite "sieht schon fertig aus", auch bevor echte Produkte da sind. Nebenbei einen Bug behoben: bei Unterkategorien ohne Charaktere, aber MIT echten Produkten, erschien vorher zusätzlich fälschlich der "noch keine Produkte"-Hinweis über der echten Produktreihe. Neu: Mini-Bildkarussell direkt auf jeder Produktkarte (Shop-Grid, Charakter-Kacheln, "Weitere Modelle", Sale-Seite, Startseite — überall wo ProductCard verwendet wird). Sobald ein Produkt mehrere Fotos hat (Admin-Bereich erlaubt das bereits über das Foto-Listenfeld), erscheinen dezente ‹/›-Pfeile plus Punkte-Indikator direkt auf der Karte, ganz ohne erst die Produktseite öffnen zu müssen. Neu: Partner-Rabattcodes können im Admin jetzt gezielt auf "gilt NICHT für Artikel, die schon im Sale sind" gestellt werden (giltAufSale: false) — der Rabatt berechnet sich dann nur noch auf den regulär bepreisten Teil des Warenkorbs, damit sich der Partner-Rabatt nicht zusätzlich auf einen bereits reduzierten Preis obendrauf summiert. Standardverhalten (Feld leer/true) bleibt wie bisher unverändert. Alle Änderungen lokal mit Test-Daten durchgespielt (mehrere Testfotos, Testprodukt im Sale + Partnercode mit/ohne giltAufSale, leere Unterkategorie-Seite) und vor dem Commit wieder zurückgesetzt. Co-Authored-By: Claude Sonnet 5 <[email protected]>
This commit is contained in:
co-authored by
Claude Sonnet 5
parent
6fc64e0972
commit
e48700f982
@@ -24,6 +24,11 @@ export interface Character {
|
||||
export interface Subcategory {
|
||||
slug: string;
|
||||
name: LocalizedText;
|
||||
// Überschreibt NUR die große Überschrift im Banner oben auf der Unterkategorie-Seite (Breadcrumb,
|
||||
// Navigations-Chips etc. zeigen weiterhin `name`) — z.B. um bei "Hase" statt des Familiennamens
|
||||
// gezielt den bekanntesten Charakter ("HasiDog") ins Rampenlicht zu stellen. Optional; ohne
|
||||
// Angabe verhält sich die Seite wie bisher (zeigt `name`).
|
||||
bannerName?: LocalizedText;
|
||||
// Ein oder mehrere Charaktere dieser Tier-Familie — jeder bekommt seine eigene Box auf der
|
||||
// Unterkategorie-Seite (Foto/Text abwechselnd links/rechts), verknüpft mit dem passenden
|
||||
// Produkt über Product.charakter (siehe products.ts).
|
||||
|
||||
@@ -26,6 +26,12 @@ export interface Partnercode {
|
||||
bis?: string; // ISO-Datum, optional
|
||||
/** Auf false setzen, um einen Code zu pausieren, ohne ihn (und die Partner-Historie) zu löschen. */
|
||||
aktiv?: boolean;
|
||||
/** Ob der Code auch auf Artikel gilt, die schon im Sale sind (preisAlt gesetzt ODER aktiver
|
||||
* Prozent-/Betrags-Rabatt, siehe istImSale() in rabatt.ts). Standard: true (wie bisher — gilt
|
||||
* auf alles). Auf false setzen, damit der Partner-Rabatt NICHT zusätzlich auf schon
|
||||
* reduzierte Artikel obendrauf kommt, sondern nur auf regulär bepreiste Artikel im Warenkorb
|
||||
* wirkt. */
|
||||
giltAufSale?: boolean;
|
||||
}
|
||||
|
||||
const partnercodes = (partnercodesRaw as { codes: Partnercode[] }).codes ?? [];
|
||||
|
||||
@@ -41,6 +41,14 @@ export function hatAktivenRabatt(product: Product): boolean {
|
||||
return effektiverPreis(product) < product.preis;
|
||||
}
|
||||
|
||||
/** Ob ein Produkt gerade "im Sale" ist — zählt sowohl den klassischen, manuell gesetzten
|
||||
* Sale-Preis (preisAlt) als auch einen automatisch berechneten, noch aktiven Prozent-/
|
||||
* Betrags-Rabatt. Wird u.a. von Partner-Rabattcodes genutzt, die per Admin-Einstellung NUR auf
|
||||
* regulär bepreiste Artikel gelten sollen (siehe Partnercode.giltAufSale in partnercodes.ts). */
|
||||
export function istImSale(product: Product): boolean {
|
||||
return Boolean(product.preisAlt) || hatAktivenRabatt(product);
|
||||
}
|
||||
|
||||
/** Für die Badge-Anzeige: "-20%" oder "-5 €", je nachdem was hinterlegt ist. */
|
||||
export function rabattLabel(product: Product): string | null {
|
||||
const r = product.rabatt;
|
||||
|
||||
Reference in New Issue
Block a user