@medplum/react 0.9.38 → 0.10.1

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 (291) hide show
  1. package/dist/cjs/AttachmentButton.d.ts +9 -0
  2. package/dist/cjs/CodeInput.d.ts +2 -1
  3. package/dist/cjs/CodeableConceptInput.d.ts +2 -1
  4. package/dist/cjs/CodingInput.d.ts +2 -1
  5. package/dist/cjs/DateTimeInput.d.ts +9 -2
  6. package/dist/cjs/DiagnosticReportDisplay.d.ts +0 -1
  7. package/dist/cjs/ReferenceInput.d.ts +1 -0
  8. package/dist/cjs/ResourceAvatar.d.ts +8 -0
  9. package/dist/cjs/ResourceBadge.d.ts +0 -1
  10. package/dist/cjs/ResourceHistoryTable.d.ts +0 -1
  11. package/dist/cjs/ResourceInput.d.ts +2 -3
  12. package/dist/cjs/SearchPopupMenu.d.ts +0 -4
  13. package/dist/cjs/SearchUtils.d.ts +5 -5
  14. package/dist/cjs/StatusBadge.d.ts +0 -1
  15. package/dist/cjs/ValueSetAutocomplete.d.ts +10 -0
  16. package/dist/cjs/auth/RegisterForm.d.ts +0 -1
  17. package/dist/cjs/auth/SignInForm.d.ts +0 -1
  18. package/dist/cjs/defaulttheme.css +0 -51
  19. package/dist/cjs/index.d.ts +3 -21
  20. package/dist/cjs/index.js +859 -1560
  21. package/dist/cjs/index.js.map +1 -1
  22. package/dist/cjs/index.min.js +1 -1
  23. package/dist/cjs/index.min.js.map +1 -1
  24. package/dist/cjs/stories/{UploadButton.stories.d.ts → AttachmentButton.stories.d.ts} +1 -0
  25. package/dist/cjs/stories/{FormSection.stories.d.ts → CodeInput.stories.d.ts} +0 -0
  26. package/dist/cjs/stories/{Input.stories.d.ts → CodeableConceptInput.stories.d.ts} +0 -0
  27. package/dist/cjs/stories/PeriodInput.stories.d.ts +6 -0
  28. package/dist/cjs/stories/{Avatar.stories.d.ts → ResourceAvatar.stories.d.ts} +0 -0
  29. package/dist/cjs/stories/ResourceForm.stories.d.ts +1 -0
  30. package/dist/cjs/stories/{Loading.stories.d.ts → ResourceInput.stories.d.ts} +2 -1
  31. package/dist/cjs/stories/SearchControl.stories.d.ts +1 -0
  32. package/dist/cjs/styles.css +35 -1206
  33. package/dist/cjs/utils/outcomes.d.ts +1 -0
  34. package/dist/esm/AddressInput.js +9 -21
  35. package/dist/esm/AddressInput.js.map +1 -1
  36. package/dist/esm/AnnotationInput.js +2 -2
  37. package/dist/esm/AnnotationInput.js.map +1 -1
  38. package/dist/esm/AttachmentArrayInput.js +11 -8
  39. package/dist/esm/AttachmentArrayInput.js.map +1 -1
  40. package/dist/esm/AttachmentButton.d.ts +9 -0
  41. package/dist/esm/{UploadButton.js → AttachmentButton.js} +9 -9
  42. package/dist/esm/AttachmentButton.js.map +1 -0
  43. package/dist/esm/AttachmentInput.js +3 -3
  44. package/dist/esm/AttachmentInput.js.map +1 -1
  45. package/dist/esm/CalendarInput.js +6 -7
  46. package/dist/esm/CalendarInput.js.map +1 -1
  47. package/dist/esm/CodeInput.d.ts +2 -1
  48. package/dist/esm/CodeInput.js +16 -21
  49. package/dist/esm/CodeInput.js.map +1 -1
  50. package/dist/esm/CodeableConceptInput.d.ts +2 -1
  51. package/dist/esm/CodeableConceptInput.js +18 -33
  52. package/dist/esm/CodeableConceptInput.js.map +1 -1
  53. package/dist/esm/CodingInput.d.ts +2 -1
  54. package/dist/esm/CodingInput.js +24 -23
  55. package/dist/esm/CodingInput.js.map +1 -1
  56. package/dist/esm/ContactDetailInput.js +3 -4
  57. package/dist/esm/ContactDetailInput.js.map +1 -1
  58. package/dist/esm/ContactPointInput.js +5 -21
  59. package/dist/esm/ContactPointInput.js.map +1 -1
  60. package/dist/esm/DateTimeInput.d.ts +9 -2
  61. package/dist/esm/DateTimeInput.js +13 -3
  62. package/dist/esm/DateTimeInput.js.map +1 -1
  63. package/dist/esm/DiagnosticReportDisplay.d.ts +0 -1
  64. package/dist/esm/DiagnosticReportDisplay.js +21 -2
  65. package/dist/esm/DiagnosticReportDisplay.js.map +1 -1
  66. package/dist/esm/EncounterTimeline.js +2 -0
  67. package/dist/esm/EncounterTimeline.js.map +1 -1
  68. package/dist/esm/ExtensionInput.js +2 -2
  69. package/dist/esm/ExtensionInput.js.map +1 -1
  70. package/dist/esm/FhirPathTable.js +4 -5
  71. package/dist/esm/FhirPathTable.js.map +1 -1
  72. package/dist/esm/HumanNameInput.js +7 -17
  73. package/dist/esm/HumanNameInput.js.map +1 -1
  74. package/dist/esm/IdentifierInput.js +4 -5
  75. package/dist/esm/IdentifierInput.js.map +1 -1
  76. package/dist/esm/Logo.js +4 -4
  77. package/dist/esm/Logo.js.map +1 -1
  78. package/dist/esm/PatientTimeline.js +2 -0
  79. package/dist/esm/PatientTimeline.js.map +1 -1
  80. package/dist/esm/PeriodInput.js +5 -5
  81. package/dist/esm/PeriodInput.js.map +1 -1
  82. package/dist/esm/PlanDefinitionBuilder.js +17 -29
  83. package/dist/esm/PlanDefinitionBuilder.js.map +1 -1
  84. package/dist/esm/QuantityInput.js +5 -12
  85. package/dist/esm/QuantityInput.js.map +1 -1
  86. package/dist/esm/QuestionnaireBuilder.js +22 -25
  87. package/dist/esm/QuestionnaireBuilder.js.map +1 -1
  88. package/dist/esm/QuestionnaireForm.js +35 -29
  89. package/dist/esm/QuestionnaireForm.js.map +1 -1
  90. package/dist/esm/RangeInput.js +2 -2
  91. package/dist/esm/RangeInput.js.map +1 -1
  92. package/dist/esm/RatioInput.js +2 -2
  93. package/dist/esm/RatioInput.js.map +1 -1
  94. package/dist/esm/ReferenceInput.d.ts +1 -0
  95. package/dist/esm/ReferenceInput.js +4 -6
  96. package/dist/esm/ReferenceInput.js.map +1 -1
  97. package/dist/esm/RequestGroupDisplay.js +1 -1
  98. package/dist/esm/RequestGroupDisplay.js.map +1 -1
  99. package/dist/esm/ResourceArrayInput.js +10 -7
  100. package/dist/esm/ResourceArrayInput.js.map +1 -1
  101. package/dist/esm/ResourceAvatar.d.ts +8 -0
  102. package/dist/esm/ResourceAvatar.js +24 -0
  103. package/dist/esm/ResourceAvatar.js.map +1 -0
  104. package/dist/esm/ResourceBadge.d.ts +0 -1
  105. package/dist/esm/ResourceBadge.js +2 -3
  106. package/dist/esm/ResourceBadge.js.map +1 -1
  107. package/dist/esm/ResourceBlame.js +3 -3
  108. package/dist/esm/ResourceBlame.js.map +1 -1
  109. package/dist/esm/ResourceForm.js +10 -10
  110. package/dist/esm/ResourceForm.js.map +1 -1
  111. package/dist/esm/ResourceHistoryTable.d.ts +0 -1
  112. package/dist/esm/ResourceHistoryTable.js +2 -1
  113. package/dist/esm/ResourceHistoryTable.js.map +1 -1
  114. package/dist/esm/ResourceInput.d.ts +2 -3
  115. package/dist/esm/ResourceInput.js +37 -29
  116. package/dist/esm/ResourceInput.js.map +1 -1
  117. package/dist/esm/ResourcePropertyInput.js +30 -18
  118. package/dist/esm/ResourcePropertyInput.js.map +1 -1
  119. package/dist/esm/ResourceTimeline.js +23 -17
  120. package/dist/esm/ResourceTimeline.js.map +1 -1
  121. package/dist/esm/Scheduler.js +7 -7
  122. package/dist/esm/Scheduler.js.map +1 -1
  123. package/dist/esm/SearchControl.js +76 -58
  124. package/dist/esm/SearchControl.js.map +1 -1
  125. package/dist/esm/SearchControlField.js.map +1 -1
  126. package/dist/esm/SearchFieldEditor.js +7 -7
  127. package/dist/esm/SearchFieldEditor.js.map +1 -1
  128. package/dist/esm/SearchFilterEditor.js +11 -15
  129. package/dist/esm/SearchFilterEditor.js.map +1 -1
  130. package/dist/esm/SearchFilterValueDialog.js +4 -3
  131. package/dist/esm/SearchFilterValueDialog.js.map +1 -1
  132. package/dist/esm/SearchFilterValueInput.js +6 -7
  133. package/dist/esm/SearchFilterValueInput.js.map +1 -1
  134. package/dist/esm/SearchPopupMenu.d.ts +0 -4
  135. package/dist/esm/SearchPopupMenu.js +59 -73
  136. package/dist/esm/SearchPopupMenu.js.map +1 -1
  137. package/dist/esm/SearchUtils.d.ts +5 -5
  138. package/dist/esm/SearchUtils.js +11 -12
  139. package/dist/esm/SearchUtils.js.map +1 -1
  140. package/dist/esm/ServiceRequestTimeline.js +2 -0
  141. package/dist/esm/ServiceRequestTimeline.js.map +1 -1
  142. package/dist/esm/StatusBadge.d.ts +0 -1
  143. package/dist/esm/StatusBadge.js +55 -1
  144. package/dist/esm/StatusBadge.js.map +1 -1
  145. package/dist/esm/Timeline.js +12 -20
  146. package/dist/esm/Timeline.js.map +1 -1
  147. package/dist/esm/TimingInput.js +14 -17
  148. package/dist/esm/TimingInput.js.map +1 -1
  149. package/dist/esm/ValueSetAutocomplete.d.ts +10 -0
  150. package/dist/esm/ValueSetAutocomplete.js +65 -0
  151. package/dist/esm/ValueSetAutocomplete.js.map +1 -0
  152. package/dist/esm/auth/AuthenticationForm.js +12 -20
  153. package/dist/esm/auth/AuthenticationForm.js.map +1 -1
  154. package/dist/esm/auth/ChooseProfileForm.js +10 -10
  155. package/dist/esm/auth/ChooseProfileForm.js.map +1 -1
  156. package/dist/esm/auth/NewProjectForm.js +12 -15
  157. package/dist/esm/auth/NewProjectForm.js.map +1 -1
  158. package/dist/esm/auth/NewUserForm.js +25 -33
  159. package/dist/esm/auth/NewUserForm.js.map +1 -1
  160. package/dist/esm/auth/RegisterForm.d.ts +0 -1
  161. package/dist/esm/auth/RegisterForm.js.map +1 -1
  162. package/dist/esm/auth/SignInForm.d.ts +0 -1
  163. package/dist/esm/auth/SignInForm.js.map +1 -1
  164. package/dist/esm/defaulttheme.css +0 -51
  165. package/dist/esm/index.d.ts +3 -21
  166. package/dist/esm/index.js +4 -22
  167. package/dist/esm/index.js.map +1 -1
  168. package/dist/esm/index.min.js +1 -1
  169. package/dist/esm/index.min.js.map +1 -1
  170. package/dist/esm/node_modules/tslib/tslib.es6.js +13 -1
  171. package/dist/esm/node_modules/tslib/tslib.es6.js.map +1 -1
  172. package/dist/esm/stories/{UploadButton.stories.d.ts → AttachmentButton.stories.d.ts} +1 -0
  173. package/dist/{cjs/stories/Select.stories.d.ts → esm/stories/CodeInput.stories.d.ts} +0 -0
  174. package/dist/esm/stories/{FormSection.stories.d.ts → CodeableConceptInput.stories.d.ts} +0 -0
  175. package/dist/esm/stories/PeriodInput.stories.d.ts +6 -0
  176. package/dist/esm/stories/{Avatar.stories.d.ts → ResourceAvatar.stories.d.ts} +0 -0
  177. package/dist/esm/stories/ResourceForm.stories.d.ts +1 -0
  178. package/dist/{cjs/stories/Dialog.stories.d.ts → esm/stories/ResourceInput.stories.d.ts} +2 -1
  179. package/dist/esm/stories/SearchControl.stories.d.ts +1 -0
  180. package/dist/esm/styles.css +35 -1206
  181. package/dist/esm/utils/outcomes.d.ts +1 -0
  182. package/dist/esm/utils/outcomes.js +5 -1
  183. package/dist/esm/utils/outcomes.js.map +1 -1
  184. package/package.json +27 -19
  185. package/dist/cjs/Autocomplete.d.ts +0 -20
  186. package/dist/cjs/Avatar.d.ts +0 -12
  187. package/dist/cjs/Button.d.ts +0 -15
  188. package/dist/cjs/Checkbox.d.ts +0 -12
  189. package/dist/cjs/Dialog.d.ts +0 -10
  190. package/dist/cjs/FooterLinks.d.ts +0 -6
  191. package/dist/cjs/Header.d.ts +0 -12
  192. package/dist/cjs/HeaderSearchInput.d.ts +0 -10
  193. package/dist/cjs/Input.d.ts +0 -22
  194. package/dist/cjs/InputRow.d.ts +0 -7
  195. package/dist/cjs/Loading.d.ts +0 -3
  196. package/dist/cjs/MenuItem.d.ts +0 -9
  197. package/dist/cjs/MenuSeparator.d.ts +0 -3
  198. package/dist/cjs/Popup.d.ts +0 -14
  199. package/dist/cjs/Scrollable.d.ts +0 -9
  200. package/dist/cjs/Select.d.ts +0 -16
  201. package/dist/cjs/SubMenu.d.ts +0 -7
  202. package/dist/cjs/Tab.d.ts +0 -12
  203. package/dist/cjs/TabList.d.ts +0 -10
  204. package/dist/cjs/TabPanel.d.ts +0 -6
  205. package/dist/cjs/TabSwitch.d.ts +0 -6
  206. package/dist/cjs/TextArea.d.ts +0 -18
  207. package/dist/cjs/TitleBar.d.ts +0 -6
  208. package/dist/cjs/UploadButton.d.ts +0 -7
  209. package/dist/cjs/stories/Autocomplete.stories.d.ts +0 -9
  210. package/dist/cjs/stories/Button.stories.d.ts +0 -9
  211. package/dist/cjs/stories/Header.stories.d.ts +0 -8
  212. package/dist/cjs/stories/Tabs.stories.d.ts +0 -6
  213. package/dist/esm/Autocomplete.d.ts +0 -20
  214. package/dist/esm/Autocomplete.js +0 -281
  215. package/dist/esm/Autocomplete.js.map +0 -1
  216. package/dist/esm/Avatar.d.ts +0 -12
  217. package/dist/esm/Avatar.js +0 -24
  218. package/dist/esm/Avatar.js.map +0 -1
  219. package/dist/esm/Button.d.ts +0 -15
  220. package/dist/esm/Button.js +0 -13
  221. package/dist/esm/Button.js.map +0 -1
  222. package/dist/esm/Checkbox.d.ts +0 -12
  223. package/dist/esm/Checkbox.js +0 -13
  224. package/dist/esm/Checkbox.js.map +0 -1
  225. package/dist/esm/Dialog.d.ts +0 -10
  226. package/dist/esm/Dialog.js +0 -43
  227. package/dist/esm/Dialog.js.map +0 -1
  228. package/dist/esm/FooterLinks.d.ts +0 -6
  229. package/dist/esm/FooterLinks.js +0 -8
  230. package/dist/esm/FooterLinks.js.map +0 -1
  231. package/dist/esm/Header.d.ts +0 -12
  232. package/dist/esm/Header.js +0 -99
  233. package/dist/esm/Header.js.map +0 -1
  234. package/dist/esm/HeaderSearchInput.d.ts +0 -10
  235. package/dist/esm/HeaderSearchInput.js +0 -181
  236. package/dist/esm/HeaderSearchInput.js.map +0 -1
  237. package/dist/esm/Input.d.ts +0 -22
  238. package/dist/esm/Input.js +0 -26
  239. package/dist/esm/Input.js.map +0 -1
  240. package/dist/esm/InputRow.d.ts +0 -7
  241. package/dist/esm/InputRow.js +0 -8
  242. package/dist/esm/InputRow.js.map +0 -1
  243. package/dist/esm/Loading.d.ts +0 -3
  244. package/dist/esm/Loading.js +0 -11
  245. package/dist/esm/Loading.js.map +0 -1
  246. package/dist/esm/MenuItem.d.ts +0 -9
  247. package/dist/esm/MenuItem.js +0 -8
  248. package/dist/esm/MenuItem.js.map +0 -1
  249. package/dist/esm/MenuSeparator.d.ts +0 -3
  250. package/dist/esm/MenuSeparator.js +0 -8
  251. package/dist/esm/MenuSeparator.js.map +0 -1
  252. package/dist/esm/Popup.d.ts +0 -14
  253. package/dist/esm/Popup.js +0 -78
  254. package/dist/esm/Popup.js.map +0 -1
  255. package/dist/esm/Scrollable.d.ts +0 -9
  256. package/dist/esm/Scrollable.js +0 -12
  257. package/dist/esm/Scrollable.js.map +0 -1
  258. package/dist/esm/Select.d.ts +0 -16
  259. package/dist/esm/Select.js +0 -16
  260. package/dist/esm/Select.js.map +0 -1
  261. package/dist/esm/SubMenu.d.ts +0 -7
  262. package/dist/esm/SubMenu.js +0 -38
  263. package/dist/esm/SubMenu.js.map +0 -1
  264. package/dist/esm/Tab.d.ts +0 -12
  265. package/dist/esm/Tab.js +0 -19
  266. package/dist/esm/Tab.js.map +0 -1
  267. package/dist/esm/TabList.d.ts +0 -10
  268. package/dist/esm/TabList.js +0 -23
  269. package/dist/esm/TabList.js.map +0 -1
  270. package/dist/esm/TabPanel.d.ts +0 -6
  271. package/dist/esm/TabPanel.js +0 -8
  272. package/dist/esm/TabPanel.js.map +0 -1
  273. package/dist/esm/TabSwitch.d.ts +0 -6
  274. package/dist/esm/TabSwitch.js +0 -16
  275. package/dist/esm/TabSwitch.js.map +0 -1
  276. package/dist/esm/TextArea.d.ts +0 -18
  277. package/dist/esm/TextArea.js +0 -16
  278. package/dist/esm/TextArea.js.map +0 -1
  279. package/dist/esm/TitleBar.d.ts +0 -6
  280. package/dist/esm/TitleBar.js +0 -8
  281. package/dist/esm/TitleBar.js.map +0 -1
  282. package/dist/esm/UploadButton.d.ts +0 -7
  283. package/dist/esm/UploadButton.js.map +0 -1
  284. package/dist/esm/stories/Autocomplete.stories.d.ts +0 -9
  285. package/dist/esm/stories/Button.stories.d.ts +0 -9
  286. package/dist/esm/stories/Dialog.stories.d.ts +0 -5
  287. package/dist/esm/stories/Header.stories.d.ts +0 -8
  288. package/dist/esm/stories/Input.stories.d.ts +0 -6
  289. package/dist/esm/stories/Loading.stories.d.ts +0 -5
  290. package/dist/esm/stories/Select.stories.d.ts +0 -6
  291. package/dist/esm/stories/Tabs.stories.d.ts +0 -6
@@ -1,15 +1,12 @@
1
+ import { Button, TextInput, NativeSelect, Textarea } from '@mantine/core';
1
2
  import { globalSchema } from '@medplum/core';
2
3
  import React, { useState, useEffect, useRef } from 'react';
3
- import { Button } from './Button.js';
4
4
  import { Form } from './Form.js';
5
- import { Input } from './Input.js';
6
5
  import { useMedplum } from './MedplumProvider.js';
7
6
  import { QuestionnaireFormItem } from './QuestionnaireForm.js';
8
7
  import { QuestionnaireItemType, isChoiceQuestion } from './QuestionnaireUtils.js';
9
8
  import { getValueAndType } from './ResourcePropertyDisplay.js';
10
9
  import { ResourcePropertyInput } from './ResourcePropertyInput.js';
11
- import { Select } from './Select.js';
12
- import { TextArea } from './TextArea.js';
13
10
  import { useResource } from './useResource.js';
14
11
  import { killEvent } from './utils/dom.js';
15
12
 
@@ -44,7 +41,7 @@ function QuestionnaireBuilder(props) {
44
41
  return (React.createElement("div", { className: "medplum-questionnaire-builder" },
45
42
  React.createElement(Form, { testid: "questionnaire-form", onSubmit: () => props.onSubmit(value) },
46
43
  React.createElement(ItemBuilder, { item: value, selectedKey: selectedKey, setSelectedKey: setSelectedKey, hoverKey: hoverKey, setHoverKey: setHoverKey, onChange: setValue }),
47
- React.createElement(Button, { type: "submit", size: "large" }, "Save"))));
44
+ React.createElement(Button, { type: "submit" }, "Save"))));
48
45
  }
49
46
  function ItemBuilder(props) {
50
47
  var _a;
@@ -85,26 +82,26 @@ function ItemBuilder(props) {
85
82
  return (React.createElement("div", { "data-testid": item.linkId, className: className, onClick: onClick, onMouseOver: onHover },
86
83
  editing ? (React.createElement(React.Fragment, null,
87
84
  isResource && (React.createElement("div", null,
88
- React.createElement(Input, { defaultValue: resource.title, onChange: (newValue) => changeProperty('title', newValue) }))),
85
+ React.createElement(TextInput, { defaultValue: resource.title, onChange: (e) => changeProperty('title', e.currentTarget.value) }))),
89
86
  !isContainer && (React.createElement("div", null,
90
- React.createElement(Select, { defaultValue: item.type, onChange: (newValue) => changeProperty('type', newValue) },
91
- React.createElement("option", { value: "display" }, "Display"),
92
- React.createElement("optgroup", { label: "Question" },
93
- React.createElement("option", { value: "boolean" }, "Boolean"),
94
- React.createElement("option", { value: "decimal" }, "Decimal"),
95
- React.createElement("option", { value: "integer" }, "Integer"),
96
- React.createElement("option", { value: "date" }, "Date"),
97
- React.createElement("option", { value: "dateTime" }, "Date/Time"),
98
- React.createElement("option", { value: "time" }, "Time"),
99
- React.createElement("option", { value: "string" }, "String"),
100
- React.createElement("option", { value: "text" }, "Text"),
101
- React.createElement("option", { value: "url" }, "URL"),
102
- React.createElement("option", { value: "choice" }, "Choice"),
103
- React.createElement("option", { value: "open-choice" }, "Open Choice"),
104
- React.createElement("option", { value: "attachment" }, "Attachment"),
105
- React.createElement("option", { value: "reference" }, "Reference"),
106
- React.createElement("option", { value: "quantity" }, "Quantity"))))),
107
- !isResource && (React.createElement(TextArea, { style: { width: '95%', height: '100px', minHeight: '100px', margin: '8px 4px 4px 4px' }, defaultValue: item.text, onChange: (newValue) => changeProperty('text', newValue) })),
87
+ React.createElement(NativeSelect, { defaultValue: item.type, onChange: (e) => changeProperty('type', e.currentTarget.value), data: [
88
+ { value: 'display', label: 'Display' },
89
+ { value: 'boolean', label: 'Boolean' },
90
+ { value: 'decimal', label: 'Decimal' },
91
+ { value: 'integer', label: 'Integer' },
92
+ { value: 'date', label: 'Date' },
93
+ { value: 'dateTime', label: 'Date/Time' },
94
+ { value: 'time', label: 'Time' },
95
+ { value: 'string', label: 'String' },
96
+ { value: 'text', label: 'Text' },
97
+ { value: 'url', label: 'URL' },
98
+ { value: 'choice', label: 'Choice' },
99
+ { value: 'open-choice', label: 'Open Choice' },
100
+ { value: 'attachment', label: 'Attachment' },
101
+ { value: 'reference', label: 'Reference' },
102
+ { value: 'quantity', label: 'Quantity' },
103
+ ] }))),
104
+ !isResource && (React.createElement(Textarea, { style: { width: '95%', height: '100px', minHeight: '100px', margin: '8px 4px 4px 4px' }, defaultValue: item.text, onChange: (e) => changeProperty('text', e.currentTarget.value) })),
108
105
  isChoiceQuestion(item) && (React.createElement(AnswerBuilder, { options: item.answerOption, onChange: (newOptions) => changeProperty('answerOption', newOptions) })))) : (React.createElement(React.Fragment, null,
109
106
  resource.title && React.createElement("h1", null, resource.title),
110
107
  item.text && React.createElement("p", null, item.text),
@@ -112,7 +109,7 @@ function ItemBuilder(props) {
112
109
  item.item &&
113
110
  item.item.map((i) => (React.createElement("div", { key: i.id },
114
111
  React.createElement(ItemBuilder, { item: i, selectedKey: props.selectedKey, setSelectedKey: props.setSelectedKey, hoverKey: props.hoverKey, setHoverKey: props.setHoverKey, onChange: changeItem, onRemove: () => removeItem(i) })))),
115
- !isContainer && (React.createElement("div", { className: "top-actions" }, editing ? (React.createElement(Input, { defaultValue: item.linkId, onChange: (newValue) => changeProperty('linkId', newValue), size: 4 })) : (React.createElement("div", null, linkId)))),
112
+ !isContainer && (React.createElement("div", { className: "top-actions" }, editing ? (React.createElement(TextInput, { defaultValue: item.linkId, onChange: (e) => changeProperty('linkId', e.currentTarget.value) })) : (React.createElement("div", null, linkId)))),
116
113
  React.createElement("div", { className: "bottom-actions" },
117
114
  isContainer && (React.createElement(React.Fragment, null,
118
115
  React.createElement("a", { href: "#", onClick: (e) => {
@@ -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).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} answers={{}} 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 items.forEach((item) => {\n if (item.id?.match(/^id-\\d+$/)) {\n nextId = Math.max(nextId, parseInt(item.id.substring(3)) + 1);\n }\n if (item.linkId?.match(/^q\\d+$/)) {\n nextLinkId = Math.max(nextLinkId, parseInt(item.linkId.substring(1)) + 1);\n }\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 { Button, NativeSelect, Textarea, TextInput } from '@mantine/core';\nimport { globalSchema, IndexedStructureDefinition } from '@medplum/core';\nimport { Questionnaire, QuestionnaireItem, QuestionnaireItemAnswerOption, Reference } from '@medplum/fhirtypes';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { Form } from './Form';\nimport { useMedplum } from './MedplumProvider';\nimport { QuestionnaireFormItem } from './QuestionnaireForm';\nimport { isChoiceQuestion, QuestionnaireItemType } from './QuestionnaireUtils';\nimport { getValueAndType } from './ResourcePropertyDisplay';\nimport { ResourcePropertyInput } from './ResourcePropertyInput';\nimport { useResource } from './useResource';\nimport { killEvent } from './utils/dom';\n\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\">Save</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 <TextInput\n defaultValue={resource.title}\n onChange={(e) => changeProperty('title', e.currentTarget.value)}\n />\n </div>\n )}\n {!isContainer && (\n <div>\n <NativeSelect\n defaultValue={item.type}\n onChange={(e) => changeProperty('type', e.currentTarget.value)}\n data={[\n { value: 'display', label: 'Display' },\n { value: 'boolean', label: 'Boolean' },\n { value: 'decimal', label: 'Decimal' },\n { value: 'integer', label: 'Integer' },\n { value: 'date', label: 'Date' },\n { value: 'dateTime', label: 'Date/Time' },\n { value: 'time', label: 'Time' },\n { value: 'string', label: 'String' },\n { value: 'text', label: 'Text' },\n { value: 'url', label: 'URL' },\n { value: 'choice', label: 'Choice' },\n { value: 'open-choice', label: 'Open Choice' },\n { value: 'attachment', label: 'Attachment' },\n { value: 'reference', label: 'Reference' },\n { value: 'quantity', label: 'Quantity' },\n ]}\n />\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={(e) => changeProperty('text', e.currentTarget.value)}\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} answers={{}} 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 <TextInput defaultValue={item.linkId} onChange={(e) => changeProperty('linkId', e.currentTarget.value)} />\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 items.forEach((item) => {\n if (item.id?.match(/^id-\\d+$/)) {\n nextId = Math.max(nextId, parseInt(item.id.substring(3)) + 1);\n }\n if (item.linkId?.match(/^q\\d+$/)) {\n nextLinkId = Math.max(nextLinkId, parseInt(item.linkId.substring(1)) + 1);\n }\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,19 +1,16 @@
1
- import { getReferenceString, createReference, globalSchema, getTypedPropertyValue, capitalize, stringify, deepEquals, getQuestionnaireAnswers } from '@medplum/core';
1
+ import { Button, Checkbox, Textarea, TextInput, NativeSelect } from '@mantine/core';
2
+ import { getReferenceString, createReference, getTypedPropertyValue, capitalize, globalSchema, stringify, deepEquals, getQuestionnaireAnswers } from '@medplum/core';
2
3
  import React, { useState, useEffect } from 'react';
3
4
  import { AttachmentInput } from './AttachmentInput.js';
4
- import { Button } from './Button.js';
5
- import { Checkbox } from './Checkbox.js';
6
5
  import { CheckboxFormSection } from './CheckboxFormSection.js';
7
6
  import { DateTimeInput } from './DateTimeInput.js';
8
7
  import { Form } from './Form.js';
9
8
  import { FormSection } from './FormSection.js';
10
- import { Input } from './Input.js';
11
9
  import { useMedplum } from './MedplumProvider.js';
12
10
  import { QuantityInput } from './QuantityInput.js';
13
11
  import { QuestionnaireItemType } from './QuestionnaireUtils.js';
14
12
  import { ReferenceInput } from './ReferenceInput.js';
15
13
  import { ResourcePropertyDisplay } from './ResourcePropertyDisplay.js';
16
- import { TextArea } from './TextArea.js';
17
14
  import { useResource } from './useResource.js';
18
15
 
19
16
  function QuestionnaireForm(props) {
@@ -51,7 +48,7 @@ function QuestionnaireForm(props) {
51
48
  } },
52
49
  questionnaire.title && React.createElement("h1", null, questionnaire.title),
53
50
  questionnaire.item && (React.createElement(QuestionnaireFormItemArray, { items: questionnaire.item, answers: answers, onChange: setItems })),
54
- React.createElement(Button, { type: "submit", size: "large" }, props.submitButtonText || 'OK')));
51
+ React.createElement(Button, { type: "submit" }, props.submitButtonText || 'OK')));
55
52
  }
56
53
  function QuestionnaireFormItemArray(props) {
57
54
  const [responseItems, setResponseItems] = useState(buildInitialResponseItems(props.items));
@@ -74,10 +71,10 @@ function QuestionnaireFormItemArray(props) {
74
71
  if (item.type === QuestionnaireItemType.boolean) {
75
72
  const initial = item.initial && item.initial.length > 0 ? item.initial[0] : undefined;
76
73
  return (React.createElement(CheckboxFormSection, { key: item.linkId, title: item.text, htmlFor: item.linkId },
77
- React.createElement(Checkbox, { name: item.linkId, defaultValue: initial === null || initial === void 0 ? void 0 : initial.valueBoolean, onChange: (newValue) => setResponseItem(index, {
74
+ React.createElement(Checkbox, { id: item.linkId, name: item.linkId, defaultChecked: initial === null || initial === void 0 ? void 0 : initial.valueBoolean, onChange: (e) => setResponseItem(index, {
78
75
  linkId: item.linkId,
79
76
  text: item.text,
80
- answer: [{ valueBoolean: newValue }],
77
+ answer: [{ valueBoolean: e.currentTarget.checked }],
81
78
  }) })));
82
79
  }
83
80
  return (React.createElement(FormSection, { key: item.linkId, htmlFor: item.linkId, title: item.text || '' },
@@ -115,23 +112,22 @@ function QuestionnaireFormItem(props) {
115
112
  React.createElement("h3", null, item.text),
116
113
  item.item && (React.createElement(QuestionnaireFormItemArray, { items: item.item, answers: props.answers, onChange: onChangeItem }))));
117
114
  case QuestionnaireItemType.boolean:
118
- return (React.createElement(Checkbox, { name: name, defaultValue: initial === null || initial === void 0 ? void 0 : initial.valueBoolean, onChange: (newValue) => onChangeAnswer({ valueBoolean: newValue }) }));
115
+ return (React.createElement(Checkbox, { id: name, name: name, defaultChecked: initial === null || initial === void 0 ? void 0 : initial.valueBoolean, onChange: (e) => onChangeAnswer({ valueBoolean: e.currentTarget.checked }) }));
119
116
  case QuestionnaireItemType.decimal:
120
- return (React.createElement(Input, { type: "number", step: "any", name: name, defaultValue: initial === null || initial === void 0 ? void 0 : initial.valueDecimal, onChange: (newValue) => onChangeAnswer({ valueDecimal: parseFloat(newValue) }) }));
117
+ return (React.createElement(TextInput, { type: "number", step: "any", id: name, name: name, defaultValue: initial === null || initial === void 0 ? void 0 : initial.valueDecimal, onChange: (e) => onChangeAnswer({ valueDecimal: e.currentTarget.valueAsNumber }) }));
121
118
  case QuestionnaireItemType.integer:
122
- return (React.createElement(Input, { type: "number", step: 1, name: name, defaultValue: initial === null || initial === void 0 ? void 0 : initial.valueInteger, onChange: (newValue) => onChangeAnswer({ valueInteger: parseInt(newValue) }) }));
119
+ return (React.createElement(TextInput, { type: "number", step: 1, id: name, name: name, defaultValue: initial === null || initial === void 0 ? void 0 : initial.valueInteger, onChange: (e) => onChangeAnswer({ valueInteger: e.currentTarget.valueAsNumber }) }));
123
120
  case QuestionnaireItemType.date:
124
- return (React.createElement(Input, { type: "date", name: name, defaultValue: initial === null || initial === void 0 ? void 0 : initial.valueDate, onChange: (newValue) => onChangeAnswer({ valueDate: newValue }) }));
121
+ return (React.createElement(TextInput, { type: "date", id: name, name: name, defaultValue: initial === null || initial === void 0 ? void 0 : initial.valueDate, onChange: (e) => onChangeAnswer({ valueDate: e.currentTarget.value }) }));
125
122
  case QuestionnaireItemType.dateTime:
126
- return (React.createElement(DateTimeInput, { type: "datetime-local", name: name, defaultValue: initial === null || initial === void 0 ? void 0 : initial.valueDateTime, onChange: (newValue) => onChangeAnswer({ valueDateTime: newValue }) }));
123
+ return (React.createElement(DateTimeInput, { name: name, defaultValue: initial === null || initial === void 0 ? void 0 : initial.valueDateTime, onChange: (newValue) => onChangeAnswer({ valueDateTime: newValue }) }));
127
124
  case QuestionnaireItemType.time:
128
- return (React.createElement(Input, { type: "time", name: name, defaultValue: initial === null || initial === void 0 ? void 0 : initial.valueTime, onChange: (newValue) => onChangeAnswer({ valueTime: newValue }) }));
125
+ return (React.createElement(TextInput, { type: "time", id: name, name: name, defaultValue: initial === null || initial === void 0 ? void 0 : initial.valueTime, onChange: (e) => onChangeAnswer({ valueTime: e.currentTarget.value }) }));
129
126
  case QuestionnaireItemType.string:
130
- return (React.createElement(Input, { type: "text", name: name, defaultValue: initial === null || initial === void 0 ? void 0 : initial.valueString, onChange: (newValue) => onChangeAnswer({ valueString: newValue }) }));
131
- case QuestionnaireItemType.text:
132
- return (React.createElement(TextArea, { name: name, defaultValue: initial === null || initial === void 0 ? void 0 : initial.valueString, onChange: (newValue) => onChangeAnswer({ valueString: newValue }) }));
133
127
  case QuestionnaireItemType.url:
134
- return (React.createElement(Input, { type: "url", name: name, defaultValue: initial === null || initial === void 0 ? void 0 : initial.valueUri, onChange: (newValue) => onChangeAnswer({ valueUri: newValue }) }));
128
+ return (React.createElement(TextInput, { id: name, name: name, defaultValue: initial === null || initial === void 0 ? void 0 : initial.valueString, onChange: (e) => onChangeAnswer({ valueString: e.currentTarget.value }) }));
129
+ case QuestionnaireItemType.text:
130
+ return (React.createElement(Textarea, { id: name, name: name, defaultValue: initial === null || initial === void 0 ? void 0 : initial.valueString, onChange: (e) => onChangeAnswer({ valueString: e.currentTarget.value }) }));
135
131
  case QuestionnaireItemType.attachment:
136
132
  return (React.createElement(AttachmentInput, { name: name, defaultValue: initial === null || initial === void 0 ? void 0 : initial.valueAttachment, onChange: (newValue) => onChangeAnswer({ valueAttachment: newValue }) }));
137
133
  case QuestionnaireItemType.reference:
@@ -151,9 +147,15 @@ function QuestionnaireFormItem(props) {
151
147
  }
152
148
  function QuestionnaireChoiceDropDownInput(props) {
153
149
  const { name, item, initial } = props;
154
- const valueElementDefinition = globalSchema.types['QuestionnaireItemAnswerOption'].properties['value[x]'];
155
150
  const initialValue = getTypedPropertyValue({ type: 'QuestionnaireItemInitial', value: initial }, 'value');
156
- return (React.createElement("select", { id: name, name: name, className: "medplum-select", onChange: (e) => {
151
+ const data = [''];
152
+ if (item.answerOption) {
153
+ for (const option of item.answerOption) {
154
+ const optionValue = getTypedPropertyValue({ type: 'QuestionnaireItemAnswerOption', value: option }, 'value');
155
+ data.push(typedValueToString(optionValue));
156
+ }
157
+ }
158
+ return (React.createElement(NativeSelect, { id: name, name: name, className: "medplum-select", onChange: (e) => {
157
159
  const index = e.currentTarget.selectedIndex;
158
160
  if (index === 0) {
159
161
  props.onChangeAnswer({});
@@ -163,15 +165,19 @@ function QuestionnaireChoiceDropDownInput(props) {
163
165
  const optionValue = getTypedPropertyValue({ type: 'QuestionnaireItemAnswerOption', value: option }, 'value');
164
166
  const propertyName = 'value' + capitalize(optionValue.type);
165
167
  props.onChangeAnswer({ [propertyName]: optionValue.value });
166
- } },
167
- React.createElement("option", null),
168
- item.answerOption &&
169
- item.answerOption.map((option, index) => {
170
- const optionValue = getTypedPropertyValue({ type: 'QuestionnaireItemAnswerOption', value: option }, 'value');
171
- const optionName = `${name}-option-${index}`;
172
- return (React.createElement("option", { key: optionName, value: optionValue.value, selected: initialValue && stringify(optionValue) === stringify(initialValue) },
173
- React.createElement(ResourcePropertyDisplay, { property: valueElementDefinition, propertyType: optionValue.type, value: optionValue.value })));
174
- })));
168
+ }, defaultValue: typedValueToString(initialValue), data: data }));
169
+ }
170
+ function typedValueToString(typedValue) {
171
+ if (!typedValue) {
172
+ return undefined;
173
+ }
174
+ if (typedValue.type === 'CodeableConcept') {
175
+ return typedValue.value.coding[0].display;
176
+ }
177
+ if (typedValue.type === 'Coding') {
178
+ return typedValue.value.display;
179
+ }
180
+ return typedValue.value.toString();
175
181
  }
176
182
  function QuestionnaireChoiceRadioInput(props) {
177
183
  const { name, item, initial, onChangeAnswer } = props;
@@ -1 +1 @@
1
- {"version":3,"file":"QuestionnaireForm.js","sources":["../../src/QuestionnaireForm.tsx"],"sourcesContent":["import {\n capitalize,\n createReference,\n deepEquals,\n getQuestionnaireAnswers,\n getReferenceString,\n getTypedPropertyValue,\n globalSchema,\n IndexedStructureDefinition,\n ProfileResource,\n PropertyType,\n stringify,\n TypedValue,\n} from '@medplum/core';\nimport {\n Questionnaire,\n QuestionnaireItem,\n QuestionnaireItemAnswerOption,\n QuestionnaireItemInitial,\n QuestionnaireResponse,\n QuestionnaireResponseItem,\n QuestionnaireResponseItemAnswer,\n Reference,\n} from '@medplum/fhirtypes';\nimport React, { ChangeEvent, useEffect, useState } from 'react';\nimport { AttachmentInput } from './AttachmentInput';\nimport { Button } from './Button';\nimport { Checkbox } from './Checkbox';\nimport { CheckboxFormSection } from './CheckboxFormSection';\nimport { DateTimeInput } from './DateTimeInput';\nimport { Form } from './Form';\nimport { FormSection } from './FormSection';\nimport { Input } from './Input';\nimport { useMedplum } from './MedplumProvider';\nimport { QuantityInput } from './QuantityInput';\nimport { QuestionnaireItemType } from './QuestionnaireUtils';\nimport { ReferenceInput } from './ReferenceInput';\nimport { ResourcePropertyDisplay } from './ResourcePropertyDisplay';\nimport { TextArea } from './TextArea';\nimport { useResource } from './useResource';\nimport './QuestionnaireForm.css';\n\nexport interface QuestionnaireFormProps {\n questionnaire: Questionnaire | Reference<Questionnaire>;\n subject?: Reference;\n submitButtonText?: string;\n onSubmit: (response: QuestionnaireResponse) => void;\n}\n\nexport function QuestionnaireForm(props: QuestionnaireFormProps): JSX.Element | null {\n const medplum = useMedplum();\n const source = medplum.getProfile();\n const [schema, setSchema] = useState<IndexedStructureDefinition | undefined>();\n const questionnaire = useResource(props.questionnaire);\n const [response, setResponse] = useState<QuestionnaireResponse | undefined>();\n const [answers, setAnswers] = useState<Record<string, QuestionnaireResponseItemAnswer>>({});\n\n useEffect(() => {\n medplum\n .requestSchema('Questionnaire')\n .then(() => medplum.requestSchema('QuestionnaireResponse'))\n .then(setSchema)\n .catch(console.log);\n }, [medplum]);\n\n useEffect(() => {\n setResponse(questionnaire ? buildInitialResponse(questionnaire) : undefined);\n }, [questionnaire]);\n\n function setItems(newResponseItems: QuestionnaireResponseItem[]): void {\n const newResponse: QuestionnaireResponse = {\n resourceType: 'QuestionnaireResponse',\n item: newResponseItems,\n };\n setResponse(newResponse);\n setAnswers(getQuestionnaireAnswers(newResponse));\n }\n\n if (!schema || !questionnaire) {\n return null;\n }\n\n return (\n <Form\n testid=\"questionnaire-form\"\n onSubmit={() => {\n if (props.onSubmit && response) {\n props.onSubmit({\n ...response,\n questionnaire: getReferenceString(questionnaire),\n subject: props.subject,\n source: createReference(source as ProfileResource),\n authored: new Date().toISOString(),\n });\n }\n }}\n >\n {questionnaire.title && <h1>{questionnaire.title}</h1>}\n {questionnaire.item && (\n <QuestionnaireFormItemArray items={questionnaire.item} answers={answers} onChange={setItems} />\n )}\n <Button type=\"submit\" size=\"large\">\n {props.submitButtonText || 'OK'}\n </Button>\n </Form>\n );\n}\n\ninterface QuestionnaireFormItemArrayProps {\n items: QuestionnaireItem[];\n answers: Record<string, QuestionnaireResponseItemAnswer>;\n onChange: (newResponseItems: QuestionnaireResponseItem[]) => void;\n}\n\nfunction QuestionnaireFormItemArray(props: QuestionnaireFormItemArrayProps): JSX.Element {\n const [responseItems, setResponseItems] = useState<QuestionnaireResponseItem[]>(\n buildInitialResponseItems(props.items)\n );\n\n function setResponseItem(index: number, newResponseItem: QuestionnaireResponseItem): void {\n const newResponseItems = responseItems.slice();\n newResponseItems[index] = newResponseItem;\n setResponseItems(newResponseItems);\n props.onChange(newResponseItems);\n }\n\n return (\n <>\n {props.items.map((item, index) => {\n if (!isQuestionEnabled(item, props.answers)) {\n return null;\n }\n if (item.type === QuestionnaireItemType.display) {\n return <p key={item.linkId}>{item.text}</p>;\n }\n if (item.type === QuestionnaireItemType.group) {\n return (\n <QuestionnaireFormItem\n key={item.linkId}\n item={item}\n answers={props.answers}\n onChange={(newResponseItem) => setResponseItem(index, newResponseItem)}\n />\n );\n }\n if (item.type === QuestionnaireItemType.boolean) {\n const initial = item.initial && item.initial.length > 0 ? item.initial[0] : undefined;\n return (\n <CheckboxFormSection key={item.linkId} title={item.text} htmlFor={item.linkId}>\n <Checkbox\n name={item.linkId}\n defaultValue={initial?.valueBoolean}\n onChange={(newValue) =>\n setResponseItem(index, {\n linkId: item.linkId,\n text: item.text,\n answer: [{ valueBoolean: newValue }],\n })\n }\n />\n </CheckboxFormSection>\n );\n }\n return (\n <FormSection key={item.linkId} htmlFor={item.linkId} title={item.text || ''}>\n <QuestionnaireFormItem\n item={item}\n answers={props.answers}\n onChange={(newResponseItem) => setResponseItem(index, newResponseItem)}\n />\n </FormSection>\n );\n })}\n </>\n );\n}\n\nexport interface QuestionnaireFormItemProps {\n item: QuestionnaireItem;\n answers: Record<string, QuestionnaireResponseItemAnswer>;\n onChange: (newResponseItem: QuestionnaireResponseItem) => void;\n}\n\nexport function QuestionnaireFormItem(props: QuestionnaireFormItemProps): JSX.Element | null {\n const item = props.item;\n\n const type = item.type as QuestionnaireItemType;\n if (!type) {\n return null;\n }\n\n const name = item.linkId;\n if (!name) {\n return null;\n }\n\n const initial = item.initial && item.initial.length > 0 ? item.initial[0] : undefined;\n\n function onChangeItem(newResponseItems: QuestionnaireResponseItem[]): void {\n props.onChange({\n linkId: item.linkId,\n text: item.text,\n item: newResponseItems,\n });\n }\n\n function onChangeAnswer(newResponseAnswer: QuestionnaireResponseItemAnswer): void {\n props.onChange({\n linkId: item.linkId,\n text: item.text,\n answer: [newResponseAnswer],\n });\n }\n\n switch (type) {\n case QuestionnaireItemType.group:\n return (\n <div>\n <h3>{item.text}</h3>\n {item.item && (\n <QuestionnaireFormItemArray items={item.item} answers={props.answers} onChange={onChangeItem} />\n )}\n </div>\n );\n case QuestionnaireItemType.boolean:\n return (\n <Checkbox\n name={name}\n defaultValue={initial?.valueBoolean}\n onChange={(newValue) => onChangeAnswer({ valueBoolean: newValue })}\n />\n );\n case QuestionnaireItemType.decimal:\n return (\n <Input\n type=\"number\"\n step=\"any\"\n name={name}\n defaultValue={initial?.valueDecimal}\n onChange={(newValue) => onChangeAnswer({ valueDecimal: parseFloat(newValue) })}\n />\n );\n case QuestionnaireItemType.integer:\n return (\n <Input\n type=\"number\"\n step={1}\n name={name}\n defaultValue={initial?.valueInteger}\n onChange={(newValue) => onChangeAnswer({ valueInteger: parseInt(newValue) })}\n />\n );\n case QuestionnaireItemType.date:\n return (\n <Input\n type=\"date\"\n name={name}\n defaultValue={initial?.valueDate}\n onChange={(newValue) => onChangeAnswer({ valueDate: newValue })}\n />\n );\n case QuestionnaireItemType.dateTime:\n return (\n <DateTimeInput\n type=\"datetime-local\"\n name={name}\n defaultValue={initial?.valueDateTime}\n onChange={(newValue) => onChangeAnswer({ valueDateTime: newValue })}\n />\n );\n case QuestionnaireItemType.time:\n return (\n <Input\n type=\"time\"\n name={name}\n defaultValue={initial?.valueTime}\n onChange={(newValue) => onChangeAnswer({ valueTime: newValue })}\n />\n );\n case QuestionnaireItemType.string:\n return (\n <Input\n type=\"text\"\n name={name}\n defaultValue={initial?.valueString}\n onChange={(newValue) => onChangeAnswer({ valueString: newValue })}\n />\n );\n case QuestionnaireItemType.text:\n return (\n <TextArea\n name={name}\n defaultValue={initial?.valueString}\n onChange={(newValue) => onChangeAnswer({ valueString: newValue })}\n />\n );\n case QuestionnaireItemType.url:\n return (\n <Input\n type=\"url\"\n name={name}\n defaultValue={initial?.valueUri}\n onChange={(newValue) => onChangeAnswer({ valueUri: newValue })}\n />\n );\n case QuestionnaireItemType.attachment:\n return (\n <AttachmentInput\n name={name}\n defaultValue={initial?.valueAttachment}\n onChange={(newValue) => onChangeAnswer({ valueAttachment: newValue })}\n />\n );\n case QuestionnaireItemType.reference:\n return (\n <ReferenceInput\n name={name}\n defaultValue={initial?.valueReference}\n onChange={(newValue) => onChangeAnswer({ valueReference: newValue })}\n />\n );\n case QuestionnaireItemType.quantity:\n return (\n <QuantityInput\n name={name}\n defaultValue={initial?.valueQuantity}\n onChange={(newValue) => onChangeAnswer({ valueQuantity: newValue })}\n />\n );\n case QuestionnaireItemType.choice:\n case QuestionnaireItemType.openChoice:\n if (isDropDownChoice(item)) {\n return (\n <QuestionnaireChoiceDropDownInput name={name} item={item} initial={initial} onChangeAnswer={onChangeAnswer} />\n );\n } else {\n return (\n <QuestionnaireChoiceRadioInput name={name} item={item} initial={initial} onChangeAnswer={onChangeAnswer} />\n );\n }\n }\n\n return null;\n}\n\ninterface QuestionnaireChoiceInputProps {\n name: string;\n item: QuestionnaireItem;\n initial: QuestionnaireItemInitial | undefined;\n onChangeAnswer: (newResponseAnswer: QuestionnaireResponseItemAnswer) => void;\n}\n\nfunction QuestionnaireChoiceDropDownInput(props: QuestionnaireChoiceInputProps): JSX.Element {\n const { name, item, initial } = props;\n const valueElementDefinition = globalSchema.types['QuestionnaireItemAnswerOption'].properties['value[x]'];\n const initialValue = getTypedPropertyValue({ type: 'QuestionnaireItemInitial', value: initial }, 'value') as\n | TypedValue\n | undefined;\n\n return (\n <select\n id={name}\n name={name}\n className=\"medplum-select\"\n onChange={(e: ChangeEvent<HTMLSelectElement>) => {\n const index = e.currentTarget.selectedIndex;\n if (index === 0) {\n props.onChangeAnswer({});\n return;\n }\n const option = (item.answerOption as QuestionnaireItemAnswerOption[])[index - 1];\n const optionValue = getTypedPropertyValue(\n { type: 'QuestionnaireItemAnswerOption', value: option },\n 'value'\n ) as TypedValue;\n const propertyName = 'value' + capitalize(optionValue.type);\n props.onChangeAnswer({ [propertyName]: optionValue.value });\n }}\n >\n <option></option>\n {item.answerOption &&\n item.answerOption.map((option: QuestionnaireItemAnswerOption, index: number) => {\n const optionValue = getTypedPropertyValue(\n { type: 'QuestionnaireItemAnswerOption', value: option },\n 'value'\n ) as TypedValue;\n const optionName = `${name}-option-${index}`;\n return (\n <option\n key={optionName}\n value={optionValue.value}\n selected={initialValue && stringify(optionValue) === stringify(initialValue)}\n >\n <ResourcePropertyDisplay\n property={valueElementDefinition}\n propertyType={optionValue.type as PropertyType}\n value={optionValue.value}\n />\n </option>\n );\n })}\n </select>\n );\n}\n\nfunction QuestionnaireChoiceRadioInput(props: QuestionnaireChoiceInputProps): JSX.Element {\n const { name, item, initial, onChangeAnswer } = props;\n const valueElementDefinition = globalSchema.types['QuestionnaireItemAnswerOption'].properties['value[x]'];\n const initialValue = getTypedPropertyValue({ type: 'QuestionnaireItemInitial', value: initial }, 'value') as\n | TypedValue\n | undefined;\n return (\n <>\n {item.answerOption &&\n item.answerOption.map((option: QuestionnaireItemAnswerOption, index: number) => {\n const optionValue = getTypedPropertyValue(\n { type: 'QuestionnaireItemAnswerOption', value: option },\n 'value'\n ) as TypedValue;\n const propertyName = 'value' + capitalize(optionValue.type);\n const optionName = `${name}-option-${index}`;\n return (\n <div key={optionName} className=\"medplum-questionnaire-option-row\">\n <div className=\"medplum-questionnaire-option-checkbox\">\n <input\n type=\"radio\"\n id={optionName}\n name={name}\n value={optionValue.value}\n defaultChecked={initialValue && stringify(optionValue) === stringify(initialValue)}\n onChange={() => onChangeAnswer({ [propertyName]: optionValue.value })}\n />\n </div>\n <div>\n <label htmlFor={optionName}>\n <ResourcePropertyDisplay\n property={valueElementDefinition}\n propertyType={optionValue.type as PropertyType}\n value={optionValue.value}\n />\n </label>\n </div>\n </div>\n );\n })}\n </>\n );\n}\n\nfunction buildInitialResponse(questionnaire: Questionnaire): QuestionnaireResponse {\n const response: QuestionnaireResponse = {\n resourceType: 'QuestionnaireResponse',\n questionnaire: getReferenceString(questionnaire),\n item: buildInitialResponseItems(questionnaire.item),\n };\n\n return response;\n}\n\nfunction buildInitialResponseItems(items: QuestionnaireItem[] | undefined): QuestionnaireResponseItem[] {\n return items?.map(buildInitialResponseItem) ?? [];\n}\n\nfunction buildInitialResponseItem(item: QuestionnaireItem): QuestionnaireResponseItem {\n return {\n linkId: item.linkId,\n text: item.text,\n item: buildInitialResponseItems(item.item),\n answer: item.initial?.map(buildInitialResponseAnswer) ?? [],\n };\n}\n\nfunction buildInitialResponseAnswer(answer: QuestionnaireItemInitial): QuestionnaireResponseItemAnswer {\n // This works because QuestionnaireItemInitial and QuestionnaireResponseItemAnswer\n // have the same properties.\n return { ...answer };\n}\n\nfunction isDropDownChoice(item: QuestionnaireItem): boolean {\n return !!item.extension?.some(\n (e) =>\n e.url === 'http://hl7.org/fhir/StructureDefinition/questionnaire-itemControl' &&\n e.valueCodeableConcept?.coding?.[0]?.code === 'drop-down'\n );\n}\n\nexport function isQuestionEnabled(\n item: QuestionnaireItem,\n answers: Record<string, QuestionnaireResponseItemAnswer>\n): boolean {\n if (!item.enableWhen) {\n return true;\n }\n const enableBehavior = item.enableBehavior || 'any';\n for (const enableWhen of item.enableWhen) {\n const expectedAnswer = getTypedPropertyValue(\n {\n type: 'QuestionnaireItemEnableWhen',\n value: enableWhen,\n },\n 'answer[x]'\n );\n const actualAnswer = getTypedPropertyValue(\n {\n type: 'QuestionnaireResponseItemAnswer',\n value: answers[enableWhen.question as string],\n },\n 'value[x]'\n );\n const match = deepEquals(expectedAnswer, actualAnswer);\n if (enableBehavior === 'any' && match) {\n return true;\n }\n if (enableBehavior === 'all' && !match) {\n return false;\n }\n }\n if (enableBehavior === 'any') {\n return false;\n } else {\n return true;\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"QuestionnaireForm.js","sources":["../../src/QuestionnaireForm.tsx"],"sourcesContent":["import { Button, Checkbox, NativeSelect, Textarea, TextInput } from '@mantine/core';\nimport {\n capitalize,\n createReference,\n deepEquals,\n getQuestionnaireAnswers,\n getReferenceString,\n getTypedPropertyValue,\n globalSchema,\n IndexedStructureDefinition,\n ProfileResource,\n PropertyType,\n stringify,\n TypedValue,\n} from '@medplum/core';\nimport {\n Questionnaire,\n QuestionnaireItem,\n QuestionnaireItemAnswerOption,\n QuestionnaireItemInitial,\n QuestionnaireResponse,\n QuestionnaireResponseItem,\n QuestionnaireResponseItemAnswer,\n Reference,\n} from '@medplum/fhirtypes';\nimport React, { ChangeEvent, useEffect, useState } from 'react';\nimport { AttachmentInput } from './AttachmentInput';\nimport { CheckboxFormSection } from './CheckboxFormSection';\nimport { DateTimeInput } from './DateTimeInput';\nimport { Form } from './Form';\nimport { FormSection } from './FormSection';\nimport { useMedplum } from './MedplumProvider';\nimport { QuantityInput } from './QuantityInput';\nimport { QuestionnaireItemType } from './QuestionnaireUtils';\nimport { ReferenceInput } from './ReferenceInput';\nimport { ResourcePropertyDisplay } from './ResourcePropertyDisplay';\nimport { useResource } from './useResource';\n\nimport './QuestionnaireForm.css';\n\nexport interface QuestionnaireFormProps {\n questionnaire: Questionnaire | Reference<Questionnaire>;\n subject?: Reference;\n submitButtonText?: string;\n onSubmit: (response: QuestionnaireResponse) => void;\n}\n\nexport function QuestionnaireForm(props: QuestionnaireFormProps): JSX.Element | null {\n const medplum = useMedplum();\n const source = medplum.getProfile();\n const [schema, setSchema] = useState<IndexedStructureDefinition | undefined>();\n const questionnaire = useResource(props.questionnaire);\n const [response, setResponse] = useState<QuestionnaireResponse | undefined>();\n const [answers, setAnswers] = useState<Record<string, QuestionnaireResponseItemAnswer>>({});\n\n useEffect(() => {\n medplum\n .requestSchema('Questionnaire')\n .then(() => medplum.requestSchema('QuestionnaireResponse'))\n .then(setSchema)\n .catch(console.log);\n }, [medplum]);\n\n useEffect(() => {\n setResponse(questionnaire ? buildInitialResponse(questionnaire) : undefined);\n }, [questionnaire]);\n\n function setItems(newResponseItems: QuestionnaireResponseItem[]): void {\n const newResponse: QuestionnaireResponse = {\n resourceType: 'QuestionnaireResponse',\n item: newResponseItems,\n };\n setResponse(newResponse);\n setAnswers(getQuestionnaireAnswers(newResponse));\n }\n\n if (!schema || !questionnaire) {\n return null;\n }\n\n return (\n <Form\n testid=\"questionnaire-form\"\n onSubmit={() => {\n if (props.onSubmit && response) {\n props.onSubmit({\n ...response,\n questionnaire: getReferenceString(questionnaire),\n subject: props.subject,\n source: createReference(source as ProfileResource),\n authored: new Date().toISOString(),\n });\n }\n }}\n >\n {questionnaire.title && <h1>{questionnaire.title}</h1>}\n {questionnaire.item && (\n <QuestionnaireFormItemArray items={questionnaire.item} answers={answers} onChange={setItems} />\n )}\n <Button type=\"submit\">{props.submitButtonText || 'OK'}</Button>\n </Form>\n );\n}\n\ninterface QuestionnaireFormItemArrayProps {\n items: QuestionnaireItem[];\n answers: Record<string, QuestionnaireResponseItemAnswer>;\n onChange: (newResponseItems: QuestionnaireResponseItem[]) => void;\n}\n\nfunction QuestionnaireFormItemArray(props: QuestionnaireFormItemArrayProps): JSX.Element {\n const [responseItems, setResponseItems] = useState<QuestionnaireResponseItem[]>(\n buildInitialResponseItems(props.items)\n );\n\n function setResponseItem(index: number, newResponseItem: QuestionnaireResponseItem): void {\n const newResponseItems = responseItems.slice();\n newResponseItems[index] = newResponseItem;\n setResponseItems(newResponseItems);\n props.onChange(newResponseItems);\n }\n\n return (\n <>\n {props.items.map((item, index) => {\n if (!isQuestionEnabled(item, props.answers)) {\n return null;\n }\n if (item.type === QuestionnaireItemType.display) {\n return <p key={item.linkId}>{item.text}</p>;\n }\n if (item.type === QuestionnaireItemType.group) {\n return (\n <QuestionnaireFormItem\n key={item.linkId}\n item={item}\n answers={props.answers}\n onChange={(newResponseItem) => setResponseItem(index, newResponseItem)}\n />\n );\n }\n if (item.type === QuestionnaireItemType.boolean) {\n const initial = item.initial && item.initial.length > 0 ? item.initial[0] : undefined;\n return (\n <CheckboxFormSection key={item.linkId} title={item.text} htmlFor={item.linkId}>\n <Checkbox\n id={item.linkId}\n name={item.linkId}\n defaultChecked={initial?.valueBoolean}\n onChange={(e) =>\n setResponseItem(index, {\n linkId: item.linkId,\n text: item.text,\n answer: [{ valueBoolean: e.currentTarget.checked }],\n })\n }\n />\n </CheckboxFormSection>\n );\n }\n return (\n <FormSection key={item.linkId} htmlFor={item.linkId} title={item.text || ''}>\n <QuestionnaireFormItem\n item={item}\n answers={props.answers}\n onChange={(newResponseItem) => setResponseItem(index, newResponseItem)}\n />\n </FormSection>\n );\n })}\n </>\n );\n}\n\nexport interface QuestionnaireFormItemProps {\n item: QuestionnaireItem;\n answers: Record<string, QuestionnaireResponseItemAnswer>;\n onChange: (newResponseItem: QuestionnaireResponseItem) => void;\n}\n\nexport function QuestionnaireFormItem(props: QuestionnaireFormItemProps): JSX.Element | null {\n const item = props.item;\n\n const type = item.type as QuestionnaireItemType;\n if (!type) {\n return null;\n }\n\n const name = item.linkId;\n if (!name) {\n return null;\n }\n\n const initial = item.initial && item.initial.length > 0 ? item.initial[0] : undefined;\n\n function onChangeItem(newResponseItems: QuestionnaireResponseItem[]): void {\n props.onChange({\n linkId: item.linkId,\n text: item.text,\n item: newResponseItems,\n });\n }\n\n function onChangeAnswer(newResponseAnswer: QuestionnaireResponseItemAnswer): void {\n props.onChange({\n linkId: item.linkId,\n text: item.text,\n answer: [newResponseAnswer],\n });\n }\n\n switch (type) {\n case QuestionnaireItemType.group:\n return (\n <div>\n <h3>{item.text}</h3>\n {item.item && (\n <QuestionnaireFormItemArray items={item.item} answers={props.answers} onChange={onChangeItem} />\n )}\n </div>\n );\n case QuestionnaireItemType.boolean:\n return (\n <Checkbox\n id={name}\n name={name}\n defaultChecked={initial?.valueBoolean}\n onChange={(e) => onChangeAnswer({ valueBoolean: e.currentTarget.checked })}\n />\n );\n case QuestionnaireItemType.decimal:\n return (\n <TextInput\n type=\"number\"\n step=\"any\"\n id={name}\n name={name}\n defaultValue={initial?.valueDecimal}\n onChange={(e) => onChangeAnswer({ valueDecimal: e.currentTarget.valueAsNumber })}\n />\n );\n case QuestionnaireItemType.integer:\n return (\n <TextInput\n type=\"number\"\n step={1}\n id={name}\n name={name}\n defaultValue={initial?.valueInteger}\n onChange={(e) => onChangeAnswer({ valueInteger: e.currentTarget.valueAsNumber })}\n />\n );\n case QuestionnaireItemType.date:\n return (\n <TextInput\n type=\"date\"\n id={name}\n name={name}\n defaultValue={initial?.valueDate}\n onChange={(e) => onChangeAnswer({ valueDate: e.currentTarget.value })}\n />\n );\n case QuestionnaireItemType.dateTime:\n return (\n <DateTimeInput\n name={name}\n defaultValue={initial?.valueDateTime}\n onChange={(newValue: string) => onChangeAnswer({ valueDateTime: newValue })}\n />\n );\n case QuestionnaireItemType.time:\n return (\n <TextInput\n type=\"time\"\n id={name}\n name={name}\n defaultValue={initial?.valueTime}\n onChange={(e) => onChangeAnswer({ valueTime: e.currentTarget.value })}\n />\n );\n case QuestionnaireItemType.string:\n case QuestionnaireItemType.url:\n return (\n <TextInput\n id={name}\n name={name}\n defaultValue={initial?.valueString}\n onChange={(e) => onChangeAnswer({ valueString: e.currentTarget.value })}\n />\n );\n case QuestionnaireItemType.text:\n return (\n <Textarea\n id={name}\n name={name}\n defaultValue={initial?.valueString}\n onChange={(e) => onChangeAnswer({ valueString: e.currentTarget.value })}\n />\n );\n case QuestionnaireItemType.attachment:\n return (\n <AttachmentInput\n name={name}\n defaultValue={initial?.valueAttachment}\n onChange={(newValue) => onChangeAnswer({ valueAttachment: newValue })}\n />\n );\n case QuestionnaireItemType.reference:\n return (\n <ReferenceInput\n name={name}\n defaultValue={initial?.valueReference}\n onChange={(newValue) => onChangeAnswer({ valueReference: newValue })}\n />\n );\n case QuestionnaireItemType.quantity:\n return (\n <QuantityInput\n name={name}\n defaultValue={initial?.valueQuantity}\n onChange={(newValue) => onChangeAnswer({ valueQuantity: newValue })}\n />\n );\n case QuestionnaireItemType.choice:\n case QuestionnaireItemType.openChoice:\n if (isDropDownChoice(item)) {\n return (\n <QuestionnaireChoiceDropDownInput name={name} item={item} initial={initial} onChangeAnswer={onChangeAnswer} />\n );\n } else {\n return (\n <QuestionnaireChoiceRadioInput name={name} item={item} initial={initial} onChangeAnswer={onChangeAnswer} />\n );\n }\n }\n\n return null;\n}\n\ninterface QuestionnaireChoiceInputProps {\n name: string;\n item: QuestionnaireItem;\n initial: QuestionnaireItemInitial | undefined;\n onChangeAnswer: (newResponseAnswer: QuestionnaireResponseItemAnswer) => void;\n}\n\nfunction QuestionnaireChoiceDropDownInput(props: QuestionnaireChoiceInputProps): JSX.Element {\n const { name, item, initial } = props;\n const initialValue = getTypedPropertyValue({ type: 'QuestionnaireItemInitial', value: initial }, 'value') as\n | TypedValue\n | undefined;\n\n const data = [''];\n if (item.answerOption) {\n for (const option of item.answerOption) {\n const optionValue = getTypedPropertyValue(\n { type: 'QuestionnaireItemAnswerOption', value: option },\n 'value'\n ) as TypedValue;\n data.push(typedValueToString(optionValue) as string);\n }\n }\n\n return (\n <NativeSelect\n id={name}\n name={name}\n className=\"medplum-select\"\n onChange={(e: ChangeEvent<HTMLSelectElement>) => {\n const index = e.currentTarget.selectedIndex;\n if (index === 0) {\n props.onChangeAnswer({});\n return;\n }\n const option = (item.answerOption as QuestionnaireItemAnswerOption[])[index - 1];\n const optionValue = getTypedPropertyValue(\n { type: 'QuestionnaireItemAnswerOption', value: option },\n 'value'\n ) as TypedValue;\n const propertyName = 'value' + capitalize(optionValue.type);\n props.onChangeAnswer({ [propertyName]: optionValue.value });\n }}\n defaultValue={typedValueToString(initialValue)}\n data={data}\n />\n );\n}\n\nfunction typedValueToString(typedValue: TypedValue | undefined): string | undefined {\n if (!typedValue) {\n return undefined;\n }\n if (typedValue.type === 'CodeableConcept') {\n return typedValue.value.coding[0].display;\n }\n if (typedValue.type === 'Coding') {\n return typedValue.value.display;\n }\n return typedValue.value.toString();\n}\n\nfunction QuestionnaireChoiceRadioInput(props: QuestionnaireChoiceInputProps): JSX.Element {\n const { name, item, initial, onChangeAnswer } = props;\n const valueElementDefinition = globalSchema.types['QuestionnaireItemAnswerOption'].properties['value[x]'];\n const initialValue = getTypedPropertyValue({ type: 'QuestionnaireItemInitial', value: initial }, 'value') as\n | TypedValue\n | undefined;\n return (\n <>\n {item.answerOption &&\n item.answerOption.map((option: QuestionnaireItemAnswerOption, index: number) => {\n const optionValue = getTypedPropertyValue(\n { type: 'QuestionnaireItemAnswerOption', value: option },\n 'value'\n ) as TypedValue;\n const propertyName = 'value' + capitalize(optionValue.type);\n const optionName = `${name}-option-${index}`;\n return (\n <div key={optionName} className=\"medplum-questionnaire-option-row\">\n <div className=\"medplum-questionnaire-option-checkbox\">\n <input\n type=\"radio\"\n id={optionName}\n name={name}\n value={optionValue.value}\n defaultChecked={initialValue && stringify(optionValue) === stringify(initialValue)}\n onChange={() => onChangeAnswer({ [propertyName]: optionValue.value })}\n />\n </div>\n <div>\n <label htmlFor={optionName}>\n <ResourcePropertyDisplay\n property={valueElementDefinition}\n propertyType={optionValue.type as PropertyType}\n value={optionValue.value}\n />\n </label>\n </div>\n </div>\n );\n })}\n </>\n );\n}\n\nfunction buildInitialResponse(questionnaire: Questionnaire): QuestionnaireResponse {\n const response: QuestionnaireResponse = {\n resourceType: 'QuestionnaireResponse',\n questionnaire: getReferenceString(questionnaire),\n item: buildInitialResponseItems(questionnaire.item),\n };\n\n return response;\n}\n\nfunction buildInitialResponseItems(items: QuestionnaireItem[] | undefined): QuestionnaireResponseItem[] {\n return items?.map(buildInitialResponseItem) ?? [];\n}\n\nfunction buildInitialResponseItem(item: QuestionnaireItem): QuestionnaireResponseItem {\n return {\n linkId: item.linkId,\n text: item.text,\n item: buildInitialResponseItems(item.item),\n answer: item.initial?.map(buildInitialResponseAnswer) ?? [],\n };\n}\n\nfunction buildInitialResponseAnswer(answer: QuestionnaireItemInitial): QuestionnaireResponseItemAnswer {\n // This works because QuestionnaireItemInitial and QuestionnaireResponseItemAnswer\n // have the same properties.\n return { ...answer };\n}\n\nfunction isDropDownChoice(item: QuestionnaireItem): boolean {\n return !!item.extension?.some(\n (e) =>\n e.url === 'http://hl7.org/fhir/StructureDefinition/questionnaire-itemControl' &&\n e.valueCodeableConcept?.coding?.[0]?.code === 'drop-down'\n );\n}\n\nexport function isQuestionEnabled(\n item: QuestionnaireItem,\n answers: Record<string, QuestionnaireResponseItemAnswer>\n): boolean {\n if (!item.enableWhen) {\n return true;\n }\n const enableBehavior = item.enableBehavior || 'any';\n for (const enableWhen of item.enableWhen) {\n const expectedAnswer = getTypedPropertyValue(\n {\n type: 'QuestionnaireItemEnableWhen',\n value: enableWhen,\n },\n 'answer[x]'\n );\n const actualAnswer = getTypedPropertyValue(\n {\n type: 'QuestionnaireResponseItemAnswer',\n value: answers[enableWhen.question as string],\n },\n 'value[x]'\n );\n const match = deepEquals(expectedAnswer, actualAnswer);\n if (enableBehavior === 'any' && match) {\n return true;\n }\n if (enableBehavior === 'all' && !match) {\n return false;\n }\n }\n if (enableBehavior === 'any') {\n return false;\n } else {\n return true;\n }\n}\n"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
+ import { Group } from '@mantine/core';
1
2
  import React, { useState } from 'react';
2
- import { InputRow } from './InputRow.js';
3
3
  import { QuantityInput } from './QuantityInput.js';
4
4
 
5
5
  /**
@@ -16,7 +16,7 @@ function RangeInput(props) {
16
16
  props.onChange(newValue);
17
17
  }
18
18
  }
19
- return (React.createElement(InputRow, null,
19
+ return (React.createElement(Group, { spacing: "xs", grow: true, noWrap: true },
20
20
  React.createElement(QuantityInput, { name: props.name + '-low', defaultValue: value === null || value === void 0 ? void 0 : value.low, onChange: (v) => setValueWrapper(Object.assign(Object.assign({}, value), { low: v })) }),
21
21
  React.createElement(QuantityInput, { name: props.name + '-high', defaultValue: value === null || value === void 0 ? void 0 : value.high, onChange: (v) => setValueWrapper(Object.assign(Object.assign({}, value), { high: v })) })));
22
22
  }
@@ -1 +1 @@
1
- {"version":3,"file":"RangeInput.js","sources":["../../src/RangeInput.tsx"],"sourcesContent":["import { Range } from '@medplum/fhirtypes';\nimport React, { useState } from 'react';\nimport { InputRow } from './InputRow';\nimport { QuantityInput } from './QuantityInput';\n\nexport interface RangeInputProps {\n name: string;\n defaultValue?: Range;\n onChange?: (value: Range) => void;\n}\n\n/**\n * Renders a Range input.\n * See: https://www.hl7.org/fhir/datatypes.html#Range\n * @param props Range input properties.\n * @returns Range input element.\n */\nexport function RangeInput(props: RangeInputProps): JSX.Element {\n const [value, setValue] = useState(props.defaultValue);\n\n function setValueWrapper(newValue: Range): void {\n setValue(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n return (\n <InputRow>\n <QuantityInput\n name={props.name + '-low'}\n defaultValue={value?.low}\n onChange={(v) =>\n setValueWrapper({\n ...value,\n low: v,\n })\n }\n />\n <QuantityInput\n name={props.name + '-high'}\n defaultValue={value?.high}\n onChange={(v) =>\n setValueWrapper({\n ...value,\n high: v,\n })\n }\n />\n </InputRow>\n );\n}\n"],"names":[],"mappings":";;;;AAWA;;;;;AAKG;AACG,SAAU,UAAU,CAAC,KAAsB,EAAA;AAC/C,IAAA,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IAEvD,SAAS,eAAe,CAAC,QAAe,EAAA;QACtC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACnB,IAAI,KAAK,CAAC,QAAQ,EAAE;AAClB,YAAA,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AAC1B,SAAA;KACF;IAED,QACE,oBAAC,QAAQ,EAAA,IAAA;AACP,QAAA,KAAA,CAAA,aAAA,CAAC,aAAa,EAAA,EACZ,IAAI,EAAE,KAAK,CAAC,IAAI,GAAG,MAAM,EACzB,YAAY,EAAE,KAAK,KAAA,IAAA,IAAL,KAAK,KAAL,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,KAAK,CAAE,GAAG,EACxB,QAAQ,EAAE,CAAC,CAAC,KACV,eAAe,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EACV,KAAK,CACR,EAAA,EAAA,GAAG,EAAE,CAAC,IACN,EAEJ,CAAA;AACF,QAAA,KAAA,CAAA,aAAA,CAAC,aAAa,EACZ,EAAA,IAAI,EAAE,KAAK,CAAC,IAAI,GAAG,OAAO,EAC1B,YAAY,EAAE,KAAK,aAAL,KAAK,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAL,KAAK,CAAE,IAAI,EACzB,QAAQ,EAAE,CAAC,CAAC,KACV,eAAe,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EACV,KAAK,CAAA,EAAA,EACR,IAAI,EAAE,CAAC,IACP,EAEJ,CAAA,CACO,EACX;AACJ;;;;"}
1
+ {"version":3,"file":"RangeInput.js","sources":["../../src/RangeInput.tsx"],"sourcesContent":["import { Group } from '@mantine/core';\nimport { Range } from '@medplum/fhirtypes';\nimport React, { useState } from 'react';\nimport { QuantityInput } from './QuantityInput';\n\nexport interface RangeInputProps {\n name: string;\n defaultValue?: Range;\n onChange?: (value: Range) => void;\n}\n\n/**\n * Renders a Range input.\n * See: https://www.hl7.org/fhir/datatypes.html#Range\n * @param props Range input properties.\n * @returns Range input element.\n */\nexport function RangeInput(props: RangeInputProps): JSX.Element {\n const [value, setValue] = useState(props.defaultValue);\n\n function setValueWrapper(newValue: Range): void {\n setValue(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n return (\n <Group spacing=\"xs\" grow noWrap>\n <QuantityInput\n name={props.name + '-low'}\n defaultValue={value?.low}\n onChange={(v) =>\n setValueWrapper({\n ...value,\n low: v,\n })\n }\n />\n <QuantityInput\n name={props.name + '-high'}\n defaultValue={value?.high}\n onChange={(v) =>\n setValueWrapper({\n ...value,\n high: v,\n })\n }\n />\n </Group>\n );\n}\n"],"names":[],"mappings":";;;;AAWA;;;;;AAKG;AACG,SAAU,UAAU,CAAC,KAAsB,EAAA;AAC/C,IAAA,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IAEvD,SAAS,eAAe,CAAC,QAAe,EAAA;QACtC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACnB,IAAI,KAAK,CAAC,QAAQ,EAAE;AAClB,YAAA,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AAC1B,SAAA;KACF;IAED,QACE,KAAC,CAAA,aAAA,CAAA,KAAK,EAAC,EAAA,OAAO,EAAC,IAAI,EAAC,IAAI,EAAA,IAAA,EAAC,MAAM,EAAA,IAAA,EAAA;AAC7B,QAAA,KAAA,CAAA,aAAA,CAAC,aAAa,EAAA,EACZ,IAAI,EAAE,KAAK,CAAC,IAAI,GAAG,MAAM,EACzB,YAAY,EAAE,KAAK,KAAA,IAAA,IAAL,KAAK,KAAL,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,KAAK,CAAE,GAAG,EACxB,QAAQ,EAAE,CAAC,CAAC,KACV,eAAe,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EACV,KAAK,CACR,EAAA,EAAA,GAAG,EAAE,CAAC,IACN,EAEJ,CAAA;AACF,QAAA,KAAA,CAAA,aAAA,CAAC,aAAa,EACZ,EAAA,IAAI,EAAE,KAAK,CAAC,IAAI,GAAG,OAAO,EAC1B,YAAY,EAAE,KAAK,aAAL,KAAK,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAL,KAAK,CAAE,IAAI,EACzB,QAAQ,EAAE,CAAC,CAAC,KACV,eAAe,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EACV,KAAK,CAAA,EAAA,EACR,IAAI,EAAE,CAAC,IACP,EAEJ,CAAA,CACI,EACR;AACJ;;;;"}
@@ -1,5 +1,5 @@
1
+ import { Group } from '@mantine/core';
1
2
  import React, { useState } from 'react';
2
- import { InputRow } from './InputRow.js';
3
3
  import { QuantityInput } from './QuantityInput.js';
4
4
 
5
5
  /**
@@ -16,7 +16,7 @@ function RatioInput(props) {
16
16
  props.onChange(newValue);
17
17
  }
18
18
  }
19
- return (React.createElement(InputRow, null,
19
+ return (React.createElement(Group, { spacing: "xs", grow: true, noWrap: true },
20
20
  React.createElement(QuantityInput, { name: props.name + '-numerator', defaultValue: value === null || value === void 0 ? void 0 : value.numerator, onChange: (v) => setValueWrapper(Object.assign(Object.assign({}, value), { numerator: v })) }),
21
21
  React.createElement(QuantityInput, { name: props.name + '-denominator', defaultValue: value === null || value === void 0 ? void 0 : value.denominator, onChange: (v) => setValueWrapper(Object.assign(Object.assign({}, value), { denominator: v })) })));
22
22
  }
@@ -1 +1 @@
1
- {"version":3,"file":"RatioInput.js","sources":["../../src/RatioInput.tsx"],"sourcesContent":["import { Ratio } from '@medplum/fhirtypes';\nimport React, { useState } from 'react';\nimport { InputRow } from './InputRow';\nimport { QuantityInput } from './QuantityInput';\n\nexport interface RatioInputProps {\n name: string;\n defaultValue?: Ratio;\n onChange?: (value: Ratio) => void;\n}\n\n/**\n * Renders a Ratio input.\n * See: https://www.hl7.org/fhir/datatypes.html#Ratio\n * @param props Ratio input properties.\n * @returns Ratio input element.\n */\nexport function RatioInput(props: RatioInputProps): JSX.Element {\n const [value, setValue] = useState(props.defaultValue);\n\n function setValueWrapper(newValue: Ratio): void {\n setValue(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n return (\n <InputRow>\n <QuantityInput\n name={props.name + '-numerator'}\n defaultValue={value?.numerator}\n onChange={(v) =>\n setValueWrapper({\n ...value,\n numerator: v,\n })\n }\n />\n <QuantityInput\n name={props.name + '-denominator'}\n defaultValue={value?.denominator}\n onChange={(v) =>\n setValueWrapper({\n ...value,\n denominator: v,\n })\n }\n />\n </InputRow>\n );\n}\n"],"names":[],"mappings":";;;;AAWA;;;;;AAKG;AACG,SAAU,UAAU,CAAC,KAAsB,EAAA;AAC/C,IAAA,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IAEvD,SAAS,eAAe,CAAC,QAAe,EAAA;QACtC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACnB,IAAI,KAAK,CAAC,QAAQ,EAAE;AAClB,YAAA,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AAC1B,SAAA;KACF;IAED,QACE,oBAAC,QAAQ,EAAA,IAAA;AACP,QAAA,KAAA,CAAA,aAAA,CAAC,aAAa,EAAA,EACZ,IAAI,EAAE,KAAK,CAAC,IAAI,GAAG,YAAY,EAC/B,YAAY,EAAE,KAAK,KAAA,IAAA,IAAL,KAAK,KAAL,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,KAAK,CAAE,SAAS,EAC9B,QAAQ,EAAE,CAAC,CAAC,KACV,eAAe,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EACV,KAAK,CACR,EAAA,EAAA,SAAS,EAAE,CAAC,IACZ,EAEJ,CAAA;AACF,QAAA,KAAA,CAAA,aAAA,CAAC,aAAa,EACZ,EAAA,IAAI,EAAE,KAAK,CAAC,IAAI,GAAG,cAAc,EACjC,YAAY,EAAE,KAAK,aAAL,KAAK,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAL,KAAK,CAAE,WAAW,EAChC,QAAQ,EAAE,CAAC,CAAC,KACV,eAAe,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EACV,KAAK,CAAA,EAAA,EACR,WAAW,EAAE,CAAC,IACd,EAEJ,CAAA,CACO,EACX;AACJ;;;;"}
1
+ {"version":3,"file":"RatioInput.js","sources":["../../src/RatioInput.tsx"],"sourcesContent":["import { Group } from '@mantine/core';\nimport { Ratio } from '@medplum/fhirtypes';\nimport React, { useState } from 'react';\nimport { QuantityInput } from './QuantityInput';\n\nexport interface RatioInputProps {\n name: string;\n defaultValue?: Ratio;\n onChange?: (value: Ratio) => void;\n}\n\n/**\n * Renders a Ratio input.\n * See: https://www.hl7.org/fhir/datatypes.html#Ratio\n * @param props Ratio input properties.\n * @returns Ratio input element.\n */\nexport function RatioInput(props: RatioInputProps): JSX.Element {\n const [value, setValue] = useState(props.defaultValue);\n\n function setValueWrapper(newValue: Ratio): void {\n setValue(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n return (\n <Group spacing=\"xs\" grow noWrap>\n <QuantityInput\n name={props.name + '-numerator'}\n defaultValue={value?.numerator}\n onChange={(v) =>\n setValueWrapper({\n ...value,\n numerator: v,\n })\n }\n />\n <QuantityInput\n name={props.name + '-denominator'}\n defaultValue={value?.denominator}\n onChange={(v) =>\n setValueWrapper({\n ...value,\n denominator: v,\n })\n }\n />\n </Group>\n );\n}\n"],"names":[],"mappings":";;;;AAWA;;;;;AAKG;AACG,SAAU,UAAU,CAAC,KAAsB,EAAA;AAC/C,IAAA,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IAEvD,SAAS,eAAe,CAAC,QAAe,EAAA;QACtC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACnB,IAAI,KAAK,CAAC,QAAQ,EAAE;AAClB,YAAA,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AAC1B,SAAA;KACF;IAED,QACE,KAAC,CAAA,aAAA,CAAA,KAAK,EAAC,EAAA,OAAO,EAAC,IAAI,EAAC,IAAI,EAAA,IAAA,EAAC,MAAM,EAAA,IAAA,EAAA;AAC7B,QAAA,KAAA,CAAA,aAAA,CAAC,aAAa,EAAA,EACZ,IAAI,EAAE,KAAK,CAAC,IAAI,GAAG,YAAY,EAC/B,YAAY,EAAE,KAAK,KAAA,IAAA,IAAL,KAAK,KAAL,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,KAAK,CAAE,SAAS,EAC9B,QAAQ,EAAE,CAAC,CAAC,KACV,eAAe,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EACV,KAAK,CACR,EAAA,EAAA,SAAS,EAAE,CAAC,IACZ,EAEJ,CAAA;AACF,QAAA,KAAA,CAAA,aAAA,CAAC,aAAa,EACZ,EAAA,IAAI,EAAE,KAAK,CAAC,IAAI,GAAG,cAAc,EACjC,YAAY,EAAE,KAAK,aAAL,KAAK,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAL,KAAK,CAAE,WAAW,EAChC,QAAQ,EAAE,CAAC,CAAC,KACV,eAAe,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EACV,KAAK,CAAA,EAAA,EACR,WAAW,EAAE,CAAC,IACd,EAEJ,CAAA,CACI,EACR;AACJ;;;;"}
@@ -2,6 +2,7 @@
2
2
  import { Reference } from '@medplum/fhirtypes';
3
3
  export interface ReferenceInputProps {
4
4
  name: string;
5
+ placeholder?: string;
5
6
  defaultValue?: Reference;
6
7
  targetTypes?: string[];
7
8
  onChange?: (value: Reference | undefined) => void;
@@ -1,9 +1,7 @@
1
+ import { Group, NativeSelect, TextInput } from '@mantine/core';
1
2
  import { createReference } from '@medplum/core';
2
3
  import React, { useState, useRef } from 'react';
3
- import { Input } from './Input.js';
4
- import { InputRow } from './InputRow.js';
5
4
  import { ResourceInput } from './ResourceInput.js';
6
- import { Select } from './Select.js';
7
5
 
8
6
  function ReferenceInput(props) {
9
7
  const targetTypes = props.targetTypes;
@@ -20,9 +18,9 @@ function ReferenceInput(props) {
20
18
  props.onChange(newValue);
21
19
  }
22
20
  }
23
- return (React.createElement(InputRow, null,
24
- targetTypes ? (React.createElement(Select, { testid: "reference-input-resource-type-select", defaultValue: resourceType, onChange: setResourceType }, targetTypes.map((targetType) => (React.createElement("option", { key: targetType, value: targetType }, targetType))))) : (React.createElement(Input, { testid: "reference-input-resource-type-input", defaultValue: resourceType, onChange: setResourceType })),
25
- React.createElement(ResourceInput, { resourceType: resourceType, name: props.name + '-id', defaultValue: value, onChange: (item) => {
21
+ return (React.createElement(Group, { spacing: "xs", grow: true, noWrap: true },
22
+ targetTypes ? (React.createElement(NativeSelect, { "data-testid": "reference-input-resource-type-select", defaultValue: resourceType, onChange: (e) => setResourceType(e.currentTarget.value), data: targetTypes })) : (React.createElement(TextInput, { "data-testid": "reference-input-resource-type-input", defaultValue: resourceType, onChange: (e) => setResourceType(e.currentTarget.value) })),
23
+ React.createElement(ResourceInput, { resourceType: resourceType, name: props.name + '-id', placeholder: props.placeholder, defaultValue: value, onChange: (item) => {
26
24
  setValueHelper(item ? createReference(item) : undefined);
27
25
  } })));
28
26
  }