@aehrc/smart-forms-renderer 0.23.1 → 0.24.1
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.
- package/lib/components/FormComponents/ChoiceItems/ChoiceRadioAnswerOptionView.d.ts +13 -0
- package/lib/components/FormComponents/ChoiceItems/ChoiceRadioAnswerOptionView.js +31 -0
- package/lib/components/FormComponents/ChoiceItems/ChoiceRadioAnswerOptionView.js.map +1 -0
- package/lib/components/FormComponents/ChoiceItems/ChoiceSelectAnswerOptionView.d.ts +13 -0
- package/lib/components/FormComponents/ChoiceItems/ChoiceSelectAnswerOptionView.js +31 -0
- package/lib/components/FormComponents/ChoiceItems/ChoiceSelectAnswerOptionView.js.map +1 -0
- package/lib/components/FormComponents/GroupItem/GroupItem.styles.d.ts +1 -1
- package/lib/components/FormComponents/ItemParts/ItemLabelText.js +7 -1
- package/lib/components/FormComponents/ItemParts/ItemLabelText.js.map +1 -1
- package/lib/hooks/useBooleanCalculatedExpression.d.ts +11 -0
- package/lib/hooks/useBooleanCalculatedExpression.js +47 -0
- package/lib/hooks/useBooleanCalculatedExpression.js.map +1 -0
- package/lib/hooks/useCodingCalculatedExpression.d.ts +11 -0
- package/lib/hooks/useCodingCalculatedExpression.js +51 -0
- package/lib/hooks/useCodingCalculatedExpression.js.map +1 -0
- package/lib/hooks/useDecimalCalculatedExpression.js +6 -2
- package/lib/hooks/useDecimalCalculatedExpression.js.map +1 -1
- package/lib/hooks/useDisplayCalculatedExpression.d.ts +3 -0
- package/lib/hooks/useDisplayCalculatedExpression.js +33 -0
- package/lib/hooks/useDisplayCalculatedExpression.js.map +1 -0
- package/lib/hooks/useIntegerCalculatedExpression.js +6 -2
- package/lib/hooks/useIntegerCalculatedExpression.js.map +1 -1
- package/lib/hooks/useStringCalculatedExpression.js +13 -5
- package/lib/hooks/useStringCalculatedExpression.js.map +1 -1
- package/lib/hooks/useValueSetCodings.js +1 -1
- package/lib/hooks/useValueSetCodings.js.map +1 -1
- package/lib/interfaces/calculatedExpression.interface.d.ts +1 -0
- package/lib/interfaces/questionnaireStore.interface.d.ts +1 -1
- package/lib/stores/questionnaireStore.d.ts +2 -2
- package/lib/utils/calculatedExpression.d.ts +5 -5
- package/lib/utils/calculatedExpression.js +43 -29
- package/lib/utils/calculatedExpression.js.map +1 -1
- package/lib/utils/enableWhen.js +11 -10
- package/lib/utils/enableWhen.js.map +1 -1
- package/lib/utils/fhirpath.d.ts +2 -2
- package/lib/utils/getExpressionsFromItem.d.ts +20 -0
- package/lib/utils/getExpressionsFromItem.js +90 -0
- package/lib/utils/getExpressionsFromItem.js.map +1 -0
- package/lib/utils/initialise.d.ts +2 -2
- package/lib/utils/itemControl.d.ts +1 -7
- package/lib/utils/itemControl.js +0 -20
- package/lib/utils/itemControl.js.map +1 -1
- package/lib/utils/questionnaireStoreUtils/extractOtherExtensions.d.ts +2 -14
- package/lib/utils/questionnaireStoreUtils/extractOtherExtensions.js +6 -46
- package/lib/utils/questionnaireStoreUtils/extractOtherExtensions.js.map +1 -1
- package/lib/utils/removeEmptyAnswers.js +3 -0
- package/lib/utils/removeEmptyAnswers.js.map +1 -1
- package/package.json +1 -1
- package/src/components/FormComponents/ItemParts/ItemLabelText.tsx +12 -1
- package/src/hooks/useDecimalCalculatedExpression.ts +8 -2
- package/src/hooks/useDisplayCalculatedExpression.ts +40 -0
- package/src/hooks/useIntegerCalculatedExpression.ts +8 -2
- package/src/hooks/useStringCalculatedExpression.ts +19 -5
- package/src/hooks/useValueSetCodings.ts +1 -1
- package/src/interfaces/calculatedExpression.interface.ts +1 -0
- package/src/interfaces/questionnaireStore.interface.ts +1 -1
- package/src/stores/questionnaireStore.ts +1 -1
- package/src/utils/calculatedExpression.ts +76 -60
- package/src/utils/enableWhen.ts +32 -10
- package/src/utils/fhirpath.ts +2 -2
- package/src/utils/getExpressionsFromItem.ts +96 -0
- package/src/utils/initialise.ts +2 -2
- package/src/utils/itemControl.ts +1 -21
- package/src/utils/questionnaireStoreUtils/extractOtherExtensions.ts +13 -50
- package/src/utils/removeEmptyAnswers.ts +4 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extractOtherExtensions.js","sourceRoot":"","sources":["../../../src/utils/questionnaireStoreUtils/extractOtherExtensions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;
|
|
1
|
+
{"version":3,"file":"extractOtherExtensions.js","sourceRoot":"","sources":["../../../src/utils/questionnaireStoreUtils/extractOtherExtensions.ts"],"names":[],"mappings":"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"}
|
|
@@ -112,6 +112,9 @@ function answerIsEmpty(qItem, qrItem, enableWhenIsActivated, enableWhenItems, en
|
|
|
112
112
|
if (!qrItem.answer) {
|
|
113
113
|
return true;
|
|
114
114
|
}
|
|
115
|
+
if (qrItem.answer.length === 0) {
|
|
116
|
+
return true;
|
|
117
|
+
}
|
|
115
118
|
if (((_a = qrItem.answer[0]) === null || _a === void 0 ? void 0 : _a.valueString) === '') {
|
|
116
119
|
return true;
|
|
117
120
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"removeEmptyAnswers.js","sourceRoot":"","sources":["../../src/utils/removeEmptyAnswers.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"removeEmptyAnswers.js","sourceRoot":"","sources":["../../src/utils/removeEmptyAnswers.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -22,6 +22,7 @@ import parse from 'html-react-parser';
|
|
|
22
22
|
import Box from '@mui/material/Box';
|
|
23
23
|
import ReactMarkdown from 'react-markdown';
|
|
24
24
|
import Typography from '@mui/material/Typography';
|
|
25
|
+
import useDisplayCalculatedExpression from '../../../hooks/useDisplayCalculatedExpression';
|
|
25
26
|
|
|
26
27
|
interface ItemLabelTextProps {
|
|
27
28
|
qItem: QuestionnaireItem;
|
|
@@ -31,6 +32,16 @@ interface ItemLabelTextProps {
|
|
|
31
32
|
const ItemLabelText = memo(function ItemLabelText(props: ItemLabelTextProps) {
|
|
32
33
|
const { qItem, readOnly } = props;
|
|
33
34
|
|
|
35
|
+
// Use calculatedExpressionString if available
|
|
36
|
+
const calculatedExpressionString = useDisplayCalculatedExpression(qItem);
|
|
37
|
+
if (calculatedExpressionString) {
|
|
38
|
+
return (
|
|
39
|
+
<Typography color={readOnly ? 'text.disabled' : 'text.primary'} sx={{ mt: 0.25 }}>
|
|
40
|
+
{calculatedExpressionString}
|
|
41
|
+
</Typography>
|
|
42
|
+
);
|
|
43
|
+
}
|
|
44
|
+
|
|
34
45
|
// parse xHTML if found
|
|
35
46
|
const xHtmlString = getXHtmlString(qItem);
|
|
36
47
|
|
|
@@ -38,7 +49,7 @@ const ItemLabelText = memo(function ItemLabelText(props: ItemLabelTextProps) {
|
|
|
38
49
|
return <Box>{parse(xHtmlString)}</Box>;
|
|
39
50
|
}
|
|
40
51
|
|
|
41
|
-
// parse
|
|
52
|
+
// parse markdown if found
|
|
42
53
|
const markdownString = getMarkdownString(qItem);
|
|
43
54
|
if (markdownString) {
|
|
44
55
|
return (
|
|
@@ -43,10 +43,16 @@ function useDecimalCalculatedExpression(
|
|
|
43
43
|
|
|
44
44
|
useEffect(
|
|
45
45
|
() => {
|
|
46
|
-
const calcExpression = calculatedExpressions[qItem.linkId]
|
|
46
|
+
const calcExpression = calculatedExpressions[qItem.linkId]?.find(
|
|
47
|
+
(exp) => exp.from === 'item'
|
|
48
|
+
);
|
|
49
|
+
|
|
50
|
+
if (!calcExpression) {
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
47
53
|
|
|
48
54
|
// only update if calculated value is different from current value
|
|
49
|
-
if (calcExpression
|
|
55
|
+
if (calcExpression.value !== inputValue && typeof calcExpression.value === 'number') {
|
|
50
56
|
const value = precision
|
|
51
57
|
? parseFloat(calcExpression.value.toFixed(precision))
|
|
52
58
|
: calcExpression.value;
|
|
@@ -0,0 +1,40 @@
|
|
|
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 { useQuestionnaireStore } from '../stores';
|
|
19
|
+
import type { QuestionnaireItem } from 'fhir/r4';
|
|
20
|
+
|
|
21
|
+
function useDisplayCalculatedExpression(qItem: QuestionnaireItem): string | null {
|
|
22
|
+
const calculatedExpressions = useQuestionnaireStore.use.calculatedExpressions();
|
|
23
|
+
|
|
24
|
+
const calcExpression = calculatedExpressions[qItem.linkId]?.find(
|
|
25
|
+
(exp) => exp.from === 'item._text'
|
|
26
|
+
);
|
|
27
|
+
if (!calcExpression) {
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
if (typeof calcExpression.value === 'string' || typeof calcExpression.value === 'number') {
|
|
32
|
+
return typeof calcExpression.value === 'string'
|
|
33
|
+
? calcExpression.value
|
|
34
|
+
: calcExpression.value.toString();
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export default useDisplayCalculatedExpression;
|
|
@@ -42,10 +42,16 @@ function useIntegerCalculatedExpression(
|
|
|
42
42
|
|
|
43
43
|
useEffect(
|
|
44
44
|
() => {
|
|
45
|
-
const calcExpression = calculatedExpressions[qItem.linkId]
|
|
45
|
+
const calcExpression = calculatedExpressions[qItem.linkId]?.find(
|
|
46
|
+
(exp) => exp.from === 'item'
|
|
47
|
+
);
|
|
48
|
+
|
|
49
|
+
if (!calcExpression) {
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
46
52
|
|
|
47
53
|
// only update if calculated value is different from current value
|
|
48
|
-
if (calcExpression
|
|
54
|
+
if (calcExpression.value !== inputValue && typeof calcExpression.value === 'number') {
|
|
49
55
|
// update ui to show calculated value changes
|
|
50
56
|
setCalcExpUpdated(true);
|
|
51
57
|
setTimeout(() => {
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
import { useEffect, useState } from 'react';
|
|
19
19
|
import { createEmptyQrItem } from '../utils/qrItem';
|
|
20
20
|
import type { QuestionnaireItem, QuestionnaireResponseItem } from 'fhir/r4';
|
|
21
|
-
import { useQuestionnaireStore } from '../stores
|
|
21
|
+
import { useQuestionnaireStore } from '../stores';
|
|
22
22
|
|
|
23
23
|
interface UseStringCalculatedExpression {
|
|
24
24
|
calcExpUpdated: boolean;
|
|
@@ -42,21 +42,35 @@ function useStringCalculatedExpression(
|
|
|
42
42
|
|
|
43
43
|
useEffect(
|
|
44
44
|
() => {
|
|
45
|
-
const calcExpression = calculatedExpressions[qItem.linkId]
|
|
45
|
+
const calcExpression = calculatedExpressions[qItem.linkId]?.find(
|
|
46
|
+
(exp) => exp.from === 'item'
|
|
47
|
+
);
|
|
48
|
+
|
|
49
|
+
if (!calcExpression) {
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
46
52
|
|
|
47
53
|
// only update if calculated value is different from current value
|
|
48
|
-
if (
|
|
54
|
+
if (
|
|
55
|
+
calcExpression.value !== inputValue &&
|
|
56
|
+
(typeof calcExpression.value === 'string' || typeof calcExpression.value === 'number')
|
|
57
|
+
) {
|
|
49
58
|
// update ui to show calculated value changes
|
|
50
59
|
setCalcExpUpdated(true);
|
|
51
60
|
setTimeout(() => {
|
|
52
61
|
setCalcExpUpdated(false);
|
|
53
62
|
}, 500);
|
|
54
63
|
|
|
64
|
+
const updatedInputValue =
|
|
65
|
+
typeof calcExpression.value === 'string'
|
|
66
|
+
? calcExpression.value
|
|
67
|
+
: calcExpression.value.toString();
|
|
68
|
+
|
|
55
69
|
// update questionnaireResponse
|
|
56
|
-
setInputValue(
|
|
70
|
+
setInputValue(updatedInputValue);
|
|
57
71
|
onQrItemChange({
|
|
58
72
|
...createEmptyQrItem(qItem),
|
|
59
|
-
answer: [{ valueString:
|
|
73
|
+
answer: [{ valueString: updatedInputValue }]
|
|
60
74
|
});
|
|
61
75
|
}
|
|
62
76
|
},
|
|
@@ -23,7 +23,7 @@ import {
|
|
|
23
23
|
getValueSetCodings,
|
|
24
24
|
getValueSetPromise
|
|
25
25
|
} from '../utils/valueSet';
|
|
26
|
-
import { getAnswerExpression } from '../utils/
|
|
26
|
+
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,7 +30,7 @@ export interface QuestionnaireModel {
|
|
|
30
30
|
launchContexts: Record<string, LaunchContext>;
|
|
31
31
|
enableWhenItems: EnableWhenItems;
|
|
32
32
|
enableWhenExpressions: EnableWhenExpressions;
|
|
33
|
-
calculatedExpressions: Record<string, CalculatedExpression>;
|
|
33
|
+
calculatedExpressions: Record<string, CalculatedExpression[]>;
|
|
34
34
|
answerExpressions: Record<string, AnswerExpression>;
|
|
35
35
|
processedValueSetCodings: Record<string, Coding[]>;
|
|
36
36
|
processedValueSetUrls: Record<string, string>;
|
|
@@ -57,7 +57,7 @@ interface QuestionnaireStoreType {
|
|
|
57
57
|
enableWhenLinkedQuestions: Record<string, string[]>;
|
|
58
58
|
enableWhenIsActivated: boolean;
|
|
59
59
|
enableWhenExpressions: EnableWhenExpressions;
|
|
60
|
-
calculatedExpressions: Record<string, CalculatedExpression>;
|
|
60
|
+
calculatedExpressions: Record<string, CalculatedExpression[]>;
|
|
61
61
|
answerExpressions: Record<string, AnswerExpression>;
|
|
62
62
|
processedValueSetCodings: Record<string, Coding[]>;
|
|
63
63
|
processedValueSetUrls: Record<string, string>;
|
|
@@ -37,7 +37,7 @@ import dayjs from 'dayjs';
|
|
|
37
37
|
|
|
38
38
|
interface EvaluateInitialCalculatedExpressionsParams {
|
|
39
39
|
initialResponse: QuestionnaireResponse;
|
|
40
|
-
calculatedExpressions: Record<string, CalculatedExpression>;
|
|
40
|
+
calculatedExpressions: Record<string, CalculatedExpression[]>;
|
|
41
41
|
variablesFhirPath: Record<string, Expression[]>;
|
|
42
42
|
existingFhirPathContext: Record<string, any>;
|
|
43
43
|
}
|
|
@@ -45,7 +45,7 @@ interface EvaluateInitialCalculatedExpressionsParams {
|
|
|
45
45
|
export function evaluateInitialCalculatedExpressions(
|
|
46
46
|
params: EvaluateInitialCalculatedExpressionsParams
|
|
47
47
|
): {
|
|
48
|
-
initialCalculatedExpressions: Record<string, CalculatedExpression>;
|
|
48
|
+
initialCalculatedExpressions: Record<string, CalculatedExpression[]>;
|
|
49
49
|
updatedFhirPathContext: Record<string, any>;
|
|
50
50
|
} {
|
|
51
51
|
const { initialResponse, calculatedExpressions, variablesFhirPath, existingFhirPathContext } =
|
|
@@ -62,7 +62,7 @@ export function evaluateInitialCalculatedExpressions(
|
|
|
62
62
|
};
|
|
63
63
|
}
|
|
64
64
|
|
|
65
|
-
const initialCalculatedExpressions: Record<string, CalculatedExpression> = {
|
|
65
|
+
const initialCalculatedExpressions: Record<string, CalculatedExpression[]> = {
|
|
66
66
|
...calculatedExpressions
|
|
67
67
|
};
|
|
68
68
|
const updatedFhirPathContext = createFhirPathContext(
|
|
@@ -72,23 +72,26 @@ export function evaluateInitialCalculatedExpressions(
|
|
|
72
72
|
);
|
|
73
73
|
|
|
74
74
|
for (const linkId in initialCalculatedExpressions) {
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
75
|
+
const itemCalcExpressions = calculatedExpressions[linkId];
|
|
76
|
+
|
|
77
|
+
for (const calcExpression of itemCalcExpressions) {
|
|
78
|
+
try {
|
|
79
|
+
const result = fhirpath.evaluate(
|
|
80
|
+
{},
|
|
81
|
+
calcExpression.expression,
|
|
82
|
+
updatedFhirPathContext,
|
|
83
|
+
fhirpath_r4_model
|
|
84
|
+
);
|
|
82
85
|
|
|
83
|
-
|
|
84
|
-
|
|
86
|
+
if (!_isEqual(calcExpression.value, result[0])) {
|
|
87
|
+
calcExpression.value = result[0];
|
|
88
|
+
}
|
|
89
|
+
} catch (e) {
|
|
90
|
+
console.warn(e.message, `LinkId: ${linkId}\nExpression: ${calcExpression.expression}`);
|
|
85
91
|
}
|
|
86
|
-
} catch (e) {
|
|
87
|
-
console.warn(
|
|
88
|
-
e.message,
|
|
89
|
-
`LinkId: ${linkId}\nExpression: ${calculatedExpressions[linkId].expression}`
|
|
90
|
-
);
|
|
91
92
|
}
|
|
93
|
+
|
|
94
|
+
initialCalculatedExpressions[linkId] = itemCalcExpressions;
|
|
92
95
|
}
|
|
93
96
|
|
|
94
97
|
return {
|
|
@@ -99,37 +102,40 @@ export function evaluateInitialCalculatedExpressions(
|
|
|
99
102
|
|
|
100
103
|
export function evaluateCalculatedExpressions(
|
|
101
104
|
fhirPathContext: Record<string, any>,
|
|
102
|
-
calculatedExpressions: Record<string, CalculatedExpression>
|
|
105
|
+
calculatedExpressions: Record<string, CalculatedExpression[]>
|
|
103
106
|
): {
|
|
104
107
|
calculatedExpsIsUpdated: boolean;
|
|
105
|
-
updatedCalculatedExpressions: Record<string, CalculatedExpression>;
|
|
108
|
+
updatedCalculatedExpressions: Record<string, CalculatedExpression[]>;
|
|
106
109
|
} {
|
|
107
|
-
const updatedCalculatedExpressions: Record<string, CalculatedExpression> = {
|
|
110
|
+
const updatedCalculatedExpressions: Record<string, CalculatedExpression[]> = {
|
|
108
111
|
...calculatedExpressions
|
|
109
112
|
};
|
|
110
113
|
|
|
111
114
|
let isUpdated = false;
|
|
112
115
|
for (const linkId in calculatedExpressions) {
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
116
|
+
const itemCalcExpressions = calculatedExpressions[linkId];
|
|
117
|
+
|
|
118
|
+
for (const calcExpression of itemCalcExpressions) {
|
|
119
|
+
try {
|
|
120
|
+
const result = fhirpath.evaluate(
|
|
121
|
+
{},
|
|
122
|
+
calcExpression.expression,
|
|
123
|
+
fhirPathContext,
|
|
124
|
+
fhirpath_r4_model
|
|
125
|
+
);
|
|
120
126
|
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
127
|
+
if (result.length > 0) {
|
|
128
|
+
if (!_isEqual(calcExpression.value, result[0])) {
|
|
129
|
+
isUpdated = true;
|
|
130
|
+
calcExpression.value = result[0];
|
|
131
|
+
}
|
|
125
132
|
}
|
|
133
|
+
} catch (e) {
|
|
134
|
+
console.warn(e.message, `LinkId: ${linkId}\nExpression: ${calcExpression.expression}`);
|
|
126
135
|
}
|
|
127
|
-
} catch (e) {
|
|
128
|
-
console.warn(
|
|
129
|
-
e.message,
|
|
130
|
-
`LinkId: ${linkId}\nExpression: ${calculatedExpressions[linkId].expression}`
|
|
131
|
-
);
|
|
132
136
|
}
|
|
137
|
+
|
|
138
|
+
updatedCalculatedExpressions[linkId] = itemCalcExpressions;
|
|
133
139
|
}
|
|
134
140
|
|
|
135
141
|
return {
|
|
@@ -141,17 +147,8 @@ export function evaluateCalculatedExpressions(
|
|
|
141
147
|
export function initialiseCalculatedExpressionValues(
|
|
142
148
|
questionnaire: Questionnaire,
|
|
143
149
|
populatedResponse: QuestionnaireResponse,
|
|
144
|
-
calculatedExpressions: Record<string, CalculatedExpression>
|
|
150
|
+
calculatedExpressions: Record<string, CalculatedExpression[]>
|
|
145
151
|
): QuestionnaireResponse {
|
|
146
|
-
const calculatedExpressionsWithValues = Object.keys(calculatedExpressions)
|
|
147
|
-
.filter((key) => calculatedExpressions[key].value !== undefined)
|
|
148
|
-
.reduce(
|
|
149
|
-
(mapping: Record<string, CalculatedExpression>, key: string) => (
|
|
150
|
-
(mapping[key] = calculatedExpressions[key]), mapping
|
|
151
|
-
),
|
|
152
|
-
{}
|
|
153
|
-
);
|
|
154
|
-
|
|
155
152
|
if (
|
|
156
153
|
!questionnaire.item ||
|
|
157
154
|
questionnaire.item.length === 0 ||
|
|
@@ -161,6 +158,19 @@ export function initialiseCalculatedExpressionValues(
|
|
|
161
158
|
return populatedResponse;
|
|
162
159
|
}
|
|
163
160
|
|
|
161
|
+
// Filter calculated expressions, only preserve key-value pairs with values
|
|
162
|
+
const calculatedExpressionsWithValues: Record<string, CalculatedExpression[]> = {};
|
|
163
|
+
for (const linkId in calculatedExpressions) {
|
|
164
|
+
const itemCalcExpressionsWithValues = calculatedExpressions[linkId].filter(
|
|
165
|
+
(calcExpression) => calcExpression.value !== undefined
|
|
166
|
+
);
|
|
167
|
+
|
|
168
|
+
if (itemCalcExpressionsWithValues.length > 0) {
|
|
169
|
+
calculatedExpressionsWithValues[linkId] = itemCalcExpressionsWithValues;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
// Populate calculated expression values into QR
|
|
164
174
|
const topLevelQrItems: QuestionnaireResponseItem[] = [];
|
|
165
175
|
for (const [index, topLevelQItem] of questionnaire.item.entries()) {
|
|
166
176
|
const populatedTopLevelQrItem = populatedResponse.item[index] ?? {
|
|
@@ -193,7 +203,7 @@ export function initialiseCalculatedExpressionValues(
|
|
|
193
203
|
function initialiseItemCalculatedExpressionValueRecursive(
|
|
194
204
|
qItem: QuestionnaireItem,
|
|
195
205
|
qrItem: QuestionnaireResponseItem | undefined,
|
|
196
|
-
calculatedExpressions: Record<string, CalculatedExpression>
|
|
206
|
+
calculatedExpressions: Record<string, CalculatedExpression[]>
|
|
197
207
|
): QuestionnaireResponseItem[] | QuestionnaireResponseItem | null {
|
|
198
208
|
const childQItems = qItem.item;
|
|
199
209
|
if (childQItems && childQItems.length > 0) {
|
|
@@ -245,16 +255,27 @@ function initialiseItemCalculatedExpressionValueRecursive(
|
|
|
245
255
|
return constructSingleItem(qItem, calculatedExpressions);
|
|
246
256
|
}
|
|
247
257
|
|
|
258
|
+
function getCalculatedExpressionAnswer(
|
|
259
|
+
qItem: QuestionnaireItem,
|
|
260
|
+
calculatedExpressions: Record<string, CalculatedExpression[]>
|
|
261
|
+
): QuestionnaireResponseItemAnswer | undefined {
|
|
262
|
+
const calcExpressionFromItem = calculatedExpressions[qItem.linkId]?.find(
|
|
263
|
+
(calcExpression) => calcExpression.from === 'item'
|
|
264
|
+
);
|
|
265
|
+
|
|
266
|
+
if (calcExpressionFromItem && calcExpressionFromItem.value) {
|
|
267
|
+
return parseValueToAnswer(qItem, calcExpressionFromItem.value);
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
return;
|
|
271
|
+
}
|
|
272
|
+
|
|
248
273
|
function constructGroupItem(
|
|
249
274
|
qItem: QuestionnaireItem,
|
|
250
275
|
qrItem: QuestionnaireResponseItem | undefined,
|
|
251
|
-
calculatedExpressions: Record<string, CalculatedExpression>
|
|
276
|
+
calculatedExpressions: Record<string, CalculatedExpression[]>
|
|
252
277
|
): QuestionnaireResponseItem | null {
|
|
253
|
-
const
|
|
254
|
-
let calculatedExpressionAnswer: QuestionnaireResponseItemAnswer | undefined;
|
|
255
|
-
if (itemCalculatedExpression && itemCalculatedExpression.value) {
|
|
256
|
-
calculatedExpressionAnswer = parseValueToAnswer(qItem, itemCalculatedExpression.value);
|
|
257
|
-
}
|
|
278
|
+
const calculatedExpressionAnswer = getCalculatedExpressionAnswer(qItem, calculatedExpressions);
|
|
258
279
|
|
|
259
280
|
// If group item has an existing answer, do not overwrite it with calculated expression value
|
|
260
281
|
if (qrItem?.answer && qrItem?.answer.length > 0) {
|
|
@@ -281,14 +302,9 @@ function constructGroupItem(
|
|
|
281
302
|
|
|
282
303
|
function constructSingleItem(
|
|
283
304
|
qItem: QuestionnaireItem,
|
|
284
|
-
calculatedExpressions: Record<string, CalculatedExpression>
|
|
305
|
+
calculatedExpressions: Record<string, CalculatedExpression[]>
|
|
285
306
|
): QuestionnaireResponseItem | null {
|
|
286
|
-
const
|
|
287
|
-
let calculatedExpressionAnswer: QuestionnaireResponseItemAnswer | undefined;
|
|
288
|
-
if (itemCalculatedExpression && itemCalculatedExpression.value) {
|
|
289
|
-
calculatedExpressionAnswer = parseValueToAnswer(qItem, itemCalculatedExpression.value);
|
|
290
|
-
}
|
|
291
|
-
|
|
307
|
+
const calculatedExpressionAnswer = getCalculatedExpressionAnswer(qItem, calculatedExpressions);
|
|
292
308
|
if (!calculatedExpressionAnswer) {
|
|
293
309
|
return null;
|
|
294
310
|
}
|
package/src/utils/enableWhen.ts
CHANGED
|
@@ -68,51 +68,73 @@ export function isEnabledAnswerTypeSwitcher(
|
|
|
68
68
|
enableWhen: QuestionnaireItemEnableWhen,
|
|
69
69
|
answer: QuestionnaireResponseItemAnswer
|
|
70
70
|
): boolean {
|
|
71
|
-
if (enableWhen
|
|
71
|
+
if (typeof enableWhen.answerBoolean === 'boolean' && enableWhen.operator === 'exists') {
|
|
72
72
|
return answerOperatorSwitcher(enableWhen.answerBoolean, answer, enableWhen.operator);
|
|
73
|
-
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
if (typeof enableWhen.answerBoolean === 'boolean' && typeof answer.valueBoolean === 'boolean') {
|
|
74
76
|
return answerOperatorSwitcher(
|
|
75
77
|
enableWhen.answerBoolean,
|
|
76
78
|
answer.valueBoolean,
|
|
77
79
|
enableWhen.operator
|
|
78
80
|
);
|
|
79
|
-
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
if (typeof enableWhen.answerDecimal === 'number' && typeof answer.valueDecimal === 'number') {
|
|
80
84
|
return answerOperatorSwitcher(
|
|
81
85
|
enableWhen.answerDecimal,
|
|
82
86
|
answer.valueDecimal,
|
|
83
87
|
enableWhen.operator
|
|
84
88
|
);
|
|
85
|
-
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
if (typeof enableWhen.answerInteger === 'number' && typeof answer.valueInteger === 'number') {
|
|
86
92
|
return answerOperatorSwitcher(
|
|
87
93
|
enableWhen.answerInteger,
|
|
88
94
|
answer.valueInteger,
|
|
89
95
|
enableWhen.operator
|
|
90
96
|
);
|
|
91
|
-
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
if (typeof enableWhen.answerDate === 'string' && typeof answer.valueDate === 'string') {
|
|
92
100
|
return answerOperatorSwitcher(enableWhen.answerDate, answer.valueDate, enableWhen.operator);
|
|
93
|
-
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
if (typeof enableWhen.answerDateTime === 'string' && typeof answer.valueDateTime === 'string') {
|
|
94
104
|
return answerOperatorSwitcher(
|
|
95
105
|
enableWhen.answerDateTime,
|
|
96
106
|
answer.valueDateTime,
|
|
97
107
|
enableWhen.operator
|
|
98
108
|
);
|
|
99
|
-
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
if (typeof enableWhen.answerTime === 'string' && typeof answer.valueTime === 'string') {
|
|
100
112
|
return answerOperatorSwitcher(enableWhen.answerTime, answer.valueTime, enableWhen.operator);
|
|
101
|
-
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
if (typeof enableWhen.answerString === 'string' && typeof answer.valueString === 'string') {
|
|
102
116
|
return answerOperatorSwitcher(enableWhen.answerString, answer.valueString, enableWhen.operator);
|
|
103
|
-
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
if (
|
|
120
|
+
typeof enableWhen.answerCoding?.code === 'string' &&
|
|
121
|
+
typeof answer.valueCoding?.code === 'string'
|
|
122
|
+
) {
|
|
104
123
|
return answerOperatorSwitcher(
|
|
105
124
|
enableWhen.answerCoding.code,
|
|
106
125
|
answer.valueCoding.code,
|
|
107
126
|
enableWhen.operator
|
|
108
127
|
);
|
|
109
|
-
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
if (enableWhen.answerQuantity && answer.valueQuantity) {
|
|
110
131
|
return answerOperatorSwitcher(
|
|
111
132
|
enableWhen.answerQuantity,
|
|
112
133
|
answer.valueQuantity,
|
|
113
134
|
enableWhen.operator
|
|
114
135
|
);
|
|
115
136
|
}
|
|
137
|
+
|
|
116
138
|
return false;
|
|
117
139
|
}
|
|
118
140
|
|
package/src/utils/fhirpath.ts
CHANGED
|
@@ -25,7 +25,7 @@ import { evaluateCalculatedExpressions } from './calculatedExpression';
|
|
|
25
25
|
|
|
26
26
|
interface EvaluateUpdatedExpressionsParams {
|
|
27
27
|
updatedResponse: QuestionnaireResponse;
|
|
28
|
-
calculatedExpressions: Record<string, CalculatedExpression>;
|
|
28
|
+
calculatedExpressions: Record<string, CalculatedExpression[]>;
|
|
29
29
|
enableWhenExpressions: EnableWhenExpressions;
|
|
30
30
|
variablesFhirPath: Record<string, Expression[]>;
|
|
31
31
|
existingFhirPathContext: Record<string, any>;
|
|
@@ -34,7 +34,7 @@ interface EvaluateUpdatedExpressionsParams {
|
|
|
34
34
|
export function evaluateUpdatedExpressions(params: EvaluateUpdatedExpressionsParams): {
|
|
35
35
|
isUpdated: boolean;
|
|
36
36
|
updatedEnableWhenExpressions: EnableWhenExpressions;
|
|
37
|
-
updatedCalculatedExpressions: Record<string, CalculatedExpression>;
|
|
37
|
+
updatedCalculatedExpressions: Record<string, CalculatedExpression[]>;
|
|
38
38
|
updatedFhirPathContext: Record<string, any>;
|
|
39
39
|
} {
|
|
40
40
|
const {
|