From 83f7134459d80e2cc2f29020b8876aae9c5a7ca6 Mon Sep 17 00:00:00 2001 From: Scarriffle Date: Fri, 16 Oct 2026 06:35:37 +0200 Subject: [PATCH] App: Folgeblatt nach dem Anlegen ging beim ersten Mal sofort wieder zu Zwei sheet-Modifikatoren hingen am selben View: einzelstueckeNachAnlegen und mengeNachAnlegen, beide in ea7a42a nebeneinandergesetzt. Zwei Praesentationen am selben View vertragen sich in SwiftUI nicht zuverlaessig - eine davon wird verschluckt, und genau deshalb hielt das Blatt erst im zweiten Anlauf. Jetzt ein einziger Modifikator, der innen verzweigt: Einzelstuecke oder Menge je Lagerort, je nach Verwaltungsart. Statt zweier Zustaende nur noch einer. In der laufenden App geprueft, beide Zweige einzeln: Gegenstand mit Einzelstuecken angelegt -> "Einzelstuecke anlegen" bleibt beim ERSTEN Mal offen; Gegenstand mit Menge je Lagerort angelegt -> "Menge hinzufuegen" ebenso. Dabei nebenbei bestaetigt: Ein Gegenstand ohne Kategorie bekommt vom Server tracking="food" und damit zu Recht gar keinen Folgeschritt - die Verwaltungsart allein macht noch keinen Gegenstand. Co-Authored-By: Claude Opus 5 --- ios/Sources/ItemViews.swift | 29 +++++++++++++---------------- ios/Sources/ListViews.swift | 12 ++++++------ ios/Sources/RootView.swift | 12 ++++++------ 3 files changed, 25 insertions(+), 28 deletions(-) diff --git a/ios/Sources/ItemViews.swift b/ios/Sources/ItemViews.swift index 434e14f..ce9792d 100644 --- a/ios/Sources/ItemViews.swift +++ b/ios/Sources/ItemViews.swift @@ -776,27 +776,24 @@ extension View { /// Die Bindung wird erst im `onDismiss` des Formulars gesetzt: Beides im /// selben Zug zu setzen verschluckt SwiftUI, weil das zweite Sheet dann /// erscheinen soll, waehrend das erste noch verschwindet. - func einzelstueckeNachAnlegen(_ artikel: Binding) -> some View { + /// Je nach Verwaltungsart geht es zu den Einzelstuecken oder zur Menge je + /// Lagerort. Beides haengt an EINEM sheet-Modifikator, nicht an zweien: + /// Zwei Praesentationen am selben View vertragen sich in SwiftUI nicht + /// zuverlaessig - dann schliesst sich das Blatt beim ersten Mal sofort + /// wieder und erst der zweite Anlauf haelt. + func nachAnlegen(_ artikel: Binding) -> some View { sheet(item: artikel) { p in NavigationStack { - ItemAddSheet(productId: p.id, - onDone: {}, - onFinish: { artikel.wrappedValue = nil }) + if fuehrtEinzelstuecke(p) { + ItemAddSheet(productId: p.id, + onDone: {}, + onFinish: { artikel.wrappedValue = nil }) + } else { + MengeNachAnlegenSheet(product: p) { artikel.wrappedValue = nil } + } } } } - - /// Dasselbe fuer Gegenstaende, die nur als Menge je Lagerort gefuehrt - /// werden: direkt zu „davon habe ich zwoelf Stueck", statt den gerade - /// angelegten Artikel hinterher wiederzusuchen. - /// - /// Gleiche Reihenfolge-Regel wie oben – die Bindung erst im `onDismiss` - /// des Formulars setzen. - func mengeNachAnlegen(_ artikel: Binding) -> some View { - sheet(item: artikel) { p in - NavigationStack { MengeNachAnlegenSheet(product: p) { artikel.wrappedValue = nil } } - } - } } /// Hat dieser Artikel ueberhaupt Einzelstuecke? Nur Gegenstaende, die je Stueck diff --git a/ios/Sources/ListViews.swift b/ios/Sources/ListViews.swift index 03cf229..b6a7c42 100644 --- a/ios/Sources/ListViews.swift +++ b/ios/Sources/ListViews.swift @@ -409,8 +409,8 @@ struct ProductListView: View { @State private var showNew = false // Der gerade angelegte Artikel, bis sich das Formular geschlossen hat. @State private var angelegt: Product? - @State private var einzelstueckeFuer: Product? - @State private var mengeFuer: Product? + /// Der gerade angelegte Artikel, bis der Folgeschritt dafuer durch ist. + @State private var nachAnlegenFuer: Product? enum SortMode: String, CaseIterable, Identifiable { case nameAsc = "Name A–Z" @@ -538,8 +538,9 @@ struct ProductListView: View { } } .sheet(isPresented: $showNew, onDismiss: { - if fuehrtEinzelstuecke(angelegt) { einzelstueckeFuer = angelegt } - else if fuehrtMengeJeLagerort(angelegt) { mengeFuer = angelegt } + if fuehrtEinzelstuecke(angelegt) || fuehrtMengeJeLagerort(angelegt) { + nachAnlegenFuer = angelegt + } angelegt = nil }) { NavigationStack { @@ -559,8 +560,7 @@ struct ProductListView: View { } } } - .einzelstueckeNachAnlegen($einzelstueckeFuer) - .mengeNachAnlegen($mengeFuer) + .nachAnlegen($nachAnlegenFuer) .task { categories = (try? await APIClient.shared.categories()) ?? [] } // Bei jedem Erscheinen neu laden – auch beim Zurückkommen aus der // Detailansicht, damit ein dort geänderter Bestand (z.B. neu angelegte diff --git a/ios/Sources/RootView.swift b/ios/Sources/RootView.swift index eddc581..4cc93bf 100644 --- a/ios/Sources/RootView.swift +++ b/ios/Sources/RootView.swift @@ -122,8 +122,8 @@ struct ScanTabView: View { @State private var showNew = false // Der gerade angelegte Artikel, bis sich das Formular geschlossen hat. @State private var angelegt: Product? - @State private var einzelstueckeFuer: Product? - @State private var mengeFuer: Product? + /// Der gerade angelegte Artikel, bis der Folgeschritt dafuer durch ist. + @State private var nachAnlegenFuer: Product? @State private var showKassenzettel = false var body: some View { @@ -182,8 +182,9 @@ struct ScanTabView: View { .navigationTitle("Scannen") .fullScreenCover(isPresented: $showKassenzettel) { KassenzettelView() } .sheet(isPresented: $showNew, onDismiss: { - if fuehrtEinzelstuecke(angelegt) { einzelstueckeFuer = angelegt } - else if fuehrtMengeJeLagerort(angelegt) { mengeFuer = angelegt } + if fuehrtEinzelstuecke(angelegt) || fuehrtMengeJeLagerort(angelegt) { + nachAnlegenFuer = angelegt + } angelegt = nil }) { NavigationStack { @@ -193,8 +194,7 @@ struct ScanTabView: View { } } } - .einzelstueckeNachAnlegen($einzelstueckeFuer) - .mengeNachAnlegen($mengeFuer) + .nachAnlegen($nachAnlegenFuer) } } }