@medplum/react 1.0.4 → 1.0.6

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 (379) hide show
  1. package/README.md +2 -1
  2. package/dist/cjs/AsyncAutocomplete/AsyncAutocomplete.d.ts +14 -0
  3. package/dist/cjs/DiagnosticReportDisplay/DiagnosticReportDisplay.stories.d.ts +1 -0
  4. package/dist/cjs/FhirPathTable/FhirPathTable.d.ts +2 -2
  5. package/dist/cjs/MoneyDisplay/MoneyDisplay.d.ts +6 -0
  6. package/dist/cjs/MoneyInput/MoneyInput.d.ts +10 -0
  7. package/dist/cjs/MoneyInput/MoneyInput.stories.d.ts +6 -0
  8. package/dist/cjs/ValueSetAutocomplete/ValueSetAutocomplete.d.ts +3 -6
  9. package/dist/cjs/auth/ChooseProfileForm.d.ts +2 -1
  10. package/dist/cjs/auth/ChooseScopeForm.d.ts +2 -1
  11. package/dist/cjs/auth/MfaForm.d.ts +7 -0
  12. package/dist/cjs/auth/SignInForm.d.ts +10 -0
  13. package/dist/cjs/{index.js → index.cjs} +860 -642
  14. package/dist/cjs/index.cjs.map +1 -0
  15. package/dist/cjs/index.d.ts +3 -0
  16. package/dist/cjs/index.min.cjs +1 -0
  17. package/dist/cjs/stories/referenceLab.d.ts +3 -1
  18. package/dist/esm/AddressDisplay/{AddressDisplay.js → AddressDisplay.mjs} +1 -1
  19. package/dist/esm/AddressDisplay/AddressDisplay.mjs.map +1 -0
  20. package/dist/esm/AddressInput/{AddressInput.js → AddressInput.mjs} +9 -9
  21. package/dist/esm/AddressInput/AddressInput.mjs.map +1 -0
  22. package/dist/esm/AnnotationInput/{AnnotationInput.js → AnnotationInput.mjs} +2 -2
  23. package/dist/esm/AnnotationInput/AnnotationInput.mjs.map +1 -0
  24. package/dist/esm/AsyncAutocomplete/AsyncAutocomplete.d.ts +14 -0
  25. package/dist/esm/AsyncAutocomplete/AsyncAutocomplete.mjs +113 -0
  26. package/dist/esm/AsyncAutocomplete/AsyncAutocomplete.mjs.map +1 -0
  27. package/dist/esm/AttachmentArrayDisplay/{AttachmentArrayDisplay.js → AttachmentArrayDisplay.mjs} +2 -2
  28. package/dist/esm/AttachmentArrayDisplay/AttachmentArrayDisplay.mjs.map +1 -0
  29. package/dist/esm/AttachmentArrayInput/{AttachmentArrayInput.js → AttachmentArrayInput.mjs} +6 -7
  30. package/dist/esm/AttachmentArrayInput/AttachmentArrayInput.mjs.map +1 -0
  31. package/dist/esm/AttachmentButton/{AttachmentButton.js → AttachmentButton.mjs} +5 -7
  32. package/dist/esm/AttachmentButton/AttachmentButton.mjs.map +1 -0
  33. package/dist/esm/AttachmentDisplay/AttachmentDisplay.mjs +21 -0
  34. package/dist/esm/AttachmentDisplay/AttachmentDisplay.mjs.map +1 -0
  35. package/dist/esm/AttachmentInput/{AttachmentInput.js → AttachmentInput.mjs} +5 -5
  36. package/dist/esm/AttachmentInput/AttachmentInput.mjs.map +1 -0
  37. package/dist/esm/BackboneElementDisplay/{BackboneElementDisplay.js → BackboneElementDisplay.mjs} +4 -4
  38. package/dist/esm/BackboneElementDisplay/BackboneElementDisplay.mjs.map +1 -0
  39. package/dist/esm/BackboneElementInput/{BackboneElementInput.js → BackboneElementInput.mjs} +10 -11
  40. package/dist/esm/BackboneElementInput/BackboneElementInput.mjs.map +1 -0
  41. package/dist/esm/CalendarInput/{CalendarInput.js → CalendarInput.mjs} +1 -1
  42. package/dist/esm/CalendarInput/CalendarInput.mjs.map +1 -0
  43. package/dist/esm/CheckboxFormSection/{CheckboxFormSection.js → CheckboxFormSection.mjs} +1 -1
  44. package/dist/esm/CheckboxFormSection/CheckboxFormSection.mjs.map +1 -0
  45. package/dist/esm/CodeInput/{CodeInput.js → CodeInput.mjs} +6 -5
  46. package/dist/esm/CodeInput/CodeInput.mjs.map +1 -0
  47. package/dist/esm/CodeableConceptDisplay/{CodeableConceptDisplay.js → CodeableConceptDisplay.mjs} +1 -1
  48. package/dist/esm/CodeableConceptDisplay/CodeableConceptDisplay.mjs.map +1 -0
  49. package/dist/esm/CodeableConceptInput/CodeableConceptInput.mjs +36 -0
  50. package/dist/esm/CodeableConceptInput/CodeableConceptInput.mjs.map +1 -0
  51. package/dist/esm/CodingDisplay/{CodingDisplay.js → CodingDisplay.mjs} +1 -1
  52. package/dist/esm/CodingDisplay/CodingDisplay.mjs.map +1 -0
  53. package/dist/esm/CodingInput/{CodingInput.js → CodingInput.mjs} +5 -4
  54. package/dist/esm/CodingInput/CodingInput.mjs.map +1 -0
  55. package/dist/esm/ContactDetailDisplay/{ContactDetailDisplay.js → ContactDetailDisplay.mjs} +4 -5
  56. package/dist/esm/ContactDetailDisplay/ContactDetailDisplay.mjs.map +1 -0
  57. package/dist/esm/ContactDetailInput/{ContactDetailInput.js → ContactDetailInput.mjs} +6 -7
  58. package/dist/esm/ContactDetailInput/ContactDetailInput.mjs.map +1 -0
  59. package/dist/esm/ContactPointDisplay/{ContactPointDisplay.js → ContactPointDisplay.mjs} +1 -1
  60. package/dist/esm/ContactPointDisplay/ContactPointDisplay.mjs.map +1 -0
  61. package/dist/esm/ContactPointInput/{ContactPointInput.js → ContactPointInput.mjs} +7 -7
  62. package/dist/esm/ContactPointInput/ContactPointInput.mjs.map +1 -0
  63. package/dist/esm/Container/{Container.js → Container.mjs} +3 -4
  64. package/dist/esm/Container/Container.mjs.map +1 -0
  65. package/dist/esm/DateTimeInput/{DateTimeInput.js → DateTimeInput.mjs} +2 -2
  66. package/dist/esm/DateTimeInput/DateTimeInput.mjs.map +1 -0
  67. package/dist/esm/DefaultResourceTimeline/{DefaultResourceTimeline.js → DefaultResourceTimeline.mjs} +2 -2
  68. package/dist/esm/DefaultResourceTimeline/DefaultResourceTimeline.mjs.map +1 -0
  69. package/dist/esm/DescriptionList/{DescriptionList.js → DescriptionList.mjs} +1 -1
  70. package/dist/esm/DescriptionList/DescriptionList.mjs.map +1 -0
  71. package/dist/esm/DiagnosticReportDisplay/{DiagnosticReportDisplay.js → DiagnosticReportDisplay.mjs} +19 -16
  72. package/dist/esm/DiagnosticReportDisplay/DiagnosticReportDisplay.mjs.map +1 -0
  73. package/dist/esm/DiagnosticReportDisplay/DiagnosticReportDisplay.stories.d.ts +1 -0
  74. package/dist/esm/Document/Document.mjs +12 -0
  75. package/dist/esm/Document/Document.mjs.map +1 -0
  76. package/dist/esm/EncounterTimeline/{EncounterTimeline.js → EncounterTimeline.mjs} +2 -2
  77. package/dist/esm/EncounterTimeline/EncounterTimeline.mjs.map +1 -0
  78. package/dist/esm/ErrorBoundary/{ErrorBoundary.js → ErrorBoundary.mjs} +1 -1
  79. package/dist/esm/ErrorBoundary/ErrorBoundary.mjs.map +1 -0
  80. package/dist/esm/ExtensionInput/{ExtensionInput.js → ExtensionInput.mjs} +1 -1
  81. package/dist/esm/ExtensionInput/ExtensionInput.mjs.map +1 -0
  82. package/dist/esm/FhirPathDisplay/{FhirPathDisplay.js → FhirPathDisplay.mjs} +2 -2
  83. package/dist/esm/FhirPathDisplay/FhirPathDisplay.mjs.map +1 -0
  84. package/dist/esm/FhirPathTable/FhirPathTable.d.ts +2 -2
  85. package/dist/esm/FhirPathTable/{FhirPathTable.js → FhirPathTable.mjs} +14 -17
  86. package/dist/esm/FhirPathTable/FhirPathTable.mjs.map +1 -0
  87. package/dist/esm/Form/{Form.js → Form.mjs} +2 -2
  88. package/dist/esm/Form/Form.mjs.map +1 -0
  89. package/dist/esm/Form/{FormUtils.js → FormUtils.mjs} +1 -1
  90. package/dist/esm/Form/FormUtils.mjs.map +1 -0
  91. package/dist/esm/FormSection/{FormSection.js → FormSection.mjs} +2 -2
  92. package/dist/esm/FormSection/FormSection.mjs.map +1 -0
  93. package/dist/esm/GoogleButton/{GoogleButton.js → GoogleButton.mjs} +4 -5
  94. package/dist/esm/GoogleButton/GoogleButton.mjs.map +1 -0
  95. package/dist/esm/HumanNameDisplay/{HumanNameDisplay.js → HumanNameDisplay.mjs} +1 -1
  96. package/dist/esm/HumanNameDisplay/HumanNameDisplay.mjs.map +1 -0
  97. package/dist/esm/HumanNameInput/HumanNameInput.mjs +50 -0
  98. package/dist/esm/HumanNameInput/HumanNameInput.mjs.map +1 -0
  99. package/dist/esm/IdentifierDisplay/IdentifierDisplay.mjs +11 -0
  100. package/dist/esm/IdentifierDisplay/IdentifierDisplay.mjs.map +1 -0
  101. package/dist/esm/IdentifierInput/{IdentifierInput.js → IdentifierInput.mjs} +3 -3
  102. package/dist/esm/IdentifierInput/IdentifierInput.mjs.map +1 -0
  103. package/dist/esm/Logo/{Logo.js → Logo.mjs} +1 -1
  104. package/dist/esm/Logo/Logo.mjs.map +1 -0
  105. package/dist/esm/MedplumLink/{MedplumLink.js → MedplumLink.mjs} +5 -6
  106. package/dist/esm/MedplumLink/MedplumLink.mjs.map +1 -0
  107. package/dist/esm/MedplumProvider/{MedplumProvider.js → MedplumProvider.mjs} +9 -3
  108. package/dist/esm/MedplumProvider/MedplumProvider.mjs.map +1 -0
  109. package/dist/esm/MoneyDisplay/MoneyDisplay.d.ts +6 -0
  110. package/dist/esm/MoneyDisplay/MoneyDisplay.mjs +9 -0
  111. package/dist/esm/MoneyDisplay/MoneyDisplay.mjs.map +1 -0
  112. package/dist/esm/MoneyInput/MoneyInput.d.ts +10 -0
  113. package/dist/esm/MoneyInput/MoneyInput.mjs +53 -0
  114. package/dist/esm/MoneyInput/MoneyInput.mjs.map +1 -0
  115. package/dist/esm/MoneyInput/MoneyInput.stories.d.ts +6 -0
  116. package/dist/esm/Panel/{Panel.js → Panel.mjs} +3 -4
  117. package/dist/esm/Panel/Panel.mjs.map +1 -0
  118. package/dist/esm/PatientTimeline/{PatientTimeline.js → PatientTimeline.mjs} +2 -2
  119. package/dist/esm/PatientTimeline/PatientTimeline.mjs.map +1 -0
  120. package/dist/esm/PeriodInput/{PeriodInput.js → PeriodInput.mjs} +4 -4
  121. package/dist/esm/PeriodInput/PeriodInput.mjs.map +1 -0
  122. package/dist/esm/PlanDefinitionBuilder/{PlanDefinitionBuilder.js → PlanDefinitionBuilder.mjs} +36 -24
  123. package/dist/esm/PlanDefinitionBuilder/PlanDefinitionBuilder.mjs.map +1 -0
  124. package/dist/esm/QuantityDisplay/{QuantityDisplay.js → QuantityDisplay.mjs} +1 -1
  125. package/dist/esm/QuantityDisplay/QuantityDisplay.mjs.map +1 -0
  126. package/dist/esm/QuantityInput/{QuantityInput.js → QuantityInput.mjs} +13 -5
  127. package/dist/esm/QuantityInput/QuantityInput.mjs.map +1 -0
  128. package/dist/esm/QuestionnaireBuilder/{QuestionnaireBuilder.js → QuestionnaireBuilder.mjs} +45 -27
  129. package/dist/esm/QuestionnaireBuilder/QuestionnaireBuilder.mjs.map +1 -0
  130. package/dist/esm/QuestionnaireForm/{QuestionnaireForm.js → QuestionnaireForm.mjs} +37 -36
  131. package/dist/esm/QuestionnaireForm/QuestionnaireForm.mjs.map +1 -0
  132. package/dist/esm/RangeDisplay/{RangeDisplay.js → RangeDisplay.mjs} +1 -1
  133. package/dist/esm/RangeDisplay/RangeDisplay.mjs.map +1 -0
  134. package/dist/esm/RangeInput/{RangeInput.js → RangeInput.mjs} +10 -4
  135. package/dist/esm/RangeInput/RangeInput.mjs.map +1 -0
  136. package/dist/esm/RatioDisplay/{RatioDisplay.js → RatioDisplay.mjs} +2 -2
  137. package/dist/esm/RatioDisplay/RatioDisplay.mjs.map +1 -0
  138. package/dist/esm/RatioInput/{RatioInput.js → RatioInput.mjs} +10 -4
  139. package/dist/esm/RatioInput/RatioInput.mjs.map +1 -0
  140. package/dist/esm/ReferenceDisplay/{ReferenceDisplay.js → ReferenceDisplay.mjs} +2 -2
  141. package/dist/esm/ReferenceDisplay/ReferenceDisplay.mjs.map +1 -0
  142. package/dist/esm/ReferenceInput/{ReferenceInput.js → ReferenceInput.mjs} +10 -5
  143. package/dist/esm/ReferenceInput/ReferenceInput.mjs.map +1 -0
  144. package/dist/esm/ReferenceRangeEditor/{ReferenceRangeEditor.js → ReferenceRangeEditor.mjs} +44 -38
  145. package/dist/esm/ReferenceRangeEditor/ReferenceRangeEditor.mjs.map +1 -0
  146. package/dist/esm/RequestGroupDisplay/{RequestGroupDisplay.js → RequestGroupDisplay.mjs} +14 -17
  147. package/dist/esm/RequestGroupDisplay/RequestGroupDisplay.mjs.map +1 -0
  148. package/dist/esm/ResourceArrayDisplay/{ResourceArrayDisplay.js → ResourceArrayDisplay.mjs} +4 -5
  149. package/dist/esm/ResourceArrayDisplay/ResourceArrayDisplay.mjs.map +1 -0
  150. package/dist/esm/ResourceArrayInput/{ResourceArrayInput.js → ResourceArrayInput.mjs} +3 -3
  151. package/dist/esm/ResourceArrayInput/ResourceArrayInput.mjs.map +1 -0
  152. package/dist/esm/ResourceAvatar/ResourceAvatar.mjs +23 -0
  153. package/dist/esm/ResourceAvatar/ResourceAvatar.mjs.map +1 -0
  154. package/dist/esm/ResourceBadge/{ResourceBadge.js → ResourceBadge.mjs} +3 -3
  155. package/dist/esm/ResourceBadge/ResourceBadge.mjs.map +1 -0
  156. package/dist/esm/ResourceBlame/{ResourceBlame.js → ResourceBlame.mjs} +6 -7
  157. package/dist/esm/ResourceBlame/ResourceBlame.mjs.map +1 -0
  158. package/dist/esm/ResourceDiff/{ResourceDiff.js → ResourceDiff.mjs} +4 -4
  159. package/dist/esm/ResourceDiff/ResourceDiff.mjs.map +1 -0
  160. package/dist/esm/ResourceDiffTable/{ResourceDiffTable.js → ResourceDiffTable.mjs} +3 -3
  161. package/dist/esm/ResourceDiffTable/ResourceDiffTable.mjs.map +1 -0
  162. package/dist/esm/ResourceForm/{ResourceForm.js → ResourceForm.mjs} +5 -5
  163. package/dist/esm/ResourceForm/ResourceForm.mjs.map +1 -0
  164. package/dist/esm/ResourceHistoryTable/{ResourceHistoryTable.js → ResourceHistoryTable.mjs} +10 -13
  165. package/dist/esm/ResourceHistoryTable/ResourceHistoryTable.mjs.map +1 -0
  166. package/dist/esm/ResourceInput/{ResourceInput.js → ResourceInput.mjs} +19 -25
  167. package/dist/esm/ResourceInput/ResourceInput.mjs.map +1 -0
  168. package/dist/esm/ResourceName/ResourceName.mjs +18 -0
  169. package/dist/esm/ResourceName/ResourceName.mjs.map +1 -0
  170. package/dist/esm/ResourcePropertyDisplay/{ResourcePropertyDisplay.js → ResourcePropertyDisplay.mjs} +23 -21
  171. package/dist/esm/ResourcePropertyDisplay/ResourcePropertyDisplay.mjs.map +1 -0
  172. package/dist/esm/ResourcePropertyInput/{ResourcePropertyInput.js → ResourcePropertyInput.mjs} +34 -34
  173. package/dist/esm/ResourcePropertyInput/ResourcePropertyInput.mjs.map +1 -0
  174. package/dist/esm/ResourceTable/{ResourceTable.js → ResourceTable.mjs} +4 -4
  175. package/dist/esm/ResourceTable/ResourceTable.mjs.map +1 -0
  176. package/dist/esm/ResourceTimeline/{ResourceTimeline.js → ResourceTimeline.mjs} +26 -30
  177. package/dist/esm/ResourceTimeline/ResourceTimeline.mjs.map +1 -0
  178. package/dist/esm/Scheduler/{Scheduler.js → Scheduler.mjs} +8 -9
  179. package/dist/esm/Scheduler/Scheduler.mjs.map +1 -0
  180. package/dist/esm/SearchControl/{SearchControl.js → SearchControl.mjs} +66 -50
  181. package/dist/esm/SearchControl/SearchControl.mjs.map +1 -0
  182. package/dist/esm/SearchControl/{SearchControlField.js → SearchControlField.mjs} +3 -4
  183. package/dist/esm/SearchControl/SearchControlField.mjs.map +1 -0
  184. package/dist/esm/SearchControl/{SearchUtils.js → SearchUtils.mjs} +34 -17
  185. package/dist/esm/SearchControl/SearchUtils.mjs.map +1 -0
  186. package/dist/esm/SearchFieldEditor/{SearchFieldEditor.js → SearchFieldEditor.mjs} +28 -21
  187. package/dist/esm/SearchFieldEditor/SearchFieldEditor.mjs.map +1 -0
  188. package/dist/esm/SearchFilterEditor/{SearchFilterEditor.js → SearchFilterEditor.mjs} +8 -9
  189. package/dist/esm/SearchFilterEditor/SearchFilterEditor.mjs.map +1 -0
  190. package/dist/esm/SearchFilterValueDialog/{SearchFilterValueDialog.js → SearchFilterValueDialog.mjs} +5 -6
  191. package/dist/esm/SearchFilterValueDialog/SearchFilterValueDialog.mjs.map +1 -0
  192. package/dist/esm/SearchFilterValueDisplay/{SearchFilterValueDisplay.js → SearchFilterValueDisplay.mjs} +3 -4
  193. package/dist/esm/SearchFilterValueDisplay/SearchFilterValueDisplay.mjs.map +1 -0
  194. package/dist/esm/SearchFilterValueInput/{SearchFilterValueInput.js → SearchFilterValueInput.mjs} +5 -6
  195. package/dist/esm/SearchFilterValueInput/SearchFilterValueInput.mjs.map +1 -0
  196. package/dist/esm/SearchPopupMenu/{SearchPopupMenu.js → SearchPopupMenu.mjs} +10 -10
  197. package/dist/esm/SearchPopupMenu/SearchPopupMenu.mjs.map +1 -0
  198. package/dist/esm/ServiceRequestTimeline/{ServiceRequestTimeline.js → ServiceRequestTimeline.mjs} +2 -2
  199. package/dist/esm/ServiceRequestTimeline/ServiceRequestTimeline.mjs.map +1 -0
  200. package/dist/esm/StatusBadge/{StatusBadge.js → StatusBadge.mjs} +3 -2
  201. package/dist/esm/StatusBadge/StatusBadge.mjs.map +1 -0
  202. package/dist/esm/Timeline/{Timeline.js → Timeline.mjs} +11 -13
  203. package/dist/esm/Timeline/Timeline.mjs.map +1 -0
  204. package/dist/esm/TimingInput/{TimingInput.js → TimingInput.mjs} +13 -18
  205. package/dist/esm/TimingInput/TimingInput.mjs.map +1 -0
  206. package/dist/esm/ValueSetAutocomplete/ValueSetAutocomplete.d.ts +3 -6
  207. package/dist/esm/ValueSetAutocomplete/ValueSetAutocomplete.mjs +43 -0
  208. package/dist/esm/ValueSetAutocomplete/ValueSetAutocomplete.mjs.map +1 -0
  209. package/dist/esm/auth/{AuthenticationForm.js → AuthenticationForm.mjs} +21 -19
  210. package/dist/esm/auth/AuthenticationForm.mjs.map +1 -0
  211. package/dist/esm/auth/ChooseProfileForm.d.ts +2 -1
  212. package/dist/esm/auth/ChooseProfileForm.mjs +29 -0
  213. package/dist/esm/auth/ChooseProfileForm.mjs.map +1 -0
  214. package/dist/esm/auth/ChooseScopeForm.d.ts +2 -1
  215. package/dist/esm/auth/{ChooseScopeForm.js → ChooseScopeForm.mjs} +4 -4
  216. package/dist/esm/auth/ChooseScopeForm.mjs.map +1 -0
  217. package/dist/esm/auth/MfaForm.d.ts +7 -0
  218. package/dist/esm/auth/MfaForm.mjs +34 -0
  219. package/dist/esm/auth/MfaForm.mjs.map +1 -0
  220. package/dist/esm/auth/{NewProjectForm.js → NewProjectForm.mjs} +8 -9
  221. package/dist/esm/auth/NewProjectForm.mjs.map +1 -0
  222. package/dist/esm/auth/{NewUserForm.js → NewUserForm.mjs} +15 -19
  223. package/dist/esm/auth/NewUserForm.mjs.map +1 -0
  224. package/dist/esm/auth/{RegisterForm.js → RegisterForm.mjs} +5 -5
  225. package/dist/esm/auth/RegisterForm.mjs.map +1 -0
  226. package/dist/esm/auth/SignInForm.d.ts +10 -0
  227. package/dist/esm/auth/{SignInForm.js → SignInForm.mjs} +25 -10
  228. package/dist/esm/auth/SignInForm.mjs.map +1 -0
  229. package/dist/esm/{constants.js → constants.mjs} +1 -1
  230. package/dist/esm/constants.mjs.map +1 -0
  231. package/dist/esm/index.d.ts +3 -0
  232. package/dist/esm/index.min.mjs +1 -0
  233. package/dist/esm/{index.js → index.mjs} +88 -85
  234. package/dist/esm/index.mjs.map +1 -0
  235. package/dist/esm/stories/referenceLab.d.ts +3 -1
  236. package/dist/esm/useResource/{useResource.js → useResource.mjs} +2 -2
  237. package/dist/esm/useResource/useResource.mjs.map +1 -0
  238. package/dist/esm/utils/{blame.js → blame.mjs} +6 -9
  239. package/dist/esm/utils/blame.mjs.map +1 -0
  240. package/dist/esm/utils/{date.js → date.mjs} +2 -3
  241. package/dist/esm/utils/date.mjs.map +1 -0
  242. package/dist/esm/utils/{diff.js → diff.mjs} +1 -1
  243. package/dist/esm/utils/diff.mjs.map +1 -0
  244. package/dist/esm/utils/{dom.js → dom.mjs} +1 -1
  245. package/dist/esm/utils/dom.mjs.map +1 -0
  246. package/dist/esm/utils/outcomes.mjs +30 -0
  247. package/dist/esm/utils/outcomes.mjs.map +1 -0
  248. package/dist/esm/utils/{questionnaire.js → questionnaire.mjs} +1 -1
  249. package/dist/esm/utils/questionnaire.mjs.map +1 -0
  250. package/dist/esm/utils/{recaptcha.js → recaptcha.mjs} +5 -6
  251. package/dist/esm/utils/recaptcha.mjs.map +1 -0
  252. package/dist/esm/utils/{script.js → script.mjs} +1 -1
  253. package/dist/esm/utils/script.mjs.map +1 -0
  254. package/package.json +22 -22
  255. package/rollup.config.mjs +6 -7
  256. package/dist/cjs/index.js.map +0 -1
  257. package/dist/cjs/index.min.js +0 -2
  258. package/dist/cjs/index.min.js.map +0 -1
  259. package/dist/esm/AddressDisplay/AddressDisplay.js.map +0 -1
  260. package/dist/esm/AddressInput/AddressInput.js.map +0 -1
  261. package/dist/esm/AnnotationInput/AnnotationInput.js.map +0 -1
  262. package/dist/esm/AttachmentArrayDisplay/AttachmentArrayDisplay.js.map +0 -1
  263. package/dist/esm/AttachmentArrayInput/AttachmentArrayInput.js.map +0 -1
  264. package/dist/esm/AttachmentButton/AttachmentButton.js.map +0 -1
  265. package/dist/esm/AttachmentDisplay/AttachmentDisplay.js +0 -21
  266. package/dist/esm/AttachmentDisplay/AttachmentDisplay.js.map +0 -1
  267. package/dist/esm/AttachmentInput/AttachmentInput.js.map +0 -1
  268. package/dist/esm/BackboneElementDisplay/BackboneElementDisplay.js.map +0 -1
  269. package/dist/esm/BackboneElementInput/BackboneElementInput.js.map +0 -1
  270. package/dist/esm/CalendarInput/CalendarInput.js.map +0 -1
  271. package/dist/esm/CheckboxFormSection/CheckboxFormSection.js.map +0 -1
  272. package/dist/esm/CodeInput/CodeInput.js.map +0 -1
  273. package/dist/esm/CodeableConceptDisplay/CodeableConceptDisplay.js.map +0 -1
  274. package/dist/esm/CodeableConceptInput/CodeableConceptInput.js +0 -37
  275. package/dist/esm/CodeableConceptInput/CodeableConceptInput.js.map +0 -1
  276. package/dist/esm/CodingDisplay/CodingDisplay.js.map +0 -1
  277. package/dist/esm/CodingInput/CodingInput.js.map +0 -1
  278. package/dist/esm/ContactDetailDisplay/ContactDetailDisplay.js.map +0 -1
  279. package/dist/esm/ContactDetailInput/ContactDetailInput.js.map +0 -1
  280. package/dist/esm/ContactPointDisplay/ContactPointDisplay.js.map +0 -1
  281. package/dist/esm/ContactPointInput/ContactPointInput.js.map +0 -1
  282. package/dist/esm/Container/Container.js.map +0 -1
  283. package/dist/esm/DateTimeInput/DateTimeInput.js.map +0 -1
  284. package/dist/esm/DefaultResourceTimeline/DefaultResourceTimeline.js.map +0 -1
  285. package/dist/esm/DescriptionList/DescriptionList.js.map +0 -1
  286. package/dist/esm/DiagnosticReportDisplay/DiagnosticReportDisplay.js.map +0 -1
  287. package/dist/esm/Document/Document.js +0 -13
  288. package/dist/esm/Document/Document.js.map +0 -1
  289. package/dist/esm/EncounterTimeline/EncounterTimeline.js.map +0 -1
  290. package/dist/esm/ErrorBoundary/ErrorBoundary.js.map +0 -1
  291. package/dist/esm/ExtensionInput/ExtensionInput.js.map +0 -1
  292. package/dist/esm/FhirPathDisplay/FhirPathDisplay.js.map +0 -1
  293. package/dist/esm/FhirPathTable/FhirPathTable.js.map +0 -1
  294. package/dist/esm/Form/Form.js.map +0 -1
  295. package/dist/esm/Form/FormUtils.js.map +0 -1
  296. package/dist/esm/FormSection/FormSection.js.map +0 -1
  297. package/dist/esm/GoogleButton/GoogleButton.js.map +0 -1
  298. package/dist/esm/HumanNameDisplay/HumanNameDisplay.js.map +0 -1
  299. package/dist/esm/HumanNameInput/HumanNameInput.js +0 -39
  300. package/dist/esm/HumanNameInput/HumanNameInput.js.map +0 -1
  301. package/dist/esm/IdentifierDisplay/IdentifierDisplay.js +0 -12
  302. package/dist/esm/IdentifierDisplay/IdentifierDisplay.js.map +0 -1
  303. package/dist/esm/IdentifierInput/IdentifierInput.js.map +0 -1
  304. package/dist/esm/Logo/Logo.js.map +0 -1
  305. package/dist/esm/MedplumLink/MedplumLink.js.map +0 -1
  306. package/dist/esm/MedplumProvider/MedplumProvider.js.map +0 -1
  307. package/dist/esm/Panel/Panel.js.map +0 -1
  308. package/dist/esm/PatientTimeline/PatientTimeline.js.map +0 -1
  309. package/dist/esm/PeriodInput/PeriodInput.js.map +0 -1
  310. package/dist/esm/PlanDefinitionBuilder/PlanDefinitionBuilder.js.map +0 -1
  311. package/dist/esm/QuantityDisplay/QuantityDisplay.js.map +0 -1
  312. package/dist/esm/QuantityInput/QuantityInput.js.map +0 -1
  313. package/dist/esm/QuestionnaireBuilder/QuestionnaireBuilder.js.map +0 -1
  314. package/dist/esm/QuestionnaireForm/QuestionnaireForm.js.map +0 -1
  315. package/dist/esm/RangeDisplay/RangeDisplay.js.map +0 -1
  316. package/dist/esm/RangeInput/RangeInput.js.map +0 -1
  317. package/dist/esm/RatioDisplay/RatioDisplay.js.map +0 -1
  318. package/dist/esm/RatioInput/RatioInput.js.map +0 -1
  319. package/dist/esm/ReferenceDisplay/ReferenceDisplay.js.map +0 -1
  320. package/dist/esm/ReferenceInput/ReferenceInput.js.map +0 -1
  321. package/dist/esm/ReferenceRangeEditor/ReferenceRangeEditor.js.map +0 -1
  322. package/dist/esm/RequestGroupDisplay/RequestGroupDisplay.js.map +0 -1
  323. package/dist/esm/ResourceArrayDisplay/ResourceArrayDisplay.js.map +0 -1
  324. package/dist/esm/ResourceArrayInput/ResourceArrayInput.js.map +0 -1
  325. package/dist/esm/ResourceAvatar/ResourceAvatar.js +0 -24
  326. package/dist/esm/ResourceAvatar/ResourceAvatar.js.map +0 -1
  327. package/dist/esm/ResourceBadge/ResourceBadge.js.map +0 -1
  328. package/dist/esm/ResourceBlame/ResourceBlame.js.map +0 -1
  329. package/dist/esm/ResourceDiff/ResourceDiff.js.map +0 -1
  330. package/dist/esm/ResourceDiffTable/ResourceDiffTable.js.map +0 -1
  331. package/dist/esm/ResourceForm/ResourceForm.js.map +0 -1
  332. package/dist/esm/ResourceHistoryTable/ResourceHistoryTable.js.map +0 -1
  333. package/dist/esm/ResourceInput/ResourceInput.js.map +0 -1
  334. package/dist/esm/ResourceName/ResourceName.js +0 -19
  335. package/dist/esm/ResourceName/ResourceName.js.map +0 -1
  336. package/dist/esm/ResourcePropertyDisplay/ResourcePropertyDisplay.js.map +0 -1
  337. package/dist/esm/ResourcePropertyInput/ResourcePropertyInput.js.map +0 -1
  338. package/dist/esm/ResourceTable/ResourceTable.js.map +0 -1
  339. package/dist/esm/ResourceTimeline/ResourceTimeline.js.map +0 -1
  340. package/dist/esm/Scheduler/Scheduler.js.map +0 -1
  341. package/dist/esm/SearchControl/SearchControl.js.map +0 -1
  342. package/dist/esm/SearchControl/SearchControlField.js.map +0 -1
  343. package/dist/esm/SearchControl/SearchUtils.js.map +0 -1
  344. package/dist/esm/SearchFieldEditor/SearchFieldEditor.js.map +0 -1
  345. package/dist/esm/SearchFilterEditor/SearchFilterEditor.js.map +0 -1
  346. package/dist/esm/SearchFilterValueDialog/SearchFilterValueDialog.js.map +0 -1
  347. package/dist/esm/SearchFilterValueDisplay/SearchFilterValueDisplay.js.map +0 -1
  348. package/dist/esm/SearchFilterValueInput/SearchFilterValueInput.js.map +0 -1
  349. package/dist/esm/SearchPopupMenu/SearchPopupMenu.js.map +0 -1
  350. package/dist/esm/ServiceRequestTimeline/ServiceRequestTimeline.js.map +0 -1
  351. package/dist/esm/StatusBadge/StatusBadge.js.map +0 -1
  352. package/dist/esm/Timeline/Timeline.js.map +0 -1
  353. package/dist/esm/TimingInput/TimingInput.js.map +0 -1
  354. package/dist/esm/ValueSetAutocomplete/ValueSetAutocomplete.js +0 -65
  355. package/dist/esm/ValueSetAutocomplete/ValueSetAutocomplete.js.map +0 -1
  356. package/dist/esm/auth/AuthenticationForm.js.map +0 -1
  357. package/dist/esm/auth/ChooseProfileForm.js +0 -32
  358. package/dist/esm/auth/ChooseProfileForm.js.map +0 -1
  359. package/dist/esm/auth/ChooseScopeForm.js.map +0 -1
  360. package/dist/esm/auth/NewProjectForm.js.map +0 -1
  361. package/dist/esm/auth/NewUserForm.js.map +0 -1
  362. package/dist/esm/auth/RegisterForm.js.map +0 -1
  363. package/dist/esm/auth/SignInForm.js.map +0 -1
  364. package/dist/esm/constants.js.map +0 -1
  365. package/dist/esm/index.js.map +0 -1
  366. package/dist/esm/index.min.js +0 -2
  367. package/dist/esm/index.min.js.map +0 -1
  368. package/dist/esm/node_modules/tslib/tslib.es6.js +0 -39
  369. package/dist/esm/node_modules/tslib/tslib.es6.js.map +0 -1
  370. package/dist/esm/useResource/useResource.js.map +0 -1
  371. package/dist/esm/utils/blame.js.map +0 -1
  372. package/dist/esm/utils/date.js.map +0 -1
  373. package/dist/esm/utils/diff.js.map +0 -1
  374. package/dist/esm/utils/dom.js.map +0 -1
  375. package/dist/esm/utils/outcomes.js +0 -29
  376. package/dist/esm/utils/outcomes.js.map +0 -1
  377. package/dist/esm/utils/questionnaire.js.map +0 -1
  378. package/dist/esm/utils/recaptcha.js.map +0 -1
  379. package/dist/esm/utils/script.js.map +0 -1
@@ -0,0 +1,113 @@
1
+ import { MultiSelect, Loader } from '@mantine/core';
2
+ import React, { useRef, useState, useCallback, useEffect } from 'react';
3
+ import { killEvent } from '../utils/dom.mjs';
4
+
5
+ function AsyncAutocomplete(props) {
6
+ const { defaultValue, toKey, toOption, loadOptions, onChange, onCreate, ...rest } = props;
7
+ const defaultItems = toDefaultItems(defaultValue);
8
+ const inputRef = useRef(null);
9
+ const [lastValue, setLastValue] = useState(undefined);
10
+ const [timer, setTimer] = useState();
11
+ const [abortController, setAbortController] = useState();
12
+ const [autoSubmit, setAutoSubmit] = useState();
13
+ const [options, setOptions] = useState(defaultItems?.map(toOption));
14
+ const lastValueRef = useRef();
15
+ lastValueRef.current = lastValue;
16
+ const timerRef = useRef();
17
+ timerRef.current = timer;
18
+ const abortControllerRef = useRef();
19
+ abortControllerRef.current = abortController;
20
+ const autoSubmitRef = useRef();
21
+ autoSubmitRef.current = autoSubmit;
22
+ const optionsRef = useRef();
23
+ optionsRef.current = options;
24
+ const handleTimer = useCallback(() => {
25
+ setTimer(undefined);
26
+ const value = inputRef.current?.value?.trim() || '';
27
+ if (value === lastValueRef.current) {
28
+ // Nothing has changed, move on
29
+ return;
30
+ }
31
+ setLastValue(value);
32
+ const newAbortController = new AbortController();
33
+ setAbortController(newAbortController);
34
+ loadOptions(value, newAbortController.signal)
35
+ .then((newValues) => {
36
+ if (!newAbortController.signal.aborted) {
37
+ setOptions(newValues.map(toOption));
38
+ setAbortController(undefined);
39
+ if (autoSubmitRef.current) {
40
+ if (newValues.length > 0) {
41
+ onChange(newValues.slice(0, 1));
42
+ }
43
+ setAutoSubmit(false);
44
+ }
45
+ }
46
+ })
47
+ .catch(console.log);
48
+ }, [loadOptions, onChange, toOption]);
49
+ const handleSearchChange = useCallback(() => {
50
+ if (abortControllerRef.current) {
51
+ abortControllerRef.current.abort();
52
+ setAbortController(undefined);
53
+ }
54
+ if (timerRef.current !== undefined) {
55
+ window.clearTimeout(timerRef.current);
56
+ }
57
+ const newTimer = window.setTimeout(() => handleTimer(), 100);
58
+ setTimer(newTimer);
59
+ }, [handleTimer]);
60
+ const handleChange = useCallback((values) => {
61
+ const result = [];
62
+ for (const value of values) {
63
+ let item = optionsRef.current?.find((option) => option.value === value)?.resource;
64
+ if (!item) {
65
+ item = onCreate(value);
66
+ }
67
+ result.push(item);
68
+ }
69
+ onChange(result);
70
+ }, [onChange, onCreate]);
71
+ const handleKeyDown = useCallback((e) => {
72
+ if (e.key === 'Enter') {
73
+ if (!timerRef.current && !abortControllerRef.current) {
74
+ killEvent(e);
75
+ if (optionsRef.current && optionsRef.current.length > 0) {
76
+ setOptions(optionsRef.current.slice(0, 1));
77
+ handleChange([optionsRef.current[0].value]);
78
+ }
79
+ }
80
+ else {
81
+ // The user pressed enter, but we don't have results yet.
82
+ // We need to wait for the results to come in.
83
+ setAutoSubmit(true);
84
+ }
85
+ }
86
+ }, [handleChange]);
87
+ const handleCreate = useCallback((input) => {
88
+ const option = toOption(onCreate(input));
89
+ setOptions([...optionsRef.current, option]);
90
+ return option;
91
+ }, [onCreate, setOptions, toOption]);
92
+ const handleFilter = useCallback((_value, selected) => !selected, []);
93
+ useEffect(() => {
94
+ return () => {
95
+ if (abortControllerRef.current) {
96
+ abortControllerRef.current.abort();
97
+ }
98
+ };
99
+ }, []);
100
+ return (React.createElement(MultiSelect, { ...rest, ref: inputRef, defaultValue: defaultItems.map(toKey), searchable: true, onKeyDown: handleKeyDown, onSearchChange: handleSearchChange, data: options, onFocus: handleTimer, onChange: handleChange, onCreate: handleCreate, rightSectionWidth: 40, rightSection: abortController ? React.createElement(Loader, { size: 16 }) : null, filter: handleFilter }));
101
+ }
102
+ function toDefaultItems(defaultValue) {
103
+ if (!defaultValue) {
104
+ return [];
105
+ }
106
+ if (Array.isArray(defaultValue)) {
107
+ return defaultValue;
108
+ }
109
+ return [defaultValue];
110
+ }
111
+
112
+ export { AsyncAutocomplete };
113
+ //# sourceMappingURL=AsyncAutocomplete.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AsyncAutocomplete.mjs","sources":["../../../src/AsyncAutocomplete/AsyncAutocomplete.tsx"],"sourcesContent":["import { Loader, MultiSelect, MultiSelectProps, SelectItem } from '@mantine/core';\nimport React, { useCallback, useEffect, useRef, useState } from 'react';\nimport { killEvent } from '../utils/dom';\n\nexport interface AsyncAutocompleteOption<T> extends SelectItem {\n resource: T;\n}\n\nexport interface AsyncAutocompleteProps<T>\n extends Omit<MultiSelectProps, 'data' | 'defaultValue' | 'loadOptions' | 'onChange' | 'onCreate' | 'searchable'> {\n defaultValue?: T | T[];\n toKey: (item: T) => string;\n toOption: (item: T) => AsyncAutocompleteOption<T>;\n loadOptions: (input: string, signal: AbortSignal) => Promise<T[]>;\n onChange: (item: T[]) => void;\n onCreate?: (input: string) => T;\n}\n\nexport function AsyncAutocomplete<T>(props: AsyncAutocompleteProps<T>): JSX.Element {\n const { defaultValue, toKey, toOption, loadOptions, onChange, onCreate, ...rest } = props;\n const defaultItems = toDefaultItems(defaultValue);\n const inputRef = useRef<HTMLInputElement>(null);\n const [lastValue, setLastValue] = useState<string | undefined>(undefined);\n const [timer, setTimer] = useState<number>();\n const [abortController, setAbortController] = useState<AbortController>();\n const [autoSubmit, setAutoSubmit] = useState<boolean>();\n const [options, setOptions] = useState<AsyncAutocompleteOption<T>[]>(defaultItems?.map(toOption));\n\n const lastValueRef = useRef<string>();\n lastValueRef.current = lastValue;\n\n const timerRef = useRef<number>();\n timerRef.current = timer;\n\n const abortControllerRef = useRef<AbortController>();\n abortControllerRef.current = abortController;\n\n const autoSubmitRef = useRef<boolean>();\n autoSubmitRef.current = autoSubmit;\n\n const optionsRef = useRef<AsyncAutocompleteOption<T>[]>();\n optionsRef.current = options;\n\n const handleTimer = useCallback((): void => {\n setTimer(undefined);\n\n const value = inputRef.current?.value?.trim() || '';\n if (value === lastValueRef.current) {\n // Nothing has changed, move on\n return;\n }\n\n setLastValue(value);\n\n const newAbortController = new AbortController();\n setAbortController(newAbortController);\n\n loadOptions(value, newAbortController.signal)\n .then((newValues: T[]) => {\n if (!newAbortController.signal.aborted) {\n setOptions(newValues.map(toOption));\n setAbortController(undefined);\n if (autoSubmitRef.current) {\n if (newValues.length > 0) {\n onChange(newValues.slice(0, 1));\n }\n setAutoSubmit(false);\n }\n }\n })\n .catch(console.log);\n }, [loadOptions, onChange, toOption]);\n\n const handleSearchChange = useCallback((): void => {\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n setAbortController(undefined);\n }\n\n if (timerRef.current !== undefined) {\n window.clearTimeout(timerRef.current);\n }\n\n const newTimer = window.setTimeout(() => handleTimer(), 100);\n setTimer(newTimer);\n }, [handleTimer]);\n\n const handleChange = useCallback(\n (values: string[]): void => {\n const result: T[] = [];\n for (const value of values) {\n let item = optionsRef.current?.find((option) => option.value === value)?.resource;\n if (!item) {\n item = (onCreate as (input: string) => T)(value);\n }\n result.push(item);\n }\n onChange(result);\n },\n [onChange, onCreate]\n );\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent): void => {\n if (e.key === 'Enter') {\n if (!timerRef.current && !abortControllerRef.current) {\n killEvent(e);\n if (optionsRef.current && optionsRef.current.length > 0) {\n setOptions(optionsRef.current.slice(0, 1));\n handleChange([optionsRef.current[0].value]);\n }\n } else {\n // The user pressed enter, but we don't have results yet.\n // We need to wait for the results to come in.\n setAutoSubmit(true);\n }\n }\n },\n [handleChange]\n );\n\n const handleCreate = useCallback(\n (input: string): AsyncAutocompleteOption<T> => {\n const option = toOption((onCreate as (input: string) => T)(input));\n setOptions([...(optionsRef.current as AsyncAutocompleteOption<T>[]), option]);\n return option;\n },\n [onCreate, setOptions, toOption]\n );\n\n const handleFilter = useCallback((_value: string, selected: boolean) => !selected, []);\n\n useEffect(() => {\n return () => {\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n }\n };\n }, []);\n\n return (\n <MultiSelect\n {...rest}\n ref={inputRef}\n defaultValue={defaultItems.map(toKey)}\n searchable\n onKeyDown={handleKeyDown}\n onSearchChange={handleSearchChange}\n data={options}\n onFocus={handleTimer}\n onChange={handleChange}\n onCreate={handleCreate}\n rightSectionWidth={40}\n rightSection={abortController ? <Loader size={16} /> : null}\n filter={handleFilter}\n />\n );\n}\n\nfunction toDefaultItems<T>(defaultValue: T | T[] | undefined): T[] {\n if (!defaultValue) {\n return [];\n }\n if (Array.isArray(defaultValue)) {\n return defaultValue;\n }\n return [defaultValue];\n}\n"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import { AttachmentDisplay } from '../AttachmentDisplay/AttachmentDisplay.js';
2
+ import { AttachmentDisplay } from '../AttachmentDisplay/AttachmentDisplay.mjs';
3
3
 
4
4
  function AttachmentArrayDisplay(props) {
5
5
  return (React.createElement("div", null, props.values &&
@@ -8,4 +8,4 @@ function AttachmentArrayDisplay(props) {
8
8
  }
9
9
 
10
10
  export { AttachmentArrayDisplay };
11
- //# sourceMappingURL=AttachmentArrayDisplay.js.map
11
+ //# sourceMappingURL=AttachmentArrayDisplay.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AttachmentArrayDisplay.mjs","sources":["../../../src/AttachmentArrayDisplay/AttachmentArrayDisplay.tsx"],"sourcesContent":["import { Attachment } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { AttachmentDisplay } from '../AttachmentDisplay/AttachmentDisplay';\n\nexport interface AttachmentArrayDisplayProps {\n values?: Attachment[];\n maxWidth?: number;\n}\n\nexport function AttachmentArrayDisplay(props: AttachmentArrayDisplayProps): JSX.Element {\n return (\n <div>\n {props.values &&\n props.values.map((v, index) => (\n <div key={'attatchment-' + index}>\n <AttachmentDisplay value={v} maxWidth={props.maxWidth} />\n </div>\n ))}\n </div>\n );\n}\n"],"names":[],"mappings":";;;AASM,SAAU,sBAAsB,CAAC,KAAkC,EAAA;AACvE,IAAA,QACE,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA,IAAA,EACG,KAAK,CAAC,MAAM;AACX,QAAA,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,MACxB,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA,EAAK,GAAG,EAAE,cAAc,GAAG,KAAK,EAAA;AAC9B,YAAA,KAAA,CAAA,aAAA,CAAC,iBAAiB,EAAC,EAAA,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAI,CAAA,CACrD,CACP,CAAC,CACA,EACN;AACJ;;;;"}
@@ -1,13 +1,12 @@
1
1
  import { ActionIcon } from '@mantine/core';
2
2
  import { IconCircleMinus, IconCloudUpload } from '@tabler/icons';
3
3
  import React, { useState, useRef } from 'react';
4
- import { AttachmentButton } from '../AttachmentButton/AttachmentButton.js';
5
- import { AttachmentDisplay } from '../AttachmentDisplay/AttachmentDisplay.js';
6
- import { killEvent } from '../utils/dom.js';
4
+ import { AttachmentButton } from '../AttachmentButton/AttachmentButton.mjs';
5
+ import { AttachmentDisplay } from '../AttachmentDisplay/AttachmentDisplay.mjs';
6
+ import { killEvent } from '../utils/dom.mjs';
7
7
 
8
8
  function AttachmentArrayInput(props) {
9
- var _a;
10
- const [values, setValues] = useState((_a = props.defaultValue) !== null && _a !== void 0 ? _a : []);
9
+ const [values, setValues] = useState(props.defaultValue ?? []);
11
10
  const valuesRef = useRef();
12
11
  valuesRef.current = values;
13
12
  function setValuesWrapper(newValues) {
@@ -37,9 +36,9 @@ function AttachmentArrayInput(props) {
37
36
  React.createElement("td", null,
38
37
  React.createElement(AttachmentButton, { onUpload: (attachment) => {
39
38
  setValuesWrapper([...valuesRef.current, attachment]);
40
- } }, (props) => (React.createElement(ActionIcon, Object.assign({}, props, { title: "Add", size: "sm", color: "green" }),
39
+ } }, (props) => (React.createElement(ActionIcon, { ...props, title: "Add", size: "sm", color: "green" },
41
40
  React.createElement(IconCloudUpload, { size: 16 })))))))));
42
41
  }
43
42
 
44
43
  export { AttachmentArrayInput };
45
- //# sourceMappingURL=AttachmentArrayInput.js.map
44
+ //# sourceMappingURL=AttachmentArrayInput.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AttachmentArrayInput.mjs","sources":["../../../src/AttachmentArrayInput/AttachmentArrayInput.tsx"],"sourcesContent":["import { ActionIcon } from '@mantine/core';\nimport { Attachment } from '@medplum/fhirtypes';\nimport { IconCircleMinus, IconCloudUpload } from '@tabler/icons';\nimport React, { useRef, useState } from 'react';\nimport { AttachmentButton } from '../AttachmentButton/AttachmentButton';\nimport { AttachmentDisplay } from '../AttachmentDisplay/AttachmentDisplay';\nimport { killEvent } from '../utils/dom';\n\nexport interface AttachmentArrayInputProps {\n name: string;\n defaultValue?: Attachment[];\n arrayElement?: boolean;\n onChange?: (value: Attachment[]) => void;\n}\n\nexport function AttachmentArrayInput(props: AttachmentArrayInputProps): JSX.Element {\n const [values, setValues] = useState<Attachment[]>(props.defaultValue ?? []);\n\n const valuesRef = useRef<Attachment[]>();\n valuesRef.current = values;\n\n function setValuesWrapper(newValues: Attachment[]): void {\n setValues(newValues);\n if (props.onChange) {\n props.onChange(newValues);\n }\n }\n\n return (\n <table style={{ width: '100%' }}>\n <colgroup>\n <col width=\"97%\" />\n <col width=\"3%\" />\n </colgroup>\n <tbody>\n {values.map((v: Attachment, index: number) => (\n <tr key={`${index}-${values.length}`}>\n <td>\n <AttachmentDisplay value={v} maxWidth={200} />\n </td>\n <td>\n <ActionIcon\n title=\"Remove\"\n size=\"sm\"\n onClick={(e: React.MouseEvent) => {\n killEvent(e);\n const copy = values.slice();\n copy.splice(index, 1);\n setValuesWrapper(copy);\n }}\n >\n <IconCircleMinus />\n </ActionIcon>\n </td>\n </tr>\n ))}\n <tr>\n <td></td>\n <td>\n <AttachmentButton\n onUpload={(attachment: Attachment) => {\n setValuesWrapper([...(valuesRef.current as Attachment[]), attachment]);\n }}\n >\n {(props) => (\n <ActionIcon {...props} title=\"Add\" size=\"sm\" color=\"green\">\n <IconCloudUpload size={16} />\n </ActionIcon>\n )}\n </AttachmentButton>\n </td>\n </tr>\n </tbody>\n </table>\n );\n}\n"],"names":[],"mappings":";;;;;;;AAeM,SAAU,oBAAoB,CAAC,KAAgC,EAAA;AACnE,IAAA,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAe,KAAK,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC;AAE7E,IAAA,MAAM,SAAS,GAAG,MAAM,EAAgB,CAAC;AACzC,IAAA,SAAS,CAAC,OAAO,GAAG,MAAM,CAAC;IAE3B,SAAS,gBAAgB,CAAC,SAAuB,EAAA;QAC/C,SAAS,CAAC,SAAS,CAAC,CAAC;QACrB,IAAI,KAAK,CAAC,QAAQ,EAAE;AAClB,YAAA,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;AAC3B,SAAA;KACF;IAED,QACE,+BAAO,KAAK,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,EAAA;AAC7B,QAAA,KAAA,CAAA,aAAA,CAAA,UAAA,EAAA,IAAA;YACE,KAAK,CAAA,aAAA,CAAA,KAAA,EAAA,EAAA,KAAK,EAAC,KAAK,EAAG,CAAA;AACnB,YAAA,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA,EAAK,KAAK,EAAC,IAAI,EAAA,CAAG,CACT;AACX,QAAA,KAAA,CAAA,aAAA,CAAA,OAAA,EAAA,IAAA;YACG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAa,EAAE,KAAa,MACvC,KAAI,CAAA,aAAA,CAAA,IAAA,EAAA,EAAA,GAAG,EAAE,CAAG,EAAA,KAAK,IAAI,MAAM,CAAC,MAAM,CAAE,CAAA,EAAA;AAClC,gBAAA,KAAA,CAAA,aAAA,CAAA,IAAA,EAAA,IAAA;oBACE,KAAC,CAAA,aAAA,CAAA,iBAAiB,EAAC,EAAA,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAA,CAAI,CAC3C;AACL,gBAAA,KAAA,CAAA,aAAA,CAAA,IAAA,EAAA,IAAA;AACE,oBAAA,KAAA,CAAA,aAAA,CAAC,UAAU,EAAA,EACT,KAAK,EAAC,QAAQ,EACd,IAAI,EAAC,IAAI,EACT,OAAO,EAAE,CAAC,CAAmB,KAAI;4BAC/B,SAAS,CAAC,CAAC,CAAC,CAAC;AACb,4BAAA,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC;AAC5B,4BAAA,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;4BACtB,gBAAgB,CAAC,IAAI,CAAC,CAAC;yBACxB,EAAA;AAED,wBAAA,KAAA,CAAA,aAAA,CAAC,eAAe,EAAG,IAAA,CAAA,CACR,CACV,CACF,CACN,CAAC;AACF,YAAA,KAAA,CAAA,aAAA,CAAA,IAAA,EAAA,IAAA;gBACE,KAAS,CAAA,aAAA,CAAA,IAAA,EAAA,IAAA,CAAA;AACT,gBAAA,KAAA,CAAA,aAAA,CAAA,IAAA,EAAA,IAAA;AACE,oBAAA,KAAA,CAAA,aAAA,CAAC,gBAAgB,EACf,EAAA,QAAQ,EAAE,CAAC,UAAsB,KAAI;4BACnC,gBAAgB,CAAC,CAAC,GAAI,SAAS,CAAC,OAAwB,EAAE,UAAU,CAAC,CAAC,CAAC;yBACxE,EAAA,EAEA,CAAC,KAAK,MACL,KAAC,CAAA,aAAA,CAAA,UAAU,EAAK,EAAA,GAAA,KAAK,EAAE,KAAK,EAAC,KAAK,EAAC,IAAI,EAAC,IAAI,EAAC,KAAK,EAAC,OAAO,EAAA;AACxD,wBAAA,KAAA,CAAA,aAAA,CAAC,eAAe,EAAA,EAAC,IAAI,EAAE,EAAE,EAAI,CAAA,CAClB,CACd,CACgB,CAChB,CACF,CACC,CACF,EACR;AACJ;;;;"}
@@ -1,14 +1,13 @@
1
1
  import React, { useRef } from 'react';
2
- import { useMedplum } from '../MedplumProvider/MedplumProvider.js';
3
- import { killEvent } from '../utils/dom.js';
2
+ import { useMedplum } from '../MedplumProvider/MedplumProvider.mjs';
3
+ import { killEvent } from '../utils/dom.mjs';
4
4
 
5
5
  function AttachmentButton(props) {
6
6
  const medplum = useMedplum();
7
7
  const fileInputRef = useRef(null);
8
8
  function onClick(e) {
9
- var _a;
10
9
  killEvent(e);
11
- (_a = fileInputRef.current) === null || _a === void 0 ? void 0 : _a.click();
10
+ fileInputRef.current?.click();
12
11
  }
13
12
  function onFileChange(e) {
14
13
  killEvent(e);
@@ -45,8 +44,7 @@ function AttachmentButton(props) {
45
44
  });
46
45
  })
47
46
  .catch((outcome) => {
48
- var _a, _b, _c;
49
- alert((_c = (_b = (_a = outcome === null || outcome === void 0 ? void 0 : outcome.issue) === null || _a === void 0 ? void 0 : _a[0]) === null || _b === void 0 ? void 0 : _b.details) === null || _c === void 0 ? void 0 : _c.text);
47
+ alert(outcome?.issue?.[0]?.details?.text);
50
48
  });
51
49
  }
52
50
  return (React.createElement(React.Fragment, null,
@@ -55,4 +53,4 @@ function AttachmentButton(props) {
55
53
  }
56
54
 
57
55
  export { AttachmentButton };
58
- //# sourceMappingURL=AttachmentButton.js.map
56
+ //# sourceMappingURL=AttachmentButton.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AttachmentButton.mjs","sources":["../../../src/AttachmentButton/AttachmentButton.tsx"],"sourcesContent":["import { Attachment, Binary, OperationOutcome } from '@medplum/fhirtypes';\nimport React, { useRef } from 'react';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\nimport { killEvent } from '../utils/dom';\n\nexport interface AttachmentButtonProps {\n onUpload: (attachment: Attachment) => void;\n onUploadStart?: () => void;\n onUploadProgress?: (e: ProgressEvent) => void;\n children(props: { onClick(e: React.MouseEvent): void }): React.ReactNode;\n}\n\nexport function AttachmentButton(props: AttachmentButtonProps): JSX.Element {\n const medplum = useMedplum();\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n function onClick(e: React.MouseEvent): void {\n killEvent(e);\n fileInputRef.current?.click();\n }\n\n function onFileChange(e: React.ChangeEvent): void {\n killEvent(e);\n const files = (e.target as HTMLInputElement).files;\n if (files) {\n Array.from(files).forEach(processFile);\n }\n }\n\n /**\n * Processes a single file.\n *\n * @param {File} file The file descriptor.\n */\n function processFile(file: File): void {\n if (!file) {\n return;\n }\n\n const fileName = file.name;\n if (!fileName) {\n return;\n }\n\n if (props.onUploadStart) {\n props.onUploadStart();\n }\n\n const filename = file.name;\n const contentType = file.type || 'application/octet-stream';\n medplum\n .createBinary(file, filename, contentType, props.onUploadProgress)\n .then((binary: Binary) => {\n props.onUpload({\n contentType: binary.contentType,\n url: binary.url,\n title: filename,\n });\n })\n .catch((outcome: OperationOutcome) => {\n alert(outcome?.issue?.[0]?.details?.text);\n });\n }\n\n return (\n <>\n <input\n type=\"file\"\n data-testid=\"upload-file-input\"\n style={{ display: 'none' }}\n ref={fileInputRef}\n onChange={(e) => onFileChange(e)}\n />\n {props.children({ onClick })}\n </>\n );\n}\n"],"names":[],"mappings":";;;;AAYM,SAAU,gBAAgB,CAAC,KAA4B,EAAA;AAC3D,IAAA,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;AAC7B,IAAA,MAAM,YAAY,GAAG,MAAM,CAAmB,IAAI,CAAC,CAAC;IAEpD,SAAS,OAAO,CAAC,CAAmB,EAAA;QAClC,SAAS,CAAC,CAAC,CAAC,CAAC;AACb,QAAA,YAAY,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;KAC/B;IAED,SAAS,YAAY,CAAC,CAAoB,EAAA;QACxC,SAAS,CAAC,CAAC,CAAC,CAAC;AACb,QAAA,MAAM,KAAK,GAAI,CAAC,CAAC,MAA2B,CAAC,KAAK,CAAC;AACnD,QAAA,IAAI,KAAK,EAAE;YACT,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;AACxC,SAAA;KACF;AAED;;;;AAIG;IACH,SAAS,WAAW,CAAC,IAAU,EAAA;QAC7B,IAAI,CAAC,IAAI,EAAE;YACT,OAAO;AACR,SAAA;AAED,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC;QAC3B,IAAI,CAAC,QAAQ,EAAE;YACb,OAAO;AACR,SAAA;QAED,IAAI,KAAK,CAAC,aAAa,EAAE;YACvB,KAAK,CAAC,aAAa,EAAE,CAAC;AACvB,SAAA;AAED,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC;AAC3B,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,IAAI,0BAA0B,CAAC;QAC5D,OAAO;aACJ,YAAY,CAAC,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,CAAC,gBAAgB,CAAC;AACjE,aAAA,IAAI,CAAC,CAAC,MAAc,KAAI;YACvB,KAAK,CAAC,QAAQ,CAAC;gBACb,WAAW,EAAE,MAAM,CAAC,WAAW;gBAC/B,GAAG,EAAE,MAAM,CAAC,GAAG;AACf,gBAAA,KAAK,EAAE,QAAQ;AAChB,aAAA,CAAC,CAAC;AACL,SAAC,CAAC;AACD,aAAA,KAAK,CAAC,CAAC,OAAyB,KAAI;AACnC,YAAA,KAAK,CAAC,OAAO,EAAE,KAAK,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;AAC5C,SAAC,CAAC,CAAC;KACN;AAED,IAAA,QACE,KAAA,CAAA,aAAA,CAAA,KAAA,CAAA,QAAA,EAAA,IAAA;AACE,QAAA,KAAA,CAAA,aAAA,CAAA,OAAA,EAAA,EACE,IAAI,EAAC,MAAM,EAAA,aAAA,EACC,mBAAmB,EAC/B,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,EAC1B,GAAG,EAAE,YAAY,EACjB,QAAQ,EAAE,CAAC,CAAC,KAAK,YAAY,CAAC,CAAC,CAAC,EAChC,CAAA;QACD,KAAK,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC,CAC3B,EACH;AACJ;;;;"}
@@ -0,0 +1,21 @@
1
+ import { Anchor } from '@mantine/core';
2
+ import React from 'react';
3
+
4
+ function AttachmentDisplay(props) {
5
+ const value = props.value;
6
+ const { contentType, url, title } = value ?? {};
7
+ if (!url) {
8
+ return null;
9
+ }
10
+ return (React.createElement("div", { "data-testid": "attachment-display" },
11
+ contentType?.startsWith('image/') && (React.createElement("img", { "data-testid": "attachment-image", style: { maxWidth: props.maxWidth }, src: url, alt: value?.title })),
12
+ contentType?.startsWith('video/') && (React.createElement("video", { "data-testid": "attachment-video", style: { maxWidth: props.maxWidth }, controls: true },
13
+ React.createElement("source", { type: contentType, src: url }))),
14
+ contentType === 'application/pdf' && !title?.endsWith('.pdf') && (React.createElement("div", { "data-testid": "attachment-pdf", style: { maxWidth: props.maxWidth, minHeight: 400 } },
15
+ React.createElement("iframe", { width: "100%", height: "400", src: url + '#navpanes=0', allowFullScreen: true, frameBorder: 0, seamless: true }))),
16
+ React.createElement("div", { "data-testid": "download-link", style: { padding: '2px 16px 16px 16px' } },
17
+ React.createElement(Anchor, { href: value?.url, "data-testid": "attachment-details", target: "_blank", rel: "noopener noreferrer" }, value?.title || 'Download'))));
18
+ }
19
+
20
+ export { AttachmentDisplay };
21
+ //# sourceMappingURL=AttachmentDisplay.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AttachmentDisplay.mjs","sources":["../../../src/AttachmentDisplay/AttachmentDisplay.tsx"],"sourcesContent":["import { Anchor } from '@mantine/core';\nimport { Attachment } from '@medplum/fhirtypes';\nimport React from 'react';\n\nexport interface AttachmentDisplayProps {\n value?: Attachment;\n maxWidth?: number;\n}\n\nexport function AttachmentDisplay(props: AttachmentDisplayProps): JSX.Element | null {\n const value = props.value;\n const { contentType, url, title } = value ?? {};\n\n if (!url) {\n return null;\n }\n\n return (\n <div data-testid=\"attachment-display\">\n {contentType?.startsWith('image/') && (\n <img data-testid=\"attachment-image\" style={{ maxWidth: props.maxWidth }} src={url} alt={value?.title} />\n )}\n {contentType?.startsWith('video/') && (\n <video data-testid=\"attachment-video\" style={{ maxWidth: props.maxWidth }} controls={true}>\n <source type={contentType} src={url} />\n </video>\n )}\n {contentType === 'application/pdf' && !title?.endsWith('.pdf') && (\n <div data-testid=\"attachment-pdf\" style={{ maxWidth: props.maxWidth, minHeight: 400 }}>\n <iframe\n width=\"100%\"\n height=\"400\"\n src={url + '#navpanes=0'}\n allowFullScreen={true}\n frameBorder={0}\n seamless={true}\n />\n </div>\n )}\n <div data-testid=\"download-link\" style={{ padding: '2px 16px 16px 16px' }}>\n <Anchor href={value?.url} data-testid=\"attachment-details\" target=\"_blank\" rel=\"noopener noreferrer\">\n {value?.title || 'Download'}\n </Anchor>\n </div>\n </div>\n );\n}\n"],"names":[],"mappings":";;;AASM,SAAU,iBAAiB,CAAC,KAA6B,EAAA;AAC7D,IAAA,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;IAC1B,MAAM,EAAE,WAAW,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,KAAK,IAAI,EAAE,CAAC;IAEhD,IAAI,CAAC,GAAG,EAAE;AACR,QAAA,OAAO,IAAI,CAAC;AACb,KAAA;IAED,QACE,4CAAiB,oBAAoB,EAAA;AAClC,QAAA,WAAW,EAAE,UAAU,CAAC,QAAQ,CAAC,KAChC,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA,EAAA,aAAA,EAAiB,kBAAkB,EAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,GAAI,CACzG;QACA,WAAW,EAAE,UAAU,CAAC,QAAQ,CAAC,KAChC,KAAmB,CAAA,aAAA,CAAA,OAAA,EAAA,EAAA,aAAA,EAAA,kBAAkB,EAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAA;YACvF,KAAQ,CAAA,aAAA,CAAA,QAAA,EAAA,EAAA,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,GAAG,EAAI,CAAA,CACjC,CACT;QACA,WAAW,KAAK,iBAAiB,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,KAC5D,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA,EAAA,aAAA,EAAiB,gBAAgB,EAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,SAAS,EAAE,GAAG,EAAE,EAAA;YACnF,KACE,CAAA,aAAA,CAAA,QAAA,EAAA,EAAA,KAAK,EAAC,MAAM,EACZ,MAAM,EAAC,KAAK,EACZ,GAAG,EAAE,GAAG,GAAG,aAAa,EACxB,eAAe,EAAE,IAAI,EACrB,WAAW,EAAE,CAAC,EACd,QAAQ,EAAE,IAAI,EACd,CAAA,CACE,CACP;QACD,KAAiB,CAAA,aAAA,CAAA,KAAA,EAAA,EAAA,aAAA,EAAA,eAAe,EAAC,KAAK,EAAE,EAAE,OAAO,EAAE,oBAAoB,EAAE,EAAA;YACvE,KAAC,CAAA,aAAA,CAAA,MAAM,EAAC,EAAA,IAAI,EAAE,KAAK,EAAE,GAAG,EAAc,aAAA,EAAA,oBAAoB,EAAC,MAAM,EAAC,QAAQ,EAAC,GAAG,EAAC,qBAAqB,EACjG,EAAA,KAAK,EAAE,KAAK,IAAI,UAAU,CACpB,CACL,CACF,EACN;AACJ;;;;"}
@@ -1,8 +1,8 @@
1
1
  import { Button } from '@mantine/core';
2
2
  import React, { useState } from 'react';
3
- import { AttachmentButton } from '../AttachmentButton/AttachmentButton.js';
4
- import { AttachmentDisplay } from '../AttachmentDisplay/AttachmentDisplay.js';
5
- import { killEvent } from '../utils/dom.js';
3
+ import { AttachmentButton } from '../AttachmentButton/AttachmentButton.mjs';
4
+ import { AttachmentDisplay } from '../AttachmentDisplay/AttachmentDisplay.mjs';
5
+ import { killEvent } from '../utils/dom.mjs';
6
6
 
7
7
  function AttachmentInput(props) {
8
8
  const [value, setValue] = useState(props.defaultValue);
@@ -20,8 +20,8 @@ function AttachmentInput(props) {
20
20
  setValueWrapper(undefined);
21
21
  } }, "Remove")));
22
22
  }
23
- return (React.createElement(AttachmentButton, { onUpload: setValueWrapper }, (props) => React.createElement(Button, Object.assign({}, props), "Upload...")));
23
+ return (React.createElement(AttachmentButton, { onUpload: setValueWrapper }, (props) => React.createElement(Button, { ...props }, "Upload...")));
24
24
  }
25
25
 
26
26
  export { AttachmentInput };
27
- //# sourceMappingURL=AttachmentInput.js.map
27
+ //# sourceMappingURL=AttachmentInput.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AttachmentInput.mjs","sources":["../../../src/AttachmentInput/AttachmentInput.tsx"],"sourcesContent":["import { Button } from '@mantine/core';\nimport { Attachment } from '@medplum/fhirtypes';\nimport React, { useState } from 'react';\nimport { AttachmentButton } from '../AttachmentButton/AttachmentButton';\nimport { AttachmentDisplay } from '../AttachmentDisplay/AttachmentDisplay';\nimport { killEvent } from '../utils/dom';\n\nexport interface AttachmentInputProps {\n name: string;\n defaultValue?: Attachment;\n arrayElement?: boolean;\n onChange?: (value: Attachment | undefined) => void;\n}\n\nexport function AttachmentInput(props: AttachmentInputProps): JSX.Element {\n const [value, setValue] = useState(props.defaultValue);\n\n function setValueWrapper(newValue: Attachment | undefined): void {\n setValue(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n if (value) {\n return (\n <>\n <AttachmentDisplay value={value} maxWidth={200} />\n <Button\n onClick={(e: React.MouseEvent) => {\n killEvent(e);\n setValueWrapper(undefined);\n }}\n >\n Remove\n </Button>\n </>\n );\n }\n\n return (\n <AttachmentButton onUpload={setValueWrapper}>{(props) => <Button {...props}>Upload...</Button>}</AttachmentButton>\n );\n}\n"],"names":[],"mappings":";;;;;;AAcM,SAAU,eAAe,CAAC,KAA2B,EAAA;AACzD,IAAA,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IAEvD,SAAS,eAAe,CAAC,QAAgC,EAAA;QACvD,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACnB,IAAI,KAAK,CAAC,QAAQ,EAAE;AAClB,YAAA,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AAC1B,SAAA;KACF;AAED,IAAA,IAAI,KAAK,EAAE;AACT,QAAA,QACE,KAAA,CAAA,aAAA,CAAA,KAAA,CAAA,QAAA,EAAA,IAAA;YACE,KAAC,CAAA,aAAA,CAAA,iBAAiB,IAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAI,CAAA;AAClD,YAAA,KAAA,CAAA,aAAA,CAAC,MAAM,EACL,EAAA,OAAO,EAAE,CAAC,CAAmB,KAAI;oBAC/B,SAAS,CAAC,CAAC,CAAC,CAAC;oBACb,eAAe,CAAC,SAAS,CAAC,CAAC;iBAC5B,EAAA,EAAA,QAAA,CAGM,CACR,EACH;AACH,KAAA;IAED,QACE,oBAAC,gBAAgB,EAAA,EAAC,QAAQ,EAAE,eAAe,IAAG,CAAC,KAAK,KAAK,oBAAC,MAAM,EAAA,EAAA,GAAK,KAAK,EAAoB,EAAA,WAAA,CAAA,CAAoB,EAClH;AACJ;;;;"}
@@ -1,8 +1,8 @@
1
1
  import { globalSchema, getPropertyDisplayName } from '@medplum/core';
2
2
  import React from 'react';
3
- import { DEFAULT_IGNORED_PROPERTIES } from '../constants.js';
4
- import { DescriptionList, DescriptionListEntry } from '../DescriptionList/DescriptionList.js';
5
- import { getValueAndType, ResourcePropertyDisplay } from '../ResourcePropertyDisplay/ResourcePropertyDisplay.js';
3
+ import { DEFAULT_IGNORED_PROPERTIES } from '../constants.mjs';
4
+ import { DescriptionList, DescriptionListEntry } from '../DescriptionList/DescriptionList.mjs';
5
+ import { getValueAndType, ResourcePropertyDisplay } from '../ResourcePropertyDisplay/ResourcePropertyDisplay.mjs';
6
6
 
7
7
  function BackboneElementDisplay(props) {
8
8
  const typedValue = props.value;
@@ -46,4 +46,4 @@ function BackboneElementDisplay(props) {
46
46
  }
47
47
 
48
48
  export { BackboneElementDisplay };
49
- //# sourceMappingURL=BackboneElementDisplay.js.map
49
+ //# sourceMappingURL=BackboneElementDisplay.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BackboneElementDisplay.mjs","sources":["../../../src/BackboneElementDisplay/BackboneElementDisplay.tsx"],"sourcesContent":["import { getPropertyDisplayName, globalSchema, TypedValue } from '@medplum/core';\nimport React from 'react';\nimport { DEFAULT_IGNORED_PROPERTIES } from '../constants';\nimport { DescriptionList, DescriptionListEntry } from '../DescriptionList/DescriptionList';\nimport { getValueAndType, ResourcePropertyDisplay } from '../ResourcePropertyDisplay/ResourcePropertyDisplay';\n\nexport interface BackboneElementDisplayProps {\n value: TypedValue;\n compact?: boolean;\n ignoreMissingValues?: boolean;\n link?: boolean;\n}\n\nexport function BackboneElementDisplay(props: BackboneElementDisplayProps): JSX.Element | null {\n const typedValue = props.value;\n const value = typedValue.value;\n if (!value) {\n return null;\n }\n\n const typeName = typedValue.type;\n const typeSchema = globalSchema.types[typeName];\n if (!typeSchema) {\n return <div>{typeName}&nbsp;not implemented</div>;\n }\n\n if (\n typeof value === 'object' &&\n 'name' in value &&\n Object.keys(value).length === 1 &&\n typeof value.name === 'string'\n ) {\n // Special case for common BackboneElement pattern\n // Where there is an object with a single property 'name'\n // Just display the name value.\n return <div>{value.name}</div>;\n }\n\n return (\n <DescriptionList compact={props.compact}>\n {Object.entries(typeSchema.properties).map((entry) => {\n const key = entry[0];\n if (DEFAULT_IGNORED_PROPERTIES.indexOf(key) >= 0) {\n return null;\n }\n const property = entry[1];\n if (!property.path) {\n property.path = typeName + '.' + key;\n }\n const [propertyValue, propertyType] = getValueAndType(typedValue, key);\n if (\n props.ignoreMissingValues &&\n (!propertyValue || (Array.isArray(propertyValue) && propertyValue.length === 0))\n ) {\n return null;\n }\n return (\n <DescriptionListEntry key={key} term={getPropertyDisplayName(key)}>\n <ResourcePropertyDisplay\n property={property}\n propertyType={propertyType}\n value={propertyValue}\n ignoreMissingValues={props.ignoreMissingValues}\n link={props.link}\n />\n </DescriptionListEntry>\n );\n })}\n </DescriptionList>\n );\n}\n"],"names":[],"mappings":";;;;;;AAaM,SAAU,sBAAsB,CAAC,KAAkC,EAAA;AACvE,IAAA,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC;AAC/B,IAAA,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC;IAC/B,IAAI,CAAC,KAAK,EAAE;AACV,QAAA,OAAO,IAAI,CAAC;AACb,KAAA;AAED,IAAA,MAAM,QAAQ,GAAG,UAAU,CAAC,IAAI,CAAC;IACjC,MAAM,UAAU,GAAG,YAAY,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAChD,IAAI,CAAC,UAAU,EAAE;QACf,OAAO,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA,IAAA;YAAM,QAAQ;oCAA4B,CAAC;AACnD,KAAA;IAED,IACE,OAAO,KAAK,KAAK,QAAQ;AACzB,QAAA,MAAM,IAAI,KAAK;QACf,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC;AAC/B,QAAA,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,EAC9B;;;;AAIA,QAAA,OAAO,KAAM,CAAA,aAAA,CAAA,KAAA,EAAA,IAAA,EAAA,KAAK,CAAC,IAAI,CAAO,CAAC;AAChC,KAAA;IAED,QACE,KAAC,CAAA,aAAA,CAAA,eAAe,EAAC,EAAA,OAAO,EAAE,KAAK,CAAC,OAAO,EAAA,EACpC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,KAAI;AACnD,QAAA,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACrB,IAAI,0BAA0B,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;AAChD,YAAA,OAAO,IAAI,CAAC;AACb,SAAA;AACD,QAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;AAC1B,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;YAClB,QAAQ,CAAC,IAAI,GAAG,QAAQ,GAAG,GAAG,GAAG,GAAG,CAAC;AACtC,SAAA;AACD,QAAA,MAAM,CAAC,aAAa,EAAE,YAAY,CAAC,GAAG,eAAe,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;QACvE,IACE,KAAK,CAAC,mBAAmB;AACzB,aAAC,CAAC,aAAa,KAAK,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,EAChF;AACA,YAAA,OAAO,IAAI,CAAC;AACb,SAAA;AACD,QAAA,QACE,KAAA,CAAA,aAAA,CAAC,oBAAoB,EAAA,EAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,sBAAsB,CAAC,GAAG,CAAC,EAAA;AAC/D,YAAA,KAAA,CAAA,aAAA,CAAC,uBAAuB,EAAA,EACtB,QAAQ,EAAE,QAAQ,EAClB,YAAY,EAAE,YAAY,EAC1B,KAAK,EAAE,aAAa,EACpB,mBAAmB,EAAE,KAAK,CAAC,mBAAmB,EAC9C,IAAI,EAAE,KAAK,CAAC,IAAI,EAAA,CAChB,CACmB,EACvB;KACH,CAAC,CACc,EAClB;AACJ;;;;"}
@@ -1,16 +1,15 @@
1
1
  import { Stack } from '@mantine/core';
2
2
  import { globalSchema, getPropertyDisplayName } from '@medplum/core';
3
3
  import React, { useState } from 'react';
4
- import { CheckboxFormSection } from '../CheckboxFormSection/CheckboxFormSection.js';
5
- import { DEFAULT_IGNORED_PROPERTIES } from '../constants.js';
6
- import { FormSection } from '../FormSection/FormSection.js';
7
- import { setPropertyValue } from '../ResourceForm/ResourceForm.js';
8
- import { getValueAndType } from '../ResourcePropertyDisplay/ResourcePropertyDisplay.js';
9
- import { ResourcePropertyInput } from '../ResourcePropertyInput/ResourcePropertyInput.js';
4
+ import { CheckboxFormSection } from '../CheckboxFormSection/CheckboxFormSection.mjs';
5
+ import { DEFAULT_IGNORED_PROPERTIES } from '../constants.mjs';
6
+ import { FormSection } from '../FormSection/FormSection.mjs';
7
+ import { setPropertyValue } from '../ResourceForm/ResourceForm.mjs';
8
+ import { getValueAndType } from '../ResourcePropertyDisplay/ResourcePropertyDisplay.mjs';
9
+ import { ResourcePropertyInput } from '../ResourcePropertyInput/ResourcePropertyInput.mjs';
10
10
 
11
11
  function BackboneElementInput(props) {
12
- var _a;
13
- const [value, setValue] = useState((_a = props.defaultValue) !== null && _a !== void 0 ? _a : {});
12
+ const [value, setValue] = useState(props.defaultValue ?? {});
14
13
  function setValueWrapper(newValue) {
15
14
  setValue(newValue);
16
15
  if (props.onChange) {
@@ -38,15 +37,15 @@ function BackboneElementInput(props) {
38
37
  if (property.type.length === 1 && property.type[0].code === 'boolean') {
39
38
  return (React.createElement(CheckboxFormSection, { key: key, title: getPropertyDisplayName(key), description: property.definition, htmlFor: key },
40
39
  React.createElement(ResourcePropertyInput, { property: property, name: key, defaultValue: propertyValue, defaultPropertyType: propertyType, outcome: props.outcome, onChange: (newValue, propName) => {
41
- setValueWrapper(setPropertyValue(value, key, propName !== null && propName !== void 0 ? propName : key, entry[1], newValue));
40
+ setValueWrapper(setPropertyValue(value, key, propName ?? key, entry[1], newValue));
42
41
  } })));
43
42
  }
44
43
  return (React.createElement(FormSection, { key: key, title: getPropertyDisplayName(key), description: property.definition, htmlFor: key, outcome: props.outcome },
45
44
  React.createElement(ResourcePropertyInput, { property: property, name: key, defaultValue: propertyValue, defaultPropertyType: propertyType, outcome: props.outcome, onChange: (newValue, propName) => {
46
- setValueWrapper(setPropertyValue(value, key, propName !== null && propName !== void 0 ? propName : key, entry[1], newValue));
45
+ setValueWrapper(setPropertyValue(value, key, propName ?? key, entry[1], newValue));
47
46
  } })));
48
47
  })));
49
48
  }
50
49
 
51
50
  export { BackboneElementInput };
52
- //# sourceMappingURL=BackboneElementInput.js.map
51
+ //# sourceMappingURL=BackboneElementInput.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BackboneElementInput.mjs","sources":["../../../src/BackboneElementInput/BackboneElementInput.tsx"],"sourcesContent":["import { Stack } from '@mantine/core';\nimport { getPropertyDisplayName, globalSchema } from '@medplum/core';\nimport { OperationOutcome } from '@medplum/fhirtypes';\nimport React, { useState } from 'react';\nimport { CheckboxFormSection } from '../CheckboxFormSection/CheckboxFormSection';\nimport { DEFAULT_IGNORED_PROPERTIES } from '../constants';\nimport { FormSection } from '../FormSection/FormSection';\nimport { setPropertyValue } from '../ResourceForm/ResourceForm';\nimport { getValueAndType } from '../ResourcePropertyDisplay/ResourcePropertyDisplay';\nimport { ResourcePropertyInput } from '../ResourcePropertyInput/ResourcePropertyInput';\n\nexport interface BackboneElementInputProps {\n typeName: string;\n defaultValue?: any;\n outcome?: OperationOutcome;\n onChange?: (value: any) => void;\n}\n\nexport function BackboneElementInput(props: BackboneElementInputProps): JSX.Element {\n const [value, setValue] = useState<any>(props.defaultValue ?? {});\n\n function setValueWrapper(newValue: any): void {\n setValue(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n const typeName = props.typeName;\n const typeSchema = globalSchema.types[typeName];\n if (!typeSchema) {\n return <div>{typeName}&nbsp;not implemented</div>;\n }\n\n const typedValue = { type: typeName, value };\n\n return (\n <Stack>\n {Object.entries(typeSchema.properties).map((entry) => {\n const key = entry[0];\n if (key === 'id' || DEFAULT_IGNORED_PROPERTIES.indexOf(key) >= 0) {\n return null;\n }\n const property = entry[1];\n if (!property.type) {\n return null;\n }\n\n const [propertyValue, propertyType] = getValueAndType(typedValue, key);\n\n if (property.type.length === 1 && property.type[0].code === 'boolean') {\n return (\n <CheckboxFormSection\n key={key}\n title={getPropertyDisplayName(key)}\n description={property.definition}\n htmlFor={key}\n >\n <ResourcePropertyInput\n property={property}\n name={key}\n defaultValue={propertyValue}\n defaultPropertyType={propertyType}\n outcome={props.outcome}\n onChange={(newValue: any, propName?: string) => {\n setValueWrapper(setPropertyValue(value, key, propName ?? key, entry[1], newValue));\n }}\n />\n </CheckboxFormSection>\n );\n }\n\n return (\n <FormSection\n key={key}\n title={getPropertyDisplayName(key)}\n description={property.definition}\n htmlFor={key}\n outcome={props.outcome}\n >\n <ResourcePropertyInput\n property={property}\n name={key}\n defaultValue={propertyValue}\n defaultPropertyType={propertyType}\n outcome={props.outcome}\n onChange={(newValue: any, propName?: string) => {\n setValueWrapper(setPropertyValue(value, key, propName ?? key, entry[1], newValue));\n }}\n />\n </FormSection>\n );\n })}\n </Stack>\n );\n}\n"],"names":[],"mappings":"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"}
@@ -130,4 +130,4 @@ function isDayAvailable(day, slots) {
130
130
  }
131
131
 
132
132
  export { CalendarInput, getMonthString, getStartMonth };
133
- //# sourceMappingURL=CalendarInput.js.map
133
+ //# sourceMappingURL=CalendarInput.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CalendarInput.mjs","sources":["../../../src/CalendarInput/CalendarInput.tsx"],"sourcesContent":["import { Button, createStyles, Group } from '@mantine/core';\nimport { Slot } from '@medplum/fhirtypes';\nimport React, { useMemo, useState } from 'react';\n\nconst useStyles = createStyles((theme) => ({\n table: {\n width: 350,\n\n '& th': {\n fontWeight: 'normal',\n fontSize: 11,\n padding: 8,\n textAlign: 'center',\n },\n\n '& td': {\n padding: '2px 4px',\n },\n\n '& td button': {\n width: 44,\n height: 44,\n color: theme.colors[theme.primaryColor][5],\n fontSize: 16,\n fontWeight: 500,\n textAlign: 'center',\n padding: 0,\n backgroundColor: theme.colors[theme.primaryColor][0],\n border: 0,\n borderRadius: '50%',\n cursor: 'pointer',\n },\n\n '& td button:hover': {\n backgroundColor: theme.colors[theme.primaryColor][1],\n },\n\n '& td button:disabled': {\n backgroundColor: 'transparent',\n cursor: 'default',\n color: theme.colors.gray[4],\n fontWeight: 'normal',\n },\n },\n}));\n\nexport interface CalendarInputProps {\n slots: Slot[];\n onChangeMonth: (date: Date) => void;\n onClick: (date: Date) => void;\n}\n\n/**\n * Returns a month display string (e.g. \"January 2020\").\n * @param date Any date within the month.\n * @returns The month display string (e.g. \"January 2020\")\n */\nexport function getMonthString(date: Date): string {\n return date.toLocaleString('default', { month: 'long' }) + ' ' + date.getFullYear();\n}\n\ninterface CalendarCell {\n date: Date;\n available: boolean;\n}\n\ntype OptionalCalendarCell = CalendarCell | undefined;\n\nexport function CalendarInput(props: CalendarInputProps): JSX.Element {\n const { classes } = useStyles();\n const { onChangeMonth, onClick } = props;\n const [month, setMonth] = useState<Date>(getStartMonth);\n\n function moveMonth(delta: number): void {\n setMonth((currMonth) => {\n const newMonth = new Date(currMonth.getTime());\n newMonth.setMonth(currMonth.getMonth() + delta);\n onChangeMonth(newMonth);\n return newMonth;\n });\n }\n\n const grid = useMemo(() => buildGrid(month, props.slots), [month, props.slots]);\n\n return (\n <div>\n <Group position=\"apart\" spacing=\"xs\" grow noWrap>\n <p style={{ flex: 1 }}>{getMonthString(month)}</p>\n <Group position=\"right\" spacing=\"xs\">\n <Button variant=\"outline\" aria-label=\"Previous month\" onClick={() => moveMonth(-1)}>\n &lt;\n </Button>\n <Button variant=\"outline\" aria-label=\"Next month\" onClick={() => moveMonth(1)}>\n &gt;\n </Button>\n </Group>\n </Group>\n <table className={classes.table}>\n <thead>\n <tr>\n <th>SUN</th>\n <th>MON</th>\n <th>TUE</th>\n <th>WED</th>\n <th>THU</th>\n <th>FRI</th>\n <th>SAT</th>\n </tr>\n </thead>\n <tbody>\n {grid.map((week, weekIndex) => (\n <tr key={'week-' + weekIndex}>\n {week.map((day, dayIndex) => (\n <td key={'day-' + dayIndex}>\n {day && (\n <Button disabled={!day.available} onClick={() => onClick(day.date)}>\n {day.date.getDate()}\n </Button>\n )}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n );\n}\n\nexport function getStartMonth(): Date {\n const result = new Date();\n result.setDate(1);\n result.setHours(0, 0, 0, 0);\n return result;\n}\n\nfunction buildGrid(startDate: Date, slots: Slot[]): OptionalCalendarCell[][] {\n const d = new Date(startDate.getFullYear(), startDate.getMonth());\n const grid: OptionalCalendarCell[][] = [];\n let row: OptionalCalendarCell[] = [];\n\n // Fill leading empty days\n for (let i = 0; i < d.getDay(); i++) {\n row.push(undefined);\n }\n\n while (d.getMonth() === startDate.getMonth()) {\n row.push({\n date: new Date(d.getTime()),\n available: isDayAvailable(d, slots),\n });\n\n if (d.getDay() === 6) {\n grid.push(row);\n row = [];\n }\n\n d.setDate(d.getDate() + 1);\n }\n\n // Fill trailing empty days\n if (d.getDay() !== 0) {\n for (let i = d.getDay(); i < 7; i++) {\n row.push(undefined);\n }\n grid.push(row);\n }\n\n return grid;\n}\n\n/**\n * Returns true if the given date is available for booking.\n * @param day The day to check.\n * @param slots The list of available slots.\n * @returns True if there are any available slots for the day.\n */\nfunction isDayAvailable(day: Date, slots: Slot[]): boolean {\n // Note that slot start and end time may or may not be in UTC.\n for (const slot of slots) {\n const slotStart = new Date(slot.start as string);\n if (\n slotStart.getFullYear() === day.getFullYear() &&\n slotStart.getMonth() === day.getMonth() &&\n slotStart.getDate() === day.getDate()\n ) {\n return true;\n }\n }\n\n return false;\n}\n"],"names":[],"mappings":"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"}
@@ -9,4 +9,4 @@ function CheckboxFormSection(props) {
9
9
  }
10
10
 
11
11
  export { CheckboxFormSection };
12
- //# sourceMappingURL=CheckboxFormSection.js.map
12
+ //# sourceMappingURL=CheckboxFormSection.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CheckboxFormSection.mjs","sources":["../../../src/CheckboxFormSection/CheckboxFormSection.tsx"],"sourcesContent":["import { Group, Input } from '@mantine/core';\nimport React from 'react';\n\nexport interface CheckboxFormSectionProps {\n htmlFor?: string;\n title?: string;\n description?: string;\n children?: React.ReactNode;\n}\n\nexport function CheckboxFormSection(props: CheckboxFormSectionProps): JSX.Element {\n return (\n <Group noWrap>\n <div>{props.children}</div>\n <div>\n <Input.Wrapper id={props.htmlFor} label={props.title} description={props.description}>\n {(() => null)()}\n </Input.Wrapper>\n </div>\n </Group>\n );\n}\n"],"names":[],"mappings":";;;AAUM,SAAU,mBAAmB,CAAC,KAA+B,EAAA;AACjE,IAAA,QACE,KAAA,CAAA,aAAA,CAAC,KAAK,EAAA,EAAC,MAAM,EAAA,IAAA,EAAA;QACX,KAAM,CAAA,aAAA,CAAA,KAAA,EAAA,IAAA,EAAA,KAAK,CAAC,QAAQ,CAAO;AAC3B,QAAA,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA,IAAA;AACE,YAAA,KAAA,CAAA,aAAA,CAAC,KAAK,CAAC,OAAO,EAAA,EAAC,EAAE,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAA,EACjF,CAAC,MAAM,IAAI,GAAG,CACD,CACZ,CACA,EACR;AACJ;;;;"}
@@ -1,23 +1,24 @@
1
1
  import React, { useState } from 'react';
2
- import { ValueSetAutocomplete } from '../ValueSetAutocomplete/ValueSetAutocomplete.js';
2
+ import { ValueSetAutocomplete } from '../ValueSetAutocomplete/ValueSetAutocomplete.mjs';
3
3
 
4
4
  function CodeInput(props) {
5
5
  const [value, setValue] = useState(props.defaultValue);
6
- function handleChange(newValue) {
6
+ function handleChange(newValues) {
7
+ const newValue = newValues[0];
7
8
  const newCode = valueSetElementToCode(newValue);
8
9
  setValue(newCode);
9
10
  if (props.onChange) {
10
11
  props.onChange(newCode);
11
12
  }
12
13
  }
13
- return (React.createElement(ValueSetAutocomplete, { property: props.property, name: props.name, placeholder: props.placeholder, defaultValue: codeToValueSetElement(value), onChange: handleChange }));
14
+ return (React.createElement(ValueSetAutocomplete, { elementDefinition: props.property, name: props.name, placeholder: props.placeholder, defaultValue: codeToValueSetElement(value), onChange: handleChange }));
14
15
  }
15
16
  function codeToValueSetElement(code) {
16
17
  return code ? { code } : undefined;
17
18
  }
18
19
  function valueSetElementToCode(element) {
19
- return element === null || element === void 0 ? void 0 : element.code;
20
+ return element?.code;
20
21
  }
21
22
 
22
23
  export { CodeInput };
23
- //# sourceMappingURL=CodeInput.js.map
24
+ //# sourceMappingURL=CodeInput.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CodeInput.mjs","sources":["../../../src/CodeInput/CodeInput.tsx"],"sourcesContent":["import { ElementDefinition, ValueSetExpansionContains } from '@medplum/fhirtypes';\nimport React, { useState } from 'react';\nimport { ValueSetAutocomplete } from '../ValueSetAutocomplete/ValueSetAutocomplete';\n\nexport interface CodeInputProps {\n property: ElementDefinition;\n name: string;\n placeholder?: string;\n defaultValue?: string;\n onChange?: (value: string | undefined) => void;\n}\n\nexport function CodeInput(props: CodeInputProps): JSX.Element {\n const [value, setValue] = useState<string | undefined>(props.defaultValue);\n\n function handleChange(newValues: ValueSetExpansionContains[]): void {\n const newValue = newValues[0];\n const newCode = valueSetElementToCode(newValue);\n setValue(newCode);\n if (props.onChange) {\n props.onChange(newCode);\n }\n }\n\n return (\n <ValueSetAutocomplete\n elementDefinition={props.property}\n name={props.name}\n placeholder={props.placeholder}\n defaultValue={codeToValueSetElement(value)}\n onChange={handleChange}\n />\n );\n}\n\nfunction codeToValueSetElement(code: string | undefined): ValueSetExpansionContains | undefined {\n return code ? { code } : undefined;\n}\n\nfunction valueSetElementToCode(element: ValueSetExpansionContains | undefined): string | undefined {\n return element?.code;\n}\n"],"names":[],"mappings":";;;AAYM,SAAU,SAAS,CAAC,KAAqB,EAAA;AAC7C,IAAA,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAqB,KAAK,CAAC,YAAY,CAAC,CAAC;IAE3E,SAAS,YAAY,CAAC,SAAsC,EAAA;AAC1D,QAAA,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;AAC9B,QAAA,MAAM,OAAO,GAAG,qBAAqB,CAAC,QAAQ,CAAC,CAAC;QAChD,QAAQ,CAAC,OAAO,CAAC,CAAC;QAClB,IAAI,KAAK,CAAC,QAAQ,EAAE;AAClB,YAAA,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;AACzB,SAAA;KACF;AAED,IAAA,QACE,KAAA,CAAA,aAAA,CAAC,oBAAoB,EAAA,EACnB,iBAAiB,EAAE,KAAK,CAAC,QAAQ,EACjC,IAAI,EAAE,KAAK,CAAC,IAAI,EAChB,WAAW,EAAE,KAAK,CAAC,WAAW,EAC9B,YAAY,EAAE,qBAAqB,CAAC,KAAK,CAAC,EAC1C,QAAQ,EAAE,YAAY,EAAA,CACtB,EACF;AACJ,CAAC;AAED,SAAS,qBAAqB,CAAC,IAAwB,EAAA;IACrD,OAAO,IAAI,GAAG,EAAE,IAAI,EAAE,GAAG,SAAS,CAAC;AACrC,CAAC;AAED,SAAS,qBAAqB,CAAC,OAA8C,EAAA;IAC3E,OAAO,OAAO,EAAE,IAAI,CAAC;AACvB;;;;"}
@@ -6,4 +6,4 @@ function CodeableConceptDisplay(props) {
6
6
  }
7
7
 
8
8
  export { CodeableConceptDisplay };
9
- //# sourceMappingURL=CodeableConceptDisplay.js.map
9
+ //# sourceMappingURL=CodeableConceptDisplay.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CodeableConceptDisplay.mjs","sources":["../../../src/CodeableConceptDisplay/CodeableConceptDisplay.tsx"],"sourcesContent":["import { formatCodeableConcept } from '@medplum/core';\nimport { CodeableConcept } from '@medplum/fhirtypes';\nimport React from 'react';\n\nexport interface CodeableConceptDisplayProps {\n value?: CodeableConcept;\n}\n\nexport function CodeableConceptDisplay(props: CodeableConceptDisplayProps): JSX.Element {\n return <>{formatCodeableConcept(props.value)}</>;\n}\n"],"names":[],"mappings":";;;AAQM,SAAU,sBAAsB,CAAC,KAAkC,EAAA;IACvE,OAAO,KAAA,CAAA,aAAA,CAAA,KAAA,CAAA,QAAA,EAAA,IAAA,EAAG,qBAAqB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAI,CAAC;AACnD;;;;"}
@@ -0,0 +1,36 @@
1
+ import React, { useState } from 'react';
2
+ import { ValueSetAutocomplete } from '../ValueSetAutocomplete/ValueSetAutocomplete.mjs';
3
+
4
+ function CodeableConceptInput(props) {
5
+ const [value, setValue] = useState(props.defaultValue);
6
+ function handleChange(newValues) {
7
+ const newConcept = valueSetElementToCodeableConcept(newValues);
8
+ setValue(newConcept);
9
+ if (props.onChange) {
10
+ props.onChange(newConcept);
11
+ }
12
+ }
13
+ return (React.createElement(ValueSetAutocomplete, { elementDefinition: props.property, name: props.name, placeholder: props.placeholder, defaultValue: value && codeableConceptToValueSetElement(value), onChange: handleChange }));
14
+ }
15
+ function codeableConceptToValueSetElement(concept) {
16
+ return concept.coding?.map((c) => ({
17
+ system: c.system,
18
+ code: c.code,
19
+ display: c.display,
20
+ }));
21
+ }
22
+ function valueSetElementToCodeableConcept(elements) {
23
+ if (elements.length === 0) {
24
+ return undefined;
25
+ }
26
+ return {
27
+ coding: elements.map((e) => ({
28
+ system: e.system,
29
+ code: e.code,
30
+ display: e.display,
31
+ })),
32
+ };
33
+ }
34
+
35
+ export { CodeableConceptInput };
36
+ //# sourceMappingURL=CodeableConceptInput.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CodeableConceptInput.mjs","sources":["../../../src/CodeableConceptInput/CodeableConceptInput.tsx"],"sourcesContent":["import { CodeableConcept, ElementDefinition, ValueSetExpansionContains } from '@medplum/fhirtypes';\nimport React, { useState } from 'react';\nimport { ValueSetAutocomplete } from '../ValueSetAutocomplete/ValueSetAutocomplete';\n\nexport interface CodeableConceptInputProps {\n property: ElementDefinition;\n name: string;\n placeholder?: string;\n defaultValue?: CodeableConcept;\n onChange?: (value: CodeableConcept | undefined) => void;\n}\n\nexport function CodeableConceptInput(props: CodeableConceptInputProps): JSX.Element {\n const [value, setValue] = useState<CodeableConcept | undefined>(props.defaultValue);\n\n function handleChange(newValues: ValueSetExpansionContains[]): void {\n const newConcept = valueSetElementToCodeableConcept(newValues);\n setValue(newConcept);\n if (props.onChange) {\n props.onChange(newConcept);\n }\n }\n\n return (\n <ValueSetAutocomplete\n elementDefinition={props.property}\n name={props.name}\n placeholder={props.placeholder}\n defaultValue={value && codeableConceptToValueSetElement(value)}\n onChange={handleChange}\n />\n );\n}\n\nfunction codeableConceptToValueSetElement(concept: CodeableConcept): ValueSetExpansionContains[] | undefined {\n return concept.coding?.map((c) => ({\n system: c.system,\n code: c.code,\n display: c.display,\n }));\n}\n\nfunction valueSetElementToCodeableConcept(elements: ValueSetExpansionContains[]): CodeableConcept | undefined {\n if (elements.length === 0) {\n return undefined;\n }\n return {\n coding: elements.map((e) => ({\n system: e.system,\n code: e.code,\n display: e.display,\n })),\n };\n}\n"],"names":[],"mappings":";;;AAYM,SAAU,oBAAoB,CAAC,KAAgC,EAAA;AACnE,IAAA,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAA8B,KAAK,CAAC,YAAY,CAAC,CAAC;IAEpF,SAAS,YAAY,CAAC,SAAsC,EAAA;AAC1D,QAAA,MAAM,UAAU,GAAG,gCAAgC,CAAC,SAAS,CAAC,CAAC;QAC/D,QAAQ,CAAC,UAAU,CAAC,CAAC;QACrB,IAAI,KAAK,CAAC,QAAQ,EAAE;AAClB,YAAA,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;AAC5B,SAAA;KACF;AAED,IAAA,QACE,KAAC,CAAA,aAAA,CAAA,oBAAoB,EACnB,EAAA,iBAAiB,EAAE,KAAK,CAAC,QAAQ,EACjC,IAAI,EAAE,KAAK,CAAC,IAAI,EAChB,WAAW,EAAE,KAAK,CAAC,WAAW,EAC9B,YAAY,EAAE,KAAK,IAAI,gCAAgC,CAAC,KAAK,CAAC,EAC9D,QAAQ,EAAE,YAAY,EAAA,CACtB,EACF;AACJ,CAAC;AAED,SAAS,gCAAgC,CAAC,OAAwB,EAAA;IAChE,OAAO,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,MAAM;QACjC,MAAM,EAAE,CAAC,CAAC,MAAM;QAChB,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,OAAO,EAAE,CAAC,CAAC,OAAO;AACnB,KAAA,CAAC,CAAC,CAAC;AACN,CAAC;AAED,SAAS,gCAAgC,CAAC,QAAqC,EAAA;AAC7E,IAAA,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE;AACzB,QAAA,OAAO,SAAS,CAAC;AAClB,KAAA;IACD,OAAO;QACL,MAAM,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM;YAC3B,MAAM,EAAE,CAAC,CAAC,MAAM;YAChB,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,OAAO,EAAE,CAAC,CAAC,OAAO;AACnB,SAAA,CAAC,CAAC;KACJ,CAAC;AACJ;;;;"}
@@ -6,4 +6,4 @@ function CodingDisplay(props) {
6
6
  }
7
7
 
8
8
  export { CodingDisplay };
9
- //# sourceMappingURL=CodingDisplay.js.map
9
+ //# sourceMappingURL=CodingDisplay.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CodingDisplay.mjs","sources":["../../../src/CodingDisplay/CodingDisplay.tsx"],"sourcesContent":["import { formatCoding } from '@medplum/core';\nimport { Coding } from '@medplum/fhirtypes';\nimport React from 'react';\n\nexport interface CodingDisplayProps {\n value?: Coding;\n}\n\nexport function CodingDisplay(props: CodingDisplayProps): JSX.Element {\n return <>{formatCoding(props.value)}</>;\n}\n"],"names":[],"mappings":";;;AAQM,SAAU,aAAa,CAAC,KAAyB,EAAA;IACrD,OAAO,KAAA,CAAA,aAAA,CAAA,KAAA,CAAA,QAAA,EAAA,IAAA,EAAG,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,CAAI,CAAC;AAC1C;;;;"}
@@ -1,16 +1,17 @@
1
1
  import React, { useState } from 'react';
2
- import { ValueSetAutocomplete } from '../ValueSetAutocomplete/ValueSetAutocomplete.js';
2
+ import { ValueSetAutocomplete } from '../ValueSetAutocomplete/ValueSetAutocomplete.mjs';
3
3
 
4
4
  function CodingInput(props) {
5
5
  const [value, setValue] = useState(props.defaultValue);
6
- function handleChange(newValue) {
6
+ function handleChange(newValues) {
7
+ const newValue = newValues[0];
7
8
  const newConcept = newValue && valueSetElementToCoding(newValue);
8
9
  setValue(newConcept);
9
10
  if (props.onChange) {
10
11
  props.onChange(newConcept);
11
12
  }
12
13
  }
13
- return (React.createElement(ValueSetAutocomplete, { property: props.property, name: props.name, placeholder: props.placeholder, defaultValue: value && codingToValueSetElement(value), onChange: handleChange }));
14
+ return (React.createElement(ValueSetAutocomplete, { elementDefinition: props.property, name: props.name, placeholder: props.placeholder, defaultValue: value && codingToValueSetElement(value), onChange: handleChange }));
14
15
  }
15
16
  function codingToValueSetElement(coding) {
16
17
  return {
@@ -28,4 +29,4 @@ function valueSetElementToCoding(element) {
28
29
  }
29
30
 
30
31
  export { CodingInput };
31
- //# sourceMappingURL=CodingInput.js.map
32
+ //# sourceMappingURL=CodingInput.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CodingInput.mjs","sources":["../../../src/CodingInput/CodingInput.tsx"],"sourcesContent":["import { Coding, ElementDefinition, ValueSetExpansionContains } from '@medplum/fhirtypes';\nimport React, { useState } from 'react';\nimport { ValueSetAutocomplete } from '../ValueSetAutocomplete/ValueSetAutocomplete';\n\nexport interface CodingInputProps {\n property: ElementDefinition;\n name: string;\n placeholder?: string;\n defaultValue?: Coding;\n onChange?: (value: Coding | undefined) => void;\n}\n\nexport function CodingInput(props: CodingInputProps): JSX.Element {\n const [value, setValue] = useState<Coding | undefined>(props.defaultValue);\n\n function handleChange(newValues: ValueSetExpansionContains[]): void {\n const newValue = newValues[0];\n const newConcept = newValue && valueSetElementToCoding(newValue);\n setValue(newConcept);\n if (props.onChange) {\n props.onChange(newConcept);\n }\n }\n\n return (\n <ValueSetAutocomplete\n elementDefinition={props.property}\n name={props.name}\n placeholder={props.placeholder}\n defaultValue={value && codingToValueSetElement(value)}\n onChange={handleChange}\n />\n );\n}\n\nfunction codingToValueSetElement(coding: Coding): ValueSetExpansionContains {\n return {\n system: coding.system,\n code: coding.code,\n display: coding.display,\n };\n}\n\nfunction valueSetElementToCoding(element: ValueSetExpansionContains): Coding {\n return {\n system: element.system,\n code: element.code,\n display: element.display,\n };\n}\n"],"names":[],"mappings":";;;AAYM,SAAU,WAAW,CAAC,KAAuB,EAAA;AACjD,IAAA,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAqB,KAAK,CAAC,YAAY,CAAC,CAAC;IAE3E,SAAS,YAAY,CAAC,SAAsC,EAAA;AAC1D,QAAA,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;QAC9B,MAAM,UAAU,GAAG,QAAQ,IAAI,uBAAuB,CAAC,QAAQ,CAAC,CAAC;QACjE,QAAQ,CAAC,UAAU,CAAC,CAAC;QACrB,IAAI,KAAK,CAAC,QAAQ,EAAE;AAClB,YAAA,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;AAC5B,SAAA;KACF;AAED,IAAA,QACE,KAAC,CAAA,aAAA,CAAA,oBAAoB,EACnB,EAAA,iBAAiB,EAAE,KAAK,CAAC,QAAQ,EACjC,IAAI,EAAE,KAAK,CAAC,IAAI,EAChB,WAAW,EAAE,KAAK,CAAC,WAAW,EAC9B,YAAY,EAAE,KAAK,IAAI,uBAAuB,CAAC,KAAK,CAAC,EACrD,QAAQ,EAAE,YAAY,EAAA,CACtB,EACF;AACJ,CAAC;AAED,SAAS,uBAAuB,CAAC,MAAc,EAAA;IAC7C,OAAO;QACL,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,OAAO,EAAE,MAAM,CAAC,OAAO;KACxB,CAAC;AACJ,CAAC;AAED,SAAS,uBAAuB,CAAC,OAAkC,EAAA;IACjE,OAAO;QACL,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,OAAO,EAAE,OAAO,CAAC,OAAO;KACzB,CAAC;AACJ;;;;"}