@medplum/react 2.0.24 → 2.0.26

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 (333) hide show
  1. package/dist/cjs/index.cjs +11 -7714
  2. package/dist/cjs/index.cjs.map +7 -1
  3. package/dist/esm/index.mjs +67 -92
  4. package/dist/esm/index.mjs.map +7 -1
  5. package/dist/types/auth/NewUserForm.d.ts +1 -0
  6. package/dist/types/auth/RegisterForm.d.ts +1 -0
  7. package/package.json +20 -20
  8. package/dist/cjs/index.min.cjs +0 -1
  9. package/dist/esm/AddressDisplay/AddressDisplay.mjs +0 -13
  10. package/dist/esm/AddressDisplay/AddressDisplay.mjs.map +0 -1
  11. package/dist/esm/AddressInput/AddressInput.mjs +0 -57
  12. package/dist/esm/AddressInput/AddressInput.mjs.map +0 -1
  13. package/dist/esm/AnnotationInput/AnnotationInput.mjs +0 -28
  14. package/dist/esm/AnnotationInput/AnnotationInput.mjs.map +0 -1
  15. package/dist/esm/AppShell/AppShell.mjs +0 -37
  16. package/dist/esm/AppShell/AppShell.mjs.map +0 -1
  17. package/dist/esm/AppShell/Header.mjs +0 -88
  18. package/dist/esm/AppShell/Header.mjs.map +0 -1
  19. package/dist/esm/AppShell/HeaderSearchInput.mjs +0 -230
  20. package/dist/esm/AppShell/HeaderSearchInput.mjs.map +0 -1
  21. package/dist/esm/AppShell/Navbar.mjs +0 -169
  22. package/dist/esm/AppShell/Navbar.mjs.map +0 -1
  23. package/dist/esm/AsyncAutocomplete/AsyncAutocomplete.mjs +0 -121
  24. package/dist/esm/AsyncAutocomplete/AsyncAutocomplete.mjs.map +0 -1
  25. package/dist/esm/AttachmentArrayDisplay/AttachmentArrayDisplay.mjs +0 -10
  26. package/dist/esm/AttachmentArrayDisplay/AttachmentArrayDisplay.mjs.map +0 -1
  27. package/dist/esm/AttachmentArrayInput/AttachmentArrayInput.mjs +0 -45
  28. package/dist/esm/AttachmentArrayInput/AttachmentArrayInput.mjs.map +0 -1
  29. package/dist/esm/AttachmentButton/AttachmentButton.mjs +0 -55
  30. package/dist/esm/AttachmentButton/AttachmentButton.mjs.map +0 -1
  31. package/dist/esm/AttachmentDisplay/AttachmentDisplay.mjs +0 -21
  32. package/dist/esm/AttachmentDisplay/AttachmentDisplay.mjs.map +0 -1
  33. package/dist/esm/AttachmentInput/AttachmentInput.mjs +0 -27
  34. package/dist/esm/AttachmentInput/AttachmentInput.mjs.map +0 -1
  35. package/dist/esm/BackboneElementDisplay/BackboneElementDisplay.mjs +0 -49
  36. package/dist/esm/BackboneElementDisplay/BackboneElementDisplay.mjs.map +0 -1
  37. package/dist/esm/BackboneElementInput/BackboneElementInput.mjs +0 -52
  38. package/dist/esm/BackboneElementInput/BackboneElementInput.mjs.map +0 -1
  39. package/dist/esm/BookmarkDialog/BookmarkDialog.mjs +0 -47
  40. package/dist/esm/BookmarkDialog/BookmarkDialog.mjs.map +0 -1
  41. package/dist/esm/CalendarInput/CalendarInput.mjs +0 -133
  42. package/dist/esm/CalendarInput/CalendarInput.mjs.map +0 -1
  43. package/dist/esm/CheckboxFormSection/CheckboxFormSection.mjs +0 -12
  44. package/dist/esm/CheckboxFormSection/CheckboxFormSection.mjs.map +0 -1
  45. package/dist/esm/CodeInput/CodeInput.mjs +0 -24
  46. package/dist/esm/CodeInput/CodeInput.mjs.map +0 -1
  47. package/dist/esm/CodeableConceptDisplay/CodeableConceptDisplay.mjs +0 -9
  48. package/dist/esm/CodeableConceptDisplay/CodeableConceptDisplay.mjs.map +0 -1
  49. package/dist/esm/CodeableConceptInput/CodeableConceptInput.mjs +0 -36
  50. package/dist/esm/CodeableConceptInput/CodeableConceptInput.mjs.map +0 -1
  51. package/dist/esm/CodingDisplay/CodingDisplay.mjs +0 -9
  52. package/dist/esm/CodingDisplay/CodingDisplay.mjs.map +0 -1
  53. package/dist/esm/CodingInput/CodingInput.mjs +0 -32
  54. package/dist/esm/CodingInput/CodingInput.mjs.map +0 -1
  55. package/dist/esm/ContactDetailDisplay/ContactDetailDisplay.mjs +0 -16
  56. package/dist/esm/ContactDetailDisplay/ContactDetailDisplay.mjs.map +0 -1
  57. package/dist/esm/ContactDetailInput/ContactDetailInput.mjs +0 -35
  58. package/dist/esm/ContactDetailInput/ContactDetailInput.mjs.map +0 -1
  59. package/dist/esm/ContactPointDisplay/ContactPointDisplay.mjs +0 -29
  60. package/dist/esm/ContactPointDisplay/ContactPointDisplay.mjs.map +0 -1
  61. package/dist/esm/ContactPointInput/ContactPointInput.mjs +0 -45
  62. package/dist/esm/ContactPointInput/ContactPointInput.mjs.map +0 -1
  63. package/dist/esm/Container/Container.mjs +0 -19
  64. package/dist/esm/Container/Container.mjs.map +0 -1
  65. package/dist/esm/DateTimeInput/DateTimeInput.mjs +0 -71
  66. package/dist/esm/DateTimeInput/DateTimeInput.mjs.map +0 -1
  67. package/dist/esm/DefaultResourceTimeline/DefaultResourceTimeline.mjs +0 -16
  68. package/dist/esm/DefaultResourceTimeline/DefaultResourceTimeline.mjs.map +0 -1
  69. package/dist/esm/DescriptionList/DescriptionList.mjs +0 -35
  70. package/dist/esm/DescriptionList/DescriptionList.mjs.map +0 -1
  71. package/dist/esm/DiagnosticReportDisplay/DiagnosticReportDisplay.mjs +0 -172
  72. package/dist/esm/DiagnosticReportDisplay/DiagnosticReportDisplay.mjs.map +0 -1
  73. package/dist/esm/Document/Document.mjs +0 -12
  74. package/dist/esm/Document/Document.mjs.map +0 -1
  75. package/dist/esm/EncounterTimeline/EncounterTimeline.mjs +0 -32
  76. package/dist/esm/EncounterTimeline/EncounterTimeline.mjs.map +0 -1
  77. package/dist/esm/ErrorBoundary/ErrorBoundary.mjs +0 -30
  78. package/dist/esm/ErrorBoundary/ErrorBoundary.mjs.map +0 -1
  79. package/dist/esm/ExtensionInput/ExtensionInput.mjs +0 -14
  80. package/dist/esm/ExtensionInput/ExtensionInput.mjs.map +0 -1
  81. package/dist/esm/FhirPathDisplay/FhirPathDisplay.mjs +0 -23
  82. package/dist/esm/FhirPathDisplay/FhirPathDisplay.mjs.map +0 -1
  83. package/dist/esm/FhirPathTable/FhirPathTable.mjs +0 -122
  84. package/dist/esm/FhirPathTable/FhirPathTable.mjs.map +0 -1
  85. package/dist/esm/Form/Form.mjs +0 -15
  86. package/dist/esm/Form/Form.mjs.map +0 -1
  87. package/dist/esm/Form/FormUtils.mjs +0 -50
  88. package/dist/esm/Form/FormUtils.mjs.map +0 -1
  89. package/dist/esm/FormSection/FormSection.mjs +0 -10
  90. package/dist/esm/FormSection/FormSection.mjs.map +0 -1
  91. package/dist/esm/GoogleButton/GoogleButton.mjs +0 -49
  92. package/dist/esm/GoogleButton/GoogleButton.mjs.map +0 -1
  93. package/dist/esm/HumanNameDisplay/HumanNameDisplay.mjs +0 -13
  94. package/dist/esm/HumanNameDisplay/HumanNameDisplay.mjs.map +0 -1
  95. package/dist/esm/HumanNameInput/HumanNameInput.mjs +0 -50
  96. package/dist/esm/HumanNameInput/HumanNameInput.mjs.map +0 -1
  97. package/dist/esm/IdentifierDisplay/IdentifierDisplay.mjs +0 -11
  98. package/dist/esm/IdentifierDisplay/IdentifierDisplay.mjs.map +0 -1
  99. package/dist/esm/IdentifierInput/IdentifierInput.mjs +0 -18
  100. package/dist/esm/IdentifierInput/IdentifierInput.mjs.map +0 -1
  101. package/dist/esm/Loading/Loading.mjs +0 -10
  102. package/dist/esm/Loading/Loading.mjs.map +0 -1
  103. package/dist/esm/Logo/Logo.mjs +0 -14
  104. package/dist/esm/Logo/Logo.mjs.map +0 -1
  105. package/dist/esm/MedplumLink/MedplumLink.mjs +0 -52
  106. package/dist/esm/MedplumLink/MedplumLink.mjs.map +0 -1
  107. package/dist/esm/MedplumProvider/MedplumProvider.mjs +0 -84
  108. package/dist/esm/MedplumProvider/MedplumProvider.mjs.map +0 -1
  109. package/dist/esm/MoneyDisplay/MoneyDisplay.mjs +0 -9
  110. package/dist/esm/MoneyDisplay/MoneyDisplay.mjs.map +0 -1
  111. package/dist/esm/MoneyInput/MoneyInput.mjs +0 -53
  112. package/dist/esm/MoneyInput/MoneyInput.mjs.map +0 -1
  113. package/dist/esm/NoteDisplay/NoteDisplay.mjs +0 -18
  114. package/dist/esm/NoteDisplay/NoteDisplay.mjs.map +0 -1
  115. package/dist/esm/OperationOutcomeAlert/OperationOutcomeAlert.mjs +0 -14
  116. package/dist/esm/OperationOutcomeAlert/OperationOutcomeAlert.mjs.map +0 -1
  117. package/dist/esm/Panel/Panel.mjs +0 -34
  118. package/dist/esm/Panel/Panel.mjs.map +0 -1
  119. package/dist/esm/PatientTimeline/PatientTimeline.mjs +0 -38
  120. package/dist/esm/PatientTimeline/PatientTimeline.mjs.map +0 -1
  121. package/dist/esm/PeriodInput/PeriodInput.mjs +0 -19
  122. package/dist/esm/PeriodInput/PeriodInput.mjs.map +0 -1
  123. package/dist/esm/PlanDefinitionBuilder/PlanDefinitionBuilder.mjs +0 -258
  124. package/dist/esm/PlanDefinitionBuilder/PlanDefinitionBuilder.mjs.map +0 -1
  125. package/dist/esm/QuantityDisplay/QuantityDisplay.mjs +0 -9
  126. package/dist/esm/QuantityDisplay/QuantityDisplay.mjs.map +0 -1
  127. package/dist/esm/QuantityInput/QuantityInput.mjs +0 -40
  128. package/dist/esm/QuantityInput/QuantityInput.mjs.map +0 -1
  129. package/dist/esm/QuestionnaireBuilder/QuestionnaireBuilder.mjs +0 -288
  130. package/dist/esm/QuestionnaireBuilder/QuestionnaireBuilder.mjs.map +0 -1
  131. package/dist/esm/QuestionnaireForm/QuestionnaireForm.mjs +0 -276
  132. package/dist/esm/QuestionnaireForm/QuestionnaireForm.mjs.map +0 -1
  133. package/dist/esm/RangeDisplay/RangeDisplay.mjs +0 -9
  134. package/dist/esm/RangeDisplay/RangeDisplay.mjs.map +0 -1
  135. package/dist/esm/RangeInput/RangeInput.mjs +0 -31
  136. package/dist/esm/RangeInput/RangeInput.mjs.map +0 -1
  137. package/dist/esm/RatioDisplay/RatioDisplay.mjs +0 -16
  138. package/dist/esm/RatioDisplay/RatioDisplay.mjs.map +0 -1
  139. package/dist/esm/RatioInput/RatioInput.mjs +0 -31
  140. package/dist/esm/RatioInput/RatioInput.mjs.map +0 -1
  141. package/dist/esm/ReferenceDisplay/ReferenceDisplay.mjs +0 -21
  142. package/dist/esm/ReferenceDisplay/ReferenceDisplay.mjs.map +0 -1
  143. package/dist/esm/ReferenceInput/ReferenceInput.mjs +0 -45
  144. package/dist/esm/ReferenceInput/ReferenceInput.mjs.map +0 -1
  145. package/dist/esm/ReferenceRangeEditor/ReferenceRangeEditor.mjs +0 -286
  146. package/dist/esm/ReferenceRangeEditor/ReferenceRangeEditor.mjs.map +0 -1
  147. package/dist/esm/RequestGroupDisplay/RequestGroupDisplay.mjs +0 -72
  148. package/dist/esm/RequestGroupDisplay/RequestGroupDisplay.mjs.map +0 -1
  149. package/dist/esm/ResourceArrayDisplay/ResourceArrayDisplay.mjs +0 -13
  150. package/dist/esm/ResourceArrayDisplay/ResourceArrayDisplay.mjs.map +0 -1
  151. package/dist/esm/ResourceArrayInput/ResourceArrayInput.mjs +0 -51
  152. package/dist/esm/ResourceArrayInput/ResourceArrayInput.mjs.map +0 -1
  153. package/dist/esm/ResourceAvatar/ResourceAvatar.mjs +0 -23
  154. package/dist/esm/ResourceAvatar/ResourceAvatar.mjs.map +0 -1
  155. package/dist/esm/ResourceBadge/ResourceBadge.mjs +0 -13
  156. package/dist/esm/ResourceBadge/ResourceBadge.mjs.map +0 -1
  157. package/dist/esm/ResourceBlame/ResourceBlame.mjs +0 -113
  158. package/dist/esm/ResourceBlame/ResourceBlame.mjs.map +0 -1
  159. package/dist/esm/ResourceDiff/ResourceDiff.mjs +0 -39
  160. package/dist/esm/ResourceDiff/ResourceDiff.mjs.map +0 -1
  161. package/dist/esm/ResourceDiffTable/ResourceDiffTable.mjs +0 -80
  162. package/dist/esm/ResourceDiffTable/ResourceDiffTable.mjs.map +0 -1
  163. package/dist/esm/ResourceForm/ResourceForm.mjs +0 -56
  164. package/dist/esm/ResourceForm/ResourceForm.mjs.map +0 -1
  165. package/dist/esm/ResourceHistoryTable/ResourceHistoryTable.mjs +0 -50
  166. package/dist/esm/ResourceHistoryTable/ResourceHistoryTable.mjs.map +0 -1
  167. package/dist/esm/ResourceInput/ResourceInput.mjs +0 -70
  168. package/dist/esm/ResourceInput/ResourceInput.mjs.map +0 -1
  169. package/dist/esm/ResourceName/ResourceName.mjs +0 -25
  170. package/dist/esm/ResourceName/ResourceName.mjs.map +0 -1
  171. package/dist/esm/ResourcePropertyDisplay/ResourcePropertyDisplay.mjs +0 -119
  172. package/dist/esm/ResourcePropertyDisplay/ResourcePropertyDisplay.mjs.map +0 -1
  173. package/dist/esm/ResourcePropertyInput/ResourcePropertyInput.mjs +0 -171
  174. package/dist/esm/ResourcePropertyInput/ResourcePropertyInput.mjs.map +0 -1
  175. package/dist/esm/ResourceTable/ResourceTable.mjs +0 -25
  176. package/dist/esm/ResourceTable/ResourceTable.mjs.map +0 -1
  177. package/dist/esm/ResourceTimeline/ResourceTimeline.mjs +0 -309
  178. package/dist/esm/ResourceTimeline/ResourceTimeline.mjs.map +0 -1
  179. package/dist/esm/Scheduler/Scheduler.mjs +0 -98
  180. package/dist/esm/Scheduler/Scheduler.mjs.map +0 -1
  181. package/dist/esm/SearchControl/SearchControl.mjs +0 -337
  182. package/dist/esm/SearchControl/SearchControl.mjs.map +0 -1
  183. package/dist/esm/SearchControl/SearchControlField.mjs +0 -95
  184. package/dist/esm/SearchControl/SearchControlField.mjs.map +0 -1
  185. package/dist/esm/SearchControl/SearchUtils.mjs +0 -497
  186. package/dist/esm/SearchControl/SearchUtils.mjs.map +0 -1
  187. package/dist/esm/SearchExportDialog/SearchExportDialog.mjs +0 -19
  188. package/dist/esm/SearchExportDialog/SearchExportDialog.mjs.map +0 -1
  189. package/dist/esm/SearchFieldEditor/SearchFieldEditor.mjs +0 -196
  190. package/dist/esm/SearchFieldEditor/SearchFieldEditor.mjs.map +0 -1
  191. package/dist/esm/SearchFilterEditor/SearchFilterEditor.mjs +0 -97
  192. package/dist/esm/SearchFilterEditor/SearchFilterEditor.mjs.map +0 -1
  193. package/dist/esm/SearchFilterValueDialog/SearchFilterValueDialog.mjs +0 -22
  194. package/dist/esm/SearchFilterValueDialog/SearchFilterValueDialog.mjs.map +0 -1
  195. package/dist/esm/SearchFilterValueDisplay/SearchFilterValueDisplay.mjs +0 -22
  196. package/dist/esm/SearchFilterValueDisplay/SearchFilterValueDisplay.mjs.map +0 -1
  197. package/dist/esm/SearchFilterValueInput/SearchFilterValueInput.mjs +0 -57
  198. package/dist/esm/SearchFilterValueInput/SearchFilterValueInput.mjs.map +0 -1
  199. package/dist/esm/SearchPopupMenu/SearchPopupMenu.mjs +0 -134
  200. package/dist/esm/SearchPopupMenu/SearchPopupMenu.mjs.map +0 -1
  201. package/dist/esm/ServiceRequestTimeline/ServiceRequestTimeline.mjs +0 -36
  202. package/dist/esm/ServiceRequestTimeline/ServiceRequestTimeline.mjs.map +0 -1
  203. package/dist/esm/StatusBadge/StatusBadge.mjs +0 -63
  204. package/dist/esm/StatusBadge/StatusBadge.mjs.map +0 -1
  205. package/dist/esm/Timeline/Timeline.mjs +0 -40
  206. package/dist/esm/Timeline/Timeline.mjs.map +0 -1
  207. package/dist/esm/TimingInput/TimingInput.mjs +0 -76
  208. package/dist/esm/TimingInput/TimingInput.mjs.map +0 -1
  209. package/dist/esm/ValueSetAutocomplete/ValueSetAutocomplete.mjs +0 -58
  210. package/dist/esm/ValueSetAutocomplete/ValueSetAutocomplete.mjs.map +0 -1
  211. package/dist/esm/auth/AuthenticationForm.mjs +0 -89
  212. package/dist/esm/auth/AuthenticationForm.mjs.map +0 -1
  213. package/dist/esm/auth/ChooseProfileForm.mjs +0 -33
  214. package/dist/esm/auth/ChooseProfileForm.mjs.map +0 -1
  215. package/dist/esm/auth/ChooseScopeForm.mjs +0 -28
  216. package/dist/esm/auth/ChooseScopeForm.mjs.map +0 -1
  217. package/dist/esm/auth/MfaForm.mjs +0 -34
  218. package/dist/esm/auth/MfaForm.mjs.map +0 -1
  219. package/dist/esm/auth/NewProjectForm.mjs +0 -39
  220. package/dist/esm/auth/NewProjectForm.mjs.map +0 -1
  221. package/dist/esm/auth/NewUserForm.mjs +0 -84
  222. package/dist/esm/auth/NewUserForm.mjs.map +0 -1
  223. package/dist/esm/auth/RegisterForm.mjs +0 -39
  224. package/dist/esm/auth/RegisterForm.mjs.map +0 -1
  225. package/dist/esm/auth/SignInForm.mjs +0 -100
  226. package/dist/esm/auth/SignInForm.mjs.map +0 -1
  227. package/dist/esm/constants.mjs +0 -12
  228. package/dist/esm/constants.mjs.map +0 -1
  229. package/dist/esm/index.min.mjs +0 -1
  230. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/createReactComponent.mjs +0 -70
  231. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/createReactComponent.mjs.map +0 -1
  232. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/defaultAttributes.mjs +0 -18
  233. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/defaultAttributes.mjs.map +0 -1
  234. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconAdjustmentsHorizontal.mjs +0 -25
  235. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconAdjustmentsHorizontal.mjs.map +0 -1
  236. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconAlertCircle.mjs +0 -15
  237. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconAlertCircle.mjs.map +0 -1
  238. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconBleach.mjs +0 -19
  239. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconBleach.mjs.map +0 -1
  240. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconBleachOff.mjs +0 -20
  241. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconBleachOff.mjs.map +0 -1
  242. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconBoxMultiple.mjs +0 -26
  243. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconBoxMultiple.mjs.map +0 -1
  244. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconBracketsContain.mjs +0 -17
  245. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconBracketsContain.mjs.map +0 -1
  246. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconBucket.mjs +0 -20
  247. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconBucket.mjs.map +0 -1
  248. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconBucketOff.mjs +0 -27
  249. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconBucketOff.mjs.map +0 -1
  250. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconCalendar.mjs +0 -24
  251. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconCalendar.mjs.map +0 -1
  252. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconCheck.mjs +0 -13
  253. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconCheck.mjs.map +0 -1
  254. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconCheckbox.mjs +0 -20
  255. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconCheckbox.mjs.map +0 -1
  256. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconChevronDown.mjs +0 -13
  257. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconChevronDown.mjs.map +0 -1
  258. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconCircleMinus.mjs +0 -14
  259. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconCircleMinus.mjs.map +0 -1
  260. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconCirclePlus.mjs +0 -15
  261. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconCirclePlus.mjs.map +0 -1
  262. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconCloudUpload.mjs +0 -21
  263. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconCloudUpload.mjs.map +0 -1
  264. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconColumns.mjs +0 -20
  265. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconColumns.mjs.map +0 -1
  266. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconCurrencyDollar.mjs +0 -20
  267. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconCurrencyDollar.mjs.map +0 -1
  268. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconDots.mjs +0 -15
  269. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconDots.mjs.map +0 -1
  270. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconEdit.mjs +0 -27
  271. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconEdit.mjs.map +0 -1
  272. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconEqual.mjs +0 -14
  273. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconEqual.mjs.map +0 -1
  274. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconEqualNot.mjs +0 -15
  275. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconEqualNot.mjs.map +0 -1
  276. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconFileAlert.mjs +0 -22
  277. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconFileAlert.mjs.map +0 -1
  278. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconFilePlus.mjs +0 -22
  279. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconFilePlus.mjs.map +0 -1
  280. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconFilter.mjs +0 -19
  281. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconFilter.mjs.map +0 -1
  282. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconListDetails.mjs +0 -30
  283. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconListDetails.mjs.map +0 -1
  284. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconLogout.mjs +0 -21
  285. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconLogout.mjs.map +0 -1
  286. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconMathGreater.mjs +0 -13
  287. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconMathGreater.mjs.map +0 -1
  288. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconMathLower.mjs +0 -13
  289. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconMathLower.mjs.map +0 -1
  290. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconMessage.mjs +0 -21
  291. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconMessage.mjs.map +0 -1
  292. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconPin.mjs +0 -21
  293. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconPin.mjs.map +0 -1
  294. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconPinnedOff.mjs +0 -22
  295. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconPinnedOff.mjs.map +0 -1
  296. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconPlus.mjs +0 -14
  297. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconPlus.mjs.map +0 -1
  298. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconSearch.mjs +0 -14
  299. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconSearch.mjs.map +0 -1
  300. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconSettings.mjs +0 -20
  301. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconSettings.mjs.map +0 -1
  302. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconSortAscending.mjs +0 -17
  303. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconSortAscending.mjs.map +0 -1
  304. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconSortDescending.mjs +0 -17
  305. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconSortDescending.mjs.map +0 -1
  306. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconSquare.mjs +0 -19
  307. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconSquare.mjs.map +0 -1
  308. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconSwitchHorizontal.mjs +0 -20
  309. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconSwitchHorizontal.mjs.map +0 -1
  310. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconTableExport.mjs +0 -23
  311. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconTableExport.mjs.map +0 -1
  312. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconTrash.mjs +0 -20
  313. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconTrash.mjs.map +0 -1
  314. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconX.mjs +0 -14
  315. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconX.mjs.map +0 -1
  316. package/dist/esm/useResource/useResource.mjs +0 -68
  317. package/dist/esm/useResource/useResource.mjs.map +0 -1
  318. package/dist/esm/utils/blame.mjs +0 -72
  319. package/dist/esm/utils/blame.mjs.map +0 -1
  320. package/dist/esm/utils/date.mjs +0 -56
  321. package/dist/esm/utils/date.mjs.map +0 -1
  322. package/dist/esm/utils/diff.mjs +0 -118
  323. package/dist/esm/utils/diff.mjs.map +0 -1
  324. package/dist/esm/utils/dom.mjs +0 -34
  325. package/dist/esm/utils/dom.mjs.map +0 -1
  326. package/dist/esm/utils/outcomes.mjs +0 -30
  327. package/dist/esm/utils/outcomes.mjs.map +0 -1
  328. package/dist/esm/utils/questionnaire.mjs +0 -26
  329. package/dist/esm/utils/questionnaire.mjs.map +0 -1
  330. package/dist/esm/utils/recaptcha.mjs +0 -32
  331. package/dist/esm/utils/recaptcha.mjs.map +0 -1
  332. package/dist/esm/utils/script.mjs +0 -16
  333. package/dist/esm/utils/script.mjs.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"QuestionnaireForm.mjs","sources":["../../../src/QuestionnaireForm/QuestionnaireForm.tsx"],"sourcesContent":["import { Button, Checkbox, Group, NativeSelect, Radio, Stack, Textarea, TextInput, Title } from '@mantine/core';\nimport {\n capitalize,\n createReference,\n deepEquals,\n getQuestionnaireAnswers,\n getReferenceString,\n getTypedPropertyValue,\n globalSchema,\n IndexedStructureDefinition,\n ProfileResource,\n PropertyType,\n stringify,\n TypedValue,\n} from '@medplum/core';\nimport {\n Questionnaire,\n QuestionnaireItem,\n QuestionnaireItemAnswerOption,\n QuestionnaireItemInitial,\n QuestionnaireResponse,\n QuestionnaireResponseItem,\n QuestionnaireResponseItemAnswer,\n Reference,\n} from '@medplum/fhirtypes';\nimport React, { ChangeEvent, useEffect, useState } from 'react';\nimport { AttachmentInput } from '../AttachmentInput/AttachmentInput';\nimport { CheckboxFormSection } from '../CheckboxFormSection/CheckboxFormSection';\nimport { DateTimeInput } from '../DateTimeInput/DateTimeInput';\nimport { Form } from '../Form/Form';\nimport { FormSection } from '../FormSection/FormSection';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\nimport { QuantityInput } from '../QuantityInput/QuantityInput';\nimport { ReferenceInput } from '../ReferenceInput/ReferenceInput';\nimport { ResourcePropertyDisplay } from '../ResourcePropertyDisplay/ResourcePropertyDisplay';\nimport { useResource } from '../useResource/useResource';\nimport { QuestionnaireItemType } from '../utils/questionnaire';\n\nexport interface QuestionnaireFormProps {\n questionnaire: Questionnaire | Reference<Questionnaire>;\n subject?: Reference;\n submitButtonText?: string;\n onSubmit: (response: QuestionnaireResponse) => void;\n}\n\nexport function QuestionnaireForm(props: QuestionnaireFormProps): JSX.Element | null {\n const medplum = useMedplum();\n const source = medplum.getProfile();\n const [schema, setSchema] = useState<IndexedStructureDefinition | undefined>();\n const questionnaire = useResource(props.questionnaire);\n const [response, setResponse] = useState<QuestionnaireResponse | undefined>();\n const [answers, setAnswers] = useState<Record<string, QuestionnaireResponseItemAnswer>>({});\n\n useEffect(() => {\n medplum\n .requestSchema('Questionnaire')\n .then(() => medplum.requestSchema('QuestionnaireResponse'))\n .then(setSchema)\n .catch(console.log);\n }, [medplum]);\n\n useEffect(() => {\n setResponse(questionnaire ? buildInitialResponse(questionnaire) : undefined);\n }, [questionnaire]);\n\n function setItems(newResponseItems: QuestionnaireResponseItem[]): void {\n const newResponse: QuestionnaireResponse = {\n resourceType: 'QuestionnaireResponse',\n item: newResponseItems,\n };\n setResponse(newResponse);\n setAnswers(getQuestionnaireAnswers(newResponse));\n }\n\n if (!schema || !questionnaire) {\n return null;\n }\n\n return (\n <Form\n testid=\"questionnaire-form\"\n onSubmit={() => {\n if (props.onSubmit && response) {\n props.onSubmit({\n ...response,\n questionnaire: getReferenceString(questionnaire),\n subject: props.subject,\n source: createReference(source as ProfileResource),\n authored: new Date().toISOString(),\n status: 'completed',\n });\n }\n }}\n >\n {questionnaire.title && <Title>{questionnaire.title}</Title>}\n {questionnaire.item && (\n <QuestionnaireFormItemArray items={questionnaire.item} answers={answers} onChange={setItems} />\n )}\n <Group position=\"right\" mt=\"xl\">\n <Button type=\"submit\">{props.submitButtonText || 'OK'}</Button>\n </Group>\n </Form>\n );\n}\n\ninterface QuestionnaireFormItemArrayProps {\n items: QuestionnaireItem[];\n answers: Record<string, QuestionnaireResponseItemAnswer>;\n onChange: (newResponseItems: QuestionnaireResponseItem[]) => void;\n}\n\nfunction QuestionnaireFormItemArray(props: QuestionnaireFormItemArrayProps): JSX.Element {\n const [responseItems, setResponseItems] = useState<QuestionnaireResponseItem[]>(\n buildInitialResponseItems(props.items)\n );\n\n function setResponseItem(index: number, newResponseItem: QuestionnaireResponseItem): void {\n const newResponseItems = responseItems.slice();\n newResponseItems[index] = newResponseItem;\n setResponseItems(newResponseItems);\n props.onChange(newResponseItems);\n }\n\n return (\n <Stack>\n {props.items.map((item, index) => {\n if (!isQuestionEnabled(item, props.answers)) {\n return null;\n }\n if (item.type === QuestionnaireItemType.display) {\n return <p key={item.linkId}>{item.text}</p>;\n }\n if (item.type === QuestionnaireItemType.group) {\n return (\n <QuestionnaireFormItem\n key={item.linkId}\n item={item}\n answers={props.answers}\n onChange={(newResponseItem) => setResponseItem(index, newResponseItem)}\n />\n );\n }\n if (item.type === QuestionnaireItemType.boolean) {\n const initial = item.initial && item.initial.length > 0 ? item.initial[0] : undefined;\n return (\n <CheckboxFormSection key={item.linkId} title={item.text} htmlFor={item.linkId}>\n <Checkbox\n id={item.linkId}\n name={item.linkId}\n defaultChecked={initial?.valueBoolean}\n onChange={(e) =>\n setResponseItem(index, {\n linkId: item.linkId,\n text: item.text,\n answer: [{ valueBoolean: e.currentTarget.checked }],\n })\n }\n />\n </CheckboxFormSection>\n );\n }\n return (\n <FormSection key={item.linkId} htmlFor={item.linkId} title={item.text || ''}>\n <QuestionnaireFormItem\n item={item}\n answers={props.answers}\n onChange={(newResponseItem) => setResponseItem(index, newResponseItem)}\n />\n </FormSection>\n );\n })}\n </Stack>\n );\n}\n\nexport interface QuestionnaireFormItemProps {\n item: QuestionnaireItem;\n answers: Record<string, QuestionnaireResponseItemAnswer>;\n onChange: (newResponseItem: QuestionnaireResponseItem) => void;\n}\n\nexport function QuestionnaireFormItem(props: QuestionnaireFormItemProps): JSX.Element | null {\n const item = props.item;\n\n const type = item.type as QuestionnaireItemType;\n if (!type) {\n return null;\n }\n\n const name = item.linkId;\n if (!name) {\n return null;\n }\n\n const initial = item.initial && item.initial.length > 0 ? item.initial[0] : undefined;\n\n function onChangeItem(newResponseItems: QuestionnaireResponseItem[]): void {\n props.onChange({\n linkId: item.linkId,\n text: item.text,\n item: newResponseItems,\n });\n }\n\n function onChangeAnswer(newResponseAnswer: QuestionnaireResponseItemAnswer): void {\n props.onChange({\n linkId: item.linkId,\n text: item.text,\n answer: [newResponseAnswer],\n });\n }\n\n switch (type) {\n case QuestionnaireItemType.group:\n return (\n <div>\n <h3>{item.text}</h3>\n {item.item && (\n <QuestionnaireFormItemArray items={item.item} answers={props.answers} onChange={onChangeItem} />\n )}\n </div>\n );\n case QuestionnaireItemType.boolean:\n return (\n <Checkbox\n id={name}\n name={name}\n defaultChecked={initial?.valueBoolean}\n onChange={(e) => onChangeAnswer({ valueBoolean: e.currentTarget.checked })}\n />\n );\n case QuestionnaireItemType.decimal:\n return (\n <TextInput\n type=\"number\"\n step=\"any\"\n id={name}\n name={name}\n defaultValue={initial?.valueDecimal}\n onChange={(e) => onChangeAnswer({ valueDecimal: e.currentTarget.valueAsNumber })}\n />\n );\n case QuestionnaireItemType.integer:\n return (\n <TextInput\n type=\"number\"\n step={1}\n id={name}\n name={name}\n defaultValue={initial?.valueInteger}\n onChange={(e) => onChangeAnswer({ valueInteger: e.currentTarget.valueAsNumber })}\n />\n );\n case QuestionnaireItemType.date:\n return (\n <TextInput\n type=\"date\"\n id={name}\n name={name}\n defaultValue={initial?.valueDate}\n onChange={(e) => onChangeAnswer({ valueDate: e.currentTarget.value })}\n />\n );\n case QuestionnaireItemType.dateTime:\n return (\n <DateTimeInput\n name={name}\n defaultValue={initial?.valueDateTime}\n onChange={(newValue: string) => onChangeAnswer({ valueDateTime: newValue })}\n />\n );\n case QuestionnaireItemType.time:\n return (\n <TextInput\n type=\"time\"\n id={name}\n name={name}\n defaultValue={initial?.valueTime}\n onChange={(e) => onChangeAnswer({ valueTime: e.currentTarget.value })}\n />\n );\n case QuestionnaireItemType.string:\n case QuestionnaireItemType.url:\n return (\n <TextInput\n id={name}\n name={name}\n defaultValue={initial?.valueString}\n onChange={(e) => onChangeAnswer({ valueString: e.currentTarget.value })}\n />\n );\n case QuestionnaireItemType.text:\n return (\n <Textarea\n id={name}\n name={name}\n defaultValue={initial?.valueString}\n onChange={(e) => onChangeAnswer({ valueString: e.currentTarget.value })}\n />\n );\n case QuestionnaireItemType.attachment:\n return (\n <AttachmentInput\n name={name}\n defaultValue={initial?.valueAttachment}\n onChange={(newValue) => onChangeAnswer({ valueAttachment: newValue })}\n />\n );\n case QuestionnaireItemType.reference:\n return (\n <ReferenceInput\n name={name}\n defaultValue={initial?.valueReference}\n onChange={(newValue) => onChangeAnswer({ valueReference: newValue })}\n />\n );\n case QuestionnaireItemType.quantity:\n return (\n <QuantityInput\n name={name}\n defaultValue={initial?.valueQuantity}\n onChange={(newValue) => onChangeAnswer({ valueQuantity: newValue })}\n disableWheel\n />\n );\n case QuestionnaireItemType.choice:\n case QuestionnaireItemType.openChoice:\n if (isDropDownChoice(item)) {\n return (\n <QuestionnaireChoiceDropDownInput name={name} item={item} initial={initial} onChangeAnswer={onChangeAnswer} />\n );\n } else {\n return (\n <QuestionnaireChoiceRadioInput name={name} item={item} initial={initial} onChangeAnswer={onChangeAnswer} />\n );\n }\n default:\n return null;\n }\n}\n\ninterface QuestionnaireChoiceInputProps {\n name: string;\n item: QuestionnaireItem;\n initial: QuestionnaireItemInitial | undefined;\n onChangeAnswer: (newResponseAnswer: QuestionnaireResponseItemAnswer) => void;\n}\n\nfunction QuestionnaireChoiceDropDownInput(props: QuestionnaireChoiceInputProps): JSX.Element {\n const { name, item, initial } = props;\n const initialValue = getTypedPropertyValue({ type: 'QuestionnaireItemInitial', value: initial }, 'value') as\n | TypedValue\n | undefined;\n\n const data = [''];\n if (item.answerOption) {\n for (const option of item.answerOption) {\n const optionValue = getTypedPropertyValue(\n { type: 'QuestionnaireItemAnswerOption', value: option },\n 'value'\n ) as TypedValue;\n data.push(typedValueToString(optionValue) as string);\n }\n }\n\n return (\n <NativeSelect\n id={name}\n name={name}\n onChange={(e: ChangeEvent<HTMLSelectElement>) => {\n const index = e.currentTarget.selectedIndex;\n if (index === 0) {\n props.onChangeAnswer({});\n return;\n }\n const option = (item.answerOption as QuestionnaireItemAnswerOption[])[index - 1];\n const optionValue = getTypedPropertyValue(\n { type: 'QuestionnaireItemAnswerOption', value: option },\n 'value'\n ) as TypedValue;\n const propertyName = 'value' + capitalize(optionValue.type);\n props.onChangeAnswer({ [propertyName]: optionValue.value });\n }}\n defaultValue={typedValueToString(initialValue)}\n data={data}\n />\n );\n}\n\nfunction typedValueToString(typedValue: TypedValue | undefined): string | undefined {\n if (!typedValue) {\n return undefined;\n }\n if (typedValue.type === 'CodeableConcept') {\n return typedValue.value.coding[0].display;\n }\n if (typedValue.type === 'Coding') {\n return typedValue.value.display;\n }\n return typedValue.value.toString();\n}\n\nfunction QuestionnaireChoiceRadioInput(props: QuestionnaireChoiceInputProps): JSX.Element {\n const { name, item, initial, onChangeAnswer } = props;\n const valueElementDefinition = globalSchema.types['QuestionnaireItemAnswerOption'].properties['value[x]'];\n const initialValue = getTypedPropertyValue({ type: 'QuestionnaireItemInitial', value: initial }, 'value') as\n | TypedValue\n | undefined;\n\n const options: [string, TypedValue][] = [];\n let defaultValue = undefined;\n if (item.answerOption) {\n for (let i = 0; i < item.answerOption.length; i++) {\n const option = item.answerOption[i];\n const optionName = `${name}-option-${i}`;\n const optionValue = getTypedPropertyValue(\n { type: 'QuestionnaireItemAnswerOption', value: option },\n 'value'\n ) as TypedValue;\n if (initialValue && stringify(optionValue) === stringify(initialValue)) {\n defaultValue = optionName;\n }\n options.push([optionName, optionValue]);\n }\n }\n\n return (\n <Radio.Group\n name={name}\n defaultValue={defaultValue}\n onChange={(newValue) => {\n const option = options.find((option) => option[0] === newValue);\n if (option) {\n const optionValue = option[1];\n const propertyName = 'value' + capitalize(optionValue.type);\n onChangeAnswer({ [propertyName]: optionValue.value });\n }\n }}\n >\n {options.map(([optionName, optionValue]) => (\n <Radio\n key={optionName}\n id={optionName}\n value={optionName}\n label={\n <ResourcePropertyDisplay\n property={valueElementDefinition}\n propertyType={optionValue.type as PropertyType}\n value={optionValue.value}\n />\n }\n />\n ))}\n </Radio.Group>\n );\n}\n\nfunction buildInitialResponse(questionnaire: Questionnaire): QuestionnaireResponse {\n const response: QuestionnaireResponse = {\n resourceType: 'QuestionnaireResponse',\n questionnaire: getReferenceString(questionnaire),\n item: buildInitialResponseItems(questionnaire.item),\n };\n\n return response;\n}\n\nfunction buildInitialResponseItems(items: QuestionnaireItem[] | undefined): QuestionnaireResponseItem[] {\n return items?.map(buildInitialResponseItem) ?? [];\n}\n\nfunction buildInitialResponseItem(item: QuestionnaireItem): QuestionnaireResponseItem {\n return {\n linkId: item.linkId,\n text: item.text,\n item: buildInitialResponseItems(item.item),\n answer: item.initial?.map(buildInitialResponseAnswer) ?? [],\n };\n}\n\nfunction buildInitialResponseAnswer(answer: QuestionnaireItemInitial): QuestionnaireResponseItemAnswer {\n // This works because QuestionnaireItemInitial and QuestionnaireResponseItemAnswer\n // have the same properties.\n return { ...answer };\n}\n\nfunction isDropDownChoice(item: QuestionnaireItem): boolean {\n return !!item.extension?.some(\n (e) =>\n e.url === 'http://hl7.org/fhir/StructureDefinition/questionnaire-itemControl' &&\n e.valueCodeableConcept?.coding?.[0]?.code === 'drop-down'\n );\n}\n\nexport function isQuestionEnabled(\n item: QuestionnaireItem,\n answers: Record<string, QuestionnaireResponseItemAnswer>\n): boolean {\n if (!item.enableWhen) {\n return true;\n }\n const enableBehavior = item.enableBehavior || 'any';\n for (const enableWhen of item.enableWhen) {\n const expectedAnswer = getTypedPropertyValue(\n {\n type: 'QuestionnaireItemEnableWhen',\n value: enableWhen,\n },\n 'answer[x]'\n );\n const actualAnswer = getTypedPropertyValue(\n {\n type: 'QuestionnaireResponseItemAnswer',\n value: answers[enableWhen.question as string],\n },\n 'value[x]'\n );\n const match = deepEquals(expectedAnswer, actualAnswer);\n if (enableBehavior === 'any' && match) {\n return true;\n }\n if (enableBehavior === 'all' && !match) {\n return false;\n }\n }\n if (enableBehavior === 'any') {\n return false;\n } else {\n return true;\n }\n}\n"],"names":[],"mappings":"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"}
@@ -1,9 +0,0 @@
1
- import { formatRange } from '@medplum/core';
2
- import React from 'react';
3
-
4
- function RangeDisplay(props) {
5
- return React.createElement(React.Fragment, null, formatRange(props.value));
6
- }
7
-
8
- export { RangeDisplay };
9
- //# sourceMappingURL=RangeDisplay.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"RangeDisplay.mjs","sources":["../../../src/RangeDisplay/RangeDisplay.tsx"],"sourcesContent":["import { formatRange } from '@medplum/core';\nimport { Range } from '@medplum/fhirtypes';\nimport React from 'react';\n\nexport interface RangeDisplayProps {\n value?: Range;\n}\n\nexport function RangeDisplay(props: RangeDisplayProps): JSX.Element | null {\n return <>{formatRange(props.value)}</>;\n}\n"],"names":[],"mappings":";;;AAQM,SAAU,YAAY,CAAC,KAAwB,EAAA;IACnD,OAAO,KAAA,CAAA,aAAA,CAAA,KAAA,CAAA,QAAA,EAAA,IAAA,EAAG,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,CAAI,CAAC;AACzC;;;;"}
@@ -1,31 +0,0 @@
1
- import { Group } from '@mantine/core';
2
- import React, { useState } from 'react';
3
- import { QuantityInput } from '../QuantityInput/QuantityInput.mjs';
4
-
5
- /**
6
- * Renders a Range input.
7
- * See: https://www.hl7.org/fhir/datatypes.html#Range
8
- * @param props Range input properties.
9
- * @returns Range input element.
10
- */
11
- function RangeInput(props) {
12
- const [value, setValue] = useState(props.defaultValue);
13
- function setValueWrapper(newValue) {
14
- setValue(newValue);
15
- if (props.onChange) {
16
- props.onChange(newValue);
17
- }
18
- }
19
- return (React.createElement(Group, { spacing: "xs", grow: true, noWrap: true },
20
- React.createElement(QuantityInput, { name: props.name + '-low', defaultValue: value?.low, onChange: (v) => setValueWrapper({
21
- ...value,
22
- low: v,
23
- }) }),
24
- React.createElement(QuantityInput, { name: props.name + '-high', defaultValue: value?.high, onChange: (v) => setValueWrapper({
25
- ...value,
26
- high: v,
27
- }) })));
28
- }
29
-
30
- export { RangeInput };
31
- //# sourceMappingURL=RangeInput.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"RangeInput.mjs","sources":["../../../src/RangeInput/RangeInput.tsx"],"sourcesContent":["import { Group } from '@mantine/core';\nimport { Range } from '@medplum/fhirtypes';\nimport React, { useState } from 'react';\nimport { QuantityInput } from '../QuantityInput/QuantityInput';\n\nexport interface RangeInputProps {\n name: string;\n defaultValue?: Range;\n onChange?: (value: Range) => void;\n}\n\n/**\n * Renders a Range input.\n * See: https://www.hl7.org/fhir/datatypes.html#Range\n * @param props Range input properties.\n * @returns Range input element.\n */\nexport function RangeInput(props: RangeInputProps): JSX.Element {\n const [value, setValue] = useState(props.defaultValue);\n\n function setValueWrapper(newValue: Range): void {\n setValue(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n return (\n <Group spacing=\"xs\" grow noWrap>\n <QuantityInput\n name={props.name + '-low'}\n defaultValue={value?.low}\n onChange={(v) =>\n setValueWrapper({\n ...value,\n low: v,\n })\n }\n />\n\n <QuantityInput\n name={props.name + '-high'}\n defaultValue={value?.high}\n onChange={(v) =>\n setValueWrapper({\n ...value,\n high: v,\n })\n }\n />\n </Group>\n );\n}\n"],"names":[],"mappings":";;;;AAWA;;;;;AAKG;AACG,SAAU,UAAU,CAAC,KAAsB,EAAA;AAC/C,IAAA,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IAEvD,SAAS,eAAe,CAAC,QAAe,EAAA;QACtC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACnB,IAAI,KAAK,CAAC,QAAQ,EAAE;AAClB,YAAA,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AAC1B,SAAA;KACF;IAED,QACE,KAAC,CAAA,aAAA,CAAA,KAAK,EAAC,EAAA,OAAO,EAAC,IAAI,EAAC,IAAI,EAAA,IAAA,EAAC,MAAM,EAAA,IAAA,EAAA;QAC7B,KAAC,CAAA,aAAA,CAAA,aAAa,EACZ,EAAA,IAAI,EAAE,KAAK,CAAC,IAAI,GAAG,MAAM,EACzB,YAAY,EAAE,KAAK,EAAE,GAAG,EACxB,QAAQ,EAAE,CAAC,CAAC,KACV,eAAe,CAAC;AACd,gBAAA,GAAG,KAAK;AACR,gBAAA,GAAG,EAAE,CAAC;AACP,aAAA,CAAC,EAEJ,CAAA;QAEF,KAAC,CAAA,aAAA,CAAA,aAAa,EACZ,EAAA,IAAI,EAAE,KAAK,CAAC,IAAI,GAAG,OAAO,EAC1B,YAAY,EAAE,KAAK,EAAE,IAAI,EACzB,QAAQ,EAAE,CAAC,CAAC,KACV,eAAe,CAAC;AACd,gBAAA,GAAG,KAAK;AACR,gBAAA,IAAI,EAAE,CAAC;aACR,CAAC,EAAA,CAEJ,CACI,EACR;AACJ;;;;"}
@@ -1,16 +0,0 @@
1
- import React from 'react';
2
- import { QuantityDisplay } from '../QuantityDisplay/QuantityDisplay.mjs';
3
-
4
- function RatioDisplay(props) {
5
- const value = props.value;
6
- if (!value) {
7
- return null;
8
- }
9
- return (React.createElement(React.Fragment, null,
10
- React.createElement(QuantityDisplay, { value: value.numerator }),
11
- "\u00A0/\u00A0",
12
- React.createElement(QuantityDisplay, { value: value.denominator })));
13
- }
14
-
15
- export { RatioDisplay };
16
- //# sourceMappingURL=RatioDisplay.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"RatioDisplay.mjs","sources":["../../../src/RatioDisplay/RatioDisplay.tsx"],"sourcesContent":["import { Ratio } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { QuantityDisplay } from '../QuantityDisplay/QuantityDisplay';\n\nexport interface RatioDisplayProps {\n value?: Ratio;\n}\n\nexport function RatioDisplay(props: RatioDisplayProps): JSX.Element | null {\n const value = props.value;\n if (!value) {\n return null;\n }\n\n return (\n <>\n <QuantityDisplay value={value.numerator} />\n &nbsp;/&nbsp;\n <QuantityDisplay value={value.denominator} />\n </>\n );\n}\n"],"names":[],"mappings":";;;AAQM,SAAU,YAAY,CAAC,KAAwB,EAAA;AACnD,IAAA,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;IAC1B,IAAI,CAAC,KAAK,EAAE;AACV,QAAA,OAAO,IAAI,CAAC;AACb,KAAA;AAED,IAAA,QACE,KAAA,CAAA,aAAA,CAAA,KAAA,CAAA,QAAA,EAAA,IAAA;AACE,QAAA,KAAA,CAAA,aAAA,CAAC,eAAe,EAAC,EAAA,KAAK,EAAE,KAAK,CAAC,SAAS,EAAI,CAAA;;QAE3C,KAAC,CAAA,aAAA,CAAA,eAAe,EAAC,EAAA,KAAK,EAAE,KAAK,CAAC,WAAW,EAAA,CAAI,CAC5C,EACH;AACJ;;;;"}
@@ -1,31 +0,0 @@
1
- import { Group } from '@mantine/core';
2
- import React, { useState } from 'react';
3
- import { QuantityInput } from '../QuantityInput/QuantityInput.mjs';
4
-
5
- /**
6
- * Renders a Ratio input.
7
- * See: https://www.hl7.org/fhir/datatypes.html#Ratio
8
- * @param props Ratio input properties.
9
- * @returns Ratio input element.
10
- */
11
- function RatioInput(props) {
12
- const [value, setValue] = useState(props.defaultValue);
13
- function setValueWrapper(newValue) {
14
- setValue(newValue);
15
- if (props.onChange) {
16
- props.onChange(newValue);
17
- }
18
- }
19
- return (React.createElement(Group, { spacing: "xs", grow: true, noWrap: true },
20
- React.createElement(QuantityInput, { name: props.name + '-numerator', defaultValue: value?.numerator, onChange: (v) => setValueWrapper({
21
- ...value,
22
- numerator: v,
23
- }) }),
24
- React.createElement(QuantityInput, { name: props.name + '-denominator', defaultValue: value?.denominator, onChange: (v) => setValueWrapper({
25
- ...value,
26
- denominator: v,
27
- }) })));
28
- }
29
-
30
- export { RatioInput };
31
- //# sourceMappingURL=RatioInput.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"RatioInput.mjs","sources":["../../../src/RatioInput/RatioInput.tsx"],"sourcesContent":["import { Group } from '@mantine/core';\nimport { Ratio } from '@medplum/fhirtypes';\nimport React, { useState } from 'react';\nimport { QuantityInput } from '../QuantityInput/QuantityInput';\n\nexport interface RatioInputProps {\n name: string;\n defaultValue?: Ratio;\n onChange?: (value: Ratio) => void;\n}\n\n/**\n * Renders a Ratio input.\n * See: https://www.hl7.org/fhir/datatypes.html#Ratio\n * @param props Ratio input properties.\n * @returns Ratio input element.\n */\nexport function RatioInput(props: RatioInputProps): JSX.Element {\n const [value, setValue] = useState(props.defaultValue);\n\n function setValueWrapper(newValue: Ratio): void {\n setValue(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n return (\n <Group spacing=\"xs\" grow noWrap>\n <QuantityInput\n name={props.name + '-numerator'}\n defaultValue={value?.numerator}\n onChange={(v) =>\n setValueWrapper({\n ...value,\n numerator: v,\n })\n }\n />\n <QuantityInput\n name={props.name + '-denominator'}\n defaultValue={value?.denominator}\n onChange={(v) =>\n setValueWrapper({\n ...value,\n denominator: v,\n })\n }\n />\n </Group>\n );\n}\n"],"names":[],"mappings":";;;;AAWA;;;;;AAKG;AACG,SAAU,UAAU,CAAC,KAAsB,EAAA;AAC/C,IAAA,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IAEvD,SAAS,eAAe,CAAC,QAAe,EAAA;QACtC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACnB,IAAI,KAAK,CAAC,QAAQ,EAAE;AAClB,YAAA,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AAC1B,SAAA;KACF;IAED,QACE,KAAC,CAAA,aAAA,CAAA,KAAK,EAAC,EAAA,OAAO,EAAC,IAAI,EAAC,IAAI,EAAA,IAAA,EAAC,MAAM,EAAA,IAAA,EAAA;QAC7B,KAAC,CAAA,aAAA,CAAA,aAAa,EACZ,EAAA,IAAI,EAAE,KAAK,CAAC,IAAI,GAAG,YAAY,EAC/B,YAAY,EAAE,KAAK,EAAE,SAAS,EAC9B,QAAQ,EAAE,CAAC,CAAC,KACV,eAAe,CAAC;AACd,gBAAA,GAAG,KAAK;AACR,gBAAA,SAAS,EAAE,CAAC;AACb,aAAA,CAAC,EAEJ,CAAA;QACF,KAAC,CAAA,aAAA,CAAA,aAAa,EACZ,EAAA,IAAI,EAAE,KAAK,CAAC,IAAI,GAAG,cAAc,EACjC,YAAY,EAAE,KAAK,EAAE,WAAW,EAChC,QAAQ,EAAE,CAAC,CAAC,KACV,eAAe,CAAC;AACd,gBAAA,GAAG,KAAK;AACR,gBAAA,WAAW,EAAE,CAAC;aACf,CAAC,EAAA,CAEJ,CACI,EACR;AACJ;;;;"}
@@ -1,21 +0,0 @@
1
- import { stringify } from '@medplum/core';
2
- import React from 'react';
3
- import { MedplumLink } from '../MedplumLink/MedplumLink.mjs';
4
-
5
- function ReferenceDisplay(props) {
6
- if (!props.value) {
7
- return null;
8
- }
9
- const displayString = props.value.display || props.value.reference || stringify(props.value);
10
- // The "link" prop defaults to "true"; undefined is treated as "true"
11
- // To disable the link, it must be explicitly "false"
12
- if (props.link !== false && props.value.reference) {
13
- return React.createElement(MedplumLink, { to: props.value }, displayString);
14
- }
15
- else {
16
- return React.createElement(React.Fragment, null, displayString);
17
- }
18
- }
19
-
20
- export { ReferenceDisplay };
21
- //# sourceMappingURL=ReferenceDisplay.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ReferenceDisplay.mjs","sources":["../../../src/ReferenceDisplay/ReferenceDisplay.tsx"],"sourcesContent":["import { stringify } from '@medplum/core';\nimport { Reference } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { MedplumLink } from '../MedplumLink/MedplumLink';\n\nexport interface ReferenceDisplayProps {\n value?: Reference;\n link?: boolean;\n}\n\nexport function ReferenceDisplay(props: ReferenceDisplayProps): JSX.Element | null {\n if (!props.value) {\n return null;\n }\n\n const displayString = props.value.display || props.value.reference || stringify(props.value);\n\n // The \"link\" prop defaults to \"true\"; undefined is treated as \"true\"\n // To disable the link, it must be explicitly \"false\"\n if (props.link !== false && props.value.reference) {\n return <MedplumLink to={props.value}>{displayString}</MedplumLink>;\n } else {\n return <>{displayString}</>;\n }\n}\n"],"names":[],"mappings":";;;;AAUM,SAAU,gBAAgB,CAAC,KAA4B,EAAA;AAC3D,IAAA,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE;AAChB,QAAA,OAAO,IAAI,CAAC;AACb,KAAA;IAED,MAAM,aAAa,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,KAAK,CAAC,SAAS,IAAI,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;;;IAI7F,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,SAAS,EAAE;QACjD,OAAO,KAAA,CAAA,aAAA,CAAC,WAAW,EAAA,EAAC,EAAE,EAAE,KAAK,CAAC,KAAK,EAAA,EAAG,aAAa,CAAe,CAAC;AACpE,KAAA;AAAM,SAAA;QACL,OAAO,KAAA,CAAA,aAAA,CAAA,KAAA,CAAA,QAAA,EAAA,IAAA,EAAG,aAAa,CAAI,CAAC;AAC7B,KAAA;AACH;;;;"}
@@ -1,45 +0,0 @@
1
- import { Group, NativeSelect, TextInput } from '@mantine/core';
2
- import { createReference } from '@medplum/core';
3
- import React, { useState, useRef } from 'react';
4
- import { ResourceInput } from '../ResourceInput/ResourceInput.mjs';
5
-
6
- function ReferenceInput(props) {
7
- const targetTypes = getTargetTypes(props.targetTypes);
8
- const initialResourceType = getInitialResourceType(props.defaultValue, targetTypes);
9
- const [value, setValue] = useState(props.defaultValue);
10
- const [resourceType, setResourceType] = useState(initialResourceType);
11
- const valueRef = useRef();
12
- valueRef.current = value;
13
- const resourceTypeRef = useRef();
14
- resourceTypeRef.current = resourceType;
15
- function setValueHelper(newValue) {
16
- setValue(newValue);
17
- if (props.onChange) {
18
- props.onChange(newValue);
19
- }
20
- }
21
- return (React.createElement(Group, { spacing: "xs", grow: true, noWrap: true },
22
- targetTypes ? (React.createElement(NativeSelect, { "data-testid": "reference-input-resource-type-select", defaultValue: resourceType, onChange: (e) => setResourceType(e.currentTarget.value), data: targetTypes })) : (React.createElement(TextInput, { "data-testid": "reference-input-resource-type-input", defaultValue: resourceType, onChange: (e) => setResourceType(e.currentTarget.value) })),
23
- React.createElement(ResourceInput, { resourceType: resourceType, name: props.name + '-id', placeholder: props.placeholder, defaultValue: value, onChange: (item) => {
24
- setValueHelper(item ? createReference(item) : undefined);
25
- } })));
26
- }
27
- function getTargetTypes(targetTypes) {
28
- if (!targetTypes || targetTypes.length === 0 || (targetTypes.length === 1 && targetTypes[0] === 'Resource')) {
29
- return undefined;
30
- }
31
- return targetTypes;
32
- }
33
- function getInitialResourceType(defaultValue, targetTypes) {
34
- const defaultValueResourceType = defaultValue?.reference?.split('/')[0];
35
- if (defaultValueResourceType) {
36
- return defaultValueResourceType;
37
- }
38
- if (targetTypes && targetTypes.length > 0) {
39
- return targetTypes[0];
40
- }
41
- return undefined;
42
- }
43
-
44
- export { ReferenceInput };
45
- //# sourceMappingURL=ReferenceInput.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ReferenceInput.mjs","sources":["../../../src/ReferenceInput/ReferenceInput.tsx"],"sourcesContent":["import { Group, NativeSelect, TextInput } from '@mantine/core';\nimport { createReference } from '@medplum/core';\nimport { Reference, Resource, ResourceType } from '@medplum/fhirtypes';\nimport React, { useRef, useState } from 'react';\nimport { ResourceInput } from '../ResourceInput/ResourceInput';\n\nexport interface ReferenceInputProps {\n name: string;\n placeholder?: string;\n defaultValue?: Reference;\n targetTypes?: string[];\n onChange?: (value: Reference | undefined) => void;\n}\n\nexport function ReferenceInput(props: ReferenceInputProps): JSX.Element {\n const targetTypes = getTargetTypes(props.targetTypes);\n const initialResourceType = getInitialResourceType(props.defaultValue, targetTypes);\n const [value, setValue] = useState<Reference | undefined>(props.defaultValue);\n const [resourceType, setResourceType] = useState<string | undefined>(initialResourceType);\n\n const valueRef = useRef<Reference>();\n valueRef.current = value;\n\n const resourceTypeRef = useRef<string>();\n resourceTypeRef.current = resourceType;\n\n function setValueHelper(newValue: Reference | undefined): void {\n setValue(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n return (\n <Group spacing=\"xs\" grow noWrap>\n {targetTypes ? (\n <NativeSelect\n data-testid=\"reference-input-resource-type-select\"\n defaultValue={resourceType}\n onChange={(e) => setResourceType(e.currentTarget.value)}\n data={targetTypes}\n />\n ) : (\n <TextInput\n data-testid=\"reference-input-resource-type-input\"\n defaultValue={resourceType}\n onChange={(e) => setResourceType(e.currentTarget.value)}\n />\n )}\n <ResourceInput\n resourceType={resourceType as ResourceType}\n name={props.name + '-id'}\n placeholder={props.placeholder}\n defaultValue={value}\n onChange={(item: Resource | undefined) => {\n setValueHelper(item ? createReference(item) : undefined);\n }}\n />\n </Group>\n );\n}\n\nfunction getTargetTypes(targetTypes: string[] | undefined): string[] | undefined {\n if (!targetTypes || targetTypes.length === 0 || (targetTypes.length === 1 && targetTypes[0] === 'Resource')) {\n return undefined;\n }\n return targetTypes;\n}\n\nfunction getInitialResourceType(\n defaultValue: Reference | undefined,\n targetTypes: string[] | undefined\n): string | undefined {\n const defaultValueResourceType = defaultValue?.reference?.split('/')[0];\n if (defaultValueResourceType) {\n return defaultValueResourceType;\n }\n\n if (targetTypes && targetTypes.length > 0) {\n return targetTypes[0];\n }\n\n return undefined;\n}\n"],"names":[],"mappings":";;;;;AAcM,SAAU,cAAc,CAAC,KAA0B,EAAA;IACvD,MAAM,WAAW,GAAG,cAAc,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IACtD,MAAM,mBAAmB,GAAG,sBAAsB,CAAC,KAAK,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;AACpF,IAAA,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAwB,KAAK,CAAC,YAAY,CAAC,CAAC;IAC9E,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAqB,mBAAmB,CAAC,CAAC;AAE1F,IAAA,MAAM,QAAQ,GAAG,MAAM,EAAa,CAAC;AACrC,IAAA,QAAQ,CAAC,OAAO,GAAG,KAAK,CAAC;AAEzB,IAAA,MAAM,eAAe,GAAG,MAAM,EAAU,CAAC;AACzC,IAAA,eAAe,CAAC,OAAO,GAAG,YAAY,CAAC;IAEvC,SAAS,cAAc,CAAC,QAA+B,EAAA;QACrD,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACnB,IAAI,KAAK,CAAC,QAAQ,EAAE;AAClB,YAAA,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AAC1B,SAAA;KACF;IAED,QACE,KAAC,CAAA,aAAA,CAAA,KAAK,EAAC,EAAA,OAAO,EAAC,IAAI,EAAC,IAAI,EAAA,IAAA,EAAC,MAAM,EAAA,IAAA,EAAA;AAC5B,QAAA,WAAW,IACV,KAAC,CAAA,aAAA,CAAA,YAAY,EACC,EAAA,aAAA,EAAA,sCAAsC,EAClD,YAAY,EAAE,YAAY,EAC1B,QAAQ,EAAE,CAAC,CAAC,KAAK,eAAe,CAAC,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,EACvD,IAAI,EAAE,WAAW,EAAA,CACjB,KAEF,KAAA,CAAA,aAAA,CAAC,SAAS,EAAA,EAAA,aAAA,EACI,qCAAqC,EACjD,YAAY,EAAE,YAAY,EAC1B,QAAQ,EAAE,CAAC,CAAC,KAAK,eAAe,CAAC,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,GACvD,CACH;AACD,QAAA,KAAA,CAAA,aAAA,CAAC,aAAa,EAAA,EACZ,YAAY,EAAE,YAA4B,EAC1C,IAAI,EAAE,KAAK,CAAC,IAAI,GAAG,KAAK,EACxB,WAAW,EAAE,KAAK,CAAC,WAAW,EAC9B,YAAY,EAAE,KAAK,EACnB,QAAQ,EAAE,CAAC,IAA0B,KAAI;AACvC,gBAAA,cAAc,CAAC,IAAI,GAAG,eAAe,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,CAAC;aAC1D,EAAA,CACD,CACI,EACR;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,WAAiC,EAAA;IACvD,IAAI,CAAC,WAAW,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,KAAK,WAAW,CAAC,MAAM,KAAK,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,KAAK,UAAU,CAAC,EAAE;AAC3G,QAAA,OAAO,SAAS,CAAC;AAClB,KAAA;AACD,IAAA,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,SAAS,sBAAsB,CAC7B,YAAmC,EACnC,WAAiC,EAAA;AAEjC,IAAA,MAAM,wBAAwB,GAAG,YAAY,EAAE,SAAS,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AACxE,IAAA,IAAI,wBAAwB,EAAE;AAC5B,QAAA,OAAO,wBAAwB,CAAC;AACjC,KAAA;AAED,IAAA,IAAI,WAAW,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE;AACzC,QAAA,OAAO,WAAW,CAAC,CAAC,CAAC,CAAC;AACvB,KAAA;AAED,IAAA,OAAO,SAAS,CAAC;AACnB;;;;"}
@@ -1,286 +0,0 @@
1
- import { createStyles, Stack, ActionIcon, Group, Button, Divider, TextInput, NativeSelect, Text } from '@mantine/core';
2
- import { formatRange, getCodeBySystem } from '@medplum/core';
3
- import React, { useState, useEffect } from 'react';
4
- import { Container } from '../Container/Container.mjs';
5
- import { Form } from '../Form/Form.mjs';
6
- import { RangeInput } from '../RangeInput/RangeInput.mjs';
7
- import { killEvent } from '../utils/dom.mjs';
8
- import IconCirclePlus from '../node_modules/@tabler/icons-react/dist/esm/icons/IconCirclePlus.mjs';
9
- import IconCircleMinus from '../node_modules/@tabler/icons-react/dist/esm/icons/IconCircleMinus.mjs';
10
-
11
- const useStyles = createStyles((theme) => ({
12
- section: {
13
- position: 'relative',
14
- margin: '4px 4px 8px 0',
15
- padding: '6px 12px 16px 6px',
16
- border: `1.5px solid ${theme.colors.gray[3]}`,
17
- borderRadius: theme.radius.sm,
18
- transition: 'all 0.1s',
19
- },
20
- }));
21
- // Properties of qualified intervals used for grouping
22
- const intervalFilters = ['gender', 'age', 'gestationalAge', 'context', 'appliesTo'];
23
- const defaultProps = {
24
- definition: { resourceType: 'ObservationDefinition' },
25
- onSubmit: () => {
26
- return undefined;
27
- },
28
- };
29
- function ReferenceRangeEditor(props) {
30
- props = Object.assign(defaultProps, props);
31
- const defaultDefinition = props.definition;
32
- const [intervalGroups, setIntervalGroups] = useState([]);
33
- const [groupId, setGroupId] = useState(1);
34
- const [intervalId, setIntervalId] = useState(1);
35
- useEffect(() => {
36
- const definition = ensureQualifiedIntervalKeys(defaultDefinition, setIntervalId);
37
- setIntervalGroups(groupQualifiedIntervals(definition.qualifiedInterval || [], setGroupId));
38
- }, [defaultDefinition]);
39
- return (React.createElement(Form, { testid: "reference-range-editor", onSubmit: submitDefinition },
40
- React.createElement(Stack, null, intervalGroups.map((intervalGroup) => (React.createElement(ReferenceRangeGroupEditor, { unit: getUnitString(defaultDefinition.quantitativeDetails?.unit), onChange: changeInterval, onAdd: addInterval, onRemove: removeInterval, onRemoveGroup: removeGroup, key: `group-${intervalGroup.id}`, intervalGroup: intervalGroup })))),
41
- React.createElement(ActionIcon, { title: "Add Group", size: "sm", onClick: (e) => {
42
- killEvent(e);
43
- addGroup({ id: `group-id-${groupId}`, filters: {}, intervals: [] });
44
- setGroupId((id) => id + 1);
45
- } },
46
- React.createElement(IconCirclePlus, null)),
47
- React.createElement(Group, { position: "right" },
48
- React.createElement(Button, { type: "submit" }, "Save"))));
49
- /**
50
- * Submit qualified intervals
51
- */
52
- function submitDefinition() {
53
- const qualifiedInterval = intervalGroups
54
- .flatMap((group) => group.intervals)
55
- .filter((interval) => !isEmptyInterval(interval));
56
- props.onSubmit({ ...defaultDefinition, qualifiedInterval });
57
- }
58
- /**
59
- * Add Remove Interval Groups
60
- */
61
- function addGroup(addedGroup) {
62
- setIntervalGroups((currentGroups) => [...currentGroups, addedGroup]);
63
- }
64
- function removeGroup(removedGroup) {
65
- setIntervalGroups((currentGroups) => currentGroups.filter((group) => group.id !== removedGroup.id));
66
- }
67
- /**
68
- * Add/Remove/Update specific Qualified Intervals
69
- * @param groupId The reference range group ID.
70
- * @param changedInterval The updated reference range interval.
71
- */
72
- function changeInterval(groupId, changedInterval) {
73
- setIntervalGroups((groups) => {
74
- groups = [...groups];
75
- const currentGroup = groups.find((g) => g.id === groupId);
76
- const index = currentGroup?.intervals.findIndex((interval) => interval.id === changedInterval.id);
77
- if (index !== undefined && currentGroup?.intervals[index]) {
78
- currentGroup.intervals[index] = changedInterval;
79
- }
80
- return groups;
81
- });
82
- }
83
- function addInterval(groupId, addedInterval) {
84
- if (addedInterval.id === undefined) {
85
- addedInterval.id = `id-${intervalId}`;
86
- setIntervalId((id) => id + 1);
87
- }
88
- setIntervalGroups((groups) => {
89
- groups = [...groups];
90
- const currentGroupIndex = groups.findIndex((g) => g.id === groupId);
91
- if (currentGroupIndex !== -1) {
92
- const currentGroup = { ...groups[currentGroupIndex] };
93
- addedInterval = { ...addedInterval, ...currentGroup.filters };
94
- currentGroup.intervals = [...currentGroup.intervals, addedInterval];
95
- groups[currentGroupIndex] = currentGroup;
96
- }
97
- return groups;
98
- });
99
- }
100
- function removeInterval(groupId, removedInterval) {
101
- setIntervalGroups((groups) => {
102
- groups = [...groups];
103
- const currentGroup = groups.find((g) => g.id === groupId);
104
- if (currentGroup) {
105
- currentGroup.intervals = currentGroup.intervals.filter((interval) => interval.id !== removedInterval.id);
106
- }
107
- return groups;
108
- });
109
- }
110
- }
111
- function ReferenceRangeGroupEditor(props) {
112
- const { intervalGroup, unit } = props;
113
- const { classes } = useStyles();
114
- return (React.createElement(Container, { "data-testid": intervalGroup.id, className: classes.section },
115
- React.createElement(Stack, { spacing: 'lg' },
116
- React.createElement(Group, { position: "right" },
117
- React.createElement(ActionIcon, { title: "Remove Group", "data-testid": `remove-group-button-${intervalGroup.id}`, key: `remove-group-button-${intervalGroup.id}`, size: "sm", onClick: (e) => {
118
- killEvent(e);
119
- props.onRemoveGroup(intervalGroup);
120
- } },
121
- React.createElement(IconCircleMinus, null))),
122
- React.createElement(ReferenceRangeGroupFilters, { intervalGroup: intervalGroup, onChange: props.onChange }),
123
- React.createElement(Divider, null),
124
- intervalGroup.intervals.map((interval) => (React.createElement(Stack, { key: `interval-${interval.id}`, spacing: 'xs' },
125
- React.createElement(Group, null,
126
- React.createElement(TextInput, { key: `condition-${interval.id}`, "data-testid": `condition-${interval.id}`, defaultValue: interval.condition, label: 'Condition: ', size: 'sm', onChange: (e) => {
127
- killEvent(e);
128
- props.onChange(intervalGroup.id, { ...interval, condition: e.currentTarget.value.trim() });
129
- } }),
130
- React.createElement(ActionIcon, { title: "Remove Interval", size: "sm", key: `remove-interval-${interval.id}`, "data-testid": `remove-interval-${interval.id}`, onClick: (e) => {
131
- killEvent(e);
132
- props.onRemove(intervalGroup.id, interval);
133
- } },
134
- React.createElement(IconCircleMinus, null))),
135
- React.createElement(RangeInput, { onChange: (range) => {
136
- props.onChange(intervalGroup.id, { ...interval, range });
137
- }, key: `range-${interval.id}`, name: `range-${interval.id}`, defaultValue: interval.range })))),
138
- React.createElement(ActionIcon, { title: "Add Interval", size: "sm", onClick: (e) => {
139
- killEvent(e);
140
- props.onAdd(intervalGroup.id, {
141
- range: {
142
- low: { unit },
143
- high: { unit },
144
- },
145
- });
146
- } },
147
- React.createElement(IconCirclePlus, null)))));
148
- }
149
- /**
150
- * Render the "filters" section of the IntervalGroup.
151
- * @param props The ReferenceRangeGroupFilter React props.
152
- * @returns The ReferenceRangeGroupFilter React node.
153
- */
154
- function ReferenceRangeGroupFilters(props) {
155
- const { intervalGroup, onChange } = props;
156
- // Pre-populate the units of the age filter
157
- if (!intervalGroup.filters.age) {
158
- intervalGroup.filters.age = {};
159
- }
160
- for (const key of ['low', 'high']) {
161
- if (!intervalGroup.filters.age[key]?.unit) {
162
- intervalGroup.filters.age[key] = {
163
- ...intervalGroup.filters.age[key],
164
- unit: 'years',
165
- system: 'http://unitsofmeasure.org',
166
- };
167
- }
168
- }
169
- return (React.createElement(Stack, { style: { maxWidth: '50%' } },
170
- React.createElement(Group, null,
171
- React.createElement(NativeSelect, { data: ['', 'male', 'female'], label: "Gender:", defaultValue: intervalGroup.filters.gender || '', onChange: (e) => {
172
- for (const interval of intervalGroup.intervals) {
173
- let newGender = e.currentTarget.value;
174
- if (newGender === '') {
175
- newGender = undefined;
176
- }
177
- onChange(intervalGroup.id, {
178
- ...interval,
179
- gender: newGender,
180
- });
181
- }
182
- } })),
183
- React.createElement(Group, { spacing: 'xs' },
184
- React.createElement(Text, { component: "label", htmlFor: `div-age-${intervalGroup.id}` }, "Age:"),
185
- React.createElement("div", { id: `div-age-${intervalGroup.id}` },
186
- React.createElement(RangeInput, { key: `age-${intervalGroup.id}`, name: `age-${intervalGroup.id}`, defaultValue: intervalGroup.filters['age'], onChange: (ageRange) => {
187
- for (const interval of intervalGroup.intervals) {
188
- onChange(intervalGroup.id, { ...interval, age: ageRange });
189
- }
190
- } }))),
191
- React.createElement(NativeSelect, { data: ['', 'pre-puberty', 'follicular', 'midcycle', 'luteal', 'postmenopausal'], label: "Endocrine:", defaultValue: intervalGroup.filters.context?.text || '', onChange: (e) => {
192
- for (const interval of intervalGroup.intervals) {
193
- let newEndocrine = e.currentTarget.value;
194
- if (newEndocrine === '') {
195
- newEndocrine = undefined;
196
- onChange(intervalGroup.id, { ...interval, context: undefined });
197
- }
198
- else {
199
- onChange(intervalGroup.id, {
200
- ...interval,
201
- context: {
202
- text: newEndocrine,
203
- coding: [
204
- { code: newEndocrine, system: 'http://terminology.hl7.org/CodeSystem/referencerange-meaning' },
205
- ],
206
- },
207
- });
208
- }
209
- }
210
- } })));
211
- }
212
- /**
213
- * Helper function that assigns ids to each qualifiedInterval of an ObservationDefinition
214
- * @param definition An ObservationDefinition
215
- * @param setIntervalId React setState function for the intervalId
216
- * @returns The updated observation definition.
217
- */
218
- function ensureQualifiedIntervalKeys(definition, setIntervalId) {
219
- const intervals = definition.qualifiedInterval || [];
220
- // Set the nextId to the max of any existing numeric id
221
- let nextId = Math.max(...intervals.map((interval) => {
222
- const existingNum = parseInt(interval.id?.substring(3) || '', 10);
223
- return !isNaN(existingNum) ? existingNum : Number.NEGATIVE_INFINITY;
224
- })) + 1;
225
- if (!Number.isFinite(nextId)) {
226
- nextId = 1;
227
- }
228
- // If an interval doesn't have an id, set it to the nextId
229
- definition = {
230
- ...definition,
231
- qualifiedInterval: intervals.map((interval) => ({
232
- ...interval,
233
- id: interval.id || `id-${nextId++}`,
234
- })),
235
- };
236
- setIntervalId(nextId);
237
- return definition;
238
- }
239
- /**
240
- * Group all ObservationDefinitionQualifiedIntervals based on the values of their "filter" properties,
241
- * so that similar ranges can be grouped together.
242
- * @param intervals Array of reference range intervals.
243
- * @param setGroupId Callback to set the group ID.
244
- * @returns The grouped intervals.
245
- */
246
- function groupQualifiedIntervals(intervals, setGroupId) {
247
- let groupId = 1;
248
- const groups = {};
249
- for (const interval of intervals) {
250
- const groupKey = generateGroupKey(interval);
251
- if (!(groupKey in groups)) {
252
- groups[groupKey] = {
253
- id: `group-id-${groupId++}`,
254
- filters: Object.fromEntries(intervalFilters.map((f) => [f, interval[f]])),
255
- intervals: [],
256
- };
257
- }
258
- groups[groupKey].intervals.push(interval);
259
- }
260
- setGroupId(groupId);
261
- return Object.values(groups);
262
- }
263
- /**
264
- * Generates a unique string for each set of filter values, so that similarly filtered intervals can be grouped together.
265
- * @param interval The reference range interval.
266
- * @returns A "group key" that corresponds to the value of the interval filter properties.
267
- */
268
- function generateGroupKey(interval) {
269
- const results = [
270
- `gender=${interval.gender}`,
271
- `age=${formatRange(interval.age)}`,
272
- `gestationalAge=${formatRange(interval.gestationalAge)}`,
273
- `context=${interval.context?.text}`,
274
- `appliesTo=${interval.appliesTo?.map((c) => c.text).join('+')}`,
275
- ];
276
- return results.join(':');
277
- }
278
- function getUnitString(unit) {
279
- return unit && (getCodeBySystem(unit, 'http://unitsofmeasure.org') || unit.text);
280
- }
281
- function isEmptyInterval(interval) {
282
- return interval.range?.low?.value === undefined && interval.range?.high?.value === undefined;
283
- }
284
-
285
- export { ReferenceRangeEditor, ReferenceRangeGroupEditor };
286
- //# sourceMappingURL=ReferenceRangeEditor.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ReferenceRangeEditor.mjs","sources":["../../../src/ReferenceRangeEditor/ReferenceRangeEditor.tsx"],"sourcesContent":["import { ActionIcon, Button, createStyles, Divider, Group, NativeSelect, Stack, Text, TextInput } from '@mantine/core';\nimport { formatRange, getCodeBySystem } from '@medplum/core';\nimport { CodeableConcept, ObservationDefinition, ObservationDefinitionQualifiedInterval } from '@medplum/fhirtypes';\nimport { IconCircleMinus, IconCirclePlus } from '@tabler/icons-react';\nimport React, { useEffect, useState } from 'react';\nimport { Container } from '../Container/Container';\nimport { Form } from '../Form/Form';\nimport { RangeInput } from '../RangeInput/RangeInput';\nimport { killEvent } from '../utils/dom';\n\nconst useStyles = createStyles((theme) => ({\n section: {\n position: 'relative',\n margin: '4px 4px 8px 0',\n padding: '6px 12px 16px 6px',\n border: `1.5px solid ${theme.colors.gray[3]}`,\n borderRadius: theme.radius.sm,\n transition: 'all 0.1s',\n },\n}));\n\n// Properties of qualified intervals used for grouping\nconst intervalFilters = ['gender', 'age', 'gestationalAge', 'context', 'appliesTo'] as const;\n\nexport interface ReferenceRangeEditorProps {\n definition: ObservationDefinition;\n onSubmit: (result: ObservationDefinition) => void;\n}\n\n// Helper type that groups of qualified intervals by equal filter criteria\ntype IntervalGroup = {\n id: string;\n filters: Record<string, any>;\n intervals: ObservationDefinitionQualifiedInterval[];\n};\n\nconst defaultProps: ReferenceRangeEditorProps = {\n definition: { resourceType: 'ObservationDefinition' },\n onSubmit: () => {\n return undefined;\n },\n};\n\nexport function ReferenceRangeEditor(props: ReferenceRangeEditorProps): JSX.Element {\n props = Object.assign(defaultProps, props);\n const defaultDefinition = props.definition;\n\n const [intervalGroups, setIntervalGroups] = useState<IntervalGroup[]>([]);\n const [groupId, setGroupId] = useState(1);\n const [intervalId, setIntervalId] = useState(1);\n\n useEffect(() => {\n const definition = ensureQualifiedIntervalKeys(defaultDefinition, setIntervalId);\n setIntervalGroups(groupQualifiedIntervals(definition.qualifiedInterval || [], setGroupId));\n }, [defaultDefinition]);\n\n return (\n <Form testid=\"reference-range-editor\" onSubmit={submitDefinition}>\n <Stack>\n {intervalGroups.map((intervalGroup) => (\n <ReferenceRangeGroupEditor\n unit={getUnitString(defaultDefinition.quantitativeDetails?.unit)}\n onChange={changeInterval}\n onAdd={addInterval}\n onRemove={removeInterval}\n onRemoveGroup={removeGroup}\n key={`group-${intervalGroup.id}`}\n intervalGroup={intervalGroup}\n />\n ))}\n </Stack>\n <ActionIcon\n title=\"Add Group\"\n size=\"sm\"\n onClick={(e: React.MouseEvent) => {\n killEvent(e);\n addGroup({ id: `group-id-${groupId}`, filters: {} as IntervalGroup['filters'], intervals: [] });\n setGroupId((id) => id + 1);\n }}\n >\n <IconCirclePlus />\n </ActionIcon>\n\n <Group position=\"right\">\n <Button type=\"submit\">Save</Button>\n </Group>\n </Form>\n );\n\n /**\n * Submit qualified intervals\n */\n\n function submitDefinition(): void {\n const qualifiedInterval = intervalGroups\n .flatMap((group) => group.intervals)\n .filter((interval) => !isEmptyInterval(interval));\n props.onSubmit({ ...defaultDefinition, qualifiedInterval });\n }\n\n /**\n * Add Remove Interval Groups\n */\n\n function addGroup(addedGroup: IntervalGroup): void {\n setIntervalGroups((currentGroups) => [...currentGroups, addedGroup]);\n }\n\n function removeGroup(removedGroup: IntervalGroup): void {\n setIntervalGroups((currentGroups) => currentGroups.filter((group) => group.id !== removedGroup.id));\n }\n\n /**\n * Add/Remove/Update specific Qualified Intervals\n * @param groupId The reference range group ID.\n * @param changedInterval The updated reference range interval.\n */\n function changeInterval(groupId: string, changedInterval: ObservationDefinitionQualifiedInterval): void {\n setIntervalGroups((groups) => {\n groups = [...groups];\n const currentGroup = groups.find((g) => g.id === groupId);\n\n const index = currentGroup?.intervals.findIndex((interval) => interval.id === changedInterval.id);\n if (index !== undefined && currentGroup?.intervals[index]) {\n currentGroup.intervals[index] = changedInterval;\n }\n return groups;\n });\n }\n\n function addInterval(groupId: string, addedInterval: ObservationDefinitionQualifiedInterval): void {\n if (addedInterval.id === undefined) {\n addedInterval.id = `id-${intervalId}`;\n setIntervalId((id) => id + 1);\n }\n setIntervalGroups((groups) => {\n groups = [...groups];\n const currentGroupIndex = groups.findIndex((g) => g.id === groupId);\n\n if (currentGroupIndex !== -1) {\n const currentGroup = { ...groups[currentGroupIndex] };\n addedInterval = { ...addedInterval, ...currentGroup.filters };\n currentGroup.intervals = [...currentGroup.intervals, addedInterval];\n groups[currentGroupIndex] = currentGroup;\n }\n\n return groups;\n });\n }\n\n function removeInterval(groupId: string, removedInterval: ObservationDefinitionQualifiedInterval): void {\n setIntervalGroups((groups) => {\n groups = [...groups];\n const currentGroup = groups.find((g) => g.id === groupId);\n if (currentGroup) {\n currentGroup.intervals = currentGroup.intervals.filter((interval) => interval.id !== removedInterval.id);\n }\n return groups;\n });\n }\n}\n\n/**\n * Helper component that renders an \"interval group\", which is a set of ObservationDefinitionQualifiedIntervals\n * that have the same filter values\n */\nexport interface ReferenceRangeGroupEditorProps {\n intervalGroup: IntervalGroup;\n unit: string | undefined;\n onChange: (groupId: string, changed: ObservationDefinitionQualifiedInterval) => void;\n onAdd: (groupId: string, added: ObservationDefinitionQualifiedInterval) => void;\n onRemove: (groupId: string, removed: ObservationDefinitionQualifiedInterval) => void;\n onRemoveGroup: (removedGroup: IntervalGroup) => void;\n}\n\nexport function ReferenceRangeGroupEditor(props: ReferenceRangeGroupEditorProps): JSX.Element {\n const { intervalGroup, unit } = props;\n const { classes } = useStyles();\n return (\n <Container data-testid={intervalGroup.id} className={classes.section}>\n <Stack spacing={'lg'}>\n <Group position=\"right\">\n <ActionIcon\n title=\"Remove Group\"\n data-testid={`remove-group-button-${intervalGroup.id}`}\n key={`remove-group-button-${intervalGroup.id}`}\n size=\"sm\"\n onClick={(e: React.MouseEvent) => {\n killEvent(e);\n props.onRemoveGroup(intervalGroup);\n }}\n >\n <IconCircleMinus />\n </ActionIcon>\n </Group>\n <ReferenceRangeGroupFilters intervalGroup={intervalGroup} onChange={props.onChange} />\n <Divider />\n {intervalGroup.intervals.map((interval) => (\n <Stack key={`interval-${interval.id}`} spacing={'xs'}>\n <Group>\n <TextInput\n key={`condition-${interval.id}`}\n data-testid={`condition-${interval.id}`}\n defaultValue={interval.condition}\n label={'Condition: '}\n size={'sm'}\n onChange={(e) => {\n killEvent(e);\n props.onChange(intervalGroup.id, { ...interval, condition: e.currentTarget.value.trim() });\n }}\n />\n <ActionIcon\n title=\"Remove Interval\"\n size=\"sm\"\n key={`remove-interval-${interval.id}`}\n data-testid={`remove-interval-${interval.id}`}\n onClick={(e: React.MouseEvent) => {\n killEvent(e);\n props.onRemove(intervalGroup.id, interval);\n }}\n >\n <IconCircleMinus />\n </ActionIcon>\n </Group>\n\n <RangeInput\n onChange={(range) => {\n props.onChange(intervalGroup.id, { ...interval, range });\n }}\n key={`range-${interval.id}`}\n name={`range-${interval.id}`}\n defaultValue={interval.range}\n />\n </Stack>\n ))}\n <ActionIcon\n title=\"Add Interval\"\n size=\"sm\"\n onClick={(e: React.MouseEvent) => {\n killEvent(e);\n props.onAdd(intervalGroup.id, {\n range: {\n low: { unit },\n high: { unit },\n },\n });\n }}\n >\n <IconCirclePlus />\n </ActionIcon>\n </Stack>\n </Container>\n );\n}\n\ninterface ReferenceRangeGroupFiltersProps {\n intervalGroup: IntervalGroup;\n onChange: ReferenceRangeGroupEditorProps['onChange'];\n}\n\n/**\n * Render the \"filters\" section of the IntervalGroup.\n * @param props The ReferenceRangeGroupFilter React props.\n * @returns The ReferenceRangeGroupFilter React node.\n */\nfunction ReferenceRangeGroupFilters(props: ReferenceRangeGroupFiltersProps): JSX.Element {\n const { intervalGroup, onChange } = props;\n\n // Pre-populate the units of the age filter\n if (!intervalGroup.filters.age) {\n intervalGroup.filters.age = {};\n }\n for (const key of ['low', 'high']) {\n if (!intervalGroup.filters.age[key]?.unit) {\n intervalGroup.filters.age[key] = {\n ...intervalGroup.filters.age[key],\n unit: 'years',\n system: 'http://unitsofmeasure.org',\n };\n }\n }\n\n return (\n <Stack style={{ maxWidth: '50%' }}>\n <Group>\n <NativeSelect\n data={['', 'male', 'female']}\n label=\"Gender:\"\n defaultValue={intervalGroup.filters.gender || ''}\n onChange={(e) => {\n for (const interval of intervalGroup.intervals) {\n let newGender: string | undefined = e.currentTarget.value;\n if (newGender === '') {\n newGender = undefined;\n }\n onChange(intervalGroup.id, {\n ...interval,\n gender: newGender as ObservationDefinitionQualifiedInterval['gender'],\n });\n }\n }}\n />\n </Group>\n <Group spacing={'xs'}>\n <Text component=\"label\" htmlFor={`div-age-${intervalGroup.id}`}>\n Age:\n </Text>\n <div id={`div-age-${intervalGroup.id}`}>\n <RangeInput\n key={`age-${intervalGroup.id}`}\n name={`age-${intervalGroup.id}`}\n defaultValue={intervalGroup.filters['age']}\n onChange={(ageRange) => {\n for (const interval of intervalGroup.intervals) {\n onChange(intervalGroup.id, { ...interval, age: ageRange });\n }\n }}\n />\n </div>\n </Group>\n <NativeSelect\n data={['', 'pre-puberty', 'follicular', 'midcycle', 'luteal', 'postmenopausal']}\n label=\"Endocrine:\"\n defaultValue={intervalGroup.filters.context?.text || ''}\n onChange={(e) => {\n for (const interval of intervalGroup.intervals) {\n let newEndocrine: string | undefined = e.currentTarget.value;\n if (newEndocrine === '') {\n newEndocrine = undefined;\n onChange(intervalGroup.id, { ...interval, context: undefined });\n } else {\n onChange(intervalGroup.id, {\n ...interval,\n context: {\n text: newEndocrine,\n coding: [\n { code: newEndocrine, system: 'http://terminology.hl7.org/CodeSystem/referencerange-meaning' },\n ],\n },\n });\n }\n }\n }}\n />\n </Stack>\n );\n}\n\n/**\n * Helper function that assigns ids to each qualifiedInterval of an ObservationDefinition\n * @param definition An ObservationDefinition\n * @param setIntervalId React setState function for the intervalId\n * @returns The updated observation definition.\n */\nfunction ensureQualifiedIntervalKeys(\n definition: ObservationDefinition,\n setIntervalId: (id: number) => void\n): ObservationDefinition {\n const intervals = definition.qualifiedInterval || [];\n // Set the nextId to the max of any existing numeric id\n let nextId =\n Math.max(\n ...intervals.map((interval) => {\n const existingNum = parseInt(interval.id?.substring(3) || '', 10);\n return !isNaN(existingNum) ? existingNum : Number.NEGATIVE_INFINITY;\n })\n ) + 1;\n\n if (!Number.isFinite(nextId)) {\n nextId = 1;\n }\n\n // If an interval doesn't have an id, set it to the nextId\n definition = {\n ...definition,\n qualifiedInterval: intervals.map((interval) => ({\n ...interval,\n id: interval.id || `id-${nextId++}`,\n })),\n };\n setIntervalId(nextId);\n return definition;\n}\n\n/**\n * Group all ObservationDefinitionQualifiedIntervals based on the values of their \"filter\" properties,\n * so that similar ranges can be grouped together.\n * @param intervals Array of reference range intervals.\n * @param setGroupId Callback to set the group ID.\n * @returns The grouped intervals.\n */\nfunction groupQualifiedIntervals(\n intervals: ObservationDefinitionQualifiedInterval[],\n setGroupId: (id: number) => void\n): IntervalGroup[] {\n let groupId = 1;\n const groups: Record<string, IntervalGroup> = {};\n for (const interval of intervals) {\n const groupKey = generateGroupKey(interval);\n if (!(groupKey in groups)) {\n groups[groupKey] = {\n id: `group-id-${groupId++}`,\n filters: Object.fromEntries(intervalFilters.map((f) => [f, interval[f]])) as Record<string, any>,\n intervals: [],\n };\n }\n groups[groupKey].intervals.push(interval);\n }\n setGroupId(groupId);\n return Object.values(groups);\n}\n\n/**\n * Generates a unique string for each set of filter values, so that similarly filtered intervals can be grouped together.\n * @param interval The reference range interval.\n * @returns A \"group key\" that corresponds to the value of the interval filter properties.\n */\nfunction generateGroupKey(interval: ObservationDefinitionQualifiedInterval): string {\n const results = [\n `gender=${interval.gender}`,\n `age=${formatRange(interval.age)}`,\n `gestationalAge=${formatRange(interval.gestationalAge)}`,\n `context=${interval.context?.text}`,\n `appliesTo=${interval.appliesTo?.map((c) => c.text).join('+')}`,\n ];\n\n return results.join(':');\n}\n\nfunction getUnitString(unit: CodeableConcept | undefined): string | undefined {\n return unit && (getCodeBySystem(unit, 'http://unitsofmeasure.org') || unit.text);\n}\n\nfunction isEmptyInterval(interval: ObservationDefinitionQualifiedInterval): boolean {\n return interval.range?.low?.value === undefined && interval.range?.high?.value === undefined;\n}\n"],"names":[],"mappings":"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"}