From 2bbdfe2b71ea8f9e59af4dda1a5f4ada0810a793 Mon Sep 17 00:00:00 2001
From: Gulum
Date: Sat, 6 Jun 2026 16:45:29 +0200
Subject: [PATCH 1/2] =?UTF-8?q?GEHEGE-RENAME:=20UI-Begriff=20Becken=20?=
=?UTF-8?q?=E2=86=92=20Gehege=20+=20Route=20/gehege=20+=20Icon=20?=
=?UTF-8?q?=F0=9F=8F=9C=EF=B8=8F?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- de.ts: alle nutzer-sichtbaren 'Becken'-Strings → 'Gehege' (nav, fields,
titles, buttons, validation, delete, hilfe sections)
- AppShell.tsx: route /becken → /gehege, icon 🛁 → 🏜️ (Wüsten-Habitat)
- App.tsx: + redirect (bewahrt
Bookmarks; BeckenRedirect leitet Unterseiten 1:1 weiter)
- BeckenPage/DetailPage/FormPage: interne Links /becken → /gehege
- HilfePage.tsx: hartcodierte 'Becken'-Prosa → 'Gehege'
- e2e/becken-kontakte.spec.ts: goto('/becken') → goto('/gehege')
Gate: build ✓ eslint ✓ vitest 82/82 ✓ e2e 120/120 ✓
---
.../e2e/becken-kontakte.spec.ts | 4 +--
gerbil-manager-web/src/App.tsx | 11 ++++--
.../src/components/AppShell.tsx | 2 +-
.../src/pages/BeckenDetailPage.tsx | 8 ++---
.../src/pages/BeckenFormPage.tsx | 4 +--
gerbil-manager-web/src/pages/BeckenPage.tsx | 4 +--
gerbil-manager-web/src/pages/HilfePage.tsx | 10 +++---
gerbil-manager-web/src/strings/de.ts | 34 +++++++++----------
8 files changed, 42 insertions(+), 35 deletions(-)
diff --git a/gerbil-manager-web/e2e/becken-kontakte.spec.ts b/gerbil-manager-web/e2e/becken-kontakte.spec.ts
index 7a8feb8..90a7e1f 100644
--- a/gerbil-manager-web/e2e/becken-kontakte.spec.ts
+++ b/gerbil-manager-web/e2e/becken-kontakte.spec.ts
@@ -7,7 +7,7 @@ const tk = de.pages.kontakte
test.describe('Becken', () => {
test('Belegung: Detail zeigt Bewohner mit Link zur Tierakte', async ({ page }) => {
skipUnlessMock()
- await page.goto('/becken')
+ await page.goto('/gehege')
await page.getByRole('link', { name: /Großbecken/ }).click()
await expect(page.getByRole('heading', { name: 'Großbecken' })).toBeVisible()
await expect(page.getByText(`2 ${tb.occupancy.countMany}`)).toBeVisible()
@@ -18,7 +18,7 @@ test.describe('Becken', () => {
test('Löschen eines belegten Beckens meldet den 409-Konflikt auf Deutsch', async ({ page }) => {
skipUnlessMock()
- await page.goto('/becken')
+ await page.goto('/gehege')
await page.getByRole('link', { name: /Großbecken/ }).click()
acceptNextDialog(page)
await page.getByRole('button', { name: tb.delete.action }).click()
diff --git a/gerbil-manager-web/src/App.tsx b/gerbil-manager-web/src/App.tsx
index 017dfb2..3d17786 100644
--- a/gerbil-manager-web/src/App.tsx
+++ b/gerbil-manager-web/src/App.tsx
@@ -1,4 +1,4 @@
-import { BrowserRouter, Route, Routes } from 'react-router-dom'
+import { BrowserRouter, Navigate, Route, Routes, useParams } from 'react-router-dom'
import AppShell from './components/AppShell'
import BeckenPage from './pages/BeckenPage'
import BeckenDetailPage from './pages/BeckenDetailPage'
@@ -28,6 +28,11 @@ import WebseiteVorschauPage from './pages/WebseiteVorschauPage'
import AnfragenPage from './pages/AnfragenPage'
import AnfrageDetailPage from './pages/AnfrageDetailPage'
+function BeckenRedirect() {
+ const { '*': splat } = useParams()
+ return
+}
+
export default function App() {
return (
@@ -48,7 +53,9 @@ export default function App() {
} />
{/* FEAT-2: Kontakte ersetzt das Züchter-Platzhalter-Routing (Breeder -> Contact) */}
-
+ {/* GEHEGE-RENAME: /becken → /gehege; redirect preserves bookmarks */}
+ } />
+
} />
} />
} />
diff --git a/gerbil-manager-web/src/components/AppShell.tsx b/gerbil-manager-web/src/components/AppShell.tsx
index d3c702c..8e35994 100644
--- a/gerbil-manager-web/src/components/AppShell.tsx
+++ b/gerbil-manager-web/src/components/AppShell.tsx
@@ -19,7 +19,7 @@ const PRIMARY: NavItem[] = [
{ to: '/genetik', label: de.nav.genetics, icon: '🧬' },
]
const SECONDARY: NavItem[] = [
- { to: '/becken', label: de.nav.enclosures, icon: '🛁' },
+ { to: '/gehege', label: de.nav.enclosures, icon: '🏜️' },
{ to: '/kontakte', label: de.nav.contacts, icon: '📇' },
{ to: '/abgabe', label: de.nav.forSale, icon: '🏡' },
// INBOX-1: Anfragen-Posteingang
diff --git a/gerbil-manager-web/src/pages/BeckenDetailPage.tsx b/gerbil-manager-web/src/pages/BeckenDetailPage.tsx
index 2ba666c..6cafc8f 100644
--- a/gerbil-manager-web/src/pages/BeckenDetailPage.tsx
+++ b/gerbil-manager-web/src/pages/BeckenDetailPage.tsx
@@ -44,7 +44,7 @@ export default function BeckenDetailPage() {
setDeleteError(null)
const result = await removal.run()
if (result.ok) {
- navigate('/becken')
+ navigate('/gehege')
} else if (result.cause instanceof ApiError && result.cause.status === 409) {
// Backend meldet Konflikt, wenn noch Tiere im Becken wohnen.
setDeleteError(t.delete.conflict)
@@ -58,7 +58,7 @@ export default function BeckenDetailPage() {
return (
{enclosure.error ?? t.detail.notFound}
-
+
{t.detail.back}
@@ -81,7 +81,7 @@ export default function BeckenDetailPage() {
)}
-
+
{t.detail.edit}
-
+
{t.detail.back}
diff --git a/gerbil-manager-web/src/pages/BeckenFormPage.tsx b/gerbil-manager-web/src/pages/BeckenFormPage.tsx
index f7df10c..5d6bd53 100644
--- a/gerbil-manager-web/src/pages/BeckenFormPage.tsx
+++ b/gerbil-manager-web/src/pages/BeckenFormPage.tsx
@@ -45,7 +45,7 @@ export default function BeckenFormPage() {
}
setErrors({})
const result = await mutation.run({ name: form.name.trim(), notes: nn(form.notes) })
- if (result.ok) navigate(`/becken/${result.value.id}`)
+ if (result.ok) navigate(`/gehege/${result.value.id}`)
// On failure mutation.error drives the inline alert; run() never throws.
}
@@ -81,7 +81,7 @@ export default function BeckenFormPage() {
-
+
{t.form.cancel}
diff --git a/gerbil-manager-web/src/pages/BeckenPage.tsx b/gerbil-manager-web/src/pages/BeckenPage.tsx
index 7e0dd2f..b47bf7d 100644
--- a/gerbil-manager-web/src/pages/BeckenPage.tsx
+++ b/gerbil-manager-web/src/pages/BeckenPage.tsx
@@ -35,7 +35,7 @@ export default function BeckenPage() {
)}
-
+
+ {t.newButton}
@@ -72,7 +72,7 @@ export default function BeckenPage() {
{items.map((e) => (
-
-
+
{e.name}
{e.notes ?? ''}
diff --git a/gerbil-manager-web/src/pages/HilfePage.tsx b/gerbil-manager-web/src/pages/HilfePage.tsx
index 4d1d3ef..eabf3ca 100644
--- a/gerbil-manager-web/src/pages/HilfePage.tsx
+++ b/gerbil-manager-web/src/pages/HilfePage.tsx
@@ -38,12 +38,12 @@ const sections: Section[] = [
Die Navigation erreichst du unten (Smartphone) oder links (Laptop). Mit „{nav.more}" öffnest du alle weiteren Bereiche.
Empfohlene Reihenfolge beim ersten Mal:
- - Becken anlegen (wo leben deine Tiere?)
+ - Gehege anlegen (wo leben deine Tiere?)
- Rennmäuse anlegen mit Foto
- Würfe eintragen
- Genetik erkunden
- Tipp: Lege zuerst die Becken an — dann kannst du beim Erfassen der Tiere direkt das richtige Becken auswählen.
+ Tipp: Lege zuerst die Gehege an — dann kannst du beim Erfassen der Tiere direkt das richtige Gehege auswählen.
>
),
},
@@ -53,7 +53,7 @@ const sections: Section[] = [
content: (
<>
Unter „{nav.gerbils}" siehst du alle deine Rennmäuse. Mit „{g.newButton}" legst du ein neues Tier an.
- Pflichtfelder sind „{g.fields.name}" und „{g.fields.gender}". Optional kannst du Geburtsdatum, Farbschlag, Genotyp, Becken und Herkunft eintragen.
+ Pflichtfelder sind „{g.fields.name}" und „{g.fields.gender}". Optional kannst du Geburtsdatum, Farbschlag, Genotyp, Gehege und Herkunft eintragen.
Auf der Detailseite findest du drei Tabs:
- „{g.detail.tabs.photos}" — Fotos hochladen; das erste Foto wird als Profilfoto angezeigt.
@@ -69,9 +69,9 @@ const sections: Section[] = [
title: t.sections.becken,
content: (
<>
- Unter „{nav.enclosures}" verwaltest du deine Gehege. Mit „{b.newButton}" legst du ein neues Becken an (nur Name ist Pflicht).
+ Unter „{nav.enclosures}" verwaltest du deine Gehege. Mit „{b.newButton}" legst du ein neues Gehege an (nur Name ist Pflicht).
Die Detailseite zeigt dir die aktuellen „{b.occupancy.title}" — mit Links direkt zur Tierakte. So siehst du auf einen Blick, wer wo lebt.
- Ein Becken lässt sich nur löschen, wenn es leer ist — das schützt vor versehentlichem Datenverlust.
+ Ein Gehege lässt sich nur löschen, wenn es leer ist — das schützt vor versehentlichem Datenverlust.
Unter „{nav.contacts}" kannst du Züchter, Käufer und andere Kontakte anlegen. Diese lassen sich dann als Herkunft oder Abnehmer bei Tieren eintragen.
>
),
diff --git a/gerbil-manager-web/src/strings/de.ts b/gerbil-manager-web/src/strings/de.ts
index 2fdb0a0..7709b89 100644
--- a/gerbil-manager-web/src/strings/de.ts
+++ b/gerbil-manager-web/src/strings/de.ts
@@ -14,8 +14,8 @@ export const de = {
litters: 'Würfe',
breeders: 'Züchter',
genetics: 'Genetik',
- // FEAT-2 (Oscar): Becken + Kontakte
- enclosures: 'Becken',
+ // FEAT-2 (Oscar): Becken + Kontakte (GEHEGE-RENAME: Becken → Gehege)
+ enclosures: 'Gehege',
contacts: 'Kontakte',
// FEAT-7 (Kelly): Statistik
statistics: 'Statistik',
@@ -82,7 +82,7 @@ export const de = {
causeOfDeath: 'Todesursache',
goHomeDate: 'Abgabedatum',
litter: 'Wurf',
- enclosure: 'Becken',
+ enclosure: 'Gehege',
colorVariety: 'Farbschlag',
origin: 'Herkunft',
receiver: 'Abnehmer',
@@ -253,8 +253,8 @@ export const de = {
markMultiAction: 'Ausgewählte zur Abgabe stellen',
grouping: {
title: 'Gruppen',
- byEnclosure: 'Nach Becken vorgeschlagen',
- ungrouped: 'Ohne Becken',
+ byEnclosure: 'Nach Gehege vorgeschlagen',
+ ungrouped: 'Ohne Gehege',
moveTo: 'Verschieben nach',
newGroup: 'Neue Gruppe',
groupLabel: 'Gruppe',
@@ -298,12 +298,12 @@ export const de = {
notConfigured: 'KI-Funktion: API-Schlüssel noch nicht konfiguriert.',
},
},
- // ── FEAT-2 (Oscar): Becken (Enclosures) ──
+ // ── FEAT-2 (Oscar): Gehege (Enclosures) — GEHEGE-RENAME: Becken → Gehege ──
becken: {
- title: 'Becken',
- newButton: 'Neues Becken',
- empty: 'Keine Becken gefunden.',
- countLabel: 'Becken',
+ title: 'Gehege',
+ newButton: 'Neues Gehege',
+ empty: 'Keine Gehege gefunden.',
+ countLabel: 'Gehege',
searchPlaceholder: 'Name suchen …',
fields: {
name: 'Name',
@@ -311,18 +311,18 @@ export const de = {
},
occupancy: {
title: 'Bewohner',
- empty: 'Dieses Becken ist derzeit leer.',
+ empty: 'Dieses Gehege ist derzeit leer.',
countOne: 'Tier',
countMany: 'Tiere',
},
detail: {
edit: 'Bearbeiten',
back: 'Zurück zur Liste',
- notFound: 'Dieses Becken wurde nicht gefunden.',
+ notFound: 'Dieses Gehege wurde nicht gefunden.',
},
form: {
- createTitle: 'Neues Becken anlegen',
- editTitle: 'Becken bearbeiten',
+ createTitle: 'Neues Gehege anlegen',
+ editTitle: 'Gehege bearbeiten',
save: 'Speichern',
cancel: 'Abbrechen',
saving: 'Speichern …',
@@ -332,9 +332,9 @@ export const de = {
},
delete: {
action: 'Löschen',
- confirmMessage: 'Soll dieses Becken wirklich gelöscht werden?',
+ confirmMessage: 'Soll dieses Gehege wirklich gelöscht werden?',
conflict:
- 'Becken ist nicht leer — bitte zuerst alle Tiere in ein anderes Becken umsetzen.',
+ 'Gehege ist nicht leer — bitte zuerst alle Tiere in ein anderes Gehege umsetzen.',
},
},
// ── FEAT-4 (Kelly): Stammbaum (Ahnentafel) ──
@@ -731,7 +731,7 @@ export const de = {
sections: {
ersteSchritte: 'Erste Schritte',
tiere: 'Rennmäuse anlegen & Fotos',
- becken: 'Becken',
+ becken: 'Gehege',
wuerfe: 'Würfe & Jungtiere',
genetik: 'Probeverpaarung & Genetik',
stammbaum: 'Stammbaum',
From 162a0fafb1b8b3c1aa9fbaaa178aebf3e51c7759 Mon Sep 17 00:00:00 2001
From: Gulum
Date: Sat, 6 Jun 2026 16:49:21 +0200
Subject: [PATCH 2/2] GEHEGE-RENAME Addendum: /rennmaeuse = Landing Page,
'Start'-Nav entfernt
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- AppShell.tsx: Start-Eintrag (/) aus PRIMARY entfernt; /rennmaeuse ist
nun erste Kachel und Landing Page
- App.tsx: index-Route → ;
HomePage-Import entfernt
- HomePage.tsx: gelöscht (nicht mehr referenziert, via git wiederherstellbar)
- de.ts: nav.home + pages.home entfernt (nur von AppShell/HomePage genutzt)
- e2e/navigation.spec.ts: HomePage-Assertions → de.pages.gerbils.title
Gate: build ✓ eslint ✓ vitest 82/82 ✓ e2e 120/120 ✓
---
gerbil-manager-web/e2e/navigation.spec.ts | 4 ++--
gerbil-manager-web/src/App.tsx | 3 +--
gerbil-manager-web/src/components/AppShell.tsx | 1 -
gerbil-manager-web/src/pages/HomePage.tsx | 10 ----------
gerbil-manager-web/src/strings/de.ts | 6 ------
5 files changed, 3 insertions(+), 21 deletions(-)
delete mode 100644 gerbil-manager-web/src/pages/HomePage.tsx
diff --git a/gerbil-manager-web/e2e/navigation.spec.ts b/gerbil-manager-web/e2e/navigation.spec.ts
index 1f03bf3..9d9b6a2 100644
--- a/gerbil-manager-web/e2e/navigation.spec.ts
+++ b/gerbil-manager-web/e2e/navigation.spec.ts
@@ -4,7 +4,7 @@ import { de, expect, gotoSection, test } from './fixtures'
test('alle Bereiche sind über die Navigation erreichbar', async ({ page }) => {
await page.goto('/')
await expect(page.getByRole('heading', { name: de.app.title })).toBeVisible()
- await expect(page.getByRole('heading', { name: de.pages.home.title })).toBeVisible()
+ await expect(page.getByRole('heading', { name: de.pages.gerbils.title, exact: true })).toBeVisible()
await gotoSection(page, de.nav.gerbils)
await expect(page.getByRole('heading', { name: de.pages.gerbils.title, exact: true })).toBeVisible()
@@ -30,5 +30,5 @@ test('unbekannte Route zeigt die deutsche 404-Seite', async ({ page }) => {
await page.goto('/diese-seite-gibt-es-nicht')
await expect(page.getByText(de.pages.notFound.message)).toBeVisible()
await page.getByRole('link', { name: de.pages.notFound.backHome }).click()
- await expect(page.getByRole('heading', { name: de.pages.home.title })).toBeVisible()
+ await expect(page.getByRole('heading', { name: de.pages.gerbils.title, exact: true })).toBeVisible()
})
diff --git a/gerbil-manager-web/src/App.tsx b/gerbil-manager-web/src/App.tsx
index 3d17786..c5f1232 100644
--- a/gerbil-manager-web/src/App.tsx
+++ b/gerbil-manager-web/src/App.tsx
@@ -8,7 +8,6 @@ import GerbilDetailPage from './pages/GerbilDetailPage'
import GerbilFormPage from './pages/GerbilFormPage'
import GenetikPage from './pages/GenetikPage'
import AbgabePage from './pages/AbgabePage'
-import HomePage from './pages/HomePage'
import KontaktePage from './pages/KontaktePage'
import KontaktDetailPage from './pages/KontaktDetailPage'
import KontaktFormPage from './pages/KontaktFormPage'
@@ -38,7 +37,7 @@ export default function App() {
}>
- } />
+ } />
} />
} />
diff --git a/gerbil-manager-web/src/components/AppShell.tsx b/gerbil-manager-web/src/components/AppShell.tsx
index 8e35994..043260f 100644
--- a/gerbil-manager-web/src/components/AppShell.tsx
+++ b/gerbil-manager-web/src/components/AppShell.tsx
@@ -13,7 +13,6 @@ interface NavItem {
// Primary items are always visible in the phone bottom bar; secondary items
// move into the "Mehr" sheet on phones and appear inline in the desktop sidebar.
const PRIMARY: NavItem[] = [
- { to: '/', label: de.nav.home, icon: '🏠', end: true },
{ to: '/rennmaeuse', label: de.nav.gerbils, icon: '🐭' },
{ to: '/wuerfe', label: de.nav.litters, icon: '🍼' },
{ to: '/genetik', label: de.nav.genetics, icon: '🧬' },
diff --git a/gerbil-manager-web/src/pages/HomePage.tsx b/gerbil-manager-web/src/pages/HomePage.tsx
deleted file mode 100644
index d7b49f6..0000000
--- a/gerbil-manager-web/src/pages/HomePage.tsx
+++ /dev/null
@@ -1,10 +0,0 @@
-import { de } from '../strings/de'
-
-export default function HomePage() {
- return (
-
- {de.pages.home.title}
- {de.pages.home.intro}
-
- )
-}
diff --git a/gerbil-manager-web/src/strings/de.ts b/gerbil-manager-web/src/strings/de.ts
index 7709b89..454c379 100644
--- a/gerbil-manager-web/src/strings/de.ts
+++ b/gerbil-manager-web/src/strings/de.ts
@@ -9,7 +9,6 @@ export const de = {
tagline: 'Verwaltung für Rennmäuse, Würfe und Züchter',
},
nav: {
- home: 'Start',
gerbils: 'Rennmäuse',
litters: 'Würfe',
breeders: 'Züchter',
@@ -37,11 +36,6 @@ export const de = {
website: 'Webseite',
},
pages: {
- home: {
- title: 'Willkommen',
- intro:
- 'Hier verwaltest du deine Rennmäuse, Würfe und Züchter. Wähle einen Bereich aus der Navigation.',
- },
gerbils: {
title: 'Rennmäuse',
// Liste