From a179918322032b37e62f1258c5316c7d78e27fb6 Mon Sep 17 00:00:00 2001 From: Jefferson Silva Date: Tue, 1 Apr 2025 11:52:10 -0300 Subject: [PATCH] feat: implement page as module on default router --- .../submodules/ConfirmationModal/index.tsx | 62 +++++ .../submodules/DrawerForm/index.tsx | 13 +- .../components/submodules/ModalForm/index.tsx | 13 +- packages/react-material-ui/src/index.ts | 5 +- .../src/modules/crud/index.tsx | 12 +- .../src/modules/form/index.tsx | 257 ++++++++++++++++++ .../src/components/AuthRoute.tsx | 2 +- .../src/components/ChildRoutes.tsx | 3 +- .../src/components/DefaultRoute.tsx | 35 ++- .../src/components/Resource.tsx | 8 +- 10 files changed, 387 insertions(+), 23 deletions(-) create mode 100644 packages/react-material-ui/src/components/submodules/ConfirmationModal/index.tsx create mode 100644 packages/react-material-ui/src/modules/form/index.tsx diff --git a/packages/react-material-ui/src/components/submodules/ConfirmationModal/index.tsx b/packages/react-material-ui/src/components/submodules/ConfirmationModal/index.tsx new file mode 100644 index 00000000..817fd471 --- /dev/null +++ b/packages/react-material-ui/src/components/submodules/ConfirmationModal/index.tsx @@ -0,0 +1,62 @@ +import React from 'react'; +import { Box, Button, Dialog, DialogContent, Typography } from '@mui/material'; +import ReportProblemOutlinedIcon from '@mui/icons-material/ReportProblemOutlined'; + +type Props = { + isOpen: boolean; + onClose: () => void; + onConfirm: () => void; +}; + +const ConfirmationModal = ({ isOpen, onClose, onConfirm }: Props) => { + return ( + + + + + + + + Delete Item + + + Are you sure you want to delete this item? + + + + + + + + + ); +}; + +export default ConfirmationModal; diff --git a/packages/react-material-ui/src/components/submodules/DrawerForm/index.tsx b/packages/react-material-ui/src/components/submodules/DrawerForm/index.tsx index 3dd58449..df209cf4 100644 --- a/packages/react-material-ui/src/components/submodules/DrawerForm/index.tsx +++ b/packages/react-material-ui/src/components/submodules/DrawerForm/index.tsx @@ -15,6 +15,7 @@ import { SchemaForm } from '../../../components/SchemaForm'; import { CustomTextFieldWidget } from '../../../styles/CustomWidgets'; import { FormSubmoduleProps } from '../types/Form'; import TableRowControls from '../TableRowControls'; +import ConfirmationModal from '../ConfirmationModal'; const DrawerFormSubmodule = (props: FormSubmoduleProps) => { const { @@ -47,6 +48,8 @@ const DrawerFormSubmodule = (props: FormSubmoduleProps) => { const [fieldValues, setFieldValues] = useState(formData); + const [isConfirmationModalOpen, setConfirmationModalOpen] = + useState(false); useEffect(() => { setFieldValues(formData); @@ -158,7 +161,7 @@ const DrawerFormSubmodule = (props: FormSubmoduleProps) => { + )} + {viewMode === 'edit' && !hideCancelButton && ( + + )} + {viewMode === 'details' && !hideCancelButton && ( + + )} + {viewMode !== 'details' && ( + + )} + + + + setConfirmationModalOpen(false)} + onConfirm={() => { + setConfirmationModalOpen(false); + deleteItem(formData); + }} + /> + + ); +}; + +export default FormModule; diff --git a/packages/react-navigation/src/components/AuthRoute.tsx b/packages/react-navigation/src/components/AuthRoute.tsx index 7282476e..28150a12 100644 --- a/packages/react-navigation/src/components/AuthRoute.tsx +++ b/packages/react-navigation/src/components/AuthRoute.tsx @@ -1,7 +1,7 @@ import React from 'react'; import { Navigate } from 'react-router'; -import { AuthModule, AuthModuleProps } from '@concepta/react-material-ui/'; +import { AuthModule, AuthModuleProps } from '@concepta/react-material-ui'; import { toast } from 'react-toastify'; type Route = 'signIn' | 'signUp' | 'forgotPassword' | 'resetPassword'; diff --git a/packages/react-navigation/src/components/ChildRoutes.tsx b/packages/react-navigation/src/components/ChildRoutes.tsx index 1d98e689..5eac20eb 100644 --- a/packages/react-navigation/src/components/ChildRoutes.tsx +++ b/packages/react-navigation/src/components/ChildRoutes.tsx @@ -5,7 +5,7 @@ import { AuthModuleProps, DrawerProps, NavbarProps, -} from '@concepta/react-material-ui/'; +} from '@concepta/react-material-ui'; import DefaultRoute from './DefaultRoute'; import AuthRoute from './AuthRoute'; @@ -128,6 +128,7 @@ const ChildRoutes = ({ name={child.props.name} showAppBar={child.props.showAppBar} module={child.props.module} + isFormPage={child.props.isFormPage} page={child.props.page} items={items} drawerProps={{ diff --git a/packages/react-navigation/src/components/DefaultRoute.tsx b/packages/react-navigation/src/components/DefaultRoute.tsx index 1fbdc7d0..51a433e3 100644 --- a/packages/react-navigation/src/components/DefaultRoute.tsx +++ b/packages/react-navigation/src/components/DefaultRoute.tsx @@ -7,8 +7,9 @@ import { DrawerItemProps, DrawerProps, NavbarProps, -} from '@concepta/react-material-ui/'; -import { ModuleProps } from '@concepta/react-material-ui/dist/modules/crud'; + FormModule, + ModuleProps, +} from '@concepta/react-material-ui'; type DefaultRouteProps = { resource: string; @@ -18,6 +19,7 @@ type DefaultRouteProps = { showAppBar?: boolean; module?: ModuleProps; page?: ReactNode; + isFormPage?: boolean; items: DrawerItemProps[]; drawerProps?: DrawerProps; navbarProps?: NavbarProps; @@ -35,6 +37,7 @@ const DefaultRoute = ({ showAppBar = true, module, page, + isFormPage = false, items, drawerProps, navbarProps, @@ -48,16 +51,24 @@ const DefaultRoute = ({ onClick: () => item?.id && navigate(item.id), })); - const content = module ? ( - - ) : ( - page - ); + const content = + module && !isFormPage ? ( + + ) : isFormPage ? ( + + ) : ( + page + ); const wrappedContent = showAppBar ? ( renderAppBar ? ( diff --git a/packages/react-navigation/src/components/Resource.tsx b/packages/react-navigation/src/components/Resource.tsx index cf3947e6..708f2f34 100644 --- a/packages/react-navigation/src/components/Resource.tsx +++ b/packages/react-navigation/src/components/Resource.tsx @@ -1,17 +1,17 @@ import React, { ReactNode } from 'react'; import { Route } from 'react-router-dom'; -import { ModuleProps } from '@concepta/react-material-ui/dist/modules/crud'; -import { DrawerItemProps } from '@concepta/react-material-ui'; +import { ModuleProps } from '@concepta/react-material-ui'; type ResourceProps = { id: string; - name: string; - icon: DrawerItemProps['icon']; + name?: string; + icon?: ReactNode; showDrawerItem?: boolean; isUnprotected?: boolean; showAppBar?: boolean; module?: Partial; page?: ReactNode; + isFormPage?: boolean; }; const Resource = ({ id }: ResourceProps) => {