@medplum/react 0.9.25 → 0.9.28

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 (411) hide show
  1. package/dist/cjs/index.js +282 -152
  2. package/dist/cjs/index.js.map +1 -1
  3. package/dist/cjs/index.min.js +1 -1
  4. package/dist/cjs/index.min.js.map +1 -1
  5. package/dist/cjs/styles.css +83 -79
  6. package/dist/{types → esm}/AddressDisplay.d.ts +0 -0
  7. package/dist/esm/AddressDisplay.js +13 -0
  8. package/dist/esm/AddressDisplay.js.map +1 -0
  9. package/dist/{types → esm}/AddressInput.d.ts +0 -0
  10. package/dist/esm/AddressInput.js +69 -0
  11. package/dist/esm/AddressInput.js.map +1 -0
  12. package/dist/{types → esm}/AnnotationInput.d.ts +0 -0
  13. package/dist/esm/AnnotationInput.js +28 -0
  14. package/dist/esm/AnnotationInput.js.map +1 -0
  15. package/dist/{types → esm}/AttachmentArrayDisplay.d.ts +0 -0
  16. package/dist/esm/AttachmentArrayDisplay.js +11 -0
  17. package/dist/esm/AttachmentArrayDisplay.js.map +1 -0
  18. package/dist/{types → esm}/AttachmentArrayInput.d.ts +0 -0
  19. package/dist/esm/AttachmentArrayInput.js +42 -0
  20. package/dist/esm/AttachmentArrayInput.js.map +1 -0
  21. package/dist/{types → esm}/AttachmentDisplay.d.ts +0 -0
  22. package/dist/esm/AttachmentDisplay.js +20 -0
  23. package/dist/esm/AttachmentDisplay.js.map +1 -0
  24. package/dist/{types → esm}/AttachmentInput.d.ts +0 -0
  25. package/dist/esm/AttachmentInput.js +27 -0
  26. package/dist/esm/AttachmentInput.js.map +1 -0
  27. package/dist/{types → esm}/Autocomplete.d.ts +1 -0
  28. package/dist/esm/Autocomplete.js +280 -0
  29. package/dist/esm/Autocomplete.js.map +1 -0
  30. package/dist/{types → esm}/Avatar.d.ts +0 -0
  31. package/dist/esm/Avatar.js +24 -0
  32. package/dist/esm/Avatar.js.map +1 -0
  33. package/dist/{types → esm}/BackboneElementDisplay.d.ts +0 -0
  34. package/dist/esm/BackboneElementDisplay.js +43 -0
  35. package/dist/esm/BackboneElementDisplay.js.map +1 -0
  36. package/dist/{types → esm}/BackboneElementInput.d.ts +0 -0
  37. package/dist/esm/BackboneElementInput.js +51 -0
  38. package/dist/esm/BackboneElementInput.js.map +1 -0
  39. package/dist/{types → esm}/Button.d.ts +0 -0
  40. package/dist/esm/Button.js +13 -0
  41. package/dist/esm/Button.js.map +1 -0
  42. package/dist/{types → esm}/CalendarInput.d.ts +0 -0
  43. package/dist/esm/CalendarInput.js +96 -0
  44. package/dist/esm/CalendarInput.js.map +1 -0
  45. package/dist/{types → esm}/Checkbox.d.ts +0 -0
  46. package/dist/esm/Checkbox.js +13 -0
  47. package/dist/esm/Checkbox.js.map +1 -0
  48. package/dist/{types → esm}/CheckboxFormSection.d.ts +0 -0
  49. package/dist/esm/CheckboxFormSection.js +12 -0
  50. package/dist/esm/CheckboxFormSection.js.map +1 -0
  51. package/dist/{types → esm}/CodeInput.d.ts +0 -0
  52. package/dist/esm/CodeInput.js +28 -0
  53. package/dist/esm/CodeInput.js.map +1 -0
  54. package/dist/{types → esm}/CodeableConceptDisplay.d.ts +0 -0
  55. package/dist/esm/CodeableConceptDisplay.js +21 -0
  56. package/dist/esm/CodeableConceptDisplay.js.map +1 -0
  57. package/dist/{types → esm}/CodeableConceptInput.d.ts +0 -0
  58. package/dist/esm/CodeableConceptInput.js +52 -0
  59. package/dist/esm/CodeableConceptInput.js.map +1 -0
  60. package/dist/{types → esm}/CodingDisplay.d.ts +0 -0
  61. package/dist/esm/CodingDisplay.js +9 -0
  62. package/dist/esm/CodingDisplay.js.map +1 -0
  63. package/dist/{types → esm}/CodingInput.d.ts +0 -0
  64. package/dist/esm/CodingInput.js +30 -0
  65. package/dist/esm/CodingInput.js.map +1 -0
  66. package/dist/{types → esm}/ContactDetailDisplay.d.ts +0 -0
  67. package/dist/esm/ContactDetailDisplay.js +17 -0
  68. package/dist/esm/ContactDetailDisplay.js.map +1 -0
  69. package/dist/{types → esm}/ContactDetailInput.d.ts +0 -0
  70. package/dist/esm/ContactDetailInput.js +37 -0
  71. package/dist/esm/ContactDetailInput.js.map +1 -0
  72. package/dist/{types → esm}/ContactPointDisplay.d.ts +0 -0
  73. package/dist/esm/ContactPointDisplay.js +29 -0
  74. package/dist/esm/ContactPointDisplay.js.map +1 -0
  75. package/dist/{types → esm}/ContactPointInput.d.ts +0 -0
  76. package/dist/esm/ContactPointInput.js +60 -0
  77. package/dist/esm/ContactPointInput.js.map +1 -0
  78. package/dist/{types → esm}/DateTimeInput.d.ts +0 -0
  79. package/dist/esm/DateTimeInput.js +60 -0
  80. package/dist/esm/DateTimeInput.js.map +1 -0
  81. package/dist/{types → esm}/DefaultResourceTimeline.d.ts +0 -0
  82. package/dist/esm/DefaultResourceTimeline.js +27 -0
  83. package/dist/esm/DefaultResourceTimeline.js.map +1 -0
  84. package/dist/{types → esm}/DescriptionList.d.ts +0 -0
  85. package/dist/esm/DescriptionList.js +13 -0
  86. package/dist/esm/DescriptionList.js.map +1 -0
  87. package/dist/{types → esm}/DiagnosticReportDisplay.d.ts +0 -0
  88. package/dist/esm/DiagnosticReportDisplay.js +101 -0
  89. package/dist/esm/DiagnosticReportDisplay.js.map +1 -0
  90. package/dist/{types → esm}/Dialog.d.ts +0 -0
  91. package/dist/esm/Dialog.js +43 -0
  92. package/dist/esm/Dialog.js.map +1 -0
  93. package/dist/{types → esm}/Document.d.ts +0 -0
  94. package/dist/esm/Document.js +9 -0
  95. package/dist/esm/Document.js.map +1 -0
  96. package/dist/{types → esm}/EncounterTimeline.d.ts +0 -0
  97. package/dist/esm/EncounterTimeline.js +47 -0
  98. package/dist/esm/EncounterTimeline.js.map +1 -0
  99. package/dist/{types → esm}/ErrorBoundary.d.ts +0 -0
  100. package/dist/esm/ErrorBoundary.js +27 -0
  101. package/dist/esm/ErrorBoundary.js.map +1 -0
  102. package/dist/{types → esm}/ExtensionInput.d.ts +0 -0
  103. package/dist/esm/ExtensionInput.js +14 -0
  104. package/dist/esm/ExtensionInput.js.map +1 -0
  105. package/dist/{types → esm}/FhirPathDisplay.d.ts +0 -0
  106. package/dist/esm/FhirPathDisplay.js +23 -0
  107. package/dist/esm/FhirPathDisplay.js.map +1 -0
  108. package/dist/{types → esm}/FhirPathTable.d.ts +0 -0
  109. package/dist/esm/FhirPathTable.js +117 -0
  110. package/dist/esm/FhirPathTable.js.map +1 -0
  111. package/dist/{types → esm}/FooterLinks.d.ts +0 -0
  112. package/dist/esm/FooterLinks.js +8 -0
  113. package/dist/esm/FooterLinks.js.map +1 -0
  114. package/dist/{types → esm}/Form.d.ts +0 -0
  115. package/dist/esm/Form.js +15 -0
  116. package/dist/esm/Form.js.map +1 -0
  117. package/dist/{types → esm}/FormSection.d.ts +0 -0
  118. package/dist/esm/FormSection.js +18 -0
  119. package/dist/esm/FormSection.js.map +1 -0
  120. package/dist/{types → esm}/FormUtils.d.ts +0 -0
  121. package/dist/esm/FormUtils.js +49 -0
  122. package/dist/esm/FormUtils.js.map +1 -0
  123. package/dist/{types → esm}/GoogleButton.d.ts +0 -0
  124. package/dist/esm/GoogleButton.js +48 -0
  125. package/dist/esm/GoogleButton.js.map +1 -0
  126. package/dist/{types → esm}/Header.d.ts +0 -0
  127. package/dist/esm/Header.js +95 -0
  128. package/dist/esm/Header.js.map +1 -0
  129. package/dist/{types → esm}/HeaderSearchInput.d.ts +0 -0
  130. package/dist/esm/HeaderSearchInput.js +181 -0
  131. package/dist/esm/HeaderSearchInput.js.map +1 -0
  132. package/dist/{types → esm}/HumanNameDisplay.d.ts +0 -0
  133. package/dist/esm/HumanNameDisplay.js +13 -0
  134. package/dist/esm/HumanNameDisplay.js.map +1 -0
  135. package/dist/{types → esm}/HumanNameInput.d.ts +0 -0
  136. package/dist/esm/HumanNameInput.js +49 -0
  137. package/dist/esm/HumanNameInput.js.map +1 -0
  138. package/dist/{types → esm}/IdentifierDisplay.d.ts +0 -0
  139. package/dist/esm/IdentifierDisplay.js +12 -0
  140. package/dist/esm/IdentifierDisplay.js.map +1 -0
  141. package/dist/{types → esm}/IdentifierInput.d.ts +0 -0
  142. package/dist/esm/IdentifierInput.js +19 -0
  143. package/dist/esm/IdentifierInput.js.map +1 -0
  144. package/dist/{types → esm}/Input.d.ts +0 -0
  145. package/dist/esm/Input.js +26 -0
  146. package/dist/esm/Input.js.map +1 -0
  147. package/dist/{types → esm}/InputRow.d.ts +0 -0
  148. package/dist/esm/InputRow.js +8 -0
  149. package/dist/esm/InputRow.js.map +1 -0
  150. package/dist/{types → esm}/Loading.d.ts +0 -0
  151. package/dist/esm/Loading.js +11 -0
  152. package/dist/esm/Loading.js.map +1 -0
  153. package/dist/{types → esm}/Logo.d.ts +0 -0
  154. package/dist/esm/Logo.js +14 -0
  155. package/dist/esm/Logo.js.map +1 -0
  156. package/dist/{types → esm}/MedplumLink.d.ts +0 -0
  157. package/dist/esm/MedplumLink.js +34 -0
  158. package/dist/esm/MedplumLink.js.map +1 -0
  159. package/dist/{types → esm}/MedplumProvider.d.ts +0 -0
  160. package/dist/esm/MedplumProvider.js +50 -0
  161. package/dist/esm/MedplumProvider.js.map +1 -0
  162. package/dist/{types → esm}/MenuItem.d.ts +0 -0
  163. package/dist/esm/MenuItem.js +8 -0
  164. package/dist/esm/MenuItem.js.map +1 -0
  165. package/dist/{types → esm}/MenuSeparator.d.ts +0 -0
  166. package/dist/esm/MenuSeparator.js +8 -0
  167. package/dist/esm/MenuSeparator.js.map +1 -0
  168. package/dist/{types → esm}/PatientTimeline.d.ts +0 -0
  169. package/dist/esm/PatientTimeline.js +40 -0
  170. package/dist/esm/PatientTimeline.js.map +1 -0
  171. package/dist/{types → esm}/PeriodInput.d.ts +0 -0
  172. package/dist/esm/PeriodInput.js +19 -0
  173. package/dist/esm/PeriodInput.js.map +1 -0
  174. package/dist/{types → esm}/PlanDefinitionBuilder.d.ts +0 -0
  175. package/dist/esm/PlanDefinitionBuilder.js +224 -0
  176. package/dist/esm/PlanDefinitionBuilder.js.map +1 -0
  177. package/dist/{types → esm}/Popup.d.ts +0 -0
  178. package/dist/esm/Popup.js +64 -0
  179. package/dist/esm/Popup.js.map +1 -0
  180. package/dist/{types → esm}/QuantityDisplay.d.ts +0 -0
  181. package/dist/esm/QuantityDisplay.js +28 -0
  182. package/dist/esm/QuantityDisplay.js.map +1 -0
  183. package/dist/{types → esm}/QuantityInput.d.ts +0 -0
  184. package/dist/esm/QuantityInput.js +33 -0
  185. package/dist/esm/QuantityInput.js.map +1 -0
  186. package/dist/{types → esm}/QuestionnaireBuilder.d.ts +0 -0
  187. package/dist/esm/QuestionnaireBuilder.js +217 -0
  188. package/dist/esm/QuestionnaireBuilder.js.map +1 -0
  189. package/dist/{types → esm}/QuestionnaireForm.d.ts +0 -0
  190. package/dist/esm/QuestionnaireForm.js +218 -0
  191. package/dist/esm/QuestionnaireForm.js.map +1 -0
  192. package/dist/{types → esm}/QuestionnaireUtils.d.ts +0 -0
  193. package/dist/esm/QuestionnaireUtils.js +103 -0
  194. package/dist/esm/QuestionnaireUtils.js.map +1 -0
  195. package/dist/{types → esm}/RangeDisplay.d.ts +0 -0
  196. package/dist/esm/RangeDisplay.js +21 -0
  197. package/dist/esm/RangeDisplay.js.map +1 -0
  198. package/dist/{types → esm}/RangeInput.d.ts +0 -0
  199. package/dist/esm/RangeInput.js +25 -0
  200. package/dist/esm/RangeInput.js.map +1 -0
  201. package/dist/{types → esm}/RatioDisplay.d.ts +0 -0
  202. package/dist/esm/RatioDisplay.js +16 -0
  203. package/dist/esm/RatioDisplay.js.map +1 -0
  204. package/dist/{types → esm}/RatioInput.d.ts +0 -0
  205. package/dist/esm/RatioInput.js +25 -0
  206. package/dist/esm/RatioInput.js.map +1 -0
  207. package/dist/{types → esm}/ReferenceDisplay.d.ts +0 -0
  208. package/dist/esm/ReferenceDisplay.js +21 -0
  209. package/dist/esm/ReferenceDisplay.js.map +1 -0
  210. package/dist/{types → esm}/ReferenceInput.d.ts +0 -0
  211. package/dist/esm/ReferenceInput.js +42 -0
  212. package/dist/esm/ReferenceInput.js.map +1 -0
  213. package/dist/{types → esm}/RegisterForm.d.ts +0 -0
  214. package/dist/esm/RegisterForm.js +121 -0
  215. package/dist/esm/RegisterForm.js.map +1 -0
  216. package/dist/{types → esm}/RequestGroupDisplay.d.ts +0 -0
  217. package/dist/esm/RequestGroupDisplay.js +72 -0
  218. package/dist/esm/RequestGroupDisplay.js.map +1 -0
  219. package/dist/{types → esm}/ResourceArrayDisplay.d.ts +0 -0
  220. package/dist/esm/ResourceArrayDisplay.js +14 -0
  221. package/dist/esm/ResourceArrayDisplay.js.map +1 -0
  222. package/dist/{types → esm}/ResourceArrayInput.d.ts +0 -0
  223. package/dist/esm/ResourceArrayInput.js +47 -0
  224. package/dist/esm/ResourceArrayInput.js.map +1 -0
  225. package/dist/{types → esm}/ResourceBadge.d.ts +0 -0
  226. package/dist/esm/ResourceBadge.js +13 -0
  227. package/dist/esm/ResourceBadge.js.map +1 -0
  228. package/dist/{types → esm}/ResourceBlame.d.ts +0 -0
  229. package/dist/esm/ResourceBlame.js +65 -0
  230. package/dist/esm/ResourceBlame.js.map +1 -0
  231. package/dist/{types → esm}/ResourceDiff.d.ts +0 -0
  232. package/dist/esm/ResourceDiff.js +28 -0
  233. package/dist/esm/ResourceDiff.js.map +1 -0
  234. package/dist/{types → esm}/ResourceDiffTable.d.ts +0 -0
  235. package/dist/esm/ResourceDiffTable.js +58 -0
  236. package/dist/esm/ResourceDiffTable.js.map +1 -0
  237. package/dist/{types → esm}/ResourceForm.d.ts +0 -0
  238. package/dist/esm/ResourceForm.js +55 -0
  239. package/dist/esm/ResourceForm.js.map +1 -0
  240. package/dist/{types → esm}/ResourceHistoryTable.d.ts +0 -0
  241. package/dist/esm/ResourceHistoryTable.js +45 -0
  242. package/dist/esm/ResourceHistoryTable.js.map +1 -0
  243. package/dist/{types → esm}/ResourceInput.d.ts +1 -0
  244. package/dist/esm/ResourceInput.js +41 -0
  245. package/dist/esm/ResourceInput.js.map +1 -0
  246. package/dist/{types → esm}/ResourceName.d.ts +0 -0
  247. package/dist/esm/ResourceName.js +16 -0
  248. package/dist/esm/ResourceName.js.map +1 -0
  249. package/dist/{types → esm}/ResourcePropertyDisplay.d.ts +0 -0
  250. package/dist/esm/ResourcePropertyDisplay.js +107 -0
  251. package/dist/esm/ResourcePropertyDisplay.js.map +1 -0
  252. package/dist/{types → esm}/ResourcePropertyInput.d.ts +0 -0
  253. package/dist/esm/ResourcePropertyInput.js +154 -0
  254. package/dist/esm/ResourcePropertyInput.js.map +1 -0
  255. package/dist/{types → esm}/ResourceTable.d.ts +0 -0
  256. package/dist/esm/ResourceTable.js +22 -0
  257. package/dist/esm/ResourceTable.js.map +1 -0
  258. package/dist/{types → esm}/ResourceTimeline.d.ts +0 -0
  259. package/dist/esm/ResourceTimeline.js +221 -0
  260. package/dist/esm/ResourceTimeline.js.map +1 -0
  261. package/dist/{types → esm}/Scheduler.d.ts +0 -0
  262. package/dist/esm/Scheduler.js +82 -0
  263. package/dist/esm/Scheduler.js.map +1 -0
  264. package/dist/{types → esm}/Scrollable.d.ts +0 -0
  265. package/dist/esm/Scrollable.js +12 -0
  266. package/dist/esm/Scrollable.js.map +1 -0
  267. package/dist/{types → esm}/SearchControl.d.ts +0 -0
  268. package/dist/esm/SearchControl.js +268 -0
  269. package/dist/esm/SearchControl.js.map +1 -0
  270. package/dist/{types → esm}/SearchControlField.d.ts +0 -0
  271. package/dist/esm/SearchControlField.js +98 -0
  272. package/dist/esm/SearchControlField.js.map +1 -0
  273. package/dist/{types → esm}/SearchFieldEditor.d.ts +0 -0
  274. package/dist/esm/SearchFieldEditor.js +192 -0
  275. package/dist/esm/SearchFieldEditor.js.map +1 -0
  276. package/dist/{types → esm}/SearchFilterEditor.d.ts +0 -0
  277. package/dist/esm/SearchFilterEditor.js +103 -0
  278. package/dist/esm/SearchFilterEditor.js.map +1 -0
  279. package/dist/{types → esm}/SearchFilterValueDialog.d.ts +0 -0
  280. package/dist/esm/SearchFilterValueDialog.js +22 -0
  281. package/dist/esm/SearchFilterValueDialog.js.map +1 -0
  282. package/dist/{types → esm}/SearchFilterValueDisplay.d.ts +0 -0
  283. package/dist/esm/SearchFilterValueDisplay.js +22 -0
  284. package/dist/esm/SearchFilterValueDisplay.js.map +1 -0
  285. package/dist/{types → esm}/SearchFilterValueInput.d.ts +0 -0
  286. package/dist/esm/SearchFilterValueInput.js +59 -0
  287. package/dist/esm/SearchFilterValueInput.js.map +1 -0
  288. package/dist/{types → esm}/SearchPopupMenu.d.ts +0 -0
  289. package/dist/esm/SearchPopupMenu.js +135 -0
  290. package/dist/esm/SearchPopupMenu.js.map +1 -0
  291. package/dist/{types → esm}/SearchUtils.d.ts +0 -0
  292. package/dist/esm/SearchUtils.js +487 -0
  293. package/dist/esm/SearchUtils.js.map +1 -0
  294. package/dist/{types → esm}/Select.d.ts +0 -0
  295. package/dist/esm/Select.js +16 -0
  296. package/dist/esm/Select.js.map +1 -0
  297. package/dist/{types → esm}/ServiceRequestTimeline.d.ts +0 -0
  298. package/dist/esm/ServiceRequestTimeline.js +53 -0
  299. package/dist/esm/ServiceRequestTimeline.js.map +1 -0
  300. package/dist/{types → esm}/SignInForm.d.ts +0 -0
  301. package/dist/esm/SignInForm.js +130 -0
  302. package/dist/esm/SignInForm.js.map +1 -0
  303. package/dist/{types → esm}/StatusBadge.d.ts +0 -0
  304. package/dist/esm/StatusBadge.js +8 -0
  305. package/dist/esm/StatusBadge.js.map +1 -0
  306. package/dist/{types → esm}/SubMenu.d.ts +0 -0
  307. package/dist/esm/SubMenu.js +38 -0
  308. package/dist/esm/SubMenu.js.map +1 -0
  309. package/dist/{types → esm}/Tab.d.ts +0 -0
  310. package/dist/esm/Tab.js +19 -0
  311. package/dist/esm/Tab.js.map +1 -0
  312. package/dist/{types → esm}/TabList.d.ts +0 -0
  313. package/dist/esm/TabList.js +23 -0
  314. package/dist/esm/TabList.js.map +1 -0
  315. package/dist/{types → esm}/TabPanel.d.ts +0 -0
  316. package/dist/esm/TabPanel.js +8 -0
  317. package/dist/esm/TabPanel.js.map +1 -0
  318. package/dist/{types → esm}/TabSwitch.d.ts +0 -0
  319. package/dist/esm/TabSwitch.js +16 -0
  320. package/dist/esm/TabSwitch.js.map +1 -0
  321. package/dist/{types → esm}/TextArea.d.ts +0 -0
  322. package/dist/esm/TextArea.js +16 -0
  323. package/dist/esm/TextArea.js.map +1 -0
  324. package/dist/{types → esm}/Timeline.d.ts +0 -0
  325. package/dist/esm/Timeline.js +48 -0
  326. package/dist/esm/Timeline.js.map +1 -0
  327. package/dist/esm/TimingInput.d.ts +8 -0
  328. package/dist/esm/TimingInput.js +90 -0
  329. package/dist/esm/TimingInput.js.map +1 -0
  330. package/dist/{types → esm}/TitleBar.d.ts +0 -0
  331. package/dist/esm/TitleBar.js +8 -0
  332. package/dist/esm/TitleBar.js.map +1 -0
  333. package/dist/{types → esm}/UploadButton.d.ts +0 -0
  334. package/dist/esm/UploadButton.js +55 -0
  335. package/dist/esm/UploadButton.js.map +1 -0
  336. package/dist/{types → esm}/constants.d.ts +0 -0
  337. package/dist/esm/constants.js +12 -0
  338. package/dist/esm/constants.js.map +1 -0
  339. package/dist/{types → esm}/index.d.ts +0 -1
  340. package/dist/esm/index.js +86 -5814
  341. package/dist/esm/index.js.map +1 -1
  342. package/dist/esm/index.min.js +1 -1
  343. package/dist/esm/index.min.js.map +1 -1
  344. package/dist/esm/node_modules/tslib/tslib.es6.js +27 -0
  345. package/dist/esm/node_modules/tslib/tslib.es6.js.map +1 -0
  346. package/dist/{types → esm}/stories/AddressInput.stories.d.ts +0 -0
  347. package/dist/{types → esm}/stories/AttachmentArrayInput.stories.d.ts +0 -0
  348. package/dist/{types → esm}/stories/AttachmentInput.stories.d.ts +0 -0
  349. package/dist/{types → esm}/stories/Autocomplete.stories.d.ts +1 -0
  350. package/dist/{types → esm}/stories/Avatar.stories.d.ts +0 -0
  351. package/dist/{types → esm}/stories/Button.stories.d.ts +0 -0
  352. package/dist/esm/stories/CodeableConceptDisplay.stories.d.ts +8 -0
  353. package/dist/{types → esm}/stories/DiagnosticReportDisplay.stories.d.ts +0 -0
  354. package/dist/{types → esm}/stories/Dialog.stories.d.ts +0 -0
  355. package/dist/{types → esm}/stories/EncounterTimeline.stories.d.ts +0 -0
  356. package/dist/{types → esm}/stories/FhirPathDisplay.stories.d.ts +0 -0
  357. package/dist/{types → esm}/stories/FormSection.stories.d.ts +0 -0
  358. package/dist/{types → esm}/stories/Header.stories.d.ts +0 -0
  359. package/dist/{types → esm}/stories/Input.stories.d.ts +0 -0
  360. package/dist/{types → esm}/stories/Loading.stories.d.ts +0 -0
  361. package/dist/{types → esm}/stories/Logo.stories.d.ts +0 -0
  362. package/dist/{types → esm}/stories/PatientTimeline.stories.d.ts +0 -0
  363. package/dist/{types → esm}/stories/PlanDefinitionBuilder.stories.d.ts +0 -0
  364. package/dist/{types → esm}/stories/QuestionnaireBuilder.stories.d.ts +0 -0
  365. package/dist/{types → esm}/stories/QuestionnaireForm.stories.d.ts +0 -0
  366. package/dist/{types → esm}/stories/ReferenceInput.stories.d.ts +0 -0
  367. package/dist/{types → esm}/stories/RegisterForm.stories.d.ts +0 -0
  368. package/dist/{types → esm}/stories/RequestGroupDisplay.stories.d.ts +0 -0
  369. package/dist/{types → esm}/stories/ResourceBlame.stories.d.ts +0 -0
  370. package/dist/{types → esm}/stories/ResourceForm.stories.d.ts +0 -0
  371. package/dist/{types → esm}/stories/ResourceHistoryTable.stories.d.ts +0 -0
  372. package/dist/{types → esm}/stories/ResourceTable.stories.d.ts +0 -0
  373. package/dist/{types → esm}/stories/Scheduler.stories.d.ts +0 -0
  374. package/dist/{types → esm}/stories/SearchControl.stories.d.ts +0 -0
  375. package/dist/{types → esm}/stories/Select.stories.d.ts +0 -0
  376. package/dist/{types → esm}/stories/SignInForm.stories.d.ts +0 -0
  377. package/dist/{types → esm}/stories/StatusBadge.stories.d.ts +0 -0
  378. package/dist/{types → esm}/stories/Tabs.stories.d.ts +0 -0
  379. package/dist/{types → esm}/stories/Timeline.stories.d.ts +0 -0
  380. package/dist/esm/stories/TimingInput.stories.d.ts +6 -0
  381. package/dist/{types → esm}/stories/UploadButton.stories.d.ts +0 -0
  382. package/dist/esm/styles.css +83 -79
  383. package/dist/{types → esm}/test.setup.d.ts +0 -0
  384. package/dist/{types → esm}/useResource.d.ts +0 -0
  385. package/dist/esm/useResource.js +65 -0
  386. package/dist/esm/useResource.js.map +1 -0
  387. package/dist/{types → esm}/utils/blame.d.ts +0 -0
  388. package/dist/esm/utils/blame.js +74 -0
  389. package/dist/esm/utils/blame.js.map +1 -0
  390. package/dist/{types → esm}/utils/date.d.ts +0 -0
  391. package/dist/esm/utils/date.js +48 -0
  392. package/dist/esm/utils/date.js.map +1 -0
  393. package/dist/{types → esm}/utils/diff.d.ts +0 -0
  394. package/dist/esm/utils/diff.js +118 -0
  395. package/dist/esm/utils/diff.js.map +1 -0
  396. package/dist/{types → esm}/utils/dom.d.ts +0 -0
  397. package/dist/esm/utils/dom.js +34 -0
  398. package/dist/esm/utils/dom.js.map +1 -0
  399. package/dist/{types → esm}/utils/outcomes.d.ts +0 -0
  400. package/dist/esm/utils/outcomes.js +7 -0
  401. package/dist/esm/utils/outcomes.js.map +1 -0
  402. package/dist/{types → esm}/utils/recaptcha.d.ts +0 -0
  403. package/dist/esm/utils/recaptcha.js +27 -0
  404. package/dist/esm/utils/recaptcha.js.map +1 -0
  405. package/dist/{types → esm}/utils.d.ts +0 -0
  406. package/dist/esm/utils.js +15 -0
  407. package/dist/esm/utils.js.map +1 -0
  408. package/package.json +7 -7
  409. package/stats.html +4034 -0
  410. package/dist/types/DateTimeDisplay.d.ts +0 -5
  411. package/dist/types/PeriodDisplay.d.ts +0 -6
@@ -0,0 +1,101 @@
1
+ import { formatDateTime, capitalize } from '@medplum/core';
2
+ import React from 'react';
3
+ import { CodeableConceptDisplay } from './CodeableConceptDisplay.js';
4
+ import { MedplumLink } from './MedplumLink.js';
5
+ import { QuantityDisplay } from './QuantityDisplay.js';
6
+ import { RangeDisplay } from './RangeDisplay.js';
7
+ import { ResourceBadge } from './ResourceBadge.js';
8
+ import { useResource } from './useResource.js';
9
+
10
+ function DiagnosticReportDisplay(props) {
11
+ var _a, _b;
12
+ const diagnosticReport = useResource(props.value);
13
+ const specimen = useResource((_a = diagnosticReport === null || diagnosticReport === void 0 ? void 0 : diagnosticReport.specimen) === null || _a === void 0 ? void 0 : _a[0]);
14
+ if (!diagnosticReport) {
15
+ return null;
16
+ }
17
+ let textContent = '';
18
+ if (diagnosticReport.presentedForm && diagnosticReport.presentedForm.length > 0) {
19
+ const pf = diagnosticReport.presentedForm[0];
20
+ if (((_b = pf.contentType) === null || _b === void 0 ? void 0 : _b.startsWith('text/plain')) && pf.data) {
21
+ textContent = window.atob(pf.data);
22
+ }
23
+ }
24
+ if (specimen === null || specimen === void 0 ? void 0 : specimen.note) {
25
+ for (const note of specimen.note) {
26
+ textContent += note.text + '\n\n';
27
+ }
28
+ }
29
+ return (React.createElement("div", { className: "medplum-diagnostic-report" },
30
+ React.createElement("h1", null, "Diagnostic Report"),
31
+ React.createElement("div", { className: "medplum-diagnostic-report-header" },
32
+ diagnosticReport.subject && (React.createElement("dl", null,
33
+ React.createElement("dt", null, "Subject"),
34
+ React.createElement("dd", null,
35
+ React.createElement(ResourceBadge, { value: diagnosticReport.subject, link: true })))),
36
+ diagnosticReport.resultsInterpreter &&
37
+ diagnosticReport.resultsInterpreter.map((interpreter) => (React.createElement("dl", { key: interpreter.reference },
38
+ React.createElement("dt", null, "Interpreter"),
39
+ React.createElement("dd", null,
40
+ React.createElement(ResourceBadge, { value: interpreter, link: true }))))),
41
+ diagnosticReport.issued && (React.createElement("dl", null,
42
+ React.createElement("dt", null, "Issued"),
43
+ React.createElement("dd", null, formatDateTime(diagnosticReport.issued)))),
44
+ diagnosticReport.status && (React.createElement("dl", null,
45
+ React.createElement("dt", null, "Status"),
46
+ React.createElement("dd", null, capitalize(diagnosticReport.status))))),
47
+ diagnosticReport.result && React.createElement(ObservationTable, { value: diagnosticReport.result }),
48
+ textContent && React.createElement("pre", null, textContent.trim())));
49
+ }
50
+ function ObservationTable(props) {
51
+ var _a;
52
+ return (React.createElement("table", { className: "medplum-table" },
53
+ React.createElement("thead", null,
54
+ React.createElement("tr", null,
55
+ React.createElement("th", null, "Test"),
56
+ React.createElement("th", null, "Value"),
57
+ React.createElement("th", null, "Reference Range"),
58
+ React.createElement("th", null, "Interpretation"))),
59
+ React.createElement("tbody", null, (_a = props.value) === null || _a === void 0 ? void 0 : _a.map((observation, index) => (React.createElement(ObservationRow, { key: 'obs-' + index, value: observation }))))));
60
+ }
61
+ function ObservationRow(props) {
62
+ const observation = useResource(props.value);
63
+ if (!observation) {
64
+ return null;
65
+ }
66
+ return (React.createElement("tr", null,
67
+ React.createElement("td", null,
68
+ React.createElement(MedplumLink, { to: observation },
69
+ React.createElement(CodeableConceptDisplay, { value: observation.code }))),
70
+ React.createElement("td", null,
71
+ React.createElement(ObservationValueDisplay, { value: observation })),
72
+ React.createElement("td", null,
73
+ React.createElement(ReferenceRangeDisplay, { value: observation.referenceRange })),
74
+ React.createElement("td", null, observation.interpretation && observation.interpretation.length > 0 && (React.createElement(CodeableConceptDisplay, { value: observation.interpretation[0] })))));
75
+ }
76
+ function ObservationValueDisplay(props) {
77
+ var _a;
78
+ const obs = props.value;
79
+ if (obs === null || obs === void 0 ? void 0 : obs.valueQuantity) {
80
+ return React.createElement(QuantityDisplay, { value: (_a = props.value) === null || _a === void 0 ? void 0 : _a.valueQuantity });
81
+ }
82
+ if (obs === null || obs === void 0 ? void 0 : obs.valueString) {
83
+ return React.createElement(React.Fragment, null, obs.valueString);
84
+ }
85
+ if (obs && 'component' in obs && (obs === null || obs === void 0 ? void 0 : obs.component)) {
86
+ return (React.createElement(React.Fragment, null, obs.component
87
+ .map((component, index) => (React.createElement(ObservationValueDisplay, { key: `obs-${index}`, value: component })))
88
+ .reduce((prev, curr) => [prev, ' / ', curr])));
89
+ }
90
+ return null;
91
+ }
92
+ function ReferenceRangeDisplay(props) {
93
+ const range = props.value && props.value.length > 0 && props.value[0];
94
+ if (!range) {
95
+ return null;
96
+ }
97
+ return React.createElement(RangeDisplay, { value: range });
98
+ }
99
+
100
+ export { DiagnosticReportDisplay, ObservationTable };
101
+ //# sourceMappingURL=DiagnosticReportDisplay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DiagnosticReportDisplay.js","sources":["../../src/DiagnosticReportDisplay.tsx"],"sourcesContent":["import { capitalize, formatDateTime } from '@medplum/core';\nimport {\n DiagnosticReport,\n Observation,\n ObservationComponent,\n ObservationReferenceRange,\n Reference,\n} from '@medplum/fhirtypes';\nimport React from 'react';\nimport { CodeableConceptDisplay } from './CodeableConceptDisplay';\nimport './DiagnosticReportDisplay.css';\nimport { MedplumLink } from './MedplumLink';\nimport { QuantityDisplay } from './QuantityDisplay';\nimport { RangeDisplay } from './RangeDisplay';\nimport { ResourceBadge } from './ResourceBadge';\nimport './Table.css';\nimport { useResource } from './useResource';\n\nexport interface DiagnosticReportDisplayProps {\n value?: DiagnosticReport | Reference<DiagnosticReport>;\n}\n\nexport function DiagnosticReportDisplay(props: DiagnosticReportDisplayProps): JSX.Element | null {\n const diagnosticReport = useResource(props.value);\n const specimen = useResource(diagnosticReport?.specimen?.[0]);\n if (!diagnosticReport) {\n return null;\n }\n\n let textContent = '';\n\n if (diagnosticReport.presentedForm && diagnosticReport.presentedForm.length > 0) {\n const pf = diagnosticReport.presentedForm[0];\n if (pf.contentType?.startsWith('text/plain') && pf.data) {\n textContent = window.atob(pf.data);\n }\n }\n\n if (specimen?.note) {\n for (const note of specimen.note) {\n textContent += note.text + '\\n\\n';\n }\n }\n\n return (\n <div className=\"medplum-diagnostic-report\">\n <h1>Diagnostic Report</h1>\n <div className=\"medplum-diagnostic-report-header\">\n {diagnosticReport.subject && (\n <dl>\n <dt>Subject</dt>\n <dd>\n <ResourceBadge value={diagnosticReport.subject} link={true} />\n </dd>\n </dl>\n )}\n {diagnosticReport.resultsInterpreter &&\n diagnosticReport.resultsInterpreter.map((interpreter) => (\n <dl key={interpreter.reference}>\n <dt>Interpreter</dt>\n <dd>\n <ResourceBadge value={interpreter} link={true} />\n </dd>\n </dl>\n ))}\n {diagnosticReport.issued && (\n <dl>\n <dt>Issued</dt>\n <dd>{formatDateTime(diagnosticReport.issued)}</dd>\n </dl>\n )}\n {diagnosticReport.status && (\n <dl>\n <dt>Status</dt>\n <dd>{capitalize(diagnosticReport.status)}</dd>\n </dl>\n )}\n </div>\n {diagnosticReport.result && <ObservationTable value={diagnosticReport.result} />}\n {textContent && <pre>{textContent.trim()}</pre>}\n </div>\n );\n}\n\nexport interface ObservationTableProps {\n value?: Observation[] | Reference<Observation>[];\n}\n\nexport function ObservationTable(props: ObservationTableProps): JSX.Element {\n return (\n <table className=\"medplum-table\">\n <thead>\n <tr>\n <th>Test</th>\n <th>Value</th>\n <th>Reference Range</th>\n <th>Interpretation</th>\n </tr>\n </thead>\n <tbody>\n {props.value?.map((observation, index) => (\n <ObservationRow key={'obs-' + index} value={observation} />\n ))}\n </tbody>\n </table>\n );\n}\n\ninterface ObservationRowProps {\n value: Observation | Reference<Observation>;\n}\n\nfunction ObservationRow(props: ObservationRowProps): JSX.Element | null {\n const observation = useResource(props.value);\n if (!observation) {\n return null;\n }\n\n return (\n <tr>\n <td>\n <MedplumLink to={observation}>\n <CodeableConceptDisplay value={observation.code} />\n </MedplumLink>\n </td>\n <td>\n <ObservationValueDisplay value={observation} />\n </td>\n <td>\n <ReferenceRangeDisplay value={observation.referenceRange} />\n </td>\n <td>\n {observation.interpretation && observation.interpretation.length > 0 && (\n <CodeableConceptDisplay value={observation.interpretation[0]} />\n )}\n </td>\n </tr>\n );\n}\n\ninterface ObservationValueDisplayProps {\n value?: Observation | ObservationComponent;\n}\n\nfunction ObservationValueDisplay(props: ObservationValueDisplayProps): JSX.Element | null {\n const obs = props.value;\n\n if (obs?.valueQuantity) {\n return <QuantityDisplay value={props.value?.valueQuantity} />;\n }\n\n if (obs?.valueString) {\n return <>{obs.valueString}</>;\n }\n\n if (obs && 'component' in obs && obs?.component) {\n return (\n <>\n {obs.component\n .map<React.ReactNode>((component: ObservationComponent, index: number) => (\n <ObservationValueDisplay key={`obs-${index}`} value={component} />\n ))\n .reduce((prev, curr) => [prev, ' / ', curr])}\n </>\n );\n }\n\n return null;\n}\n\ninterface ReferenceRangeProps {\n value?: ObservationReferenceRange[];\n}\n\nfunction ReferenceRangeDisplay(props: ReferenceRangeProps): JSX.Element | null {\n const range = props.value && props.value.length > 0 && props.value[0];\n if (!range) {\n return null;\n }\n return <RangeDisplay value={range} />;\n}\n"],"names":[],"mappings":";;;;;;;;;AAsBM,SAAU,uBAAuB,CAAC,KAAmC,EAAA;;IACzE,MAAM,gBAAgB,GAAG,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AAClD,IAAA,MAAM,QAAQ,GAAG,WAAW,CAAC,CAAA,EAAA,GAAA,gBAAgB,KAAhB,IAAA,IAAA,gBAAgB,KAAhB,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,gBAAgB,CAAE,QAAQ,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAG,CAAC,CAAC,CAAC,CAAC;IAC9D,IAAI,CAAC,gBAAgB,EAAE;AACrB,QAAA,OAAO,IAAI,CAAC;AACb,KAAA;IAED,IAAI,WAAW,GAAG,EAAE,CAAC;IAErB,IAAI,gBAAgB,CAAC,aAAa,IAAI,gBAAgB,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE;QAC/E,MAAM,EAAE,GAAG,gBAAgB,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;AAC7C,QAAA,IAAI,CAAA,CAAA,EAAA,GAAA,EAAE,CAAC,WAAW,MAAE,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,UAAU,CAAC,YAAY,CAAC,KAAI,EAAE,CAAC,IAAI,EAAE;YACvD,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;AACpC,SAAA;AACF,KAAA;AAED,IAAA,IAAI,QAAQ,KAAR,IAAA,IAAA,QAAQ,uBAAR,QAAQ,CAAE,IAAI,EAAE;AAClB,QAAA,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,IAAI,EAAE;AAChC,YAAA,WAAW,IAAI,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC;AACnC,SAAA;AACF,KAAA;AAED,IAAA,QACE,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,2BAA2B,EAAA;QACxC,KAA0B,CAAA,aAAA,CAAA,IAAA,EAAA,IAAA,EAAA,mBAAA,CAAA;QAC1B,KAAK,CAAA,aAAA,CAAA,KAAA,EAAA,EAAA,SAAS,EAAC,kCAAkC,EAAA;YAC9C,gBAAgB,CAAC,OAAO,KACvB,KAAA,CAAA,aAAA,CAAA,IAAA,EAAA,IAAA;gBACE,KAAgB,CAAA,aAAA,CAAA,IAAA,EAAA,IAAA,EAAA,SAAA,CAAA;AAChB,gBAAA,KAAA,CAAA,aAAA,CAAA,IAAA,EAAA,IAAA;AACE,oBAAA,KAAA,CAAA,aAAA,CAAC,aAAa,EAAA,EAAC,KAAK,EAAE,gBAAgB,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAI,CAAA,CAC3D,CACF,CACN;AACA,YAAA,gBAAgB,CAAC,kBAAkB;AAClC,gBAAA,gBAAgB,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,WAAW,MAClD,KAAI,CAAA,aAAA,CAAA,IAAA,EAAA,EAAA,GAAG,EAAE,WAAW,CAAC,SAAS,EAAA;oBAC5B,KAAoB,CAAA,aAAA,CAAA,IAAA,EAAA,IAAA,EAAA,aAAA,CAAA;AACpB,oBAAA,KAAA,CAAA,aAAA,CAAA,IAAA,EAAA,IAAA;AACE,wBAAA,KAAA,CAAA,aAAA,CAAC,aAAa,EAAA,EAAC,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,EAAA,CAAI,CAC9C,CACF,CACN,CAAC;YACH,gBAAgB,CAAC,MAAM,KACtB,KAAA,CAAA,aAAA,CAAA,IAAA,EAAA,IAAA;gBACE,KAAe,CAAA,aAAA,CAAA,IAAA,EAAA,IAAA,EAAA,QAAA,CAAA;gBACf,KAAK,CAAA,aAAA,CAAA,IAAA,EAAA,IAAA,EAAA,cAAc,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAM,CAC/C,CACN;YACA,gBAAgB,CAAC,MAAM,KACtB,KAAA,CAAA,aAAA,CAAA,IAAA,EAAA,IAAA;gBACE,KAAe,CAAA,aAAA,CAAA,IAAA,EAAA,IAAA,EAAA,QAAA,CAAA;gBACf,KAAK,CAAA,aAAA,CAAA,IAAA,EAAA,IAAA,EAAA,UAAU,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAM,CAC3C,CACN,CACG;QACL,gBAAgB,CAAC,MAAM,IAAI,KAAC,CAAA,aAAA,CAAA,gBAAgB,EAAC,EAAA,KAAK,EAAE,gBAAgB,CAAC,MAAM,EAAI,CAAA;QAC/E,WAAW,IAAI,iCAAM,WAAW,CAAC,IAAI,EAAE,CAAO,CAC3C,EACN;AACJ,CAAC;AAMK,SAAU,gBAAgB,CAAC,KAA4B,EAAA;;AAC3D,IAAA,QACE,KAAA,CAAA,aAAA,CAAA,OAAA,EAAA,EAAO,SAAS,EAAC,eAAe,EAAA;AAC9B,QAAA,KAAA,CAAA,aAAA,CAAA,OAAA,EAAA,IAAA;AACE,YAAA,KAAA,CAAA,aAAA,CAAA,IAAA,EAAA,IAAA;gBACE,KAAa,CAAA,aAAA,CAAA,IAAA,EAAA,IAAA,EAAA,MAAA,CAAA;gBACb,KAAc,CAAA,aAAA,CAAA,IAAA,EAAA,IAAA,EAAA,OAAA,CAAA;gBACd,KAAwB,CAAA,aAAA,CAAA,IAAA,EAAA,IAAA,EAAA,iBAAA,CAAA;AACxB,gBAAA,KAAA,CAAA,aAAA,CAAA,IAAA,EAAA,IAAA,EAAA,gBAAA,CAAuB,CACpB,CACC;AACR,QAAA,KAAA,CAAA,aAAA,CAAA,OAAA,EAAA,IAAA,EACG,CAAA,EAAA,GAAA,KAAK,CAAC,KAAK,0CAAE,GAAG,CAAC,CAAC,WAAW,EAAE,KAAK,MACnC,KAAA,CAAA,aAAA,CAAC,cAAc,EAAA,EAAC,GAAG,EAAE,MAAM,GAAG,KAAK,EAAE,KAAK,EAAE,WAAW,GAAI,CAC5D,CAAC,CACI,CACF,EACR;AACJ,CAAC;AAMD,SAAS,cAAc,CAAC,KAA0B,EAAA;IAChD,MAAM,WAAW,GAAG,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC7C,IAAI,CAAC,WAAW,EAAE;AAChB,QAAA,OAAO,IAAI,CAAC;AACb,KAAA;AAED,IAAA,QACE,KAAA,CAAA,aAAA,CAAA,IAAA,EAAA,IAAA;AACE,QAAA,KAAA,CAAA,aAAA,CAAA,IAAA,EAAA,IAAA;AACE,YAAA,KAAA,CAAA,aAAA,CAAC,WAAW,EAAA,EAAC,EAAE,EAAE,WAAW,EAAA;gBAC1B,KAAC,CAAA,aAAA,CAAA,sBAAsB,IAAC,KAAK,EAAE,WAAW,CAAC,IAAI,EAAI,CAAA,CACvC,CACX;AACL,QAAA,KAAA,CAAA,aAAA,CAAA,IAAA,EAAA,IAAA;AACE,YAAA,KAAA,CAAA,aAAA,CAAC,uBAAuB,EAAC,EAAA,KAAK,EAAE,WAAW,GAAI,CAC5C;AACL,QAAA,KAAA,CAAA,aAAA,CAAA,IAAA,EAAA,IAAA;YACE,KAAC,CAAA,aAAA,CAAA,qBAAqB,IAAC,KAAK,EAAE,WAAW,CAAC,cAAc,GAAI,CACzD;AACL,QAAA,KAAA,CAAA,aAAA,CAAA,IAAA,EAAA,IAAA,EACG,WAAW,CAAC,cAAc,IAAI,WAAW,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,KAClE,KAAA,CAAA,aAAA,CAAC,sBAAsB,EAAA,EAAC,KAAK,EAAE,WAAW,CAAC,cAAc,CAAC,CAAC,CAAC,EAAI,CAAA,CACjE,CACE,CACF,EACL;AACJ,CAAC;AAMD,SAAS,uBAAuB,CAAC,KAAmC,EAAA;;AAClE,IAAA,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC;AAExB,IAAA,IAAI,GAAG,KAAH,IAAA,IAAA,GAAG,uBAAH,GAAG,CAAE,aAAa,EAAE;AACtB,QAAA,OAAO,KAAC,CAAA,aAAA,CAAA,eAAe,EAAC,EAAA,KAAK,EAAE,CAAA,EAAA,GAAA,KAAK,CAAC,KAAK,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAE,aAAa,EAAA,CAAI,CAAC;AAC/D,KAAA;AAED,IAAA,IAAI,GAAG,KAAH,IAAA,IAAA,GAAG,uBAAH,GAAG,CAAE,WAAW,EAAE;AACpB,QAAA,OAAO,KAAG,CAAA,aAAA,CAAA,KAAA,CAAA,QAAA,EAAA,IAAA,EAAA,GAAG,CAAC,WAAW,CAAI,CAAC;AAC/B,KAAA;AAED,IAAA,IAAI,GAAG,IAAI,WAAW,IAAI,GAAG,KAAI,GAAG,KAAH,IAAA,IAAA,GAAG,KAAH,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,GAAG,CAAE,SAAS,CAAA,EAAE;AAC/C,QAAA,QACE,KAAA,CAAA,aAAA,CAAA,KAAA,CAAA,QAAA,EAAA,IAAA,EACG,GAAG,CAAC,SAAS;aACX,GAAG,CAAkB,CAAC,SAA+B,EAAE,KAAa,MACnE,KAAC,CAAA,aAAA,CAAA,uBAAuB,IAAC,GAAG,EAAE,CAAO,IAAA,EAAA,KAAK,CAAE,CAAA,EAAE,KAAK,EAAE,SAAS,EAAI,CAAA,CACnE,CAAC;AACD,aAAA,MAAM,CAAC,CAAC,IAAI,EAAE,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAC7C,EACH;AACH,KAAA;AAED,IAAA,OAAO,IAAI,CAAC;AACd,CAAC;AAMD,SAAS,qBAAqB,CAAC,KAA0B,EAAA;IACvD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACtE,IAAI,CAAC,KAAK,EAAE;AACV,QAAA,OAAO,IAAI,CAAC;AACb,KAAA;AACD,IAAA,OAAO,oBAAC,YAAY,EAAA,EAAC,KAAK,EAAE,KAAK,GAAI,CAAC;AACxC;;;;"}
File without changes
@@ -0,0 +1,43 @@
1
+ import React, { useState } from 'react';
2
+ import { Button } from './Button.js';
3
+ import { killEvent } from './utils/dom.js';
4
+
5
+ function Dialog(props) {
6
+ const [x, setX] = useState(100);
7
+ const [y, setY] = useState(100);
8
+ if (!props.visible) {
9
+ return null;
10
+ }
11
+ function handleMouseDown(downEvent) {
12
+ killEvent(downEvent);
13
+ const dragX = downEvent.clientX - x;
14
+ const dragY = downEvent.clientY - y;
15
+ function handleMouseMove(moveEvent) {
16
+ killEvent(moveEvent);
17
+ setX(moveEvent.clientX - dragX);
18
+ setY(moveEvent.clientY - dragY);
19
+ }
20
+ function handleMouseUp(upEvent) {
21
+ killEvent(upEvent);
22
+ document.removeEventListener('mouseup', handleMouseUp, true);
23
+ document.removeEventListener('mousemove', handleMouseMove, true);
24
+ }
25
+ document.addEventListener('mouseup', handleMouseUp, true);
26
+ document.addEventListener('mousemove', handleMouseMove, true);
27
+ }
28
+ return (React.createElement(React.Fragment, null,
29
+ React.createElement("div", { className: "modal-dialog-bg" }),
30
+ React.createElement("div", { className: "modal-dialog", "data-testid": "dialog", tabIndex: 0, style: { left: x + 'px', top: y + 'px' } },
31
+ React.createElement("div", { className: "modal-dialog-title", onMouseDown: (e) => handleMouseDown(e) },
32
+ React.createElement("span", { className: "modal-dialog-title-text" }, props.title),
33
+ React.createElement("span", { className: "modal-dialog-title-close", tabIndex: 0, onClick: props.onCancel },
34
+ React.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor" },
35
+ React.createElement("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M6 18L18 6M6 6l12 12" })))),
36
+ React.createElement("div", { className: "modal-dialog-content" }, props.children),
37
+ React.createElement("div", { className: "modal-dialog-buttons" },
38
+ React.createElement(Button, { testid: "dialog-ok", onClick: props.onOk }, "OK"),
39
+ React.createElement(Button, { testid: "dialog-cancel", onClick: props.onCancel }, "Cancel")))));
40
+ }
41
+
42
+ export { Dialog };
43
+ //# sourceMappingURL=Dialog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Dialog.js","sources":["../../src/Dialog.tsx"],"sourcesContent":["import React, { useState } from 'react';\nimport { Button } from './Button';\nimport { killEvent } from './utils/dom';\nimport './Dialog.css';\n\nexport interface DialogProps {\n visible: boolean;\n title: string;\n children?: React.ReactNode;\n onOk: () => void;\n onCancel: () => void;\n}\n\nexport function Dialog(props: DialogProps): JSX.Element | null {\n const [x, setX] = useState(100);\n const [y, setY] = useState(100);\n\n if (!props.visible) {\n return null;\n }\n\n function handleMouseDown(downEvent: React.MouseEvent): void {\n killEvent(downEvent);\n\n const dragX = downEvent.clientX - x;\n const dragY = downEvent.clientY - y;\n\n function handleMouseMove(moveEvent: MouseEvent): void {\n killEvent(moveEvent);\n setX(moveEvent.clientX - dragX);\n setY(moveEvent.clientY - dragY);\n }\n\n function handleMouseUp(upEvent: MouseEvent): void {\n killEvent(upEvent);\n document.removeEventListener('mouseup', handleMouseUp, true);\n document.removeEventListener('mousemove', handleMouseMove, true);\n }\n\n document.addEventListener('mouseup', handleMouseUp, true);\n document.addEventListener('mousemove', handleMouseMove, true);\n }\n\n return (\n <>\n <div className=\"modal-dialog-bg\"></div>\n <div className=\"modal-dialog\" data-testid=\"dialog\" tabIndex={0} style={{ left: x + 'px', top: y + 'px' }}>\n <div className=\"modal-dialog-title\" onMouseDown={(e) => handleMouseDown(e)}>\n <span className=\"modal-dialog-title-text\">{props.title}</span>\n <span className=\"modal-dialog-title-close\" tabIndex={0} onClick={props.onCancel}>\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </span>\n </div>\n <div className=\"modal-dialog-content\">{props.children}</div>\n <div className=\"modal-dialog-buttons\">\n <Button testid=\"dialog-ok\" onClick={props.onOk}>\n OK\n </Button>\n <Button testid=\"dialog-cancel\" onClick={props.onCancel}>\n Cancel\n </Button>\n </div>\n </div>\n </>\n );\n}\n"],"names":[],"mappings":"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"}
File without changes
@@ -0,0 +1,9 @@
1
+ import React from 'react';
2
+
3
+ function Document(props) {
4
+ return (React.createElement("main", { className: "medplum-document" },
5
+ React.createElement("article", { style: { maxWidth: props.width } }, props.children)));
6
+ }
7
+
8
+ export { Document };
9
+ //# sourceMappingURL=Document.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Document.js","sources":["../../src/Document.tsx"],"sourcesContent":["import React from 'react';\nimport './Document.css';\n\nexport interface DocumentProps {\n width?: number;\n children?: React.ReactNode;\n}\n\nexport function Document(props: DocumentProps): JSX.Element {\n return (\n <main className=\"medplum-document\">\n <article style={{ maxWidth: props.width }}>{props.children}</article>\n </main>\n );\n}\n"],"names":[],"mappings":";;AAQM,SAAU,QAAQ,CAAC,KAAoB,EAAA;AAC3C,IAAA,QACE,KAAA,CAAA,aAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,kBAAkB,EAAA;AAChC,QAAA,KAAA,CAAA,aAAA,CAAA,SAAA,EAAA,EAAS,KAAK,EAAE,EAAE,QAAQ,EAAE,KAAK,CAAC,KAAK,EAAE,EAAA,EAAG,KAAK,CAAC,QAAQ,CAAW,CAChE,EACP;AACJ;;;;"}
File without changes
@@ -0,0 +1,47 @@
1
+ import { getReferenceString, createReference } from '@medplum/core';
2
+ import React from 'react';
3
+ import { ResourceTimeline } from './ResourceTimeline.js';
4
+
5
+ function EncounterTimeline(props) {
6
+ return (React.createElement(ResourceTimeline, { value: props.encounter, buildSearchRequests: (resource) => ({
7
+ resourceType: 'Bundle',
8
+ type: 'batch',
9
+ entry: [
10
+ {
11
+ request: {
12
+ method: 'GET',
13
+ url: `${getReferenceString(resource)}/_history`,
14
+ },
15
+ },
16
+ {
17
+ request: {
18
+ method: 'GET',
19
+ url: `Communication?encounter=${getReferenceString(resource)}`,
20
+ },
21
+ },
22
+ {
23
+ request: {
24
+ method: 'GET',
25
+ url: `Media?encounter=${getReferenceString(resource)}`,
26
+ },
27
+ },
28
+ ],
29
+ }), createCommunication: (resource, sender, text) => ({
30
+ resourceType: 'Communication',
31
+ encounter: createReference(resource),
32
+ subject: resource.subject,
33
+ sender: createReference(sender),
34
+ sent: new Date().toISOString(),
35
+ payload: [{ contentString: text }],
36
+ }), createMedia: (resource, operator, content) => ({
37
+ resourceType: 'Media',
38
+ encounter: createReference(resource),
39
+ subject: resource.subject,
40
+ operator: createReference(operator),
41
+ issued: new Date().toISOString(),
42
+ content,
43
+ }) }));
44
+ }
45
+
46
+ export { EncounterTimeline };
47
+ //# sourceMappingURL=EncounterTimeline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EncounterTimeline.js","sources":["../../src/EncounterTimeline.tsx"],"sourcesContent":["import { createReference, getReferenceString, ProfileResource } from '@medplum/core';\nimport { Attachment, Encounter, Reference, Resource } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { ResourceTimeline } from './ResourceTimeline';\n\nexport interface EncounterTimelineProps {\n encounter: Encounter | Reference<Encounter>;\n}\n\nexport function EncounterTimeline(props: EncounterTimelineProps): JSX.Element {\n return (\n <ResourceTimeline\n value={props.encounter}\n buildSearchRequests={(resource: Resource) => ({\n resourceType: 'Bundle',\n type: 'batch',\n entry: [\n {\n request: {\n method: 'GET',\n url: `${getReferenceString(resource)}/_history`,\n },\n },\n {\n request: {\n method: 'GET',\n url: `Communication?encounter=${getReferenceString(resource)}`,\n },\n },\n {\n request: {\n method: 'GET',\n url: `Media?encounter=${getReferenceString(resource)}`,\n },\n },\n ],\n })}\n createCommunication={(resource: Encounter, sender: ProfileResource, text: string) => ({\n resourceType: 'Communication',\n encounter: createReference(resource),\n subject: resource.subject,\n sender: createReference(sender),\n sent: new Date().toISOString(),\n payload: [{ contentString: text }],\n })}\n createMedia={(resource: Encounter, operator: ProfileResource, content: Attachment) => ({\n resourceType: 'Media',\n encounter: createReference(resource),\n subject: resource.subject,\n operator: createReference(operator),\n issued: new Date().toISOString(),\n content,\n })}\n />\n );\n}\n"],"names":[],"mappings":";;;;AASM,SAAU,iBAAiB,CAAC,KAA6B,EAAA;AAC7D,IAAA,QACE,KAAC,CAAA,aAAA,CAAA,gBAAgB,EACf,EAAA,KAAK,EAAE,KAAK,CAAC,SAAS,EACtB,mBAAmB,EAAE,CAAC,QAAkB,MAAM;AAC5C,YAAA,YAAY,EAAE,QAAQ;AACtB,YAAA,IAAI,EAAE,OAAO;AACb,YAAA,KAAK,EAAE;AACL,gBAAA;AACE,oBAAA,OAAO,EAAE;AACP,wBAAA,MAAM,EAAE,KAAK;AACb,wBAAA,GAAG,EAAE,CAAG,EAAA,kBAAkB,CAAC,QAAQ,CAAC,CAAW,SAAA,CAAA;AAChD,qBAAA;AACF,iBAAA;AACD,gBAAA;AACE,oBAAA,OAAO,EAAE;AACP,wBAAA,MAAM,EAAE,KAAK;AACb,wBAAA,GAAG,EAAE,CAA2B,wBAAA,EAAA,kBAAkB,CAAC,QAAQ,CAAC,CAAE,CAAA;AAC/D,qBAAA;AACF,iBAAA;AACD,gBAAA;AACE,oBAAA,OAAO,EAAE;AACP,wBAAA,MAAM,EAAE,KAAK;AACb,wBAAA,GAAG,EAAE,CAAmB,gBAAA,EAAA,kBAAkB,CAAC,QAAQ,CAAC,CAAE,CAAA;AACvD,qBAAA;AACF,iBAAA;AACF,aAAA;AACF,SAAA,CAAC,EACF,mBAAmB,EAAE,CAAC,QAAmB,EAAE,MAAuB,EAAE,IAAY,MAAM;AACpF,YAAA,YAAY,EAAE,eAAe;AAC7B,YAAA,SAAS,EAAE,eAAe,CAAC,QAAQ,CAAC;YACpC,OAAO,EAAE,QAAQ,CAAC,OAAO;AACzB,YAAA,MAAM,EAAE,eAAe,CAAC,MAAM,CAAC;AAC/B,YAAA,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;AAC9B,YAAA,OAAO,EAAE,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;AACnC,SAAA,CAAC,EACF,WAAW,EAAE,CAAC,QAAmB,EAAE,QAAyB,EAAE,OAAmB,MAAM;AACrF,YAAA,YAAY,EAAE,OAAO;AACrB,YAAA,SAAS,EAAE,eAAe,CAAC,QAAQ,CAAC;YACpC,OAAO,EAAE,QAAQ,CAAC,OAAO;AACzB,YAAA,QAAQ,EAAE,eAAe,CAAC,QAAQ,CAAC;AACnC,YAAA,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YAChC,OAAO;SACR,CAAC,EAAA,CACF,EACF;AACJ;;;;"}
File without changes
@@ -0,0 +1,27 @@
1
+ import React from 'react';
2
+
3
+ /**
4
+ * ErrorBoundary is a React component that handles errors in its child components.
5
+ * See: https://reactjs.org/docs/error-boundaries.html
6
+ */
7
+ class ErrorBoundary extends React.Component {
8
+ constructor(props) {
9
+ super(props);
10
+ this.state = {};
11
+ }
12
+ static getDerivedStateFromError(error) {
13
+ return { error };
14
+ }
15
+ componentDidCatch(error, errorInfo) {
16
+ console.error('Uncaught error:', error, errorInfo);
17
+ }
18
+ render() {
19
+ if (this.state.error) {
20
+ return React.createElement("h1", null, "Something went wrong.");
21
+ }
22
+ return this.props.children;
23
+ }
24
+ }
25
+
26
+ export { ErrorBoundary };
27
+ //# sourceMappingURL=ErrorBoundary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ErrorBoundary.js","sources":["../../src/ErrorBoundary.tsx"],"sourcesContent":["import React, { ErrorInfo, ReactNode } from 'react';\n\nexport interface ErrorBoundaryProps {\n children: ReactNode;\n}\n\nexport interface ErrorBoundaryState {\n error?: any;\n}\n\n/**\n * ErrorBoundary is a React component that handles errors in its child components.\n * See: https://reactjs.org/docs/error-boundaries.html\n */\nexport class ErrorBoundary extends React.Component<ErrorBoundaryProps, ErrorBoundaryState> {\n state: ErrorBoundaryState;\n\n constructor(props: ErrorBoundaryProps) {\n super(props);\n this.state = {};\n }\n\n static getDerivedStateFromError(error: any): ErrorBoundaryState {\n return { error };\n }\n\n componentDidCatch(error: Error, errorInfo: ErrorInfo): void {\n console.error('Uncaught error:', error, errorInfo);\n }\n\n render(): ReactNode {\n if (this.state.error) {\n return <h1>Something went wrong.</h1>;\n }\n\n return this.props.children;\n }\n}\n"],"names":[],"mappings":";;AAUA;;;AAGG;AACU,MAAA,aAAc,SAAQ,KAAK,CAAC,SAAiD,CAAA;AAGxF,IAAA,WAAA,CAAY,KAAyB,EAAA;QACnC,KAAK,CAAC,KAAK,CAAC,CAAC;AACb,QAAA,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;KACjB;IAED,OAAO,wBAAwB,CAAC,KAAU,EAAA;QACxC,OAAO,EAAE,KAAK,EAAE,CAAC;KAClB;IAED,iBAAiB,CAAC,KAAY,EAAE,SAAoB,EAAA;QAClD,OAAO,CAAC,KAAK,CAAC,iBAAiB,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;KACpD;IAED,MAAM,GAAA;AACJ,QAAA,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE;AACpB,YAAA,OAAO,wDAA8B,CAAC;AACvC,SAAA;AAED,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;KAC5B;AACF;;;;"}
File without changes
@@ -0,0 +1,14 @@
1
+ import { stringify } from '@medplum/core';
2
+ import React from 'react';
3
+ import { TextArea } from './TextArea.js';
4
+
5
+ function ExtensionInput(props) {
6
+ return (React.createElement(TextArea, { testid: "extension-input", name: props.name, defaultValue: stringify(props.defaultValue), monospace: true, onChange: (newValue) => {
7
+ if (props.onChange) {
8
+ props.onChange(JSON.parse(newValue));
9
+ }
10
+ } }));
11
+ }
12
+
13
+ export { ExtensionInput };
14
+ //# sourceMappingURL=ExtensionInput.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExtensionInput.js","sources":["../../src/ExtensionInput.tsx"],"sourcesContent":["import { stringify } from '@medplum/core';\nimport { Extension } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { TextArea } from './TextArea';\n\nexport interface ExtensionInputProps {\n name: string;\n defaultValue?: Extension;\n onChange?: (value: Extension) => void;\n}\n\nexport function ExtensionInput(props: ExtensionInputProps): JSX.Element {\n return (\n <TextArea\n testid=\"extension-input\"\n name={props.name}\n defaultValue={stringify(props.defaultValue)}\n monospace={true}\n onChange={(newValue: string) => {\n if (props.onChange) {\n props.onChange(JSON.parse(newValue));\n }\n }}\n />\n );\n}\n"],"names":[],"mappings":";;;;AAWM,SAAU,cAAc,CAAC,KAA0B,EAAA;AACvD,IAAA,QACE,KAAA,CAAA,aAAA,CAAC,QAAQ,EAAA,EACP,MAAM,EAAC,iBAAiB,EACxB,IAAI,EAAE,KAAK,CAAC,IAAI,EAChB,YAAY,EAAE,SAAS,CAAC,KAAK,CAAC,YAAY,CAAC,EAC3C,SAAS,EAAE,IAAI,EACf,QAAQ,EAAE,CAAC,QAAgB,KAAI;YAC7B,IAAI,KAAK,CAAC,QAAQ,EAAE;gBAClB,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;AACtC,aAAA;SACF,EAAA,CACD,EACF;AACJ;;;;"}
File without changes
@@ -0,0 +1,23 @@
1
+ import { evalFhirPath } from '@medplum/core';
2
+ import React from 'react';
3
+ import { ResourcePropertyDisplay } from './ResourcePropertyDisplay.js';
4
+
5
+ function FhirPathDisplay(props) {
6
+ let value;
7
+ try {
8
+ value = evalFhirPath(props.path, props.resource);
9
+ }
10
+ catch (err) {
11
+ console.warn('FhirPathDisplay:', err);
12
+ return null;
13
+ }
14
+ if (value.length > 1) {
15
+ throw new Error(`Component "path" for "FhirPathDisplay" must resolve to a single element. \
16
+ Received ${value.length} elements \
17
+ [${JSON.stringify(value, null, 2)}]`);
18
+ }
19
+ return React.createElement(ResourcePropertyDisplay, { value: value[0] || '', propertyType: props.propertyType });
20
+ }
21
+
22
+ export { FhirPathDisplay };
23
+ //# sourceMappingURL=FhirPathDisplay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FhirPathDisplay.js","sources":["../../src/FhirPathDisplay.tsx"],"sourcesContent":["import { evalFhirPath, PropertyType } from '@medplum/core';\nimport { Resource } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { ResourcePropertyDisplay } from './ResourcePropertyDisplay';\n\nexport interface FhirPathDisplayProps {\n resource: Resource;\n path: string;\n propertyType: PropertyType;\n}\n\nexport function FhirPathDisplay(props: FhirPathDisplayProps): JSX.Element | null {\n let value;\n\n try {\n value = evalFhirPath(props.path, props.resource);\n } catch (err) {\n console.warn('FhirPathDisplay:', err);\n return null;\n }\n\n if (value.length > 1) {\n throw new Error(\n `Component \"path\" for \"FhirPathDisplay\" must resolve to a single element. \\\n Received ${value.length} elements \\\n [${JSON.stringify(value, null, 2)}]`\n );\n }\n return <ResourcePropertyDisplay value={value[0] || ''} propertyType={props.propertyType} />;\n}\n"],"names":[],"mappings":";;;;AAWM,SAAU,eAAe,CAAC,KAA2B,EAAA;AACzD,IAAA,IAAI,KAAK,CAAC;IAEV,IAAI;QACF,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;AAClD,KAAA;AAAC,IAAA,OAAO,GAAG,EAAE;AACZ,QAAA,OAAO,CAAC,IAAI,CAAC,kBAAkB,EAAE,GAAG,CAAC,CAAC;AACtC,QAAA,OAAO,IAAI,CAAC;AACb,KAAA;AAED,IAAA,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;QACpB,MAAM,IAAI,KAAK,CACb,CAAA;AACY,gBAAA,EAAA,KAAK,CAAC,MAAM,CAAA;UACpB,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAG,CAAA,CAAA,CACtC,CAAC;AACH,KAAA;AACD,IAAA,OAAO,oBAAC,uBAAuB,EAAA,EAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,YAAY,EAAE,KAAK,CAAC,YAAY,GAAI,CAAC;AAC9F;;;;"}
File without changes
@@ -0,0 +1,117 @@
1
+ import React, { useState, useRef, useEffect } from 'react';
2
+ import { Button } from './Button.js';
3
+ import { FhirPathDisplay } from './FhirPathDisplay.js';
4
+ import { Loading } from './Loading.js';
5
+ import { useMedplum } from './MedplumProvider.js';
6
+ import { SearchClickEvent } from './SearchControl.js';
7
+ import { killEvent, isCheckboxCell } from './utils/dom.js';
8
+
9
+ /**
10
+ * The FhirPathTable component represents the embeddable search table control.
11
+ */
12
+ function FhirPathTable(props) {
13
+ var _a, _b, _c, _d, _e;
14
+ const medplum = useMedplum();
15
+ const [schema, setSchema] = useState();
16
+ const [outcome, setOutcome] = useState();
17
+ const { query, fields } = props;
18
+ const [response, setResponse] = useState();
19
+ const [selected, setSelected] = useState({});
20
+ const responseRef = useRef();
21
+ responseRef.current = response;
22
+ const selectedRef = useRef({});
23
+ selectedRef.current = selected;
24
+ useEffect(() => {
25
+ setOutcome(undefined);
26
+ medplum.graphql(query).then(setResponse).catch(setOutcome);
27
+ }, [medplum, query]);
28
+ function handleSingleCheckboxClick(e, id) {
29
+ e.stopPropagation();
30
+ const el = e.target;
31
+ const checked = el.checked;
32
+ const newSelected = Object.assign({}, selectedRef.current);
33
+ if (checked) {
34
+ newSelected[id] = true;
35
+ }
36
+ else {
37
+ delete newSelected[id];
38
+ }
39
+ setSelected(newSelected);
40
+ }
41
+ function handleAllCheckboxClick(e) {
42
+ var _a, _b;
43
+ e.stopPropagation();
44
+ const el = e.target;
45
+ const checked = el.checked;
46
+ const newSelected = {};
47
+ const resources = (_b = (_a = responseRef.current) === null || _a === void 0 ? void 0 : _a.data) === null || _b === void 0 ? void 0 : _b.ResourceList;
48
+ if (checked && resources) {
49
+ resources.forEach((resource) => {
50
+ if (resource === null || resource === void 0 ? void 0 : resource.id) {
51
+ newSelected[resource.id] = true;
52
+ }
53
+ });
54
+ }
55
+ setSelected(newSelected);
56
+ }
57
+ function isAllSelected() {
58
+ var _a, _b;
59
+ const resources = (_b = (_a = responseRef.current) === null || _a === void 0 ? void 0 : _a.data) === null || _b === void 0 ? void 0 : _b.ResourceList;
60
+ if (!resources || resources.length === 0) {
61
+ return false;
62
+ }
63
+ for (const resource of resources) {
64
+ if ((resource === null || resource === void 0 ? void 0 : resource.id) && !selectedRef.current[resource.id]) {
65
+ return false;
66
+ }
67
+ }
68
+ return true;
69
+ }
70
+ function handleRowClick(e, resource) {
71
+ if (isCheckboxCell(e.target)) {
72
+ // Ignore clicks on checkboxes
73
+ return;
74
+ }
75
+ killEvent(e);
76
+ if (e.button !== 1 && props.onClick) {
77
+ props.onClick(new SearchClickEvent(resource, e));
78
+ }
79
+ if (e.button === 1 && props.onAuxClick) {
80
+ props.onAuxClick(new SearchClickEvent(resource, e));
81
+ }
82
+ }
83
+ useEffect(() => {
84
+ medplum.requestSchema(props.resourceType).then((newSchema) => {
85
+ // The schema could have the same object identity,
86
+ // so need to use the spread operator to kick React re-render.
87
+ setSchema(Object.assign({}, newSchema));
88
+ });
89
+ }, [medplum, props.resourceType]);
90
+ const typeSchema = (_a = schema === null || schema === void 0 ? void 0 : schema.types) === null || _a === void 0 ? void 0 : _a[props.resourceType];
91
+ if (!typeSchema) {
92
+ return React.createElement(Loading, null);
93
+ }
94
+ const checkboxColumn = props.checkboxesEnabled;
95
+ return (React.createElement("div", { className: "medplum-search-control", onContextMenu: (e) => killEvent(e), "data-testid": "search-control" },
96
+ React.createElement("table", null,
97
+ React.createElement("thead", null,
98
+ React.createElement("tr", null,
99
+ checkboxColumn && (React.createElement("th", { className: "medplum-search-icon-cell" },
100
+ React.createElement("input", { type: "checkbox", value: "checked", "aria-label": "all-checkbox", "data-testid": "all-checkbox", checked: isAllSelected(), onChange: (e) => handleAllCheckboxClick(e) }))),
101
+ fields.map((field) => (React.createElement("th", { key: field.name }, field.name))))),
102
+ React.createElement("tbody", null, (_c = (_b = response === null || response === void 0 ? void 0 : response.data) === null || _b === void 0 ? void 0 : _b.ResourceList) === null || _c === void 0 ? void 0 : _c.map((resource) => resource && (React.createElement("tr", { key: resource.id, "data-testid": "search-control-row", onClick: (e) => handleRowClick(e, resource), onAuxClick: (e) => handleRowClick(e, resource) },
103
+ checkboxColumn && (React.createElement("td", { className: "medplum-search-icon-cell" },
104
+ React.createElement("input", { type: "checkbox", value: "checked", "data-testid": "row-checkbox", "aria-label": `Checkbox for ${resource.id}`, checked: !!selected[resource.id], onChange: (e) => handleSingleCheckboxClick(e, resource.id) }))),
105
+ fields.map((field) => {
106
+ return (React.createElement("td", { key: field.name },
107
+ React.createElement(FhirPathDisplay, { propertyType: field.propertyType, path: field.fhirPath, resource: resource })));
108
+ })))))),
109
+ ((_e = (_d = response === null || response === void 0 ? void 0 : response.data) === null || _d === void 0 ? void 0 : _d.ResourceList) === null || _e === void 0 ? void 0 : _e.length) === 0 && (React.createElement("div", { "data-testid": "empty-search", className: "medplum-empty-search" }, "No results")),
110
+ outcome && (React.createElement("div", { "data-testid": "search-error", className: "medplum-empty-search" },
111
+ React.createElement("pre", { style: { textAlign: 'left' } }, JSON.stringify(outcome, undefined, 2)))),
112
+ props.onBulk && (React.createElement(Button, { size: "small", onClick: () => props.onBulk(Object.keys(selectedRef.current)) }, "Bulk..."))));
113
+ }
114
+ const MemoizedFhirPathTable = React.memo(FhirPathTable);
115
+
116
+ export { FhirPathTable, MemoizedFhirPathTable };
117
+ //# sourceMappingURL=FhirPathTable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FhirPathTable.js","sources":["../../src/FhirPathTable.tsx"],"sourcesContent":["import { IndexedStructureDefinition, PropertyType } from '@medplum/core';\nimport { OperationOutcome, Resource } from '@medplum/fhirtypes';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { Button } from './Button';\nimport { FhirPathDisplay } from './FhirPathDisplay';\nimport { Loading } from './Loading';\nimport { useMedplum } from './MedplumProvider';\nimport { SearchClickEvent } from './SearchControl';\nimport { isCheckboxCell, killEvent } from './utils/dom';\nimport './SearchControl.css';\n\nexport interface SmartSearchField {\n readonly propertyType: PropertyType;\n readonly name: string;\n readonly fhirPath: string;\n}\n\nexport interface FhirPathTableProps {\n resourceType: string;\n query: string;\n fields: SmartSearchField[];\n checkboxesEnabled?: boolean;\n onClick?: (e: SearchClickEvent) => void;\n onAuxClick?: (e: SearchClickEvent) => void;\n onBulk?: (ids: string[]) => void;\n}\n\nexport interface SmartSearchResponse {\n data: {\n ResourceList: Resource[];\n };\n}\n\n/**\n * The FhirPathTable component represents the embeddable search table control.\n */\nexport function FhirPathTable(props: FhirPathTableProps): JSX.Element {\n const medplum = useMedplum();\n const [schema, setSchema] = useState<IndexedStructureDefinition | undefined>();\n const [outcome, setOutcome] = useState<OperationOutcome | undefined>();\n const { query, fields } = props;\n const [response, setResponse] = useState<SmartSearchResponse | undefined>();\n const [selected, setSelected] = useState<{ [id: string]: boolean }>({});\n\n const responseRef = useRef<SmartSearchResponse>();\n responseRef.current = response;\n\n const selectedRef = useRef<{ [id: string]: boolean }>({});\n selectedRef.current = selected;\n\n useEffect(() => {\n setOutcome(undefined);\n medplum.graphql(query).then(setResponse).catch(setOutcome);\n }, [medplum, query]);\n\n function handleSingleCheckboxClick(e: React.ChangeEvent, id: string): void {\n e.stopPropagation();\n\n const el = e.target as HTMLInputElement;\n const checked = el.checked;\n const newSelected = { ...selectedRef.current };\n if (checked) {\n newSelected[id] = true;\n } else {\n delete newSelected[id];\n }\n setSelected(newSelected);\n }\n\n function handleAllCheckboxClick(e: React.ChangeEvent): void {\n e.stopPropagation();\n\n const el = e.target as HTMLInputElement;\n const checked = el.checked;\n const newSelected = {} as { [id: string]: boolean };\n const resources = responseRef.current?.data?.ResourceList;\n if (checked && resources) {\n resources.forEach((resource) => {\n if (resource?.id) {\n newSelected[resource.id] = true;\n }\n });\n }\n setSelected(newSelected);\n }\n\n function isAllSelected(): boolean {\n const resources = responseRef.current?.data?.ResourceList;\n if (!resources || resources.length === 0) {\n return false;\n }\n for (const resource of resources) {\n if (resource?.id && !selectedRef.current[resource.id]) {\n return false;\n }\n }\n return true;\n }\n\n function handleRowClick(e: React.MouseEvent, resource: Resource): void {\n if (isCheckboxCell(e.target as Element)) {\n // Ignore clicks on checkboxes\n return;\n }\n\n killEvent(e);\n\n if (e.button !== 1 && props.onClick) {\n props.onClick(new SearchClickEvent(resource, e));\n }\n\n if (e.button === 1 && props.onAuxClick) {\n props.onAuxClick(new SearchClickEvent(resource, e));\n }\n }\n\n useEffect(() => {\n medplum.requestSchema(props.resourceType).then((newSchema) => {\n // The schema could have the same object identity,\n // so need to use the spread operator to kick React re-render.\n setSchema({ ...newSchema });\n });\n }, [medplum, props.resourceType]);\n\n const typeSchema = schema?.types?.[props.resourceType];\n if (!typeSchema) {\n return <Loading />;\n }\n\n const checkboxColumn = props.checkboxesEnabled;\n\n return (\n <div className=\"medplum-search-control\" onContextMenu={(e) => killEvent(e)} data-testid=\"search-control\">\n <table>\n <thead>\n <tr>\n {checkboxColumn && (\n <th className=\"medplum-search-icon-cell\">\n <input\n type=\"checkbox\"\n value=\"checked\"\n aria-label=\"all-checkbox\"\n data-testid=\"all-checkbox\"\n checked={isAllSelected()}\n onChange={(e) => handleAllCheckboxClick(e)}\n />\n </th>\n )}\n {fields.map((field) => (\n <th key={field.name}>{field.name}</th>\n ))}\n </tr>\n </thead>\n <tbody>\n {response?.data?.ResourceList?.map(\n (resource) =>\n resource && (\n <tr\n key={resource.id}\n data-testid=\"search-control-row\"\n onClick={(e) => handleRowClick(e, resource)}\n onAuxClick={(e) => handleRowClick(e, resource)}\n >\n {checkboxColumn && (\n <td className=\"medplum-search-icon-cell\">\n <input\n type=\"checkbox\"\n value=\"checked\"\n data-testid=\"row-checkbox\"\n aria-label={`Checkbox for ${resource.id}`}\n checked={!!selected[resource.id as string]}\n onChange={(e) => handleSingleCheckboxClick(e, resource.id as string)}\n />\n </td>\n )}\n {fields.map((field) => {\n return (\n <td key={field.name}>\n <FhirPathDisplay propertyType={field.propertyType} path={field.fhirPath} resource={resource} />\n </td>\n );\n })}\n </tr>\n )\n )}\n </tbody>\n </table>\n {response?.data?.ResourceList?.length === 0 && (\n <div data-testid=\"empty-search\" className=\"medplum-empty-search\">\n No results\n </div>\n )}\n {outcome && (\n <div data-testid=\"search-error\" className=\"medplum-empty-search\">\n <pre style={{ textAlign: 'left' }}>{JSON.stringify(outcome, undefined, 2)}</pre>\n </div>\n )}\n {props.onBulk && (\n <Button size=\"small\" onClick={() => (props.onBulk as (ids: string[]) => any)(Object.keys(selectedRef.current))}>\n Bulk...\n </Button>\n )}\n </div>\n );\n}\n\nexport const MemoizedFhirPathTable = React.memo(FhirPathTable);\n"],"names":[],"mappings":"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"}
File without changes
@@ -0,0 +1,8 @@
1
+ import React from 'react';
2
+
3
+ function FooterLinks(props) {
4
+ return React.createElement("div", { className: "medplum-footer" }, props.children);
5
+ }
6
+
7
+ export { FooterLinks };
8
+ //# sourceMappingURL=FooterLinks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FooterLinks.js","sources":["../../src/FooterLinks.tsx"],"sourcesContent":["import React from 'react';\nimport './FooterLinks.css';\n\nexport interface FooterLinksProps {\n children?: React.ReactNode;\n}\n\nexport function FooterLinks(props: FooterLinksProps): JSX.Element {\n return <div className=\"medplum-footer\">{props.children}</div>;\n}\n"],"names":[],"mappings":";;AAOM,SAAU,WAAW,CAAC,KAAuB,EAAA;IACjD,OAAO,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,gBAAgB,IAAE,KAAK,CAAC,QAAQ,CAAO,CAAC;AAChE;;;;"}
File without changes
@@ -0,0 +1,15 @@
1
+ import React from 'react';
2
+ import { parseForm } from './FormUtils.js';
3
+
4
+ function Form(props) {
5
+ return (React.createElement("form", { style: props.style, "data-testid": props.testid, onSubmit: (e) => {
6
+ e.preventDefault();
7
+ const formData = parseForm(e.target);
8
+ if (props.onSubmit) {
9
+ props.onSubmit(formData);
10
+ }
11
+ } }, props.children));
12
+ }
13
+
14
+ export { Form };
15
+ //# sourceMappingURL=Form.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Form.js","sources":["../../src/Form.tsx"],"sourcesContent":["import React, { CSSProperties } from 'react';\nimport { parseForm } from './FormUtils';\n\nexport interface FormProps {\n onSubmit?: (formData: Record<string, string>) => void;\n style?: CSSProperties;\n children?: React.ReactNode;\n testid?: string;\n}\n\nexport function Form(props: FormProps): JSX.Element {\n return (\n <form\n style={props.style}\n data-testid={props.testid}\n onSubmit={(e: React.SyntheticEvent) => {\n e.preventDefault();\n const formData = parseForm(e.target as HTMLFormElement);\n if (props.onSubmit) {\n props.onSubmit(formData);\n }\n }}\n >\n {props.children}\n </form>\n );\n}\n"],"names":[],"mappings":";;;AAUM,SAAU,IAAI,CAAC,KAAgB,EAAA;AACnC,IAAA,QACE,KACE,CAAA,aAAA,CAAA,MAAA,EAAA,EAAA,KAAK,EAAE,KAAK,CAAC,KAAK,EAAA,aAAA,EACL,KAAK,CAAC,MAAM,EACzB,QAAQ,EAAE,CAAC,CAAuB,KAAI;YACpC,CAAC,CAAC,cAAc,EAAE,CAAC;YACnB,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,MAAyB,CAAC,CAAC;YACxD,IAAI,KAAK,CAAC,QAAQ,EAAE;AAClB,gBAAA,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AAC1B,aAAA;AACH,SAAC,IAEA,KAAK,CAAC,QAAQ,CACV,EACP;AACJ;;;;"}
File without changes
@@ -0,0 +1,18 @@
1
+ import React from 'react';
2
+ import { getIssuesForExpression } from './utils/outcomes.js';
3
+
4
+ function FormSection(props) {
5
+ const issues = getIssuesForExpression(props.outcome, props.htmlFor);
6
+ const invalid = issues && issues.length > 0;
7
+ return (React.createElement("fieldset", { className: "medplum-form-section" },
8
+ props.title && React.createElement("label", { htmlFor: props.htmlFor }, props.title),
9
+ props.description && React.createElement("p", null, props.description),
10
+ props.children,
11
+ invalid && (React.createElement("div", { id: props.htmlFor + '-errors', className: "medplum-input-error" }, issues === null || issues === void 0 ? void 0 : issues.map((issue) => {
12
+ var _a, _b;
13
+ return (React.createElement("div", { "data-testid": "text-field-error", key: (_a = issue.details) === null || _a === void 0 ? void 0 : _a.text }, (_b = issue.details) === null || _b === void 0 ? void 0 : _b.text));
14
+ })))));
15
+ }
16
+
17
+ export { FormSection };
18
+ //# sourceMappingURL=FormSection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FormSection.js","sources":["../../src/FormSection.tsx"],"sourcesContent":["import { OperationOutcome } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { getIssuesForExpression } from './utils/outcomes';\nimport './FormSection.css';\n\nexport interface FormSectionProps {\n title?: string;\n htmlFor?: string;\n description?: string;\n outcome?: OperationOutcome;\n children?: React.ReactNode;\n}\n\nexport function FormSection(props: FormSectionProps): JSX.Element {\n const issues = getIssuesForExpression(props.outcome, props.htmlFor);\n const invalid = issues && issues.length > 0;\n return (\n <fieldset className=\"medplum-form-section\">\n {props.title && <label htmlFor={props.htmlFor}>{props.title}</label>}\n {props.description && <p>{props.description}</p>}\n {props.children}\n {invalid && (\n <div id={props.htmlFor + '-errors'} className=\"medplum-input-error\">\n {issues?.map((issue) => (\n <div data-testid=\"text-field-error\" key={issue.details?.text}>\n {issue.details?.text}\n </div>\n ))}\n </div>\n )}\n </fieldset>\n );\n}\n"],"names":[],"mappings":";;;AAaM,SAAU,WAAW,CAAC,KAAuB,EAAA;AACjD,IAAA,MAAM,MAAM,GAAG,sBAAsB,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;IACpE,MAAM,OAAO,GAAG,MAAM,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;AAC5C,IAAA,QACE,KAAA,CAAA,aAAA,CAAA,UAAA,EAAA,EAAU,SAAS,EAAC,sBAAsB,EAAA;AACvC,QAAA,KAAK,CAAC,KAAK,IAAI,KAAA,CAAA,aAAA,CAAA,OAAA,EAAA,EAAO,OAAO,EAAE,KAAK,CAAC,OAAO,EAAA,EAAG,KAAK,CAAC,KAAK,CAAS;AACnE,QAAA,KAAK,CAAC,WAAW,IAAI,+BAAI,KAAK,CAAC,WAAW,CAAK;AAC/C,QAAA,KAAK,CAAC,QAAQ;QACd,OAAO,KACN,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA,EAAK,EAAE,EAAE,KAAK,CAAC,OAAO,GAAG,SAAS,EAAE,SAAS,EAAC,qBAAqB,EAChE,EAAA,MAAM,KAAN,IAAA,IAAA,MAAM,KAAN,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,MAAM,CAAE,GAAG,CAAC,CAAC,KAAK,KAAI;;YAAC,QACtB,4CAAiB,kBAAkB,EAAC,GAAG,EAAE,CAAA,EAAA,GAAA,KAAK,CAAC,OAAO,0CAAE,IAAI,EAAA,EACzD,MAAA,KAAK,CAAC,OAAO,MAAE,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,IAAI,CAChB,EACP;AAAA,SAAA,CAAC,CACE,CACP,CACQ,EACX;AACJ;;;;"}
File without changes