Fix: Haupt-Charakter einer Tier-Familie verliert Story-Box nicht mehr ohne Produkt

Der letzte Commit hatte Story-Boxen komplett an ein zugeordnetes Produkt
gekoppelt - das entfernte zwar wie gewuenscht HasiGott/Mama Hase (Hase-Familie
hat bereits HasiDog als Produkt), loeschte aber ungewollt auch die Box des
Haupt-Charakters bei Familien ohne eigenes Produkt (z.B. Frieda bei der Kuh).

Jetzt bekommt immer der erste/Haupt-Charakter einer Familie eine Story-Box,
zusaetzliche Charaktere weiterhin nur mit echtem Produkt.

Co-Authored-By: Claude Sonnet 5 <[email protected]>
This commit is contained in:
qcigano
2026-08-03 02:01:52 +02:00
co-authored by Claude Sonnet 5
parent fa5287484e
commit 739c0845ba
4 changed files with 24 additions and 14 deletions
@@ -35,11 +35,12 @@ const characterEntries = characters.map((char) => ({
product: alleProdukte.find((p) => p.charakter === char.slug),
}));
const characterEntriesMitProdukt = characterEntries.filter((e) => e.product);
const characterEntriesFuerStory = characterEntries.filter((e, i) => i === 0 || e.product);
// Produkte ohne (bekannte) Charakter-Zuordnung landen als "weitere Modelle" darunter.
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 hatStoryBoxen = characterEntriesFuerStory.length > 0;
const hatProduktKarten = characterEntriesMitProdukt.length > 0;
const hatWeitere = weitere.length > 0;
const komplettLeer = !hatProduktKarten && !hatWeitere;
@@ -57,11 +58,11 @@ const komplettLeer = !hatProduktKarten && !hatWeitere;
</section>
</div>
{hatProduktKarten && (
{hatStoryBoxen && (
<section class="section-tight">
<div class="container">
<div class="character-stories">
{characterEntriesMitProdukt.map(({ char }) => (
{characterEntriesFuerStory.map(({ char }) => (
<div class="card character-story">
{char.vorstellung && <span class="eyebrow">{char.vorstellung[lang].split("\n")[0]}</span>}
<p>{char.vorstellung ? char.vorstellung[lang].split("\n")[1] : ""}</p>
@@ -35,11 +35,12 @@ const characterEntries = characters.map((char) => ({
product: alleProdukte.find((p) => p.charakter === char.slug),
}));
const characterEntriesMitProdukt = characterEntries.filter((e) => e.product);
const characterEntriesFuerStory = characterEntries.filter((e, i) => i === 0 || e.product);
// Produkte ohne (bekannte) Charakter-Zuordnung landen als "weitere Modelle" darunter.
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 hatStoryBoxen = characterEntriesFuerStory.length > 0;
const hatProduktKarten = characterEntriesMitProdukt.length > 0;
const hatWeitere = weitere.length > 0;
const komplettLeer = !hatProduktKarten && !hatWeitere;
@@ -57,11 +58,11 @@ const komplettLeer = !hatProduktKarten && !hatWeitere;
</section>
</div>
{hatProduktKarten && (
{hatStoryBoxen && (
<section class="section-tight">
<div class="container">
<div class="character-stories">
{characterEntriesMitProdukt.map(({ char }) => (
{characterEntriesFuerStory.map(({ char }) => (
<div class="card character-story">
{char.vorstellung && <span class="eyebrow">{char.vorstellung[lang].split("\n")[0]}</span>}
<p>{char.vorstellung ? char.vorstellung[lang].split("\n")[1] : ""}</p>
@@ -35,11 +35,12 @@ const characterEntries = characters.map((char) => ({
product: alleProdukte.find((p) => p.charakter === char.slug),
}));
const characterEntriesMitProdukt = characterEntries.filter((e) => e.product);
const characterEntriesFuerStory = characterEntries.filter((e, i) => i === 0 || e.product);
// Produkte ohne (bekannte) Charakter-Zuordnung landen als "weitere Modelle" darunter.
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 hatStoryBoxen = characterEntriesFuerStory.length > 0;
const hatProduktKarten = characterEntriesMitProdukt.length > 0;
const hatWeitere = weitere.length > 0;
const komplettLeer = !hatProduktKarten && !hatWeitere;
@@ -57,11 +58,11 @@ const komplettLeer = !hatProduktKarten && !hatWeitere;
</section>
</div>
{hatProduktKarten && (
{hatStoryBoxen && (
<section class="section-tight">
<div class="container">
<div class="character-stories">
{characterEntriesMitProdukt.map(({ char }) => (
{characterEntriesFuerStory.map(({ char }) => (
<div class="card character-story">
{char.vorstellung && <span class="eyebrow">{char.vorstellung[lang].split("\n")[0]}</span>}
<p>{char.vorstellung ? char.vorstellung[lang].split("\n")[1] : ""}</p>
@@ -36,10 +36,17 @@ const characterEntries = characters.map((char) => ({
}));
const characterEntriesMitProdukt = characterEntries.filter((e) => e.product);
// Story-Boxen: der Haupt-Charakter der Familie (der erste im Admin, meist der mit dem
// Banner-Namen) bekommt immer eine Vorstellungsbox, auch bevor ein Produkt für ihn existiert —
// sonst wirkt eine ganz neue Tier-Familie leer. Weitere/zusätzliche Charaktere derselben Familie
// (z.B. Geschwister) bekommen dagegen NUR dann eine eigene Box, wenn ihnen im Admin auch
// wirklich ein eigenes Produkt zugeordnet ist.
const characterEntriesFuerStory = characterEntries.filter((e, i) => i === 0 || e.product);
// Produkte ohne (bekannte) Charakter-Zuordnung landen als "weitere Modelle" darunter.
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 hatStoryBoxen = characterEntriesFuerStory.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
@@ -60,15 +67,15 @@ const komplettLeer = !hatProduktKarten && !hatWeitere;
</section>
</div>
{hatProduktKarten && (
{hatStoryBoxen && (
<section class="section-tight">
<div class="container">
{/* Die persönlichen Charaktergeschichten stehen als eigene, volle Breite Boxen ÜBER der
Kartenreihe — getrennt von den "Shop"-Karten darunter, die nur Foto/Preis/Infos zeigen.
Nur Charaktere mit echtem Produkt bekommen hier überhaupt eine Box (kein Charakter ohne
Ware im Shop), damit es keine Vorstellungen "ins Leere" gibt. */}
Der Haupt-Charakter der Familie bekommt immer eine Box, weitere Charaktere nur mit
echtem Produkt (siehe characterEntriesFuerStory oben). */}
<div class="character-stories">
{characterEntriesMitProdukt.map(({ char }) => (
{characterEntriesFuerStory.map(({ char }) => (
<div class="card character-story">
{char.vorstellung && <span class="eyebrow">{char.vorstellung[lang].split("\n")[0]}</span>}
<p>{char.vorstellung ? char.vorstellung[lang].split("\n")[1] : ""}</p>