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/<UID> als Nutzlast.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Scarriffle
2026-10-15 21:51:19 +02:00
co-authored by Claude Opus 5
parent 75899714b3
commit 1e8c4b2797
+36 -9
View File
@@ -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 }
}