Reorganize networks page
This commit is contained in:
@ -1,16 +1,19 @@
|
||||
import { Checkbox, Grid, Paper } from "@mui/material";
|
||||
import { Box, Button, Checkbox, Grid, Paper, Tab, Tabs } from "@mui/material";
|
||||
import React from "react";
|
||||
import { IpConfig, NetworkApi, NetworkInfo } from "../../api/NetworksApi";
|
||||
import { ServerApi } from "../../api/ServerApi";
|
||||
import { useAlert } from "../../hooks/providers/AlertDialogProvider";
|
||||
import { useConfirm } from "../../hooks/providers/ConfirmDialogProvider";
|
||||
import { useSnackbar } from "../../hooks/providers/SnackbarProvider";
|
||||
import { AsyncWidget } from "../AsyncWidget";
|
||||
import { CheckboxInput } from "../forms/CheckboxInput";
|
||||
import { EditSection } from "../forms/EditSection";
|
||||
import { IPInput } from "../forms/IPInput";
|
||||
import { ResAutostartInput } from "../forms/ResAutostartInput";
|
||||
import { SelectInput } from "../forms/SelectInput";
|
||||
import { TextInput } from "../forms/TextInput";
|
||||
import { useConfirm } from "../../hooks/providers/ConfirmDialogProvider";
|
||||
import { CheckboxInput } from "../forms/CheckboxInput";
|
||||
import { ResAutostartInput } from "../forms/ResAutostartInput";
|
||||
import { DHCPHostReservations } from "./DHCPHostReservations";
|
||||
import { useNavigate } from "react-router-dom";
|
||||
|
||||
interface DetailsProps {
|
||||
net: NetworkInfo;
|
||||
@ -35,9 +38,44 @@ export function NetworkDetails(p: DetailsProps): React.ReactElement {
|
||||
);
|
||||
}
|
||||
|
||||
function NetworkDetailsInner(
|
||||
p: DetailsProps & { cardsList: string[] }
|
||||
): React.ReactElement {
|
||||
enum VMTab {
|
||||
General = 0,
|
||||
IPv4,
|
||||
IPv6,
|
||||
Danger,
|
||||
}
|
||||
|
||||
type DetailsInnerProps = DetailsProps & { cardsList: string[] };
|
||||
|
||||
function NetworkDetailsInner(p: DetailsInnerProps): React.ReactElement {
|
||||
const [currTab, setCurrTab] = React.useState(VMTab.General);
|
||||
|
||||
return (
|
||||
<>
|
||||
<Box sx={{ borderBottom: 1, borderColor: "divider" }}>
|
||||
<Tabs value={currTab} onChange={(_ev, newVal) => setCurrTab(newVal)}>
|
||||
<Tab label="General" tabIndex={VMTab.General} />
|
||||
<Tab label="IPv4" tabIndex={VMTab.IPv4} />
|
||||
<Tab label="IPv6" tabIndex={VMTab.IPv6} />
|
||||
{!p.editable && (
|
||||
<Tab
|
||||
label="Danger zone"
|
||||
style={{ color: "red" }}
|
||||
tabIndex={VMTab.Danger}
|
||||
/>
|
||||
)}
|
||||
</Tabs>
|
||||
</Box>
|
||||
|
||||
{currTab === VMTab.General && <NetworkDetailsTabGeneral {...p} />}
|
||||
{currTab === VMTab.IPv4 && <NetworkDetailsTabIPv4 {...p} />}
|
||||
{currTab === VMTab.IPv6 && <NetworkDetailsTabIPv6 {...p} />}
|
||||
{currTab === VMTab.Danger && <NetworkDetailsTabDanger {...p} />}
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
function NetworkDetailsTabGeneral(p: DetailsInnerProps): React.ReactElement {
|
||||
return (
|
||||
<Grid container spacing={2}>
|
||||
{/* Metadata section */}
|
||||
@ -161,7 +199,13 @@ function NetworkDetailsInner(
|
||||
multiline={true}
|
||||
/>
|
||||
</EditSection>
|
||||
</Grid>
|
||||
);
|
||||
}
|
||||
|
||||
function NetworkDetailsTabIPv4(p: DetailsInnerProps): React.ReactElement {
|
||||
return (
|
||||
<Grid container spacing={2}>
|
||||
<IPSection
|
||||
editable={p.editable}
|
||||
config={p.net.ip_v4}
|
||||
@ -171,7 +215,13 @@ function NetworkDetailsInner(
|
||||
}}
|
||||
version={4}
|
||||
/>
|
||||
</Grid>
|
||||
);
|
||||
}
|
||||
|
||||
function NetworkDetailsTabIPv6(p: DetailsInnerProps): React.ReactElement {
|
||||
return (
|
||||
<Grid container spacing={2}>
|
||||
<IPSection
|
||||
editable={p.editable}
|
||||
config={p.net.ip_v6}
|
||||
@ -309,3 +359,37 @@ function IPSection(p: {
|
||||
</EditSection>
|
||||
);
|
||||
}
|
||||
|
||||
function NetworkDetailsTabDanger(p: DetailsInnerProps): React.ReactElement {
|
||||
const confirm = useConfirm();
|
||||
const snackbar = useSnackbar();
|
||||
const alert = useAlert();
|
||||
const navigate = useNavigate();
|
||||
|
||||
const requestDelete = async () => {
|
||||
try {
|
||||
if (
|
||||
!(await confirm(
|
||||
"Do you really want to delete this network?",
|
||||
`Delete network ${p.net.name}`,
|
||||
"Delete"
|
||||
))
|
||||
)
|
||||
return;
|
||||
|
||||
await NetworkApi.Delete(p.net);
|
||||
|
||||
navigate("/net");
|
||||
snackbar("The network was successfully deleted!");
|
||||
} catch (e) {
|
||||
console.error(e);
|
||||
alert(`Failed to delete the network!\n${e}`);
|
||||
}
|
||||
};
|
||||
|
||||
return (
|
||||
<Button color="error" onClick={requestDelete}>
|
||||
Delete the network
|
||||
</Button>
|
||||
);
|
||||
}
|
||||
|
Reference in New Issue
Block a user