@aehrc/smart-forms-renderer 0.12.0 → 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 (324) 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/Tables/GroupTable.js +0 -1
  56. package/lib/components/FormComponents/Tables/GroupTable.js.map +1 -1
  57. package/lib/components/FormComponents/Tables/GroupTableRow.js +3 -3
  58. package/lib/components/FormComponents/Tables/GroupTableRow.js.map +1 -1
  59. package/lib/components/FormComponents/Tables/GroupTableView.js +1 -1
  60. package/lib/components/FormComponents/Tables/GroupTableView.js.map +1 -1
  61. package/lib/components/FormComponents/Tables/SelectRowButton.d.ts +1 -0
  62. package/lib/components/FormComponents/Tables/SelectRowButton.js +2 -2
  63. package/lib/components/FormComponents/Tables/SelectRowButton.js.map +1 -1
  64. package/lib/components/FormComponents/TextItem/TextItem.js +4 -4
  65. package/lib/components/FormComponents/TextItem/TextItem.js.map +1 -1
  66. package/lib/components/FormComponents/TimeItem/TimeItem.js +2 -2
  67. package/lib/components/FormComponents/TimeItem/TimeItem.js.map +1 -1
  68. package/lib/components/FormComponents/UrlItem/UrlItem.js +4 -4
  69. package/lib/components/FormComponents/UrlItem/UrlItem.js.map +1 -1
  70. package/lib/components/Renderer/BaseRenderer.js +9 -1
  71. package/lib/components/Renderer/BaseRenderer.js.map +1 -1
  72. package/lib/components/Renderer/FormBodyCollapsible.d.ts +2 -2
  73. package/lib/components/Renderer/FormBodyCollapsible.js +2 -2
  74. package/lib/components/Renderer/FormBodyCollapsible.js.map +1 -1
  75. package/lib/components/Renderer/FormBodySingleCollapsibleWrapper.d.ts +2 -2
  76. package/lib/components/Renderer/FormBodySingleCollapsibleWrapper.js +2 -2
  77. package/lib/components/Renderer/FormBodySingleCollapsibleWrapper.js.map +1 -1
  78. package/lib/components/Renderer/FormBodyTabbed.d.ts +2 -2
  79. package/lib/components/Renderer/FormBodyTabbed.js +2 -2
  80. package/lib/components/Renderer/FormBodyTabbed.js.map +1 -1
  81. package/lib/components/Renderer/FormTopLevelItem.d.ts +2 -2
  82. package/lib/components/Renderer/FormTopLevelItem.js +4 -4
  83. package/lib/components/Renderer/FormTopLevelItem.js.map +1 -1
  84. package/lib/components/Renderer/SmartFormsRenderer.d.ts +1 -0
  85. package/lib/components/Renderer/SmartFormsRenderer.js +2 -2
  86. package/lib/components/Renderer/SmartFormsRenderer.js.map +1 -1
  87. package/lib/hooks/useInitialiseRenderer.d.ts +1 -1
  88. package/lib/hooks/useInitialiseRenderer.js +4 -3
  89. package/lib/hooks/useInitialiseRenderer.js.map +1 -1
  90. package/lib/hooks/useRenderingExtensions.d.ts +2 -0
  91. package/lib/hooks/useRenderingExtensions.js +16 -11
  92. package/lib/hooks/useRenderingExtensions.js.map +1 -1
  93. package/lib/hooks/useValidationFeedback.d.ts +3 -0
  94. package/lib/hooks/useValidationFeedback.js +37 -0
  95. package/lib/hooks/useValidationFeedback.js.map +1 -0
  96. package/lib/stores/questionnaireResponseStore.d.ts +8 -1
  97. package/lib/stores/questionnaireResponseStore.js +22 -0
  98. package/lib/stores/questionnaireResponseStore.js.map +1 -1
  99. package/lib/stores/questionnaireStore.d.ts +4 -2
  100. package/lib/stores/questionnaireStore.js +4 -2
  101. package/lib/stores/questionnaireStore.js.map +1 -1
  102. package/lib/utils/itemControl.d.ts +1 -27
  103. package/lib/utils/itemControl.js +0 -49
  104. package/lib/utils/itemControl.js.map +1 -1
  105. package/lib/utils/mapItem.d.ts +2 -0
  106. package/lib/utils/mapItem.js +2 -0
  107. package/lib/utils/mapItem.js.map +1 -1
  108. package/lib/utils/validateQuestionnaire.d.ts +23 -0
  109. package/lib/utils/validateQuestionnaire.js +183 -0
  110. package/lib/utils/validateQuestionnaire.js.map +1 -0
  111. package/package.json +2 -2
  112. package/src/components/Box.styles.ts +31 -1
  113. package/src/components/FormComponents/BooleanItem/BooleanItem.tsx +6 -2
  114. package/src/components/FormComponents/ChoiceItems/ChoiceAutocompleteItem.tsx +19 -23
  115. package/src/components/FormComponents/ChoiceItems/ChoiceCheckboxAnswerOptionItem.tsx +15 -18
  116. package/src/components/FormComponents/ChoiceItems/ChoiceCheckboxAnswerValueSetItem.tsx +16 -19
  117. package/src/components/FormComponents/ChoiceItems/ChoiceRadioAnswerOptionItem.tsx +15 -19
  118. package/src/components/FormComponents/ChoiceItems/ChoiceRadioAnswerValueSetItem.tsx +17 -21
  119. package/src/components/FormComponents/ChoiceItems/ChoiceSelectAnswerOptionItem.tsx +15 -19
  120. package/src/components/FormComponents/ChoiceItems/ChoiceSelectAnswerValueSetItem.tsx +17 -21
  121. package/src/components/FormComponents/CustomDateItem/CustomDateItem.tsx +7 -2
  122. package/src/components/FormComponents/DateItem/DateItem.tsx +7 -2
  123. package/src/components/FormComponents/DateTimeItem/DateTimeItem.tsx +7 -2
  124. package/src/components/FormComponents/DecimalItem/DecimalItem.tsx +9 -3
  125. package/src/components/FormComponents/IntegerItem/IntegerField.tsx +1 -0
  126. package/src/components/FormComponents/IntegerItem/IntegerItem.tsx +9 -3
  127. package/{lib/components/BackToTopButton/BackToTopButton.js → src/components/FormComponents/ItemParts/ItemExtensionLabels.tsx} +23 -15
  128. package/src/components/FormComponents/ItemParts/ItemFieldGrid.tsx +14 -9
  129. package/src/components/FormComponents/OpenChoiceItems/OpenChoiceAutocompleteItem.tsx +21 -25
  130. package/src/components/FormComponents/OpenChoiceItems/OpenChoiceCheckboxAnswerOptionItem.tsx +20 -23
  131. package/src/components/FormComponents/OpenChoiceItems/OpenChoiceRadioAnswerOptionItem.tsx +18 -22
  132. package/src/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerOptionItem.tsx +16 -20
  133. package/src/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerValueSetItem.tsx +17 -21
  134. package/src/components/FormComponents/RepeatItem/RepeatItem.tsx +8 -4
  135. package/src/components/FormComponents/SliderItem/SliderItem.tsx +6 -2
  136. package/src/components/FormComponents/StringItem/StringItem.tsx +9 -3
  137. package/src/components/FormComponents/Tables/GroupTable.tsx +0 -2
  138. package/src/components/FormComponents/Tables/GroupTableRow.tsx +6 -2
  139. package/src/components/FormComponents/Tables/GroupTableView.tsx +1 -0
  140. package/src/components/FormComponents/Tables/SelectRowButton.tsx +9 -2
  141. package/src/components/FormComponents/TextItem/TextItem.tsx +9 -3
  142. package/src/components/FormComponents/TimeItem/TimeItem.tsx +7 -2
  143. package/src/components/FormComponents/UrlItem/UrlItem.tsx +9 -3
  144. package/src/components/Renderer/BaseRenderer.tsx +12 -0
  145. package/src/components/Renderer/FormBodyCollapsible.tsx +9 -3
  146. package/src/components/Renderer/FormBodySingleCollapsibleWrapper.tsx +10 -3
  147. package/src/components/Renderer/FormBodyTabbed.tsx +9 -3
  148. package/src/components/Renderer/FormTopLevelItem.tsx +13 -3
  149. package/src/components/Renderer/SmartFormsRenderer.tsx +5 -2
  150. package/src/hooks/useInitialiseRenderer.ts +6 -3
  151. package/src/hooks/useRenderingExtensions.ts +17 -11
  152. package/src/hooks/{useValidationError.ts → useValidationFeedback.ts} +23 -21
  153. package/src/stores/questionnaireResponseStore.ts +36 -1
  154. package/src/stores/questionnaireStore.ts +8 -3
  155. package/src/stories/SmartFormsRenderer.stories.ts +16 -0
  156. package/src/utils/itemControl.ts +1 -67
  157. package/src/utils/mapItem.ts +2 -0
  158. package/src/utils/validateQuestionnaire.ts +273 -0
  159. package/lib/components/BackToTopButton/BackToTopButton.d.ts +0 -7
  160. package/lib/components/BackToTopButton/BackToTopButton.js.map +0 -1
  161. package/lib/components/FormComponents/CustomDateItem/CustomDateField2.d.ts +0 -18
  162. package/lib/components/FormComponents/CustomDateItem/CustomDateField2.js +0 -31
  163. package/lib/components/FormComponents/CustomDateItem/CustomDateField2.js.map +0 -1
  164. package/lib/components/FormComponents/CustomDateItem/CustomDateTimeField.d.ts +0 -9
  165. package/lib/components/FormComponents/CustomDateItem/CustomDateTimeField.js +0 -75
  166. package/lib/components/FormComponents/CustomDateItem/CustomDateTimeField.js.map +0 -1
  167. package/lib/components/FormComponents/CustomDateItem/CustomDateTimePickerText2.d.ts +0 -9
  168. package/lib/components/FormComponents/CustomDateItem/CustomDateTimePickerText2.js +0 -75
  169. package/lib/components/FormComponents/CustomDateItem/CustomDateTimePickerText2.js.map +0 -1
  170. package/lib/components/FormComponents/CustomDateItem/customDateTimePicker/hooks/useParseDates.d.ts +0 -5
  171. package/lib/components/FormComponents/CustomDateItem/customDateTimePicker/hooks/useParseDates.js +0 -27
  172. package/lib/components/FormComponents/CustomDateItem/customDateTimePicker/hooks/useParseDates.js.map +0 -1
  173. package/lib/components/FormComponents/CustomDateItem/customDateTimePickerText.d.ts +0 -9
  174. package/lib/components/FormComponents/CustomDateItem/customDateTimePickerText.js +0 -71
  175. package/lib/components/FormComponents/CustomDateItem/customDateTimePickerText.js.map +0 -1
  176. package/lib/components/FormComponents/DateItem/DatePicker.d.ts +0 -2
  177. package/lib/components/FormComponents/DateItem/DatePicker.js +0 -42
  178. package/lib/components/FormComponents/DateItem/DatePicker.js.map +0 -1
  179. package/lib/components/FormComponents/DateItem/DatePickerField.d.ts +0 -8
  180. package/lib/components/FormComponents/DateItem/DatePickerField.js.map +0 -1
  181. package/lib/components/FormComponents/DisplayItem/DisplayBox.d.ts +0 -0
  182. package/lib/components/FormComponents/DisplayItem/DisplayBox.js +0 -2
  183. package/lib/components/FormComponents/DisplayItem/DisplayBox.js.map +0 -1
  184. package/lib/components/FormComponents/DisplayItem/DisplayBox.styles.d.ts +0 -4
  185. package/lib/components/FormComponents/DisplayItem/DisplayBox.styles.js +0 -35
  186. package/lib/components/FormComponents/DisplayItem/DisplayBox.styles.js.map +0 -1
  187. package/lib/components/FormComponents/GroupItem/GroupChildItemSwitcher.d.ts +0 -10
  188. package/lib/components/FormComponents/GroupItem/GroupChildItemSwitcher.js +0 -73
  189. package/lib/components/FormComponents/GroupItem/GroupChildItemSwitcher.js.map +0 -1
  190. package/lib/components/FormComponents/GroupItem/ItemSwitcher.d.ts +0 -10
  191. package/lib/components/FormComponents/GroupItem/ItemSwitcher.js +0 -81
  192. package/lib/components/FormComponents/GroupItem/ItemSwitcher.js.map +0 -1
  193. package/lib/components/FormComponents/GroupItem/TopLevelGroupItemSwitcher.d.ts +0 -10
  194. package/lib/components/FormComponents/GroupItem/TopLevelGroupItemSwitcher.js +0 -45
  195. package/lib/components/FormComponents/GroupItem/TopLevelGroupItemSwitcher.js.map +0 -1
  196. package/lib/components/FormComponents/IntegerItem/SliderItem.d.ts +0 -9
  197. package/lib/components/FormComponents/IntegerItem/SliderItem.js +0 -75
  198. package/lib/components/FormComponents/IntegerItem/SliderItem.js.map +0 -1
  199. package/lib/components/FormComponents/ItemParts/RadioButtons.d.ts +0 -8
  200. package/lib/components/FormComponents/ItemParts/RadioButtons.js +0 -37
  201. package/lib/components/FormComponents/ItemParts/RadioButtons.js.map +0 -1
  202. package/lib/components/FormComponents/ItemParts/RadioButtonsAnswerOption.d.ts +0 -8
  203. package/lib/components/FormComponents/ItemParts/RadioButtonsAnswerOption.js +0 -37
  204. package/lib/components/FormComponents/ItemParts/RadioButtonsAnswerOption.js.map +0 -1
  205. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceAutocompleteFieldEndAdornment.d.ts +0 -0
  206. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceAutocompleteFieldEndAdornment.js +0 -2
  207. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceAutocompleteFieldEndAdornment.js.map +0 -1
  208. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerOptionFields.d.ts +0 -0
  209. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerOptionFields.js +0 -2
  210. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerOptionFields.js.map +0 -1
  211. package/lib/components/FormComponents/RepeatItem/DeleteItemButton.d.ts +0 -10
  212. package/lib/components/FormComponents/RepeatItem/DeleteItemButton.js +0 -30
  213. package/lib/components/FormComponents/RepeatItem/DeleteItemButton.js.map +0 -1
  214. package/lib/components/FormComponents/SliderItem/DisplayBox.styles.d.ts +0 -4
  215. package/lib/components/FormComponents/SliderItem/DisplayBox.styles.js +0 -35
  216. package/lib/components/FormComponents/SliderItem/DisplayBox.styles.js.map +0 -1
  217. package/lib/components/FormComponents/Tables/AddItemButton.d.ts +0 -8
  218. package/lib/components/FormComponents/Tables/AddItemButton.js +0 -28
  219. package/lib/components/FormComponents/Tables/AddItemButton.js.map +0 -1
  220. package/lib/components/FormComponents/Tables/DeleteRowButton.d.ts +0 -10
  221. package/lib/components/FormComponents/Tables/DeleteRowButton.js +0 -32
  222. package/lib/components/FormComponents/Tables/DeleteRowButton.js.map +0 -1
  223. package/lib/components/FormComponents/Tables/GroupTableRows.d.ts +0 -17
  224. package/lib/components/FormComponents/Tables/GroupTableRows.js +0 -45
  225. package/lib/components/FormComponents/Tables/GroupTableRows.js.map +0 -1
  226. package/lib/components/FormComponents/Tables/GroupTableTestRow.d.ts +0 -22
  227. package/lib/components/FormComponents/Tables/GroupTableTestRow.js +0 -43
  228. package/lib/components/FormComponents/Tables/GroupTableTestRow.js.map +0 -1
  229. package/lib/components/FormComponents/Tables/QItemGroupTable.d.ts +0 -10
  230. package/lib/components/FormComponents/Tables/QItemGroupTable.js +0 -109
  231. package/lib/components/FormComponents/Tables/QItemGroupTable.js.map +0 -1
  232. package/lib/components/FormComponents/Tables/QItemGroupTableRow.d.ts +0 -10
  233. package/lib/components/FormComponents/Tables/QItemGroupTableRow.js +0 -46
  234. package/lib/components/FormComponents/Tables/QItemGroupTableRow.js.map +0 -1
  235. package/lib/components/FormComponents/Typography.styles.d.ts +0 -6
  236. package/lib/components/FormComponents/Typography.styles.js +0 -24
  237. package/lib/components/FormComponents/Typography.styles.js.map +0 -1
  238. package/lib/hooks/useBackToTop.d.ts +0 -2
  239. package/lib/hooks/useBackToTop.js +0 -26
  240. package/lib/hooks/useBackToTop.js.map +0 -1
  241. package/lib/hooks/useDateSeparatorValidation.d.ts +0 -2
  242. package/lib/hooks/useDateSeparatorValidation.js +0 -25
  243. package/lib/hooks/useDateSeparatorValidation.js.map +0 -1
  244. package/lib/hooks/useDecimalUpdateFromProp.d.ts +0 -2
  245. package/lib/hooks/useDecimalUpdateFromProp.js +0 -29
  246. package/lib/hooks/useDecimalUpdateFromProp.js.map +0 -1
  247. package/lib/hooks/useIntegerUpdateFromProp.d.ts +0 -2
  248. package/lib/hooks/useIntegerUpdateFromProp.js +0 -29
  249. package/lib/hooks/useIntegerUpdateFromProp.js.map +0 -1
  250. package/lib/hooks/useMinimalStringCalculatedExpression.d.ts +0 -11
  251. package/lib/hooks/useMinimalStringCalculatedExpression.js +0 -49
  252. package/lib/hooks/useMinimalStringCalculatedExpression.js.map +0 -1
  253. package/lib/hooks/useNumberUpdateFromProp.d.ts +0 -2
  254. package/lib/hooks/useNumberUpdateFromProp.js +0 -29
  255. package/lib/hooks/useNumberUpdateFromProp.js.map +0 -1
  256. package/lib/hooks/useRepeatItemState.d.ts +0 -5
  257. package/lib/hooks/useRepeatItemState.js +0 -35
  258. package/lib/hooks/useRepeatItemState.js.map +0 -1
  259. package/lib/hooks/useRepeatItemUpdateFromProp.d.ts +0 -2
  260. package/lib/hooks/useRepeatItemUpdateFromProp.js +0 -29
  261. package/lib/hooks/useRepeatItemUpdateFromProp.js.map +0 -1
  262. package/lib/hooks/useStringField.d.ts +0 -2
  263. package/lib/hooks/useStringField.js +0 -29
  264. package/lib/hooks/useStringField.js.map +0 -1
  265. package/lib/hooks/useStringUpdateFromProp.d.ts +0 -2
  266. package/lib/hooks/useStringUpdateFromProp.js +0 -29
  267. package/lib/hooks/useStringUpdateFromProp.js.map +0 -1
  268. package/lib/hooks/useValidationError.d.ts +0 -3
  269. package/lib/hooks/useValidationError.js +0 -38
  270. package/lib/hooks/useValidationError.js.map +0 -1
  271. package/lib/interfaces/index.d.ts +0 -2
  272. package/lib/interfaces/index.js +0 -18
  273. package/lib/interfaces/index.js.map +0 -1
  274. package/lib/setup-jest.js +0 -1
  275. package/lib/setup-jest.js.map +0 -1
  276. package/lib/stores/useQuestionnaireResponseStore.d.ts +0 -27
  277. package/lib/stores/useQuestionnaireResponseStore.js +0 -49
  278. package/lib/stores/useQuestionnaireResponseStore.js.map +0 -1
  279. package/lib/stores/useQuestionnaireStore.d.ts +0 -64
  280. package/lib/stores/useQuestionnaireStore.js +0 -173
  281. package/lib/stores/useQuestionnaireStore.js.map +0 -1
  282. package/lib/stores/useSmartConfigStore.d.ts +0 -14
  283. package/lib/stores/useSmartConfigStore.js +0 -13
  284. package/lib/stores/useSmartConfigStore.js.map +0 -1
  285. package/lib/stores/useTerminologyServerStore.d.ts +0 -7
  286. package/lib/stores/useTerminologyServerStore.js +0 -25
  287. package/lib/stores/useTerminologyServerStore.js.map +0 -1
  288. package/lib/stories/MedicalHistoryTable.stories.js +0 -45
  289. package/lib/stories/MedicalHistoryTable.stories.js.map +0 -1
  290. package/lib/stories/SmartFormsRenderer.stories.js +0 -103
  291. package/lib/stories/SmartFormsRenderer.stories.js.map +0 -1
  292. package/lib/test.d.ts +0 -4
  293. package/lib/test.js +0 -18
  294. package/lib/test.js.map +0 -1
  295. package/lib/theme/overrides/Backdrop.d.ts +0 -13
  296. package/lib/theme/overrides/Backdrop.js +0 -32
  297. package/lib/theme/overrides/Backdrop.js.map +0 -1
  298. package/lib/theme/overrides/Typography.d.ts +0 -13
  299. package/lib/theme/overrides/Typography.js +0 -31
  300. package/lib/theme/overrides/Typography.js.map +0 -1
  301. package/lib/utils/formChangesOld.d.ts +0 -18
  302. package/lib/utils/formChangesOld.js +0 -91
  303. package/lib/utils/formChangesOld.js.map +0 -1
  304. package/lib/utils/initialiseForm.d.ts +0 -22
  305. package/lib/utils/initialiseForm.js +0 -53
  306. package/lib/utils/initialiseForm.js.map +0 -1
  307. package/lib/utils/launchContext.d.ts +0 -0
  308. package/lib/utils/launchContext.js +0 -2
  309. package/lib/utils/launchContext.js.map +0 -1
  310. package/lib/utils/populateInputParams.d.ts +0 -8
  311. package/lib/utils/populateInputParams.js +0 -193
  312. package/lib/utils/populateInputParams.js.map +0 -1
  313. package/lib/utils/removeHidden.d.ts +0 -16
  314. package/lib/utils/removeHidden.js +0 -105
  315. package/lib/utils/removeHidden.js.map +0 -1
  316. package/lib/utils/repopulate.d.ts +0 -9
  317. package/lib/utils/repopulate.js +0 -133
  318. package/lib/utils/repopulate.js.map +0 -1
  319. package/lib/utils/repopulateGenerateItems.d.ts +0 -9
  320. package/lib/utils/repopulateGenerateItems.js +0 -133
  321. package/lib/utils/repopulateGenerateItems.js.map +0 -1
  322. package/lib/utils/repopulateRepeatGroup.d.ts +0 -4
  323. package/lib/utils/repopulateRepeatGroup.js +0 -62
  324. package/lib/utils/repopulateRepeatGroup.js.map +0 -1
@@ -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 {
21
20
  QuestionnaireItem,
22
21
  QuestionnaireItemAnswerOption,
@@ -31,10 +30,9 @@ import type {
31
30
  PropsWithParentIsReadOnlyAttribute,
32
31
  PropsWithQrItemChangeHandler
33
32
  } from '../../../interfaces/renderProps.interface';
34
- import DisplayInstructions from '../DisplayItem/DisplayInstructions';
35
- import LabelWrapper from '../ItemParts/ItemLabelWrapper';
36
33
  import OpenChoiceSelectAnswerOptionField from './OpenChoiceSelectAnswerOptionField';
37
34
  import useReadOnly from '../../../hooks/useReadOnly';
35
+ import ItemFieldGrid from '../ItemParts/ItemFieldGrid';
38
36
 
39
37
  interface OpenChoiceSelectAnswerOptionItemProps
40
38
  extends PropsWithQrItemChangeHandler,
@@ -49,7 +47,7 @@ function OpenChoiceSelectAnswerOptionItem(props: OpenChoiceSelectAnswerOptionIte
49
47
  const { qItem, qrItem, isRepeated, isTabled, parentIsReadOnly, onQrItemChange } = props;
50
48
 
51
49
  const readOnly = useReadOnly(qItem, parentIsReadOnly);
52
- const { displayInstructions } = useRenderingExtensions(qItem);
50
+ const { displayInstructions, required } = useRenderingExtensions(qItem);
53
51
 
54
52
  // Init input value
55
53
  const answerOptions = qItem.answerOption;
@@ -109,22 +107,20 @@ function OpenChoiceSelectAnswerOptionItem(props: OpenChoiceSelectAnswerOptionIte
109
107
 
110
108
  return (
111
109
  <FullWidthFormComponentBox data-test="q-item-open-choice-select-answer-option-box">
112
- <Grid container columnSpacing={6}>
113
- <Grid item xs={5}>
114
- <LabelWrapper qItem={qItem} readOnly={readOnly} />
115
- </Grid>
116
- <Grid item xs={7}>
117
- <OpenChoiceSelectAnswerOptionField
118
- qItem={qItem}
119
- options={answerOptions}
120
- valueSelect={valueSelect}
121
- readOnly={readOnly}
122
- isTabled={isTabled}
123
- onChange={handleChange}
124
- />
125
- <DisplayInstructions displayInstructions={displayInstructions} readOnly={readOnly} />
126
- </Grid>
127
- </Grid>
110
+ <ItemFieldGrid
111
+ qItem={qItem}
112
+ displayInstructions={displayInstructions}
113
+ required={required}
114
+ readOnly={readOnly}>
115
+ <OpenChoiceSelectAnswerOptionField
116
+ qItem={qItem}
117
+ options={answerOptions}
118
+ valueSelect={valueSelect}
119
+ readOnly={readOnly}
120
+ isTabled={isTabled}
121
+ onChange={handleChange}
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 { Coding, QuestionnaireItem, QuestionnaireResponseItem } from 'fhir/r4';
21
20
  import { createEmptyQrItem } from '../../../utils/qrItem';
22
21
  import { FullWidthFormComponentBox } from '../../Box.styles';
@@ -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 OpenChoiceSelectAnswerValueSetField from './OpenChoiceSelectAnswerValueSetField';
34
31
  import useReadOnly from '../../../hooks/useReadOnly';
32
+ import ItemFieldGrid from '../ItemParts/ItemFieldGrid';
35
33
 
36
34
  interface OpenChoiceSelectAnswerValueSetItemProps
37
35
  extends PropsWithQrItemChangeHandler,
@@ -46,7 +44,7 @@ function OpenChoiceSelectAnswerValueSetItem(props: OpenChoiceSelectAnswerValueSe
46
44
  const { qItem, qrItem, isRepeated, isTabled, parentIsReadOnly, onQrItemChange } = props;
47
45
 
48
46
  const readOnly = useReadOnly(qItem, parentIsReadOnly);
49
- const { displayInstructions } = useRenderingExtensions(qItem);
47
+ const { displayInstructions, required } = useRenderingExtensions(qItem);
50
48
 
51
49
  // Init input value
52
50
  const qrOpenChoice = qrItem ?? createEmptyQrItem(qItem);
@@ -93,23 +91,21 @@ function OpenChoiceSelectAnswerValueSetItem(props: OpenChoiceSelectAnswerValueSe
93
91
 
94
92
  return (
95
93
  <FullWidthFormComponentBox>
96
- <Grid container columnSpacing={6}>
97
- <Grid item xs={5}>
98
- <LabelWrapper qItem={qItem} readOnly={readOnly} />
99
- </Grid>
100
- <Grid item xs={7}>
101
- <OpenChoiceSelectAnswerValueSetField
102
- qItem={qItem}
103
- options={codings}
104
- valueSelect={valueSelect}
105
- serverError={serverError}
106
- isTabled={isTabled}
107
- readOnly={readOnly}
108
- onValueChange={handleValueChange}
109
- />
110
- <DisplayInstructions displayInstructions={displayInstructions} readOnly={readOnly} />
111
- </Grid>
112
- </Grid>
94
+ <ItemFieldGrid
95
+ qItem={qItem}
96
+ displayInstructions={displayInstructions}
97
+ required={required}
98
+ readOnly={readOnly}>
99
+ <OpenChoiceSelectAnswerValueSetField
100
+ qItem={qItem}
101
+ options={codings}
102
+ valueSelect={valueSelect}
103
+ serverError={serverError}
104
+ isTabled={isTabled}
105
+ readOnly={readOnly}
106
+ onValueChange={handleValueChange}
107
+ />
108
+ </ItemFieldGrid>
113
109
  </FullWidthFormComponentBox>
114
110
  );
115
111
  }
@@ -18,9 +18,9 @@
18
18
  import React, { useState } from 'react';
19
19
  import type {
20
20
  PropsWithParentIsReadOnlyAttribute,
21
- PropsWithQrItemChangeHandler
21
+ PropsWithQrItemChangeHandler,
22
+ PropsWithShowMinimalViewAttribute
22
23
  } from '../../../interfaces/renderProps.interface';
23
- import type { PropsWithShowMinimalViewAttribute } from '../../../interfaces/renderProps.interface';
24
24
  import type { QuestionnaireItem, QuestionnaireResponseItem } from 'fhir/r4';
25
25
  import { nanoid } from 'nanoid';
26
26
  import useRenderingExtensions from '../../../hooks/useRenderingExtensions';
@@ -46,7 +46,7 @@ function RepeatItem(props: RepeatItemProps) {
46
46
  const { qItem, qrItem, showMinimalView, parentIsReadOnly, onQrItemChange } = props;
47
47
 
48
48
  const readOnly = useReadOnly(qItem, parentIsReadOnly);
49
- const { displayInstructions } = useRenderingExtensions(qItem);
49
+ const { displayInstructions, required } = useRenderingExtensions(qItem);
50
50
 
51
51
  const initialRepeatAnswers = useInitialiseRepeatAnswers(qItem, qrItem);
52
52
 
@@ -119,7 +119,11 @@ function RepeatItem(props: RepeatItemProps) {
119
119
 
120
120
  return (
121
121
  <FullWidthFormComponentBox data-test="q-item-repeat-box">
122
- <ItemFieldGrid qItem={qItem} displayInstructions={displayInstructions} readOnly={readOnly}>
122
+ <ItemFieldGrid
123
+ qItem={qItem}
124
+ displayInstructions={displayInstructions}
125
+ required={required}
126
+ readOnly={readOnly}>
123
127
  <TransitionGroup>
124
128
  {repeatAnswers.map(({ nanoId, answer }, index) => {
125
129
  const repeatAnswerQrItem = createEmptyQrItem(qItem);
@@ -45,7 +45,7 @@ function SliderItem(props: SliderItemProps) {
45
45
  const { qItem, qrItem, isRepeated, isTabled, parentIsReadOnly, onQrItemChange } = props;
46
46
 
47
47
  const readOnly = useReadOnly(qItem, parentIsReadOnly);
48
- const { displayInstructions } = useRenderingExtensions(qItem);
48
+ const { displayInstructions, required } = useRenderingExtensions(qItem);
49
49
  const { minValue, maxValue, stepValue, minLabel, maxLabel } = useSliderExtensions(qItem);
50
50
 
51
51
  const isInteracted = !!qrItem?.answer;
@@ -91,7 +91,11 @@ function SliderItem(props: SliderItemProps) {
91
91
 
92
92
  return (
93
93
  <FullWidthFormComponentBox data-test="q-item-slider-box">
94
- <ItemFieldGrid qItem={qItem} displayInstructions={displayInstructions} readOnly={readOnly}>
94
+ <ItemFieldGrid
95
+ qItem={qItem}
96
+ displayInstructions={displayInstructions}
97
+ required={required}
98
+ readOnly={readOnly}>
95
99
  <Box px={4}>
96
100
  <SliderField
97
101
  linkId={qItem.linkId}
@@ -24,7 +24,7 @@ import type {
24
24
  } from '../../../interfaces/renderProps.interface';
25
25
  import type { QuestionnaireItem, QuestionnaireResponseItem } from 'fhir/r4';
26
26
  import useRenderingExtensions from '../../../hooks/useRenderingExtensions';
27
- import useValidationError from '../../../hooks/useValidationError';
27
+ import useValidationFeedback from '../../../hooks/useValidationFeedback';
28
28
  import debounce from 'lodash.debounce';
29
29
  import { createEmptyQrItem } from '../../../utils/qrItem';
30
30
  import { DEBOUNCE_DURATION } from '../../../utils/debounce';
@@ -52,7 +52,9 @@ function StringItem(props: StringItemProps) {
52
52
  displayPrompt,
53
53
  displayInstructions,
54
54
  entryFormat,
55
+ required,
55
56
  regexValidation,
57
+ minLength,
56
58
  maxLength
57
59
  } = useRenderingExtensions(qItem);
58
60
 
@@ -64,7 +66,7 @@ function StringItem(props: StringItemProps) {
64
66
  const [input, setInput] = useStringInput(valueString);
65
67
 
66
68
  // Perform validation checks
67
- const feedback = useValidationError(input, regexValidation, maxLength);
69
+ const feedback = useValidationFeedback(input, regexValidation, minLength, maxLength);
68
70
 
69
71
  // Process calculated expressions
70
72
  const { calcExpUpdated } = useStringCalculatedExpression({
@@ -113,7 +115,11 @@ function StringItem(props: StringItemProps) {
113
115
  }
114
116
  return (
115
117
  <FullWidthFormComponentBox data-test="q-item-string-box">
116
- <ItemFieldGrid qItem={qItem} displayInstructions={displayInstructions} readOnly={readOnly}>
118
+ <ItemFieldGrid
119
+ qItem={qItem}
120
+ displayInstructions={displayInstructions}
121
+ required={required}
122
+ readOnly={readOnly}>
117
123
  <StringField
118
124
  linkId={qItem.linkId}
119
125
  input={input}
@@ -51,8 +51,6 @@ function GroupTable(props: GroupTableProps) {
51
51
  onQrRepeatGroupChange
52
52
  } = props;
53
53
 
54
- // console.log(qrItems);
55
-
56
54
  const readOnly = useReadOnly(qItem, parentIsReadOnly);
57
55
 
58
56
  const { tableRows, selectedIds, setTableRows, setSelectedIds } = useGroupTableRows(qrItems);
@@ -88,12 +88,16 @@ function GroupTableRow(props: GroupTableRowProps) {
88
88
  display="flex"
89
89
  alignItems="center"
90
90
  justifyContent="center"
91
- {...draggableProvided.dragHandleProps}>
92
- <DragIndicator fontSize="small" />
91
+ {...(readOnly ? {} : draggableProvided.dragHandleProps)}>
92
+ <DragIndicator
93
+ fontSize="small"
94
+ sx={{ color: readOnly ? 'text.disabled' : 'inherit' }}
95
+ />
93
96
  </Box>
94
97
  </TableCell>
95
98
  <SelectRowButton
96
99
  isSelected={itemIsSelected}
100
+ readOnly={readOnly}
97
101
  onSelectItem={() => onSelectRow(nanoId)}
98
102
  />
99
103
  </>
@@ -138,6 +138,7 @@ function GroupTableView(props: GroupTableViewProps) {
138
138
  size="small"
139
139
  indeterminate={selectedIds.length > 0 && selectedIds.length < tableRows.length}
140
140
  checked={tableRows.length > 0 && selectedIds.length === tableRows.length}
141
+ disabled={readOnly}
141
142
  onChange={onSelectAll}
142
143
  />
143
144
  </HeaderTableCell>
@@ -21,15 +21,22 @@ import TableCell from '@mui/material/TableCell';
21
21
 
22
22
  interface SelectRowButtonProps {
23
23
  isSelected: boolean;
24
+ readOnly: boolean;
24
25
  onSelectItem: () => void;
25
26
  }
26
27
 
27
28
  function SelectRowButton(props: SelectRowButtonProps) {
28
- const { isSelected, onSelectItem } = props;
29
+ const { isSelected, readOnly, onSelectItem } = props;
29
30
 
30
31
  return (
31
32
  <TableCell padding="checkbox">
32
- <Checkbox color="primary" size="small" checked={isSelected} onChange={onSelectItem} />
33
+ <Checkbox
34
+ color="primary"
35
+ size="small"
36
+ checked={isSelected}
37
+ disabled={readOnly}
38
+ onChange={onSelectItem}
39
+ />
33
40
  </TableCell>
34
41
  );
35
42
  }
@@ -23,7 +23,7 @@ import type {
23
23
  } from '../../../interfaces/renderProps.interface';
24
24
  import type { QuestionnaireItem, QuestionnaireResponseItem } from 'fhir/r4';
25
25
  import useRenderingExtensions from '../../../hooks/useRenderingExtensions';
26
- import useValidationError from '../../../hooks/useValidationError';
26
+ import useValidationFeedback from '../../../hooks/useValidationFeedback';
27
27
  import debounce from 'lodash.debounce';
28
28
  import { createEmptyQrItem } from '../../../utils/qrItem';
29
29
  import { DEBOUNCE_DURATION } from '../../../utils/debounce';
@@ -51,7 +51,9 @@ function TextItem(props: TextItemProps) {
51
51
  displayPrompt,
52
52
  displayInstructions,
53
53
  entryFormat,
54
+ required,
54
55
  regexValidation,
56
+ minLength,
55
57
  maxLength
56
58
  } = useRenderingExtensions(qItem);
57
59
 
@@ -63,7 +65,7 @@ function TextItem(props: TextItemProps) {
63
65
  const [input, setInput] = useStringInput(valueText);
64
66
 
65
67
  // Perform validation checks
66
- const feedback = useValidationError(input, regexValidation, maxLength);
68
+ const feedback = useValidationFeedback(input, regexValidation, minLength, maxLength);
67
69
 
68
70
  // Process calculated expressions
69
71
  const { calcExpUpdated } = useStringCalculatedExpression({
@@ -111,7 +113,11 @@ function TextItem(props: TextItemProps) {
111
113
  }
112
114
  return (
113
115
  <FullWidthFormComponentBox data-test="q-item-text-box">
114
- <ItemFieldGrid qItem={qItem} displayInstructions={displayInstructions} readOnly={readOnly}>
116
+ <ItemFieldGrid
117
+ qItem={qItem}
118
+ displayInstructions={displayInstructions}
119
+ required={required}
120
+ readOnly={readOnly}>
115
121
  <TextField
116
122
  linkId={qItem.linkId}
117
123
  input={input}
@@ -45,7 +45,8 @@ function TimeItem(props: TimeItemProps) {
45
45
  const { qItem, qrItem, isRepeated, isTabled, parentIsReadOnly, onQrItemChange } = props;
46
46
 
47
47
  const readOnly = useReadOnly(qItem, parentIsReadOnly);
48
- const { displayPrompt, displayInstructions, entryFormat } = useRenderingExtensions(qItem);
48
+ const { displayPrompt, displayInstructions, entryFormat, required } =
49
+ useRenderingExtensions(qItem);
49
50
 
50
51
  // Init input value
51
52
  let timeString: string | null = null;
@@ -79,7 +80,11 @@ function TimeItem(props: TimeItemProps) {
79
80
 
80
81
  return (
81
82
  <FullWidthFormComponentBox>
82
- <ItemFieldGrid qItem={qItem} displayInstructions={displayInstructions} readOnly={readOnly}>
83
+ <ItemFieldGrid
84
+ qItem={qItem}
85
+ displayInstructions={displayInstructions}
86
+ required={required}
87
+ readOnly={readOnly}>
83
88
  <TimeField
84
89
  value={timeDayJs}
85
90
  displayPrompt={displayPrompt}
@@ -24,7 +24,7 @@ import type {
24
24
  } from '../../../interfaces/renderProps.interface';
25
25
  import type { QuestionnaireItem, QuestionnaireResponseItem } from 'fhir/r4';
26
26
  import useRenderingExtensions from '../../../hooks/useRenderingExtensions';
27
- import useValidationError from '../../../hooks/useValidationError';
27
+ import useValidationFeedback from '../../../hooks/useValidationFeedback';
28
28
  import debounce from 'lodash.debounce';
29
29
  import { createEmptyQrItem } from '../../../utils/qrItem';
30
30
  import { DEBOUNCE_DURATION } from '../../../utils/debounce';
@@ -50,7 +50,9 @@ function UrlItem(props: UrlItemProps) {
50
50
  displayPrompt,
51
51
  displayInstructions,
52
52
  entryFormat,
53
+ required,
53
54
  regexValidation,
55
+ minLength,
54
56
  maxLength
55
57
  } = useRenderingExtensions(qItem);
56
58
 
@@ -62,7 +64,7 @@ function UrlItem(props: UrlItemProps) {
62
64
  const [input, setInput] = useState(valueUri);
63
65
 
64
66
  // Perform validation checks
65
- const feedback = useValidationError(input, regexValidation, maxLength);
67
+ const feedback = useValidationFeedback(input, regexValidation, minLength, maxLength);
66
68
 
67
69
  // Event handlers
68
70
  function handleChange(newInput: string) {
@@ -100,7 +102,11 @@ function UrlItem(props: UrlItemProps) {
100
102
  }
101
103
  return (
102
104
  <FullWidthFormComponentBox data-test="q-item-string-box">
103
- <ItemFieldGrid qItem={qItem} displayInstructions={displayInstructions} readOnly={readOnly}>
105
+ <ItemFieldGrid
106
+ qItem={qItem}
107
+ displayInstructions={displayInstructions}
108
+ required={required}
109
+ readOnly={readOnly}>
104
110
  <UrlField
105
111
  linkId={qItem.linkId}
106
112
  input={input}
@@ -29,9 +29,15 @@ import type { QrRepeatGroup } from '../../interfaces/repeatGroup.interface';
29
29
  function BaseRenderer() {
30
30
  const sourceQuestionnaire = useQuestionnaireStore.use.sourceQuestionnaire();
31
31
  const updateExpressions = useQuestionnaireStore.use.updateExpressions();
32
+ const readOnly = useQuestionnaireStore.use.readOnly();
33
+
32
34
  const updatableResponse = useQuestionnaireResponseStore.use.updatableResponse();
35
+ const updateRequiredValidity = useQuestionnaireResponseStore.use.validateQuestionnaire();
33
36
  const updateResponse = useQuestionnaireResponseStore.use.updateResponse();
34
37
 
38
+ const invalidItems = useQuestionnaireResponseStore.use.invalidItems();
39
+ const responseIsValid = useQuestionnaireResponseStore.use.responseIsValid();
40
+
35
41
  const qItemsIndexMap = useMemo(() => mapQItemsIndex(sourceQuestionnaire), [sourceQuestionnaire]);
36
42
 
37
43
  function handleTopLevelQRItemSingleChange(newTopLevelQRItem: QuestionnaireResponseItem) {
@@ -43,6 +49,7 @@ function BaseRenderer() {
43
49
  updateQrItemsInGroup(newTopLevelQRItem, null, updatedResponse, qItemsIndexMap);
44
50
 
45
51
  updateExpressions(updatedResponse);
52
+ updateRequiredValidity(sourceQuestionnaire, updatedResponse);
46
53
  updateResponse(updatedResponse);
47
54
  }
48
55
 
@@ -55,6 +62,7 @@ function BaseRenderer() {
55
62
  updateQrItemsInGroup(null, newTopLevelQRItems, updatedResponse, qItemsIndexMap);
56
63
 
57
64
  updateExpressions(updatedResponse);
65
+ updateRequiredValidity(sourceQuestionnaire, updatedResponse);
58
66
  updateResponse(updatedResponse);
59
67
  }
60
68
 
@@ -68,6 +76,9 @@ function BaseRenderer() {
68
76
  // If an item has multiple answers, it is a repeat group
69
77
  const topLevelQRItemsByIndex = getQrItemsIndex(topLevelQItems, topLevelQRItems, qItemsIndexMap);
70
78
 
79
+ console.log(invalidItems);
80
+ console.log(responseIsValid);
81
+
71
82
  return (
72
83
  <Fade in={true} timeout={500}>
73
84
  <Container maxWidth="xl">
@@ -79,6 +90,7 @@ function BaseRenderer() {
79
90
  key={qItem.linkId}
80
91
  topLevelQItem={qItem}
81
92
  topLevelQRItemOrItems={qrItemOrItems ?? null}
93
+ parentIsReadOnly={readOnly}
82
94
  onQrItemChange={(newTopLevelQRItem) =>
83
95
  handleTopLevelQRItemSingleChange(newTopLevelQRItem)
84
96
  }
@@ -20,17 +20,22 @@ import Stack from '@mui/material/Stack';
20
20
  import type { QuestionnaireItem, QuestionnaireResponseItem } from 'fhir/r4';
21
21
  import { getQrItemsIndex, mapQItemsIndex } from '../../utils/mapItem';
22
22
  import { createEmptyQrGroup, updateQrItemsInGroup } from '../../utils/qrItem';
23
- import type { PropsWithQrItemChangeHandler } from '../../interfaces/renderProps.interface';
23
+ import type {
24
+ PropsWithParentIsReadOnlyAttribute,
25
+ PropsWithQrItemChangeHandler
26
+ } from '../../interfaces/renderProps.interface';
24
27
  import { useQuestionnaireStore } from '../../stores';
25
28
  import FormBodySingleCollapsibleWrapper from './FormBodySingleCollapsibleWrapper';
26
29
 
27
- interface FormBodyCollapsibleProps extends PropsWithQrItemChangeHandler {
30
+ interface FormBodyCollapsibleProps
31
+ extends PropsWithQrItemChangeHandler,
32
+ PropsWithParentIsReadOnlyAttribute {
28
33
  topLevelQItem: QuestionnaireItem;
29
34
  topLevelQRItem: QuestionnaireResponseItem | null;
30
35
  }
31
36
 
32
37
  function FormBodyCollapsibleWrapper(props: FormBodyCollapsibleProps) {
33
- const { topLevelQItem, topLevelQRItem, onQrItemChange } = props;
38
+ const { topLevelQItem, topLevelQRItem, parentIsReadOnly, onQrItemChange } = props;
34
39
 
35
40
  const tabs = useQuestionnaireStore.use.tabs();
36
41
  const currentTab = useQuestionnaireStore.use.currentTabIndex();
@@ -85,6 +90,7 @@ function FormBodyCollapsibleWrapper(props: FormBodyCollapsibleProps) {
85
90
  qrItem={qrItem ?? null}
86
91
  index={i}
87
92
  selectedIndex={currentTab}
93
+ parentIsReadOnly={parentIsReadOnly}
88
94
  onToggleExpand={handleToggleExpand}
89
95
  onQrItemChange={handleQrGroupChange}
90
96
  />
@@ -19,10 +19,15 @@ import React from 'react';
19
19
  import type { QuestionnaireItem, QuestionnaireResponseItem } from 'fhir/r4';
20
20
  import GroupItem from '../FormComponents/GroupItem/GroupItem';
21
21
  import FormBodySingleCollapsible from './FormBodySingleCollapsible';
22
- import type { PropsWithQrItemChangeHandler } from '../../interfaces/renderProps.interface';
22
+ import type {
23
+ PropsWithParentIsReadOnlyAttribute,
24
+ PropsWithQrItemChangeHandler
25
+ } from '../../interfaces/renderProps.interface';
23
26
  import useHidden from '../../hooks/useHidden';
24
27
 
25
- interface FormBodySingleCollapsibleProps extends PropsWithQrItemChangeHandler {
28
+ interface FormBodySingleCollapsibleProps
29
+ extends PropsWithQrItemChangeHandler,
30
+ PropsWithParentIsReadOnlyAttribute {
26
31
  qItem: QuestionnaireItem;
27
32
  qrItem: QuestionnaireResponseItem | null;
28
33
  index: number;
@@ -31,7 +36,8 @@ interface FormBodySingleCollapsibleProps extends PropsWithQrItemChangeHandler {
31
36
  }
32
37
 
33
38
  function FormBodySingleCollapsibleWrapper(props: FormBodySingleCollapsibleProps) {
34
- const { qItem, qrItem, index, selectedIndex, onToggleExpand, onQrItemChange } = props;
39
+ const { qItem, qrItem, index, selectedIndex, parentIsReadOnly, onToggleExpand, onQrItemChange } =
40
+ props;
35
41
 
36
42
  const itemIsHidden = useHidden(qItem);
37
43
  if (itemIsHidden) {
@@ -50,6 +56,7 @@ function FormBodySingleCollapsibleWrapper(props: FormBodySingleCollapsibleProps)
50
56
  qrItem={qrItem}
51
57
  isRepeated={true}
52
58
  groupCardElevation={1}
59
+ parentIsReadOnly={parentIsReadOnly}
53
60
  onQrItemChange={onQrItemChange}
54
61
  />
55
62
  </FormBodySingleCollapsible>
@@ -24,16 +24,21 @@ import { getQrItemsIndex, mapQItemsIndex } from '../../utils/mapItem';
24
24
  import GroupItem from '../FormComponents/GroupItem/GroupItem';
25
25
  import { createEmptyQrGroup, updateQrItemsInGroup } from '../../utils/qrItem';
26
26
  import FormBodyTabListWrapper from '../Tabs/FormBodyTabListWrapper';
27
- import type { PropsWithQrItemChangeHandler } from '../../interfaces/renderProps.interface';
27
+ import type {
28
+ PropsWithParentIsReadOnlyAttribute,
29
+ PropsWithQrItemChangeHandler
30
+ } from '../../interfaces/renderProps.interface';
28
31
  import { useQuestionnaireStore } from '../../stores';
29
32
 
30
- interface FormBodyTabbedProps extends PropsWithQrItemChangeHandler {
33
+ interface FormBodyTabbedProps
34
+ extends PropsWithQrItemChangeHandler,
35
+ PropsWithParentIsReadOnlyAttribute {
31
36
  topLevelQItem: QuestionnaireItem;
32
37
  topLevelQRItem: QuestionnaireResponseItem | null;
33
38
  }
34
39
 
35
40
  function FormBodyTabbed(props: FormBodyTabbedProps) {
36
- const { topLevelQItem, topLevelQRItem, onQrItemChange } = props;
41
+ const { topLevelQItem, topLevelQRItem, parentIsReadOnly, onQrItemChange } = props;
37
42
 
38
43
  const tabs = useQuestionnaireStore.use.tabs();
39
44
  const currentTab = useQuestionnaireStore.use.currentTabIndex();
@@ -95,6 +100,7 @@ function FormBodyTabbed(props: FormBodyTabbedProps) {
95
100
  tabIsMarkedAsComplete={tabIsMarkedAsComplete}
96
101
  tabs={tabs}
97
102
  currentTabIndex={currentTab}
103
+ parentIsReadOnly={parentIsReadOnly}
98
104
  onQrItemChange={handleQrGroupChange}
99
105
  />
100
106
  </TabPanel>
@@ -22,6 +22,7 @@ import { containsTabs, isTabContainer } from '../../utils/tabs';
22
22
  import GroupItem from '../FormComponents/GroupItem/GroupItem';
23
23
  import SingleItem from '../FormComponents/SingleItem/SingleItem';
24
24
  import type {
25
+ PropsWithParentIsReadOnlyAttribute,
25
26
  PropsWithQrItemChangeHandler,
26
27
  PropsWithQrRepeatGroupChangeHandler
27
28
  } from '../../interfaces/renderProps.interface';
@@ -34,13 +35,20 @@ import Box from '@mui/material/Box';
34
35
 
35
36
  interface FormTopLevelItemProps
36
37
  extends PropsWithQrItemChangeHandler,
37
- PropsWithQrRepeatGroupChangeHandler {
38
+ PropsWithQrRepeatGroupChangeHandler,
39
+ PropsWithParentIsReadOnlyAttribute {
38
40
  topLevelQItem: QuestionnaireItem;
39
41
  topLevelQRItemOrItems: QuestionnaireResponseItem | QuestionnaireResponseItem[] | null;
40
42
  }
41
43
 
42
44
  function FormTopLevelItem(props: FormTopLevelItemProps) {
43
- const { topLevelQItem, topLevelQRItemOrItems, onQrItemChange, onQrRepeatGroupChange } = props;
45
+ const {
46
+ topLevelQItem,
47
+ topLevelQRItemOrItems,
48
+ parentIsReadOnly,
49
+ onQrItemChange,
50
+ onQrRepeatGroupChange
51
+ } = props;
44
52
 
45
53
  const itemIsTabContainer = isTabContainer(topLevelQItem);
46
54
  const itemContainsTabs = containsTabs(topLevelQItem);
@@ -49,7 +57,7 @@ function FormTopLevelItem(props: FormTopLevelItemProps) {
49
57
 
50
58
  const itemIsGroup = topLevelQItem.type === 'group';
51
59
 
52
- const readOnly = useReadOnly(topLevelQItem, false);
60
+ const readOnly = useReadOnly(topLevelQItem, parentIsReadOnly);
53
61
  const itemIsHidden = useHidden(topLevelQItem);
54
62
  if (itemIsHidden) {
55
63
  return null;
@@ -81,6 +89,7 @@ function FormTopLevelItem(props: FormTopLevelItemProps) {
81
89
  key={topLevelQItem.linkId}
82
90
  topLevelQItem={topLevelQItem}
83
91
  topLevelQRItem={topLevelQRItem}
92
+ parentIsReadOnly={readOnly}
84
93
  onQrItemChange={onQrItemChange}
85
94
  />
86
95
  );
@@ -91,6 +100,7 @@ function FormTopLevelItem(props: FormTopLevelItemProps) {
91
100
  key={topLevelQItem.linkId}
92
101
  topLevelQItem={topLevelQItem}
93
102
  topLevelQRItem={topLevelQRItem}
103
+ parentIsReadOnly={readOnly}
94
104
  onQrItemChange={onQrItemChange}
95
105
  />
96
106
  );
@@ -34,6 +34,7 @@ interface SmartFormsRendererProps {
34
34
  additionalVariables?: Record<string, object>;
35
35
  terminologyServerUrl?: string;
36
36
  fhirClient?: Client;
37
+ readOnly?: boolean;
37
38
  }
38
39
 
39
40
  function SmartFormsRenderer(props: SmartFormsRendererProps) {
@@ -42,7 +43,8 @@ function SmartFormsRenderer(props: SmartFormsRendererProps) {
42
43
  questionnaireResponse,
43
44
  additionalVariables,
44
45
  terminologyServerUrl,
45
- fhirClient
46
+ fhirClient,
47
+ readOnly
46
48
  } = props;
47
49
 
48
50
  const isLoading = useInitialiseRenderer(
@@ -50,7 +52,8 @@ function SmartFormsRenderer(props: SmartFormsRendererProps) {
50
52
  questionnaireResponse,
51
53
  additionalVariables,
52
54
  terminologyServerUrl,
53
- fhirClient
55
+ fhirClient,
56
+ readOnly
54
57
  );
55
58
  const queryClient = useQueryClient();
56
59