iOS: Kategorie-Typfilter + Lagerort-Hierarchie (aufklappbarer Baum)

Gemeinsame TreeMasterView fuer hierarchische Stammdaten (Ein-/Ausklappen,
Anlegen, Bearbeiten, Loeschen):
- Kategorien: Segment-Filter Alle/Lebensmittel/Gegenstaende (wie im Web); in
  der Alle-Ansicht zeigt jede Zeile ihre Art. Anlegen/Bearbeiten waehlt die
  Verwaltungsart (neu: createCategory mit tracking, updateCategory).
- Lagerorte: werden jetzt als aufklappbarer Baum gezeigt statt flach. Beim
  Anlegen laesst sich ein Elternort waehlen (Hierarchie aufbauen); Umhaengen
  unterstuetzt der Server nicht, Bearbeiten bleibt daher Umbenennen.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Scarriffle
2026-07-26 13:01:28 +02:00
parent 949c395fbf
commit 956a472c04
3 changed files with 394 additions and 170 deletions

View File

@@ -446,6 +446,18 @@ struct CategoryItem: Codable, Identifiable, Hashable {
var isObject: Bool { tracking == "object" }
}
// MARK: - Hierarchische Stammdaten
/// Gemeinsame Form baumartiger Stammdaten (Kategorien, Lagerorte): eine flache
/// Liste mit Eltern-Verweis, aus der sich der Baum aufbauen lässt.
protocol TreeItem: Identifiable where ID == Int {
var name: String { get }
var parentId: Int? { get }
}
extension CategoryItem: TreeItem {}
extension StorageLocation: TreeItem {}
/// Shop / Bezugsquelle fuer Gegenstaende ("gekauft bei").
struct ShopItem: Codable, Identifiable, Hashable {
let id: Int
@@ -856,13 +868,19 @@ struct NewPackageTypeRequest: Codable {
struct NewCategoryRequest: Codable {
let name: String
let parentId: Int?
var tracking: String? = nil
enum CodingKeys: String, CodingKey {
case name
case name, tracking
case parentId = "parent_id"
}
}
struct CategoryUpdateRequest: Codable {
let name: String?
let tracking: String?
}
struct NewShopRequest: Codable {
let name: String
let website: String?