From 0e7ec5ab613b5c9320085a50b3dcaadff354e8fb Mon Sep 17 00:00:00 2001 From: Gulum Date: Sat, 6 Jun 2026 12:12:31 +0200 Subject: [PATCH] BESTAND-FILTER follow-up: residency toggle on the Gerbil create/edit form MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Completes residency end-to-end: a 'Gehört zum eigenen Bestand' checkbox on the Rennmaus-Formular (default on for new animals) lets the user mark a tier as an external ancestor by hand — previously isResident was only set at import. Wired through FormState + formFromGerbil (defaults true) + the CreateGerbil payload. German via de.ts (LF). e2e: edit Krümel, untick Bestand, save -> detail shows the 'Extern' badge (proves form field -> payload -> persistence). Gate green: build, eslint, vitest 78, e2e 86. Co-Authored-By: Claude Opus 4.8 (1M context) --- gerbil-manager-web/e2e/bestand.spec.ts | 14 ++++++++++++++ gerbil-manager-web/src/pages/GerbilFormPage.tsx | 14 ++++++++++++++ gerbil-manager-web/src/strings/de.ts | 3 +++ 3 files changed, 31 insertions(+) diff --git a/gerbil-manager-web/e2e/bestand.spec.ts b/gerbil-manager-web/e2e/bestand.spec.ts index acdf559..2718a70 100644 --- a/gerbil-manager-web/e2e/bestand.spec.ts +++ b/gerbil-manager-web/e2e/bestand.spec.ts @@ -27,3 +27,17 @@ test('Toggle „Externe Ahnen einblenden“ zeigt externe Tiere mit Extern-Marki // Der Bestand bleibt weiterhin sichtbar. await expect(page.locator('.gerbil-row', { hasText: 'Krümel' })).toBeVisible() }) + +test('Bearbeiten-Formular kann ein Tier als extern markieren (Bestand-Häkchen)', async ({ page }) => { + skipUnlessMock() + // Krümel gehört zum Bestand -> Häkchen entfernen und speichern. + await page.goto('/rennmaeuse/kruemel/bearbeiten') + const check = page.getByRole('checkbox', { name: t.form.isResidentLabel }) + await expect(check).toBeChecked() + await check.uncheck() + await page.getByRole('button', { name: t.form.save }).click() + + // Auf der Detailseite ist Krümel jetzt als „Extern“ markiert. + await expect(page.getByRole('heading', { name: 'Krümel' })).toBeVisible() + await expect(page.getByText(t.externalBadge, { exact: true })).toBeVisible() +}) diff --git a/gerbil-manager-web/src/pages/GerbilFormPage.tsx b/gerbil-manager-web/src/pages/GerbilFormPage.tsx index d6750f0..f3eea99 100644 --- a/gerbil-manager-web/src/pages/GerbilFormPage.tsx +++ b/gerbil-manager-web/src/pages/GerbilFormPage.tsx @@ -24,6 +24,7 @@ interface FormState { receiverContactId: string genotype: string notes: string + isResident: boolean } const EMPTY: FormState = { @@ -41,6 +42,7 @@ const EMPTY: FormState = { receiverContactId: '', genotype: '', notes: '', + isResident: true, } function formFromGerbil(g: { @@ -58,6 +60,7 @@ function formFromGerbil(g: { receiverContactId: string | null genotype: string | null notes: string | null + isResident?: boolean | null }): FormState { return { name: g.name, @@ -74,6 +77,7 @@ function formFromGerbil(g: { receiverContactId: g.receiverContactId ?? '', genotype: g.genotype ?? '', notes: g.notes ?? '', + isResident: g.isResident ?? true, } } @@ -166,6 +170,7 @@ export default function GerbilFormPage() { receiverContactId: nn(form.receiverContactId), genotype: nn(form.genotype), notes: nn(form.notes), + isResident: form.isResident, } const result = await mutation.run(body) if (result.ok) navigate(`/rennmaeuse/${result.value.id}`) @@ -355,6 +360,15 @@ export default function GerbilFormPage() {