Files
RouterOS/RouterOSAssistant/Features/Wizard/Steps/Setup/ReviewApplyView.swift
T
KayandClaude Sonnet 5 e582728040 Zebra-Streifen für Tabellenansichten (found.md #8)
TableZebra-Helper (AppKit NSColor.alternatingContentBackgroundColors)
angewendet auf: LAN-Scanner-Geräte/Rohfelder/Port-Scan, Experte-
Eintragsliste + "Weitere Parameter"-Grid, Bekannte Router + Interface-
Liste (Verbinden), Sicherungsliste, Review/Apply-Log, Übersicht-
Knotendetails.

Root Cause für "keine Änderung erkennbar": .formStyle(.grouped) malt
einen eigenen blickdichten Hintergrund über Section-Zeilen, der
.listRowBackground verdeckt — .scrollContentBackground(.hidden) ergänzt.

Live bestätigt ("passt").

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-17 16:22:26 +02:00

90 lines
3.7 KiB
Swift

import SwiftUI
struct ReviewApplyView: View {
@ObservedObject var viewModel: SetupViewModel
let credentials: RouterOSCredentials?
@State private var showCliDetails = false
@AppStorage("appLanguage") private var appLanguage: String = "de"
var body: some View {
Form {
Section(L10n.t("Geplante Änderungen", appLanguage)) {
ForEach(Array(viewModel.plannedCommands.enumerated()), id: \.element.id) { index, command in
VStack(alignment: .leading, spacing: 2) {
Text(command.summary)
if showCliDetails {
Text(command.cliLine)
.appFont(.caption, design: .monospaced)
.foregroundStyle(.secondary)
}
}
.listRowBackground(TableZebra.color(for: index))
}
Toggle(L10n.t("Details anzeigen (RouterOS-Befehle)", appLanguage), isOn: $showCliDetails)
}
Section {
Text(L10n.t("Vor dem Anwenden wird automatisch eine Sicherung der aktuellen Konfiguration erstellt (Tab \"Sicherungen\"). Ein garantiertes automatisches Zurückrollen bei Verbindungsabbruch gibt es nicht — bei Problemen die Sicherung im Tab \"Sicherungen\" verwenden oder den Router lokal (Ethernet/Konsole) wiederherstellen.", appLanguage))
.appFont(.caption)
.foregroundStyle(.secondary)
}
if !viewModel.applyLog.isEmpty {
Section(L10n.t("Ablauf", appLanguage)) {
ForEach(Array(viewModel.applyLog.enumerated()), id: \.offset) { index, line in
Text(line).appFont(.caption)
.listRowBackground(TableZebra.color(for: index))
}
}
}
if viewModel.didApplySuccessfully {
Section {
Label(L10n.t("Änderungen erfolgreich angewendet", appLanguage), systemImage: "checkmark.circle.fill")
.foregroundStyle(.green)
}
}
Section {
HStack {
Button(L10n.t("Zurück", appLanguage)) { viewModel.goBack() }
.disabled(viewModel.isApplying)
Spacer()
if viewModel.didApplySuccessfully {
Button(L10n.t("Fertig", appLanguage)) { viewModel.finish() }
.keyboardShortcut(.defaultAction)
} else {
Button {
if let credentials {
viewModel.apply(credentials: credentials)
}
} label: {
if viewModel.isApplying {
ProgressView()
} else {
Text(L10n.t("Jetzt anwenden", appLanguage))
}
}
.disabled(credentials == nil || viewModel.isApplying)
}
}
}
}
.formStyle(.grouped)
.scrollContentBackground(.hidden)
.navigationTitle(LocalizedStringKey(L10n.t("Übersicht & Anwenden", appLanguage)))
.alert(
L10n.t("Anwenden fehlgeschlagen", appLanguage),
isPresented: Binding(
get: { viewModel.applyError != nil },
set: { _ in }
)
) {
Button(L10n.t("OK", appLanguage)) {}
} message: {
Text(viewModel.applyError ?? "")
}
}
}