Turn XML routes into tabs

This commit is contained in:
2024-01-03 11:54:56 +01:00
parent f890cba5a4
commit ffac6991c4
8 changed files with 59 additions and 117 deletions

View File

@ -3,6 +3,8 @@ import { dracula } from "react-syntax-highlighter/dist/esm/styles/hljs";
import xmlFormat from "xml-formatter";
import { Light as SyntaxHighlighter } from "react-syntax-highlighter";
import { AsyncWidget } from "./AsyncWidget";
import React from "react";
SyntaxHighlighter.registerLanguage("xml", xml);
@ -19,3 +21,24 @@ export function XMLWidget(p: { src: string }): React.ReactElement {
</SyntaxHighlighter>
);
}
export function XMLAsyncWidget(p: {
identifier: string;
load: () => Promise<string>;
errMsg: string;
}): React.ReactElement {
const [src, setSrc] = React.useState<string | undefined>();
const load = async () => {
setSrc(await p.load());
};
return (
<AsyncWidget
errMsg={p.errMsg}
load={load}
loadKey={p.identifier}
build={() => <XMLWidget src={src!} />}
/>
);
}

View File

@ -14,6 +14,7 @@ import { ResAutostartInput } from "../forms/ResAutostartInput";
import { SelectInput } from "../forms/SelectInput";
import { TextInput } from "../forms/TextInput";
import { DHCPHostReservations } from "./DHCPHostReservations";
import { XMLAsyncWidget } from "../XMLWidget";
interface DetailsProps {
net: NetworkInfo;
@ -42,6 +43,7 @@ enum NetTab {
General = 0,
IPv4,
IPv6,
XML,
Danger,
}
@ -67,6 +69,11 @@ function NetworkDetailsInner(p: DetailsInnerProps): React.ReactElement {
value: NetTab.IPv6,
visible: p.editable || !!p.net.ip_v6,
},
{
label: "XML",
value: NetTab.XML,
visible: !p.editable,
},
{
label: "Danger zone",
value: NetTab.Danger,
@ -79,6 +86,7 @@ function NetworkDetailsInner(p: DetailsInnerProps): React.ReactElement {
{currTab === NetTab.General && <NetworkDetailsTabGeneral {...p} />}
{currTab === NetTab.IPv4 && <NetworkDetailsTabIPv4 {...p} />}
{currTab === NetTab.IPv6 && <NetworkDetailsTabIPv6 {...p} />}
{currTab === NetTab.XML && <NetworkDetailsTabXML {...p} />}
{currTab === NetTab.Danger && <NetworkDetailsTabDanger {...p} />}
</>
);
@ -380,6 +388,16 @@ function IPSection(p: {
);
}
function NetworkDetailsTabXML(p: DetailsInnerProps): React.ReactElement {
return (
<XMLAsyncWidget
errMsg="Failed to load network XML definition!"
identifier={p.net.uuid!}
load={() => NetworkApi.GetSingleXML(p.net.uuid!)}
/>
);
}
function NetworkDetailsTabDanger(p: DetailsInnerProps): React.ReactElement {
const confirm = useConfirm();
const snackbar = useSnackbar();

View File

@ -21,6 +21,7 @@ import { VMDisksList } from "../forms/VMDisksList";
import { VMNetworksList } from "../forms/VMNetworksList";
import { VMSelectIsoInput } from "../forms/VMSelectIsoInput";
import { VMScreenshot } from "./VMScreenshot";
import { XMLAsyncWidget } from "../XMLWidget";
interface DetailsProps {
vm: VMInfo;
@ -68,6 +69,7 @@ enum VMTab {
General = 0,
Storage,
Network,
XML,
Danger,
}
@ -90,6 +92,11 @@ function VMDetailsInner(p: DetailsInnerProps): React.ReactElement {
{ label: "General", value: VMTab.General, visible: true },
{ label: "Storage", value: VMTab.Storage, visible: true },
{ label: "Network", value: VMTab.Network, visible: true },
{
label: "XML",
value: VMTab.XML,
visible: !p.editable,
},
{
label: "Danger zone",
value: VMTab.Danger,
@ -102,6 +109,7 @@ function VMDetailsInner(p: DetailsInnerProps): React.ReactElement {
{currTab === VMTab.General && <VMDetailsTabGeneral {...p} />}
{currTab === VMTab.Storage && <VMDetailsTabStorage {...p} />}
{currTab === VMTab.Network && <VMDetailsTabNetwork {...p} />}
{currTab === VMTab.XML && <VMDetailsTabXML {...p} />}
{currTab === VMTab.Danger && <VMDetailsTabDanger {...p} />}
</>
);
@ -293,6 +301,16 @@ function VMDetailsTabNetwork(p: DetailsInnerProps): React.ReactElement {
return <VMNetworksList {...p} />;
}
function VMDetailsTabXML(p: DetailsInnerProps): React.ReactElement {
return (
<XMLAsyncWidget
errMsg="Failed to load VM XML source definition!"
identifier={p.vm.uuid!}
load={() => VMApi.GetSingleXML(p.vm.uuid!)}
/>
);
}
function VMDetailsTabDanger(p: DetailsInnerProps): React.ReactElement {
const confirm = useConfirm();
const alert = useAlert();