From 1e8c4b279797316e7a2010b975def7bfb4bc1efc Mon Sep 17 00:00:00 2001 From: Scarriffle Date: Thu, 15 Oct 2026 21:51:19 +0200 Subject: [PATCH] App: sichtbarer Knopf "Anlegen & NFC-Tag beschreiben" im Anlege-Formular Gewuenscht war ein Knopf, den man sieht. Gebaut war ein Schritt, der erst NACH dem Antippen von "Anlegen" kam - im Formular also nichts zu sehen. Und er kam nicht einmal dann: await onDone() laedt die Elternansicht neu, dabei wird das Anlege-Blatt abgeraeumt, und jeder Zustand, den man danach setzt, laeuft ins Leere. Deshalb war von dem Schritt nie etwas zu sehen. Jetzt steht "Anlegen & NFC-Tag beschreiben" neben "Anlegen", mit Wellensymbol und nur bei Anzahl 1 (ein Tag gehoert zu genau einem Stueck; bei mehr sagt ein Hinweis, warum er fehlt). Frueher kann der Knopf nicht stehen: Die UID vergibt der Server erst beim Anlegen, vorher gibt es nichts zu schreiben. Das Neuladen holt jetzt "Fertig" im Tag-Schritt nach, statt vorher zu laufen. Diesmal in der laufenden App geprueft, nicht nur uebersetzt: Backend lokal auf SQLite, Testartikel angelegt, Ablauf im Simulator durchgespielt. Der Knopf erscheint, legt das Stueck an und fuehrt zum Tag-Schritt mit der richtigen UID und vorrania://i/ als Nutzlast. Co-Authored-By: Claude Opus 5 --- ios/Sources/ItemViews.swift | 45 +++++++++++++++++++++++++++++-------- 1 file changed, 36 insertions(+), 9 deletions(-) diff --git a/ios/Sources/ItemViews.swift b/ios/Sources/ItemViews.swift index 7bc37a8..434e14f 100644 --- a/ios/Sources/ItemViews.swift +++ b/ios/Sources/ItemViews.swift @@ -933,6 +933,22 @@ struct ItemAddSheet: View { Button(busy ? "Anlegen…" : "Anlegen & fertig") { Task { await create(finish: true) } } .disabled(busy) } + // Der Knopf steht hier und nicht weiter oben, weil ein Tag erst + // beschrieben werden kann, wenn das Stueck existiert: Die UID + // vergibt der Server beim Anlegen. Deshalb eine Taste, die + // beides tut - sichtbar an der Stelle, wo man sie sucht. + if count == 1, NFCDienst.verfuegbar { + Button { Task { await create(finish: false, tagDanach: true) } } label: { + Label(busy ? "Anlegen…" : "Anlegen & NFC-Tag beschreiben", + systemImage: "wave.3.right") + } + .disabled(busy) + } + } footer: { + if NFCDienst.verfuegbar && count > 1 { + Text("Ein NFC-Tag gehört zu genau einem Stück. Bei Anzahl 1 lässt " + + "er sich hier gleich mit beschreiben.") + } } } .navigationTitle("Einzelstücke anlegen") @@ -975,7 +991,16 @@ struct ItemAddSheet: View { .navigationDestination(isPresented: $nfcPush) { if let stueck = nfcItem { NFCSchreibenView(item: stueck, onFertig: { - if nfcFinish, let onFinish { onFinish() } else { dismiss() } + // Jetzt erst auffrischen: vorher raeumte das Neuladen der + // Elternansicht dieses Blatt samt Tag-Schritt ab. + Task { + await onDone() + // Erst den Schub verlassen, dann das Blatt: Solange der + // Tag-Schritt oben liegt, greift dismiss() auf ihn und + // nicht auf das Blatt darunter. + nfcPush = false + if nfcFinish, let onFinish { onFinish() } else { dismiss() } + } }) } } @@ -1010,7 +1035,7 @@ struct ItemAddSheet: View { : "Übernommen: \(teile.joined(separator: ", "))." } - private func create(finish: Bool) async { + private func create(finish: Bool, tagDanach: Bool = false) async { busy = true; defer { busy = false }; error = nil do { var sid = shopId @@ -1032,17 +1057,19 @@ struct ItemAddSheet: View { itemId: first.id, data: data, filename: docName.isEmpty ? "beleg" : docName, contentType: docType) } - await onDone() - // Genau EIN Stueck: gleich den Tag beschreiben, statt das Stueck - // hinterher in der Liste wiederzusuchen. Bei mehreren koennte die - // App nicht wissen, welches davon gerade am Tag haengt - dort - // bleibt es wie bisher. Ohne NFC im Geraet (iPad) ebenso. - if created.count == 1, NFCDienst.verfuegbar { + // Weiter zum Tag-Schritt - und zwar BEVOR onDone() laeuft. + // + // onDone() laedt die Elternansicht neu, und dabei wird dieses Blatt + // abgeraeumt: Jeder Zustand, den man danach setzt, laeuft ins Leere. + // Genau daran ist der Schritt vorher unsichtbar gescheitert. Das + // Neuladen holt deshalb „Fertig" im Tag-Schritt nach. + if tagDanach, created.count == 1, NFCDienst.verfuegbar { nfcFinish = finish nfcItem = created[0] nfcPush = true - return // Schliessen uebernimmt „Fertig" im Tag-Schritt + return } + await onDone() if finish, let onFinish { onFinish() } else { dismiss() } } catch { self.error = error.localizedDescription } }