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
+19
View File
@@ -339,6 +339,25 @@ actor APIClient {
try await send(try makeRequest("/items/\(id)/loans"), as: [Loan].self)
}
// MARK: - Verwendungsstatus
/// Umstellen; `status` nil heisst verfuegbar. Eigener Endpunkt aus
/// demselben Grund wie Zubehoer, und weil updateItem Admins vorbehalten ist
/// - umstellen darf jeder angemeldete Benutzer.
///
/// Antwortet mit dem ganzen Stueck, die Aufrufstelle braucht also kein
/// zweites Laden.
func setzeVerwendung(id: Int, status: VerwendungStatus?) async throws -> Item {
var request = try makeRequest("/items/\(id)/verwendung", method: "PUT")
try jsonBody(&request, VerwendungSetzenRequest(status: status?.rawValue))
return try await send(request, as: Item.self)
}
/// Verwendungs-Verlauf eines Stuecks, neueste zuerst.
func itemVerwendungen(id: Int) async throws -> [Verwendung] {
try await send(try makeRequest("/items/\(id)/verwendungen"), as: [Verwendung].self)
}
/// Offene Verleihe, faelligste zuerst. `dueIn` grenzt auf die ein, deren
/// Rueckgabe in so vielen Tagen ansteht (ueberfaellige sind immer dabei).
func loans(dueIn: Int? = nil) async throws -> [Loan] {