diff --git a/services/frontend/src/components/FormModal.tsx b/services/frontend/src/components/FormModal.tsx index 3bd5a0d..ed8ff8f 100644 --- a/services/frontend/src/components/FormModal.tsx +++ b/services/frontend/src/components/FormModal.tsx @@ -1,4 +1,10 @@ -import { ReactElement, useCallback, useState } from "react"; +import { + Fragment, + FunctionComponent, + useCallback, + useMemo, + useState +} from "react"; import { Formik } from "formik"; import { Button, styled } from "@mui/joy"; @@ -8,14 +14,21 @@ import Modal from "./Modal"; import Tabs from "./Tabs"; import Tab from "./Tab"; +export interface ITab { + value: string; + title: string; + component: FunctionComponent; +} + export interface IFormModalProps { title: string; - tabs: { value: string; title: string }[]; + tabs: ITab[]; onHide: () => void; - initialValues: any; + getFinalValues: (values: any, selectedNode?: any) => any; + getInitialValues: (selectedNode?: any) => any; validationSchema: any; - onCreate: (values: any, formik: any) => void; - renderTabs: (current: string) => ReactElement; + onCreate: (finalValues: any, values: any, formik: any) => void; + selectedNode?: any; } const StyledScrollView = styled(ScrollView)` @@ -45,18 +58,38 @@ const FormModal = (props: IFormModalProps) => { const { title, tabs, - initialValues, + getInitialValues, + getFinalValues, validationSchema, onHide, onCreate, - renderTabs + selectedNode } = props; + const [openTab, setOpenTab] = useState(() => tabs[0].value); - const handleCreate = useCallback((values: any, formik: any) => { - onCreate(values, formik); - onHide(); - }, []); + const initialValues = useMemo( + () => getInitialValues(selectedNode), + [getInitialValues, selectedNode] + ); + + const handleCreate = useCallback( + (values: any, formik: any) => { + onCreate(getFinalValues(values, selectedNode), values, formik); + formik.resetForm(); + onHide(); + }, + [getFinalValues, onCreate, onHide] + ); + + const renderTab = (tab: ITab) => { + const Component = tab.component; + return ( + + {openTab === tab.value && } + + ); + }; return ( @@ -75,7 +108,7 @@ const FormModal = (props: IFormModalProps) => { - {renderTabs(openTab)} + {tabs.map(renderTab)}