@aehrc/smart-forms-renderer 0.7.1 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (347) hide show
  1. package/README.md +1 -1
  2. package/lib/components/FormComponents/ChoiceItems/ChoiceAutocompleteItem.js +1 -2
  3. package/lib/components/FormComponents/ChoiceItems/ChoiceAutocompleteItem.js.map +1 -1
  4. package/lib/components/FormComponents/ChoiceItems/ChoiceCheckboxAnswerOptionFields.d.ts +12 -0
  5. package/lib/components/FormComponents/ChoiceItems/ChoiceCheckboxAnswerOptionFields.js +39 -0
  6. package/lib/components/FormComponents/ChoiceItems/ChoiceCheckboxAnswerOptionFields.js.map +1 -0
  7. package/lib/components/FormComponents/ChoiceItems/ChoiceCheckboxAnswerOptionItem.d.ts +3 -3
  8. package/lib/components/FormComponents/ChoiceItems/ChoiceCheckboxAnswerOptionItem.js +14 -27
  9. package/lib/components/FormComponents/ChoiceItems/ChoiceCheckboxAnswerOptionItem.js.map +1 -1
  10. package/lib/components/FormComponents/ChoiceItems/ChoiceCheckboxAnswerValueSetFields.d.ts +13 -0
  11. package/lib/components/FormComponents/ChoiceItems/ChoiceCheckboxAnswerValueSetFields.js +42 -0
  12. package/lib/components/FormComponents/ChoiceItems/ChoiceCheckboxAnswerValueSetFields.js.map +1 -0
  13. package/lib/components/FormComponents/ChoiceItems/ChoiceCheckboxAnswerValueSetItem.d.ts +4 -3
  14. package/lib/components/FormComponents/ChoiceItems/ChoiceCheckboxAnswerValueSetItem.js +14 -22
  15. package/lib/components/FormComponents/ChoiceItems/ChoiceCheckboxAnswerValueSetItem.js.map +1 -1
  16. package/lib/components/FormComponents/ChoiceItems/ChoiceItemSwitcher.d.ts +2 -2
  17. package/lib/components/FormComponents/ChoiceItems/ChoiceItemSwitcher.js +3 -3
  18. package/lib/components/FormComponents/ChoiceItems/ChoiceItemSwitcher.js.map +1 -1
  19. package/lib/components/FormComponents/ChoiceItems/ChoiceRadioAnswerOptionFields.d.ts +12 -0
  20. package/lib/components/FormComponents/ChoiceItems/ChoiceRadioAnswerOptionFields.js +27 -0
  21. package/lib/components/FormComponents/ChoiceItems/ChoiceRadioAnswerOptionFields.js.map +1 -0
  22. package/lib/components/FormComponents/ChoiceItems/ChoiceRadioAnswerOptionItem.d.ts +1 -1
  23. package/lib/components/FormComponents/ChoiceItems/ChoiceRadioAnswerOptionItem.js +9 -24
  24. package/lib/components/FormComponents/ChoiceItems/ChoiceRadioAnswerOptionItem.js.map +1 -1
  25. package/lib/components/FormComponents/ChoiceItems/ChoiceRadioAnswerValueSetFields.d.ts +14 -0
  26. package/lib/components/FormComponents/ChoiceItems/ChoiceRadioAnswerValueSetFields.js +42 -0
  27. package/lib/components/FormComponents/ChoiceItems/ChoiceRadioAnswerValueSetFields.js.map +1 -0
  28. package/lib/components/FormComponents/ChoiceItems/ChoiceRadioAnswerValueSetItem.d.ts +1 -1
  29. package/lib/components/FormComponents/ChoiceItems/ChoiceRadioAnswerValueSetItem.js +8 -21
  30. package/lib/components/FormComponents/ChoiceItems/ChoiceRadioAnswerValueSetItem.js.map +1 -1
  31. package/lib/components/FormComponents/ChoiceItems/ChoiceSelectAnswerOptionFields.d.ts +10 -0
  32. package/lib/components/FormComponents/ChoiceItems/ChoiceSelectAnswerOptionFields.js +41 -0
  33. package/lib/components/FormComponents/ChoiceItems/ChoiceSelectAnswerOptionFields.js.map +1 -0
  34. package/lib/components/FormComponents/ChoiceItems/ChoiceSelectAnswerOptionItem.js +7 -23
  35. package/lib/components/FormComponents/ChoiceItems/ChoiceSelectAnswerOptionItem.js.map +1 -1
  36. package/lib/components/FormComponents/ChoiceItems/ChoiceSelectAnswerValueSetFields.d.ts +12 -0
  37. package/lib/components/FormComponents/ChoiceItems/ChoiceSelectAnswerValueSetFields.js +42 -0
  38. package/lib/components/FormComponents/ChoiceItems/ChoiceSelectAnswerValueSetFields.js.map +1 -0
  39. package/lib/components/FormComponents/ChoiceItems/ChoiceSelectAnswerValueSetItem.js +8 -18
  40. package/lib/components/FormComponents/ChoiceItems/ChoiceSelectAnswerValueSetItem.js.map +1 -1
  41. package/lib/components/FormComponents/DecimalItem/DecimalItem.js +3 -2
  42. package/lib/components/FormComponents/DecimalItem/DecimalItem.js.map +1 -1
  43. package/lib/components/FormComponents/GridGroup/GridGroup.js +2 -2
  44. package/lib/components/FormComponents/GridGroup/GridGroup.js.map +1 -1
  45. package/lib/components/FormComponents/GridGroup/GridRow.js +2 -2
  46. package/lib/components/FormComponents/GridGroup/GridRow.js.map +1 -1
  47. package/lib/components/FormComponents/GroupItem/GroupChildItemSwitcher.d.ts +10 -0
  48. package/lib/components/FormComponents/GroupItem/GroupChildItemSwitcher.js +73 -0
  49. package/lib/components/FormComponents/GroupItem/GroupChildItemSwitcher.js.map +1 -0
  50. package/lib/components/FormComponents/GroupItem/GroupItem.js +3 -3
  51. package/lib/components/FormComponents/GroupItem/GroupItem.js.map +1 -1
  52. package/lib/components/FormComponents/GroupItem/GroupItemSwitcher.js +4 -4
  53. package/lib/components/FormComponents/GroupItem/GroupItemSwitcher.js.map +1 -1
  54. package/lib/components/FormComponents/GroupItem/ItemSwitcher.d.ts +10 -0
  55. package/lib/components/FormComponents/GroupItem/ItemSwitcher.js +81 -0
  56. package/lib/components/FormComponents/GroupItem/ItemSwitcher.js.map +1 -0
  57. package/lib/components/FormComponents/GroupItem/TopLevelGroupItemSwitcher.d.ts +10 -0
  58. package/lib/components/FormComponents/GroupItem/TopLevelGroupItemSwitcher.js +45 -0
  59. package/lib/components/FormComponents/GroupItem/TopLevelGroupItemSwitcher.js.map +1 -0
  60. package/lib/components/FormComponents/IntegerItem/IntegerItem.js +3 -2
  61. package/lib/components/FormComponents/IntegerItem/IntegerItem.js.map +1 -1
  62. package/lib/components/FormComponents/Item.styles.d.ts +2 -2
  63. package/lib/components/FormComponents/Item.styles.js +2 -2
  64. package/lib/components/FormComponents/Item.styles.js.map +1 -1
  65. package/lib/components/FormComponents/ItemParts/RadioAnswerOptionButtons.d.ts +8 -0
  66. package/lib/components/FormComponents/ItemParts/RadioAnswerOptionButtons.js +37 -0
  67. package/lib/components/FormComponents/ItemParts/RadioAnswerOptionButtons.js.map +1 -0
  68. package/lib/components/FormComponents/ItemParts/RadioButtons.d.ts +8 -0
  69. package/lib/components/FormComponents/ItemParts/RadioButtons.js +37 -0
  70. package/lib/components/FormComponents/ItemParts/RadioButtons.js.map +1 -0
  71. package/lib/components/FormComponents/ItemParts/RadioButtonsAnswerOption.d.ts +8 -0
  72. package/lib/components/FormComponents/ItemParts/RadioButtonsAnswerOption.js +37 -0
  73. package/lib/components/FormComponents/ItemParts/RadioButtonsAnswerOption.js.map +1 -0
  74. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceAutocompleteField.d.ts +20 -0
  75. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceAutocompleteField.js +49 -0
  76. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceAutocompleteField.js.map +1 -0
  77. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceAutocompleteFieldEndAdornment.d.ts +0 -0
  78. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceAutocompleteFieldEndAdornment.js +2 -0
  79. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceAutocompleteFieldEndAdornment.js.map +1 -0
  80. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceAutocompleteItem.js +11 -35
  81. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceAutocompleteItem.js.map +1 -1
  82. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceCheckboxAnswerOptionFields.d.ts +17 -0
  83. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceCheckboxAnswerOptionFields.js +42 -0
  84. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceCheckboxAnswerOptionFields.js.map +1 -0
  85. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceCheckboxAnswerOptionItem.d.ts +3 -3
  86. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceCheckboxAnswerOptionItem.js +23 -36
  87. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceCheckboxAnswerOptionItem.js.map +1 -1
  88. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceItemSwitcher.d.ts +2 -2
  89. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceItemSwitcher.js +3 -3
  90. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceItemSwitcher.js.map +1 -1
  91. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceRadioAnswerOptionFields.d.ts +15 -0
  92. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceRadioAnswerOptionFields.js +29 -0
  93. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceRadioAnswerOptionFields.js.map +1 -0
  94. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceRadioAnswerOptionItem.d.ts +1 -1
  95. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceRadioAnswerOptionItem.js +3 -23
  96. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceRadioAnswerOptionItem.js.map +1 -1
  97. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerOptionField.d.ts +11 -0
  98. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerOptionField.js +14 -0
  99. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerOptionField.js.map +1 -0
  100. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerOptionFields.d.ts +0 -0
  101. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerOptionFields.js +2 -0
  102. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerOptionFields.js.map +1 -0
  103. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerOptionItem.js +18 -23
  104. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerOptionItem.js.map +1 -1
  105. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerValueSetField.d.ts +12 -0
  106. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerValueSetField.js +16 -0
  107. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerValueSetField.js.map +1 -0
  108. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerValueSetItem.js +8 -14
  109. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerValueSetItem.js.map +1 -1
  110. package/lib/components/FormComponents/RepeatGroup/RepeatGroup.js +4 -3
  111. package/lib/components/FormComponents/RepeatGroup/RepeatGroup.js.map +1 -1
  112. package/lib/components/FormComponents/RepeatGroup/index.d.ts +1 -0
  113. package/lib/components/FormComponents/RepeatGroup/index.js +18 -0
  114. package/lib/components/FormComponents/RepeatGroup/index.js.map +1 -0
  115. package/lib/components/FormComponents/RepeatItem/RepeatItem.js +1 -1
  116. package/lib/components/FormComponents/RepeatItem/RepeatItem.js.map +1 -1
  117. package/lib/components/FormComponents/SingleItem/SingleItem.d.ts +2 -2
  118. package/lib/components/FormComponents/SingleItem/SingleItem.js +2 -2
  119. package/lib/components/FormComponents/SingleItem/SingleItem.js.map +1 -1
  120. package/lib/components/FormComponents/SingleItem/SingleItemSwitcher.d.ts +2 -2
  121. package/lib/components/FormComponents/SingleItem/SingleItemSwitcher.js +3 -3
  122. package/lib/components/FormComponents/SingleItem/SingleItemSwitcher.js.map +1 -1
  123. package/lib/components/FormComponents/SingleItem/index.d.ts +1 -0
  124. package/lib/components/FormComponents/SingleItem/index.js +18 -0
  125. package/lib/components/FormComponents/SingleItem/index.js.map +1 -0
  126. package/lib/components/FormComponents/StringItem/StringItem.js +3 -2
  127. package/lib/components/FormComponents/StringItem/StringItem.js.map +1 -1
  128. package/lib/components/FormComponents/Tables/AddItemButton.d.ts +8 -0
  129. package/lib/components/FormComponents/Tables/AddItemButton.js +28 -0
  130. package/lib/components/FormComponents/Tables/AddItemButton.js.map +1 -0
  131. package/lib/components/FormComponents/Tables/AddRowButton.d.ts +8 -0
  132. package/lib/components/FormComponents/Tables/AddRowButton.js +28 -0
  133. package/lib/components/FormComponents/Tables/AddRowButton.js.map +1 -0
  134. package/lib/components/FormComponents/Tables/GroupTable.d.ts +10 -0
  135. package/lib/components/FormComponents/Tables/GroupTable.js +108 -0
  136. package/lib/components/FormComponents/Tables/GroupTable.js.map +1 -0
  137. package/lib/components/FormComponents/Tables/GroupTableRow.d.ts +10 -0
  138. package/lib/components/FormComponents/Tables/GroupTableRow.js +46 -0
  139. package/lib/components/FormComponents/Tables/GroupTableRow.js.map +1 -0
  140. package/lib/components/FormComponents/Tables/QItemGroupTable.js +7 -5
  141. package/lib/components/FormComponents/Tables/QItemGroupTable.js.map +1 -1
  142. package/lib/components/FormComponents/Tables/QItemGroupTableRow.js +2 -2
  143. package/lib/components/FormComponents/Tables/QItemGroupTableRow.js.map +1 -1
  144. package/lib/components/FormComponents/Tables/index.d.ts +1 -0
  145. package/lib/components/FormComponents/Tables/index.js +18 -0
  146. package/lib/components/FormComponents/Tables/index.js.map +1 -0
  147. package/lib/components/FormComponents/TextItem/TextItem.js +3 -2
  148. package/lib/components/FormComponents/TextItem/TextItem.js.map +1 -1
  149. package/lib/components/FormComponents/index.d.ts +3 -0
  150. package/lib/components/FormComponents/index.js +20 -0
  151. package/lib/components/FormComponents/index.js.map +1 -0
  152. package/lib/components/Renderer/BaseRenderer.js +26 -14
  153. package/lib/components/Renderer/BaseRenderer.js.map +1 -1
  154. package/lib/components/Renderer/FormBodyCollapsible.js +2 -2
  155. package/lib/components/Renderer/FormBodyCollapsible.js.map +1 -1
  156. package/lib/components/Renderer/FormBodyTabbed.js +3 -3
  157. package/lib/components/Renderer/FormBodyTabbed.js.map +1 -1
  158. package/lib/components/Renderer/FormTopLevelItem.d.ts +4 -4
  159. package/lib/components/Renderer/FormTopLevelItem.js +14 -1
  160. package/lib/components/Renderer/FormTopLevelItem.js.map +1 -1
  161. package/lib/components/Tabs/FormBodySingleTab.js +1 -1
  162. package/lib/components/Tabs/FormBodySingleTab.js.map +1 -1
  163. package/lib/components/Tabs/FormBodyTabList.d.ts +1 -0
  164. package/lib/components/Tabs/FormBodyTabList.js +3 -4
  165. package/lib/components/Tabs/FormBodyTabList.js.map +1 -1
  166. package/lib/components/Tabs/FormBodyTabListWrapper.d.ts +1 -1
  167. package/lib/components/Tabs/FormBodyTabListWrapper.js +6 -13
  168. package/lib/components/Tabs/FormBodyTabListWrapper.js.map +1 -1
  169. package/lib/components/Tabs/ShowCompletedTabsSection.d.ts +7 -0
  170. package/lib/components/Tabs/ShowCompletedTabsSection.js +34 -0
  171. package/lib/components/Tabs/ShowCompletedTabsSection.js.map +1 -0
  172. package/lib/components/index.d.ts +1 -0
  173. package/lib/components/index.js +1 -0
  174. package/lib/components/index.js.map +1 -1
  175. package/lib/hooks/index.d.ts +1 -0
  176. package/lib/hooks/index.js +2 -0
  177. package/lib/hooks/index.js.map +1 -0
  178. package/lib/hooks/useContextDisplayItems.d.ts +6 -0
  179. package/lib/hooks/useContextDisplayItems.js +30 -0
  180. package/lib/hooks/useContextDisplayItems.js.map +1 -0
  181. package/lib/hooks/useDecimalUpdateFromProp.d.ts +2 -0
  182. package/lib/hooks/useDecimalUpdateFromProp.js +29 -0
  183. package/lib/hooks/useDecimalUpdateFromProp.js.map +1 -0
  184. package/lib/hooks/useInitialiseRenderer.js +2 -2
  185. package/lib/hooks/useInitialiseRenderer.js.map +1 -1
  186. package/lib/hooks/useInitialiseRepeatAnswers.d.ts +2 -2
  187. package/lib/hooks/useInitialiseRepeatAnswers.js +21 -15
  188. package/lib/hooks/useInitialiseRepeatAnswers.js.map +1 -1
  189. package/lib/hooks/useInitialiseRepeatGroups.d.ts +2 -1
  190. package/lib/hooks/useInitialiseRepeatGroups.js +21 -15
  191. package/lib/hooks/useInitialiseRepeatGroups.js.map +1 -1
  192. package/lib/hooks/useIntegerUpdateFromProp.d.ts +2 -0
  193. package/lib/hooks/useIntegerUpdateFromProp.js +29 -0
  194. package/lib/hooks/useIntegerUpdateFromProp.js.map +1 -0
  195. package/lib/hooks/useNumberInput.d.ts +3 -0
  196. package/lib/hooks/useNumberInput.js +31 -0
  197. package/lib/hooks/useNumberInput.js.map +1 -0
  198. package/lib/hooks/useNumberUpdateFromProp.d.ts +2 -0
  199. package/lib/hooks/useNumberUpdateFromProp.js +29 -0
  200. package/lib/hooks/useNumberUpdateFromProp.js.map +1 -0
  201. package/lib/hooks/useRepeatItemState.d.ts +5 -0
  202. package/lib/hooks/useRepeatItemState.js +35 -0
  203. package/lib/hooks/useRepeatItemState.js.map +1 -0
  204. package/lib/hooks/useRepeatItemUpdateFromProp.d.ts +2 -0
  205. package/lib/hooks/useRepeatItemUpdateFromProp.js +29 -0
  206. package/lib/hooks/useRepeatItemUpdateFromProp.js.map +1 -0
  207. package/lib/hooks/useStringField.d.ts +2 -0
  208. package/lib/hooks/useStringField.js +29 -0
  209. package/lib/hooks/useStringField.js.map +1 -0
  210. package/lib/hooks/useStringInput.d.ts +3 -0
  211. package/lib/hooks/useStringInput.js +31 -0
  212. package/lib/hooks/useStringInput.js.map +1 -0
  213. package/lib/hooks/useStringUpdateFromProp.d.ts +2 -0
  214. package/lib/hooks/useStringUpdateFromProp.js +29 -0
  215. package/lib/hooks/useStringUpdateFromProp.js.map +1 -0
  216. package/lib/hooks/useTerminologyServerQuery.js +3 -6
  217. package/lib/hooks/useTerminologyServerQuery.js.map +1 -1
  218. package/lib/index.d.ts +16 -0
  219. package/lib/index.js +29 -2
  220. package/lib/index.js.map +1 -1
  221. package/lib/interfaces/questionnaireStore.interface.d.ts +1 -0
  222. package/lib/interfaces/renderProps.interface.d.ts +3 -0
  223. package/lib/stores/useQuestionnaireResponseStore.d.ts +2 -1
  224. package/lib/stores/useQuestionnaireResponseStore.js +17 -10
  225. package/lib/stores/useQuestionnaireResponseStore.js.map +1 -1
  226. package/lib/stores/useQuestionnaireStore.d.ts +2 -1
  227. package/lib/stores/useQuestionnaireStore.js +5 -2
  228. package/lib/stores/useQuestionnaireStore.js.map +1 -1
  229. package/lib/theme/overrides/Overrides.js +1 -2
  230. package/lib/theme/overrides/Overrides.js.map +1 -1
  231. package/lib/utils/calculatedExpression.js +2 -2
  232. package/lib/utils/calculatedExpression.js.map +1 -1
  233. package/lib/utils/formChanges.d.ts +18 -0
  234. package/lib/utils/formChanges.js +91 -0
  235. package/lib/utils/formChanges.js.map +1 -0
  236. package/lib/utils/formChangesOld.d.ts +18 -0
  237. package/lib/utils/formChangesOld.js +91 -0
  238. package/lib/utils/formChangesOld.js.map +1 -0
  239. package/lib/utils/index.d.ts +1 -0
  240. package/lib/utils/index.js +18 -0
  241. package/lib/utils/index.js.map +1 -0
  242. package/lib/utils/mapItem.d.ts +2 -2
  243. package/lib/utils/mapItem.js +3 -3
  244. package/lib/utils/mapItem.js.map +1 -1
  245. package/lib/utils/qItem.d.ts +2 -0
  246. package/lib/utils/qItem.js +22 -0
  247. package/lib/utils/qItem.js.map +1 -1
  248. package/lib/utils/qrItem.d.ts +3 -4
  249. package/lib/utils/qrItem.js +94 -96
  250. package/lib/utils/qrItem.js.map +1 -1
  251. package/lib/utils/questionnaireStoreUtils/createQuestionaireModel.js +4 -0
  252. package/lib/utils/questionnaireStoreUtils/createQuestionaireModel.js.map +1 -1
  253. package/lib/utils/repopulate.d.ts +9 -0
  254. package/lib/utils/repopulate.js +133 -0
  255. package/lib/utils/repopulate.js.map +1 -0
  256. package/lib/utils/repopulateGenerateItems.d.ts +9 -0
  257. package/lib/utils/repopulateGenerateItems.js +133 -0
  258. package/lib/utils/repopulateGenerateItems.js.map +1 -0
  259. package/lib/utils/repopulateIntoResponse.d.ts +3 -0
  260. package/lib/utils/repopulateIntoResponse.js +92 -0
  261. package/lib/utils/repopulateIntoResponse.js.map +1 -0
  262. package/lib/utils/repopulateItems.d.ts +9 -0
  263. package/lib/utils/repopulateItems.js +130 -0
  264. package/lib/utils/repopulateItems.js.map +1 -0
  265. package/lib/utils/repopulateRepeatGroup.d.ts +4 -0
  266. package/lib/utils/repopulateRepeatGroup.js +54 -0
  267. package/lib/utils/repopulateRepeatGroup.js.map +1 -0
  268. package/package.json +7 -5
  269. package/src/components/FormComponents/ChoiceItems/ChoiceAutocompleteItem.tsx +1 -2
  270. package/src/components/FormComponents/ChoiceItems/ChoiceCheckboxAnswerOptionFields.tsx +85 -0
  271. package/src/components/FormComponents/ChoiceItems/ChoiceCheckboxAnswerOptionItem.tsx +35 -58
  272. package/src/components/FormComponents/ChoiceItems/ChoiceCheckboxAnswerValueSetFields.tsx +79 -0
  273. package/src/components/FormComponents/ChoiceItems/ChoiceCheckboxAnswerValueSetItem.tsx +37 -50
  274. package/src/components/FormComponents/ChoiceItems/ChoiceItemSwitcher.tsx +10 -5
  275. package/src/components/FormComponents/ChoiceItems/ChoiceRadioAnswerOptionFields.tsx +48 -0
  276. package/src/components/FormComponents/ChoiceItems/ChoiceRadioAnswerOptionItem.tsx +25 -53
  277. package/src/components/FormComponents/ChoiceItems/ChoiceRadioAnswerValueSetFields.tsx +83 -0
  278. package/src/components/FormComponents/ChoiceItems/ChoiceRadioAnswerValueSetItem.tsx +27 -49
  279. package/src/components/FormComponents/ChoiceItems/ChoiceSelectAnswerOptionFields.tsx +81 -0
  280. package/src/components/FormComponents/ChoiceItems/ChoiceSelectAnswerOptionItem.tsx +19 -54
  281. package/src/components/FormComponents/ChoiceItems/ChoiceSelectAnswerValueSetFields.tsx +97 -0
  282. package/src/components/FormComponents/ChoiceItems/ChoiceSelectAnswerValueSetItem.tsx +22 -60
  283. package/src/components/FormComponents/DecimalItem/DecimalItem.tsx +3 -2
  284. package/src/components/FormComponents/GridGroup/GridGroup.tsx +2 -2
  285. package/src/components/FormComponents/GridGroup/GridRow.tsx +2 -2
  286. package/src/components/FormComponents/GroupItem/GroupItem.tsx +3 -3
  287. package/src/components/FormComponents/GroupItem/GroupItemSwitcher.tsx +4 -4
  288. package/src/components/FormComponents/IntegerItem/IntegerItem.tsx +3 -2
  289. package/src/components/FormComponents/Item.styles.ts +2 -2
  290. package/src/components/FormComponents/ItemParts/RadioAnswerOptionButtons.tsx +72 -0
  291. package/src/components/FormComponents/OpenChoiceItems/OpenChoiceAutocompleteField.tsx +131 -0
  292. package/src/components/FormComponents/OpenChoiceItems/OpenChoiceAutocompleteItem.tsx +38 -93
  293. package/src/components/FormComponents/OpenChoiceItems/OpenChoiceCheckboxAnswerOptionFields.tsx +112 -0
  294. package/src/components/FormComponents/OpenChoiceItems/OpenChoiceCheckboxAnswerOptionItem.tsx +57 -76
  295. package/src/components/FormComponents/OpenChoiceItems/OpenChoiceItemSwitcher.tsx +8 -5
  296. package/src/components/FormComponents/OpenChoiceItems/OpenChoiceRadioAnswerOptionFields.tsx +72 -0
  297. package/src/components/FormComponents/OpenChoiceItems/OpenChoiceRadioAnswerOptionItem.tsx +12 -59
  298. package/src/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerOptionField.tsx +54 -0
  299. package/src/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerOptionItem.tsx +40 -64
  300. package/src/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerValueSetField.tsx +63 -0
  301. package/src/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerValueSetItem.tsx +22 -50
  302. package/src/components/FormComponents/RepeatGroup/RepeatGroup.tsx +4 -3
  303. package/src/{theme/overrides/Backdrop.ts → components/FormComponents/RepeatGroup/index.ts} +1 -17
  304. package/src/components/FormComponents/RepeatItem/RepeatItem.tsx +1 -1
  305. package/src/components/FormComponents/SingleItem/SingleItem.tsx +6 -3
  306. package/src/components/FormComponents/SingleItem/SingleItemSwitcher.tsx +7 -3
  307. package/src/components/FormComponents/SingleItem/index.ts +18 -0
  308. package/src/components/FormComponents/StringItem/StringItem.tsx +3 -2
  309. package/src/components/FormComponents/Tables/AddRowButton.tsx +49 -0
  310. package/src/components/FormComponents/Tables/{QItemGroupTable.tsx → GroupTable.tsx} +21 -23
  311. package/src/components/FormComponents/Tables/{QItemGroupTableRow.tsx → GroupTableRow.tsx} +4 -4
  312. package/src/components/FormComponents/Tables/index.ts +18 -0
  313. package/src/components/FormComponents/TextItem/TextItem.tsx +3 -2
  314. package/src/components/FormComponents/index.ts +20 -0
  315. package/src/components/Renderer/BaseRenderer.tsx +39 -18
  316. package/src/components/Renderer/FormBodyCollapsible.tsx +2 -2
  317. package/src/components/Renderer/FormBodyTabbed.tsx +3 -3
  318. package/src/components/Renderer/FormTopLevelItem.tsx +33 -4
  319. package/src/components/Tabs/FormBodySingleTab.tsx +1 -1
  320. package/src/components/Tabs/FormBodyTabList.tsx +5 -8
  321. package/src/components/Tabs/FormBodyTabListWrapper.tsx +15 -26
  322. package/src/components/Tabs/ShowCompletedTabsSection.tsx +52 -0
  323. package/src/components/index.ts +1 -0
  324. package/src/hooks/index.ts +1 -0
  325. package/src/hooks/useContextDisplayItems.ts +40 -0
  326. package/src/hooks/useInitialiseRenderer.ts +2 -2
  327. package/src/hooks/useInitialiseRepeatAnswers.ts +28 -17
  328. package/src/hooks/useInitialiseRepeatGroups.ts +28 -17
  329. package/src/hooks/useNumberInput.ts +38 -0
  330. package/src/hooks/useStringInput.ts +38 -0
  331. package/src/hooks/useTerminologyServerQuery.ts +3 -6
  332. package/src/index.ts +45 -2
  333. package/src/interfaces/questionnaireStore.interface.ts +1 -0
  334. package/src/interfaces/renderProps.interface.ts +4 -0
  335. package/src/stores/useQuestionnaireResponseStore.ts +15 -10
  336. package/src/stores/useQuestionnaireStore.ts +10 -3
  337. package/src/theme/overrides/Overrides.ts +0 -2
  338. package/src/utils/calculatedExpression.ts +2 -2
  339. package/src/utils/formChanges.ts +141 -0
  340. package/src/utils/index.ts +18 -0
  341. package/src/utils/mapItem.ts +6 -4
  342. package/src/utils/qItem.ts +29 -0
  343. package/src/utils/qrItem.ts +108 -97
  344. package/src/utils/questionnaireStoreUtils/createQuestionaireModel.ts +4 -0
  345. package/src/utils/repopulateIntoResponse.ts +153 -0
  346. package/src/utils/repopulateItems.ts +206 -0
  347. package/src/utils/repopulateRepeatGroup.ts +68 -0
@@ -15,7 +15,7 @@
15
15
  * limitations under the License.
16
16
  */
17
17
 
18
- import React, { useCallback, useState } from 'react';
18
+ import React, { useCallback } from 'react';
19
19
  import type {
20
20
  PropsWithIsRepeatedAttribute,
21
21
  PropsWithIsTabledAttribute,
@@ -31,6 +31,7 @@ import { FullWidthFormComponentBox } from '../../Box.styles';
31
31
  import StringField from './StringField';
32
32
  import ItemFieldGrid from '../ItemParts/ItemFieldGrid';
33
33
  import useStringCalculatedExpression from '../../../hooks/useStringCalculatedExpression';
34
+ import useStringInput from '../../../hooks/useStringInput';
34
35
 
35
36
  interface StringItemProps
36
37
  extends PropsWithQrItemChangeHandler<QuestionnaireResponseItem>,
@@ -58,7 +59,7 @@ function StringItem(props: StringItemProps) {
58
59
  if (qrItem?.answer && qrItem?.answer[0].valueString) {
59
60
  valueString = qrItem.answer[0].valueString;
60
61
  }
61
- const [input, setInput] = useState(valueString);
62
+ const [input, setInput] = useStringInput(valueString);
62
63
 
63
64
  // Perform validation checks
64
65
  const feedback = useValidationError(input, regexValidation, maxLength);
@@ -0,0 +1,49 @@
1
+ /*
2
+ * Copyright 2023 Commonwealth Scientific and Industrial Research
3
+ * Organisation (CSIRO) ABN 41 687 119 230.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
18
+ import React from 'react';
19
+ import Box from '@mui/material/Box';
20
+ import Button from '@mui/material/Button';
21
+ import AddIcon from '@mui/icons-material/Add';
22
+ import type { RepeatGroupSingle } from '../../../interfaces/repeatGroup.interface';
23
+
24
+ interface AddItemButtonProps {
25
+ repeatGroups: RepeatGroupSingle[];
26
+ onAddItem: () => void;
27
+ }
28
+
29
+ function AddRowButton(props: AddItemButtonProps) {
30
+ const { repeatGroups, onAddItem } = props;
31
+
32
+ const isDisabled = repeatGroups[repeatGroups.length - 1].qrItem === null;
33
+
34
+ return (
35
+ <Box display="flex" flexDirection="row-reverse">
36
+ <Button
37
+ variant="contained"
38
+ size="small"
39
+ startIcon={<AddIcon />}
40
+ disabled={isDisabled}
41
+ onClick={onAddItem}
42
+ data-test="button-add-repeat-item">
43
+ Add Row
44
+ </Button>
45
+ </Box>
46
+ );
47
+ }
48
+
49
+ export default AddRowButton;
@@ -18,10 +18,8 @@
18
18
  import React, { useMemo, useState } from 'react';
19
19
 
20
20
  import type { QuestionnaireItem, QuestionnaireResponseItem } from 'fhir/r4';
21
- import Button from '@mui/material/Button';
22
21
  import Divider from '@mui/material/Divider';
23
22
  import Paper from '@mui/material/Paper';
24
- import Stack from '@mui/material/Stack';
25
23
  import Table from '@mui/material/Table';
26
24
  import TableBody from '@mui/material/TableBody';
27
25
  import TableCell from '@mui/material/TableCell';
@@ -29,9 +27,7 @@ import TableContainer from '@mui/material/TableContainer';
29
27
  import TableHead from '@mui/material/TableHead';
30
28
  import TableRow from '@mui/material/TableRow';
31
29
  import Typography from '@mui/material/Typography';
32
-
33
- import AddIcon from '@mui/icons-material/Add';
34
- import QItemGroupTableRow from './QItemGroupTableRow';
30
+ import GroupTableRow from './GroupTableRow';
35
31
  import { HeaderTableCell } from './Table.styles';
36
32
  import { QGroupContainerBox } from '../../Box.styles';
37
33
  import { mapQItemsIndex } from '../../../utils/mapItem';
@@ -41,6 +37,8 @@ import { nanoid } from 'nanoid';
41
37
  import { createEmptyQrItem } from '../../../utils/qrItem';
42
38
  import DeleteRowButton from './DeleteRowButton';
43
39
  import LabelWrapper from '../ItemParts/ItemLabelWrapper';
40
+ import cloneDeep from 'lodash.clonedeep';
41
+ import AddRowButton from './AddRowButton';
44
42
 
45
43
  interface Props extends PropsWithQrRepeatGroupChangeHandler {
46
44
  qItem: QuestionnaireItem;
@@ -48,7 +46,7 @@ interface Props extends PropsWithQrRepeatGroupChangeHandler {
48
46
  groupCardElevation: number;
49
47
  }
50
48
 
51
- function QItemGroupTable(props: Props) {
49
+ function GroupTable(props: Props) {
52
50
  const { qItem, qrItems, groupCardElevation, onQrRepeatGroupChange } = props;
53
51
 
54
52
  const initialisedGroupTables = useInitialiseGroupTable(qrItems);
@@ -84,7 +82,9 @@ function QItemGroupTable(props: Props) {
84
82
  setTableRows(updatedTableRows);
85
83
  onQrRepeatGroupChange({
86
84
  linkId: qItem.linkId,
87
- qrItems: updatedTableRows.flatMap((singleRow) => (singleRow.qrItem ? [singleRow.qrItem] : []))
85
+ qrItems: updatedTableRows.flatMap((singleRow) =>
86
+ singleRow.qrItem ? [cloneDeep(singleRow.qrItem)] : []
87
+ )
88
88
  });
89
89
  }
90
90
 
@@ -96,7 +96,9 @@ function QItemGroupTable(props: Props) {
96
96
  setTableRows(updatedTableRows);
97
97
  onQrRepeatGroupChange({
98
98
  linkId: qItem.linkId,
99
- qrItems: updatedTableRows.flatMap((singleRow) => (singleRow.qrItem ? [singleRow.qrItem] : []))
99
+ qrItems: updatedTableRows.flatMap((singleRow) =>
100
+ singleRow.qrItem ? [cloneDeep(singleRow.qrItem)] : []
101
+ )
100
102
  });
101
103
  }
102
104
 
@@ -112,22 +114,18 @@ function QItemGroupTable(props: Props) {
112
114
 
113
115
  return (
114
116
  <QGroupContainerBox cardElevation={groupCardElevation} isRepeated={false} py={3}>
115
- <Typography fontSize={13} variant="h6">
116
- <LabelWrapper qItem={qItem} />
117
- </Typography>
118
- <Divider sx={{ my: 1 }} light />
117
+ {groupCardElevation !== 1 ? (
118
+ <>
119
+ <Typography fontSize={13} variant="h6">
120
+ <LabelWrapper qItem={qItem} />
121
+ </Typography>
122
+ <Divider sx={{ my: 1 }} light />
123
+ </>
124
+ ) : null}
119
125
  <TableContainer component={Paper} elevation={groupCardElevation}>
120
126
  <Table>
121
127
  <caption>
122
- <Stack direction="row" justifyContent="end">
123
- <Button
124
- variant="contained"
125
- size="small"
126
- startIcon={<AddIcon />}
127
- onClick={handleAddRow}>
128
- Add Row
129
- </Button>
130
- </Stack>
128
+ <AddRowButton repeatGroups={tableRows} onAddItem={handleAddRow} />
131
129
  </caption>
132
130
  <TableHead>
133
131
  <TableRow>
@@ -146,7 +144,7 @@ function QItemGroupTable(props: Props) {
146
144
 
147
145
  return (
148
146
  <TableRow key={nanoId}>
149
- <QItemGroupTableRow
147
+ <GroupTableRow
150
148
  qItem={qItem}
151
149
  qrItem={answeredQrItem}
152
150
  qItemsIndexMap={qItemsIndexMap}
@@ -167,4 +165,4 @@ function QItemGroupTable(props: Props) {
167
165
  );
168
166
  }
169
167
 
170
- export default QItemGroupTable;
168
+ export default GroupTable;
@@ -17,7 +17,7 @@
17
17
 
18
18
  import React from 'react';
19
19
  import type { QuestionnaireItem, QuestionnaireResponseItem } from 'fhir/r4';
20
- import { createQrGroup, updateQrGroup } from '../../../utils/qrItem';
20
+ import { createQrGroup, updateQrItemsInGroup } from '../../../utils/qrItem';
21
21
  import SingleItem from '../SingleItem/SingleItem';
22
22
  import { getQrItemsIndex } from '../../../utils/mapItem';
23
23
  import { StandardTableCell } from './Table.styles';
@@ -29,7 +29,7 @@ interface Props extends PropsWithQrItemChangeHandler<QuestionnaireResponseItem>
29
29
  qItemsIndexMap: Record<string, number>;
30
30
  }
31
31
 
32
- function QItemGroupTableRow(props: Props) {
32
+ function GroupTableRow(props: Props) {
33
33
  const { qItem, qrItem, qItemsIndexMap, onQrItemChange } = props;
34
34
 
35
35
  const rowItems = qItem.item;
@@ -42,7 +42,7 @@ function QItemGroupTableRow(props: Props) {
42
42
 
43
43
  function handleQrRowItemChange(newQrRowItem: QuestionnaireResponseItem) {
44
44
  const qrRow: QuestionnaireResponseItem = { ...row };
45
- updateQrGroup(newQrRowItem, null, qrRow, qItemsIndexMap);
45
+ updateQrItemsInGroup(newQrRowItem, null, qrRow, qItemsIndexMap);
46
46
  onQrItemChange(qrRow);
47
47
  }
48
48
 
@@ -74,4 +74,4 @@ function QItemGroupTableRow(props: Props) {
74
74
  );
75
75
  }
76
76
 
77
- export default QItemGroupTableRow;
77
+ export default GroupTableRow;
@@ -0,0 +1,18 @@
1
+ /*
2
+ * Copyright 2023 Commonwealth Scientific and Industrial Research
3
+ * Organisation (CSIRO) ABN 41 687 119 230.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
18
+ export { default as GroupTable } from './GroupTable';
@@ -15,7 +15,7 @@
15
15
  * limitations under the License.
16
16
  */
17
17
 
18
- import React, { useCallback, useState } from 'react';
18
+ import React, { useCallback } from 'react';
19
19
  import type {
20
20
  PropsWithIsRepeatedAttribute,
21
21
  PropsWithQrItemChangeHandler
@@ -30,6 +30,7 @@ import { FullWidthFormComponentBox } from '../../Box.styles';
30
30
  import TextField from './TextField';
31
31
  import useStringCalculatedExpression from '../../../hooks/useStringCalculatedExpression';
32
32
  import ItemFieldGrid from '../ItemParts/ItemFieldGrid';
33
+ import useStringInput from '../../../hooks/useStringInput';
33
34
 
34
35
  interface TextItemProps
35
36
  extends PropsWithQrItemChangeHandler<QuestionnaireResponseItem>,
@@ -57,7 +58,7 @@ function TextItem(props: TextItemProps) {
57
58
  if (qrItem?.answer && qrItem?.answer[0].valueString) {
58
59
  valueText = qrItem.answer[0].valueString;
59
60
  }
60
- const [input, setInput] = useState(valueText);
61
+ const [input, setInput] = useStringInput(valueText);
61
62
 
62
63
  // Perform validation checks
63
64
  const feedback = useValidationError(input, regexValidation, maxLength);
@@ -0,0 +1,20 @@
1
+ /*
2
+ * Copyright 2023 Commonwealth Scientific and Industrial Research
3
+ * Organisation (CSIRO) ABN 41 687 119 230.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
18
+ export * from './SingleItem';
19
+ export * from './RepeatGroup';
20
+ export * from './Tables';
@@ -15,13 +15,17 @@
15
15
  * limitations under the License.
16
16
  */
17
17
 
18
- import React from 'react';
18
+ import React, { useMemo } from 'react';
19
19
  import Container from '@mui/material/Container';
20
20
  import Fade from '@mui/material/Fade';
21
21
  import FormTopLevelItem from './FormTopLevelItem';
22
22
  import type { QuestionnaireResponse, QuestionnaireResponseItem } from 'fhir/r4';
23
23
  import useQuestionnaireStore from '../../stores/useQuestionnaireStore';
24
24
  import useQuestionnaireResponseStore from '../../stores/useQuestionnaireResponseStore';
25
+ import cloneDeep from 'lodash.clonedeep';
26
+ import { getQrItemsIndex, mapQItemsIndex } from '../../utils/mapItem';
27
+ import { updateQrItemsInGroup } from '../../utils/qrItem';
28
+ import type { QrRepeatGroup } from '../../interfaces/repeatGroup.interface';
25
29
 
26
30
  function BaseRenderer() {
27
31
  const sourceQuestionnaire = useQuestionnaireStore((state) => state.sourceQuestionnaire);
@@ -29,48 +33,65 @@ function BaseRenderer() {
29
33
  const updatableResponse = useQuestionnaireResponseStore((state) => state.updatableResponse);
30
34
  const updateResponse = useQuestionnaireResponseStore((state) => state.updateResponse);
31
35
 
32
- function handleTopLevelQRItemChange(newTopLevelQItem: QuestionnaireResponseItem, index: number) {
33
- if (!updatableResponse.item || updatableResponse.item.length === 0) {
36
+ const qItemsIndexMap = useMemo(() => mapQItemsIndex(sourceQuestionnaire), [sourceQuestionnaire]);
37
+
38
+ function handleTopLevelQRItemSingleChange(
39
+ newTopLevelQRItem: QuestionnaireResponseItem,
40
+ index: number
41
+ ) {
42
+ const updatedResponse: QuestionnaireResponse = cloneDeep(updatableResponse);
43
+ if (!updatedResponse.item || updatedResponse.item.length === 0) {
34
44
  return;
35
45
  }
36
46
 
37
- const updatedItems = [...updatableResponse.item]; // Copy the original array of items
38
- updatedItems[index] = newTopLevelQItem; // Modify the item at the specified index
47
+ const updatedItems = [...updatedResponse.item]; // Copy the original array of items
48
+ updatedItems[index] = newTopLevelQRItem; // Modify the item at the specified index
39
49
 
40
- const updatedResponse: QuestionnaireResponse = {
41
- ...updatableResponse,
42
- item: updatedItems
43
- };
50
+ updatedResponse.item = updatedItems;
51
+
52
+ updateExpressions(updatedResponse);
53
+ updateResponse(updatedResponse);
54
+ }
55
+
56
+ function handleTopLevelQRItemMultipleChange(newTopLevelQRItems: QrRepeatGroup) {
57
+ const updatedResponse: QuestionnaireResponse = cloneDeep(updatableResponse);
58
+ if (!updatedResponse.item || updatedResponse.item.length === 0) {
59
+ return;
60
+ }
61
+
62
+ updateQrItemsInGroup(null, newTopLevelQRItems, updatedResponse, qItemsIndexMap);
44
63
 
45
64
  updateExpressions(updatedResponse);
46
65
  updateResponse(updatedResponse);
47
66
  }
48
67
 
49
68
  const topLevelQItems = sourceQuestionnaire.item;
50
- const topLevelQRItems = updatableResponse.item;
69
+ const topLevelQRItems = cloneDeep(updatableResponse.item) ?? [];
51
70
 
52
71
  if (!topLevelQItems) {
53
72
  return <>Questionnaire does not have any items</>;
54
73
  }
55
74
 
75
+ // If an item has multiple answers, it is a repeat group
76
+ const topLevelQRItemsByIndex: (QuestionnaireResponseItem | QuestionnaireResponseItem[])[] =
77
+ getQrItemsIndex(topLevelQItems, topLevelQRItems, qItemsIndexMap);
78
+
56
79
  return (
57
80
  <Fade in={true} timeout={500}>
58
81
  <Container maxWidth="xl">
59
82
  {topLevelQItems.map((qItem, index) => {
60
- const qrItem = topLevelQRItems
61
- ? topLevelQRItems[index]
62
- : {
63
- linkId: qItem.linkId,
64
- text: qItem.text
65
- };
83
+ const qrItemOrItems = topLevelQRItemsByIndex[index];
66
84
 
67
85
  return (
68
86
  <FormTopLevelItem
69
87
  key={qItem.linkId}
70
88
  topLevelQItem={qItem}
71
- topLevelQRItem={qrItem}
89
+ topLevelQRItemOrItems={qrItemOrItems}
72
90
  onQrItemChange={(newTopLevelQRItem) =>
73
- handleTopLevelQRItemChange(newTopLevelQRItem, index)
91
+ handleTopLevelQRItemSingleChange(newTopLevelQRItem, index)
92
+ }
93
+ onQrRepeatGroupChange={(newTopLevelQRItems) =>
94
+ handleTopLevelQRItemMultipleChange(newTopLevelQRItems)
74
95
  }
75
96
  />
76
97
  );
@@ -19,7 +19,7 @@ import React, { useMemo } from 'react';
19
19
  import Stack from '@mui/material/Stack';
20
20
  import type { QuestionnaireItem, QuestionnaireResponseItem } from 'fhir/r4';
21
21
  import { getQrItemsIndex, mapQItemsIndex } from '../../utils/mapItem';
22
- import { updateQrGroup } from '../../utils/qrItem';
22
+ import { updateQrItemsInGroup } from '../../utils/qrItem';
23
23
  import type { PropsWithQrItemChangeHandler } from '../../interfaces/renderProps.interface';
24
24
  import useQuestionnaireStore from '../../stores/useQuestionnaireStore';
25
25
  import FormBodySingleCollapsibleWrapper from './FormBodySingleCollapsibleWrapper';
@@ -46,7 +46,7 @@ function FormBodyCollapsibleWrapper(props: FormBodyCollapsibleProps) {
46
46
  const qrItems = topLevelQRItem.item;
47
47
 
48
48
  function handleQrGroupChange(qrItem: QuestionnaireResponseItem) {
49
- updateQrGroup(qrItem, null, topLevelQRItem, indexMap);
49
+ updateQrItemsInGroup(qrItem, null, topLevelQRItem, indexMap);
50
50
  onQrItemChange(topLevelQRItem);
51
51
  }
52
52
 
@@ -22,7 +22,7 @@ import TabContext from '@mui/lab/TabContext';
22
22
  import TabPanel from '@mui/lab/TabPanel';
23
23
  import { getQrItemsIndex, mapQItemsIndex } from '../../utils/mapItem';
24
24
  import GroupItem from '../FormComponents/GroupItem/GroupItem';
25
- import { updateQrGroup } from '../../utils/qrItem';
25
+ import { updateQrItemsInGroup } from '../../utils/qrItem';
26
26
  import FormBodyTabListWrapper from '../Tabs/FormBodyTabListWrapper';
27
27
  import type { PropsWithQrItemChangeHandler } from '../../interfaces/renderProps.interface';
28
28
  import useQuestionnaireStore from '../../stores/useQuestionnaireStore';
@@ -47,7 +47,7 @@ function FormBodyTabbed(props: FormBodyTabbedProps) {
47
47
  const qrItems = topLevelQRItem.item;
48
48
 
49
49
  function handleQrGroupChange(qrItem: QuestionnaireResponseItem) {
50
- updateQrGroup(qrItem, null, topLevelQRItem, indexMap);
50
+ updateQrItemsInGroup(qrItem, null, topLevelQRItem, indexMap);
51
51
  onQrItemChange(topLevelQRItem);
52
52
  }
53
53
 
@@ -61,7 +61,7 @@ function FormBodyTabbed(props: FormBodyTabbedProps) {
61
61
  <Grid container spacing={2}>
62
62
  <TabContext value={currentTab.toString()}>
63
63
  <Grid item xs={12} md={3.5} lg={3} xl={2.75}>
64
- <FormBodyTabListWrapper qFormItems={qItems} currentTabIndex={currentTab} tabs={tabs} />
64
+ <FormBodyTabListWrapper topLevelItems={qItems} currentTabIndex={currentTab} tabs={tabs} />
65
65
  </Grid>
66
66
 
67
67
  <Grid item xs={12} md={8.5} lg={9} xl={9.25}>
@@ -21,17 +21,24 @@ import FormBodyTabbed from './FormBodyTabbed';
21
21
  import { containsTabs, isTabContainer } from '../../utils/tabs';
22
22
  import GroupItem from '../FormComponents/GroupItem/GroupItem';
23
23
  import SingleItem from '../FormComponents/SingleItem/SingleItem';
24
- import type { PropsWithQrItemChangeHandler } from '../../interfaces/renderProps.interface';
24
+ import type {
25
+ PropsWithQrItemChangeHandler,
26
+ PropsWithQrRepeatGroupChangeHandler
27
+ } from '../../interfaces/renderProps.interface';
25
28
  import FormBodyCollapsible from './FormBodyCollapsible';
26
29
  import useResponsive from '../../hooks/useResponsive';
30
+ import useHidden from '../../hooks/useHidden';
31
+ import GroupItemSwitcher from '../FormComponents/GroupItem/GroupItemSwitcher';
27
32
 
28
- interface FormTopLevelItemProps extends PropsWithQrItemChangeHandler<QuestionnaireResponseItem> {
33
+ interface FormTopLevelItemProps
34
+ extends PropsWithQrItemChangeHandler<QuestionnaireResponseItem>,
35
+ PropsWithQrRepeatGroupChangeHandler {
29
36
  topLevelQItem: QuestionnaireItem;
30
- topLevelQRItem: QuestionnaireResponseItem;
37
+ topLevelQRItemOrItems: QuestionnaireResponseItem | QuestionnaireResponseItem[];
31
38
  }
32
39
 
33
40
  function FormTopLevelItem(props: FormTopLevelItemProps) {
34
- const { topLevelQItem, topLevelQRItem, onQrItemChange } = props;
41
+ const { topLevelQItem, topLevelQRItemOrItems, onQrItemChange, onQrRepeatGroupChange } = props;
35
42
 
36
43
  const itemIsTabContainer = isTabContainer(topLevelQItem);
37
44
  const itemContainsTabs = containsTabs(topLevelQItem);
@@ -40,6 +47,28 @@ function FormTopLevelItem(props: FormTopLevelItemProps) {
40
47
 
41
48
  const itemIsGroup = topLevelQItem.type === 'group';
42
49
 
50
+ const itemIsHidden = useHidden(topLevelQItem);
51
+ if (itemIsHidden) {
52
+ return null;
53
+ }
54
+
55
+ // If item has multiple answers, use a group item switcher to determine how to render it.
56
+ const hasMultipleAnswers = Array.isArray(topLevelQRItemOrItems);
57
+ if (hasMultipleAnswers) {
58
+ return (
59
+ <GroupItemSwitcher
60
+ qItem={topLevelQItem}
61
+ qrItemOrItems={topLevelQRItemOrItems}
62
+ groupCardElevation={1}
63
+ onQrItemChange={onQrItemChange}
64
+ onQrRepeatGroupChange={onQrRepeatGroupChange}
65
+ />
66
+ );
67
+ }
68
+
69
+ // At this point, item only has one answer
70
+ const topLevelQRItem = topLevelQRItemOrItems;
71
+
43
72
  // If form is tabbed, it is rendered as a tabbed form
44
73
  if (itemContainsTabs || itemIsTabContainer) {
45
74
  if (isDesktop) {
@@ -46,7 +46,7 @@ const FormBodySingleTab = memo(function FormBodySingleTab(props: FormBodySingleT
46
46
  <>
47
47
  <ListItemButton
48
48
  selected={selected}
49
- sx={{ my: 0.2, minHeight: '36px' }}
49
+ sx={{ my: 0.15, minHeight: '36px' }}
50
50
  onClick={handleTabClick}>
51
51
  <ListItemText
52
52
  primary={
@@ -15,7 +15,7 @@
15
15
  * limitations under the License.
16
16
  */
17
17
 
18
- import React, { memo, useMemo } from 'react';
18
+ import React, { memo } from 'react';
19
19
  import Collapse from '@mui/material/Collapse';
20
20
  import { TransitionGroup } from 'react-transition-group';
21
21
  import { getShortText } from '../../utils/itemControl';
@@ -23,27 +23,24 @@ import type { QuestionnaireItem } from 'fhir/r4';
23
23
  import FormBodySingleTab from './FormBodySingleTab';
24
24
  import type { Tabs } from '../../interfaces/tab.interface';
25
25
  import useQuestionnaireStore from '../../stores/useQuestionnaireStore';
26
- import { getContextDisplays, isTabHidden } from '../../utils/tabs';
26
+ import { isTabHidden } from '../../utils/tabs';
27
27
 
28
28
  interface FormBodyTabListProps {
29
29
  topLevelItems: QuestionnaireItem[];
30
30
  currentTabIndex: number;
31
31
  tabs: Tabs;
32
32
  completedTabsCollapsed: boolean;
33
+ allContextDisplayItems: QuestionnaireItem[][];
33
34
  }
34
35
 
35
36
  const FormBodyTabList = memo(function FormBodyTabList(props: FormBodyTabListProps) {
36
- const { topLevelItems, currentTabIndex, tabs, completedTabsCollapsed } = props;
37
+ const { topLevelItems, currentTabIndex, tabs, completedTabsCollapsed, allContextDisplayItems } =
38
+ props;
37
39
 
38
40
  const enableWhenIsActivated = useQuestionnaireStore((state) => state.enableWhenIsActivated);
39
41
  const enableWhenItems = useQuestionnaireStore((state) => state.enableWhenItems);
40
42
  const enableWhenExpressions = useQuestionnaireStore((state) => state.enableWhenExpressions);
41
43
 
42
- const allContextDisplayItems = useMemo(
43
- () => topLevelItems.map((topLevelItem) => getContextDisplays(topLevelItem)),
44
- [topLevelItems]
45
- );
46
-
47
44
  return (
48
45
  <TransitionGroup>
49
46
  {topLevelItems.map((qItem, i) => {
@@ -21,15 +21,13 @@ import Card from '@mui/material/Card';
21
21
  import { PrimarySelectableList } from '../Lists.styles';
22
22
  import type { QuestionnaireItem } from 'fhir/r4';
23
23
  import type { Tabs } from '../../interfaces/tab.interface';
24
- import { IconButton } from '@mui/material';
25
- import ExpandLess from '@mui/icons-material/ExpandLess';
26
- import ExpandMore from '@mui/icons-material/ExpandMore';
27
- import Typography from '@mui/material/Typography';
28
24
  import Divider from '@mui/material/Divider';
29
25
  import FormBodyTabList from './FormBodyTabList';
26
+ import ShowCompletedTabsSection from './ShowCompletedTabsSection';
27
+ import useContextDisplayItems from '../../hooks/useContextDisplayItems';
30
28
 
31
29
  interface FormBodyTabListWrapperProps {
32
- qFormItems: QuestionnaireItem[];
30
+ topLevelItems: QuestionnaireItem[];
33
31
  currentTabIndex: number;
34
32
  tabs: Tabs;
35
33
  }
@@ -37,39 +35,30 @@ interface FormBodyTabListWrapperProps {
37
35
  const FormBodyTabListWrapper = memo(function FormBodyTabListWrapper(
38
36
  props: FormBodyTabListWrapperProps
39
37
  ) {
40
- const { qFormItems, currentTabIndex, tabs } = props;
38
+ const { topLevelItems, currentTabIndex, tabs } = props;
41
39
 
42
40
  const [completedTabsExpanded, setCompletedTabsExpanded] = useState(true);
43
41
 
42
+ const { allContextDisplayItems, completedDisplayItemExists } =
43
+ useContextDisplayItems(topLevelItems);
44
+
44
45
  return (
45
46
  <Card sx={{ p: 0.75, mb: 2 }}>
46
47
  <Box sx={{ flexGrow: 1 }}>
47
48
  <PrimarySelectableList dense disablePadding sx={{ mb: 1 }} data-test="renderer-tab-list">
48
- <Box display="flex" justifyContent="center" alignItems="center" mx={2} columnGap={0.5}>
49
- <Typography
50
- variant="overline"
51
- fontSize={9}
52
- color={completedTabsExpanded ? 'text.secondary' : 'text.disabled'}>
53
- Completed tabs {completedTabsExpanded ? 'shown' : 'hidden'}
54
- </Typography>
55
- <IconButton
56
- size="small"
57
- onClick={() => {
58
- setCompletedTabsExpanded(!completedTabsExpanded);
59
- }}>
60
- {completedTabsExpanded ? (
61
- <ExpandLess fontSize="small" />
62
- ) : (
63
- <ExpandMore fontSize="small" />
64
- )}
65
- </IconButton>
66
- </Box>
49
+ {completedDisplayItemExists ? (
50
+ <ShowCompletedTabsSection
51
+ completedTabsExpanded={completedTabsExpanded}
52
+ setCompletedTabsExpanded={setCompletedTabsExpanded}
53
+ />
54
+ ) : null}
67
55
  <Divider sx={{ mx: 1 }} light />
68
56
  <FormBodyTabList
69
- topLevelItems={qFormItems}
57
+ topLevelItems={topLevelItems}
70
58
  currentTabIndex={currentTabIndex}
71
59
  tabs={tabs}
72
60
  completedTabsCollapsed={!completedTabsExpanded}
61
+ allContextDisplayItems={allContextDisplayItems}
73
62
  />
74
63
  </PrimarySelectableList>
75
64
  </Box>
@@ -0,0 +1,52 @@
1
+ /*
2
+ * Copyright 2023 Commonwealth Scientific and Industrial Research
3
+ * Organisation (CSIRO) ABN 41 687 119 230.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
18
+ import React from 'react';
19
+ import Box from '@mui/material/Box';
20
+ import Typography from '@mui/material/Typography';
21
+ import { IconButton } from '@mui/material';
22
+ import ExpandLess from '@mui/icons-material/ExpandLess';
23
+ import ExpandMore from '@mui/icons-material/ExpandMore';
24
+
25
+ interface ShowCompletedTabsSectionProps {
26
+ completedTabsExpanded: boolean;
27
+ setCompletedTabsExpanded: (newExpanded: boolean) => void;
28
+ }
29
+
30
+ function ShowCompletedTabsSection(props: ShowCompletedTabsSectionProps) {
31
+ const { completedTabsExpanded, setCompletedTabsExpanded } = props;
32
+
33
+ return (
34
+ <Box display="flex" justifyContent="center" alignItems="center" mx={2} columnGap={0.5}>
35
+ <Typography
36
+ variant="overline"
37
+ fontSize={9}
38
+ color={completedTabsExpanded ? 'text.secondary' : 'text.disabled'}>
39
+ Completed tabs {completedTabsExpanded ? 'shown' : 'hidden'}
40
+ </Typography>
41
+ <IconButton
42
+ size="small"
43
+ onClick={() => {
44
+ setCompletedTabsExpanded(!completedTabsExpanded);
45
+ }}>
46
+ {completedTabsExpanded ? <ExpandLess fontSize="small" /> : <ExpandMore fontSize="small" />}
47
+ </IconButton>
48
+ </Box>
49
+ );
50
+ }
51
+
52
+ export default ShowCompletedTabsSection;