From a4aff8aa7d9af883a0b629f822b11f70c84b3f9f Mon Sep 17 00:00:00 2001 From: qcigano Date: Mon, 3 Aug 2026 01:01:52 +0200 Subject: [PATCH] =?UTF-8?q?Charakter-Vorstellungen=20wieder=20f=C3=BCr=20a?= =?UTF-8?q?lle=20sichtbar,=20Shop-Karten=20bleiben=20streng?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Klarstellung zur gestrigen Änderung: die persönliche Vorstellung ("Hallo, ich bin Frieda...") ist reiner Text ohne Kaufversprechen und wird jetzt wieder für JEDEN im Admin definierten Charakter gezeigt, auch bevor ein passendes Produkt existiert (Frieda, Sam, Siggi, Gaby, Pingi sind wieder mit ihrem echten Vorstellungstext auf ihren Seiten zu sehen). Die "Mehr über mich"-Schaltfläche bleibt aber weiterhin nur bei Charakteren mit hinterlegtem Link (aktuell nur HasiDog). Die eigentliche Shop-Karte (Foto/Preis/Kaufinfos) bleibt dagegen streng wie gestern festgelegt: die gibt es nach wie vor NUR für Charaktere mit echtem, im Admin zugeordnetem Produkt — kein Vorstellungstext täuscht mehr einen kaufbaren Artikel vor. Ohne Produkt erscheinen stattdessen die bereits vorbereiteten, namenlosen "Kommt bald"-Karten darunter. Co-Authored-By: Claude Sonnet 5 --- .../shop/[kategorie]/[unterkategorie].astro | 36 +++++++++------- .../shop/[kategorie]/[unterkategorie].astro | 36 +++++++++------- .../shop/[kategorie]/[unterkategorie].astro | 36 +++++++++------- .../shop/[kategorie]/[unterkategorie].astro | 42 +++++++++++-------- 4 files changed, 91 insertions(+), 59 deletions(-) diff --git a/src/pages/ch/shop/[kategorie]/[unterkategorie].astro b/src/pages/ch/shop/[kategorie]/[unterkategorie].astro index df52d1f..b884e86 100644 --- a/src/pages/ch/shop/[kategorie]/[unterkategorie].astro +++ b/src/pages/ch/shop/[kategorie]/[unterkategorie].astro @@ -21,22 +21,28 @@ const sub = getSubcategory(kategorie!, unterkategorie!)!; // Alle Produkte dieser Unterkategorie (unabhängig davon, welchem Charakter sie zugeordnet sind). const alleProdukte = productsByUnterkategorie(category.slug, sub.slug); -// Ein Charakter (aus dem Kategorien-Bereich im Admin) ist erstmal nur eine VORBEREITETE -// Definition — er erscheint auf der Seite NUR, wenn ihm im Admin auch wirklich ein Produkt mit -// genau diesem Charakter-Code zugeordnet wurde (das Feld "Charakter" am Produkt = seine "Rolle"). -// Ohne zugeordnetes Produkt taucht er hier NICHT auf, auch nicht als Platzhalter — nur echte, -// im Admin angelegte Artikel dürfen auf der Seite erscheinen. +// Zwei getrennte Dinge: die persönliche Vorstellung (Story-Box, "Hallo, ich bin ...") ist reiner +// Vorstellungstext OHNE Kaufversprechen — die zeigt VanVan für JEDEN im Admin definierten +// Charakter, auch schon bevor dafür ein Produkt existiert. Die "Mehr über mich"-Schaltfläche +// erscheint dabei nur, wenn der Charakter auch wirklich einen externen Link (mehrLink) hat. +// Eine echte Shop-KARTE (Foto/Preis/Kaufinfos) bekommt ein Charakter dagegen NUR, wenn ihm im +// Admin auch wirklich ein Produkt mit genau diesem Charakter-Code zugeordnet wurde (das Feld +// "Charakter" am Produkt = seine "Rolle") — ohne echtes Produkt gibt es keine Karte, die einen +// Kauf vortäuscht. const characters = sub.characters ?? []; -const characterEntries = characters - .map((char) => ({ char, product: alleProdukte.find((p) => p.charakter === char.slug) })) - .filter((e) => e.product); +const characterEntries = characters.map((char) => ({ + char, + product: alleProdukte.find((p) => p.charakter === char.slug), +})); +const characterEntriesMitProdukt = characterEntries.filter((e) => e.product); // Produkte ohne (bekannte) Charakter-Zuordnung landen als "weitere Modelle" darunter. -const zugeordneteSlugs = new Set(characterEntries.map((e) => e.product!.slug)); +const zugeordneteSlugs = new Set(characterEntriesMitProdukt.map((e) => e.product!.slug)); const weitere = alleProdukte.filter((p) => !zugeordneteSlugs.has(p.slug)); const hatCharaktere = characterEntries.length > 0; +const hatProduktKarten = characterEntriesMitProdukt.length > 0; const hatWeitere = weitere.length > 0; -const komplettLeer = !hatCharaktere && !hatWeitere; +const komplettLeer = !hatProduktKarten && !hatWeitere; ---
@@ -69,9 +75,11 @@ const komplettLeer = !hatCharaktere && !hatWeitere; ))}
-
- {characterEntries.map(({ product }) => )} -
+ {hatProduktKarten && ( +
+ {characterEntriesMitProdukt.map(({ product }) => )} +
+ )} )} @@ -97,7 +105,7 @@ const komplettLeer = !hatCharaktere && !hatWeitere; {hatWeitere && (
- {hatCharaktere &&

{t.shop.moreVariants}

} + {hatProduktKarten &&

{t.shop.moreVariants}

}
{weitere.map((p) => )}
diff --git a/src/pages/en/shop/[kategorie]/[unterkategorie].astro b/src/pages/en/shop/[kategorie]/[unterkategorie].astro index 8f0b31e..a978d7b 100644 --- a/src/pages/en/shop/[kategorie]/[unterkategorie].astro +++ b/src/pages/en/shop/[kategorie]/[unterkategorie].astro @@ -21,22 +21,28 @@ const sub = getSubcategory(kategorie!, unterkategorie!)!; // Alle Produkte dieser Unterkategorie (unabhängig davon, welchem Charakter sie zugeordnet sind). const alleProdukte = productsByUnterkategorie(category.slug, sub.slug); -// Ein Charakter (aus dem Kategorien-Bereich im Admin) ist erstmal nur eine VORBEREITETE -// Definition — er erscheint auf der Seite NUR, wenn ihm im Admin auch wirklich ein Produkt mit -// genau diesem Charakter-Code zugeordnet wurde (das Feld "Charakter" am Produkt = seine "Rolle"). -// Ohne zugeordnetes Produkt taucht er hier NICHT auf, auch nicht als Platzhalter — nur echte, -// im Admin angelegte Artikel dürfen auf der Seite erscheinen. +// Zwei getrennte Dinge: die persönliche Vorstellung (Story-Box, "Hallo, ich bin ...") ist reiner +// Vorstellungstext OHNE Kaufversprechen — die zeigt VanVan für JEDEN im Admin definierten +// Charakter, auch schon bevor dafür ein Produkt existiert. Die "Mehr über mich"-Schaltfläche +// erscheint dabei nur, wenn der Charakter auch wirklich einen externen Link (mehrLink) hat. +// Eine echte Shop-KARTE (Foto/Preis/Kaufinfos) bekommt ein Charakter dagegen NUR, wenn ihm im +// Admin auch wirklich ein Produkt mit genau diesem Charakter-Code zugeordnet wurde (das Feld +// "Charakter" am Produkt = seine "Rolle") — ohne echtes Produkt gibt es keine Karte, die einen +// Kauf vortäuscht. const characters = sub.characters ?? []; -const characterEntries = characters - .map((char) => ({ char, product: alleProdukte.find((p) => p.charakter === char.slug) })) - .filter((e) => e.product); +const characterEntries = characters.map((char) => ({ + char, + product: alleProdukte.find((p) => p.charakter === char.slug), +})); +const characterEntriesMitProdukt = characterEntries.filter((e) => e.product); // Produkte ohne (bekannte) Charakter-Zuordnung landen als "weitere Modelle" darunter. -const zugeordneteSlugs = new Set(characterEntries.map((e) => e.product!.slug)); +const zugeordneteSlugs = new Set(characterEntriesMitProdukt.map((e) => e.product!.slug)); const weitere = alleProdukte.filter((p) => !zugeordneteSlugs.has(p.slug)); const hatCharaktere = characterEntries.length > 0; +const hatProduktKarten = characterEntriesMitProdukt.length > 0; const hatWeitere = weitere.length > 0; -const komplettLeer = !hatCharaktere && !hatWeitere; +const komplettLeer = !hatProduktKarten && !hatWeitere; ---
@@ -69,9 +75,11 @@ const komplettLeer = !hatCharaktere && !hatWeitere; ))}
-
- {characterEntries.map(({ product }) => )} -
+ {hatProduktKarten && ( +
+ {characterEntriesMitProdukt.map(({ product }) => )} +
+ )} )} @@ -97,7 +105,7 @@ const komplettLeer = !hatCharaktere && !hatWeitere; {hatWeitere && (
- {hatCharaktere &&

{t.shop.moreVariants}

} + {hatProduktKarten &&

{t.shop.moreVariants}

}
{weitere.map((p) => )}
diff --git a/src/pages/fr/shop/[kategorie]/[unterkategorie].astro b/src/pages/fr/shop/[kategorie]/[unterkategorie].astro index 0442a28..62e7fae 100644 --- a/src/pages/fr/shop/[kategorie]/[unterkategorie].astro +++ b/src/pages/fr/shop/[kategorie]/[unterkategorie].astro @@ -21,22 +21,28 @@ const sub = getSubcategory(kategorie!, unterkategorie!)!; // Alle Produkte dieser Unterkategorie (unabhängig davon, welchem Charakter sie zugeordnet sind). const alleProdukte = productsByUnterkategorie(category.slug, sub.slug); -// Ein Charakter (aus dem Kategorien-Bereich im Admin) ist erstmal nur eine VORBEREITETE -// Definition — er erscheint auf der Seite NUR, wenn ihm im Admin auch wirklich ein Produkt mit -// genau diesem Charakter-Code zugeordnet wurde (das Feld "Charakter" am Produkt = seine "Rolle"). -// Ohne zugeordnetes Produkt taucht er hier NICHT auf, auch nicht als Platzhalter — nur echte, -// im Admin angelegte Artikel dürfen auf der Seite erscheinen. +// Zwei getrennte Dinge: die persönliche Vorstellung (Story-Box, "Hallo, ich bin ...") ist reiner +// Vorstellungstext OHNE Kaufversprechen — die zeigt VanVan für JEDEN im Admin definierten +// Charakter, auch schon bevor dafür ein Produkt existiert. Die "Mehr über mich"-Schaltfläche +// erscheint dabei nur, wenn der Charakter auch wirklich einen externen Link (mehrLink) hat. +// Eine echte Shop-KARTE (Foto/Preis/Kaufinfos) bekommt ein Charakter dagegen NUR, wenn ihm im +// Admin auch wirklich ein Produkt mit genau diesem Charakter-Code zugeordnet wurde (das Feld +// "Charakter" am Produkt = seine "Rolle") — ohne echtes Produkt gibt es keine Karte, die einen +// Kauf vortäuscht. const characters = sub.characters ?? []; -const characterEntries = characters - .map((char) => ({ char, product: alleProdukte.find((p) => p.charakter === char.slug) })) - .filter((e) => e.product); +const characterEntries = characters.map((char) => ({ + char, + product: alleProdukte.find((p) => p.charakter === char.slug), +})); +const characterEntriesMitProdukt = characterEntries.filter((e) => e.product); // Produkte ohne (bekannte) Charakter-Zuordnung landen als "weitere Modelle" darunter. -const zugeordneteSlugs = new Set(characterEntries.map((e) => e.product!.slug)); +const zugeordneteSlugs = new Set(characterEntriesMitProdukt.map((e) => e.product!.slug)); const weitere = alleProdukte.filter((p) => !zugeordneteSlugs.has(p.slug)); const hatCharaktere = characterEntries.length > 0; +const hatProduktKarten = characterEntriesMitProdukt.length > 0; const hatWeitere = weitere.length > 0; -const komplettLeer = !hatCharaktere && !hatWeitere; +const komplettLeer = !hatProduktKarten && !hatWeitere; ---
@@ -69,9 +75,11 @@ const komplettLeer = !hatCharaktere && !hatWeitere; ))}
-
- {characterEntries.map(({ product }) => )} -
+ {hatProduktKarten && ( +
+ {characterEntriesMitProdukt.map(({ product }) => )} +
+ )} )} @@ -97,7 +105,7 @@ const komplettLeer = !hatCharaktere && !hatWeitere; {hatWeitere && (
- {hatCharaktere &&

{t.shop.moreVariants}

} + {hatProduktKarten &&

{t.shop.moreVariants}

}
{weitere.map((p) => )}
diff --git a/src/pages/shop/[kategorie]/[unterkategorie].astro b/src/pages/shop/[kategorie]/[unterkategorie].astro index 460e0ee..065e3fa 100644 --- a/src/pages/shop/[kategorie]/[unterkategorie].astro +++ b/src/pages/shop/[kategorie]/[unterkategorie].astro @@ -21,26 +21,31 @@ const sub = getSubcategory(kategorie!, unterkategorie!)!; // Alle Produkte dieser Unterkategorie (unabhängig davon, welchem Charakter sie zugeordnet sind). const alleProdukte = productsByUnterkategorie(category.slug, sub.slug); -// Ein Charakter (aus dem Kategorien-Bereich im Admin) ist erstmal nur eine VORBEREITETE -// Definition — er erscheint auf der Seite NUR, wenn ihm im Admin auch wirklich ein Produkt mit -// genau diesem Charakter-Code zugeordnet wurde (das Feld "Charakter" am Produkt = seine "Rolle"). -// Ohne zugeordnetes Produkt taucht er hier NICHT auf, auch nicht als Platzhalter — nur echte, -// im Admin angelegte Artikel dürfen auf der Seite erscheinen. +// Zwei getrennte Dinge: die persönliche Vorstellung (Story-Box, "Hallo, ich bin ...") ist reiner +// Vorstellungstext OHNE Kaufversprechen — die zeigt VanVan für JEDEN im Admin definierten +// Charakter, auch schon bevor dafür ein Produkt existiert. Die "Mehr über mich"-Schaltfläche +// erscheint dabei nur, wenn der Charakter auch wirklich einen externen Link (mehrLink) hat. +// Eine echte Shop-KARTE (Foto/Preis/Kaufinfos) bekommt ein Charakter dagegen NUR, wenn ihm im +// Admin auch wirklich ein Produkt mit genau diesem Charakter-Code zugeordnet wurde (das Feld +// "Charakter" am Produkt = seine "Rolle") — ohne echtes Produkt gibt es keine Karte, die einen +// Kauf vortäuscht. const characters = sub.characters ?? []; -const characterEntries = characters - .map((char) => ({ char, product: alleProdukte.find((p) => p.charakter === char.slug) })) - .filter((e) => e.product); +const characterEntries = characters.map((char) => ({ + char, + product: alleProdukte.find((p) => p.charakter === char.slug), +})); +const characterEntriesMitProdukt = characterEntries.filter((e) => e.product); // Produkte ohne (bekannte) Charakter-Zuordnung landen als "weitere Modelle" darunter. -const zugeordneteSlugs = new Set(characterEntries.map((e) => e.product!.slug)); +const zugeordneteSlugs = new Set(characterEntriesMitProdukt.map((e) => e.product!.slug)); const weitere = alleProdukte.filter((p) => !zugeordneteSlugs.has(p.slug)); const hatCharaktere = characterEntries.length > 0; +const hatProduktKarten = characterEntriesMitProdukt.length > 0; const hatWeitere = weitere.length > 0; // Damit "schon vorbereitet aussieht", auch wenn VanVan hier noch gar keine Produkte/Charaktere // eingetragen hat: statt einer nackten Text-Zeile zeigen wir schon die spätere Karten-Optik, -// nur eben mit Platzhaltern. Sobald echte Produkte/Charaktere dazukommen, verschwinden diese -// automatisch (siehe hatCharaktere/hatWeitere oben). -const komplettLeer = !hatCharaktere && !hatWeitere; +// nur eben mit Platzhaltern. Sobald echte Produkte dazukommen, verschwinden diese automatisch. +const komplettLeer = !hatProduktKarten && !hatWeitere; ---
@@ -75,10 +80,13 @@ const komplettLeer = !hatCharaktere && !hatWeitere; ))}
- {/* Kartenreihe wie im Shop-Grid — nur Foto, Preis und Kaufinfos, keine Geschichten. */} -
- {characterEntries.map(({ product }) => )} -
+ {/* Kartenreihe wie im Shop-Grid — nur Foto, Preis und Kaufinfos, keine Geschichten. Nur + Charaktere mit echtem Produkt bekommen hier eine Karte. */} + {hatProduktKarten && ( +
+ {characterEntriesMitProdukt.map(({ product }) => )} +
+ )} )} @@ -104,7 +112,7 @@ const komplettLeer = !hatCharaktere && !hatWeitere; {hatWeitere && (
- {hatCharaktere &&

{t.shop.moreVariants}

} + {hatProduktKarten &&

{t.shop.moreVariants}

}
{weitere.map((p) => )}