From 04f8c1fccd6539ab037660aa7039d05a27c1fd20 Mon Sep 17 00:00:00 2001 From: Scarriffle Date: Sat, 17 Oct 2026 19:30:48 +0200 Subject: [PATCH] App: "Einzelstuecke anlegen" schloss sich beim ersten Mal sofort wieder Artikel oeffnen, "Einzelstuecke anlegen" tippen - das Blatt ging kurz auf und sofort wieder zu. Erst der zweite Versuch hielt. Danach blieb es stabil, bis man den Artikel neu oeffnete. Das Blatt hing an der Section, nicht am Formular. Genau davor warnt ProductDetailView:368 seit laengerem im eigenen Kommentar - die Mengen-Sheets wurden deshalb schon auf die Form-Ebene gelegt. Fuer die Einzelstuecke wurde das nie nachgezogen. Jetzt gibt ProductItemsSection das Blatt nach oben ab: Die Bindung gehoert ProductDetailView, gezeigt wird es neben den Mengen-Sheets. Weil damit der Rueckruf in den Abschnitt wegfaellt, bekommt er einen Nachlade-Zaehler - die Elternansicht zaehlt ihn nach dem Anlegen hoch, und die Liste frischt auf. Im Simulator vorher reproduziert und nachher geprueft: Erster Tipp nach dem Oeffnen laesst das Blatt stehen, und ein angelegtes Stueck erscheint sofort in der Liste ("Einzelstuecke (1)"). Co-Authored-By: Claude Opus 5 --- ios/Sources/ItemViews.swift | 21 ++++++++++++--------- ios/Sources/ProductDetailView.swift | 19 ++++++++++++++++++- 2 files changed, 30 insertions(+), 10 deletions(-) diff --git a/ios/Sources/ItemViews.swift b/ios/Sources/ItemViews.swift index ce9792d..f409e50 100644 --- a/ios/Sources/ItemViews.swift +++ b/ios/Sources/ItemViews.swift @@ -78,9 +78,14 @@ struct ProductItemsSection: View { var onChanged: () async -> Void /// Bis zur Liste schließen (für „Anlegen & fertig"). var onFinish: (() -> Void)? = nil + /// Hochzaehlen laedt die Liste neu. Noetig, seit das Anlege-Blatt oben + /// haengt: Von dort kommt kein Rueckruf mehr in diesen Abschnitt. + var nachladen: Int = 0 + /// Oeffnet das Anlege-Blatt. Die Bindung gehoert der Elternansicht - das + /// Blatt wird dort gezeigt, nicht hier (siehe unten). + @Binding var anlegen: Bool @State private var items: [Item] = [] - @State private var showAdd = false var body: some View { Section("Einzelstücke (\(items.count))") { @@ -97,17 +102,15 @@ struct ProductItemsSection: View { if items.isEmpty { Text("Noch keine Einzelstücke.").foregroundStyle(.secondary) } - Button { showAdd = true } label: { + Button { anlegen = true } label: { Label("Einzelstücke anlegen", systemImage: "plus") } } - .task(id: product.id) { await reload() } - .sheet(isPresented: $showAdd) { - NavigationStack { - ItemAddSheet(productId: product.id, onDone: { await refresh() }, - onFinish: onFinish.map { finish in { showAdd = false; finish() } }) - } - } + .task(id: "\(product.id)-\(nachladen)") { await reload() } + // Kein .sheet hier. Aus einem Abschnitt heraus gezeigt, schloss es sich + // beim ERSTEN Oeffnen sofort wieder und hielt erst beim zweiten Versuch; + // ProductDetailView hat die Mengen-Blaetter aus genau diesem Grund + // laengst auf die Form-Ebene gelegt. Hier stand es nur nie nach. } private func untertitel(_ it: Item) -> String { diff --git a/ios/Sources/ProductDetailView.swift b/ios/Sources/ProductDetailView.swift index 9fffda1..678b433 100644 --- a/ios/Sources/ProductDetailView.swift +++ b/ios/Sources/ProductDetailView.swift @@ -46,6 +46,9 @@ struct ProductDetailView: View { // Mengen-Bestand (Menge je Lagerort): Sheet + Entnahme-Statistik werden hier // gehalten und auf Form-Ebene präsentiert, damit das Sheet stabil aufgeht. @State private var objectSheet: ObjectStockSheet? + @State private var itemsAnlegen = false + /// Hochzaehlen laesst den Einzelstueck-Abschnitt neu laden. + @State private var itemsNachladen = 0 @State private var objectRemovals: RemovalSummary? private let labels = ["", "Glas", "Tüte", "Flasche", "Dose", "Tube", "Becher", "Beutel", "Karton"] @@ -98,7 +101,9 @@ struct ProductDetailView: View { if current.isObject && current.isIndividual { ProductItemsSection(product: current, onChanged: { await reload() }, - onFinish: { dismiss() }) + onFinish: { dismiss() }, + nachladen: itemsNachladen, + anlegen: $itemsAnlegen) } else if current.isObject && !current.isBulk { // Menge je Lagerort (Verbrauchsgegenstände laufen als Charge, s.u.). ObjectStockSection(product: current, locations: locations, lots: lots, @@ -365,6 +370,18 @@ struct ProductDetailView: View { } } } + // Aus demselben Grund wie die Mengen-Sheets darunter: aus dem Abschnitt + // heraus gezeigt, schloss sich dieses Blatt beim ersten Oeffnen sofort + // wieder und hielt erst beim zweiten Versuch. + .sheet(isPresented: $itemsAnlegen) { + NavigationStack { + ItemAddSheet( + productId: current.id, + onDone: { itemsNachladen += 1; await reload() }, + onFinish: { itemsAnlegen = false; dismiss() } + ) + } + } // Mengen-Sheets auf der stabilen Form-Ebene (nicht im Abschnitt), sonst // schloss sich das Fenster beim ersten Öffnen sofort wieder. .sheet(item: $objectSheet) { welche in