Skip to content

Commit a1bad69

Browse files
authored
Merge pull request aehrc#1778 from fongsean/issue/1774-revised
Issue/1774 revised
2 parents 2722198 + cc332a9 commit a1bad69

3 files changed

Lines changed: 35 additions & 11 deletions

File tree

packages/smart-forms-renderer/src/stores/questionnaireStore.ts

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ import type { Variables } from '../interfaces/variables.interface';
3939
import { processCalculatedExpressions } from '../utils/calculatedExpression';
4040
import { applyComputedUpdates } from '../utils/computedUpdates';
4141
import {
42+
assignPopulatedAnswersToEnableWhen,
4243
mutateRepeatEnableWhenItemInstances,
4344
updateEnableWhenItemAnswer
4445
} from '../utils/enableWhen';
@@ -441,6 +442,7 @@ export const questionnaireStore = createStore<QuestionnaireStoreType>()((set, ge
441442
442443
4. Re-run calculatedExpressions as a final step to ensure all calculations are up-to-date, incorporating any toggled options or dynamic value set changes.
443444
5. Update store state based on the expressions that changed
445+
6. (If initial update) Initialise enableWhen items
444446
*/
445447

446448
const {
@@ -450,6 +452,7 @@ export const questionnaireStore = createStore<QuestionnaireStoreType>()((set, ge
450452
variables,
451453
targetConstraints,
452454
answerOptionsToggleExpressions,
455+
enableWhenItems,
453456
enableWhenExpressions,
454457
processedValueSets,
455458
calculatedExpressions,
@@ -471,6 +474,8 @@ export const questionnaireStore = createStore<QuestionnaireStoreType>()((set, ge
471474
enableWhenExpressions?: EnableWhenExpressions;
472475
answerOptionsToggleExpressions?: Record<string, AnswerOptionsToggleExpression[]>;
473476
processedValueSets?: Record<string, ProcessedValueSet>;
477+
enableWhenItems?: EnableWhenItems;
478+
enableWhenLinkedQuestions?: Record<string, string[]>;
474479
}
475480
) {
476481
// Update QuestionnaireStore state
@@ -489,6 +494,12 @@ export const questionnaireStore = createStore<QuestionnaireStoreType>()((set, ge
489494
}),
490495
...(otherExpressions?.processedValueSets && {
491496
processedValueSets: otherExpressions.processedValueSets
497+
}),
498+
...(otherExpressions?.enableWhenItems && {
499+
enableWhenItems: otherExpressions.enableWhenItems
500+
}),
501+
...(otherExpressions?.enableWhenLinkedQuestions && {
502+
enableWhenLinkedQuestions: otherExpressions.enableWhenLinkedQuestions
492503
})
493504
}));
494505

@@ -573,6 +584,8 @@ export const questionnaireStore = createStore<QuestionnaireStoreType>()((set, ge
573584
enableWhenExpressions: EnableWhenExpressions;
574585
answerOptionsToggleExpressions: Record<string, AnswerOptionsToggleExpression[]>;
575586
processedValueSets: Record<string, ProcessedValueSet>;
587+
enableWhenItems: EnableWhenItems;
588+
enableWhenLinkedQuestions: Record<string, string[]>;
576589
}> = {};
577590
if (targetConstraintsUpdate.isUpdated) {
578591
otherExpressionsToUpdate.targetConstraints = targetConstraintsUpdate.value;
@@ -588,6 +601,16 @@ export const questionnaireStore = createStore<QuestionnaireStoreType>()((set, ge
588601
otherExpressionsToUpdate.processedValueSets = processedValueSetsUpdate.value;
589602
}
590603

604+
// Step 6: Evaluate enableWhen on the first update
605+
if (isInitialUpdate) {
606+
const {
607+
initialisedItems: initialisedEnableWhenItems,
608+
linkedQuestions: initialisedEnableWhenLinkedQuestions
609+
} = assignPopulatedAnswersToEnableWhen(enableWhenItems, lastUpdatedResponse);
610+
otherExpressionsToUpdate.enableWhenItems = initialisedEnableWhenItems;
611+
otherExpressionsToUpdate.enableWhenLinkedQuestions = initialisedEnableWhenLinkedQuestions;
612+
}
613+
591614
updateStoreState(
592615
lastUpdatedResponse,
593616
updatedCalculatedExpressions,

packages/smart-forms-renderer/src/test/manageForm.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -207,7 +207,7 @@ describe('manageForm utils', () => {
207207
expect(mockResetUrl).toHaveBeenCalledTimes(1);
208208
expect(mockBuildSourceQuestionnaire).toHaveBeenCalledWith(
209209
mockQuestionnaire,
210-
mockQuestionnaireResponse,
210+
undefined,
211211
undefined,
212212
undefined,
213213
false,
@@ -261,7 +261,7 @@ describe('manageForm utils', () => {
261261
expect(mockSetUrl).toHaveBeenCalledWith(terminologyServerUrl);
262262
expect(mockBuildSourceQuestionnaire).toHaveBeenCalledWith(
263263
mockQuestionnaire,
264-
mockQuestionnaireResponse,
264+
undefined,
265265
additionalContext,
266266
terminologyServerUrl,
267267
true,

packages/smart-forms-renderer/src/utils/manageForm.ts

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -116,26 +116,27 @@ export async function buildForm(params: BuildFormParams): Promise<void> {
116116
terminologyServerStore.getState().resetUrl();
117117
}
118118

119-
// Initialise an empty questionnaireResponse from a given questionnaire
120-
// Optionally takes in an existing questionnaireResponse to be initialised
121-
const initialisedQuestionnaireResponse = initialiseQuestionnaireResponse(
122-
questionnaire,
123-
questionnaireResponse
124-
);
125-
126-
// The buildSourceQuestionnaire function now takes the initialisedQuestionnaireResponse, which includes item.initial values from the Questionnaire.
119+
// QR is set to undefined here to prevent it from being initialised twice. This is defined like that for backward compatibility purposes.
120+
// Warning: setting the QR here breaks pre-pop. For initialisation logic, do it in questionnaireStore.getState().updateExpressions() with isInitialUpdate=true.
127121
await questionnaireStore
128122
.getState()
129123
.buildSourceQuestionnaire(
130124
questionnaire,
131-
initialisedQuestionnaireResponse,
125+
undefined,
132126
additionalContext,
133127
terminologyServerUrl,
134128
readOnly,
135129
qItemOverrideComponents,
136130
sdcUiOverrideComponents
137131
);
138132

133+
// Initialise an empty questionnaireResponse from a given questionnaire
134+
// Optionally takes in an existing questionnaireResponse to be initialised
135+
const initialisedQuestionnaireResponse = initialiseQuestionnaireResponse(
136+
questionnaire,
137+
questionnaireResponse
138+
);
139+
139140
// Set initialised QuestionnaireResponse as the source response in the store
140141
questionnaireResponseStore.getState().buildSourceResponse(initialisedQuestionnaireResponse);
141142

0 commit comments

Comments
 (0)