@aehrc/smart-forms-renderer 0.8.0 → 0.8.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 (264) hide show
  1. package/lib/components/Alert.styles.d.ts +2 -7
  2. package/lib/components/Box.styles.d.ts +6 -21
  3. package/lib/components/FormComponents/BooleanItem/BooleanItem.d.ts +2 -2
  4. package/lib/components/FormComponents/BooleanItem/BooleanItem.js +5 -4
  5. package/lib/components/FormComponents/BooleanItem/BooleanItem.js.map +1 -1
  6. package/lib/components/FormComponents/ChoiceItems/ChoiceAutocompleteItem.d.ts +2 -2
  7. package/lib/components/FormComponents/ChoiceItems/ChoiceAutocompleteItem.js +6 -5
  8. package/lib/components/FormComponents/ChoiceItems/ChoiceAutocompleteItem.js.map +1 -1
  9. package/lib/components/FormComponents/ChoiceItems/ChoiceCheckboxAnswerOptionItem.d.ts +2 -2
  10. package/lib/components/FormComponents/ChoiceItems/ChoiceCheckboxAnswerOptionItem.js +7 -6
  11. package/lib/components/FormComponents/ChoiceItems/ChoiceCheckboxAnswerOptionItem.js.map +1 -1
  12. package/lib/components/FormComponents/ChoiceItems/ChoiceCheckboxAnswerValueSetItem.d.ts +2 -2
  13. package/lib/components/FormComponents/ChoiceItems/ChoiceCheckboxAnswerValueSetItem.js +7 -6
  14. package/lib/components/FormComponents/ChoiceItems/ChoiceCheckboxAnswerValueSetItem.js.map +1 -1
  15. package/lib/components/FormComponents/ChoiceItems/ChoiceItemSwitcher.d.ts +2 -1
  16. package/lib/components/FormComponents/ChoiceItems/ChoiceItemSwitcher.js +8 -8
  17. package/lib/components/FormComponents/ChoiceItems/ChoiceItemSwitcher.js.map +1 -1
  18. package/lib/components/FormComponents/ChoiceItems/ChoiceRadioAnswerOptionItem.d.ts +2 -2
  19. package/lib/components/FormComponents/ChoiceItems/ChoiceRadioAnswerOptionItem.js +6 -6
  20. package/lib/components/FormComponents/ChoiceItems/ChoiceRadioAnswerOptionItem.js.map +1 -1
  21. package/lib/components/FormComponents/ChoiceItems/ChoiceRadioAnswerValueSetItem.d.ts +2 -2
  22. package/lib/components/FormComponents/ChoiceItems/ChoiceRadioAnswerValueSetItem.js +6 -5
  23. package/lib/components/FormComponents/ChoiceItems/ChoiceRadioAnswerValueSetItem.js.map +1 -1
  24. package/lib/components/FormComponents/ChoiceItems/ChoiceSelectAnswerOptionFields.d.ts +1 -0
  25. package/lib/components/FormComponents/ChoiceItems/ChoiceSelectAnswerOptionFields.js +2 -2
  26. package/lib/components/FormComponents/ChoiceItems/ChoiceSelectAnswerOptionFields.js.map +1 -1
  27. package/lib/components/FormComponents/ChoiceItems/ChoiceSelectAnswerOptionItem.d.ts +2 -2
  28. package/lib/components/FormComponents/ChoiceItems/ChoiceSelectAnswerOptionItem.js +8 -7
  29. package/lib/components/FormComponents/ChoiceItems/ChoiceSelectAnswerOptionItem.js.map +1 -1
  30. package/lib/components/FormComponents/ChoiceItems/ChoiceSelectAnswerValueSetFields.d.ts +1 -0
  31. package/lib/components/FormComponents/ChoiceItems/ChoiceSelectAnswerValueSetFields.js +2 -2
  32. package/lib/components/FormComponents/ChoiceItems/ChoiceSelectAnswerValueSetFields.js.map +1 -1
  33. package/lib/components/FormComponents/ChoiceItems/ChoiceSelectAnswerValueSetItem.d.ts +2 -2
  34. package/lib/components/FormComponents/ChoiceItems/ChoiceSelectAnswerValueSetItem.js +8 -7
  35. package/lib/components/FormComponents/ChoiceItems/ChoiceSelectAnswerValueSetItem.js.map +1 -1
  36. package/lib/components/FormComponents/DateItem/DateItem.d.ts +2 -1
  37. package/lib/components/FormComponents/DateItem/DateItem.js +5 -4
  38. package/lib/components/FormComponents/DateItem/DateItem.js.map +1 -1
  39. package/lib/components/FormComponents/DateItem/DatePicker.d.ts +2 -0
  40. package/lib/components/FormComponents/DateItem/DatePicker.js +42 -0
  41. package/lib/components/FormComponents/DateItem/DatePicker.js.map +1 -0
  42. package/lib/components/FormComponents/DateItem/DatePickerField.d.ts +8 -0
  43. package/{src/components/FormComponents/Typography.styles.ts → lib/components/FormComponents/DateItem/DatePickerField.js} +8 -9
  44. package/lib/components/FormComponents/DateItem/DatePickerField.js.map +1 -0
  45. package/lib/components/FormComponents/DateTimeItem/DateTimeItem.d.ts +2 -2
  46. package/lib/components/FormComponents/DateTimeItem/DateTimeItem.js +5 -4
  47. package/lib/components/FormComponents/DateTimeItem/DateTimeItem.js.map +1 -1
  48. package/lib/components/FormComponents/DecimalItem/DecimalItem.d.ts +2 -2
  49. package/lib/components/FormComponents/DecimalItem/DecimalItem.js +5 -4
  50. package/lib/components/FormComponents/DecimalItem/DecimalItem.js.map +1 -1
  51. package/lib/components/FormComponents/DisplayItem/DisplayInstructions.d.ts +1 -0
  52. package/lib/components/FormComponents/DisplayItem/DisplayInstructions.js +2 -2
  53. package/lib/components/FormComponents/DisplayItem/DisplayInstructions.js.map +1 -1
  54. package/lib/components/FormComponents/DisplayItem/DisplayInstructions.styles.d.ts +2 -7
  55. package/lib/components/FormComponents/DisplayItem/DisplayItem.js +2 -2
  56. package/lib/components/FormComponents/DisplayItem/DisplayItem.js.map +1 -1
  57. package/lib/components/FormComponents/GridGroup/GridGroup.d.ts +2 -2
  58. package/lib/components/FormComponents/GridGroup/GridGroup.js +6 -4
  59. package/lib/components/FormComponents/GridGroup/GridGroup.js.map +1 -1
  60. package/lib/components/FormComponents/GridGroup/GridRow.d.ts +2 -1
  61. package/lib/components/FormComponents/GridGroup/GridRow.js +2 -2
  62. package/lib/components/FormComponents/GridGroup/GridRow.js.map +1 -1
  63. package/lib/components/FormComponents/GridGroup/GridTable.d.ts +2 -1
  64. package/lib/components/FormComponents/GridGroup/GridTable.js +2 -2
  65. package/lib/components/FormComponents/GridGroup/GridTable.js.map +1 -1
  66. package/lib/components/FormComponents/GroupItem/GroupHeading.d.ts +1 -0
  67. package/lib/components/FormComponents/GroupItem/GroupHeading.js +6 -5
  68. package/lib/components/FormComponents/GroupItem/GroupHeading.js.map +1 -1
  69. package/lib/components/FormComponents/GroupItem/GroupItem.d.ts +2 -3
  70. package/lib/components/FormComponents/GroupItem/GroupItem.js +5 -3
  71. package/lib/components/FormComponents/GroupItem/GroupItem.js.map +1 -1
  72. package/lib/components/FormComponents/GroupItem/GroupItem.styles.d.ts +2 -6
  73. package/lib/components/FormComponents/GroupItem/GroupItemSwitcher.d.ts +2 -2
  74. package/lib/components/FormComponents/GroupItem/GroupItemSwitcher.js +10 -10
  75. package/lib/components/FormComponents/GroupItem/GroupItemSwitcher.js.map +1 -1
  76. package/lib/components/FormComponents/IntegerItem/IntegerItem.d.ts +2 -2
  77. package/lib/components/FormComponents/IntegerItem/IntegerItem.js +5 -4
  78. package/lib/components/FormComponents/IntegerItem/IntegerItem.js.map +1 -1
  79. package/lib/components/FormComponents/Item.styles.d.ts +0 -4
  80. package/lib/components/FormComponents/Item.styles.js +0 -4
  81. package/lib/components/FormComponents/Item.styles.js.map +1 -1
  82. package/lib/components/FormComponents/ItemParts/ItemFieldGrid.d.ts +1 -0
  83. package/lib/components/FormComponents/ItemParts/ItemFieldGrid.js +3 -3
  84. package/lib/components/FormComponents/ItemParts/ItemFieldGrid.js.map +1 -1
  85. package/lib/components/FormComponents/ItemParts/ItemLabelText.d.ts +1 -0
  86. package/lib/components/FormComponents/ItemParts/ItemLabelText.js +4 -6
  87. package/lib/components/FormComponents/ItemParts/ItemLabelText.js.map +1 -1
  88. package/lib/components/FormComponents/ItemParts/ItemLabelWrapper.d.ts +1 -0
  89. package/lib/components/FormComponents/ItemParts/ItemLabelWrapper.js +2 -2
  90. package/lib/components/FormComponents/ItemParts/ItemLabelWrapper.js.map +1 -1
  91. package/lib/components/FormComponents/Lists.styles.d.ts +2 -9
  92. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceAutocompleteField.d.ts +3 -2
  93. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceAutocompleteField.js +2 -3
  94. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceAutocompleteField.js.map +1 -1
  95. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceAutocompleteItem.d.ts +2 -2
  96. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceAutocompleteItem.js +8 -7
  97. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceAutocompleteItem.js.map +1 -1
  98. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceCheckboxAnswerOptionItem.d.ts +2 -2
  99. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceCheckboxAnswerOptionItem.js +8 -7
  100. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceCheckboxAnswerOptionItem.js.map +1 -1
  101. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceItemSwitcher.d.ts +2 -2
  102. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceItemSwitcher.js +6 -6
  103. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceItemSwitcher.js.map +1 -1
  104. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceRadioAnswerOptionItem.d.ts +2 -2
  105. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceRadioAnswerOptionItem.js +7 -6
  106. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceRadioAnswerOptionItem.js.map +1 -1
  107. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerOptionField.d.ts +3 -2
  108. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerOptionField.js +2 -2
  109. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerOptionField.js.map +1 -1
  110. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerOptionItem.d.ts +2 -2
  111. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerOptionItem.js +7 -6
  112. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerOptionItem.js.map +1 -1
  113. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerValueSetField.d.ts +3 -2
  114. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerValueSetField.js +2 -2
  115. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerValueSetField.js.map +1 -1
  116. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerValueSetItem.d.ts +2 -2
  117. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerValueSetItem.js +8 -7
  118. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerValueSetItem.js.map +1 -1
  119. package/lib/components/FormComponents/RepeatGroup/AddItemButton.d.ts +1 -0
  120. package/lib/components/FormComponents/RepeatGroup/AddItemButton.js +2 -2
  121. package/lib/components/FormComponents/RepeatGroup/AddItemButton.js.map +1 -1
  122. package/lib/components/FormComponents/RepeatGroup/DeleteItemButton.d.ts +1 -0
  123. package/lib/components/FormComponents/RepeatGroup/DeleteItemButton.js +2 -2
  124. package/lib/components/FormComponents/RepeatGroup/DeleteItemButton.js.map +1 -1
  125. package/lib/components/FormComponents/RepeatGroup/RepeatGroup.d.ts +2 -2
  126. package/lib/components/FormComponents/RepeatGroup/RepeatGroup.js +8 -6
  127. package/lib/components/FormComponents/RepeatGroup/RepeatGroup.js.map +1 -1
  128. package/lib/components/FormComponents/RepeatGroup/RepeatGroupItem.d.ts +2 -2
  129. package/lib/components/FormComponents/RepeatGroup/RepeatGroupItem.js +5 -3
  130. package/lib/components/FormComponents/RepeatGroup/RepeatGroupItem.js.map +1 -1
  131. package/lib/components/FormComponents/RepeatItem/AddItemButton.d.ts +1 -0
  132. package/lib/components/FormComponents/RepeatItem/AddItemButton.js +2 -2
  133. package/lib/components/FormComponents/RepeatItem/AddItemButton.js.map +1 -1
  134. package/lib/components/FormComponents/RepeatItem/DeleteItemButton.d.ts +1 -0
  135. package/lib/components/FormComponents/RepeatItem/DeleteItemButton.js +2 -2
  136. package/lib/components/FormComponents/RepeatItem/DeleteItemButton.js.map +1 -1
  137. package/lib/components/FormComponents/RepeatItem/RepeatField.d.ts +2 -2
  138. package/lib/components/FormComponents/RepeatItem/RepeatField.js +5 -3
  139. package/lib/components/FormComponents/RepeatItem/RepeatField.js.map +1 -1
  140. package/lib/components/FormComponents/RepeatItem/RepeatItem.d.ts +2 -2
  141. package/lib/components/FormComponents/RepeatItem/RepeatItem.js +6 -5
  142. package/lib/components/FormComponents/RepeatItem/RepeatItem.js.map +1 -1
  143. package/lib/components/FormComponents/RepeatItem/RepeatItem.styles.d.ts +4 -18
  144. package/lib/components/FormComponents/SingleItem/SingleItem.d.ts +2 -2
  145. package/lib/components/FormComponents/SingleItem/SingleItem.js +4 -2
  146. package/lib/components/FormComponents/SingleItem/SingleItem.js.map +1 -1
  147. package/lib/components/FormComponents/SingleItem/SingleItemSwitcher.d.ts +2 -2
  148. package/lib/components/FormComponents/SingleItem/SingleItemSwitcher.js +12 -12
  149. package/lib/components/FormComponents/SingleItem/SingleItemSwitcher.js.map +1 -1
  150. package/lib/components/FormComponents/StringItem/StringItem.d.ts +2 -2
  151. package/lib/components/FormComponents/StringItem/StringItem.js +5 -4
  152. package/lib/components/FormComponents/StringItem/StringItem.js.map +1 -1
  153. package/lib/components/FormComponents/Tables/AddRowButton.d.ts +1 -0
  154. package/lib/components/FormComponents/Tables/AddRowButton.js +2 -2
  155. package/lib/components/FormComponents/Tables/AddRowButton.js.map +1 -1
  156. package/lib/components/FormComponents/Tables/DeleteRowButton.d.ts +1 -0
  157. package/lib/components/FormComponents/Tables/DeleteRowButton.js +2 -2
  158. package/lib/components/FormComponents/Tables/DeleteRowButton.js.map +1 -1
  159. package/lib/components/FormComponents/Tables/GroupTable.d.ts +2 -2
  160. package/lib/components/FormComponents/Tables/GroupTable.js +8 -6
  161. package/lib/components/FormComponents/Tables/GroupTable.js.map +1 -1
  162. package/lib/components/FormComponents/Tables/GroupTableRow.d.ts +2 -1
  163. package/lib/components/FormComponents/Tables/GroupTableRow.js +2 -2
  164. package/lib/components/FormComponents/Tables/GroupTableRow.js.map +1 -1
  165. package/lib/components/FormComponents/Tables/QItemGroupTable.js +5 -7
  166. package/lib/components/FormComponents/Tables/QItemGroupTable.js.map +1 -1
  167. package/lib/components/FormComponents/Tables/QItemGroupTableRow.js +2 -2
  168. package/lib/components/FormComponents/Tables/QItemGroupTableRow.js.map +1 -1
  169. package/lib/components/FormComponents/TextItem/TextItem.d.ts +2 -2
  170. package/lib/components/FormComponents/TextItem/TextItem.js +5 -4
  171. package/lib/components/FormComponents/TextItem/TextItem.js.map +1 -1
  172. package/lib/components/FormComponents/TimeItem/TimeItem.d.ts +2 -2
  173. package/lib/components/FormComponents/TimeItem/TimeItem.js +5 -4
  174. package/lib/components/FormComponents/TimeItem/TimeItem.js.map +1 -1
  175. package/lib/components/FormComponents/UrlItem/UrlItem.d.ts +2 -2
  176. package/lib/components/FormComponents/UrlItem/UrlItem.js +5 -4
  177. package/lib/components/FormComponents/UrlItem/UrlItem.js.map +1 -1
  178. package/lib/components/Lists.styles.d.ts +2 -9
  179. package/lib/components/Renderer/FormTopLevelItem.js +7 -5
  180. package/lib/components/Renderer/FormTopLevelItem.js.map +1 -1
  181. package/lib/components/Tabs/FormBodySingleTab.js +1 -1
  182. package/lib/components/Tabs/FormBodySingleTab.js.map +1 -1
  183. package/lib/components/Tabs/ShowCompletedTabsSection.js +1 -1
  184. package/lib/components/Tabs/ShowCompletedTabsSection.js.map +1 -1
  185. package/lib/hooks/useMinimalStringCalculatedExpression.d.ts +11 -0
  186. package/lib/hooks/useMinimalStringCalculatedExpression.js +37 -0
  187. package/lib/hooks/useMinimalStringCalculatedExpression.js.map +1 -0
  188. package/lib/hooks/useReadOnly.d.ts +3 -0
  189. package/lib/hooks/useReadOnly.js +26 -0
  190. package/lib/hooks/useReadOnly.js.map +1 -0
  191. package/lib/interfaces/calculatedExpression.interface.d.ts +1 -1
  192. package/lib/interfaces/renderProps.interface.d.ts +3 -0
  193. package/lib/theme/overrides/Typography.d.ts +13 -0
  194. package/lib/theme/overrides/Typography.js +31 -0
  195. package/lib/theme/overrides/Typography.js.map +1 -0
  196. package/lib/theme/typography.d.ts +0 -2
  197. package/lib/theme/typography.js +3 -5
  198. package/lib/theme/typography.js.map +1 -1
  199. package/lib/utils/calculatedExpression.d.ts +12 -0
  200. package/lib/utils/calculatedExpression.js +54 -8
  201. package/lib/utils/calculatedExpression.js.map +1 -1
  202. package/package.json +12 -12
  203. package/src/components/FormComponents/BooleanItem/BooleanItem.tsx +8 -5
  204. package/src/components/FormComponents/ChoiceItems/ChoiceAutocompleteItem.tsx +9 -6
  205. package/src/components/FormComponents/ChoiceItems/ChoiceCheckboxAnswerOptionItem.tsx +18 -7
  206. package/src/components/FormComponents/ChoiceItems/ChoiceCheckboxAnswerValueSetItem.tsx +18 -7
  207. package/src/components/FormComponents/ChoiceItems/ChoiceItemSwitcher.tsx +17 -7
  208. package/src/components/FormComponents/ChoiceItems/ChoiceRadioAnswerOptionItem.tsx +9 -8
  209. package/src/components/FormComponents/ChoiceItems/ChoiceRadioAnswerValueSetItem.tsx +10 -7
  210. package/src/components/FormComponents/ChoiceItems/ChoiceSelectAnswerOptionFields.tsx +3 -2
  211. package/src/components/FormComponents/ChoiceItems/ChoiceSelectAnswerOptionItem.tsx +14 -9
  212. package/src/components/FormComponents/ChoiceItems/ChoiceSelectAnswerValueSetFields.tsx +3 -2
  213. package/src/components/FormComponents/ChoiceItems/ChoiceSelectAnswerValueSetItem.tsx +12 -7
  214. package/src/components/FormComponents/DateItem/DateItem.tsx +8 -6
  215. package/src/components/FormComponents/DateTimeItem/DateTimeItem.tsx +8 -6
  216. package/src/components/FormComponents/DecimalItem/DecimalItem.tsx +7 -5
  217. package/src/components/FormComponents/DisplayItem/DisplayInstructions.tsx +6 -2
  218. package/src/components/FormComponents/DisplayItem/DisplayItem.tsx +2 -2
  219. package/src/components/FormComponents/GridGroup/GridGroup.tsx +13 -5
  220. package/src/components/FormComponents/GridGroup/GridRow.tsx +6 -2
  221. package/src/components/FormComponents/GridGroup/GridTable.tsx +6 -2
  222. package/src/components/FormComponents/GroupItem/GroupHeading.tsx +12 -6
  223. package/src/components/FormComponents/GroupItem/GroupItem.tsx +8 -2
  224. package/src/components/FormComponents/GroupItem/GroupItemSwitcher.tsx +27 -4
  225. package/src/components/FormComponents/IntegerItem/IntegerItem.tsx +7 -5
  226. package/src/components/FormComponents/Item.styles.ts +0 -5
  227. package/src/components/FormComponents/ItemParts/ItemFieldGrid.tsx +4 -3
  228. package/src/components/FormComponents/ItemParts/ItemLabelText.tsx +10 -5
  229. package/src/components/FormComponents/ItemParts/ItemLabelWrapper.tsx +3 -2
  230. package/src/components/FormComponents/OpenChoiceItems/OpenChoiceAutocompleteField.tsx +10 -4
  231. package/src/components/FormComponents/OpenChoiceItems/OpenChoiceAutocompleteItem.tsx +13 -7
  232. package/src/components/FormComponents/OpenChoiceItems/OpenChoiceCheckboxAnswerOptionItem.tsx +20 -9
  233. package/src/components/FormComponents/OpenChoiceItems/OpenChoiceItemSwitcher.tsx +11 -2
  234. package/src/components/FormComponents/OpenChoiceItems/OpenChoiceRadioAnswerOptionItem.tsx +11 -8
  235. package/src/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerOptionField.tsx +10 -4
  236. package/src/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerOptionItem.tsx +10 -5
  237. package/src/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerValueSetField.tsx +10 -4
  238. package/src/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerValueSetItem.tsx +12 -7
  239. package/src/components/FormComponents/RepeatGroup/AddItemButton.tsx +3 -2
  240. package/src/components/FormComponents/RepeatGroup/DeleteItemButton.tsx +3 -2
  241. package/src/components/FormComponents/RepeatGroup/RepeatGroup.tsx +17 -9
  242. package/src/components/FormComponents/RepeatGroup/RepeatGroupItem.tsx +13 -2
  243. package/src/components/FormComponents/RepeatItem/AddItemButton.tsx +3 -2
  244. package/src/components/FormComponents/RepeatItem/DeleteItemButton.tsx +3 -2
  245. package/src/components/FormComponents/RepeatItem/RepeatField.tsx +21 -3
  246. package/src/components/FormComponents/RepeatItem/RepeatItem.tsx +13 -6
  247. package/src/components/FormComponents/SingleItem/SingleItem.tsx +8 -2
  248. package/src/components/FormComponents/SingleItem/SingleItemSwitcher.tsx +16 -2
  249. package/src/components/FormComponents/StringItem/StringItem.tsx +7 -5
  250. package/src/components/FormComponents/Tables/AddRowButton.tsx +3 -2
  251. package/src/components/FormComponents/Tables/DeleteRowButton.tsx +3 -2
  252. package/src/components/FormComponents/Tables/GroupTable.tsx +17 -6
  253. package/src/components/FormComponents/Tables/GroupTableRow.tsx +6 -2
  254. package/src/components/FormComponents/TextItem/TextItem.tsx +7 -5
  255. package/src/components/FormComponents/TimeItem/TimeItem.tsx +8 -6
  256. package/src/components/FormComponents/UrlItem/UrlItem.tsx +7 -5
  257. package/src/components/Renderer/FormTopLevelItem.tsx +9 -4
  258. package/src/components/Tabs/FormBodySingleTab.tsx +1 -1
  259. package/src/components/Tabs/ShowCompletedTabsSection.tsx +1 -1
  260. package/src/hooks/useReadOnly.ts +30 -0
  261. package/src/interfaces/calculatedExpression.interface.ts +1 -1
  262. package/src/interfaces/renderProps.interface.ts +4 -0
  263. package/src/theme/typography.ts +3 -5
  264. package/src/utils/calculatedExpression.ts +68 -12
@@ -2,22 +2,28 @@ import React from 'react';
2
2
  import Autocomplete from '@mui/material/Autocomplete';
3
3
  import { StandardTextField } from '../Textfield.styles';
4
4
  import Typography from '@mui/material/Typography';
5
- import type { PropsWithIsTabledAttribute } from '../../../interfaces/renderProps.interface';
5
+ import type {
6
+ PropsWithIsTabledAttribute,
7
+ PropsWithParentIsReadOnlyAttribute
8
+ } from '../../../interfaces/renderProps.interface';
6
9
  import type { Coding, QuestionnaireItem } from 'fhir/r4';
7
10
  import useRenderingExtensions from '../../../hooks/useRenderingExtensions';
8
11
 
9
- interface OpenChoiceSelectAnswerValueSetFieldProps extends PropsWithIsTabledAttribute {
12
+ interface OpenChoiceSelectAnswerValueSetFieldProps
13
+ extends PropsWithIsTabledAttribute,
14
+ PropsWithParentIsReadOnlyAttribute {
10
15
  qItem: QuestionnaireItem;
11
16
  options: Coding[];
12
17
  valueSelect: Coding | null;
13
18
  serverError: Error | null;
19
+ readOnly: boolean;
14
20
  onValueChange: (newValue: Coding | string | null) => void;
15
21
  }
16
22
 
17
23
  function OpenChoiceSelectAnswerValueSetField(props: OpenChoiceSelectAnswerValueSetFieldProps) {
18
- const { qItem, options, valueSelect, serverError, isTabled, onValueChange } = props;
24
+ const { qItem, options, valueSelect, serverError, readOnly, isTabled, onValueChange } = props;
19
25
 
20
- const { displayUnit, displayPrompt, readOnly, entryFormat } = useRenderingExtensions(qItem);
26
+ const { displayUnit, displayPrompt, entryFormat } = useRenderingExtensions(qItem);
21
27
 
22
28
  return (
23
29
  <>
@@ -25,22 +25,28 @@ import useRenderingExtensions from '../../../hooks/useRenderingExtensions';
25
25
  import type {
26
26
  PropsWithIsRepeatedAttribute,
27
27
  PropsWithIsTabledAttribute,
28
+ PropsWithParentIsReadOnlyAttribute,
28
29
  PropsWithQrItemChangeHandler
29
30
  } from '../../../interfaces/renderProps.interface';
30
31
  import DisplayInstructions from '../DisplayItem/DisplayInstructions';
31
32
  import LabelWrapper from '../ItemParts/ItemLabelWrapper';
32
33
  import OpenChoiceSelectAnswerValueSetField from './OpenChoiceSelectAnswerValueSetField';
34
+ import useReadOnly from '../../../hooks/useReadOnly';
33
35
 
34
36
  interface OpenChoiceSelectAnswerValueSetItemProps
35
37
  extends PropsWithQrItemChangeHandler<QuestionnaireResponseItem>,
36
38
  PropsWithIsRepeatedAttribute,
37
- PropsWithIsTabledAttribute {
39
+ PropsWithIsTabledAttribute,
40
+ PropsWithParentIsReadOnlyAttribute {
38
41
  qItem: QuestionnaireItem;
39
42
  qrItem: QuestionnaireResponseItem;
40
43
  }
41
44
 
42
45
  function OpenChoiceSelectAnswerValueSetItem(props: OpenChoiceSelectAnswerValueSetItemProps) {
43
- const { qItem, qrItem, isRepeated, isTabled, onQrItemChange } = props;
46
+ const { qItem, qrItem, isRepeated, isTabled, parentIsReadOnly, onQrItemChange } = props;
47
+
48
+ const readOnly = useReadOnly(qItem, parentIsReadOnly);
49
+ const { displayInstructions } = useRenderingExtensions(qItem);
44
50
 
45
51
  // Init input value
46
52
  const qrOpenChoice = qrItem ?? createEmptyQrItem(qItem);
@@ -52,9 +58,6 @@ function OpenChoiceSelectAnswerValueSetItem(props: OpenChoiceSelectAnswerValueSe
52
58
  // Get codings/options from valueSet
53
59
  const { codings, serverError } = useValueSetCodings(qItem);
54
60
 
55
- // Get additional rendering extensions
56
- const { displayInstructions } = useRenderingExtensions(qItem);
57
-
58
61
  // Event handlers
59
62
  function handleValueChange(newValue: Coding | string | null) {
60
63
  if (newValue) {
@@ -82,6 +85,7 @@ function OpenChoiceSelectAnswerValueSetItem(props: OpenChoiceSelectAnswerValueSe
82
85
  valueSelect={valueSelect}
83
86
  serverError={serverError}
84
87
  isTabled={isTabled}
88
+ readOnly={readOnly}
85
89
  onValueChange={handleValueChange}
86
90
  />
87
91
  );
@@ -91,7 +95,7 @@ function OpenChoiceSelectAnswerValueSetItem(props: OpenChoiceSelectAnswerValueSe
91
95
  <FullWidthFormComponentBox>
92
96
  <Grid container columnSpacing={6}>
93
97
  <Grid item xs={5}>
94
- <LabelWrapper qItem={qItem} />
98
+ <LabelWrapper qItem={qItem} readOnly={readOnly} />
95
99
  </Grid>
96
100
  <Grid item xs={7}>
97
101
  <OpenChoiceSelectAnswerValueSetField
@@ -100,9 +104,10 @@ function OpenChoiceSelectAnswerValueSetItem(props: OpenChoiceSelectAnswerValueSe
100
104
  valueSelect={valueSelect}
101
105
  serverError={serverError}
102
106
  isTabled={isTabled}
107
+ readOnly={readOnly}
103
108
  onValueChange={handleValueChange}
104
109
  />
105
- <DisplayInstructions displayInstructions={displayInstructions} />
110
+ <DisplayInstructions displayInstructions={displayInstructions} readOnly={readOnly} />
106
111
  </Grid>
107
112
  </Grid>
108
113
  </FullWidthFormComponentBox>
@@ -23,13 +23,14 @@ import type { RepeatGroupSingle } from '../../../interfaces/repeatGroup.interfac
23
23
 
24
24
  interface AddItemButtonProps {
25
25
  repeatGroups: RepeatGroupSingle[];
26
+ readOnly: boolean;
26
27
  onAddItem: () => void;
27
28
  }
28
29
 
29
30
  function AddItemButton(props: AddItemButtonProps) {
30
- const { repeatGroups, onAddItem } = props;
31
+ const { repeatGroups, readOnly, onAddItem } = props;
31
32
 
32
- const isDisabled = repeatGroups[repeatGroups.length - 1].qrItem === null;
33
+ const isDisabled = repeatGroups[repeatGroups.length - 1].qrItem === null || readOnly;
33
34
 
34
35
  return (
35
36
  <Box display="flex" flexDirection="row-reverse">
@@ -24,13 +24,14 @@ import type { QuestionnaireResponseItem } from 'fhir/r4';
24
24
  interface DeleteItemButtonProps {
25
25
  nullableQrItem: QuestionnaireResponseItem | null;
26
26
  numOfRepeatGroups: number;
27
+ readOnly: boolean;
27
28
  onDeleteItem: () => void;
28
29
  }
29
30
 
30
31
  function DeleteItemButton(props: DeleteItemButtonProps) {
31
- const { nullableQrItem, numOfRepeatGroups, onDeleteItem } = props;
32
+ const { nullableQrItem, numOfRepeatGroups, readOnly, onDeleteItem } = props;
32
33
 
33
- const isDisabled = nullableQrItem === null || numOfRepeatGroups === 1;
34
+ const isDisabled = nullableQrItem === null || numOfRepeatGroups === 1 || readOnly;
34
35
 
35
36
  return (
36
37
  <RepeatDeleteTooltip className="repeat-group-delete" title="Delete item">
@@ -16,15 +16,16 @@
16
16
  */
17
17
 
18
18
  import React, { useState } from 'react';
19
- import type { PropsWithQrRepeatGroupChangeHandler } from '../../../interfaces/renderProps.interface';
19
+ import type {
20
+ PropsWithParentIsReadOnlyAttribute,
21
+ PropsWithQrRepeatGroupChangeHandler
22
+ } from '../../../interfaces/renderProps.interface';
20
23
  import type { QuestionnaireItem, QuestionnaireResponseItem } from 'fhir/r4';
21
24
  import useInitialiseRepeatGroups from '../../../hooks/useInitialiseRepeatGroups';
22
25
  import { QGroupContainerBox } from '../../Box.styles';
23
26
  import Card from '@mui/material/Card';
24
27
  import Collapse from '@mui/material/Collapse';
25
28
  import Divider from '@mui/material/Divider';
26
-
27
- import { QGroupHeadingTypography } from '../Typography.styles';
28
29
  import { TransitionGroup } from 'react-transition-group';
29
30
  import { createEmptyQrItem } from '../../../utils/qrItem';
30
31
  import { nanoid } from 'nanoid';
@@ -32,15 +33,21 @@ import RepeatGroupItem from './RepeatGroupItem';
32
33
  import AddItemButton from './AddItemButton';
33
34
  import LabelWrapper from '../ItemParts/ItemLabelWrapper';
34
35
  import cloneDeep from 'lodash.clonedeep';
36
+ import useReadOnly from '../../../hooks/useReadOnly';
37
+ import Typography from '@mui/material/Typography';
35
38
 
36
- interface RepeatGroupProps extends PropsWithQrRepeatGroupChangeHandler {
39
+ interface RepeatGroupProps
40
+ extends PropsWithQrRepeatGroupChangeHandler,
41
+ PropsWithParentIsReadOnlyAttribute {
37
42
  qItem: QuestionnaireItem;
38
43
  qrItems: QuestionnaireResponseItem[];
39
44
  groupCardElevation: number;
40
45
  }
41
46
 
42
47
  function RepeatGroup(props: RepeatGroupProps) {
43
- const { qItem, qrItems, groupCardElevation, onQrRepeatGroupChange } = props;
48
+ const { qItem, qrItems, groupCardElevation, parentIsReadOnly, onQrRepeatGroupChange } = props;
49
+
50
+ const readOnly = useReadOnly(qItem, parentIsReadOnly);
44
51
 
45
52
  const initialRepeatGroups = useInitialiseRepeatGroups(qItem, qrItems);
46
53
 
@@ -93,9 +100,9 @@ function RepeatGroup(props: RepeatGroupProps) {
93
100
  return (
94
101
  <QGroupContainerBox key={qItem.linkId} cardElevation={groupCardElevation} isRepeated={true}>
95
102
  <Card elevation={groupCardElevation} sx={{ p: 3, py: 2.5, mb: 3.5 }}>
96
- <QGroupHeadingTypography variant="h6">
97
- <LabelWrapper qItem={qItem} />
98
- </QGroupHeadingTypography>
103
+ <Typography variant="h6" color={readOnly ? 'text.secondary' : 'text.primary'}>
104
+ <LabelWrapper qItem={qItem} readOnly={readOnly} />
105
+ </Typography>
99
106
  <Divider sx={{ mt: 1, mb: 1.5 }} light />
100
107
  <TransitionGroup>
101
108
  {repeatGroups.map(({ nanoId, qrItem: nullableQrItem }, index) => {
@@ -112,6 +119,7 @@ function RepeatGroup(props: RepeatGroupProps) {
112
119
  nullableQrItem={nullableQrItem}
113
120
  numOfRepeatGroups={repeatGroups.length}
114
121
  groupCardElevation={groupCardElevation + 1}
122
+ parentIsReadOnly={parentIsReadOnly}
115
123
  onDeleteItem={() => handleDeleteItem(index)}
116
124
  onQrItemChange={(newQrItem) => handleAnswerChange(newQrItem, index)}
117
125
  />
@@ -120,7 +128,7 @@ function RepeatGroup(props: RepeatGroupProps) {
120
128
  })}
121
129
  </TransitionGroup>
122
130
 
123
- <AddItemButton repeatGroups={repeatGroups} onAddItem={handleAddItem} />
131
+ <AddItemButton repeatGroups={repeatGroups} readOnly={readOnly} onAddItem={handleAddItem} />
124
132
  </Card>
125
133
  </QGroupContainerBox>
126
134
  );
@@ -19,11 +19,17 @@ import React from 'react';
19
19
  import { RepeatGroupContainerStack } from '../RepeatItem/RepeatItem.styles';
20
20
  import Box from '@mui/material/Box';
21
21
  import GroupItem from '../GroupItem/GroupItem';
22
- import type { PropsWithQrItemChangeHandler } from '../../../interfaces/renderProps.interface';
22
+ import type {
23
+ PropsWithParentIsReadOnlyAttribute,
24
+ PropsWithQrItemChangeHandler
25
+ } from '../../../interfaces/renderProps.interface';
23
26
  import type { QuestionnaireItem, QuestionnaireResponseItem } from 'fhir/r4';
24
27
  import DeleteItemButton from './DeleteItemButton';
28
+ import useReadOnly from '../../../hooks/useReadOnly';
25
29
 
26
- interface RepeatGroupItemProps extends PropsWithQrItemChangeHandler<QuestionnaireResponseItem> {
30
+ interface RepeatGroupItemProps
31
+ extends PropsWithQrItemChangeHandler<QuestionnaireResponseItem>,
32
+ PropsWithParentIsReadOnlyAttribute {
27
33
  qItem: QuestionnaireItem;
28
34
  answeredQrItem: QuestionnaireResponseItem;
29
35
  nullableQrItem: QuestionnaireResponseItem | null;
@@ -39,10 +45,13 @@ function RepeatGroupItem(props: RepeatGroupItemProps) {
39
45
  nullableQrItem,
40
46
  numOfRepeatGroups,
41
47
  groupCardElevation,
48
+ parentIsReadOnly,
42
49
  onDeleteItem,
43
50
  onQrItemChange
44
51
  } = props;
45
52
 
53
+ const readOnly = useReadOnly(qItem, parentIsReadOnly);
54
+
46
55
  return (
47
56
  <RepeatGroupContainerStack direction="row" justifyContent="end">
48
57
  <Box sx={{ flexGrow: 1 }}>
@@ -50,6 +59,7 @@ function RepeatGroupItem(props: RepeatGroupItemProps) {
50
59
  qItem={qItem}
51
60
  qrItem={answeredQrItem}
52
61
  isRepeated={true}
62
+ parentIsReadOnly={parentIsReadOnly}
53
63
  groupCardElevation={groupCardElevation + 1}
54
64
  onQrItemChange={onQrItemChange}
55
65
  />
@@ -57,6 +67,7 @@ function RepeatGroupItem(props: RepeatGroupItemProps) {
57
67
  <DeleteItemButton
58
68
  nullableQrItem={nullableQrItem}
59
69
  numOfRepeatGroups={numOfRepeatGroups}
70
+ readOnly={readOnly}
60
71
  onDeleteItem={onDeleteItem}
61
72
  />
62
73
  </RepeatGroupContainerStack>
@@ -23,13 +23,14 @@ import type { RepeatAnswer } from '../../../interfaces/repeatItem.interface';
23
23
 
24
24
  interface AddItemButtonProps {
25
25
  repeatAnswers: RepeatAnswer[];
26
+ readOnly: boolean;
26
27
  onAddItem: () => void;
27
28
  }
28
29
 
29
30
  function AddItemButton(props: AddItemButtonProps) {
30
- const { repeatAnswers, onAddItem } = props;
31
+ const { repeatAnswers, readOnly, onAddItem } = props;
31
32
 
32
- const isDisabled = repeatAnswers[repeatAnswers.length - 1].answer === null;
33
+ const isDisabled = repeatAnswers[repeatAnswers.length - 1].answer === null || readOnly;
33
34
 
34
35
  return (
35
36
  <Box display="flex" flexDirection="row-reverse">
@@ -24,13 +24,14 @@ import type { QuestionnaireResponseItemAnswer } from 'fhir/r4';
24
24
  interface DeleteItemButtonProps {
25
25
  answer: QuestionnaireResponseItemAnswer | null;
26
26
  numOfRepeatAnswers: number;
27
+ readOnly: boolean;
27
28
  onDeleteAnswer: () => void;
28
29
  }
29
30
 
30
31
  function DeleteItemButton(props: DeleteItemButtonProps) {
31
- const { answer, numOfRepeatAnswers, onDeleteAnswer } = props;
32
+ const { answer, numOfRepeatAnswers, readOnly, onDeleteAnswer } = props;
32
33
 
33
- const isDisabled = answer === null || numOfRepeatAnswers === 1;
34
+ const isDisabled = answer === null || numOfRepeatAnswers === 1 || readOnly;
34
35
 
35
36
  return (
36
37
  <RepeatDeleteTooltip className="repeat-item-delete" title="Delete item">
@@ -24,10 +24,16 @@ import type {
24
24
  QuestionnaireResponseItem,
25
25
  QuestionnaireResponseItemAnswer
26
26
  } from 'fhir/r4';
27
- import type { PropsWithQrItemChangeHandler } from '../../../interfaces/renderProps.interface';
27
+ import type {
28
+ PropsWithParentIsReadOnlyAttribute,
29
+ PropsWithQrItemChangeHandler
30
+ } from '../../../interfaces/renderProps.interface';
28
31
  import DeleteItemButton from './DeleteItemButton';
32
+ import useReadOnly from '../../../hooks/useReadOnly';
29
33
 
30
- interface RepeatFieldProps extends PropsWithQrItemChangeHandler<QuestionnaireResponseItem> {
34
+ interface RepeatFieldProps
35
+ extends PropsWithQrItemChangeHandler<QuestionnaireResponseItem>,
36
+ PropsWithParentIsReadOnlyAttribute {
31
37
  qItem: QuestionnaireItem;
32
38
  qrItem: QuestionnaireResponseItem;
33
39
  answer: QuestionnaireResponseItemAnswer | null;
@@ -36,7 +42,17 @@ interface RepeatFieldProps extends PropsWithQrItemChangeHandler<QuestionnaireRes
36
42
  }
37
43
 
38
44
  function RepeatField(props: RepeatFieldProps) {
39
- const { qItem, qrItem, answer, numOfRepeatAnswers, onDeleteAnswer, onQrItemChange } = props;
45
+ const {
46
+ qItem,
47
+ qrItem,
48
+ answer,
49
+ numOfRepeatAnswers,
50
+ parentIsReadOnly,
51
+ onDeleteAnswer,
52
+ onQrItemChange
53
+ } = props;
54
+
55
+ const readOnly = useReadOnly(qItem, parentIsReadOnly);
40
56
 
41
57
  return (
42
58
  <RepeatItemContainerStack direction="row">
@@ -46,12 +62,14 @@ function RepeatField(props: RepeatFieldProps) {
46
62
  qrItem={qrItem}
47
63
  isRepeated={qItem.repeats ?? false}
48
64
  isTabled={false}
65
+ parentIsReadOnly={parentIsReadOnly}
49
66
  onQrItemChange={onQrItemChange}
50
67
  />
51
68
  </Box>
52
69
  <DeleteItemButton
53
70
  answer={answer}
54
71
  numOfRepeatAnswers={numOfRepeatAnswers}
72
+ readOnly={readOnly}
55
73
  onDeleteAnswer={onDeleteAnswer}
56
74
  />
57
75
  </RepeatItemContainerStack>
@@ -16,7 +16,10 @@
16
16
  */
17
17
 
18
18
  import React, { useState } from 'react';
19
- import type { PropsWithQrItemChangeHandler } from '../../../interfaces/renderProps.interface';
19
+ import type {
20
+ PropsWithParentIsReadOnlyAttribute,
21
+ PropsWithQrItemChangeHandler
22
+ } from '../../../interfaces/renderProps.interface';
20
23
  import type { QuestionnaireItem, QuestionnaireResponseItem } from 'fhir/r4';
21
24
  import { nanoid } from 'nanoid';
22
25
  import useRenderingExtensions from '../../../hooks/useRenderingExtensions';
@@ -28,16 +31,19 @@ import RepeatField from './RepeatField';
28
31
  import Collapse from '@mui/material/Collapse';
29
32
  import useInitialiseRepeatAnswers from '../../../hooks/useInitialiseRepeatAnswers';
30
33
  import ItemFieldGrid from '../ItemParts/ItemFieldGrid';
34
+ import useReadOnly from '../../../hooks/useReadOnly';
31
35
 
32
- interface RepeatItemProps extends PropsWithQrItemChangeHandler<QuestionnaireResponseItem> {
36
+ interface RepeatItemProps
37
+ extends PropsWithQrItemChangeHandler<QuestionnaireResponseItem>,
38
+ PropsWithParentIsReadOnlyAttribute {
33
39
  qItem: QuestionnaireItem;
34
40
  qrItem: QuestionnaireResponseItem;
35
41
  }
36
42
 
37
43
  function RepeatItem(props: RepeatItemProps) {
38
- const { qItem, qrItem, onQrItemChange } = props;
44
+ const { qItem, qrItem, parentIsReadOnly, onQrItemChange } = props;
39
45
 
40
- // Get additional rendering extensions
46
+ const readOnly = useReadOnly(qItem, parentIsReadOnly);
41
47
  const { displayInstructions } = useRenderingExtensions(qItem);
42
48
 
43
49
  const initialRepeatAnswers = useInitialiseRepeatAnswers(qItem, qrItem);
@@ -84,7 +90,7 @@ function RepeatItem(props: RepeatItemProps) {
84
90
 
85
91
  return (
86
92
  <FullWidthFormComponentBox data-test="q-item-repeat-box">
87
- <ItemFieldGrid qItem={qItem} displayInstructions={displayInstructions}>
93
+ <ItemFieldGrid qItem={qItem} displayInstructions={displayInstructions} readOnly={readOnly}>
88
94
  <TransitionGroup>
89
95
  {repeatAnswers.map(({ nanoId, answer }, index) => {
90
96
  const repeatAnswerQrItem = createEmptyQrItem(qItem);
@@ -99,6 +105,7 @@ function RepeatItem(props: RepeatItemProps) {
99
105
  qrItem={repeatAnswerQrItem}
100
106
  answer={answer}
101
107
  numOfRepeatAnswers={repeatAnswers.length}
108
+ parentIsReadOnly={parentIsReadOnly}
102
109
  onDeleteAnswer={() => handleDeleteItem(index)}
103
110
  onQrItemChange={(newQrItem) => handleAnswerChange(newQrItem, index)}
104
111
  />
@@ -108,7 +115,7 @@ function RepeatItem(props: RepeatItemProps) {
108
115
  </TransitionGroup>
109
116
  </ItemFieldGrid>
110
117
 
111
- <AddItemButton repeatAnswers={repeatAnswers} onAddItem={handleAddItem} />
118
+ <AddItemButton repeatAnswers={repeatAnswers} readOnly={readOnly} onAddItem={handleAddItem} />
112
119
  </FullWidthFormComponentBox>
113
120
  );
114
121
  }
@@ -20,24 +20,28 @@ import type { QuestionnaireItem, QuestionnaireResponseItem } from 'fhir/r4';
20
20
  import type {
21
21
  PropsWithIsRepeatedAttribute,
22
22
  PropsWithIsTabledAttribute,
23
+ PropsWithParentIsReadOnlyAttribute,
23
24
  PropsWithQrItemChangeHandler,
24
25
  PropsWithTextShownAttribute
25
26
  } from '../../../interfaces/renderProps.interface';
26
27
  import useQuestionnaireStore from '../../../stores/useQuestionnaireStore';
27
28
  import SingleItemSwitcher from './SingleItemSwitcher';
28
29
  import useHidden from '../../../hooks/useHidden';
30
+ import useReadOnly from '../../../hooks/useReadOnly';
29
31
 
30
32
  interface SingleItemProps
31
33
  extends PropsWithQrItemChangeHandler<QuestionnaireResponseItem>,
32
34
  PropsWithIsRepeatedAttribute,
33
35
  PropsWithIsTabledAttribute,
34
- PropsWithTextShownAttribute {
36
+ PropsWithTextShownAttribute,
37
+ PropsWithParentIsReadOnlyAttribute {
35
38
  qItem: QuestionnaireItem;
36
39
  qrItem: QuestionnaireResponseItem;
37
40
  }
38
41
 
39
42
  function SingleItem(props: SingleItemProps) {
40
- const { qItem, qrItem, isRepeated, isTabled, textShown, onQrItemChange } = props;
43
+ const { qItem, qrItem, isRepeated, isTabled, textShown, parentIsReadOnly, onQrItemChange } =
44
+ props;
41
45
 
42
46
  const updateEnableWhenItem = useQuestionnaireStore((state) => state.updateEnableWhenItem);
43
47
 
@@ -51,6 +55,7 @@ function SingleItem(props: SingleItemProps) {
51
55
  [updateEnableWhenItem, onQrItemChange, qItem.linkId]
52
56
  );
53
57
 
58
+ const readOnly = useReadOnly(qItem, parentIsReadOnly);
54
59
  const itemIsHidden = useHidden(qItem);
55
60
  if (itemIsHidden) {
56
61
  return null;
@@ -63,6 +68,7 @@ function SingleItem(props: SingleItemProps) {
63
68
  isRepeated={isRepeated}
64
69
  isTabled={isTabled}
65
70
  textShown={textShown}
71
+ parentIsReadOnly={readOnly}
66
72
  onQrItemChange={handleQrItemChange}
67
73
  />
68
74
  );
@@ -23,6 +23,7 @@ import Typography from '@mui/material/Typography';
23
23
  import type {
24
24
  PropsWithIsRepeatedAttribute,
25
25
  PropsWithIsTabledAttribute,
26
+ PropsWithParentIsReadOnlyAttribute,
26
27
  PropsWithQrItemChangeHandler,
27
28
  PropsWithTextShownAttribute
28
29
  } from '../../../interfaces/renderProps.interface';
@@ -41,13 +42,15 @@ interface SingleItemSwitcherProps
41
42
  extends PropsWithQrItemChangeHandler<QuestionnaireResponseItem>,
42
43
  PropsWithIsRepeatedAttribute,
43
44
  PropsWithIsTabledAttribute,
44
- PropsWithTextShownAttribute {
45
+ PropsWithTextShownAttribute,
46
+ PropsWithParentIsReadOnlyAttribute {
45
47
  qItem: QuestionnaireItem;
46
48
  qrItem: QuestionnaireResponseItem;
47
49
  }
48
50
 
49
51
  function SingleItemSwitcher(props: SingleItemSwitcherProps) {
50
- const { qItem, qrItem, isRepeated, isTabled, textShown, onQrItemChange } = props;
52
+ const { qItem, qrItem, isRepeated, isTabled, textShown, parentIsReadOnly, onQrItemChange } =
53
+ props;
51
54
 
52
55
  switch (qItem.type) {
53
56
  case 'string':
@@ -57,6 +60,7 @@ function SingleItemSwitcher(props: SingleItemSwitcherProps) {
57
60
  qrItem={qrItem}
58
61
  isRepeated={isRepeated}
59
62
  isTabled={isTabled}
63
+ parentIsReadOnly={parentIsReadOnly}
60
64
  onQrItemChange={onQrItemChange}
61
65
  />
62
66
  );
@@ -67,6 +71,7 @@ function SingleItemSwitcher(props: SingleItemSwitcherProps) {
67
71
  qrItem={qrItem}
68
72
  isRepeated={isRepeated}
69
73
  isTabled={isTabled}
74
+ parentIsReadOnly={parentIsReadOnly}
70
75
  onQrItemChange={onQrItemChange}
71
76
  />
72
77
  );
@@ -77,6 +82,7 @@ function SingleItemSwitcher(props: SingleItemSwitcherProps) {
77
82
  qrItem={qrItem}
78
83
  isRepeated={isRepeated}
79
84
  isTabled={isTabled}
85
+ parentIsReadOnly={parentIsReadOnly}
80
86
  onQrItemChange={onQrItemChange}
81
87
  />
82
88
  );
@@ -87,6 +93,7 @@ function SingleItemSwitcher(props: SingleItemSwitcherProps) {
87
93
  qrItem={qrItem}
88
94
  isRepeated={isRepeated}
89
95
  isTabled={isTabled}
96
+ parentIsReadOnly={parentIsReadOnly}
90
97
  onQrItemChange={onQrItemChange}
91
98
  />
92
99
  );
@@ -97,6 +104,7 @@ function SingleItemSwitcher(props: SingleItemSwitcherProps) {
97
104
  qrItem={qrItem}
98
105
  isRepeated={isRepeated}
99
106
  isTabled={isTabled}
107
+ parentIsReadOnly={parentIsReadOnly}
100
108
  onQrItemChange={onQrItemChange}
101
109
  />
102
110
  );
@@ -106,6 +114,7 @@ function SingleItemSwitcher(props: SingleItemSwitcherProps) {
106
114
  qItem={qItem}
107
115
  qrItem={qrItem}
108
116
  isRepeated={isRepeated}
117
+ parentIsReadOnly={parentIsReadOnly}
109
118
  onQrItemChange={onQrItemChange}
110
119
  />
111
120
  );
@@ -118,6 +127,7 @@ function SingleItemSwitcher(props: SingleItemSwitcherProps) {
118
127
  qrItem={qrItem}
119
128
  isRepeated={isRepeated}
120
129
  isTabled={isTabled}
130
+ parentIsReadOnly={parentIsReadOnly}
121
131
  onQrItemChange={onQrItemChange}
122
132
  />
123
133
  );
@@ -128,6 +138,7 @@ function SingleItemSwitcher(props: SingleItemSwitcherProps) {
128
138
  qrItem={qrItem}
129
139
  isRepeated={isRepeated}
130
140
  isTabled={isTabled}
141
+ parentIsReadOnly={parentIsReadOnly}
131
142
  onQrItemChange={onQrItemChange}
132
143
  />
133
144
  );
@@ -139,6 +150,7 @@ function SingleItemSwitcher(props: SingleItemSwitcherProps) {
139
150
  isRepeated={isRepeated}
140
151
  isTabled={isTabled}
141
152
  textShown={textShown}
153
+ parentIsReadOnly={parentIsReadOnly}
142
154
  onQrItemChange={onQrItemChange}
143
155
  />
144
156
  );
@@ -150,6 +162,7 @@ function SingleItemSwitcher(props: SingleItemSwitcherProps) {
150
162
  isRepeated={isRepeated}
151
163
  isTabled={isTabled}
152
164
  textShown={textShown}
165
+ parentIsReadOnly={parentIsReadOnly}
153
166
  onQrItemChange={onQrItemChange}
154
167
  />
155
168
  );
@@ -160,6 +173,7 @@ function SingleItemSwitcher(props: SingleItemSwitcherProps) {
160
173
  qrItem={qrItem}
161
174
  isRepeated={isRepeated}
162
175
  isTabled={isTabled}
176
+ parentIsReadOnly={parentIsReadOnly}
163
177
  onQrItemChange={onQrItemChange}
164
178
  />
165
179
  );
@@ -19,6 +19,7 @@ import React, { useCallback } from 'react';
19
19
  import type {
20
20
  PropsWithIsRepeatedAttribute,
21
21
  PropsWithIsTabledAttribute,
22
+ PropsWithParentIsReadOnlyAttribute,
22
23
  PropsWithQrItemChangeHandler
23
24
  } from '../../../interfaces/renderProps.interface';
24
25
  import type { QuestionnaireItem, QuestionnaireResponseItem } from 'fhir/r4';
@@ -32,23 +33,24 @@ import StringField from './StringField';
32
33
  import ItemFieldGrid from '../ItemParts/ItemFieldGrid';
33
34
  import useStringCalculatedExpression from '../../../hooks/useStringCalculatedExpression';
34
35
  import useStringInput from '../../../hooks/useStringInput';
36
+ import useReadOnly from '../../../hooks/useReadOnly';
35
37
 
36
38
  interface StringItemProps
37
39
  extends PropsWithQrItemChangeHandler<QuestionnaireResponseItem>,
38
40
  PropsWithIsRepeatedAttribute,
39
- PropsWithIsTabledAttribute {
41
+ PropsWithIsTabledAttribute,
42
+ PropsWithParentIsReadOnlyAttribute {
40
43
  qItem: QuestionnaireItem;
41
44
  qrItem: QuestionnaireResponseItem;
42
45
  }
43
46
  function StringItem(props: StringItemProps) {
44
- const { qItem, qrItem, isRepeated, isTabled, onQrItemChange } = props;
47
+ const { qItem, qrItem, isRepeated, isTabled, parentIsReadOnly, onQrItemChange } = props;
45
48
 
46
- // Get additional rendering extensions
49
+ const readOnly = useReadOnly(qItem, parentIsReadOnly);
47
50
  const {
48
51
  displayUnit,
49
52
  displayPrompt,
50
53
  displayInstructions,
51
- readOnly,
52
54
  entryFormat,
53
55
  regexValidation,
54
56
  maxLength
@@ -111,7 +113,7 @@ function StringItem(props: StringItemProps) {
111
113
  }
112
114
  return (
113
115
  <FullWidthFormComponentBox data-test="q-item-string-box">
114
- <ItemFieldGrid qItem={qItem} displayInstructions={displayInstructions}>
116
+ <ItemFieldGrid qItem={qItem} displayInstructions={displayInstructions} readOnly={readOnly}>
115
117
  <StringField
116
118
  linkId={qItem.linkId}
117
119
  input={input}
@@ -23,13 +23,14 @@ import type { RepeatGroupSingle } from '../../../interfaces/repeatGroup.interfac
23
23
 
24
24
  interface AddItemButtonProps {
25
25
  repeatGroups: RepeatGroupSingle[];
26
+ readOnly: boolean;
26
27
  onAddItem: () => void;
27
28
  }
28
29
 
29
30
  function AddRowButton(props: AddItemButtonProps) {
30
- const { repeatGroups, onAddItem } = props;
31
+ const { repeatGroups, readOnly, onAddItem } = props;
31
32
 
32
- const isDisabled = repeatGroups[repeatGroups.length - 1].qrItem === null;
33
+ const isDisabled = repeatGroups[repeatGroups.length - 1].qrItem === null || readOnly;
33
34
 
34
35
  return (
35
36
  <Box display="flex" flexDirection="row-reverse">
@@ -26,13 +26,14 @@ import type { QuestionnaireResponseItem } from 'fhir/r4';
26
26
  interface DeleteRowButtonProps {
27
27
  nullableQrItem: QuestionnaireResponseItem | null;
28
28
  numOfRows: number;
29
+ readOnly: boolean;
29
30
  onDeleteItem: () => void;
30
31
  }
31
32
 
32
33
  function DeleteRowButton(props: DeleteRowButtonProps) {
33
- const { nullableQrItem, numOfRows, onDeleteItem } = props;
34
+ const { nullableQrItem, numOfRows, readOnly, onDeleteItem } = props;
34
35
 
35
- const isDisabled = nullableQrItem === null || numOfRows === 1;
36
+ const isDisabled = nullableQrItem === null || numOfRows === 1 || readOnly;
36
37
  return (
37
38
  <DeleteButtonTableCell>
38
39
  <Tooltip title="Delete item">