@medplum/react 0.9.26 → 0.9.29

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 (246) hide show
  1. package/dist/cjs/AddressDisplay.d.ts +6 -0
  2. package/dist/cjs/AddressInput.d.ts +8 -0
  3. package/dist/cjs/AnnotationInput.d.ts +8 -0
  4. package/dist/cjs/AttachmentArrayDisplay.d.ts +7 -0
  5. package/dist/cjs/AttachmentArrayInput.d.ts +9 -0
  6. package/dist/cjs/AttachmentDisplay.d.ts +7 -0
  7. package/dist/cjs/AttachmentInput.d.ts +9 -0
  8. package/dist/cjs/Autocomplete.d.ts +20 -0
  9. package/dist/cjs/Avatar.d.ts +12 -0
  10. package/dist/cjs/BackboneElementDisplay.d.ts +9 -0
  11. package/dist/cjs/BackboneElementInput.d.ts +9 -0
  12. package/dist/cjs/Button.d.ts +15 -0
  13. package/dist/cjs/CalendarInput.d.ts +16 -0
  14. package/dist/cjs/Checkbox.d.ts +12 -0
  15. package/dist/cjs/CheckboxFormSection.d.ts +9 -0
  16. package/dist/cjs/CodeInput.d.ts +9 -0
  17. package/dist/cjs/CodeableConceptDisplay.d.ts +6 -0
  18. package/dist/cjs/CodeableConceptInput.d.ts +9 -0
  19. package/dist/cjs/CodingDisplay.d.ts +6 -0
  20. package/dist/cjs/CodingInput.d.ts +9 -0
  21. package/dist/cjs/ContactDetailDisplay.d.ts +6 -0
  22. package/dist/cjs/ContactDetailInput.d.ts +8 -0
  23. package/dist/cjs/ContactPointDisplay.d.ts +6 -0
  24. package/dist/cjs/ContactPointInput.d.ts +8 -0
  25. package/dist/cjs/DateTimeInput.d.ts +23 -0
  26. package/dist/cjs/DefaultResourceTimeline.d.ts +6 -0
  27. package/dist/cjs/DescriptionList.d.ts +12 -0
  28. package/dist/cjs/DiagnosticReportDisplay.d.ts +12 -0
  29. package/dist/cjs/Dialog.d.ts +10 -0
  30. package/dist/cjs/Document.d.ts +7 -0
  31. package/dist/cjs/EncounterTimeline.d.ts +6 -0
  32. package/dist/cjs/ErrorBoundary.d.ts +18 -0
  33. package/dist/cjs/ExtensionInput.d.ts +8 -0
  34. package/dist/cjs/FhirPathDisplay.d.ts +9 -0
  35. package/dist/cjs/FhirPathTable.d.ts +29 -0
  36. package/dist/cjs/FooterLinks.d.ts +6 -0
  37. package/dist/cjs/Form.d.ts +8 -0
  38. package/dist/cjs/FormSection.d.ts +11 -0
  39. package/dist/cjs/FormUtils.d.ts +5 -0
  40. package/dist/cjs/GoogleButton.d.ts +8 -0
  41. package/dist/cjs/Header.d.ts +12 -0
  42. package/dist/cjs/HeaderSearchInput.d.ts +10 -0
  43. package/dist/cjs/HumanNameDisplay.d.ts +8 -0
  44. package/dist/cjs/HumanNameInput.d.ts +8 -0
  45. package/dist/cjs/IdentifierDisplay.d.ts +6 -0
  46. package/dist/cjs/IdentifierInput.d.ts +8 -0
  47. package/dist/cjs/Input.d.ts +22 -0
  48. package/dist/cjs/InputRow.d.ts +7 -0
  49. package/dist/cjs/Loading.d.ts +3 -0
  50. package/dist/cjs/Logo.d.ts +6 -0
  51. package/dist/cjs/MedplumLink.d.ts +13 -0
  52. package/dist/cjs/MedplumProvider.d.ts +34 -0
  53. package/dist/cjs/MenuItem.d.ts +9 -0
  54. package/dist/cjs/MenuSeparator.d.ts +3 -0
  55. package/dist/cjs/PatientTimeline.d.ts +6 -0
  56. package/dist/cjs/PeriodInput.d.ts +8 -0
  57. package/dist/cjs/PlanDefinitionBuilder.d.ts +7 -0
  58. package/dist/cjs/Popup.d.ts +14 -0
  59. package/dist/cjs/QuantityDisplay.d.ts +7 -0
  60. package/dist/cjs/QuantityInput.d.ts +8 -0
  61. package/dist/cjs/QuestionnaireBuilder.d.ts +8 -0
  62. package/dist/cjs/QuestionnaireForm.d.ts +14 -0
  63. package/dist/cjs/QuestionnaireUtils.d.ts +30 -0
  64. package/dist/cjs/RangeDisplay.d.ts +7 -0
  65. package/dist/cjs/RangeInput.d.ts +14 -0
  66. package/dist/cjs/RatioDisplay.d.ts +6 -0
  67. package/dist/cjs/RatioInput.d.ts +14 -0
  68. package/dist/cjs/ReferenceDisplay.d.ts +7 -0
  69. package/dist/cjs/ReferenceInput.d.ts +9 -0
  70. package/dist/cjs/RegisterForm.d.ts +18 -0
  71. package/dist/cjs/RequestGroupDisplay.d.ts +9 -0
  72. package/dist/cjs/ResourceArrayDisplay.d.ts +11 -0
  73. package/dist/cjs/ResourceArrayInput.d.ts +11 -0
  74. package/dist/cjs/ResourceBadge.d.ts +9 -0
  75. package/dist/cjs/ResourceBlame.d.ts +10 -0
  76. package/dist/cjs/ResourceDiff.d.ts +9 -0
  77. package/dist/cjs/ResourceDiffTable.d.ts +9 -0
  78. package/dist/cjs/ResourceForm.d.ts +10 -0
  79. package/dist/cjs/ResourceHistoryTable.d.ts +9 -0
  80. package/dist/cjs/ResourceInput.d.ts +12 -0
  81. package/dist/cjs/ResourceName.d.ts +7 -0
  82. package/dist/cjs/ResourcePropertyDisplay.d.ts +24 -0
  83. package/dist/cjs/ResourcePropertyInput.d.ts +21 -0
  84. package/dist/cjs/ResourceTable.d.ts +7 -0
  85. package/dist/cjs/ResourceTimeline.d.ts +11 -0
  86. package/dist/cjs/Scheduler.d.ts +7 -0
  87. package/dist/cjs/Scrollable.d.ts +9 -0
  88. package/dist/cjs/SearchControl.d.ts +40 -0
  89. package/dist/cjs/SearchControlField.d.ts +41 -0
  90. package/dist/cjs/SearchFieldEditor.d.ts +11 -0
  91. package/dist/cjs/SearchFilterEditor.d.ts +11 -0
  92. package/dist/cjs/SearchFilterValueDialog.d.ts +15 -0
  93. package/dist/cjs/SearchFilterValueDisplay.d.ts +7 -0
  94. package/dist/cjs/SearchFilterValueInput.d.ts +12 -0
  95. package/dist/cjs/SearchPopupMenu.d.ts +15 -0
  96. package/dist/cjs/SearchUtils.d.ts +174 -0
  97. package/dist/cjs/Select.d.ts +16 -0
  98. package/dist/cjs/ServiceRequestTimeline.d.ts +6 -0
  99. package/dist/cjs/SignInForm.d.ts +17 -0
  100. package/dist/cjs/StatusBadge.d.ts +6 -0
  101. package/dist/cjs/SubMenu.d.ts +7 -0
  102. package/dist/cjs/Tab.d.ts +12 -0
  103. package/dist/cjs/TabList.d.ts +10 -0
  104. package/dist/cjs/TabPanel.d.ts +6 -0
  105. package/dist/cjs/TabSwitch.d.ts +6 -0
  106. package/dist/cjs/TextArea.d.ts +18 -0
  107. package/dist/cjs/Timeline.d.ts +17 -0
  108. package/dist/cjs/TimingInput.d.ts +8 -0
  109. package/dist/cjs/TitleBar.d.ts +6 -0
  110. package/dist/cjs/UploadButton.d.ts +7 -0
  111. package/dist/cjs/constants.d.ts +1 -0
  112. package/dist/cjs/index.d.ts +86 -0
  113. package/dist/cjs/index.js +356 -192
  114. package/dist/cjs/index.js.map +1 -1
  115. package/dist/cjs/index.min.js +1 -1
  116. package/dist/cjs/index.min.js.map +1 -1
  117. package/dist/cjs/stories/AddressInput.stories.d.ts +6 -0
  118. package/dist/cjs/stories/AttachmentArrayInput.stories.d.ts +6 -0
  119. package/dist/cjs/stories/AttachmentInput.stories.d.ts +6 -0
  120. package/dist/cjs/stories/Autocomplete.stories.d.ts +9 -0
  121. package/dist/cjs/stories/Avatar.stories.d.ts +10 -0
  122. package/dist/cjs/stories/Button.stories.d.ts +9 -0
  123. package/dist/cjs/stories/CodeableConceptDisplay.stories.d.ts +8 -0
  124. package/dist/cjs/stories/DiagnosticReportDisplay.stories.d.ts +5 -0
  125. package/dist/cjs/stories/Dialog.stories.d.ts +5 -0
  126. package/dist/cjs/stories/EncounterTimeline.stories.d.ts +5 -0
  127. package/dist/cjs/stories/FhirPathDisplay.stories.d.ts +7 -0
  128. package/dist/cjs/stories/FormSection.stories.d.ts +6 -0
  129. package/dist/cjs/stories/Header.stories.d.ts +8 -0
  130. package/dist/cjs/stories/Input.stories.d.ts +6 -0
  131. package/dist/cjs/stories/Loading.stories.d.ts +5 -0
  132. package/dist/cjs/stories/Logo.stories.d.ts +5 -0
  133. package/dist/cjs/stories/PatientTimeline.stories.d.ts +5 -0
  134. package/dist/cjs/stories/PlanDefinitionBuilder.stories.d.ts +5 -0
  135. package/dist/cjs/stories/QuestionnaireBuilder.stories.d.ts +7 -0
  136. package/dist/cjs/stories/QuestionnaireForm.stories.d.ts +11 -0
  137. package/dist/cjs/stories/ReferenceInput.stories.d.ts +6 -0
  138. package/dist/cjs/stories/RegisterForm.stories.d.ts +7 -0
  139. package/dist/cjs/stories/RequestGroupDisplay.stories.d.ts +5 -0
  140. package/dist/cjs/stories/ResourceBlame.stories.d.ts +5 -0
  141. package/dist/cjs/stories/ResourceForm.stories.d.ts +12 -0
  142. package/dist/cjs/stories/ResourceHistoryTable.stories.d.ts +5 -0
  143. package/dist/cjs/stories/ResourceTable.stories.d.ts +7 -0
  144. package/dist/cjs/stories/Scheduler.stories.d.ts +5 -0
  145. package/dist/cjs/stories/SearchControl.stories.d.ts +13 -0
  146. package/dist/cjs/stories/Select.stories.d.ts +6 -0
  147. package/dist/cjs/stories/SignInForm.stories.d.ts +8 -0
  148. package/dist/cjs/stories/StatusBadge.stories.d.ts +5 -0
  149. package/dist/cjs/stories/Tabs.stories.d.ts +6 -0
  150. package/dist/cjs/stories/Timeline.stories.d.ts +5 -0
  151. package/dist/cjs/stories/TimingInput.stories.d.ts +6 -0
  152. package/dist/cjs/stories/UploadButton.stories.d.ts +6 -0
  153. package/dist/cjs/styles.css +135 -130
  154. package/dist/cjs/test.setup.d.ts +1 -0
  155. package/dist/cjs/useResource.d.ts +8 -0
  156. package/dist/cjs/utils/blame.d.ts +8 -0
  157. package/dist/cjs/utils/date.d.ts +6 -0
  158. package/dist/cjs/utils/diff.d.ts +16 -0
  159. package/dist/cjs/utils/dom.d.ts +15 -0
  160. package/dist/cjs/utils/outcomes.d.ts +2 -0
  161. package/dist/cjs/utils/recaptcha.d.ts +12 -0
  162. package/dist/cjs/utils.d.ts +5 -0
  163. package/dist/esm/Autocomplete.d.ts +1 -0
  164. package/dist/esm/Autocomplete.js +4 -8
  165. package/dist/esm/Autocomplete.js.map +1 -1
  166. package/dist/esm/CalendarInput.d.ts +1 -0
  167. package/dist/esm/CalendarInput.js +6 -5
  168. package/dist/esm/CalendarInput.js.map +1 -1
  169. package/dist/esm/CodeableConceptDisplay.js +4 -2
  170. package/dist/esm/CodeableConceptDisplay.js.map +1 -1
  171. package/dist/esm/DateTimeInput.js +1 -3
  172. package/dist/esm/DateTimeInput.js.map +1 -1
  173. package/dist/esm/DiagnosticReportDisplay.js +2 -4
  174. package/dist/esm/DiagnosticReportDisplay.js.map +1 -1
  175. package/dist/esm/FhirPathTable.js +5 -2
  176. package/dist/esm/FhirPathTable.js.map +1 -1
  177. package/dist/esm/GoogleButton.js +1 -1
  178. package/dist/esm/GoogleButton.js.map +1 -1
  179. package/dist/esm/Header.js +7 -3
  180. package/dist/esm/Header.js.map +1 -1
  181. package/dist/esm/PlanDefinitionBuilder.js +108 -39
  182. package/dist/esm/PlanDefinitionBuilder.js.map +1 -1
  183. package/dist/esm/QuestionnaireBuilder.js +1 -1
  184. package/dist/esm/QuestionnaireBuilder.js.map +1 -1
  185. package/dist/esm/QuestionnaireForm.js +5 -1
  186. package/dist/esm/QuestionnaireForm.js.map +1 -1
  187. package/dist/esm/RegisterForm.js +14 -3
  188. package/dist/esm/RegisterForm.js.map +1 -1
  189. package/dist/esm/RequestGroupDisplay.js +3 -4
  190. package/dist/esm/RequestGroupDisplay.js.map +1 -1
  191. package/dist/esm/ResourceArrayInput.js +1 -2
  192. package/dist/esm/ResourceArrayInput.js.map +1 -1
  193. package/dist/esm/ResourceBlame.js +1 -1
  194. package/dist/esm/ResourceBlame.js.map +1 -1
  195. package/dist/esm/ResourceDiffTable.js +1 -1
  196. package/dist/esm/ResourceDiffTable.js.map +1 -1
  197. package/dist/esm/ResourceForm.js +1 -1
  198. package/dist/esm/ResourceForm.js.map +1 -1
  199. package/dist/esm/ResourceHistoryTable.js +6 -4
  200. package/dist/esm/ResourceHistoryTable.js.map +1 -1
  201. package/dist/esm/ResourceInput.d.ts +1 -0
  202. package/dist/esm/ResourceInput.js +4 -3
  203. package/dist/esm/ResourceInput.js.map +1 -1
  204. package/dist/esm/ResourcePropertyDisplay.js +5 -5
  205. package/dist/esm/ResourcePropertyDisplay.js.map +1 -1
  206. package/dist/esm/ResourcePropertyInput.js +3 -0
  207. package/dist/esm/ResourcePropertyInput.js.map +1 -1
  208. package/dist/esm/ResourceTable.js +1 -1
  209. package/dist/esm/ResourceTable.js.map +1 -1
  210. package/dist/esm/ResourceTimeline.js +13 -7
  211. package/dist/esm/ResourceTimeline.js.map +1 -1
  212. package/dist/esm/Scheduler.js +13 -6
  213. package/dist/esm/Scheduler.js.map +1 -1
  214. package/dist/esm/SearchControl.js +5 -2
  215. package/dist/esm/SearchControl.js.map +1 -1
  216. package/dist/esm/SearchFilterValueDisplay.js +2 -2
  217. package/dist/esm/SearchFilterValueDisplay.js.map +1 -1
  218. package/dist/esm/SearchUtils.js +2 -3
  219. package/dist/esm/SearchUtils.js.map +1 -1
  220. package/dist/esm/SignInForm.js +2 -1
  221. package/dist/esm/SignInForm.js.map +1 -1
  222. package/dist/esm/Timeline.js +2 -4
  223. package/dist/esm/Timeline.js.map +1 -1
  224. package/dist/esm/TimingInput.d.ts +8 -0
  225. package/dist/esm/TimingInput.js +90 -0
  226. package/dist/esm/TimingInput.js.map +1 -0
  227. package/dist/esm/index.d.ts +0 -1
  228. package/dist/esm/index.js +0 -1
  229. package/dist/esm/index.js.map +1 -1
  230. package/dist/esm/index.min.js +1 -1
  231. package/dist/esm/index.min.js.map +1 -1
  232. package/dist/esm/stories/Autocomplete.stories.d.ts +1 -0
  233. package/dist/esm/stories/CodeableConceptDisplay.stories.d.ts +8 -0
  234. package/dist/esm/stories/TimingInput.stories.d.ts +6 -0
  235. package/dist/esm/styles.css +135 -130
  236. package/dist/esm/utils/recaptcha.js +10 -4
  237. package/dist/esm/utils/recaptcha.js.map +1 -1
  238. package/package.json +6 -6
  239. package/dist/esm/DateTimeDisplay.d.ts +0 -5
  240. package/dist/esm/DateTimeDisplay.js +0 -11
  241. package/dist/esm/DateTimeDisplay.js.map +0 -1
  242. package/dist/esm/PeriodDisplay.d.ts +0 -6
  243. package/dist/esm/PeriodDisplay.js +0 -16
  244. package/dist/esm/PeriodDisplay.js.map +0 -1
  245. package/tsconfig.cjs.json +0 -7
  246. package/tsconfig.esm.json +0 -7
@@ -1 +1 @@
1
- {"version":3,"file":"Header.js","sources":["../../src/Header.tsx"],"sourcesContent":["import { getReferenceString, ProfileResource } from '@medplum/core';\nimport { HumanName, UserConfiguration } from '@medplum/fhirtypes';\nimport React, { useState } from 'react';\nimport { useLocation, useNavigate } from 'react-router-dom';\nimport { Avatar } from './Avatar';\nimport { Button } from './Button';\nimport { HeaderSearchInput, HeaderSearchTypes } from './HeaderSearchInput';\nimport { HumanNameDisplay } from './HumanNameDisplay';\nimport { MedplumLink } from './MedplumLink';\nimport { useMedplumContext } from './MedplumProvider';\nimport { Popup } from './Popup';\nimport './Header.css';\n\nexport interface HeaderProps {\n readonly title?: string;\n readonly bgColor?: string;\n readonly onLogo?: () => void;\n readonly onProfile?: () => void;\n readonly onSignOut?: () => void;\n readonly config?: UserConfiguration;\n}\n\nexport function Header(props: HeaderProps): JSX.Element {\n const navigate = useNavigate();\n const location = useLocation();\n const context = useMedplumContext();\n const medplum = context.medplum;\n const logins = medplum.getLogins();\n const [userMenuVisible, setUserMenuVisible] = useState(false);\n const [sidebarVisible, setSidebarVisible] = useState(false);\n\n return (\n <>\n <header role=\"banner\" data-testid=\"header\" style={{ background: props.bgColor }}>\n <div>\n <MedplumLink\n label=\"Toggle sidebar\"\n testid=\"header-menu-button\"\n onClick={() => setSidebarVisible(!sidebarVisible)}\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n style={{ width: 20, height: 20, verticalAlign: 'text-top' }}\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M3 5a1 1 0 011-1h12a1 1 0 110 2H4a1 1 0 01-1-1zM3 10a1 1 0 011-1h12a1 1 0 110 2H4a1 1 0 01-1-1zM3 15a1 1 0 011-1h12a1 1 0 110 2H4a1 1 0 01-1-1z\"\n clipRule=\"evenodd\"\n />\n </svg>\n </MedplumLink>\n <MedplumLink id=\"medplum-header-logo\" testid=\"header-logo\" onClick={props.onLogo}>\n {props.title || 'Medplum'}\n </MedplumLink>\n {context.profile && (\n <HeaderSearchInput\n key={`header-input-${location.pathname}`}\n name=\"search\"\n className=\"medplum-nav-search-container\"\n placeholder=\"Search\"\n onChange={(resource: HeaderSearchTypes) => navigate(`/${resource.resourceType}/${resource.id}`)}\n />\n )}\n </div>\n {context.profile && (\n <div className=\"medplum-nav-menu-container\">\n <MedplumLink testid=\"header-profile-menu-button\" onClick={() => setUserMenuVisible(true)}>\n <Avatar size=\"small\" color=\"#f68d42\" value={context.profile} />\n </MedplumLink>\n <Popup\n visible={userMenuVisible}\n autoClose={true}\n activeClassName=\"medplum-nav-menu-popover\"\n onClose={() => setUserMenuVisible(false)}\n >\n <div className=\"medplum-nav-menu\">\n <div style={{ margin: 'auto', padding: '8px' }}>\n <Avatar size=\"large\" value={context.profile} />\n </div>\n <div style={{ margin: 'auto', padding: '8px' }}>\n <div style={{ margin: '4px auto 4px auto', fontWeight: 'bold' }}>\n <HumanNameDisplay value={context.profile?.name?.[0] as HumanName} />\n </div>\n <div style={{ margin: '4px auto 4px auto' }}>{medplum.getActiveLogin()?.project?.display}</div>\n <Button\n testid=\"header-profile-link\"\n onClick={() => {\n setUserMenuVisible(false);\n if (props.onProfile) {\n props.onProfile();\n }\n }}\n >\n Manage your account\n </Button>\n </div>\n {logins.length > 1 && (\n <div>\n <hr />\n {logins.map(\n (login) =>\n login.profile?.reference !== getReferenceString(context.profile as ProfileResource) && (\n <div\n className=\"medplum-nav-menu-profile\"\n key={login.profile?.reference}\n onClick={() => {\n medplum.setActiveLogin(login);\n setUserMenuVisible(false);\n window.location.reload();\n }}\n >\n <div className=\"medplum-nav-menu-profile-icon\">\n <Avatar />\n </div>\n <div className=\"medplum-nav-menu-profile-label\">\n {login.profile?.display}\n <div className=\"medplum-nav-menu-profile-help-text\">{login.project?.display}</div>\n </div>\n </div>\n )\n )}\n </div>\n )}\n <hr />\n <div style={{ margin: 'auto', padding: '8px' }}>\n <Button\n testid=\"header-add-account-button\"\n onClick={() => {\n navigate('/signin');\n }}\n >\n Add another account\n </Button>\n </div>\n <hr />\n <div style={{ margin: 'auto', padding: '8px' }}>\n <Button\n testid=\"header-signout-button\"\n onClick={() => {\n setUserMenuVisible(false);\n if (props.onSignOut) {\n props.onSignOut();\n }\n }}\n >\n Sign out of all accounts\n </Button>\n </div>\n <hr />\n <div style={{ margin: 'auto', padding: '8px', fontSize: '12px' }}>\n <a href=\"https://www.medplum.com/terms\">Terms</a>\n <a href=\"https://www.medplum.com/privacy\">Privacy</a>\n </div>\n </div>\n </Popup>\n </div>\n )}\n </header>\n <Popup\n modal={true}\n autoClose={true}\n visible={sidebarVisible}\n activeClassName=\"medplum-sidebar active\"\n inactiveClassName=\"medplum-sidebar\"\n onClose={() => setSidebarVisible(false)}\n >\n {props.config?.menu?.map((menu, index) => (\n <React.Fragment key={`menu-${index}-${props.config?.menu?.length}`}>\n <h5>{menu.title}</h5>\n <ul>\n {menu.link?.map((link) => (\n <li key={link.target}>\n <MedplumLink to={link.target}>{link.name}</MedplumLink>\n </li>\n ))}\n </ul>\n </React.Fragment>\n ))}\n <h5>Settings</h5>\n <ul>\n <li>\n <MedplumLink to={context.profile}>Profile</MedplumLink>\n </li>\n <li>\n <MedplumLink to=\"/changepassword\">Change password</MedplumLink>\n </li>\n </ul>\n </Popup>\n </>\n );\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Header.js","sources":["../../src/Header.tsx"],"sourcesContent":["import { getReferenceString, ProfileResource } from '@medplum/core';\nimport { HumanName, UserConfiguration } from '@medplum/fhirtypes';\nimport React, { useState } from 'react';\nimport { useLocation, useNavigate } from 'react-router-dom';\nimport { Avatar } from './Avatar';\nimport { Button } from './Button';\nimport { HeaderSearchInput, HeaderSearchTypes } from './HeaderSearchInput';\nimport { HumanNameDisplay } from './HumanNameDisplay';\nimport { MedplumLink } from './MedplumLink';\nimport { useMedplumContext } from './MedplumProvider';\nimport { Popup } from './Popup';\nimport './Header.css';\n\nexport interface HeaderProps {\n readonly title?: string;\n readonly bgColor?: string;\n readonly onLogo?: () => void;\n readonly onProfile?: () => void;\n readonly onSignOut?: () => void;\n readonly config?: UserConfiguration;\n}\n\nexport function Header(props: HeaderProps): JSX.Element {\n const navigate = useNavigate();\n const location = useLocation();\n const context = useMedplumContext();\n const medplum = context.medplum;\n const logins = medplum.getLogins();\n const [userMenuVisible, setUserMenuVisible] = useState(false);\n const [sidebarVisible, setSidebarVisible] = useState(false);\n\n return (\n <>\n <header role=\"banner\" data-testid=\"header\" style={{ background: props.bgColor }}>\n <div>\n <MedplumLink\n label=\"Toggle sidebar\"\n testid=\"header-menu-button\"\n onClick={() => setSidebarVisible(!sidebarVisible)}\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n style={{ width: 20, height: 20, verticalAlign: 'text-top' }}\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M3 5a1 1 0 011-1h12a1 1 0 110 2H4a1 1 0 01-1-1zM3 10a1 1 0 011-1h12a1 1 0 110 2H4a1 1 0 01-1-1zM3 15a1 1 0 011-1h12a1 1 0 110 2H4a1 1 0 01-1-1z\"\n clipRule=\"evenodd\"\n />\n </svg>\n </MedplumLink>\n <MedplumLink id=\"medplum-header-logo\" testid=\"header-logo\" onClick={props.onLogo}>\n {props.title || 'Medplum'}\n </MedplumLink>\n {context.profile && (\n <HeaderSearchInput\n key={`header-input-${location.pathname}`}\n name=\"search\"\n className=\"medplum-nav-search-container\"\n placeholder=\"Search\"\n onChange={(resource: HeaderSearchTypes) => navigate(`/${resource.resourceType}/${resource.id}`)}\n />\n )}\n </div>\n {context.profile && (\n <div className=\"medplum-nav-menu-container\">\n <MedplumLink testid=\"header-profile-menu-button\" onClick={() => setUserMenuVisible(true)}>\n <Avatar size=\"small\" color=\"#f68d42\" value={context.profile} />\n </MedplumLink>\n <Popup\n visible={userMenuVisible}\n autoClose={true}\n activeClassName=\"medplum-nav-menu-popover\"\n onClose={() => setUserMenuVisible(false)}\n >\n <div className=\"medplum-nav-menu\">\n <div style={{ margin: 'auto', padding: '8px' }}>\n <Avatar size=\"large\" value={context.profile} />\n </div>\n <div style={{ margin: 'auto', padding: '8px' }}>\n <div style={{ margin: '4px auto 4px auto', fontWeight: 'bold' }}>\n <HumanNameDisplay value={context.profile?.name?.[0] as HumanName} />\n </div>\n <div style={{ margin: '4px auto 4px auto' }}>{medplum.getActiveLogin()?.project?.display}</div>\n <Button\n testid=\"header-profile-link\"\n onClick={() => {\n setUserMenuVisible(false);\n if (props.onProfile) {\n props.onProfile();\n }\n }}\n >\n Manage your account\n </Button>\n </div>\n {logins.length > 1 && (\n <div>\n <hr />\n {logins.map(\n (login) =>\n login.profile?.reference !== getReferenceString(context.profile as ProfileResource) && (\n <div\n className=\"medplum-nav-menu-profile\"\n key={login.profile?.reference}\n onClick={() => {\n medplum\n .setActiveLogin(login)\n .then(() => {\n setUserMenuVisible(false);\n window.location.reload();\n })\n .catch(console.log);\n }}\n >\n <div className=\"medplum-nav-menu-profile-icon\">\n <Avatar />\n </div>\n <div className=\"medplum-nav-menu-profile-label\">\n {login.profile?.display}\n <div className=\"medplum-nav-menu-profile-help-text\">{login.project?.display}</div>\n </div>\n </div>\n )\n )}\n </div>\n )}\n <hr />\n <div style={{ margin: 'auto', padding: '8px' }}>\n <Button\n testid=\"header-add-account-button\"\n onClick={() => {\n navigate('/signin');\n }}\n >\n Add another account\n </Button>\n </div>\n <hr />\n <div style={{ margin: 'auto', padding: '8px' }}>\n <Button\n testid=\"header-signout-button\"\n onClick={() => {\n setUserMenuVisible(false);\n if (props.onSignOut) {\n props.onSignOut();\n }\n }}\n >\n Sign out of all accounts\n </Button>\n </div>\n <hr />\n <div style={{ margin: 'auto', padding: '8px', fontSize: '12px' }}>\n <a href=\"https://www.medplum.com/terms\">Terms</a>\n <a href=\"https://www.medplum.com/privacy\">Privacy</a>\n </div>\n </div>\n </Popup>\n </div>\n )}\n </header>\n <Popup\n modal={true}\n autoClose={true}\n visible={sidebarVisible}\n activeClassName=\"medplum-sidebar active\"\n inactiveClassName=\"medplum-sidebar\"\n onClose={() => setSidebarVisible(false)}\n >\n {props.config?.menu?.map((menu, index) => (\n <React.Fragment key={`menu-${index}-${props.config?.menu?.length}`}>\n <h5>{menu.title}</h5>\n <ul>\n {menu.link?.map((link) => (\n <li key={link.target}>\n <MedplumLink to={link.target}>{link.name}</MedplumLink>\n </li>\n ))}\n </ul>\n </React.Fragment>\n ))}\n <h5>Settings</h5>\n <ul>\n <li>\n <MedplumLink to={context.profile}>Profile</MedplumLink>\n </li>\n <li>\n <MedplumLink to=\"/changepassword\">Change password</MedplumLink>\n </li>\n </ul>\n </Popup>\n </>\n );\n}\n"],"names":[],"mappings":"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"}
@@ -4,19 +4,44 @@ import { Button } from './Button.js';
4
4
  import { Form } from './Form.js';
5
5
  import { FormSection } from './FormSection.js';
6
6
  import { Input } from './Input.js';
7
+ import { useMedplum } from './MedplumProvider.js';
8
+ import { ReferenceDisplay } from './ReferenceDisplay.js';
9
+ import { setPropertyValue } from './ResourceForm.js';
7
10
  import { ResourceInput } from './ResourceInput.js';
11
+ import { ResourcePropertyDisplay, getValueAndType } from './ResourcePropertyDisplay.js';
12
+ import { ResourcePropertyInput } from './ResourcePropertyInput.js';
8
13
  import { Select } from './Select.js';
9
14
  import { useResource } from './useResource.js';
15
+ import { killEvent } from './utils/dom.js';
10
16
 
11
17
  function PlanDefinitionBuilder(props) {
18
+ const medplum = useMedplum();
12
19
  const defaultValue = useResource(props.value);
20
+ const [schema, setSchema] = useState(undefined);
21
+ const [selectedKey, setSelectedKey] = useState();
22
+ const [hoverKey, setHoverKey] = useState();
13
23
  const [value, setValue] = useState();
24
+ function handleDocumentMouseOver() {
25
+ setHoverKey(undefined);
26
+ }
27
+ function handleDocumentClick() {
28
+ setSelectedKey(undefined);
29
+ }
14
30
  const valueRef = useRef();
15
31
  valueRef.current = value;
32
+ useEffect(() => {
33
+ medplum.requestSchema('PlanDefinition').then(setSchema).catch(console.log);
34
+ }, [medplum]);
16
35
  useEffect(() => {
17
36
  setValue(ensurePlanDefinitionKeys(defaultValue !== null && defaultValue !== void 0 ? defaultValue : { resourceType: 'PlanDefinition' }));
37
+ document.addEventListener('mouseover', handleDocumentMouseOver);
38
+ document.addEventListener('click', handleDocumentClick);
39
+ return () => {
40
+ document.removeEventListener('mouseover', handleDocumentMouseOver);
41
+ document.removeEventListener('click', handleDocumentClick);
42
+ };
18
43
  }, [defaultValue]);
19
- if (!value) {
44
+ if (!schema || !value) {
20
45
  return null;
21
46
  }
22
47
  function changeProperty(property, newValue) {
@@ -24,9 +49,9 @@ function PlanDefinitionBuilder(props) {
24
49
  }
25
50
  return (React.createElement("div", { className: "medplum-questionnaire-builder" },
26
51
  React.createElement(Form, { testid: "questionnaire-form", onSubmit: () => props.onSubmit(value) },
27
- React.createElement(FormSection, { title: "Plan Title", description: "The display name of the 'Plan', something that can be ordered.", htmlFor: "title" },
52
+ React.createElement(FormSection, { title: "Plan Title", htmlFor: "title" },
28
53
  React.createElement(Input, { defaultValue: value.title, onChange: (newValue) => changeProperty('title', newValue) })),
29
- React.createElement(ActionArrayBuilder, { actions: value.action || [], onChange: (x) => changeProperty('action', x) }),
54
+ React.createElement(ActionArrayBuilder, { actions: value.action || [], selectedKey: selectedKey, setSelectedKey: setSelectedKey, hoverKey: hoverKey, setHoverKey: setHoverKey, onChange: (x) => changeProperty('action', x) }),
30
55
  React.createElement(Button, { type: "submit", size: "large" }, "Save"))));
31
56
  }
32
57
  function ActionArrayBuilder(props) {
@@ -37,75 +62,102 @@ function ActionArrayBuilder(props) {
37
62
  }
38
63
  function addAction(addedAction) {
39
64
  props.onChange([...actionsRef.current, addedAction]);
65
+ props.setSelectedKey(addedAction.id);
40
66
  }
41
67
  function removeAction(removedAction) {
42
68
  props.onChange(actionsRef.current.filter((i) => i !== removedAction));
43
69
  }
44
70
  return (React.createElement("div", { className: "section" },
45
- props.actions.map((i) => (React.createElement("div", { key: i.id },
46
- React.createElement(ActionBuilder, { action: i, onChange: changeAction, onRemove: () => removeAction(i) })))),
71
+ props.actions.map((action) => (React.createElement("div", { key: action.id },
72
+ React.createElement(ActionBuilder, { action: action, selectedKey: props.selectedKey, setSelectedKey: props.setSelectedKey, hoverKey: props.hoverKey, setHoverKey: props.setHoverKey, onChange: changeAction, onRemove: () => removeAction(action) })))),
47
73
  React.createElement("div", { className: "bottom-actions" },
48
74
  React.createElement("a", { href: "#", onClick: (e) => {
49
- e.preventDefault();
75
+ killEvent(e);
50
76
  addAction({ id: generateId() });
51
77
  } }, "Add action"))));
52
78
  }
53
79
  function ActionBuilder(props) {
54
80
  const { action } = props;
55
- const [actionType, setActionType] = useState(getInitialActionType(action));
56
- const actionRef = useRef();
57
- actionRef.current = props.action;
81
+ const actionType = getInitialActionType(action);
82
+ const editing = props.selectedKey === props.action.id;
83
+ const hovering = props.hoverKey === props.action.id;
84
+ function onClick(e) {
85
+ e.stopPropagation();
86
+ props.setSelectedKey(props.action.id);
87
+ }
88
+ function onHover(e) {
89
+ killEvent(e);
90
+ props.setHoverKey(props.action.id);
91
+ }
92
+ const className = editing ? 'section editing' : hovering ? 'section hovering' : 'section';
93
+ return (React.createElement("div", { "data-testid": action.id, className: className, onClick: onClick, onMouseOver: onHover },
94
+ editing ? (React.createElement(ActionEditor, { action: action, actionType: actionType, onChange: props.onChange, selectedKey: props.selectedKey, setSelectedKey: props.setSelectedKey, hoverKey: props.hoverKey, setHoverKey: props.setHoverKey, onRemove: props.onRemove })) : (React.createElement(ActionDisplay, { action: action, actionType: actionType })),
95
+ React.createElement("div", { className: "bottom-actions" },
96
+ React.createElement("a", { href: "#", onClick: (e) => {
97
+ e.preventDefault();
98
+ props.onRemove();
99
+ } }, "Remove"))));
100
+ }
101
+ const timingProperty = {
102
+ path: 'PlanDefinition.action.timing[x]',
103
+ min: 0,
104
+ max: '1',
105
+ type: [{ code: 'dateTime' }, { code: 'Period' }, { code: 'Range' }, { code: 'Timing' }],
106
+ };
107
+ function ActionDisplay(props) {
108
+ const { action, actionType } = props;
109
+ const [propertyValue, propertyType] = getActionTiming(action);
110
+ return (React.createElement("div", null,
111
+ React.createElement("div", null,
112
+ action.title || 'Untitled',
113
+ " ",
114
+ actionType && `(${actionType})`),
115
+ action.definitionCanonical && (React.createElement("div", null,
116
+ React.createElement(ReferenceDisplay, { value: { reference: action.definitionCanonical } }))),
117
+ propertyValue && (React.createElement("div", null,
118
+ React.createElement(ResourcePropertyDisplay, { property: timingProperty, propertyType: propertyType, value: propertyValue })))));
119
+ }
120
+ function ActionEditor(props) {
121
+ const { action } = props;
122
+ const [actionType, setActionType] = useState(props.actionType);
58
123
  function changeProperty(property, value) {
59
- props.onChange(Object.assign(Object.assign({}, actionRef.current), { [property]: value }));
124
+ props.onChange(Object.assign(Object.assign({}, action), { [property]: value }));
60
125
  }
61
- return (React.createElement("div", { className: "section" },
62
- React.createElement(FormSection, { title: "Action Title", description: "The name of the action, an operational task to be completed.", htmlFor: `actionTitle-${action.id}` },
126
+ return (React.createElement(React.Fragment, null,
127
+ React.createElement(FormSection, { title: "Title", htmlFor: `actionTitle-${action.id}` },
63
128
  React.createElement(Input, { name: `actionTitle-${action.id}`, defaultValue: action.title, onChange: (newValue) => changeProperty('title', newValue) })),
64
- React.createElement(FormSection, { title: "Action Type", description: "The type of the action to be performed.", htmlFor: `actionType-${action.id}` },
129
+ React.createElement(FormSection, { title: "Type of Action", description: "The type of the action to be performed.", htmlFor: `actionType-${action.id}` },
65
130
  React.createElement(Select, { name: `actionType-${action.id}`, defaultValue: actionType, onChange: setActionType },
66
131
  React.createElement("option", null),
67
132
  React.createElement("option", { value: "appointment" }, "Appointment"),
68
- React.createElement("option", { value: "documentation" }, "Documentation"),
69
133
  React.createElement("option", { value: "lab" }, "Lab"),
70
134
  React.createElement("option", { value: "questionnaire" }, "Questionnaire"),
71
- React.createElement("option", { value: "shipping" }, "Shipping"),
72
135
  React.createElement("option", { value: "task" }, "Task"))),
73
- action.action && action.action.length > 0 && (React.createElement(ActionArrayBuilder, { actions: action.action, onChange: (x) => changeProperty('action', x) })),
136
+ action.action && action.action.length > 0 && (React.createElement(ActionArrayBuilder, { actions: action.action, selectedKey: props.selectedKey, setSelectedKey: props.setSelectedKey, hoverKey: props.hoverKey, setHoverKey: props.setHoverKey, onChange: (x) => changeProperty('action', x) })),
74
137
  (() => {
75
138
  switch (actionType) {
76
139
  case 'appointment':
77
- return React.createElement("div", null, "Appointment details");
78
- case 'documentation':
79
- return React.createElement("div", null, "Documentation details");
140
+ return (React.createElement(ActionResourceTypeBuilder, { title: "Appointment", description: "The subject must schedule an appointment from the schedule.", resourceType: "Schedule", action: action, onChange: props.onChange }));
80
141
  case 'lab':
81
- return React.createElement(LabActionBuilder, { action: action, onChange: props.onChange });
142
+ return (React.createElement(ActionResourceTypeBuilder, { title: "Lab", description: "The subject must complete the following lab panel.", resourceType: "ActivityDefinition", action: action, onChange: props.onChange }));
82
143
  case 'questionnaire':
83
- return React.createElement(QuestionnaireActionBuilder, { action: action, onChange: props.onChange });
84
- case 'shipping':
85
- return React.createElement("div", null, "Shipping details");
144
+ return (React.createElement(ActionResourceTypeBuilder, { title: "Questionnaire", description: "The subject must complete the selected questionnaire.", resourceType: "Questionnaire", action: action, onChange: props.onChange }));
86
145
  case 'task':
87
- return React.createElement("div", null, "Task details");
146
+ return (React.createElement(ActionResourceTypeBuilder, { title: "Task", description: "The subject must complete the following task.", resourceType: "ActivityDefinition", action: action, onChange: props.onChange }));
88
147
  default:
89
148
  return null;
90
149
  }
91
150
  })(),
92
- React.createElement("div", { className: "bottom-actions" },
93
- React.createElement("a", { href: "#", onClick: (e) => {
94
- e.preventDefault();
95
- props.onRemove();
96
- } }, "Remove"))));
97
- }
98
- function LabActionBuilder(props) {
99
- return (React.createElement(FormSection, { title: "Lab Details", description: "Choose observations definitions", htmlFor: props.action.id },
100
- React.createElement("a", { href: "#", onClick: () => props.onChange(props.action) }, "Add")));
151
+ React.createElement(FormSection, { title: "Timing", description: "When the action should take place.", htmlFor: 'timing-' + action.id },
152
+ React.createElement(ActionTimingInput, { name: 'timing-' + action.id, action: action, onChange: props.onChange }))));
101
153
  }
102
- function QuestionnaireActionBuilder(props) {
154
+ function ActionResourceTypeBuilder(props) {
103
155
  const { id, definitionCanonical } = props.action;
104
- const questionnaireRef = (definitionCanonical === null || definitionCanonical === void 0 ? void 0 : definitionCanonical.startsWith('Questionnaire/'))
156
+ const reference = (definitionCanonical === null || definitionCanonical === void 0 ? void 0 : definitionCanonical.startsWith(props.resourceType + '/'))
105
157
  ? { reference: definitionCanonical }
106
158
  : undefined;
107
- return (React.createElement(FormSection, { title: "Questionnaire", description: "Choose questionnaire", htmlFor: id },
108
- React.createElement(ResourceInput, { name: id, resourceType: "Questionnaire", defaultValue: questionnaireRef, onChange: (newValue) => {
159
+ return (React.createElement(FormSection, { title: props.title, description: props.description, htmlFor: id },
160
+ React.createElement(ResourceInput, { name: id, resourceType: props.resourceType, defaultValue: reference, loadOnFocus: true, onChange: (newValue) => {
109
161
  if (newValue) {
110
162
  props.onChange(Object.assign(Object.assign({}, props.action), { definitionCanonical: getReferenceString(newValue) }));
111
163
  }
@@ -114,13 +166,30 @@ function QuestionnaireActionBuilder(props) {
114
166
  }
115
167
  } })));
116
168
  }
169
+ function ActionTimingInput(props) {
170
+ const value = props.action;
171
+ const key = 'timing';
172
+ const [propertyValue, propertyType] = getActionTiming(value);
173
+ return (React.createElement(ResourcePropertyInput, { property: timingProperty, name: "timing[x]", defaultValue: propertyValue, defaultPropertyType: propertyType, onChange: (newValue, propName) => {
174
+ props.onChange(setPropertyValue(value, key, propName !== null && propName !== void 0 ? propName : key, timingProperty, newValue));
175
+ } }));
176
+ }
117
177
  function getInitialActionType(action) {
118
- var _a;
119
- if ((_a = action.definitionCanonical) === null || _a === void 0 ? void 0 : _a.startsWith('Questionnaire/')) {
178
+ var _a, _b, _c;
179
+ if ((_a = action.definitionCanonical) === null || _a === void 0 ? void 0 : _a.startsWith('Schedule')) {
180
+ return 'appointment';
181
+ }
182
+ if ((_b = action.definitionCanonical) === null || _b === void 0 ? void 0 : _b.startsWith('Questionnaire/')) {
120
183
  return 'questionnaire';
121
184
  }
185
+ if ((_c = action.definitionCanonical) === null || _c === void 0 ? void 0 : _c.startsWith('ActivityDefinition/')) {
186
+ return 'task';
187
+ }
122
188
  return undefined;
123
189
  }
190
+ function getActionTiming(action) {
191
+ return getValueAndType({ type: 'PlanDefinitionAction', value: action }, 'timing');
192
+ }
124
193
  let nextId = 1;
125
194
  /**
126
195
  * Generates a unique ID.
@@ -1 +1 @@
1
- {"version":3,"file":"PlanDefinitionBuilder.js","sources":["../../src/PlanDefinitionBuilder.tsx"],"sourcesContent":["import { getReferenceString } from '@medplum/core';\nimport { PlanDefinition, PlanDefinitionAction, Reference } from '@medplum/fhirtypes';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { Button } from './Button';\nimport { Form } from './Form';\nimport { FormSection } from './FormSection';\nimport { Input } from './Input';\nimport { ResourceInput } from './ResourceInput';\nimport { Select } from './Select';\nimport { useResource } from './useResource';\n\nexport interface PlanDefinitionBuilderProps {\n value: PlanDefinition | Reference<PlanDefinition>;\n onSubmit: (result: PlanDefinition) => void;\n}\n\nexport function PlanDefinitionBuilder(props: PlanDefinitionBuilderProps): JSX.Element | null {\n const defaultValue = useResource(props.value);\n const [value, setValue] = useState<PlanDefinition>();\n const valueRef = useRef<PlanDefinition>();\n valueRef.current = value;\n\n useEffect(() => {\n setValue(ensurePlanDefinitionKeys(defaultValue ?? { resourceType: 'PlanDefinition' }));\n }, [defaultValue]);\n\n if (!value) {\n return null;\n }\n\n function changeProperty(property: string, newValue: any): void {\n setValue({\n ...valueRef.current,\n [property]: newValue,\n } as PlanDefinition);\n }\n\n return (\n <div className=\"medplum-questionnaire-builder\">\n <Form testid=\"questionnaire-form\" onSubmit={() => props.onSubmit(value)}>\n <FormSection\n title=\"Plan Title\"\n description=\"The display name of the 'Plan', something that can be ordered.\"\n htmlFor=\"title\"\n >\n <Input defaultValue={value.title} onChange={(newValue) => changeProperty('title', newValue)} />\n </FormSection>\n <ActionArrayBuilder actions={value.action || []} onChange={(x) => changeProperty('action', x)} />\n <Button type=\"submit\" size=\"large\">\n Save\n </Button>\n </Form>\n </div>\n );\n}\n\ninterface ActionArrayBuilderProps {\n actions: PlanDefinitionAction[];\n onChange: (actions: PlanDefinitionAction[]) => void;\n}\n\nfunction ActionArrayBuilder(props: ActionArrayBuilderProps): JSX.Element {\n const actionsRef = useRef<PlanDefinitionAction[]>();\n actionsRef.current = props.actions;\n\n function changeAction(changedAction: PlanDefinitionAction): void {\n props.onChange(\n (actionsRef.current as PlanDefinition[]).map((i) => (i.id === changedAction.id ? changedAction : i))\n );\n }\n\n function addAction(addedAction: PlanDefinitionAction): void {\n props.onChange([...(actionsRef.current as PlanDefinition[]), addedAction]);\n }\n\n function removeAction(removedAction: PlanDefinitionAction): void {\n props.onChange((actionsRef.current as PlanDefinition[]).filter((i) => i !== removedAction));\n }\n\n return (\n <div className=\"section\">\n {props.actions.map((i) => (\n <div key={i.id}>\n <ActionBuilder action={i} onChange={changeAction} onRemove={() => removeAction(i)} />\n </div>\n ))}\n <div className=\"bottom-actions\">\n <a\n href=\"#\"\n onClick={(e) => {\n e.preventDefault();\n addAction({ id: generateId() });\n }}\n >\n Add action\n </a>\n </div>\n </div>\n );\n}\n\ninterface ActionBuilderProps {\n action: PlanDefinitionAction;\n onChange: (action: PlanDefinitionAction) => void;\n onRemove: () => void;\n}\n\nfunction ActionBuilder(props: ActionBuilderProps): JSX.Element {\n const { action } = props;\n const [actionType, setActionType] = useState<string | undefined>(getInitialActionType(action));\n\n const actionRef = useRef<PlanDefinitionAction>();\n actionRef.current = props.action;\n\n function changeProperty(property: string, value: any): void {\n props.onChange({\n ...actionRef.current,\n [property]: value,\n } as PlanDefinitionAction);\n }\n\n return (\n <div className=\"section\">\n <FormSection\n title=\"Action Title\"\n description=\"The name of the action, an operational task to be completed.\"\n htmlFor={`actionTitle-${action.id}`}\n >\n <Input\n name={`actionTitle-${action.id}`}\n defaultValue={action.title}\n onChange={(newValue) => changeProperty('title', newValue)}\n />\n </FormSection>\n <FormSection\n title=\"Action Type\"\n description=\"The type of the action to be performed.\"\n htmlFor={`actionType-${action.id}`}\n >\n <Select name={`actionType-${action.id}`} defaultValue={actionType} onChange={setActionType}>\n <option></option>\n <option value=\"appointment\">Appointment</option>\n <option value=\"documentation\">Documentation</option>\n <option value=\"lab\">Lab</option>\n <option value=\"questionnaire\">Questionnaire</option>\n <option value=\"shipping\">Shipping</option>\n <option value=\"task\">Task</option>\n </Select>\n </FormSection>\n {action.action && action.action.length > 0 && (\n <ActionArrayBuilder actions={action.action} onChange={(x) => changeProperty('action', x)} />\n )}\n {(() => {\n switch (actionType) {\n case 'appointment':\n return <div>Appointment details</div>;\n case 'documentation':\n return <div>Documentation details</div>;\n case 'lab':\n return <LabActionBuilder action={action} onChange={props.onChange} />;\n case 'questionnaire':\n return <QuestionnaireActionBuilder action={action} onChange={props.onChange} />;\n case 'shipping':\n return <div>Shipping details</div>;\n case 'task':\n return <div>Task details</div>;\n default:\n return null;\n }\n })()}\n <div className=\"bottom-actions\">\n <a\n href=\"#\"\n onClick={(e) => {\n e.preventDefault();\n props.onRemove();\n }}\n >\n Remove\n </a>\n </div>\n </div>\n );\n}\n\ninterface LabActionBuilderProps {\n action: PlanDefinitionAction;\n onChange: (action: PlanDefinitionAction) => void;\n}\n\nfunction LabActionBuilder(props: LabActionBuilderProps): JSX.Element {\n return (\n <FormSection title=\"Lab Details\" description=\"Choose observations definitions\" htmlFor={props.action.id}>\n <a href=\"#\" onClick={() => props.onChange(props.action)}>\n Add\n </a>\n </FormSection>\n );\n}\n\ninterface QuestionnaireActionBuilderProps {\n action: PlanDefinitionAction;\n onChange: (action: PlanDefinitionAction) => void;\n}\n\nfunction QuestionnaireActionBuilder(props: QuestionnaireActionBuilderProps): JSX.Element {\n const { id, definitionCanonical } = props.action;\n const questionnaireRef = definitionCanonical?.startsWith('Questionnaire/')\n ? { reference: definitionCanonical }\n : undefined;\n return (\n <FormSection title=\"Questionnaire\" description=\"Choose questionnaire\" htmlFor={id}>\n <ResourceInput\n name={id as string}\n resourceType=\"Questionnaire\"\n defaultValue={questionnaireRef}\n onChange={(newValue) => {\n if (newValue) {\n props.onChange({ ...props.action, definitionCanonical: getReferenceString(newValue) });\n } else {\n props.onChange({ ...props.action, definitionCanonical: undefined });\n }\n }}\n />\n </FormSection>\n );\n}\n\nfunction getInitialActionType(action: PlanDefinitionAction): string | undefined {\n if (action.definitionCanonical?.startsWith('Questionnaire/')) {\n return 'questionnaire';\n }\n\n return undefined;\n}\n\nlet nextId = 1;\n\n/**\n * Generates a unique ID.\n * React needs unique IDs for components for rendering performance.\n * All of the important components in the questionnaire builder have id properties for this:\n * Questionnaire, QuestionnaireItem, and QuestionnaireItemAnswerOption.\n * @return A unique key.\n */\nfunction generateId(existing?: string): string {\n if (existing) {\n if (existing.startsWith('id-')) {\n const existingNum = parseInt(existing.substring(3));\n if (!isNaN(existingNum)) {\n nextId = Math.max(nextId, existingNum + 1);\n }\n }\n return existing;\n }\n return 'id-' + nextId++;\n}\n\nfunction ensurePlanDefinitionKeys(planDefinition: PlanDefinition): PlanDefinition {\n return {\n ...planDefinition,\n action: ensurePlanDefinitionActionKeys(planDefinition.action),\n } as PlanDefinition;\n}\n\nfunction ensurePlanDefinitionActionKeys(\n actions: PlanDefinitionAction[] | undefined\n): PlanDefinitionAction[] | undefined {\n if (!actions) {\n return undefined;\n }\n return actions.map((action) => ({\n ...action,\n id: generateId(action.id),\n action: ensurePlanDefinitionActionKeys(action.action),\n }));\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"PlanDefinitionBuilder.js","sources":["../../src/PlanDefinitionBuilder.tsx"],"sourcesContent":["import { getReferenceString, IndexedStructureDefinition, PropertyType } from '@medplum/core';\nimport { ElementDefinition, PlanDefinition, PlanDefinitionAction, Reference } from '@medplum/fhirtypes';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { Button } from './Button';\nimport { Form } from './Form';\nimport { FormSection } from './FormSection';\nimport { Input } from './Input';\nimport { useMedplum } from './MedplumProvider';\nimport { ReferenceDisplay } from './ReferenceDisplay';\nimport { setPropertyValue } from './ResourceForm';\nimport { ResourceInput } from './ResourceInput';\nimport { getValueAndType, ResourcePropertyDisplay } from './ResourcePropertyDisplay';\nimport { ResourcePropertyInput } from './ResourcePropertyInput';\nimport { Select } from './Select';\nimport { useResource } from './useResource';\nimport { killEvent } from './utils/dom';\n\nexport interface PlanDefinitionBuilderProps {\n value: PlanDefinition | Reference<PlanDefinition>;\n onSubmit: (result: PlanDefinition) => void;\n}\n\nexport function PlanDefinitionBuilder(props: PlanDefinitionBuilderProps): JSX.Element | null {\n const medplum = useMedplum();\n const defaultValue = useResource(props.value);\n const [schema, setSchema] = useState<IndexedStructureDefinition | undefined>(undefined);\n const [selectedKey, setSelectedKey] = useState<string>();\n const [hoverKey, setHoverKey] = useState<string>();\n const [value, setValue] = useState<PlanDefinition>();\n\n function handleDocumentMouseOver(): void {\n setHoverKey(undefined);\n }\n\n function handleDocumentClick(): void {\n setSelectedKey(undefined);\n }\n\n const valueRef = useRef<PlanDefinition>();\n valueRef.current = value;\n\n useEffect(() => {\n medplum.requestSchema('PlanDefinition').then(setSchema).catch(console.log);\n }, [medplum]);\n\n useEffect(() => {\n setValue(ensurePlanDefinitionKeys(defaultValue ?? { resourceType: 'PlanDefinition' }));\n document.addEventListener('mouseover', handleDocumentMouseOver);\n document.addEventListener('click', handleDocumentClick);\n return () => {\n document.removeEventListener('mouseover', handleDocumentMouseOver);\n document.removeEventListener('click', handleDocumentClick);\n };\n }, [defaultValue]);\n\n if (!schema || !value) {\n return null;\n }\n\n function changeProperty(property: string, newValue: any): void {\n setValue({\n ...valueRef.current,\n [property]: newValue,\n } as PlanDefinition);\n }\n\n return (\n <div className=\"medplum-questionnaire-builder\">\n <Form testid=\"questionnaire-form\" onSubmit={() => props.onSubmit(value)}>\n <FormSection title=\"Plan Title\" htmlFor=\"title\">\n <Input defaultValue={value.title} onChange={(newValue) => changeProperty('title', newValue)} />\n </FormSection>\n <ActionArrayBuilder\n actions={value.action || []}\n selectedKey={selectedKey}\n setSelectedKey={setSelectedKey}\n hoverKey={hoverKey}\n setHoverKey={setHoverKey}\n onChange={(x) => changeProperty('action', x)}\n />\n <Button type=\"submit\" size=\"large\">\n Save\n </Button>\n </Form>\n </div>\n );\n}\n\ninterface ActionArrayBuilderProps {\n actions: PlanDefinitionAction[];\n selectedKey: string | undefined;\n setSelectedKey: (key: string | undefined) => void;\n hoverKey: string | undefined;\n setHoverKey: (key: string | undefined) => void;\n onChange: (actions: PlanDefinitionAction[]) => void;\n}\n\nfunction ActionArrayBuilder(props: ActionArrayBuilderProps): JSX.Element {\n const actionsRef = useRef<PlanDefinitionAction[]>();\n actionsRef.current = props.actions;\n\n function changeAction(changedAction: PlanDefinitionAction): void {\n props.onChange(\n (actionsRef.current as PlanDefinition[]).map((i) => (i.id === changedAction.id ? changedAction : i))\n );\n }\n\n function addAction(addedAction: PlanDefinitionAction): void {\n props.onChange([...(actionsRef.current as PlanDefinition[]), addedAction]);\n props.setSelectedKey(addedAction.id);\n }\n\n function removeAction(removedAction: PlanDefinitionAction): void {\n props.onChange((actionsRef.current as PlanDefinition[]).filter((i) => i !== removedAction));\n }\n\n return (\n <div className=\"section\">\n {props.actions.map((action) => (\n <div key={action.id}>\n <ActionBuilder\n action={action}\n selectedKey={props.selectedKey}\n setSelectedKey={props.setSelectedKey}\n hoverKey={props.hoverKey}\n setHoverKey={props.setHoverKey}\n onChange={changeAction}\n onRemove={() => removeAction(action)}\n />\n </div>\n ))}\n <div className=\"bottom-actions\">\n <a\n href=\"#\"\n onClick={(e) => {\n killEvent(e);\n addAction({ id: generateId() });\n }}\n >\n Add action\n </a>\n </div>\n </div>\n );\n}\n\ninterface ActionBuilderProps {\n action: PlanDefinitionAction;\n selectedKey: string | undefined;\n setSelectedKey: (key: string | undefined) => void;\n hoverKey: string | undefined;\n setHoverKey: (key: string | undefined) => void;\n onChange: (action: PlanDefinitionAction) => void;\n onRemove: () => void;\n}\n\nfunction ActionBuilder(props: ActionBuilderProps): JSX.Element {\n const { action } = props;\n const actionType = getInitialActionType(action);\n const editing = props.selectedKey === props.action.id;\n const hovering = props.hoverKey === props.action.id;\n\n function onClick(e: React.SyntheticEvent): void {\n e.stopPropagation();\n props.setSelectedKey(props.action.id);\n }\n\n function onHover(e: React.SyntheticEvent): void {\n killEvent(e);\n props.setHoverKey(props.action.id);\n }\n\n const className = editing ? 'section editing' : hovering ? 'section hovering' : 'section';\n return (\n <div data-testid={action.id} className={className} onClick={onClick} onMouseOver={onHover}>\n {editing ? (\n <ActionEditor\n action={action}\n actionType={actionType}\n onChange={props.onChange}\n selectedKey={props.selectedKey}\n setSelectedKey={props.setSelectedKey}\n hoverKey={props.hoverKey}\n setHoverKey={props.setHoverKey}\n onRemove={props.onRemove}\n />\n ) : (\n <ActionDisplay action={action} actionType={actionType} />\n )}\n <div className=\"bottom-actions\">\n <a\n href=\"#\"\n onClick={(e) => {\n e.preventDefault();\n props.onRemove();\n }}\n >\n Remove\n </a>\n </div>\n </div>\n );\n}\n\nconst timingProperty: ElementDefinition = {\n path: 'PlanDefinition.action.timing[x]',\n min: 0,\n max: '1',\n type: [{ code: 'dateTime' }, { code: 'Period' }, { code: 'Range' }, { code: 'Timing' }],\n};\n\ninterface ActionDisplayProps {\n action: PlanDefinitionAction;\n actionType: string | undefined;\n}\n\nfunction ActionDisplay(props: ActionDisplayProps): JSX.Element {\n const { action, actionType } = props;\n const [propertyValue, propertyType] = getActionTiming(action);\n return (\n <div>\n <div>\n {action.title || 'Untitled'} {actionType && `(${actionType})`}\n </div>\n {action.definitionCanonical && (\n <div>\n <ReferenceDisplay value={{ reference: action.definitionCanonical }} />\n </div>\n )}\n {propertyValue && (\n <div>\n <ResourcePropertyDisplay property={timingProperty} propertyType={propertyType} value={propertyValue} />\n </div>\n )}\n </div>\n );\n}\n\ninterface ActionEditorProps {\n action: PlanDefinitionAction;\n actionType: string | undefined;\n selectedKey: string | undefined;\n setSelectedKey: (key: string | undefined) => void;\n hoverKey: string | undefined;\n setHoverKey: (key: string | undefined) => void;\n onChange: (action: PlanDefinitionAction) => void;\n onRemove: () => void;\n}\n\nfunction ActionEditor(props: ActionEditorProps): JSX.Element {\n const { action } = props;\n const [actionType, setActionType] = useState<string | undefined>(props.actionType);\n\n function changeProperty(property: string, value: any): void {\n props.onChange({\n ...action,\n [property]: value,\n } as PlanDefinitionAction);\n }\n\n return (\n <>\n <FormSection title=\"Title\" htmlFor={`actionTitle-${action.id}`}>\n <Input\n name={`actionTitle-${action.id}`}\n defaultValue={action.title}\n onChange={(newValue) => changeProperty('title', newValue)}\n />\n </FormSection>\n <FormSection\n title=\"Type of Action\"\n description=\"The type of the action to be performed.\"\n htmlFor={`actionType-${action.id}`}\n >\n <Select name={`actionType-${action.id}`} defaultValue={actionType} onChange={setActionType}>\n <option></option>\n <option value=\"appointment\">Appointment</option>\n <option value=\"lab\">Lab</option>\n <option value=\"questionnaire\">Questionnaire</option>\n <option value=\"task\">Task</option>\n </Select>\n </FormSection>\n {action.action && action.action.length > 0 && (\n <ActionArrayBuilder\n actions={action.action}\n selectedKey={props.selectedKey}\n setSelectedKey={props.setSelectedKey}\n hoverKey={props.hoverKey}\n setHoverKey={props.setHoverKey}\n onChange={(x) => changeProperty('action', x)}\n />\n )}\n {(() => {\n switch (actionType) {\n case 'appointment':\n return (\n <ActionResourceTypeBuilder\n title=\"Appointment\"\n description=\"The subject must schedule an appointment from the schedule.\"\n resourceType=\"Schedule\"\n action={action}\n onChange={props.onChange}\n />\n );\n case 'lab':\n return (\n <ActionResourceTypeBuilder\n title=\"Lab\"\n description=\"The subject must complete the following lab panel.\"\n resourceType=\"ActivityDefinition\"\n action={action}\n onChange={props.onChange}\n />\n );\n case 'questionnaire':\n return (\n <ActionResourceTypeBuilder\n title=\"Questionnaire\"\n description=\"The subject must complete the selected questionnaire.\"\n resourceType=\"Questionnaire\"\n action={action}\n onChange={props.onChange}\n />\n );\n case 'task':\n return (\n <ActionResourceTypeBuilder\n title=\"Task\"\n description=\"The subject must complete the following task.\"\n resourceType=\"ActivityDefinition\"\n action={action}\n onChange={props.onChange}\n />\n );\n default:\n return null;\n }\n })()}\n <FormSection title=\"Timing\" description=\"When the action should take place.\" htmlFor={'timing-' + action.id}>\n <ActionTimingInput name={'timing-' + action.id} action={action} onChange={props.onChange} />\n </FormSection>\n </>\n );\n}\n\ninterface ActionResourceTypeBuilderProps {\n action: PlanDefinitionAction;\n title: string;\n description: string;\n resourceType: string;\n onChange: (action: PlanDefinitionAction) => void;\n}\n\nfunction ActionResourceTypeBuilder(props: ActionResourceTypeBuilderProps): JSX.Element {\n const { id, definitionCanonical } = props.action;\n const reference = definitionCanonical?.startsWith(props.resourceType + '/')\n ? { reference: definitionCanonical }\n : undefined;\n return (\n <FormSection title={props.title} description={props.description} htmlFor={id}>\n <ResourceInput\n name={id as string}\n resourceType={props.resourceType}\n defaultValue={reference}\n loadOnFocus={true}\n onChange={(newValue) => {\n if (newValue) {\n props.onChange({ ...props.action, definitionCanonical: getReferenceString(newValue) });\n } else {\n props.onChange({ ...props.action, definitionCanonical: undefined });\n }\n }}\n />\n </FormSection>\n );\n}\n\ninterface ActionTimingInputProps {\n name: string;\n action: PlanDefinitionAction;\n onChange: (action: PlanDefinitionAction) => void;\n}\n\nfunction ActionTimingInput(props: ActionTimingInputProps): JSX.Element {\n const value = props.action;\n const key = 'timing';\n const [propertyValue, propertyType] = getActionTiming(value);\n return (\n <ResourcePropertyInput\n property={timingProperty}\n name=\"timing[x]\"\n defaultValue={propertyValue}\n defaultPropertyType={propertyType}\n onChange={(newValue: any, propName?: string) => {\n props.onChange(setPropertyValue(value, key, propName ?? key, timingProperty, newValue));\n }}\n />\n );\n}\n\nfunction getInitialActionType(action: PlanDefinitionAction): string | undefined {\n if (action.definitionCanonical?.startsWith('Schedule')) {\n return 'appointment';\n }\n\n if (action.definitionCanonical?.startsWith('Questionnaire/')) {\n return 'questionnaire';\n }\n\n if (action.definitionCanonical?.startsWith('ActivityDefinition/')) {\n return 'task';\n }\n\n return undefined;\n}\n\nfunction getActionTiming(action: PlanDefinitionAction): [any, PropertyType] {\n return getValueAndType({ type: 'PlanDefinitionAction', value: action }, 'timing');\n}\n\nlet nextId = 1;\n\n/**\n * Generates a unique ID.\n * React needs unique IDs for components for rendering performance.\n * All of the important components in the questionnaire builder have id properties for this:\n * Questionnaire, QuestionnaireItem, and QuestionnaireItemAnswerOption.\n * @return A unique key.\n */\nfunction generateId(existing?: string): string {\n if (existing) {\n if (existing.startsWith('id-')) {\n const existingNum = parseInt(existing.substring(3));\n if (!isNaN(existingNum)) {\n nextId = Math.max(nextId, existingNum + 1);\n }\n }\n return existing;\n }\n return 'id-' + nextId++;\n}\n\nfunction ensurePlanDefinitionKeys(planDefinition: PlanDefinition): PlanDefinition {\n return {\n ...planDefinition,\n action: ensurePlanDefinitionActionKeys(planDefinition.action),\n } as PlanDefinition;\n}\n\nfunction ensurePlanDefinitionActionKeys(\n actions: PlanDefinitionAction[] | undefined\n): PlanDefinitionAction[] | undefined {\n if (!actions) {\n return undefined;\n }\n return actions.map((action) => ({\n ...action,\n id: generateId(action.id),\n action: ensurePlanDefinitionActionKeys(action.action),\n }));\n}\n"],"names":[],"mappings":"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"}
@@ -27,7 +27,7 @@ function QuestionnaireBuilder(props) {
27
27
  setSelectedKey(undefined);
28
28
  }
29
29
  useEffect(() => {
30
- medplum.requestSchema('Questionnaire').then(setSchema);
30
+ medplum.requestSchema('Questionnaire').then(setSchema).catch(console.log);
31
31
  }, [medplum]);
32
32
  useEffect(() => {
33
33
  setValue(ensureQuestionnaireKeys(defaultValue !== null && defaultValue !== void 0 ? defaultValue : { resourceType: 'Questionnaire' }));
@@ -1 +1 @@
1
- {"version":3,"file":"QuestionnaireBuilder.js","sources":["../../src/QuestionnaireBuilder.tsx"],"sourcesContent":["import { globalSchema, IndexedStructureDefinition } from '@medplum/core';\nimport { Questionnaire, QuestionnaireItem, QuestionnaireItemAnswerOption, Reference } from '@medplum/fhirtypes';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { Button } from './Button';\nimport { Form } from './Form';\nimport { Input } from './Input';\nimport { useMedplum } from './MedplumProvider';\nimport { QuestionnaireFormItem } from './QuestionnaireForm';\nimport { isChoiceQuestion, QuestionnaireItemType } from './QuestionnaireUtils';\nimport { getValueAndType } from './ResourcePropertyDisplay';\nimport { ResourcePropertyInput } from './ResourcePropertyInput';\nimport { Select } from './Select';\nimport { TextArea } from './TextArea';\nimport { useResource } from './useResource';\nimport { killEvent } from './utils/dom';\nimport './QuestionnaireBuilder.css';\n\nexport interface QuestionnaireBuilderProps {\n questionnaire: Questionnaire | Reference<Questionnaire>;\n onSubmit: (result: Questionnaire) => void;\n}\n\nexport function QuestionnaireBuilder(props: QuestionnaireBuilderProps): JSX.Element | null {\n const medplum = useMedplum();\n const defaultValue = useResource(props.questionnaire);\n const [schema, setSchema] = useState<IndexedStructureDefinition | undefined>();\n const [value, setValue] = useState<Questionnaire>();\n const [selectedKey, setSelectedKey] = useState<string>();\n const [hoverKey, setHoverKey] = useState<string>();\n\n function handleDocumentMouseOver(): void {\n setHoverKey(undefined);\n }\n\n function handleDocumentClick(): void {\n setSelectedKey(undefined);\n }\n\n useEffect(() => {\n medplum.requestSchema('Questionnaire').then(setSchema);\n }, [medplum]);\n\n useEffect(() => {\n setValue(ensureQuestionnaireKeys(defaultValue ?? { resourceType: 'Questionnaire' }));\n document.addEventListener('mouseover', handleDocumentMouseOver);\n document.addEventListener('click', handleDocumentClick);\n return () => {\n document.removeEventListener('mouseover', handleDocumentMouseOver);\n document.removeEventListener('click', handleDocumentClick);\n };\n }, [defaultValue]);\n\n if (!schema || !value) {\n return null;\n }\n\n return (\n <div className=\"medplum-questionnaire-builder\">\n <Form testid=\"questionnaire-form\" onSubmit={() => props.onSubmit(value)}>\n <ItemBuilder\n item={value}\n selectedKey={selectedKey}\n setSelectedKey={setSelectedKey}\n hoverKey={hoverKey}\n setHoverKey={setHoverKey}\n onChange={setValue}\n />\n <Button type=\"submit\" size=\"large\">\n Save\n </Button>\n </Form>\n </div>\n );\n}\n\ninterface ItemBuilderProps<T extends Questionnaire | QuestionnaireItem> {\n item: T;\n selectedKey: string | undefined;\n setSelectedKey: (key: string | undefined) => void;\n hoverKey: string | undefined;\n setHoverKey: (key: string | undefined) => void;\n onChange: (item: T) => void;\n onRemove?: () => void;\n}\n\nfunction ItemBuilder<T extends Questionnaire | QuestionnaireItem>(props: ItemBuilderProps<T>): JSX.Element {\n const resource = props.item as Questionnaire;\n const item = props.item as QuestionnaireItem;\n const isResource = 'resourceType' in props.item;\n const isContainer = isResource || item.type === QuestionnaireItemType.group;\n const linkId = item.linkId ?? '[untitled]';\n const editing = props.selectedKey === props.item.id;\n const hovering = props.hoverKey === props.item.id;\n\n const itemRef = useRef<T>();\n itemRef.current = props.item;\n\n function onClick(e: React.SyntheticEvent): void {\n killEvent(e);\n props.setSelectedKey(props.item.id);\n }\n\n function onHover(e: React.SyntheticEvent): void {\n killEvent(e);\n props.setHoverKey(props.item.id);\n }\n\n function changeItem(changedItem: QuestionnaireItem): void {\n const curr = itemRef.current as T;\n props.onChange({\n ...curr,\n item: curr.item?.map((i) => (i.id === changedItem.id ? changedItem : i)),\n } as T);\n }\n\n function addItem(addedItem: QuestionnaireItem): void {\n props.onChange({\n ...props.item,\n item: [...(props.item?.item ?? []), addedItem],\n });\n }\n\n function removeItem(removedItem: QuestionnaireItem): void {\n props.onChange({\n ...props.item,\n item: props.item?.item?.filter((i) => i !== removedItem),\n });\n }\n\n function changeProperty(property: string, value: any): void {\n props.onChange({\n ...itemRef.current,\n [property]: value,\n } as T);\n }\n\n const className = editing ? 'section editing' : hovering ? 'section hovering' : 'section';\n return (\n <div data-testid={item.linkId} className={className} onClick={onClick} onMouseOver={onHover}>\n {editing ? (\n <>\n {isResource && (\n <div>\n <Input defaultValue={resource.title} onChange={(newValue) => changeProperty('title', newValue)} />\n </div>\n )}\n {!isContainer && (\n <div>\n <Select defaultValue={item.type} onChange={(newValue) => changeProperty('type', newValue)}>\n <option value=\"display\">Display</option>\n <optgroup label=\"Question\">\n <option value=\"boolean\">Boolean</option>\n <option value=\"decimal\">Decimal</option>\n <option value=\"integer\">Integer</option>\n <option value=\"date\">Date</option>\n <option value=\"dateTime\">Date/Time</option>\n <option value=\"time\">Time</option>\n <option value=\"string\">String</option>\n <option value=\"text\">Text</option>\n <option value=\"url\">URL</option>\n <option value=\"choice\">Choice</option>\n <option value=\"open-choice\">Open Choice</option>\n <option value=\"attachment\">Attachment</option>\n <option value=\"reference\">Reference</option>\n <option value=\"quantity\">Quantity</option>\n </optgroup>\n </Select>\n </div>\n )}\n {!isResource && (\n <TextArea\n style={{ width: '95%', height: '100px', minHeight: '100px', margin: '8px 4px 4px 4px' }}\n defaultValue={item.text}\n onChange={(newValue) => changeProperty('text', newValue)}\n />\n )}\n {isChoiceQuestion(item) && (\n <AnswerBuilder\n options={item.answerOption}\n onChange={(newOptions) => changeProperty('answerOption', newOptions)}\n />\n )}\n </>\n ) : (\n <>\n {resource.title && <h1>{resource.title}</h1>}\n {item.text && <p>{item.text}</p>}\n {!isContainer && <QuestionnaireFormItem item={item} onChange={() => undefined} />}\n </>\n )}\n {item.item &&\n item.item.map((i) => (\n <div key={i.id}>\n <ItemBuilder\n item={i}\n selectedKey={props.selectedKey}\n setSelectedKey={props.setSelectedKey}\n hoverKey={props.hoverKey}\n setHoverKey={props.setHoverKey}\n onChange={changeItem}\n onRemove={() => removeItem(i)}\n />\n </div>\n ))}\n {!isContainer && (\n <div className=\"top-actions\">\n {editing ? (\n <Input defaultValue={item.linkId} onChange={(newValue) => changeProperty('linkId', newValue)} size={4} />\n ) : (\n <div>{linkId}</div>\n )}\n </div>\n )}\n <div className=\"bottom-actions\">\n {isContainer && (\n <>\n <a\n href=\"#\"\n onClick={(e) => {\n e.preventDefault();\n addItem({\n id: generateId(),\n linkId: generateLinkId('q'),\n type: 'string',\n text: 'Question',\n } as QuestionnaireItem);\n }}\n >\n Add item\n </a>\n <a\n href=\"#\"\n onClick={(e) => {\n e.preventDefault();\n addItem({\n id: generateId(),\n linkId: generateLinkId('g'),\n type: 'group',\n text: 'Group',\n } as QuestionnaireItem);\n }}\n >\n Add group\n </a>\n </>\n )}\n {!isResource && (\n <a\n href=\"#\"\n onClick={(e) => {\n e.preventDefault();\n if (props.onRemove) {\n props.onRemove();\n }\n }}\n >\n Remove\n </a>\n )}\n </div>\n </div>\n );\n}\n\ninterface AnswerBuilderProps {\n options?: QuestionnaireItemAnswerOption[];\n onChange: (newOptions: QuestionnaireItemAnswerOption[]) => void;\n}\n\nfunction AnswerBuilder(props: AnswerBuilderProps): JSX.Element {\n const property = globalSchema.types['QuestionnaireItemAnswerOption'].properties['value[x]'];\n const options = props.options ?? [];\n return (\n <div>\n {options.map((option: QuestionnaireItemAnswerOption) => {\n const [propertyValue, propertyType] = getValueAndType(\n { type: 'QuestionnaireItemAnswerOption', value: option },\n 'value'\n );\n return (\n <div\n key={option.id}\n style={{\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'space-between',\n alignItems: 'center',\n width: '80%',\n }}\n >\n <div>\n <ResourcePropertyInput\n key={option.id}\n name=\"value[x]\"\n property={property}\n defaultPropertyType={propertyType}\n defaultValue={propertyValue}\n onChange={(newValue: any, propName?: string) => {\n const newOptions = [...options];\n const index = newOptions.findIndex((o) => o.id === option.id);\n newOptions[index] = { id: option.id, [propName as string]: newValue };\n props.onChange(newOptions);\n }}\n />\n </div>\n <div>\n <a\n href=\"#\"\n onClick={(e: React.SyntheticEvent) => {\n killEvent(e);\n props.onChange(options.filter((o) => o.id !== option.id));\n }}\n >\n Remove\n </a>\n </div>\n </div>\n );\n })}\n <a\n href=\"#\"\n onClick={(e: React.SyntheticEvent) => {\n killEvent(e);\n props.onChange([\n ...options,\n {\n id: generateId(),\n },\n ]);\n }}\n >\n Add choice\n </a>\n </div>\n );\n}\n\nlet nextLinkId = 1;\nlet nextId = 1;\n\n/**\n * Generates a link ID for an item.\n * Link IDs are required properties on QuestionnaireItem objects.\n * @return A unique link ID.\n */\nfunction generateLinkId(prefix: string): string {\n return prefix + nextLinkId++;\n}\n\n/**\n * Generates a unique ID.\n * React needs unique IDs for components for rendering performance.\n * All of the important components in the questionnaire builder have id properties for this:\n * Questionnaire, QuestionnaireItem, and QuestionnaireItemAnswerOption.\n * @return A unique key.\n */\nfunction generateId(): string {\n return 'id-' + nextId++;\n}\n\nfunction ensureQuestionnaireKeys(questionnaire: Questionnaire): Questionnaire {\n return {\n ...questionnaire,\n id: questionnaire.id || generateId(),\n item: ensureQuestionnaireItemKeys(questionnaire.item),\n } as Questionnaire;\n}\n\nfunction ensureQuestionnaireItemKeys(items: QuestionnaireItem[] | undefined): QuestionnaireItem[] | undefined {\n if (!items) {\n return undefined;\n }\n return items.map((item) => ({\n ...item,\n id: item.id || generateId(),\n item: ensureQuestionnaireItemKeys(item.item),\n answerOption: ensureQuestionnaireOptionKeys(item.answerOption),\n }));\n}\n\nfunction ensureQuestionnaireOptionKeys(\n options: QuestionnaireItemAnswerOption[] | undefined\n): QuestionnaireItemAnswerOption[] | undefined {\n if (!options) {\n return undefined;\n }\n return options.map((option) => ({\n ...option,\n id: option.id || generateId(),\n }));\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"QuestionnaireBuilder.js","sources":["../../src/QuestionnaireBuilder.tsx"],"sourcesContent":["import { globalSchema, IndexedStructureDefinition } from '@medplum/core';\nimport { Questionnaire, QuestionnaireItem, QuestionnaireItemAnswerOption, Reference } from '@medplum/fhirtypes';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { Button } from './Button';\nimport { Form } from './Form';\nimport { Input } from './Input';\nimport { useMedplum } from './MedplumProvider';\nimport { QuestionnaireFormItem } from './QuestionnaireForm';\nimport { isChoiceQuestion, QuestionnaireItemType } from './QuestionnaireUtils';\nimport { getValueAndType } from './ResourcePropertyDisplay';\nimport { ResourcePropertyInput } from './ResourcePropertyInput';\nimport { Select } from './Select';\nimport { TextArea } from './TextArea';\nimport { useResource } from './useResource';\nimport { killEvent } from './utils/dom';\nimport './QuestionnaireBuilder.css';\n\nexport interface QuestionnaireBuilderProps {\n questionnaire: Questionnaire | Reference<Questionnaire>;\n onSubmit: (result: Questionnaire) => void;\n}\n\nexport function QuestionnaireBuilder(props: QuestionnaireBuilderProps): JSX.Element | null {\n const medplum = useMedplum();\n const defaultValue = useResource(props.questionnaire);\n const [schema, setSchema] = useState<IndexedStructureDefinition | undefined>();\n const [value, setValue] = useState<Questionnaire>();\n const [selectedKey, setSelectedKey] = useState<string>();\n const [hoverKey, setHoverKey] = useState<string>();\n\n function handleDocumentMouseOver(): void {\n setHoverKey(undefined);\n }\n\n function handleDocumentClick(): void {\n setSelectedKey(undefined);\n }\n\n useEffect(() => {\n medplum.requestSchema('Questionnaire').then(setSchema).catch(console.log);\n }, [medplum]);\n\n useEffect(() => {\n setValue(ensureQuestionnaireKeys(defaultValue ?? { resourceType: 'Questionnaire' }));\n document.addEventListener('mouseover', handleDocumentMouseOver);\n document.addEventListener('click', handleDocumentClick);\n return () => {\n document.removeEventListener('mouseover', handleDocumentMouseOver);\n document.removeEventListener('click', handleDocumentClick);\n };\n }, [defaultValue]);\n\n if (!schema || !value) {\n return null;\n }\n\n return (\n <div className=\"medplum-questionnaire-builder\">\n <Form testid=\"questionnaire-form\" onSubmit={() => props.onSubmit(value)}>\n <ItemBuilder\n item={value}\n selectedKey={selectedKey}\n setSelectedKey={setSelectedKey}\n hoverKey={hoverKey}\n setHoverKey={setHoverKey}\n onChange={setValue}\n />\n <Button type=\"submit\" size=\"large\">\n Save\n </Button>\n </Form>\n </div>\n );\n}\n\ninterface ItemBuilderProps<T extends Questionnaire | QuestionnaireItem> {\n item: T;\n selectedKey: string | undefined;\n setSelectedKey: (key: string | undefined) => void;\n hoverKey: string | undefined;\n setHoverKey: (key: string | undefined) => void;\n onChange: (item: T) => void;\n onRemove?: () => void;\n}\n\nfunction ItemBuilder<T extends Questionnaire | QuestionnaireItem>(props: ItemBuilderProps<T>): JSX.Element {\n const resource = props.item as Questionnaire;\n const item = props.item as QuestionnaireItem;\n const isResource = 'resourceType' in props.item;\n const isContainer = isResource || item.type === QuestionnaireItemType.group;\n const linkId = item.linkId ?? '[untitled]';\n const editing = props.selectedKey === props.item.id;\n const hovering = props.hoverKey === props.item.id;\n\n const itemRef = useRef<T>();\n itemRef.current = props.item;\n\n function onClick(e: React.SyntheticEvent): void {\n killEvent(e);\n props.setSelectedKey(props.item.id);\n }\n\n function onHover(e: React.SyntheticEvent): void {\n killEvent(e);\n props.setHoverKey(props.item.id);\n }\n\n function changeItem(changedItem: QuestionnaireItem): void {\n const curr = itemRef.current as T;\n props.onChange({\n ...curr,\n item: curr.item?.map((i) => (i.id === changedItem.id ? changedItem : i)),\n } as T);\n }\n\n function addItem(addedItem: QuestionnaireItem): void {\n props.onChange({\n ...props.item,\n item: [...(props.item?.item ?? []), addedItem],\n });\n }\n\n function removeItem(removedItem: QuestionnaireItem): void {\n props.onChange({\n ...props.item,\n item: props.item?.item?.filter((i) => i !== removedItem),\n });\n }\n\n function changeProperty(property: string, value: any): void {\n props.onChange({\n ...itemRef.current,\n [property]: value,\n } as T);\n }\n\n const className = editing ? 'section editing' : hovering ? 'section hovering' : 'section';\n return (\n <div data-testid={item.linkId} className={className} onClick={onClick} onMouseOver={onHover}>\n {editing ? (\n <>\n {isResource && (\n <div>\n <Input defaultValue={resource.title} onChange={(newValue) => changeProperty('title', newValue)} />\n </div>\n )}\n {!isContainer && (\n <div>\n <Select defaultValue={item.type} onChange={(newValue) => changeProperty('type', newValue)}>\n <option value=\"display\">Display</option>\n <optgroup label=\"Question\">\n <option value=\"boolean\">Boolean</option>\n <option value=\"decimal\">Decimal</option>\n <option value=\"integer\">Integer</option>\n <option value=\"date\">Date</option>\n <option value=\"dateTime\">Date/Time</option>\n <option value=\"time\">Time</option>\n <option value=\"string\">String</option>\n <option value=\"text\">Text</option>\n <option value=\"url\">URL</option>\n <option value=\"choice\">Choice</option>\n <option value=\"open-choice\">Open Choice</option>\n <option value=\"attachment\">Attachment</option>\n <option value=\"reference\">Reference</option>\n <option value=\"quantity\">Quantity</option>\n </optgroup>\n </Select>\n </div>\n )}\n {!isResource && (\n <TextArea\n style={{ width: '95%', height: '100px', minHeight: '100px', margin: '8px 4px 4px 4px' }}\n defaultValue={item.text}\n onChange={(newValue) => changeProperty('text', newValue)}\n />\n )}\n {isChoiceQuestion(item) && (\n <AnswerBuilder\n options={item.answerOption}\n onChange={(newOptions) => changeProperty('answerOption', newOptions)}\n />\n )}\n </>\n ) : (\n <>\n {resource.title && <h1>{resource.title}</h1>}\n {item.text && <p>{item.text}</p>}\n {!isContainer && <QuestionnaireFormItem item={item} onChange={() => undefined} />}\n </>\n )}\n {item.item &&\n item.item.map((i) => (\n <div key={i.id}>\n <ItemBuilder\n item={i}\n selectedKey={props.selectedKey}\n setSelectedKey={props.setSelectedKey}\n hoverKey={props.hoverKey}\n setHoverKey={props.setHoverKey}\n onChange={changeItem}\n onRemove={() => removeItem(i)}\n />\n </div>\n ))}\n {!isContainer && (\n <div className=\"top-actions\">\n {editing ? (\n <Input defaultValue={item.linkId} onChange={(newValue) => changeProperty('linkId', newValue)} size={4} />\n ) : (\n <div>{linkId}</div>\n )}\n </div>\n )}\n <div className=\"bottom-actions\">\n {isContainer && (\n <>\n <a\n href=\"#\"\n onClick={(e) => {\n e.preventDefault();\n addItem({\n id: generateId(),\n linkId: generateLinkId('q'),\n type: 'string',\n text: 'Question',\n } as QuestionnaireItem);\n }}\n >\n Add item\n </a>\n <a\n href=\"#\"\n onClick={(e) => {\n e.preventDefault();\n addItem({\n id: generateId(),\n linkId: generateLinkId('g'),\n type: 'group',\n text: 'Group',\n } as QuestionnaireItem);\n }}\n >\n Add group\n </a>\n </>\n )}\n {!isResource && (\n <a\n href=\"#\"\n onClick={(e) => {\n e.preventDefault();\n if (props.onRemove) {\n props.onRemove();\n }\n }}\n >\n Remove\n </a>\n )}\n </div>\n </div>\n );\n}\n\ninterface AnswerBuilderProps {\n options?: QuestionnaireItemAnswerOption[];\n onChange: (newOptions: QuestionnaireItemAnswerOption[]) => void;\n}\n\nfunction AnswerBuilder(props: AnswerBuilderProps): JSX.Element {\n const property = globalSchema.types['QuestionnaireItemAnswerOption'].properties['value[x]'];\n const options = props.options ?? [];\n return (\n <div>\n {options.map((option: QuestionnaireItemAnswerOption) => {\n const [propertyValue, propertyType] = getValueAndType(\n { type: 'QuestionnaireItemAnswerOption', value: option },\n 'value'\n );\n return (\n <div\n key={option.id}\n style={{\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'space-between',\n alignItems: 'center',\n width: '80%',\n }}\n >\n <div>\n <ResourcePropertyInput\n key={option.id}\n name=\"value[x]\"\n property={property}\n defaultPropertyType={propertyType}\n defaultValue={propertyValue}\n onChange={(newValue: any, propName?: string) => {\n const newOptions = [...options];\n const index = newOptions.findIndex((o) => o.id === option.id);\n newOptions[index] = { id: option.id, [propName as string]: newValue };\n props.onChange(newOptions);\n }}\n />\n </div>\n <div>\n <a\n href=\"#\"\n onClick={(e: React.SyntheticEvent) => {\n killEvent(e);\n props.onChange(options.filter((o) => o.id !== option.id));\n }}\n >\n Remove\n </a>\n </div>\n </div>\n );\n })}\n <a\n href=\"#\"\n onClick={(e: React.SyntheticEvent) => {\n killEvent(e);\n props.onChange([\n ...options,\n {\n id: generateId(),\n },\n ]);\n }}\n >\n Add choice\n </a>\n </div>\n );\n}\n\nlet nextLinkId = 1;\nlet nextId = 1;\n\n/**\n * Generates a link ID for an item.\n * Link IDs are required properties on QuestionnaireItem objects.\n * @return A unique link ID.\n */\nfunction generateLinkId(prefix: string): string {\n return prefix + nextLinkId++;\n}\n\n/**\n * Generates a unique ID.\n * React needs unique IDs for components for rendering performance.\n * All of the important components in the questionnaire builder have id properties for this:\n * Questionnaire, QuestionnaireItem, and QuestionnaireItemAnswerOption.\n * @return A unique key.\n */\nfunction generateId(): string {\n return 'id-' + nextId++;\n}\n\nfunction ensureQuestionnaireKeys(questionnaire: Questionnaire): Questionnaire {\n return {\n ...questionnaire,\n id: questionnaire.id || generateId(),\n item: ensureQuestionnaireItemKeys(questionnaire.item),\n } as Questionnaire;\n}\n\nfunction ensureQuestionnaireItemKeys(items: QuestionnaireItem[] | undefined): QuestionnaireItem[] | undefined {\n if (!items) {\n return undefined;\n }\n return items.map((item) => ({\n ...item,\n id: item.id || generateId(),\n item: ensureQuestionnaireItemKeys(item.item),\n answerOption: ensureQuestionnaireOptionKeys(item.answerOption),\n }));\n}\n\nfunction ensureQuestionnaireOptionKeys(\n options: QuestionnaireItemAnswerOption[] | undefined\n): QuestionnaireItemAnswerOption[] | undefined {\n if (!options) {\n return undefined;\n }\n return options.map((option) => ({\n ...option,\n id: option.id || generateId(),\n }));\n}\n"],"names":[],"mappings":"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"}
@@ -23,7 +23,7 @@ function QuestionnaireForm(props) {
23
23
  const questionnaire = useResource(props.questionnaire);
24
24
  const [response, setResponse] = useState();
25
25
  useEffect(() => {
26
- medplum.requestSchema('Questionnaire').then(setSchema);
26
+ medplum.requestSchema('Questionnaire').then(setSchema).catch(console.log);
27
27
  }, [medplum]);
28
28
  useEffect(() => {
29
29
  setResponse(questionnaire ? buildInitialResponse(questionnaire) : undefined);
@@ -66,6 +66,7 @@ function QuestionnaireFormItemArray(props) {
66
66
  return (React.createElement(CheckboxFormSection, { key: item.linkId, title: item.text, htmlFor: item.linkId },
67
67
  React.createElement(Checkbox, { name: item.linkId, defaultValue: initial === null || initial === void 0 ? void 0 : initial.valueBoolean, onChange: (newValue) => setResponseItem(index, {
68
68
  linkId: item.linkId,
69
+ text: item.text,
69
70
  answer: [{ valueBoolean: newValue }],
70
71
  }) })));
71
72
  }
@@ -87,12 +88,14 @@ function QuestionnaireFormItem(props) {
87
88
  function onChangeItem(newResponseItems) {
88
89
  props.onChange({
89
90
  linkId: item.linkId,
91
+ text: item.text,
90
92
  item: newResponseItems,
91
93
  });
92
94
  }
93
95
  function onChangeAnswer(newResponseAnswer) {
94
96
  props.onChange({
95
97
  linkId: item.linkId,
98
+ text: item.text,
96
99
  answer: [newResponseAnswer],
97
100
  });
98
101
  }
@@ -193,6 +196,7 @@ function buildInitialResponseItem(item) {
193
196
  var _a, _b;
194
197
  return {
195
198
  linkId: item.linkId,
199
+ text: item.text,
196
200
  item: buildInitialResponseItems(item.item),
197
201
  answer: (_b = (_a = item.initial) === null || _a === void 0 ? void 0 : _a.map(buildInitialResponseAnswer)) !== null && _b !== void 0 ? _b : [],
198
202
  };