@aehrc/smart-forms-renderer 0.12.1 → 0.13.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 (282) hide show
  1. package/lib/components/Box.styles.d.ts +6 -0
  2. package/lib/components/Box.styles.js +29 -1
  3. package/lib/components/Box.styles.js.map +1 -1
  4. package/lib/components/FormComponents/BooleanItem/BooleanItem.js +2 -2
  5. package/lib/components/FormComponents/BooleanItem/BooleanItem.js.map +1 -1
  6. package/lib/components/FormComponents/ChoiceItems/ChoiceAutocompleteItem.js +4 -10
  7. package/lib/components/FormComponents/ChoiceItems/ChoiceAutocompleteItem.js.map +1 -1
  8. package/lib/components/FormComponents/ChoiceItems/ChoiceCheckboxAnswerOptionItem.js +4 -9
  9. package/lib/components/FormComponents/ChoiceItems/ChoiceCheckboxAnswerOptionItem.js.map +1 -1
  10. package/lib/components/FormComponents/ChoiceItems/ChoiceCheckboxAnswerValueSetItem.js +4 -9
  11. package/lib/components/FormComponents/ChoiceItems/ChoiceCheckboxAnswerValueSetItem.js.map +1 -1
  12. package/lib/components/FormComponents/ChoiceItems/ChoiceRadioAnswerOptionItem.js +4 -10
  13. package/lib/components/FormComponents/ChoiceItems/ChoiceRadioAnswerOptionItem.js.map +1 -1
  14. package/lib/components/FormComponents/ChoiceItems/ChoiceRadioAnswerValueSetItem.js +4 -10
  15. package/lib/components/FormComponents/ChoiceItems/ChoiceRadioAnswerValueSetItem.js.map +1 -1
  16. package/lib/components/FormComponents/ChoiceItems/ChoiceSelectAnswerOptionItem.js +4 -10
  17. package/lib/components/FormComponents/ChoiceItems/ChoiceSelectAnswerOptionItem.js.map +1 -1
  18. package/lib/components/FormComponents/ChoiceItems/ChoiceSelectAnswerValueSetItem.js +4 -10
  19. package/lib/components/FormComponents/ChoiceItems/ChoiceSelectAnswerValueSetItem.js.map +1 -1
  20. package/lib/components/FormComponents/CustomDateItem/CustomDateItem.js +2 -2
  21. package/lib/components/FormComponents/CustomDateItem/CustomDateItem.js.map +1 -1
  22. package/lib/components/FormComponents/DateItem/DateItem.js +2 -2
  23. package/lib/components/FormComponents/DateItem/DateItem.js.map +1 -1
  24. package/lib/components/FormComponents/DateTimeItem/DateTimeItem.js +2 -2
  25. package/lib/components/FormComponents/DateTimeItem/DateTimeItem.js.map +1 -1
  26. package/lib/components/FormComponents/DecimalItem/DecimalItem.js +4 -4
  27. package/lib/components/FormComponents/DecimalItem/DecimalItem.js.map +1 -1
  28. package/lib/components/FormComponents/IntegerItem/IntegerField.js +1 -1
  29. package/lib/components/FormComponents/IntegerItem/IntegerField.js.map +1 -1
  30. package/lib/components/FormComponents/IntegerItem/IntegerItem.js +4 -4
  31. package/lib/components/FormComponents/IntegerItem/IntegerItem.js.map +1 -1
  32. package/lib/components/FormComponents/ItemParts/ItemExtensionLabels.d.ts +7 -0
  33. package/lib/components/FormComponents/{DateItem/DatePickerField.js → ItemParts/ItemExtensionLabels.js} +12 -6
  34. package/lib/components/FormComponents/ItemParts/ItemExtensionLabels.js.map +1 -0
  35. package/lib/components/FormComponents/ItemParts/ItemFieldGrid.d.ts +1 -0
  36. package/lib/components/FormComponents/ItemParts/ItemFieldGrid.js +10 -7
  37. package/lib/components/FormComponents/ItemParts/ItemFieldGrid.js.map +1 -1
  38. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceAutocompleteItem.js +4 -10
  39. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceAutocompleteItem.js.map +1 -1
  40. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceCheckboxAnswerOptionItem.js +4 -9
  41. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceCheckboxAnswerOptionItem.js.map +1 -1
  42. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceRadioAnswerOptionItem.js +4 -10
  43. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceRadioAnswerOptionItem.js.map +1 -1
  44. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerOptionItem.js +4 -10
  45. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerOptionItem.js.map +1 -1
  46. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerValueSetItem.js +4 -10
  47. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerValueSetItem.js.map +1 -1
  48. package/lib/components/FormComponents/RepeatItem/RepeatItem.d.ts +1 -2
  49. package/lib/components/FormComponents/RepeatItem/RepeatItem.js +2 -2
  50. package/lib/components/FormComponents/RepeatItem/RepeatItem.js.map +1 -1
  51. package/lib/components/FormComponents/SliderItem/SliderItem.js +2 -2
  52. package/lib/components/FormComponents/SliderItem/SliderItem.js.map +1 -1
  53. package/lib/components/FormComponents/StringItem/StringItem.js +4 -4
  54. package/lib/components/FormComponents/StringItem/StringItem.js.map +1 -1
  55. package/lib/components/FormComponents/TextItem/TextItem.js +4 -4
  56. package/lib/components/FormComponents/TextItem/TextItem.js.map +1 -1
  57. package/lib/components/FormComponents/TimeItem/TimeItem.js +2 -2
  58. package/lib/components/FormComponents/TimeItem/TimeItem.js.map +1 -1
  59. package/lib/components/FormComponents/UrlItem/UrlItem.js +4 -4
  60. package/lib/components/FormComponents/UrlItem/UrlItem.js.map +1 -1
  61. package/lib/components/Renderer/BaseRenderer.js +7 -0
  62. package/lib/components/Renderer/BaseRenderer.js.map +1 -1
  63. package/lib/hooks/useRenderingExtensions.d.ts +2 -0
  64. package/lib/hooks/useRenderingExtensions.js +16 -11
  65. package/lib/hooks/useRenderingExtensions.js.map +1 -1
  66. package/lib/hooks/useValidationFeedback.d.ts +3 -0
  67. package/lib/hooks/useValidationFeedback.js +37 -0
  68. package/lib/hooks/useValidationFeedback.js.map +1 -0
  69. package/lib/stores/questionnaireResponseStore.d.ts +8 -1
  70. package/lib/stores/questionnaireResponseStore.js +22 -0
  71. package/lib/stores/questionnaireResponseStore.js.map +1 -1
  72. package/lib/utils/itemControl.d.ts +1 -27
  73. package/lib/utils/itemControl.js +0 -49
  74. package/lib/utils/itemControl.js.map +1 -1
  75. package/lib/utils/mapItem.d.ts +2 -0
  76. package/lib/utils/mapItem.js +2 -0
  77. package/lib/utils/mapItem.js.map +1 -1
  78. package/lib/utils/validateQuestionnaire.d.ts +23 -0
  79. package/lib/utils/validateQuestionnaire.js +183 -0
  80. package/lib/utils/validateQuestionnaire.js.map +1 -0
  81. package/package.json +1 -1
  82. package/src/components/Box.styles.ts +31 -1
  83. package/src/components/FormComponents/BooleanItem/BooleanItem.tsx +6 -2
  84. package/src/components/FormComponents/ChoiceItems/ChoiceAutocompleteItem.tsx +19 -23
  85. package/src/components/FormComponents/ChoiceItems/ChoiceCheckboxAnswerOptionItem.tsx +15 -18
  86. package/src/components/FormComponents/ChoiceItems/ChoiceCheckboxAnswerValueSetItem.tsx +16 -19
  87. package/src/components/FormComponents/ChoiceItems/ChoiceRadioAnswerOptionItem.tsx +15 -19
  88. package/src/components/FormComponents/ChoiceItems/ChoiceRadioAnswerValueSetItem.tsx +17 -21
  89. package/src/components/FormComponents/ChoiceItems/ChoiceSelectAnswerOptionItem.tsx +15 -19
  90. package/src/components/FormComponents/ChoiceItems/ChoiceSelectAnswerValueSetItem.tsx +17 -21
  91. package/src/components/FormComponents/CustomDateItem/CustomDateItem.tsx +7 -2
  92. package/src/components/FormComponents/DateItem/DateItem.tsx +7 -2
  93. package/src/components/FormComponents/DateTimeItem/DateTimeItem.tsx +7 -2
  94. package/src/components/FormComponents/DecimalItem/DecimalItem.tsx +9 -3
  95. package/src/components/FormComponents/IntegerItem/IntegerField.tsx +1 -0
  96. package/src/components/FormComponents/IntegerItem/IntegerItem.tsx +9 -3
  97. package/{lib/components/BackToTopButton/BackToTopButton.js → src/components/FormComponents/ItemParts/ItemExtensionLabels.tsx} +23 -15
  98. package/src/components/FormComponents/ItemParts/ItemFieldGrid.tsx +14 -9
  99. package/src/components/FormComponents/OpenChoiceItems/OpenChoiceAutocompleteItem.tsx +21 -25
  100. package/src/components/FormComponents/OpenChoiceItems/OpenChoiceCheckboxAnswerOptionItem.tsx +20 -23
  101. package/src/components/FormComponents/OpenChoiceItems/OpenChoiceRadioAnswerOptionItem.tsx +18 -22
  102. package/src/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerOptionItem.tsx +16 -20
  103. package/src/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerValueSetItem.tsx +17 -21
  104. package/src/components/FormComponents/RepeatItem/RepeatItem.tsx +8 -4
  105. package/src/components/FormComponents/SliderItem/SliderItem.tsx +6 -2
  106. package/src/components/FormComponents/StringItem/StringItem.tsx +9 -3
  107. package/src/components/FormComponents/TextItem/TextItem.tsx +9 -3
  108. package/src/components/FormComponents/TimeItem/TimeItem.tsx +7 -2
  109. package/src/components/FormComponents/UrlItem/UrlItem.tsx +9 -3
  110. package/src/components/Renderer/BaseRenderer.tsx +9 -0
  111. package/src/hooks/useRenderingExtensions.ts +17 -11
  112. package/src/hooks/{useValidationError.ts → useValidationFeedback.ts} +23 -21
  113. package/src/stores/questionnaireResponseStore.ts +36 -1
  114. package/src/utils/itemControl.ts +1 -67
  115. package/src/utils/mapItem.ts +2 -0
  116. package/src/utils/validateQuestionnaire.ts +273 -0
  117. package/lib/components/BackToTopButton/BackToTopButton.d.ts +0 -7
  118. package/lib/components/BackToTopButton/BackToTopButton.js.map +0 -1
  119. package/lib/components/FormComponents/CustomDateItem/CustomDateField2.d.ts +0 -18
  120. package/lib/components/FormComponents/CustomDateItem/CustomDateField2.js +0 -31
  121. package/lib/components/FormComponents/CustomDateItem/CustomDateField2.js.map +0 -1
  122. package/lib/components/FormComponents/CustomDateItem/CustomDateTimeField.d.ts +0 -9
  123. package/lib/components/FormComponents/CustomDateItem/CustomDateTimeField.js +0 -75
  124. package/lib/components/FormComponents/CustomDateItem/CustomDateTimeField.js.map +0 -1
  125. package/lib/components/FormComponents/CustomDateItem/CustomDateTimePickerText2.d.ts +0 -9
  126. package/lib/components/FormComponents/CustomDateItem/CustomDateTimePickerText2.js +0 -75
  127. package/lib/components/FormComponents/CustomDateItem/CustomDateTimePickerText2.js.map +0 -1
  128. package/lib/components/FormComponents/CustomDateItem/customDateTimePicker/hooks/useParseDates.d.ts +0 -5
  129. package/lib/components/FormComponents/CustomDateItem/customDateTimePicker/hooks/useParseDates.js +0 -27
  130. package/lib/components/FormComponents/CustomDateItem/customDateTimePicker/hooks/useParseDates.js.map +0 -1
  131. package/lib/components/FormComponents/CustomDateItem/customDateTimePickerText.d.ts +0 -9
  132. package/lib/components/FormComponents/CustomDateItem/customDateTimePickerText.js +0 -71
  133. package/lib/components/FormComponents/CustomDateItem/customDateTimePickerText.js.map +0 -1
  134. package/lib/components/FormComponents/DateItem/DatePicker.d.ts +0 -2
  135. package/lib/components/FormComponents/DateItem/DatePicker.js +0 -42
  136. package/lib/components/FormComponents/DateItem/DatePicker.js.map +0 -1
  137. package/lib/components/FormComponents/DateItem/DatePickerField.d.ts +0 -8
  138. package/lib/components/FormComponents/DateItem/DatePickerField.js.map +0 -1
  139. package/lib/components/FormComponents/DisplayItem/DisplayBox.d.ts +0 -0
  140. package/lib/components/FormComponents/DisplayItem/DisplayBox.js +0 -2
  141. package/lib/components/FormComponents/DisplayItem/DisplayBox.js.map +0 -1
  142. package/lib/components/FormComponents/DisplayItem/DisplayBox.styles.d.ts +0 -4
  143. package/lib/components/FormComponents/DisplayItem/DisplayBox.styles.js +0 -35
  144. package/lib/components/FormComponents/DisplayItem/DisplayBox.styles.js.map +0 -1
  145. package/lib/components/FormComponents/GroupItem/GroupChildItemSwitcher.d.ts +0 -10
  146. package/lib/components/FormComponents/GroupItem/GroupChildItemSwitcher.js +0 -73
  147. package/lib/components/FormComponents/GroupItem/GroupChildItemSwitcher.js.map +0 -1
  148. package/lib/components/FormComponents/GroupItem/ItemSwitcher.d.ts +0 -10
  149. package/lib/components/FormComponents/GroupItem/ItemSwitcher.js +0 -81
  150. package/lib/components/FormComponents/GroupItem/ItemSwitcher.js.map +0 -1
  151. package/lib/components/FormComponents/GroupItem/TopLevelGroupItemSwitcher.d.ts +0 -10
  152. package/lib/components/FormComponents/GroupItem/TopLevelGroupItemSwitcher.js +0 -45
  153. package/lib/components/FormComponents/GroupItem/TopLevelGroupItemSwitcher.js.map +0 -1
  154. package/lib/components/FormComponents/IntegerItem/SliderItem.d.ts +0 -9
  155. package/lib/components/FormComponents/IntegerItem/SliderItem.js +0 -75
  156. package/lib/components/FormComponents/IntegerItem/SliderItem.js.map +0 -1
  157. package/lib/components/FormComponents/ItemParts/RadioButtons.d.ts +0 -8
  158. package/lib/components/FormComponents/ItemParts/RadioButtons.js +0 -37
  159. package/lib/components/FormComponents/ItemParts/RadioButtons.js.map +0 -1
  160. package/lib/components/FormComponents/ItemParts/RadioButtonsAnswerOption.d.ts +0 -8
  161. package/lib/components/FormComponents/ItemParts/RadioButtonsAnswerOption.js +0 -37
  162. package/lib/components/FormComponents/ItemParts/RadioButtonsAnswerOption.js.map +0 -1
  163. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceAutocompleteFieldEndAdornment.d.ts +0 -0
  164. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceAutocompleteFieldEndAdornment.js +0 -2
  165. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceAutocompleteFieldEndAdornment.js.map +0 -1
  166. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerOptionFields.d.ts +0 -0
  167. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerOptionFields.js +0 -2
  168. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerOptionFields.js.map +0 -1
  169. package/lib/components/FormComponents/RepeatItem/DeleteItemButton.d.ts +0 -10
  170. package/lib/components/FormComponents/RepeatItem/DeleteItemButton.js +0 -30
  171. package/lib/components/FormComponents/RepeatItem/DeleteItemButton.js.map +0 -1
  172. package/lib/components/FormComponents/SliderItem/DisplayBox.styles.d.ts +0 -4
  173. package/lib/components/FormComponents/SliderItem/DisplayBox.styles.js +0 -35
  174. package/lib/components/FormComponents/SliderItem/DisplayBox.styles.js.map +0 -1
  175. package/lib/components/FormComponents/Tables/AddItemButton.d.ts +0 -8
  176. package/lib/components/FormComponents/Tables/AddItemButton.js +0 -28
  177. package/lib/components/FormComponents/Tables/AddItemButton.js.map +0 -1
  178. package/lib/components/FormComponents/Tables/DeleteRowButton.d.ts +0 -10
  179. package/lib/components/FormComponents/Tables/DeleteRowButton.js +0 -32
  180. package/lib/components/FormComponents/Tables/DeleteRowButton.js.map +0 -1
  181. package/lib/components/FormComponents/Tables/GroupTableRows.d.ts +0 -17
  182. package/lib/components/FormComponents/Tables/GroupTableRows.js +0 -45
  183. package/lib/components/FormComponents/Tables/GroupTableRows.js.map +0 -1
  184. package/lib/components/FormComponents/Tables/GroupTableTestRow.d.ts +0 -22
  185. package/lib/components/FormComponents/Tables/GroupTableTestRow.js +0 -43
  186. package/lib/components/FormComponents/Tables/GroupTableTestRow.js.map +0 -1
  187. package/lib/components/FormComponents/Tables/QItemGroupTable.d.ts +0 -10
  188. package/lib/components/FormComponents/Tables/QItemGroupTable.js +0 -109
  189. package/lib/components/FormComponents/Tables/QItemGroupTable.js.map +0 -1
  190. package/lib/components/FormComponents/Tables/QItemGroupTableRow.d.ts +0 -10
  191. package/lib/components/FormComponents/Tables/QItemGroupTableRow.js +0 -46
  192. package/lib/components/FormComponents/Tables/QItemGroupTableRow.js.map +0 -1
  193. package/lib/components/FormComponents/Typography.styles.d.ts +0 -6
  194. package/lib/components/FormComponents/Typography.styles.js +0 -24
  195. package/lib/components/FormComponents/Typography.styles.js.map +0 -1
  196. package/lib/hooks/useBackToTop.d.ts +0 -2
  197. package/lib/hooks/useBackToTop.js +0 -26
  198. package/lib/hooks/useBackToTop.js.map +0 -1
  199. package/lib/hooks/useDateSeparatorValidation.d.ts +0 -2
  200. package/lib/hooks/useDateSeparatorValidation.js +0 -25
  201. package/lib/hooks/useDateSeparatorValidation.js.map +0 -1
  202. package/lib/hooks/useDecimalUpdateFromProp.d.ts +0 -2
  203. package/lib/hooks/useDecimalUpdateFromProp.js +0 -29
  204. package/lib/hooks/useDecimalUpdateFromProp.js.map +0 -1
  205. package/lib/hooks/useIntegerUpdateFromProp.d.ts +0 -2
  206. package/lib/hooks/useIntegerUpdateFromProp.js +0 -29
  207. package/lib/hooks/useIntegerUpdateFromProp.js.map +0 -1
  208. package/lib/hooks/useMinimalStringCalculatedExpression.d.ts +0 -11
  209. package/lib/hooks/useMinimalStringCalculatedExpression.js +0 -49
  210. package/lib/hooks/useMinimalStringCalculatedExpression.js.map +0 -1
  211. package/lib/hooks/useNumberUpdateFromProp.d.ts +0 -2
  212. package/lib/hooks/useNumberUpdateFromProp.js +0 -29
  213. package/lib/hooks/useNumberUpdateFromProp.js.map +0 -1
  214. package/lib/hooks/useRepeatItemState.d.ts +0 -5
  215. package/lib/hooks/useRepeatItemState.js +0 -35
  216. package/lib/hooks/useRepeatItemState.js.map +0 -1
  217. package/lib/hooks/useRepeatItemUpdateFromProp.d.ts +0 -2
  218. package/lib/hooks/useRepeatItemUpdateFromProp.js +0 -29
  219. package/lib/hooks/useRepeatItemUpdateFromProp.js.map +0 -1
  220. package/lib/hooks/useStringField.d.ts +0 -2
  221. package/lib/hooks/useStringField.js +0 -29
  222. package/lib/hooks/useStringField.js.map +0 -1
  223. package/lib/hooks/useStringUpdateFromProp.d.ts +0 -2
  224. package/lib/hooks/useStringUpdateFromProp.js +0 -29
  225. package/lib/hooks/useStringUpdateFromProp.js.map +0 -1
  226. package/lib/hooks/useValidationError.d.ts +0 -3
  227. package/lib/hooks/useValidationError.js +0 -38
  228. package/lib/hooks/useValidationError.js.map +0 -1
  229. package/lib/interfaces/index.d.ts +0 -2
  230. package/lib/interfaces/index.js +0 -18
  231. package/lib/interfaces/index.js.map +0 -1
  232. package/lib/setup-jest.js +0 -1
  233. package/lib/setup-jest.js.map +0 -1
  234. package/lib/stores/useQuestionnaireResponseStore.d.ts +0 -27
  235. package/lib/stores/useQuestionnaireResponseStore.js +0 -49
  236. package/lib/stores/useQuestionnaireResponseStore.js.map +0 -1
  237. package/lib/stores/useQuestionnaireStore.d.ts +0 -64
  238. package/lib/stores/useQuestionnaireStore.js +0 -173
  239. package/lib/stores/useQuestionnaireStore.js.map +0 -1
  240. package/lib/stores/useSmartConfigStore.d.ts +0 -14
  241. package/lib/stores/useSmartConfigStore.js +0 -13
  242. package/lib/stores/useSmartConfigStore.js.map +0 -1
  243. package/lib/stores/useTerminologyServerStore.d.ts +0 -7
  244. package/lib/stores/useTerminologyServerStore.js +0 -25
  245. package/lib/stores/useTerminologyServerStore.js.map +0 -1
  246. package/lib/stories/MedicalHistoryTable.stories.js +0 -45
  247. package/lib/stories/MedicalHistoryTable.stories.js.map +0 -1
  248. package/lib/stories/SmartFormsRenderer.stories.js +0 -103
  249. package/lib/stories/SmartFormsRenderer.stories.js.map +0 -1
  250. package/lib/test.d.ts +0 -4
  251. package/lib/test.js +0 -18
  252. package/lib/test.js.map +0 -1
  253. package/lib/theme/overrides/Backdrop.d.ts +0 -13
  254. package/lib/theme/overrides/Backdrop.js +0 -32
  255. package/lib/theme/overrides/Backdrop.js.map +0 -1
  256. package/lib/theme/overrides/Typography.d.ts +0 -13
  257. package/lib/theme/overrides/Typography.js +0 -31
  258. package/lib/theme/overrides/Typography.js.map +0 -1
  259. package/lib/utils/formChangesOld.d.ts +0 -18
  260. package/lib/utils/formChangesOld.js +0 -91
  261. package/lib/utils/formChangesOld.js.map +0 -1
  262. package/lib/utils/initialiseForm.d.ts +0 -22
  263. package/lib/utils/initialiseForm.js +0 -53
  264. package/lib/utils/initialiseForm.js.map +0 -1
  265. package/lib/utils/launchContext.d.ts +0 -0
  266. package/lib/utils/launchContext.js +0 -2
  267. package/lib/utils/launchContext.js.map +0 -1
  268. package/lib/utils/populateInputParams.d.ts +0 -8
  269. package/lib/utils/populateInputParams.js +0 -193
  270. package/lib/utils/populateInputParams.js.map +0 -1
  271. package/lib/utils/removeHidden.d.ts +0 -16
  272. package/lib/utils/removeHidden.js +0 -105
  273. package/lib/utils/removeHidden.js.map +0 -1
  274. package/lib/utils/repopulate.d.ts +0 -9
  275. package/lib/utils/repopulate.js +0 -133
  276. package/lib/utils/repopulate.js.map +0 -1
  277. package/lib/utils/repopulateGenerateItems.d.ts +0 -9
  278. package/lib/utils/repopulateGenerateItems.js +0 -133
  279. package/lib/utils/repopulateGenerateItems.js.map +0 -1
  280. package/lib/utils/repopulateRepeatGroup.d.ts +0 -4
  281. package/lib/utils/repopulateRepeatGroup.js +0 -62
  282. package/lib/utils/repopulateRepeatGroup.js.map +0 -1
@@ -0,0 +1,23 @@
1
+ import type { QuestionnaireResponse } from 'fhir/r4';
2
+ import { Questionnaire } from 'fhir/r4';
3
+ import { EnableWhenExpression, EnableWhenItems } from '../interfaces/enableWhen.interface';
4
+ import { RegexValidation } from '../interfaces/regex.interface';
5
+ export type InvalidType = 'regex' | 'minLength' | 'maxLength' | 'required';
6
+ interface ValidateQuestionnaireParams {
7
+ questionnaire: Questionnaire;
8
+ questionnaireResponse: QuestionnaireResponse;
9
+ invalidItems: Record<string, InvalidType>;
10
+ enableWhenIsActivated: boolean;
11
+ enableWhenItems: EnableWhenItems;
12
+ enableWhenExpressions: Record<string, EnableWhenExpression>;
13
+ }
14
+ /**
15
+ * Recursively go through the questionnaireResponse and check for un-filled required qItems
16
+ * At the moment item.required for group items are not checked
17
+ * FIXME will eventually be renamed to validate questionnaire
18
+ *
19
+ * @author Sean Fong
20
+ */
21
+ export declare function validateQuestionnaire(params: ValidateQuestionnaireParams): Record<string, InvalidType>;
22
+ export declare function getInputInvalidType(input: string, regexValidation: RegexValidation | null, minLength: number | null, maxLength: number | null): InvalidType | null;
23
+ export {};
@@ -0,0 +1,183 @@
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 { getQrItemsIndex, mapQItemsIndex } from './mapItem';
18
+ import { isHidden } from './qItem';
19
+ import { getRegexValidation } from './itemControl';
20
+ import { structuredDataCapture } from 'fhir-sdc-helpers';
21
+ /**
22
+ * Recursively go through the questionnaireResponse and check for un-filled required qItems
23
+ * At the moment item.required for group items are not checked
24
+ * FIXME will eventually be renamed to validate questionnaire
25
+ *
26
+ * @author Sean Fong
27
+ */
28
+ export function validateQuestionnaire(params) {
29
+ var _a;
30
+ const { questionnaire, questionnaireResponse, invalidItems, enableWhenIsActivated, enableWhenItems, enableWhenExpressions } = params;
31
+ if (!questionnaire.item ||
32
+ questionnaire.item.length === 0 ||
33
+ !questionnaireResponse.item ||
34
+ questionnaireResponse.item.length === 0) {
35
+ return invalidItems;
36
+ }
37
+ const qItemsIndexMap = mapQItemsIndex(questionnaire);
38
+ const topLevelQRItemsByIndex = getQrItemsIndex(questionnaire.item, questionnaireResponse.item, qItemsIndexMap);
39
+ for (const [index, topLevelQItem] of questionnaire.item.entries()) {
40
+ let topLevelQRItem = (_a = topLevelQRItemsByIndex[index]) !== null && _a !== void 0 ? _a : {
41
+ linkId: topLevelQItem.linkId,
42
+ text: topLevelQItem.text
43
+ };
44
+ if (Array.isArray(topLevelQRItem)) {
45
+ topLevelQRItem = {
46
+ linkId: topLevelQItem.linkId,
47
+ text: topLevelQItem.text,
48
+ item: topLevelQRItem
49
+ };
50
+ }
51
+ validateItemRecursive({
52
+ qItem: topLevelQItem,
53
+ qrItem: topLevelQRItem,
54
+ invalidItems: invalidItems,
55
+ enableWhenIsActivated,
56
+ enableWhenItems,
57
+ enableWhenExpressions
58
+ });
59
+ }
60
+ return invalidItems;
61
+ }
62
+ function validateItemRecursive(params) {
63
+ var _a, _b;
64
+ const { qItem, qrItem, invalidItems, enableWhenIsActivated, enableWhenItems, enableWhenExpressions } = params;
65
+ if (isHidden({
66
+ questionnaireItem: qItem,
67
+ enableWhenIsActivated,
68
+ enableWhenItems,
69
+ enableWhenExpressions
70
+ })) {
71
+ return;
72
+ }
73
+ // FIXME repeat groups not working
74
+ if (qItem.type === 'group' && qItem.repeats) {
75
+ return validateRepeatGroup(qItem, qrItem, invalidItems);
76
+ }
77
+ const childQItems = qItem.item;
78
+ if (childQItems && childQItems.length > 0) {
79
+ const childQrItems = (_a = qrItem === null || qrItem === void 0 ? void 0 : qrItem.item) !== null && _a !== void 0 ? _a : [];
80
+ const indexMap = mapQItemsIndex(qItem);
81
+ const qrItemsByIndex = getQrItemsIndex(childQItems, childQrItems, indexMap);
82
+ if (qItem.type === 'group' && qItem.required) {
83
+ if (!qrItem || qrItemsByIndex.length === 0) {
84
+ invalidItems[qItem.linkId] = 'required';
85
+ }
86
+ }
87
+ for (const [index, childQItem] of childQItems.entries()) {
88
+ let childQRItem = (_b = qrItemsByIndex[index]) !== null && _b !== void 0 ? _b : {
89
+ linkId: childQItem.linkId,
90
+ text: childQItem.text
91
+ };
92
+ if (Array.isArray(childQRItem)) {
93
+ childQRItem = {
94
+ linkId: childQItem.linkId,
95
+ text: childQItem.text,
96
+ item: childQRItem
97
+ };
98
+ }
99
+ validateItemRecursive({
100
+ qItem: childQItem,
101
+ qrItem: childQRItem,
102
+ invalidItems: invalidItems,
103
+ enableWhenIsActivated,
104
+ enableWhenItems,
105
+ enableWhenExpressions
106
+ });
107
+ }
108
+ }
109
+ validateSingleItem(qItem, qrItem, invalidItems);
110
+ }
111
+ function validateSingleItem(qItem, qrItem, invalidItems) {
112
+ var _a, _b;
113
+ // Validate item.required
114
+ if (qItem.type !== 'display') {
115
+ if (qItem.required && !qrItem.answer) {
116
+ invalidItems[qItem.linkId] = 'required';
117
+ return invalidItems;
118
+ }
119
+ }
120
+ // Validate regex, maxLength and minLength
121
+ if (qrItem.answer) {
122
+ for (const answer of qrItem.answer) {
123
+ if (answer.valueString || answer.valueInteger || answer.valueDecimal || answer.valueUri) {
124
+ const invalidInputType = getInputInvalidType(getInputInString(answer), getRegexValidation(qItem), (_a = structuredDataCapture.getMinLength(qItem)) !== null && _a !== void 0 ? _a : null, (_b = qItem.maxLength) !== null && _b !== void 0 ? _b : null);
125
+ if (!invalidInputType) {
126
+ continue;
127
+ }
128
+ // Assign invalid type and break - stop checking other answers if is a repeat item
129
+ switch (invalidInputType) {
130
+ case 'regex':
131
+ invalidItems[qItem.linkId] = 'regex';
132
+ break;
133
+ case 'minLength':
134
+ invalidItems[qItem.linkId] = 'minLength';
135
+ break;
136
+ case 'maxLength':
137
+ invalidItems[qItem.linkId] = 'maxLength';
138
+ break;
139
+ }
140
+ break;
141
+ }
142
+ }
143
+ // Reached the end of the loop and no invalid input type found
144
+ // If a required item is filled, remove the required invalid type
145
+ if (qItem.required && invalidItems[qItem.linkId] && invalidItems[qItem.linkId] === 'required') {
146
+ delete invalidItems[qItem.linkId];
147
+ }
148
+ }
149
+ return invalidItems;
150
+ }
151
+ function validateRepeatGroup(qItem, qrItems, invalidLinkIds) {
152
+ return;
153
+ }
154
+ function getInputInString(answer) {
155
+ if (answer.valueString) {
156
+ return answer.valueString;
157
+ }
158
+ else if (answer.valueInteger) {
159
+ return answer.valueInteger.toString();
160
+ }
161
+ else if (answer.valueDecimal) {
162
+ return answer.valueDecimal.toString();
163
+ }
164
+ else if (answer.valueUri) {
165
+ return answer.valueUri;
166
+ }
167
+ return '';
168
+ }
169
+ export function getInputInvalidType(input, regexValidation, minLength, maxLength) {
170
+ if (input) {
171
+ if (regexValidation && !regexValidation.expression.test(input)) {
172
+ return 'regex';
173
+ }
174
+ if (minLength && input.length < minLength) {
175
+ return 'minLength';
176
+ }
177
+ if (maxLength && input.length > maxLength) {
178
+ return 'maxLength';
179
+ }
180
+ }
181
+ return null;
182
+ }
183
+ //# sourceMappingURL=validateQuestionnaire.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validateQuestionnaire.js","sourceRoot":"","sources":["../../src/utils/validateQuestionnaire.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.12.1",
3
+ "version": "0.13.0",
4
4
  "description": "FHIR Structured Data Captured (SDC) rendering engine for Smart Forms",
5
5
  "main": "lib/index.js",
6
6
  "scripts": {
@@ -16,7 +16,7 @@
16
16
  */
17
17
 
18
18
  import Box from '@mui/material/Box';
19
- import { styled } from '@mui/material/styles';
19
+ import { alpha, styled } from '@mui/material/styles';
20
20
  import FormControlLabel from '@mui/material/FormControlLabel';
21
21
 
22
22
  export const QGroupContainerBox = styled(Box, {
@@ -37,3 +37,33 @@ export const FormTitleWrapper = styled(Box)(() => ({
37
37
  export const StyledFormControlLabel = styled(FormControlLabel)(() => ({
38
38
  height: 34
39
39
  }));
40
+
41
+ export const RequiredLabel = styled(Box)(({ theme }) => ({
42
+ height: 12,
43
+ minWidth: 20,
44
+ lineHeight: 0,
45
+ borderRadius: 6,
46
+ alignItems: 'center',
47
+ whiteSpace: 'nowrap',
48
+ justifyContent: 'center',
49
+ padding: theme.spacing(1),
50
+ fontSize: theme.typography.caption.fontSize,
51
+ color: theme.palette.error.dark,
52
+ backgroundColor: alpha(theme.palette.error.main, 0.16),
53
+ fontWeight: theme.typography.fontWeightBold
54
+ }));
55
+
56
+ export const ReadOnlyLabel = styled(Box)(({ theme }) => ({
57
+ height: 12,
58
+ minWidth: 20,
59
+ lineHeight: 0,
60
+ borderRadius: 6,
61
+ alignItems: 'center',
62
+ whiteSpace: 'nowrap',
63
+ justifyContent: 'center',
64
+ padding: theme.spacing(1),
65
+ fontSize: theme.typography.caption.fontSize,
66
+ color: theme.palette.text.primary,
67
+ backgroundColor: theme.palette.grey['300'],
68
+ fontWeight: theme.typography.fontWeightBold
69
+ }));
@@ -44,7 +44,7 @@ function BooleanItem(props: BooleanItemProps) {
44
44
  const { qItem, qrItem, isRepeated, isTabled, parentIsReadOnly, onQrItemChange } = props;
45
45
 
46
46
  const readOnly = useReadOnly(qItem, parentIsReadOnly);
47
- const { displayInstructions } = useRenderingExtensions(qItem);
47
+ const { displayInstructions, required } = useRenderingExtensions(qItem);
48
48
 
49
49
  // Init input value
50
50
  let checked = false;
@@ -75,7 +75,11 @@ function BooleanItem(props: BooleanItemProps) {
75
75
  }
76
76
  return (
77
77
  <FullWidthFormComponentBox data-test="q-item-boolean-box">
78
- <ItemFieldGrid qItem={qItem} displayInstructions={displayInstructions} readOnly={readOnly}>
78
+ <ItemFieldGrid
79
+ qItem={qItem}
80
+ displayInstructions={displayInstructions}
81
+ required={required}
82
+ readOnly={readOnly}>
79
83
  <BooleanField checked={checked} readOnly={readOnly} onCheckedChange={handleCheckedChange} />
80
84
  </ItemFieldGrid>
81
85
  </FullWidthFormComponentBox>
@@ -16,7 +16,6 @@
16
16
  */
17
17
 
18
18
  import React, { useState } from 'react';
19
- import Grid from '@mui/material/Grid';
20
19
  import type { Coding, QuestionnaireItem, QuestionnaireResponseItem } from 'fhir/r4';
21
20
 
22
21
  import { createEmptyQrItem } from '../../../utils/qrItem';
@@ -31,10 +30,9 @@ import type {
31
30
  PropsWithQrItemChangeHandler
32
31
  } from '../../../interfaces/renderProps.interface';
33
32
  import { AUTOCOMPLETE_DEBOUNCE_DURATION } from '../../../utils/debounce';
34
- import DisplayInstructions from '../DisplayItem/DisplayInstructions';
35
- import LabelWrapper from '../ItemParts/ItemLabelWrapper';
36
33
  import useReadOnly from '../../../hooks/useReadOnly';
37
34
  import ChoiceAutocompleteField from './ChoiceAutocompleteField';
35
+ import ItemFieldGrid from '../ItemParts/ItemFieldGrid';
38
36
 
39
37
  interface ChoiceAutocompleteItemProps
40
38
  extends PropsWithQrItemChangeHandler,
@@ -56,7 +54,7 @@ function ChoiceAutocompleteItem(props: ChoiceAutocompleteItemProps) {
56
54
  }
57
55
 
58
56
  const readOnly = useReadOnly(qItem, parentIsReadOnly);
59
- const { displayInstructions } = useRenderingExtensions(qItem);
57
+ const { displayInstructions, required } = useRenderingExtensions(qItem);
60
58
 
61
59
  const maxList = 10;
62
60
 
@@ -106,25 +104,23 @@ function ChoiceAutocompleteItem(props: ChoiceAutocompleteItemProps) {
106
104
 
107
105
  return (
108
106
  <FullWidthFormComponentBox>
109
- <Grid container columnSpacing={6}>
110
- <Grid item xs={5}>
111
- <LabelWrapper qItem={qItem} readOnly={readOnly} />
112
- </Grid>
113
- <Grid item xs={7}>
114
- <ChoiceAutocompleteField
115
- qItem={qItem}
116
- options={options}
117
- valueCoding={valueCoding ?? null}
118
- loading={loading}
119
- feedback={feedback ?? null}
120
- readOnly={readOnly}
121
- isTabled={isTabled}
122
- onInputChange={setInput}
123
- onValueChange={handleValueChange}
124
- />
125
- <DisplayInstructions displayInstructions={displayInstructions} readOnly={readOnly} />
126
- </Grid>
127
- </Grid>
107
+ <ItemFieldGrid
108
+ qItem={qItem}
109
+ displayInstructions={displayInstructions}
110
+ required={required}
111
+ readOnly={readOnly}>
112
+ <ChoiceAutocompleteField
113
+ qItem={qItem}
114
+ options={options}
115
+ valueCoding={valueCoding ?? null}
116
+ loading={loading}
117
+ feedback={feedback ?? null}
118
+ readOnly={readOnly}
119
+ isTabled={isTabled}
120
+ onInputChange={setInput}
121
+ onValueChange={handleValueChange}
122
+ />
123
+ </ItemFieldGrid>
128
124
  </FullWidthFormComponentBox>
129
125
  );
130
126
  }
@@ -16,7 +16,6 @@
16
16
  */
17
17
 
18
18
  import React from 'react';
19
- import Grid from '@mui/material/Grid';
20
19
  import type { ChoiceItemOrientation } from '../../../interfaces/choice.enum';
21
20
  import type { QuestionnaireItem, QuestionnaireResponseItem } from 'fhir/r4';
22
21
  import { createEmptyQrItem } from '../../../utils/qrItem';
@@ -30,9 +29,9 @@ import type {
30
29
  PropsWithShowMinimalViewAttribute
31
30
  } from '../../../interfaces/renderProps.interface';
32
31
  import DisplayInstructions from '../DisplayItem/DisplayInstructions';
33
- import LabelWrapper from '../ItemParts/ItemLabelWrapper';
34
32
  import ChoiceCheckboxAnswerValueSetFields from './ChoiceCheckboxAnswerOptionFields';
35
33
  import useReadOnly from '../../../hooks/useReadOnly';
34
+ import ItemFieldGrid from '../ItemParts/ItemFieldGrid';
36
35
 
37
36
  interface ChoiceCheckboxAnswerOptionItemProps
38
37
  extends PropsWithQrItemChangeHandler,
@@ -60,7 +59,7 @@ function ChoiceCheckboxAnswerOptionItem(props: ChoiceCheckboxAnswerOptionItemPro
60
59
  const answers = qrChoiceCheckbox.answer ? qrChoiceCheckbox.answer : [];
61
60
 
62
61
  const readOnly = useReadOnly(qItem, parentIsReadOnly);
63
- const { displayInstructions } = useRenderingExtensions(qItem);
62
+ const { displayInstructions, required } = useRenderingExtensions(qItem);
64
63
 
65
64
  // Event handlers
66
65
  function handleCheckedChange(changedValue: string) {
@@ -97,21 +96,19 @@ function ChoiceCheckboxAnswerOptionItem(props: ChoiceCheckboxAnswerOptionItemPro
97
96
 
98
97
  return (
99
98
  <FullWidthFormComponentBox data-test="q-item-choice-checkbox-answer-option-box">
100
- <Grid container columnSpacing={6}>
101
- <Grid item xs={5}>
102
- <LabelWrapper qItem={qItem} readOnly={readOnly} />
103
- </Grid>
104
- <Grid item xs={7}>
105
- <ChoiceCheckboxAnswerValueSetFields
106
- qItem={qItem}
107
- answers={answers}
108
- orientation={orientation}
109
- readOnly={readOnly}
110
- onCheckedChange={handleCheckedChange}
111
- />
112
- <DisplayInstructions displayInstructions={displayInstructions} readOnly={readOnly} />
113
- </Grid>
114
- </Grid>
99
+ <ItemFieldGrid
100
+ qItem={qItem}
101
+ displayInstructions={displayInstructions}
102
+ required={required}
103
+ readOnly={readOnly}>
104
+ <ChoiceCheckboxAnswerValueSetFields
105
+ qItem={qItem}
106
+ answers={answers}
107
+ orientation={orientation}
108
+ readOnly={readOnly}
109
+ onCheckedChange={handleCheckedChange}
110
+ />
111
+ </ItemFieldGrid>
115
112
  </FullWidthFormComponentBox>
116
113
  );
117
114
  }
@@ -16,7 +16,6 @@
16
16
  */
17
17
 
18
18
  import React from 'react';
19
- import Grid from '@mui/material/Grid';
20
19
  import type { QuestionnaireItem, QuestionnaireResponseItem } from 'fhir/r4';
21
20
  import { createEmptyQrItem } from '../../../utils/qrItem';
22
21
  import useValueSetCodings from '../../../hooks/useValueSetCodings';
@@ -31,9 +30,9 @@ import type {
31
30
  PropsWithShowMinimalViewAttribute
32
31
  } from '../../../interfaces/renderProps.interface';
33
32
  import DisplayInstructions from '../DisplayItem/DisplayInstructions';
34
- import LabelWrapper from '../ItemParts/ItemLabelWrapper';
35
33
  import ChoiceCheckboxAnswerValueSetFields from './ChoiceCheckboxAnswerValueSetFields';
36
34
  import useReadOnly from '../../../hooks/useReadOnly';
35
+ import ItemFieldGrid from '../ItemParts/ItemFieldGrid';
37
36
 
38
37
  interface ChoiceCheckboxAnswerValueSetItemProps
39
38
  extends PropsWithQrItemChangeHandler,
@@ -62,7 +61,7 @@ function ChoiceCheckboxAnswerValueSetItem(props: ChoiceCheckboxAnswerValueSetIte
62
61
  const answers = qrChoiceCheckbox.answer ? qrChoiceCheckbox.answer : [];
63
62
 
64
63
  const readOnly = useReadOnly(qItem, parentIsReadOnly);
65
- const { displayInstructions } = useRenderingExtensions(qItem);
64
+ const { displayInstructions, required } = useRenderingExtensions(qItem);
66
65
 
67
66
  // Get codings/options from valueSet
68
67
  const { codings, serverError } = useValueSetCodings(qItem);
@@ -102,22 +101,20 @@ function ChoiceCheckboxAnswerValueSetItem(props: ChoiceCheckboxAnswerValueSetIte
102
101
 
103
102
  return (
104
103
  <FullWidthFormComponentBox data-test="q-item-choice-checkbox-answer-value-set-box">
105
- <Grid container columnSpacing={6}>
106
- <Grid item xs={5}>
107
- <LabelWrapper qItem={qItem} readOnly={readOnly} />
108
- </Grid>
109
- <Grid item xs={7}>
110
- <ChoiceCheckboxAnswerValueSetFields
111
- codings={codings}
112
- answers={answers}
113
- orientation={orientation}
114
- readOnly={readOnly}
115
- serverError={serverError}
116
- onCheckedChange={handleCheckedChange}
117
- />
118
- <DisplayInstructions displayInstructions={displayInstructions} readOnly={readOnly} />
119
- </Grid>
120
- </Grid>
104
+ <ItemFieldGrid
105
+ qItem={qItem}
106
+ displayInstructions={displayInstructions}
107
+ required={required}
108
+ readOnly={readOnly}>
109
+ <ChoiceCheckboxAnswerValueSetFields
110
+ codings={codings}
111
+ answers={answers}
112
+ orientation={orientation}
113
+ readOnly={readOnly}
114
+ serverError={serverError}
115
+ onCheckedChange={handleCheckedChange}
116
+ />
117
+ </ItemFieldGrid>
121
118
  </FullWidthFormComponentBox>
122
119
  );
123
120
  }
@@ -16,7 +16,6 @@
16
16
  */
17
17
 
18
18
  import React from 'react';
19
- import Grid from '@mui/material/Grid';
20
19
  import type { ChoiceItemOrientation } from '../../../interfaces/choice.enum';
21
20
  import type { QuestionnaireItem, QuestionnaireResponseItem } from 'fhir/r4';
22
21
  import { findInAnswerOptions, getQrChoiceValue } from '../../../utils/choice';
@@ -28,10 +27,9 @@ import type {
28
27
  PropsWithParentIsReadOnlyAttribute,
29
28
  PropsWithQrItemChangeHandler
30
29
  } from '../../../interfaces/renderProps.interface';
31
- import DisplayInstructions from '../DisplayItem/DisplayInstructions';
32
- import LabelWrapper from '../ItemParts/ItemLabelWrapper';
33
30
  import ChoiceRadioAnswerOptionFields from './ChoiceRadioAnswerOptionFields';
34
31
  import useReadOnly from '../../../hooks/useReadOnly';
32
+ import ItemFieldGrid from '../ItemParts/ItemFieldGrid';
35
33
 
36
34
  interface ChoiceRadioAnswerOptionItemProps
37
35
  extends PropsWithQrItemChangeHandler,
@@ -50,7 +48,7 @@ function ChoiceRadioAnswerOptionItem(props: ChoiceRadioAnswerOptionItemProps) {
50
48
  const valueRadio = getQrChoiceValue(qrChoiceRadio);
51
49
 
52
50
  const readOnly = useReadOnly(qItem, parentIsReadOnly);
53
- const { displayInstructions } = useRenderingExtensions(qItem);
51
+ const { displayInstructions, required } = useRenderingExtensions(qItem);
54
52
 
55
53
  // Event handlers
56
54
  function handleChange(newValue: string) {
@@ -76,21 +74,19 @@ function ChoiceRadioAnswerOptionItem(props: ChoiceRadioAnswerOptionItemProps) {
76
74
 
77
75
  return (
78
76
  <FullWidthFormComponentBox data-test="q-item-choice-radio-answer-option-box">
79
- <Grid container columnSpacing={6}>
80
- <Grid item xs={5}>
81
- <LabelWrapper qItem={qItem} readOnly={readOnly} />
82
- </Grid>
83
- <Grid item xs={7}>
84
- <ChoiceRadioAnswerOptionFields
85
- qItem={qItem}
86
- valueRadio={valueRadio}
87
- orientation={orientation}
88
- readOnly={readOnly}
89
- onCheckedChange={handleChange}
90
- />
91
- <DisplayInstructions displayInstructions={displayInstructions} readOnly={readOnly} />
92
- </Grid>
93
- </Grid>
77
+ <ItemFieldGrid
78
+ qItem={qItem}
79
+ displayInstructions={displayInstructions}
80
+ required={required}
81
+ readOnly={readOnly}>
82
+ <ChoiceRadioAnswerOptionFields
83
+ qItem={qItem}
84
+ valueRadio={valueRadio}
85
+ orientation={orientation}
86
+ readOnly={readOnly}
87
+ onCheckedChange={handleChange}
88
+ />
89
+ </ItemFieldGrid>
94
90
  </FullWidthFormComponentBox>
95
91
  );
96
92
  }
@@ -16,7 +16,6 @@
16
16
  */
17
17
 
18
18
  import React from 'react';
19
- import Grid from '@mui/material/Grid';
20
19
  import type { ChoiceItemOrientation } from '../../../interfaces/choice.enum';
21
20
  import type { QuestionnaireItem, QuestionnaireResponseItem } from 'fhir/r4';
22
21
  import { findInAnswerValueSetCodings } from '../../../utils/choice';
@@ -29,10 +28,9 @@ import type {
29
28
  PropsWithParentIsReadOnlyAttribute,
30
29
  PropsWithQrItemChangeHandler
31
30
  } from '../../../interfaces/renderProps.interface';
32
- import DisplayInstructions from '../DisplayItem/DisplayInstructions';
33
- import LabelWrapper from '../ItemParts/ItemLabelWrapper';
34
31
  import ChoiceRadioAnswerValueSetFields from './ChoiceRadioAnswerValueSetFields';
35
32
  import useReadOnly from '../../../hooks/useReadOnly';
33
+ import ItemFieldGrid from '../ItemParts/ItemFieldGrid';
36
34
 
37
35
  interface ChoiceRadioAnswerValueSetItemProps
38
36
  extends PropsWithQrItemChangeHandler,
@@ -47,7 +45,7 @@ function ChoiceRadioAnswerValueSetItem(props: ChoiceRadioAnswerValueSetItemProps
47
45
  const { qItem, qrItem, orientation, isRepeated, parentIsReadOnly, onQrItemChange } = props;
48
46
 
49
47
  const readOnly = useReadOnly(qItem, parentIsReadOnly);
50
- const { displayInstructions } = useRenderingExtensions(qItem);
48
+ const { displayInstructions, required } = useRenderingExtensions(qItem);
51
49
 
52
50
  // Init input value
53
51
  const qrChoiceRadio = qrItem ?? createEmptyQrItem(qItem);
@@ -88,23 +86,21 @@ function ChoiceRadioAnswerValueSetItem(props: ChoiceRadioAnswerValueSetItemProps
88
86
 
89
87
  return (
90
88
  <FullWidthFormComponentBox data-test="q-item-choice-radio-answer-value-set-box">
91
- <Grid container columnSpacing={6}>
92
- <Grid item xs={5}>
93
- <LabelWrapper qItem={qItem} readOnly={readOnly} />
94
- </Grid>
95
- <Grid item xs={7}>
96
- <ChoiceRadioAnswerValueSetFields
97
- qItem={qItem}
98
- codings={codings}
99
- valueRadio={valueRadio}
100
- orientation={orientation}
101
- readOnly={readOnly}
102
- serverError={serverError}
103
- onCheckedChange={handleChange}
104
- />
105
- <DisplayInstructions displayInstructions={displayInstructions} readOnly={readOnly} />
106
- </Grid>
107
- </Grid>
89
+ <ItemFieldGrid
90
+ qItem={qItem}
91
+ displayInstructions={displayInstructions}
92
+ required={required}
93
+ readOnly={readOnly}>
94
+ <ChoiceRadioAnswerValueSetFields
95
+ qItem={qItem}
96
+ codings={codings}
97
+ valueRadio={valueRadio}
98
+ orientation={orientation}
99
+ readOnly={readOnly}
100
+ serverError={serverError}
101
+ onCheckedChange={handleChange}
102
+ />
103
+ </ItemFieldGrid>
108
104
  </FullWidthFormComponentBox>
109
105
  );
110
106
  }