Frontend: Preisoptionen in Formular-Entscheidungsoptionen (Radio/Checkbox) #135
Labels
No labels
component/backend
component/docs
component/e2e
component/frontend
component/infra
component/keycloak
prio/high
prio/low
prio/medium
type/bug
type/chore
type/feature
type/refactor
type/test
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
WompSchmiede/FamilienFeierPlaner#135
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Beschreibung
Nach dem Backend-Issue #134 (openapi.yaml-Schema) muessen die UI-Komponenten um
radio- undcheckbox-Felder mit bepreisten Optionen erweitert werden.Preis-Format: Integer-Cents (15000 = EUR 150,00). Umrechnung in UI via
formatEuro(cents / 100).Aenderungen
1. Orval-Typen regenerieren
npm run generate:apiausfuehren (nach #134)2. FormEditor (
form-editor.svelte)radioundcheckboxim Type-Dropdownlabel-Input +price-Input (Euro, Umrechnung cents ↔ Euro)optionsalsArray<{ label, price: number }>(price in cents)select-Optionen bleiben comma-separated strings3. Gaeste-Formular (
persons/[personId]/+page.svelte)radioals Radio-Button-Gruppe mit Preisangabecheckboxals Checkbox-Gruppe mit PreisangabeformatEuro)radio→ String (Label),checkbox→ String[] (Labels)4. Gaeste-Server (
persons/[personId]/+page.server.ts)saveDraft/submitFinal: Checkbox-Arrays aus mehreren FormData-Eintraegen mit gleichem Namen verarbeiten5. Organisator-Ansicht (
events/[eventId]/+page.svelte)formatFormAnswers(): Preise pro Option und Gesamtsumme anzeigenradio/checkboxmit Price-Display rendern6. Organisator-Server (
events/[eventId]/+page.server.ts)overrideForm: Checkbox-Arrays aus FormData verarbeiten7. Tests
Referenzen
Detailplan (aus Code-Analyse)
1. Orval-Typen regenerieren
cd frontend && npm run generate:api(nach #134 openapi.yaml-Aenderung)frontend/src/lib/api/generated.ts2. FormEditor (
frontend/src/lib/components/form-editor.svelte)FormFieldOptionmitlabel: string, price: number(Cent)FormField.options-Typ aendern:string | FormFieldOption[](select=string, radio/checkbox=Array)radioundcheckboxerweiternlabel-Input +price-Input (Euro, Umrechnung cents ↔ Euro)12.50), Speicherung in Cent (1250)(price / 100).toFixed(2)handleSave():selectbleibtoptions: string[]radio/checkbox→options: [{ label, price }](price in integer Cent)3. Gaeste-Formular (
frontend/src/routes/app/persons/[personId]/+page.svelte)formValues-Typ vonRecord<string, string>aufRecord<string, string | string[]>aendernradio-Feld rendern:<input type="radio">-Gruppe mitformatEuro(price / 100)pro Optioncheckbox-Feld rendern:<input type="checkbox">-Gruppe mit Preisangabe, Gesamtsumme dynamisch berechnenformatEuro(cents)-Hilfsfunktion lokal definieren:(cents / 100).toLocaleString('de-DE', { style: 'currency', currency: 'EUR' })<input type="hidden">mit gleichemname4. Gaeste-Server (
frontend/src/routes/app/persons/[personId]/+page.server.ts)saveDraft: FormData-Eintraege sammeln — wenn Key mehrfach vorkommt →string[], sonststringsubmitFinal: Gleiche Logik wie saveDraft fuer Checkbox-Arrays5. Organisator-Ansicht (
frontend/src/routes/app/events/[eventId]/+page.svelte)formatFormAnswers(): Bei radio/checkbox Preise pro Option und Gesamtsumme anzeigen"Frühstueck: 15,00 €, Parkplatz: 10,00 € (Gesamt: 25,00 €)"overrideValues-Typ:Record<string, string | string[]>openOverride(): Checkbox-Werte alsstring[]ladenradioals Radio-Gruppe,checkboxals Checkbox-Gruppe mit Price-Display6. Organisator-Server (
frontend/src/routes/app/events/[eventId]/+page.server.ts)overrideForm-Action: FormData-Eintraege mit Mehrfachwerten alsstring[]sammeln7. Tests (
frontend/src/tests/)Hinweise
formatEuro(cents / 100)radio→ String (Label),checkbox→ String[] (Labels)