Einzelstueck anlegen: im Verlauf sichtbar und vom Artikel aus erreichbar
Zwei Luecken, die zusammen den Eindruck machten, ein angelegtes Einzelstueck
sei verschwunden.
Der Verlauf kannte nur das Verschwinden. remove_item schreibt seit jeher eine
Bewegung, create_items nicht - Abgaenge von Einzelstuecken tauchten also auf,
Zugaenge nie, im Verlauf wie im Dashboard. Jetzt schreibt das Anlegen je Stueck
eine in-Bewegung mit UID (oder der eigenen Notiz, falls angegeben), Lagerort und
Benutzer, spiegelbildlich zum Entfernen. Der Bestand bleibt unberuehrt: er
zaehlt bei Einzelstuecken die Zeilen in items und rechnet nicht aus Bewegungen.
Und der Weg dorthin fehlte. ProductFormView liefert den angelegten Artikel, aber
zwei der drei Aufrufer warfen ihn weg ("{ _ in showNew = false }") - nur der
Einlagern-Weg nutzte ihn. "Einzelstuecke anlegen" steckt ausschliesslich in der
Artikelansicht, die man vom Scan-Tab und aus den Listen nach dem Anlegen gar
nicht erreicht. Man musste den frischen Artikel von Hand wiederfinden.
Bei Gegenstaenden mit eigener UID je Stueck oeffnet sich jetzt direkt das
Anlege-Formular. Gesetzt wird das im onDismiss des Artikelformulars: beides im
selben Zug zu setzen verschluckt SwiftUI, weil das zweite Sheet erscheinen soll,
waehrend das erste noch verschwindet.
Der Parameter von create_items heisst dadurch user statt _; die drei Testaufrufe
sind mitgezogen.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
c924dffad6
commit
ca4e9a2264
@@ -641,6 +641,35 @@ struct ItemEditView: View {
|
||||
|
||||
// MARK: - Anlegen
|
||||
|
||||
extension View {
|
||||
/// Nach dem Anlegen eines Artikels gleich dessen Einzelstücke erfassen.
|
||||
///
|
||||
/// „Artikel anlegen" endete bisher im Nichts: `ProductFormView` liefert den
|
||||
/// neuen Artikel, aber die Aufrufer warfen ihn weg – und „Einzelstücke
|
||||
/// anlegen" steckt ausschliesslich in der Artikelansicht, die man von dort
|
||||
/// aus gar nicht erreicht.
|
||||
///
|
||||
/// 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<Product?>) -> some View {
|
||||
sheet(item: artikel) { p in
|
||||
NavigationStack {
|
||||
ItemAddSheet(productId: p.id,
|
||||
onDone: {},
|
||||
onFinish: { artikel.wrappedValue = nil })
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Hat dieser Artikel ueberhaupt Einzelstuecke? Nur Gegenstaende, die je Stueck
|
||||
/// eine eigene UID fuehren – Lebensmittel und Mengen-Gegenstaende nicht.
|
||||
func fuehrtEinzelstuecke(_ p: Product?) -> Bool {
|
||||
guard let p else { return false }
|
||||
return p.isObject && p.isIndividual
|
||||
}
|
||||
|
||||
struct ItemAddSheet: View {
|
||||
let productId: Int
|
||||
var onDone: () async -> Void
|
||||
|
||||
@@ -362,6 +362,9 @@ struct ProductListView: View {
|
||||
@State private var verwaltungFilter: String?
|
||||
@State private var busy = false
|
||||
@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?
|
||||
|
||||
enum SortMode: String, CaseIterable, Identifiable {
|
||||
case nameAsc = "Name A–Z"
|
||||
@@ -488,12 +491,17 @@ struct ProductListView: View {
|
||||
}
|
||||
}
|
||||
}
|
||||
.sheet(isPresented: $showNew) {
|
||||
.sheet(isPresented: $showNew, onDismiss: {
|
||||
if fuehrtEinzelstuecke(angelegt) { einzelstueckeFuer = angelegt }
|
||||
angelegt = nil
|
||||
}) {
|
||||
NavigationStack {
|
||||
// Ohne Barcode: nur Name + Kategorie nötig. Typ aus der Liste
|
||||
// vorbelegen. Nach dem Anlegen schließt sich das Formular und die
|
||||
// Liste wird aufgefrischt.
|
||||
ProductFormView(prefillBarcode: nil, groupId: nil, initialType: fixedType) { _ in
|
||||
// vorbelegen. Nach dem Anlegen schließt sich das Formular, die
|
||||
// Liste wird aufgefrischt – und bei Gegenständen mit eigener UID
|
||||
// je Stück geht es gleich weiter zum Anlegen der Einzelstücke.
|
||||
ProductFormView(prefillBarcode: nil, groupId: nil, initialType: fixedType) { created in
|
||||
angelegt = created
|
||||
showNew = false
|
||||
Task { await load() }
|
||||
}
|
||||
@@ -504,6 +512,7 @@ struct ProductListView: View {
|
||||
}
|
||||
}
|
||||
}
|
||||
.einzelstueckeNachAnlegen($einzelstueckeFuer)
|
||||
.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
|
||||
|
||||
@@ -117,6 +117,9 @@ struct ScanTabView: View {
|
||||
@EnvironmentObject private var router: Router
|
||||
@EnvironmentObject private var session: Session
|
||||
@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 showKassenzettel = false
|
||||
|
||||
var body: some View {
|
||||
@@ -174,13 +177,18 @@ struct ScanTabView: View {
|
||||
.padding()
|
||||
.navigationTitle("Scannen")
|
||||
.fullScreenCover(isPresented: $showKassenzettel) { KassenzettelView() }
|
||||
.sheet(isPresented: $showNew) {
|
||||
.sheet(isPresented: $showNew, onDismiss: {
|
||||
if fuehrtEinzelstuecke(angelegt) { einzelstueckeFuer = angelegt }
|
||||
angelegt = nil
|
||||
}) {
|
||||
NavigationStack {
|
||||
ProductFormView(prefillBarcode: nil, groupId: nil) { _ in
|
||||
ProductFormView(prefillBarcode: nil, groupId: nil) { created in
|
||||
angelegt = created
|
||||
showNew = false
|
||||
}
|
||||
}
|
||||
}
|
||||
.einzelstueckeNachAnlegen($einzelstueckeFuer)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user