import { Grid } from "@mui/material"; import React from "react"; import { validate as validateUUID } from "uuid"; import { IsoFile, IsoFilesApi } from "../../api/IsoFilesApi"; import { ServerApi } from "../../api/ServerApi"; import { VMApi, VMInfo } from "../../api/VMApi"; import { AsyncWidget } from "../AsyncWidget"; import { CheckboxInput } from "../forms/CheckboxInput"; import { EditSection } from "../forms/EditSection"; import { SelectInput } from "../forms/SelectInput"; import { TextInput } from "../forms/TextInput"; import { VMDisksList } from "../forms/VMDisksList"; import { VMSelectIsoInput } from "../forms/VMSelectIsoInput"; import { VMScreenshot } from "./VMScreenshot"; import { ResAutostartInput } from "../forms/ResAutostartInput"; import { VMNetworksList } from "../forms/VMNetworksList"; import { NetworkApi, NetworkInfo } from "../../api/NetworksApi"; interface DetailsProps { vm: VMInfo; editable: boolean; onChange?: () => void; screenshot?: boolean; } export function VMDetails(p: DetailsProps): React.ReactElement { const [isoList, setIsoList] = React.useState(); const [vcpuCombinations, setVCPUCombinations] = React.useState< number[] | any >(); const [networksList, setNetworksList] = React.useState(); const load = async () => { setIsoList(await IsoFilesApi.GetList()); setVCPUCombinations(await ServerApi.NumberVCPUs()); setNetworksList(await NetworkApi.GetList()); }; return ( ( )} /> ); } function VMDetailsInner( p: DetailsProps & { isoList: IsoFile[]; vcpuCombinations: number[]; networksList: NetworkInfo[]; } ): React.ReactElement { return ( { /* Screenshot section */ p.screenshot && ( ) } {/* Metadata section */} { p.vm.name = v ?? ""; p.onChange?.(); }} checkValue={(v) => /^[a-zA-Z0-9]+$/.test(v)} size={ServerApi.Config.constraints.vm_name_size} /> { p.vm.genid = v; p.onChange?.(); }} checkValue={(v) => validateUUID(v)} /> { p.vm.title = v; p.onChange?.(); }} size={ServerApi.Config.constraints.vm_title_size} /> { p.vm.description = v; p.onChange?.(); }} multiline={true} /> {/* General section */} { p.vm.architecture = v! as any; p.onChange?.(); }} value={p.vm.architecture} options={[ { label: "i686", value: "i686" }, { label: "x86_64", value: "x86_64" }, ]} /> { p.vm.boot_type = v! as any; p.onChange?.(); }} value={p.vm.boot_type} options={[ { label: "UEFI with Secure Boot", value: "UEFISecureBoot" }, { label: "UEFI", value: "UEFI" }, ]} /> { p.vm.memory = Number(v ?? "0"); p.onChange?.(); }} checkValue={(v) => Number(v) > ServerApi.Config.constraints.memory_size.min && Number(v) < ServerApi.Config.constraints.memory_size.max } /> { return { label: v.toString(), value: v.toString() }; })} value={p.vm.number_vcpu.toString()} onValueChange={(v) => { p.vm.number_vcpu = Number(v ?? "0"); p.onChange?.(); }} /> { p.vm.vnc_access = v; p.onChange?.(); }} /> {p.vm.uuid && ( VMApi.IsAutostart(p.vm)} setAutotostart={(e) => VMApi.SetAutostart(p.vm, e)} /> )} {/* Storage section */} { p.vm.iso_files = v; p.onChange?.(); }} /> {/* Networks section */} ); }