From baf3005eb25c81ad014de56890541cd680d0b24f Mon Sep 17 00:00:00 2001 From: cbolles Date: Tue, 12 Mar 2024 10:31:51 -0400 Subject: [PATCH 1/3] Restrict when the form can be submitted --- .../client/src/pages/projects/NewProject.tsx | 23 ++++++++++--------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/packages/client/src/pages/projects/NewProject.tsx b/packages/client/src/pages/projects/NewProject.tsx index 7158e448..2a5ad930 100644 --- a/packages/client/src/pages/projects/NewProject.tsx +++ b/packages/client/src/pages/projects/NewProject.tsx @@ -7,15 +7,13 @@ import { useCreateProjectMutation, useProjectExistsLazyQuery } from '../../graph import { ErrorObject } from 'ajv'; import { useTranslation } from 'react-i18next'; import { useSnackbar } from '../../context/Snackbar.context'; +import { useProject } from '../../context/Project.context'; +import { ProjectCreate } from '../../graphql/graphql'; -const initialData = { - name: '', - description: '' -}; export const NewProject: React.FC = () => { const navigate = useNavigate(); - const [data, setData] = useState(initialData); + const [data, setData] = useState({} as any); const [createProject, { error, data: createProjectResults, loading }] = useCreateProjectMutation({ variables: { project: data } }); @@ -23,6 +21,8 @@ export const NewProject: React.FC = () => { const [additionalErrors, setAdditionalErrors] = useState([]); const { t } = useTranslation(); const { pushSnackbarMessage } = useSnackbar(); + const { updateProjectList } = useProject(); + const [valid, setValid] = useState(false); const schema = { type: 'object', @@ -73,13 +73,16 @@ export const NewProject: React.FC = () => { params: { keyword: 'uniqueProjectName' } } ]); + setValid(false); } else { setAdditionalErrors([]); + setValid(true); } }, [projectExistsResults.data]); useEffect(() => { if (createProjectResults) { + updateProjectList(); navigate('/successpage'); } }, [createProjectResults]); @@ -88,6 +91,7 @@ export const NewProject: React.FC = () => { if (error) { pushSnackbarMessage(t('errors.projectCreate'), 'error'); console.error(error); + setValid(false); } }, [error]); @@ -95,6 +99,8 @@ export const NewProject: React.FC = () => { setData(data); if (!errors || errors.length === 0) { projectExistsQuery({ variables: { name: data.name } }); + } else { + setValid(false); } }; @@ -104,11 +110,6 @@ export const NewProject: React.FC = () => { return ( <> - {error && ( - - {t('components.newProject.failMessage')} - - )} { onChange={({ data, errors }) => handleChange(data, errors)} additionalErrors={additionalErrors} /> - From 5a421c977c5154ea2e5e15908fe175e64bbe1249 Mon Sep 17 00:00:00 2001 From: cbolles Date: Tue, 12 Mar 2024 11:10:59 -0400 Subject: [PATCH 2/3] Add manual re-load of policies before querying for project --- packages/client/src/pages/projects/NewProject.tsx | 2 +- packages/server/src/project/project.service.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/client/src/pages/projects/NewProject.tsx b/packages/client/src/pages/projects/NewProject.tsx index 2a5ad930..f2e46029 100644 --- a/packages/client/src/pages/projects/NewProject.tsx +++ b/packages/client/src/pages/projects/NewProject.tsx @@ -1,5 +1,5 @@ import { useNavigate } from 'react-router-dom'; -import { Button, Typography } from '@mui/material'; +import { Button } from '@mui/material'; import { useEffect, useState } from 'react'; import { materialRenderers, materialCells } from '@jsonforms/material-renderers'; import { JsonForms } from '@jsonforms/react'; diff --git a/packages/server/src/project/project.service.ts b/packages/server/src/project/project.service.ts index 6531707a..88dd255a 100644 --- a/packages/server/src/project/project.service.ts +++ b/packages/server/src/project/project.service.ts @@ -7,7 +7,6 @@ import { CASBIN_PROVIDER } from '../permission/casbin.provider'; import * as casbin from 'casbin'; import { TokenPayload } from 'src/jwt/token.dto'; import { ProjectPermissions } from 'src/permission/permissions/project'; -import { Roles } from 'src/permission/permissions/roles'; @Injectable() export class ProjectService { @@ -47,6 +46,7 @@ export class ProjectService { } async findAllForUser(user: TokenPayload, organization: string): Promise { + await this.enforcer.loadPolicy(); const projects = await this.findAll(organization); const allowedProjects: Project[] = []; for (const project of projects) { From aea2c577e54b32e37942e2c63a85c87266831702 Mon Sep 17 00:00:00 2001 From: cbolles Date: Tue, 12 Mar 2024 11:13:02 -0400 Subject: [PATCH 3/3] Fix formatting --- packages/client/src/pages/projects/NewProject.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/client/src/pages/projects/NewProject.tsx b/packages/client/src/pages/projects/NewProject.tsx index f2e46029..705d8386 100644 --- a/packages/client/src/pages/projects/NewProject.tsx +++ b/packages/client/src/pages/projects/NewProject.tsx @@ -10,7 +10,6 @@ import { useSnackbar } from '../../context/Snackbar.context'; import { useProject } from '../../context/Project.context'; import { ProjectCreate } from '../../graphql/graphql'; - export const NewProject: React.FC = () => { const navigate = useNavigate(); const [data, setData] = useState({} as any);