diff --git a/serving/fleet-manager/ui/src/pages/Lifecycle.svelte b/serving/fleet-manager/ui/src/pages/Lifecycle.svelte index 8675db4..359bd4f 100644 --- a/serving/fleet-manager/ui/src/pages/Lifecycle.svelte +++ b/serving/fleet-manager/ui/src/pages/Lifecycle.svelte @@ -11,8 +11,30 @@ let busy = $state(false) let confirmOpen = $state(false) let rebootMode = $state('none') // none | now | at + let customVersion = $state(false) let form = $state({ target_version: '', kiosk_url: '', reboot_at: '', drain: false }) + // Versions known across the fleet (running + already-targeted), newest first. + // A "custom…" escape covers a version not yet seen anywhere. (Future: source + // from the serving-side release inventory / deployment manifest.) + let versions = $derived.by(() => { + const s = new Set() + for (const h of hosts) { + if (h.version?.image_version) s.add(h.version.image_version) + if (h.desired?.target_version) s.add(h.desired.target_version) + } + return [...s].sort((a, b) => b.localeCompare(a, undefined, { numeric: true })) + }) + function onVersionSelect(e) { + const v = e.target.value + if (v === '__custom__') { + customVersion = true + form.target_version = '' + } else { + form.target_version = v + } + } + async function load() { try { const d = await api.get('/api/hosts') @@ -26,6 +48,7 @@ selected = h okMsg = '' rebootMode = 'none' + customVersion = false form = { target_version: h.desired?.target_version || '', kiosk_url: h.desired?.kiosk_url || '', @@ -90,7 +113,18 @@