diff --git a/services/frontend/src/components/Modal/network/CreateNetworkModal.tsx b/services/frontend/src/components/Modal/network/CreateNetworkModal.tsx index 9c04127..31b2e7b 100644 --- a/services/frontend/src/components/Modal/network/CreateNetworkModal.tsx +++ b/services/frontend/src/components/Modal/network/CreateNetworkModal.tsx @@ -16,19 +16,13 @@ const CreateNetworkModal: FunctionComponent = ( ): ReactElement => { const { onCreateNetwork } = props; const [openTab, setOpenTab] = useState("General"); - - const handleCreate = (values: any, formik: any) => { - onCreateNetwork(values); - formik.resetForm(); - }; - const initialValues = useMemo(() => getInitialValues(), []); return ( {(formik) => ( diff --git a/services/frontend/src/components/Modal/network/EditNetworkModal.tsx b/services/frontend/src/components/Modal/network/EditNetworkModal.tsx index 1ee9632..5891435 100644 --- a/services/frontend/src/components/Modal/network/EditNetworkModal.tsx +++ b/services/frontend/src/components/Modal/network/EditNetworkModal.tsx @@ -1,15 +1,11 @@ -import { useState } from "react"; +import { useMemo, useState } from "react"; import { Formik } from "formik"; -import * as yup from "yup"; import { TrashIcon } from "@heroicons/react/outline"; import General from "./General"; import IPam from "./IPam"; import Labels from "./Labels"; -import { - CallbackFunction, - ICanvasConfig, - INetworkTopLevel -} from "../../../types"; +import { CallbackFunction } from "../../../types"; +import { getInitialValues, tabs, validationSchema } from "./form-utils"; interface IEditNetworkModalProps { onUpdateNetwork: CallbackFunction; @@ -20,64 +16,16 @@ interface IEditNetworkModalProps { const EditNetworkModal = (props: IEditNetworkModalProps) => { const { onUpdateNetwork, onDeleteNetwork, network } = props; const [openTab, setOpenTab] = useState("General"); - const handleUpdate = (values: any) => { - const updated = { ...network }; - updated.canvasConfig = values.canvasConfig; - updated.networkConfig = values.networkConfig; - onUpdateNetwork(updated); - }; - const validationSchema = yup.object({ - canvasConfig: yup.object({ - node_name: yup - .string() - .max(256, "network name should be 256 characters or less") - .required("network name is required") - }), - networkConfig: yup.object({ - name: yup - .string() - .max(256, "name should be 256 characters or less") - .required("name is required") - }) - }); - const tabs = [ - { - name: "General", - href: "#", - current: true, - hidden: false - }, - { - name: "Ipam", - href: "#", - current: false, - hidden: false - }, - { - name: "Labels", - href: "#", - current: false, - hidden: false - } - ]; const classNames = (...classes: string[]) => { return classes.filter(Boolean).join(" "); }; + const initialValues = useMemo(() => getInitialValues(network), [network]); return ( { - handleUpdate(values); - }} + onSubmit={onUpdateNetwork} validationSchema={validationSchema} > {(formik) => ( diff --git a/services/frontend/src/components/Modal/network/IPam.tsx b/services/frontend/src/components/Modal/network/IPam.tsx index 6fd4105..b28f2dc 100644 --- a/services/frontend/src/components/Modal/network/IPam.tsx +++ b/services/frontend/src/components/Modal/network/IPam.tsx @@ -1,5 +1,5 @@ -import { styled } from "@mui/joy"; import { ReactElement } from "react"; +import { styled } from "@mui/joy"; import TextField from "../../global/FormElements/TextField"; import { IFieldType } from "../../Record"; diff --git a/services/frontend/src/components/Modal/network/form-utils.ts b/services/frontend/src/components/Modal/network/form-utils.ts index 1498b87..86e403e 100644 --- a/services/frontend/src/components/Modal/network/form-utils.ts +++ b/services/frontend/src/components/Modal/network/form-utils.ts @@ -1,6 +1,7 @@ import lodash from "lodash"; import * as yup from "yup"; import { IEditNetworkForm, INetworkNodeItem } from "../../../types"; +import { checkArray } from "../../../utils/forms"; export const validationSchema = yup.object({ entryName: yup @@ -86,7 +87,8 @@ export const getInitialValues = (node?: INetworkNodeItem): IEditNetworkForm => { const { canvasConfig, networkConfig } = node; const { node_name = "" } = canvasConfig; - const { name = "", ipam } = networkConfig; + const { name = "", ipam, labels } = networkConfig; + const labels0: string[] = checkArray(labels, "labels"); return { ...initialValues, @@ -100,6 +102,13 @@ export const getInitialValues = (node?: INetworkNodeItem): IEditNetworkForm => { key, value: ipam.options[key].toString() }; + }), + labels: labels0.map((label) => { + const [key, value] = label.split(":"); + return { + key, + value + }; }) }; }; @@ -108,6 +117,8 @@ export const getFinalValues = ( values: IEditNetworkForm, previous?: INetworkNodeItem ): INetworkNodeItem => { + const { labels } = values; + return lodash.merge( lodash.cloneDeep(previous) || { key: "network", @@ -121,7 +132,8 @@ export const getFinalValues = ( node_name: values.entryName }, networkConfig: { - name: values.networkName + name: values.networkName, + labels: labels.map((label) => `${label.key}:${label.value}`) } } ) as any; diff --git a/services/frontend/src/components/Modal/network/index.tsx b/services/frontend/src/components/Modal/network/index.tsx index 8c416d9..f6a2698 100644 --- a/services/frontend/src/components/Modal/network/index.tsx +++ b/services/frontend/src/components/Modal/network/index.tsx @@ -4,6 +4,7 @@ import CreateNetworkModal from "./CreateNetworkModal"; import { CallbackFunction } from "../../../types"; import EditNetworkModal from "./EditNetworkModal"; import { attachUUID } from "../../../utils"; +import { getFinalValues } from "./form-utils"; interface IModalNetworkProps { networks: Record; @@ -23,17 +24,19 @@ const ModalNetwork = (props: IModalNetworkProps) => { } = props; const [selectedNetwork, setSelectedNetwork] = useState(); const handleCreate = (values: any) => { - const uniqueKey = attachUUID(values.key); + const finalValues = getFinalValues(values); + const uniqueKey = attachUUID(finalValues.key); const network = { - ...values, + ...finalValues, key: uniqueKey }; onCreateNetwork(network); setSelectedNetwork(network); }; const handleUpdate = (values: any) => { - onUpdateNetwork(values); - setSelectedNetwork(values); + const finalValues = getFinalValues(values, selectedNetwork); + onUpdateNetwork(finalValues); + setSelectedNetwork(finalValues); }; const handleDelete = () => { onDeleteNetwork(selectedNetwork.key);