iOS: Lagerorte umhängen, Unterkategorien anlegen, eigene Felder verwalten

- Lagerorte: LocationEditor hängt bestehende Orte jetzt um (Elternort auch beim
  Bearbeiten, eigene Unterorte ausgeschlossen); Client updateLocation +
  LocationUpdateRequest (parent_id wird immer gesendet, auch null).
- Kategorien: beim Anlegen optionale Oberkategorie wählbar (Unterkategorie);
  mit Eltern erbt sie deren Verwaltungsart, sonst wird sie gewählt.
- Eigene Felder: neue CategoryFieldsView + FieldEditor (anlegen/bearbeiten/
  löschen von Feldern je Kategorie), erreichbar aus dem Kategorie-Editor;
  Client ownFieldDefinitions/create/update/deleteFieldDefinition + Models.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Scarriffle
2026-07-26 16:10:14 +02:00
parent f88a459e12
commit 9a11e3cfc6
3 changed files with 394 additions and 32 deletions

View File

@@ -854,6 +854,54 @@ struct NewLocationRequest: Codable {
}
}
/// Lagerort umbenennen und/oder umhängen. `parentId` wird bewusst immer gesendet
/// (auch `null` = oberste Ebene), damit auf oberste Ebene holen" ankommt.
struct LocationUpdateRequest: Codable {
let name: String
let parentId: Int?
enum CodingKeys: String, CodingKey {
case name
case parentId = "parent_id"
}
func encode(to encoder: Encoder) throws {
var c = encoder.container(keyedBy: CodingKeys.self)
try c.encode(name, forKey: .name)
try c.encode(parentId, forKey: .parentId) // encodet null bei nil
}
}
/// Eigenes Feld einer Kategorie anlegen. `unit`/`options` werden immer
/// mitgeschickt; der Server ignoriert sie bei unpassendem Typ.
struct FieldDefinitionCreate: Codable {
let categoryId: Int
let label: String
let fieldType: String
let unit: String
let options: [String]
let required: Bool
enum CodingKeys: String, CodingKey {
case label, unit, options, required
case categoryId = "category_id"
case fieldType = "field_type"
}
}
struct FieldDefinitionUpdate: Codable {
let label: String
let fieldType: String
let unit: String
let options: [String]
let required: Bool
enum CodingKeys: String, CodingKey {
case label, unit, options, required
case fieldType = "field_type"
}
}
struct NewUnitRequest: Codable {
let name: String
let kind: String