@aehrc/smart-forms-renderer 0.7.2 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (199) hide show
  1. package/lib/components/FormComponents/ChoiceItems/ChoiceAutocompleteItem.js +0 -1
  2. package/lib/components/FormComponents/ChoiceItems/ChoiceAutocompleteItem.js.map +1 -1
  3. package/lib/components/FormComponents/ChoiceItems/ChoiceCheckboxAnswerOptionFields.d.ts +12 -0
  4. package/lib/components/FormComponents/ChoiceItems/ChoiceCheckboxAnswerOptionFields.js +39 -0
  5. package/lib/components/FormComponents/ChoiceItems/ChoiceCheckboxAnswerOptionFields.js.map +1 -0
  6. package/lib/components/FormComponents/ChoiceItems/ChoiceCheckboxAnswerOptionItem.d.ts +3 -3
  7. package/lib/components/FormComponents/ChoiceItems/ChoiceCheckboxAnswerOptionItem.js +14 -27
  8. package/lib/components/FormComponents/ChoiceItems/ChoiceCheckboxAnswerOptionItem.js.map +1 -1
  9. package/lib/components/FormComponents/ChoiceItems/ChoiceCheckboxAnswerValueSetFields.d.ts +13 -0
  10. package/lib/components/FormComponents/ChoiceItems/ChoiceCheckboxAnswerValueSetFields.js +42 -0
  11. package/lib/components/FormComponents/ChoiceItems/ChoiceCheckboxAnswerValueSetFields.js.map +1 -0
  12. package/lib/components/FormComponents/ChoiceItems/ChoiceCheckboxAnswerValueSetItem.d.ts +4 -3
  13. package/lib/components/FormComponents/ChoiceItems/ChoiceCheckboxAnswerValueSetItem.js +14 -22
  14. package/lib/components/FormComponents/ChoiceItems/ChoiceCheckboxAnswerValueSetItem.js.map +1 -1
  15. package/lib/components/FormComponents/ChoiceItems/ChoiceItemSwitcher.d.ts +2 -2
  16. package/lib/components/FormComponents/ChoiceItems/ChoiceItemSwitcher.js +3 -3
  17. package/lib/components/FormComponents/ChoiceItems/ChoiceItemSwitcher.js.map +1 -1
  18. package/lib/components/FormComponents/ChoiceItems/ChoiceRadioAnswerOptionFields.d.ts +12 -0
  19. package/lib/components/FormComponents/ChoiceItems/ChoiceRadioAnswerOptionFields.js +27 -0
  20. package/lib/components/FormComponents/ChoiceItems/ChoiceRadioAnswerOptionFields.js.map +1 -0
  21. package/lib/components/FormComponents/ChoiceItems/ChoiceRadioAnswerOptionItem.d.ts +1 -1
  22. package/lib/components/FormComponents/ChoiceItems/ChoiceRadioAnswerOptionItem.js +9 -24
  23. package/lib/components/FormComponents/ChoiceItems/ChoiceRadioAnswerOptionItem.js.map +1 -1
  24. package/lib/components/FormComponents/ChoiceItems/ChoiceRadioAnswerValueSetFields.d.ts +14 -0
  25. package/lib/components/FormComponents/ChoiceItems/ChoiceRadioAnswerValueSetFields.js +42 -0
  26. package/lib/components/FormComponents/ChoiceItems/ChoiceRadioAnswerValueSetFields.js.map +1 -0
  27. package/lib/components/FormComponents/ChoiceItems/ChoiceRadioAnswerValueSetItem.d.ts +1 -1
  28. package/lib/components/FormComponents/ChoiceItems/ChoiceRadioAnswerValueSetItem.js +8 -21
  29. package/lib/components/FormComponents/ChoiceItems/ChoiceRadioAnswerValueSetItem.js.map +1 -1
  30. package/lib/components/FormComponents/ChoiceItems/ChoiceSelectAnswerOptionFields.d.ts +10 -0
  31. package/lib/components/FormComponents/ChoiceItems/ChoiceSelectAnswerOptionFields.js +41 -0
  32. package/lib/components/FormComponents/ChoiceItems/ChoiceSelectAnswerOptionFields.js.map +1 -0
  33. package/lib/components/FormComponents/ChoiceItems/ChoiceSelectAnswerOptionItem.js +7 -23
  34. package/lib/components/FormComponents/ChoiceItems/ChoiceSelectAnswerOptionItem.js.map +1 -1
  35. package/lib/components/FormComponents/ChoiceItems/ChoiceSelectAnswerValueSetFields.d.ts +12 -0
  36. package/lib/components/FormComponents/ChoiceItems/ChoiceSelectAnswerValueSetFields.js +42 -0
  37. package/lib/components/FormComponents/ChoiceItems/ChoiceSelectAnswerValueSetFields.js.map +1 -0
  38. package/lib/components/FormComponents/ChoiceItems/ChoiceSelectAnswerValueSetItem.js +8 -18
  39. package/lib/components/FormComponents/ChoiceItems/ChoiceSelectAnswerValueSetItem.js.map +1 -1
  40. package/lib/components/FormComponents/GroupItem/GroupItemSwitcher.js +4 -4
  41. package/lib/components/FormComponents/GroupItem/GroupItemSwitcher.js.map +1 -1
  42. package/lib/components/FormComponents/Item.styles.d.ts +2 -2
  43. package/lib/components/FormComponents/Item.styles.js +2 -2
  44. package/lib/components/FormComponents/Item.styles.js.map +1 -1
  45. package/lib/components/FormComponents/ItemParts/RadioAnswerOptionButtons.d.ts +8 -0
  46. package/lib/components/FormComponents/ItemParts/RadioAnswerOptionButtons.js +37 -0
  47. package/lib/components/FormComponents/ItemParts/RadioAnswerOptionButtons.js.map +1 -0
  48. package/lib/components/FormComponents/ItemParts/RadioButtons.d.ts +8 -0
  49. package/lib/components/FormComponents/ItemParts/RadioButtons.js +37 -0
  50. package/lib/components/FormComponents/ItemParts/RadioButtons.js.map +1 -0
  51. package/lib/components/FormComponents/ItemParts/RadioButtonsAnswerOption.d.ts +8 -0
  52. package/lib/components/FormComponents/ItemParts/RadioButtonsAnswerOption.js +37 -0
  53. package/lib/components/FormComponents/ItemParts/RadioButtonsAnswerOption.js.map +1 -0
  54. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceAutocompleteField.d.ts +20 -0
  55. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceAutocompleteField.js +49 -0
  56. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceAutocompleteField.js.map +1 -0
  57. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceAutocompleteFieldEndAdornment.d.ts +0 -0
  58. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceAutocompleteFieldEndAdornment.js +2 -0
  59. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceAutocompleteFieldEndAdornment.js.map +1 -0
  60. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceAutocompleteItem.js +11 -35
  61. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceAutocompleteItem.js.map +1 -1
  62. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceCheckboxAnswerOptionFields.d.ts +17 -0
  63. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceCheckboxAnswerOptionFields.js +42 -0
  64. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceCheckboxAnswerOptionFields.js.map +1 -0
  65. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceCheckboxAnswerOptionItem.d.ts +3 -3
  66. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceCheckboxAnswerOptionItem.js +23 -36
  67. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceCheckboxAnswerOptionItem.js.map +1 -1
  68. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceItemSwitcher.d.ts +2 -2
  69. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceItemSwitcher.js +3 -3
  70. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceItemSwitcher.js.map +1 -1
  71. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceRadioAnswerOptionFields.d.ts +15 -0
  72. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceRadioAnswerOptionFields.js +29 -0
  73. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceRadioAnswerOptionFields.js.map +1 -0
  74. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceRadioAnswerOptionItem.d.ts +1 -1
  75. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceRadioAnswerOptionItem.js +3 -23
  76. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceRadioAnswerOptionItem.js.map +1 -1
  77. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerOptionField.d.ts +11 -0
  78. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerOptionField.js +14 -0
  79. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerOptionField.js.map +1 -0
  80. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerOptionFields.d.ts +0 -0
  81. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerOptionFields.js +2 -0
  82. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerOptionFields.js.map +1 -0
  83. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerOptionItem.js +18 -23
  84. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerOptionItem.js.map +1 -1
  85. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerValueSetField.d.ts +12 -0
  86. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerValueSetField.js +16 -0
  87. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerValueSetField.js.map +1 -0
  88. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerValueSetItem.js +8 -14
  89. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerValueSetItem.js.map +1 -1
  90. package/lib/components/FormComponents/SingleItem/SingleItem.d.ts +2 -2
  91. package/lib/components/FormComponents/SingleItem/SingleItem.js +2 -2
  92. package/lib/components/FormComponents/SingleItem/SingleItem.js.map +1 -1
  93. package/lib/components/FormComponents/SingleItem/SingleItemSwitcher.d.ts +2 -2
  94. package/lib/components/FormComponents/SingleItem/SingleItemSwitcher.js +3 -3
  95. package/lib/components/FormComponents/SingleItem/SingleItemSwitcher.js.map +1 -1
  96. package/lib/components/FormComponents/Tables/AddItemButton.d.ts +8 -0
  97. package/lib/components/FormComponents/Tables/AddItemButton.js +28 -0
  98. package/lib/components/FormComponents/Tables/AddItemButton.js.map +1 -0
  99. package/lib/components/FormComponents/Tables/AddRowButton.d.ts +8 -0
  100. package/lib/components/FormComponents/Tables/AddRowButton.js +28 -0
  101. package/lib/components/FormComponents/Tables/AddRowButton.js.map +1 -0
  102. package/lib/components/FormComponents/Tables/GroupTable.d.ts +10 -0
  103. package/lib/components/FormComponents/Tables/GroupTable.js +108 -0
  104. package/lib/components/FormComponents/Tables/GroupTable.js.map +1 -0
  105. package/lib/components/FormComponents/Tables/GroupTableRow.d.ts +10 -0
  106. package/lib/components/FormComponents/Tables/GroupTableRow.js +46 -0
  107. package/lib/components/FormComponents/Tables/GroupTableRow.js.map +1 -0
  108. package/lib/components/FormComponents/Tables/index.d.ts +1 -1
  109. package/lib/components/FormComponents/Tables/index.js +1 -1
  110. package/lib/components/FormComponents/Tables/index.js.map +1 -1
  111. package/lib/components/Renderer/FormBodyTabbed.js +1 -1
  112. package/lib/components/Renderer/FormBodyTabbed.js.map +1 -1
  113. package/lib/components/Tabs/FormBodySingleTab.js +1 -1
  114. package/lib/components/Tabs/FormBodySingleTab.js.map +1 -1
  115. package/lib/components/Tabs/FormBodyTabList.d.ts +1 -0
  116. package/lib/components/Tabs/FormBodyTabList.js +3 -4
  117. package/lib/components/Tabs/FormBodyTabList.js.map +1 -1
  118. package/lib/components/Tabs/FormBodyTabListWrapper.d.ts +1 -1
  119. package/lib/components/Tabs/FormBodyTabListWrapper.js +6 -13
  120. package/lib/components/Tabs/FormBodyTabListWrapper.js.map +1 -1
  121. package/lib/components/Tabs/ShowCompletedTabsSection.d.ts +7 -0
  122. package/lib/components/Tabs/ShowCompletedTabsSection.js +34 -0
  123. package/lib/components/Tabs/ShowCompletedTabsSection.js.map +1 -0
  124. package/lib/hooks/useContextDisplayItems.d.ts +6 -0
  125. package/lib/hooks/useContextDisplayItems.js +30 -0
  126. package/lib/hooks/useContextDisplayItems.js.map +1 -0
  127. package/lib/hooks/useInitialiseRenderer.js +2 -2
  128. package/lib/hooks/useInitialiseRenderer.js.map +1 -1
  129. package/lib/hooks/useInitialiseRepeatGroups.d.ts +1 -1
  130. package/lib/hooks/useNumberInput.d.ts +1 -1
  131. package/lib/hooks/useNumberInput.js.map +1 -1
  132. package/lib/hooks/useStringInput.d.ts +1 -1
  133. package/lib/hooks/useStringInput.js.map +1 -1
  134. package/lib/hooks/useTerminologyServerQuery.js +3 -6
  135. package/lib/hooks/useTerminologyServerQuery.js.map +1 -1
  136. package/lib/index.js +2 -2
  137. package/lib/index.js.map +1 -1
  138. package/lib/interfaces/renderProps.interface.d.ts +3 -0
  139. package/lib/stores/useQuestionnaireResponseStore.d.ts +2 -1
  140. package/lib/stores/useQuestionnaireResponseStore.js +5 -3
  141. package/lib/stores/useQuestionnaireResponseStore.js.map +1 -1
  142. package/lib/utils/qrItem.d.ts +2 -3
  143. package/lib/utils/qrItem.js +2 -3
  144. package/lib/utils/qrItem.js.map +1 -1
  145. package/lib/utils/repopulateIntoResponse.d.ts +2 -2
  146. package/lib/utils/repopulateItems.js +0 -1
  147. package/lib/utils/repopulateItems.js.map +1 -1
  148. package/package.json +7 -7
  149. package/src/components/FormComponents/ChoiceItems/ChoiceAutocompleteItem.tsx +0 -1
  150. package/src/components/FormComponents/ChoiceItems/ChoiceCheckboxAnswerOptionFields.tsx +85 -0
  151. package/src/components/FormComponents/ChoiceItems/ChoiceCheckboxAnswerOptionItem.tsx +35 -58
  152. package/src/components/FormComponents/ChoiceItems/ChoiceCheckboxAnswerValueSetFields.tsx +79 -0
  153. package/src/components/FormComponents/ChoiceItems/ChoiceCheckboxAnswerValueSetItem.tsx +37 -50
  154. package/src/components/FormComponents/ChoiceItems/ChoiceItemSwitcher.tsx +10 -5
  155. package/src/components/FormComponents/ChoiceItems/ChoiceRadioAnswerOptionFields.tsx +48 -0
  156. package/src/components/FormComponents/ChoiceItems/ChoiceRadioAnswerOptionItem.tsx +25 -53
  157. package/src/components/FormComponents/ChoiceItems/ChoiceRadioAnswerValueSetFields.tsx +83 -0
  158. package/src/components/FormComponents/ChoiceItems/ChoiceRadioAnswerValueSetItem.tsx +27 -49
  159. package/src/components/FormComponents/ChoiceItems/ChoiceSelectAnswerOptionFields.tsx +81 -0
  160. package/src/components/FormComponents/ChoiceItems/ChoiceSelectAnswerOptionItem.tsx +19 -54
  161. package/src/components/FormComponents/ChoiceItems/ChoiceSelectAnswerValueSetFields.tsx +97 -0
  162. package/src/components/FormComponents/ChoiceItems/ChoiceSelectAnswerValueSetItem.tsx +22 -60
  163. package/src/components/FormComponents/GroupItem/GroupItemSwitcher.tsx +4 -4
  164. package/src/components/FormComponents/Item.styles.ts +2 -2
  165. package/src/components/FormComponents/ItemParts/RadioAnswerOptionButtons.tsx +72 -0
  166. package/src/components/FormComponents/OpenChoiceItems/OpenChoiceAutocompleteField.tsx +131 -0
  167. package/src/components/FormComponents/OpenChoiceItems/OpenChoiceAutocompleteItem.tsx +38 -93
  168. package/src/components/FormComponents/OpenChoiceItems/OpenChoiceCheckboxAnswerOptionFields.tsx +112 -0
  169. package/src/components/FormComponents/OpenChoiceItems/OpenChoiceCheckboxAnswerOptionItem.tsx +57 -76
  170. package/src/components/FormComponents/OpenChoiceItems/OpenChoiceItemSwitcher.tsx +8 -5
  171. package/src/components/FormComponents/OpenChoiceItems/OpenChoiceRadioAnswerOptionFields.tsx +72 -0
  172. package/src/components/FormComponents/OpenChoiceItems/OpenChoiceRadioAnswerOptionItem.tsx +12 -59
  173. package/src/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerOptionField.tsx +54 -0
  174. package/src/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerOptionItem.tsx +40 -64
  175. package/src/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerValueSetField.tsx +63 -0
  176. package/src/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerValueSetItem.tsx +22 -50
  177. package/src/components/FormComponents/SingleItem/SingleItem.tsx +6 -3
  178. package/src/components/FormComponents/SingleItem/SingleItemSwitcher.tsx +7 -3
  179. package/src/components/FormComponents/Tables/AddRowButton.tsx +49 -0
  180. package/src/components/FormComponents/Tables/{QItemGroupTable.tsx → GroupTable.tsx} +6 -17
  181. package/src/components/FormComponents/Tables/{QItemGroupTableRow.tsx → GroupTableRow.tsx} +2 -2
  182. package/src/components/FormComponents/Tables/index.ts +1 -1
  183. package/src/components/Renderer/FormBodyTabbed.tsx +1 -1
  184. package/src/components/Tabs/FormBodySingleTab.tsx +1 -1
  185. package/src/components/Tabs/FormBodyTabList.tsx +5 -8
  186. package/src/components/Tabs/FormBodyTabListWrapper.tsx +15 -26
  187. package/src/components/Tabs/ShowCompletedTabsSection.tsx +52 -0
  188. package/src/hooks/useContextDisplayItems.ts +40 -0
  189. package/src/hooks/useInitialiseRenderer.ts +2 -2
  190. package/src/hooks/useInitialiseRepeatGroups.ts +1 -1
  191. package/src/hooks/useNumberInput.ts +2 -1
  192. package/src/hooks/useStringInput.ts +2 -1
  193. package/src/hooks/useTerminologyServerQuery.ts +3 -6
  194. package/src/index.ts +2 -2
  195. package/src/interfaces/renderProps.interface.ts +4 -0
  196. package/src/stores/useQuestionnaireResponseStore.ts +5 -4
  197. package/src/utils/qrItem.ts +4 -3
  198. package/src/utils/repopulateIntoResponse.ts +2 -2
  199. package/src/utils/repopulateItems.ts +0 -1
@@ -0,0 +1,112 @@
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
+
18
+ import React from 'react';
19
+ import { StyledFormGroup } from '../Item.styles';
20
+ import { ChoiceItemOrientation } from '../../../interfaces/choice.enum';
21
+ import CheckboxSingle from '../ItemParts/CheckboxSingle';
22
+ import CheckboxSingleWithOpenLabel from '../ItemParts/CheckboxSingleWithOpenLabel';
23
+ import type { QuestionnaireItem, QuestionnaireResponseItemAnswer } from 'fhir/r4';
24
+
25
+ interface OpenChoiceCheckboxAnswerOptionFieldsProps {
26
+ qItem: QuestionnaireItem;
27
+ answers: QuestionnaireResponseItemAnswer[];
28
+ openLabelText: string | null;
29
+ openLabelValue: string;
30
+ openLabelChecked: boolean;
31
+ readOnly: boolean;
32
+ orientation: ChoiceItemOrientation;
33
+ onValueChange: (changedOptionValue: string | null, changedOpenLabelValue: string | null) => void;
34
+ onOpenLabelCheckedChange: (checked: boolean) => void;
35
+ onOpenLabelInputChange: (input: string) => void;
36
+ }
37
+
38
+ function OpenChoiceCheckboxAnswerOptionFields(props: OpenChoiceCheckboxAnswerOptionFieldsProps) {
39
+ const {
40
+ qItem,
41
+ answers,
42
+ openLabelText,
43
+ openLabelValue,
44
+ openLabelChecked,
45
+ readOnly,
46
+ orientation,
47
+ onValueChange,
48
+ onOpenLabelCheckedChange,
49
+ onOpenLabelInputChange
50
+ } = props;
51
+
52
+ return (
53
+ <StyledFormGroup row={orientation === ChoiceItemOrientation.Horizontal}>
54
+ {qItem.answerOption?.map((option) => {
55
+ if (option['valueCoding']) {
56
+ return (
57
+ <CheckboxSingle
58
+ key={option.valueCoding.code ?? ''}
59
+ value={option.valueCoding.code ?? ''}
60
+ label={option.valueCoding.display ?? `${option.valueCoding.code}`}
61
+ readOnly={readOnly}
62
+ isChecked={answers.some(
63
+ (answer) => JSON.stringify(answer) === JSON.stringify(option)
64
+ )}
65
+ onCheckedChange={(changedValue) => onValueChange(changedValue, null)}
66
+ />
67
+ );
68
+ }
69
+
70
+ if (option['valueString']) {
71
+ return (
72
+ <CheckboxSingle
73
+ key={option.valueString}
74
+ value={option.valueString}
75
+ label={option.valueString}
76
+ readOnly={readOnly}
77
+ isChecked={answers.some((answer) => answer.valueString === option.valueString)}
78
+ onCheckedChange={(changedValue) => onValueChange(changedValue, null)}
79
+ />
80
+ );
81
+ }
82
+
83
+ if (option['valueInteger']) {
84
+ return (
85
+ <CheckboxSingle
86
+ key={option.valueInteger}
87
+ value={option.valueInteger.toString()}
88
+ label={option.valueInteger.toString()}
89
+ readOnly={readOnly}
90
+ isChecked={answers.some((answer) => answer.valueInteger === option.valueInteger)}
91
+ onCheckedChange={(changedValue) => onValueChange(changedValue, null)}
92
+ />
93
+ );
94
+ }
95
+
96
+ return null;
97
+ })}
98
+
99
+ {openLabelText ? (
100
+ <CheckboxSingleWithOpenLabel
101
+ value={openLabelValue}
102
+ label={openLabelText}
103
+ isChecked={openLabelChecked}
104
+ onCheckedChange={onOpenLabelCheckedChange}
105
+ onInputChange={onOpenLabelInputChange}
106
+ />
107
+ ) : null}
108
+ </StyledFormGroup>
109
+ );
110
+ }
111
+
112
+ export default OpenChoiceCheckboxAnswerOptionFields;
@@ -17,13 +17,11 @@
17
17
 
18
18
  import React, { useCallback, useMemo, useState } from 'react';
19
19
  import Grid from '@mui/material/Grid';
20
- import { CheckBoxOption, ChoiceItemOrientation } from '../../../interfaces/choice.enum';
20
+ import type { ChoiceItemOrientation } from '../../../interfaces/choice.enum';
21
+ import { CheckBoxOption } from '../../../interfaces/choice.enum';
21
22
  import type { QuestionnaireItem, QuestionnaireResponseItem } from 'fhir/r4';
22
23
  import { createEmptyQrItem } from '../../../utils/qrItem';
23
- import CheckboxSingle from '../ItemParts/CheckboxSingle';
24
24
  import { getOpenLabelText } from '../../../utils/itemControl';
25
- import CheckboxSingleWithOpenLabel from '../ItemParts/CheckboxSingleWithOpenLabel';
26
- import { QFormGroup } from '../Item.styles';
27
25
  import {
28
26
  getOldOpenLabelAnswer,
29
27
  updateQrOpenChoiceCheckboxAnswers
@@ -33,22 +31,25 @@ import debounce from 'lodash.debounce';
33
31
  import useRenderingExtensions from '../../../hooks/useRenderingExtensions';
34
32
  import type {
35
33
  PropsWithIsRepeatedAttribute,
36
- PropsWithQrItemChangeHandler
34
+ PropsWithQrItemChangeHandler,
35
+ PropsWithTextShownAttribute
37
36
  } from '../../../interfaces/renderProps.interface';
38
37
  import { DEBOUNCE_DURATION } from '../../../utils/debounce';
39
38
  import DisplayInstructions from '../DisplayItem/DisplayInstructions';
40
39
  import LabelWrapper from '../ItemParts/ItemLabelWrapper';
40
+ import OpenChoiceCheckboxAnswerOptionFields from './OpenChoiceCheckboxAnswerOptionFields';
41
41
 
42
42
  interface OpenChoiceCheckboxAnswerOptionItemProps
43
43
  extends PropsWithQrItemChangeHandler<QuestionnaireResponseItem>,
44
- PropsWithIsRepeatedAttribute {
44
+ PropsWithIsRepeatedAttribute,
45
+ PropsWithTextShownAttribute {
45
46
  qItem: QuestionnaireItem;
46
47
  qrItem: QuestionnaireResponseItem;
47
48
  orientation: ChoiceItemOrientation;
48
49
  }
49
50
 
50
51
  function OpenChoiceCheckboxAnswerOptionItem(props: OpenChoiceCheckboxAnswerOptionItemProps) {
51
- const { qItem, qrItem, isRepeated, onQrItemChange, orientation } = props;
52
+ const { qItem, qrItem, orientation, isRepeated, textShown = true, onQrItemChange } = props;
52
53
 
53
54
  // Init answers
54
55
  const qrOpenChoiceCheckbox = qrItem ?? createEmptyQrItem(qItem);
@@ -115,79 +116,59 @@ function OpenChoiceCheckboxAnswerOptionItem(props: OpenChoiceCheckboxAnswerOptio
115
116
  [handleValueChange]
116
117
  ); // Dependencies are tested, debounce is causing eslint to not recognise dependencies
117
118
 
118
- const openChoiceCheckbox = (
119
- <QFormGroup row={orientation === ChoiceItemOrientation.Horizontal}>
120
- {qItem.answerOption?.map((option) => {
121
- if (option['valueCoding']) {
122
- return (
123
- <CheckboxSingle
124
- key={option.valueCoding.code ?? ''}
125
- value={option.valueCoding.code ?? ''}
126
- label={option.valueCoding.display ?? `${option.valueCoding.code}`}
127
- readOnly={readOnly}
128
- isChecked={answers.some(
129
- (answer) => JSON.stringify(answer) === JSON.stringify(option)
130
- )}
131
- onCheckedChange={(changedValue) => handleValueChange(changedValue, null)}
132
- />
133
- );
134
- } else if (option['valueString']) {
135
- return (
136
- <CheckboxSingle
137
- key={option.valueString}
138
- value={option.valueString}
139
- label={option.valueString}
140
- readOnly={readOnly}
141
- isChecked={answers.some((answer) => answer.valueString === option.valueString)}
142
- onCheckedChange={(changedValue) => handleValueChange(changedValue, null)}
143
- />
144
- );
145
- } else if (option['valueInteger']) {
146
- return (
147
- <CheckboxSingle
148
- key={option.valueInteger}
149
- value={option.valueInteger.toString()}
150
- label={option.valueInteger.toString()}
119
+ function handleOpenLabelCheckedChange(checked: boolean) {
120
+ handleValueChange(null, openLabelValue);
121
+ setOpenLabelChecked(checked);
122
+ }
123
+
124
+ function handleOpenLabelInputChange(newValue: string) {
125
+ setOpenLabelValue(newValue);
126
+ updateOpenLabelValueWithDebounce(newValue);
127
+ }
128
+
129
+ if (textShown) {
130
+ return (
131
+ <FullWidthFormComponentBox data-test="q-item-open-choice-checkbox-answer-option-box">
132
+ <Grid container columnSpacing={6}>
133
+ <Grid item xs={5}>
134
+ <LabelWrapper qItem={qItem} />
135
+ </Grid>
136
+ <Grid item xs={7}>
137
+ <OpenChoiceCheckboxAnswerOptionFields
138
+ qItem={qItem}
139
+ answers={answers}
140
+ openLabelText={openLabelText}
141
+ openLabelValue={openLabelValue}
142
+ openLabelChecked={openLabelChecked}
151
143
  readOnly={readOnly}
152
- isChecked={answers.some((answer) => answer.valueInteger === option.valueInteger)}
153
- onCheckedChange={(changedValue) => handleValueChange(changedValue, null)}
144
+ orientation={orientation}
145
+ onValueChange={handleValueChange}
146
+ onOpenLabelCheckedChange={handleOpenLabelCheckedChange}
147
+ onOpenLabelInputChange={handleOpenLabelInputChange}
154
148
  />
155
- );
156
- } else {
157
- return null;
158
- }
159
- })}
160
-
161
- {openLabelText ? (
162
- <CheckboxSingleWithOpenLabel
163
- value={openLabelValue}
164
- label={openLabelText}
165
- isChecked={openLabelChecked}
166
- onCheckedChange={(checked) => {
167
- handleValueChange(null, openLabelValue);
168
- setOpenLabelChecked(checked);
169
- }}
170
- onInputChange={(input) => {
171
- setOpenLabelValue(input);
172
- updateOpenLabelValueWithDebounce(input);
173
- }}
174
- />
175
- ) : null}
176
- </QFormGroup>
177
- );
149
+ <DisplayInstructions displayInstructions={displayInstructions} />
150
+ </Grid>
151
+ </Grid>
152
+ </FullWidthFormComponentBox>
153
+ );
154
+ }
178
155
 
179
156
  return (
180
- <FullWidthFormComponentBox data-test="q-item-open-choice-checkbox-answer-option-box">
181
- <Grid container columnSpacing={6}>
182
- <Grid item xs={5}>
183
- <LabelWrapper qItem={qItem} />
184
- </Grid>
185
- <Grid item xs={7}>
186
- {openChoiceCheckbox}
187
- <DisplayInstructions displayInstructions={displayInstructions} />
188
- </Grid>
189
- </Grid>
190
- </FullWidthFormComponentBox>
157
+ <>
158
+ <OpenChoiceCheckboxAnswerOptionFields
159
+ qItem={qItem}
160
+ answers={answers}
161
+ openLabelText={openLabelText}
162
+ openLabelValue={openLabelValue}
163
+ openLabelChecked={openLabelChecked}
164
+ readOnly={readOnly}
165
+ orientation={orientation}
166
+ onValueChange={handleValueChange}
167
+ onOpenLabelCheckedChange={handleOpenLabelCheckedChange}
168
+ onOpenLabelInputChange={handleOpenLabelInputChange}
169
+ />
170
+ <DisplayInstructions displayInstructions={displayInstructions} />
171
+ </>
191
172
  );
192
173
  }
193
174
 
@@ -28,19 +28,21 @@ import OpenChoiceRadioAnswerOptionItem from './OpenChoiceRadioAnswerOptionItem';
28
28
  import type {
29
29
  PropsWithIsRepeatedAttribute,
30
30
  PropsWithIsTabledAttribute,
31
- PropsWithQrItemChangeHandler
31
+ PropsWithQrItemChangeHandler,
32
+ PropsWithTextShownAttribute
32
33
  } from '../../../interfaces/renderProps.interface';
33
34
 
34
35
  interface OpenChoiceItemSwitcherProps
35
36
  extends PropsWithQrItemChangeHandler<QuestionnaireResponseItem>,
36
37
  PropsWithIsRepeatedAttribute,
37
- PropsWithIsTabledAttribute {
38
+ PropsWithIsTabledAttribute,
39
+ PropsWithTextShownAttribute {
38
40
  qItem: QuestionnaireItem;
39
41
  qrItem: QuestionnaireResponseItem;
40
42
  }
41
43
 
42
44
  function OpenChoiceItemSwitcher(props: OpenChoiceItemSwitcherProps) {
43
- const { qItem, qrItem, isRepeated, isTabled, onQrItemChange } = props;
45
+ const { qItem, qrItem, isRepeated, isTabled, textShown, onQrItemChange } = props;
44
46
  const orientation = getChoiceOrientation(qItem);
45
47
 
46
48
  switch (getOpenChoiceControlType(qItem)) {
@@ -49,9 +51,10 @@ function OpenChoiceItemSwitcher(props: OpenChoiceItemSwitcherProps) {
49
51
  <OpenChoiceCheckboxAnswerOptionItem
50
52
  qItem={qItem}
51
53
  qrItem={qrItem}
54
+ orientation={orientation}
52
55
  isRepeated={qItem['repeats'] ?? false}
56
+ textShown={textShown}
53
57
  onQrItemChange={onQrItemChange}
54
- orientation={orientation}
55
58
  />
56
59
  );
57
60
  case OpenChoiceItemControl.Radio:
@@ -59,9 +62,9 @@ function OpenChoiceItemSwitcher(props: OpenChoiceItemSwitcherProps) {
59
62
  <OpenChoiceRadioAnswerOptionItem
60
63
  qItem={qItem}
61
64
  qrItem={qrItem}
65
+ orientation={orientation}
62
66
  isRepeated={qItem['repeats'] ?? false}
63
67
  onQrItemChange={onQrItemChange}
64
- orientation={orientation}
65
68
  />
66
69
  );
67
70
  case OpenChoiceItemControl.Autocomplete:
@@ -0,0 +1,72 @@
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
+
18
+ import type { ChangeEvent } from 'react';
19
+ import React from 'react';
20
+ import { ChoiceItemOrientation } from '../../../interfaces/choice.enum';
21
+ import type { QuestionnaireItem } from 'fhir/r4';
22
+ import { StyledRadioGroup } from '../Item.styles';
23
+ import RadioButtonWithOpenLabel from '../ItemParts/RadioButtonWithOpenLabel';
24
+ import RadioAnswerOptionButtons from '../ItemParts/RadioAnswerOptionButtons';
25
+
26
+ interface OpenChoiceRadioAnswerOptionFieldsProps {
27
+ qItem: QuestionnaireItem;
28
+ valueRadio: string | null;
29
+ openLabelText: string | null;
30
+ openLabelValue: string | null;
31
+ openLabelSelected: boolean;
32
+ orientation: ChoiceItemOrientation;
33
+ readOnly: boolean;
34
+ onValueChange: (changedOptionValue: string | null, changedOpenLabelValue: string | null) => void;
35
+ }
36
+
37
+ function OpenChoiceRadioAnswerOptionFields(props: OpenChoiceRadioAnswerOptionFieldsProps) {
38
+ const {
39
+ qItem,
40
+ valueRadio,
41
+ openLabelText,
42
+ openLabelValue,
43
+ openLabelSelected,
44
+ orientation,
45
+ readOnly,
46
+ onValueChange
47
+ } = props;
48
+
49
+ return (
50
+ <StyledRadioGroup
51
+ row={orientation === ChoiceItemOrientation.Horizontal}
52
+ name={qItem.text}
53
+ id={qItem.id}
54
+ onChange={(e: ChangeEvent<HTMLInputElement>) => onValueChange(e.target.value, null)}
55
+ value={valueRadio}
56
+ data-test="q-item-radio-group">
57
+ <RadioAnswerOptionButtons qItem={qItem} readOnly={readOnly} />
58
+
59
+ {openLabelText ? (
60
+ <RadioButtonWithOpenLabel
61
+ value={openLabelValue}
62
+ label={openLabelText}
63
+ readOnly={readOnly}
64
+ isSelected={openLabelSelected}
65
+ onInputChange={(input) => onValueChange(null, input)}
66
+ />
67
+ ) : null}
68
+ </StyledRadioGroup>
69
+ );
70
+ }
71
+
72
+ export default OpenChoiceRadioAnswerOptionFields;
@@ -15,19 +15,15 @@
15
15
  * limitations under the License.
16
16
  */
17
17
 
18
- import type { ChangeEvent } from 'react';
19
18
  import React, { useState } from 'react';
20
19
  import Grid from '@mui/material/Grid';
21
- import { ChoiceItemOrientation } from '../../../interfaces/choice.enum';
20
+ import type { ChoiceItemOrientation } from '../../../interfaces/choice.enum';
22
21
  import type { QuestionnaireItem, QuestionnaireResponseItem } from 'fhir/r4';
23
22
  import { createEmptyQrItem } from '../../../utils/qrItem';
24
23
  import { getOpenLabelText } from '../../../utils/itemControl';
25
- import { QRadioGroup } from '../Item.styles';
26
24
  import { getOldOpenLabelAnswer } from '../../../utils/openChoice';
27
25
  import { FullWidthFormComponentBox } from '../../Box.styles';
28
- import ChoiceRadioSingle from '../ChoiceItems/ChoiceRadioSingle';
29
26
  import { findInAnswerOptions, getQrChoiceValue } from '../../../utils/choice';
30
- import RadioButtonWithOpenLabel from '../ItemParts/RadioButtonWithOpenLabel';
31
27
  import useRenderingExtensions from '../../../hooks/useRenderingExtensions';
32
28
  import type {
33
29
  PropsWithIsRepeatedAttribute,
@@ -35,6 +31,7 @@ import type {
35
31
  } from '../../../interfaces/renderProps.interface';
36
32
  import DisplayInstructions from '../DisplayItem/DisplayInstructions';
37
33
  import LabelWrapper from '../ItemParts/ItemLabelWrapper';
34
+ import OpenChoiceRadioAnswerOptionFields from './OpenChoiceRadioAnswerOptionFields';
38
35
 
39
36
  interface OpenChoiceRadioAnswerOptionItemProps
40
37
  extends PropsWithQrItemChangeHandler<QuestionnaireResponseItem>,
@@ -119,59 +116,6 @@ function OpenChoiceRadioAnswerOptionItem(props: OpenChoiceRadioAnswerOptionItemP
119
116
  }
120
117
  }
121
118
 
122
- const openChoiceRadio = (
123
- <QRadioGroup
124
- row={orientation === ChoiceItemOrientation.Horizontal}
125
- name={qItem.text}
126
- id={qItem.id}
127
- onChange={(e: ChangeEvent<HTMLInputElement>) => handleValueChange(e.target.value, null)}
128
- value={valueRadio}
129
- data-test="q-item-radio-group">
130
- {qItem.answerOption?.map((option) => {
131
- if (option['valueCoding']) {
132
- return (
133
- <ChoiceRadioSingle
134
- key={option.valueCoding.code ?? ''}
135
- value={option.valueCoding.code ?? ''}
136
- label={option.valueCoding.display ?? `${option.valueCoding.code}`}
137
- readOnly={readOnly}
138
- />
139
- );
140
- } else if (option['valueString']) {
141
- return (
142
- <ChoiceRadioSingle
143
- key={option.valueString}
144
- value={option.valueString}
145
- label={option.valueString}
146
- readOnly={readOnly}
147
- />
148
- );
149
- } else if (option['valueInteger']) {
150
- return (
151
- <ChoiceRadioSingle
152
- key={option.valueInteger}
153
- value={option.valueInteger.toString()}
154
- label={option.valueInteger.toString()}
155
- readOnly={readOnly}
156
- />
157
- );
158
- } else {
159
- return null;
160
- }
161
- })}
162
-
163
- {openLabelText ? (
164
- <RadioButtonWithOpenLabel
165
- value={openLabelValue}
166
- label={openLabelText}
167
- readOnly={readOnly}
168
- isSelected={openLabelSelected}
169
- onInputChange={(input) => handleValueChange(null, input)}
170
- />
171
- ) : null}
172
- </QRadioGroup>
173
- );
174
-
175
119
  return (
176
120
  <FullWidthFormComponentBox data-test="q-item-open-choice-radio-answer-option-box">
177
121
  <Grid container columnSpacing={6}>
@@ -179,7 +123,16 @@ function OpenChoiceRadioAnswerOptionItem(props: OpenChoiceRadioAnswerOptionItemP
179
123
  <LabelWrapper qItem={qItem} />
180
124
  </Grid>
181
125
  <Grid item xs={7}>
182
- {openChoiceRadio}
126
+ <OpenChoiceRadioAnswerOptionFields
127
+ qItem={qItem}
128
+ valueRadio={valueRadio}
129
+ openLabelText={openLabelText}
130
+ openLabelValue={openLabelValue}
131
+ openLabelSelected={openLabelSelected}
132
+ orientation={orientation}
133
+ readOnly={readOnly}
134
+ onValueChange={handleValueChange}
135
+ />
183
136
  <DisplayInstructions displayInstructions={displayInstructions} />
184
137
  </Grid>
185
138
  </Grid>
@@ -0,0 +1,54 @@
1
+ import React from 'react';
2
+ import { getAnswerOptionLabel } from '../../../utils/openChoice';
3
+ import { StandardTextField } from '../Textfield.styles';
4
+ import Autocomplete from '@mui/material/Autocomplete';
5
+ import type { QuestionnaireItem, QuestionnaireItemAnswerOption } from 'fhir/r4';
6
+ import type { PropsWithIsTabledAttribute } from '../../../interfaces/renderProps.interface';
7
+ import useRenderingExtensions from '../../../hooks/useRenderingExtensions';
8
+
9
+ interface OpenChoiceSelectAnswerOptionFieldProps extends PropsWithIsTabledAttribute {
10
+ qItem: QuestionnaireItem;
11
+ options: QuestionnaireItemAnswerOption[];
12
+ valueSelect: QuestionnaireItemAnswerOption | null;
13
+ onChange: (newValue: QuestionnaireItemAnswerOption | string | null) => void;
14
+ }
15
+
16
+ function OpenChoiceSelectAnswerOptionField(props: OpenChoiceSelectAnswerOptionFieldProps) {
17
+ const { qItem, options, valueSelect, isTabled, onChange } = props;
18
+
19
+ const { displayUnit, displayPrompt, readOnly, entryFormat } = useRenderingExtensions(qItem);
20
+
21
+ return (
22
+ <Autocomplete
23
+ id={qItem.id}
24
+ value={valueSelect ?? null}
25
+ options={options}
26
+ getOptionLabel={(option) => getAnswerOptionLabel(option)}
27
+ onChange={(_, newValue) => onChange(newValue)}
28
+ freeSolo
29
+ autoHighlight
30
+ sx={{ maxWidth: !isTabled ? 280 : 3000, minWidth: 160, flexGrow: 1 }}
31
+ disabled={readOnly}
32
+ size="small"
33
+ placeholder={entryFormat}
34
+ renderInput={(params) => (
35
+ <StandardTextField
36
+ isTabled={isTabled}
37
+ label={displayPrompt}
38
+ {...params}
39
+ InputProps={{
40
+ ...params.InputProps,
41
+ endAdornment: (
42
+ <>
43
+ {params.InputProps.endAdornment}
44
+ {displayUnit}
45
+ </>
46
+ )
47
+ }}
48
+ />
49
+ )}
50
+ />
51
+ );
52
+ }
53
+
54
+ export default OpenChoiceSelectAnswerOptionField;