@aehrc/smart-forms-renderer 0.26.2 → 0.27.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. package/.storybook/main.ts +1 -2
  2. package/.storybook/preview.ts +1 -1
  3. package/lib/components/FormComponents/ChoiceItems/CheckboxFields.d.ts +11 -0
  4. package/lib/components/FormComponents/ChoiceItems/CheckboxFields.js +41 -0
  5. package/lib/components/FormComponents/ChoiceItems/CheckboxFields.js.map +1 -0
  6. package/lib/components/FormComponents/ChoiceItems/CheckboxOptionFields.d.ts +11 -0
  7. package/lib/components/FormComponents/ChoiceItems/CheckboxOptionFields.js +41 -0
  8. package/lib/components/FormComponents/ChoiceItems/CheckboxOptionFields.js.map +1 -0
  9. package/lib/components/FormComponents/ChoiceItems/CheckboxOptionList.d.ts +10 -0
  10. package/lib/components/FormComponents/ChoiceItems/CheckboxOptionList.js +36 -0
  11. package/lib/components/FormComponents/ChoiceItems/CheckboxOptionList.js.map +1 -0
  12. package/lib/components/FormComponents/ChoiceItems/ChoiceAutocompleteField.js +1 -1
  13. package/lib/components/FormComponents/ChoiceItems/ChoiceAutocompleteField.js.map +1 -1
  14. package/lib/components/FormComponents/ChoiceItems/ChoiceCheckboxAnswerValueSetView.d.ts +13 -0
  15. package/lib/components/FormComponents/ChoiceItems/ChoiceCheckboxAnswerValueSetView.js +46 -0
  16. package/lib/components/FormComponents/ChoiceItems/ChoiceCheckboxAnswerValueSetView.js.map +1 -0
  17. package/lib/components/FormComponents/ChoiceItems/ChoiceCheckboxFields.d.ts +11 -0
  18. package/lib/components/FormComponents/ChoiceItems/ChoiceCheckboxFields.js +41 -0
  19. package/lib/components/FormComponents/ChoiceItems/ChoiceCheckboxFields.js.map +1 -0
  20. package/lib/components/FormComponents/ChoiceItems/ChoiceSelectAnswerValueSetFields.js +1 -1
  21. package/lib/components/FormComponents/ChoiceItems/ChoiceSelectAnswerValueSetFields.js.map +1 -1
  22. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceAutocompleteField.js +1 -1
  23. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceAutocompleteField.js.map +1 -1
  24. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceCheckboxFields.d.ts +16 -0
  25. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceCheckboxFields.js +32 -0
  26. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceCheckboxFields.js.map +1 -0
  27. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerValueSetField.js +1 -1
  28. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerValueSetField.js.map +1 -1
  29. package/lib/components/StoryWrappers/BuildFormWrapper.d.ts +7 -0
  30. package/{src/stories/BaseRenderer.stories.tsx → lib/components/StoryWrappers/BuildFormWrapper.js} +24 -45
  31. package/lib/components/StoryWrappers/BuildFormWrapper.js.map +1 -0
  32. package/lib/hooks/useOpenLabel.d.ts +8 -0
  33. package/lib/hooks/useOpenLabel.js +34 -0
  34. package/lib/hooks/useOpenLabel.js.map +1 -0
  35. package/lib/hooks/useValueSetCodings.js +22 -6
  36. package/lib/hooks/useValueSetCodings.js.map +1 -1
  37. package/lib/interfaces/lookup.interface.d.ts +6 -0
  38. package/lib/interfaces/lookup.interface.js +18 -0
  39. package/lib/interfaces/lookup.interface.js.map +1 -0
  40. package/lib/utils/buildForm.d.ts +8 -0
  41. package/lib/utils/buildForm.js +26 -0
  42. package/lib/utils/buildForm.js.map +1 -0
  43. package/lib/utils/buildForms.d.ts +0 -0
  44. package/lib/utils/buildForms.js +2 -0
  45. package/lib/utils/buildForms.js.map +1 -0
  46. package/lib/utils/calculatedExpression.js +1 -1
  47. package/lib/utils/calculatedExpression.js.map +1 -1
  48. package/lib/utils/enableWhenExpression.d.ts +1 -0
  49. package/lib/utils/enableWhenExpression.js +4 -4
  50. package/lib/utils/enableWhenExpression.js.map +1 -1
  51. package/lib/utils/fhirpath.d.ts +1 -1
  52. package/lib/utils/fhirpath.js +6 -5
  53. package/lib/utils/fhirpath.js.map +1 -1
  54. package/lib/utils/initialise.js +5 -4
  55. package/lib/utils/initialise.js.map +1 -1
  56. package/lib/utils/questionnaireStoreUtils/addDisplayToCodings.d.ts +14 -0
  57. package/lib/utils/questionnaireStoreUtils/addDisplayToCodings.js +121 -0
  58. package/lib/utils/questionnaireStoreUtils/addDisplayToCodings.js.map +1 -0
  59. package/lib/utils/questionnaireStoreUtils/createQuestionaireModel.js +3 -0
  60. package/lib/utils/questionnaireStoreUtils/createQuestionaireModel.js.map +1 -1
  61. package/lib/utils/questionnaireStoreUtils/resolveValueSets.js +2 -2
  62. package/lib/utils/questionnaireStoreUtils/resolveValueSets.js.map +1 -1
  63. package/lib/utils/valueSet.d.ts +1 -1
  64. package/lib/utils/valueSet.js +1 -1
  65. package/lib/utils/valueSet.js.map +1 -1
  66. package/package.json +1 -1
  67. package/src/components/FormComponents/ChoiceItems/ChoiceAutocompleteField.tsx +1 -1
  68. package/src/components/FormComponents/ChoiceItems/ChoiceSelectAnswerValueSetFields.tsx +1 -1
  69. package/src/components/FormComponents/OpenChoiceItems/OpenChoiceAutocompleteField.tsx +3 -1
  70. package/src/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerValueSetField.tsx +3 -1
  71. package/src/hooks/useValueSetCodings.ts +12 -5
  72. package/src/{stories/assets/QStringItem.ts → interfaces/lookup.interface.ts} +6 -20
  73. package/src/utils/calculatedExpression.ts +2 -1
  74. package/src/utils/enableWhenExpression.ts +13 -4
  75. package/src/utils/fhirpath.ts +12 -6
  76. package/src/utils/initialise.ts +6 -4
  77. package/src/utils/questionnaireStoreUtils/addDisplayToCodings.ts +143 -0
  78. package/src/utils/questionnaireStoreUtils/createQuestionaireModel.ts +7 -0
  79. package/src/utils/questionnaireStoreUtils/resolveValueSets.ts +2 -2
  80. package/src/utils/valueSet.ts +1 -1
@@ -23,7 +23,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
23
23
  step((generator = generator.apply(thisArg, _arguments || [])).next());
24
24
  });
25
25
  };
26
- import { createValueSetToXFhirQueryVariableNameMap, getValueSetCodings, getValueSetPromise, resolvePromises } from '../valueSet';
26
+ import { createValueSetToXFhirQueryVariableNameMap, getValueSetCodings, getValueSetPromise, resolveValueSetPromises } from '../valueSet';
27
27
  export function resolveValueSets(variables, valueSetPromises, processedValueSetCodings, terminologyServerUrl) {
28
28
  return __awaiter(this, void 0, void 0, function* () {
29
29
  // Create a <valueSetUrl, XFhirQueryVariableName> map
@@ -36,7 +36,7 @@ export function resolveValueSets(variables, valueSetPromises, processedValueSetC
36
36
  }
37
37
  }
38
38
  // Resolve promises and store valueSet codings in preprocessedValueSetCodings AND XFhirQueryVariables
39
- const resolvedPromises = yield resolvePromises(valueSetPromises);
39
+ const resolvedPromises = yield resolveValueSetPromises(valueSetPromises);
40
40
  for (const valueSetUrl in resolvedPromises) {
41
41
  const valueSet = resolvedPromises[valueSetUrl].valueSet;
42
42
  if (valueSet) {
@@ -1 +1 @@
1
- {"version":3,"file":"resolveValueSets.js","sourceRoot":"","sources":["../../../src/utils/questionnaireStoreUtils/resolveValueSets.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;;;;;;;;;;AAGH,OAAO,EACL,yCAAyC,EACzC,kBAAkB,EAClB,kBAAkB,EAClB,eAAe,EAChB,MAAM,aAAa,CAAC;AAIrB,MAAM,UAAgB,gBAAgB,CACpC,SAAoB,EACpB,gBAAiD,EACjD,wBAAkD,EAClD,oBAA4B;;QAE5B,qDAAqD;QACrD,MAAM,mCAAmC,GACvC,yCAAyC,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;QAE3E,IAAI,MAAM,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE;YAC/D,KAAK,MAAM,WAAW,IAAI,mCAAmC,EAAE;gBAC7D,gBAAgB,CAAC,WAAW,CAAC,GAAG;oBAC9B,OAAO,EAAE,kBAAkB,CAAC,WAAW,EAAE,oBAAoB,CAAC;iBAC/D,CAAC;aACH;SACF;QAED,qGAAqG;QACrG,MAAM,gBAAgB,GAAG,MAAM,eAAe,CAAC,gBAAgB,CAAC,CAAC;QAEjE,KAAK,MAAM,WAAW,IAAI,gBAAgB,EAAE;YAC1C,MAAM,QAAQ,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC;YAExD,IAAI,QAAQ,EAAE;gBACZ,IAAI,mCAAmC,CAAC,WAAW,CAAC,EAAE;oBACpD,6DAA6D;oBAC7D,MAAM,YAAY,GAAG,mCAAmC,CAAC,WAAW,CAAC,CAAC;oBACtE,MAAM,QAAQ,GAAG,SAAS,CAAC,mBAAmB,CAAC,YAAY,CAAC,CAAC;oBAC7D,SAAS,CAAC,mBAAmB,CAAC,YAAY,CAAC,mCACtC,QAAQ,KACX,MAAM,EAAE,gBAAgB,CAAC,WAAW,CAAC,CAAC,QAAQ,GAC/C,CAAC;iBACH;qBAAM;oBACL,gFAAgF;oBAChF,wBAAwB,CAAC,WAAW,CAAC,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;iBACtE;aACF;SACF;QAED,OAAO,EAAE,SAAS,EAAE,wBAAwB,EAAE,CAAC;IACjD,CAAC;CAAA"}
1
+ {"version":3,"file":"resolveValueSets.js","sourceRoot":"","sources":["../../../src/utils/questionnaireStoreUtils/resolveValueSets.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;;;;;;;;;;AAGH,OAAO,EACL,yCAAyC,EACzC,kBAAkB,EAClB,kBAAkB,EAClB,uBAAuB,EACxB,MAAM,aAAa,CAAC;AAIrB,MAAM,UAAgB,gBAAgB,CACpC,SAAoB,EACpB,gBAAiD,EACjD,wBAAkD,EAClD,oBAA4B;;QAE5B,qDAAqD;QACrD,MAAM,mCAAmC,GACvC,yCAAyC,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;QAE3E,IAAI,MAAM,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE;YAC/D,KAAK,MAAM,WAAW,IAAI,mCAAmC,EAAE;gBAC7D,gBAAgB,CAAC,WAAW,CAAC,GAAG;oBAC9B,OAAO,EAAE,kBAAkB,CAAC,WAAW,EAAE,oBAAoB,CAAC;iBAC/D,CAAC;aACH;SACF;QAED,qGAAqG;QACrG,MAAM,gBAAgB,GAAG,MAAM,uBAAuB,CAAC,gBAAgB,CAAC,CAAC;QAEzE,KAAK,MAAM,WAAW,IAAI,gBAAgB,EAAE;YAC1C,MAAM,QAAQ,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC;YAExD,IAAI,QAAQ,EAAE;gBACZ,IAAI,mCAAmC,CAAC,WAAW,CAAC,EAAE;oBACpD,6DAA6D;oBAC7D,MAAM,YAAY,GAAG,mCAAmC,CAAC,WAAW,CAAC,CAAC;oBACtE,MAAM,QAAQ,GAAG,SAAS,CAAC,mBAAmB,CAAC,YAAY,CAAC,CAAC;oBAC7D,SAAS,CAAC,mBAAmB,CAAC,YAAY,CAAC,mCACtC,QAAQ,KACX,MAAM,EAAE,gBAAgB,CAAC,WAAW,CAAC,CAAC,QAAQ,GAC/C,CAAC;iBACH;qBAAM;oBACL,gFAAgF;oBAChF,wBAAwB,CAAC,WAAW,CAAC,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;iBACtE;aACF;SACF;QAED,OAAO,EAAE,SAAS,EAAE,wBAAwB,EAAE,CAAC;IACjD,CAAC;CAAA"}
@@ -4,7 +4,7 @@ import type { VariableXFhirQuery } from '../interfaces/variables.interface';
4
4
  import type { ValueSetPromise } from '../interfaces/valueSet.interface';
5
5
  export declare function getTerminologyServerUrl(qItem: QuestionnaireItem): string | undefined;
6
6
  export declare function getValueSetPromise(url: string, terminologyServerUrl: string): Promise<ValueSet>;
7
- export declare function resolvePromises(valueSetPromises: Record<string, ValueSetPromise>): Promise<Record<string, ValueSetPromise>>;
7
+ export declare function resolveValueSetPromises(valueSetPromises: Record<string, ValueSetPromise>): Promise<Record<string, ValueSetPromise>>;
8
8
  /**
9
9
  * Sets an array of codings with the values from a valueSet
10
10
  *
@@ -57,7 +57,7 @@ function addTimeoutToPromise(promise, timeoutMs) {
57
57
  return Promise.race([promise, timeoutPromise]);
58
58
  });
59
59
  }
60
- export function resolvePromises(valueSetPromises) {
60
+ export function resolveValueSetPromises(valueSetPromises) {
61
61
  return __awaiter(this, void 0, void 0, function* () {
62
62
  const newValueSetPromises = {};
63
63
  const valueSetPromiseKeys = Object.keys(valueSetPromises);
@@ -1 +1 @@
1
- {"version":3,"file":"valueSet.js","sourceRoot":"","sources":["../../src/utils/valueSet.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"valueSet.js","sourceRoot":"","sources":["../../src/utils/valueSet.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aehrc/smart-forms-renderer",
3
- "version": "0.26.2",
3
+ "version": "0.27.0",
4
4
  "description": "FHIR Structured Data Captured (SDC) rendering engine for Smart Forms",
5
5
  "main": "lib/index.js",
6
6
  "scripts": {
@@ -67,7 +67,7 @@ function ChoiceAutocompleteField(props: ChoiceAutocompleteFieldsProps) {
67
67
  id={qItem.id}
68
68
  value={valueCoding ?? null}
69
69
  options={options}
70
- getOptionLabel={(option) => `${option.display}`}
70
+ getOptionLabel={(option) => option.display ?? `${option.code}`}
71
71
  isOptionEqualToValue={(option, value) => option.id === value.id}
72
72
  disabled={readOnly}
73
73
  loading={loading}
@@ -56,7 +56,7 @@ function ChoiceSelectAnswerValueSetFields(props: ChoiceSelectAnswerValueSetField
56
56
  <Autocomplete
57
57
  id={qItem.id}
58
58
  options={codings}
59
- getOptionLabel={(option) => `${option.display}`}
59
+ getOptionLabel={(option) => option.display ?? `${option.code}`}
60
60
  value={valueCoding ?? null}
61
61
  onChange={(_, newValue) => onSelectChange(newValue)}
62
62
  openOnFocus
@@ -73,7 +73,9 @@ function OpenChoiceAutocompleteField(props: OpenChoiceAutocompleteFieldProps) {
73
73
  id={qItem.id}
74
74
  value={valueAutocomplete}
75
75
  options={options}
76
- getOptionLabel={(option) => (typeof option === 'string' ? option : `${option.display}`)}
76
+ getOptionLabel={(option) =>
77
+ typeof option === 'string' ? option : option.display ?? `${option.code}`
78
+ }
77
79
  disabled={readOnly}
78
80
  loading={loading}
79
81
  loadingText={'Fetching results...'}
@@ -33,7 +33,9 @@ function OpenChoiceSelectAnswerValueSetField(props: OpenChoiceSelectAnswerValueS
33
33
  id={qItem.id}
34
34
  value={valueSelect ?? null}
35
35
  options={options}
36
- getOptionLabel={(option) => (typeof option === 'string' ? option : `${option.display}`)}
36
+ getOptionLabel={(option) =>
37
+ typeof option === 'string' ? option : option.display ?? `${option.code}`
38
+ }
37
39
  onChange={(_, newValue) => onValueChange(newValue)}
38
40
  onInputChange={(_, newValue) => onValueChange(newValue)}
39
41
  freeSolo
@@ -27,6 +27,7 @@ import { getAnswerExpression } from '../utils/getExpressionsFromItem';
27
27
  import fhirpath from 'fhirpath';
28
28
  import fhirpath_r4_model from 'fhirpath/fhir-context/r4';
29
29
  import { useQuestionnaireStore, useSmartConfigStore, useTerminologyServerStore } from '../stores';
30
+ import { addDisplayToCodingArray } from '../utils/questionnaireStoreUtils/addDisplayToCodings';
30
31
 
31
32
  export interface TerminologyError {
32
33
  error: Error | null;
@@ -140,12 +141,18 @@ function useValueSetCodings(qItem: QuestionnaireItem): {
140
141
  const promise = getValueSetPromise(valueSetUrl, terminologyServerUrl);
141
142
  if (promise) {
142
143
  promise
143
- .then((valueSet: ValueSet) => {
144
+ .then(async (valueSet: ValueSet) => {
144
145
  const codings = getValueSetCodings(valueSet);
145
- if (codings.length > 0) {
146
- addCodingToCache(valueSetUrl, codings);
147
- setCodings(codings);
148
- }
146
+ addDisplayToCodingArray(codings, terminologyServerUrl)
147
+ .then((codingsWithDisplay) => {
148
+ if (codingsWithDisplay.length > 0) {
149
+ addCodingToCache(valueSetUrl, codingsWithDisplay);
150
+ setCodings(codings);
151
+ }
152
+ })
153
+ .catch((error: Error) => {
154
+ setServerError(error);
155
+ });
149
156
  })
150
157
  .catch((error: Error) => {
151
158
  setServerError(error);
@@ -15,24 +15,10 @@
15
15
  * limitations under the License.
16
16
  */
17
17
 
18
- import type { Questionnaire } from 'fhir/r4';
18
+ import type { Coding } from 'fhir/r4';
19
19
 
20
- export const QStringItem: Questionnaire = {
21
- resourceType: 'Questionnaire',
22
- id: 'StringComponent',
23
- name: 'StringComponent',
24
- title: 'String Component',
25
- version: '0.1.0',
26
- status: 'draft',
27
- publisher: 'AEHRC CSIRO',
28
- date: '2024-05-01',
29
- url: 'https://smartforms.csiro.au/docs/components/string',
30
- item: [
31
- {
32
- linkId: 'name',
33
- type: 'string',
34
- repeats: false,
35
- text: 'Name'
36
- }
37
- ]
38
- };
20
+ export interface CodeSystemLookupPromise {
21
+ promise: Promise<Parameters<any>>;
22
+ oldCoding: Coding;
23
+ newCoding?: Coding;
24
+ }
@@ -75,7 +75,8 @@ export function evaluateInitialCalculatedExpressions(
75
75
  const updatedFhirPathContext = createFhirPathContext(
76
76
  initialResponse,
77
77
  initialResponseItemMap,
78
- variablesFhirPath
78
+ variablesFhirPath,
79
+ existingFhirPathContext
79
80
  );
80
81
 
81
82
  for (const linkId in initialCalculatedExpressions) {
@@ -30,6 +30,7 @@ interface EvaluateInitialEnableWhenExpressionsParams {
30
30
  initialResponseItemMap: Record<string, QuestionnaireResponseItem[]>;
31
31
  enableWhenExpressions: EnableWhenExpressions;
32
32
  variablesFhirPath: Record<string, Expression[]>;
33
+ existingFhirPathContext: Record<string, any>;
33
34
  }
34
35
 
35
36
  export function evaluateInitialEnableWhenExpressions(
@@ -38,8 +39,13 @@ export function evaluateInitialEnableWhenExpressions(
38
39
  initialEnableWhenExpressions: EnableWhenExpressions;
39
40
  updatedFhirPathContext: Record<string, any>;
40
41
  } {
41
- const { initialResponse, initialResponseItemMap, enableWhenExpressions, variablesFhirPath } =
42
- params;
42
+ const {
43
+ initialResponse,
44
+ initialResponseItemMap,
45
+ enableWhenExpressions,
46
+ variablesFhirPath,
47
+ existingFhirPathContext
48
+ } = params;
43
49
 
44
50
  const initialEnableWhenExpressions: EnableWhenExpressions = {
45
51
  ...enableWhenExpressions
@@ -47,7 +53,8 @@ export function evaluateInitialEnableWhenExpressions(
47
53
  const updatedFhirPathContext = createFhirPathContext(
48
54
  initialResponse,
49
55
  initialResponseItemMap,
50
- variablesFhirPath
56
+ variablesFhirPath,
57
+ existingFhirPathContext
51
58
  );
52
59
 
53
60
  const initialEnableWhenSingleExpressions = evaluateEnableWhenSingleExpressions(
@@ -273,6 +280,7 @@ export function mutateRepeatEnableWhenExpressionInstances(
273
280
  questionnaireResponse,
274
281
  questionnaireResponseItemMap,
275
282
  variablesFhirPath,
283
+ existingFhirPathContext,
276
284
  enableWhenExpressions,
277
285
  parentRepeatGroupLinkId,
278
286
  parentRepeatGroupIndex,
@@ -284,7 +292,8 @@ export function mutateRepeatEnableWhenExpressionInstances(
284
292
  const updatedFhirPathContext = createFhirPathContext(
285
293
  questionnaireResponse,
286
294
  questionnaireResponseItemMap,
287
- variablesFhirPath
295
+ variablesFhirPath,
296
+ existingFhirPathContext
288
297
  );
289
298
 
290
299
  let isUpdated = false;
@@ -62,7 +62,8 @@ export function evaluateUpdatedExpressions(params: EvaluateUpdatedExpressionsPar
62
62
  const updatedFhirPathContext = createFhirPathContext(
63
63
  updatedResponse,
64
64
  updatedResponseItemMap,
65
- variablesFhirPath
65
+ variablesFhirPath,
66
+ existingFhirPathContext
66
67
  );
67
68
 
68
69
  // Update enableWhenExpressions
@@ -90,15 +91,20 @@ export function evaluateUpdatedExpressions(params: EvaluateUpdatedExpressionsPar
90
91
  export function createFhirPathContext(
91
92
  questionnaireResponse: QuestionnaireResponse,
92
93
  questionnaireResponseItemMap: Record<string, QuestionnaireResponseItem[]>,
93
- variablesFhirPath: Record<string, Expression[]>
94
+ variablesFhirPath: Record<string, Expression[]>,
95
+ existingFhirPathContext: Record<string, any>
94
96
  ): Record<string, any> {
97
+ // Add latest resource to fhirPathContext
98
+ let fhirPathContext: Record<string, any> = {
99
+ ...existingFhirPathContext,
100
+ resource: questionnaireResponse
101
+ };
102
+
103
+ // Exit early if there are no QR items
95
104
  if (!questionnaireResponse.item) {
96
- return {};
105
+ return fhirPathContext;
97
106
  }
98
107
 
99
- // Add latest resource to fhirPathContext
100
- let fhirPathContext: Record<string, any> = { resource: questionnaireResponse };
101
-
102
108
  // Evaluate resource-level variables
103
109
  fhirPathContext = evaluateQuestionnaireLevelVariables(
104
110
  questionnaireResponse,
@@ -344,10 +344,11 @@ export function initialiseFormFromResponse(params: initialFormFromResponseParams
344
344
  enableWhenExpressions,
345
345
  calculatedExpressions,
346
346
  variablesFhirPath,
347
- tabs
347
+ tabs,
348
+ fhirPathContext
348
349
  } = params;
349
350
  const initialResponseItemMap = createQuestionnaireResponseItemMap(questionnaireResponse);
350
- let updatedFhirPathContext = params.fhirPathContext;
351
+ let updatedFhirPathContext = {};
351
352
 
352
353
  const { initialisedItems, linkedQuestions } = assignPopulatedAnswersToEnableWhen(
353
354
  enableWhenItems,
@@ -358,7 +359,8 @@ export function initialiseFormFromResponse(params: initialFormFromResponseParams
358
359
  initialResponse: questionnaireResponse,
359
360
  initialResponseItemMap: initialResponseItemMap,
360
361
  enableWhenExpressions: enableWhenExpressions,
361
- variablesFhirPath: variablesFhirPath
362
+ variablesFhirPath: variablesFhirPath,
363
+ existingFhirPathContext: fhirPathContext
362
364
  });
363
365
  const { initialEnableWhenExpressions } = evaluateInitialEnableWhenExpressionsResult;
364
366
  updatedFhirPathContext = evaluateInitialEnableWhenExpressionsResult.updatedFhirPathContext;
@@ -368,7 +370,7 @@ export function initialiseFormFromResponse(params: initialFormFromResponseParams
368
370
  initialResponseItemMap: initialResponseItemMap,
369
371
  calculatedExpressions: calculatedExpressions,
370
372
  variablesFhirPath: variablesFhirPath,
371
- existingFhirPathContext: updatedFhirPathContext
373
+ existingFhirPathContext: fhirPathContext
372
374
  });
373
375
  const { initialCalculatedExpressions } = evaluateInitialCalculatedExpressionsResult;
374
376
  updatedFhirPathContext = evaluateInitialEnableWhenExpressionsResult.updatedFhirPathContext;
@@ -0,0 +1,143 @@
1
+ /*
2
+ * Copyright 2024 Commonwealth Scientific and Industrial Research
3
+ * Organisation (CSIRO) ABN 41 687 119 230.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
18
+ import type { Coding } from 'fhir/r4';
19
+ import type { CodeSystemLookupPromise } from '../../interfaces/lookup.interface';
20
+ import * as FHIR from 'fhirclient';
21
+
22
+ // Use this for QuestionnaireStore.ProcessedCodings
23
+ export async function addDisplayToProcessedCodings(
24
+ processedCodings: Record<string, Coding[]>,
25
+ terminologyServerUrl: string
26
+ ): Promise<Record<string, Coding[]>> {
27
+ // Store code system lookup promises for codings without displays
28
+ const codeSystemLookupPromises: Record<string, CodeSystemLookupPromise> = {};
29
+ for (const key in processedCodings) {
30
+ const codings = processedCodings[key];
31
+ for (const coding of codings) {
32
+ if (!coding.display) {
33
+ const query = `system=${coding.system}&code=${coding.code}`;
34
+ codeSystemLookupPromises[query] = {
35
+ promise: getCodeSystemLookupPromise(query, terminologyServerUrl),
36
+ oldCoding: coding
37
+ };
38
+ }
39
+ }
40
+ }
41
+
42
+ // Resolves lookup promises in one go and assign newCodings to processedCodings
43
+ const resolvedCodeSystemLookupPromises = await resolveLookupPromises(codeSystemLookupPromises);
44
+ for (const key in processedCodings) {
45
+ const codings = processedCodings[key];
46
+
47
+ for (const coding of codings) {
48
+ const lookUpKey = `system=${coding.system}&code=${coding.code}`;
49
+ const resolvedLookup = resolvedCodeSystemLookupPromises[lookUpKey];
50
+ if (resolvedLookup?.newCoding?.display) {
51
+ coding.display = resolvedLookup.newCoding.display;
52
+ }
53
+ }
54
+ }
55
+
56
+ return processedCodings;
57
+ }
58
+
59
+ // Use this for an array of codings
60
+ export async function addDisplayToCodingArray(
61
+ codings: Coding[],
62
+ terminologyServerUrl: string
63
+ ): Promise<Coding[]> {
64
+ // Store code system lookup promises for codings without displays
65
+ const codeSystemLookupPromises: Record<string, CodeSystemLookupPromise> = {};
66
+ for (const coding of codings) {
67
+ if (!coding.display) {
68
+ const query = `system=${coding.system}&code=${coding.code}`;
69
+ codeSystemLookupPromises[query] = {
70
+ promise: getCodeSystemLookupPromise(query, terminologyServerUrl),
71
+ oldCoding: coding
72
+ };
73
+ }
74
+ }
75
+
76
+ // Resolves lookup promises in one go and assign newCodings to processedCodings
77
+ const resolvedCodeSystemLookupPromises = await resolveLookupPromises(codeSystemLookupPromises);
78
+ for (const coding of codings) {
79
+ const lookUpKey = `system=${coding.system}&code=${coding.code}`;
80
+ const resolvedLookup = resolvedCodeSystemLookupPromises[lookUpKey];
81
+ if (resolvedLookup?.newCoding?.display) {
82
+ coding.display = resolvedLookup.newCoding.display;
83
+ }
84
+ }
85
+
86
+ return codings;
87
+ }
88
+
89
+ export function getCodeSystemLookupPromise(query: string, terminologyServerUrl: string) {
90
+ return FHIR.client({ serverUrl: terminologyServerUrl }).request({
91
+ url: `CodeSystem/$lookup?${query}`
92
+ });
93
+ }
94
+
95
+ export async function resolveLookupPromises(
96
+ codeSystemLookupPromises: Record<string, CodeSystemLookupPromise>
97
+ ): Promise<Record<string, CodeSystemLookupPromise>> {
98
+ const newCodeSystemLookupPromises: Record<string, CodeSystemLookupPromise> = {};
99
+
100
+ const lookupPromiseKeys = Object.keys(codeSystemLookupPromises);
101
+ const lookupPromiseValues = Object.values(codeSystemLookupPromises);
102
+
103
+ const promises = lookupPromiseValues.map((lookupPromise) => lookupPromise.promise);
104
+ const lookupResults = await Promise.all(promises);
105
+
106
+ for (const [i, lookupResult] of lookupResults.entries()) {
107
+ if (!lookupResponseIsValid(lookupResult)) {
108
+ continue;
109
+ }
110
+
111
+ const key = lookupPromiseKeys[i];
112
+ const lookupPromise = lookupPromiseValues[i];
113
+
114
+ if (key && lookupPromise) {
115
+ lookupPromise.newCoding = {
116
+ ...lookupPromise.oldCoding,
117
+ display: lookupResult.parameter.find((p) => p.name === 'display')?.valueString ?? undefined
118
+ };
119
+ newCodeSystemLookupPromises[key] = lookupPromise;
120
+ }
121
+ }
122
+
123
+ return newCodeSystemLookupPromises;
124
+ }
125
+
126
+ export interface LookupResponse {
127
+ parameter: [DisplayParameter];
128
+ }
129
+
130
+ export interface DisplayParameter {
131
+ name: 'display';
132
+ valueString: string;
133
+ }
134
+
135
+ export function lookupResponseIsValid(response: any): response is LookupResponse {
136
+ return (
137
+ response &&
138
+ response.resourceType === 'Parameters' &&
139
+ response.parameter &&
140
+ response.parameter.find((p: any) => p.name === 'display') &&
141
+ response.parameter.find((p: any) => p.name === 'display').valueString
142
+ );
143
+ }
@@ -28,6 +28,7 @@ import type { Variables } from '../../interfaces/variables.interface';
28
28
  import { resolveValueSets } from './resolveValueSets';
29
29
  import { addAdditionalVariables } from './addAdditionalVariables';
30
30
  import { getLinkIdTypeTuples } from '../qItem';
31
+ import { addDisplayToProcessedCodings } from './addDisplayToCodings';
31
32
 
32
33
  export async function createQuestionnaireModel(
33
34
  questionnaire: Questionnaire,
@@ -76,6 +77,12 @@ export async function createQuestionnaireModel(
76
77
  variables = resolveValueSetsResult.variables;
77
78
  processedValueSetCodings = resolveValueSetsResult.processedValueSetCodings;
78
79
 
80
+ // In processedCodings, add display values to codings lacking them
81
+ processedValueSetCodings = await addDisplayToProcessedCodings(
82
+ processedValueSetCodings,
83
+ terminologyServerUrl
84
+ );
85
+
79
86
  return {
80
87
  itemTypes,
81
88
  tabs,
@@ -20,7 +20,7 @@ import {
20
20
  createValueSetToXFhirQueryVariableNameMap,
21
21
  getValueSetCodings,
22
22
  getValueSetPromise,
23
- resolvePromises
23
+ resolveValueSetPromises
24
24
  } from '../valueSet';
25
25
  import type { Variables } from '../../interfaces/variables.interface';
26
26
  import type { ValueSetPromise } from '../../interfaces/valueSet.interface';
@@ -44,7 +44,7 @@ export async function resolveValueSets(
44
44
  }
45
45
 
46
46
  // Resolve promises and store valueSet codings in preprocessedValueSetCodings AND XFhirQueryVariables
47
- const resolvedPromises = await resolvePromises(valueSetPromises);
47
+ const resolvedPromises = await resolveValueSetPromises(valueSetPromises);
48
48
 
49
49
  for (const valueSetUrl in resolvedPromises) {
50
50
  const valueSet = resolvedPromises[valueSetUrl].valueSet;
@@ -74,7 +74,7 @@ async function addTimeoutToPromise(promise: Promise<any>, timeoutMs: number) {
74
74
  return Promise.race([promise, timeoutPromise]);
75
75
  }
76
76
 
77
- export async function resolvePromises(
77
+ export async function resolveValueSetPromises(
78
78
  valueSetPromises: Record<string, ValueSetPromise>
79
79
  ): Promise<Record<string, ValueSetPromise>> {
80
80
  const newValueSetPromises: Record<string, ValueSetPromise> = {};