diff --git a/AppImage/components/virtual-machines.tsx b/AppImage/components/virtual-machines.tsx index c2e7e20..83c420d 100644 --- a/AppImage/components/virtual-machines.tsx +++ b/AppImage/components/virtual-machines.tsx @@ -18,12 +18,9 @@ import { RotateCcw, StopCircle, Container, - X, - Info, - ArrowLeft, } from "lucide-react" import useSWR from "swr" -import { MetricsView } from "./metrics-dialog" +import { MetricsDialog } from "./metrics-dialog" // Import MetricsDialog interface VMData { vmid: number @@ -190,7 +187,6 @@ export function VirtualMachines() { const [vmConfigs, setVmConfigs] = useState>({}) const [currentView, setCurrentView] = useState<"main" | "metrics">("main") const [selectedMetric, setSelectedMetric] = useState<"cpu" | "memory" | "disk" | "network" | null>(null) - const [showDetailsModal, setShowDetailsModal] = useState(false) useEffect(() => { const fetchLXCIPs = async () => { @@ -724,93 +720,78 @@ export function VirtualMachines() { setSelectedMetric(null) }} > - + {currentView === "main" ? ( <> - -
- - {/* Desktop layout */} -
-
- - {selectedVM?.name} - ID: {selectedVM?.vmid} -
- {selectedVM && ( - <> - - {getTypeBadge(selectedVM.type).icon} - {getTypeBadge(selectedVM.type).label} - - - {selectedVM.status.toUpperCase()} - - {selectedVM.status === "running" && ( - - Uptime: {formatUptime(selectedVM.uptime)} - - )} - - )} + + + {/* Desktop layout */} +
+
+ + {selectedVM?.name} + ID: {selectedVM?.vmid}
+ {selectedVM && ( + <> + + {getTypeBadge(selectedVM.type).icon} + {getTypeBadge(selectedVM.type).label} + + + {selectedVM.status.toUpperCase()} + + {selectedVM.status === "running" && ( + + Uptime: {formatUptime(selectedVM.uptime)} + + )} + + )} +
- {/* Mobile layout */} -
-
- - {selectedVM?.name} - ID: {selectedVM?.vmid} -
- {selectedVM && ( -
- - {getTypeBadge(selectedVM.type).icon} - {getTypeBadge(selectedVM.type).label} - - - {selectedVM.status.toUpperCase()} - - {selectedVM.status === "running" && ( - - Uptime: {formatUptime(selectedVM.uptime)} - - )} -
- )} + {/* Mobile layout */} +
+
+ + {selectedVM?.name} + ID: {selectedVM?.vmid}
- - -
+ {selectedVM && ( +
+ + {getTypeBadge(selectedVM.type).icon} + {getTypeBadge(selectedVM.type).label} + + + {selectedVM.status.toUpperCase()} + + {selectedVM.status === "running" && ( + + Uptime: {formatUptime(selectedVM.uptime)} + + )} +
+ )} +
+
{selectedVM && ( <> -
- {/* CPU & Memory Card */} - - - - CPU & Memory - - - -
handleMetricClick("cpu")}> -
CPU Usage
+
+

+ Basic Information +

+
+
+
CPU Usage
+
handleMetricClick("cpu")} + >
{(selectedVM.cpu * 100).toFixed(1)}%
@@ -819,8 +800,13 @@ export function VirtualMachines() { className={`h-1.5 ${getModalProgressColor(selectedVM.cpu * 100)}`} />
-
handleMetricClick("memory")}> -
Memory
+
+
+
Memory
+
handleMetricClick("memory")} + >
@@ -832,19 +818,13 @@ export function VirtualMachines() { className={`h-1.5 ${getModalProgressColor((selectedVM.mem / selectedVM.maxmem) * 100)}`} />
- - - - {/* Disk Usage Card */} - - - - Disk Usage - - - -
handleMetricClick("disk")}> -
Storage
+
+
+
Disk
+
handleMetricClick("disk")} + >
@@ -856,128 +836,199 @@ export function VirtualMachines() { className={`h-1.5 ${getModalProgressColor((selectedVM.disk / selectedVM.maxdisk) * 100)}`} />
- - - - {/* Disk I/O Card */} - - - - Disk I/O - - - -
handleMetricClick("disk")}> -
-
- Read - - {((selectedVM.diskread || 0) / 1024 ** 2).toFixed(2)} MB - -
-
- Write - - {((selectedVM.diskwrite || 0) / 1024 ** 2).toFixed(2)} MB - -
+
+
+
Disk I/O
+
handleMetricClick("disk")} + > +
+ + {((selectedVM.diskread || 0) / 1024 ** 2).toFixed(2)} MB +
+
+ + {((selectedVM.diskwrite || 0) / 1024 ** 2).toFixed(2)} MB
- - - - {/* Network I/O Card */} - - - - Network I/O - - - -
handleMetricClick("network")}> -
-
- Download - - {((selectedVM.netin || 0) / 1024 ** 2).toFixed(2)} MB - -
-
- Upload - - {((selectedVM.netout || 0) / 1024 ** 2).toFixed(2)} MB - -
+
+
+
Network I/O
+
handleMetricClick("network")} + > +
+ + {((selectedVM.netin || 0) / 1024 ** 2).toFixed(2)} MB +
+
+ + {((selectedVM.netout || 0) / 1024 ** 2).toFixed(2)} MB
- - +
+
+
- - - - Resources - - - - - {vmDetails?.config.cores && ( -
- CPU Cores - {vmDetails.config.cores} -
- )} - {vmDetails?.config.sockets && ( -
- CPU Sockets - {vmDetails.config.sockets} -
- )} - {vmDetails?.config.memory && ( -
- Memory - - {vmDetails.config.memory} MB - -
- )} - {vmDetails?.config.swap && ( -
- Swap - {vmDetails.config.swap} MB -
- )} - {selectedVM.type === "lxc" && vmDetails?.config && ( -
- IP Address - - {extractIPFromConfig(vmDetails.config)} - -
- )} -
-
+ {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}
+
+ )} +
)}
-
+

Control Actions

@@ -1017,201 +1068,18 @@ export function VirtualMachines() {
- ) : ( - selectedVM && - selectedMetric && ( - - ) - )} - - - - - - -
- - - {selectedVM?.type === "lxc" ? "Container" : "Virtual Machine"} Configuration - - -
-
- -
-
- {/* Hardware/Resources Section */} -
-

- {selectedVM?.type === "lxc" ? "Resources" : "Hardware"} -

-
- {vmDetails?.config.cores && ( -
-
CPU Cores
-
{vmDetails.config.cores}
-
- )} - {vmDetails?.config.sockets && ( -
-
CPU Sockets
-
{vmDetails.config.sockets}
-
- )} - {vmDetails?.config.memory && ( -
-
Memory
-
{vmDetails.config.memory} MB
-
- )} - {vmDetails?.config.swap && ( -
-
Swap
-
{vmDetails.config.swap} MB
-
- )} - {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 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}
-
- )} -
-
- - {/* 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}
-
- )} -
-
-
-
+ ) : currentView === "metrics" && selectedMetric ? ( + { + setCurrentView("main") + setSelectedMetric(null) + }} + /> + ) : null}