@aehrc/smart-forms-renderer 1.2.11 → 1.2.13

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 (302) hide show
  1. package/lib/components/FormComponents/AttachmentItem/AttachmentItem.js +2 -2
  2. package/lib/components/FormComponents/AttachmentItem/AttachmentItem.js.map +1 -1
  3. package/lib/components/FormComponents/BooleanItem/BooleanItem.js +2 -2
  4. package/lib/components/FormComponents/BooleanItem/BooleanItem.js.map +1 -1
  5. package/lib/components/FormComponents/ChoiceItems/CheckboxOptionList.js +2 -1
  6. package/lib/components/FormComponents/ChoiceItems/CheckboxOptionList.js.map +1 -1
  7. package/lib/components/FormComponents/ChoiceItems/ChoiceAutocompleteField.d.ts +1 -0
  8. package/lib/components/FormComponents/ChoiceItems/ChoiceAutocompleteField.js +3 -2
  9. package/lib/components/FormComponents/ChoiceItems/ChoiceAutocompleteField.js.map +1 -1
  10. package/lib/components/FormComponents/ChoiceItems/ChoiceAutocompleteItem.js +5 -6
  11. package/lib/components/FormComponents/ChoiceItems/ChoiceAutocompleteItem.js.map +1 -1
  12. package/lib/components/FormComponents/ChoiceItems/ChoiceCheckboxAnswerOptionItem.js +2 -2
  13. package/lib/components/FormComponents/ChoiceItems/ChoiceCheckboxAnswerOptionItem.js.map +1 -1
  14. package/lib/components/FormComponents/ChoiceItems/ChoiceCheckboxAnswerValueSetItem.js +2 -2
  15. package/lib/components/FormComponents/ChoiceItems/ChoiceCheckboxAnswerValueSetItem.js.map +1 -1
  16. package/lib/components/FormComponents/ChoiceItems/ChoiceRadioAnswerOptionItem.js +2 -2
  17. package/lib/components/FormComponents/ChoiceItems/ChoiceRadioAnswerOptionItem.js.map +1 -1
  18. package/lib/components/FormComponents/ChoiceItems/ChoiceRadioAnswerValueSetItem.js +2 -2
  19. package/lib/components/FormComponents/ChoiceItems/ChoiceRadioAnswerValueSetItem.js.map +1 -1
  20. package/lib/components/FormComponents/ChoiceItems/ChoiceRadioSingle.d.ts +2 -1
  21. package/lib/components/FormComponents/ChoiceItems/ChoiceSelectAnswerOptionFields.js +61 -3
  22. package/lib/components/FormComponents/ChoiceItems/ChoiceSelectAnswerOptionFields.js.map +1 -1
  23. package/lib/components/FormComponents/ChoiceItems/ChoiceSelectAnswerOptionItem.js +2 -2
  24. package/lib/components/FormComponents/ChoiceItems/ChoiceSelectAnswerOptionItem.js.map +1 -1
  25. package/lib/components/FormComponents/ChoiceItems/ChoiceSelectAnswerValueSetFields.js +5 -2
  26. package/lib/components/FormComponents/ChoiceItems/ChoiceSelectAnswerValueSetFields.js.map +1 -1
  27. package/lib/components/FormComponents/ChoiceItems/ChoiceSelectAnswerValueSetItem.js +2 -2
  28. package/lib/components/FormComponents/ChoiceItems/ChoiceSelectAnswerValueSetItem.js.map +1 -1
  29. package/lib/components/FormComponents/DateTimeItems/CustomDateItem/CustomDateItem.js +2 -2
  30. package/lib/components/FormComponents/DateTimeItems/CustomDateItem/CustomDateItem.js.map +1 -1
  31. package/lib/components/FormComponents/DateTimeItems/CustomDateTimeItem/CustomDateTimeItem.js +2 -2
  32. package/lib/components/FormComponents/DateTimeItems/CustomDateTimeItem/CustomDateTimeItem.js.map +1 -1
  33. package/lib/components/FormComponents/DateTimeItems/CustomDateTimeItem/CustomTimeField.js +3 -3
  34. package/lib/components/FormComponents/DateTimeItems/CustomDateTimeItem/CustomTimeField.js.map +1 -1
  35. package/lib/components/FormComponents/DecimalItem/DecimalItem.js +2 -2
  36. package/lib/components/FormComponents/DecimalItem/DecimalItem.js.map +1 -1
  37. package/lib/components/FormComponents/GroupItem/GroupItemView.js +1 -1
  38. package/lib/components/FormComponents/GroupItem/GroupItemView.js.map +1 -1
  39. package/lib/components/FormComponents/IntegerItem/IntegerItem.js +2 -2
  40. package/lib/components/FormComponents/IntegerItem/IntegerItem.js.map +1 -1
  41. package/lib/components/FormComponents/ItemParts/CheckboxSingle.d.ts +3 -1
  42. package/lib/components/FormComponents/ItemParts/CheckboxSingle.js +2 -2
  43. package/lib/components/FormComponents/ItemParts/CheckboxSingle.js.map +1 -1
  44. package/lib/components/FormComponents/ItemParts/FadingCheckIcon.d.ts +7 -0
  45. package/lib/components/FormComponents/ItemParts/FadingCheckIcon.js +26 -0
  46. package/lib/components/FormComponents/ItemParts/FadingCheckIcon.js.map +1 -0
  47. package/lib/components/FormComponents/ItemParts/ItemLabel.js +1 -7
  48. package/lib/components/FormComponents/ItemParts/ItemLabel.js.map +1 -1
  49. package/lib/components/FormComponents/ItemParts/ItemLabelText.d.ts +8 -0
  50. package/lib/components/FormComponents/ItemParts/ItemLabelText.js +63 -0
  51. package/lib/components/FormComponents/ItemParts/ItemLabelText.js.map +1 -0
  52. package/lib/components/FormComponents/ItemParts/ItemLabelWrapper.d.ts +8 -0
  53. package/lib/components/FormComponents/ItemParts/ItemLabelWrapper.js +53 -0
  54. package/lib/components/FormComponents/ItemParts/ItemLabelWrapper.js.map +1 -0
  55. package/lib/components/FormComponents/ItemParts/ItemTextSwitcher copy.d.ts +7 -0
  56. package/lib/components/FormComponents/ItemParts/ItemTextSwitcher copy.js +39 -0
  57. package/lib/components/FormComponents/ItemParts/ItemTextSwitcher copy.js.map +1 -0
  58. package/lib/components/FormComponents/ItemParts/ItemTextSwitcher.js +3 -19
  59. package/lib/components/FormComponents/ItemParts/ItemTextSwitcher.js.map +1 -1
  60. package/lib/components/FormComponents/ItemParts/RadioOptionList.js +2 -1
  61. package/lib/components/FormComponents/ItemParts/RadioOptionList.js.map +1 -1
  62. package/lib/components/FormComponents/ItemParts/StyledText.d.ts +8 -0
  63. package/lib/components/FormComponents/ItemParts/StyledText.js +30 -0
  64. package/lib/components/FormComponents/ItemParts/StyledText.js.map +1 -0
  65. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceAutocompleteField.d.ts +1 -0
  66. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceAutocompleteField.js +3 -2
  67. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceAutocompleteField.js.map +1 -1
  68. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceAutocompleteItem.js +5 -5
  69. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceAutocompleteItem.js.map +1 -1
  70. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceCheckboxAnswerOptionItem.js +2 -2
  71. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceCheckboxAnswerOptionItem.js.map +1 -1
  72. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceCheckboxAnswerValueSetItem.js +2 -2
  73. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceCheckboxAnswerValueSetItem.js.map +1 -1
  74. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceRadioAnswerOptionItem.js +2 -2
  75. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceRadioAnswerOptionItem.js.map +1 -1
  76. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceRadioAnswerValueSetItem.js +2 -2
  77. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceRadioAnswerValueSetItem.js.map +1 -1
  78. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerOptionField.d.ts +1 -0
  79. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerOptionField.js +71 -4
  80. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerOptionField.js.map +1 -1
  81. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerOptionItem.js +5 -6
  82. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerOptionItem.js.map +1 -1
  83. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerValueSetField.d.ts +1 -0
  84. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerValueSetField.js +3 -2
  85. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerValueSetField.js.map +1 -1
  86. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerValueSetItem.js +5 -6
  87. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerValueSetItem.js.map +1 -1
  88. package/lib/components/FormComponents/QuantityItem/QuantityItem.js +2 -2
  89. package/lib/components/FormComponents/QuantityItem/QuantityItem.js.map +1 -1
  90. package/lib/components/FormComponents/RepeatGroup/DeleteItemButton.d.ts +10 -0
  91. package/lib/components/FormComponents/RepeatGroup/DeleteItemButton.js +30 -0
  92. package/lib/components/FormComponents/RepeatGroup/DeleteItemButton.js.map +1 -0
  93. package/lib/components/FormComponents/SliderItem/Slider.styles.d.ts +1 -1
  94. package/lib/components/FormComponents/SliderItem/SliderItem.js +2 -2
  95. package/lib/components/FormComponents/SliderItem/SliderItem.js.map +1 -1
  96. package/lib/components/FormComponents/StringItem/StringItem.js +2 -2
  97. package/lib/components/FormComponents/StringItem/StringItem.js.map +1 -1
  98. package/lib/components/FormComponents/TextItem/TextItem.js +2 -2
  99. package/lib/components/FormComponents/TextItem/TextItem.js.map +1 -1
  100. package/lib/components/FormComponents/TimeItem/TimeItem.js +2 -2
  101. package/lib/components/FormComponents/TimeItem/TimeItem.js.map +1 -1
  102. package/lib/components/FormComponents/UrlItem/UrlItem.js +2 -2
  103. package/lib/components/FormComponents/UrlItem/UrlItem.js.map +1 -1
  104. package/lib/components/Iconify/Iconify.d.ts +10 -0
  105. package/lib/components/Iconify/Iconify.js +26 -0
  106. package/lib/components/Iconify/Iconify.js.map +1 -0
  107. package/lib/components/Renderer/FormBodyPage.d.ts +9 -0
  108. package/lib/components/Renderer/FormBodyPage.js +43 -0
  109. package/lib/components/Renderer/FormBodyPage.js.map +1 -0
  110. package/lib/components/Renderer/FormTitle.d.ts +7 -0
  111. package/lib/components/Renderer/FormTitle.js +30 -0
  112. package/lib/components/Renderer/FormTitle.js.map +1 -0
  113. package/lib/components/Renderer/FormTopLevelPage.d.ts +9 -0
  114. package/lib/components/Renderer/FormTopLevelPage.js +29 -0
  115. package/lib/components/Renderer/FormTopLevelPage.js.map +1 -0
  116. package/lib/hooks/useBooleanCalculatedExpression.d.ts +12 -0
  117. package/lib/hooks/useBooleanCalculatedExpression.js +52 -0
  118. package/lib/hooks/useBooleanCalculatedExpression.js.map +1 -0
  119. package/lib/hooks/useCalculatedExpressionAnimating.d.ts +1 -0
  120. package/lib/hooks/useCalculatedExpressionAnimating.js +18 -0
  121. package/lib/hooks/useCalculatedExpressionAnimating.js.map +1 -0
  122. package/lib/hooks/useCalculatedExpressionUpdated.d.ts +1 -1
  123. package/lib/hooks/useCalculatedExpressionUpdated.js +18 -9
  124. package/lib/hooks/useCalculatedExpressionUpdated.js.map +1 -1
  125. package/lib/hooks/useDecimalCalculatedExpression.d.ts +13 -0
  126. package/lib/hooks/useDecimalCalculatedExpression.js +58 -0
  127. package/lib/hooks/useDecimalCalculatedExpression.js.map +1 -0
  128. package/lib/hooks/useInitialiseGroupTable.d.ts +4 -0
  129. package/lib/hooks/useInitialiseGroupTable.js +36 -0
  130. package/lib/hooks/useInitialiseGroupTable.js.map +1 -0
  131. package/lib/hooks/useIntegerCalculatedExpression.d.ts +12 -0
  132. package/lib/hooks/useIntegerCalculatedExpression.js +55 -0
  133. package/lib/hooks/useIntegerCalculatedExpression.js.map +1 -0
  134. package/lib/hooks/useNumberInput.d.ts +3 -0
  135. package/lib/hooks/useNumberInput.js +31 -0
  136. package/lib/hooks/useNumberInput.js.map +1 -0
  137. package/lib/hooks/useParseXhtml.d.ts +2 -2
  138. package/lib/hooks/useParseXhtml.js +5 -5
  139. package/lib/hooks/useParseXhtml.js.map +1 -1
  140. package/lib/hooks/useRepeatAnswers.d.ts +4 -0
  141. package/lib/hooks/useRepeatAnswers.js +34 -0
  142. package/lib/hooks/useRepeatAnswers.js.map +1 -0
  143. package/lib/hooks/useRepeatGroups.d.ts +4 -0
  144. package/lib/hooks/useRepeatGroups.js +34 -0
  145. package/lib/hooks/useRepeatGroups.js.map +1 -0
  146. package/lib/hooks/useShowFeedback.d.ts +11 -0
  147. package/lib/hooks/useShowFeedback.js +33 -0
  148. package/lib/hooks/useShowFeedback.js.map +1 -0
  149. package/lib/hooks/useStringCalculatedExpression.d.ts +14 -0
  150. package/lib/hooks/useStringCalculatedExpression.js +69 -0
  151. package/lib/hooks/useStringCalculatedExpression.js.map +1 -0
  152. package/lib/hooks/useStringInput.d.ts +3 -0
  153. package/lib/hooks/useStringInput.js +31 -0
  154. package/lib/hooks/useStringInput.js.map +1 -0
  155. package/lib/interfaces/itemPath.interface.d.ts +31 -0
  156. package/lib/interfaces/itemPath.interface.js +2 -0
  157. package/lib/interfaces/itemPath.interface.js.map +1 -0
  158. package/lib/interfaces/repeatItem.interface.d.ts +5 -0
  159. package/lib/interfaces/repeatItem.interface.js +2 -0
  160. package/lib/interfaces/repeatItem.interface.js.map +1 -0
  161. package/lib/stores/questionnaireStore.js +15 -2
  162. package/lib/stores/questionnaireStore.js.map +1 -1
  163. package/lib/stores/rendererStylingStore.d.ts +144 -0
  164. package/lib/stores/rendererStylingStore.js +68 -0
  165. package/lib/stores/rendererStylingStore.js.map +1 -0
  166. package/lib/stories/storybookWrappers/InitialiseFormWrapperForStorybook.d.ts +30 -0
  167. package/lib/stories/storybookWrappers/InitialiseFormWrapperForStorybook.js +46 -0
  168. package/lib/stories/storybookWrappers/InitialiseFormWrapperForStorybook.js.map +1 -0
  169. package/lib/stories/storybookWrappers/index.d.ts +2 -0
  170. package/lib/stories/storybookWrappers/index.js +18 -0
  171. package/lib/stories/storybookWrappers/index.js.map +1 -0
  172. package/lib/stories/testUtils.d.ts +23 -0
  173. package/lib/stories/testUtils.js +249 -0
  174. package/lib/stories/testUtils.js.map +1 -0
  175. package/lib/theme/Theme.d.ts +44 -0
  176. package/lib/theme/Theme.js +45 -0
  177. package/lib/theme/Theme.js.map +1 -0
  178. package/lib/theme/customGlobalStyles.d.ts +2 -0
  179. package/lib/theme/customGlobalStyles.js +61 -0
  180. package/lib/theme/customGlobalStyles.js.map +1 -0
  181. package/lib/theme/overrides/Accordion.d.ts +14 -0
  182. package/lib/theme/overrides/Accordion.js +32 -0
  183. package/lib/theme/overrides/Accordion.js.map +1 -0
  184. package/lib/theme/overrides/Autocomplete.d.ts +10 -0
  185. package/lib/theme/overrides/Autocomplete.js +28 -0
  186. package/lib/theme/overrides/Autocomplete.js.map +1 -0
  187. package/lib/theme/overrides/Button.d.ts +33 -0
  188. package/lib/theme/overrides/Button.js +52 -0
  189. package/lib/theme/overrides/Button.js.map +1 -0
  190. package/lib/theme/overrides/Card.d.ts +35 -0
  191. package/lib/theme/overrides/Card.js +49 -0
  192. package/lib/theme/overrides/Card.js.map +1 -0
  193. package/lib/theme/overrides/Input.d.ts +64 -0
  194. package/lib/theme/overrides/Input.js +81 -0
  195. package/lib/theme/overrides/Input.js.map +1 -0
  196. package/lib/theme/overrides/Overrides.d.ts +3 -0
  197. package/lib/theme/overrides/Overrides.js +29 -0
  198. package/lib/theme/overrides/Overrides.js.map +1 -0
  199. package/lib/theme/overrides/Paper.d.ts +12 -0
  200. package/lib/theme/overrides/Paper.js +31 -0
  201. package/lib/theme/overrides/Paper.js.map +1 -0
  202. package/lib/theme/overrides/SpeedDial.d.ts +16 -0
  203. package/lib/theme/overrides/SpeedDial.js +34 -0
  204. package/lib/theme/overrides/SpeedDial.js.map +1 -0
  205. package/lib/theme/overrides/Table.d.ts +12 -0
  206. package/lib/theme/overrides/Table.js +30 -0
  207. package/lib/theme/overrides/Table.js.map +1 -0
  208. package/lib/theme/palette.d.ts +27 -0
  209. package/lib/theme/palette.js +67 -0
  210. package/lib/theme/palette.js.map +1 -0
  211. package/lib/theme/shadows.d.ts +2 -0
  212. package/lib/theme/shadows.js +52 -0
  213. package/lib/theme/shadows.js.map +1 -0
  214. package/lib/utils/answerExpression.d.ts +18 -0
  215. package/lib/utils/answerExpression.js +133 -0
  216. package/lib/utils/answerExpression.js.map +1 -0
  217. package/lib/utils/calculatedExpression.js +1 -5
  218. package/lib/utils/calculatedExpression.js.map +1 -1
  219. package/lib/utils/dayjsExtend.d.ts +1 -0
  220. package/lib/utils/dayjsExtend.js +22 -0
  221. package/lib/utils/dayjsExtend.js.map +1 -0
  222. package/lib/utils/dynamicValueSet.d.ts +5 -0
  223. package/lib/utils/dynamicValueSet.js +96 -0
  224. package/lib/utils/dynamicValueSet.js.map +1 -0
  225. package/lib/utils/extensions.d.ts +2 -2
  226. package/lib/utils/extensions.js +2 -2
  227. package/lib/utils/extensions.js.map +1 -1
  228. package/lib/utils/fhirpathAsyncUtils/fhirpath-async.d.ts +14 -0
  229. package/lib/utils/fhirpathAsyncUtils/fhirpath-async.js +639 -0
  230. package/lib/utils/fhirpathAsyncUtils/fhirpath-async.js.map +1 -0
  231. package/lib/utils/fhirpathAsyncUtils/outcome-utils.d.ts +3 -0
  232. package/lib/utils/fhirpathAsyncUtils/outcome-utils.js +41 -0
  233. package/lib/utils/fhirpathAsyncUtils/outcome-utils.js.map +1 -0
  234. package/lib/utils/itemControl.d.ts +97 -0
  235. package/lib/utils/itemControl.js +336 -0
  236. package/lib/utils/itemControl.js.map +1 -0
  237. package/lib/utils/itemPath.d.ts +57 -0
  238. package/lib/utils/itemPath.js +75 -0
  239. package/lib/utils/itemPath.js.map +1 -0
  240. package/lib/utils/manageForm.js +5 -4
  241. package/lib/utils/manageForm.js.map +1 -1
  242. package/lib/utils/qrItem.d.ts +6 -0
  243. package/lib/utils/qrItem.js +11 -0
  244. package/lib/utils/qrItem.js.map +1 -1
  245. package/lib/utils/questionnaireStoreUtils/addAdditionalVariables.d.ts +2 -0
  246. package/lib/utils/questionnaireStoreUtils/addAdditionalVariables.js +43 -0
  247. package/lib/utils/questionnaireStoreUtils/addAdditionalVariables.js.map +1 -0
  248. package/lib/utils/questionnaireStoreUtils/createQuestionaireModel.d.ts +3 -0
  249. package/lib/utils/questionnaireStoreUtils/createQuestionaireModel.js +101 -0
  250. package/lib/utils/questionnaireStoreUtils/createQuestionaireModel.js.map +1 -0
  251. package/lib/utils/validateQuestionnaire.d.ts +66 -0
  252. package/lib/utils/validateQuestionnaire.js +559 -0
  253. package/lib/utils/validateQuestionnaire.js.map +1 -0
  254. package/package.json +2 -2
  255. package/src/components/FormComponents/AttachmentItem/AttachmentItem.tsx +2 -2
  256. package/src/components/FormComponents/BooleanItem/BooleanItem.tsx +2 -2
  257. package/src/components/FormComponents/ChoiceItems/CheckboxOptionList.tsx +5 -1
  258. package/src/components/FormComponents/ChoiceItems/ChoiceAutocompleteField.tsx +5 -0
  259. package/src/components/FormComponents/ChoiceItems/ChoiceAutocompleteItem.tsx +6 -4
  260. package/src/components/FormComponents/ChoiceItems/ChoiceCheckboxAnswerOptionItem.tsx +2 -2
  261. package/src/components/FormComponents/ChoiceItems/ChoiceCheckboxAnswerValueSetItem.tsx +2 -2
  262. package/src/components/FormComponents/ChoiceItems/ChoiceRadioAnswerOptionItem.tsx +2 -2
  263. package/src/components/FormComponents/ChoiceItems/ChoiceRadioAnswerValueSetItem.tsx +2 -2
  264. package/src/components/FormComponents/ChoiceItems/ChoiceRadioSingle.tsx +1 -1
  265. package/src/components/FormComponents/ChoiceItems/ChoiceSelectAnswerOptionFields.tsx +93 -4
  266. package/src/components/FormComponents/ChoiceItems/ChoiceSelectAnswerOptionItem.tsx +2 -2
  267. package/src/components/FormComponents/ChoiceItems/ChoiceSelectAnswerValueSetFields.tsx +4 -2
  268. package/src/components/FormComponents/ChoiceItems/ChoiceSelectAnswerValueSetItem.tsx +2 -2
  269. package/src/components/FormComponents/DateTimeItems/CustomDateItem/CustomDateItem.tsx +2 -2
  270. package/src/components/FormComponents/DateTimeItems/CustomDateTimeItem/CustomDateTimeItem.tsx +2 -2
  271. package/src/components/FormComponents/DateTimeItems/CustomDateTimeItem/CustomTimeField.tsx +3 -1
  272. package/src/components/FormComponents/DecimalItem/DecimalItem.tsx +2 -2
  273. package/src/components/FormComponents/GroupItem/GroupItemView.tsx +1 -1
  274. package/src/components/FormComponents/IntegerItem/IntegerItem.tsx +2 -2
  275. package/src/components/FormComponents/ItemParts/CheckboxSingle.tsx +4 -2
  276. package/src/components/FormComponents/ItemParts/ItemLabel.tsx +1 -8
  277. package/src/components/FormComponents/ItemParts/ItemTextSwitcher.tsx +3 -25
  278. package/src/components/FormComponents/ItemParts/RadioOptionList.tsx +4 -1
  279. package/src/components/FormComponents/ItemParts/StyledText.tsx +46 -0
  280. package/src/components/FormComponents/OpenChoiceItems/OpenChoiceAutocompleteField.tsx +4 -0
  281. package/src/components/FormComponents/OpenChoiceItems/OpenChoiceAutocompleteItem.tsx +6 -3
  282. package/src/components/FormComponents/OpenChoiceItems/OpenChoiceCheckboxAnswerOptionItem.tsx +2 -2
  283. package/src/components/FormComponents/OpenChoiceItems/OpenChoiceCheckboxAnswerValueSetItem.tsx +2 -2
  284. package/src/components/FormComponents/OpenChoiceItems/OpenChoiceRadioAnswerOptionItem.tsx +2 -2
  285. package/src/components/FormComponents/OpenChoiceItems/OpenChoiceRadioAnswerValueSetItem.tsx +2 -2
  286. package/src/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerOptionField.tsx +86 -3
  287. package/src/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerOptionItem.tsx +6 -4
  288. package/src/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerValueSetField.tsx +4 -0
  289. package/src/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerValueSetItem.tsx +6 -4
  290. package/src/components/FormComponents/QuantityItem/QuantityItem.tsx +2 -2
  291. package/src/components/FormComponents/SliderItem/SliderItem.tsx +2 -2
  292. package/src/components/FormComponents/StringItem/StringItem.tsx +2 -2
  293. package/src/components/FormComponents/TextItem/TextItem.tsx +2 -2
  294. package/src/components/FormComponents/TimeItem/TimeItem.tsx +2 -2
  295. package/src/components/FormComponents/UrlItem/UrlItem.tsx +2 -2
  296. package/src/hooks/useCalculatedExpressionUpdated.ts +25 -11
  297. package/src/hooks/useParseXhtml.tsx +9 -6
  298. package/src/stores/questionnaireStore.ts +23 -0
  299. package/src/utils/calculatedExpression.ts +1 -5
  300. package/src/utils/extensions.ts +9 -3
  301. package/src/utils/manageForm.ts +10 -9
  302. package/src/utils/qrItem.ts +12 -0
@@ -36,6 +36,7 @@ import type {
36
36
  import type { AlertColor } from '@mui/material/Alert';
37
37
  import { useRendererConfigStore } from '../../../stores';
38
38
  import DisplayUnitText from '../ItemParts/DisplayUnitText';
39
+ import ExpressionUpdateFadingIcon from '../ItemParts/ExpressionUpdateFadingIcon';
39
40
 
40
41
  interface ChoiceAutocompleteFieldsProps
41
42
  extends PropsWithIsTabledAttribute,
@@ -47,6 +48,8 @@ interface ChoiceAutocompleteFieldsProps
47
48
  loading: boolean;
48
49
  feedback: { message: string; color: AlertColor } | null;
49
50
  readOnly: boolean;
51
+ calcExpUpdated: boolean;
52
+
50
53
  onInputChange: (newInput: string) => void;
51
54
  onValueChange: (newValue: Coding | null) => void;
52
55
  }
@@ -59,6 +62,7 @@ function ChoiceAutocompleteField(props: ChoiceAutocompleteFieldsProps) {
59
62
  loading,
60
63
  feedback,
61
64
  readOnly,
65
+ calcExpUpdated,
62
66
  isTabled,
63
67
  renderingExtensions,
64
68
  onInputChange,
@@ -123,6 +127,7 @@ function ChoiceAutocompleteField(props: ChoiceAutocompleteFieldsProps) {
123
127
  </Tooltip>
124
128
  </Fade>
125
129
  ) : null}
130
+ <ExpressionUpdateFadingIcon fadeIn={calcExpUpdated} disabled={readOnly} />
126
131
  {params.InputProps.endAdornment}
127
132
  <DisplayUnitText readOnly={readOnly}>{displayUnit}</DisplayUnitText>
128
133
  </>
@@ -26,7 +26,7 @@ import useValidationFeedback from '../../../hooks/useValidationFeedback';
26
26
  import type { BaseItemProps } from '../../../interfaces/renderProps.interface';
27
27
  import { useQuestionnaireStore } from '../../../stores';
28
28
  import { AUTOCOMPLETE_DEBOUNCE_DURATION } from '../../../utils/debounce';
29
- import { createEmptyQrItem } from '../../../utils/qrItem';
29
+ import { createEmptyQrItem, getQRItemId } from '../../../utils/qrItem';
30
30
  import { FullWidthFormComponentBox } from '../../Box.styles';
31
31
  import ItemFieldGrid from '../ItemParts/ItemFieldGrid';
32
32
  import ItemLabel from '../ItemParts/ItemLabel';
@@ -41,14 +41,14 @@ function ChoiceAutocompleteItem(props: BaseItemProps) {
41
41
  renderingExtensions,
42
42
  parentIsReadOnly,
43
43
  feedbackFromParent,
44
- onQrItemChange
44
+ onQrItemChange,
45
+ calcExpUpdated
45
46
  } = props;
46
- // TODO no calcExpUpdated
47
47
 
48
48
  const onFocusLinkId = useQuestionnaireStore.use.onFocusLinkId();
49
49
 
50
50
  // Init input value
51
- const answerKey = qrItem?.answer?.[0]?.id;
51
+ const answerKey = getQRItemId(qrItem?.answer?.[0]?.id);
52
52
  const qrChoice = qrItem ?? createEmptyQrItem(qItem, answerKey);
53
53
 
54
54
  let valueCoding: Coding | undefined;
@@ -108,6 +108,7 @@ function ChoiceAutocompleteItem(props: BaseItemProps) {
108
108
  loading={loading}
109
109
  feedback={feedback}
110
110
  readOnly={readOnly}
111
+ calcExpUpdated={calcExpUpdated}
111
112
  isTabled={isTabled}
112
113
  renderingExtensions={renderingExtensions}
113
114
  onInputChange={setInput}
@@ -134,6 +135,7 @@ function ChoiceAutocompleteItem(props: BaseItemProps) {
134
135
  loading={loading}
135
136
  feedback={feedback}
136
137
  readOnly={readOnly}
138
+ calcExpUpdated={calcExpUpdated}
137
139
  isTabled={isTabled}
138
140
  renderingExtensions={renderingExtensions}
139
141
  onInputChange={setInput}
@@ -21,7 +21,7 @@ import useValidationFeedback from '../../../hooks/useValidationFeedback';
21
21
  import type { BaseItemProps } from '../../../interfaces/renderProps.interface';
22
22
  import { useQuestionnaireStore } from '../../../stores';
23
23
  import { updateChoiceCheckboxAnswers } from '../../../utils/choice';
24
- import { createEmptyQrItem } from '../../../utils/qrItem';
24
+ import { createEmptyQrItem, getQRItemId } from '../../../utils/qrItem';
25
25
  import { FullWidthFormComponentBox } from '../../Box.styles';
26
26
  import DisplayInstructions from '../DisplayItem/DisplayInstructions';
27
27
  import ItemFieldGrid from '../ItemParts/ItemFieldGrid';
@@ -44,7 +44,7 @@ function ChoiceCheckboxAnswerOptionItem(props: BaseItemProps) {
44
44
  const onFocusLinkId = useQuestionnaireStore.use.onFocusLinkId();
45
45
 
46
46
  // Init input value
47
- const answerKey = qrItem?.answer?.[0]?.id;
47
+ const answerKey = getQRItemId(qrItem?.answer?.[0]?.id);
48
48
  const qrChoiceCheckbox = qrItem ?? createEmptyQrItem(qItem, answerKey);
49
49
  const answers = qrChoiceCheckbox.answer ?? [];
50
50
 
@@ -23,7 +23,7 @@ import useValueSetCodings from '../../../hooks/useValueSetCodings';
23
23
  import type { BaseItemProps } from '../../../interfaces/renderProps.interface';
24
24
  import { useQuestionnaireStore } from '../../../stores';
25
25
  import { convertCodingsToAnswerOptions, updateChoiceCheckboxAnswers } from '../../../utils/choice';
26
- import { createEmptyQrItem } from '../../../utils/qrItem';
26
+ import { createEmptyQrItem, getQRItemId } from '../../../utils/qrItem';
27
27
  import { FullWidthFormComponentBox } from '../../Box.styles';
28
28
  import DisplayInstructions from '../DisplayItem/DisplayInstructions';
29
29
  import ItemFieldGrid from '../ItemParts/ItemFieldGrid';
@@ -46,7 +46,7 @@ function ChoiceCheckboxAnswerValueSetItem(props: BaseItemProps) {
46
46
  const onFocusLinkId = useQuestionnaireStore.use.onFocusLinkId();
47
47
 
48
48
  // Init input value
49
- const answerKey = qrItem?.answer?.[0]?.id;
49
+ const answerKey = getQRItemId(qrItem?.answer?.[0]?.id);
50
50
  const qrChoiceCheckbox = qrItem ?? createEmptyQrItem(qItem, answerKey);
51
51
  const answers = qrChoiceCheckbox.answer ?? [];
52
52
 
@@ -24,7 +24,7 @@ import { ChoiceItemControl } from '../../../interfaces/choice.enum';
24
24
  import type { BaseItemProps } from '../../../interfaces/renderProps.interface';
25
25
  import { useQuestionnaireStore } from '../../../stores';
26
26
  import { findInAnswerOptions, getChoiceControlType, getQrChoiceValue } from '../../../utils/choice';
27
- import { createEmptyQrItem } from '../../../utils/qrItem';
27
+ import { createEmptyQrItem, getQRItemId } from '../../../utils/qrItem';
28
28
  import ChoiceRadioAnswerOptionView from './ChoiceRadioAnswerOptionView';
29
29
  import ChoiceSelectAnswerOptionView from './ChoiceSelectAnswerOptionView';
30
30
 
@@ -44,7 +44,7 @@ function ChoiceRadioAnswerOptionItem(props: BaseItemProps) {
44
44
  const onFocusLinkId = useQuestionnaireStore.use.onFocusLinkId();
45
45
 
46
46
  // Init input value
47
- const answerKey = qrItem?.answer?.[0]?.id;
47
+ const answerKey = getQRItemId(qrItem?.answer?.[0]?.id);
48
48
  const qrChoice = qrItem ?? createEmptyQrItem(qItem, answerKey);
49
49
  const valueChoice = getQrChoiceValue(qrChoice);
50
50
 
@@ -23,7 +23,7 @@ import useValueSetCodings from '../../../hooks/useValueSetCodings';
23
23
  import type { BaseItemProps } from '../../../interfaces/renderProps.interface';
24
24
  import { useQuestionnaireStore } from '../../../stores';
25
25
  import { convertCodingsToAnswerOptions, findInAnswerOptions } from '../../../utils/choice';
26
- import { createEmptyQrItem } from '../../../utils/qrItem';
26
+ import { createEmptyQrItem, getQRItemId } from '../../../utils/qrItem';
27
27
  import { FullWidthFormComponentBox } from '../../Box.styles';
28
28
  import ItemFieldGrid from '../ItemParts/ItemFieldGrid';
29
29
  import ItemLabel from '../ItemParts/ItemLabel';
@@ -44,7 +44,7 @@ function ChoiceRadioAnswerValueSetItem(props: BaseItemProps) {
44
44
  const onFocusLinkId = useQuestionnaireStore.use.onFocusLinkId();
45
45
 
46
46
  // Init input value
47
- const answerKey = qrItem?.answer?.[0]?.id;
47
+ const answerKey = getQRItemId(qrItem?.answer?.[0]?.id);
48
48
  const qrChoiceRadio = qrItem ?? createEmptyQrItem(qItem, answerKey);
49
49
 
50
50
  let valueRadio: string | null = null;
@@ -22,7 +22,7 @@ import { StandardRadio } from '../../Radio.styles';
22
22
 
23
23
  interface ChoiceRadioSingleProps {
24
24
  value: string;
25
- label: string;
25
+ label: React.ReactNode;
26
26
  readOnly: boolean;
27
27
  disabledViaToggleExpression: boolean;
28
28
  fullWidth: boolean;
@@ -15,6 +15,7 @@
15
15
  * limitations under the License.
16
16
  */
17
17
 
18
+ import React from 'react';
18
19
  import Autocomplete from '@mui/material/Autocomplete';
19
20
  import type { QuestionnaireItem, QuestionnaireItemAnswerOption } from 'fhir/r4';
20
21
  import type {
@@ -28,6 +29,7 @@ import { StyledRequiredTypography } from '../Item.styles';
28
29
  import DisplayUnitText from '../ItemParts/DisplayUnitText';
29
30
  import ExpressionUpdateFadingIcon from '../ItemParts/ExpressionUpdateFadingIcon';
30
31
  import { StandardTextField } from '../Textfield.styles';
32
+ import StyledText from '../ItemParts/StyledText';
31
33
 
32
34
  interface ChoiceSelectAnswerOptionFieldsProps
33
35
  extends PropsWithIsTabledAttribute,
@@ -61,6 +63,12 @@ function ChoiceSelectAnswerOptionFields(props: ChoiceSelectAnswerOptionFieldsPro
61
63
 
62
64
  const { displayUnit, displayPrompt, entryFormat } = renderingExtensions;
63
65
 
66
+ const [inputValue, setInputValue] = React.useState('');
67
+
68
+ // Keep track of current selected value when input is changed
69
+ const [currentValueSelect, setCurrentValueSelect] =
70
+ React.useState<QuestionnaireItemAnswerOption | null>(valueSelect);
71
+
64
72
  return (
65
73
  <>
66
74
  <Autocomplete
@@ -70,15 +78,50 @@ function ChoiceSelectAnswerOptionFields(props: ChoiceSelectAnswerOptionFieldsPro
70
78
  getOptionDisabled={(option) => isOptionDisabled(option, answerOptionsToggleExpressionsMap)}
71
79
  getOptionLabel={(option) => getAnswerOptionLabel(option)}
72
80
  isOptionEqualToValue={(option, value) => compareAnswerOptionValue(option, value)}
73
- onChange={(_, newValue) => onSelectChange(newValue)}
81
+ onChange={(_, newValue) => {
82
+ onSelectChange(newValue);
83
+ setCurrentValueSelect(newValue);
84
+ }}
85
+ inputValue={inputValue}
86
+ onInputChange={(_, newInputValue, reason) => {
87
+ if (!inputValue && valueSelect && reason !== 'clear') {
88
+ // Convert current input value to be the current value plus additional input
89
+ onSelectChange(null);
90
+ setInputValue(getAnswerOptionLabel(valueSelect) + newInputValue);
91
+ } else {
92
+ setInputValue(newInputValue);
93
+ }
94
+ }}
95
+ onBlur={() => {
96
+ // Set value on blur if there is any current input
97
+ if (currentValueSelect) {
98
+ onSelectChange(currentValueSelect);
99
+ setInputValue(''); // Clear input after blur
100
+ }
101
+ }}
102
+ onKeyDown={(e) => {
103
+ if (e.key === 'Backspace') {
104
+ if (!inputValue && valueSelect) {
105
+ // Convert current selection to input value on backspace when input is empty
106
+ onSelectChange(null);
107
+ setInputValue(getAnswerOptionLabel(valueSelect));
108
+ }
109
+ }
110
+ }}
74
111
  autoHighlight
75
- sx={{ maxWidth: !isTabled ? textFieldWidth : 3000, minWidth: 160, flexGrow: 1 }}
112
+ sx={{
113
+ maxWidth: !isTabled ? textFieldWidth : 3000,
114
+ minWidth: 160,
115
+ flexGrow: 1,
116
+ '& .MuiAutocomplete-tag': {
117
+ mx: 0
118
+ }
119
+ }}
76
120
  size="small"
77
121
  disabled={readOnly && readOnlyVisualStyle === 'disabled'}
78
122
  readOnly={readOnly && readOnlyVisualStyle === 'readonly'}
79
123
  renderInput={(params) => (
80
124
  <StandardTextField
81
- multiline
82
125
  textFieldWidth={textFieldWidth}
83
126
  isTabled={isTabled}
84
127
  placeholder={entryFormat || displayPrompt}
@@ -93,11 +136,57 @@ function ChoiceSelectAnswerOptionFields(props: ChoiceSelectAnswerOptionFieldsPro
93
136
  <ExpressionUpdateFadingIcon fadeIn={expressionUpdated} disabled={readOnly} />
94
137
  <DisplayUnitText readOnly={readOnly}>{displayUnit}</DisplayUnitText>
95
138
  </>
96
- )
139
+ ),
140
+ sx: {
141
+ '&.MuiOutlinedInput-root.MuiInputBase-sizeSmall .MuiAutocomplete-input': {
142
+ paddingLeft: '0px'
143
+ }
144
+ },
145
+ inputProps: {
146
+ ...params.inputProps,
147
+ ...(isTabled
148
+ ? { 'aria-label': qItem.text ?? 'Unnamed choice dropdown' }
149
+ : { 'aria-labelledby': `label-${qItem.linkId}` }),
150
+ role: 'combobox'
151
+ }
97
152
  }
98
153
  }}
99
154
  />
100
155
  )}
156
+ renderOption={(optionProps, option) => {
157
+ const { key, ...rest } = optionProps;
158
+ return (
159
+ <li key={key} {...rest}>
160
+ <span>
161
+ {option.valueString ? (
162
+ <StyledText
163
+ textToDisplay={getAnswerOptionLabel(option)}
164
+ element={option._valueString}
165
+ />
166
+ ) : (
167
+ getAnswerOptionLabel(option)
168
+ )}
169
+ </span>
170
+ </li>
171
+ );
172
+ }}
173
+ renderValue={(value, getItemProps) => {
174
+ const selectedOption = options.find((opt) => opt.valueString === value.valueString);
175
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
176
+ const { onDelete, ...rest } = getItemProps();
177
+ return (
178
+ <span {...rest}>
179
+ {value.valueString && selectedOption ? (
180
+ <StyledText
181
+ textToDisplay={getAnswerOptionLabel(value)}
182
+ element={selectedOption._valueString}
183
+ />
184
+ ) : (
185
+ getAnswerOptionLabel(value)
186
+ )}
187
+ </span>
188
+ );
189
+ }}
101
190
  />
102
191
 
103
192
  {feedback ? <StyledRequiredTypography>{feedback}</StyledRequiredTypography> : null}
@@ -22,7 +22,7 @@ import useValidationFeedback from '../../../hooks/useValidationFeedback';
22
22
  import type { BaseItemProps } from '../../../interfaces/renderProps.interface';
23
23
  import { useQuestionnaireStore } from '../../../stores';
24
24
  import { findInAnswerOptions, getQrChoiceValue } from '../../../utils/choice';
25
- import { createEmptyQrItem } from '../../../utils/qrItem';
25
+ import { createEmptyQrItem, getQRItemId } from '../../../utils/qrItem';
26
26
  import ChoiceSelectAnswerOptionView from './ChoiceSelectAnswerOptionView';
27
27
 
28
28
  function ChoiceSelectAnswerOptionItem(props: BaseItemProps) {
@@ -46,7 +46,7 @@ function ChoiceSelectAnswerOptionItem(props: BaseItemProps) {
46
46
  const feedback = useValidationFeedback(qItem, feedbackFromParent);
47
47
 
48
48
  // Init input value
49
- const answerKey = qrItem?.answer?.[0]?.id;
49
+ const answerKey = getQRItemId(qrItem?.answer?.[0]?.id);
50
50
  const qrChoice = qrItem ?? createEmptyQrItem(qItem, answerKey);
51
51
  const valueChoice = getQrChoiceValue(qrChoice);
52
52
 
@@ -85,7 +85,6 @@ function ChoiceSelectAnswerValueSetFields(props: ChoiceSelectAnswerValueSetField
85
85
  readOnly={readOnly && readOnlyVisualStyle === 'readonly'}
86
86
  renderInput={(params) => (
87
87
  <StandardTextField
88
- multiline
89
88
  textFieldWidth={textFieldWidth}
90
89
  isTabled={isTabled}
91
90
  placeholder={entryFormat || displayPrompt}
@@ -103,7 +102,10 @@ function ChoiceSelectAnswerValueSetFields(props: ChoiceSelectAnswerValueSetField
103
102
  ),
104
103
  inputProps: {
105
104
  ...params.inputProps,
106
- 'aria-label': qItem.text ?? 'Unnamed choice dropdown'
105
+ ...(isTabled
106
+ ? { 'aria-label': qItem.text ?? 'Unnamed choice dropdown' }
107
+ : { 'aria-labelledby': `label-${qItem.linkId}` }),
108
+ role: 'combobox'
107
109
  }
108
110
  }
109
111
  }}
@@ -24,7 +24,7 @@ import useValidationFeedback from '../../../hooks/useValidationFeedback';
24
24
  import useValueSetCodings from '../../../hooks/useValueSetCodings';
25
25
  import type { BaseItemProps } from '../../../interfaces/renderProps.interface';
26
26
  import { useQuestionnaireStore } from '../../../stores';
27
- import { createEmptyQrItem } from '../../../utils/qrItem';
27
+ import { createEmptyQrItem, getQRItemId } from '../../../utils/qrItem';
28
28
  import { FullWidthFormComponentBox } from '../../Box.styles';
29
29
  import ItemFieldGrid from '../ItemParts/ItemFieldGrid';
30
30
  import ItemLabel from '../ItemParts/ItemLabel';
@@ -46,7 +46,7 @@ function ChoiceSelectAnswerValueSetItem(props: BaseItemProps) {
46
46
  const onFocusLinkId = useQuestionnaireStore.use.onFocusLinkId();
47
47
 
48
48
  // Init input value
49
- const answerKey = qrItem?.answer?.[0]?.id;
49
+ const answerKey = getQRItemId(qrItem?.answer?.[0]?.id);
50
50
  const qrChoiceSelect = qrItem ?? createEmptyQrItem(qItem, answerKey);
51
51
 
52
52
  let valueCoding: Coding | null = null;
@@ -20,7 +20,7 @@ import useDateValidation from '../../../../hooks/useDateValidation';
20
20
  import useReadOnly from '../../../../hooks/useReadOnly';
21
21
  import type { BaseItemProps } from '../../../../interfaces/renderProps.interface';
22
22
  import { useQuestionnaireStore } from '../../../../stores';
23
- import { createEmptyQrItem } from '../../../../utils/qrItem';
23
+ import { createEmptyQrItem, getQRItemId } from '../../../../utils/qrItem';
24
24
  import { FullWidthFormComponentBox } from '../../../Box.styles';
25
25
  import ItemFieldGrid from '../../ItemParts/ItemFieldGrid';
26
26
  import ItemLabel from '../../ItemParts/ItemLabel';
@@ -49,7 +49,7 @@ function CustomDateItem(props: BaseItemProps) {
49
49
  const { displayPrompt, entryFormat } = renderingExtensions;
50
50
 
51
51
  // Init input value
52
- const answerKey = qrItem?.answer?.[0]?.id;
52
+ const answerKey = getQRItemId(qrItem?.answer?.[0]?.id);
53
53
  const qrDate = qrItem ?? createEmptyQrItem(qItem, answerKey);
54
54
  let valueDate: string = '';
55
55
  if (qrDate.answer) {
@@ -25,7 +25,7 @@ import useReadOnly from '../../../../hooks/useReadOnly';
25
25
  import useTimeValidation from '../../../../hooks/useTimeValidation';
26
26
  import type { BaseItemProps } from '../../../../interfaces/renderProps.interface';
27
27
  import { useQuestionnaireStore } from '../../../../stores';
28
- import { createEmptyQrItem } from '../../../../utils/qrItem';
28
+ import { createEmptyQrItem, getQRItemId } from '../../../../utils/qrItem';
29
29
  import { FullWidthFormComponentBox } from '../../../Box.styles';
30
30
  import ItemFieldGrid from '../../ItemParts/ItemFieldGrid';
31
31
  import ItemLabel from '../../ItemParts/ItemLabel';
@@ -56,7 +56,7 @@ function CustomDateTimeItem(props: BaseItemProps) {
56
56
  const { displayPrompt, entryFormat } = renderingExtensions;
57
57
 
58
58
  // Init input value
59
- const answerKey = qrItem?.answer?.[0]?.id;
59
+ const answerKey = getQRItemId(qrItem?.answer?.[0]?.id);
60
60
  const qrDateTime = qrItem ?? createEmptyQrItem(qItem, answerKey);
61
61
 
62
62
  // Store dateTime in FHIR and DayJs formats for downstream parsing
@@ -25,6 +25,7 @@ import type { PropsWithIsTabledAttribute } from '../../../../interfaces/renderPr
25
25
  import { useRendererConfigStore } from '../../../../stores';
26
26
  import FormControl from '@mui/material/FormControl';
27
27
  import MuiTextField from '../../TextItem/MuiTextField';
28
+ import ExpressionUpdateFadingIcon from '../../ItemParts/ExpressionUpdateFadingIcon';
28
29
 
29
30
  interface CustomTimeFieldProps extends PropsWithIsTabledAttribute {
30
31
  linkId: string;
@@ -51,12 +52,12 @@ function CustomTimeField(props: CustomTimeFieldProps) {
51
52
  feedback,
52
53
  displayPrompt,
53
54
  readOnly,
55
+ calcExpUpdated,
54
56
  isPartOfDateTime,
55
57
  isTabled,
56
58
  onTimeInputChange,
57
59
  onPeriodChange
58
60
  } = props;
59
- // TODO this component doesn't have a calcExpUpdated update animation
60
61
 
61
62
  const readOnlyVisualStyle = useRendererConfigStore.use.readOnlyVisualStyle();
62
63
  const textFieldWidth = useRendererConfigStore.use.textFieldWidth();
@@ -112,6 +113,7 @@ function CustomTimeField(props: CustomTimeFieldProps) {
112
113
  <MenuItem value="PM">PM</MenuItem>
113
114
  </Select>
114
115
  </FormControl>
116
+ <ExpressionUpdateFadingIcon fadeIn={calcExpUpdated} disabled={readOnly} />
115
117
  </Box>
116
118
  <Typography component="span" variant="caption" color="error" sx={{ ml: 1.75, mt: -0.5 }}>
117
119
  {feedback}
@@ -27,7 +27,7 @@ import {
27
27
  parseDecimalStringToFloat,
28
28
  parseDecimalStringWithPrecision
29
29
  } from '../../../utils/parseInputs';
30
- import { createEmptyQrItem } from '../../../utils/qrItem';
30
+ import { createEmptyQrItem, getQRItemId } from '../../../utils/qrItem';
31
31
  import { FullWidthFormComponentBox } from '../../Box.styles';
32
32
  import ItemFieldGrid from '../ItemParts/ItemFieldGrid';
33
33
  import ItemLabel from '../ItemParts/ItemLabel';
@@ -53,7 +53,7 @@ function DecimalItem(props: BaseItemProps) {
53
53
  const precision = getDecimalPrecision(qItem);
54
54
 
55
55
  // Init input value
56
- const answerKey = qrItem?.answer?.[0]?.id;
56
+ const answerKey = getQRItemId(qrItem?.answer?.[0]?.id);
57
57
  const { initialInput } = readDecimalValue(qrItem, precision);
58
58
 
59
59
  const [input, setInput] = useState(initialInput);
@@ -87,7 +87,7 @@ function GroupItemView(props: GroupItemViewProps) {
87
87
  } = props;
88
88
 
89
89
  // If XHTML has styles, pass them to the GroupItemView so it cna be applied down the tree
90
- const xhtmlStyles = useParseXhtml(qItem)?.styles;
90
+ const xhtmlStyles = useParseXhtml(qItem._text, qItem.text)?.styles;
91
91
 
92
92
  // Combine parent styles with this group's styles
93
93
  const combinedStyles = React.useMemo(() => {
@@ -23,7 +23,7 @@ import type { BaseItemProps } from '../../../interfaces/renderProps.interface';
23
23
  import { useQuestionnaireStore } from '../../../stores';
24
24
  import { DEBOUNCE_DURATION } from '../../../utils/debounce';
25
25
  import { parseIntegerString } from '../../../utils/parseInputs';
26
- import { createEmptyQrItem } from '../../../utils/qrItem';
26
+ import { createEmptyQrItem, getQRItemId } from '../../../utils/qrItem';
27
27
  import { FullWidthFormComponentBox } from '../../Box.styles';
28
28
  import ItemFieldGrid from '../ItemParts/ItemFieldGrid';
29
29
  import ItemLabel from '../ItemParts/ItemLabel';
@@ -47,7 +47,7 @@ function IntegerItem(props: BaseItemProps) {
47
47
  const onFocusLinkId = useQuestionnaireStore.use.onFocusLinkId();
48
48
 
49
49
  // Init input value
50
- const answerKey = qrItem?.answer?.[0]?.id;
50
+ const answerKey = getQRItemId(qrItem?.answer?.[0]?.id);
51
51
  const { initialInput } = readIntegerValue(qrItem);
52
52
 
53
53
  const [input, setInput] = useState(initialInput);
@@ -22,7 +22,8 @@ import { useRendererConfigStore } from '../../../stores';
22
22
 
23
23
  interface CheckboxSingleProps {
24
24
  value: string;
25
- label: string;
25
+ label: React.ReactNode;
26
+ labelText?: string;
26
27
  readOnly: boolean;
27
28
  disabledViaToggleExpression: boolean;
28
29
  fullWidth: boolean;
@@ -34,6 +35,7 @@ function CheckboxSingle(props: CheckboxSingleProps) {
34
35
  const {
35
36
  value,
36
37
  label,
38
+ labelText,
37
39
  readOnly,
38
40
  disabledViaToggleExpression,
39
41
  fullWidth,
@@ -80,7 +82,7 @@ function CheckboxSingle(props: CheckboxSingleProps) {
80
82
  }}
81
83
  slotProps={{
82
84
  input: {
83
- 'aria-label': label ?? 'Unnamed checkbox'
85
+ 'aria-label': (typeof label === 'string' ? label : labelText) ?? 'Unnamed checkbox'
84
86
  }
85
87
  }}
86
88
  />
@@ -27,8 +27,6 @@ import ItemTextSwitcher from './ItemTextSwitcher';
27
27
  import Typography from '@mui/material/Typography';
28
28
  import FlyoverItem from './FlyoverItem';
29
29
  import type { PropsWithParentStylesAttribute } from '../../../interfaces/renderProps.interface';
30
- import { structuredDataCapture } from 'fhir-sdc-helpers';
31
- import { default as parseStyleToJs } from 'style-to-js';
32
30
 
33
31
  interface ItemLabelProps extends PropsWithParentStylesAttribute {
34
32
  qItem: QuestionnaireItem;
@@ -53,10 +51,6 @@ const ItemLabel = memo(function ItemLabel(props: ItemLabelProps) {
53
51
  const readOnlyTextColor = readOnlyVisualStyle === 'disabled' ? 'text.disabled' : 'text.secondary';
54
52
  const textColor = parentStyles?.color || (readOnly ? readOnlyTextColor : 'text.primary');
55
53
 
56
- // Get styles from qItem._text
57
- const stylesString = structuredDataCapture.getStyle(qItem._text);
58
- const itemStyles = stylesString ? parseStyleToJs(stylesString) : {};
59
-
60
54
  return (
61
55
  <Box display="flex" alignItems="center" justifyContent="space-between">
62
56
  <Box position="relative" display="flex" flexGrow={1} alignItems="center">
@@ -72,8 +66,7 @@ const ItemLabel = memo(function ItemLabel(props: ItemLabelProps) {
72
66
  sx={{
73
67
  mt: 0.5,
74
68
  flexGrow: 1,
75
- ...(parentStyles || {}),
76
- ...itemStyles
69
+ ...(parentStyles || {})
77
70
  }}>
78
71
  {/* Required asterisk position is in front of text */}
79
72
  {required && requiredIndicatorPosition === 'start' ? (
@@ -1,10 +1,8 @@
1
1
  import React, { memo } from 'react';
2
- import ReactMarkdown from 'react-markdown';
3
- import { getMarkdownString } from '../../../utils/extensions';
4
- import { useParseXhtml } from '../../../hooks/useParseXhtml';
5
2
  import useDisplayCqfAndCalculatedExpression from '../../../hooks/useDisplayCqfAndCalculatedExpression';
6
3
  import type { QuestionnaireItem } from 'fhir/r4';
7
4
  import { getItemTextToDisplay } from '../../../utils/itemTextToDisplay';
5
+ import StyledText from './StyledText';
8
6
 
9
7
  interface ItemTextSwitcherProps {
10
8
  qItem: QuestionnaireItem;
@@ -24,29 +22,9 @@ const ItemTextSwitcher = memo(function ItemTextSwitcher({ qItem }: ItemTextSwitc
24
22
  const itemTextAriaLabel =
25
23
  useDisplayCqfAndCalculatedExpression(qItem, 'item._text.aria-label') ?? undefined;
26
24
 
27
- // parse XHTML if found
28
- const parsedXhtml = useParseXhtml(qItem);
29
- if (parsedXhtml) {
30
- return <span aria-label={itemTextAriaLabel}>{parsedXhtml.content}</span>;
31
- }
32
-
33
- // parse markdown if found
34
- const markdownString = getMarkdownString(qItem);
35
- if (markdownString) {
36
- return (
37
- <span aria-label={itemTextAriaLabel}>
38
- <ReactMarkdown>{markdownString}</ReactMarkdown>
39
- </span>
40
- );
41
- }
42
-
43
- // labelText is empty, return null
44
- if (!itemTextToDisplay) {
45
- return null;
46
- }
25
+ const content = <StyledText textToDisplay={itemTextToDisplay} element={qItem._text} />;
47
26
 
48
- // parse regular text
49
- return <span aria-label={itemTextAriaLabel}>{itemTextToDisplay}</span>;
27
+ return content ? <span aria-label={itemTextAriaLabel}>{content}</span> : null;
50
28
  });
51
29
 
52
30
  export default ItemTextSwitcher;
@@ -19,6 +19,7 @@ import React from 'react';
19
19
  import ChoiceRadioSingle from '../ChoiceItems/ChoiceRadioSingle';
20
20
  import type { QuestionnaireItemAnswerOption } from 'fhir/r4';
21
21
  import { isOptionDisabled } from '../../../utils/choice';
22
+ import StyledText from './StyledText';
22
23
 
23
24
  interface RadioOptionListProps {
24
25
  options: QuestionnaireItemAnswerOption[];
@@ -56,7 +57,9 @@ function RadioOptionList(props: RadioOptionListProps) {
56
57
  <ChoiceRadioSingle
57
58
  key={option.valueString}
58
59
  value={option.valueString}
59
- label={option.valueString}
60
+ label={
61
+ <StyledText textToDisplay={option.valueString} element={option._valueString} />
62
+ }
60
63
  readOnly={readOnly}
61
64
  disabledViaToggleExpression={optionDisabledViaToggleExpression}
62
65
  fullWidth={fullWidth}
@@ -0,0 +1,46 @@
1
+ import React from 'react';
2
+ import ReactMarkdown from 'react-markdown';
3
+ import { getMarkdownString } from '../../../utils/extensions';
4
+ import { useParseXhtml } from '../../../hooks/useParseXhtml';
5
+ import type { Element } from 'fhir/r4';
6
+ import { structuredDataCapture } from 'fhir-sdc-helpers';
7
+ import { default as parseStyleToJs } from 'style-to-js';
8
+
9
+ interface StyledTextProps {
10
+ textToDisplay: string | null;
11
+ element: Element | undefined;
12
+ }
13
+
14
+ function StyledText({ textToDisplay, element }: StyledTextProps) {
15
+ // parse XHTML if found
16
+ const parsedXhtml = useParseXhtml(element, textToDisplay);
17
+ if (parsedXhtml) {
18
+ return parsedXhtml.content;
19
+ }
20
+
21
+ // parse markdown if found
22
+ const markdownString = getMarkdownString(element);
23
+ if (markdownString) {
24
+ return (
25
+ <ReactMarkdown
26
+ components={{
27
+ p: (props) => <span {...props} />
28
+ }}>
29
+ {markdownString}
30
+ </ReactMarkdown>
31
+ );
32
+ }
33
+
34
+ // labelText is empty, return null
35
+ if (!textToDisplay) {
36
+ return null;
37
+ }
38
+
39
+ const stylesString = structuredDataCapture.getStyle(element);
40
+ const itemStyles = stylesString ? parseStyleToJs(stylesString) : {};
41
+
42
+ // parse regular text
43
+ return <span style={itemStyles}>{textToDisplay}</span>;
44
+ }
45
+
46
+ export default StyledText;