diff --git a/plugin-hrm-form/src/___tests__/states/case/saveCase.test.ts b/plugin-hrm-form/src/___tests__/states/case/saveCase.test.ts index a2931cc8c3..5b7f3a132d 100644 --- a/plugin-hrm-form/src/___tests__/states/case/saveCase.test.ts +++ b/plugin-hrm-form/src/___tests__/states/case/saveCase.test.ts @@ -21,7 +21,6 @@ import { mockLocalFetchDefinitions } from '../../mockFetchDefinitions'; import '../../mockGetConfig'; import { createCaseAsyncAction, saveCaseReducer, updateCaseOverviewAsyncAction } from '../../../states/case/saveCase'; import { HrmState } from '../../../states'; -import { reduce } from '../../../states/case/reducer'; import { createCase, getCase, updateCaseOverview, updateCaseStatus } from '../../../services/CaseService'; import { connectToCase } from '../../../services/ContactService'; import { ReferralLookupStatus } from '../../../states/contacts/resourceReferral'; @@ -182,28 +181,6 @@ const contact = { referrals: [], }; -const expectObject: RecursivePartial = { - ...partialState, - connectedCase: { - cases: { - [mockPayload.id]: { - connectedCase: mockPayload, - caseWorkingCopy: { - sections: {}, - caseSummary: { - status: 'test-st', - followUpDate: '', - childIsAtRisk: false, - summary: '', - }, - }, - availableStatusTransitions: [], - references: new Set(['x']), - }, - }, - }, -}; - describe('createCaseAsyncAction', () => { test('Calls the createCase service, and create a case', () => { createCaseAsyncAction(contact, workerSid, definitionVersion); @@ -230,7 +207,7 @@ describe('createCaseAsyncAction', () => { id: '234', info: {}, }, - references: new Set(), + references: new Set(['contact-contact-1']), sections: {}, timelines: {}, outstandingUpdateCount: 0, @@ -239,12 +216,6 @@ describe('createCaseAsyncAction', () => { }, }); }); - - test('should handle createCaseAsyncAction in the reducer', async () => { - const expected: HrmState = expectObject as HrmState; - const result = reduce(nonInitialState, createCaseAsyncAction(contact, workerSid, definitionVersion)); - expect(result).toEqual(expected); - }); }); describe('updateCaseOverviewAsyncAction', () => { diff --git a/plugin-hrm-form/src/states/case/loadCaseIntoState.ts b/plugin-hrm-form/src/states/case/loadCaseIntoState.ts index dee02dc141..f138ca3f71 100644 --- a/plugin-hrm-form/src/states/case/loadCaseIntoState.ts +++ b/plugin-hrm-form/src/states/case/loadCaseIntoState.ts @@ -30,6 +30,7 @@ export const loadCaseIntoState = ({ referenceId, error = null, loading = false, + preserveWorkingCopy = false, }: { state: CaseState; caseId: Case['id']; @@ -38,11 +39,13 @@ export const loadCaseIntoState = ({ referenceId: string; loading?: boolean; error?: ParseFetchErrorResult; + preserveWorkingCopy?: boolean; }): CaseState => { const existingCase = state.cases[caseId]; const statusUpdates = { loading, error }; const existingReferences = existingCase?.references; + const existingWorkingCopy = existingCase?.caseWorkingCopy; if (!existingCase || !existingCase.connectedCase) { return { @@ -51,7 +54,7 @@ export const loadCaseIntoState = ({ ...state.cases, [caseId]: { connectedCase: newCase, - caseWorkingCopy: { sections: {} }, + caseWorkingCopy: preserveWorkingCopy && existingWorkingCopy ? existingWorkingCopy : { sections: {} }, availableStatusTransitions: getAvailableCaseStatusTransitions(newCase, definitionVersion), // eslint-disable-next-line no-nested-ternary references: existingReferences diff --git a/plugin-hrm-form/src/states/case/reducer.ts b/plugin-hrm-form/src/states/case/reducer.ts index fedd57e791..b4cc039652 100644 --- a/plugin-hrm-form/src/states/case/reducer.ts +++ b/plugin-hrm-form/src/states/case/reducer.ts @@ -132,6 +132,8 @@ const loadCaseListIntoState = ( definitionVersion: caseDefinitionVersion, newCase: caseToAdd, referenceId, + // Any cases being worked on elsewhere when the list is loaded should have in-progress edits preserved + preserveWorkingCopy: true, }); }, withoutOldSearchResults); } diff --git a/plugin-hrm-form/src/states/case/saveCase.ts b/plugin-hrm-form/src/states/case/saveCase.ts index 05d5f5e62e..5aae6526b3 100644 --- a/plugin-hrm-form/src/states/case/saveCase.ts +++ b/plugin-hrm-form/src/states/case/saveCase.ts @@ -25,6 +25,7 @@ import { getAvailableCaseStatusTransitions } from './caseStatus'; import { connectToCase } from '../../services/ContactService'; import { connectToCaseAsyncAction } from '../contacts/saveContact'; import { markCaseAsUpdating } from './markCaseAsUpdating'; +import { referenceCase } from './referenceCase'; const UPDATE_CASE_OVERVIEW_ACTION = 'case-action/update-overview'; @@ -129,13 +130,38 @@ const handleUpdateCaseOverviewFulfilledAction = ( const handleCreateCaseFulfilledAction = ( handleAction: CreateHandlerMap, asyncAction: typeof createCaseAsyncAction.fulfilled, -) => handleAction(asyncAction, (state, { payload }): HrmState => updateConnectedCase(state, payload.newCase)); +) => + handleAction( + asyncAction, + (state, { payload }): HrmState => { + const { newCase, connectedContact } = payload; + const updatedState = updateConnectedCase(state, newCase); + return { + ...updatedState, + connectedCase: referenceCase({ + caseId: newCase.id, + referenceId: `contact-${connectedContact.id}`, + state: updatedState.connectedCase, + }), + }; + }, + ); const handleConnectToCaseFulfilledAction = ( handleAction: CreateHandlerMap, asyncAction: typeof connectToCaseAsyncAction.fulfilled, ) => - handleAction(asyncAction, (state, { payload: { contact, contactCase } }) => updateConnectedCase(state, contactCase)); + handleAction(asyncAction, (state, { payload: { contact, contactCase } }) => { + const updated = updateConnectedCase(state, contactCase); + return { + ...updated, + connectedCase: referenceCase({ + caseId: contactCase.id, + referenceId: `contact-${contact.id}`, + state: updated.connectedCase, + }), + }; + }); const handleCancelCaseFulfilledAction = ( handleAction: CreateHandlerMap,