From 7820691616c120dfc0312514b999efd163b297ab Mon Sep 17 00:00:00 2001 From: Matt Carroll Date: Mon, 5 Aug 2024 17:26:26 +1000 Subject: [PATCH] ON-42451 # formElementsService.getRootElementValueById() to support retrieving submission data from nested forms --- CHANGELOG.md | 4 +++ src/submissionService.ts | 42 +++++++++++++++++++++++-------- tests/formElementsService.test.ts | 38 +++++++++++++++++++++++++--- 3 files changed, 69 insertions(+), 15 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1124f463..423127f6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,10 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. ### Changed +- `formElementsService.getRootElementValueById()` to support retrieving submission data from nested forms + +### Changed + - check if repeatable set element value is an empty array ## [6.3.0] - 2024-06-21 diff --git a/src/submissionService.ts b/src/submissionService.ts index 4adb88d6..bb36f3ca 100644 --- a/src/submissionService.ts +++ b/src/submissionService.ts @@ -24,20 +24,40 @@ export * from './replaceCustomValues' export function getRootElementValueById( formElementId: string, formElements: FormTypes.FormElement[], - submission: SubmissionTypes.S3SubmissionData['submission'], + submission: SubmissionTypes.S3SubmissionData['submission'] | undefined, ): unknown { for (const formElement of formElements) { - if (formElement.type === 'page' || formElement.type === 'section') { - const value = getRootElementValueById( - formElementId, - formElement.elements, - submission, - ) - if (value !== undefined) { - return value + switch (formElement.type) { + case 'section': + case 'page': { + const value = getRootElementValueById( + formElementId, + formElement.elements, + submission, + ) + if (value !== undefined) { + return value + } + break + } + case 'form': { + const value = getRootElementValueById( + formElementId, + formElement.elements || [], + submission?.[ + formElement.name + ] as SubmissionTypes.S3SubmissionData['submission'], + ) + if (value !== undefined) { + return value + } + break + } + default: { + if (formElement.id === formElementId) { + return submission?.[formElement.name] + } } - } else if (formElement.id === formElementId) { - return submission[formElement.name] } } } diff --git a/tests/formElementsService.test.ts b/tests/formElementsService.test.ts index 1028b0a0..9957f7e9 100644 --- a/tests/formElementsService.test.ts +++ b/tests/formElementsService.test.ts @@ -8,7 +8,7 @@ import { getRootElementValueById } from '../src/submissionService' import forms from './inject-forms-fixtures/valid-forms.json' import invalidForms from './inject-forms-fixtures/invalid-forms.json' -describe('findPaymentElementValue()', () => { +describe('getRootElementValueById()', () => { const createTextElement = (name: string) => { const textElement: FormTypes.TextElement = { id: name, @@ -68,6 +68,20 @@ describe('findPaymentElementValue()', () => { requiresAllConditionallyShowPredicates: false, } } + const createFormElement = ( + id: string, + elements: FormTypes.FormElement[], + ): FormTypes.FormFormElement => { + return { + id, + name: id, + type: 'form', + elements, + conditionallyShow: false, + formId: 1, + requiresAllConditionallyShowPredicates: false, + } + } const elements: FormTypes.FormElement[] = [ createPageElement('Page1', [ createTextElement('A'), @@ -86,6 +100,9 @@ describe('findPaymentElementValue()', () => { ]), createTextElement('C'), createNumberElement('D'), + createFormElement('E', [ + createFormElement('E_A', [createTextElement('E_A_A')]), + ]), ]), createPageElement('Page2', [createTextElement('Page2Text')]), ] @@ -101,9 +118,14 @@ describe('findPaymentElementValue()', () => { C: 'CText', D: 5, Page2Text: 'Page 2 Text', + E: { + E_A: { + E_A_A: 'Nested Form Text', + }, + }, } - test('should return a nested element value within a submission object', () => { + test('should return an element value within a submission object', () => { const elementNameAndId = 'D' const value = getRootElementValueById( elementNameAndId, @@ -121,8 +143,16 @@ describe('findPaymentElementValue()', () => { ) expect(value).toBe('B_C_C_AText') }) - - test('`getPaymentValueFromPath` should return undefined when given an invalid element id', () => { + test('should return a nested element value in a nested form within a submission object', () => { + const elementNameAndId = 'E_A_A' + const value = getRootElementValueById( + elementNameAndId, + elements, + submission, + ) + expect(value).toBe('Nested Form Text') + }) + test('should return undefined when given an invalid element id', () => { const value = getRootElementValueById('abc123', elements, submission) expect(value).toBe(undefined) })