@medplum/react 2.0.2 → 2.0.4

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 (309) hide show
  1. package/dist/cjs/OperationOutcomeAlert/OperationOutcomeAlert.d.ts +2 -1
  2. package/dist/cjs/ResourceDiffTable/ResourceDiffTable.stories.d.ts +5 -0
  3. package/dist/cjs/ResourceTable/ResourceTable.d.ts +13 -0
  4. package/dist/cjs/ResourceTimeline/ResourceTimeline.d.ts +2 -2
  5. package/dist/cjs/auth/AuthenticationForm.d.ts +2 -1
  6. package/dist/cjs/auth/SignInForm.d.ts +1 -0
  7. package/dist/cjs/index.cjs +1834 -1212
  8. package/dist/cjs/index.cjs.map +1 -1
  9. package/dist/cjs/index.d.ts +1 -0
  10. package/dist/cjs/index.min.cjs +1 -1
  11. package/dist/cjs/useResource/useResource.d.ts +2 -2
  12. package/dist/cjs/utils/date.d.ts +2 -1
  13. package/dist/esm/AddressDisplay/AddressDisplay.mjs +2 -2
  14. package/dist/esm/AddressDisplay/AddressDisplay.mjs.map +1 -1
  15. package/dist/esm/AddressInput/AddressInput.mjs +9 -9
  16. package/dist/esm/AddressInput/AddressInput.mjs.map +1 -1
  17. package/dist/esm/AnnotationInput/AnnotationInput.mjs +2 -2
  18. package/dist/esm/AnnotationInput/AnnotationInput.mjs.map +1 -1
  19. package/dist/esm/AsyncAutocomplete/AsyncAutocomplete.mjs +2 -2
  20. package/dist/esm/AsyncAutocomplete/AsyncAutocomplete.mjs.map +1 -1
  21. package/dist/esm/AttachmentArrayDisplay/AttachmentArrayDisplay.mjs +4 -4
  22. package/dist/esm/AttachmentArrayDisplay/AttachmentArrayDisplay.mjs.map +1 -1
  23. package/dist/esm/AttachmentArrayInput/AttachmentArrayInput.mjs +20 -19
  24. package/dist/esm/AttachmentArrayInput/AttachmentArrayInput.mjs.map +1 -1
  25. package/dist/esm/AttachmentButton/AttachmentButton.mjs +3 -3
  26. package/dist/esm/AttachmentButton/AttachmentButton.mjs.map +1 -1
  27. package/dist/esm/AttachmentDisplay/AttachmentDisplay.mjs +9 -9
  28. package/dist/esm/AttachmentDisplay/AttachmentDisplay.mjs.map +1 -1
  29. package/dist/esm/AttachmentInput/AttachmentInput.mjs +5 -5
  30. package/dist/esm/AttachmentInput/AttachmentInput.mjs.map +1 -1
  31. package/dist/esm/BackboneElementDisplay/BackboneElementDisplay.mjs +6 -6
  32. package/dist/esm/BackboneElementDisplay/BackboneElementDisplay.mjs.map +1 -1
  33. package/dist/esm/BackboneElementInput/BackboneElementInput.mjs +7 -7
  34. package/dist/esm/BackboneElementInput/BackboneElementInput.mjs.map +1 -1
  35. package/dist/esm/CalendarInput/CalendarInput.mjs +18 -18
  36. package/dist/esm/CalendarInput/CalendarInput.mjs.map +1 -1
  37. package/dist/esm/CheckboxFormSection/CheckboxFormSection.mjs +5 -5
  38. package/dist/esm/CheckboxFormSection/CheckboxFormSection.mjs.map +1 -1
  39. package/dist/esm/CodeInput/CodeInput.mjs +2 -2
  40. package/dist/esm/CodeInput/CodeInput.mjs.map +1 -1
  41. package/dist/esm/CodeableConceptDisplay/CodeableConceptDisplay.mjs +2 -2
  42. package/dist/esm/CodeableConceptDisplay/CodeableConceptDisplay.mjs.map +1 -1
  43. package/dist/esm/CodeableConceptInput/CodeableConceptInput.mjs +2 -2
  44. package/dist/esm/CodeableConceptInput/CodeableConceptInput.mjs.map +1 -1
  45. package/dist/esm/CodingDisplay/CodingDisplay.mjs +2 -2
  46. package/dist/esm/CodingDisplay/CodingDisplay.mjs.map +1 -1
  47. package/dist/esm/CodingInput/CodingInput.mjs +2 -2
  48. package/dist/esm/CodingInput/CodingInput.mjs.map +1 -1
  49. package/dist/esm/ContactDetailDisplay/ContactDetailDisplay.mjs +3 -3
  50. package/dist/esm/ContactDetailDisplay/ContactDetailDisplay.mjs.map +1 -1
  51. package/dist/esm/ContactDetailInput/ContactDetailInput.mjs +4 -4
  52. package/dist/esm/ContactDetailInput/ContactDetailInput.mjs.map +1 -1
  53. package/dist/esm/ContactPointDisplay/ContactPointDisplay.mjs +2 -2
  54. package/dist/esm/ContactPointDisplay/ContactPointDisplay.mjs.map +1 -1
  55. package/dist/esm/ContactPointInput/ContactPointInput.mjs +5 -5
  56. package/dist/esm/ContactPointInput/ContactPointInput.mjs.map +1 -1
  57. package/dist/esm/Container/Container.mjs +2 -2
  58. package/dist/esm/Container/Container.mjs.map +1 -1
  59. package/dist/esm/DateTimeInput/DateTimeInput.mjs +2 -2
  60. package/dist/esm/DateTimeInput/DateTimeInput.mjs.map +1 -1
  61. package/dist/esm/DefaultResourceTimeline/DefaultResourceTimeline.mjs +3 -7
  62. package/dist/esm/DefaultResourceTimeline/DefaultResourceTimeline.mjs.map +1 -1
  63. package/dist/esm/DescriptionList/DescriptionList.mjs +5 -5
  64. package/dist/esm/DescriptionList/DescriptionList.mjs.map +1 -1
  65. package/dist/esm/DiagnosticReportDisplay/DiagnosticReportDisplay.mjs +49 -49
  66. package/dist/esm/DiagnosticReportDisplay/DiagnosticReportDisplay.mjs.map +1 -1
  67. package/dist/esm/Document/Document.mjs +3 -3
  68. package/dist/esm/Document/Document.mjs.map +1 -1
  69. package/dist/esm/EncounterTimeline/EncounterTimeline.mjs +7 -7
  70. package/dist/esm/EncounterTimeline/EncounterTimeline.mjs.map +1 -1
  71. package/dist/esm/ErrorBoundary/ErrorBoundary.mjs +4 -4
  72. package/dist/esm/ErrorBoundary/ErrorBoundary.mjs.map +1 -1
  73. package/dist/esm/ExtensionInput/ExtensionInput.mjs +2 -2
  74. package/dist/esm/ExtensionInput/ExtensionInput.mjs.map +1 -1
  75. package/dist/esm/FhirPathDisplay/FhirPathDisplay.mjs +2 -2
  76. package/dist/esm/FhirPathDisplay/FhirPathDisplay.mjs.map +1 -1
  77. package/dist/esm/FhirPathTable/FhirPathTable.mjs +19 -19
  78. package/dist/esm/FhirPathTable/FhirPathTable.mjs.map +1 -1
  79. package/dist/esm/Form/Form.mjs +2 -2
  80. package/dist/esm/Form/Form.mjs.map +1 -1
  81. package/dist/esm/FormSection/FormSection.mjs +2 -2
  82. package/dist/esm/FormSection/FormSection.mjs.map +1 -1
  83. package/dist/esm/GoogleButton/GoogleButton.mjs +4 -4
  84. package/dist/esm/GoogleButton/GoogleButton.mjs.map +1 -1
  85. package/dist/esm/HumanNameDisplay/HumanNameDisplay.mjs +2 -2
  86. package/dist/esm/HumanNameDisplay/HumanNameDisplay.mjs.map +1 -1
  87. package/dist/esm/HumanNameInput/HumanNameInput.mjs +7 -7
  88. package/dist/esm/HumanNameInput/HumanNameInput.mjs.map +1 -1
  89. package/dist/esm/IdentifierDisplay/IdentifierDisplay.mjs +2 -2
  90. package/dist/esm/IdentifierDisplay/IdentifierDisplay.mjs.map +1 -1
  91. package/dist/esm/IdentifierInput/IdentifierInput.mjs +4 -4
  92. package/dist/esm/IdentifierInput/IdentifierInput.mjs.map +1 -1
  93. package/dist/esm/Logo/Logo.mjs +8 -8
  94. package/dist/esm/Logo/Logo.mjs.map +1 -1
  95. package/dist/esm/MedplumLink/MedplumLink.mjs +2 -2
  96. package/dist/esm/MedplumLink/MedplumLink.mjs.map +1 -1
  97. package/dist/esm/MedplumProvider/MedplumProvider.mjs +2 -2
  98. package/dist/esm/MedplumProvider/MedplumProvider.mjs.map +1 -1
  99. package/dist/esm/MoneyDisplay/MoneyDisplay.mjs +2 -2
  100. package/dist/esm/MoneyDisplay/MoneyDisplay.mjs.map +1 -1
  101. package/dist/esm/MoneyInput/MoneyInput.mjs +4 -4
  102. package/dist/esm/MoneyInput/MoneyInput.mjs.map +1 -1
  103. package/dist/esm/NoteDisplay/NoteDisplay.mjs +2 -2
  104. package/dist/esm/NoteDisplay/NoteDisplay.mjs.map +1 -1
  105. package/dist/esm/OperationOutcomeAlert/OperationOutcomeAlert.d.ts +2 -1
  106. package/dist/esm/OperationOutcomeAlert/OperationOutcomeAlert.mjs +5 -4
  107. package/dist/esm/OperationOutcomeAlert/OperationOutcomeAlert.mjs.map +1 -1
  108. package/dist/esm/Panel/Panel.mjs +2 -2
  109. package/dist/esm/Panel/Panel.mjs.map +1 -1
  110. package/dist/esm/PatientTimeline/PatientTimeline.mjs +12 -12
  111. package/dist/esm/PatientTimeline/PatientTimeline.mjs.map +1 -1
  112. package/dist/esm/PeriodInput/PeriodInput.mjs +4 -4
  113. package/dist/esm/PeriodInput/PeriodInput.mjs.map +1 -1
  114. package/dist/esm/PlanDefinitionBuilder/PlanDefinitionBuilder.mjs +34 -34
  115. package/dist/esm/PlanDefinitionBuilder/PlanDefinitionBuilder.mjs.map +1 -1
  116. package/dist/esm/QuantityDisplay/QuantityDisplay.mjs +2 -2
  117. package/dist/esm/QuantityDisplay/QuantityDisplay.mjs.map +1 -1
  118. package/dist/esm/QuantityInput/QuantityInput.mjs +5 -5
  119. package/dist/esm/QuantityInput/QuantityInput.mjs.map +1 -1
  120. package/dist/esm/QuestionnaireBuilder/QuestionnaireBuilder.mjs +31 -31
  121. package/dist/esm/QuestionnaireBuilder/QuestionnaireBuilder.mjs.map +1 -1
  122. package/dist/esm/QuestionnaireForm/QuestionnaireForm.mjs +32 -32
  123. package/dist/esm/QuestionnaireForm/QuestionnaireForm.mjs.map +1 -1
  124. package/dist/esm/RangeDisplay/RangeDisplay.mjs +2 -2
  125. package/dist/esm/RangeDisplay/RangeDisplay.mjs.map +1 -1
  126. package/dist/esm/RangeInput/RangeInput.mjs +4 -4
  127. package/dist/esm/RangeInput/RangeInput.mjs.map +1 -1
  128. package/dist/esm/RatioDisplay/RatioDisplay.mjs +4 -4
  129. package/dist/esm/RatioDisplay/RatioDisplay.mjs.map +1 -1
  130. package/dist/esm/RatioInput/RatioInput.mjs +4 -4
  131. package/dist/esm/RatioInput/RatioInput.mjs.map +1 -1
  132. package/dist/esm/ReferenceDisplay/ReferenceDisplay.mjs +3 -3
  133. package/dist/esm/ReferenceDisplay/ReferenceDisplay.mjs.map +1 -1
  134. package/dist/esm/ReferenceInput/ReferenceInput.mjs +4 -4
  135. package/dist/esm/ReferenceInput/ReferenceInput.mjs.map +1 -1
  136. package/dist/esm/ReferenceRangeEditor/ReferenceRangeEditor.mjs +32 -31
  137. package/dist/esm/ReferenceRangeEditor/ReferenceRangeEditor.mjs.map +1 -1
  138. package/dist/esm/RequestGroupDisplay/RequestGroupDisplay.mjs +16 -15
  139. package/dist/esm/RequestGroupDisplay/RequestGroupDisplay.mjs.map +1 -1
  140. package/dist/esm/ResourceArrayDisplay/ResourceArrayDisplay.mjs +3 -3
  141. package/dist/esm/ResourceArrayDisplay/ResourceArrayDisplay.mjs.map +1 -1
  142. package/dist/esm/ResourceArrayInput/ResourceArrayInput.mjs +19 -18
  143. package/dist/esm/ResourceArrayInput/ResourceArrayInput.mjs.map +1 -1
  144. package/dist/esm/ResourceAvatar/ResourceAvatar.mjs +4 -4
  145. package/dist/esm/ResourceAvatar/ResourceAvatar.mjs.map +1 -1
  146. package/dist/esm/ResourceBadge/ResourceBadge.mjs +4 -4
  147. package/dist/esm/ResourceBadge/ResourceBadge.mjs.map +1 -1
  148. package/dist/esm/ResourceBlame/ResourceBlame.mjs +13 -13
  149. package/dist/esm/ResourceBlame/ResourceBlame.mjs.map +1 -1
  150. package/dist/esm/ResourceDiff/ResourceDiff.mjs +7 -7
  151. package/dist/esm/ResourceDiff/ResourceDiff.mjs.map +1 -1
  152. package/dist/esm/ResourceDiffTable/ResourceDiffTable.mjs +18 -18
  153. package/dist/esm/ResourceDiffTable/ResourceDiffTable.mjs.map +1 -1
  154. package/dist/esm/ResourceDiffTable/ResourceDiffTable.stories.d.ts +5 -0
  155. package/dist/esm/ResourceForm/ResourceForm.mjs +12 -12
  156. package/dist/esm/ResourceForm/ResourceForm.mjs.map +1 -1
  157. package/dist/esm/ResourceHistoryTable/ResourceHistoryTable.mjs +17 -17
  158. package/dist/esm/ResourceHistoryTable/ResourceHistoryTable.mjs.map +1 -1
  159. package/dist/esm/ResourceInput/ResourceInput.mjs +8 -8
  160. package/dist/esm/ResourceInput/ResourceInput.mjs.map +1 -1
  161. package/dist/esm/ResourceName/ResourceName.mjs +2 -2
  162. package/dist/esm/ResourceName/ResourceName.mjs.map +1 -1
  163. package/dist/esm/ResourcePropertyDisplay/ResourcePropertyDisplay.mjs +26 -26
  164. package/dist/esm/ResourcePropertyDisplay/ResourcePropertyDisplay.mjs.map +1 -1
  165. package/dist/esm/ResourcePropertyInput/ResourcePropertyInput.mjs +34 -34
  166. package/dist/esm/ResourcePropertyInput/ResourcePropertyInput.mjs.map +1 -1
  167. package/dist/esm/ResourceTable/ResourceTable.d.ts +13 -0
  168. package/dist/esm/ResourceTable/ResourceTable.mjs +5 -2
  169. package/dist/esm/ResourceTable/ResourceTable.mjs.map +1 -1
  170. package/dist/esm/ResourceTimeline/ResourceTimeline.d.ts +2 -2
  171. package/dist/esm/ResourceTimeline/ResourceTimeline.mjs +105 -76
  172. package/dist/esm/ResourceTimeline/ResourceTimeline.mjs.map +1 -1
  173. package/dist/esm/Scheduler/Scheduler.mjs +22 -22
  174. package/dist/esm/Scheduler/Scheduler.mjs.map +1 -1
  175. package/dist/esm/SearchControl/SearchControl.mjs +55 -49
  176. package/dist/esm/SearchControl/SearchControl.mjs.map +1 -1
  177. package/dist/esm/SearchControl/SearchUtils.mjs +4 -4
  178. package/dist/esm/SearchControl/SearchUtils.mjs.map +1 -1
  179. package/dist/esm/SearchFieldEditor/SearchFieldEditor.mjs +25 -25
  180. package/dist/esm/SearchFieldEditor/SearchFieldEditor.mjs.map +1 -1
  181. package/dist/esm/SearchFilterEditor/SearchFilterEditor.mjs +37 -37
  182. package/dist/esm/SearchFilterEditor/SearchFilterEditor.mjs.map +1 -1
  183. package/dist/esm/SearchFilterValueDialog/SearchFilterValueDialog.mjs +6 -6
  184. package/dist/esm/SearchFilterValueDialog/SearchFilterValueDialog.mjs.map +1 -1
  185. package/dist/esm/SearchFilterValueDisplay/SearchFilterValueDisplay.mjs +4 -4
  186. package/dist/esm/SearchFilterValueDisplay/SearchFilterValueDisplay.mjs.map +1 -1
  187. package/dist/esm/SearchFilterValueInput/SearchFilterValueInput.mjs +8 -8
  188. package/dist/esm/SearchFilterValueInput/SearchFilterValueInput.mjs.map +1 -1
  189. package/dist/esm/SearchPopupMenu/SearchPopupMenu.mjs +75 -62
  190. package/dist/esm/SearchPopupMenu/SearchPopupMenu.mjs.map +1 -1
  191. package/dist/esm/ServiceRequestTimeline/ServiceRequestTimeline.mjs +8 -8
  192. package/dist/esm/ServiceRequestTimeline/ServiceRequestTimeline.mjs.map +1 -1
  193. package/dist/esm/StatusBadge/StatusBadge.mjs +2 -2
  194. package/dist/esm/StatusBadge/StatusBadge.mjs.map +1 -1
  195. package/dist/esm/Timeline/Timeline.mjs +20 -20
  196. package/dist/esm/Timeline/Timeline.mjs.map +1 -1
  197. package/dist/esm/TimingInput/TimingInput.mjs +19 -19
  198. package/dist/esm/TimingInput/TimingInput.mjs.map +1 -1
  199. package/dist/esm/ValueSetAutocomplete/ValueSetAutocomplete.mjs +2 -2
  200. package/dist/esm/ValueSetAutocomplete/ValueSetAutocomplete.mjs.map +1 -1
  201. package/dist/esm/auth/AuthenticationForm.d.ts +2 -1
  202. package/dist/esm/auth/AuthenticationForm.mjs +23 -23
  203. package/dist/esm/auth/AuthenticationForm.mjs.map +1 -1
  204. package/dist/esm/auth/ChooseProfileForm.mjs +11 -11
  205. package/dist/esm/auth/ChooseProfileForm.mjs.map +1 -1
  206. package/dist/esm/auth/ChooseScopeForm.mjs +9 -9
  207. package/dist/esm/auth/ChooseScopeForm.mjs.map +1 -1
  208. package/dist/esm/auth/MfaForm.mjs +12 -12
  209. package/dist/esm/auth/MfaForm.mjs.map +1 -1
  210. package/dist/esm/auth/NewProjectForm.mjs +12 -12
  211. package/dist/esm/auth/NewProjectForm.mjs.map +1 -1
  212. package/dist/esm/auth/NewUserForm.mjs +22 -22
  213. package/dist/esm/auth/NewUserForm.mjs.map +1 -1
  214. package/dist/esm/auth/RegisterForm.mjs +5 -5
  215. package/dist/esm/auth/RegisterForm.mjs.map +1 -1
  216. package/dist/esm/auth/SignInForm.d.ts +1 -0
  217. package/dist/esm/auth/SignInForm.mjs +8 -8
  218. package/dist/esm/auth/SignInForm.mjs.map +1 -1
  219. package/dist/esm/index.d.ts +1 -0
  220. package/dist/esm/index.min.mjs +1 -1
  221. package/dist/esm/index.mjs +1 -0
  222. package/dist/esm/index.mjs.map +1 -1
  223. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/createReactComponent.mjs +69 -0
  224. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/createReactComponent.mjs.map +1 -0
  225. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/defaultAttributes.mjs +18 -0
  226. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/defaultAttributes.mjs.map +1 -0
  227. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconAdjustmentsHorizontal.mjs +24 -0
  228. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconAdjustmentsHorizontal.mjs.map +1 -0
  229. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconAlertCircle.mjs +14 -0
  230. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconAlertCircle.mjs.map +1 -0
  231. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconBleach.mjs +18 -0
  232. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconBleach.mjs.map +1 -0
  233. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconBleachOff.mjs +19 -0
  234. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconBleachOff.mjs.map +1 -0
  235. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconBoxMultiple.mjs +25 -0
  236. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconBoxMultiple.mjs.map +1 -0
  237. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconBracketsContain.mjs +16 -0
  238. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconBracketsContain.mjs.map +1 -0
  239. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconBucket.mjs +19 -0
  240. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconBucket.mjs.map +1 -0
  241. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconBucketOff.mjs +26 -0
  242. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconBucketOff.mjs.map +1 -0
  243. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconCalendar.mjs +23 -0
  244. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconCalendar.mjs.map +1 -0
  245. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconCheck.mjs +12 -0
  246. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconCheck.mjs.map +1 -0
  247. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconCheckbox.mjs +19 -0
  248. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconCheckbox.mjs.map +1 -0
  249. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconCircleMinus.mjs +13 -0
  250. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconCircleMinus.mjs.map +1 -0
  251. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconCirclePlus.mjs +14 -0
  252. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconCirclePlus.mjs.map +1 -0
  253. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconCloudUpload.mjs +20 -0
  254. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconCloudUpload.mjs.map +1 -0
  255. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconColumns.mjs +19 -0
  256. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconColumns.mjs.map +1 -0
  257. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconCurrencyDollar.mjs +19 -0
  258. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconCurrencyDollar.mjs.map +1 -0
  259. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconDots.mjs +14 -0
  260. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconDots.mjs.map +1 -0
  261. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconEdit.mjs +26 -0
  262. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconEdit.mjs.map +1 -0
  263. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconEqual.mjs +13 -0
  264. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconEqual.mjs.map +1 -0
  265. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconEqualNot.mjs +14 -0
  266. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconEqualNot.mjs.map +1 -0
  267. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconFileAlert.mjs +21 -0
  268. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconFileAlert.mjs.map +1 -0
  269. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconFilePlus.mjs +21 -0
  270. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconFilePlus.mjs.map +1 -0
  271. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconFilter.mjs +18 -0
  272. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconFilter.mjs.map +1 -0
  273. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconListDetails.mjs +29 -0
  274. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconListDetails.mjs.map +1 -0
  275. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconMathGreater.mjs +12 -0
  276. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconMathGreater.mjs.map +1 -0
  277. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconMathLower.mjs +12 -0
  278. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconMathLower.mjs.map +1 -0
  279. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconMessage.mjs +20 -0
  280. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconMessage.mjs.map +1 -0
  281. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconPin.mjs +20 -0
  282. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconPin.mjs.map +1 -0
  283. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconPinnedOff.mjs +21 -0
  284. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconPinnedOff.mjs.map +1 -0
  285. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconSettings.mjs +19 -0
  286. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconSettings.mjs.map +1 -0
  287. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconSortAscending.mjs +16 -0
  288. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconSortAscending.mjs.map +1 -0
  289. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconSortDescending.mjs +16 -0
  290. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconSortDescending.mjs.map +1 -0
  291. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconSquare.mjs +18 -0
  292. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconSquare.mjs.map +1 -0
  293. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconTableExport.mjs +18 -0
  294. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconTableExport.mjs.map +1 -0
  295. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconTrash.mjs +19 -0
  296. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconTrash.mjs.map +1 -0
  297. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconX.mjs +13 -0
  298. package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconX.mjs.map +1 -0
  299. package/dist/esm/useResource/useResource.d.ts +2 -2
  300. package/dist/esm/useResource/useResource.mjs +62 -42
  301. package/dist/esm/useResource/useResource.mjs.map +1 -1
  302. package/dist/esm/utils/date.d.ts +2 -1
  303. package/dist/esm/utils/date.mjs +31 -25
  304. package/dist/esm/utils/date.mjs.map +1 -1
  305. package/icons-unique.txt +36 -0
  306. package/icons.txt +44 -0
  307. package/package.json +13 -13
  308. package/dist/esm/node_modules/@tabler/icons/icons-react/dist/index.esm.mjs +0 -6
  309. package/dist/esm/node_modules/@tabler/icons/icons-react/dist/index.esm.mjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"TimingInput.mjs","sources":["../../../src/TimingInput/TimingInput.tsx"],"sourcesContent":["import { Button, Checkbox, Group, Modal, NativeSelect, TextInput } from '@mantine/core';\nimport { formatTiming } from '@medplum/core';\nimport { Timing, TimingRepeat } from '@medplum/fhirtypes';\nimport React, { useRef, useState } from 'react';\nimport { DateTimeInput } from '../DateTimeInput/DateTimeInput';\nimport { FormSection } from '../FormSection/FormSection';\n\nconst daysOfWeek = ['sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat'];\n\ntype DayOfWeek = 'sun' | 'mon' | 'tue' | 'wed' | 'thu' | 'fri' | 'sat';\n\nexport interface TimingInputProps {\n name: string;\n defaultValue?: Timing;\n onChange?: (newValue: Timing) => void;\n}\n\nexport function TimingInput(props: TimingInputProps): JSX.Element {\n const [value, setValue] = useState<Timing>(props.defaultValue || {});\n const [open, setOpen] = useState(false);\n\n const valueRef = useRef<Timing>();\n valueRef.current = value;\n\n return (\n <>\n <Group spacing=\"xs\" grow noWrap>\n <span>{formatTiming(valueRef.current) || 'No repeat'}</span>\n <Button onClick={() => setOpen(true)}>Edit</Button>\n </Group>\n <TimingEditorDialog\n visible={open}\n defaultValue={valueRef.current}\n onOk={(newValue) => {\n if (props.onChange) {\n props.onChange(newValue);\n }\n setValue(newValue);\n setOpen(false);\n }}\n onCancel={() => setOpen(false)}\n />\n </>\n );\n}\n\ninterface TimingEditorDialogProps {\n visible: boolean;\n defaultValue?: Timing;\n onOk: (newValue: Timing) => void;\n onCancel: () => void;\n}\n\nfunction TimingEditorDialog(props: TimingEditorDialogProps): JSX.Element {\n const [value, setValue] = useState<Timing>(props.defaultValue || {});\n\n const valueRef = useRef<Timing>();\n valueRef.current = value;\n\n function setStart(newStart: string): void {\n setValue({ ...valueRef.current, event: [newStart] });\n }\n\n function setRepeat(repeat: TimingRepeat): void {\n setValue({ ...valueRef.current, repeat });\n }\n\n function setPeriod(newPeriod: number | undefined): void {\n setRepeat({ ...valueRef.current?.repeat, period: newPeriod });\n }\n\n function setPeriodUnit(newPeriodUnit: 'a' | 's' | 'min' | 'h' | 'd' | 'wk' | 'mo' | undefined): void {\n setRepeat({ ...valueRef.current?.repeat, periodUnit: newPeriodUnit });\n }\n\n function setDayOfWeek(day: DayOfWeek, enabled: boolean): void {\n if (enabled) {\n addDayOfWeek(day);\n } else {\n removeDayOfWeek(day);\n }\n }\n\n function addDayOfWeek(day: DayOfWeek): void {\n const existing = valueRef.current?.repeat?.dayOfWeek || [];\n if (!existing.includes(day)) {\n setRepeat({ ...valueRef.current?.repeat, dayOfWeek: [...existing, day] });\n }\n }\n\n function removeDayOfWeek(day: DayOfWeek): void {\n const existing = valueRef.current?.repeat?.dayOfWeek || [];\n if (existing.includes(day)) {\n setRepeat({ ...valueRef.current?.repeat, dayOfWeek: existing.filter((d) => d !== day) });\n }\n }\n\n return (\n <Modal title=\"Timing\" closeButtonLabel=\"Close\" opened={props.visible} onClose={() => props.onCancel()}>\n <div style={{ padding: '5px 20px', textAlign: 'left' }}>\n <FormSection title=\"Starts on\" htmlFor={'timing-dialog-start'}>\n <DateTimeInput name={'timing-dialog-start'} onChange={(newValue) => setStart(newValue)} />\n </FormSection>\n <FormSection title=\"Repeat every\" htmlFor={'timing-dialog-period'}>\n <Group spacing=\"xs\" grow noWrap>\n <TextInput\n type=\"number\"\n step={1}\n id=\"timing-dialog-period\"\n name=\"timing-dialog-period\"\n defaultValue={value?.repeat?.period}\n onChange={(e) => setPeriod(parseInt(e.currentTarget.value))}\n />\n <NativeSelect\n id=\"timing-dialog-periodUnit\"\n name=\"timing-dialog-periodUnit\"\n defaultValue={value?.repeat?.periodUnit}\n onChange={(e) => setPeriodUnit(e.currentTarget.value as 'a' | 'd' | 'wk' | 'mo' | undefined)}\n data={[\n { label: 'day', value: 'd' },\n { label: 'week', value: 'wk' },\n { label: 'month', value: 'mo' },\n { label: 'year', value: 'a' },\n ]}\n />\n </Group>\n </FormSection>\n <FormSection title=\"Repeat on\">\n <Group spacing=\"xs\" grow noWrap>\n {daysOfWeek.map((day) => (\n <React.Fragment key={day}>\n <label htmlFor={'timing-dialog-repeat-' + day}>{day.charAt(0).toUpperCase()}</label>\n <Checkbox\n id={'timing-dialog-repeat-' + day}\n name={'timing-dialog-repeat-' + day}\n onChange={(e) => setDayOfWeek(day as DayOfWeek, e.currentTarget.checked)}\n />\n </React.Fragment>\n ))}\n </Group>\n </FormSection>\n </div>\n <Button onClick={() => props.onOk(value)}>OK</Button>\n </Modal>\n );\n}\n"],"names":["React"],"mappings":"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"}
1
+ {"version":3,"file":"TimingInput.mjs","sources":["../../../src/TimingInput/TimingInput.tsx"],"sourcesContent":["import { Button, Checkbox, Group, Modal, NativeSelect, TextInput } from '@mantine/core';\nimport { formatTiming } from '@medplum/core';\nimport { Timing, TimingRepeat } from '@medplum/fhirtypes';\nimport React, { useRef, useState } from 'react';\nimport { DateTimeInput } from '../DateTimeInput/DateTimeInput';\nimport { FormSection } from '../FormSection/FormSection';\n\nconst daysOfWeek = ['sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat'];\n\ntype DayOfWeek = 'sun' | 'mon' | 'tue' | 'wed' | 'thu' | 'fri' | 'sat';\n\nexport interface TimingInputProps {\n name: string;\n defaultValue?: Timing;\n onChange?: (newValue: Timing) => void;\n}\n\nexport function TimingInput(props: TimingInputProps): JSX.Element {\n const [value, setValue] = useState<Timing>(props.defaultValue || {});\n const [open, setOpen] = useState(false);\n\n const valueRef = useRef<Timing>();\n valueRef.current = value;\n\n return (\n <>\n <Group spacing=\"xs\" grow noWrap>\n <span>{formatTiming(valueRef.current) || 'No repeat'}</span>\n <Button onClick={() => setOpen(true)}>Edit</Button>\n </Group>\n <TimingEditorDialog\n visible={open}\n defaultValue={valueRef.current}\n onOk={(newValue) => {\n if (props.onChange) {\n props.onChange(newValue);\n }\n setValue(newValue);\n setOpen(false);\n }}\n onCancel={() => setOpen(false)}\n />\n </>\n );\n}\n\ninterface TimingEditorDialogProps {\n visible: boolean;\n defaultValue?: Timing;\n onOk: (newValue: Timing) => void;\n onCancel: () => void;\n}\n\nfunction TimingEditorDialog(props: TimingEditorDialogProps): JSX.Element {\n const [value, setValue] = useState<Timing>(props.defaultValue || {});\n\n const valueRef = useRef<Timing>();\n valueRef.current = value;\n\n function setStart(newStart: string): void {\n setValue({ ...valueRef.current, event: [newStart] });\n }\n\n function setRepeat(repeat: TimingRepeat): void {\n setValue({ ...valueRef.current, repeat });\n }\n\n function setPeriod(newPeriod: number | undefined): void {\n setRepeat({ ...valueRef.current?.repeat, period: newPeriod });\n }\n\n function setPeriodUnit(newPeriodUnit: 'a' | 's' | 'min' | 'h' | 'd' | 'wk' | 'mo' | undefined): void {\n setRepeat({ ...valueRef.current?.repeat, periodUnit: newPeriodUnit });\n }\n\n function setDayOfWeek(day: DayOfWeek, enabled: boolean): void {\n if (enabled) {\n addDayOfWeek(day);\n } else {\n removeDayOfWeek(day);\n }\n }\n\n function addDayOfWeek(day: DayOfWeek): void {\n const existing = valueRef.current?.repeat?.dayOfWeek || [];\n if (!existing.includes(day)) {\n setRepeat({ ...valueRef.current?.repeat, dayOfWeek: [...existing, day] });\n }\n }\n\n function removeDayOfWeek(day: DayOfWeek): void {\n const existing = valueRef.current?.repeat?.dayOfWeek || [];\n if (existing.includes(day)) {\n setRepeat({ ...valueRef.current?.repeat, dayOfWeek: existing.filter((d) => d !== day) });\n }\n }\n\n return (\n <Modal title=\"Timing\" closeButtonLabel=\"Close\" opened={props.visible} onClose={() => props.onCancel()}>\n <div style={{ padding: '5px 20px', textAlign: 'left' }}>\n <FormSection title=\"Starts on\" htmlFor={'timing-dialog-start'}>\n <DateTimeInput name={'timing-dialog-start'} onChange={(newValue) => setStart(newValue)} />\n </FormSection>\n <FormSection title=\"Repeat every\" htmlFor={'timing-dialog-period'}>\n <Group spacing=\"xs\" grow noWrap>\n <TextInput\n type=\"number\"\n step={1}\n id=\"timing-dialog-period\"\n name=\"timing-dialog-period\"\n defaultValue={value?.repeat?.period}\n onChange={(e) => setPeriod(parseInt(e.currentTarget.value))}\n />\n <NativeSelect\n id=\"timing-dialog-periodUnit\"\n name=\"timing-dialog-periodUnit\"\n defaultValue={value?.repeat?.periodUnit}\n onChange={(e) => setPeriodUnit(e.currentTarget.value as 'a' | 'd' | 'wk' | 'mo' | undefined)}\n data={[\n { label: 'day', value: 'd' },\n { label: 'week', value: 'wk' },\n { label: 'month', value: 'mo' },\n { label: 'year', value: 'a' },\n ]}\n />\n </Group>\n </FormSection>\n <FormSection title=\"Repeat on\">\n <Group spacing=\"xs\" grow noWrap>\n {daysOfWeek.map((day) => (\n <React.Fragment key={day}>\n <label htmlFor={'timing-dialog-repeat-' + day}>{day.charAt(0).toUpperCase()}</label>\n <Checkbox\n id={'timing-dialog-repeat-' + day}\n name={'timing-dialog-repeat-' + day}\n onChange={(e) => setDayOfWeek(day as DayOfWeek, e.currentTarget.checked)}\n />\n </React.Fragment>\n ))}\n </Group>\n </FormSection>\n </div>\n <Button onClick={() => props.onOk(value)}>OK</Button>\n </Modal>\n );\n}\n"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import e__default, { useCallback } from 'react';
1
+ import React, { useCallback } from 'react';
2
2
  import { AsyncAutocomplete } from '../AsyncAutocomplete/AsyncAutocomplete.mjs';
3
3
  import { useMedplum } from '../MedplumProvider/MedplumProvider.mjs';
4
4
 
@@ -33,7 +33,7 @@ function ValueSetAutocomplete(props) {
33
33
  }
34
34
  return newData;
35
35
  }, [medplum, elementDefinition]);
36
- return (e__default.createElement(AsyncAutocomplete, { ...rest, creatable: true, clearable: true, toKey: toKey, toOption: toOption, loadOptions: loadValues, getCreateLabel: (query) => `+ Create ${query}`, onCreate: createValue }));
36
+ return (React.createElement(AsyncAutocomplete, { ...rest, creatable: true, clearable: true, toKey: toKey, toOption: toOption, loadOptions: loadValues, getCreateLabel: (query) => `+ Create ${query}`, onCreate: createValue }));
37
37
  }
38
38
  function getDisplay(item) {
39
39
  return item.display || item.code || '';
@@ -1 +1 @@
1
- {"version":3,"file":"ValueSetAutocomplete.mjs","sources":["../../../src/ValueSetAutocomplete/ValueSetAutocomplete.tsx"],"sourcesContent":["import { ElementDefinition, ValueSetExpansionContains } from '@medplum/fhirtypes';\nimport React, { useCallback } from 'react';\nimport {\n AsyncAutocomplete,\n AsyncAutocompleteOption,\n AsyncAutocompleteProps,\n} from '../AsyncAutocomplete/AsyncAutocomplete';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\n\nexport interface ValueSetAutocompleteProps\n extends Omit<AsyncAutocompleteProps<ValueSetExpansionContains>, 'loadOptions' | 'toKey' | 'toOption'> {\n elementDefinition: ElementDefinition;\n}\n\nfunction toKey(element: ValueSetExpansionContains): string {\n return element.code as string;\n}\n\nfunction toOption(element: ValueSetExpansionContains): AsyncAutocompleteOption<ValueSetExpansionContains> {\n return {\n value: element.code as string,\n label: getDisplay(element),\n resource: element,\n };\n}\n\nfunction createValue(input: string): ValueSetExpansionContains {\n return {\n code: input,\n display: input,\n };\n}\n\nexport function ValueSetAutocomplete(props: ValueSetAutocompleteProps): JSX.Element {\n const medplum = useMedplum();\n const { elementDefinition, ...rest } = props;\n\n const loadValues = useCallback(\n async (input: string, signal: AbortSignal): Promise<ValueSetExpansionContains[]> => {\n const system = elementDefinition.binding?.valueSet as string;\n const valueSet = await medplum.searchValueSet(system, input, { signal });\n const valueSetElements = valueSet.expansion?.contains as ValueSetExpansionContains[];\n const newData: ValueSetExpansionContains[] = [];\n\n for (const valueSetElement of valueSetElements) {\n if (valueSetElement.code && !newData.some((item) => item.code === valueSetElement.code)) {\n newData.push(valueSetElement);\n }\n }\n\n return newData;\n },\n [medplum, elementDefinition]\n );\n\n return (\n <AsyncAutocomplete\n {...rest}\n creatable\n clearable\n toKey={toKey}\n toOption={toOption}\n loadOptions={loadValues}\n getCreateLabel={(query) => `+ Create ${query}`}\n onCreate={createValue}\n />\n );\n}\n\nfunction getDisplay(item: ValueSetExpansionContains): string {\n return item.display || item.code || '';\n}\n"],"names":["React"],"mappings":";;;;AAcA,SAAS,KAAK,CAAC,OAAkC,EAAA;IAC/C,OAAO,OAAO,CAAC,IAAc,CAAC;AAChC,CAAC;AAED,SAAS,QAAQ,CAAC,OAAkC,EAAA;IAClD,OAAO;QACL,KAAK,EAAE,OAAO,CAAC,IAAc;AAC7B,QAAA,KAAK,EAAE,UAAU,CAAC,OAAO,CAAC;AAC1B,QAAA,QAAQ,EAAE,OAAO;KAClB,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,KAAa,EAAA;IAChC,OAAO;AACL,QAAA,IAAI,EAAE,KAAK;AACX,QAAA,OAAO,EAAE,KAAK;KACf,CAAC;AACJ,CAAC;AAEK,SAAU,oBAAoB,CAAC,KAAgC,EAAA;AACnE,IAAA,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,MAAM,EAAE,iBAAiB,EAAE,GAAG,IAAI,EAAE,GAAG,KAAK,CAAC;IAE7C,MAAM,UAAU,GAAG,WAAW,CAC5B,OAAO,KAAa,EAAE,MAAmB,KAA0C;AACjF,QAAA,MAAM,MAAM,GAAG,iBAAiB,CAAC,OAAO,EAAE,QAAkB,CAAC;AAC7D,QAAA,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,cAAc,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;AACzE,QAAA,MAAM,gBAAgB,GAAG,QAAQ,CAAC,SAAS,EAAE,QAAuC,CAAC;QACrF,MAAM,OAAO,GAAgC,EAAE,CAAC;AAEhD,QAAA,KAAK,MAAM,eAAe,IAAI,gBAAgB,EAAE;YAC9C,IAAI,eAAe,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK,eAAe,CAAC,IAAI,CAAC,EAAE;AACvF,gBAAA,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;AAC/B,aAAA;AACF,SAAA;AAED,QAAA,OAAO,OAAO,CAAC;AACjB,KAAC,EACD,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAC7B,CAAC;AAEF,IAAA,QACEA,UAAC,CAAA,aAAA,CAAA,iBAAiB,EACZ,EAAA,GAAA,IAAI,EACR,SAAS,EAAA,IAAA,EACT,SAAS,EAAA,IAAA,EACT,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,QAAQ,EAClB,WAAW,EAAE,UAAU,EACvB,cAAc,EAAE,CAAC,KAAK,KAAK,CAAY,SAAA,EAAA,KAAK,EAAE,EAC9C,QAAQ,EAAE,WAAW,EAAA,CACrB,EACF;AACJ,CAAC;AAED,SAAS,UAAU,CAAC,IAA+B,EAAA;IACjD,OAAO,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;AACzC;;;;"}
1
+ {"version":3,"file":"ValueSetAutocomplete.mjs","sources":["../../../src/ValueSetAutocomplete/ValueSetAutocomplete.tsx"],"sourcesContent":["import { ElementDefinition, ValueSetExpansionContains } from '@medplum/fhirtypes';\nimport React, { useCallback } from 'react';\nimport {\n AsyncAutocomplete,\n AsyncAutocompleteOption,\n AsyncAutocompleteProps,\n} from '../AsyncAutocomplete/AsyncAutocomplete';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\n\nexport interface ValueSetAutocompleteProps\n extends Omit<AsyncAutocompleteProps<ValueSetExpansionContains>, 'loadOptions' | 'toKey' | 'toOption'> {\n elementDefinition: ElementDefinition;\n}\n\nfunction toKey(element: ValueSetExpansionContains): string {\n return element.code as string;\n}\n\nfunction toOption(element: ValueSetExpansionContains): AsyncAutocompleteOption<ValueSetExpansionContains> {\n return {\n value: element.code as string,\n label: getDisplay(element),\n resource: element,\n };\n}\n\nfunction createValue(input: string): ValueSetExpansionContains {\n return {\n code: input,\n display: input,\n };\n}\n\nexport function ValueSetAutocomplete(props: ValueSetAutocompleteProps): JSX.Element {\n const medplum = useMedplum();\n const { elementDefinition, ...rest } = props;\n\n const loadValues = useCallback(\n async (input: string, signal: AbortSignal): Promise<ValueSetExpansionContains[]> => {\n const system = elementDefinition.binding?.valueSet as string;\n const valueSet = await medplum.searchValueSet(system, input, { signal });\n const valueSetElements = valueSet.expansion?.contains as ValueSetExpansionContains[];\n const newData: ValueSetExpansionContains[] = [];\n\n for (const valueSetElement of valueSetElements) {\n if (valueSetElement.code && !newData.some((item) => item.code === valueSetElement.code)) {\n newData.push(valueSetElement);\n }\n }\n\n return newData;\n },\n [medplum, elementDefinition]\n );\n\n return (\n <AsyncAutocomplete\n {...rest}\n creatable\n clearable\n toKey={toKey}\n toOption={toOption}\n loadOptions={loadValues}\n getCreateLabel={(query) => `+ Create ${query}`}\n onCreate={createValue}\n />\n );\n}\n\nfunction getDisplay(item: ValueSetExpansionContains): string {\n return item.display || item.code || '';\n}\n"],"names":[],"mappings":";;;;AAcA,SAAS,KAAK,CAAC,OAAkC,EAAA;IAC/C,OAAO,OAAO,CAAC,IAAc,CAAC;AAChC,CAAC;AAED,SAAS,QAAQ,CAAC,OAAkC,EAAA;IAClD,OAAO;QACL,KAAK,EAAE,OAAO,CAAC,IAAc;AAC7B,QAAA,KAAK,EAAE,UAAU,CAAC,OAAO,CAAC;AAC1B,QAAA,QAAQ,EAAE,OAAO;KAClB,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,KAAa,EAAA;IAChC,OAAO;AACL,QAAA,IAAI,EAAE,KAAK;AACX,QAAA,OAAO,EAAE,KAAK;KACf,CAAC;AACJ,CAAC;AAEK,SAAU,oBAAoB,CAAC,KAAgC,EAAA;AACnE,IAAA,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,MAAM,EAAE,iBAAiB,EAAE,GAAG,IAAI,EAAE,GAAG,KAAK,CAAC;IAE7C,MAAM,UAAU,GAAG,WAAW,CAC5B,OAAO,KAAa,EAAE,MAAmB,KAA0C;AACjF,QAAA,MAAM,MAAM,GAAG,iBAAiB,CAAC,OAAO,EAAE,QAAkB,CAAC;AAC7D,QAAA,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,cAAc,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;AACzE,QAAA,MAAM,gBAAgB,GAAG,QAAQ,CAAC,SAAS,EAAE,QAAuC,CAAC;QACrF,MAAM,OAAO,GAAgC,EAAE,CAAC;AAEhD,QAAA,KAAK,MAAM,eAAe,IAAI,gBAAgB,EAAE;YAC9C,IAAI,eAAe,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK,eAAe,CAAC,IAAI,CAAC,EAAE;AACvF,gBAAA,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;AAC/B,aAAA;AACF,SAAA;AAED,QAAA,OAAO,OAAO,CAAC;AACjB,KAAC,EACD,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAC7B,CAAC;AAEF,IAAA,QACE,KAAC,CAAA,aAAA,CAAA,iBAAiB,EACZ,EAAA,GAAA,IAAI,EACR,SAAS,EAAA,IAAA,EACT,SAAS,EAAA,IAAA,EACT,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,QAAQ,EAClB,WAAW,EAAE,UAAU,EACvB,cAAc,EAAE,CAAC,KAAK,KAAK,CAAY,SAAA,EAAA,KAAK,EAAE,EAC9C,QAAQ,EAAE,WAAW,EAAA,CACrB,EACF;AACJ,CAAC;AAED,SAAS,UAAU,CAAC,IAA+B,EAAA;IACjD,OAAO,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;AACzC;;;;"}
@@ -1,6 +1,7 @@
1
1
  import { BaseLoginRequest, LoginAuthenticationResponse } from '@medplum/core';
2
2
  import React from 'react';
3
3
  export interface AuthenticationFormProps extends BaseLoginRequest {
4
+ readonly disableGoogleAuth?: boolean;
4
5
  readonly onForgotPassword?: () => void;
5
6
  readonly onRegister?: () => void;
6
7
  readonly handleAuthResponse: (response: LoginAuthenticationResponse) => void;
@@ -8,7 +9,7 @@ export interface AuthenticationFormProps extends BaseLoginRequest {
8
9
  }
9
10
  export declare function AuthenticationForm(props: AuthenticationFormProps): JSX.Element;
10
11
  export interface EmailFormProps extends BaseLoginRequest {
11
- readonly generatePkce?: boolean;
12
+ readonly disableGoogleAuth?: boolean;
12
13
  readonly onRegister?: () => void;
13
14
  readonly handleAuthResponse: (response: LoginAuthenticationResponse) => void;
14
15
  readonly setEmail: (email: string) => void;
@@ -1,5 +1,5 @@
1
1
  import { Center, Group, Divider, TextInput, Anchor, Button, Stack, PasswordInput, Checkbox } from '@mantine/core';
2
- import e__default, { useState, useCallback } from 'react';
2
+ import React, { useState, useCallback } from 'react';
3
3
  import { Form } from '../Form/Form.mjs';
4
4
  import { getGoogleClientId, GoogleButton } from '../GoogleButton/GoogleButton.mjs';
5
5
  import { useMedplum } from '../MedplumProvider/MedplumProvider.mjs';
@@ -9,16 +9,16 @@ import { getIssuesForExpression, getErrorsForInput } from '../utils/outcomes.mjs
9
9
  function AuthenticationForm(props) {
10
10
  const [email, setEmail] = useState();
11
11
  if (!email) {
12
- return e__default.createElement(EmailForm, { setEmail: setEmail, ...props });
12
+ return React.createElement(EmailForm, { setEmail: setEmail, ...props });
13
13
  }
14
14
  else {
15
- return e__default.createElement(PasswordForm, { email: email, ...props });
15
+ return React.createElement(PasswordForm, { email: email, ...props });
16
16
  }
17
17
  }
18
18
  function EmailForm(props) {
19
19
  const { setEmail, onRegister, handleAuthResponse, children, ...baseLoginRequest } = props;
20
20
  const medplum = useMedplum();
21
- const googleClientId = getGoogleClientId(props.googleClientId);
21
+ const googleClientId = !props.disableGoogleAuth && getGoogleClientId(props.googleClientId);
22
22
  const isExternalAuth = useCallback(async (authMethod) => {
23
23
  if (!authMethod.authorizeUrl) {
24
24
  return false;
@@ -47,16 +47,16 @@ function EmailForm(props) {
47
47
  handleAuthResponse(authResponse);
48
48
  }
49
49
  }, [medplum, baseLoginRequest, isExternalAuth, handleAuthResponse]);
50
- return (e__default.createElement(Form, { style: { maxWidth: 400 }, onSubmit: handleSubmit },
51
- e__default.createElement(Center, { sx: { flexDirection: 'column' } }, children),
52
- googleClientId && (e__default.createElement(e__default.Fragment, null,
53
- e__default.createElement(Group, { position: "center", p: "xl", style: { height: 70 } },
54
- e__default.createElement(GoogleButton, { googleClientId: googleClientId, handleGoogleCredential: handleGoogleCredential })),
55
- e__default.createElement(Divider, { label: "or", labelPosition: "center", my: "lg" }))),
56
- e__default.createElement(TextInput, { name: "email", type: "email", label: "Email", placeholder: "name@domain.com", required: true, autoFocus: true }),
57
- e__default.createElement(Group, { position: "apart", mt: "xl", spacing: 0, noWrap: true },
58
- onRegister && (e__default.createElement(Anchor, { component: "button", type: "button", color: "dimmed", onClick: onRegister, size: "xs" }, "Register")),
59
- e__default.createElement(Button, { type: "submit" }, "Next"))));
50
+ return (React.createElement(Form, { style: { maxWidth: 400 }, onSubmit: handleSubmit },
51
+ React.createElement(Center, { sx: { flexDirection: 'column' } }, children),
52
+ googleClientId && (React.createElement(React.Fragment, null,
53
+ React.createElement(Group, { position: "center", p: "xl", style: { height: 70 } },
54
+ React.createElement(GoogleButton, { googleClientId: googleClientId, handleGoogleCredential: handleGoogleCredential })),
55
+ React.createElement(Divider, { label: "or", labelPosition: "center", my: "lg" }))),
56
+ React.createElement(TextInput, { name: "email", type: "email", label: "Email", placeholder: "name@domain.com", required: true, autoFocus: true }),
57
+ React.createElement(Group, { position: "apart", mt: "xl", spacing: 0, noWrap: true },
58
+ onRegister && (React.createElement(Anchor, { component: "button", type: "button", color: "dimmed", onClick: onRegister, size: "xs" }, "Register")),
59
+ React.createElement(Button, { type: "submit" }, "Next"))));
60
60
  }
61
61
  function PasswordForm(props) {
62
62
  const { onForgotPassword, handleAuthResponse, children, ...baseLoginRequest } = props;
@@ -73,15 +73,15 @@ function PasswordForm(props) {
73
73
  .then(handleAuthResponse)
74
74
  .catch(setOutcome);
75
75
  }, [medplum, baseLoginRequest, handleAuthResponse]);
76
- return (e__default.createElement(Form, { style: { maxWidth: 400 }, onSubmit: handleSubmit },
77
- e__default.createElement(Center, { sx: { flexDirection: 'column' } }, children),
78
- e__default.createElement(OperationOutcomeAlert, { issues: issues }),
79
- e__default.createElement(Stack, { spacing: "xl" },
80
- e__default.createElement(PasswordInput, { name: "password", type: "password", label: "Password", autoComplete: "off", required: true, error: getErrorsForInput(outcome, 'password') })),
81
- e__default.createElement(Group, { position: "apart", mt: "xl", spacing: 0, noWrap: true },
82
- onForgotPassword && (e__default.createElement(Anchor, { component: "button", type: "button", color: "dimmed", onClick: onForgotPassword, size: "xs" }, "Forgot password")),
83
- e__default.createElement(Checkbox, { id: "remember", name: "remember", label: "Remember me", size: "xs", sx: { lineHeight: 1 } }),
84
- e__default.createElement(Button, { type: "submit" }, "Sign in"))));
76
+ return (React.createElement(Form, { style: { maxWidth: 400 }, onSubmit: handleSubmit },
77
+ React.createElement(Center, { sx: { flexDirection: 'column' } }, children),
78
+ React.createElement(OperationOutcomeAlert, { issues: issues }),
79
+ React.createElement(Stack, { spacing: "xl" },
80
+ React.createElement(PasswordInput, { name: "password", label: "Password", autoComplete: "off", required: true, error: getErrorsForInput(outcome, 'password') })),
81
+ React.createElement(Group, { position: "apart", mt: "xl", spacing: 0, noWrap: true },
82
+ onForgotPassword && (React.createElement(Anchor, { component: "button", type: "button", color: "dimmed", onClick: onForgotPassword, size: "xs" }, "Forgot password")),
83
+ React.createElement(Checkbox, { id: "remember", name: "remember", label: "Remember me", size: "xs", sx: { lineHeight: 1 } }),
84
+ React.createElement(Button, { type: "submit" }, "Sign in"))));
85
85
  }
86
86
 
87
87
  export { AuthenticationForm, EmailForm, PasswordForm };
@@ -1 +1 @@
1
- {"version":3,"file":"AuthenticationForm.mjs","sources":["../../../src/auth/AuthenticationForm.tsx"],"sourcesContent":["import { Anchor, Button, Center, Checkbox, Divider, Group, PasswordInput, Stack, TextInput } from '@mantine/core';\nimport {\n BaseLoginRequest,\n GoogleCredentialResponse,\n GoogleLoginRequest,\n LoginAuthenticationResponse,\n} from '@medplum/core';\nimport { OperationOutcome } from '@medplum/fhirtypes';\nimport React, { useCallback, useState } from 'react';\nimport { Form } from '../Form/Form';\nimport { getGoogleClientId, GoogleButton } from '../GoogleButton/GoogleButton';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\nimport { OperationOutcomeAlert } from '../OperationOutcomeAlert/OperationOutcomeAlert';\nimport { getErrorsForInput, getIssuesForExpression } from '../utils/outcomes';\n\nexport interface AuthenticationFormProps extends BaseLoginRequest {\n readonly onForgotPassword?: () => void;\n readonly onRegister?: () => void;\n readonly handleAuthResponse: (response: LoginAuthenticationResponse) => void;\n readonly children?: React.ReactNode;\n}\n\nexport function AuthenticationForm(props: AuthenticationFormProps): JSX.Element {\n const [email, setEmail] = useState<string>();\n\n if (!email) {\n return <EmailForm setEmail={setEmail} {...props} />;\n } else {\n return <PasswordForm email={email} {...props} />;\n }\n}\n\nexport interface EmailFormProps extends BaseLoginRequest {\n readonly generatePkce?: boolean;\n readonly onRegister?: () => void;\n readonly handleAuthResponse: (response: LoginAuthenticationResponse) => void;\n readonly setEmail: (email: string) => void;\n readonly children?: React.ReactNode;\n}\n\nexport function EmailForm(props: EmailFormProps): JSX.Element {\n const { setEmail, onRegister, handleAuthResponse, children, ...baseLoginRequest } = props;\n const medplum = useMedplum();\n const googleClientId = getGoogleClientId(props.googleClientId);\n\n const isExternalAuth = useCallback(\n async (authMethod: any): Promise<boolean> => {\n if (!authMethod.authorizeUrl) {\n return false;\n }\n\n const state = JSON.stringify({\n ...(await medplum.ensureCodeChallenge(baseLoginRequest)),\n domain: authMethod.domain,\n });\n const url = new URL(authMethod.authorizeUrl);\n url.searchParams.set('state', state);\n window.location.assign(url.toString());\n return true;\n },\n [medplum, baseLoginRequest]\n );\n\n const handleSubmit = useCallback(\n async (formData: Record<string, string>) => {\n const authMethod = await medplum.post('auth/method', { email: formData.email });\n if (!(await isExternalAuth(authMethod))) {\n setEmail(formData.email);\n }\n },\n [medplum, isExternalAuth, setEmail]\n );\n\n const handleGoogleCredential = useCallback(\n async (response: GoogleCredentialResponse) => {\n const authResponse = await medplum.startGoogleLogin({\n ...baseLoginRequest,\n googleCredential: response.credential,\n } as GoogleLoginRequest);\n if (!(await isExternalAuth(authResponse))) {\n handleAuthResponse(authResponse);\n }\n },\n [medplum, baseLoginRequest, isExternalAuth, handleAuthResponse]\n );\n\n return (\n <Form style={{ maxWidth: 400 }} onSubmit={handleSubmit}>\n <Center sx={{ flexDirection: 'column' }}>{children}</Center>\n {googleClientId && (\n <>\n <Group position=\"center\" p=\"xl\" style={{ height: 70 }}>\n <GoogleButton googleClientId={googleClientId} handleGoogleCredential={handleGoogleCredential} />\n </Group>\n <Divider label=\"or\" labelPosition=\"center\" my=\"lg\" />\n </>\n )}\n <TextInput\n name=\"email\"\n type=\"email\"\n label=\"Email\"\n placeholder=\"name@domain.com\"\n required={true}\n autoFocus={true}\n />\n <Group position=\"apart\" mt=\"xl\" spacing={0} noWrap>\n {onRegister && (\n <Anchor component=\"button\" type=\"button\" color=\"dimmed\" onClick={onRegister} size=\"xs\">\n Register\n </Anchor>\n )}\n <Button type=\"submit\">Next</Button>\n </Group>\n </Form>\n );\n}\n\nexport interface PasswordFormProps extends BaseLoginRequest {\n readonly email: string;\n readonly onForgotPassword?: () => void;\n readonly handleAuthResponse: (response: LoginAuthenticationResponse) => void;\n readonly children?: React.ReactNode;\n}\n\nexport function PasswordForm(props: PasswordFormProps): JSX.Element {\n const { onForgotPassword, handleAuthResponse, children, ...baseLoginRequest } = props;\n const medplum = useMedplum();\n const [outcome, setOutcome] = useState<OperationOutcome>();\n const issues = getIssuesForExpression(outcome, undefined);\n\n const handleSubmit = useCallback(\n (formData: Record<string, string>) => {\n medplum\n .startLogin({\n ...baseLoginRequest,\n password: formData.password,\n remember: formData.remember === 'on',\n })\n .then(handleAuthResponse)\n .catch(setOutcome);\n },\n [medplum, baseLoginRequest, handleAuthResponse]\n );\n\n return (\n <Form style={{ maxWidth: 400 }} onSubmit={handleSubmit}>\n <Center sx={{ flexDirection: 'column' }}>{children}</Center>\n <OperationOutcomeAlert issues={issues} />\n <Stack spacing=\"xl\">\n <PasswordInput\n name=\"password\"\n type=\"password\"\n label=\"Password\"\n autoComplete=\"off\"\n required={true}\n error={getErrorsForInput(outcome, 'password')}\n />\n </Stack>\n <Group position=\"apart\" mt=\"xl\" spacing={0} noWrap>\n {onForgotPassword && (\n <Anchor component=\"button\" type=\"button\" color=\"dimmed\" onClick={onForgotPassword} size=\"xs\">\n Forgot password\n </Anchor>\n )}\n <Checkbox id=\"remember\" name=\"remember\" label=\"Remember me\" size=\"xs\" sx={{ lineHeight: 1 }} />\n <Button type=\"submit\">Sign in</Button>\n </Group>\n </Form>\n );\n}\n"],"names":["React"],"mappings":"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"}
1
+ {"version":3,"file":"AuthenticationForm.mjs","sources":["../../../src/auth/AuthenticationForm.tsx"],"sourcesContent":["import { Anchor, Button, Center, Checkbox, Divider, Group, PasswordInput, Stack, TextInput } from '@mantine/core';\nimport {\n BaseLoginRequest,\n GoogleCredentialResponse,\n GoogleLoginRequest,\n LoginAuthenticationResponse,\n} from '@medplum/core';\nimport { OperationOutcome } from '@medplum/fhirtypes';\nimport React, { useCallback, useState } from 'react';\nimport { Form } from '../Form/Form';\nimport { getGoogleClientId, GoogleButton } from '../GoogleButton/GoogleButton';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\nimport { OperationOutcomeAlert } from '../OperationOutcomeAlert/OperationOutcomeAlert';\nimport { getErrorsForInput, getIssuesForExpression } from '../utils/outcomes';\n\nexport interface AuthenticationFormProps extends BaseLoginRequest {\n readonly disableGoogleAuth?: boolean;\n readonly onForgotPassword?: () => void;\n readonly onRegister?: () => void;\n readonly handleAuthResponse: (response: LoginAuthenticationResponse) => void;\n readonly children?: React.ReactNode;\n}\n\nexport function AuthenticationForm(props: AuthenticationFormProps): JSX.Element {\n const [email, setEmail] = useState<string>();\n\n if (!email) {\n return <EmailForm setEmail={setEmail} {...props} />;\n } else {\n return <PasswordForm email={email} {...props} />;\n }\n}\n\nexport interface EmailFormProps extends BaseLoginRequest {\n readonly disableGoogleAuth?: boolean;\n readonly onRegister?: () => void;\n readonly handleAuthResponse: (response: LoginAuthenticationResponse) => void;\n readonly setEmail: (email: string) => void;\n readonly children?: React.ReactNode;\n}\n\nexport function EmailForm(props: EmailFormProps): JSX.Element {\n const { setEmail, onRegister, handleAuthResponse, children, ...baseLoginRequest } = props;\n const medplum = useMedplum();\n const googleClientId = !props.disableGoogleAuth && getGoogleClientId(props.googleClientId);\n\n const isExternalAuth = useCallback(\n async (authMethod: any): Promise<boolean> => {\n if (!authMethod.authorizeUrl) {\n return false;\n }\n\n const state = JSON.stringify({\n ...(await medplum.ensureCodeChallenge(baseLoginRequest)),\n domain: authMethod.domain,\n });\n const url = new URL(authMethod.authorizeUrl);\n url.searchParams.set('state', state);\n window.location.assign(url.toString());\n return true;\n },\n [medplum, baseLoginRequest]\n );\n\n const handleSubmit = useCallback(\n async (formData: Record<string, string>) => {\n const authMethod = await medplum.post('auth/method', { email: formData.email });\n if (!(await isExternalAuth(authMethod))) {\n setEmail(formData.email);\n }\n },\n [medplum, isExternalAuth, setEmail]\n );\n\n const handleGoogleCredential = useCallback(\n async (response: GoogleCredentialResponse) => {\n const authResponse = await medplum.startGoogleLogin({\n ...baseLoginRequest,\n googleCredential: response.credential,\n } as GoogleLoginRequest);\n if (!(await isExternalAuth(authResponse))) {\n handleAuthResponse(authResponse);\n }\n },\n [medplum, baseLoginRequest, isExternalAuth, handleAuthResponse]\n );\n\n return (\n <Form style={{ maxWidth: 400 }} onSubmit={handleSubmit}>\n <Center sx={{ flexDirection: 'column' }}>{children}</Center>\n {googleClientId && (\n <>\n <Group position=\"center\" p=\"xl\" style={{ height: 70 }}>\n <GoogleButton googleClientId={googleClientId} handleGoogleCredential={handleGoogleCredential} />\n </Group>\n <Divider label=\"or\" labelPosition=\"center\" my=\"lg\" />\n </>\n )}\n <TextInput\n name=\"email\"\n type=\"email\"\n label=\"Email\"\n placeholder=\"name@domain.com\"\n required={true}\n autoFocus={true}\n />\n <Group position=\"apart\" mt=\"xl\" spacing={0} noWrap>\n {onRegister && (\n <Anchor component=\"button\" type=\"button\" color=\"dimmed\" onClick={onRegister} size=\"xs\">\n Register\n </Anchor>\n )}\n <Button type=\"submit\">Next</Button>\n </Group>\n </Form>\n );\n}\n\nexport interface PasswordFormProps extends BaseLoginRequest {\n readonly email: string;\n readonly onForgotPassword?: () => void;\n readonly handleAuthResponse: (response: LoginAuthenticationResponse) => void;\n readonly children?: React.ReactNode;\n}\n\nexport function PasswordForm(props: PasswordFormProps): JSX.Element {\n const { onForgotPassword, handleAuthResponse, children, ...baseLoginRequest } = props;\n const medplum = useMedplum();\n const [outcome, setOutcome] = useState<OperationOutcome>();\n const issues = getIssuesForExpression(outcome, undefined);\n\n const handleSubmit = useCallback(\n (formData: Record<string, string>) => {\n medplum\n .startLogin({\n ...baseLoginRequest,\n password: formData.password,\n remember: formData.remember === 'on',\n })\n .then(handleAuthResponse)\n .catch(setOutcome);\n },\n [medplum, baseLoginRequest, handleAuthResponse]\n );\n\n return (\n <Form style={{ maxWidth: 400 }} onSubmit={handleSubmit}>\n <Center sx={{ flexDirection: 'column' }}>{children}</Center>\n <OperationOutcomeAlert issues={issues} />\n <Stack spacing=\"xl\">\n <PasswordInput\n name=\"password\"\n label=\"Password\"\n autoComplete=\"off\"\n required={true}\n error={getErrorsForInput(outcome, 'password')}\n />\n </Stack>\n <Group position=\"apart\" mt=\"xl\" spacing={0} noWrap>\n {onForgotPassword && (\n <Anchor component=\"button\" type=\"button\" color=\"dimmed\" onClick={onForgotPassword} size=\"xs\">\n Forgot password\n </Anchor>\n )}\n <Checkbox id=\"remember\" name=\"remember\" label=\"Remember me\" size=\"xs\" sx={{ lineHeight: 1 }} />\n <Button type=\"submit\">Sign in</Button>\n </Group>\n </Form>\n );\n}\n"],"names":[],"mappings":"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"}
@@ -1,15 +1,15 @@
1
1
  import { Stack, Center, Title, UnstyledButton, Group, Avatar, Text } from '@mantine/core';
2
- import e__default from 'react';
2
+ import React from 'react';
3
3
  import { Logo } from '../Logo/Logo.mjs';
4
4
  import { useMedplum } from '../MedplumProvider/MedplumProvider.mjs';
5
5
 
6
6
  function ChooseProfileForm(props) {
7
7
  const medplum = useMedplum();
8
- return (e__default.createElement(Stack, null,
9
- e__default.createElement(Center, { sx: { flexDirection: 'column' } },
10
- e__default.createElement(Logo, { size: 32 }),
11
- e__default.createElement(Title, null, "Choose profile")),
12
- props.memberships.map((membership) => (e__default.createElement(UnstyledButton, { key: membership.id, onClick: () => {
8
+ return (React.createElement(Stack, null,
9
+ React.createElement(Center, { sx: { flexDirection: 'column' } },
10
+ React.createElement(Logo, { size: 32 }),
11
+ React.createElement(Title, null, "Choose profile")),
12
+ props.memberships.map((membership) => (React.createElement(UnstyledButton, { key: membership.id, onClick: () => {
13
13
  medplum
14
14
  .post('auth/profile', {
15
15
  login: props.login,
@@ -18,11 +18,11 @@ function ChooseProfileForm(props) {
18
18
  .then(props.handleAuthResponse)
19
19
  .catch(console.log);
20
20
  } },
21
- e__default.createElement(Group, null,
22
- e__default.createElement(Avatar, { radius: "xl" }),
23
- e__default.createElement("div", { style: { flex: 1 } },
24
- e__default.createElement(Text, { size: "sm", weight: 500 }, membership.profile?.display),
25
- e__default.createElement(Text, { color: "dimmed", size: "xs" }, membership.project?.display))))))));
21
+ React.createElement(Group, null,
22
+ React.createElement(Avatar, { radius: "xl" }),
23
+ React.createElement("div", { style: { flex: 1 } },
24
+ React.createElement(Text, { size: "sm", weight: 500 }, membership.profile?.display),
25
+ React.createElement(Text, { color: "dimmed", size: "xs" }, membership.project?.display))))))));
26
26
  }
27
27
 
28
28
  export { ChooseProfileForm };
@@ -1 +1 @@
1
- {"version":3,"file":"ChooseProfileForm.mjs","sources":["../../../src/auth/ChooseProfileForm.tsx"],"sourcesContent":["import { Avatar, Center, Group, Stack, Text, Title, UnstyledButton } from '@mantine/core';\nimport { LoginAuthenticationResponse } from '@medplum/core';\nimport { ProjectMembership } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { Logo } from '../Logo/Logo';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\n\nexport interface ChooseProfileFormProps {\n login: string;\n memberships: ProjectMembership[];\n handleAuthResponse: (response: LoginAuthenticationResponse) => void;\n}\n\nexport function ChooseProfileForm(props: ChooseProfileFormProps): JSX.Element {\n const medplum = useMedplum();\n return (\n <Stack>\n <Center sx={{ flexDirection: 'column' }}>\n <Logo size={32} />\n <Title>Choose profile</Title>\n </Center>\n {props.memberships.map((membership: ProjectMembership) => (\n <UnstyledButton\n key={membership.id}\n onClick={() => {\n medplum\n .post('auth/profile', {\n login: props.login,\n profile: membership.id,\n })\n .then(props.handleAuthResponse)\n .catch(console.log);\n }}\n >\n <Group>\n <Avatar radius=\"xl\" />\n <div style={{ flex: 1 }}>\n <Text size=\"sm\" weight={500}>\n {membership.profile?.display}\n </Text>\n <Text color=\"dimmed\" size=\"xs\">\n {membership.project?.display}\n </Text>\n </div>\n </Group>\n </UnstyledButton>\n ))}\n </Stack>\n );\n}\n"],"names":["React"],"mappings":";;;;;AAaM,SAAU,iBAAiB,CAAC,KAA6B,EAAA;AAC7D,IAAA,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,QACEA,yBAAC,KAAK,EAAA,IAAA;QACJA,UAAC,CAAA,aAAA,CAAA,MAAM,IAAC,EAAE,EAAE,EAAE,aAAa,EAAE,QAAQ,EAAE,EAAA;AACrC,YAAAA,UAAA,CAAA,aAAA,CAAC,IAAI,EAAA,EAAC,IAAI,EAAE,EAAE,EAAI,CAAA;YAClBA,UAAC,CAAA,aAAA,CAAA,KAAK,yBAAuB,CACtB;QACR,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,UAA6B,MACnDA,yBAAC,cAAc,EAAA,EACb,GAAG,EAAE,UAAU,CAAC,EAAE,EAClB,OAAO,EAAE,MAAK;gBACZ,OAAO;qBACJ,IAAI,CAAC,cAAc,EAAE;oBACpB,KAAK,EAAE,KAAK,CAAC,KAAK;oBAClB,OAAO,EAAE,UAAU,CAAC,EAAE;iBACvB,CAAC;AACD,qBAAA,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC;AAC9B,qBAAA,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;aACvB,EAAA;AAED,YAAAA,UAAA,CAAA,aAAA,CAAC,KAAK,EAAA,IAAA;AACJ,gBAAAA,UAAA,CAAA,aAAA,CAAC,MAAM,EAAA,EAAC,MAAM,EAAC,IAAI,EAAG,CAAA;AACtB,gBAAAA,UAAA,CAAA,aAAA,CAAA,KAAA,EAAA,EAAK,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,EAAA;AACrB,oBAAAA,UAAA,CAAA,aAAA,CAAC,IAAI,EAAA,EAAC,IAAI,EAAC,IAAI,EAAC,MAAM,EAAE,GAAG,IACxB,UAAU,CAAC,OAAO,EAAE,OAAO,CACvB;oBACPA,UAAC,CAAA,aAAA,CAAA,IAAI,IAAC,KAAK,EAAC,QAAQ,EAAC,IAAI,EAAC,IAAI,EAC3B,EAAA,UAAU,CAAC,OAAO,EAAE,OAAO,CACvB,CACH,CACA,CACO,CAClB,CAAC,CACI,EACR;AACJ;;;;"}
1
+ {"version":3,"file":"ChooseProfileForm.mjs","sources":["../../../src/auth/ChooseProfileForm.tsx"],"sourcesContent":["import { Avatar, Center, Group, Stack, Text, Title, UnstyledButton } from '@mantine/core';\nimport { LoginAuthenticationResponse } from '@medplum/core';\nimport { ProjectMembership } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { Logo } from '../Logo/Logo';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\n\nexport interface ChooseProfileFormProps {\n login: string;\n memberships: ProjectMembership[];\n handleAuthResponse: (response: LoginAuthenticationResponse) => void;\n}\n\nexport function ChooseProfileForm(props: ChooseProfileFormProps): JSX.Element {\n const medplum = useMedplum();\n return (\n <Stack>\n <Center sx={{ flexDirection: 'column' }}>\n <Logo size={32} />\n <Title>Choose profile</Title>\n </Center>\n {props.memberships.map((membership: ProjectMembership) => (\n <UnstyledButton\n key={membership.id}\n onClick={() => {\n medplum\n .post('auth/profile', {\n login: props.login,\n profile: membership.id,\n })\n .then(props.handleAuthResponse)\n .catch(console.log);\n }}\n >\n <Group>\n <Avatar radius=\"xl\" />\n <div style={{ flex: 1 }}>\n <Text size=\"sm\" weight={500}>\n {membership.profile?.display}\n </Text>\n <Text color=\"dimmed\" size=\"xs\">\n {membership.project?.display}\n </Text>\n </div>\n </Group>\n </UnstyledButton>\n ))}\n </Stack>\n );\n}\n"],"names":[],"mappings":";;;;;AAaM,SAAU,iBAAiB,CAAC,KAA6B,EAAA;AAC7D,IAAA,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,QACE,oBAAC,KAAK,EAAA,IAAA;QACJ,KAAC,CAAA,aAAA,CAAA,MAAM,IAAC,EAAE,EAAE,EAAE,aAAa,EAAE,QAAQ,EAAE,EAAA;AACrC,YAAA,KAAA,CAAA,aAAA,CAAC,IAAI,EAAA,EAAC,IAAI,EAAE,EAAE,EAAI,CAAA;YAClB,KAAC,CAAA,aAAA,CAAA,KAAK,yBAAuB,CACtB;QACR,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,UAA6B,MACnD,oBAAC,cAAc,EAAA,EACb,GAAG,EAAE,UAAU,CAAC,EAAE,EAClB,OAAO,EAAE,MAAK;gBACZ,OAAO;qBACJ,IAAI,CAAC,cAAc,EAAE;oBACpB,KAAK,EAAE,KAAK,CAAC,KAAK;oBAClB,OAAO,EAAE,UAAU,CAAC,EAAE;iBACvB,CAAC;AACD,qBAAA,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC;AAC9B,qBAAA,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;aACvB,EAAA;AAED,YAAA,KAAA,CAAA,aAAA,CAAC,KAAK,EAAA,IAAA;AACJ,gBAAA,KAAA,CAAA,aAAA,CAAC,MAAM,EAAA,EAAC,MAAM,EAAC,IAAI,EAAG,CAAA;AACtB,gBAAA,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA,EAAK,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,EAAA;AACrB,oBAAA,KAAA,CAAA,aAAA,CAAC,IAAI,EAAA,EAAC,IAAI,EAAC,IAAI,EAAC,MAAM,EAAE,GAAG,IACxB,UAAU,CAAC,OAAO,EAAE,OAAO,CACvB;oBACP,KAAC,CAAA,aAAA,CAAA,IAAI,IAAC,KAAK,EAAC,QAAQ,EAAC,IAAI,EAAC,IAAI,EAC3B,EAAA,UAAU,CAAC,OAAO,EAAE,OAAO,CACvB,CACH,CACA,CACO,CAClB,CAAC,CACI,EACR;AACJ;;;;"}
@@ -1,12 +1,12 @@
1
1
  import { Stack, Center, Title, Checkbox, Group, Button } from '@mantine/core';
2
- import e__default from 'react';
2
+ import React from 'react';
3
3
  import { Form } from '../Form/Form.mjs';
4
4
  import { Logo } from '../Logo/Logo.mjs';
5
5
  import { useMedplum } from '../MedplumProvider/MedplumProvider.mjs';
6
6
 
7
7
  function ChooseScopeForm(props) {
8
8
  const medplum = useMedplum();
9
- return (e__default.createElement(Form, { style: { maxWidth: 400 }, onSubmit: (formData) => {
9
+ return (React.createElement(Form, { style: { maxWidth: 400 }, onSubmit: (formData) => {
10
10
  medplum
11
11
  .post('auth/scope', {
12
12
  login: props.login,
@@ -15,13 +15,13 @@ function ChooseScopeForm(props) {
15
15
  .then(props.handleAuthResponse)
16
16
  .catch(console.log);
17
17
  } },
18
- e__default.createElement(Stack, null,
19
- e__default.createElement(Center, { sx: { flexDirection: 'column' } },
20
- e__default.createElement(Logo, { size: 32 }),
21
- e__default.createElement(Title, null, "Choose scope")),
22
- e__default.createElement(Stack, null, (props.scope || 'openid').split(' ').map((scopeName) => (e__default.createElement(Checkbox, { key: scopeName, id: scopeName, name: scopeName, label: scopeName, defaultChecked: true })))),
23
- e__default.createElement(Group, { position: "right", mt: "xl" },
24
- e__default.createElement(Button, { type: "submit" }, "Set scope")))));
18
+ React.createElement(Stack, null,
19
+ React.createElement(Center, { sx: { flexDirection: 'column' } },
20
+ React.createElement(Logo, { size: 32 }),
21
+ React.createElement(Title, null, "Choose scope")),
22
+ React.createElement(Stack, null, (props.scope || 'openid').split(' ').map((scopeName) => (React.createElement(Checkbox, { key: scopeName, id: scopeName, name: scopeName, label: scopeName, defaultChecked: true })))),
23
+ React.createElement(Group, { position: "right", mt: "xl" },
24
+ React.createElement(Button, { type: "submit" }, "Set scope")))));
25
25
  }
26
26
 
27
27
  export { ChooseScopeForm };
@@ -1 +1 @@
1
- {"version":3,"file":"ChooseScopeForm.mjs","sources":["../../../src/auth/ChooseScopeForm.tsx"],"sourcesContent":["import { Button, Center, Checkbox, Group, Stack, Title } from '@mantine/core';\nimport { LoginAuthenticationResponse } from '@medplum/core';\nimport React from 'react';\nimport { Form } from '../Form/Form';\nimport { Logo } from '../Logo/Logo';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\n\nexport interface ChooseScopeFormProps {\n login: string;\n scope: string | undefined;\n handleAuthResponse: (response: LoginAuthenticationResponse) => void;\n}\n\nexport function ChooseScopeForm(props: ChooseScopeFormProps): JSX.Element {\n const medplum = useMedplum();\n return (\n <Form\n style={{ maxWidth: 400 }}\n onSubmit={(formData: Record<string, string>) => {\n medplum\n .post('auth/scope', {\n login: props.login,\n scope: Object.keys(formData).join(' '),\n })\n .then(props.handleAuthResponse)\n .catch(console.log);\n }}\n >\n <Stack>\n <Center sx={{ flexDirection: 'column' }}>\n <Logo size={32} />\n <Title>Choose scope</Title>\n </Center>\n <Stack>\n {(props.scope || 'openid').split(' ').map((scopeName: string) => (\n <Checkbox key={scopeName} id={scopeName} name={scopeName} label={scopeName} defaultChecked />\n ))}\n </Stack>\n <Group position=\"right\" mt=\"xl\">\n <Button type=\"submit\">Set scope</Button>\n </Group>\n </Stack>\n </Form>\n );\n}\n"],"names":["React"],"mappings":";;;;;;AAaM,SAAU,eAAe,CAAC,KAA2B,EAAA;AACzD,IAAA,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;AAC7B,IAAA,QACEA,UAAC,CAAA,aAAA,CAAA,IAAI,EACH,EAAA,KAAK,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,EACxB,QAAQ,EAAE,CAAC,QAAgC,KAAI;YAC7C,OAAO;iBACJ,IAAI,CAAC,YAAY,EAAE;gBAClB,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;aACvC,CAAC;AACD,iBAAA,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC;AAC9B,iBAAA,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;SACvB,EAAA;AAED,QAAAA,UAAA,CAAA,aAAA,CAAC,KAAK,EAAA,IAAA;YACJA,UAAC,CAAA,aAAA,CAAA,MAAM,IAAC,EAAE,EAAE,EAAE,aAAa,EAAE,QAAQ,EAAE,EAAA;AACrC,gBAAAA,UAAA,CAAA,aAAA,CAAC,IAAI,EAAA,EAAC,IAAI,EAAE,EAAE,EAAI,CAAA;gBAClBA,UAAC,CAAA,aAAA,CAAA,KAAK,uBAAqB,CACpB;YACTA,UAAC,CAAA,aAAA,CAAA,KAAK,QACH,CAAC,KAAK,CAAC,KAAK,IAAI,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,SAAiB,MAC1DA,yBAAC,QAAQ,EAAA,EAAC,GAAG,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,cAAc,EAAA,IAAA,EAAA,CAAG,CAC9F,CAAC,CACI;YACRA,UAAC,CAAA,aAAA,CAAA,KAAK,IAAC,QAAQ,EAAC,OAAO,EAAC,EAAE,EAAC,IAAI,EAAA;gBAC7BA,UAAC,CAAA,aAAA,CAAA,MAAM,EAAC,EAAA,IAAI,EAAC,QAAQ,gBAAmB,CAClC,CACF,CACH,EACP;AACJ;;;;"}
1
+ {"version":3,"file":"ChooseScopeForm.mjs","sources":["../../../src/auth/ChooseScopeForm.tsx"],"sourcesContent":["import { Button, Center, Checkbox, Group, Stack, Title } from '@mantine/core';\nimport { LoginAuthenticationResponse } from '@medplum/core';\nimport React from 'react';\nimport { Form } from '../Form/Form';\nimport { Logo } from '../Logo/Logo';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\n\nexport interface ChooseScopeFormProps {\n login: string;\n scope: string | undefined;\n handleAuthResponse: (response: LoginAuthenticationResponse) => void;\n}\n\nexport function ChooseScopeForm(props: ChooseScopeFormProps): JSX.Element {\n const medplum = useMedplum();\n return (\n <Form\n style={{ maxWidth: 400 }}\n onSubmit={(formData: Record<string, string>) => {\n medplum\n .post('auth/scope', {\n login: props.login,\n scope: Object.keys(formData).join(' '),\n })\n .then(props.handleAuthResponse)\n .catch(console.log);\n }}\n >\n <Stack>\n <Center sx={{ flexDirection: 'column' }}>\n <Logo size={32} />\n <Title>Choose scope</Title>\n </Center>\n <Stack>\n {(props.scope || 'openid').split(' ').map((scopeName: string) => (\n <Checkbox key={scopeName} id={scopeName} name={scopeName} label={scopeName} defaultChecked />\n ))}\n </Stack>\n <Group position=\"right\" mt=\"xl\">\n <Button type=\"submit\">Set scope</Button>\n </Group>\n </Stack>\n </Form>\n );\n}\n"],"names":[],"mappings":";;;;;;AAaM,SAAU,eAAe,CAAC,KAA2B,EAAA;AACzD,IAAA,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;AAC7B,IAAA,QACE,KAAC,CAAA,aAAA,CAAA,IAAI,EACH,EAAA,KAAK,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,EACxB,QAAQ,EAAE,CAAC,QAAgC,KAAI;YAC7C,OAAO;iBACJ,IAAI,CAAC,YAAY,EAAE;gBAClB,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;aACvC,CAAC;AACD,iBAAA,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC;AAC9B,iBAAA,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;SACvB,EAAA;AAED,QAAA,KAAA,CAAA,aAAA,CAAC,KAAK,EAAA,IAAA;YACJ,KAAC,CAAA,aAAA,CAAA,MAAM,IAAC,EAAE,EAAE,EAAE,aAAa,EAAE,QAAQ,EAAE,EAAA;AACrC,gBAAA,KAAA,CAAA,aAAA,CAAC,IAAI,EAAA,EAAC,IAAI,EAAE,EAAE,EAAI,CAAA;gBAClB,KAAC,CAAA,aAAA,CAAA,KAAK,uBAAqB,CACpB;YACT,KAAC,CAAA,aAAA,CAAA,KAAK,QACH,CAAC,KAAK,CAAC,KAAK,IAAI,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,SAAiB,MAC1D,oBAAC,QAAQ,EAAA,EAAC,GAAG,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,cAAc,EAAA,IAAA,EAAA,CAAG,CAC9F,CAAC,CACI;YACR,KAAC,CAAA,aAAA,CAAA,KAAK,IAAC,QAAQ,EAAC,OAAO,EAAC,EAAE,EAAC,IAAI,EAAA;gBAC7B,KAAC,CAAA,aAAA,CAAA,MAAM,EAAC,EAAA,IAAI,EAAC,QAAQ,gBAAmB,CAClC,CACF,CACH,EACP;AACJ;;;;"}
@@ -1,15 +1,15 @@
1
1
  import { Stack, Center, Title, Alert, TextInput, Group, Button } from '@mantine/core';
2
2
  import { normalizeErrorString } from '@medplum/core';
3
- import { IconAlertCircle as We } from '../node_modules/@tabler/icons/icons-react/dist/index.esm.mjs';
4
- import e__default, { useState } from 'react';
3
+ import React, { useState } from 'react';
5
4
  import { Form } from '../Form/Form.mjs';
6
5
  import { Logo } from '../Logo/Logo.mjs';
7
6
  import { useMedplum } from '../MedplumProvider/MedplumProvider.mjs';
7
+ import IconAlertCircle from '../node_modules/@tabler/icons-react/dist/esm/icons/IconAlertCircle.mjs';
8
8
 
9
9
  function MfaForm(props) {
10
10
  const medplum = useMedplum();
11
11
  const [errorMessage, setErrorMessage] = useState(undefined);
12
- return (e__default.createElement(Form, { style: { maxWidth: 400 }, onSubmit: (formData) => {
12
+ return (React.createElement(Form, { style: { maxWidth: 400 }, onSubmit: (formData) => {
13
13
  setErrorMessage(undefined);
14
14
  medplum
15
15
  .post('auth/mfa/verify', {
@@ -19,15 +19,15 @@ function MfaForm(props) {
19
19
  .then(props.handleAuthResponse)
20
20
  .catch((err) => setErrorMessage(normalizeErrorString(err)));
21
21
  } },
22
- e__default.createElement(Stack, null,
23
- e__default.createElement(Center, { sx: { flexDirection: 'column' } },
24
- e__default.createElement(Logo, { size: 32 }),
25
- e__default.createElement(Title, null, "Enter MFA code")),
26
- errorMessage && (e__default.createElement(Alert, { icon: e__default.createElement(We, { size: 16 }), title: "Error", color: "red" }, errorMessage)),
27
- e__default.createElement(Stack, null,
28
- e__default.createElement(TextInput, { name: "token", label: "MFA code", required: true })),
29
- e__default.createElement(Group, { position: "right", mt: "xl" },
30
- e__default.createElement(Button, { type: "submit" }, "Submit code")))));
22
+ React.createElement(Stack, null,
23
+ React.createElement(Center, { sx: { flexDirection: 'column' } },
24
+ React.createElement(Logo, { size: 32 }),
25
+ React.createElement(Title, null, "Enter MFA code")),
26
+ errorMessage && (React.createElement(Alert, { icon: React.createElement(IconAlertCircle, { size: 16 }), title: "Error", color: "red" }, errorMessage)),
27
+ React.createElement(Stack, null,
28
+ React.createElement(TextInput, { name: "token", label: "MFA code", required: true })),
29
+ React.createElement(Group, { position: "right", mt: "xl" },
30
+ React.createElement(Button, { type: "submit" }, "Submit code")))));
31
31
  }
32
32
 
33
33
  export { MfaForm };
@@ -1 +1 @@
1
- {"version":3,"file":"MfaForm.mjs","sources":["../../../src/auth/MfaForm.tsx"],"sourcesContent":["import { Alert, Button, Center, Group, Stack, TextInput, Title } from '@mantine/core';\nimport { LoginAuthenticationResponse, normalizeErrorString } from '@medplum/core';\nimport { IconAlertCircle } from '@tabler/icons';\nimport React, { useState } from 'react';\nimport { Form } from '../Form/Form';\nimport { Logo } from '../Logo/Logo';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\n\nexport interface MfaFormProps {\n login: string;\n handleAuthResponse: (response: LoginAuthenticationResponse) => void;\n}\n\nexport function MfaForm(props: MfaFormProps): JSX.Element {\n const medplum = useMedplum();\n const [errorMessage, setErrorMessage] = useState<string | undefined>(undefined);\n return (\n <Form\n style={{ maxWidth: 400 }}\n onSubmit={(formData: Record<string, string>) => {\n setErrorMessage(undefined);\n medplum\n .post('auth/mfa/verify', {\n login: props.login,\n token: formData.token,\n })\n .then(props.handleAuthResponse)\n .catch((err) => setErrorMessage(normalizeErrorString(err)));\n }}\n >\n <Stack>\n <Center sx={{ flexDirection: 'column' }}>\n <Logo size={32} />\n <Title>Enter MFA code</Title>\n </Center>\n {errorMessage && (\n <Alert icon={<IconAlertCircle size={16} />} title=\"Error\" color=\"red\">\n {errorMessage}\n </Alert>\n )}\n <Stack>\n <TextInput name=\"token\" label=\"MFA code\" required />\n </Stack>\n <Group position=\"right\" mt=\"xl\">\n <Button type=\"submit\">Submit code</Button>\n </Group>\n </Stack>\n </Form>\n );\n}\n"],"names":["React","IconAlertCircle"],"mappings":";;;;;;;;AAaM,SAAU,OAAO,CAAC,KAAmB,EAAA;AACzC,IAAA,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAqB,SAAS,CAAC,CAAC;AAChF,IAAA,QACEA,UAAC,CAAA,aAAA,CAAA,IAAI,EACH,EAAA,KAAK,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,EACxB,QAAQ,EAAE,CAAC,QAAgC,KAAI;YAC7C,eAAe,CAAC,SAAS,CAAC,CAAC;YAC3B,OAAO;iBACJ,IAAI,CAAC,iBAAiB,EAAE;gBACvB,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,KAAK,EAAE,QAAQ,CAAC,KAAK;aACtB,CAAC;AACD,iBAAA,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC;AAC9B,iBAAA,KAAK,CAAC,CAAC,GAAG,KAAK,eAAe,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;SAC/D,EAAA;AAED,QAAAA,UAAA,CAAA,aAAA,CAAC,KAAK,EAAA,IAAA;YACJA,UAAC,CAAA,aAAA,CAAA,MAAM,IAAC,EAAE,EAAE,EAAE,aAAa,EAAE,QAAQ,EAAE,EAAA;AACrC,gBAAAA,UAAA,CAAA,aAAA,CAAC,IAAI,EAAA,EAAC,IAAI,EAAE,EAAE,EAAI,CAAA;gBAClBA,UAAC,CAAA,aAAA,CAAA,KAAK,yBAAuB,CACtB;YACR,YAAY,KACXA,UAAA,CAAA,aAAA,CAAC,KAAK,EAAA,EAAC,IAAI,EAAEA,UAAA,CAAA,aAAA,CAACC,EAAe,EAAA,EAAC,IAAI,EAAE,EAAE,EAAI,CAAA,EAAE,KAAK,EAAC,OAAO,EAAC,KAAK,EAAC,KAAK,EAAA,EAClE,YAAY,CACP,CACT;AACD,YAAAD,UAAA,CAAA,aAAA,CAAC,KAAK,EAAA,IAAA;AACJ,gBAAAA,UAAA,CAAA,aAAA,CAAC,SAAS,EAAA,EAAC,IAAI,EAAC,OAAO,EAAC,KAAK,EAAC,UAAU,EAAC,QAAQ,EAAA,IAAA,EAAA,CAAG,CAC9C;YACRA,UAAC,CAAA,aAAA,CAAA,KAAK,IAAC,QAAQ,EAAC,OAAO,EAAC,EAAE,EAAC,IAAI,EAAA;gBAC7BA,UAAC,CAAA,aAAA,CAAA,MAAM,EAAC,EAAA,IAAI,EAAC,QAAQ,kBAAqB,CACpC,CACF,CACH,EACP;AACJ;;;;"}
1
+ {"version":3,"file":"MfaForm.mjs","sources":["../../../src/auth/MfaForm.tsx"],"sourcesContent":["import { Alert, Button, Center, Group, Stack, TextInput, Title } from '@mantine/core';\nimport { LoginAuthenticationResponse, normalizeErrorString } from '@medplum/core';\nimport { IconAlertCircle } from '@tabler/icons-react';\nimport React, { useState } from 'react';\nimport { Form } from '../Form/Form';\nimport { Logo } from '../Logo/Logo';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\n\nexport interface MfaFormProps {\n login: string;\n handleAuthResponse: (response: LoginAuthenticationResponse) => void;\n}\n\nexport function MfaForm(props: MfaFormProps): JSX.Element {\n const medplum = useMedplum();\n const [errorMessage, setErrorMessage] = useState<string | undefined>(undefined);\n return (\n <Form\n style={{ maxWidth: 400 }}\n onSubmit={(formData: Record<string, string>) => {\n setErrorMessage(undefined);\n medplum\n .post('auth/mfa/verify', {\n login: props.login,\n token: formData.token,\n })\n .then(props.handleAuthResponse)\n .catch((err) => setErrorMessage(normalizeErrorString(err)));\n }}\n >\n <Stack>\n <Center sx={{ flexDirection: 'column' }}>\n <Logo size={32} />\n <Title>Enter MFA code</Title>\n </Center>\n {errorMessage && (\n <Alert icon={<IconAlertCircle size={16} />} title=\"Error\" color=\"red\">\n {errorMessage}\n </Alert>\n )}\n <Stack>\n <TextInput name=\"token\" label=\"MFA code\" required />\n </Stack>\n <Group position=\"right\" mt=\"xl\">\n <Button type=\"submit\">Submit code</Button>\n </Group>\n </Stack>\n </Form>\n );\n}\n"],"names":[],"mappings":";;;;;;;;AAaM,SAAU,OAAO,CAAC,KAAmB,EAAA;AACzC,IAAA,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAqB,SAAS,CAAC,CAAC;AAChF,IAAA,QACE,KAAC,CAAA,aAAA,CAAA,IAAI,EACH,EAAA,KAAK,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,EACxB,QAAQ,EAAE,CAAC,QAAgC,KAAI;YAC7C,eAAe,CAAC,SAAS,CAAC,CAAC;YAC3B,OAAO;iBACJ,IAAI,CAAC,iBAAiB,EAAE;gBACvB,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,KAAK,EAAE,QAAQ,CAAC,KAAK;aACtB,CAAC;AACD,iBAAA,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC;AAC9B,iBAAA,KAAK,CAAC,CAAC,GAAG,KAAK,eAAe,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;SAC/D,EAAA;AAED,QAAA,KAAA,CAAA,aAAA,CAAC,KAAK,EAAA,IAAA;YACJ,KAAC,CAAA,aAAA,CAAA,MAAM,IAAC,EAAE,EAAE,EAAE,aAAa,EAAE,QAAQ,EAAE,EAAA;AACrC,gBAAA,KAAA,CAAA,aAAA,CAAC,IAAI,EAAA,EAAC,IAAI,EAAE,EAAE,EAAI,CAAA;gBAClB,KAAC,CAAA,aAAA,CAAA,KAAK,yBAAuB,CACtB;YACR,YAAY,KACX,KAAA,CAAA,aAAA,CAAC,KAAK,EAAA,EAAC,IAAI,EAAE,KAAA,CAAA,aAAA,CAAC,eAAe,EAAA,EAAC,IAAI,EAAE,EAAE,EAAI,CAAA,EAAE,KAAK,EAAC,OAAO,EAAC,KAAK,EAAC,KAAK,EAAA,EAClE,YAAY,CACP,CACT;AACD,YAAA,KAAA,CAAA,aAAA,CAAC,KAAK,EAAA,IAAA;AACJ,gBAAA,KAAA,CAAA,aAAA,CAAC,SAAS,EAAA,EAAC,IAAI,EAAC,OAAO,EAAC,KAAK,EAAC,UAAU,EAAC,QAAQ,EAAA,IAAA,EAAA,CAAG,CAC9C;YACR,KAAC,CAAA,aAAA,CAAA,KAAK,IAAC,QAAQ,EAAC,OAAO,EAAC,EAAE,EAAC,IAAI,EAAA;gBAC7B,KAAC,CAAA,aAAA,CAAA,MAAM,EAAC,EAAA,IAAI,EAAC,QAAQ,kBAAqB,CACpC,CACF,CACH,EACP;AACJ;;;;"}
@@ -1,5 +1,5 @@
1
1
  import { Center, Title, Stack, TextInput, Text, Anchor, Group, Button } from '@mantine/core';
2
- import e__default, { useState } from 'react';
2
+ import React, { useState } from 'react';
3
3
  import { Form } from '../Form/Form.mjs';
4
4
  import { Logo } from '../Logo/Logo.mjs';
5
5
  import { useMedplum } from '../MedplumProvider/MedplumProvider.mjs';
@@ -8,7 +8,7 @@ import { getErrorsForInput } from '../utils/outcomes.mjs';
8
8
  function NewProjectForm(props) {
9
9
  const medplum = useMedplum();
10
10
  const [outcome, setOutcome] = useState();
11
- return (e__default.createElement(Form, { style: { maxWidth: 400 }, onSubmit: async (formData) => {
11
+ return (React.createElement(Form, { style: { maxWidth: 400 }, onSubmit: async (formData) => {
12
12
  try {
13
13
  props.handleAuthResponse(await medplum.startNewProject({
14
14
  login: props.login,
@@ -19,20 +19,20 @@ function NewProjectForm(props) {
19
19
  setOutcome(err);
20
20
  }
21
21
  } },
22
- e__default.createElement(Center, { sx: { flexDirection: 'column' } },
23
- e__default.createElement(Logo, { size: 32 }),
24
- e__default.createElement(Title, null, "Create project")),
25
- e__default.createElement(Stack, { spacing: "xl" },
26
- e__default.createElement(TextInput, { name: "projectName", label: "Project Name", placeholder: "My Project", required: true, autoFocus: true, error: getErrorsForInput(outcome, 'firstName') }),
27
- e__default.createElement(Text, { color: "dimmed", size: "xs" },
22
+ React.createElement(Center, { sx: { flexDirection: 'column' } },
23
+ React.createElement(Logo, { size: 32 }),
24
+ React.createElement(Title, null, "Create project")),
25
+ React.createElement(Stack, { spacing: "xl" },
26
+ React.createElement(TextInput, { name: "projectName", label: "Project Name", placeholder: "My Project", required: true, autoFocus: true, error: getErrorsForInput(outcome, 'firstName') }),
27
+ React.createElement(Text, { color: "dimmed", size: "xs" },
28
28
  "By clicking submit you agree to the Medplum",
29
29
  ' ',
30
- e__default.createElement(Anchor, { href: "https://www.medplum.com/privacy" }, "Privacy\u00A0Policy"),
30
+ React.createElement(Anchor, { href: "https://www.medplum.com/privacy" }, "Privacy\u00A0Policy"),
31
31
  ' and ',
32
- e__default.createElement(Anchor, { href: "https://www.medplum.com/terms" }, "Terms\u00A0of\u00A0Service"),
32
+ React.createElement(Anchor, { href: "https://www.medplum.com/terms" }, "Terms\u00A0of\u00A0Service"),
33
33
  ".")),
34
- e__default.createElement(Group, { position: "right", mt: "xl", noWrap: true },
35
- e__default.createElement(Button, { type: "submit" }, "Create project"))));
34
+ React.createElement(Group, { position: "right", mt: "xl", noWrap: true },
35
+ React.createElement(Button, { type: "submit" }, "Create project"))));
36
36
  }
37
37
 
38
38
  export { NewProjectForm };
@@ -1 +1 @@
1
- {"version":3,"file":"NewProjectForm.mjs","sources":["../../../src/auth/NewProjectForm.tsx"],"sourcesContent":["import { Anchor, Button, Center, Group, Stack, Text, TextInput, Title } from '@mantine/core';\nimport { LoginAuthenticationResponse } from '@medplum/core';\nimport { OperationOutcome } from '@medplum/fhirtypes';\nimport React, { useState } from 'react';\nimport { Form } from '../Form/Form';\nimport { Logo } from '../Logo/Logo';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\nimport { getErrorsForInput } from '../utils/outcomes';\n\nexport interface NewProjectFormProps {\n login: string;\n handleAuthResponse: (response: LoginAuthenticationResponse) => void;\n}\n\nexport function NewProjectForm(props: NewProjectFormProps): JSX.Element {\n const medplum = useMedplum();\n const [outcome, setOutcome] = useState<OperationOutcome | undefined>();\n return (\n <Form\n style={{ maxWidth: 400 }}\n onSubmit={async (formData: Record<string, string>) => {\n try {\n props.handleAuthResponse(\n await medplum.startNewProject({\n login: props.login,\n projectName: formData.projectName,\n })\n );\n } catch (err) {\n setOutcome(err as OperationOutcome);\n }\n }}\n >\n <Center sx={{ flexDirection: 'column' }}>\n <Logo size={32} />\n <Title>Create project</Title>\n </Center>\n <Stack spacing=\"xl\">\n <TextInput\n name=\"projectName\"\n label=\"Project Name\"\n placeholder=\"My Project\"\n required={true}\n autoFocus={true}\n error={getErrorsForInput(outcome, 'firstName')}\n />\n <Text color=\"dimmed\" size=\"xs\">\n By clicking submit you agree to the Medplum{' '}\n <Anchor href=\"https://www.medplum.com/privacy\">Privacy&nbsp;Policy</Anchor>\n {' and '}\n <Anchor href=\"https://www.medplum.com/terms\">Terms&nbsp;of&nbsp;Service</Anchor>.\n </Text>\n </Stack>\n <Group position=\"right\" mt=\"xl\" noWrap>\n <Button type=\"submit\">Create project</Button>\n </Group>\n </Form>\n );\n}\n"],"names":["React"],"mappings":";;;;;;;AAcM,SAAU,cAAc,CAAC,KAA0B,EAAA;AACvD,IAAA,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,EAAgC,CAAC;AACvE,IAAA,QACEA,UAAC,CAAA,aAAA,CAAA,IAAI,IACH,KAAK,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,EACxB,QAAQ,EAAE,OAAO,QAAgC,KAAI;YACnD,IAAI;AACF,gBAAA,KAAK,CAAC,kBAAkB,CACtB,MAAM,OAAO,CAAC,eAAe,CAAC;oBAC5B,KAAK,EAAE,KAAK,CAAC,KAAK;oBAClB,WAAW,EAAE,QAAQ,CAAC,WAAW;AAClC,iBAAA,CAAC,CACH,CAAC;AACH,aAAA;AAAC,YAAA,OAAO,GAAG,EAAE;gBACZ,UAAU,CAAC,GAAuB,CAAC,CAAC;AACrC,aAAA;SACF,EAAA;QAEDA,UAAC,CAAA,aAAA,CAAA,MAAM,IAAC,EAAE,EAAE,EAAE,aAAa,EAAE,QAAQ,EAAE,EAAA;AACrC,YAAAA,UAAA,CAAA,aAAA,CAAC,IAAI,EAAA,EAAC,IAAI,EAAE,EAAE,EAAI,CAAA;YAClBA,UAAC,CAAA,aAAA,CAAA,KAAK,yBAAuB,CACtB;AACT,QAAAA,UAAA,CAAA,aAAA,CAAC,KAAK,EAAA,EAAC,OAAO,EAAC,IAAI,EAAA;AACjB,YAAAA,UAAA,CAAA,aAAA,CAAC,SAAS,EAAA,EACR,IAAI,EAAC,aAAa,EAClB,KAAK,EAAC,cAAc,EACpB,WAAW,EAAC,YAAY,EACxB,QAAQ,EAAE,IAAI,EACd,SAAS,EAAE,IAAI,EACf,KAAK,EAAE,iBAAiB,CAAC,OAAO,EAAE,WAAW,CAAC,EAC9C,CAAA;YACFA,UAAC,CAAA,aAAA,CAAA,IAAI,IAAC,KAAK,EAAC,QAAQ,EAAC,IAAI,EAAC,IAAI,EAAA;;gBACgB,GAAG;AAC/C,gBAAAA,UAAA,CAAA,aAAA,CAAC,MAAM,EAAA,EAAC,IAAI,EAAC,iCAAiC,EAA6B,EAAA,qBAAA,CAAA;gBAC1E,OAAO;AACR,gBAAAA,UAAA,CAAA,aAAA,CAAC,MAAM,EAAA,EAAC,IAAI,EAAC,+BAA+B,EAAoC,EAAA,4BAAA,CAAA;oBAC3E,CACD;QACRA,UAAC,CAAA,aAAA,CAAA,KAAK,EAAC,EAAA,QAAQ,EAAC,OAAO,EAAC,EAAE,EAAC,IAAI,EAAC,MAAM,EAAA,IAAA,EAAA;YACpCA,UAAC,CAAA,aAAA,CAAA,MAAM,IAAC,IAAI,EAAC,QAAQ,EAAwB,EAAA,gBAAA,CAAA,CACvC,CACH,EACP;AACJ;;;;"}
1
+ {"version":3,"file":"NewProjectForm.mjs","sources":["../../../src/auth/NewProjectForm.tsx"],"sourcesContent":["import { Anchor, Button, Center, Group, Stack, Text, TextInput, Title } from '@mantine/core';\nimport { LoginAuthenticationResponse } from '@medplum/core';\nimport { OperationOutcome } from '@medplum/fhirtypes';\nimport React, { useState } from 'react';\nimport { Form } from '../Form/Form';\nimport { Logo } from '../Logo/Logo';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\nimport { getErrorsForInput } from '../utils/outcomes';\n\nexport interface NewProjectFormProps {\n login: string;\n handleAuthResponse: (response: LoginAuthenticationResponse) => void;\n}\n\nexport function NewProjectForm(props: NewProjectFormProps): JSX.Element {\n const medplum = useMedplum();\n const [outcome, setOutcome] = useState<OperationOutcome | undefined>();\n return (\n <Form\n style={{ maxWidth: 400 }}\n onSubmit={async (formData: Record<string, string>) => {\n try {\n props.handleAuthResponse(\n await medplum.startNewProject({\n login: props.login,\n projectName: formData.projectName,\n })\n );\n } catch (err) {\n setOutcome(err as OperationOutcome);\n }\n }}\n >\n <Center sx={{ flexDirection: 'column' }}>\n <Logo size={32} />\n <Title>Create project</Title>\n </Center>\n <Stack spacing=\"xl\">\n <TextInput\n name=\"projectName\"\n label=\"Project Name\"\n placeholder=\"My Project\"\n required={true}\n autoFocus={true}\n error={getErrorsForInput(outcome, 'firstName')}\n />\n <Text color=\"dimmed\" size=\"xs\">\n By clicking submit you agree to the Medplum{' '}\n <Anchor href=\"https://www.medplum.com/privacy\">Privacy&nbsp;Policy</Anchor>\n {' and '}\n <Anchor href=\"https://www.medplum.com/terms\">Terms&nbsp;of&nbsp;Service</Anchor>.\n </Text>\n </Stack>\n <Group position=\"right\" mt=\"xl\" noWrap>\n <Button type=\"submit\">Create project</Button>\n </Group>\n </Form>\n );\n}\n"],"names":[],"mappings":";;;;;;;AAcM,SAAU,cAAc,CAAC,KAA0B,EAAA;AACvD,IAAA,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,EAAgC,CAAC;AACvE,IAAA,QACE,KAAC,CAAA,aAAA,CAAA,IAAI,IACH,KAAK,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,EACxB,QAAQ,EAAE,OAAO,QAAgC,KAAI;YACnD,IAAI;AACF,gBAAA,KAAK,CAAC,kBAAkB,CACtB,MAAM,OAAO,CAAC,eAAe,CAAC;oBAC5B,KAAK,EAAE,KAAK,CAAC,KAAK;oBAClB,WAAW,EAAE,QAAQ,CAAC,WAAW;AAClC,iBAAA,CAAC,CACH,CAAC;AACH,aAAA;AAAC,YAAA,OAAO,GAAG,EAAE;gBACZ,UAAU,CAAC,GAAuB,CAAC,CAAC;AACrC,aAAA;SACF,EAAA;QAED,KAAC,CAAA,aAAA,CAAA,MAAM,IAAC,EAAE,EAAE,EAAE,aAAa,EAAE,QAAQ,EAAE,EAAA;AACrC,YAAA,KAAA,CAAA,aAAA,CAAC,IAAI,EAAA,EAAC,IAAI,EAAE,EAAE,EAAI,CAAA;YAClB,KAAC,CAAA,aAAA,CAAA,KAAK,yBAAuB,CACtB;AACT,QAAA,KAAA,CAAA,aAAA,CAAC,KAAK,EAAA,EAAC,OAAO,EAAC,IAAI,EAAA;AACjB,YAAA,KAAA,CAAA,aAAA,CAAC,SAAS,EAAA,EACR,IAAI,EAAC,aAAa,EAClB,KAAK,EAAC,cAAc,EACpB,WAAW,EAAC,YAAY,EACxB,QAAQ,EAAE,IAAI,EACd,SAAS,EAAE,IAAI,EACf,KAAK,EAAE,iBAAiB,CAAC,OAAO,EAAE,WAAW,CAAC,EAC9C,CAAA;YACF,KAAC,CAAA,aAAA,CAAA,IAAI,IAAC,KAAK,EAAC,QAAQ,EAAC,IAAI,EAAC,IAAI,EAAA;;gBACgB,GAAG;AAC/C,gBAAA,KAAA,CAAA,aAAA,CAAC,MAAM,EAAA,EAAC,IAAI,EAAC,iCAAiC,EAA6B,EAAA,qBAAA,CAAA;gBAC1E,OAAO;AACR,gBAAA,KAAA,CAAA,aAAA,CAAC,MAAM,EAAA,EAAC,IAAI,EAAC,+BAA+B,EAAoC,EAAA,4BAAA,CAAA;oBAC3E,CACD;QACR,KAAC,CAAA,aAAA,CAAA,KAAK,EAAC,EAAA,QAAQ,EAAC,OAAO,EAAC,EAAE,EAAC,IAAI,EAAC,MAAM,EAAA,IAAA,EAAA;YACpC,KAAC,CAAA,aAAA,CAAA,MAAM,IAAC,IAAI,EAAC,QAAQ,EAAwB,EAAA,gBAAA,CAAA,CACvC,CACH,EACP;AACJ;;;;"}
@@ -1,5 +1,5 @@
1
1
  import { Center, Group, Divider, Stack, TextInput, PasswordInput, Text, Anchor, Checkbox, Button } from '@mantine/core';
2
- import e__default, { useState, useEffect } from 'react';
2
+ import React, { useState, useEffect } from 'react';
3
3
  import { Form } from '../Form/Form.mjs';
4
4
  import { getGoogleClientId, GoogleButton } from '../GoogleButton/GoogleButton.mjs';
5
5
  import { useMedplum } from '../MedplumProvider/MedplumProvider.mjs';
@@ -14,7 +14,7 @@ function NewUserForm(props) {
14
14
  const [outcome, setOutcome] = useState();
15
15
  const issues = getIssuesForExpression(outcome, undefined);
16
16
  useEffect(() => initRecaptcha(recaptchaSiteKey), [recaptchaSiteKey]);
17
- return (e__default.createElement(Form, { style: { maxWidth: 400 }, onSubmit: async (formData) => {
17
+ return (React.createElement(Form, { style: { maxWidth: 400 }, onSubmit: async (formData) => {
18
18
  try {
19
19
  const recaptchaToken = await getRecaptcha(recaptchaSiteKey);
20
20
  props.handleAuthResponse(await medplum.startNewUser({
@@ -32,11 +32,11 @@ function NewUserForm(props) {
32
32
  setOutcome(err);
33
33
  }
34
34
  } },
35
- e__default.createElement(Center, { sx: { flexDirection: 'column' } }, props.children),
36
- e__default.createElement(OperationOutcomeAlert, { issues: issues }),
37
- googleClientId && (e__default.createElement(e__default.Fragment, null,
38
- e__default.createElement(Group, { position: "center", p: "xl", style: { height: 70 } },
39
- e__default.createElement(GoogleButton, { googleClientId: googleClientId, handleGoogleCredential: async (response) => {
35
+ React.createElement(Center, { sx: { flexDirection: 'column' } }, props.children),
36
+ React.createElement(OperationOutcomeAlert, { issues: issues }),
37
+ googleClientId && (React.createElement(React.Fragment, null,
38
+ React.createElement(Group, { position: "center", p: "xl", style: { height: 70 } },
39
+ React.createElement(GoogleButton, { googleClientId: googleClientId, handleGoogleCredential: async (response) => {
40
40
  try {
41
41
  props.handleAuthResponse(await medplum.startGoogleLogin({
42
42
  googleClientId: response.clientId,
@@ -48,29 +48,29 @@ function NewUserForm(props) {
48
48
  setOutcome(err);
49
49
  }
50
50
  } })),
51
- e__default.createElement(Divider, { label: "or", labelPosition: "center", my: "lg" }))),
52
- e__default.createElement(Stack, { spacing: "xl" },
53
- e__default.createElement(TextInput, { name: "firstName", type: "text", label: "First name", placeholder: "First name", required: true, autoFocus: true, error: getErrorsForInput(outcome, 'firstName') }),
54
- e__default.createElement(TextInput, { name: "lastName", type: "text", label: "Last name", placeholder: "Last name", required: true, error: getErrorsForInput(outcome, 'lastName') }),
55
- e__default.createElement(TextInput, { name: "email", type: "email", label: "Email", placeholder: "name@domain.com", required: true, error: getErrorsForInput(outcome, 'email') }),
56
- e__default.createElement(PasswordInput, { name: "password", label: "Password", autoComplete: "off", required: true, error: getErrorsForInput(outcome, 'password') }),
57
- e__default.createElement(Text, { color: "dimmed", size: "xs" },
51
+ React.createElement(Divider, { label: "or", labelPosition: "center", my: "lg" }))),
52
+ React.createElement(Stack, { spacing: "xl" },
53
+ React.createElement(TextInput, { name: "firstName", type: "text", label: "First name", placeholder: "First name", required: true, autoFocus: true, error: getErrorsForInput(outcome, 'firstName') }),
54
+ React.createElement(TextInput, { name: "lastName", type: "text", label: "Last name", placeholder: "Last name", required: true, error: getErrorsForInput(outcome, 'lastName') }),
55
+ React.createElement(TextInput, { name: "email", type: "email", label: "Email", placeholder: "name@domain.com", required: true, error: getErrorsForInput(outcome, 'email') }),
56
+ React.createElement(PasswordInput, { name: "password", label: "Password", autoComplete: "off", required: true, error: getErrorsForInput(outcome, 'password') }),
57
+ React.createElement(Text, { color: "dimmed", size: "xs" },
58
58
  "By clicking submit you agree to the Medplum",
59
59
  ' ',
60
- e__default.createElement(Anchor, { href: "https://www.medplum.com/privacy" }, "Privacy\u00A0Policy"),
60
+ React.createElement(Anchor, { href: "https://www.medplum.com/privacy" }, "Privacy\u00A0Policy"),
61
61
  ' and ',
62
- e__default.createElement(Anchor, { href: "https://www.medplum.com/terms" }, "Terms\u00A0of\u00A0Service"),
62
+ React.createElement(Anchor, { href: "https://www.medplum.com/terms" }, "Terms\u00A0of\u00A0Service"),
63
63
  "."),
64
- e__default.createElement(Text, { color: "dimmed", size: "xs" },
64
+ React.createElement(Text, { color: "dimmed", size: "xs" },
65
65
  "This site is protected by reCAPTCHA and the Google",
66
66
  ' ',
67
- e__default.createElement(Anchor, { href: "https://policies.google.com/privacy" }, "Privacy\u00A0Policy"),
67
+ React.createElement(Anchor, { href: "https://policies.google.com/privacy" }, "Privacy\u00A0Policy"),
68
68
  ' and ',
69
- e__default.createElement(Anchor, { href: "https://policies.google.com/terms" }, "Terms\u00A0of\u00A0Service"),
69
+ React.createElement(Anchor, { href: "https://policies.google.com/terms" }, "Terms\u00A0of\u00A0Service"),
70
70
  " apply.")),
71
- e__default.createElement(Group, { position: "apart", mt: "xl", noWrap: true },
72
- e__default.createElement(Checkbox, { name: "remember", label: "Remember me", size: "xs" }),
73
- e__default.createElement(Button, { type: "submit" }, "Create account"))));
71
+ React.createElement(Group, { position: "apart", mt: "xl", noWrap: true },
72
+ React.createElement(Checkbox, { name: "remember", label: "Remember me", size: "xs" }),
73
+ React.createElement(Button, { type: "submit" }, "Create account"))));
74
74
  }
75
75
 
76
76
  export { NewUserForm };