From 6dd6e5373bccdb86a8c0a8577b2d80fc664988d8 Mon Sep 17 00:00:00 2001 From: Clinton Gillespie Date: Thu, 16 Apr 2026 14:41:14 +1000 Subject: [PATCH 1/7] add preservation of definition attribute when getResponse() is called --- .../src/test/manageForm.test.ts | 2 + .../src/test/removeRepeatId.test.ts | 83 +++++++++++++++++++ .../src/utils/manageForm.ts | 1 + .../src/utils/removeRepeatId.ts | 1 + 4 files changed, 87 insertions(+) diff --git a/packages/smart-forms-renderer/src/test/manageForm.test.ts b/packages/smart-forms-renderer/src/test/manageForm.test.ts index 166a4ebec..050d8df9d 100644 --- a/packages/smart-forms-renderer/src/test/manageForm.test.ts +++ b/packages/smart-forms-renderer/src/test/manageForm.test.ts @@ -366,6 +366,7 @@ describe('manageForm utils', () => { }); describe('getResponse', () => { + it('should get response and clean internal IDs', () => { const mockSourceQuestionnaire = { resourceType: 'Questionnaire' as const, @@ -394,6 +395,7 @@ describe('manageForm utils', () => { mockUpdateQuestionnaireResponse.mockReturnValue(mockCleanResponse); + debugger; const result = getResponse(); expect(mockUpdateQuestionnaireResponse).toHaveBeenCalledWith( diff --git a/packages/smart-forms-renderer/src/test/removeRepeatId.test.ts b/packages/smart-forms-renderer/src/test/removeRepeatId.test.ts index e3aadc31c..ef6de7ada 100644 --- a/packages/smart-forms-renderer/src/test/removeRepeatId.test.ts +++ b/packages/smart-forms-renderer/src/test/removeRepeatId.test.ts @@ -78,6 +78,89 @@ describe('removeRepeatId', () => { expect(result.text).toBe('Test item text'); }); + it('should preserve definition from qItem when present', () => { + const qItem: QuestionnaireItem = { + linkId: 'test-item', + type: 'boolean', + text: 'Has triple negative breast cancer', + definition: + 'http://example.org/fhir/StructureDefinition/IsTNBCFeature#Observation.value[x]' + }; + + const qrItem: QuestionnaireResponseItem = { + linkId: 'test-item', + definition: + 'http://example.org/fhir/StructureDefinition/IsTNBCFeature#Observation.value[x]', + text: 'Has triple negative breast cancer', + answer: [{ valueBoolean: true }] + }; + + const result = removeInternalRepeatIdsRecursive(qItem, qrItem) as QuestionnaireResponseItem; + + expect(result.definition).toBe( + 'http://example.org/fhir/StructureDefinition/IsTNBCFeature#Observation.value[x]' + ); + }); + + it('should preserve definition on nested group and child items', () => { + const qItem: QuestionnaireItem = { + linkId: '1', + type: 'group', + text: 'IsTNBCFeature', + definition: 'http://example.org/fhir/StructureDefinition/IsTNBCFeature', + item: [ + { + linkId: '1.1', + type: 'boolean', + text: 'Has triple negative breast cancer', + definition: + 'http://example.org/fhir/StructureDefinition/IsTNBCFeature#Observation.value[x]' + } + ] + }; + + const qrItem: QuestionnaireResponseItem = { + linkId: '1', + definition: 'http://example.org/fhir/StructureDefinition/IsTNBCFeature', + text: 'IsTNBCFeature', + item: [ + { + linkId: '1.1', + definition: + 'http://example.org/fhir/StructureDefinition/IsTNBCFeature#Observation.value[x]', + text: 'Has triple negative breast cancer', + answer: [{ valueBoolean: true }] + } + ] + }; + + const result = removeInternalRepeatIdsRecursive(qItem, qrItem) as QuestionnaireResponseItem; + + expect(result.definition).toBe( + 'http://example.org/fhir/StructureDefinition/IsTNBCFeature' + ); + expect(result.item![0].definition).toBe( + 'http://example.org/fhir/StructureDefinition/IsTNBCFeature#Observation.value[x]' + ); + }); + + it('should not include definition property when qItem has none', () => { + const qItem: QuestionnaireItem = { + linkId: 'test-item', + type: 'string', + text: 'No definition here' + }; + + const qrItem: QuestionnaireResponseItem = { + linkId: 'test-item', + answer: [{ valueString: 'answer' }] + }; + + const result = removeInternalRepeatIdsRecursive(qItem, qrItem) as QuestionnaireResponseItem; + + expect(result).not.toHaveProperty('definition'); + }); + it('should handle empty answers correctly', () => { const qItem: QuestionnaireItem = { linkId: 'test-item', diff --git a/packages/smart-forms-renderer/src/utils/manageForm.ts b/packages/smart-forms-renderer/src/utils/manageForm.ts index 48f71ed32..45c042610 100644 --- a/packages/smart-forms-renderer/src/utils/manageForm.ts +++ b/packages/smart-forms-renderer/src/utils/manageForm.ts @@ -239,6 +239,7 @@ export async function initialiseFhirClient(fhirClient: Client): Promise { * @author Sean Fong */ export function getResponse(): QuestionnaireResponse { + debugger; const cleanResponse = removeInternalIdsFromResponse( questionnaireStore.getState().sourceQuestionnaire, questionnaireResponseStore.getState().updatableResponse diff --git a/packages/smart-forms-renderer/src/utils/removeRepeatId.ts b/packages/smart-forms-renderer/src/utils/removeRepeatId.ts index 9da89d6e1..7e1a7c27e 100644 --- a/packages/smart-forms-renderer/src/utils/removeRepeatId.ts +++ b/packages/smart-forms-renderer/src/utils/removeRepeatId.ts @@ -106,6 +106,7 @@ function removeInternalRepeatIdsFromItem( return { linkId: qItem.linkId, + ...(qItem.definition && { definition: qItem.definition }), ...(qItem.text && { text: qItem.text }), ...(childQrItems.length > 0 && { item: childQrItems }), ...(updatedAnswers.length > 0 && { answer: updatedAnswers }) From 51613915f069338b28d24dc30092af99b8532710 Mon Sep 17 00:00:00 2001 From: Clinton Gillespie Date: Thu, 16 Apr 2026 14:42:16 +1000 Subject: [PATCH 2/7] remove debugger statements --- packages/smart-forms-renderer/src/test/manageForm.test.ts | 1 - packages/smart-forms-renderer/src/utils/manageForm.ts | 1 - 2 files changed, 2 deletions(-) diff --git a/packages/smart-forms-renderer/src/test/manageForm.test.ts b/packages/smart-forms-renderer/src/test/manageForm.test.ts index 050d8df9d..f987a21ab 100644 --- a/packages/smart-forms-renderer/src/test/manageForm.test.ts +++ b/packages/smart-forms-renderer/src/test/manageForm.test.ts @@ -395,7 +395,6 @@ describe('manageForm utils', () => { mockUpdateQuestionnaireResponse.mockReturnValue(mockCleanResponse); - debugger; const result = getResponse(); expect(mockUpdateQuestionnaireResponse).toHaveBeenCalledWith( diff --git a/packages/smart-forms-renderer/src/utils/manageForm.ts b/packages/smart-forms-renderer/src/utils/manageForm.ts index 45c042610..48f71ed32 100644 --- a/packages/smart-forms-renderer/src/utils/manageForm.ts +++ b/packages/smart-forms-renderer/src/utils/manageForm.ts @@ -239,7 +239,6 @@ export async function initialiseFhirClient(fhirClient: Client): Promise { * @author Sean Fong */ export function getResponse(): QuestionnaireResponse { - debugger; const cleanResponse = removeInternalIdsFromResponse( questionnaireStore.getState().sourceQuestionnaire, questionnaireResponseStore.getState().updatableResponse From 36147e259be71a9abe6ef5cb275cb825724ede06 Mon Sep 17 00:00:00 2001 From: Clinton Gillespie Date: Thu, 16 Apr 2026 15:17:15 +1000 Subject: [PATCH 3/7] remove whitespace --- packages/smart-forms-renderer/src/test/manageForm.test.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/smart-forms-renderer/src/test/manageForm.test.ts b/packages/smart-forms-renderer/src/test/manageForm.test.ts index f987a21ab..166a4ebec 100644 --- a/packages/smart-forms-renderer/src/test/manageForm.test.ts +++ b/packages/smart-forms-renderer/src/test/manageForm.test.ts @@ -366,7 +366,6 @@ describe('manageForm utils', () => { }); describe('getResponse', () => { - it('should get response and clean internal IDs', () => { const mockSourceQuestionnaire = { resourceType: 'Questionnaire' as const, From 0ecbe513d3509511a28d0f4a96d1771e5c2cac27 Mon Sep 17 00:00:00 2001 From: Clinton Gillespie Date: Mon, 20 Apr 2026 10:12:19 +1000 Subject: [PATCH 4/7] fix unrelated lint errors --- .../src/test/aboriginalFormCompletedFor49To25Years.test.tsx | 1 - .../src/test/aboriginalFormCompletedFor51Years.test.tsx | 1 - 2 files changed, 2 deletions(-) diff --git a/apps/smart-forms-app/src/test/aboriginalFormCompletedFor49To25Years.test.tsx b/apps/smart-forms-app/src/test/aboriginalFormCompletedFor49To25Years.test.tsx index d79c52ef7..03c342941 100644 --- a/apps/smart-forms-app/src/test/aboriginalFormCompletedFor49To25Years.test.tsx +++ b/apps/smart-forms-app/src/test/aboriginalFormCompletedFor49To25Years.test.tsx @@ -16,7 +16,6 @@ import { inputDateTime } from './testUtils.ts'; import { AboriginalForm } from './aboriginalFormUtils.tsx'; -import { Await } from 'react-router-dom'; vi.mock('fhirclient', () => ({ client: () => ({ diff --git a/apps/smart-forms-app/src/test/aboriginalFormCompletedFor51Years.test.tsx b/apps/smart-forms-app/src/test/aboriginalFormCompletedFor51Years.test.tsx index 334bb00c0..5a7961fbd 100644 --- a/apps/smart-forms-app/src/test/aboriginalFormCompletedFor51Years.test.tsx +++ b/apps/smart-forms-app/src/test/aboriginalFormCompletedFor51Years.test.tsx @@ -16,7 +16,6 @@ import { inputDateTime } from './testUtils.ts'; import { AboriginalForm } from './aboriginalFormUtils.tsx'; -import { Await } from 'react-router-dom'; vi.mock('fhirclient', () => ({ client: () => ({ From 4461b9a466e030d7ae9fdb741feafc216ada2cd2 Mon Sep 17 00:00:00 2001 From: Clinton Gillespie Date: Mon, 20 Apr 2026 10:39:59 +1000 Subject: [PATCH 5/7] prettier fixes --- .../smart-forms-renderer/src/test/data/removeIdSample.ts | 4 ++++ .../smart-forms-renderer/src/test/removeRepeatId.test.ts | 7 ++----- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/packages/smart-forms-renderer/src/test/data/removeIdSample.ts b/packages/smart-forms-renderer/src/test/data/removeIdSample.ts index 76114805c..a46c8785f 100644 --- a/packages/smart-forms-renderer/src/test/data/removeIdSample.ts +++ b/packages/smart-forms-renderer/src/test/data/removeIdSample.ts @@ -81,10 +81,12 @@ export const qrRemoveIdResult: QuestionnaireResponse = { item: [ { linkId: 'myPatient1.name', + definition: 'http://hl7.org/fhir/StructureDefinition/Patient#Patient.name', text: 'name *', item: [ { linkId: 'myPatient1.name.first', + definition: 'http://hl7.org/fhir/StructureDefinition/Patient#Patient.name.given', text: 'firstName *', answer: [ { @@ -96,10 +98,12 @@ export const qrRemoveIdResult: QuestionnaireResponse = { }, { linkId: 'myPatient1.name', + definition: 'http://hl7.org/fhir/StructureDefinition/Patient#Patient.name', text: 'name *', item: [ { linkId: 'myPatient1.name.first', + definition: 'http://hl7.org/fhir/StructureDefinition/Patient#Patient.name.given', text: 'firstName *', answer: [ { diff --git a/packages/smart-forms-renderer/src/test/removeRepeatId.test.ts b/packages/smart-forms-renderer/src/test/removeRepeatId.test.ts index ef6de7ada..e36696fe8 100644 --- a/packages/smart-forms-renderer/src/test/removeRepeatId.test.ts +++ b/packages/smart-forms-renderer/src/test/removeRepeatId.test.ts @@ -83,8 +83,7 @@ describe('removeRepeatId', () => { linkId: 'test-item', type: 'boolean', text: 'Has triple negative breast cancer', - definition: - 'http://example.org/fhir/StructureDefinition/IsTNBCFeature#Observation.value[x]' + definition: 'http://example.org/fhir/StructureDefinition/IsTNBCFeature#Observation.value[x]' }; const qrItem: QuestionnaireResponseItem = { @@ -136,9 +135,7 @@ describe('removeRepeatId', () => { const result = removeInternalRepeatIdsRecursive(qItem, qrItem) as QuestionnaireResponseItem; - expect(result.definition).toBe( - 'http://example.org/fhir/StructureDefinition/IsTNBCFeature' - ); + expect(result.definition).toBe('http://example.org/fhir/StructureDefinition/IsTNBCFeature'); expect(result.item![0].definition).toBe( 'http://example.org/fhir/StructureDefinition/IsTNBCFeature#Observation.value[x]' ); From b4ed627b0fb2afc30ff6a9fe4f9fba9cb534200f Mon Sep 17 00:00:00 2001 From: Clinton Gillespie Date: Fri, 22 May 2026 10:36:39 +1000 Subject: [PATCH 6/7] change to include removeEmptyAnswers as well --- .../src/test/removeEmptyAnswers.test.ts | 47 +++++++++++++++++++ .../src/utils/removeEmptyAnswers.ts | 1 + 2 files changed, 48 insertions(+) diff --git a/packages/smart-forms-renderer/src/test/removeEmptyAnswers.test.ts b/packages/smart-forms-renderer/src/test/removeEmptyAnswers.test.ts index bbfb2c6f4..662630582 100644 --- a/packages/smart-forms-renderer/src/test/removeEmptyAnswers.test.ts +++ b/packages/smart-forms-renderer/src/test/removeEmptyAnswers.test.ts @@ -117,6 +117,53 @@ describe('removeEmptyAnswersFromItemRecursive', () => { expect(result).toEqual(qrItem); }); + it('should preserve definition from qItem when present', () => { + const qItem: QuestionnaireItem = { + linkId: 'test-item', + type: 'boolean', + text: 'Has triple negative breast cancer', + definition: 'http://example.org/fhir/StructureDefinition/IsTNBCFeature#Observation.value[x]' + }; + + const qrItem: QuestionnaireResponseItem = { + linkId: 'test-item', + definition: + 'http://example.org/fhir/StructureDefinition/IsTNBCFeature#Observation.value[x]', + text: 'Has triple negative breast cancer', + answer: [{ valueBoolean: true }] + }; + + mockQrItemHasItemsOrAnswer.mockReturnValue(true); + mockIsHiddenByEnableWhen.mockReturnValue(false); + + const result = removeEmptyAnswersFromItemRecursive(qItem, qrItem, enableWhenContext); + + expect((result as QuestionnaireResponseItem).definition).toBe( + 'http://example.org/fhir/StructureDefinition/IsTNBCFeature#Observation.value[x]' + ); + }); + + it('should not include definition property when qItem has none', () => { + const qItem: QuestionnaireItem = { + linkId: 'test-item', + type: 'string', + text: 'No definition here' + }; + + const qrItem: QuestionnaireResponseItem = { + linkId: 'test-item', + text: 'No definition here', + answer: [{ valueString: 'answer' }] + }; + + mockQrItemHasItemsOrAnswer.mockReturnValue(true); + mockIsHiddenByEnableWhen.mockReturnValue(false); + + const result = removeEmptyAnswersFromItemRecursive(qItem, qrItem, enableWhenContext); + + expect(result).not.toHaveProperty('definition'); + }); + it('should return null when item is hidden by enableWhen', () => { const qItem: QuestionnaireItem = { linkId: 'test-item', diff --git a/packages/smart-forms-renderer/src/utils/removeEmptyAnswers.ts b/packages/smart-forms-renderer/src/utils/removeEmptyAnswers.ts index 882a7f155..286dcd762 100644 --- a/packages/smart-forms-renderer/src/utils/removeEmptyAnswers.ts +++ b/packages/smart-forms-renderer/src/utils/removeEmptyAnswers.ts @@ -145,6 +145,7 @@ function removeEmptyAnswersFromItem( return { linkId: qItem.linkId, + ...(qItem.definition && { definition: qItem.definition }), ...(qItem.text && { text: qItem.text }), ...(childQrItems.length > 0 && { item: childQrItems }), ...(updatedAnswers.length > 0 && { answer: updatedAnswers }) From af564d73f268a3633fabbeb5d94f447117fc6a94 Mon Sep 17 00:00:00 2001 From: Clinton Gillespie Date: Fri, 22 May 2026 10:45:13 +1000 Subject: [PATCH 7/7] prettier --- .../smart-forms-renderer/src/test/removeEmptyAnswers.test.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/smart-forms-renderer/src/test/removeEmptyAnswers.test.ts b/packages/smart-forms-renderer/src/test/removeEmptyAnswers.test.ts index 662630582..ec7f26c06 100644 --- a/packages/smart-forms-renderer/src/test/removeEmptyAnswers.test.ts +++ b/packages/smart-forms-renderer/src/test/removeEmptyAnswers.test.ts @@ -127,8 +127,7 @@ describe('removeEmptyAnswersFromItemRecursive', () => { const qrItem: QuestionnaireResponseItem = { linkId: 'test-item', - definition: - 'http://example.org/fhir/StructureDefinition/IsTNBCFeature#Observation.value[x]', + definition: 'http://example.org/fhir/StructureDefinition/IsTNBCFeature#Observation.value[x]', text: 'Has triple negative breast cancer', answer: [{ valueBoolean: true }] };