From 68f19ffa5f2cbf841856001c52c6255bb0227b85 Mon Sep 17 00:00:00 2001 From: MacRimi Date: Wed, 22 Oct 2025 12:37:52 +0200 Subject: [PATCH] Update virtual-machines.tsx --- AppImage/components/virtual-machines.tsx | 710 +++++++++++++++++------ 1 file changed, 517 insertions(+), 193 deletions(-) diff --git a/AppImage/components/virtual-machines.tsx b/AppImage/components/virtual-machines.tsx index 64c51fe..acbb80f 100644 --- a/AppImage/components/virtual-machines.tsx +++ b/AppImage/components/virtual-machines.tsx @@ -65,6 +65,46 @@ interface VMConfig { scsi0?: string ide0?: string boot?: string + description?: string // Added for notes + // Hardware specific + numa?: boolean + bios?: string + machine?: string + vga?: string + agent?: boolean + tablet?: boolean + localtime?: boolean + // Storage specific + scsihw?: string + efidisk0?: string + tpmstate0?: string + // Mount points for LXC + mp0?: string + mp1?: string + mp2?: string + mp3?: string + mp4?: string + mp5?: string + // PCI Passthrough + hostpci0?: string + hostpci1?: string + hostpci2?: string + hostpci3?: string + hostpci4?: string + hostpci5?: string + // USB Devices + usb0?: string + usb1?: string + usb2?: string + // Serial Devices + serial0?: string + serial1?: string + // Advanced + vmgenid?: string + smbios1?: string + meta?: string + // CPU + cpu?: string [key: string]: any } @@ -218,6 +258,7 @@ export function VirtualMachines() { const [vmConfigs, setVmConfigs] = useState>({}) const [currentView, setCurrentView] = useState<"main" | "metrics">("main") const [showAdditionalInfo, setShowAdditionalInfo] = useState(false) + const [showNotes, setShowNotes] = useState(false) const [selectedMetric, setSelectedMetric] = useState(null) // undeclared variable fix useEffect(() => { @@ -552,7 +593,7 @@ export function VirtualMachines() { return (
handleVMClick(vm)} >
@@ -745,6 +786,7 @@ export function VirtualMachines() { setCurrentView("main") setSelectedMetric(null) setShowAdditionalInfo(false) + setShowNotes(false) }} > @@ -809,7 +851,7 @@ export function VirtualMachines() { <>
@@ -898,201 +940,483 @@ export function VirtualMachines() { {detailsLoading ? (
Loading configuration...
) : vmDetails?.config ? ( - - -
-

- Resources -

- -
- -
- {vmDetails.config.cores && ( -
-
CPU Cores
-
{vmDetails.config.cores}
-
- )} - {vmDetails.config.memory && ( -
-
Memory
-
{vmDetails.config.memory} MB
-
- )} - {vmDetails.config.swap && ( -
-
Swap
-
{vmDetails.config.swap} MB
-
- )} - {selectedVM.type === "lxc" && ( -
-
IP Address
-
+ + +
+

+ Resources +

+
+ {vmDetails.config.description && ( + + )} +
-
- )} -
- - {showAdditionalInfo && ( -
- {vmDetails.config.rootfs && ( -
-
Root Filesystem
-
- {vmDetails.config.rootfs} -
-
- )} - - {Object.keys(vmDetails.config) - .filter((key) => key.match(/^(scsi|sata|ide|virtio)\d+$/)) - .map((diskKey) => ( -
-
- {diskKey.toUpperCase().replace(/(\d+)/, " $1")} -
-
- {vmDetails.config[diskKey]} -
-
- ))} - -
-

- Network -

-
- {Object.keys(vmDetails.config) - .filter((key) => key.match(/^net\d+$/)) - .map((netKey) => ( -
-
- Network Interface {netKey.replace("net", "")} -
-
- {vmDetails.config[netKey]} -
-
- ))} - {vmDetails.config.nameserver && ( -
-
DNS Nameserver
-
- {vmDetails.config.nameserver} -
-
+ {showAdditionalInfo ? ( + <> + + Less Info + + ) : ( + <> + + Info + )} - {vmDetails.config.searchdomain && ( -
-
Search Domain
-
- {vmDetails.config.searchdomain} -
-
- )} - {vmDetails.config.hostname && ( -
-
Hostname
-
{vmDetails.config.hostname}
-
- )} -
-
- -
-

- Options -

-
- {vmDetails.config.onboot !== undefined && ( -
-
Start on Boot
- - {vmDetails.config.onboot ? "Yes" : "No"} - -
- )} - {vmDetails.config.unprivileged !== undefined && ( -
-
Unprivileged
- - {vmDetails.config.unprivileged ? "Yes" : "No"} - -
- )} - {vmDetails.config.ostype && ( -
-
OS Type
-
{vmDetails.config.ostype}
-
- )} - {vmDetails.config.arch && ( -
-
Architecture
-
{vmDetails.config.arch}
-
- )} - {vmDetails.config.boot && ( -
-
Boot Order
-
{vmDetails.config.boot}
-
- )} - {vmDetails.config.sockets && ( -
-
CPU Sockets
-
{vmDetails.config.sockets}
-
- )} - {vmDetails.config.features && ( -
-
Features
-
- {vmDetails.config.features} -
-
- )} -
+
- )} - - + +
+ {vmDetails.config.cores && ( +
+
CPU Cores
+
{vmDetails.config.cores}
+
+ )} + {vmDetails.config.memory && ( +
+
Memory
+
{vmDetails.config.memory} MB
+
+ )} + {vmDetails.config.swap && ( +
+
Swap
+
{vmDetails.config.swap} MB
+
+ )} + {selectedVM.type === "lxc" && ( +
+
IP Address
+
+ {extractIPFromConfig(vmDetails.config)} +
+
+ )} +
+ + {showNotes && vmDetails.config.description && ( +
+

+ Notes +

+
+
+                                      {decodeURIComponent(vmDetails.config.description.replace(/%0A/g, "\n"))}
+                                    
+
+
+ )} + + {showAdditionalInfo && ( +
+ {/* Hardware Section */} +
+

+ Hardware +

+
+ {vmDetails.config.sockets && ( +
+
CPU Sockets
+
{vmDetails.config.sockets}
+
+ )} + {vmDetails.config.cpu && ( +
+
CPU Type
+
+ {vmDetails.config.cpu} +
+
+ )} + {vmDetails.config.numa !== undefined && ( +
+
NUMA
+ + {vmDetails.config.numa ? "Enabled" : "Disabled"} + +
+ )} + {vmDetails.config.bios && ( +
+
BIOS
+
{vmDetails.config.bios}
+
+ )} + {vmDetails.config.machine && ( +
+
Machine Type
+
{vmDetails.config.machine}
+
+ )} + {vmDetails.config.vga && ( +
+
VGA
+
{vmDetails.config.vga}
+
+ )} + {vmDetails.config.agent !== undefined && ( +
+
QEMU Agent
+ + {vmDetails.config.agent ? "Enabled" : "Disabled"} + +
+ )} + {vmDetails.config.tablet !== undefined && ( +
+
Tablet Pointer
+ + {vmDetails.config.tablet ? "Enabled" : "Disabled"} + +
+ )} + {vmDetails.config.localtime !== undefined && ( +
+
Local Time
+ + {vmDetails.config.localtime ? "Enabled" : "Disabled"} + +
+ )} +
+
+ + {/* Storage Section */} +
+

+ Storage +

+
+ {vmDetails.config.rootfs && ( +
+
Root Filesystem
+
+ {vmDetails.config.rootfs} +
+
+ )} + {vmDetails.config.scsihw && ( +
+
SCSI Controller
+
{vmDetails.config.scsihw}
+
+ )} + {Object.keys(vmDetails.config) + .filter((key) => key.match(/^(scsi|sata|ide|virtio)\d+$/)) + .map((diskKey) => ( +
+
+ {diskKey.toUpperCase().replace(/(\d+)/, " $1")} +
+
+ {vmDetails.config[diskKey]} +
+
+ ))} + {vmDetails.config.efidisk0 && ( +
+
EFI Disk
+
+ {vmDetails.config.efidisk0} +
+
+ )} + {vmDetails.config.tpmstate0 && ( +
+
TPM State
+
+ {vmDetails.config.tpmstate0} +
+
+ )} + {/* Mount points for LXC */} + {Object.keys(vmDetails.config) + .filter((key) => key.match(/^mp\d+$/)) + .map((mpKey) => ( +
+
+ Mount Point {mpKey.replace("mp", "")} +
+
+ {vmDetails.config[mpKey]} +
+
+ ))} +
+
+ + {/* Network Section */} +
+

+ Network +

+
+ {Object.keys(vmDetails.config) + .filter((key) => key.match(/^net\d+$/)) + .map((netKey) => ( +
+
+ Network Interface {netKey.replace("net", "")} +
+
+ {vmDetails.config[netKey]} +
+
+ ))} +
+ {vmDetails.config.nameserver && ( +
+
DNS Nameserver
+
+ {vmDetails.config.nameserver} +
+
+ )} + {vmDetails.config.searchdomain && ( +
+
Search Domain
+
+ {vmDetails.config.searchdomain} +
+
+ )} + {vmDetails.config.hostname && ( +
+
Hostname
+
+ {vmDetails.config.hostname} +
+
+ )} +
+
+
+ + {/* PCI Devices Section */} + {Object.keys(vmDetails.config).some((key) => key.match(/^hostpci\d+$/)) && ( +
+

+ PCI Passthrough +

+
+ {Object.keys(vmDetails.config) + .filter((key) => key.match(/^hostpci\d+$/)) + .map((pciKey) => ( +
+
+ {pciKey.toUpperCase().replace(/(\d+)/, " $1")} +
+
+ {vmDetails.config[pciKey]} +
+
+ ))} +
+
+ )} + + {/* USB Devices Section */} + {Object.keys(vmDetails.config).some((key) => key.match(/^usb\d+$/)) && ( +
+

+ USB Devices +

+
+ {Object.keys(vmDetails.config) + .filter((key) => key.match(/^usb\d+$/)) + .map((usbKey) => ( +
+
+ {usbKey.toUpperCase().replace(/(\d+)/, " $1")} +
+
+ {vmDetails.config[usbKey]} +
+
+ ))} +
+
+ )} + + {/* Serial Devices Section */} + {Object.keys(vmDetails.config).some((key) => key.match(/^serial\d+$/)) && ( +
+

+ Serial Ports +

+
+ {Object.keys(vmDetails.config) + .filter((key) => key.match(/^serial\d+$/)) + .map((serialKey) => ( +
+
+ {serialKey.toUpperCase().replace(/(\d+)/, " $1")} +
+
+ {vmDetails.config[serialKey]} +
+
+ ))} +
+
+ )} + + {/* Options Section */} +
+

+ Options +

+
+ {vmDetails.config.onboot !== undefined && ( +
+
Start on Boot
+ + {vmDetails.config.onboot ? "Yes" : "No"} + +
+ )} + {vmDetails.config.unprivileged !== undefined && ( +
+
Unprivileged
+ + {vmDetails.config.unprivileged ? "Yes" : "No"} + +
+ )} + {vmDetails.config.ostype && ( +
+
OS Type
+
{vmDetails.config.ostype}
+
+ )} + {vmDetails.config.arch && ( +
+
Architecture
+
{vmDetails.config.arch}
+
+ )} + {vmDetails.config.boot && ( +
+
Boot Order
+
{vmDetails.config.boot}
+
+ )} + {vmDetails.config.features && ( +
+
Features
+
+ {vmDetails.config.features} +
+
+ )} +
+
+ + {/* Advanced Section */} +
+

+ Advanced +

+
+ {vmDetails.config.vmgenid && ( +
+
VM Generation ID
+
+ {vmDetails.config.vmgenid} +
+
+ )} + {vmDetails.config.smbios1 && ( +
+
SMBIOS
+
+ {vmDetails.config.smbios1} +
+
+ )} + {vmDetails.config.meta && ( +
+
Metadata
+
+ {vmDetails.config.meta} +
+
+ )} +
+
+
+ )} + + + ) : null} )}