RouterOSCommand unterstützt jetzt neben .add auch .set (bestehenden Eintrag ändern statt neuen anzulegen) — nötig, weil WLAN-Interfaces schon vor jeder Konfiguration existieren. SSH löst das per CLI-eigenem "set [find field=value] ..." inline auf; REST hat dafür keine Entsprechung und muss den Eintrag erst per GET suchen (matchField/ matchValue), seine .id auslesen, dann PATCH auf restPath/<id> senden (RestTransport.findItemID). Mit dem Nutzer abgestimmte Entscheidung gegen die einfachere "WLAN nur über SSH"-Variante. WifiNetworkConfig: pro erkanntem Legacy-Wireless-Interface (/interface wireless, type=wlan) eine SSID/Passwort-Konfiguration, Sicherheitsprofil (WPA2) wird zuerst angelegt, dann per set mit dem Interface verknüpft. Geräte ohne WLAN zeigen einen Hinweistext statt des Formulars (User-Anforderung: muss berücksichtigt werden). Geräte mit dem neueren "wifi"-Treiber (type=wifi, wifiwave2/802.11ax) werden erkannt, aber bewusst nicht unterstützt -- anderes Menü, eigener Umbau nötig, dazu Hinweistext. cliPath wurde in allen bisherigen Command-Buildern (Wan/Lan/Vlan) zu menuPath + .add migriert, da RouterOSCommand jetzt operation-basiert ist statt den Aktionswort im Pfad-String zu verstecken. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HReLXMbmPvtQ23p1iWiJNW
55 lines
2.0 KiB
Swift
55 lines
2.0 KiB
Swift
import SwiftUI
|
|
|
|
struct WifiStepView: View {
|
|
@ObservedObject var viewModel: SetupViewModel
|
|
|
|
var body: some View {
|
|
Form {
|
|
if viewModel.wifiNetworks.isEmpty && viewModel.unsupportedWifiInterfaces.isEmpty {
|
|
Section {
|
|
Text("An diesem Gerät wurde kein WLAN erkannt. Dieser Schritt wird übersprungen.")
|
|
.foregroundStyle(.secondary)
|
|
}
|
|
}
|
|
|
|
if !viewModel.unsupportedWifiInterfaces.isEmpty {
|
|
Section {
|
|
Text(
|
|
"Dein Gerät nutzt den neueren RouterOS-WiFi-Treiber (\(viewModel.unsupportedWifiInterfaces.map(\.name).joined(separator: ", "))), "
|
|
+ "den diese App noch nicht unterstützt. WLAN muss dafür vorerst manuell über Winbox eingerichtet werden."
|
|
)
|
|
.font(.caption)
|
|
.foregroundStyle(.secondary)
|
|
}
|
|
}
|
|
|
|
ForEach($viewModel.wifiNetworks) { $network in
|
|
Section("WLAN auf \(network.interfaceName)") {
|
|
Toggle("Aktivieren", isOn: $network.enabled)
|
|
if network.enabled {
|
|
TextField("Netzwerkname (SSID)", text: $network.ssid)
|
|
SecureField("Passwort (mind. 8 Zeichen)", text: $network.password)
|
|
}
|
|
}
|
|
}
|
|
|
|
Section {
|
|
HStack {
|
|
Button("Zurück") { viewModel.goBack() }
|
|
Spacer()
|
|
Button("Weiter") { viewModel.goNext() }
|
|
.disabled(!isStepValid)
|
|
}
|
|
}
|
|
}
|
|
.formStyle(.grouped)
|
|
.navigationTitle("WLAN (falls vorhanden)")
|
|
}
|
|
|
|
private var isStepValid: Bool {
|
|
viewModel.wifiNetworks.allSatisfy { network in
|
|
!network.enabled || (!network.ssid.isEmpty && network.password.count >= 8)
|
|
}
|
|
}
|
|
}
|