Make network configuration editable

This commit is contained in:
2025-06-16 18:51:33 +02:00
parent b00d46105b
commit 9f1f4b44ca
2 changed files with 60 additions and 6 deletions

View File

@ -1,8 +1,10 @@
import Editor from "@monaco-editor/react"; import Editor from "@monaco-editor/react";
import BookIcon from "@mui/icons-material/Book";
import RefreshIcon from "@mui/icons-material/Refresh"; import RefreshIcon from "@mui/icons-material/Refresh";
import { Grid, IconButton, InputAdornment, Tooltip } from "@mui/material"; import { Grid, IconButton, InputAdornment, Tooltip } from "@mui/material";
import { v4 as uuidv4 } from "uuid"; import { v4 as uuidv4 } from "uuid";
import { VMInfo } from "../../api/VMApi"; import { VMInfo } from "../../api/VMApi";
import { RouterLink } from "../RouterLink";
import { CheckboxInput } from "./CheckboxInput"; import { CheckboxInput } from "./CheckboxInput";
import { EditSection } from "./EditSection"; import { EditSection } from "./EditSection";
import { SelectInput } from "./SelectInput"; import { SelectInput } from "./SelectInput";
@ -38,6 +40,10 @@ export function CloudInitEditor(p: CloudInitProps): React.ReactElement {
{...p} {...p}
editable={p.editable && p.vm.cloud_init.attach_config} editable={p.editable && p.vm.cloud_init.attach_config}
/> />
<CloudInitNetworkConfig
{...p}
editable={p.editable && p.vm.cloud_init.attach_config}
/>
</Grid> </Grid>
</> </>
); );
@ -108,7 +114,21 @@ function CloudInitMetadata(p: CloudInitProps): React.ReactElement {
function CloudInitRawUserData(p: CloudInitProps): React.ReactElement { function CloudInitRawUserData(p: CloudInitProps): React.ReactElement {
return ( return (
<EditSection title="User data"> <EditSection
title="User data"
actions={
<RouterLink
target="_blank"
to="https://cloudinit.readthedocs.io/en/latest/reference/index.html"
>
<Tooltip title="Official reference">
<IconButton size="small">
<BookIcon />
</IconButton>
</Tooltip>
</RouterLink>
}
>
<Editor <Editor
theme="vs-dark" theme="vs-dark"
options={{ options={{
@ -126,3 +146,40 @@ function CloudInitRawUserData(p: CloudInitProps): React.ReactElement {
</EditSection> </EditSection>
); );
} }
function CloudInitNetworkConfig(p: CloudInitProps): React.ReactElement {
if (!p.editable && !p.vm.cloud_init.network_configuration) return <></>;
return (
<EditSection
title="Network configuration"
actions={
<RouterLink
target="_blank"
to="https://cloudinit.readthedocs.io/en/latest/reference/network-config-format-v2.html"
>
<Tooltip title="Official network configuration reference">
<IconButton size="small">
<BookIcon />
</IconButton>
</Tooltip>
</RouterLink>
}
>
<Editor
theme="vs-dark"
options={{
readOnly: !p.editable,
quickSuggestions: { other: true, comments: true, strings: true },
}}
language="yaml"
height={"30vh"}
value={p.vm.cloud_init.network_configuration ?? ""}
onChange={(v) => {
if (v && v !== "") p.vm.cloud_init.network_configuration = v;
else p.vm.cloud_init.network_configuration = undefined;
p.onChange?.();
}}
/>
</EditSection>
);
}

View File

@ -19,13 +19,10 @@ export function EditSection(
display: "flex", display: "flex",
justifyContent: "space-between", justifyContent: "space-between",
alignItems: "center", alignItems: "center",
marginBottom: "15px",
}} }}
> >
{p.title && ( {p.title && <Typography variant="h5">{p.title}</Typography>}
<Typography variant="h5" style={{ marginBottom: "15px" }}>
{p.title}
</Typography>
)}
{p.actions} {p.actions}
</span> </span>
)} )}