Verwendungsstatus: in der App umstellen, filtern und nachsehen

Im Einzelstueck steht jetzt ueber dem Verleih ein Abschnitt "Verwendung"
mit vier Symbolen: verfuegbar, in Verwendung, in Reinigung, in Reparatur.
Ein Tipp bucht sofort, ohne "Speichern" - wie beim Verleih, denn alle
Scan-Wege (QR, NFC, vorrania://i/<UID>) landen genau in dieser Ansicht.
Vier Woerter waeren auf einem iPhone zu breit, vier Symbole passen immer;
darunter steht der Name im Klartext samt "seit wann".

Dazu der Verwendungs-Verlauf mit Zeitstempeln und Konto, und in der
Einzelstueck-Liste ein Filter ueber alle vier Zustaende plus die Zeile
unter dem Namen, solange etwas laeuft. Stuecke ohne Verwendungsstatus
fallen aus dem Filter "Verfuegbar" heraus - ein Schraubenzieher ist nicht
verfuegbar, er fuehrt den Zustand gar nicht.

Der Haken je Kategorie sitzt im Kategorie-Editor und gilt beim Bearbeiten
auch fuer die Unterkategorien.

Zwei Dinge, die beim Pruefen am Simulator auffielen: Die Leiste haette
beim Oeffnen jedes Mal einmal ins Leere gebucht, weil onChange auch beim
Laden feuert - dagegen der Abgleich mit dem zuletzt gemeldeten Stand. Und
SQLite liefert Zeitstempel ohne Zeitzone, woran ISO8601DateFormatter
scheitert; in der App stand deshalb der rohe ISO-Text.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Scarriffle
2026-10-20 22:07:27 +02:00
co-authored by Claude Opus 5
parent b9d097fe96
commit 290ff9341a
5 changed files with 343 additions and 4 deletions
+16 -2
View File
@@ -757,6 +757,7 @@ struct CategoryEditor: View {
@State private var name: String
@State private var tracking: String
@State private var usageTracking: Bool
@State private var parentId: Int? // nur beim Anlegen
@State private var error: String?
@State private var busy = false
@@ -767,6 +768,7 @@ struct CategoryEditor: View {
self.done = done
_name = State(initialValue: item?.name ?? "")
_tracking = State(initialValue: item?.tracking ?? "object")
_usageTracking = State(initialValue: item?.fuehrtVerwendung ?? false)
_parentId = State(initialValue: nil)
}
@@ -812,6 +814,14 @@ struct CategoryEditor: View {
}
}
if !erbtVonEltern {
Section {
Toggle("Verwendungsstatus führen", isOn: $usageTracking)
} footer: {
Text("Einzelstücke dieser Kategorie führen, woran sie gerade sind – in Verwendung, in Reinigung, in Reparatur. Gedacht für Kleidung und Werkzeug, nicht für Vorräte. Beim Bearbeiten gilt die Einstellung auch für alle Unterkategorien.")
}
}
if let item {
Section {
NavigationLink {
@@ -847,13 +857,17 @@ struct CategoryEditor: View {
do {
if let item {
_ = try await APIClient.shared.updateCategory(
id: item.id, CategoryUpdateRequest(name: n, tracking: tracking))
id: item.id,
CategoryUpdateRequest(name: n, tracking: tracking,
usageTracking: usageTracking))
} else {
// Mit Oberkategorie die Art erben (tracking = nil), sonst die
// gewählte Art.
_ = try await APIClient.shared.createCategory(
NewCategoryRequest(name: n, parentId: parentId,
tracking: parentId == nil ? tracking : nil))
tracking: parentId == nil ? tracking : nil,
// Mit Oberkategorie die Markierung erben.
usageTracking: parentId == nil ? usageTracking : nil))
}
done()
dismiss()