diff --git a/loop/plan.md b/loop/plan.md index 3b78eca4..a2d11f44 100644 --- a/loop/plan.md +++ b/loop/plan.md @@ -316,7 +316,7 @@ - [x] **UXP-03** — Polish error handling across entire frontend. Run `/polish-errors` on every view and store. Ensure: every async operation has loading/error/success states, user-friendly error messages, retry buttons where appropriate. **Acceptance**: No unhandled promise rejections; all errors shown to user. -- [ ] **UXP-04** — Polish all forms. Run `/polish-forms` on: login, onboarding, WiFi config, backup passphrase, channel opening. Ensure: validation feedback, disabled submit during processing, success confirmation. **Acceptance**: All forms have complete validation and feedback. +- [x] **UXP-04** — Polish all forms. Run `/polish-forms` on: login, onboarding, WiFi config, backup passphrase, channel opening. Ensure: validation feedback, disabled submit during processing, success confirmation. **Acceptance**: All forms have complete validation and feedback. #### Sprint 26: Community Infrastructure (Week 5-8) diff --git a/neode-ui/src/views/Credentials.vue b/neode-ui/src/views/Credentials.vue index b7333c28..ee675d4b 100644 --- a/neode-ui/src/views/Credentials.vue +++ b/neode-ui/src/views/Credentials.vue @@ -99,7 +99,7 @@
-
diff --git a/neode-ui/src/views/Server.vue b/neode-ui/src/views/Server.vue index 5a1e9fc0..ffb8876e 100644 --- a/neode-ui/src/views/Server.vue +++ b/neode-ui/src/views/Server.vue @@ -385,8 +385,8 @@ />

{{ wifiError }}

- - + +
@@ -583,6 +583,7 @@ const showWifiModal = ref(false) const wifiScanning = ref(false) const wifiNetworks = ref([]) const wifiConnecting = ref(false) +const wifiSubmitting = ref(false) const wifiSelectedSsid = ref('') const wifiPassword = ref('') const wifiError = ref('') @@ -676,15 +677,20 @@ function selectWifi(ssid: string) { async function connectToWifi() { if (!wifiPassword.value || !wifiSelectedSsid.value) return wifiError.value = '' + wifiSubmitting.value = true try { await rpcClient.call({ method: 'network.configure-wifi', params: { ssid: wifiSelectedSsid.value, password: wifiPassword.value } }) showWifiModal.value = false wifiConnecting.value = false wifiPassword.value = '' + logsToast.value = 'WiFi connected successfully' + setTimeout(() => { logsToast.value = '' }, 4000) loadInterfaces() } catch (e) { wifiError.value = e instanceof Error ? e.message : 'WiFi connection failed. Check password and try again.' if (import.meta.env.DEV) console.warn('WiFi connection failed', e) + } finally { + wifiSubmitting.value = false } }