From 070a896072a71ceaeef6f77cb12c289bfe017eb6 Mon Sep 17 00:00:00 2001 From: Gulum Date: Mon, 22 Jun 2026 14:32:36 +0200 Subject: [PATCH] =?UTF-8?q?feat(rennmausakte):=20Hinweis-Chip=20f=C3=BCr?= =?UTF-8?q?=20Geschwisterverpaarung=20in=20der=20Tierakte?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Stammt ein Tier aus einer Vollgeschwister-Verpaarung (Vater und Mutter teilen dieselbe litterId), zeigt die Rennmausakte jetzt einen Chip "⚭ Geschwisterverpaarung" in der Fakten-Zeile — neben Geschlecht, Geburtsdatum und Farbschlag, in Akzentfarbe hervorgehoben (zuchtrelevant). e2e-Test: Chip erscheint für 'Inzucht Kind' (Eltern aus demselben Wurf), nicht für 'Krümel' (Eltern aus verschiedenen Würfen). Co-Authored-By: Claude Opus 4.8 --- gerbil-manager-web/e2e/tiere.spec.ts | 14 ++++++++++++++ gerbil-manager-web/src/pages/GerbilDetailPage.tsx | 15 +++++++++++++++ gerbil-manager-web/src/pages/rennmausakte.css | 6 ++++++ gerbil-manager-web/src/strings/de.ts | 4 ++++ 4 files changed, 39 insertions(+) diff --git a/gerbil-manager-web/e2e/tiere.spec.ts b/gerbil-manager-web/e2e/tiere.spec.ts index 3f70d8f..6e6b27a 100644 --- a/gerbil-manager-web/e2e/tiere.spec.ts +++ b/gerbil-manager-web/e2e/tiere.spec.ts @@ -104,6 +104,20 @@ test('Detailseite: Wurf-Feld ist ein Link zur Wurf-Detailseite (WURF-LINK)', asy await expect(page.getByRole('heading', { name: 'Wurf K' })).toBeVisible() }) +test('Detailseite zeigt Geschwisterverpaarungs-Hinweis nur wenn die Eltern Vollgeschwister sind (SIBLING-PAIRING)', async ({ page }) => { + skipUnlessMock() + // 'Inzucht Kind': Eltern Zwilling Bock + Zwilling Maus aus demselben Wurf + // 'w-zwillinge' → Vollgeschwister → Hinweis sichtbar. + await page.goto('/rennmaeuse/inzucht-kind') + await expect(page.getByRole('heading', { name: 'Inzucht Kind' })).toBeVisible() + await expect(page.locator('.ak-fact--sibling')).toContainText(t.detail.siblingPairing) + + // 'Krümel': Eltern Fridolin × Luna aus verschiedenen Würfen → kein Hinweis. + await page.goto('/rennmaeuse/kruemel') + await expect(page.getByRole('heading', { name: 'Krümel' })).toBeVisible() + await expect(page.locator('.ak-fact--sibling')).toHaveCount(0) +}) + test('Detailseite: Herkunft zeigt originBreeder als Text wenn kein Kontakt (WURF-LINK-Addendum)', async ({ page }) => { skipUnlessMock() // Fridolin hat originContactId=null + originBreeder='Zoohandlung Meier' → plain text, kein Link diff --git a/gerbil-manager-web/src/pages/GerbilDetailPage.tsx b/gerbil-manager-web/src/pages/GerbilDetailPage.tsx index 1994400..ad7511e 100644 --- a/gerbil-manager-web/src/pages/GerbilDetailPage.tsx +++ b/gerbil-manager-web/src/pages/GerbilDetailPage.tsx @@ -137,6 +137,15 @@ export default function GerbilDetailPage() { const lookup = (map: Map, key: string | null) => (key ? (map.get(key) ?? '—') : '—') const storedColorName = g.colorVarietyId ? (colorName.get(g.colorVarietyId) ?? null) : null + // Geschwisterverpaarung: Vater und Mutter dieses Tiers stammen aus demselben + // Wurf (Vollgeschwister) — erkennbar an gemeinsamer litterId der Eltern. + const isSiblingPairing = + !!father.data && + !!mother.data && + father.data.id !== mother.data.id && + !!father.data.litterId && + father.data.litterId === mother.data.litterId + const parentLink = ( pid: string | null, p: Parameters[0] | null, @@ -204,6 +213,12 @@ export default function GerbilDetailPage() { {storedColorName} )} + {isSiblingPairing && ( + + + {t.detail.siblingPairing} + + )}
diff --git a/gerbil-manager-web/src/pages/rennmausakte.css b/gerbil-manager-web/src/pages/rennmausakte.css index 34e7e8d..7305160 100644 --- a/gerbil-manager-web/src/pages/rennmausakte.css +++ b/gerbil-manager-web/src/pages/rennmausakte.css @@ -139,6 +139,12 @@ font-weight: 600; color: var(--color-text); } +/* Geschwisterverpaarung: hervorgehoben, da zuchtrelevant (Inzucht). */ +.ak-fact--sibling { + background: color-mix(in srgb, var(--color-accent) 12%, var(--color-surface)); + border-color: var(--color-accent); + color: var(--color-accent); +} /* ---------- Actions ---------- */ .ak-actions { diff --git a/gerbil-manager-web/src/strings/de.ts b/gerbil-manager-web/src/strings/de.ts index d43909a..7f36ec5 100644 --- a/gerbil-manager-web/src/strings/de.ts +++ b/gerbil-manager-web/src/strings/de.ts @@ -122,6 +122,10 @@ export const de = { parentLittersEmpty: 'Keine Würfe als Elternteil erfasst.', parentLittersRoleVater: 'Vater', parentLittersRoleMutter: 'Mutter', + // Hinweis: Eltern dieses Tiers sind Vollgeschwister (gleicher Wurf). + siblingPairing: 'Geschwisterverpaarung', + siblingPairingTitle: + 'Die Eltern dieses Tiers stammen aus demselben Wurf (Vollgeschwister).', }, // Formular (anlegen/bearbeiten) form: {