Detailseite (Rennmausakte): - Neugestaltung: Hero-Foto + Overlay, Schnellfakten-Pills, Karten-Sektionen, Charakter als Chips, getabte Fotos/Gesundheit/Gewicht. - Eltern (Vater/Mutter) als Links; Charakter-Karte klappt bei Status Abgabe/Verstorben/Abgegeben ein (nur Zucht/Liebhaber offen). - Gehege wird bei abgegebenen/verstorbenen Tieren ausgeblendet (Detail + Formular). Listen: - Infinite Scroll auf allen Listen (Rennmäuse, Würfe, Gehege, Verträge, Anfragen, Kontakte) via useInfiniteList/useInfiniteSentinel; stabile Sortierung mit id-Tiebreaker (keine doppelten Keys), Back-to-top-Button. - Kontakte: Rolle-Filter (Züchter/Abnehmer) als Quick-Chips + Sticky-Header. Zucht-Nachname: - Namens-Anhängsel der Zucht in den Einstellungen + je Züchter-Kontakt (Backend-Spalten + Migration); eigene Tiere zeigen „Name + Suffix". - „Eigene Zucht" ist die Standard-Herkunft neuer Tiere. Weiteres: - Gehege-Bilder: Upload/Galerie auf der Gehege-Detailseite (Backend EnclosurePhoto + Endpoints + Migration, geteilte Dateiablage). - Toast-Rückmeldungen für alle Speichern-Aktionen. - Checkboxen durch mobile-freundliche Toggle-Schalter ersetzt. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
40 lines
1.1 KiB
TypeScript
40 lines
1.1 KiB
TypeScript
/** FEAT-13: Zuchtprofil (/settings/breeder-profile) — Verkäufer-Block der Verträge. */
|
|
import { api } from './client'
|
|
|
|
export interface BreederProfile {
|
|
zuchtName: string
|
|
name: string
|
|
address: string
|
|
phone: string
|
|
email: string
|
|
homepage: string
|
|
/** Ort der Unterschriftszeile („{Ort}, den {Datum}“). */
|
|
city: string
|
|
/** Namens-Anhängsel („Nachname") der eigenen Zucht, z. B. „von den kleinen Chaoten“. */
|
|
nameSuffix: string
|
|
}
|
|
|
|
export const EMPTY_BREEDER_PROFILE: BreederProfile = {
|
|
zuchtName: '',
|
|
name: '',
|
|
address: '',
|
|
phone: '',
|
|
email: '',
|
|
homepage: '',
|
|
city: '',
|
|
nameSuffix: '',
|
|
}
|
|
|
|
/** Pflichtangaben für einen brauchbaren Vertrag (Hinweis-Logik der UI). */
|
|
export function isBreederProfileComplete(p: BreederProfile): boolean {
|
|
return [p.name, p.address, p.city].every((v) => v.trim().length > 0)
|
|
}
|
|
|
|
export function getBreederProfile(): Promise<BreederProfile> {
|
|
return api.get<BreederProfile>('/settings/breeder-profile')
|
|
}
|
|
|
|
export function putBreederProfile(profile: BreederProfile): Promise<void> {
|
|
return api.put<void>('/settings/breeder-profile', profile)
|
|
}
|