Gruppen: Bestand in der richtigen Einheit, Baumansicht, Gruppen-Spalte
Anzeigefehler: die Gruppenliste klebte immer min_stock_unit_name hinter den
Bestand - auch wenn die Gruppe laengst im Gruppen-Gebinde zaehlt. Aus 790 g bei
einem 190-g-Glas wurde so "4,16 Gramm" statt "4,16 Glaeser". Gerechnet war
richtig, beschriftet falsch.
Ursache war doppelte Logik: MinStock.jsx hatte grpPkgMode/grpFactor/grpUnit
lokal, Groups.jsx gar nicht. Die drei stehen jetzt in units.js und werden von
beiden benutzt. Die Einheiten-Spalte sagt ausserdem, wenn eine Gruppe im
Gebinde zaehlt ("zaehlt in Glaeser a 190 g") und bietet den Weg zurueck an.
Gruppenliste als Baum: eine Gruppe mit zwei Obergruppen erscheint unter beiden -
das ist die ehrliche Darstellung eines Graphen. Jede Zeile traegt ihren PFAD als
Schluessel, damit die vorhandene Baumlogik der DataTable unveraendert zurecht
kommt; die kennt nur einen Elternteil je Zeile, und ein Pfad hat genau einen.
Beim Sortieren/Filtern flacht sie wie gewohnt ab.
"1 Untergruppen" heisst jetzt "1 Untergruppe" - an allen vier Stellen ueber
einen gemeinsamen Helfer (anzahlWort), Web und App.
Lebensmittelliste bekommt eine Spalte "Gruppe" mit Filter. Dafuer liefert
ProductOut jetzt group_name, symmetrisch zu category_name, mit joinedload gegen
N+1.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -108,3 +108,9 @@ enum BestBeforeText {
|
||||
return Calendar.current.date(from: komponenten)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// „1 Untergruppe" / „2 Untergruppen" – Ein-/Mehrzahl an einer Stelle.
|
||||
func anzahlWort(_ n: Int, _ einzahl: String, _ mehrzahl: String) -> String {
|
||||
"\(n) \(n == 1 ? einzahl : mehrzahl)"
|
||||
}
|
||||
|
||||
@@ -83,7 +83,9 @@ struct GroupsView: View {
|
||||
let eltern = (g.parentIds ?? []).compactMap { map[$0] }
|
||||
var teile = [eltern.isEmpty ? "oberste Ebene" : "unter: " + eltern.joined(separator: ", ")]
|
||||
teile.append("\(g.productCount ?? 0) Artikel")
|
||||
if let n = g.childIds?.count, n > 0 { teile.append("\(n) Untergruppen") }
|
||||
if let n = g.childIds?.count, n > 0 {
|
||||
teile.append(anzahlWort(n, "Untergruppe", "Untergruppen"))
|
||||
}
|
||||
return teile.joined(separator: " · ")
|
||||
}
|
||||
|
||||
|
||||
@@ -79,7 +79,8 @@ struct ShoppingListView: View {
|
||||
subtitle: "fehlt \(formatAmount(group.deficit)) \(group.unitName)"
|
||||
+ " · \(group.productCount) Artikel"
|
||||
+ ((group.subgroupCount ?? 0) > 0
|
||||
? " · inkl. \(group.subgroupCount ?? 0) Untergruppen" : "")
|
||||
? " · inkl. " + anzahlWort(group.subgroupCount ?? 0, "Untergruppe", "Untergruppen")
|
||||
: "")
|
||||
) { GroupBadge() }
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user