import { Fragment, FunctionComponent, useCallback, useMemo, useState } from "react"; import { Formik } from "formik"; import { Button, styled } from "@mui/joy"; import { reportErrorsAndSubmit } from "../utils/forms"; import { ScrollView } from "./ScrollView"; 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: ITab[]; onHide: () => void; getFinalValues: (values: any, selectedNode?: any) => any; getInitialValues: (selectedNode?: any) => any; validationSchema: any; onCreate: (finalValues: any, values: any, formik: any) => void; selectedNode?: any; } const StyledScrollView = styled(ScrollView)` position: relative; padding-top: 0.75rem; padding-bottom: 0.75rem; padding-left: 1rem; padding-right: 1rem; flex: 1 1 auto; `; const Actions = styled("div")` display: flex; padding-top: 0.75rem; padding-bottom: 0.75rem; padding-left: 1rem; padding-right: 1rem; justify-content: flex-end; align-items: center; border-bottom-right-radius: 0.25rem; border-bottom-left-radius: 0.25rem; border-top-width: 1px; border-style: solid; `; const FormModal = (props: IFormModalProps) => { const { title, tabs, getInitialValues, getFinalValues, validationSchema, onHide, onCreate, selectedNode } = props; const [openTab, setOpenTab] = useState(() => tabs[0].value); const initialValues = useMemo( () => getInitialValues(selectedNode), [getInitialValues, selectedNode] ); const handleCreate = useCallback( (values: any, formik: any) => { onCreate(getFinalValues(values, selectedNode), values, formik); }, [getFinalValues, onCreate] ); const renderTab = (tab: ITab) => { const Component = tab.component; return ( {openTab === tab.value && } ); }; return ( {(formik) => ( <> {tabs.map((tab) => ( ))} {tabs.map(renderTab)} )} ); }; export default FormModal;