Skip to content

Commit

Permalink
Merge pull request #182 from jadmsaadaot/SUBMIT-task#176-D
Browse files Browse the repository at this point in the history
handle send recommendation to manager
  • Loading branch information
jadmsaadaot authored Nov 27, 2024
2 parents 3cf8eb5 + 4a952bb commit 1ed992b
Show file tree
Hide file tree
Showing 4 changed files with 86 additions and 25 deletions.
3 changes: 2 additions & 1 deletion submit-api/src/submit_api/schemas/submission_review.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ class Meta: # pylint: disable=too-few-public-methods
id = fields.Int(data_key="id")
form_answers = fields.Dict(data_key="form_answers")
item_id = fields.Int(data_key="item_id")
status = fields.Enum(data_key="status", enum=SubmissionReviewStatus)


class SubmissionReviewFormSchema(Schema):
Expand All @@ -42,4 +43,4 @@ class Meta: # pylint: disable=too-few-public-methods
unknown = EXCLUDE

form_answers = fields.Nested(SubmissionReviewFormSchema, data_key="form_answers")
status = fields.Enum(data_key="status", enum=SubmissionReviewStatus)
status = fields.Str(data_key="status")
Original file line number Diff line number Diff line change
@@ -1,13 +1,18 @@
import { useSaveSubmissionReview } from "@/hooks/api/useItems";
import {
getSubmissionItemForStaffQueryOptions,
useSaveSubmissionReview,
} from "@/hooks/api/useItems";
import { Grid } from "@mui/material";
import { useParams } from "@tanstack/react-router";
import { useNavigate, useParams } from "@tanstack/react-router";
import { useFormContext } from "react-hook-form";
import { useState } from "react";
import { LoadingButton } from "@/components/Shared/LoadingButton";
import { SUBMISSION_REVIEW_STATUS } from "@/models/SubmissionReview";
import { isAxiosError } from "axios";
import { notify } from "@/components/Shared/Snackbar/snackbarStore";
import { consultationSchema } from "./constants";
import { useQueryClient } from "@tanstack/react-query";
import { SubmissionItem } from "@/models/SubmissionItem";

export default function ActionButtons() {
const {
Expand All @@ -18,6 +23,14 @@ export default function ActionButtons() {
from: "/staff/_staffLayout/projects/$projectId/_projectLayout/submission-packages/$submissionPackageId/_submissionLayout/submissions/$submissionId",
});

const queryClient = useQueryClient();
const submissionItem = queryClient.getQueryData<SubmissionItem>(
getSubmissionItemForStaffQueryOptions({ itemId: Number(submissionItemId) })
.queryKey,
);
const submissionReview = submissionItem?.review;
const isStaff = true;

const { mutateAsync: saveSubmissionReview } = useSaveSubmissionReview({
itemId: Number(submissionItemId),
packageId: Number(submissionPackageId),
Expand All @@ -28,12 +41,23 @@ export default function ActionButtons() {

const isLoading = isSavingAndClosing || isSendingToManager;

const { getValues, trigger } = useFormContext();
const {
getValues,
trigger,
formState: { dirtyFields },
} = useFormContext();
const isDirty = Object.keys(dirtyFields).length > 0;

const navigate = useNavigate();

const handleSaveAndClose = async () => {
// Add save logic here
const role = "staff";
const validateAtKey = role === "staff" ? "staff" : "manager";
if (!isDirty) {
navigate({
to: `/staff/projects/${projectId}/submission-packages/${submissionPackageId}`,
});
return;
}
const validateAtKey = isStaff ? "staff" : "manager";
const data = getValues();
try {
const validData = consultationSchema.validateSyncAt(validateAtKey, data);
Expand All @@ -45,6 +69,10 @@ export default function ActionButtons() {
setIsSavingAndClosing(true);
await saveSubmissionReview(requestBody);
setIsSavingAndClosing(false);
notify.success("Review saved successfully");
navigate({
to: `/staff/projects/${projectId}/submission-packages/${submissionPackageId}`,
});
} catch (error) {
trigger();
setIsSavingAndClosing(false);
Expand All @@ -63,6 +91,10 @@ export default function ActionButtons() {
};
await saveSubmissionReview(requestBody);
setIsSendingToManager(false);
notify.success("Review saved successfully");
navigate({
to: `/staff/projects/${projectId}/submission-packages/${submissionPackageId}`,
});
} catch (error) {
setIsSendingToManager(false);
trigger();
Expand All @@ -71,21 +103,32 @@ export default function ActionButtons() {
}
}
};

return (
<Grid item xs={12} container spacing={2}>
<Grid item xs={12} sm="auto">
<LoadingButton
color="secondary"
onClick={handleSaveAndClose}
disabled={isLoading}
disabled={
isLoading ||
(isStaff &&
submissionReview?.status ===
SUBMISSION_REVIEW_STATUS.PENDING_MANAGER_REVIEW)
}
loading={isSavingAndClosing}
>
Save & Exit
</LoadingButton>
</Grid>
<Grid item xs={12} sm="auto">
<LoadingButton
disabled={isLoading}
disabled={
isLoading ||
(isStaff &&
submissionReview?.status ===
SUBMISSION_REVIEW_STATUS.PENDING_MANAGER_REVIEW)
}
loading={isSendingToManager}
onClick={handleSendToManager}
>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import { BCDesignTokens } from "epic.theme";
import { useForm, FormProvider } from "react-hook-form";
import { yupResolver } from "@hookform/resolvers/yup";
import * as yup from "yup";
import { When } from "react-if";
import { Unless } from "react-if";
import ActionButtons from "./ActionButtons";
import ControlledRadioGroup from "@/components/Shared/controlled/ControlledRadioGroup";
import { SubmitRadio } from "@/components/Shared/SubmitRadio";
Expand All @@ -14,14 +14,15 @@ import { useMemo } from "react";
import NotesSection from "./NotesSection";
import { consultationSchema } from "./constants";
import { getSubmissionItemForStaffQueryOptions } from "@/hooks/api/useItems";
import { SUBMISSION_REVIEW_STATUS } from "@/models/SubmissionReview";

type ConsultationForm = yup.InferType<typeof consultationSchema>;

const YES_LABEL = "Yes, the holder has passed the Consultation Check";
const NO_LABEL = "No, the holder has failed the Consultation Check";

export default function ReviewSection() {
const role = "staff"; // Replace with actual role
const isStaff = true;

const { submissionId: submissionItemId } = useParams({
from: "/staff/_staffLayout/projects/$projectId/_projectLayout/submission-packages/$submissionPackageId/_submissionLayout/submissions/$submissionId",
Expand All @@ -33,9 +34,9 @@ export default function ReviewSection() {
.queryKey,
);
const defaultValues = useMemo(() => {
if (!submissionItem) return {};
if (!submissionItem) return undefined;

if (!submissionItem.review?.form_answers) return {};
if (!submissionItem.review?.form_answers) return undefined;

return submissionItem.review.form_answers;
}, [submissionItem]);
Expand All @@ -46,6 +47,11 @@ export default function ReviewSection() {
defaultValues,
});

const isFormDisabled =
isStaff &&
submissionItem?.review?.status ===
SUBMISSION_REVIEW_STATUS.PENDING_MANAGER_REVIEW;

return (
<Grid item container>
<Grid
Expand Down Expand Up @@ -77,21 +83,37 @@ export default function ReviewSection() {
</Typography>

<ControlledRadioGroup name="staff.passedConsultationCheck">
<SubmitRadio label={YES_LABEL} value={"yes"} />
<SubmitRadio label={NO_LABEL} value={"no"} />
<SubmitRadio
label={YES_LABEL}
value={"yes"}
disabled={isFormDisabled}
/>
<SubmitRadio
label={NO_LABEL}
value={"no"}
disabled={isFormDisabled}
/>
</ControlledRadioGroup>
<When condition={role !== "staff"}>
<Unless condition={isStaff}>
<Typography
variant="body1"
sx={{ fontWeight: BCDesignTokens.typographyFontWeightsBold }}
>
MANAGER CONFIRMATION:
</Typography>
<ControlledRadioGroup name="manager.passedConsultationCheck">
<SubmitRadio label={YES_LABEL} value={"yes"} />
<SubmitRadio label={NO_LABEL} value={"no"} />
<SubmitRadio
label={YES_LABEL}
value={"yes"}
disabled={isFormDisabled}
/>
<SubmitRadio
label={NO_LABEL}
value={"no"}
disabled={isFormDisabled}
/>
</ControlledRadioGroup>
</When>
</Unless>
<NotesSection />
<ActionButtons />
</form>
Expand Down
7 changes: 1 addition & 6 deletions submit-web/src/models/SubmissionReview.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,3 @@
// PENDING_STAFF_REVIEW = 'PENDING_STAFF_REVIEW'
// PENDING_MANAGER_REVIEW = 'PENDING_MANAGER_REVIEW'
// APPROVED = 'APPROVED'
// REJECTED = 'REJECTED'

type SubmissionReviewStatus =
| "PENDING_STAFF_REVIEW"
| "PENDING_MANAGER_REVIEW"
Expand All @@ -21,6 +16,6 @@ export type SubmissionReview = {
id: number;
item_id: number;
form_answers: Record<string, unknown>;
status: string;
status: SubmissionReviewStatus;
active: boolean;
};

0 comments on commit 1ed992b

Please sign in to comment.