feat: Waves 3+4 — frontend wiring, NATS integration, stores (19 files)
All checks were successful
Test Asgard Runner / test (push) Successful in 2s
All checks were successful
Test Asgard Runner / test (push) Successful in 2s
Frontend:
- Wire Dashboard quick actions (start/stop/trigger wipe) + next wipe schedule
- Wire Console WebSocket streaming for real-time output
- Implement TOTP 2FA challenge flow in LoginView
- Wire Plugin load/unload toggle + uninstall buttons with confirmations
- Wire WipesView profile selector, disable trigger when no profiles
- Build full WipeProfiles create/edit modal with all config fields
- Wire MapsView file upload with multipart FormData
- Fix SettingsView empty catch blocks → toast error messages
- Fix stale localStorage token reads in CSV exports → auth store
- Fix auth store hardcoded permissions → JWT-decoded role permissions
- Fix wipe store onMounted lifecycle bug → explicit subscribe action
- Update EarlyAccessView from countdown to "Now Live" state
Backend:
- Wire wipe trigger to publish NATS cmd (corrosion.{id}.cmd.wipe)
- Wire plugin reload/uninstall to publish NATS cmd
- Expand NatsBridgeService: add files, wipe status, server status subs
- Add PATCH schedules/:id/toggle endpoint for task toggling
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -1,10 +1,12 @@
|
||||
<script setup lang="ts">
|
||||
import { ref, onMounted } from 'vue'
|
||||
import { useAuthStore } from '@/stores/auth'
|
||||
import { useToastStore } from '@/stores/toast'
|
||||
import { useApi } from '@/composables/useApi'
|
||||
import { Settings, Key, Globe, User, Save, Loader2, Eye } from 'lucide-vue-next'
|
||||
|
||||
const auth = useAuthStore()
|
||||
const toast = useToastStore()
|
||||
const api = useApi()
|
||||
|
||||
const saving = ref(false)
|
||||
@@ -49,8 +51,9 @@ async function saveAccount() {
|
||||
saving.value = true
|
||||
try {
|
||||
await api.put('/auth/profile', accountForm.value)
|
||||
} catch {
|
||||
// Handle error
|
||||
toast.success('Account saved successfully')
|
||||
} catch (err) {
|
||||
toast.error('Failed to save: ' + (err as Error).message)
|
||||
} finally {
|
||||
saving.value = false
|
||||
}
|
||||
@@ -60,8 +63,9 @@ async function saveDomain() {
|
||||
saving.value = true
|
||||
try {
|
||||
await api.put('/settings/domain', domainForm.value)
|
||||
} catch {
|
||||
// Handle error
|
||||
toast.success('Domain settings saved successfully')
|
||||
} catch (err) {
|
||||
toast.error('Failed to save: ' + (err as Error).message)
|
||||
} finally {
|
||||
saving.value = false
|
||||
}
|
||||
@@ -71,8 +75,9 @@ async function savePublicSite() {
|
||||
saving.value = true
|
||||
try {
|
||||
await api.put('/settings/public-site', publicSiteForm.value)
|
||||
} catch {
|
||||
// Handle error
|
||||
toast.success('Public site settings saved successfully')
|
||||
} catch (err) {
|
||||
toast.error('Failed to save: ' + (err as Error).message)
|
||||
} finally {
|
||||
saving.value = false
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user