diff --git a/gerbil-manager-web/src/pages/WurfDetailPage.tsx b/gerbil-manager-web/src/pages/WurfDetailPage.tsx
index 3de55c0..400ebda 100644
--- a/gerbil-manager-web/src/pages/WurfDetailPage.tsx
+++ b/gerbil-manager-web/src/pages/WurfDetailPage.tsx
@@ -13,6 +13,7 @@ import { isValidGenotype } from '../format/genotypeText'
import { breed, fromDisplayString, genotypeToFarbschlag, UNKNOWN_FARBSCHLAG, type BreedingResult } from '../genetics'
import BreedingResultView from '../components/BreedingResultView'
import GerbilIcon from '../components/GerbilIcon'
+import ReportErrorDialog from '../components/ReportErrorDialog'
import { useGerbilName } from '../components/breederSuffix'
import './wuerfe.css'
@@ -64,6 +65,7 @@ export default function WurfDetailPage() {
const t = de.pages.litters
const gerbilName = useGerbilName()
const { id = '' } = useParams()
+ const [reportOpen, setReportOpen] = useState(false)
const litter = useApi(() => getLitter(id), [id])
const fatherId = litter.data?.fatherId ?? null
@@ -151,6 +153,9 @@ export default function WurfDetailPage() {
{t.detail.edit}
+
{t.detail.back}
@@ -224,6 +229,12 @@ export default function WurfDetailPage() {
) : (
{t.detail.needParentsGenotype}
)}
+
+
setReportOpen(false)}
+ context={{ context: 'litter-detail', litterId: l.id, entityName: l.name }}
+ />
)
}
diff --git a/gerbil-manager-web/src/pages/stammbaum.css b/gerbil-manager-web/src/pages/stammbaum.css
index 254f659..a7a56ef 100644
--- a/gerbil-manager-web/src/pages/stammbaum.css
+++ b/gerbil-manager-web/src/pages/stammbaum.css
@@ -488,3 +488,38 @@
font-size: 0.8em;
color: #555;
}
+
+/* FEEDBACK: Rechtsklick-Kontextmenü auf einer Ahnenkarte. */
+.stammbaum-context-menu {
+ position: fixed;
+ z-index: 150;
+ margin: 0;
+ padding: 0.25rem;
+ list-style: none;
+ min-width: 11rem;
+ background: var(--color-bg, #fff);
+ border: 1px solid var(--color-border, #ddd);
+ border-radius: 8px;
+ box-shadow: 0 8px 28px rgba(43, 33, 25, 0.22);
+}
+
+.stammbaum-context-menu__item {
+ display: block;
+ width: 100%;
+ text-align: left;
+ background: none;
+ border: none;
+ font: inherit;
+ font-size: 0.9rem;
+ color: var(--color-text);
+ padding: 0.5rem 0.7rem;
+ border-radius: 5px;
+ cursor: pointer;
+}
+
+.stammbaum-context-menu__item:hover,
+.stammbaum-context-menu__item:focus-visible {
+ background: var(--color-accent, #2563eb);
+ color: #fff;
+ outline: none;
+}
diff --git a/gerbil-manager-web/src/strings/de.ts b/gerbil-manager-web/src/strings/de.ts
index 7f36ec5..fc2997c 100644
--- a/gerbil-manager-web/src/strings/de.ts
+++ b/gerbil-manager-web/src/strings/de.ts
@@ -438,6 +438,11 @@ export const de = {
createdOn: 'Erstellt am',
born: 'geb.',
},
+ /** FEEDBACK: Rechtsklick-Kontextmenü auf einer Stammbaum-Karte. */
+ contextMenu: {
+ copyId: 'ID kopieren',
+ reportError: 'Fehler melden',
+ },
},
// ── FEAT-7 (Kelly): Statistik & Berichte ──
statistik: {
@@ -842,6 +847,37 @@ export const de = {
unknown: 'Ein unbekannter Fehler ist aufgetreten.',
},
},
+ // ── FEEDBACK: "Fehler melden" Dialog + "ID kopieren" Aktion ──
+ feedback: {
+ /** Button-Beschriftung (Tierakte, Wurf-Ansicht). */
+ button: 'Fehler melden',
+ dialogTitle: 'Fehler melden',
+ intro: 'Beschreibe kurz, was nicht stimmt. Technische Angaben werden automatisch mitgesendet.',
+ label: 'Beschreibung',
+ placeholder: 'Was funktioniert nicht oder ist falsch dargestellt?',
+ /** Überschrift über den automatisch erfassten Debug-Angaben. */
+ debugTitle: 'Automatisch erfasst',
+ debugFields: {
+ context: 'Ansicht',
+ entity: 'Datensatz',
+ url: 'Adresse',
+ },
+ contexts: {
+ stammbaum: 'Stammbaum',
+ 'gerbil-detail': 'Rennmausakte',
+ 'litter-detail': 'Wurf',
+ },
+ submit: 'Senden',
+ submitting: 'Wird gesendet …',
+ cancel: 'Abbrechen',
+ close: 'Schließen',
+ success: 'Danke! Dein Fehlerbericht wurde gesendet.',
+ error: 'Fehlerbericht konnte nicht gesendet werden.',
+ emptyMessage: 'Bitte beschreibe den Fehler.',
+ /** Toast nach erfolgreichem "ID kopieren". */
+ idCopied: 'ID kopiert',
+ idCopyFailed: 'ID konnte nicht kopiert werden.',
+ },
common: {
loading: 'Lädt …',
retry: 'Erneut versuchen',