App: Tag beim Anlegen, Menge beim Anlegen, Loeschen und NFC beim Ein-/Auslagern

Vier Bruchstellen im taeglichen Gebrauch, alle an derselben Wurzel: Nach dem
Anlegen endete der Weg, und was danach kam, musste man sich selbst suchen.

NFC beim Anlegen: createItems liefert die angelegten Stuecke samt UID laengst
zurueck, ItemAddSheet warf sie nur weg. Bei genau EINEM Stueck geht es jetzt
direkt zum Tag-Blatt. Bei mehreren bleibt es wie bisher - die App koennte
nicht wissen, welches der fuenf Stuecke gerade am Tag haengt. Ohne NFC im
Geraet (iPad) ebenso unveraendert.

Menge beim Anlegen: Ein Gegenstand, der nur als Menge je Lagerort gezaehlt
wird, landete nach dem Anlegen im Nichts. Das Blatt dafuer gab es schon
(ObjectAddSheet), nur fuehrte kein Weg dorthin. Jetzt derselbe Uebergang wie
bei Einzelstuecken, an beiden Einstiegen. Es holt sich die Lagerorte selbst -
ObjectAddSheet nimmt sie als Konstante und laedt sie nicht nach.

Loeschen: Der Knopf sitzt unten in der Artikelansicht, nur fuer Admins - die
Route verlangt das, ohne Riegel gaebe es nur ein wortkarges 403. Lehnt der
Server ab (noch Einzelstuecke oder Bestand), bleibt die Ansicht stehen und
seine Begruendung steht unveraendert in der Fehlerzeile.

NFC beim Ein- und Auslagern: Ein Tag benennt immer genau ein Einzelstueck,
deshalb fuehrt er zur Stueck-Ansicht - beim Auslagern ist "Entfernen (mit
Grund)" genau die passende Aktion. Bewusst NICHT ueber resolve() abgekuerzt:
das faellt bei unbekannter UID auf lookup(barcode:) durch und boete an, einen
Artikel mit einer URL als Barcode anzulegen. Beim Nachschlagen gab es NFC
schon, nur unscheinbar unter der Kamerakarte - Knopf abgesetzt und in der
Bildunterschrift erwaehnt.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Scarriffle
2026-10-15 20:55:37 +02:00
co-authored by Claude Opus 5
parent 501d80a9b8
commit ea7a42ac22
8 changed files with 157 additions and 3 deletions
+62
View File
@@ -785,6 +785,18 @@ extension View {
}
}
}
/// 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<Product?>) -> some View {
sheet(item: artikel) { p in
NavigationStack { MengeNachAnlegenSheet(product: p) { artikel.wrappedValue = nil } }
}
}
}
/// Hat dieser Artikel ueberhaupt Einzelstuecke? Nur Gegenstaende, die je Stueck
@@ -794,6 +806,35 @@ func fuehrtEinzelstuecke(_ p: Product?) -> Bool {
return p.isObject && p.isIndividual
}
/// Gegenstand, dessen Bestand nur als Menge je Lagerort gezaehlt wird – also
/// weder Einzelstuecke noch Verbrauchsgegenstand (der laeuft als Charge).
func fuehrtMengeJeLagerort(_ p: Product?) -> Bool {
guard let p else { return false }
return p.isObject && !p.isIndividual && !p.isBulk
}
/// Laedt die Lagerorte nach und zeigt dann das vorhandene Mengen-Blatt.
///
/// `ObjectAddSheet` nimmt die Lagerorte als Konstante und holt sie – anders als
/// `ItemAddSheet` – nicht selbst. Direkt nach dem Anlegen hat aber niemand eine
/// Liste zur Hand, deshalb diese duenne Schale.
private struct MengeNachAnlegenSheet: View {
let product: Product
var onFertig: () -> Void
@State private var locations: [StorageLocation] = []
var body: some View {
ObjectAddSheet(
product: product,
locations: locations,
einheit: product.unitName.isEmpty ? "Stück" : product.unitName,
perform: { onFertig() }
)
.task { locations = (try? await APIClient.shared.locations()) ?? [] }
}
}
struct ItemAddSheet: View {
let productId: Int
var onDone: () async -> Void
@@ -824,6 +865,10 @@ struct ItemAddSheet: View {
@State private var busy = false
@State private var error: String?
@State private var locScanShown = false
/// Frisch angelegtes Stueck, dessen Tag gleich beschrieben werden soll.
@State private var nfcItem: Item?
/// Ob nach dem Tag-Blatt bis zur Liste geschlossen wird („Anlegen & fertig").
@State private var nfcFinish = false
var body: some View {
Form {
@@ -919,6 +964,14 @@ struct ItemAddSheet: View {
locations = (try? await APIClient.shared.locations()) ?? []
shops = (try? await APIClient.shared.shops()) ?? []
}
// Blatt auf Blatt: Das Anlege-Blatt bleibt stehen, bis der Tag
// geschrieben (oder uebersprungen) ist. Erst sein Verschwinden schliesst
// beide - das ist die Reihenfolge, die SwiftUI vertraegt.
.sheet(item: $nfcItem, onDismiss: {
if nfcFinish, let onFinish { onFinish() } else { dismiss() }
}) { stueck in
NavigationStack { NFCSchreibenView(item: stueck) }
}
}
/// Beleg beim Anlegen analysieren und Felder vorbefüllen (nur bei PDF liefert
@@ -973,6 +1026,15 @@ struct ItemAddSheet: View {
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 {
nfcFinish = finish
nfcItem = created[0]
return // Schliessen uebernimmt das onDismiss des Tag-Blatts
}
if finish, let onFinish { onFinish() } else { dismiss() }
} catch { self.error = error.localizedDescription }
}