@aehrc/smart-forms-renderer 0.10.2 → 0.10.4
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/README.md +1 -1
- package/lib/components/Tabs/FormBodyTabListWrapper.js +4 -3
- package/lib/components/Tabs/FormBodyTabListWrapper.js.map +1 -1
- package/lib/hooks/useInitialiseRenderer.js +2 -2
- package/lib/hooks/useInitialiseRenderer.js.map +1 -1
- package/lib/index.d.ts +1 -1
- package/lib/index.js +8 -8
- package/lib/index.js.map +1 -1
- package/lib/utils/initialise.d.ts +29 -0
- package/lib/utils/initialise.js +211 -0
- package/lib/utils/initialise.js.map +1 -0
- package/lib/utils/qrItem.d.ts +4 -2
- package/lib/utils/qrItem.js +30 -9
- package/lib/utils/qrItem.js.map +1 -1
- package/lib/utils/removeEmptyAnswers.d.ts +16 -0
- package/lib/utils/removeEmptyAnswers.js +120 -0
- package/lib/utils/removeEmptyAnswers.js.map +1 -0
- package/package.json +4 -4
- package/src/components/Tabs/FormBodyTabListWrapper.tsx +12 -6
- package/src/hooks/useInitialiseRenderer.ts +2 -2
- package/src/index.ts +11 -8
- package/src/utils/qrItem.ts +38 -12
- package/src/utils/{removeHidden.ts → removeEmptyAnswers.ts} +48 -16
package/README.md
CHANGED
|
@@ -28,7 +28,7 @@ export default function App () {
|
|
|
28
28
|
)
|
|
29
29
|
}
|
|
30
30
|
```
|
|
31
|
-
Note: The SmartFormsRenderer component
|
|
31
|
+
Note: The SmartFormsRenderer component trades customisability for simplicity. If you need more control over the rendering engine, refer to the Advanced Usage section.
|
|
32
32
|
|
|
33
33
|
|
|
34
34
|
### SmartFormsRenderer Props
|
|
@@ -28,9 +28,10 @@ const FormBodyTabListWrapper = memo(function FormBodyTabListWrapper(props) {
|
|
|
28
28
|
const { allContextDisplayItems, completedDisplayItemExists } = useContextDisplayItems(topLevelItems);
|
|
29
29
|
return (React.createElement(Card, { sx: { p: 0.75, mb: 2 } },
|
|
30
30
|
React.createElement(Box, { sx: { flexGrow: 1 } },
|
|
31
|
-
React.createElement(PrimarySelectableList, { dense: true, disablePadding: true, sx: { mb:
|
|
32
|
-
completedDisplayItemExists ? (React.createElement(
|
|
33
|
-
|
|
31
|
+
React.createElement(PrimarySelectableList, { dense: true, disablePadding: true, sx: { mb: 0.5, mt: completedDisplayItemExists ? 0 : 0.5 }, "data-test": "renderer-tab-list" },
|
|
32
|
+
completedDisplayItemExists ? (React.createElement(React.Fragment, null,
|
|
33
|
+
React.createElement(ShowCompletedTabsSection, { completedTabsExpanded: completedTabsExpanded, setCompletedTabsExpanded: setCompletedTabsExpanded }),
|
|
34
|
+
React.createElement(Divider, { sx: { mx: 1 }, light: true }))) : null,
|
|
34
35
|
React.createElement(FormBodyTabList, { topLevelItems: topLevelItems, currentTabIndex: currentTabIndex, tabs: tabs, completedTabsCollapsed: !completedTabsExpanded, allContextDisplayItems: allContextDisplayItems })))));
|
|
35
36
|
});
|
|
36
37
|
export default FormBodyTabListWrapper;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FormBodyTabListWrapper.js","sourceRoot":"","sources":["../../../src/components/Tabs/FormBodyTabListWrapper.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC9C,OAAO,GAAG,MAAM,mBAAmB,CAAC;AACpC,OAAO,IAAI,MAAM,oBAAoB,CAAC;AACtC,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAGxD,OAAO,OAAO,MAAM,uBAAuB,CAAC;AAC5C,OAAO,eAAe,MAAM,mBAAmB,CAAC;AAChD,OAAO,wBAAwB,MAAM,4BAA4B,CAAC;AAClE,OAAO,sBAAsB,MAAM,oCAAoC,CAAC;AAQxE,MAAM,sBAAsB,GAAG,IAAI,CAAC,SAAS,sBAAsB,CACjE,KAAkC;IAElC,MAAM,EAAE,aAAa,EAAE,eAAe,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC;IAEvD,MAAM,CAAC,qBAAqB,EAAE,wBAAwB,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAEzE,MAAM,EAAE,sBAAsB,EAAE,0BAA0B,EAAE,GAC1D,sBAAsB,CAAC,aAAa,CAAC,CAAC;IAExC,OAAO,CACL,oBAAC,IAAI,IAAC,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE;QAC1B,oBAAC,GAAG,IAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE;YACtB,oBAAC,qBAAqB,
|
|
1
|
+
{"version":3,"file":"FormBodyTabListWrapper.js","sourceRoot":"","sources":["../../../src/components/Tabs/FormBodyTabListWrapper.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC9C,OAAO,GAAG,MAAM,mBAAmB,CAAC;AACpC,OAAO,IAAI,MAAM,oBAAoB,CAAC;AACtC,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAGxD,OAAO,OAAO,MAAM,uBAAuB,CAAC;AAC5C,OAAO,eAAe,MAAM,mBAAmB,CAAC;AAChD,OAAO,wBAAwB,MAAM,4BAA4B,CAAC;AAClE,OAAO,sBAAsB,MAAM,oCAAoC,CAAC;AAQxE,MAAM,sBAAsB,GAAG,IAAI,CAAC,SAAS,sBAAsB,CACjE,KAAkC;IAElC,MAAM,EAAE,aAAa,EAAE,eAAe,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC;IAEvD,MAAM,CAAC,qBAAqB,EAAE,wBAAwB,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAEzE,MAAM,EAAE,sBAAsB,EAAE,0BAA0B,EAAE,GAC1D,sBAAsB,CAAC,aAAa,CAAC,CAAC;IAExC,OAAO,CACL,oBAAC,IAAI,IAAC,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE;QAC1B,oBAAC,GAAG,IAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE;YACtB,oBAAC,qBAAqB,IACpB,KAAK,QACL,cAAc,QACd,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,0BAA0B,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,eAC/C,mBAAmB;gBAC5B,0BAA0B,CAAC,CAAC,CAAC,CAC5B;oBACE,oBAAC,wBAAwB,IACvB,qBAAqB,EAAE,qBAAqB,EAC5C,wBAAwB,EAAE,wBAAwB,GAClD;oBACF,oBAAC,OAAO,IAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,KAAK,SAAG,CAC/B,CACJ,CAAC,CAAC,CAAC,IAAI;gBACR,oBAAC,eAAe,IACd,aAAa,EAAE,aAAa,EAC5B,eAAe,EAAE,eAAe,EAChC,IAAI,EAAE,IAAI,EACV,sBAAsB,EAAE,CAAC,qBAAqB,EAC9C,sBAAsB,EAAE,sBAAsB,GAC9C,CACoB,CACpB,CACD,CACR,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,eAAe,sBAAsB,CAAC"}
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
* limitations under the License.
|
|
16
16
|
*/
|
|
17
17
|
import { useLayoutEffect, useState } from 'react';
|
|
18
|
-
import {
|
|
18
|
+
import { initialiseQuestionnaireResponse } from '../utils/qrItem';
|
|
19
19
|
import { readEncounter, readPatient, readUser } from '../api/smartClient';
|
|
20
20
|
import { useQuestionnaireResponseStore, useQuestionnaireStore, useSmartConfigStore, useTerminologyServerStore } from '../stores';
|
|
21
21
|
function useInitialiseRenderer(questionnaire, questionnaireResponse, additionalVariables, terminologyServerUrl, fhirClient) {
|
|
@@ -54,7 +54,7 @@ function useInitialiseRenderer(questionnaire, questionnaireResponse, additionalV
|
|
|
54
54
|
}
|
|
55
55
|
// initialise form including enableWhen, enableWhenExpressions, calculatedExpressions, initialExpressions, answerExpressions, cache answerValueSets
|
|
56
56
|
buildSourceQuestionnaire(questionnaire, questionnaireResponse, additionalVariables, terminologyServerUrl).then(() => {
|
|
57
|
-
buildSourceResponse(
|
|
57
|
+
buildSourceResponse(initialiseQuestionnaireResponse(questionnaire));
|
|
58
58
|
if (questionnaireResponse) {
|
|
59
59
|
const updatedResponse = updatePopulatedProperties(questionnaireResponse);
|
|
60
60
|
setUpdatableResponseAsPopulated(updatedResponse);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useInitialiseRenderer.js","sourceRoot":"","sources":["../../src/hooks/useInitialiseRenderer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAClD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"useInitialiseRenderer.js","sourceRoot":"","sources":["../../src/hooks/useInitialiseRenderer.ts"],"names":[],"mappings":"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"}
|
package/lib/index.d.ts
CHANGED
|
@@ -31,7 +31,7 @@ export declare function getResponse(): QuestionnaireResponse;
|
|
|
31
31
|
*
|
|
32
32
|
* @author Sean Fong
|
|
33
33
|
*/
|
|
34
|
-
export declare function
|
|
34
|
+
export declare function removeEmptyAnswersFromResponse(questionnaire: Questionnaire, questionnaireResponse: QuestionnaireResponse): QuestionnaireResponse;
|
|
35
35
|
/**
|
|
36
36
|
* Compare latest data from the server with the current QuestionnaireResponse and decide items to re-populate.
|
|
37
37
|
*
|
package/lib/index.js
CHANGED
|
@@ -8,8 +8,8 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
8
8
|
});
|
|
9
9
|
};
|
|
10
10
|
import { questionnaireResponseStore, questionnaireStore } from './stores';
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
11
|
+
import { initialiseQuestionnaireResponse } from './utils/qrItem';
|
|
12
|
+
import { removeEmptyAnswers } from './utils/removeEmptyAnswers';
|
|
13
13
|
import { getItemsToRepopulate } from './utils/repopulateItems';
|
|
14
14
|
import { repopulateItemsIntoResponse } from './utils/repopulateIntoResponse';
|
|
15
15
|
export * from './components';
|
|
@@ -26,12 +26,12 @@ export function buildForm(questionnaire, questionnaireResponse) {
|
|
|
26
26
|
return __awaiter(this, void 0, void 0, function* () {
|
|
27
27
|
yield questionnaireStore.getState().buildSourceQuestionnaire(questionnaire);
|
|
28
28
|
if (!questionnaireResponse) {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
.buildSourceResponse(createEmptyQuestionnaireResponse(questionnaire));
|
|
29
|
+
const initialisedQuestionnaireResponse = initialiseQuestionnaireResponse(questionnaire);
|
|
30
|
+
questionnaireResponseStore.getState().buildSourceResponse(initialisedQuestionnaireResponse);
|
|
32
31
|
return;
|
|
33
32
|
}
|
|
34
|
-
|
|
33
|
+
const initialisedQuestionnaireResponse = initialiseQuestionnaireResponse(questionnaire, questionnaireResponse);
|
|
34
|
+
questionnaireResponseStore.getState().buildSourceResponse(initialisedQuestionnaireResponse);
|
|
35
35
|
questionnaireStore.getState().updatePopulatedProperties(questionnaireResponse);
|
|
36
36
|
});
|
|
37
37
|
}
|
|
@@ -59,11 +59,11 @@ export function getResponse() {
|
|
|
59
59
|
*
|
|
60
60
|
* @author Sean Fong
|
|
61
61
|
*/
|
|
62
|
-
export function
|
|
62
|
+
export function removeEmptyAnswersFromResponse(questionnaire, questionnaireResponse) {
|
|
63
63
|
const enableWhenIsActivated = questionnaireStore.getState().enableWhenIsActivated;
|
|
64
64
|
const enableWhenItems = questionnaireStore.getState().enableWhenItems;
|
|
65
65
|
const enableWhenExpressions = questionnaireStore.getState().enableWhenExpressions;
|
|
66
|
-
return
|
|
66
|
+
return removeEmptyAnswers({
|
|
67
67
|
questionnaire,
|
|
68
68
|
questionnaireResponse,
|
|
69
69
|
enableWhenIsActivated,
|
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,0BAA0B,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAE1E,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { Expression, QuestionnaireResponse } from 'fhir/r4';
|
|
2
|
+
import { Questionnaire } from 'fhir/r4';
|
|
3
|
+
import type { EnableWhenExpression, EnableWhenItems } from '../interfaces/enableWhen.interface';
|
|
4
|
+
import type { Tabs } from '../interfaces/tab.interface';
|
|
5
|
+
import type { CalculatedExpression } from '../interfaces/calculatedExpression.interface';
|
|
6
|
+
/**
|
|
7
|
+
* Initialise a conformant questionnaireResponse from a given questionnaire
|
|
8
|
+
* optionally takes in an existing questionnaireResponse to be initialised
|
|
9
|
+
*
|
|
10
|
+
* @author Sean Fong
|
|
11
|
+
*/
|
|
12
|
+
export declare function initialiseQuestionnaireResponse(questionnaire: Questionnaire, questionnaireResponse?: QuestionnaireResponse): QuestionnaireResponse;
|
|
13
|
+
export interface initialFormFromResponseParams {
|
|
14
|
+
questionnaireResponse: QuestionnaireResponse;
|
|
15
|
+
enableWhenItems: EnableWhenItems;
|
|
16
|
+
enableWhenExpressions: Record<string, EnableWhenExpression>;
|
|
17
|
+
calculatedExpressions: Record<string, CalculatedExpression>;
|
|
18
|
+
variablesFhirPath: Record<string, Expression[]>;
|
|
19
|
+
tabs: Tabs;
|
|
20
|
+
fhirPathContext: Record<string, any>;
|
|
21
|
+
}
|
|
22
|
+
export declare function initialiseFormFromResponse(params: initialFormFromResponseParams): {
|
|
23
|
+
initialEnableWhenItems: EnableWhenItems;
|
|
24
|
+
initialEnableWhenLinkedQuestions: Record<string, string[]>;
|
|
25
|
+
initialEnableWhenExpressions: Record<string, EnableWhenExpression>;
|
|
26
|
+
initialCalculatedExpressions: Record<string, CalculatedExpression>;
|
|
27
|
+
firstVisibleTab: number;
|
|
28
|
+
updatedFhirPathContext: Record<string, any>;
|
|
29
|
+
};
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2023 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
|
+
import { evaluateInitialEnableWhenExpressions } from './enableWhenExpression';
|
|
18
|
+
import { getFirstVisibleTab } from './tabs';
|
|
19
|
+
import { assignPopulatedAnswersToEnableWhen } from './enableWhen';
|
|
20
|
+
import { evaluateInitialCalculatedExpressions } from './calculatedExpression';
|
|
21
|
+
/**
|
|
22
|
+
* Initialise a conformant questionnaireResponse from a given questionnaire
|
|
23
|
+
* optionally takes in an existing questionnaireResponse to be initialised
|
|
24
|
+
*
|
|
25
|
+
* @author Sean Fong
|
|
26
|
+
*/
|
|
27
|
+
export function initialiseQuestionnaireResponse(questionnaire, questionnaireResponse) {
|
|
28
|
+
var _a;
|
|
29
|
+
if (!questionnaireResponse) {
|
|
30
|
+
questionnaireResponse = {
|
|
31
|
+
resourceType: 'QuestionnaireResponse',
|
|
32
|
+
status: 'in-progress'
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
if (!questionnaireResponse.status) {
|
|
36
|
+
questionnaireResponse.status = 'in-progress';
|
|
37
|
+
}
|
|
38
|
+
const firstTopLevelItem = (_a = questionnaire === null || questionnaire === void 0 ? void 0 : questionnaire.item) === null || _a === void 0 ? void 0 : _a[0];
|
|
39
|
+
if (firstTopLevelItem && !questionnaireResponse.item) {
|
|
40
|
+
questionnaireResponse.item = [
|
|
41
|
+
{
|
|
42
|
+
linkId: firstTopLevelItem.linkId,
|
|
43
|
+
text: firstTopLevelItem.text,
|
|
44
|
+
item: []
|
|
45
|
+
}
|
|
46
|
+
];
|
|
47
|
+
}
|
|
48
|
+
if (!questionnaireResponse.questionnaire) {
|
|
49
|
+
questionnaireResponse.questionnaire = setQuestionnaireReference(questionnaire);
|
|
50
|
+
}
|
|
51
|
+
return questionnaireResponse;
|
|
52
|
+
}
|
|
53
|
+
function setQuestionnaireReference(questionnaire) {
|
|
54
|
+
// Use {url}|{version} - the ideal way
|
|
55
|
+
if (questionnaire.url) {
|
|
56
|
+
let questionnaireReference = questionnaire.url;
|
|
57
|
+
if (questionnaire.version) {
|
|
58
|
+
questionnaireReference += '|' + questionnaire.version;
|
|
59
|
+
}
|
|
60
|
+
return questionnaireReference;
|
|
61
|
+
}
|
|
62
|
+
// If no url exists, use Questionnaire/{id}
|
|
63
|
+
if (questionnaire.id) {
|
|
64
|
+
return `Questionnaire/${questionnaire.id}`;
|
|
65
|
+
}
|
|
66
|
+
return '';
|
|
67
|
+
}
|
|
68
|
+
function readItemInitialValues(questionnaire, questionnaireResponse) {
|
|
69
|
+
if (!questionnaire.item || questionnaire.item.length === 0) {
|
|
70
|
+
return questionnaireResponse;
|
|
71
|
+
}
|
|
72
|
+
// const topLevelQrItems: QuestionnaireResponseItem[] = [];
|
|
73
|
+
// for (const topLevelQItem of questionnaire.item) {
|
|
74
|
+
// const updatedTopLevelQRItem = initialiseItemCalculatedExpressionValueRecursive(topLevelQItem);
|
|
75
|
+
//
|
|
76
|
+
// if (Array.isArray(updatedTopLevelQRItem)) {
|
|
77
|
+
// if (updatedTopLevelQRItem.length > 0) {
|
|
78
|
+
// topLevelQrItems.push(...updatedTopLevelQRItem);
|
|
79
|
+
// }
|
|
80
|
+
// continue;
|
|
81
|
+
// }
|
|
82
|
+
//
|
|
83
|
+
// if (updatedTopLevelQRItem) {
|
|
84
|
+
// topLevelQrItems.push(updatedTopLevelQRItem);
|
|
85
|
+
// }
|
|
86
|
+
// }
|
|
87
|
+
return questionnaireResponse;
|
|
88
|
+
}
|
|
89
|
+
function readItemInitialValueRecursive(qItem) {
|
|
90
|
+
const childQItems = qItem.item;
|
|
91
|
+
if (childQItems && childQItems.length > 0) {
|
|
92
|
+
if (qItem.type === 'group' && qItem.repeats) {
|
|
93
|
+
// TODO handle repeat group
|
|
94
|
+
}
|
|
95
|
+
const initialQRItems = [];
|
|
96
|
+
for (const childQItem of childQItems) {
|
|
97
|
+
const initialChildQRItemOrItems = readItemInitialValueRecursive(childQItem);
|
|
98
|
+
if (Array.isArray(initialChildQRItemOrItems)) {
|
|
99
|
+
if (initialChildQRItemOrItems.length > 0) {
|
|
100
|
+
initialQRItems.push(...initialChildQRItemOrItems);
|
|
101
|
+
}
|
|
102
|
+
continue;
|
|
103
|
+
}
|
|
104
|
+
if (initialChildQRItemOrItems) {
|
|
105
|
+
initialQRItems.push(initialChildQRItemOrItems);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
const qrItem = createQuestionnaireResponseItemFromInitialValue(qItem);
|
|
109
|
+
if (qrItem && initialQRItems.length > 0) {
|
|
110
|
+
qrItem.item = initialQRItems;
|
|
111
|
+
}
|
|
112
|
+
return qrItem;
|
|
113
|
+
}
|
|
114
|
+
return createQuestionnaireResponseItemFromInitialValue(qItem);
|
|
115
|
+
}
|
|
116
|
+
function createQuestionnaireResponseItemFromInitialValue(qItem) {
|
|
117
|
+
const initialValues = qItem.initial;
|
|
118
|
+
if (!initialValues) {
|
|
119
|
+
return null;
|
|
120
|
+
}
|
|
121
|
+
const initialValueAnswers = initialValues
|
|
122
|
+
.map((initialValue) => initialValueSwitcher(initialValue))
|
|
123
|
+
.filter((item) => item !== null);
|
|
124
|
+
return createNewQuestionnaireResponseItem(qItem, initialValueAnswers);
|
|
125
|
+
}
|
|
126
|
+
function initialValueSwitcher(initialValue) {
|
|
127
|
+
if (initialValue.valueBoolean) {
|
|
128
|
+
return { valueBoolean: initialValue.valueBoolean };
|
|
129
|
+
}
|
|
130
|
+
if (initialValue.valueDecimal) {
|
|
131
|
+
return { valueDecimal: initialValue.valueDecimal };
|
|
132
|
+
}
|
|
133
|
+
if (initialValue.valueInteger) {
|
|
134
|
+
return { valueInteger: initialValue.valueInteger };
|
|
135
|
+
}
|
|
136
|
+
if (initialValue.valueDate) {
|
|
137
|
+
return { valueDate: initialValue.valueDate };
|
|
138
|
+
}
|
|
139
|
+
if (initialValue.valueDateTime) {
|
|
140
|
+
return { valueDateTime: initialValue.valueDateTime };
|
|
141
|
+
}
|
|
142
|
+
if (initialValue.valueTime) {
|
|
143
|
+
return { valueTime: initialValue.valueTime };
|
|
144
|
+
}
|
|
145
|
+
if (initialValue.valueString) {
|
|
146
|
+
return { valueString: initialValue.valueString };
|
|
147
|
+
}
|
|
148
|
+
if (initialValue.valueUri) {
|
|
149
|
+
return { valueUri: initialValue.valueUri };
|
|
150
|
+
}
|
|
151
|
+
if (initialValue.valueAttachment) {
|
|
152
|
+
return { valueAttachment: initialValue.valueAttachment };
|
|
153
|
+
}
|
|
154
|
+
if (initialValue.valueCoding) {
|
|
155
|
+
return { valueCoding: initialValue.valueCoding };
|
|
156
|
+
}
|
|
157
|
+
if (initialValue.valueQuantity) {
|
|
158
|
+
return { valueQuantity: initialValue.valueQuantity };
|
|
159
|
+
}
|
|
160
|
+
if (initialValue.valueReference) {
|
|
161
|
+
return { valueReference: initialValue.valueReference };
|
|
162
|
+
}
|
|
163
|
+
return null;
|
|
164
|
+
}
|
|
165
|
+
function createNewQuestionnaireResponseItem(qItem, initialValueAnswers) {
|
|
166
|
+
if (initialValueAnswers.length === 0) {
|
|
167
|
+
return null;
|
|
168
|
+
}
|
|
169
|
+
// If item is non-repeating, only take the first initial value
|
|
170
|
+
if (!qItem.repeats) {
|
|
171
|
+
initialValueAnswers = [initialValueAnswers[0]];
|
|
172
|
+
}
|
|
173
|
+
return {
|
|
174
|
+
linkId: qItem.linkId,
|
|
175
|
+
text: qItem.text,
|
|
176
|
+
answer: initialValueAnswers
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
export function initialiseFormFromResponse(params) {
|
|
180
|
+
const { questionnaireResponse, enableWhenItems, enableWhenExpressions, calculatedExpressions, variablesFhirPath, tabs } = params;
|
|
181
|
+
let updatedFhirPathContext = params.fhirPathContext;
|
|
182
|
+
const { initialisedItems, linkedQuestions } = assignPopulatedAnswersToEnableWhen(enableWhenItems, questionnaireResponse);
|
|
183
|
+
const evaluateInitialEnableWhenExpressionsResult = evaluateInitialEnableWhenExpressions({
|
|
184
|
+
initialResponse: questionnaireResponse,
|
|
185
|
+
enableWhenExpressions: enableWhenExpressions,
|
|
186
|
+
variablesFhirPath: variablesFhirPath,
|
|
187
|
+
existingFhirPathContext: updatedFhirPathContext
|
|
188
|
+
});
|
|
189
|
+
const { initialEnableWhenExpressions } = evaluateInitialEnableWhenExpressionsResult;
|
|
190
|
+
updatedFhirPathContext = evaluateInitialEnableWhenExpressionsResult.updatedFhirPathContext;
|
|
191
|
+
const evaluateInitialCalculatedExpressionsResult = evaluateInitialCalculatedExpressions({
|
|
192
|
+
initialResponse: questionnaireResponse,
|
|
193
|
+
calculatedExpressions: calculatedExpressions,
|
|
194
|
+
variablesFhirPath: variablesFhirPath,
|
|
195
|
+
existingFhirPathContext: updatedFhirPathContext
|
|
196
|
+
});
|
|
197
|
+
const { initialCalculatedExpressions } = evaluateInitialCalculatedExpressionsResult;
|
|
198
|
+
updatedFhirPathContext = evaluateInitialEnableWhenExpressionsResult.updatedFhirPathContext;
|
|
199
|
+
const firstVisibleTab = Object.keys(tabs).length > 0
|
|
200
|
+
? getFirstVisibleTab(tabs, initialisedItems, initialEnableWhenExpressions)
|
|
201
|
+
: 0;
|
|
202
|
+
return {
|
|
203
|
+
initialEnableWhenItems: initialisedItems,
|
|
204
|
+
initialEnableWhenLinkedQuestions: linkedQuestions,
|
|
205
|
+
initialEnableWhenExpressions,
|
|
206
|
+
initialCalculatedExpressions,
|
|
207
|
+
firstVisibleTab,
|
|
208
|
+
updatedFhirPathContext
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
//# sourceMappingURL=initialise.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"initialise.js","sourceRoot":"","sources":["../../src/utils/initialise.ts"],"names":[],"mappings":"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"}
|
package/lib/utils/qrItem.d.ts
CHANGED
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
import type { Questionnaire, QuestionnaireItem, QuestionnaireResponse, QuestionnaireResponseItem } from 'fhir/r4';
|
|
2
2
|
import type { QrRepeatGroup } from '../interfaces/repeatGroup.interface';
|
|
3
3
|
/**
|
|
4
|
-
*
|
|
4
|
+
* Initialise a conformant questionnaireResponse from a given questionnaire
|
|
5
|
+
* optionally takes in an existing questionnaireResponse to be initialised
|
|
5
6
|
*
|
|
6
7
|
* @author Sean Fong
|
|
7
8
|
*/
|
|
8
|
-
export declare function
|
|
9
|
+
export declare function initialiseQuestionnaireResponse(questionnaire: Questionnaire, questionnaireResponse?: QuestionnaireResponse): QuestionnaireResponse;
|
|
10
|
+
export declare function setQuestionnaireReference(questionnaire: Questionnaire): string;
|
|
9
11
|
/**
|
|
10
12
|
* Remove items with no answers from a given questionnaireResponse
|
|
11
13
|
* Also remove any starting or trailing whitespace from valueStrings
|
package/lib/utils/qrItem.js
CHANGED
|
@@ -15,18 +15,24 @@
|
|
|
15
15
|
* limitations under the License.
|
|
16
16
|
*/
|
|
17
17
|
/**
|
|
18
|
-
*
|
|
18
|
+
* Initialise a conformant questionnaireResponse from a given questionnaire
|
|
19
|
+
* optionally takes in an existing questionnaireResponse to be initialised
|
|
19
20
|
*
|
|
20
21
|
* @author Sean Fong
|
|
21
22
|
*/
|
|
22
|
-
export function
|
|
23
|
+
export function initialiseQuestionnaireResponse(questionnaire, questionnaireResponse) {
|
|
23
24
|
var _a;
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
25
|
+
if (!questionnaireResponse) {
|
|
26
|
+
questionnaireResponse = {
|
|
27
|
+
resourceType: 'QuestionnaireResponse',
|
|
28
|
+
status: 'in-progress'
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
if (!questionnaireResponse.status) {
|
|
32
|
+
questionnaireResponse.status = 'in-progress';
|
|
33
|
+
}
|
|
28
34
|
const firstTopLevelItem = (_a = questionnaire === null || questionnaire === void 0 ? void 0 : questionnaire.item) === null || _a === void 0 ? void 0 : _a[0];
|
|
29
|
-
if (firstTopLevelItem) {
|
|
35
|
+
if (firstTopLevelItem && !questionnaireResponse.item) {
|
|
30
36
|
questionnaireResponse.item = [
|
|
31
37
|
{
|
|
32
38
|
linkId: firstTopLevelItem.linkId,
|
|
@@ -35,11 +41,26 @@ export function createEmptyQuestionnaireResponse(questionnaire) {
|
|
|
35
41
|
}
|
|
36
42
|
];
|
|
37
43
|
}
|
|
38
|
-
if (questionnaire
|
|
39
|
-
questionnaireResponse.questionnaire =
|
|
44
|
+
if (!questionnaireResponse.questionnaire) {
|
|
45
|
+
questionnaireResponse.questionnaire = setQuestionnaireReference(questionnaire);
|
|
40
46
|
}
|
|
41
47
|
return questionnaireResponse;
|
|
42
48
|
}
|
|
49
|
+
export function setQuestionnaireReference(questionnaire) {
|
|
50
|
+
// Use {url}|{version} - the ideal way
|
|
51
|
+
if (questionnaire.url) {
|
|
52
|
+
let questionnaireReference = questionnaire.url;
|
|
53
|
+
if (questionnaire.version) {
|
|
54
|
+
questionnaireReference += '|' + questionnaire.version;
|
|
55
|
+
}
|
|
56
|
+
return questionnaireReference;
|
|
57
|
+
}
|
|
58
|
+
// If no url exists, use Questionnaire/{id}
|
|
59
|
+
if (questionnaire.id) {
|
|
60
|
+
return `Questionnaire/${questionnaire.id}`;
|
|
61
|
+
}
|
|
62
|
+
return '';
|
|
63
|
+
}
|
|
43
64
|
/**
|
|
44
65
|
* Remove items with no answers from a given questionnaireResponse
|
|
45
66
|
* Also remove any starting or trailing whitespace from valueStrings
|
package/lib/utils/qrItem.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"qrItem.js","sourceRoot":"","sources":["../../src/utils/qrItem.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAWH
|
|
1
|
+
{"version":3,"file":"qrItem.js","sourceRoot":"","sources":["../../src/utils/qrItem.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { Questionnaire, QuestionnaireResponse } from 'fhir/r4';
|
|
2
|
+
import type { EnableWhenExpression, EnableWhenItems } from '../interfaces/enableWhen.interface';
|
|
3
|
+
interface removeEmptyAnswersParams {
|
|
4
|
+
questionnaire: Questionnaire;
|
|
5
|
+
questionnaireResponse: QuestionnaireResponse;
|
|
6
|
+
enableWhenIsActivated: boolean;
|
|
7
|
+
enableWhenItems: EnableWhenItems;
|
|
8
|
+
enableWhenExpressions: Record<string, EnableWhenExpression>;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Recursively go through the questionnaireResponse and remove qrItems whose qItems are empty in the form
|
|
12
|
+
*
|
|
13
|
+
* @author Sean Fong
|
|
14
|
+
*/
|
|
15
|
+
export declare function removeEmptyAnswers(params: removeEmptyAnswersParams): QuestionnaireResponse;
|
|
16
|
+
export {};
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2023 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
|
+
import { isHidden } from './qItem';
|
|
18
|
+
/**
|
|
19
|
+
* Recursively go through the questionnaireResponse and remove qrItems whose qItems are empty in the form
|
|
20
|
+
*
|
|
21
|
+
* @author Sean Fong
|
|
22
|
+
*/
|
|
23
|
+
export function removeEmptyAnswers(params) {
|
|
24
|
+
const { questionnaire, questionnaireResponse, enableWhenIsActivated, enableWhenItems, enableWhenExpressions } = params;
|
|
25
|
+
const topLevelQItems = questionnaire.item;
|
|
26
|
+
const topLevelQRItems = questionnaireResponse.item;
|
|
27
|
+
if (!topLevelQItems ||
|
|
28
|
+
topLevelQItems.length === 0 ||
|
|
29
|
+
!topLevelQRItems ||
|
|
30
|
+
topLevelQRItems.length === 0) {
|
|
31
|
+
return questionnaireResponse;
|
|
32
|
+
}
|
|
33
|
+
topLevelQRItems.forEach((qrItem, i) => {
|
|
34
|
+
const qItem = topLevelQItems[i];
|
|
35
|
+
const newTopLevelQRItem = removeEmptyAnswersFromItemRecursive({
|
|
36
|
+
qItem,
|
|
37
|
+
qrItem,
|
|
38
|
+
enableWhenIsActivated,
|
|
39
|
+
enableWhenItems,
|
|
40
|
+
enableWhenExpressions
|
|
41
|
+
});
|
|
42
|
+
if (newTopLevelQRItem && questionnaireResponse.item) {
|
|
43
|
+
questionnaireResponse.item[i] = Object.assign({}, newTopLevelQRItem);
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
return questionnaireResponse;
|
|
47
|
+
}
|
|
48
|
+
function removeEmptyAnswersFromItemRecursive(params) {
|
|
49
|
+
const { qItem, qrItem, enableWhenIsActivated, enableWhenItems, enableWhenExpressions } = params;
|
|
50
|
+
const qItems = qItem.item;
|
|
51
|
+
const qrItems = qrItem.item;
|
|
52
|
+
// Process group items
|
|
53
|
+
if (qItems && qItems.length > 0) {
|
|
54
|
+
// Return nothing if corresponding qItem is hidden
|
|
55
|
+
if (isHidden({
|
|
56
|
+
questionnaireItem: qItem,
|
|
57
|
+
enableWhenIsActivated,
|
|
58
|
+
enableWhenItems,
|
|
59
|
+
enableWhenExpressions
|
|
60
|
+
})) {
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
if (qrItems && qrItems.length > 0) {
|
|
64
|
+
const newQrItems = [];
|
|
65
|
+
// Loop over qItems - but end loop if we either reach the end of qItems or qrItems
|
|
66
|
+
// Under normal circumstances we will reach the end of both arrays together
|
|
67
|
+
for (let qItemIndex = 0, qrItemIndex = 0; qItemIndex < qItems.length || qrItemIndex < qrItems.length; qItemIndex++) {
|
|
68
|
+
// Save qrItem if linkIds of current qItem and qrItem are the same
|
|
69
|
+
if (qrItems[qrItemIndex] && qItems[qItemIndex].linkId === qrItems[qrItemIndex].linkId) {
|
|
70
|
+
const newQrItem = removeEmptyAnswersFromItemRecursive({
|
|
71
|
+
qItem: qItems[qItemIndex],
|
|
72
|
+
qrItem: qrItems[qrItemIndex],
|
|
73
|
+
enableWhenIsActivated,
|
|
74
|
+
enableWhenItems,
|
|
75
|
+
enableWhenExpressions
|
|
76
|
+
});
|
|
77
|
+
if (newQrItem) {
|
|
78
|
+
newQrItems.push(newQrItem);
|
|
79
|
+
}
|
|
80
|
+
// Decrement qItem index if the next qrItem is an answer from a repeatGroup
|
|
81
|
+
// Essentially persisting the current qItem linked to be matched up with the next qrItem linkId
|
|
82
|
+
if (qrItems.length !== qrItemIndex + 1 &&
|
|
83
|
+
qrItems[qrItemIndex].linkId === qrItems[qrItemIndex + 1].linkId) {
|
|
84
|
+
qItemIndex--;
|
|
85
|
+
}
|
|
86
|
+
// Only Increment qrItem index whenever the current qrItem linkId matches up with the current qItem
|
|
87
|
+
qrItemIndex++;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
return Object.assign(Object.assign({}, qrItem), { item: newQrItems });
|
|
91
|
+
}
|
|
92
|
+
// Also perform checks if answer exists
|
|
93
|
+
return answerIsEmpty(qItem, qrItem, enableWhenIsActivated, enableWhenItems, enableWhenExpressions)
|
|
94
|
+
? null
|
|
95
|
+
: qrItem;
|
|
96
|
+
}
|
|
97
|
+
// Process non-group items
|
|
98
|
+
return answerIsEmpty(qItem, qrItem, enableWhenIsActivated, enableWhenItems, enableWhenExpressions)
|
|
99
|
+
? null
|
|
100
|
+
: Object.assign({}, qrItem);
|
|
101
|
+
}
|
|
102
|
+
function answerIsEmpty(qItem, qrItem, enableWhenIsActivated, enableWhenItems, enableWhenExpressions) {
|
|
103
|
+
var _a;
|
|
104
|
+
if (isHidden({
|
|
105
|
+
questionnaireItem: qItem,
|
|
106
|
+
enableWhenIsActivated,
|
|
107
|
+
enableWhenItems,
|
|
108
|
+
enableWhenExpressions
|
|
109
|
+
})) {
|
|
110
|
+
return true;
|
|
111
|
+
}
|
|
112
|
+
if (!qrItem.answer) {
|
|
113
|
+
return true;
|
|
114
|
+
}
|
|
115
|
+
if (((_a = qrItem.answer[0]) === null || _a === void 0 ? void 0 : _a.valueString) === '') {
|
|
116
|
+
return true;
|
|
117
|
+
}
|
|
118
|
+
return false;
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=removeEmptyAnswers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"removeEmptyAnswers.js","sourceRoot":"","sources":["../../src/utils/removeEmptyAnswers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AASH,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAUnC;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAAgC;IACjE,MAAM,EACJ,aAAa,EACb,qBAAqB,EACrB,qBAAqB,EACrB,eAAe,EACf,qBAAqB,EACtB,GAAG,MAAM,CAAC;IAEX,MAAM,cAAc,GAAG,aAAa,CAAC,IAAI,CAAC;IAC1C,MAAM,eAAe,GAAG,qBAAqB,CAAC,IAAI,CAAC;IACnD,IACE,CAAC,cAAc;QACf,cAAc,CAAC,MAAM,KAAK,CAAC;QAC3B,CAAC,eAAe;QAChB,eAAe,CAAC,MAAM,KAAK,CAAC,EAC5B;QACA,OAAO,qBAAqB,CAAC;KAC9B;IAED,eAAe,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QACpC,MAAM,KAAK,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;QAChC,MAAM,iBAAiB,GAAG,mCAAmC,CAAC;YAC5D,KAAK;YACL,MAAM;YACN,qBAAqB;YACrB,eAAe;YACf,qBAAqB;SACtB,CAAC,CAAC;QACH,IAAI,iBAAiB,IAAI,qBAAqB,CAAC,IAAI,EAAE;YACnD,qBAAqB,CAAC,IAAI,CAAC,CAAC,CAAC,qBAAQ,iBAAiB,CAAE,CAAC;SAC1D;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,qBAAqB,CAAC;AAC/B,CAAC;AAUD,SAAS,mCAAmC,CAC1C,MAAiD;IAEjD,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,qBAAqB,EAAE,eAAe,EAAE,qBAAqB,EAAE,GAAG,MAAM,CAAC;IAEhG,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC;IAC1B,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC;IAE5B,sBAAsB;IACtB,IAAI,MAAM,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;QAC/B,kDAAkD;QAClD,IACE,QAAQ,CAAC;YACP,iBAAiB,EAAE,KAAK;YACxB,qBAAqB;YACrB,eAAe;YACf,qBAAqB;SACtB,CAAC,EACF;YACA,OAAO,IAAI,CAAC;SACb;QAED,IAAI,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE;YACjC,MAAM,UAAU,GAAgC,EAAE,CAAC;YAEnD,kFAAkF;YAClF,2EAA2E;YAC3E,KACE,IAAI,UAAU,GAAG,CAAC,EAAE,WAAW,GAAG,CAAC,EACnC,UAAU,GAAG,MAAM,CAAC,MAAM,IAAI,WAAW,GAAG,OAAO,CAAC,MAAM,EAC1D,UAAU,EAAE,EACZ;gBACA,kEAAkE;gBAClE,IAAI,OAAO,CAAC,WAAW,CAAC,IAAI,MAAM,CAAC,UAAU,CAAC,CAAC,MAAM,KAAK,OAAO,CAAC,WAAW,CAAC,CAAC,MAAM,EAAE;oBACrF,MAAM,SAAS,GAAG,mCAAmC,CAAC;wBACpD,KAAK,EAAE,MAAM,CAAC,UAAU,CAAC;wBACzB,MAAM,EAAE,OAAO,CAAC,WAAW,CAAC;wBAC5B,qBAAqB;wBACrB,eAAe;wBACf,qBAAqB;qBACtB,CAAC,CAAC;oBAEH,IAAI,SAAS,EAAE;wBACb,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;qBAC5B;oBAED,2EAA2E;oBAC3E,+FAA+F;oBAC/F,IACE,OAAO,CAAC,MAAM,KAAK,WAAW,GAAG,CAAC;wBAClC,OAAO,CAAC,WAAW,CAAC,CAAC,MAAM,KAAK,OAAO,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,MAAM,EAC/D;wBACA,UAAU,EAAE,CAAC;qBACd;oBAED,mGAAmG;oBACnG,WAAW,EAAE,CAAC;iBACf;aACF;YACD,uCAAY,MAAM,KAAE,IAAI,EAAE,UAAU,IAAG;SACxC;QAED,uCAAuC;QACvC,OAAO,aAAa,CAClB,KAAK,EACL,MAAM,EACN,qBAAqB,EACrB,eAAe,EACf,qBAAqB,CACtB;YACC,CAAC,CAAC,IAAI;YACN,CAAC,CAAC,MAAM,CAAC;KACZ;IAED,0BAA0B;IAC1B,OAAO,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,qBAAqB,EAAE,eAAe,EAAE,qBAAqB,CAAC;QAChG,CAAC,CAAC,IAAI;QACN,CAAC,mBAAM,MAAM,CAAE,CAAC;AACpB,CAAC;AAED,SAAS,aAAa,CACpB,KAAwB,EACxB,MAAiC,EACjC,qBAA8B,EAC9B,eAAgC,EAChC,qBAA2D;;IAE3D,IACE,QAAQ,CAAC;QACP,iBAAiB,EAAE,KAAK;QACxB,qBAAqB;QACrB,eAAe;QACf,qBAAqB;KACtB,CAAC,EACF;QACA,OAAO,IAAI,CAAC;KACb;IAED,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;QAClB,OAAO,IAAI,CAAC;KACb;IAED,IAAI,CAAA,MAAA,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,0CAAE,WAAW,MAAK,EAAE,EAAE;QACxC,OAAO,IAAI,CAAC;KACb;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aehrc/smart-forms-renderer",
|
|
3
|
-
"version": "0.10.
|
|
3
|
+
"version": "0.10.4",
|
|
4
4
|
"description": "FHIR Structured Data Captured (SDC) rendering engine for Smart Forms",
|
|
5
5
|
"main": "lib/index.js",
|
|
6
6
|
"scripts": {
|
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
"nanoid": "^5.0.1",
|
|
37
37
|
"react-beautiful-dnd": "^13.1.1",
|
|
38
38
|
"react-markdown": "^8.0.7",
|
|
39
|
-
"zustand": "^4.4.
|
|
39
|
+
"zustand": "^4.4.6"
|
|
40
40
|
},
|
|
41
41
|
"peerDependencies": {
|
|
42
42
|
"@emotion/react": ">=11.11.0",
|
|
@@ -71,13 +71,13 @@
|
|
|
71
71
|
"@types/lodash.debounce": "^4.0.7",
|
|
72
72
|
"@types/react": "^18.2.37",
|
|
73
73
|
"@types/react-beautiful-dnd": "^13.1.7",
|
|
74
|
-
"@types/react-dom": "^18.2.
|
|
74
|
+
"@types/react-dom": "^18.2.17",
|
|
75
75
|
"chokidar": "^3.5.3",
|
|
76
76
|
"jest": "^29.7.0",
|
|
77
77
|
"jest-environment-jsdom": "^29.7.0",
|
|
78
78
|
"react": "^18.2.0",
|
|
79
79
|
"react-dom": "^18.2.0",
|
|
80
|
-
"storybook": "^7.
|
|
80
|
+
"storybook": "^7.5.3",
|
|
81
81
|
"ts-jest": "^29.1.1",
|
|
82
82
|
"tslib": "^2.6.2",
|
|
83
83
|
"typescript": "^5.2.2"
|
|
@@ -45,14 +45,20 @@ const FormBodyTabListWrapper = memo(function FormBodyTabListWrapper(
|
|
|
45
45
|
return (
|
|
46
46
|
<Card sx={{ p: 0.75, mb: 2 }}>
|
|
47
47
|
<Box sx={{ flexGrow: 1 }}>
|
|
48
|
-
<PrimarySelectableList
|
|
48
|
+
<PrimarySelectableList
|
|
49
|
+
dense
|
|
50
|
+
disablePadding
|
|
51
|
+
sx={{ mb: 0.5, mt: completedDisplayItemExists ? 0 : 0.5 }}
|
|
52
|
+
data-test="renderer-tab-list">
|
|
49
53
|
{completedDisplayItemExists ? (
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
+
<>
|
|
55
|
+
<ShowCompletedTabsSection
|
|
56
|
+
completedTabsExpanded={completedTabsExpanded}
|
|
57
|
+
setCompletedTabsExpanded={setCompletedTabsExpanded}
|
|
58
|
+
/>
|
|
59
|
+
<Divider sx={{ mx: 1 }} light />
|
|
60
|
+
</>
|
|
54
61
|
) : null}
|
|
55
|
-
<Divider sx={{ mx: 1 }} light />
|
|
56
62
|
<FormBodyTabList
|
|
57
63
|
topLevelItems={topLevelItems}
|
|
58
64
|
currentTabIndex={currentTabIndex}
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
|
|
18
18
|
import type { Questionnaire, QuestionnaireResponse } from 'fhir/r4';
|
|
19
19
|
import { useLayoutEffect, useState } from 'react';
|
|
20
|
-
import {
|
|
20
|
+
import { initialiseQuestionnaireResponse } from '../utils/qrItem';
|
|
21
21
|
import type Client from 'fhirclient/lib/Client';
|
|
22
22
|
import { readEncounter, readPatient, readUser } from '../api/smartClient';
|
|
23
23
|
import {
|
|
@@ -79,7 +79,7 @@ function useInitialiseRenderer(
|
|
|
79
79
|
additionalVariables,
|
|
80
80
|
terminologyServerUrl
|
|
81
81
|
).then(() => {
|
|
82
|
-
buildSourceResponse(
|
|
82
|
+
buildSourceResponse(initialiseQuestionnaireResponse(questionnaire));
|
|
83
83
|
|
|
84
84
|
if (questionnaireResponse) {
|
|
85
85
|
const updatedResponse = updatePopulatedProperties(questionnaireResponse);
|
package/src/index.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { questionnaireResponseStore, questionnaireStore } from './stores';
|
|
2
2
|
import type { Questionnaire, QuestionnaireResponse } from 'fhir/r4';
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
3
|
+
import { initialiseQuestionnaireResponse } from './utils/qrItem';
|
|
4
|
+
import { removeEmptyAnswers } from './utils/removeEmptyAnswers';
|
|
5
5
|
import type { ItemToRepopulate } from './utils/repopulateItems';
|
|
6
6
|
import { getItemsToRepopulate } from './utils/repopulateItems';
|
|
7
7
|
import { repopulateItemsIntoResponse } from './utils/repopulateIntoResponse';
|
|
@@ -25,13 +25,16 @@ export async function buildForm(
|
|
|
25
25
|
await questionnaireStore.getState().buildSourceQuestionnaire(questionnaire);
|
|
26
26
|
|
|
27
27
|
if (!questionnaireResponse) {
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
.buildSourceResponse(createEmptyQuestionnaireResponse(questionnaire));
|
|
28
|
+
const initialisedQuestionnaireResponse = initialiseQuestionnaireResponse(questionnaire);
|
|
29
|
+
questionnaireResponseStore.getState().buildSourceResponse(initialisedQuestionnaireResponse);
|
|
31
30
|
return;
|
|
32
31
|
}
|
|
33
32
|
|
|
34
|
-
|
|
33
|
+
const initialisedQuestionnaireResponse = initialiseQuestionnaireResponse(
|
|
34
|
+
questionnaire,
|
|
35
|
+
questionnaireResponse
|
|
36
|
+
);
|
|
37
|
+
questionnaireResponseStore.getState().buildSourceResponse(initialisedQuestionnaireResponse);
|
|
35
38
|
questionnaireStore.getState().updatePopulatedProperties(questionnaireResponse);
|
|
36
39
|
}
|
|
37
40
|
|
|
@@ -61,7 +64,7 @@ export function getResponse(): QuestionnaireResponse {
|
|
|
61
64
|
*
|
|
62
65
|
* @author Sean Fong
|
|
63
66
|
*/
|
|
64
|
-
export function
|
|
67
|
+
export function removeEmptyAnswersFromResponse(
|
|
65
68
|
questionnaire: Questionnaire,
|
|
66
69
|
questionnaireResponse: QuestionnaireResponse
|
|
67
70
|
): QuestionnaireResponse {
|
|
@@ -69,7 +72,7 @@ export function removeHiddenAnswersFromResponse(
|
|
|
69
72
|
const enableWhenItems = questionnaireStore.getState().enableWhenItems;
|
|
70
73
|
const enableWhenExpressions = questionnaireStore.getState().enableWhenExpressions;
|
|
71
74
|
|
|
72
|
-
return
|
|
75
|
+
return removeEmptyAnswers({
|
|
73
76
|
questionnaire,
|
|
74
77
|
questionnaireResponse,
|
|
75
78
|
enableWhenIsActivated,
|
package/src/utils/qrItem.ts
CHANGED
|
@@ -25,20 +25,28 @@ import type {
|
|
|
25
25
|
import type { QrRepeatGroup } from '../interfaces/repeatGroup.interface';
|
|
26
26
|
|
|
27
27
|
/**
|
|
28
|
-
*
|
|
28
|
+
* Initialise a conformant questionnaireResponse from a given questionnaire
|
|
29
|
+
* optionally takes in an existing questionnaireResponse to be initialised
|
|
29
30
|
*
|
|
30
31
|
* @author Sean Fong
|
|
31
32
|
*/
|
|
32
|
-
export function
|
|
33
|
-
questionnaire: Questionnaire
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
33
|
+
export function initialiseQuestionnaireResponse(
|
|
34
|
+
questionnaire: Questionnaire,
|
|
35
|
+
questionnaireResponse?: QuestionnaireResponse
|
|
36
|
+
) {
|
|
37
|
+
if (!questionnaireResponse) {
|
|
38
|
+
questionnaireResponse = {
|
|
39
|
+
resourceType: 'QuestionnaireResponse',
|
|
40
|
+
status: 'in-progress'
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
if (!questionnaireResponse.status) {
|
|
45
|
+
questionnaireResponse.status = 'in-progress';
|
|
46
|
+
}
|
|
40
47
|
|
|
41
|
-
|
|
48
|
+
const firstTopLevelItem = questionnaire?.item?.[0];
|
|
49
|
+
if (firstTopLevelItem && !questionnaireResponse.item) {
|
|
42
50
|
questionnaireResponse.item = [
|
|
43
51
|
{
|
|
44
52
|
linkId: firstTopLevelItem.linkId,
|
|
@@ -48,13 +56,31 @@ export function createEmptyQuestionnaireResponse(
|
|
|
48
56
|
];
|
|
49
57
|
}
|
|
50
58
|
|
|
51
|
-
if (questionnaire
|
|
52
|
-
questionnaireResponse.questionnaire =
|
|
59
|
+
if (!questionnaireResponse.questionnaire) {
|
|
60
|
+
questionnaireResponse.questionnaire = setQuestionnaireReference(questionnaire);
|
|
53
61
|
}
|
|
54
62
|
|
|
55
63
|
return questionnaireResponse;
|
|
56
64
|
}
|
|
57
65
|
|
|
66
|
+
export function setQuestionnaireReference(questionnaire: Questionnaire) {
|
|
67
|
+
// Use {url}|{version} - the ideal way
|
|
68
|
+
if (questionnaire.url) {
|
|
69
|
+
let questionnaireReference = questionnaire.url;
|
|
70
|
+
if (questionnaire.version) {
|
|
71
|
+
questionnaireReference += '|' + questionnaire.version;
|
|
72
|
+
}
|
|
73
|
+
return questionnaireReference;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// If no url exists, use Questionnaire/{id}
|
|
77
|
+
if (questionnaire.id) {
|
|
78
|
+
return `Questionnaire/${questionnaire.id}`;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
return '';
|
|
82
|
+
}
|
|
83
|
+
|
|
58
84
|
/**
|
|
59
85
|
* Remove items with no answers from a given questionnaireResponse
|
|
60
86
|
* Also remove any starting or trailing whitespace from valueStrings
|
|
@@ -24,7 +24,7 @@ import type {
|
|
|
24
24
|
import type { EnableWhenExpression, EnableWhenItems } from '../interfaces/enableWhen.interface';
|
|
25
25
|
import { isHidden } from './qItem';
|
|
26
26
|
|
|
27
|
-
interface
|
|
27
|
+
interface removeEmptyAnswersParams {
|
|
28
28
|
questionnaire: Questionnaire;
|
|
29
29
|
questionnaireResponse: QuestionnaireResponse;
|
|
30
30
|
enableWhenIsActivated: boolean;
|
|
@@ -33,11 +33,11 @@ interface removeHiddenAnswersParams {
|
|
|
33
33
|
}
|
|
34
34
|
|
|
35
35
|
/**
|
|
36
|
-
* Recursively go through the questionnaireResponse and remove qrItems whose qItems are
|
|
36
|
+
* Recursively go through the questionnaireResponse and remove qrItems whose qItems are empty in the form
|
|
37
37
|
*
|
|
38
38
|
* @author Sean Fong
|
|
39
39
|
*/
|
|
40
|
-
export function
|
|
40
|
+
export function removeEmptyAnswers(params: removeEmptyAnswersParams): QuestionnaireResponse {
|
|
41
41
|
const {
|
|
42
42
|
questionnaire,
|
|
43
43
|
questionnaireResponse,
|
|
@@ -59,7 +59,7 @@ export function removeHiddenAnswers(params: removeHiddenAnswersParams): Question
|
|
|
59
59
|
|
|
60
60
|
topLevelQRItems.forEach((qrItem, i) => {
|
|
61
61
|
const qItem = topLevelQItems[i];
|
|
62
|
-
const newTopLevelQRItem =
|
|
62
|
+
const newTopLevelQRItem = removeEmptyAnswersFromItemRecursive({
|
|
63
63
|
qItem,
|
|
64
64
|
qrItem,
|
|
65
65
|
enableWhenIsActivated,
|
|
@@ -74,7 +74,7 @@ export function removeHiddenAnswers(params: removeHiddenAnswersParams): Question
|
|
|
74
74
|
return questionnaireResponse;
|
|
75
75
|
}
|
|
76
76
|
|
|
77
|
-
interface
|
|
77
|
+
interface removeEmptyAnswersFromItemRecursiveParams {
|
|
78
78
|
qItem: QuestionnaireItem;
|
|
79
79
|
qrItem: QuestionnaireResponseItem;
|
|
80
80
|
enableWhenIsActivated: boolean;
|
|
@@ -82,8 +82,8 @@ interface readQuestionnaireResponseItemRecursiveParams {
|
|
|
82
82
|
enableWhenExpressions: Record<string, EnableWhenExpression>;
|
|
83
83
|
}
|
|
84
84
|
|
|
85
|
-
function
|
|
86
|
-
params:
|
|
85
|
+
function removeEmptyAnswersFromItemRecursive(
|
|
86
|
+
params: removeEmptyAnswersFromItemRecursiveParams
|
|
87
87
|
): QuestionnaireResponseItem | null {
|
|
88
88
|
const { qItem, qrItem, enableWhenIsActivated, enableWhenItems, enableWhenExpressions } = params;
|
|
89
89
|
|
|
@@ -116,7 +116,7 @@ function readQuestionnaireResponseItemRecursive(
|
|
|
116
116
|
) {
|
|
117
117
|
// Save qrItem if linkIds of current qItem and qrItem are the same
|
|
118
118
|
if (qrItems[qrItemIndex] && qItems[qItemIndex].linkId === qrItems[qrItemIndex].linkId) {
|
|
119
|
-
const newQrItem =
|
|
119
|
+
const newQrItem = removeEmptyAnswersFromItemRecursive({
|
|
120
120
|
qItem: qItems[qItemIndex],
|
|
121
121
|
qrItem: qrItems[qrItemIndex],
|
|
122
122
|
enableWhenIsActivated,
|
|
@@ -144,17 +144,49 @@ function readQuestionnaireResponseItemRecursive(
|
|
|
144
144
|
return { ...qrItem, item: newQrItems };
|
|
145
145
|
}
|
|
146
146
|
|
|
147
|
-
// Also perform
|
|
148
|
-
return
|
|
147
|
+
// Also perform checks if answer exists
|
|
148
|
+
return answerIsEmpty(
|
|
149
|
+
qItem,
|
|
150
|
+
qrItem,
|
|
151
|
+
enableWhenIsActivated,
|
|
152
|
+
enableWhenItems,
|
|
153
|
+
enableWhenExpressions
|
|
154
|
+
)
|
|
155
|
+
? null
|
|
156
|
+
: qrItem;
|
|
149
157
|
}
|
|
150
158
|
|
|
151
159
|
// Process non-group items
|
|
152
|
-
return
|
|
153
|
-
questionnaireItem: qItem,
|
|
154
|
-
enableWhenIsActivated,
|
|
155
|
-
enableWhenItems,
|
|
156
|
-
enableWhenExpressions
|
|
157
|
-
})
|
|
160
|
+
return answerIsEmpty(qItem, qrItem, enableWhenIsActivated, enableWhenItems, enableWhenExpressions)
|
|
158
161
|
? null
|
|
159
162
|
: { ...qrItem };
|
|
160
163
|
}
|
|
164
|
+
|
|
165
|
+
function answerIsEmpty(
|
|
166
|
+
qItem: QuestionnaireItem,
|
|
167
|
+
qrItem: QuestionnaireResponseItem,
|
|
168
|
+
enableWhenIsActivated: boolean,
|
|
169
|
+
enableWhenItems: EnableWhenItems,
|
|
170
|
+
enableWhenExpressions: Record<string, EnableWhenExpression>
|
|
171
|
+
) {
|
|
172
|
+
if (
|
|
173
|
+
isHidden({
|
|
174
|
+
questionnaireItem: qItem,
|
|
175
|
+
enableWhenIsActivated,
|
|
176
|
+
enableWhenItems,
|
|
177
|
+
enableWhenExpressions
|
|
178
|
+
})
|
|
179
|
+
) {
|
|
180
|
+
return true;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
if (!qrItem.answer) {
|
|
184
|
+
return true;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
if (qrItem.answer[0]?.valueString === '') {
|
|
188
|
+
return true;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
return false;
|
|
192
|
+
}
|