From 3160b66697157b96afae23e1cbe26cdb4b48f677 Mon Sep 17 00:00:00 2001 From: Gulum Date: Sat, 6 Jun 2026 16:56:54 +0200 Subject: [PATCH 1/2] WURF-LINK: Wurf-Feld auf Tier-Detailseite als Link zur Wurf-Detailseite (/wuerfe/{id}) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - GerbilDetailPage: Wurf-Feld zeigt Link wenn litterId + Name auflösbar; sonst bisheriger '—'-Fallback (kein toter Link) - e2e: neuer Test verifiziert Link sichtbar + Navigation zu Wurf-Detail Gate: vitest 82/82, e2e 122/122, build+tsc clean --- gerbil-manager-web/e2e/tiere.spec.ts | 10 ++++++++++ gerbil-manager-web/src/pages/GerbilDetailPage.tsx | 9 ++++++++- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/gerbil-manager-web/e2e/tiere.spec.ts b/gerbil-manager-web/e2e/tiere.spec.ts index 7fb571a..d60d1a3 100644 --- a/gerbil-manager-web/e2e/tiere.spec.ts +++ b/gerbil-manager-web/e2e/tiere.spec.ts @@ -98,6 +98,16 @@ test('Detailseite zeigt Stammdaten + Tab-Inhalte (Gesundheit/Gewicht/Fotos)', as await expect(page.getByText(/85\s*g/)).toBeVisible() }) +test('Detailseite: Wurf-Feld ist ein Link zur Wurf-Detailseite (WURF-LINK)', async ({ page }) => { + skipUnlessMock() + await page.goto('/rennmaeuse/kruemel') + // Krümel hat litterId 'w-kruemel' → Name 'Wurf K' → Link /wuerfe/w-kruemel + const litterLink = page.getByRole('link', { name: 'Wurf K' }) + await expect(litterLink).toBeVisible() + await litterLink.click() + await expect(page.getByRole('heading', { name: 'Wurf K' })).toBeVisible() +}) + test('Tier bearbeiten — Notizen ändern', async ({ page }) => { skipUnlessMock() await page.goto('/rennmaeuse/kruemel/bearbeiten') diff --git a/gerbil-manager-web/src/pages/GerbilDetailPage.tsx b/gerbil-manager-web/src/pages/GerbilDetailPage.tsx index b8208e7..e002df0 100644 --- a/gerbil-manager-web/src/pages/GerbilDetailPage.tsx +++ b/gerbil-manager-web/src/pages/GerbilDetailPage.tsx @@ -173,7 +173,14 @@ export default function GerbilDetailPage() { } /> - + {litterName.get(g.litterId)} + : lookup(litterName, g.litterId) + } + /> From f6bfc0ebab2320cfe01110dd51ba6c8d8cbfb153 Mon Sep 17 00:00:00 2001 From: Gulum Date: Sat, 6 Jun 2026 17:00:32 +0200 Subject: [PATCH 2/2] WURF-LINK-Addendum: Herkunft-Zeile zeigt originBreeder + Kontaktlink MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - originContactId gesetzt → Link /kontakte/{id} mit Kontaktname (Priorität) - Sonst originBreeder (Freitext) gesetzt → plain text - Sonst '—' (bisheriges Fallback) Behebt: 74 Tiere mit originBreeder sahen '—' obwohl Daten vorhanden e2e: 2 neue Tests (originBreeder-Text + Kontaktlink) Gate: vitest 82/82, e2e 126/126, build+tsc clean --- gerbil-manager-web/e2e/tiere.spec.ts | 19 +++++++++++++++++++ .../src/pages/GerbilDetailPage.tsx | 9 ++++++++- 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/gerbil-manager-web/e2e/tiere.spec.ts b/gerbil-manager-web/e2e/tiere.spec.ts index d60d1a3..052b865 100644 --- a/gerbil-manager-web/e2e/tiere.spec.ts +++ b/gerbil-manager-web/e2e/tiere.spec.ts @@ -108,6 +108,25 @@ test('Detailseite: Wurf-Feld ist ein Link zur Wurf-Detailseite (WURF-LINK)', asy await expect(page.getByRole('heading', { name: 'Wurf K' })).toBeVisible() }) +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 + await page.goto('/rennmaeuse/fridolin') + await expect(page.getByRole('heading', { name: 'Fridolin' })).toBeVisible() + await expect(page.getByText('Zoohandlung Meier')).toBeVisible() + // Kein Link mit diesem Namen — es ist reiner Text + await expect(page.getByRole('link', { name: 'Zoohandlung Meier' })).toBeHidden() +}) + +test('Detailseite: Herkunft zeigt Kontaktlink wenn originContactId gesetzt (WURF-LINK-Addendum)', async ({ page }) => { + skipUnlessMock() + // Krümel hat originContactId='con-meier' → Link /kontakte/con-meier (Priorität vor originBreeder) + await page.goto('/rennmaeuse/kruemel') + const originLink = page.getByRole('link', { name: 'Zoohandlung Meier' }) + await expect(originLink).toBeVisible() + await expect(originLink).toHaveAttribute('href', '/kontakte/con-meier') +}) + test('Tier bearbeiten — Notizen ändern', async ({ page }) => { skipUnlessMock() await page.goto('/rennmaeuse/kruemel/bearbeiten') diff --git a/gerbil-manager-web/src/pages/GerbilDetailPage.tsx b/gerbil-manager-web/src/pages/GerbilDetailPage.tsx index e002df0..ad3dd66 100644 --- a/gerbil-manager-web/src/pages/GerbilDetailPage.tsx +++ b/gerbil-manager-web/src/pages/GerbilDetailPage.tsx @@ -181,7 +181,14 @@ export default function GerbilDetailPage() { : lookup(litterName, g.litterId) } /> - + {contactName.get(g.originContactId)} + : (g.originBreeder || null) + } + />