From 2fef77cd015da346900c1aef08ec47620f73ac70 Mon Sep 17 00:00:00 2001 From: rcourtman Date: Sun, 28 Sep 2025 18:52:14 +0000 Subject: [PATCH] fix: resolve guest URL action visibility --- .../src/components/Settings/GuestURLs.tsx | 77 +++++++++++-------- 1 file changed, 44 insertions(+), 33 deletions(-) diff --git a/frontend-modern/src/components/Settings/GuestURLs.tsx b/frontend-modern/src/components/Settings/GuestURLs.tsx index 9acc2abd2..a3c4943bb 100644 --- a/frontend-modern/src/components/Settings/GuestURLs.tsx +++ b/frontend-modern/src/components/Settings/GuestURLs.tsx @@ -142,45 +142,55 @@ export function GuestURLs(props: GuestURLsProps) { } }; + // Resolve the metadata key for a guest, supporting legacy identifiers + const resolveMetadataKey = (guestId: string, fallbackId: string) => { + const metadata = guestMetadata(); + if (metadata[guestId]) return guestId; + if (metadata[fallbackId]) return fallbackId; + return guestId; + }; + // Update a guest's URL configuration const updateGuestURL = (guestId: string, url: string) => { - setGuestMetadata({ - ...guestMetadata(), + setGuestMetadata(prev => ({ + ...prev, [guestId]: { - id: guestId, + ...(prev[guestId] || { id: guestId }), customUrl: url } - }); - - // Validate and update errors + })); + const error = validateURL(url); - const errors = { ...urlErrors() }; - if (error) { - errors[guestId] = error; - } else { - delete errors[guestId]; - } - setUrlErrors(errors); - + setUrlErrors(prev => { + const next = { ...prev }; + if (error) { + next[guestId] = error; + } else { + delete next[guestId]; + } + return next; + }); + props.setHasUnsavedChanges(true); }; // Clear a guest's URL configuration const clearGuestURL = (guestId: string) => { - const updated = { ...guestMetadata() }; - if (updated[guestId]) { - updated[guestId] = { ...updated[guestId], customUrl: '' }; - } else { - updated[guestId] = { id: guestId, customUrl: '' }; - } - setGuestMetadata(updated); - props.setHasUnsavedChanges(true); - }; + setGuestMetadata(prev => ({ + ...prev, + [guestId]: { + ...(prev[guestId] || { id: guestId }), + customUrl: '' + } + })); - // Get the URL for a guest - const getURL = (guestId: string): string | undefined => { - const meta = guestMetadata()[guestId]; - return meta?.customUrl || undefined; + setUrlErrors(prev => { + const next = { ...prev }; + delete next[guestId]; + return next; + }); + + props.setHasUnsavedChanges(true); }; return ( @@ -267,10 +277,11 @@ export function GuestURLs(props: GuestURLsProps) { {(guest) => { const guestId = guest.id || `${guest.instance}-${guest.node}-${guest.vmid}`; - const meta = guestMetadata()[guestId]; - const url = getURL(guestId); - - const urlError = urlErrors()[guestId]; + const fallbackId = `${guest.node}-${guest.vmid}`; + const metadataKey = resolveMetadataKey(guestId, fallbackId); + const meta = guestMetadata()[metadataKey]; + const url = meta?.customUrl; + const urlError = urlErrors()[metadataKey]; return ( @@ -297,7 +308,7 @@ export function GuestURLs(props: GuestURLsProps) { type="text" placeholder="https://192.168.1.100:8006" value={meta?.customUrl || ''} - onInput={(e) => updateGuestURL(guestId, e.currentTarget.value)} + onInput={(e) => updateGuestURL(metadataKey, e.currentTarget.value)} class={`w-full min-w-[300px] px-2 py-1 text-sm border rounded bg-white dark:bg-gray-700 text-gray-900 dark:text-gray-100 focus:ring-2 focus:border-transparent ${ @@ -332,7 +343,7 @@ export function GuestURLs(props: GuestURLsProps) {