Skip to content

Commit 85cad7e

Browse files
Merge pull request #5119 from bcgov/fix-manual-handling-readonly-decision-and-back-url
Show director's decision read-only to analysts and fix manual handling back url
2 parents 4d14864 + 6a62810 commit 85cad7e

4 files changed

Lines changed: 62 additions & 10 deletions

File tree

bciers/apps/compliance/src/app/components/compliance-summary/manual-handling/internal/InternalManualHandlingComponent.tsx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import {
1010
import { ManualHandlingData } from "@/compliance/src/app/types";
1111
import { IChangeEvent } from "@rjsf/core";
1212
import { useSessionRole } from "@bciers/utils/src/sessionUtils";
13-
import { FrontEndRoles } from "@bciers/utils/src/enums";
13+
import { FrontEndRoles, ManualHandlingDecison } from "@bciers/utils/src/enums";
1414
import { actionHandler } from "@bciers/actions";
1515
import FormAlerts from "@bciers/components/form/FormAlerts";
1616
import SubmitButton from "@bciers/components/button/SubmitButton";
@@ -47,7 +47,7 @@ const InternalManualHandlingComponent = ({
4747
// Success state for the Submit button
4848
const [isSuccess, setIsSuccess] = useState(false);
4949

50-
const backUrl = `/compliance-administration/compliance-summaries/${complianceReportVersionId}/review-compliance-earned-credits-report`;
50+
const backUrl = `/compliance-administration/compliance-summaries`;
5151

5252
const isAnalystLockedByDirector =
5353
isCasAnalyst && formData._initial_director_decision === "issue_resolved";
@@ -106,6 +106,8 @@ const InternalManualHandlingComponent = ({
106106
uiSchema={internalManualHandlingUiSchema(
107107
initialFormData.analyst_submitted_date || "",
108108
initialFormData.analyst_submitted_by || "",
109+
isCasDirector,
110+
formData.director_decision as ManualHandlingDecison | undefined,
109111
)}
110112
formData={formData}
111113
onSubmit={handleSubmit}

bciers/apps/compliance/src/app/data/jsonSchema/manualHandling/internal/internalManualHandlingSchema.tsx

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,8 @@ const getAnalystSubmissionInfoElement = (
215215
export const internalManualHandlingUiSchema = (
216216
analystSubmittedDate?: string,
217217
analystSubmittedBy?: string,
218+
isDirectorDecisionEditable: boolean = false,
219+
directorDecision?: ManualHandlingDecison,
218220
): UiSchema => ({
219221
"ui:FieldTemplate": FieldTemplate,
220222
"ui:classNames": "form-heading-label",
@@ -258,9 +260,19 @@ export const internalManualHandlingUiSchema = (
258260
),
259261
},
260262

261-
director_decision: {
262-
"ui:widget": "RadioWidget",
263-
"ui:classNames": "md:gap-16 [&>div:nth-child(2)]:w-full",
264-
"ui:options": { inline: false },
265-
},
263+
director_decision: isDirectorDecisionEditable
264+
? {
265+
"ui:widget": "RadioWidget",
266+
"ui:classNames": "md:gap-16 [&>div:nth-child(2)]:w-full",
267+
"ui:options": { inline: false },
268+
}
269+
: {
270+
"ui:widget": "ReadOnlyRadioWidget",
271+
"ui:classNames": "md:gap-16 [&>div:nth-child(2)]:w-full",
272+
"ui:options": {
273+
customizedValue: directorDecision
274+
? MANUAL_HANDLING_DECISION_LABELS[directorDecision]
275+
: "",
276+
},
277+
},
266278
});

bciers/apps/compliance/src/tests/components/compliance-summary/manual-handling/internal/InternalManualHandlingComponent.test.tsx

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { FrontEndRoles } from "@bciers/utils/src/enums";
55
import InternalManualHandlingComponent from "@/compliance/src/app/components/compliance-summary/manual-handling/internal/InternalManualHandlingComponent";
66
import { ManualHandlingData } from "@/compliance/src/app/types";
77
import { actionHandler } from "@bciers/actions";
8+
import expectRadio from "@bciers/testConfig/helpers/expectRadio";
89

910
// Mock actionHandler so submit doesn't actually call the API
1011
vi.mock("@bciers/actions", () => ({
@@ -101,7 +102,7 @@ describe("InternalManualHandlingComponent", () => {
101102
expect(screen.getByText("The issue has been resolved.")).toBeVisible();
102103
});
103104

104-
it("navigates back to the earned credits review page when Back is clicked", () => {
105+
it("navigates back to the compliance summaries grid when Back is clicked", () => {
105106
render(
106107
<InternalManualHandlingComponent
107108
initialFormData={baseFormData}
@@ -115,10 +116,38 @@ describe("InternalManualHandlingComponent", () => {
115116
fireEvent.click(backButton);
116117

117118
expect(mockRouterPush).toHaveBeenCalledWith(
118-
`/compliance-administration/compliance-summaries/${CRV_ID}/review-compliance-earned-credits-report`,
119+
"/compliance-administration/compliance-summaries",
119120
);
120121
});
121122

123+
it("shows the director's decision as read-only text for CAS analysts", () => {
124+
render(
125+
<InternalManualHandlingComponent
126+
initialFormData={baseFormData}
127+
complianceReportVersionId={CRV_ID}
128+
/>,
129+
);
130+
131+
expect(screen.getByText("Pending manual handling")).toBeVisible();
132+
expect(screen.queryByRole("radio")).toBeNull();
133+
});
134+
135+
it("shows the director's decision as radio options for CAS directors", () => {
136+
useSessionRole.mockReturnValue(FrontEndRoles.CAS_DIRECTOR);
137+
138+
render(
139+
<InternalManualHandlingComponent
140+
initialFormData={baseFormData}
141+
complianceReportVersionId={CRV_ID}
142+
/>,
143+
);
144+
145+
expect(screen.getByText("Pending manual handling")).toBeVisible();
146+
expect(screen.getByText("Issue has been resolved")).toBeVisible();
147+
expectRadio(/Pending manual handling/i);
148+
expectRadio(/Issue has been resolved/i);
149+
});
150+
122151
it("submits updated analyst_comment and director_decision when Submit is clicked", async () => {
123152
render(
124153
<InternalManualHandlingComponent
Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,18 @@
11
import { screen } from "@testing-library/react";
22
import { expect } from "vitest";
33

4+
/**
5+
* Assert that a radio option exists under the given accessible name.
6+
*
7+
* Uses toBeInTheDocument rather than toBeVisible on purpose: MUI renders the
8+
* real <input type="radio"> visually hidden (PrivateSwitchBase-input, zero
9+
* opacity) behind the painted SVG control, so toBeVisible always fails on it;
10+
* assert toBeVisible on the option's label if you also need to prove the user
11+
* can see it.
12+
*/
413
export const expectRadio = (label: RegExp) => {
514
const radio = screen.getByRole("radio", { name: label });
6-
expect(radio).toBeInTheDocument(); // Verify that the radio button is visible
15+
expect(radio).toBeInTheDocument();
716
};
817

918
export default expectRadio;

0 commit comments

Comments
 (0)