Skip to content

Commit

Permalink
Merge branch 'staging' into OCD-4770
Browse files Browse the repository at this point in the history
  • Loading branch information
andlar committed Feb 27, 2025
2 parents f598143 + 053ccd8 commit 2c165b2
Show file tree
Hide file tree
Showing 28 changed files with 1,252 additions and 887 deletions.
55 changes: 50 additions & 5 deletions src/app/api/data.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,14 @@ const useFetchCqms = () => {
}, options.daily);
};

const useFetchMeasureTypes = () => {
const axios = useAxios();
return useQuery(['data/measure-types'], async () => {
const response = await axios.get('data/measure-types');
return response.data;
}, options.daily);
};

const useFetchMeasures = () => {
const axios = useAxios();
return useQuery(['data/measures'], async () => {
Expand All @@ -51,11 +59,11 @@ const useFetchMeasures = () => {
}, options.daily);
};

const useFetchMeasureTypes = () => {
const useFetchNonConformityTypes = () => {
const axios = useAxios();
return useQuery(['data/measure-types'], async () => {
const response = await axios.get('data/measure-types');
return response.data;
return useQuery(['data/nonconformity-types'], async () => {
const response = await axios.get('data/nonconformity-types/v2');
return response.data.data;
}, options.daily);
};

Expand All @@ -67,6 +75,38 @@ const useFetchPracticeTypes = () => {
}, options.daily);
};

const useFetchRequirementGroupTypes = () => {
const axios = useAxios();
return useQuery(['data/requirement-group-types'], async () => {
const response = await axios.get('data/requirement-group-types');
return response.data.data;
}, options.daily);
};

const useFetchRequirementTypes = () => {
const axios = useAxios();
return useQuery(['data/requirement-types'], async () => {
const response = await axios.get('data/requirement-types');
return response.data.data;
}, options.daily);
};

const useFetchSurveillanceResultTypes = () => {
const axios = useAxios();
return useQuery(['data/surveillance_result_types'], async () => {
const response = await axios.get('data/surveillance_result_types');
return response.data.data;
}, options.daily);
};

const useFetchSurveillanceTypes = () => {
const axios = useAxios();
return useQuery(['data/surveillance_types'], async () => {
const response = await axios.get('data/surveillance_types');
return response.data.data;
}, options.daily);
};

const useFetchTargetedUsers = () => {
const axios = useAxios();
return useQuery(['/data/targeted_users'], async () => {
Expand All @@ -81,8 +121,13 @@ export {
useFetchComplainantTypes,
useFetchComplaintTypes,
useFetchCqms,
useFetchMeasures,
useFetchMeasureTypes,
useFetchMeasures,
useFetchNonConformityTypes,
useFetchPracticeTypes,
useFetchRequirementGroupTypes,
useFetchRequirementTypes,
useFetchSurveillanceResultTypes,
useFetchSurveillanceTypes,
useFetchTargetedUsers,
};
33 changes: 33 additions & 0 deletions src/app/api/listing.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,16 @@ import { useMutation, useQuery, useQueryClient } from 'react-query';
import { useAxios } from './axios';
import options from './options';

const useDeleteSurveillance = () => {
const axios = useAxios();
const queryClient = useQueryClient();
return useMutation(async (data) => axios.delete(`certified_products/${data.listingId}/surveillance/${data.id}`, { data: { reason: data.reason } }), {
onSuccess: () => {
queryClient.invalidateQueries(['listing']);
},
});
};

const useFetchIcsFamilyData = ({ id }) => {
const axios = useAxios();
return useQuery(['listing/ics-relationships', id], async () => {
Expand Down Expand Up @@ -40,6 +50,16 @@ const useFetchRelatedListings = ({ id }) => {
});
};

const usePostSurveillance = () => {
const axios = useAxios();
const queryClient = useQueryClient();
return useMutation(async (data) => axios.post(`certified_products/${data.listingId}/surveillance`, data), {
onSuccess: () => {
queryClient.invalidateQueries(['listing']);
},
});
};

const usePutListing = () => {
const axios = useAxios();
const queryClient = useQueryClient();
Expand All @@ -50,9 +70,22 @@ const usePutListing = () => {
});
};

const usePutSurveillance = () => {
const axios = useAxios();
const queryClient = useQueryClient();
return useMutation(async (data) => axios.put(`certified_products/${data.listingId}/surveillance/${data.id}`, data), {
onSuccess: () => {
queryClient.invalidateQueries(['listing']);
},
});
};

export {
useDeleteSurveillance,
useFetchIcsFamilyData,
useFetchListing,
useFetchRelatedListings,
usePostSurveillance,
usePutListing,
usePutSurveillance,
};
8 changes: 8 additions & 0 deletions src/app/components/action-bar/action-bar.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,7 @@ function ChplActionBar(props) {
const [warningAcknowledged, setWarningAcknowledged] = useState(false);
const [errors, setErrors] = useState([]);
const [isConfirming, setIsConfirming] = useState(false);
const [isDeleteDisabled, setIsDeleteDisabled] = useState(false);
const [isDisabled, setIsDisabled] = useState(false);
const [isProcessing, setIsProcessing] = useState(false);
const [pendingAction, setPendingAction] = useState('');
Expand All @@ -125,6 +126,10 @@ function ChplActionBar(props) {
setShowWarningAcknowledgement(props.showWarningAcknowledgement);
}, [props.showWarningAcknowledgement]); // eslint-disable-line react/destructuring-assignment

useEffect(() => {
setIsDeleteDisabled(props.isDeleteDisabled);
}, [props.isDeleteDisabled]); // eslint-disable-line react/destructuring-assignment

useEffect(() => {
setIsDisabled(props.isDisabled);
}, [props.isDisabled]); // eslint-disable-line react/destructuring-assignment
Expand Down Expand Up @@ -320,6 +325,7 @@ function ChplActionBar(props) {
variant="contained"
className={`${classes.actionBarButton} ${classes.deleteButton}`}
onClick={() => confirmDelete()}
disabled={isDeleteDisabled}
>
Delete
<DeleteOutlinedIcon
Expand Down Expand Up @@ -380,6 +386,7 @@ ChplActionBar.propTypes = {
canReject: bool,
canSave: bool,
canWithdraw: bool,
isDeleteDisabled: bool,
isDisabled: bool,
isProcessing: bool,
showErrorAcknowledgement: bool,
Expand All @@ -397,6 +404,7 @@ ChplActionBar.defaultProps = {
canReject: false,
canSave: true,
canWithdraw: false,
isDeleteDisabled: false,
isDisabled: false,
isProcessing: false,
showErrorAcknowledgement: false,
Expand Down
45 changes: 40 additions & 5 deletions src/app/components/listing/details/compliance/compliance.jsx
Original file line number Diff line number Diff line change
@@ -1,17 +1,27 @@
import React, { useEffect, useState } from 'react';
import { arrayOf, bool } from 'prop-types';
import React, { useContext, useEffect, useState } from 'react';
import {
Box,
Button,
} from '@material-ui/core';
import PlayCircleFilledWhiteOutlinedIcon from '@material-ui/icons/PlayCircleFilledWhiteOutlined';
import { arrayOf, bool, func } from 'prop-types';

import ChplDirectReviews from './direct-reviews';
import ChplSurveillance from './surveillance';

import { ListingContext, UserContext } from 'shared/contexts';
import { directReview as directReviewPropType, surveillance as surveillancePropType } from 'shared/prop-types';

const isIcs = (req) => {
if (!req.requirementType) { return false; } // req created before ICS type existed
return req.requirementType.requirementGroupType.name === 'Inherited Certified Status';
};

function ChplCompliance({ directReviews, directReviewsAvailable, surveillance: initialSurveillance }) {
function ChplCompliance({
directReviews, directReviewsAvailable, surveillance: initialSurveillance, dispatch,
}) {
const { listing } = useContext(ListingContext);
const { hasAnyRole, user } = useContext(UserContext);
const [surveillance, setSurveillance] = useState([]);
const [icsSurveillance, setIcsSurveillance] = useState([]);

Expand All @@ -20,10 +30,30 @@ function ChplCompliance({ directReviews, directReviewsAvailable, surveillance: i
setIcsSurveillance(initialSurveillance.filter((surv) => surv.requirements.every(isIcs)));
}, [initialSurveillance]);

const canManageSurveillance = () => {
if (hasAnyRole(['chpl-admin'])) { return true; }
if (listing.edition !== null && listing.edition.name !== '2015') { return false; }
if (hasAnyRole(['chpl-onc-acb']) && user.organizations.some((o) => o.id === listing.certifyingBody.id)) { return true; }
return false;
};

return (
<>
<ChplSurveillance surveillance={icsSurveillance} ics />
<ChplSurveillance surveillance={surveillance} />
{ canManageSurveillance()
&& (
<Box mb={4} display="flex" justifyContent="flex-end">
<Button
variant="outlined"
color="primary"
onClick={() => dispatch({ action: 'edit', payload: {} })}
endIcon={<PlayCircleFilledWhiteOutlinedIcon color="primary" />}
>
Initiate Surveillance
</Button>
</Box>
)}
<ChplSurveillance surveillance={icsSurveillance} ics dispatch={dispatch} />
<ChplSurveillance surveillance={surveillance} dispatch={dispatch} />
<ChplDirectReviews directReviews={directReviews} directReviewsAvailable={directReviewsAvailable} />
</>
);
Expand All @@ -35,4 +65,9 @@ ChplCompliance.propTypes = {
directReviews: arrayOf(directReviewPropType).isRequired,
directReviewsAvailable: bool.isRequired,
surveillance: arrayOf(surveillancePropType).isRequired,
dispatch: func,
};

ChplCompliance.defaultProps = {
dispatch: () => {},
};
Loading

0 comments on commit 2c165b2

Please sign in to comment.