.help(...)-Tooltips auf jedem Eingabefeld/Picker/Toggle in Connect- sowie allen Einrichten-Schritten (WAN/LAN/VLAN/WLAN/Firewall) -- kurze Erklärung was der Wert bedeutet und welche Auswirkung er hat, passend zum Laien-Anspruch der App. Sicherungen-Tab: Speicherort jetzt änderbar (Ordner wählen über nativen macOS-Dialog, Zurücksetzen auf Standard). BackupService hält den gewählten Pfad in UserDefaults (BackupService.customDirectoryURL), fällt ohne Auswahl weiter auf ~/Library/Application Support/... zurück. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HReLXMbmPvtQ23p1iWiJNW
68 lines
3.3 KiB
Swift
68 lines
3.3 KiB
Swift
import SwiftUI
|
|
|
|
struct VlanStepView: View {
|
|
@ObservedObject var viewModel: SetupViewModel
|
|
let availableInterfaces: [NetworkInterface]
|
|
|
|
var body: some View {
|
|
Form {
|
|
Section {
|
|
Toggle(
|
|
"Zusätzliches Netzwerk einrichten (VLAN, optional)",
|
|
isOn: Binding(
|
|
get: { viewModel.vlanSectionEnabled },
|
|
set: { viewModel.setVlanSectionEnabled($0) }
|
|
)
|
|
)
|
|
.help("Erstellt ein komplett getrenntes Netzwerk — Geräte darin können nicht auf dein Hauptnetzwerk zugreifen und umgekehrt.")
|
|
Text("Ein VLAN ist ein zusätzliches, komplett getrenntes Netzwerk mit eigenem Adressbereich — z.B. für Gäste oder smarte Geräte. Wenn du unsicher bist, ob du das brauchst, überspring diesen Schritt einfach.")
|
|
.font(.caption)
|
|
.foregroundStyle(.secondary)
|
|
}
|
|
|
|
if viewModel.vlanSectionEnabled {
|
|
ForEach($viewModel.vlans) { $vlan in
|
|
Section("Netzwerk \"\(vlan.name)\"") {
|
|
TextField("Name", text: $vlan.name)
|
|
.help("Ein Name zur Wiedererkennung, z.B. \"Gäste\" oder \"Smart Home\".")
|
|
Stepper("VLAN-ID: \(vlan.vlanID)", value: $vlan.vlanID, in: 2...4094)
|
|
.help("Eine eindeutige Nummer zur technischen Unterscheidung dieses Netzwerks. Muss nur innerhalb deines Routers einmalig sein.")
|
|
Picker("Basis-Anschluss", selection: $vlan.parentInterface) {
|
|
ForEach(availableInterfaces) { interface in
|
|
Text(interface.name).tag(interface.name)
|
|
}
|
|
}
|
|
.help("Der physische Anschluss, auf dem dieses zusätzliche Netzwerk aufbaut.")
|
|
TextField("Router-Adresse (z.B. 192.168.20.1/24)", text: $vlan.routerAddress)
|
|
.help("Die Adresse des Routers innerhalb dieses zusätzlichen Netzwerks.")
|
|
TextField("Netzwerk (z.B. 192.168.20.0/24)", text: $vlan.networkAddress)
|
|
.help("Der komplette Adressbereich dieses zusätzlichen Netzwerks.")
|
|
TextField("Automatische Adressvergabe von", text: $vlan.poolRangeStart)
|
|
.help("Ab welcher Adresse Geräte in diesem Netzwerk automatisch eine Adresse bekommen.")
|
|
TextField("bis", text: $vlan.poolRangeEnd)
|
|
.help("Bis zu welcher Adresse Geräte in diesem Netzwerk automatisch eine Adresse bekommen.")
|
|
|
|
Button("Netzwerk entfernen", role: .destructive) {
|
|
viewModel.removeVlan(vlan.id)
|
|
}
|
|
}
|
|
}
|
|
|
|
Button("Weiteres Netzwerk hinzufügen") {
|
|
viewModel.addVlan()
|
|
}
|
|
}
|
|
|
|
Section {
|
|
HStack {
|
|
Button("Zurück") { viewModel.goBack() }
|
|
Spacer()
|
|
Button("Weiter") { viewModel.goNext() }
|
|
}
|
|
}
|
|
}
|
|
.formStyle(.grouped)
|
|
.navigationTitle("Zusätzliche Netzwerke (VLAN)")
|
|
}
|
|
}
|