iOS: Name/Marke per Text scannen + Frischedatum ohne Jahr erkennen
- Neuer TextScanView: beim Anlegen Name und Marke per Texterkennung einlesen (erkannte Zeilen antippen, wie beim MHD-Scan) - kein Abtippen mehr, wenn ein Produkt nicht in Open Food/Products Facts steht. - BestBeforeText erkennt jetzt auch Tag.Monat ohne Jahr (z.B. "05.01" bei Frischware / "zu verbrauchen bis") und ergaenzt das aktuelle Jahr (bzw. das naechste, falls schon vergangen). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -92,6 +92,14 @@ struct ProductFormView: View {
|
||||
// Eigene Felder der (Gegenstands-)Kategorie – schon beim Anlegen ausfüllbar.
|
||||
@State private var fieldDefs: [FieldDefinition] = []
|
||||
@State private var fieldValues: [String: String] = [:]
|
||||
// Text-Scan für Name/Marke (statt abtippen), wenn ein Produkt neu ist.
|
||||
@State private var scanTarget: TextScanTarget?
|
||||
|
||||
enum TextScanTarget: Identifiable {
|
||||
case name, brand
|
||||
var id: Int { self == .name ? 0 : 1 }
|
||||
var titel: String { self == .name ? "Name scannen" : "Marke scannen" }
|
||||
}
|
||||
|
||||
private let baseUnits = [("piece", "Stück"), ("gram", "Gramm"), ("milliliter", "Milliliter")]
|
||||
// Beschriftungen kommen sonst aus DisplaySettings.baseUnitLabel.
|
||||
@@ -109,7 +117,13 @@ struct ProductFormView: View {
|
||||
Section("Artikel") {
|
||||
LabeledField(label: "Barcode", text: $barcode, keyboard: .numberPad)
|
||||
LabeledField(label: "Name", text: $name)
|
||||
if TextScanView.isSupported {
|
||||
Button { scanTarget = .name } label: { Label("Name scannen", systemImage: "text.viewfinder") }
|
||||
}
|
||||
LabeledField(label: "Marke", text: $brand)
|
||||
if TextScanView.isSupported {
|
||||
Button { scanTarget = .brand } label: { Label("Marke scannen", systemImage: "text.viewfinder") }
|
||||
}
|
||||
}
|
||||
Section {
|
||||
Picker("Typ", selection: $modus) {
|
||||
@@ -224,6 +238,13 @@ struct ProductFormView: View {
|
||||
CameraPicker(isPresented: $showCamera) { image in pendingImage = image }
|
||||
.ignoresSafeArea()
|
||||
}
|
||||
.fullScreenCover(item: $scanTarget) { target in
|
||||
NavigationStack {
|
||||
TextScanView(titel: target.titel) { text in
|
||||
if target == .name { name = text } else { brand = text }
|
||||
}
|
||||
}
|
||||
}
|
||||
.onChange(of: pickerItem) { item in
|
||||
guard let item else { return }
|
||||
Task {
|
||||
|
||||
Reference in New Issue
Block a user