feat: Fehler-melden + Datenherkunft auf Kontakte & Würfe erweitern
- Kontakt-Detailseite: „Fehler melden"- und „Datenherkunft"-Button. - Wurf-Ansicht: „Datenherkunft"-Button (Feedback war bereits vorhanden). - Feedback-Entity um loses, nullable ContactId erweitert (kein FK → übersteht Ingest-Wipe); Migration AddFeedbackContactId. - Contact.Provenance + Litter.Provenance (nullable text); Migration AddContactLitterProvenance; im Ingest gemappt und in den DTOs zurückgegeben. - Import: build_entity_provenance() generalisiert; Kontakte (sourceFiles, Züchter/Abnehmer-Hinweise) und Würfe (Wurfchronik vs. Diagramm-rekonstruiert, Geschwister-Merge) erhalten Herkunftsdaten in resolved_import.json. - Frontend: ProvenanceDialog generalisiert (EntityProvenance + entityLabel). Tests erweitert (Ingest-Round-trip Kontakt/Wurf, contact-scoped Feedback übersteht Wipe). dotnet(212)/vitest(129)/playwright(36)/tsc/eslint grün. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -4,7 +4,7 @@ import { api } from './client'
|
||||
const RESOURCE = '/feedback'
|
||||
|
||||
/** Which view a report was filed from (matches the backend Context contract). */
|
||||
export type FeedbackContext = 'stammbaum' | 'gerbil-detail' | 'litter-detail'
|
||||
export type FeedbackContext = 'stammbaum' | 'gerbil-detail' | 'litter-detail' | 'contact-detail'
|
||||
|
||||
/** Payload for POST /feedback. Debug fields are captured automatically by the caller. */
|
||||
export interface FeedbackInput {
|
||||
@@ -12,6 +12,7 @@ export interface FeedbackInput {
|
||||
context: FeedbackContext
|
||||
gerbilId?: string | null
|
||||
litterId?: string | null
|
||||
contactId?: string | null
|
||||
entityName?: string | null
|
||||
url?: string | null
|
||||
clientTimestamp?: string | null
|
||||
@@ -23,6 +24,7 @@ export interface Feedback {
|
||||
context: string
|
||||
gerbilId: string | null
|
||||
litterId: string | null
|
||||
contactId: string | null
|
||||
entityName: string | null
|
||||
url: string | null
|
||||
clientTimestamp: string | null
|
||||
|
||||
@@ -90,6 +90,13 @@ export interface GerbilProvenance {
|
||||
notes: string[]
|
||||
}
|
||||
|
||||
/**
|
||||
* NACHVERFOLGUNG: geparste Datenherkunft eines beliebigen importierten Eintrags
|
||||
* (Tier, Kontakt oder Wurf). {@link GerbilProvenance} ist die Tier-Spezialisierung
|
||||
* mit zusätzlichen Eltern-Feldern; Kontakte/Würfe nutzen dieselbe Grundform.
|
||||
*/
|
||||
export type EntityProvenance = GerbilProvenance
|
||||
|
||||
/** Payload for POST /gerbils. */
|
||||
export interface CreateGerbil {
|
||||
name: string
|
||||
@@ -142,6 +149,11 @@ export interface Contact {
|
||||
isReceiver: boolean
|
||||
/** Namens-Anhängsel dieser Zucht (für Tiere fremder Züchter). */
|
||||
nameSuffix: string | null
|
||||
/**
|
||||
* NACHVERFOLGUNG: Datenherkunft des Import-Eintrags als JSON-String (vom
|
||||
* Python-Merge erzeugt; siehe {@link EntityProvenance}). null = manuell angelegt.
|
||||
*/
|
||||
provenance?: string | null
|
||||
}
|
||||
|
||||
export interface Litter {
|
||||
@@ -162,6 +174,11 @@ export interface Litter {
|
||||
motherId: string | null
|
||||
/** LITTER-MORTALITY: pups that died within the first 8 weeks. */
|
||||
deathsWithin8Weeks?: number | null
|
||||
/**
|
||||
* NACHVERFOLGUNG: Datenherkunft des Import-Eintrags als JSON-String (vom
|
||||
* Python-Merge erzeugt; siehe {@link EntityProvenance}). null = manuell angelegt.
|
||||
*/
|
||||
provenance?: string | null
|
||||
}
|
||||
|
||||
/** Payload for POST /litters. */
|
||||
|
||||
Reference in New Issue
Block a user