Locale-abhaengige Preis-Eingabe und -Anzeige im Frontend #324
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#324
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?
Komponente: frontend
Aktuelles Verhalten:
Das Preis-Eingabefeld im Formular-Editor (
form-editor.svelte) verwendet<input type="number" step="0.50">. Dies fuehrt zu drei Bugs:,) wird vom Browser nicht als Dezimaltrenner akzeptiert..toFixed(2)liefert Punkt-Format ("180.00") statt "180,00".step="0.50"verhindert nicht, dass der User mehr als 2 Nachkommastellen eingibt (z. B. "150.123").Zusaetzlich sind Preis-Formatierungen ueber das Frontend verteilt und inkonsistent:
form-editor.svelte:.toFixed(2)(Punkt-Format)form-fields.svelte:.toLocaleString('de-DE', ...)(hartcodiertde-DE)events/[eventId]/+page.svelte: EigeneformatEuroCent()+ 2x inline.toLocaleString('de-DE')Gewuenschtes Verhalten:
Locale-abhaengige Preis-Eingabe und -Anzeige via
Intl.NumberFormatohne hardcodierte Liste. Ein Teil der Eingabe soll ueber dasui_locale-Cookie gesteuert werden.Akzeptanzkriterien:
frontend/src/lib/utils/format-price.tsmitparsePriceInput()undformatPriceDisplay()form-editor.svelte: Input auftype="text"+inputmode="decimal"umgestellt, locale-aware parsing viai18n.locale, nur Blur schreibt nach Centform-fields.svelte: 3x.toLocaleString('de-DE')durchformatPriceDisplay()ersetztevents/[eventId]/+page.svelte:formatEuroCent()durchformatPriceDisplay()ersetzt, 2x inline.toLocaleStringvereinheitlichtformat-price.tsexistierenBetroffene Dateien:
frontend/src/lib/utils/format-price.tsparsePriceInput(raw, locale)undformatPriceDisplay(cents, locale)frontend/src/lib/components/form-editor.sveltetype="number"→type="text"+inputmode="decimal"; Draft-Tracking waehrend Eingabe; blur-kommittiert;.toFixed(2)→formatPriceDisplay()frontend/src/lib/components/form-fields.svelte.toLocaleString('de-DE')→formatPriceDisplay(cents, i18n.locale)frontend/src/routes/app/events/[eventId]/+page.svelteformatEuroCent()ersetzen durchformatPriceDisplay(); 2x inline.toLocaleStringvereinheitlichenfrontend/src/__tests__/form-editor.component.test.tsfrontend/src/__tests__/events.test.tsformatEuroCentdurchformatPriceDisplayersetzenDetails zur neuen Utility
format-price.ts:Details zur neuen Eingabe-Logik in
form-editor.svelte:Template:
Test-Hinweise zum Reproduzieren der Bugs auf https://planerbeta.richards-enkel.de:
Ergaenzung: Regression-Tests
Die neue Utility
format-currency.tsbekommt eigene Unit-Tests infrontend/src/__tests__/format-currency.test.ts:Zusaetzlich wird
form-editor.component.test.tsum einen Blur-Test erweitert:Mockbedarf: Der Test benoetigt
i18n.locale = 'de'. Dai18nein $state-Objekt aus$lib/stores/i18n.svelte.tsist, wird in der Test-Dateivi.mock('$lib/stores/i18n.svelte', () => ({ i18n: { locale: 'de', loaded: true } }))ergaenzt.niboer referenced this issue2026-07-22 17:45:19 +00:00