diff --git a/src/frontend/package.json b/src/frontend/package.json index 57998cdd8e..e98f098e3a 100755 --- a/src/frontend/package.json +++ b/src/frontend/package.json @@ -52,6 +52,7 @@ "@mui/lab": "^5.0.0-alpha.134", "@mui/material": "^5.14.12", "@mui/system": "^5.14.12", + "@radix-ui/react-checkbox": "^1.0.4", "@radix-ui/react-dialog": "^1.0.5", "@radix-ui/react-progress": "^1.0.3", "@radix-ui/react-select": "^1.2.2", diff --git a/src/frontend/pnpm-lock.yaml b/src/frontend/pnpm-lock.yaml index fe7b798c57..f3caeae63f 100644 --- a/src/frontend/pnpm-lock.yaml +++ b/src/frontend/pnpm-lock.yaml @@ -32,6 +32,9 @@ dependencies: '@mui/system': specifier: ^5.14.12 version: 5.14.12(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@types/react@17.0.67)(react@17.0.2) + '@radix-ui/react-checkbox': + specifier: ^1.0.4 + version: 1.0.4(@types/react-dom@17.0.21)(@types/react@17.0.67)(react-dom@17.0.2)(react@17.0.2) '@radix-ui/react-dialog': specifier: ^1.0.5 version: 1.0.5(@types/react-dom@17.0.21)(@types/react@17.0.67)(react-dom@17.0.2)(react@17.0.2) @@ -2226,6 +2229,34 @@ packages: react-dom: 17.0.2(react@17.0.2) dev: false + /@radix-ui/react-checkbox@1.0.4(@types/react-dom@17.0.21)(@types/react@17.0.67)(react-dom@17.0.2)(react@17.0.2): + resolution: {integrity: sha512-CBuGQa52aAYnADZVt/KBQzXrwx6TqnlwtcIPGtVt5JkkzQwMOLJjPukimhfKEr4GQNd43C+djUh5Ikopj8pSLg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.23.1 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@17.0.67)(react@17.0.2) + '@radix-ui/react-context': 1.0.1(@types/react@17.0.67)(react@17.0.2) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@17.0.21)(@types/react@17.0.67)(react-dom@17.0.2)(react@17.0.2) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@17.0.21)(@types/react@17.0.67)(react-dom@17.0.2)(react@17.0.2) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@17.0.67)(react@17.0.2) + '@radix-ui/react-use-previous': 1.0.1(@types/react@17.0.67)(react@17.0.2) + '@radix-ui/react-use-size': 1.0.1(@types/react@17.0.67)(react@17.0.2) + '@types/react': 17.0.67 + '@types/react-dom': 17.0.21 + react: 17.0.2 + react-dom: 17.0.2(react@17.0.2) + dev: false + /@radix-ui/react-collection@1.0.3(@types/react-dom@17.0.21)(@types/react@17.0.67)(react-dom@17.0.2)(react@17.0.2): resolution: {integrity: sha512-3SzW+0PW7yBBoQlT8wNcGtaxaD0XSu0uLUFgrtHY08Acx05TaHaOmVLR73c0j/cqpDy53KBMO7s0dx2wmOIDIA==} peerDependencies: diff --git a/src/frontend/src/api/OrganisationService.ts b/src/frontend/src/api/OrganisationService.ts index 25d7224db0..5453826222 100644 --- a/src/frontend/src/api/OrganisationService.ts +++ b/src/frontend/src/api/OrganisationService.ts @@ -78,24 +78,110 @@ export const PostOrganisationDataService: Function = (url: string, payload: any) dispatch( CommonActions.SetSnackBar({ open: true, - message: 'Organization Successfully Created.', + message: 'Organization Request Submitted.', variant: 'success', duration: 2000, }), ); } catch (error: any) { + dispatch(OrganisationAction.PostOrganisationDataLoading(false)); dispatch( CommonActions.SetSnackBar({ open: true, - message: error.response.data.detail, + message: error.response.data.detail || 'Failed to create organization.', variant: 'error', duration: 2000, }), ); - dispatch(OrganisationAction.PostOrganisationDataLoading(false)); } }; await postOrganisationData(url, payload); }; }; + +export const GetIndividualOrganizationService: Function = (url: string) => { + return async (dispatch) => { + const getOrganisationData = async (url) => { + try { + const getOrganisationDataResponse = await axios.get(url); + const response: GetOrganisationDataModel = getOrganisationDataResponse.data; + dispatch(OrganisationAction.SetIndividualOrganization(response)); + } catch (error) {} + }; + await getOrganisationData(url); + }; +}; + +export const PatchOrganizationDataService: Function = (url: string, payload: any) => { + return async (dispatch) => { + dispatch(OrganisationAction.PostOrganisationDataLoading(true)); + + const patchOrganisationData = async (url, payload) => { + dispatch(OrganisationAction.SetOrganisationFormData(payload)); + + try { + const generateApiFormData = new FormData(); + appendObjectToFormData(generateApiFormData, payload); + + const patchOrganisationData = await axios.patch(url, payload, { + headers: { + 'Content-Type': 'multipart/form-data', + }, + }); + + const resp: HomeProjectCardModel = patchOrganisationData.data; + dispatch(OrganisationAction.PostOrganisationDataLoading(false)); + dispatch(OrganisationAction.postOrganisationData(resp)); + dispatch( + CommonActions.SetSnackBar({ + open: true, + message: 'Organization Updated Successfully.', + variant: 'success', + duration: 2000, + }), + ); + } catch (error: any) { + dispatch(OrganisationAction.PostOrganisationDataLoading(false)); + dispatch( + CommonActions.SetSnackBar({ + open: true, + message: error.response.data.detail || 'Failed to update organization.', + variant: 'error', + duration: 2000, + }), + ); + } + }; + + await patchOrganisationData(url, payload); + }; +}; + +export const ApproveOrganizationService: Function = (url: string, organizationId: string) => { + return async (dispatch) => { + const approveOrganization = async (url) => { + try { + await axios.post(url, organizationId); + dispatch( + CommonActions.SetSnackBar({ + open: true, + message: 'Organization approved successfully.', + variant: 'success', + duration: 2000, + }), + ); + } catch (error) { + dispatch( + CommonActions.SetSnackBar({ + open: true, + message: 'Failed to approve organization.', + variant: 'error', + duration: 2000, + }), + ); + } + }; + await approveOrganization(url); + }; +}; diff --git a/src/frontend/src/components/ApproveOrganization/ApproveOrganizationHeader.tsx b/src/frontend/src/components/ApproveOrganization/ApproveOrganizationHeader.tsx new file mode 100644 index 0000000000..79b90db9ac --- /dev/null +++ b/src/frontend/src/components/ApproveOrganization/ApproveOrganizationHeader.tsx @@ -0,0 +1,24 @@ +import React from 'react'; +import AssetModules from '@/shared/AssetModules.js'; +import { useNavigate } from 'react-router-dom'; + +const ApproveOrganizationHeader = () => { + const navigate = useNavigate(); + return ( +
+
+
+

APPROVE ORGANIZATION

+
+
navigate('/organisation')} + > + +
+
+
+ ); +}; + +export default ApproveOrganizationHeader; diff --git a/src/frontend/src/components/ApproveOrganization/OrganizationForm.tsx b/src/frontend/src/components/ApproveOrganization/OrganizationForm.tsx new file mode 100644 index 0000000000..22d226431d --- /dev/null +++ b/src/frontend/src/components/ApproveOrganization/OrganizationForm.tsx @@ -0,0 +1,107 @@ +import React, { useEffect } from 'react'; +import { useDispatch } from 'react-redux'; +import { useParams } from 'react-router-dom'; +import InputTextField from '@/components/common/InputTextField'; +import TextArea from '@/components/common/TextArea'; +import Button from '@/components/common/Button'; +import { ApproveOrganizationService, GetIndividualOrganizationService } from '@/api/OrganisationService'; +import CoreModules from '@/shared/CoreModules'; + +const OrganizationForm = () => { + const dispatch = useDispatch(); + const params = useParams(); + const organizationId = params.id; + const organisationFormData: any = CoreModules.useAppSelector((state) => state.organisation.organisationFormData); + + useEffect(() => { + if (organizationId) { + dispatch(GetIndividualOrganizationService(`${import.meta.env.VITE_API_URL}/organisation/${organizationId}`)); + } + }, [organizationId]); + + const approveOrganization = () => { + dispatch( + ApproveOrganizationService(`${import.meta.env.VITE_API_URL}/organisation/approve`, { org_id: organizationId }), + ); + }; + + return ( +
+
+
+ Organizational Details +
+
+
+ {}} + fieldType="text" + /> + {}} + fieldType="text" + /> + {}} + fieldType="text" + /> +