From fdd005a3ecb409baee288915ab8dc380c0d4d93f Mon Sep 17 00:00:00 2001 From: Pierre Hubert Date: Wed, 3 Jan 2024 22:11:35 +0100 Subject: [PATCH] Improve select network filter input --- .../src/widgets/forms/NWFilterSelectInput.tsx | 45 +++++++------ .../src/widgets/forms/VMNetworksList.tsx | 4 +- .../src/widgets/nwfilter/NWFilterItem.tsx | 63 +++++++++++++++++++ 3 files changed, 92 insertions(+), 20 deletions(-) create mode 100644 virtweb_frontend/src/widgets/nwfilter/NWFilterItem.tsx diff --git a/virtweb_frontend/src/widgets/forms/NWFilterSelectInput.tsx b/virtweb_frontend/src/widgets/forms/NWFilterSelectInput.tsx index c17ea83..0be290d 100644 --- a/virtweb_frontend/src/widgets/forms/NWFilterSelectInput.tsx +++ b/virtweb_frontend/src/widgets/forms/NWFilterSelectInput.tsx @@ -1,5 +1,6 @@ +import { Autocomplete, TextField } from "@mui/material"; import { NWFilter } from "../../api/NWFilterApi"; -import { SelectInput } from "./SelectInput"; +import { NWFilterItem } from "../nwfilter/NWFilterItem"; export function NWFilterSelectInput(p: { editable: boolean; @@ -9,24 +10,32 @@ export function NWFilterSelectInput(p: { onChange?: (name?: string) => void; canBeNull: boolean; }): React.ReactElement { + const selectedValue = p.nwfilters.find((o) => o.name === p.value); + if (!p.editable && !selectedValue) return <>; + + if (selectedValue) + return ( + p.onChange?.(undefined) : undefined} + /> + ); + return ( - p.onChange?.(v)} - options={[ - ...(p.canBeNull - ? [{ label: "No network filer", value: undefined }] - : []), - ...p.nwfilters.map((v) => { - return { - value: v.name, - label: `${v.name} (${v.chain?.protocol ?? "unspecified"})`, - description: `${v.rules.length} rules - ${v.join_filters.length} joint filters`, - }; - }), - ]} + o?.name ?? "Unspecified"} + value={selectedValue} + renderInput={(params) => ( + + )} + renderOption={(_props, option, _state) => ( + p.onChange?.(option?.name)} + value={option} + /> + )} /> ); } diff --git a/virtweb_frontend/src/widgets/forms/VMNetworksList.tsx b/virtweb_frontend/src/widgets/forms/VMNetworksList.tsx index e1bcbfb..17e7bde 100644 --- a/virtweb_frontend/src/widgets/forms/VMNetworksList.tsx +++ b/virtweb_frontend/src/widgets/forms/VMNetworksList.tsx @@ -17,11 +17,11 @@ import { ServerApi } from "../../api/ServerApi"; import { VMInfo, VMNetInterface } from "../../api/VMApi"; import { useConfirm } from "../../hooks/providers/ConfirmDialogProvider"; import { randomMacAddress } from "../../utils/RandUtils"; +import { EditSection } from "./EditSection"; import { MACInput } from "./MACInput"; +import { NWFilterSelectInput } from "./NWFilterSelectInput"; import { SelectInput } from "./SelectInput"; import { VMNetworkFilterParameters } from "./VMNetworkFilterParameters"; -import { EditSection } from "./EditSection"; -import { NWFilterSelectInput } from "./NWFilterSelectInput"; export function VMNetworksList(p: { vm: VMInfo; diff --git a/virtweb_frontend/src/widgets/nwfilter/NWFilterItem.tsx b/virtweb_frontend/src/widgets/nwfilter/NWFilterItem.tsx new file mode 100644 index 0000000..e1d17f2 --- /dev/null +++ b/virtweb_frontend/src/widgets/nwfilter/NWFilterItem.tsx @@ -0,0 +1,63 @@ +import { mdiSecurityNetwork } from "@mdi/js"; +import Icon from "@mdi/react"; +import DeleteIcon from "@mui/icons-material/Delete"; + +import { + Avatar, + IconButton, + ListItem, + ListItemAvatar, + ListItemButton, + ListItemText, +} from "@mui/material"; +import { NWFilter } from "../../api/NWFilterApi"; + +export function NWFilterItem(p: { + value?: NWFilter; + onClick?: () => void; + dense?: boolean; + onDelete?: () => void; +}): React.ReactElement { + const inner = ( + <> + {" "} + + + + + + + + ); + + if (p.onClick) + return ( + + {inner} + + ); + + return ( + + + + ) : undefined + } + > + {inner} + + ); +}