From cd4ed9b98ee22d9da445cc49cff18095064480ae Mon Sep 17 00:00:00 2001 From: Samuel Rowe Date: Wed, 27 Jul 2022 16:24:40 +0530 Subject: [PATCH] feat(frontend): implemented IPAM form --- .../src/components/Modal/network/IPam.tsx | 159 +++++++++++++++++- 1 file changed, 158 insertions(+), 1 deletion(-) diff --git a/services/frontend/src/components/Modal/network/IPam.tsx b/services/frontend/src/components/Modal/network/IPam.tsx index 2ea3f71..6fd4105 100644 --- a/services/frontend/src/components/Modal/network/IPam.tsx +++ b/services/frontend/src/components/Modal/network/IPam.tsx @@ -1,5 +1,162 @@ +import { styled } from "@mui/joy"; +import { ReactElement } from "react"; + +import TextField from "../../global/FormElements/TextField"; +import { IFieldType } from "../../Record"; +import Records from "../../Records"; + +const Fields = styled("div")` + display: flex; + flex-direction: column; + row-gap: ${({ theme }) => theme.spacing(1)}; + width: 100%; +`; + +const Field = styled("div")` + width: 100%; +`; + +const Remove = styled("div")` + margin-top: ${({ theme }) => theme.spacing(2)}; +`; + +const Configuration = styled("div")` + display: flex; + flex-direction: column; + row-gap: ${({ theme }) => theme.spacing(1)}; + padding-left: ${({ theme }) => theme.spacing(4)}; +`; + +const ConfigurationTop = styled("div")` + display: flex; + flex-direction: row; + column-gap: ${({ theme }) => theme.spacing(1)}; +`; + +const ConfigurationBorder = styled("div")` + border-bottom: dotted 1px black; + height: 1px; + width: 40px; + margin: 8px 0px 0px 0px; +`; + const IPam = () => { - return <>; + return ( + + + + [ + { + name: `configurations[${index}].subnet`, + label: "Subnet", + type: "text" + }, + { + name: `configurations[${index}].ipRange`, + label: "IP Range", + type: "text" + }, + { + name: `configurations[${index}].gateway`, + label: "Gateway", + type: "text" + }, + { + name: `configurations[${index}].auxAddresses`, + type: "records", + // TODO: Remove placeholder from the main object. + placeholder: "", + options: { + name: `configurations[${index}].auxAddresses`, + modal: "configuration", + title: "Aux addresses", + referred: "aux address", + fields: (index2: number) => [ + { + name: `configurations[${index}].auxAddresses[${index2}].hostName`, + label: "Host name", + type: "text" + }, + { + name: `configurations[${index}].auxAddresses[${index2}].ipAddress`, + label: "IP address", + type: "text" + } + ], + newValue: { + hostName: "", + ipAddress: "" + }, + renderField: (element: ReactElement): ReactElement => ( + {element} + ), + renderRemove: (element: ReactElement): ReactElement => ( + {element} + ) + } + } + ]} + newValue={{ + subnet: "", + ipRange: "", + gateway: "", + auxAddresses: [] + }} + renderLayout={(elements: ReactElement[]): ReactElement => ( + + + {elements[0]} + {elements[1]} + {elements[2]} + + {elements[3]} + + )} + renderField={( + element: ReactElement, + field: IFieldType + ): ReactElement => ( + + {element} + + )} + renderRemove={(element: ReactElement): ReactElement => ( + {element} + )} + renderBorder={() => } + /> + + [ + { + name: `options[${index}].key`, + placeholder: "Key", + required: true, + type: "text" + }, + { + name: `options[${index}].value`, + placeholder: "Value", + required: true, + type: "text" + } + ]} + newValue={{ key: "", value: "" }} + renderField={(element: ReactElement): ReactElement => ( + {element} + )} + /> + + ); }; export default IPam;