@aehrc/smart-forms-renderer 0.27.2 → 0.27.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/.storybook/main.ts +2 -1
- package/.storybook/preview.ts +6 -1
- package/lib/components/FormComponents/ChoiceItems/ChoiceCheckboxAnswerOptionFields.d.ts +3 -2
- package/lib/components/FormComponents/ChoiceItems/ChoiceCheckboxAnswerOptionFields.js +9 -17
- package/lib/components/FormComponents/ChoiceItems/ChoiceCheckboxAnswerOptionFields.js.map +1 -1
- package/lib/components/FormComponents/ChoiceItems/ChoiceCheckboxAnswerOptionItem.js +12 -9
- package/lib/components/FormComponents/ChoiceItems/ChoiceCheckboxAnswerOptionItem.js.map +1 -1
- package/lib/components/FormComponents/ChoiceItems/ChoiceCheckboxAnswerValueSetFields.d.ts +2 -2
- package/lib/components/FormComponents/ChoiceItems/ChoiceCheckboxAnswerValueSetFields.js +7 -9
- package/lib/components/FormComponents/ChoiceItems/ChoiceCheckboxAnswerValueSetFields.js.map +1 -1
- package/lib/components/FormComponents/ChoiceItems/ChoiceCheckboxAnswerValueSetItem.js +12 -8
- package/lib/components/FormComponents/ChoiceItems/ChoiceCheckboxAnswerValueSetItem.js.map +1 -1
- package/lib/components/FormComponents/ChoiceItems/ChoiceRadioAnswerOptionFields.d.ts +2 -1
- package/lib/components/FormComponents/ChoiceItems/ChoiceRadioAnswerOptionFields.js +3 -3
- package/lib/components/FormComponents/ChoiceItems/ChoiceRadioAnswerOptionFields.js.map +1 -1
- package/lib/components/FormComponents/ChoiceItems/ChoiceRadioAnswerOptionItem.js +6 -4
- package/lib/components/FormComponents/ChoiceItems/ChoiceRadioAnswerOptionItem.js.map +1 -1
- package/lib/components/FormComponents/ChoiceItems/ChoiceRadioAnswerOptionView.d.ts +2 -1
- package/lib/components/FormComponents/ChoiceItems/ChoiceRadioAnswerOptionView.js +3 -3
- package/lib/components/FormComponents/ChoiceItems/ChoiceRadioAnswerOptionView.js.map +1 -1
- package/lib/components/FormComponents/ChoiceItems/ChoiceRadioAnswerValueSetFields.d.ts +2 -2
- package/lib/components/FormComponents/ChoiceItems/ChoiceRadioAnswerValueSetFields.js +5 -7
- package/lib/components/FormComponents/ChoiceItems/ChoiceRadioAnswerValueSetFields.js.map +1 -1
- package/lib/components/FormComponents/ChoiceItems/ChoiceRadioAnswerValueSetItem.js +4 -4
- package/lib/components/FormComponents/ChoiceItems/ChoiceRadioAnswerValueSetItem.js.map +1 -1
- package/lib/components/FormComponents/ChoiceItems/ChoiceSelectAnswerOptionFields.d.ts +2 -1
- package/lib/components/FormComponents/ChoiceItems/ChoiceSelectAnswerOptionFields.js +2 -3
- package/lib/components/FormComponents/ChoiceItems/ChoiceSelectAnswerOptionFields.js.map +1 -1
- package/lib/components/FormComponents/ChoiceItems/ChoiceSelectAnswerOptionItem.js +5 -3
- package/lib/components/FormComponents/ChoiceItems/ChoiceSelectAnswerOptionItem.js.map +1 -1
- package/lib/components/FormComponents/ChoiceItems/ChoiceSelectAnswerOptionView.d.ts +2 -1
- package/lib/components/FormComponents/ChoiceItems/ChoiceSelectAnswerOptionView.js +3 -3
- package/lib/components/FormComponents/ChoiceItems/ChoiceSelectAnswerOptionView.js.map +1 -1
- package/lib/components/FormComponents/DecimalItem/DecimalItem.js +1 -1
- package/lib/components/FormComponents/GroupItem/TabButtonsWrapper.js +20 -20
- package/lib/components/FormComponents/GroupItem/TabButtonsWrapper.js.map +1 -1
- package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceCheckboxAnswerOptionFields.d.ts +3 -2
- package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceCheckboxAnswerOptionFields.js +7 -19
- package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceCheckboxAnswerOptionFields.js.map +1 -1
- package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceCheckboxAnswerOptionItem.js +40 -40
- package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceCheckboxAnswerOptionItem.js.map +1 -1
- package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceItemSwitcher.js +15 -3
- package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceItemSwitcher.js.map +1 -1
- package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceRadioAnswerOptionFields.d.ts +2 -1
- package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceRadioAnswerOptionFields.js +3 -3
- package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceRadioAnswerOptionFields.js.map +1 -1
- package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceRadioAnswerOptionItem.js +27 -26
- package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceRadioAnswerOptionItem.js.map +1 -1
- package/lib/components/FormComponents/StringItem/StringField.js +1 -1
- package/lib/components/FormComponents/StringItem/StringField.js.map +1 -1
- package/lib/hooks/useInitialiseRenderer.js +1 -1
- package/lib/hooks/useInitialiseRenderer.js.map +1 -1
- package/lib/hooks/useNextAndPreviousVisibleTabs.d.ts +7 -0
- package/lib/hooks/useNextAndPreviousVisibleTabs.js +63 -0
- package/lib/hooks/useNextAndPreviousVisibleTabs.js.map +1 -0
- package/lib/hooks/useNextPreviousVisibleTabs.d.ts +6 -0
- package/lib/hooks/useNextPreviousVisibleTabs.js +63 -0
- package/lib/hooks/useNextPreviousVisibleTabs.js.map +1 -0
- package/lib/index.d.ts +0 -7
- package/lib/index.js +0 -24
- package/lib/index.js.map +1 -1
- package/lib/utils/choice.d.ts +1 -7
- package/lib/utils/choice.js +10 -20
- package/lib/utils/choice.js.map +1 -1
- package/lib/utils/enableWhen.js +5 -7
- package/lib/utils/enableWhen.js.map +1 -1
- package/lib/utils/index.d.ts +1 -0
- package/lib/utils/index.js +1 -0
- package/lib/utils/index.js.map +1 -1
- package/lib/utils/openChoice.d.ts +9 -4
- package/lib/utils/openChoice.js +47 -78
- package/lib/utils/openChoice.js.map +1 -1
- package/lib/utils/tabs.d.ts +0 -21
- package/lib/utils/tabs.js +0 -51
- package/lib/utils/tabs.js.map +1 -1
- package/package.json +4 -4
- package/src/components/FormComponents/ChoiceItems/CheckboxOptionList.tsx +82 -0
- package/src/components/FormComponents/ChoiceItems/ChoiceCheckboxAnswerOptionFields.tsx +23 -52
- package/src/components/FormComponents/ChoiceItems/ChoiceCheckboxAnswerOptionItem.tsx +15 -9
- package/src/components/FormComponents/ChoiceItems/ChoiceCheckboxAnswerValueSetFields.tsx +17 -19
- package/src/components/FormComponents/ChoiceItems/ChoiceCheckboxAnswerValueSetItem.tsx +13 -8
- package/src/components/FormComponents/ChoiceItems/ChoiceRadioAnswerOptionFields.tsx +5 -4
- package/src/components/FormComponents/ChoiceItems/ChoiceRadioAnswerOptionItem.tsx +6 -2
- package/src/components/FormComponents/ChoiceItems/ChoiceRadioAnswerOptionView.tsx +5 -1
- package/src/components/FormComponents/ChoiceItems/ChoiceRadioAnswerValueSetFields.tsx +9 -16
- package/src/components/FormComponents/ChoiceItems/ChoiceRadioAnswerValueSetItem.tsx +4 -4
- package/src/components/FormComponents/ChoiceItems/ChoiceSelectAnswerOptionFields.tsx +4 -3
- package/src/components/FormComponents/ChoiceItems/ChoiceSelectAnswerOptionItem.tsx +5 -2
- package/src/components/FormComponents/ChoiceItems/ChoiceSelectAnswerOptionView.tsx +5 -1
- package/src/components/FormComponents/DecimalItem/DecimalItem.tsx +1 -1
- package/src/components/FormComponents/GroupItem/TabButtonsWrapper.tsx +28 -25
- package/src/components/FormComponents/ItemParts/{RadioAnswerOptionButtons.tsx → RadioOptionList.tsx} +7 -7
- package/src/components/FormComponents/OpenChoiceItems/OpenChoiceCheckboxAnswerOptionFields.tsx +18 -50
- package/src/components/FormComponents/OpenChoiceItems/OpenChoiceCheckboxAnswerOptionItem.tsx +70 -68
- package/src/components/FormComponents/OpenChoiceItems/OpenChoiceCheckboxAnswerValueSetFields.tsx +110 -0
- package/src/components/FormComponents/OpenChoiceItems/OpenChoiceCheckboxAnswerValueSetItem.tsx +188 -0
- package/src/components/FormComponents/OpenChoiceItems/OpenChoiceItemSwitcher.tsx +46 -19
- package/src/components/FormComponents/OpenChoiceItems/OpenChoiceRadioAnswerOptionFields.tsx +5 -3
- package/src/components/FormComponents/OpenChoiceItems/OpenChoiceRadioAnswerOptionItem.tsx +37 -29
- package/src/components/FormComponents/OpenChoiceItems/OpenChoiceRadioAnswerValueSetFields.tsx +104 -0
- package/src/components/FormComponents/OpenChoiceItems/OpenChoiceRadioAnswerValueSetItem.tsx +156 -0
- package/src/components/FormComponents/StringItem/StringField.tsx +1 -1
- package/src/hooks/useInitialiseRenderer.ts +1 -1
- package/src/hooks/useNextAndPreviousVisibleTabs.ts +86 -0
- package/src/hooks/useOpenLabel.ts +43 -0
- package/src/index.ts +0 -21
- package/src/stories/BuildFormWrapper.tsx +57 -0
- package/src/stories/assets/questionnaires/QAdvancedAdditionalDisplayContent.ts +83 -0
- package/src/stories/assets/questionnaires/QAdvancedControlAppearance.ts +294 -0
- package/src/stories/assets/questionnaires/QAdvancedOther.ts +495 -0
- package/src/stories/assets/questionnaires/QAdvancedTextApperance.ts +188 -0
- package/src/stories/assets/questionnaires/QAttachment.ts +38 -0
- package/src/stories/assets/questionnaires/QBehaviorCalculations.ts +645 -0
- package/src/stories/assets/questionnaires/QBehaviorChoiceRestriction.ts +281 -0
- package/src/stories/assets/questionnaires/QBehaviorOther.ts +1149 -0
- package/src/stories/assets/questionnaires/QBehaviorValueConstraints.ts +508 -0
- package/src/stories/assets/questionnaires/QBoolean.ts +130 -0
- package/src/stories/assets/questionnaires/QChoice.ts +137 -0
- package/src/stories/assets/questionnaires/QDate.ts +56 -0
- package/src/stories/assets/questionnaires/QDateTime.ts +56 -0
- package/src/stories/assets/questionnaires/QDecimal.ts +56 -0
- package/src/stories/assets/questionnaires/QDisplay.ts +38 -0
- package/src/stories/assets/questionnaires/QGroup.ts +52 -0
- package/src/stories/assets/questionnaires/QInteger.ts +119 -0
- package/src/stories/assets/questionnaires/QItemControlDisplay.ts +114 -0
- package/src/stories/assets/questionnaires/QItemControlGroup.ts +419 -0
- package/src/stories/assets/questionnaires/QItemControlQuestion.ts +1271 -0
- package/src/stories/assets/questionnaires/QOpenChoice.ts +151 -0
- package/src/stories/assets/questionnaires/QQuantity.ts +38 -0
- package/src/stories/assets/questionnaires/QReference.ts +38 -0
- package/src/stories/assets/questionnaires/QSingleItems.ts +251 -0
- package/src/stories/assets/questionnaires/QString.ts +131 -0
- package/src/stories/assets/questionnaires/QText.ts +169 -0
- package/src/stories/assets/questionnaires/QTime.ts +38 -0
- package/src/stories/assets/questionnaires/QUrl.ts +38 -0
- package/src/stories/assets/questionnaires/index.ts +44 -0
- package/src/stories/itemTypes/Attachment.stories.tsx +39 -0
- package/src/stories/itemTypes/Boolean.stories.tsx +72 -0
- package/src/stories/{MedicalHistoryTable.stories.tsx → itemTypes/Choice.stories.tsx} +32 -26
- package/src/stories/itemTypes/Date.stories.tsx +46 -0
- package/src/stories/itemTypes/DateTime.stories.tsx +45 -0
- package/src/stories/itemTypes/Decimal.stories.tsx +56 -0
- package/src/stories/itemTypes/Display.stories.tsx +39 -0
- package/src/stories/itemTypes/Group.stories.tsx +39 -0
- package/src/stories/itemTypes/Integer.stories.tsx +55 -0
- package/src/stories/itemTypes/OpenChoice.stories.tsx +64 -0
- package/src/stories/itemTypes/Quantity.stories.tsx +39 -0
- package/src/stories/itemTypes/Reference.stories.tsx +39 -0
- package/src/stories/itemTypes/String.stories.tsx +51 -0
- package/src/stories/itemTypes/Text.stories.tsx +51 -0
- package/src/stories/itemTypes/Time.stories.tsx +39 -0
- package/src/stories/itemTypes/Url.stories.tsx +39 -0
- package/src/stories/sdc/AdvancedAdditionalDisplayContent.stories.tsx +45 -0
- package/src/stories/sdc/AdvancedControlAppearance.stories.tsx +51 -0
- package/src/stories/sdc/AdvancedOther.stories.tsx +76 -0
- package/src/stories/sdc/AdvancedTextAppearance.stories.tsx +69 -0
- package/src/stories/sdc/BehaviorCalculations.stories.tsx +69 -0
- package/src/stories/sdc/BehaviorChoiceRestriction.stories.tsx +76 -0
- package/src/stories/sdc/BehaviorOther.stories.tsx +90 -0
- package/src/stories/sdc/BehaviorValueConstraints.stories.tsx +88 -0
- package/src/stories/sdc/ItemControlDisplay.stories.tsx +39 -0
- package/src/stories/sdc/ItemControlGroup.stories.tsx +55 -0
- package/src/stories/sdc/ItemControlQuestion.stories.tsx +118 -0
- package/src/utils/buildForm.ts +23 -0
- package/src/utils/choice.ts +16 -23
- package/src/utils/enableWhen.ts +5 -7
- package/src/utils/index.ts +1 -0
- package/src/utils/openChoice.ts +83 -98
- package/src/utils/tabs.ts +0 -75
- package/vite.config.ts +23 -0
- package/doctor-storybook.log +0 -18
- package/src/stories/SmartFormsRenderer.stories.ts +0 -139
- package/src/stories/assets/QItems-and-QRItems/QR_GTableMedicalHistory.json +0 -80
- package/src/stories/assets/QItems-and-QRItems/Q_GTableMedicalHistory.json +0 -109
- package/src/stories/assets/Qs-and-QRs/Q715.json +0 -15086
- package/src/stories/assets/Qs-and-QRs/QDev715.json +0 -16081
- package/src/stories/assets/Qs-and-QRs/QTestGrid.json +0 -411
- package/src/stories/assets/Qs-and-QRs/R715.json +0 -311
- package/src/stories/assets/Qs-and-QRs/RTestGrid.json +0 -34
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openChoice.js","sourceRoot":"","sources":["../../src/utils/openChoice.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;
|
|
1
|
+
{"version":3,"file":"openChoice.js","sourceRoot":"","sources":["../../src/utils/openChoice.ts"],"names":[],"mappings":"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"}
|
package/lib/utils/tabs.d.ts
CHANGED
|
@@ -44,27 +44,6 @@ export declare function constructTabsWithVisibility(params: constructTabsWithVis
|
|
|
44
44
|
linkId: string;
|
|
45
45
|
isVisible: boolean;
|
|
46
46
|
}[];
|
|
47
|
-
interface getVisibleTabIndexParams {
|
|
48
|
-
direction: 'next' | 'previous';
|
|
49
|
-
tabs: Tabs;
|
|
50
|
-
currentTabIndex: number;
|
|
51
|
-
enableWhenIsActivated: boolean;
|
|
52
|
-
enableWhenItems: EnableWhenItems;
|
|
53
|
-
enableWhenExpressions: EnableWhenExpressions;
|
|
54
|
-
}
|
|
55
|
-
/**
|
|
56
|
-
* Get index of next visible tab
|
|
57
|
-
*
|
|
58
|
-
* @author Sean Fong
|
|
59
|
-
*/
|
|
60
|
-
export declare function getVisibleTabIndex(params: getVisibleTabIndexParams): number;
|
|
61
|
-
/**
|
|
62
|
-
*
|
|
63
|
-
* Find number of visible tabs
|
|
64
|
-
*
|
|
65
|
-
* @author Sean Fong
|
|
66
|
-
*/
|
|
67
|
-
export declare function findNumOfVisibleTabs(tabs: Tabs, enableWhenIsActivated: boolean, enableWhenItems: EnableWhenItems, enableWhenExpressions: EnableWhenExpressions): number;
|
|
68
47
|
export declare function getContextDisplays(item: QuestionnaireItem): QuestionnaireItem[];
|
|
69
48
|
interface IsTabHiddenParams {
|
|
70
49
|
qItem: QuestionnaireItem;
|
package/lib/utils/tabs.js
CHANGED
|
@@ -117,57 +117,6 @@ export function constructTabsWithVisibility(params) {
|
|
|
117
117
|
};
|
|
118
118
|
});
|
|
119
119
|
}
|
|
120
|
-
/**
|
|
121
|
-
* Get index of next visible tab
|
|
122
|
-
*
|
|
123
|
-
* @author Sean Fong
|
|
124
|
-
*/
|
|
125
|
-
export function getVisibleTabIndex(params) {
|
|
126
|
-
const { direction, tabs, currentTabIndex, enableWhenIsActivated, enableWhenItems, enableWhenExpressions } = params;
|
|
127
|
-
const tabsWithVisibility = constructTabsWithVisibility({
|
|
128
|
-
tabs,
|
|
129
|
-
enableWhenIsActivated,
|
|
130
|
-
enableWhenItems,
|
|
131
|
-
enableWhenExpressions
|
|
132
|
-
});
|
|
133
|
-
let visibleTabIndex;
|
|
134
|
-
if (direction === 'next') {
|
|
135
|
-
visibleTabIndex = currentTabIndex + 1;
|
|
136
|
-
const nextTabIndexIsVisible = false;
|
|
137
|
-
while (!nextTabIndexIsVisible) {
|
|
138
|
-
if (tabsWithVisibility[visibleTabIndex].isVisible) {
|
|
139
|
-
return visibleTabIndex;
|
|
140
|
-
}
|
|
141
|
-
visibleTabIndex++;
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
else {
|
|
145
|
-
visibleTabIndex = currentTabIndex - 1;
|
|
146
|
-
const previousTabIndexIsVisible = false;
|
|
147
|
-
while (!previousTabIndexIsVisible) {
|
|
148
|
-
if (tabsWithVisibility[visibleTabIndex].isVisible) {
|
|
149
|
-
return visibleTabIndex;
|
|
150
|
-
}
|
|
151
|
-
visibleTabIndex--;
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
return visibleTabIndex;
|
|
155
|
-
}
|
|
156
|
-
/**
|
|
157
|
-
*
|
|
158
|
-
* Find number of visible tabs
|
|
159
|
-
*
|
|
160
|
-
* @author Sean Fong
|
|
161
|
-
*/
|
|
162
|
-
export function findNumOfVisibleTabs(tabs, enableWhenIsActivated, enableWhenItems, enableWhenExpressions) {
|
|
163
|
-
const tabsWithVisibility = constructTabsWithVisibility({
|
|
164
|
-
tabs,
|
|
165
|
-
enableWhenIsActivated,
|
|
166
|
-
enableWhenItems,
|
|
167
|
-
enableWhenExpressions
|
|
168
|
-
});
|
|
169
|
-
return tabsWithVisibility.filter((tab) => tab.isVisible).length;
|
|
170
|
-
}
|
|
171
120
|
export function getContextDisplays(item) {
|
|
172
121
|
if (!item.item || item.item.length === 0) {
|
|
173
122
|
return [];
|
package/lib/utils/tabs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tabs.js","sourceRoot":"","sources":["../../src/utils/tabs.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"tabs.js","sourceRoot":"","sources":["../../src/utils/tabs.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aehrc/smart-forms-renderer",
|
|
3
|
-
"version": "0.27.
|
|
3
|
+
"version": "0.27.4",
|
|
4
4
|
"description": "FHIR Structured Data Captured (SDC) rendering engine for Smart Forms",
|
|
5
5
|
"main": "lib/index.js",
|
|
6
6
|
"scripts": {
|
|
@@ -25,8 +25,6 @@
|
|
|
25
25
|
"homepage": "https://github.com/aehrc/smart-forms#readme",
|
|
26
26
|
"dependencies": {
|
|
27
27
|
"@iconify/react": "^4.1.1",
|
|
28
|
-
"@storybook/test": "^8.0.10",
|
|
29
|
-
"@types/fhir": "^0.0.38",
|
|
30
28
|
"dayjs": "^1.11.10",
|
|
31
29
|
"deep-diff": "^1.0.2",
|
|
32
30
|
"fhirclient": "^2.5.2",
|
|
@@ -55,7 +53,7 @@
|
|
|
55
53
|
},
|
|
56
54
|
"devDependencies": {
|
|
57
55
|
"@babel/core": "^7.24.4",
|
|
58
|
-
"@chromatic-com/storybook": "^1.3.
|
|
56
|
+
"@chromatic-com/storybook": "^1.3.5",
|
|
59
57
|
"@storybook/addon-essentials": "^8.0.10",
|
|
60
58
|
"@storybook/addon-interactions": "^8.0.10",
|
|
61
59
|
"@storybook/addon-links": "^8.0.10",
|
|
@@ -63,12 +61,14 @@
|
|
|
63
61
|
"@storybook/blocks": "^8.0.10",
|
|
64
62
|
"@storybook/react": "^8.0.10",
|
|
65
63
|
"@storybook/react-vite": "^8.0.10",
|
|
64
|
+
"@storybook/test": "^8.0.10",
|
|
66
65
|
"@swc/cli": "^0.1.63",
|
|
67
66
|
"@swc/core": "^1.3.99",
|
|
68
67
|
"@testing-library/jest-dom": "^6.1.2",
|
|
69
68
|
"@testing-library/react": "^14.2.1",
|
|
70
69
|
"@testing-library/react-hooks": "^7.0.2",
|
|
71
70
|
"@types/deep-diff": "^1.0.5",
|
|
71
|
+
"@types/fhir": "^0.0.38",
|
|
72
72
|
"@types/jest": "^29.5.12",
|
|
73
73
|
"@types/lodash.clonedeep": "^4.5.9",
|
|
74
74
|
"@types/lodash.debounce": "^4.0.7",
|
|
@@ -0,0 +1,82 @@
|
|
|
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 React from 'react';
|
|
19
|
+
import type { QuestionnaireItemAnswerOption, QuestionnaireResponseItemAnswer } from 'fhir/r4';
|
|
20
|
+
import CheckboxSingle from '../ItemParts/CheckboxSingle';
|
|
21
|
+
|
|
22
|
+
interface CheckboxOptionListProps {
|
|
23
|
+
options: QuestionnaireItemAnswerOption[];
|
|
24
|
+
answers: QuestionnaireResponseItemAnswer[];
|
|
25
|
+
readOnly: boolean;
|
|
26
|
+
onCheckedChange: (newValue: string) => void;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function CheckboxOptionList(props: CheckboxOptionListProps) {
|
|
30
|
+
const { options, answers, readOnly, onCheckedChange } = props;
|
|
31
|
+
|
|
32
|
+
return (
|
|
33
|
+
<>
|
|
34
|
+
{options.map((option) => {
|
|
35
|
+
if (option['valueCoding']) {
|
|
36
|
+
return (
|
|
37
|
+
<CheckboxSingle
|
|
38
|
+
key={option.valueCoding.code ?? ''}
|
|
39
|
+
value={option.valueCoding.code ?? ''}
|
|
40
|
+
label={option.valueCoding.display ?? `${option.valueCoding.code}`}
|
|
41
|
+
readOnly={readOnly}
|
|
42
|
+
isChecked={answers.some(
|
|
43
|
+
(answer) => JSON.stringify(answer) === JSON.stringify(option)
|
|
44
|
+
)}
|
|
45
|
+
onCheckedChange={onCheckedChange}
|
|
46
|
+
/>
|
|
47
|
+
);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
if (option['valueString']) {
|
|
51
|
+
return (
|
|
52
|
+
<CheckboxSingle
|
|
53
|
+
key={option.valueString}
|
|
54
|
+
value={option.valueString}
|
|
55
|
+
label={option.valueString}
|
|
56
|
+
readOnly={readOnly}
|
|
57
|
+
isChecked={answers.some((answer) => answer.valueString === option.valueString)}
|
|
58
|
+
onCheckedChange={onCheckedChange}
|
|
59
|
+
/>
|
|
60
|
+
);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
if (option['valueInteger']) {
|
|
64
|
+
return (
|
|
65
|
+
<CheckboxSingle
|
|
66
|
+
key={option.valueInteger}
|
|
67
|
+
value={option.valueInteger.toString()}
|
|
68
|
+
label={option.valueInteger.toString()}
|
|
69
|
+
readOnly={readOnly}
|
|
70
|
+
isChecked={answers.some((answer) => answer.valueInteger === option.valueInteger)}
|
|
71
|
+
onCheckedChange={onCheckedChange}
|
|
72
|
+
/>
|
|
73
|
+
);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
return null;
|
|
77
|
+
})}
|
|
78
|
+
</>
|
|
79
|
+
);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
export default CheckboxOptionList;
|
|
@@ -16,72 +16,43 @@
|
|
|
16
16
|
*/
|
|
17
17
|
|
|
18
18
|
import React from 'react';
|
|
19
|
+
import type {
|
|
20
|
+
QuestionnaireItem,
|
|
21
|
+
QuestionnaireItemAnswerOption,
|
|
22
|
+
QuestionnaireResponseItemAnswer
|
|
23
|
+
} from 'fhir/r4';
|
|
24
|
+
import { getChoiceOrientation } from '../../../utils/choice';
|
|
19
25
|
import { ChoiceItemOrientation } from '../../../interfaces/choice.enum';
|
|
20
|
-
import
|
|
21
|
-
import QItemChoiceCheckboxSingle from '../ItemParts/CheckboxSingle';
|
|
26
|
+
import CheckboxOptionList from './CheckboxOptionList';
|
|
22
27
|
import { StyledFormGroup } from '../Item.styles';
|
|
23
|
-
import { getChoiceOrientation } from '../../../utils/choice';
|
|
24
28
|
|
|
25
29
|
interface ChoiceCheckboxAnswerOptionFieldsProps {
|
|
26
30
|
qItem: QuestionnaireItem;
|
|
31
|
+
options: QuestionnaireItemAnswerOption[];
|
|
27
32
|
answers: QuestionnaireResponseItemAnswer[];
|
|
28
33
|
readOnly: boolean;
|
|
29
34
|
onCheckedChange: (newValue: string) => void;
|
|
30
35
|
}
|
|
31
36
|
|
|
32
37
|
function ChoiceCheckboxAnswerOptionFields(props: ChoiceCheckboxAnswerOptionFieldsProps) {
|
|
33
|
-
const { qItem, answers, readOnly, onCheckedChange } = props;
|
|
38
|
+
const { qItem, options, answers, readOnly, onCheckedChange } = props;
|
|
34
39
|
|
|
35
40
|
const orientation = getChoiceOrientation(qItem) ?? ChoiceItemOrientation.Vertical;
|
|
36
41
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
{
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
/>
|
|
52
|
-
);
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
if (option['valueString']) {
|
|
56
|
-
return (
|
|
57
|
-
<QItemChoiceCheckboxSingle
|
|
58
|
-
key={option.valueString}
|
|
59
|
-
value={option.valueString}
|
|
60
|
-
label={option.valueString}
|
|
61
|
-
readOnly={readOnly}
|
|
62
|
-
isChecked={answers.some((answer) => answer.valueString === option.valueString)}
|
|
63
|
-
onCheckedChange={onCheckedChange}
|
|
64
|
-
/>
|
|
65
|
-
);
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
if (option['valueInteger']) {
|
|
69
|
-
return (
|
|
70
|
-
<QItemChoiceCheckboxSingle
|
|
71
|
-
key={option.valueInteger}
|
|
72
|
-
value={option.valueInteger.toString()}
|
|
73
|
-
label={option.valueInteger.toString()}
|
|
74
|
-
readOnly={readOnly}
|
|
75
|
-
isChecked={answers.some((answer) => answer.valueInteger === option.valueInteger)}
|
|
76
|
-
onCheckedChange={onCheckedChange}
|
|
77
|
-
/>
|
|
78
|
-
);
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
return null;
|
|
82
|
-
})}
|
|
83
|
-
</StyledFormGroup>
|
|
84
|
-
);
|
|
42
|
+
if (options.length > 0) {
|
|
43
|
+
return (
|
|
44
|
+
<StyledFormGroup row={orientation === ChoiceItemOrientation.Horizontal}>
|
|
45
|
+
<CheckboxOptionList
|
|
46
|
+
options={options}
|
|
47
|
+
answers={answers}
|
|
48
|
+
readOnly={readOnly}
|
|
49
|
+
onCheckedChange={onCheckedChange}
|
|
50
|
+
/>
|
|
51
|
+
</StyledFormGroup>
|
|
52
|
+
);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
return null;
|
|
85
56
|
}
|
|
86
57
|
|
|
87
58
|
export default ChoiceCheckboxAnswerOptionFields;
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
import React from 'react';
|
|
19
19
|
import type { QuestionnaireItem, QuestionnaireResponseItem } from 'fhir/r4';
|
|
20
20
|
import { createEmptyQrItem } from '../../../utils/qrItem';
|
|
21
|
-
import {
|
|
21
|
+
import { updateChoiceCheckboxAnswers } from '../../../utils/choice';
|
|
22
22
|
import { FullWidthFormComponentBox } from '../../Box.styles';
|
|
23
23
|
import useRenderingExtensions from '../../../hooks/useRenderingExtensions';
|
|
24
24
|
import type {
|
|
@@ -29,10 +29,10 @@ import type {
|
|
|
29
29
|
PropsWithShowMinimalViewAttribute
|
|
30
30
|
} from '../../../interfaces/renderProps.interface';
|
|
31
31
|
import DisplayInstructions from '../DisplayItem/DisplayInstructions';
|
|
32
|
-
import ChoiceCheckboxAnswerValueSetFields from './ChoiceCheckboxAnswerOptionFields';
|
|
33
32
|
import useReadOnly from '../../../hooks/useReadOnly';
|
|
34
33
|
import ItemFieldGrid from '../ItemParts/ItemFieldGrid';
|
|
35
34
|
import { useQuestionnaireStore } from '../../../stores';
|
|
35
|
+
import ChoiceCheckboxAnswerOptionFields from './ChoiceCheckboxAnswerOptionFields';
|
|
36
36
|
|
|
37
37
|
interface ChoiceCheckboxAnswerOptionItemProps
|
|
38
38
|
extends PropsWithQrItemChangeHandler,
|
|
@@ -59,7 +59,7 @@ function ChoiceCheckboxAnswerOptionItem(props: ChoiceCheckboxAnswerOptionItemPro
|
|
|
59
59
|
|
|
60
60
|
// Init input value
|
|
61
61
|
const qrChoiceCheckbox = qrItem ?? createEmptyQrItem(qItem);
|
|
62
|
-
const answers = qrChoiceCheckbox.answer
|
|
62
|
+
const answers = qrChoiceCheckbox.answer ?? [];
|
|
63
63
|
|
|
64
64
|
const readOnly = useReadOnly(qItem, parentIsReadOnly);
|
|
65
65
|
const { displayInstructions } = useRenderingExtensions(qItem);
|
|
@@ -68,15 +68,19 @@ function ChoiceCheckboxAnswerOptionItem(props: ChoiceCheckboxAnswerOptionItemPro
|
|
|
68
68
|
// This requires its own hook, because in the case of multi-select, we need to check if the value is already checked to prevent an infinite loop
|
|
69
69
|
// This will be done after the choice/open-choice refactoring
|
|
70
70
|
|
|
71
|
+
const options = qItem.answerOption ?? [];
|
|
72
|
+
|
|
71
73
|
// Event handlers
|
|
72
74
|
function handleCheckedChange(changedValue: string) {
|
|
73
|
-
|
|
74
|
-
|
|
75
|
+
if (options.length === 0) {
|
|
76
|
+
onQrItemChange(createEmptyQrItem(qItem));
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
75
79
|
|
|
76
|
-
const updatedQrChoiceCheckbox =
|
|
80
|
+
const updatedQrChoiceCheckbox = updateChoiceCheckboxAnswers(
|
|
77
81
|
changedValue,
|
|
78
82
|
answers,
|
|
79
|
-
|
|
83
|
+
options,
|
|
80
84
|
qrChoiceCheckbox,
|
|
81
85
|
isRepeated
|
|
82
86
|
);
|
|
@@ -89,8 +93,9 @@ function ChoiceCheckboxAnswerOptionItem(props: ChoiceCheckboxAnswerOptionItemPro
|
|
|
89
93
|
if (showMinimalView) {
|
|
90
94
|
return (
|
|
91
95
|
<>
|
|
92
|
-
<
|
|
96
|
+
<ChoiceCheckboxAnswerOptionFields
|
|
93
97
|
qItem={qItem}
|
|
98
|
+
options={options}
|
|
94
99
|
answers={answers}
|
|
95
100
|
readOnly={readOnly}
|
|
96
101
|
onCheckedChange={handleCheckedChange}
|
|
@@ -106,8 +111,9 @@ function ChoiceCheckboxAnswerOptionItem(props: ChoiceCheckboxAnswerOptionItemPro
|
|
|
106
111
|
data-linkid={qItem.linkId}
|
|
107
112
|
onClick={() => onFocusLinkId(qItem.linkId)}>
|
|
108
113
|
<ItemFieldGrid qItem={qItem} readOnly={readOnly}>
|
|
109
|
-
<
|
|
114
|
+
<ChoiceCheckboxAnswerOptionFields
|
|
110
115
|
qItem={qItem}
|
|
116
|
+
options={options}
|
|
111
117
|
answers={answers}
|
|
112
118
|
readOnly={readOnly}
|
|
113
119
|
onCheckedChange={handleCheckedChange}
|
|
@@ -16,19 +16,23 @@
|
|
|
16
16
|
*/
|
|
17
17
|
|
|
18
18
|
import React from 'react';
|
|
19
|
-
import {
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
19
|
+
import type {
|
|
20
|
+
QuestionnaireItem,
|
|
21
|
+
QuestionnaireItemAnswerOption,
|
|
22
|
+
QuestionnaireResponseItemAnswer
|
|
23
|
+
} from 'fhir/r4';
|
|
23
24
|
import { StyledAlert } from '../../Alert.styles';
|
|
24
25
|
import ErrorOutlineIcon from '@mui/icons-material/ErrorOutline';
|
|
25
26
|
import Typography from '@mui/material/Typography';
|
|
26
27
|
import type { TerminologyError } from '../../../hooks/useValueSetCodings';
|
|
27
28
|
import { getChoiceOrientation } from '../../../utils/choice';
|
|
29
|
+
import { ChoiceItemOrientation } from '../../../interfaces/choice.enum';
|
|
30
|
+
import CheckboxOptionList from './CheckboxOptionList';
|
|
31
|
+
import { StyledFormGroup } from '../Item.styles';
|
|
28
32
|
|
|
29
33
|
interface ChoiceCheckboxAnswerValueSetFieldsProps {
|
|
30
34
|
qItem: QuestionnaireItem;
|
|
31
|
-
|
|
35
|
+
options: QuestionnaireItemAnswerOption[];
|
|
32
36
|
answers: QuestionnaireResponseItemAnswer[];
|
|
33
37
|
readOnly: boolean;
|
|
34
38
|
terminologyError: TerminologyError;
|
|
@@ -36,25 +40,19 @@ interface ChoiceCheckboxAnswerValueSetFieldsProps {
|
|
|
36
40
|
}
|
|
37
41
|
|
|
38
42
|
function ChoiceCheckboxAnswerValueSetFields(props: ChoiceCheckboxAnswerValueSetFieldsProps) {
|
|
39
|
-
const { qItem,
|
|
43
|
+
const { qItem, options, answers, readOnly, terminologyError, onCheckedChange } = props;
|
|
40
44
|
|
|
41
45
|
const orientation = getChoiceOrientation(qItem) ?? ChoiceItemOrientation.Vertical;
|
|
42
46
|
|
|
43
|
-
if (
|
|
47
|
+
if (options.length > 0) {
|
|
44
48
|
return (
|
|
45
49
|
<StyledFormGroup row={orientation === ChoiceItemOrientation.Horizontal}>
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
isChecked={answers.some(
|
|
53
|
-
(answer) => JSON.stringify(answer.valueCoding) === JSON.stringify(coding)
|
|
54
|
-
)}
|
|
55
|
-
onCheckedChange={onCheckedChange}
|
|
56
|
-
/>
|
|
57
|
-
))}
|
|
50
|
+
<CheckboxOptionList
|
|
51
|
+
options={options}
|
|
52
|
+
answers={answers}
|
|
53
|
+
readOnly={readOnly}
|
|
54
|
+
onCheckedChange={onCheckedChange}
|
|
55
|
+
/>
|
|
58
56
|
</StyledFormGroup>
|
|
59
57
|
);
|
|
60
58
|
}
|
|
@@ -15,11 +15,11 @@
|
|
|
15
15
|
* limitations under the License.
|
|
16
16
|
*/
|
|
17
17
|
|
|
18
|
-
import React from 'react';
|
|
18
|
+
import React, { useMemo } from 'react';
|
|
19
19
|
import type { QuestionnaireItem, QuestionnaireResponseItem } from 'fhir/r4';
|
|
20
20
|
import { createEmptyQrItem } from '../../../utils/qrItem';
|
|
21
21
|
import useValueSetCodings from '../../../hooks/useValueSetCodings';
|
|
22
|
-
import {
|
|
22
|
+
import { convertCodingsToAnswerOptions, updateChoiceCheckboxAnswers } from '../../../utils/choice';
|
|
23
23
|
import { FullWidthFormComponentBox } from '../../Box.styles';
|
|
24
24
|
import useRenderingExtensions from '../../../hooks/useRenderingExtensions';
|
|
25
25
|
import type {
|
|
@@ -61,7 +61,7 @@ function ChoiceCheckboxAnswerValueSetItem(props: ChoiceCheckboxAnswerValueSetIte
|
|
|
61
61
|
|
|
62
62
|
// Init input value
|
|
63
63
|
const qrChoiceCheckbox = qrItem ?? createEmptyQrItem(qItem);
|
|
64
|
-
const answers = qrChoiceCheckbox.answer
|
|
64
|
+
const answers = qrChoiceCheckbox.answer ?? [];
|
|
65
65
|
|
|
66
66
|
const readOnly = useReadOnly(qItem, parentIsReadOnly);
|
|
67
67
|
const { displayInstructions } = useRenderingExtensions(qItem);
|
|
@@ -69,18 +69,23 @@ function ChoiceCheckboxAnswerValueSetItem(props: ChoiceCheckboxAnswerValueSetIte
|
|
|
69
69
|
// Get codings/options from valueSet
|
|
70
70
|
const { codings, terminologyError } = useValueSetCodings(qItem);
|
|
71
71
|
|
|
72
|
+
const options = useMemo(() => convertCodingsToAnswerOptions(codings), [codings]);
|
|
73
|
+
|
|
72
74
|
// TODO Process calculated expressions
|
|
73
75
|
// This requires its own hook, because in the case of multi-select, we need to check if the value is already checked to prevent an infinite loop
|
|
74
76
|
// This will be done after the choice/open-choice refactoring
|
|
75
77
|
|
|
76
78
|
// Event handlers
|
|
77
79
|
function handleCheckedChange(changedValue: string) {
|
|
78
|
-
if (
|
|
80
|
+
if (options.length === 0) {
|
|
81
|
+
onQrItemChange(createEmptyQrItem(qItem));
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
79
84
|
|
|
80
|
-
const updatedQrChoiceCheckbox =
|
|
85
|
+
const updatedQrChoiceCheckbox = updateChoiceCheckboxAnswers(
|
|
81
86
|
changedValue,
|
|
82
87
|
answers,
|
|
83
|
-
|
|
88
|
+
options,
|
|
84
89
|
qrChoiceCheckbox,
|
|
85
90
|
isRepeated
|
|
86
91
|
);
|
|
@@ -95,7 +100,7 @@ function ChoiceCheckboxAnswerValueSetItem(props: ChoiceCheckboxAnswerValueSetIte
|
|
|
95
100
|
<>
|
|
96
101
|
<ChoiceCheckboxAnswerValueSetFields
|
|
97
102
|
qItem={qItem}
|
|
98
|
-
|
|
103
|
+
options={options}
|
|
99
104
|
answers={answers}
|
|
100
105
|
readOnly={readOnly}
|
|
101
106
|
terminologyError={terminologyError}
|
|
@@ -114,7 +119,7 @@ function ChoiceCheckboxAnswerValueSetItem(props: ChoiceCheckboxAnswerValueSetIte
|
|
|
114
119
|
<ItemFieldGrid qItem={qItem} readOnly={readOnly}>
|
|
115
120
|
<ChoiceCheckboxAnswerValueSetFields
|
|
116
121
|
qItem={qItem}
|
|
117
|
-
|
|
122
|
+
options={options}
|
|
118
123
|
answers={answers}
|
|
119
124
|
readOnly={readOnly}
|
|
120
125
|
terminologyError={terminologyError}
|
|
@@ -17,8 +17,8 @@
|
|
|
17
17
|
|
|
18
18
|
import React from 'react';
|
|
19
19
|
import { ChoiceItemOrientation } from '../../../interfaces/choice.enum';
|
|
20
|
-
import type { QuestionnaireItem } from 'fhir/r4';
|
|
21
|
-
import
|
|
20
|
+
import type { QuestionnaireItem, QuestionnaireItemAnswerOption } from 'fhir/r4';
|
|
21
|
+
import RadioOptionList from '../ItemParts/RadioOptionList';
|
|
22
22
|
import { StyledRadioGroup } from '../Item.styles';
|
|
23
23
|
import { getChoiceOrientation } from '../../../utils/choice';
|
|
24
24
|
import type { PropsWithIsTabledAttribute } from '../../../interfaces/renderProps.interface';
|
|
@@ -27,6 +27,7 @@ import FadingCheckIcon from '../ItemParts/FadingCheckIcon';
|
|
|
27
27
|
|
|
28
28
|
interface ChoiceRadioAnswerOptionFieldsProps extends PropsWithIsTabledAttribute {
|
|
29
29
|
qItem: QuestionnaireItem;
|
|
30
|
+
options: QuestionnaireItemAnswerOption[];
|
|
30
31
|
valueRadio: string | null;
|
|
31
32
|
readOnly: boolean;
|
|
32
33
|
calcExpUpdated: boolean;
|
|
@@ -34,7 +35,7 @@ interface ChoiceRadioAnswerOptionFieldsProps extends PropsWithIsTabledAttribute
|
|
|
34
35
|
}
|
|
35
36
|
|
|
36
37
|
function ChoiceRadioAnswerOptionFields(props: ChoiceRadioAnswerOptionFieldsProps) {
|
|
37
|
-
const { qItem, valueRadio, readOnly, calcExpUpdated, isTabled, onCheckedChange } = props;
|
|
38
|
+
const { qItem, options, valueRadio, readOnly, calcExpUpdated, isTabled, onCheckedChange } = props;
|
|
38
39
|
|
|
39
40
|
const orientation = getChoiceOrientation(qItem) ?? ChoiceItemOrientation.Vertical;
|
|
40
41
|
|
|
@@ -47,7 +48,7 @@ function ChoiceRadioAnswerOptionFields(props: ChoiceRadioAnswerOptionFieldsProps
|
|
|
47
48
|
onChange={(e) => onCheckedChange(e.target.value)}
|
|
48
49
|
value={valueRadio}
|
|
49
50
|
data-test="q-item-radio-group">
|
|
50
|
-
<
|
|
51
|
+
<RadioOptionList options={options} readOnly={readOnly} />
|
|
51
52
|
</StyledRadioGroup>
|
|
52
53
|
|
|
53
54
|
<Box flexGrow={1} />
|
|
@@ -53,6 +53,8 @@ function ChoiceRadioAnswerOptionItem(props: ChoiceRadioAnswerOptionItemProps) {
|
|
|
53
53
|
|
|
54
54
|
const readOnly = useReadOnly(qItem, parentIsReadOnly);
|
|
55
55
|
|
|
56
|
+
const options = qItem.answerOption ?? [];
|
|
57
|
+
|
|
56
58
|
// Process calculated expressions
|
|
57
59
|
const { calcExpUpdated } = useCodingCalculatedExpression({
|
|
58
60
|
qItem: qItem,
|
|
@@ -67,12 +69,12 @@ function ChoiceRadioAnswerOptionItem(props: ChoiceRadioAnswerOptionItemProps) {
|
|
|
67
69
|
|
|
68
70
|
// Event handlers
|
|
69
71
|
function handleChange(newValue: string) {
|
|
70
|
-
if (
|
|
72
|
+
if (options.length === 0) {
|
|
71
73
|
onQrItemChange(createEmptyQrItem(qItem));
|
|
72
74
|
return;
|
|
73
75
|
}
|
|
74
76
|
|
|
75
|
-
const qrAnswer = findInAnswerOptions(
|
|
77
|
+
const qrAnswer = findInAnswerOptions(options, newValue);
|
|
76
78
|
onQrItemChange(
|
|
77
79
|
qrAnswer ? { ...createEmptyQrItem(qItem), answer: [qrAnswer] } : createEmptyQrItem(qItem)
|
|
78
80
|
);
|
|
@@ -87,6 +89,7 @@ function ChoiceRadioAnswerOptionItem(props: ChoiceRadioAnswerOptionItemProps) {
|
|
|
87
89
|
return (
|
|
88
90
|
<ChoiceRadioAnswerOptionView
|
|
89
91
|
qItem={qItem}
|
|
92
|
+
options={options}
|
|
90
93
|
valueChoice={valueChoice}
|
|
91
94
|
isRepeated={isRepeated}
|
|
92
95
|
isTabled={isTabled}
|
|
@@ -102,6 +105,7 @@ function ChoiceRadioAnswerOptionItem(props: ChoiceRadioAnswerOptionItemProps) {
|
|
|
102
105
|
return (
|
|
103
106
|
<ChoiceSelectAnswerOptionView
|
|
104
107
|
qItem={qItem}
|
|
108
|
+
options={options}
|
|
105
109
|
valueChoice={valueChoice}
|
|
106
110
|
isRepeated={isRepeated}
|
|
107
111
|
isTabled={isTabled}
|