Files
Vorrania/ios/Sources/LoginView.swift
Scarriffle d680aeff0e Mengenfeld beschriftet und "Angemeldet bleiben" ergaenzt
Beim Einlagern stand in der Chargenzeile eine nackte 1 ohne Beschriftung. Das
las sich wie eine Nummerierung der Charge, war aber das Mengenfeld. Die Zeile
hat jetzt links die Beschriftung "Menge", der Wert steht rechtsbuendig; die 1
bleibt als Vorgabe, weil meistens genau ein Stueck eingelagert wird. Beim
Auslagern war dieselbe Zeile ebenso unbeschriftet und ist jetzt gleich aufgebaut.

Anmeldung: Das Token wanderte bisher immer dauerhaft in den Schluesselbund.
Der neue Haken "Angemeldet bleiben" laesst sich abwaehlen - dann gilt die
Anmeldung nur, solange die App laeuft, und es bleibt nichts auf dem Geraet
zurueck. Die Wahl wird gemerkt, damit der Haken beim naechsten Mal richtig steht.

Dabei ist aufgefallen, dass der Benutzername nirgends gespeichert wurde: Nach
einem Neustart stand im Menue nur noch "Angemeldet als" ohne Namen. Er wird
jetzt zusammen mit dem Token abgelegt und beim Abmelden wieder entfernt.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-22 17:35:10 +02:00

61 lines
2.2 KiB
Swift

import SwiftUI
struct LoginView: View {
@EnvironmentObject private var session: Session
@State private var server: String = Session.shared.baseURL?.absoluteString ?? ""
@State private var username = ""
@State private var password = ""
@State private var error: String?
@State private var busy = false
@State private var stayLoggedIn = Session.shared.stayLoggedIn
var body: some View {
NavigationStack {
Form {
Section("Server") {
TextField("http://192.168.1.10:8080", text: $server)
.textInputAutocapitalization(.never)
.autocorrectionDisabled()
.keyboardType(.URL)
}
Section("Anmeldung") {
TextField("Benutzername", text: $username)
.textInputAutocapitalization(.never)
.autocorrectionDisabled()
SecureField("Passwort", text: $password)
Toggle("Angemeldet bleiben", isOn: $stayLoggedIn)
}
if !stayLoggedIn {
Section {
Text("Die Anmeldung gilt nur, solange die App geoeffnet ist.")
.font(.caption).foregroundStyle(.secondary)
}
}
if let error {
Section { Text(error).foregroundStyle(.red).font(.callout) }
}
Section {
Button(busy ? "Anmelden…" : "Anmelden") { Task { await login() } }
.disabled(busy || server.isEmpty || username.isEmpty)
}
}
.navigationTitle("Project-Good")
}
}
private func login() async {
error = nil
busy = true
defer { busy = false }
session.setServer(server)
do {
let token = try await APIClient.shared.login(username: username, password: password)
session.store(token: token.accessToken, username: token.username,
isAdmin: token.role == "admin", persist: stayLoggedIn)
} catch {
self.error = error.localizedDescription
}
}
}