feat(item-form): Einheit als Dropdown mit Vordefiniert-Liste + Custom-Option #114

Closed
opened 2026-05-18 19:31:20 +00:00 by jreinemann-euris · 0 comments
jreinemann-euris commented 2026-05-18 19:31:20 +00:00 (Migrated from github.com)

Anforderung

Das Einheiten-Feld im Item-Formular soll von einem freien Textfeld zu einem Dropdown mit vordefinierten Optionen + Custom werden. Der Preis wird semantisch als Preis pro [Einheit] dargestellt.


Vordefinierte Einheiten (fest, in dieser Reihenfolge)

# Wert (gespeichert) Anzeigetext
1 Stück Stück (Default)
2 g g
3 kg kg
4 ml ml
5 l l
6 Packung Packung
7 Dose Dose
8 Flasche Flasche
9 Benutzerdefiniert Benutzerdefiniert… (immer letzte Option)

Die Liste ist hardcoded als object UnitOptions mit val predefined: List<String> in einer neuen Datei UnitOption.kt.


Verhalten

Dropdown

  • Material3 ExposedDropdownMenuBox (wie das Kategorie- und Lagerort-Dropdown im selben Formular)
  • Default bei neuem Item: Stück
  • Auswahl einer der 8 Einheiten: direkt übernehmen, kein zusätzliches Feld

Custom-Option

  • Wenn Benutzerdefiniert gewählt wird: Ein zusätzliches OutlinedTextField erscheint direkt darunter
  • maxLength = 16 Zeichen (Guard in onValueChange)
  • Placeholder: "z.B. Karton"
  • Gespeichert wird der Custom-Text direkt in unit (nicht der String "Benutzerdefiniert")

Preis-Label (dynamisch)

Das Preis-Feld-Label zeigt die gewählte Einheit:

  • "Preis pro Stück (€)"
  • "Preis pro kg (€)"
  • "Preis pro [custom] (€)" wenn Custom ausgefüllt, sonst "Preis pro Einheit (€)"

Rückwärtskompatibilität

Bestehende Items beim Bearbeiten

Beim Laden eines Items in das Formular:

  1. Wenn item.unit in der Vordefiniert-Liste enthalten ist → Dropdown auf diesen Wert setzen
  2. Wenn item.unit nicht in der Liste enthalten ist → Dropdown auf Benutzerdefiniert, Custom-Textfeld mit item.unit vorausfüllen

Normalisierung von "Stk" / "Stk."

Bestehende Einträge mit unit == "Stk" oder unit == "Stk." sollen zu "Stück" normalisiert werden.
Umsetzung als einmalige Update-Query beim App-Start (z.B. in ItemRepositoryImpl.init oder als Room RoomDatabase.Callback):

UPDATE items SET unit = 'Stück' WHERE unit IN ('Stk', 'Stk.')

Betroffene Dateien

Datei Änderung
neu: domain/model/UnitOption.kt object UnitOptions mit predefined: List<String>
ItemFormScreen.kt OutlinedTextField Einheit → ExposedDropdownMenuBox + optionales Custom-Feld; Preis-Label dynamisch
ItemFormViewModel.kt updateUnit() anpassen; Custom-Zweig (isCustomUnit, customUnitText); Lade-Logik für Rückwärtskompatibilität
ItemRepositoryImpl.kt Normalisierungs-Query für Stk/Stk.

Abnahme-Kriterien

  • Einheit-Feld ist ein Dropdown mit 8 Einheiten + Benutzerdefiniert
  • Default bei neuem Item: Stück
  • Auswahl Benutzerdefiniert → Custom-Textfeld erscheint, max. 16 Zeichen
  • Preis-Label zeigt dynamisch die Einheit: "Preis pro kg (€)"
  • Bestehende Items mit bekannter Einheit: Dropdown korrekt vorausgewählt
  • Bestehende Items mit unbekannter Einheit: Benutzerdefiniert + alter Text im Textfeld
  • Bestehende "Stk"/"Stk."-Einträge werden zu "Stück" normalisiert
  • Build und Unit-Tests grün
## Anforderung Das Einheiten-Feld im Item-Formular soll von einem freien Textfeld zu einem **Dropdown mit vordefinierten Optionen + Custom** werden. Der Preis wird semantisch als `Preis pro [Einheit]` dargestellt. --- ## Vordefinierte Einheiten (fest, in dieser Reihenfolge) | # | Wert (gespeichert) | Anzeigetext | |---|---|---| | 1 | `Stück` | Stück *(Default)* | | 2 | `g` | g | | 3 | `kg` | kg | | 4 | `ml` | ml | | 5 | `l` | l | | 6 | `Packung` | Packung | | 7 | `Dose` | Dose | | 8 | `Flasche` | Flasche | | 9 | `Benutzerdefiniert` | Benutzerdefiniert… *(immer letzte Option)* | Die Liste ist hardcoded als `object UnitOptions` mit `val predefined: List<String>` in einer neuen Datei `UnitOption.kt`. --- ## Verhalten ### Dropdown - Material3 `ExposedDropdownMenuBox` (wie das Kategorie- und Lagerort-Dropdown im selben Formular) - Default bei neuem Item: `Stück` - Auswahl einer der 8 Einheiten: direkt übernehmen, kein zusätzliches Feld ### Custom-Option - Wenn `Benutzerdefiniert` gewählt wird: Ein zusätzliches `OutlinedTextField` erscheint direkt darunter - `maxLength = 16` Zeichen (Guard in `onValueChange`) - Placeholder: `"z.B. Karton"` - Gespeichert wird der Custom-Text direkt in `unit` (nicht der String `"Benutzerdefiniert"`) ### Preis-Label (dynamisch) Das Preis-Feld-Label zeigt die gewählte Einheit: - `"Preis pro Stück (€)"` - `"Preis pro kg (€)"` - `"Preis pro [custom] (€)"` wenn Custom ausgefüllt, sonst `"Preis pro Einheit (€)"` --- ## Rückwärtskompatibilität ### Bestehende Items beim Bearbeiten Beim Laden eines Items in das Formular: 1. Wenn `item.unit` in der Vordefiniert-Liste enthalten ist → Dropdown auf diesen Wert setzen 2. Wenn `item.unit` **nicht** in der Liste enthalten ist → Dropdown auf `Benutzerdefiniert`, Custom-Textfeld mit `item.unit` vorausfüllen ### Normalisierung von "Stk" / "Stk." Bestehende Einträge mit `unit == "Stk"` oder `unit == "Stk."` sollen zu `"Stück"` normalisiert werden. Umsetzung als einmalige Update-Query beim App-Start (z.B. in `ItemRepositoryImpl.init` oder als Room `RoomDatabase.Callback`): ```sql UPDATE items SET unit = 'Stück' WHERE unit IN ('Stk', 'Stk.') ``` --- ## Betroffene Dateien | Datei | Änderung | |---|---| | neu: `domain/model/UnitOption.kt` | `object UnitOptions` mit `predefined: List<String>` | | `ItemFormScreen.kt` | `OutlinedTextField` Einheit → `ExposedDropdownMenuBox` + optionales Custom-Feld; Preis-Label dynamisch | | `ItemFormViewModel.kt` | `updateUnit()` anpassen; Custom-Zweig (`isCustomUnit`, `customUnitText`); Lade-Logik für Rückwärtskompatibilität | | `ItemRepositoryImpl.kt` | Normalisierungs-Query für Stk/Stk. | --- ## Abnahme-Kriterien - [ ] Einheit-Feld ist ein Dropdown mit 8 Einheiten + Benutzerdefiniert - [ ] Default bei neuem Item: Stück - [ ] Auswahl `Benutzerdefiniert` → Custom-Textfeld erscheint, max. 16 Zeichen - [ ] Preis-Label zeigt dynamisch die Einheit: `"Preis pro kg (€)"` - [ ] Bestehende Items mit bekannter Einheit: Dropdown korrekt vorausgewählt - [ ] Bestehende Items mit unbekannter Einheit: Benutzerdefiniert + alter Text im Textfeld - [ ] Bestehende `"Stk"`/`"Stk."`-Einträge werden zu `"Stück"` normalisiert - [ ] Build und Unit-Tests grün
Sign in to join this conversation.
No description provided.