From 75899714b3d4052872962d7fbaa85077104cd448 Mon Sep 17 00:00:00 2001 From: Scarriffle Date: Thu, 15 Oct 2026 21:37:11 +0200 Subject: [PATCH] App: Listendarstellung der Auswahl zurueckgenommen - sie warf aus dem Formular Beim Anlegen eines Artikels fuehrte die Kategoriewahl zurueck in die Artikelliste: Das Formular steht in einem Blatt, und die geschobene Auswahl riss beim Zurueckspringen den ganzen Navigationsstapel mit - das Blatt also gleich dazu. Der Artikel liess sich so nicht mehr anlegen. Damit ist .pickerStyle(.navigationLink) an allen acht Stellen wieder draussen. Die Auswahl ist wieder ein Menue und rueckt mit fuehrenden Leerzeichen ein, wie vor d7002e2. Der Umbruch langer Namen bleibt damit ungeloest: Faellt "Schublade Links Unten" auf eine zweite Zeile, faengt die wieder ganz links an. Die Grenze steht jetzt als Kommentar an Baumzeile.label, damit der naechste Versuch nicht wieder in dieselbe Falle laeuft. Funktionierendes Anlegen wiegt schwerer als saubere Einrueckung. Der mittige Loeschdialog aus demselben Commit bleibt. Co-Authored-By: Claude Opus 5 --- ios/Sources/Baum.swift | 32 ++++++++--------------------- ios/Sources/CategoryPicker.swift | 5 +---- ios/Sources/CheckInFormView.swift | 3 +-- ios/Sources/ItemViews.swift | 6 ++---- ios/Sources/MasterDataViews.swift | 6 ++---- ios/Sources/ObjectStockView.swift | 3 +-- ios/Sources/ProductDetailView.swift | 3 +-- 7 files changed, 16 insertions(+), 42 deletions(-) diff --git a/ios/Sources/Baum.swift b/ios/Sources/Baum.swift index f59a731..7e1d656 100644 --- a/ios/Sources/Baum.swift +++ b/ios/Sources/Baum.swift @@ -1,4 +1,4 @@ -import SwiftUI +import Foundation /// Eine Zeile einer flach ausgelegten Baumliste, mit ihrer Tiefe. /// @@ -12,33 +12,17 @@ struct Baumzeile: Identifiable { var id: T.ID { item.id } - /// Name mit Einrueckung aus fuehrenden Leerzeichen. + /// Name mit Einrueckung je Ebene. /// - /// Nur fuer aufklappende Menues, wo man ausser Text nichts abliefern kann. - /// Der Nachteil bleibt dort bestehen: Bricht ein langer Name um, faengt die - /// zweite Zeile ganz links an. Wo es geht, `BaumZeile` nehmen. + /// Eingerueckt wird mit fuehrenden Leerzeichen, weil ein aufklappendes + /// Auswahlmenue ausser Text nichts annimmt - Layout ignoriert es. + /// Bekannte Grenze: Bricht ein langer Name auf eine zweite Zeile um, + /// faengt die wieder ganz links an. Eine Listendarstellung + /// (`.pickerStyle(.navigationLink)`) koennte das, riss aber im Blatt den + /// ganzen Navigationsstapel mit und ist deshalb wieder draussen. var label: String { String(repeating: " ", count: tiefe) + item.name } } -/// Auswahlzeile mit echter Einrueckung. -/// -/// Fuehrende Leerzeichen verschieben nur die erste Zeile - ein langer Name -/// bricht um und die Fortsetzung steht wieder ganz links, womit die Hierarchie -/// verloren geht. Ein Innenabstand rueckt dagegen den ganzen Block ein. -/// -/// Verlangt eine Auswahl, die als Liste erscheint (`.pickerStyle(.navigationLink)`): -/// In einem aufklappenden Menue zeigt das System nur den Text und ignoriert -/// jedes Layout. -struct BaumZeile: View { - let zeile: Baumzeile - - var body: some View { - Text(zeile.item.name) - .frame(maxWidth: .infinity, alignment: .leading) - .padding(.leading, CGFloat(zeile.tiefe) * 16) - } -} - /// Bringt eine flache Eltern-Kind-Liste in Baumreihenfolge, mit Tiefe. /// /// Waisen - deren Elternteil weggefiltert oder geloescht ist - gelten als diff --git a/ios/Sources/CategoryPicker.swift b/ios/Sources/CategoryPicker.swift index 71be21e..5472077 100644 --- a/ios/Sources/CategoryPicker.swift +++ b/ios/Sources/CategoryPicker.swift @@ -14,12 +14,9 @@ struct CategoryPicker: View { Picker("Kategorie", selection: $selection) { Text("– keine –").tag(Int?.none) ForEach(baum(gefiltert)) { eintrag in - BaumZeile(zeile: eintrag).tag(Int?.some(eintrag.item.id)) + Text(eintrag.label).tag(Int?.some(eintrag.item.id)) } } - // Als Liste statt als Menue: Nur so rueckt ein umbrechender langer - // Name auch in der zweiten Zeile ein. - .pickerStyle(.navigationLink) } private var gefiltert: [CategoryItem] { diff --git a/ios/Sources/CheckInFormView.swift b/ios/Sources/CheckInFormView.swift index 9f64764..e71150c 100644 --- a/ios/Sources/CheckInFormView.swift +++ b/ios/Sources/CheckInFormView.swift @@ -212,10 +212,9 @@ struct CheckInFormView: View { Picker("Lagerort", selection: $locationId) { Text("– keiner –").tag(String?.none) ForEach(baum(locations)) { eintrag in - BaumZeile(zeile: eintrag).tag(String?.some(eintrag.item.id)) + Text(eintrag.label).tag(String?.some(eintrag.item.id)) } } - .pickerStyle(.navigationLink) Button { locScanError = nil locScanPaused = false diff --git a/ios/Sources/ItemViews.swift b/ios/Sources/ItemViews.swift index e8c77be..7bc37a8 100644 --- a/ios/Sources/ItemViews.swift +++ b/ios/Sources/ItemViews.swift @@ -340,9 +340,8 @@ struct ItemEditView: View { Section { Picker("Lagerort", selection: $locationId) { Text("– ohne –").tag(String?.none) - ForEach(baum(locations)) { e in BaumZeile(zeile: e).tag(String?.some(e.item.id)) } + ForEach(baum(locations)) { e in Text(e.label).tag(String?.some(e.item.id)) } } - .pickerStyle(.navigationLink) // Lagerort per QR setzen – ohne den (evtl. nicht vorhandenen) QR // des Einzelstücks. Praktisch z.B. bei Kleidung. Button { locScanShown = true } label: { @@ -879,9 +878,8 @@ struct ItemAddSheet: View { Stepper("Anzahl: \(count)", value: $count, in: 1...200) Picker("Lagerort", selection: $locationId) { Text("– ohne –").tag(String?.none) - ForEach(baum(locations)) { e in BaumZeile(zeile: e).tag(String?.some(e.item.id)) } + ForEach(baum(locations)) { e in Text(e.label).tag(String?.some(e.item.id)) } } - .pickerStyle(.navigationLink) Button { locScanShown = true } label: { Label("Lagerort scannen", systemImage: "qrcode.viewfinder") } diff --git a/ios/Sources/MasterDataViews.swift b/ios/Sources/MasterDataViews.swift index 35c2b33..0d40890 100644 --- a/ios/Sources/MasterDataViews.swift +++ b/ios/Sources/MasterDataViews.swift @@ -447,10 +447,9 @@ struct LocationEditor: View { Picker("Übergeordnet", selection: $parentId) { Text("– oberste Ebene –").tag(String?.none) ForEach(baum(parentOptions)) { eintrag in - BaumZeile(zeile: eintrag).tag(String?.some(eintrag.item.id)) + Text(eintrag.label).tag(String?.some(eintrag.item.id)) } } - .pickerStyle(.navigationLink) } header: { Text("Übergeordneter Lagerort (optional)") } @@ -787,10 +786,9 @@ struct CategoryEditor: View { Picker("Übergeordnet", selection: $parentId) { Text("– oberste Ebene –").tag(Int?.none) ForEach(baum(all)) { eintrag in - BaumZeile(zeile: eintrag).tag(Int?.some(eintrag.item.id)) + Text(eintrag.label).tag(Int?.some(eintrag.item.id)) } } - .pickerStyle(.navigationLink) } header: { Text("Übergeordnete Kategorie (optional)") } footer: { diff --git a/ios/Sources/ObjectStockView.swift b/ios/Sources/ObjectStockView.swift index 0000fa3..5510eae 100644 --- a/ios/Sources/ObjectStockView.swift +++ b/ios/Sources/ObjectStockView.swift @@ -152,9 +152,8 @@ private struct LocationPicker: View { var body: some View { Picker(title, selection: $selection) { Text("– ohne Lagerort –").tag(String?.none) - ForEach(baum(locations)) { e in BaumZeile(zeile: e).tag(String?.some(e.item.id)) } + ForEach(baum(locations)) { e in Text(e.label).tag(String?.some(e.item.id)) } } - .pickerStyle(.navigationLink) } } diff --git a/ios/Sources/ProductDetailView.swift b/ios/Sources/ProductDetailView.swift index 59e7840..9fffda1 100644 --- a/ios/Sources/ProductDetailView.swift +++ b/ios/Sources/ProductDetailView.swift @@ -726,9 +726,8 @@ struct LotEditView: View { Section("Lagerort") { Picker("Lagerort", selection: $locationId) { Text("– ohne –").tag(String?.none) - ForEach(baum(locations)) { e in BaumZeile(zeile: e).tag(String?.some(e.item.id)) } + ForEach(baum(locations)) { e in Text(e.label).tag(String?.some(e.item.id)) } } - .pickerStyle(.navigationLink) // Ort per QR am Regal/Fach setzen, statt in der Liste zu suchen. Button { locScanShown = true } label: { Label("Lagerort scannen", systemImage: "qrcode.viewfinder")