From b6087f91ea8920552c3e61f6c7899a44fc361473 Mon Sep 17 00:00:00 2001 From: zachery with an e <45150570+zweatshirt@users.noreply.github.com> Date: Tue, 17 Mar 2026 17:05:38 -0500 Subject: [PATCH 1/4] Save utility costs in both Fair Rental Value and Cost of Providing a Home forms --- .../Shared/AutoSave/AutosaveCustomTextField.tsx | 11 +++++++++-- .../Steps/StepThree/CalcComponents/CostOfHome.tsx | 1 + .../StepThree/CalcComponents/FairRentalValue.tsx | 1 + 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/components/Reports/MinisterHousingAllowance/Shared/AutoSave/AutosaveCustomTextField.tsx b/src/components/Reports/MinisterHousingAllowance/Shared/AutoSave/AutosaveCustomTextField.tsx index 8a6f66f3c9..059ff52133 100644 --- a/src/components/Reports/MinisterHousingAllowance/Shared/AutoSave/AutosaveCustomTextField.tsx +++ b/src/components/Reports/MinisterHousingAllowance/Shared/AutoSave/AutosaveCustomTextField.tsx @@ -14,12 +14,13 @@ export interface AutosaveCustomTextFieldProps > { variant?: 'standard' | 'outlined'; fieldName: keyof CalculationFormValues & string; + additionalSaveFields?: Array; schema: yup.Schema; } export const AutosaveCustomTextField: React.FC< AutosaveCustomTextFieldProps -> = ({ variant, fieldName, schema, ...props }) => { +> = ({ variant, fieldName, additionalSaveFields, schema, ...props }) => { const { pageType, requestData } = useMinisterHousingAllowance(); const request = requestData?.requestAttributes; @@ -34,7 +35,13 @@ export const AutosaveCustomTextField: React.FC< const fieldProps = useCustomAutoSave({ value: request?.[fieldName], - saveValue: (value) => saveField({ [fieldName]: value }), + saveValue: (value) => { + const attributes: Record = { [fieldName]: value }; + additionalSaveFields?.forEach((field) => { + attributes[field] = value; + }); + return saveField(attributes); + }, fieldName, schema, setFieldValue, diff --git a/src/components/Reports/MinisterHousingAllowance/Steps/StepThree/CalcComponents/CostOfHome.tsx b/src/components/Reports/MinisterHousingAllowance/Steps/StepThree/CalcComponents/CostOfHome.tsx index e337082bfb..ddf50f660e 100644 --- a/src/components/Reports/MinisterHousingAllowance/Steps/StepThree/CalcComponents/CostOfHome.tsx +++ b/src/components/Reports/MinisterHousingAllowance/Steps/StepThree/CalcComponents/CostOfHome.tsx @@ -153,6 +153,7 @@ export const CostOfHome: React.FC = ({ placeholder={currencyFormat(0, currency, locale)} InputProps={{ disableUnderline: true, inputMode: 'decimal' }} fieldName="avgUtilityTwo" + additionalSaveFields={['avgUtilityOne']} schema={schema} /> diff --git a/src/components/Reports/MinisterHousingAllowance/Steps/StepThree/CalcComponents/FairRentalValue.tsx b/src/components/Reports/MinisterHousingAllowance/Steps/StepThree/CalcComponents/FairRentalValue.tsx index b22f4e7f16..73a464964f 100644 --- a/src/components/Reports/MinisterHousingAllowance/Steps/StepThree/CalcComponents/FairRentalValue.tsx +++ b/src/components/Reports/MinisterHousingAllowance/Steps/StepThree/CalcComponents/FairRentalValue.tsx @@ -123,6 +123,7 @@ export const FairRentalValue: React.FC = ({ schema }) => { placeholder={currencyFormat(0, currency, locale)} InputProps={{ disableUnderline: true, inputMode: 'decimal' }} fieldName="avgUtilityOne" + additionalSaveFields={['avgUtilityTwo']} schema={schema} /> From 288bda6156f40d77137753b09bbb496d18e74e03 Mon Sep 17 00:00:00 2001 From: zachery with an e <45150570+zweatshirt@users.noreply.github.com> Date: Tue, 17 Mar 2026 17:07:52 -0500 Subject: [PATCH 2/4] Enhance AutosaveCustomTextField tests to support additional fields and null value handling --- .../AutoSave/AutosaveCustomTextField.test.tsx | 81 ++++++++++++++++++- 1 file changed, 78 insertions(+), 3 deletions(-) diff --git a/src/components/Reports/MinisterHousingAllowance/Shared/AutoSave/AutosaveCustomTextField.test.tsx b/src/components/Reports/MinisterHousingAllowance/Shared/AutoSave/AutosaveCustomTextField.test.tsx index 3b2a0da0d1..122f5cf538 100644 --- a/src/components/Reports/MinisterHousingAllowance/Shared/AutoSave/AutosaveCustomTextField.test.tsx +++ b/src/components/Reports/MinisterHousingAllowance/Shared/AutoSave/AutosaveCustomTextField.test.tsx @@ -21,9 +21,25 @@ const trackMutation = jest.fn(); const defaultSchema = yup.object({ mortgageOrRentPayment: yup.number().required('Mortgage Payment is required'), + avgUtilityOne: yup.number().nullable(), + avgUtilityTwo: yup.number().nullable(), }); -const TestComponent: React.FC = () => ( +interface TestComponentProps { + fieldName?: keyof import('../../Steps/StepThree/Calculation').CalculationFormValues & + string; + additionalSaveFields?: Array< + keyof import('../../Steps/StepThree/Calculation').CalculationFormValues & + string + >; + requestAttributes?: Record; +} + +const TestComponent: React.FC = ({ + fieldName = 'mortgageOrRentPayment', + additionalSaveFields, + requestAttributes = { mortgageOrRentPayment: null }, +}) => ( ( trackMutation, requestData: { id: 'request-id', - requestAttributes: { mortgageOrRentPayment: null }, + requestAttributes, }, } as unknown as ContextType } > @@ -111,4 +128,62 @@ describe('AutosaveCustomTextField', () => { await waitFor(() => expect(input).toHaveValue('')); }); + + it('saves to additional fields alongside the primary field', async () => { + const { getByRole } = render( + , + ); + + const input = getByRole('textbox'); + userEvent.type(input, '200'); + input.blur(); + + await waitFor(() => + expect(mutationSpy).toHaveGraphqlOperation( + 'UpdateMinistryHousingAllowanceRequest', + { + input: { + requestId: 'request-id', + requestAttributes: { + avgUtilityOne: 200, + avgUtilityTwo: 200, + }, + }, + }, + ), + ); + }); + + it('saves null to all fields when additional fields are specified and input is cleared', async () => { + const { getByRole } = render( + , + ); + + const input = getByRole('textbox'); + userEvent.clear(input); + userEvent.tab(); + + await waitFor(() => + expect(mutationSpy).toHaveGraphqlOperation( + 'UpdateMinistryHousingAllowanceRequest', + { + input: { + requestId: 'request-id', + requestAttributes: { + avgUtilityOne: null, + avgUtilityTwo: null, + }, + }, + }, + ), + ); + }); }); From b1be1cf99b1ff9a87fd157a679bf94cbabeb0637 Mon Sep 17 00:00:00 2001 From: zachery with an e <45150570+zweatshirt@users.noreply.github.com> Date: Wed, 18 Mar 2026 08:15:46 -0500 Subject: [PATCH 3/4] Refactor AutosaveCustomTextField to use Partial MinistryHousingAllowanceRequestAttributesInput for attributes in saveValue function --- .../Shared/AutoSave/AutosaveCustomTextField.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/components/Reports/MinisterHousingAllowance/Shared/AutoSave/AutosaveCustomTextField.tsx b/src/components/Reports/MinisterHousingAllowance/Shared/AutoSave/AutosaveCustomTextField.tsx index 059ff52133..04c0e162c9 100644 --- a/src/components/Reports/MinisterHousingAllowance/Shared/AutoSave/AutosaveCustomTextField.tsx +++ b/src/components/Reports/MinisterHousingAllowance/Shared/AutoSave/AutosaveCustomTextField.tsx @@ -1,6 +1,7 @@ import { TextField, TextFieldProps } from '@mui/material'; import { useFormikContext } from 'formik'; import * as yup from 'yup'; +import { MinistryHousingAllowanceRequestAttributesInput } from 'pages/api/graphql-rest.page.generated'; import { PageEnum } from 'src/components/Reports/Shared/CalculationReports/Shared/sharedTypes'; import { useCustomAutoSave } from '../../../Shared/CalculationReports/CustomAutosave/useCustomAutosave'; import { CalculationFormValues } from '../../Steps/StepThree/Calculation'; @@ -36,7 +37,7 @@ export const AutosaveCustomTextField: React.FC< const fieldProps = useCustomAutoSave({ value: request?.[fieldName], saveValue: (value) => { - const attributes: Record = { [fieldName]: value }; + const attributes: Partial = { [fieldName]: value }; additionalSaveFields?.forEach((field) => { attributes[field] = value; }); From 191c4978ba9fbb443d47a5c5d3da171e9967ee15 Mon Sep 17 00:00:00 2001 From: zachery with an e <45150570+zweatshirt@users.noreply.github.com> Date: Wed, 18 Mar 2026 08:28:22 -0500 Subject: [PATCH 4/4] Prettier --- .../Shared/AutoSave/AutosaveCustomTextField.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/components/Reports/MinisterHousingAllowance/Shared/AutoSave/AutosaveCustomTextField.tsx b/src/components/Reports/MinisterHousingAllowance/Shared/AutoSave/AutosaveCustomTextField.tsx index 04c0e162c9..e7afdb957d 100644 --- a/src/components/Reports/MinisterHousingAllowance/Shared/AutoSave/AutosaveCustomTextField.tsx +++ b/src/components/Reports/MinisterHousingAllowance/Shared/AutoSave/AutosaveCustomTextField.tsx @@ -37,7 +37,8 @@ export const AutosaveCustomTextField: React.FC< const fieldProps = useCustomAutoSave({ value: request?.[fieldName], saveValue: (value) => { - const attributes: Partial = { [fieldName]: value }; + const attributes: Partial = + { [fieldName]: value }; additionalSaveFields?.forEach((field) => { attributes[field] = value; });