@aehrc/smart-forms-renderer 0.12.1 → 0.13.1

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 +3 -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 +3 -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
@@ -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}
@@ -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}
@@ -32,6 +32,7 @@ function BaseRenderer() {
32
32
  const readOnly = useQuestionnaireStore.use.readOnly();
33
33
 
34
34
  const updatableResponse = useQuestionnaireResponseStore.use.updatableResponse();
35
+ const updateRequiredValidity = useQuestionnaireResponseStore.use.validateQuestionnaire();
35
36
  const updateResponse = useQuestionnaireResponseStore.use.updateResponse();
36
37
 
37
38
  const qItemsIndexMap = useMemo(() => mapQItemsIndex(sourceQuestionnaire), [sourceQuestionnaire]);
@@ -45,6 +46,7 @@ function BaseRenderer() {
45
46
  updateQrItemsInGroup(newTopLevelQRItem, null, updatedResponse, qItemsIndexMap);
46
47
 
47
48
  updateExpressions(updatedResponse);
49
+ updateRequiredValidity(sourceQuestionnaire, updatedResponse);
48
50
  updateResponse(updatedResponse);
49
51
  }
50
52
 
@@ -57,6 +59,7 @@ function BaseRenderer() {
57
59
  updateQrItemsInGroup(null, newTopLevelQRItems, updatedResponse, qItemsIndexMap);
58
60
 
59
61
  updateExpressions(updatedResponse);
62
+ updateRequiredValidity(sourceQuestionnaire, updatedResponse);
60
63
  updateResponse(updatedResponse);
61
64
  }
62
65
 
@@ -16,8 +16,6 @@
16
16
  */
17
17
 
18
18
  import {
19
- getMaxLength,
20
- getReadOnly,
21
19
  getRegexValidation,
22
20
  getTextDisplayInstructions,
23
21
  getTextDisplayPrompt,
@@ -26,6 +24,7 @@ import {
26
24
  import type { QuestionnaireItem } from 'fhir/r4';
27
25
  import type { RegexValidation } from '../interfaces/regex.interface';
28
26
  import { structuredDataCapture } from 'fhir-sdc-helpers';
27
+ import { useMemo } from 'react';
29
28
 
30
29
  interface RenderingExtensions {
31
30
  displayUnit: string;
@@ -33,20 +32,27 @@ interface RenderingExtensions {
33
32
  displayInstructions: string;
34
33
  readOnly: boolean;
35
34
  entryFormat: string;
35
+ required: boolean;
36
36
  regexValidation: RegexValidation | null;
37
+ minLength: number | null;
37
38
  maxLength: number | null;
38
39
  }
39
40
 
40
41
  function useRenderingExtensions(qItem: QuestionnaireItem): RenderingExtensions {
41
- return {
42
- displayUnit: getTextDisplayUnit(qItem),
43
- displayPrompt: getTextDisplayPrompt(qItem),
44
- displayInstructions: getTextDisplayInstructions(qItem),
45
- readOnly: getReadOnly(qItem),
46
- entryFormat: structuredDataCapture.getEntryFormat(qItem) ?? '',
47
- regexValidation: getRegexValidation(qItem),
48
- maxLength: getMaxLength(qItem)
49
- };
42
+ return useMemo(
43
+ () => ({
44
+ displayUnit: getTextDisplayUnit(qItem),
45
+ displayPrompt: getTextDisplayPrompt(qItem),
46
+ displayInstructions: getTextDisplayInstructions(qItem),
47
+ readOnly: !!qItem.readOnly,
48
+ entryFormat: structuredDataCapture.getEntryFormat(qItem) ?? '',
49
+ required: qItem.required ?? false,
50
+ regexValidation: getRegexValidation(qItem),
51
+ minLength: structuredDataCapture.getMinLength(qItem) ?? null,
52
+ maxLength: qItem.maxLength ?? null
53
+ }),
54
+ [qItem]
55
+ );
50
56
  }
51
57
 
52
58
  export default useRenderingExtensions;
@@ -16,33 +16,35 @@
16
16
  */
17
17
 
18
18
  import type { RegexValidation } from '../interfaces/regex.interface';
19
+ import { getInputInvalidType } from '../utils/validateQuestionnaire';
19
20
 
20
- function useValidationError(
21
+ function useValidationFeedback(
21
22
  input: string,
22
23
  regexValidation: RegexValidation | null,
24
+ minLength: number | null,
23
25
  maxLength: number | null
24
26
  ): string {
25
- let feedback = '';
26
-
27
- if (input) {
28
- // Test regex
29
- if (regexValidation) {
30
- if (!regexValidation.expression.test(input)) {
31
- feedback =
32
- regexValidation.feedback ??
33
- `Input should match the specified regex ${regexValidation.expression}`;
34
- }
35
- }
36
-
37
- // Test max character limit
38
- if (maxLength) {
39
- if (input.length > maxLength) {
40
- feedback = 'Input exceeds maximum character limit.';
41
- }
42
- }
27
+ const invalidType = getInputInvalidType(input, regexValidation, minLength, maxLength);
28
+
29
+ if (!invalidType) {
30
+ return '';
31
+ }
32
+
33
+ if (invalidType === 'regex' && regexValidation) {
34
+ return `Input should match the specified regex ${regexValidation.expression}`;
35
+ }
36
+
37
+ // Test min character limit
38
+ if (invalidType === 'minLength' && minLength) {
39
+ return `Enter at least ${minLength} characters.`;
40
+ }
41
+
42
+ // Test max character limit
43
+ if (invalidType === 'maxLength' && maxLength) {
44
+ return `Input exceeds maximum character limit of ${maxLength}.`;
43
45
  }
44
46
 
45
- return feedback;
47
+ return '';
46
48
  }
47
49
 
48
- export default useValidationError;
50
+ export default useValidationFeedback;
@@ -16,17 +16,26 @@
16
16
  */
17
17
 
18
18
  import { createStore } from 'zustand/vanilla';
19
- import type { QuestionnaireResponse } from 'fhir/r4';
19
+ import type { Questionnaire, QuestionnaireResponse } from 'fhir/r4';
20
20
  import { emptyResponse } from '../utils/emptyResource';
21
21
  import cloneDeep from 'lodash.clonedeep';
22
22
  import type { Diff } from 'deep-diff';
23
23
  import { diff } from 'deep-diff';
24
24
  import { createSelectors } from './selector';
25
+ import type { InvalidType } from '../utils/validateQuestionnaire';
26
+ import { validateQuestionnaire } from '../utils/validateQuestionnaire';
27
+ import { questionnaireStore } from './questionnaireStore';
25
28
 
26
29
  interface QuestionnaireResponseStoreType {
27
30
  sourceResponse: QuestionnaireResponse;
28
31
  updatableResponse: QuestionnaireResponse;
29
32
  formChangesHistory: (Diff<QuestionnaireResponse, QuestionnaireResponse>[] | null)[];
33
+ invalidItems: Record<string, InvalidType>;
34
+ responseIsValid: boolean;
35
+ validateQuestionnaire: (
36
+ questionnaire: Questionnaire,
37
+ updatedResponse: QuestionnaireResponse
38
+ ) => void;
30
39
  buildSourceResponse: (response: QuestionnaireResponse) => void;
31
40
  setUpdatableResponseAsPopulated: (populatedResponse: QuestionnaireResponse) => void;
32
41
  updateResponse: (updatedResponse: QuestionnaireResponse) => void;
@@ -40,6 +49,32 @@ export const questionnaireResponseStore = createStore<QuestionnaireResponseStore
40
49
  sourceResponse: cloneDeep(emptyResponse),
41
50
  updatableResponse: cloneDeep(emptyResponse),
42
51
  formChangesHistory: [],
52
+ invalidItems: {},
53
+ responseIsValid: true,
54
+ validateQuestionnaire: (
55
+ questionnaire: Questionnaire,
56
+ updatedResponse: QuestionnaireResponse
57
+ ) => {
58
+ const tempInvalidItems = get().invalidItems;
59
+
60
+ const enableWhenIsActivated = questionnaireStore.getState().enableWhenIsActivated;
61
+ const enableWhenItems = questionnaireStore.getState().enableWhenItems;
62
+ const enableWhenExpressions = questionnaireStore.getState().enableWhenExpressions;
63
+
64
+ validateQuestionnaire({
65
+ questionnaire,
66
+ questionnaireResponse: updatedResponse,
67
+ invalidItems: tempInvalidItems,
68
+ enableWhenIsActivated,
69
+ enableWhenItems,
70
+ enableWhenExpressions
71
+ });
72
+
73
+ set(() => ({
74
+ invalidItems: tempInvalidItems,
75
+ responseIsValid: Object.keys(tempInvalidItems).length === 0
76
+ }));
77
+ },
43
78
  buildSourceResponse: (questionnaireResponse: QuestionnaireResponse) => {
44
79
  set(() => ({
45
80
  sourceResponse: questionnaireResponse,
@@ -15,13 +15,7 @@
15
15
  * limitations under the License.
16
16
  */
17
17
 
18
- import type {
19
- Coding,
20
- Expression,
21
- Extension,
22
- QuestionnaireItem,
23
- QuestionnaireResponse
24
- } from 'fhir/r4';
18
+ import type { Coding, Expression, Extension, QuestionnaireItem } from 'fhir/r4';
25
19
  import type { RegexValidation } from '../interfaces/regex.interface';
26
20
 
27
21
  /**
@@ -220,28 +214,6 @@ export function getMarkdownString(qItem: QuestionnaireItem): string | null {
220
214
  return null;
221
215
  }
222
216
 
223
- /**
224
- * Get questionnaire name from questionnaireResponse
225
- * If questionnaireResponse does not have a name, fallback to questionnaireResponse questionnaireId
226
- *
227
- * @author Sean Fong
228
- */
229
- export function getQuestionnaireNameFromResponse(
230
- questionnaireResponse: QuestionnaireResponse
231
- ): string {
232
- const itemControl = questionnaireResponse._questionnaire?.extension?.find(
233
- (extension: Extension) => extension.url === 'http://hl7.org/fhir/StructureDefinition/display'
234
- );
235
-
236
- if (itemControl) {
237
- if (itemControl.valueString) {
238
- return itemControl.valueString.charAt(0).toUpperCase() + itemControl.valueString.slice(1);
239
- }
240
- }
241
-
242
- return questionnaireResponse.id ?? 'Unnamed Response';
243
- }
244
-
245
217
  /**
246
218
  * Get text display prompt for items with itemControlCode prompt and has a prompt childItem
247
219
  *
@@ -259,15 +231,6 @@ export function getTextDisplayPrompt(qItem: QuestionnaireItem): string {
259
231
  return '';
260
232
  }
261
233
 
262
- /**
263
- * Check if item is readonly
264
- *
265
- * @author Sean Fong
266
- */
267
- export function getReadOnly(qItem: QuestionnaireItem): boolean {
268
- return !!qItem.readOnly;
269
- }
270
-
271
234
  /**
272
235
  * Get decimal text display unit for items with itemControlCode unit and has a unit childItem
273
236
  *
@@ -332,26 +295,6 @@ export function getTextDisplayInstructions(qItem: QuestionnaireItem): string {
332
295
  return '';
333
296
  }
334
297
 
335
- /**
336
- * Get entry format if its extension is present
337
- * i.e. DD-MM-YYYY for dates, HH:MM for times etc.
338
- *
339
- * @author Sean Fong
340
- */
341
- export function getEntryFormat(qItem: QuestionnaireItem): string {
342
- const itemControl = qItem.extension?.find(
343
- (extension: Extension) =>
344
- extension.url === 'http://hl7.org/fhir/StructureDefinition/entryFormat'
345
- );
346
-
347
- if (itemControl) {
348
- if (itemControl.valueString) {
349
- return itemControl.valueString;
350
- }
351
- }
352
- return '';
353
- }
354
-
355
298
  /**
356
299
  * Get entry format if its extension is present
357
300
  * i.e. DD-MM-YYYY for dates, HH:MM for times etc.
@@ -388,12 +331,3 @@ export function getRegexValidation(qItem: QuestionnaireItem): RegexValidation |
388
331
 
389
332
  return null;
390
333
  }
391
-
392
- /**
393
- * Get maximum length of characters allowed if present
394
- *
395
- * @author Sean Fong
396
- */
397
- export function getMaxLength(qItem: QuestionnaireItem): number | null {
398
- return qItem.maxLength ?? null;
399
- }
@@ -23,6 +23,8 @@ import { isRepeatItemAndNotCheckbox } from './qItem';
23
23
  * QuestionnaireItems without a corresponding QuestionnaireResponseItem is set as undefined.
24
24
  * i.e. QItems = [QItem0, QItem1, QItem2]. Only QItem0 and QItem2 have QrItems
25
25
  * Generated array: [QrItem0, undefined, QrItem2]
26
+ * Note: There's a bug where if the qItems are child items from a repeat group, the function fails at the isRepeatGroup line.
27
+ * Ensure that repeat groups are handled prior to calling this function.
26
28
  *
27
29
  * @author Sean Fong
28
30
  */