@aehrc/smart-forms-renderer 0.25.2 → 0.26.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.
- package/lib/components/FormComponents/BooleanItem/BooleanItem.js +6 -1
- package/lib/components/FormComponents/BooleanItem/BooleanItem.js.map +1 -1
- package/lib/components/FormComponents/ChoiceItems/ChoiceRadioAnswerOptionItem.js +5 -2
- package/lib/components/FormComponents/ChoiceItems/ChoiceRadioAnswerOptionItem.js.map +1 -1
- package/lib/components/FormComponents/ChoiceItems/ChoiceRadioAnswerValueSetItem.js +5 -2
- package/lib/components/FormComponents/ChoiceItems/ChoiceRadioAnswerValueSetItem.js.map +1 -1
- package/lib/components/FormComponents/ChoiceItems/ChoiceSelectAnswerOptionItem.js +5 -2
- package/lib/components/FormComponents/ChoiceItems/ChoiceSelectAnswerOptionItem.js.map +1 -1
- package/lib/components/FormComponents/ChoiceItems/ChoiceSelectAnswerValueSetItem.js +5 -2
- package/lib/components/FormComponents/ChoiceItems/ChoiceSelectAnswerValueSetItem.js.map +1 -1
- package/lib/components/FormComponents/DecimalItem/DecimalItem.js +9 -3
- package/lib/components/FormComponents/DecimalItem/DecimalItem.js.map +1 -1
- package/lib/components/FormComponents/IntegerItem/IntegerItem.js +7 -3
- package/lib/components/FormComponents/IntegerItem/IntegerItem.js.map +1 -1
- package/lib/components/FormComponents/StringItem/StringItem.js +7 -3
- package/lib/components/FormComponents/StringItem/StringItem.js.map +1 -1
- package/lib/components/FormComponents/TextItem/TextItem.js +7 -3
- package/lib/components/FormComponents/TextItem/TextItem.js.map +1 -1
- package/lib/hooks/useBooleanCalculatedExpression.d.ts +5 -4
- package/lib/hooks/useBooleanCalculatedExpression.js +12 -7
- package/lib/hooks/useBooleanCalculatedExpression.js.map +1 -1
- package/lib/hooks/useCodingCalculatedExpression.d.ts +4 -3
- package/lib/hooks/useCodingCalculatedExpression.js +14 -7
- package/lib/hooks/useCodingCalculatedExpression.js.map +1 -1
- package/lib/hooks/useDecimalCalculatedExpression.d.ts +3 -3
- package/lib/hooks/useDecimalCalculatedExpression.js +11 -7
- package/lib/hooks/useDecimalCalculatedExpression.js.map +1 -1
- package/lib/hooks/useDisplayCalculatedExpression.js +8 -1
- package/lib/hooks/useDisplayCalculatedExpression.js.map +1 -1
- package/lib/hooks/useIntegerCalculatedExpression.d.ts +3 -3
- package/lib/hooks/useIntegerCalculatedExpression.js +11 -7
- package/lib/hooks/useIntegerCalculatedExpression.js.map +1 -1
- package/lib/hooks/useStringCalculatedExpression.d.ts +3 -3
- package/lib/hooks/useStringCalculatedExpression.js +12 -7
- package/lib/hooks/useStringCalculatedExpression.js.map +1 -1
- package/lib/interfaces/calculatedExpression.interface.d.ts +1 -1
- package/lib/stores/questionnaireResponseStore.d.ts +3 -1
- package/lib/stores/questionnaireResponseStore.js +9 -1
- package/lib/stores/questionnaireResponseStore.js.map +1 -1
- package/lib/stores/questionnaireStore.js +6 -0
- package/lib/stores/questionnaireStore.js.map +1 -1
- package/lib/utils/calculatedExpression.d.ts +2 -1
- package/lib/utils/calculatedExpression.js +14 -8
- package/lib/utils/calculatedExpression.js.map +1 -1
- package/lib/utils/enableWhenExpression.d.ts +3 -2
- package/lib/utils/enableWhenExpression.js +15 -5
- package/lib/utils/enableWhenExpression.js.map +1 -1
- package/lib/utils/fhirpath.d.ts +5 -4
- package/lib/utils/fhirpath.js +45 -33
- package/lib/utils/fhirpath.js.map +1 -1
- package/lib/utils/initialise.js +5 -2
- package/lib/utils/initialise.js.map +1 -1
- package/lib/utils/parseInputs.js +1 -1
- package/lib/utils/parseInputs.js.map +1 -1
- package/package.json +1 -1
- package/src/components/FormComponents/BooleanItem/BooleanItem.tsx +9 -1
- package/src/components/FormComponents/ChoiceItems/ChoiceRadioAnswerOptionItem.tsx +5 -2
- package/src/components/FormComponents/ChoiceItems/ChoiceRadioAnswerValueSetItem.tsx +5 -2
- package/src/components/FormComponents/ChoiceItems/ChoiceSelectAnswerOptionItem.tsx +5 -2
- package/src/components/FormComponents/ChoiceItems/ChoiceSelectAnswerValueSetItem.tsx +5 -2
- package/src/components/FormComponents/DecimalItem/DecimalItem.tsx +14 -3
- package/src/components/FormComponents/IntegerItem/IntegerItem.tsx +10 -3
- package/src/components/FormComponents/StringItem/StringItem.tsx +10 -3
- package/src/components/FormComponents/TextItem/TextItem.tsx +10 -3
- package/src/hooks/useBooleanCalculatedExpression.ts +19 -12
- package/src/hooks/useCodingCalculatedExpression.ts +18 -8
- package/src/hooks/useDecimalCalculatedExpression.ts +26 -17
- package/src/hooks/useDisplayCalculatedExpression.ts +12 -1
- package/src/hooks/useIntegerCalculatedExpression.ts +18 -13
- package/src/hooks/useStringCalculatedExpression.ts +16 -13
- package/src/interfaces/calculatedExpression.interface.ts +1 -1
- package/src/stores/questionnaireResponseStore.ts +16 -2
- package/src/stores/questionnaireStore.ts +7 -0
- package/src/utils/calculatedExpression.ts +24 -10
- package/src/utils/enableWhenExpression.ts +22 -9
- package/src/utils/fhirpath.ts +62 -41
- package/src/utils/initialise.ts +5 -2
- package/src/utils/parseInputs.ts +1 -1
- package/src/utils/questionnaireResponseStoreUtils/updatableResponseItems.ts +62 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useIntegerCalculatedExpression.js","sourceRoot":"","sources":["../../src/hooks/useIntegerCalculatedExpression.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"useIntegerCalculatedExpression.js","sourceRoot":"","sources":["../../src/hooks/useIntegerCalculatedExpression.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAE5C,OAAO,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAalD,SAAS,8BAA8B,CACrC,KAA0C;IAE1C,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,+BAA+B,EAAE,4BAA4B,EAAE,GACxF,KAAK,CAAC;IAER,MAAM,qBAAqB,GAAG,qBAAqB,CAAC,GAAG,CAAC,qBAAqB,EAAE,CAAC;IAEhF,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAE5D,SAAS,CACP,GAAG,EAAE;;QACH,MAAM,cAAc,GAAG,MAAA,qBAAqB,CAAC,KAAK,CAAC,MAAM,CAAC,0CAAE,IAAI,CAC9D,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,MAAM,CAC7B,CAAC;QAEF,IAAI,CAAC,cAAc,EAAE;YACnB,OAAO;SACR;QAED,kEAAkE;QAClE,IACE,cAAc,CAAC,KAAK,KAAK,UAAU;YACnC,CAAC,OAAO,cAAc,CAAC,KAAK,KAAK,QAAQ,IAAI,cAAc,CAAC,KAAK,KAAK,IAAI,CAAC,EAC3E;YACA,MAAM,mBAAmB,GAAG,cAAc,CAAC,KAAK,CAAC;YAEjD,IAAI,mBAAmB,KAAK,QAAQ,CAAC,UAAU,CAAC,EAAE;gBAChD,6CAA6C;gBAC7C,iBAAiB,CAAC,IAAI,CAAC,CAAC;gBACxB,UAAU,CAAC,GAAG,EAAE;oBACd,iBAAiB,CAAC,KAAK,CAAC,CAAC;gBAC3B,CAAC,EAAE,GAAG,CAAC,CAAC;gBAER,qCAAqC;gBACrC,IAAI,mBAAmB,KAAK,IAAI,EAAE;oBAChC,4BAA4B,EAAE,CAAC;oBAC/B,OAAO;iBACR;gBAED,yCAAyC;gBACzC,+BAA+B,CAAC,mBAAmB,CAAC,CAAC;aACtD;SACF;IACH,CAAC;IACD,mEAAmE;IACnE,uDAAuD;IACvD,CAAC,qBAAqB,CAAC,CACxB,CAAC;IAEF,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,CAAC;AAC5C,CAAC;AAED,eAAe,8BAA8B,CAAC"}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import type { QuestionnaireItem
|
|
1
|
+
import type { QuestionnaireItem } from 'fhir/r4';
|
|
2
2
|
interface UseStringCalculatedExpression {
|
|
3
3
|
calcExpUpdated: boolean;
|
|
4
4
|
}
|
|
5
5
|
interface useStringCalculatedExpressionProps {
|
|
6
6
|
qItem: QuestionnaireItem;
|
|
7
7
|
inputValue: string;
|
|
8
|
-
|
|
9
|
-
|
|
8
|
+
onChangeByCalcExpressionString: (newValueString: string) => void;
|
|
9
|
+
onChangeByCalcExpressionNull: () => void;
|
|
10
10
|
}
|
|
11
11
|
declare function useStringCalculatedExpression(props: useStringCalculatedExpressionProps): UseStringCalculatedExpression;
|
|
12
12
|
export default useStringCalculatedExpression;
|
|
@@ -15,10 +15,9 @@
|
|
|
15
15
|
* limitations under the License.
|
|
16
16
|
*/
|
|
17
17
|
import { useEffect, useState } from 'react';
|
|
18
|
-
import { createEmptyQrItem } from '../utils/qrItem';
|
|
19
18
|
import { useQuestionnaireStore } from '../stores';
|
|
20
19
|
function useStringCalculatedExpression(props) {
|
|
21
|
-
const { qItem, inputValue,
|
|
20
|
+
const { qItem, inputValue, onChangeByCalcExpressionString, onChangeByCalcExpressionNull } = props;
|
|
22
21
|
const calculatedExpressions = useQuestionnaireStore.use.calculatedExpressions();
|
|
23
22
|
const [calcExpUpdated, setCalcExpUpdated] = useState(false);
|
|
24
23
|
useEffect(() => {
|
|
@@ -29,18 +28,24 @@ function useStringCalculatedExpression(props) {
|
|
|
29
28
|
}
|
|
30
29
|
// only update if calculated value is different from current value
|
|
31
30
|
if (calcExpression.value !== inputValue &&
|
|
32
|
-
(typeof calcExpression.value === 'string' ||
|
|
31
|
+
(typeof calcExpression.value === 'string' ||
|
|
32
|
+
typeof calcExpression.value === 'number' ||
|
|
33
|
+
calcExpression.value === null)) {
|
|
33
34
|
// update ui to show calculated value changes
|
|
34
35
|
setCalcExpUpdated(true);
|
|
35
36
|
setTimeout(() => {
|
|
36
37
|
setCalcExpUpdated(false);
|
|
37
38
|
}, 500);
|
|
38
|
-
|
|
39
|
+
// calculatedExpression value is null
|
|
40
|
+
if (calcExpression.value === null) {
|
|
41
|
+
onChangeByCalcExpressionNull();
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
// calculatedExpression value is a string or number
|
|
45
|
+
const newInputValue = typeof calcExpression.value === 'string'
|
|
39
46
|
? calcExpression.value
|
|
40
47
|
: calcExpression.value.toString();
|
|
41
|
-
|
|
42
|
-
setInputValue(updatedInputValue);
|
|
43
|
-
onQrItemChange(Object.assign(Object.assign({}, createEmptyQrItem(qItem)), { answer: [{ valueString: updatedInputValue }] }));
|
|
48
|
+
onChangeByCalcExpressionString(newInputValue);
|
|
44
49
|
}
|
|
45
50
|
},
|
|
46
51
|
// Only trigger this effect if calculatedExpression of item changes
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useStringCalculatedExpression.js","sourceRoot":"","sources":["../../src/hooks/useStringCalculatedExpression.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"useStringCalculatedExpression.js","sourceRoot":"","sources":["../../src/hooks/useStringCalculatedExpression.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAE5C,OAAO,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAalD,SAAS,6BAA6B,CACpC,KAAyC;IAEzC,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,8BAA8B,EAAE,4BAA4B,EAAE,GAAG,KAAK,CAAC;IAElG,MAAM,qBAAqB,GAAG,qBAAqB,CAAC,GAAG,CAAC,qBAAqB,EAAE,CAAC;IAEhF,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAE5D,SAAS,CACP,GAAG,EAAE;;QACH,MAAM,cAAc,GAAG,MAAA,qBAAqB,CAAC,KAAK,CAAC,MAAM,CAAC,0CAAE,IAAI,CAC9D,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,MAAM,CAC7B,CAAC;QAEF,IAAI,CAAC,cAAc,EAAE;YACnB,OAAO;SACR;QAED,kEAAkE;QAClE,IACE,cAAc,CAAC,KAAK,KAAK,UAAU;YACnC,CAAC,OAAO,cAAc,CAAC,KAAK,KAAK,QAAQ;gBACvC,OAAO,cAAc,CAAC,KAAK,KAAK,QAAQ;gBACxC,cAAc,CAAC,KAAK,KAAK,IAAI,CAAC,EAChC;YACA,6CAA6C;YAC7C,iBAAiB,CAAC,IAAI,CAAC,CAAC;YACxB,UAAU,CAAC,GAAG,EAAE;gBACd,iBAAiB,CAAC,KAAK,CAAC,CAAC;YAC3B,CAAC,EAAE,GAAG,CAAC,CAAC;YAER,qCAAqC;YACrC,IAAI,cAAc,CAAC,KAAK,KAAK,IAAI,EAAE;gBACjC,4BAA4B,EAAE,CAAC;gBAC/B,OAAO;aACR;YAED,mDAAmD;YACnD,MAAM,aAAa,GACjB,OAAO,cAAc,CAAC,KAAK,KAAK,QAAQ;gBACtC,CAAC,CAAC,cAAc,CAAC,KAAK;gBACtB,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;YAEtC,8BAA8B,CAAC,aAAa,CAAC,CAAC;SAC/C;IACH,CAAC;IACD,mEAAmE;IACnE,uDAAuD;IACvD,CAAC,qBAAqB,CAAC,CACxB,CAAC;IAEF,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,CAAC;AAC5C,CAAC;AAED,eAAe,6BAA6B,CAAC"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import type { OperationOutcome, Questionnaire, QuestionnaireResponse } from 'fhir/r4';
|
|
1
|
+
import type { OperationOutcome, Questionnaire, QuestionnaireResponse, QuestionnaireResponseItem } from 'fhir/r4';
|
|
2
2
|
import type { Diff } from 'deep-diff';
|
|
3
3
|
interface QuestionnaireResponseStoreType {
|
|
4
4
|
sourceResponse: QuestionnaireResponse;
|
|
5
5
|
updatableResponse: QuestionnaireResponse;
|
|
6
|
+
updatableResponseItems: Record<string, QuestionnaireResponseItem[]>;
|
|
6
7
|
formChangesHistory: (Diff<QuestionnaireResponse, QuestionnaireResponse>[] | null)[];
|
|
7
8
|
invalidItems: Record<string, OperationOutcome>;
|
|
8
9
|
responseIsValid: boolean;
|
|
@@ -19,6 +20,7 @@ export declare const useQuestionnaireResponseStore: import("zustand/vanilla").St
|
|
|
19
20
|
use: {
|
|
20
21
|
sourceResponse: () => QuestionnaireResponse;
|
|
21
22
|
updatableResponse: () => QuestionnaireResponse;
|
|
23
|
+
updatableResponseItems: () => Record<string, QuestionnaireResponseItem[]>;
|
|
22
24
|
formChangesHistory: () => (Diff<QuestionnaireResponse, QuestionnaireResponse>[] | null)[];
|
|
23
25
|
invalidItems: () => Record<string, OperationOutcome>;
|
|
24
26
|
responseIsValid: () => boolean;
|
|
@@ -21,9 +21,11 @@ import { diff } from 'deep-diff';
|
|
|
21
21
|
import { createSelectors } from './selector';
|
|
22
22
|
import { validateQuestionnaire } from '../utils/validateQuestionnaire';
|
|
23
23
|
import { questionnaireStore } from './questionnaireStore';
|
|
24
|
+
import { createQuestionnaireResponseItemMap } from '../utils/questionnaireResponseStoreUtils/updatableResponseItems';
|
|
24
25
|
export const questionnaireResponseStore = createStore()((set, get) => ({
|
|
25
26
|
sourceResponse: cloneDeep(emptyResponse),
|
|
26
27
|
updatableResponse: cloneDeep(emptyResponse),
|
|
28
|
+
updatableResponseItems: {},
|
|
27
29
|
formChangesHistory: [],
|
|
28
30
|
invalidItems: {},
|
|
29
31
|
responseIsValid: true,
|
|
@@ -46,7 +48,8 @@ export const questionnaireResponseStore = createStore()((set, get) => ({
|
|
|
46
48
|
buildSourceResponse: (questionnaireResponse) => {
|
|
47
49
|
set(() => ({
|
|
48
50
|
sourceResponse: questionnaireResponse,
|
|
49
|
-
updatableResponse: questionnaireResponse
|
|
51
|
+
updatableResponse: questionnaireResponse,
|
|
52
|
+
updatableResponseItems: createQuestionnaireResponseItemMap(questionnaireResponse)
|
|
50
53
|
}));
|
|
51
54
|
},
|
|
52
55
|
setUpdatableResponseAsPopulated: (populatedResponse) => {
|
|
@@ -54,6 +57,7 @@ export const questionnaireResponseStore = createStore()((set, get) => ({
|
|
|
54
57
|
const formChanges = (_a = diff(get().updatableResponse, populatedResponse)) !== null && _a !== void 0 ? _a : null;
|
|
55
58
|
set(() => ({
|
|
56
59
|
updatableResponse: populatedResponse,
|
|
60
|
+
updatableResponseItems: createQuestionnaireResponseItemMap(populatedResponse),
|
|
57
61
|
formChangesHistory: [...get().formChangesHistory, formChanges]
|
|
58
62
|
}));
|
|
59
63
|
},
|
|
@@ -62,21 +66,25 @@ export const questionnaireResponseStore = createStore()((set, get) => ({
|
|
|
62
66
|
const formChanges = (_a = diff(get().updatableResponse, updatedResponse)) !== null && _a !== void 0 ? _a : null;
|
|
63
67
|
set(() => ({
|
|
64
68
|
updatableResponse: updatedResponse,
|
|
69
|
+
updatableResponseItems: createQuestionnaireResponseItemMap(updatedResponse),
|
|
65
70
|
formChangesHistory: [...get().formChangesHistory, formChanges]
|
|
66
71
|
}));
|
|
67
72
|
},
|
|
68
73
|
setUpdatableResponseAsSaved: (savedResponse) => set(() => ({
|
|
69
74
|
sourceResponse: savedResponse,
|
|
70
75
|
updatableResponse: savedResponse,
|
|
76
|
+
updatableResponseItems: createQuestionnaireResponseItemMap(savedResponse),
|
|
71
77
|
formChangesHistory: []
|
|
72
78
|
})),
|
|
73
79
|
setUpdatableResponseAsEmpty: (clearedResponse) => set(() => ({
|
|
74
80
|
updatableResponse: clearedResponse,
|
|
81
|
+
updatableResponseItems: createQuestionnaireResponseItemMap(clearedResponse),
|
|
75
82
|
formChangesHistory: []
|
|
76
83
|
})),
|
|
77
84
|
destroySourceResponse: () => set(() => ({
|
|
78
85
|
sourceResponse: cloneDeep(emptyResponse),
|
|
79
86
|
updatableResponse: cloneDeep(emptyResponse),
|
|
87
|
+
updatableResponseItems: createQuestionnaireResponseItemMap(cloneDeep(emptyResponse)),
|
|
80
88
|
formChangesHistory: []
|
|
81
89
|
}))
|
|
82
90
|
}));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"questionnaireResponseStore.js","sourceRoot":"","sources":["../../src/stores/questionnaireResponseStore.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"questionnaireResponseStore.js","sourceRoot":"","sources":["../../src/stores/questionnaireResponseStore.ts"],"names":[],"mappings":"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"}
|
|
@@ -35,6 +35,7 @@ import { terminologyServerStore } from './terminologyServerStore';
|
|
|
35
35
|
import { createSelectors } from './selector';
|
|
36
36
|
import { mutateRepeatEnableWhenExpressionInstances } from '../utils/enableWhenExpression';
|
|
37
37
|
import { questionnaireResponseStore } from './questionnaireResponseStore';
|
|
38
|
+
import { createQuestionnaireResponseItemMap } from '../utils/questionnaireResponseStoreUtils/updatableResponseItems';
|
|
38
39
|
export const questionnaireStore = createStore()((set, get) => ({
|
|
39
40
|
sourceQuestionnaire: cloneDeep(emptyQuestionnaire),
|
|
40
41
|
itemTypes: {},
|
|
@@ -124,6 +125,7 @@ export const questionnaireStore = createStore()((set, get) => ({
|
|
|
124
125
|
const updatedEnableWhenItems = mutateRepeatEnableWhenItemInstances(Object.assign({}, enableWhenItems), parentRepeatGroupLinkId, parentRepeatGroupIndex, actionType);
|
|
125
126
|
const { updatedEnableWhenExpressions, isUpdated } = mutateRepeatEnableWhenExpressionInstances({
|
|
126
127
|
questionnaireResponse: questionnaireResponseStore.getState().updatableResponse,
|
|
128
|
+
questionnaireResponseItemMap: questionnaireResponseStore.getState().updatableResponseItems,
|
|
127
129
|
variablesFhirPath: get().variables.fhirPathVariables,
|
|
128
130
|
existingFhirPathContext: get().fhirPathContext,
|
|
129
131
|
enableWhenExpressions: enableWhenExpressions,
|
|
@@ -140,8 +142,10 @@ export const questionnaireStore = createStore()((set, get) => ({
|
|
|
140
142
|
},
|
|
141
143
|
toggleEnableWhenActivation: (isActivated) => set(() => ({ enableWhenIsActivated: isActivated })),
|
|
142
144
|
updateExpressions: (updatedResponse) => {
|
|
145
|
+
const updatedResponseItemMap = createQuestionnaireResponseItemMap(updatedResponse);
|
|
143
146
|
const { isUpdated, updatedEnableWhenExpressions, updatedCalculatedExpressions, updatedFhirPathContext } = evaluateUpdatedExpressions({
|
|
144
147
|
updatedResponse,
|
|
148
|
+
updatedResponseItemMap,
|
|
145
149
|
enableWhenExpressions: get().enableWhenExpressions,
|
|
146
150
|
calculatedExpressions: get().calculatedExpressions,
|
|
147
151
|
variablesFhirPath: get().variables.fhirPathVariables,
|
|
@@ -163,8 +167,10 @@ export const questionnaireStore = createStore()((set, get) => ({
|
|
|
163
167
|
cachedValueSetCodings: Object.assign(Object.assign({}, get().cachedValueSetCodings), { [valueSetUrl]: codings })
|
|
164
168
|
})),
|
|
165
169
|
updatePopulatedProperties: (populatedResponse, persistTabIndex) => {
|
|
170
|
+
const initialResponseItemMap = createQuestionnaireResponseItemMap(populatedResponse);
|
|
166
171
|
const evaluateInitialCalculatedExpressionsResult = evaluateInitialCalculatedExpressions({
|
|
167
172
|
initialResponse: populatedResponse,
|
|
173
|
+
initialResponseItemMap: initialResponseItemMap,
|
|
168
174
|
calculatedExpressions: get().calculatedExpressions,
|
|
169
175
|
variablesFhirPath: get().variables.fhirPathVariables,
|
|
170
176
|
existingFhirPathContext: get().fhirPathContext
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"questionnaireStore.js","sourceRoot":"","sources":["../../src/stores/questionnaireStore.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;;;;;;;;;;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAa9C,OAAO,EACL,mCAAmC,EACnC,0BAA0B,EAC3B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,0BAA0B,EAAE,MAAM,mBAAmB,CAAC;AAC/D,OAAO,EACL,oCAAoC,EACpC,oCAAoC,EACrC,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,wBAAwB,EAAE,MAAM,0DAA0D,CAAC;AACpG,OAAO,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAC3E,OAAO,SAAS,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,yCAAyC,EAAE,MAAM,+BAA+B,CAAC;AAC1F,OAAO,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"questionnaireStore.js","sourceRoot":"","sources":["../../src/stores/questionnaireStore.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import type { CalculatedExpression } from '../interfaces/calculatedExpression.interface';
|
|
2
|
-
import type { Expression, Questionnaire, QuestionnaireResponse } from 'fhir/r4';
|
|
2
|
+
import type { Expression, Questionnaire, QuestionnaireResponse, QuestionnaireResponseItem } from 'fhir/r4';
|
|
3
3
|
interface EvaluateInitialCalculatedExpressionsParams {
|
|
4
4
|
initialResponse: QuestionnaireResponse;
|
|
5
|
+
initialResponseItemMap: Record<string, QuestionnaireResponseItem[]>;
|
|
5
6
|
calculatedExpressions: Record<string, CalculatedExpression[]>;
|
|
6
7
|
variablesFhirPath: Record<string, Expression[]>;
|
|
7
8
|
existingFhirPathContext: Record<string, any>;
|
|
@@ -24,7 +24,7 @@ import { updateQrItemsInGroup } from './qrItem';
|
|
|
24
24
|
import cloneDeep from 'lodash.clonedeep';
|
|
25
25
|
import dayjs from 'dayjs';
|
|
26
26
|
export function evaluateInitialCalculatedExpressions(params) {
|
|
27
|
-
const { initialResponse, calculatedExpressions, variablesFhirPath, existingFhirPathContext } = params;
|
|
27
|
+
const { initialResponse, initialResponseItemMap, calculatedExpressions, variablesFhirPath, existingFhirPathContext } = params;
|
|
28
28
|
// Return early if initialResponse is empty or there are no calculated expressions to evaluate
|
|
29
29
|
if (_isEqual(initialResponse, cloneDeep(emptyResponse)) ||
|
|
30
30
|
Object.keys(calculatedExpressions).length === 0) {
|
|
@@ -34,13 +34,14 @@ export function evaluateInitialCalculatedExpressions(params) {
|
|
|
34
34
|
};
|
|
35
35
|
}
|
|
36
36
|
const initialCalculatedExpressions = Object.assign({}, calculatedExpressions);
|
|
37
|
-
const updatedFhirPathContext = createFhirPathContext(initialResponse,
|
|
37
|
+
const updatedFhirPathContext = createFhirPathContext(initialResponse, initialResponseItemMap, variablesFhirPath);
|
|
38
38
|
for (const linkId in initialCalculatedExpressions) {
|
|
39
39
|
const itemCalcExpressions = calculatedExpressions[linkId];
|
|
40
40
|
for (const calcExpression of itemCalcExpressions) {
|
|
41
41
|
try {
|
|
42
42
|
const result = fhirpath.evaluate({}, calcExpression.expression, updatedFhirPathContext, fhirpath_r4_model);
|
|
43
|
-
if
|
|
43
|
+
// Only update calculatedExpressions if length of result array > 0
|
|
44
|
+
if (result.length > 0 && !_isEqual(calcExpression.value, result[0])) {
|
|
44
45
|
calcExpression.value = result[0];
|
|
45
46
|
}
|
|
46
47
|
}
|
|
@@ -63,11 +64,16 @@ export function evaluateCalculatedExpressions(fhirPathContext, calculatedExpress
|
|
|
63
64
|
for (const calcExpression of itemCalcExpressions) {
|
|
64
65
|
try {
|
|
65
66
|
const result = fhirpath.evaluate({}, calcExpression.expression, fhirPathContext, fhirpath_r4_model);
|
|
66
|
-
if
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
67
|
+
// Update calculatedExpressions if length of result array > 0
|
|
68
|
+
// Only update when current calcExpression value is different from the result, otherwise it will result in an infinite loop as per issue #733
|
|
69
|
+
if (result.length > 0 && !_isEqual(calcExpression.value, result[0])) {
|
|
70
|
+
isUpdated = true;
|
|
71
|
+
calcExpression.value = result[0];
|
|
72
|
+
}
|
|
73
|
+
// Update calculatedExpression value to null if no result is returned
|
|
74
|
+
if (result.length === 0 && calcExpression.value !== null) {
|
|
75
|
+
isUpdated = true;
|
|
76
|
+
calcExpression.value = null;
|
|
71
77
|
}
|
|
72
78
|
}
|
|
73
79
|
catch (e) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"calculatedExpression.js","sourceRoot":"","sources":["../../src/utils/calculatedExpression.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,iBAAiB,MAAM,0BAA0B,CAAC;AAUzD,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAChD,OAAO,SAAS,MAAM,kBAAkB,CAAC;AACzC,OAAO,KAAK,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"calculatedExpression.js","sourceRoot":"","sources":["../../src/utils/calculatedExpression.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import type { Expression, QuestionnaireResponse } from 'fhir/r4';
|
|
1
|
+
import type { Expression, QuestionnaireResponse, QuestionnaireResponseItem } from 'fhir/r4';
|
|
2
2
|
import type { EnableWhenExpressions, EnableWhenRepeatExpression } from '../interfaces';
|
|
3
3
|
interface EvaluateInitialEnableWhenExpressionsParams {
|
|
4
4
|
initialResponse: QuestionnaireResponse;
|
|
5
|
+
initialResponseItemMap: Record<string, QuestionnaireResponseItem[]>;
|
|
5
6
|
enableWhenExpressions: EnableWhenExpressions;
|
|
6
7
|
variablesFhirPath: Record<string, Expression[]>;
|
|
7
|
-
existingFhirPathContext: Record<string, any>;
|
|
8
8
|
}
|
|
9
9
|
export declare function evaluateInitialEnableWhenExpressions(params: EvaluateInitialEnableWhenExpressionsParams): {
|
|
10
10
|
initialEnableWhenExpressions: EnableWhenExpressions;
|
|
@@ -20,6 +20,7 @@ export declare function evaluateEnableWhenExpressions(fhirPathContext: Record<st
|
|
|
20
20
|
};
|
|
21
21
|
interface MutateRepeatEnableWhenExpressionInstancesParams {
|
|
22
22
|
questionnaireResponse: QuestionnaireResponse;
|
|
23
|
+
questionnaireResponseItemMap: Record<string, QuestionnaireResponseItem[]>;
|
|
23
24
|
variablesFhirPath: Record<string, Expression[]>;
|
|
24
25
|
existingFhirPathContext: Record<string, any>;
|
|
25
26
|
enableWhenExpressions: EnableWhenExpressions;
|
|
@@ -18,9 +18,9 @@ import { createFhirPathContext } from './fhirpath';
|
|
|
18
18
|
import fhirpath from 'fhirpath';
|
|
19
19
|
import fhirpath_r4_model from 'fhirpath/fhir-context/r4';
|
|
20
20
|
export function evaluateInitialEnableWhenExpressions(params) {
|
|
21
|
-
const { initialResponse, enableWhenExpressions, variablesFhirPath
|
|
21
|
+
const { initialResponse, initialResponseItemMap, enableWhenExpressions, variablesFhirPath } = params;
|
|
22
22
|
const initialEnableWhenExpressions = Object.assign({}, enableWhenExpressions);
|
|
23
|
-
const updatedFhirPathContext = createFhirPathContext(initialResponse,
|
|
23
|
+
const updatedFhirPathContext = createFhirPathContext(initialResponse, initialResponseItemMap, variablesFhirPath);
|
|
24
24
|
const initialEnableWhenSingleExpressions = evaluateEnableWhenSingleExpressions(initialEnableWhenExpressions.singleExpressions, updatedFhirPathContext);
|
|
25
25
|
const initialEnableWhenRepeatExpressions = evaluateEnableWhenRepeatExpressions(initialEnableWhenExpressions.repeatExpressions, updatedFhirPathContext);
|
|
26
26
|
return {
|
|
@@ -39,11 +39,16 @@ function evaluateEnableWhenSingleExpressions(enableWhenSingleExpressions, update
|
|
|
39
39
|
try {
|
|
40
40
|
const result = fhirpath.evaluate('', expression, updatedFhirPathContext, fhirpath_r4_model);
|
|
41
41
|
// Update enableWhenExpressions if length of result array > 0
|
|
42
|
-
// Only update when current isEnabled value is different from the result, otherwise it will result in
|
|
42
|
+
// Only update when current isEnabled value is different from the result, otherwise it will result in an infinite loop as per issue #733
|
|
43
43
|
if (result.length > 0 && initialValue !== result[0] && typeof result[0] === 'boolean') {
|
|
44
44
|
enableWhenSingleExpressions[linkId].isEnabled = result[0];
|
|
45
45
|
isUpdated = true;
|
|
46
46
|
}
|
|
47
|
+
// Update isEnabled value to false if no result is returned
|
|
48
|
+
if (result.length === 0 && initialValue !== false) {
|
|
49
|
+
enableWhenSingleExpressions[linkId].isEnabled = false;
|
|
50
|
+
isUpdated = true;
|
|
51
|
+
}
|
|
47
52
|
// handle intersect edge case - evaluate() returns empty array if result is false
|
|
48
53
|
if (enableWhenSingleExpressions[linkId].expression.includes('intersect') &&
|
|
49
54
|
result.length === 0 &&
|
|
@@ -102,6 +107,11 @@ export function evaluateEnableWhenRepeatExpressionInstance(linkId, fhirPathConte
|
|
|
102
107
|
isEnabled = result[0];
|
|
103
108
|
isUpdated = true;
|
|
104
109
|
}
|
|
110
|
+
// Update isEnabled value to false if no result is returned
|
|
111
|
+
if (result.length === 0 && initialValue !== false) {
|
|
112
|
+
isEnabled = false;
|
|
113
|
+
isUpdated = true;
|
|
114
|
+
}
|
|
105
115
|
// handle intersect edge case - evaluate() returns empty array if result is false
|
|
106
116
|
if (expression.includes('intersect') && result.length === 0 && initialValue !== result[0]) {
|
|
107
117
|
isEnabled = false;
|
|
@@ -127,9 +137,9 @@ export function evaluateEnableWhenExpressions(fhirPathContext, enableWhenExpress
|
|
|
127
137
|
};
|
|
128
138
|
}
|
|
129
139
|
export function mutateRepeatEnableWhenExpressionInstances(params) {
|
|
130
|
-
const { questionnaireResponse,
|
|
140
|
+
const { questionnaireResponse, questionnaireResponseItemMap, variablesFhirPath, enableWhenExpressions, parentRepeatGroupLinkId, parentRepeatGroupIndex, actionType } = params;
|
|
131
141
|
const { repeatExpressions } = enableWhenExpressions;
|
|
132
|
-
const updatedFhirPathContext = createFhirPathContext(questionnaireResponse,
|
|
142
|
+
const updatedFhirPathContext = createFhirPathContext(questionnaireResponse, questionnaireResponseItemMap, variablesFhirPath);
|
|
133
143
|
let isUpdated = false;
|
|
134
144
|
for (const linkId in repeatExpressions) {
|
|
135
145
|
if (repeatExpressions[linkId].parentLinkId !== parentRepeatGroupLinkId) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"enableWhenExpression.js","sourceRoot":"","sources":["../../src/utils/enableWhenExpression.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,iBAAiB,MAAM,0BAA0B,CAAC;AAczD,MAAM,UAAU,oCAAoC,CAClD,MAAkD;IAKlD,MAAM,EAAE,eAAe,EAAE,
|
|
1
|
+
{"version":3,"file":"enableWhenExpression.js","sourceRoot":"","sources":["../../src/utils/enableWhenExpression.ts"],"names":[],"mappings":"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"}
|
package/lib/utils/fhirpath.d.ts
CHANGED
|
@@ -3,6 +3,7 @@ import type { CalculatedExpression } from '../interfaces/calculatedExpression.in
|
|
|
3
3
|
import type { EnableWhenExpressions } from '../interfaces';
|
|
4
4
|
interface EvaluateUpdatedExpressionsParams {
|
|
5
5
|
updatedResponse: QuestionnaireResponse;
|
|
6
|
+
updatedResponseItemMap: Record<string, QuestionnaireResponseItem[]>;
|
|
6
7
|
calculatedExpressions: Record<string, CalculatedExpression[]>;
|
|
7
8
|
enableWhenExpressions: EnableWhenExpressions;
|
|
8
9
|
variablesFhirPath: Record<string, Expression[]>;
|
|
@@ -14,8 +15,8 @@ export declare function evaluateUpdatedExpressions(params: EvaluateUpdatedExpres
|
|
|
14
15
|
updatedCalculatedExpressions: Record<string, CalculatedExpression[]>;
|
|
15
16
|
updatedFhirPathContext: Record<string, any>;
|
|
16
17
|
};
|
|
17
|
-
export declare function createFhirPathContext(questionnaireResponse: QuestionnaireResponse,
|
|
18
|
-
export declare function
|
|
19
|
-
export declare function
|
|
20
|
-
export declare function
|
|
18
|
+
export declare function createFhirPathContext(questionnaireResponse: QuestionnaireResponse, questionnaireResponseItemMap: Record<string, QuestionnaireResponseItem[]>, variablesFhirPath: Record<string, Expression[]>): Record<string, any>;
|
|
19
|
+
export declare function evaluateLinkIdVariables(item: QuestionnaireResponseItem, variablesFhirPath: Record<string, Expression[]>, fhirPathContext: Record<string, any>): Record<string, any>;
|
|
20
|
+
export declare function addEmptyLinkIdVariables(linkId: string, variablesFhirPath: Record<string, Expression[]>, fhirPathContext: Record<string, any>): Record<string, any>;
|
|
21
|
+
export declare function evaluateQuestionnaireLevelVariables(resource: QuestionnaireResponse, variablesFhirPath: Record<string, Expression[]>, fhirPathContext: Record<string, any>): Record<string, any>;
|
|
21
22
|
export {};
|
package/lib/utils/fhirpath.js
CHANGED
|
@@ -19,7 +19,7 @@ import fhirpath_r4_model from 'fhirpath/fhir-context/r4';
|
|
|
19
19
|
import { evaluateEnableWhenExpressions } from './enableWhenExpression';
|
|
20
20
|
import { evaluateCalculatedExpressions } from './calculatedExpression';
|
|
21
21
|
export function evaluateUpdatedExpressions(params) {
|
|
22
|
-
const { updatedResponse, enableWhenExpressions, calculatedExpressions, variablesFhirPath, existingFhirPathContext } = params;
|
|
22
|
+
const { updatedResponse, updatedResponseItemMap, enableWhenExpressions, calculatedExpressions, variablesFhirPath, existingFhirPathContext } = params;
|
|
23
23
|
const noExpressionsToBeUpdated = Object.keys(enableWhenExpressions).length === 0 &&
|
|
24
24
|
Object.keys(calculatedExpressions).length === 0;
|
|
25
25
|
if (noExpressionsToBeUpdated || !updatedResponse.item) {
|
|
@@ -30,7 +30,7 @@ export function evaluateUpdatedExpressions(params) {
|
|
|
30
30
|
updatedFhirPathContext: existingFhirPathContext
|
|
31
31
|
};
|
|
32
32
|
}
|
|
33
|
-
const updatedFhirPathContext = createFhirPathContext(updatedResponse,
|
|
33
|
+
const updatedFhirPathContext = createFhirPathContext(updatedResponse, updatedResponseItemMap, variablesFhirPath);
|
|
34
34
|
// Update enableWhenExpressions
|
|
35
35
|
const { enableWhenExpsIsUpdated, updatedEnableWhenExpressions } = evaluateEnableWhenExpressions(updatedFhirPathContext, enableWhenExpressions);
|
|
36
36
|
// Update calculatedExpressions
|
|
@@ -43,39 +43,35 @@ export function evaluateUpdatedExpressions(params) {
|
|
|
43
43
|
updatedFhirPathContext
|
|
44
44
|
};
|
|
45
45
|
}
|
|
46
|
-
export function createFhirPathContext(questionnaireResponse,
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
fhirPathContext = Object.assign(Object.assign({}, fhirPathContext), existingFhirPathContext);
|
|
46
|
+
export function createFhirPathContext(questionnaireResponse, questionnaireResponseItemMap, variablesFhirPath) {
|
|
47
|
+
if (!questionnaireResponse.item) {
|
|
48
|
+
return {};
|
|
50
49
|
}
|
|
51
50
|
// Add latest resource to fhirPathContext
|
|
52
|
-
fhirPathContext =
|
|
53
|
-
|
|
54
|
-
|
|
51
|
+
let fhirPathContext = { resource: questionnaireResponse };
|
|
52
|
+
// Evaluate resource-level variables
|
|
53
|
+
fhirPathContext = evaluateQuestionnaireLevelVariables(questionnaireResponse, variablesFhirPath, fhirPathContext);
|
|
54
|
+
// Add variables of items that exist in questionnaireResponseItemMap into fhirPathContext
|
|
55
|
+
for (const linkId in questionnaireResponseItemMap) {
|
|
56
|
+
// For non-repeat groups, the same linkId will have only one item
|
|
57
|
+
// For repeat groups, the same linkId will have multiple items
|
|
58
|
+
for (const qrItem of questionnaireResponseItemMap[linkId]) {
|
|
59
|
+
fhirPathContext = evaluateLinkIdVariables(qrItem, variablesFhirPath, fhirPathContext);
|
|
60
|
+
}
|
|
55
61
|
}
|
|
56
|
-
|
|
57
|
-
for (const
|
|
58
|
-
|
|
62
|
+
// Items don't exist in questionnaireResponseItemMap, but we still have to add them into the fhirPathContext as empty arrays
|
|
63
|
+
for (const linkId in variablesFhirPath) {
|
|
64
|
+
fhirPathContext = addEmptyLinkIdVariables(linkId, variablesFhirPath, fhirPathContext);
|
|
59
65
|
}
|
|
60
66
|
return fhirPathContext;
|
|
61
67
|
}
|
|
62
|
-
export function
|
|
63
|
-
const
|
|
64
|
-
if (
|
|
65
|
-
|
|
66
|
-
for (const childItem of items) {
|
|
67
|
-
evaluateFhirPathRecursive(childItem, variablesFhirPath, fhirPathContext);
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
evaluateItemFhirPath(item, variablesFhirPath, fhirPathContext);
|
|
71
|
-
}
|
|
72
|
-
export function evaluateItemFhirPath(item, variablesFhirPath, fhirPathContext) {
|
|
73
|
-
const variablesOfItem = variablesFhirPath[item.linkId];
|
|
74
|
-
if (!variablesOfItem || variablesOfItem.length === 0) {
|
|
75
|
-
return;
|
|
68
|
+
export function evaluateLinkIdVariables(item, variablesFhirPath, fhirPathContext) {
|
|
69
|
+
const linkIdVariables = variablesFhirPath[item.linkId];
|
|
70
|
+
if (!linkIdVariables || linkIdVariables.length === 0) {
|
|
71
|
+
return fhirPathContext;
|
|
76
72
|
}
|
|
77
|
-
|
|
78
|
-
if (variable.expression) {
|
|
73
|
+
for (const variable of linkIdVariables) {
|
|
74
|
+
if (variable.expression && variable.name) {
|
|
79
75
|
try {
|
|
80
76
|
fhirPathContext[`${variable.name}`] = fhirpath.evaluate(item, {
|
|
81
77
|
base: 'QuestionnaireResponse.item',
|
|
@@ -86,14 +82,29 @@ export function evaluateItemFhirPath(item, variablesFhirPath, fhirPathContext) {
|
|
|
86
82
|
console.warn(e.message, `LinkId: ${item.linkId}\nExpression: ${variable.expression}`);
|
|
87
83
|
}
|
|
88
84
|
}
|
|
89
|
-
}
|
|
85
|
+
}
|
|
86
|
+
return fhirPathContext;
|
|
90
87
|
}
|
|
91
|
-
export function
|
|
88
|
+
export function addEmptyLinkIdVariables(linkId, variablesFhirPath, fhirPathContext) {
|
|
89
|
+
const linkIdVariables = variablesFhirPath[linkId];
|
|
90
|
+
if (!linkIdVariables || linkIdVariables.length === 0) {
|
|
91
|
+
return fhirPathContext;
|
|
92
|
+
}
|
|
93
|
+
for (const variable of linkIdVariables) {
|
|
94
|
+
if (variable.expression && variable.name) {
|
|
95
|
+
if (fhirPathContext[`${variable.name}`] === undefined) {
|
|
96
|
+
fhirPathContext[`${variable.name}`] = [];
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return fhirPathContext;
|
|
101
|
+
}
|
|
102
|
+
export function evaluateQuestionnaireLevelVariables(resource, variablesFhirPath, fhirPathContext) {
|
|
92
103
|
const questionnaireLevelVariables = variablesFhirPath['QuestionnaireLevel'];
|
|
93
104
|
if (!questionnaireLevelVariables || questionnaireLevelVariables.length === 0) {
|
|
94
|
-
return;
|
|
105
|
+
return fhirPathContext;
|
|
95
106
|
}
|
|
96
|
-
|
|
107
|
+
for (const variable of questionnaireLevelVariables) {
|
|
97
108
|
if (variable.expression) {
|
|
98
109
|
try {
|
|
99
110
|
fhirPathContext[`${variable.name}`] = fhirpath.evaluate(resource, {
|
|
@@ -105,6 +116,7 @@ export function evaluateResourceLevelFhirPath(resource, variablesFhirPath, fhirP
|
|
|
105
116
|
console.warn(e.message, `Questionnaire-level\nExpression: ${variable.expression}`);
|
|
106
117
|
}
|
|
107
118
|
}
|
|
108
|
-
}
|
|
119
|
+
}
|
|
120
|
+
return fhirPathContext;
|
|
109
121
|
}
|
|
110
122
|
//# sourceMappingURL=fhirpath.js.map
|