Turn XML routes into tabs
This commit is contained in:
		@@ -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!} />}
 | 
			
		||||
    />
 | 
			
		||||
  );
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -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();
 | 
			
		||||
 
 | 
			
		||||
@@ -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();
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user