Files
RouterOS/RouterOSAssistant/Features/Backup/BackupListView.swift
T
KayandClaude Sonnet 5 87f4fa188c M3: WAN + LAN/DHCP-Wizard mit Anwenden-Logik
Neuer "Einrichten"-Tab führt durch Internet-Anschluss (DHCP/statisch/
PPPoE) und Heimnetzwerk+DHCP-Server, zeigt vor dem Anwenden eine
Klartext-Übersicht (optional mit den exakten RouterOS-Befehlen) und
erstellt automatisch eine Sicherung, bevor Änderungen geschrieben
werden. Änderungen laufen über beide Transporte: CLI-Zeile für SSH,
JSON-POST für REST — beide aus einem gemeinsamen RouterOSCommand
gebaut. RouterOS-CLI-Syntax ist Standard und langjährig stabil, aber
nicht gegen ein echtes Gerät verifiziert; deshalb die Detailanzeige
im Übersichtsschritt vor dem Anwenden.

ConnectionService ist jetzt der einzige App-weite Zustand (ersetzt
SessionStore) und wird explizit an alle drei Tabs durchgereicht.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HReLXMbmPvtQ23p1iWiJNW
2026-09-11 21:07:34 +02:00

65 lines
2.4 KiB
Swift

import SwiftUI
struct BackupListView: View {
@ObservedObject var connectionService: ConnectionService
@StateObject private var viewModel = BackupViewModel()
var body: some View {
NavigationStack {
Group {
if viewModel.backups.isEmpty {
ContentUnavailableView(
"Keine Sicherungen",
systemImage: "clock.arrow.circlepath",
description: Text("Erstelle eine Sicherung, bevor du Änderungen am Router vornimmst.")
)
} else {
List(viewModel.backups) { backup in
VStack(alignment: .leading) {
Text(backup.host).bold()
Text(backup.createdAt.formatted(date: .abbreviated, time: .standard))
.font(.caption)
.foregroundStyle(.secondary)
}
}
}
}
.navigationTitle("Sicherungen")
.toolbar {
ToolbarItem {
Button {
if let credentials = connectionService.credentials {
viewModel.createBackup(for: credentials)
}
} label: {
if viewModel.isCreatingBackup {
ProgressView()
} else {
Label("Jetzt sichern", systemImage: "square.and.arrow.down")
}
}
.disabled(connectionService.credentials == nil || viewModel.isCreatingBackup)
.help(connectionService.credentials == nil ? "Zuerst im Tab 'Verbinden' mit dem Router verbinden." : "Sicherung jetzt erstellen")
}
}
.alert(
"Sicherung fehlgeschlagen",
isPresented: Binding(
get: { viewModel.errorMessage != nil },
set: { _ in viewModel.errorMessage = nil }
),
presenting: viewModel.errorMessage
) { _ in
Button("OK") {}
} message: { message in
Text(message)
}
}
.onAppear { viewModel.load() }
}
}
#Preview {
BackupListView(connectionService: ConnectionService())
}