diff --git a/gerbil-manager-web/e2e/tiere.spec.ts b/gerbil-manager-web/e2e/tiere.spec.ts index 30f7a02..30868d5 100644 --- a/gerbil-manager-web/e2e/tiere.spec.ts +++ b/gerbil-manager-web/e2e/tiere.spec.ts @@ -172,3 +172,27 @@ test('Tier bearbeiten — isDeaf Tristate round-trip (FORM-FIELDS-1)', async ({ await page.goto('/rennmaeuse/kruemel/bearbeiten') await expect(page.getByLabel(t.fields.isDeaf)).toHaveValue('true') }) + +test('Detailseite: Würfe als Elternteil zeigt verlinkten Wurf (ANIMAL-LITTERS)', async ({ page }) => { + skipUnlessMock() + // Fridolin ist fatherId von 'w-kruemel' (Wurf K) + await page.goto('/rennmaeuse/fridolin') + await expect(page.getByRole('heading', { name: 'Fridolin' })).toBeVisible() + await expect(page.getByText(t.detail.parentLittersTitle)).toBeVisible() + // Wurf K als Link sichtbar + const litterLink = page.getByRole('link', { name: /Wurf K/ }) + await expect(litterLink).toBeVisible() + // Vater-Badge sichtbar + await expect(page.getByText(t.detail.parentLittersRoleVater)).toBeVisible() + // Navigation zum Wurf funktioniert + await litterLink.first().click() + await expect(page.getByRole('heading', { name: 'Wurf K' })).toBeVisible() +}) + +test('Detailseite: Keine Würfe als Elternteil zeigt Leer-Zustand (ANIMAL-LITTERS)', async ({ page }) => { + skipUnlessMock() + // Krümel hat keine Würfe als Elternteil (nur als Kind von w-kruemel) + await page.goto('/rennmaeuse/kruemel') + await expect(page.getByText(t.detail.parentLittersTitle)).toBeVisible() + await expect(page.getByText(t.detail.parentLittersEmpty)).toBeVisible() +}) diff --git a/gerbil-manager-web/src/pages/GerbilDetailPage.tsx b/gerbil-manager-web/src/pages/GerbilDetailPage.tsx index e6ea159..898baf3 100644 --- a/gerbil-manager-web/src/pages/GerbilDetailPage.tsx +++ b/gerbil-manager-web/src/pages/GerbilDetailPage.tsx @@ -2,6 +2,7 @@ import { useMemo, useState, type ReactNode } from 'react' import { Link, useParams } from 'react-router-dom' import { de } from '../strings/de' import { getGerbil, updateGerbil } from '../api/gerbils' +import { listLitters as listLittersPaged } from '../api/litters' import { listColorVarieties, listContacts, listEnclosures, listLitters } from '../api/lookups' import { useApi, useMutation } from '../hooks/useApi' import { formatDate, genderLabel, statusLabel } from '../format/labels' @@ -55,6 +56,10 @@ export default function GerbilDetailPage() { const enclosures = useApi(() => listEnclosures(), []) const contacts = useApi(() => listContacts(), []) const litters = useApi(() => listLitters(), []) + const parentLitters = useApi( + () => listLittersPaged({ filter: `fatherId=${id}|motherId=${id}`, orderBy: 'date desc', pageSize: 50 }), + [id], + ) const colorName = useMemo( () => new Map((colorVarieties.data ?? []).map((c) => [c.id, c.name])), @@ -237,6 +242,32 @@ export default function GerbilDetailPage() { {saveCharacter.error && {saveCharacter.error}} +
{de.common.loading}
} + {!parentLitters.loading && (parentLitters.data?.items.length ?? 0) === 0 && ( +{t.detail.parentLittersEmpty}
+ )} + {(parentLitters.data?.items.length ?? 0) > 0 && ( +