@medplum/react 0.9.38 → 0.10.0

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 (249) 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 +1 -0
  4. package/dist/cjs/CodingInput.d.ts +1 -0
  5. package/dist/cjs/DateTimeInput.d.ts +9 -2
  6. package/dist/cjs/ReferenceInput.d.ts +1 -0
  7. package/dist/cjs/ResourceAvatar.d.ts +8 -0
  8. package/dist/cjs/ResourceBadge.d.ts +0 -1
  9. package/dist/cjs/ResourceInput.d.ts +2 -3
  10. package/dist/cjs/SearchPopupMenu.d.ts +0 -4
  11. package/dist/cjs/SearchUtils.d.ts +5 -5
  12. package/dist/cjs/ValueSetAutocomplete.d.ts +10 -0
  13. package/dist/cjs/auth/RegisterForm.d.ts +0 -1
  14. package/dist/cjs/auth/SignInForm.d.ts +0 -1
  15. package/dist/cjs/defaulttheme.css +0 -51
  16. package/dist/cjs/index.d.ts +3 -14
  17. package/dist/cjs/index.js +793 -1493
  18. package/dist/cjs/index.js.map +1 -1
  19. package/dist/cjs/index.min.js +1 -1
  20. package/dist/cjs/index.min.js.map +1 -1
  21. package/dist/cjs/stories/{UploadButton.stories.d.ts → AttachmentButton.stories.d.ts} +1 -0
  22. package/dist/cjs/stories/{Input.stories.d.ts → PeriodInput.stories.d.ts} +1 -1
  23. package/dist/cjs/stories/{Avatar.stories.d.ts → ResourceAvatar.stories.d.ts} +0 -0
  24. package/dist/cjs/stories/ResourceForm.stories.d.ts +1 -0
  25. package/dist/cjs/stories/{Dialog.stories.d.ts → ResourceInput.stories.d.ts} +2 -1
  26. package/dist/cjs/stories/SearchControl.stories.d.ts +1 -0
  27. package/dist/cjs/styles.css +70 -1053
  28. package/dist/cjs/utils/outcomes.d.ts +1 -0
  29. package/dist/esm/AddressInput.js +9 -21
  30. package/dist/esm/AddressInput.js.map +1 -1
  31. package/dist/esm/AnnotationInput.js +2 -2
  32. package/dist/esm/AnnotationInput.js.map +1 -1
  33. package/dist/esm/AttachmentArrayInput.js +11 -8
  34. package/dist/esm/AttachmentArrayInput.js.map +1 -1
  35. package/dist/esm/AttachmentButton.d.ts +9 -0
  36. package/dist/esm/{UploadButton.js → AttachmentButton.js} +9 -9
  37. package/dist/esm/AttachmentButton.js.map +1 -0
  38. package/dist/esm/AttachmentInput.js +3 -3
  39. package/dist/esm/AttachmentInput.js.map +1 -1
  40. package/dist/esm/CalendarInput.js +6 -7
  41. package/dist/esm/CalendarInput.js.map +1 -1
  42. package/dist/esm/CodeInput.d.ts +2 -1
  43. package/dist/esm/CodeInput.js +16 -21
  44. package/dist/esm/CodeInput.js.map +1 -1
  45. package/dist/esm/CodeableConceptInput.d.ts +1 -0
  46. package/dist/esm/CodeableConceptInput.js +18 -33
  47. package/dist/esm/CodeableConceptInput.js.map +1 -1
  48. package/dist/esm/CodingInput.d.ts +1 -0
  49. package/dist/esm/CodingInput.js +24 -23
  50. package/dist/esm/CodingInput.js.map +1 -1
  51. package/dist/esm/ContactDetailInput.js +3 -4
  52. package/dist/esm/ContactDetailInput.js.map +1 -1
  53. package/dist/esm/ContactPointInput.js +5 -21
  54. package/dist/esm/ContactPointInput.js.map +1 -1
  55. package/dist/esm/DateTimeInput.d.ts +9 -2
  56. package/dist/esm/DateTimeInput.js +13 -3
  57. package/dist/esm/DateTimeInput.js.map +1 -1
  58. package/dist/esm/DiagnosticReportDisplay.js +16 -1
  59. package/dist/esm/DiagnosticReportDisplay.js.map +1 -1
  60. package/dist/esm/EncounterTimeline.js +2 -0
  61. package/dist/esm/EncounterTimeline.js.map +1 -1
  62. package/dist/esm/ExtensionInput.js +2 -2
  63. package/dist/esm/ExtensionInput.js.map +1 -1
  64. package/dist/esm/FhirPathTable.js +4 -5
  65. package/dist/esm/FhirPathTable.js.map +1 -1
  66. package/dist/esm/HumanNameInput.js +7 -17
  67. package/dist/esm/HumanNameInput.js.map +1 -1
  68. package/dist/esm/IdentifierInput.js +4 -5
  69. package/dist/esm/IdentifierInput.js.map +1 -1
  70. package/dist/esm/Logo.js +4 -4
  71. package/dist/esm/Logo.js.map +1 -1
  72. package/dist/esm/PatientTimeline.js +2 -0
  73. package/dist/esm/PatientTimeline.js.map +1 -1
  74. package/dist/esm/PeriodInput.js +5 -5
  75. package/dist/esm/PeriodInput.js.map +1 -1
  76. package/dist/esm/PlanDefinitionBuilder.js +17 -29
  77. package/dist/esm/PlanDefinitionBuilder.js.map +1 -1
  78. package/dist/esm/QuantityInput.js +5 -12
  79. package/dist/esm/QuantityInput.js.map +1 -1
  80. package/dist/esm/QuestionnaireBuilder.js +22 -25
  81. package/dist/esm/QuestionnaireBuilder.js.map +1 -1
  82. package/dist/esm/QuestionnaireForm.js +35 -29
  83. package/dist/esm/QuestionnaireForm.js.map +1 -1
  84. package/dist/esm/RangeInput.js +2 -2
  85. package/dist/esm/RangeInput.js.map +1 -1
  86. package/dist/esm/RatioInput.js +2 -2
  87. package/dist/esm/RatioInput.js.map +1 -1
  88. package/dist/esm/ReferenceInput.d.ts +1 -0
  89. package/dist/esm/ReferenceInput.js +4 -6
  90. package/dist/esm/ReferenceInput.js.map +1 -1
  91. package/dist/esm/RequestGroupDisplay.js +1 -1
  92. package/dist/esm/RequestGroupDisplay.js.map +1 -1
  93. package/dist/esm/ResourceArrayInput.js +10 -7
  94. package/dist/esm/ResourceArrayInput.js.map +1 -1
  95. package/dist/esm/ResourceAvatar.d.ts +8 -0
  96. package/dist/esm/ResourceAvatar.js +24 -0
  97. package/dist/esm/ResourceAvatar.js.map +1 -0
  98. package/dist/esm/ResourceBadge.d.ts +0 -1
  99. package/dist/esm/ResourceBadge.js +2 -3
  100. package/dist/esm/ResourceBadge.js.map +1 -1
  101. package/dist/esm/ResourceBlame.js +3 -3
  102. package/dist/esm/ResourceBlame.js.map +1 -1
  103. package/dist/esm/ResourceForm.js +10 -10
  104. package/dist/esm/ResourceForm.js.map +1 -1
  105. package/dist/esm/ResourceInput.d.ts +2 -3
  106. package/dist/esm/ResourceInput.js +37 -29
  107. package/dist/esm/ResourceInput.js.map +1 -1
  108. package/dist/esm/ResourcePropertyInput.js +30 -18
  109. package/dist/esm/ResourcePropertyInput.js.map +1 -1
  110. package/dist/esm/ResourceTimeline.js +19 -15
  111. package/dist/esm/ResourceTimeline.js.map +1 -1
  112. package/dist/esm/Scheduler.js +7 -7
  113. package/dist/esm/Scheduler.js.map +1 -1
  114. package/dist/esm/SearchControl.js +76 -58
  115. package/dist/esm/SearchControl.js.map +1 -1
  116. package/dist/esm/SearchControlField.js.map +1 -1
  117. package/dist/esm/SearchFieldEditor.js +7 -7
  118. package/dist/esm/SearchFieldEditor.js.map +1 -1
  119. package/dist/esm/SearchFilterEditor.js +10 -15
  120. package/dist/esm/SearchFilterEditor.js.map +1 -1
  121. package/dist/esm/SearchFilterValueDialog.js +4 -3
  122. package/dist/esm/SearchFilterValueDialog.js.map +1 -1
  123. package/dist/esm/SearchFilterValueInput.js +6 -7
  124. package/dist/esm/SearchFilterValueInput.js.map +1 -1
  125. package/dist/esm/SearchPopupMenu.d.ts +0 -4
  126. package/dist/esm/SearchPopupMenu.js +59 -73
  127. package/dist/esm/SearchPopupMenu.js.map +1 -1
  128. package/dist/esm/SearchUtils.d.ts +5 -5
  129. package/dist/esm/SearchUtils.js +11 -12
  130. package/dist/esm/SearchUtils.js.map +1 -1
  131. package/dist/esm/ServiceRequestTimeline.js +2 -0
  132. package/dist/esm/ServiceRequestTimeline.js.map +1 -1
  133. package/dist/esm/Timeline.js +12 -20
  134. package/dist/esm/Timeline.js.map +1 -1
  135. package/dist/esm/TimingInput.js +14 -17
  136. package/dist/esm/TimingInput.js.map +1 -1
  137. package/dist/esm/ValueSetAutocomplete.d.ts +10 -0
  138. package/dist/esm/ValueSetAutocomplete.js +57 -0
  139. package/dist/esm/ValueSetAutocomplete.js.map +1 -0
  140. package/dist/esm/auth/AuthenticationForm.js +12 -20
  141. package/dist/esm/auth/AuthenticationForm.js.map +1 -1
  142. package/dist/esm/auth/ChooseProfileForm.js +10 -10
  143. package/dist/esm/auth/ChooseProfileForm.js.map +1 -1
  144. package/dist/esm/auth/NewProjectForm.js +12 -15
  145. package/dist/esm/auth/NewProjectForm.js.map +1 -1
  146. package/dist/esm/auth/NewUserForm.js +25 -33
  147. package/dist/esm/auth/NewUserForm.js.map +1 -1
  148. package/dist/esm/auth/RegisterForm.d.ts +0 -1
  149. package/dist/esm/auth/RegisterForm.js.map +1 -1
  150. package/dist/esm/auth/SignInForm.d.ts +0 -1
  151. package/dist/esm/auth/SignInForm.js.map +1 -1
  152. package/dist/esm/defaulttheme.css +0 -51
  153. package/dist/esm/index.d.ts +3 -14
  154. package/dist/esm/index.js +4 -15
  155. package/dist/esm/index.js.map +1 -1
  156. package/dist/esm/index.min.js +1 -1
  157. package/dist/esm/index.min.js.map +1 -1
  158. package/dist/esm/node_modules/tslib/tslib.es6.js +13 -1
  159. package/dist/esm/node_modules/tslib/tslib.es6.js.map +1 -1
  160. package/dist/esm/stories/{UploadButton.stories.d.ts → AttachmentButton.stories.d.ts} +1 -0
  161. package/dist/{cjs/stories/Select.stories.d.ts → esm/stories/PeriodInput.stories.d.ts} +1 -1
  162. package/dist/esm/stories/{Avatar.stories.d.ts → ResourceAvatar.stories.d.ts} +0 -0
  163. package/dist/esm/stories/ResourceForm.stories.d.ts +1 -0
  164. package/dist/{cjs/stories/FormSection.stories.d.ts → esm/stories/ResourceInput.stories.d.ts} +2 -2
  165. package/dist/esm/stories/SearchControl.stories.d.ts +1 -0
  166. package/dist/esm/styles.css +70 -1053
  167. package/dist/esm/utils/outcomes.d.ts +1 -0
  168. package/dist/esm/utils/outcomes.js +5 -1
  169. package/dist/esm/utils/outcomes.js.map +1 -1
  170. package/package.json +27 -19
  171. package/dist/cjs/Autocomplete.d.ts +0 -20
  172. package/dist/cjs/Avatar.d.ts +0 -12
  173. package/dist/cjs/Button.d.ts +0 -15
  174. package/dist/cjs/Checkbox.d.ts +0 -12
  175. package/dist/cjs/Dialog.d.ts +0 -10
  176. package/dist/cjs/Header.d.ts +0 -12
  177. package/dist/cjs/HeaderSearchInput.d.ts +0 -10
  178. package/dist/cjs/Input.d.ts +0 -22
  179. package/dist/cjs/InputRow.d.ts +0 -7
  180. package/dist/cjs/Loading.d.ts +0 -3
  181. package/dist/cjs/MenuItem.d.ts +0 -9
  182. package/dist/cjs/MenuSeparator.d.ts +0 -3
  183. package/dist/cjs/Popup.d.ts +0 -14
  184. package/dist/cjs/Select.d.ts +0 -16
  185. package/dist/cjs/SubMenu.d.ts +0 -7
  186. package/dist/cjs/TextArea.d.ts +0 -18
  187. package/dist/cjs/UploadButton.d.ts +0 -7
  188. package/dist/cjs/stories/Autocomplete.stories.d.ts +0 -9
  189. package/dist/cjs/stories/Button.stories.d.ts +0 -9
  190. package/dist/cjs/stories/Header.stories.d.ts +0 -8
  191. package/dist/cjs/stories/Loading.stories.d.ts +0 -5
  192. package/dist/esm/Autocomplete.d.ts +0 -20
  193. package/dist/esm/Autocomplete.js +0 -281
  194. package/dist/esm/Autocomplete.js.map +0 -1
  195. package/dist/esm/Avatar.d.ts +0 -12
  196. package/dist/esm/Avatar.js +0 -24
  197. package/dist/esm/Avatar.js.map +0 -1
  198. package/dist/esm/Button.d.ts +0 -15
  199. package/dist/esm/Button.js +0 -13
  200. package/dist/esm/Button.js.map +0 -1
  201. package/dist/esm/Checkbox.d.ts +0 -12
  202. package/dist/esm/Checkbox.js +0 -13
  203. package/dist/esm/Checkbox.js.map +0 -1
  204. package/dist/esm/Dialog.d.ts +0 -10
  205. package/dist/esm/Dialog.js +0 -43
  206. package/dist/esm/Dialog.js.map +0 -1
  207. package/dist/esm/Header.d.ts +0 -12
  208. package/dist/esm/Header.js +0 -99
  209. package/dist/esm/Header.js.map +0 -1
  210. package/dist/esm/HeaderSearchInput.d.ts +0 -10
  211. package/dist/esm/HeaderSearchInput.js +0 -181
  212. package/dist/esm/HeaderSearchInput.js.map +0 -1
  213. package/dist/esm/Input.d.ts +0 -22
  214. package/dist/esm/Input.js +0 -26
  215. package/dist/esm/Input.js.map +0 -1
  216. package/dist/esm/InputRow.d.ts +0 -7
  217. package/dist/esm/InputRow.js +0 -8
  218. package/dist/esm/InputRow.js.map +0 -1
  219. package/dist/esm/Loading.d.ts +0 -3
  220. package/dist/esm/Loading.js +0 -11
  221. package/dist/esm/Loading.js.map +0 -1
  222. package/dist/esm/MenuItem.d.ts +0 -9
  223. package/dist/esm/MenuItem.js +0 -8
  224. package/dist/esm/MenuItem.js.map +0 -1
  225. package/dist/esm/MenuSeparator.d.ts +0 -3
  226. package/dist/esm/MenuSeparator.js +0 -8
  227. package/dist/esm/MenuSeparator.js.map +0 -1
  228. package/dist/esm/Popup.d.ts +0 -14
  229. package/dist/esm/Popup.js +0 -78
  230. package/dist/esm/Popup.js.map +0 -1
  231. package/dist/esm/Select.d.ts +0 -16
  232. package/dist/esm/Select.js +0 -16
  233. package/dist/esm/Select.js.map +0 -1
  234. package/dist/esm/SubMenu.d.ts +0 -7
  235. package/dist/esm/SubMenu.js +0 -38
  236. package/dist/esm/SubMenu.js.map +0 -1
  237. package/dist/esm/TextArea.d.ts +0 -18
  238. package/dist/esm/TextArea.js +0 -16
  239. package/dist/esm/TextArea.js.map +0 -1
  240. package/dist/esm/UploadButton.d.ts +0 -7
  241. package/dist/esm/UploadButton.js.map +0 -1
  242. package/dist/esm/stories/Autocomplete.stories.d.ts +0 -9
  243. package/dist/esm/stories/Button.stories.d.ts +0 -9
  244. package/dist/esm/stories/Dialog.stories.d.ts +0 -5
  245. package/dist/esm/stories/FormSection.stories.d.ts +0 -6
  246. package/dist/esm/stories/Header.stories.d.ts +0 -8
  247. package/dist/esm/stories/Input.stories.d.ts +0 -6
  248. package/dist/esm/stories/Loading.stories.d.ts +0 -5
  249. package/dist/esm/stories/Select.stories.d.ts +0 -6
@@ -1,29 +1,30 @@
1
- import React from 'react';
2
- import { Autocomplete } from './Autocomplete.js';
3
- import { CodingDisplay } from './CodingDisplay.js';
4
- import { useMedplum } from './MedplumProvider.js';
1
+ import React, { useState } from 'react';
2
+ import { ValueSetAutocomplete } from './ValueSetAutocomplete.js';
5
3
 
6
4
  function CodingInput(props) {
7
- const medplum = useMedplum();
8
- let defaultValue = undefined;
9
- if (props.defaultValue) {
10
- defaultValue = [props.defaultValue];
5
+ const [value, setValue] = useState(props.defaultValue);
6
+ function handleChange(newValue) {
7
+ const newConcept = valueSetElementToCoding(newValue);
8
+ setValue(newConcept);
9
+ if (props.onChange) {
10
+ props.onChange(newConcept);
11
+ }
11
12
  }
12
- return (React.createElement(Autocomplete, { loadOptions: (input) => {
13
- var _a;
14
- const system = (_a = props.property.binding) === null || _a === void 0 ? void 0 : _a.valueSet;
15
- return medplum.searchValueSet(system, input).then((valueSet) => {
16
- return valueSet.expansion.contains.map((e) => ({
17
- system: e.system,
18
- code: e.code,
19
- display: e.display,
20
- }));
21
- });
22
- }, buildUnstructured: (str) => ({ code: str }), getId: (item) => item.code, getDisplay: (item) => React.createElement(CodingDisplay, { value: item }), name: props.name, defaultValue: defaultValue, loadOnFocus: true, onChange: (values) => {
23
- if (props.onChange) {
24
- props.onChange(values[0]);
25
- }
26
- } }));
13
+ return (React.createElement(ValueSetAutocomplete, { property: props.property, name: props.name, placeholder: props.placeholder, defaultValue: value && codingToValueSetElement(value), onChange: handleChange }));
14
+ }
15
+ function codingToValueSetElement(coding) {
16
+ return {
17
+ system: coding.system,
18
+ code: coding.code,
19
+ display: coding.display,
20
+ };
21
+ }
22
+ function valueSetElementToCoding(element) {
23
+ return {
24
+ system: element.system,
25
+ code: element.code,
26
+ display: element.display,
27
+ };
27
28
  }
28
29
 
29
30
  export { CodingInput };
@@ -1 +1 @@
1
- {"version":3,"file":"CodingInput.js","sources":["../../src/CodingInput.tsx"],"sourcesContent":["import { Coding, ElementDefinition, ValueSet, ValueSetExpansion, ValueSetExpansionContains } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { Autocomplete } from './Autocomplete';\nimport { CodingDisplay } from './CodingDisplay';\nimport { useMedplum } from './MedplumProvider';\n\nexport interface CodingInputProps {\n property: ElementDefinition;\n name: string;\n defaultValue?: Coding;\n onChange?: (value: Coding) => void;\n}\n\nexport function CodingInput(props: CodingInputProps): JSX.Element {\n const medplum = useMedplum();\n\n let defaultValue = undefined;\n if (props.defaultValue) {\n defaultValue = [props.defaultValue];\n }\n\n return (\n <Autocomplete\n loadOptions={(input: string): Promise<Coding[]> => {\n const system = props.property.binding?.valueSet as string;\n return medplum.searchValueSet(system, input).then((valueSet: ValueSet) => {\n return ((valueSet.expansion as ValueSetExpansion).contains as ValueSetExpansionContains[]).map(\n (e) =>\n ({\n system: e.system,\n code: e.code,\n display: e.display,\n } as Coding)\n );\n });\n }}\n buildUnstructured={(str: string) => ({ code: str })}\n getId={(item: Coding) => item.code as string}\n getDisplay={(item: Coding) => <CodingDisplay value={item} />}\n name={props.name}\n defaultValue={defaultValue}\n loadOnFocus={true}\n onChange={(values: Coding[]) => {\n if (props.onChange) {\n props.onChange(values[0]);\n }\n }}\n />\n );\n}\n"],"names":[],"mappings":";;;;;AAaM,SAAU,WAAW,CAAC,KAAuB,EAAA;AACjD,IAAA,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAE7B,IAAI,YAAY,GAAG,SAAS,CAAC;IAC7B,IAAI,KAAK,CAAC,YAAY,EAAE;AACtB,QAAA,YAAY,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;AACrC,KAAA;IAED,QACE,oBAAC,YAAY,EAAA,EACX,WAAW,EAAE,CAAC,KAAa,KAAuB;;YAChD,MAAM,MAAM,GAAG,CAAA,EAAA,GAAA,KAAK,CAAC,QAAQ,CAAC,OAAO,MAAE,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,QAAkB,CAAC;AAC1D,YAAA,OAAO,OAAO,CAAC,cAAc,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,QAAkB,KAAI;AACvE,gBAAA,OAAS,QAAQ,CAAC,SAA+B,CAAC,QAAwC,CAAC,GAAG,CAC5F,CAAC,CAAC,MACC;oBACC,MAAM,EAAE,CAAC,CAAC,MAAM;oBAChB,IAAI,EAAE,CAAC,CAAC,IAAI;oBACZ,OAAO,EAAE,CAAC,CAAC,OAAO;AACR,iBAAA,CAAA,CACf,CAAC;AACJ,aAAC,CAAC,CAAC;AACL,SAAC,EACD,iBAAiB,EAAE,CAAC,GAAW,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,EACnD,KAAK,EAAE,CAAC,IAAY,KAAK,IAAI,CAAC,IAAc,EAC5C,UAAU,EAAE,CAAC,IAAY,KAAK,KAAC,CAAA,aAAA,CAAA,aAAa,EAAC,EAAA,KAAK,EAAE,IAAI,EAAI,CAAA,EAC5D,IAAI,EAAE,KAAK,CAAC,IAAI,EAChB,YAAY,EAAE,YAAY,EAC1B,WAAW,EAAE,IAAI,EACjB,QAAQ,EAAE,CAAC,MAAgB,KAAI;YAC7B,IAAI,KAAK,CAAC,QAAQ,EAAE;gBAClB,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;AAC3B,aAAA;SACF,EAAA,CACD,EACF;AACJ;;;;"}
1
+ {"version":3,"file":"CodingInput.js","sources":["../../src/CodingInput.tsx"],"sourcesContent":["import { Coding, ElementDefinition, ValueSetExpansionContains } from '@medplum/fhirtypes';\nimport React, { useState } from 'react';\nimport { ValueSetAutocomplete } from './ValueSetAutocomplete';\n\nexport interface CodingInputProps {\n property: ElementDefinition;\n name: string;\n placeholder?: string;\n defaultValue?: Coding;\n onChange?: (value: Coding) => void;\n}\n\nexport function CodingInput(props: CodingInputProps): JSX.Element {\n const [value, setValue] = useState<Coding | undefined>(props.defaultValue);\n\n function handleChange(newValue: ValueSetExpansionContains): void {\n const newConcept = valueSetElementToCoding(newValue);\n setValue(newConcept);\n if (props.onChange) {\n props.onChange(newConcept);\n }\n }\n\n return (\n <ValueSetAutocomplete\n property={props.property}\n name={props.name}\n placeholder={props.placeholder}\n defaultValue={value && codingToValueSetElement(value)}\n onChange={handleChange}\n />\n );\n}\n\nfunction codingToValueSetElement(coding: Coding): ValueSetExpansionContains {\n return {\n system: coding.system,\n code: coding.code,\n display: coding.display,\n };\n}\n\nfunction valueSetElementToCoding(element: ValueSetExpansionContains): Coding {\n return {\n system: element.system,\n code: element.code,\n display: element.display,\n };\n}\n"],"names":[],"mappings":";;;AAYM,SAAU,WAAW,CAAC,KAAuB,EAAA;AACjD,IAAA,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAqB,KAAK,CAAC,YAAY,CAAC,CAAC;IAE3E,SAAS,YAAY,CAAC,QAAmC,EAAA;AACvD,QAAA,MAAM,UAAU,GAAG,uBAAuB,CAAC,QAAQ,CAAC,CAAC;QACrD,QAAQ,CAAC,UAAU,CAAC,CAAC;QACrB,IAAI,KAAK,CAAC,QAAQ,EAAE;AAClB,YAAA,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;AAC5B,SAAA;KACF;AAED,IAAA,QACE,KAAC,CAAA,aAAA,CAAA,oBAAoB,EACnB,EAAA,QAAQ,EAAE,KAAK,CAAC,QAAQ,EACxB,IAAI,EAAE,KAAK,CAAC,IAAI,EAChB,WAAW,EAAE,KAAK,CAAC,WAAW,EAC9B,YAAY,EAAE,KAAK,IAAI,uBAAuB,CAAC,KAAK,CAAC,EACrD,QAAQ,EAAE,YAAY,EAAA,CACtB,EACF;AACJ,CAAC;AAED,SAAS,uBAAuB,CAAC,MAAc,EAAA;IAC7C,OAAO;QACL,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,OAAO,EAAE,MAAM,CAAC,OAAO;KACxB,CAAC;AACJ,CAAC;AAED,SAAS,uBAAuB,CAAC,OAAkC,EAAA;IACjE,OAAO;QACL,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,OAAO,EAAE,OAAO,CAAC,OAAO;KACzB,CAAC;AACJ;;;;"}
@@ -1,7 +1,6 @@
1
+ import { Group, TextInput } from '@mantine/core';
1
2
  import React, { useState, useRef } from 'react';
2
3
  import { ContactPointInput } from './ContactPointInput.js';
3
- import { Input } from './Input.js';
4
- import { InputRow } from './InputRow.js';
5
4
 
6
5
  function ContactDetailInput(props) {
7
6
  var _a;
@@ -28,8 +27,8 @@ function ContactDetailInput(props) {
28
27
  }
29
28
  setContactDetailWrapper(newValue);
30
29
  }
31
- return (React.createElement(InputRow, null,
32
- React.createElement(Input, { name: props.name + '-name', placeholder: "Name", style: { width: 180 }, defaultValue: contactPoint === null || contactPoint === void 0 ? void 0 : contactPoint.name, onChange: setName }),
30
+ return (React.createElement(Group, { spacing: "xs", grow: true, noWrap: true },
31
+ React.createElement(TextInput, { "data-testid": props.name + '-name', name: props.name + '-name', placeholder: "Name", style: { width: 180 }, defaultValue: contactPoint === null || contactPoint === void 0 ? void 0 : contactPoint.name, onChange: (e) => setName(e.currentTarget.value) }),
33
32
  React.createElement(ContactPointInput, { name: props.name + '-telecom', defaultValue: (_a = contactPoint === null || contactPoint === void 0 ? void 0 : contactPoint.telecom) === null || _a === void 0 ? void 0 : _a[0], onChange: setTelecom })));
34
33
  }
35
34
 
@@ -1 +1 @@
1
- {"version":3,"file":"ContactDetailInput.js","sources":["../../src/ContactDetailInput.tsx"],"sourcesContent":["import { ContactDetail, ContactPoint } from '@medplum/fhirtypes';\nimport React, { useRef, useState } from 'react';\nimport { ContactPointInput } from './ContactPointInput';\nimport { Input } from './Input';\nimport { InputRow } from './InputRow';\n\nexport interface ContactDetailInputProps {\n name: string;\n defaultValue?: ContactDetail;\n onChange?: (value: ContactDetail) => void;\n}\n\nexport function ContactDetailInput(props: ContactDetailInputProps): JSX.Element {\n const [contactPoint, setContactDetail] = useState(props.defaultValue);\n\n const ref = useRef<ContactDetail>();\n ref.current = contactPoint;\n\n function setContactDetailWrapper(newValue: ContactDetail): void {\n setContactDetail(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n function setName(name: string): void {\n const newValue: ContactDetail = { ...ref.current, name };\n if (!name) {\n delete newValue.name;\n }\n setContactDetailWrapper(newValue);\n }\n\n function setTelecom(telecom: ContactPoint | undefined): void {\n const newValue: ContactDetail = { ...ref.current, telecom: telecom && [telecom] };\n if (!telecom) {\n delete newValue.telecom;\n }\n setContactDetailWrapper(newValue);\n }\n\n return (\n <InputRow>\n <Input\n name={props.name + '-name'}\n placeholder=\"Name\"\n style={{ width: 180 }}\n defaultValue={contactPoint?.name}\n onChange={setName}\n />\n <ContactPointInput\n name={props.name + '-telecom'}\n defaultValue={contactPoint?.telecom?.[0]}\n onChange={setTelecom}\n />\n </InputRow>\n );\n}\n"],"names":[],"mappings":";;;;;AAYM,SAAU,kBAAkB,CAAC,KAA8B,EAAA;;AAC/D,IAAA,MAAM,CAAC,YAAY,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;AAEtE,IAAA,MAAM,GAAG,GAAG,MAAM,EAAiB,CAAC;AACpC,IAAA,GAAG,CAAC,OAAO,GAAG,YAAY,CAAC;IAE3B,SAAS,uBAAuB,CAAC,QAAuB,EAAA;QACtD,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QAC3B,IAAI,KAAK,CAAC,QAAQ,EAAE;AAClB,YAAA,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AAC1B,SAAA;KACF;IAED,SAAS,OAAO,CAAC,IAAY,EAAA;QAC3B,MAAM,QAAQ,mCAAuB,GAAG,CAAC,OAAO,CAAE,EAAA,EAAA,IAAI,GAAE,CAAC;QACzD,IAAI,CAAC,IAAI,EAAE;YACT,OAAO,QAAQ,CAAC,IAAI,CAAC;AACtB,SAAA;QACD,uBAAuB,CAAC,QAAQ,CAAC,CAAC;KACnC;IAED,SAAS,UAAU,CAAC,OAAiC,EAAA;AACnD,QAAA,MAAM,QAAQ,GAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EAAuB,GAAG,CAAC,OAAO,CAAE,EAAA,EAAA,OAAO,EAAE,OAAO,IAAI,CAAC,OAAO,CAAC,GAAE,CAAC;QAClF,IAAI,CAAC,OAAO,EAAE;YACZ,OAAO,QAAQ,CAAC,OAAO,CAAC;AACzB,SAAA;QACD,uBAAuB,CAAC,QAAQ,CAAC,CAAC;KACnC;IAED,QACE,oBAAC,QAAQ,EAAA,IAAA;AACP,QAAA,KAAA,CAAA,aAAA,CAAC,KAAK,EAAA,EACJ,IAAI,EAAE,KAAK,CAAC,IAAI,GAAG,OAAO,EAC1B,WAAW,EAAC,MAAM,EAClB,KAAK,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,EACrB,YAAY,EAAE,YAAY,KAAZ,IAAA,IAAA,YAAY,KAAZ,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,YAAY,CAAE,IAAI,EAChC,QAAQ,EAAE,OAAO,EACjB,CAAA;AACF,QAAA,KAAA,CAAA,aAAA,CAAC,iBAAiB,EAAA,EAChB,IAAI,EAAE,KAAK,CAAC,IAAI,GAAG,UAAU,EAC7B,YAAY,EAAE,MAAA,YAAY,KAAA,IAAA,IAAZ,YAAY,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAZ,YAAY,CAAE,OAAO,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAG,CAAC,CAAC,EACxC,QAAQ,EAAE,UAAU,EACpB,CAAA,CACO,EACX;AACJ;;;;"}
1
+ {"version":3,"file":"ContactDetailInput.js","sources":["../../src/ContactDetailInput.tsx"],"sourcesContent":["import { Group, TextInput } from '@mantine/core';\nimport { ContactDetail, ContactPoint } from '@medplum/fhirtypes';\nimport React, { useRef, useState } from 'react';\nimport { ContactPointInput } from './ContactPointInput';\n\nexport interface ContactDetailInputProps {\n name: string;\n defaultValue?: ContactDetail;\n onChange?: (value: ContactDetail) => void;\n}\n\nexport function ContactDetailInput(props: ContactDetailInputProps): JSX.Element {\n const [contactPoint, setContactDetail] = useState(props.defaultValue);\n\n const ref = useRef<ContactDetail>();\n ref.current = contactPoint;\n\n function setContactDetailWrapper(newValue: ContactDetail): void {\n setContactDetail(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n function setName(name: string): void {\n const newValue: ContactDetail = { ...ref.current, name };\n if (!name) {\n delete newValue.name;\n }\n setContactDetailWrapper(newValue);\n }\n\n function setTelecom(telecom: ContactPoint | undefined): void {\n const newValue: ContactDetail = { ...ref.current, telecom: telecom && [telecom] };\n if (!telecom) {\n delete newValue.telecom;\n }\n setContactDetailWrapper(newValue);\n }\n\n return (\n <Group spacing=\"xs\" grow noWrap>\n <TextInput\n data-testid={props.name + '-name'}\n name={props.name + '-name'}\n placeholder=\"Name\"\n style={{ width: 180 }}\n defaultValue={contactPoint?.name}\n onChange={(e) => setName(e.currentTarget.value)}\n />\n <ContactPointInput\n name={props.name + '-telecom'}\n defaultValue={contactPoint?.telecom?.[0]}\n onChange={setTelecom}\n />\n </Group>\n );\n}\n"],"names":[],"mappings":";;;;AAWM,SAAU,kBAAkB,CAAC,KAA8B,EAAA;;AAC/D,IAAA,MAAM,CAAC,YAAY,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;AAEtE,IAAA,MAAM,GAAG,GAAG,MAAM,EAAiB,CAAC;AACpC,IAAA,GAAG,CAAC,OAAO,GAAG,YAAY,CAAC;IAE3B,SAAS,uBAAuB,CAAC,QAAuB,EAAA;QACtD,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QAC3B,IAAI,KAAK,CAAC,QAAQ,EAAE;AAClB,YAAA,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AAC1B,SAAA;KACF;IAED,SAAS,OAAO,CAAC,IAAY,EAAA;QAC3B,MAAM,QAAQ,mCAAuB,GAAG,CAAC,OAAO,CAAE,EAAA,EAAA,IAAI,GAAE,CAAC;QACzD,IAAI,CAAC,IAAI,EAAE;YACT,OAAO,QAAQ,CAAC,IAAI,CAAC;AACtB,SAAA;QACD,uBAAuB,CAAC,QAAQ,CAAC,CAAC;KACnC;IAED,SAAS,UAAU,CAAC,OAAiC,EAAA;AACnD,QAAA,MAAM,QAAQ,GAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EAAuB,GAAG,CAAC,OAAO,CAAE,EAAA,EAAA,OAAO,EAAE,OAAO,IAAI,CAAC,OAAO,CAAC,GAAE,CAAC;QAClF,IAAI,CAAC,OAAO,EAAE;YACZ,OAAO,QAAQ,CAAC,OAAO,CAAC;AACzB,SAAA;QACD,uBAAuB,CAAC,QAAQ,CAAC,CAAC;KACnC;IAED,QACE,KAAC,CAAA,aAAA,CAAA,KAAK,EAAC,EAAA,OAAO,EAAC,IAAI,EAAC,IAAI,EAAA,IAAA,EAAC,MAAM,EAAA,IAAA,EAAA;QAC7B,KAAC,CAAA,aAAA,CAAA,SAAS,EACK,EAAA,aAAA,EAAA,KAAK,CAAC,IAAI,GAAG,OAAO,EACjC,IAAI,EAAE,KAAK,CAAC,IAAI,GAAG,OAAO,EAC1B,WAAW,EAAC,MAAM,EAClB,KAAK,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,EACrB,YAAY,EAAE,YAAY,KAAZ,IAAA,IAAA,YAAY,uBAAZ,YAAY,CAAE,IAAI,EAChC,QAAQ,EAAE,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,EAC/C,CAAA;AACF,QAAA,KAAA,CAAA,aAAA,CAAC,iBAAiB,EAAA,EAChB,IAAI,EAAE,KAAK,CAAC,IAAI,GAAG,UAAU,EAC7B,YAAY,EAAE,MAAA,YAAY,KAAA,IAAA,IAAZ,YAAY,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAZ,YAAY,CAAE,OAAO,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAG,CAAC,CAAC,EACxC,QAAQ,EAAE,UAAU,EACpB,CAAA,CACI,EACR;AACJ;;;;"}
@@ -1,7 +1,5 @@
1
+ import { Group, NativeSelect, TextInput } from '@mantine/core';
1
2
  import React, { useState, useRef } from 'react';
2
- import { Input } from './Input.js';
3
- import { InputRow } from './InputRow.js';
4
- import { Select } from './Select.js';
5
3
 
6
4
  function ContactPointInput(props) {
7
5
  const [contactPoint, setContactPoint] = useState(props.defaultValue);
@@ -37,24 +35,10 @@ function ContactPointInput(props) {
37
35
  }
38
36
  setContactPointWrapper(newValue);
39
37
  }
40
- return (React.createElement(InputRow, null,
41
- React.createElement(Select, { defaultValue: contactPoint === null || contactPoint === void 0 ? void 0 : contactPoint.system, onChange: setSystem, testid: "system" },
42
- React.createElement("option", null),
43
- React.createElement("option", null, "email"),
44
- React.createElement("option", null, "fax"),
45
- React.createElement("option", null, "pager"),
46
- React.createElement("option", null, "phone"),
47
- React.createElement("option", null, "other"),
48
- React.createElement("option", null, "sms"),
49
- React.createElement("option", null, "url")),
50
- React.createElement(Select, { defaultValue: contactPoint === null || contactPoint === void 0 ? void 0 : contactPoint.use, onChange: setUse, testid: "use" },
51
- React.createElement("option", null),
52
- React.createElement("option", null, "home"),
53
- React.createElement("option", null, "mobile"),
54
- React.createElement("option", null, "old"),
55
- React.createElement("option", null, "temp"),
56
- React.createElement("option", null, "work")),
57
- React.createElement(Input, { placeholder: "Value", defaultValue: contactPoint === null || contactPoint === void 0 ? void 0 : contactPoint.value, onChange: setValue })));
38
+ return (React.createElement(Group, { spacing: "xs", grow: true, noWrap: true },
39
+ React.createElement(NativeSelect, { "data-testid": "system", defaultValue: contactPoint === null || contactPoint === void 0 ? void 0 : contactPoint.system, onChange: (e) => setSystem(e.currentTarget.value), data: ['', 'email', 'phone', 'fax', 'pager', 'sms', 'other'] }),
40
+ React.createElement(NativeSelect, { "data-testid": "use", defaultValue: contactPoint === null || contactPoint === void 0 ? void 0 : contactPoint.use, onChange: (e) => setUse(e.currentTarget.value), data: ['', 'home', 'work', 'temp', 'old', 'mobile'] }),
41
+ React.createElement(TextInput, { placeholder: "Value", defaultValue: contactPoint === null || contactPoint === void 0 ? void 0 : contactPoint.value, onChange: (e) => setValue(e.currentTarget.value) })));
58
42
  }
59
43
 
60
44
  export { ContactPointInput };
@@ -1 +1 @@
1
- {"version":3,"file":"ContactPointInput.js","sources":["../../src/ContactPointInput.tsx"],"sourcesContent":["import { ContactPoint } from '@medplum/fhirtypes';\nimport React, { useRef, useState } from 'react';\nimport { Input } from './Input';\nimport { InputRow } from './InputRow';\nimport { Select } from './Select';\n\nexport interface ContactPointInputProps {\n name: string;\n defaultValue?: ContactPoint;\n onChange?: (value: ContactPoint | undefined) => void;\n}\n\nexport function ContactPointInput(props: ContactPointInputProps): JSX.Element {\n const [contactPoint, setContactPoint] = useState(props.defaultValue);\n\n const ref = useRef<ContactPoint>();\n ref.current = contactPoint;\n\n function setContactPointWrapper(newValue: ContactPoint | undefined): void {\n if (newValue && Object.keys(newValue).length === 0) {\n newValue = undefined;\n }\n setContactPoint(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n function setSystem(system: 'url' | 'phone' | 'fax' | 'email' | 'pager' | 'sms' | 'other'): void {\n const newValue: ContactPoint = { ...ref.current, system };\n if (!system) {\n delete newValue.system;\n }\n setContactPointWrapper(newValue);\n }\n\n function setUse(use: 'home' | 'work' | 'temp' | 'old' | 'mobile'): void {\n const newValue: ContactPoint = { ...ref.current, use };\n if (!use) {\n delete newValue.use;\n }\n setContactPointWrapper(newValue);\n }\n\n function setValue(value: string): void {\n const newValue: ContactPoint = { ...ref.current, value };\n if (!value) {\n delete newValue.value;\n }\n setContactPointWrapper(newValue);\n }\n\n return (\n <InputRow>\n <Select defaultValue={contactPoint?.system} onChange={setSystem as (system: string) => void} testid=\"system\">\n <option></option>\n <option>email</option>\n <option>fax</option>\n <option>pager</option>\n <option>phone</option>\n <option>other</option>\n <option>sms</option>\n <option>url</option>\n </Select>\n <Select defaultValue={contactPoint?.use} onChange={setUse as (use: string) => void} testid=\"use\">\n <option></option>\n <option>home</option>\n <option>mobile</option>\n <option>old</option>\n <option>temp</option>\n <option>work</option>\n </Select>\n <Input placeholder=\"Value\" defaultValue={contactPoint?.value} onChange={setValue} />\n </InputRow>\n );\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ContactPointInput.js","sources":["../../src/ContactPointInput.tsx"],"sourcesContent":["import { Group, NativeSelect, TextInput } from '@mantine/core';\nimport { ContactPoint } from '@medplum/fhirtypes';\nimport React, { useRef, useState } from 'react';\n\nexport interface ContactPointInputProps {\n name: string;\n defaultValue?: ContactPoint;\n onChange?: (value: ContactPoint | undefined) => void;\n}\n\nexport function ContactPointInput(props: ContactPointInputProps): JSX.Element {\n const [contactPoint, setContactPoint] = useState(props.defaultValue);\n\n const ref = useRef<ContactPoint>();\n ref.current = contactPoint;\n\n function setContactPointWrapper(newValue: ContactPoint | undefined): void {\n if (newValue && Object.keys(newValue).length === 0) {\n newValue = undefined;\n }\n setContactPoint(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n function setSystem(system: 'url' | 'phone' | 'fax' | 'email' | 'pager' | 'sms' | 'other'): void {\n const newValue: ContactPoint = { ...ref.current, system };\n if (!system) {\n delete newValue.system;\n }\n setContactPointWrapper(newValue);\n }\n\n function setUse(use: 'home' | 'work' | 'temp' | 'old' | 'mobile'): void {\n const newValue: ContactPoint = { ...ref.current, use };\n if (!use) {\n delete newValue.use;\n }\n setContactPointWrapper(newValue);\n }\n\n function setValue(value: string): void {\n const newValue: ContactPoint = { ...ref.current, value };\n if (!value) {\n delete newValue.value;\n }\n setContactPointWrapper(newValue);\n }\n\n return (\n <Group spacing=\"xs\" grow noWrap>\n <NativeSelect\n data-testid=\"system\"\n defaultValue={contactPoint?.system}\n onChange={(e) =>\n setSystem(e.currentTarget.value as 'url' | 'phone' | 'fax' | 'email' | 'pager' | 'sms' | 'other')\n }\n data={['', 'email', 'phone', 'fax', 'pager', 'sms', 'other']}\n />\n <NativeSelect\n data-testid=\"use\"\n defaultValue={contactPoint?.use}\n onChange={(e) => setUse(e.currentTarget.value as 'home' | 'work' | 'temp' | 'old' | 'mobile')}\n data={['', 'home', 'work', 'temp', 'old', 'mobile']}\n />\n <TextInput\n placeholder=\"Value\"\n defaultValue={contactPoint?.value}\n onChange={(e) => setValue(e.currentTarget.value)}\n />\n </Group>\n );\n}\n"],"names":[],"mappings":"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"}
@@ -1,5 +1,12 @@
1
1
  /// <reference types="react" />
2
- import { InputProps } from './Input';
2
+ import { OperationOutcome } from '@medplum/fhirtypes';
3
+ export interface DateTimeInputProps {
4
+ name?: string;
5
+ placeholder?: string;
6
+ defaultValue?: string;
7
+ outcome?: OperationOutcome;
8
+ onChange?: (value: string) => void;
9
+ }
3
10
  /**
4
11
  * The DateTimeInput component is a wrapper around the HTML5 input type="datetime-local".
5
12
  * The main purpose is to reconcile time zones.
@@ -8,7 +15,7 @@ import { InputProps } from './Input';
8
15
  * @param props The Input props.
9
16
  * @returns The JSX element to render.
10
17
  */
11
- export declare function DateTimeInput(props: InputProps): JSX.Element;
18
+ export declare function DateTimeInput(props: DateTimeInputProps): JSX.Element;
12
19
  /**
13
20
  * Converts an ISO-8601 date/time string to a local date/time string.
14
21
  * @param isoString The ISO-8601 date/time string to convert.
@@ -1,6 +1,7 @@
1
+ import { TextInput } from '@mantine/core';
1
2
  import { isValidDate } from '@medplum/core';
2
3
  import React from 'react';
3
- import { Input } from './Input.js';
4
+ import { getErrorsForInput } from './utils/outcomes.js';
4
5
 
5
6
  /**
6
7
  * The DateTimeInput component is a wrapper around the HTML5 input type="datetime-local".
@@ -11,11 +12,12 @@ import { Input } from './Input.js';
11
12
  * @returns The JSX element to render.
12
13
  */
13
14
  function DateTimeInput(props) {
14
- return (React.createElement(Input, Object.assign({}, props, { type: "datetime-local", defaultValue: convertIsoToLocal(props.defaultValue), onChange: (newValue) => {
15
+ return (React.createElement(TextInput, { id: props.name, name: props.name, "data-testid": props.name, placeholder: props.placeholder, type: getInputType(), defaultValue: convertIsoToLocal(props.defaultValue), error: getErrorsForInput(props.outcome, props.name), onChange: (e) => {
15
16
  if (props.onChange) {
17
+ const newValue = e.currentTarget.value;
16
18
  props.onChange(convertLocalToIso(newValue));
17
19
  }
18
- } })));
20
+ } }));
19
21
  }
20
22
  /**
21
23
  * Converts an ISO-8601 date/time string to a local date/time string.
@@ -55,6 +57,14 @@ function convertLocalToIso(localString) {
55
57
  }
56
58
  return date.toISOString();
57
59
  }
60
+ /**
61
+ * Returns the input type for the requested type.
62
+ * JSDOM does not support many of the valid <input> type attributes.
63
+ * For example, it won't fire change events for <input type="datetime-local">.
64
+ */
65
+ function getInputType() {
66
+ return 'datetime-local';
67
+ }
58
68
 
59
69
  export { DateTimeInput, convertIsoToLocal, convertLocalToIso };
60
70
  //# sourceMappingURL=DateTimeInput.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"DateTimeInput.js","sources":["../../src/DateTimeInput.tsx"],"sourcesContent":["import { isValidDate } from '@medplum/core';\nimport React from 'react';\nimport { Input, InputProps } from './Input';\n\n/**\n * The DateTimeInput component is a wrapper around the HTML5 input type=\"datetime-local\".\n * The main purpose is to reconcile time zones.\n * Most of our date/time values are in ISO-8601, which includes a time zone offset.\n * The datetime-local input does not support the time zone offset.\n * @param props The Input props.\n * @returns The JSX element to render.\n */\nexport function DateTimeInput(props: InputProps): JSX.Element {\n return (\n <Input\n {...props}\n type=\"datetime-local\"\n defaultValue={convertIsoToLocal(props.defaultValue as string | undefined)}\n onChange={(newValue: string) => {\n if (props.onChange) {\n props.onChange(convertLocalToIso(newValue));\n }\n }}\n />\n );\n}\n\n/**\n * Converts an ISO-8601 date/time string to a local date/time string.\n * @param isoString The ISO-8601 date/time string to convert.\n * @returns The local date/time string.\n */\nexport function convertIsoToLocal(isoString: string | undefined): string {\n if (!isoString) {\n return '';\n }\n\n // Convert the ISO-8601 date to a local datetime-local value.\n // See: https://developer.mozilla.org/en-US/docs/Web/HTML/Date_and_time_formats#local_date_and_time_strings\n // See: https://stackoverflow.com/a/60368477\n const date = new Date(isoString);\n if (!isValidDate(date)) {\n // If the input string was malformed, return an empty string.\n return '';\n }\n\n return date.toLocaleDateString('sv') + 'T' + date.toLocaleTimeString('sv');\n}\n\n/**\n * Converts a local date/time string to an ISO-8601 date/time string.\n * @param localString The local date/time string to convert.\n * @returns The ISO-8601 date/time string.\n */\nexport function convertLocalToIso(localString: string | undefined): string {\n if (!localString) {\n return '';\n }\n\n // Try to parse the local string as a Date\n // JavaScript's Date() constructor defaults to the local time zone.\n // The Date() constructor will throw if the value is malformed.\n const date = new Date(localString);\n if (!isValidDate(date)) {\n // If the input string was malformed, return an empty string.\n return '';\n }\n\n return date.toISOString();\n}\n"],"names":[],"mappings":";;;;AAIA;;;;;;;AAOG;AACG,SAAU,aAAa,CAAC,KAAiB,EAAA;IAC7C,QACE,KAAC,CAAA,aAAA,CAAA,KAAK,EACA,MAAA,CAAA,MAAA,CAAA,EAAA,EAAA,KAAK,IACT,IAAI,EAAC,gBAAgB,EACrB,YAAY,EAAE,iBAAiB,CAAC,KAAK,CAAC,YAAkC,CAAC,EACzE,QAAQ,EAAE,CAAC,QAAgB,KAAI;YAC7B,IAAI,KAAK,CAAC,QAAQ,EAAE;gBAClB,KAAK,CAAC,QAAQ,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC;AAC7C,aAAA;SACF,EAAA,CAAA,CACD,EACF;AACJ,CAAC;AAED;;;;AAIG;AACG,SAAU,iBAAiB,CAAC,SAA6B,EAAA;IAC7D,IAAI,CAAC,SAAS,EAAE;AACd,QAAA,OAAO,EAAE,CAAC;AACX,KAAA;;;;AAKD,IAAA,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC;AACjC,IAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE;;AAEtB,QAAA,OAAO,EAAE,CAAC;AACX,KAAA;AAED,IAAA,OAAO,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;AAC7E,CAAC;AAED;;;;AAIG;AACG,SAAU,iBAAiB,CAAC,WAA+B,EAAA;IAC/D,IAAI,CAAC,WAAW,EAAE;AAChB,QAAA,OAAO,EAAE,CAAC;AACX,KAAA;;;;AAKD,IAAA,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,WAAW,CAAC,CAAC;AACnC,IAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE;;AAEtB,QAAA,OAAO,EAAE,CAAC;AACX,KAAA;AAED,IAAA,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;AAC5B;;;;"}
1
+ {"version":3,"file":"DateTimeInput.js","sources":["../../src/DateTimeInput.tsx"],"sourcesContent":["import { TextInput } from '@mantine/core';\nimport { isValidDate } from '@medplum/core';\nimport { OperationOutcome } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { getErrorsForInput } from './utils/outcomes';\n\nexport interface DateTimeInputProps {\n name?: string;\n placeholder?: string;\n defaultValue?: string;\n outcome?: OperationOutcome;\n onChange?: (value: string) => void;\n}\n\n/**\n * The DateTimeInput component is a wrapper around the HTML5 input type=\"datetime-local\".\n * The main purpose is to reconcile time zones.\n * Most of our date/time values are in ISO-8601, which includes a time zone offset.\n * The datetime-local input does not support the time zone offset.\n * @param props The Input props.\n * @returns The JSX element to render.\n */\nexport function DateTimeInput(props: DateTimeInputProps): JSX.Element {\n return (\n <TextInput\n id={props.name}\n name={props.name}\n data-testid={props.name}\n placeholder={props.placeholder}\n type={getInputType()}\n defaultValue={convertIsoToLocal(props.defaultValue)}\n error={getErrorsForInput(props.outcome, props.name)}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => {\n if (props.onChange) {\n const newValue = e.currentTarget.value;\n props.onChange(convertLocalToIso(newValue));\n }\n }}\n />\n );\n}\n\n/**\n * Converts an ISO-8601 date/time string to a local date/time string.\n * @param isoString The ISO-8601 date/time string to convert.\n * @returns The local date/time string.\n */\nexport function convertIsoToLocal(isoString: string | undefined): string {\n if (!isoString) {\n return '';\n }\n\n // Convert the ISO-8601 date to a local datetime-local value.\n // See: https://developer.mozilla.org/en-US/docs/Web/HTML/Date_and_time_formats#local_date_and_time_strings\n // See: https://stackoverflow.com/a/60368477\n const date = new Date(isoString);\n if (!isValidDate(date)) {\n // If the input string was malformed, return an empty string.\n return '';\n }\n\n return date.toLocaleDateString('sv') + 'T' + date.toLocaleTimeString('sv');\n}\n\n/**\n * Converts a local date/time string to an ISO-8601 date/time string.\n * @param localString The local date/time string to convert.\n * @returns The ISO-8601 date/time string.\n */\nexport function convertLocalToIso(localString: string | undefined): string {\n if (!localString) {\n return '';\n }\n\n // Try to parse the local string as a Date\n // JavaScript's Date() constructor defaults to the local time zone.\n // The Date() constructor will throw if the value is malformed.\n const date = new Date(localString);\n if (!isValidDate(date)) {\n // If the input string was malformed, return an empty string.\n return '';\n }\n\n return date.toISOString();\n}\n\n/**\n * Returns the input type for the requested type.\n * JSDOM does not support many of the valid <input> type attributes.\n * For example, it won't fire change events for <input type=\"datetime-local\">.\n */\nfunction getInputType(): string {\n return process.env.NODE_ENV === 'test' ? 'text' : 'datetime-local';\n}\n"],"names":[],"mappings":";;;;;AAcA;;;;;;;AAOG;AACG,SAAU,aAAa,CAAC,KAAyB,EAAA;IACrD,QACE,KAAC,CAAA,aAAA,CAAA,SAAS,EACR,EAAA,EAAE,EAAE,KAAK,CAAC,IAAI,EACd,IAAI,EAAE,KAAK,CAAC,IAAI,EACH,aAAA,EAAA,KAAK,CAAC,IAAI,EACvB,WAAW,EAAE,KAAK,CAAC,WAAW,EAC9B,IAAI,EAAE,YAAY,EAAE,EACpB,YAAY,EAAE,iBAAiB,CAAC,KAAK,CAAC,YAAY,CAAC,EACnD,KAAK,EAAE,iBAAiB,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,EACnD,QAAQ,EAAE,CAAC,CAAsC,KAAI;YACnD,IAAI,KAAK,CAAC,QAAQ,EAAE;AAClB,gBAAA,MAAM,QAAQ,GAAG,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC;gBACvC,KAAK,CAAC,QAAQ,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC;AAC7C,aAAA;SACF,EAAA,CACD,EACF;AACJ,CAAC;AAED;;;;AAIG;AACG,SAAU,iBAAiB,CAAC,SAA6B,EAAA;IAC7D,IAAI,CAAC,SAAS,EAAE;AACd,QAAA,OAAO,EAAE,CAAC;AACX,KAAA;;;;AAKD,IAAA,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC;AACjC,IAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE;;AAEtB,QAAA,OAAO,EAAE,CAAC;AACX,KAAA;AAED,IAAA,OAAO,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;AAC7E,CAAC;AAED;;;;AAIG;AACG,SAAU,iBAAiB,CAAC,WAA+B,EAAA;IAC/D,IAAI,CAAC,WAAW,EAAE;AAChB,QAAA,OAAO,EAAE,CAAC;AACX,KAAA;;;;AAKD,IAAA,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,WAAW,CAAC,CAAC;AACnC,IAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE;;AAEtB,QAAA,OAAO,EAAE,CAAC;AACX,KAAA;AAED,IAAA,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;AAC5B,CAAC;AAED;;;;AAIG;AACH,SAAS,YAAY,GAAA;AACnB,IAAA,OAAkD,gBAAgB,CAAC;AACrE;;;;"}
@@ -63,7 +63,11 @@ function ObservationRow(props) {
63
63
  if (!observation) {
64
64
  return null;
65
65
  }
66
- return (React.createElement("tr", null,
66
+ let className = undefined;
67
+ if (isCritical(observation)) {
68
+ className = 'medplum-critical';
69
+ }
70
+ return (React.createElement("tr", { className: className },
67
71
  React.createElement("td", null,
68
72
  React.createElement(MedplumLink, { to: observation },
69
73
  React.createElement(CodeableConceptDisplay, { value: observation.code }))),
@@ -96,6 +100,17 @@ function ReferenceRangeDisplay(props) {
96
100
  }
97
101
  return React.createElement(RangeDisplay, { value: range });
98
102
  }
103
+ /**
104
+ * Returns true if the observation is critical.
105
+ * See: https://www.hl7.org/fhir/valueset-observation-interpretation.html
106
+ * @param observation The FHIR observation.
107
+ * @returns True if the FHIR observation is a critical value.
108
+ */
109
+ function isCritical(observation) {
110
+ var _a, _b, _c, _d;
111
+ const code = (_d = (_c = (_b = (_a = observation.interpretation) === null || _a === void 0 ? void 0 : _a[0]) === null || _b === void 0 ? void 0 : _b.coding) === null || _c === void 0 ? void 0 : _c[0]) === null || _d === void 0 ? void 0 : _d.code;
112
+ return code === 'AA' || code === 'LL' || code === 'HH';
113
+ }
99
114
 
100
115
  export { DiagnosticReportDisplay, ObservationTable };
101
116
  //# sourceMappingURL=DiagnosticReportDisplay.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"DiagnosticReportDisplay.js","sources":["../../src/DiagnosticReportDisplay.tsx"],"sourcesContent":["import { capitalize, formatDateTime } from '@medplum/core';\nimport {\n DiagnosticReport,\n Observation,\n ObservationComponent,\n ObservationReferenceRange,\n Reference,\n} from '@medplum/fhirtypes';\nimport React from 'react';\nimport { CodeableConceptDisplay } from './CodeableConceptDisplay';\nimport './DiagnosticReportDisplay.css';\nimport { MedplumLink } from './MedplumLink';\nimport { QuantityDisplay } from './QuantityDisplay';\nimport { RangeDisplay } from './RangeDisplay';\nimport { ResourceBadge } from './ResourceBadge';\nimport './Table.css';\nimport { useResource } from './useResource';\n\nexport interface DiagnosticReportDisplayProps {\n value?: DiagnosticReport | Reference<DiagnosticReport>;\n}\n\nexport function DiagnosticReportDisplay(props: DiagnosticReportDisplayProps): JSX.Element | null {\n const diagnosticReport = useResource(props.value);\n const specimen = useResource(diagnosticReport?.specimen?.[0]);\n if (!diagnosticReport) {\n return null;\n }\n\n let textContent = '';\n\n if (diagnosticReport.presentedForm && diagnosticReport.presentedForm.length > 0) {\n const pf = diagnosticReport.presentedForm[0];\n if (pf.contentType?.startsWith('text/plain') && pf.data) {\n textContent = window.atob(pf.data);\n }\n }\n\n if (specimen?.note) {\n for (const note of specimen.note) {\n textContent += note.text + '\\n\\n';\n }\n }\n\n return (\n <div className=\"medplum-diagnostic-report\">\n <h1>Diagnostic Report</h1>\n <div className=\"medplum-diagnostic-report-header\">\n {diagnosticReport.subject && (\n <dl>\n <dt>Subject</dt>\n <dd>\n <ResourceBadge value={diagnosticReport.subject} link={true} />\n </dd>\n </dl>\n )}\n {diagnosticReport.resultsInterpreter &&\n diagnosticReport.resultsInterpreter.map((interpreter) => (\n <dl key={interpreter.reference}>\n <dt>Interpreter</dt>\n <dd>\n <ResourceBadge value={interpreter} link={true} />\n </dd>\n </dl>\n ))}\n {diagnosticReport.issued && (\n <dl>\n <dt>Issued</dt>\n <dd>{formatDateTime(diagnosticReport.issued)}</dd>\n </dl>\n )}\n {diagnosticReport.status && (\n <dl>\n <dt>Status</dt>\n <dd>{capitalize(diagnosticReport.status)}</dd>\n </dl>\n )}\n </div>\n {diagnosticReport.result && <ObservationTable value={diagnosticReport.result} />}\n {textContent && <pre>{textContent.trim()}</pre>}\n </div>\n );\n}\n\nexport interface ObservationTableProps {\n value?: Observation[] | Reference<Observation>[];\n}\n\nexport function ObservationTable(props: ObservationTableProps): JSX.Element {\n return (\n <table className=\"medplum-table\">\n <thead>\n <tr>\n <th>Test</th>\n <th>Value</th>\n <th>Reference Range</th>\n <th>Interpretation</th>\n </tr>\n </thead>\n <tbody>\n {props.value?.map((observation, index) => (\n <ObservationRow key={'obs-' + index} value={observation} />\n ))}\n </tbody>\n </table>\n );\n}\n\ninterface ObservationRowProps {\n value: Observation | Reference<Observation>;\n}\n\nfunction ObservationRow(props: ObservationRowProps): JSX.Element | null {\n const observation = useResource(props.value);\n if (!observation) {\n return null;\n }\n\n return (\n <tr>\n <td>\n <MedplumLink to={observation}>\n <CodeableConceptDisplay value={observation.code} />\n </MedplumLink>\n </td>\n <td>\n <ObservationValueDisplay value={observation} />\n </td>\n <td>\n <ReferenceRangeDisplay value={observation.referenceRange} />\n </td>\n <td>\n {observation.interpretation && observation.interpretation.length > 0 && (\n <CodeableConceptDisplay value={observation.interpretation[0]} />\n )}\n </td>\n </tr>\n );\n}\n\ninterface ObservationValueDisplayProps {\n value?: Observation | ObservationComponent;\n}\n\nfunction ObservationValueDisplay(props: ObservationValueDisplayProps): JSX.Element | null {\n const obs = props.value;\n\n if (obs?.valueQuantity) {\n return <QuantityDisplay value={props.value?.valueQuantity} />;\n }\n\n if (obs?.valueString) {\n return <>{obs.valueString}</>;\n }\n\n if (obs && 'component' in obs && obs?.component) {\n return (\n <>\n {obs.component\n .map<React.ReactNode>((component: ObservationComponent, index: number) => (\n <ObservationValueDisplay key={`obs-${index}`} value={component} />\n ))\n .reduce((prev, curr) => [prev, ' / ', curr])}\n </>\n );\n }\n\n return null;\n}\n\ninterface ReferenceRangeProps {\n value?: ObservationReferenceRange[];\n}\n\nfunction ReferenceRangeDisplay(props: ReferenceRangeProps): JSX.Element | null {\n const range = props.value && props.value.length > 0 && props.value[0];\n if (!range) {\n return null;\n }\n return <RangeDisplay value={range} />;\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"DiagnosticReportDisplay.js","sources":["../../src/DiagnosticReportDisplay.tsx"],"sourcesContent":["import { capitalize, formatDateTime } from '@medplum/core';\nimport {\n DiagnosticReport,\n Observation,\n ObservationComponent,\n ObservationReferenceRange,\n Reference,\n} from '@medplum/fhirtypes';\nimport React from 'react';\nimport { CodeableConceptDisplay } from './CodeableConceptDisplay';\nimport './DiagnosticReportDisplay.css';\nimport { MedplumLink } from './MedplumLink';\nimport { QuantityDisplay } from './QuantityDisplay';\nimport { RangeDisplay } from './RangeDisplay';\nimport { ResourceBadge } from './ResourceBadge';\nimport './Table.css';\nimport { useResource } from './useResource';\n\nexport interface DiagnosticReportDisplayProps {\n value?: DiagnosticReport | Reference<DiagnosticReport>;\n}\n\nexport function DiagnosticReportDisplay(props: DiagnosticReportDisplayProps): JSX.Element | null {\n const diagnosticReport = useResource(props.value);\n const specimen = useResource(diagnosticReport?.specimen?.[0]);\n if (!diagnosticReport) {\n return null;\n }\n\n let textContent = '';\n\n if (diagnosticReport.presentedForm && diagnosticReport.presentedForm.length > 0) {\n const pf = diagnosticReport.presentedForm[0];\n if (pf.contentType?.startsWith('text/plain') && pf.data) {\n textContent = window.atob(pf.data);\n }\n }\n\n if (specimen?.note) {\n for (const note of specimen.note) {\n textContent += note.text + '\\n\\n';\n }\n }\n\n return (\n <div className=\"medplum-diagnostic-report\">\n <h1>Diagnostic Report</h1>\n <div className=\"medplum-diagnostic-report-header\">\n {diagnosticReport.subject && (\n <dl>\n <dt>Subject</dt>\n <dd>\n <ResourceBadge value={diagnosticReport.subject} link={true} />\n </dd>\n </dl>\n )}\n {diagnosticReport.resultsInterpreter &&\n diagnosticReport.resultsInterpreter.map((interpreter) => (\n <dl key={interpreter.reference}>\n <dt>Interpreter</dt>\n <dd>\n <ResourceBadge value={interpreter} link={true} />\n </dd>\n </dl>\n ))}\n {diagnosticReport.issued && (\n <dl>\n <dt>Issued</dt>\n <dd>{formatDateTime(diagnosticReport.issued)}</dd>\n </dl>\n )}\n {diagnosticReport.status && (\n <dl>\n <dt>Status</dt>\n <dd>{capitalize(diagnosticReport.status)}</dd>\n </dl>\n )}\n </div>\n {diagnosticReport.result && <ObservationTable value={diagnosticReport.result} />}\n {textContent && <pre>{textContent.trim()}</pre>}\n </div>\n );\n}\n\nexport interface ObservationTableProps {\n value?: Observation[] | Reference<Observation>[];\n}\n\nexport function ObservationTable(props: ObservationTableProps): JSX.Element {\n return (\n <table className=\"medplum-table\">\n <thead>\n <tr>\n <th>Test</th>\n <th>Value</th>\n <th>Reference Range</th>\n <th>Interpretation</th>\n </tr>\n </thead>\n <tbody>\n {props.value?.map((observation, index) => (\n <ObservationRow key={'obs-' + index} value={observation} />\n ))}\n </tbody>\n </table>\n );\n}\n\ninterface ObservationRowProps {\n value: Observation | Reference<Observation>;\n}\n\nfunction ObservationRow(props: ObservationRowProps): JSX.Element | null {\n const observation = useResource(props.value);\n if (!observation) {\n return null;\n }\n\n let className = undefined;\n if (isCritical(observation)) {\n className = 'medplum-critical';\n }\n\n return (\n <tr className={className}>\n <td>\n <MedplumLink to={observation}>\n <CodeableConceptDisplay value={observation.code} />\n </MedplumLink>\n </td>\n <td>\n <ObservationValueDisplay value={observation} />\n </td>\n <td>\n <ReferenceRangeDisplay value={observation.referenceRange} />\n </td>\n <td>\n {observation.interpretation && observation.interpretation.length > 0 && (\n <CodeableConceptDisplay value={observation.interpretation[0]} />\n )}\n </td>\n </tr>\n );\n}\n\ninterface ObservationValueDisplayProps {\n value?: Observation | ObservationComponent;\n}\n\nfunction ObservationValueDisplay(props: ObservationValueDisplayProps): JSX.Element | null {\n const obs = props.value;\n\n if (obs?.valueQuantity) {\n return <QuantityDisplay value={props.value?.valueQuantity} />;\n }\n\n if (obs?.valueString) {\n return <>{obs.valueString}</>;\n }\n\n if (obs && 'component' in obs && obs?.component) {\n return (\n <>\n {obs.component\n .map<React.ReactNode>((component: ObservationComponent, index: number) => (\n <ObservationValueDisplay key={`obs-${index}`} value={component} />\n ))\n .reduce((prev, curr) => [prev, ' / ', curr])}\n </>\n );\n }\n\n return null;\n}\n\ninterface ReferenceRangeProps {\n value?: ObservationReferenceRange[];\n}\n\nfunction ReferenceRangeDisplay(props: ReferenceRangeProps): JSX.Element | null {\n const range = props.value && props.value.length > 0 && props.value[0];\n if (!range) {\n return null;\n }\n return <RangeDisplay value={range} />;\n}\n\n/**\n * Returns true if the observation is critical.\n * See: https://www.hl7.org/fhir/valueset-observation-interpretation.html\n * @param observation The FHIR observation.\n * @returns True if the FHIR observation is a critical value.\n */\nfunction isCritical(observation: Observation): boolean {\n const code = observation.interpretation?.[0]?.coding?.[0]?.code;\n return code === 'AA' || code === 'LL' || code === 'HH';\n}\n"],"names":[],"mappings":"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"}
@@ -28,6 +28,7 @@ function EncounterTimeline(props) {
28
28
  ],
29
29
  }), createCommunication: (resource, sender, text) => ({
30
30
  resourceType: 'Communication',
31
+ status: 'completed',
31
32
  encounter: createReference(resource),
32
33
  subject: resource.subject,
33
34
  sender: createReference(sender),
@@ -35,6 +36,7 @@ function EncounterTimeline(props) {
35
36
  payload: [{ contentString: text }],
36
37
  }), createMedia: (resource, operator, content) => ({
37
38
  resourceType: 'Media',
39
+ status: 'completed',
38
40
  encounter: createReference(resource),
39
41
  subject: resource.subject,
40
42
  operator: createReference(operator),
@@ -1 +1 @@
1
- {"version":3,"file":"EncounterTimeline.js","sources":["../../src/EncounterTimeline.tsx"],"sourcesContent":["import { createReference, getReferenceString, ProfileResource } from '@medplum/core';\nimport { Attachment, Encounter, Reference, Resource } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { ResourceTimeline } from './ResourceTimeline';\n\nexport interface EncounterTimelineProps {\n encounter: Encounter | Reference<Encounter>;\n}\n\nexport function EncounterTimeline(props: EncounterTimelineProps): JSX.Element {\n return (\n <ResourceTimeline\n value={props.encounter}\n buildSearchRequests={(resource: Resource) => ({\n resourceType: 'Bundle',\n type: 'batch',\n entry: [\n {\n request: {\n method: 'GET',\n url: `${getReferenceString(resource)}/_history`,\n },\n },\n {\n request: {\n method: 'GET',\n url: `Communication?encounter=${getReferenceString(resource)}`,\n },\n },\n {\n request: {\n method: 'GET',\n url: `Media?encounter=${getReferenceString(resource)}`,\n },\n },\n ],\n })}\n createCommunication={(resource: Encounter, sender: ProfileResource, text: string) => ({\n resourceType: 'Communication',\n encounter: createReference(resource),\n subject: resource.subject,\n sender: createReference(sender),\n sent: new Date().toISOString(),\n payload: [{ contentString: text }],\n })}\n createMedia={(resource: Encounter, operator: ProfileResource, content: Attachment) => ({\n resourceType: 'Media',\n encounter: createReference(resource),\n subject: resource.subject,\n operator: createReference(operator),\n issued: new Date().toISOString(),\n content,\n })}\n />\n );\n}\n"],"names":[],"mappings":";;;;AASM,SAAU,iBAAiB,CAAC,KAA6B,EAAA;AAC7D,IAAA,QACE,KAAC,CAAA,aAAA,CAAA,gBAAgB,EACf,EAAA,KAAK,EAAE,KAAK,CAAC,SAAS,EACtB,mBAAmB,EAAE,CAAC,QAAkB,MAAM;AAC5C,YAAA,YAAY,EAAE,QAAQ;AACtB,YAAA,IAAI,EAAE,OAAO;AACb,YAAA,KAAK,EAAE;AACL,gBAAA;AACE,oBAAA,OAAO,EAAE;AACP,wBAAA,MAAM,EAAE,KAAK;AACb,wBAAA,GAAG,EAAE,CAAG,EAAA,kBAAkB,CAAC,QAAQ,CAAC,CAAW,SAAA,CAAA;AAChD,qBAAA;AACF,iBAAA;AACD,gBAAA;AACE,oBAAA,OAAO,EAAE;AACP,wBAAA,MAAM,EAAE,KAAK;AACb,wBAAA,GAAG,EAAE,CAA2B,wBAAA,EAAA,kBAAkB,CAAC,QAAQ,CAAC,CAAE,CAAA;AAC/D,qBAAA;AACF,iBAAA;AACD,gBAAA;AACE,oBAAA,OAAO,EAAE;AACP,wBAAA,MAAM,EAAE,KAAK;AACb,wBAAA,GAAG,EAAE,CAAmB,gBAAA,EAAA,kBAAkB,CAAC,QAAQ,CAAC,CAAE,CAAA;AACvD,qBAAA;AACF,iBAAA;AACF,aAAA;AACF,SAAA,CAAC,EACF,mBAAmB,EAAE,CAAC,QAAmB,EAAE,MAAuB,EAAE,IAAY,MAAM;AACpF,YAAA,YAAY,EAAE,eAAe;AAC7B,YAAA,SAAS,EAAE,eAAe,CAAC,QAAQ,CAAC;YACpC,OAAO,EAAE,QAAQ,CAAC,OAAO;AACzB,YAAA,MAAM,EAAE,eAAe,CAAC,MAAM,CAAC;AAC/B,YAAA,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;AAC9B,YAAA,OAAO,EAAE,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;AACnC,SAAA,CAAC,EACF,WAAW,EAAE,CAAC,QAAmB,EAAE,QAAyB,EAAE,OAAmB,MAAM;AACrF,YAAA,YAAY,EAAE,OAAO;AACrB,YAAA,SAAS,EAAE,eAAe,CAAC,QAAQ,CAAC;YACpC,OAAO,EAAE,QAAQ,CAAC,OAAO;AACzB,YAAA,QAAQ,EAAE,eAAe,CAAC,QAAQ,CAAC;AACnC,YAAA,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YAChC,OAAO;SACR,CAAC,EAAA,CACF,EACF;AACJ;;;;"}
1
+ {"version":3,"file":"EncounterTimeline.js","sources":["../../src/EncounterTimeline.tsx"],"sourcesContent":["import { createReference, getReferenceString, ProfileResource } from '@medplum/core';\nimport { Attachment, Encounter, Reference, Resource } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { ResourceTimeline } from './ResourceTimeline';\n\nexport interface EncounterTimelineProps {\n encounter: Encounter | Reference<Encounter>;\n}\n\nexport function EncounterTimeline(props: EncounterTimelineProps): JSX.Element {\n return (\n <ResourceTimeline\n value={props.encounter}\n buildSearchRequests={(resource: Resource) => ({\n resourceType: 'Bundle',\n type: 'batch',\n entry: [\n {\n request: {\n method: 'GET',\n url: `${getReferenceString(resource)}/_history`,\n },\n },\n {\n request: {\n method: 'GET',\n url: `Communication?encounter=${getReferenceString(resource)}`,\n },\n },\n {\n request: {\n method: 'GET',\n url: `Media?encounter=${getReferenceString(resource)}`,\n },\n },\n ],\n })}\n createCommunication={(resource: Encounter, sender: ProfileResource, text: string) => ({\n resourceType: 'Communication',\n status: 'completed',\n encounter: createReference(resource),\n subject: resource.subject,\n sender: createReference(sender),\n sent: new Date().toISOString(),\n payload: [{ contentString: text }],\n })}\n createMedia={(resource: Encounter, operator: ProfileResource, content: Attachment) => ({\n resourceType: 'Media',\n status: 'completed',\n encounter: createReference(resource),\n subject: resource.subject,\n operator: createReference(operator),\n issued: new Date().toISOString(),\n content,\n })}\n />\n );\n}\n"],"names":[],"mappings":";;;;AASM,SAAU,iBAAiB,CAAC,KAA6B,EAAA;AAC7D,IAAA,QACE,KAAC,CAAA,aAAA,CAAA,gBAAgB,EACf,EAAA,KAAK,EAAE,KAAK,CAAC,SAAS,EACtB,mBAAmB,EAAE,CAAC,QAAkB,MAAM;AAC5C,YAAA,YAAY,EAAE,QAAQ;AACtB,YAAA,IAAI,EAAE,OAAO;AACb,YAAA,KAAK,EAAE;AACL,gBAAA;AACE,oBAAA,OAAO,EAAE;AACP,wBAAA,MAAM,EAAE,KAAK;AACb,wBAAA,GAAG,EAAE,CAAG,EAAA,kBAAkB,CAAC,QAAQ,CAAC,CAAW,SAAA,CAAA;AAChD,qBAAA;AACF,iBAAA;AACD,gBAAA;AACE,oBAAA,OAAO,EAAE;AACP,wBAAA,MAAM,EAAE,KAAK;AACb,wBAAA,GAAG,EAAE,CAA2B,wBAAA,EAAA,kBAAkB,CAAC,QAAQ,CAAC,CAAE,CAAA;AAC/D,qBAAA;AACF,iBAAA;AACD,gBAAA;AACE,oBAAA,OAAO,EAAE;AACP,wBAAA,MAAM,EAAE,KAAK;AACb,wBAAA,GAAG,EAAE,CAAmB,gBAAA,EAAA,kBAAkB,CAAC,QAAQ,CAAC,CAAE,CAAA;AACvD,qBAAA;AACF,iBAAA;AACF,aAAA;AACF,SAAA,CAAC,EACF,mBAAmB,EAAE,CAAC,QAAmB,EAAE,MAAuB,EAAE,IAAY,MAAM;AACpF,YAAA,YAAY,EAAE,eAAe;AAC7B,YAAA,MAAM,EAAE,WAAW;AACnB,YAAA,SAAS,EAAE,eAAe,CAAC,QAAQ,CAAC;YACpC,OAAO,EAAE,QAAQ,CAAC,OAAO;AACzB,YAAA,MAAM,EAAE,eAAe,CAAC,MAAM,CAAC;AAC/B,YAAA,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;AAC9B,YAAA,OAAO,EAAE,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;AACnC,SAAA,CAAC,EACF,WAAW,EAAE,CAAC,QAAmB,EAAE,QAAyB,EAAE,OAAmB,MAAM;AACrF,YAAA,YAAY,EAAE,OAAO;AACrB,YAAA,MAAM,EAAE,WAAW;AACnB,YAAA,SAAS,EAAE,eAAe,CAAC,QAAQ,CAAC;YACpC,OAAO,EAAE,QAAQ,CAAC,OAAO;AACzB,YAAA,QAAQ,EAAE,eAAe,CAAC,QAAQ,CAAC;AACnC,YAAA,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YAChC,OAAO;SACR,CAAC,EAAA,CACF,EACF;AACJ;;;;"}
@@ -1,9 +1,9 @@
1
+ import { JsonInput } from '@mantine/core';
1
2
  import { stringify } from '@medplum/core';
2
3
  import React from 'react';
3
- import { TextArea } from './TextArea.js';
4
4
 
5
5
  function ExtensionInput(props) {
6
- return (React.createElement(TextArea, { testid: "extension-input", name: props.name, defaultValue: stringify(props.defaultValue), monospace: true, onChange: (newValue) => {
6
+ return (React.createElement(JsonInput, { id: props.name, name: props.name, "data-testid": "extension-input", defaultValue: stringify(props.defaultValue), onChange: (newValue) => {
7
7
  if (props.onChange) {
8
8
  props.onChange(JSON.parse(newValue));
9
9
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ExtensionInput.js","sources":["../../src/ExtensionInput.tsx"],"sourcesContent":["import { stringify } from '@medplum/core';\nimport { Extension } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { TextArea } from './TextArea';\n\nexport interface ExtensionInputProps {\n name: string;\n defaultValue?: Extension;\n onChange?: (value: Extension) => void;\n}\n\nexport function ExtensionInput(props: ExtensionInputProps): JSX.Element {\n return (\n <TextArea\n testid=\"extension-input\"\n name={props.name}\n defaultValue={stringify(props.defaultValue)}\n monospace={true}\n onChange={(newValue: string) => {\n if (props.onChange) {\n props.onChange(JSON.parse(newValue));\n }\n }}\n />\n );\n}\n"],"names":[],"mappings":";;;;AAWM,SAAU,cAAc,CAAC,KAA0B,EAAA;AACvD,IAAA,QACE,KAAA,CAAA,aAAA,CAAC,QAAQ,EAAA,EACP,MAAM,EAAC,iBAAiB,EACxB,IAAI,EAAE,KAAK,CAAC,IAAI,EAChB,YAAY,EAAE,SAAS,CAAC,KAAK,CAAC,YAAY,CAAC,EAC3C,SAAS,EAAE,IAAI,EACf,QAAQ,EAAE,CAAC,QAAgB,KAAI;YAC7B,IAAI,KAAK,CAAC,QAAQ,EAAE;gBAClB,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;AACtC,aAAA;SACF,EAAA,CACD,EACF;AACJ;;;;"}
1
+ {"version":3,"file":"ExtensionInput.js","sources":["../../src/ExtensionInput.tsx"],"sourcesContent":["import { JsonInput } from '@mantine/core';\nimport { stringify } from '@medplum/core';\nimport { Extension } from '@medplum/fhirtypes';\nimport React from 'react';\n\nexport interface ExtensionInputProps {\n name: string;\n defaultValue?: Extension;\n onChange?: (value: Extension) => void;\n}\n\nexport function ExtensionInput(props: ExtensionInputProps): JSX.Element {\n return (\n <JsonInput\n id={props.name}\n name={props.name}\n data-testid=\"extension-input\"\n defaultValue={stringify(props.defaultValue)}\n onChange={(newValue) => {\n if (props.onChange) {\n props.onChange(JSON.parse(newValue));\n }\n }}\n />\n );\n}\n"],"names":[],"mappings":";;;;AAWM,SAAU,cAAc,CAAC,KAA0B,EAAA;AACvD,IAAA,QACE,KAAA,CAAA,aAAA,CAAC,SAAS,EAAA,EACR,EAAE,EAAE,KAAK,CAAC,IAAI,EACd,IAAI,EAAE,KAAK,CAAC,IAAI,EAAA,aAAA,EACJ,iBAAiB,EAC7B,YAAY,EAAE,SAAS,CAAC,KAAK,CAAC,YAAY,CAAC,EAC3C,QAAQ,EAAE,CAAC,QAAQ,KAAI;YACrB,IAAI,KAAK,CAAC,QAAQ,EAAE;gBAClB,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;AACtC,aAAA;SACF,EAAA,CACD,EACF;AACJ;;;;"}
@@ -1,7 +1,6 @@
1
+ import { Loader, Table, Button } from '@mantine/core';
1
2
  import React, { useState, useRef, useEffect } from 'react';
2
- import { Button } from './Button.js';
3
3
  import { FhirPathDisplay } from './FhirPathDisplay.js';
4
- import { Loading } from './Loading.js';
5
4
  import { useMedplum } from './MedplumProvider.js';
6
5
  import { SearchClickEvent } from './SearchControl.js';
7
6
  import { killEvent, isCheckboxCell } from './utils/dom.js';
@@ -92,11 +91,11 @@ function FhirPathTable(props) {
92
91
  }, [medplum, props.resourceType]);
93
92
  const typeSchema = (_a = schema === null || schema === void 0 ? void 0 : schema.types) === null || _a === void 0 ? void 0 : _a[props.resourceType];
94
93
  if (!typeSchema) {
95
- return React.createElement(Loading, null);
94
+ return React.createElement(Loader, null);
96
95
  }
97
96
  const checkboxColumn = props.checkboxesEnabled;
98
97
  return (React.createElement("div", { className: "medplum-search-control", onContextMenu: (e) => killEvent(e), "data-testid": "search-control" },
99
- React.createElement("table", null,
98
+ React.createElement(Table, null,
100
99
  React.createElement("thead", null,
101
100
  React.createElement("tr", null,
102
101
  checkboxColumn && (React.createElement("th", { className: "medplum-search-icon-cell" },
@@ -112,7 +111,7 @@ function FhirPathTable(props) {
112
111
  ((_e = (_d = response === null || response === void 0 ? void 0 : response.data) === null || _d === void 0 ? void 0 : _d.ResourceList) === null || _e === void 0 ? void 0 : _e.length) === 0 && (React.createElement("div", { "data-testid": "empty-search", className: "medplum-empty-search" }, "No results")),
113
112
  outcome && (React.createElement("div", { "data-testid": "search-error", className: "medplum-empty-search" },
114
113
  React.createElement("pre", { style: { textAlign: 'left' } }, JSON.stringify(outcome, undefined, 2)))),
115
- props.onBulk && (React.createElement(Button, { size: "small", onClick: () => props.onBulk(Object.keys(selectedRef.current)) }, "Bulk..."))));
114
+ props.onBulk && (React.createElement(Button, { onClick: () => props.onBulk(Object.keys(selectedRef.current)) }, "Bulk..."))));
116
115
  }
117
116
  const MemoizedFhirPathTable = React.memo(FhirPathTable);
118
117
 
@@ -1 +1 @@
1
- {"version":3,"file":"FhirPathTable.js","sources":["../../src/FhirPathTable.tsx"],"sourcesContent":["import { IndexedStructureDefinition, PropertyType } from '@medplum/core';\nimport { OperationOutcome, Resource } from '@medplum/fhirtypes';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { Button } from './Button';\nimport { FhirPathDisplay } from './FhirPathDisplay';\nimport { Loading } from './Loading';\nimport { useMedplum } from './MedplumProvider';\nimport { SearchClickEvent } from './SearchControl';\nimport { isCheckboxCell, killEvent } from './utils/dom';\nimport './SearchControl.css';\n\nexport interface SmartSearchField {\n readonly propertyType: PropertyType;\n readonly name: string;\n readonly fhirPath: string;\n}\n\nexport interface FhirPathTableProps {\n resourceType: string;\n query: string;\n fields: SmartSearchField[];\n checkboxesEnabled?: boolean;\n onClick?: (e: SearchClickEvent) => void;\n onAuxClick?: (e: SearchClickEvent) => void;\n onBulk?: (ids: string[]) => void;\n}\n\nexport interface SmartSearchResponse {\n data: {\n ResourceList: Resource[];\n };\n}\n\n/**\n * The FhirPathTable component represents the embeddable search table control.\n */\nexport function FhirPathTable(props: FhirPathTableProps): JSX.Element {\n const medplum = useMedplum();\n const [schema, setSchema] = useState<IndexedStructureDefinition | undefined>();\n const [outcome, setOutcome] = useState<OperationOutcome | undefined>();\n const { query, fields } = props;\n const [response, setResponse] = useState<SmartSearchResponse | undefined>();\n const [selected, setSelected] = useState<{ [id: string]: boolean }>({});\n\n const responseRef = useRef<SmartSearchResponse>();\n responseRef.current = response;\n\n const selectedRef = useRef<{ [id: string]: boolean }>({});\n selectedRef.current = selected;\n\n useEffect(() => {\n setOutcome(undefined);\n medplum.graphql(query).then(setResponse).catch(setOutcome);\n }, [medplum, query]);\n\n function handleSingleCheckboxClick(e: React.ChangeEvent, id: string): void {\n e.stopPropagation();\n\n const el = e.target as HTMLInputElement;\n const checked = el.checked;\n const newSelected = { ...selectedRef.current };\n if (checked) {\n newSelected[id] = true;\n } else {\n delete newSelected[id];\n }\n setSelected(newSelected);\n }\n\n function handleAllCheckboxClick(e: React.ChangeEvent): void {\n e.stopPropagation();\n\n const el = e.target as HTMLInputElement;\n const checked = el.checked;\n const newSelected = {} as { [id: string]: boolean };\n const resources = responseRef.current?.data?.ResourceList;\n if (checked && resources) {\n resources.forEach((resource) => {\n if (resource?.id) {\n newSelected[resource.id] = true;\n }\n });\n }\n setSelected(newSelected);\n }\n\n function isAllSelected(): boolean {\n const resources = responseRef.current?.data?.ResourceList;\n if (!resources || resources.length === 0) {\n return false;\n }\n for (const resource of resources) {\n if (resource?.id && !selectedRef.current[resource.id]) {\n return false;\n }\n }\n return true;\n }\n\n function handleRowClick(e: React.MouseEvent, resource: Resource): void {\n if (isCheckboxCell(e.target as Element)) {\n // Ignore clicks on checkboxes\n return;\n }\n\n killEvent(e);\n\n if (e.button !== 1 && props.onClick) {\n props.onClick(new SearchClickEvent(resource, e));\n }\n\n if (e.button === 1 && props.onAuxClick) {\n props.onAuxClick(new SearchClickEvent(resource, e));\n }\n }\n\n useEffect(() => {\n medplum\n .requestSchema(props.resourceType)\n .then((newSchema) => {\n // The schema could have the same object identity,\n // so need to use the spread operator to kick React re-render.\n setSchema({ ...newSchema });\n })\n .catch(console.log);\n }, [medplum, props.resourceType]);\n\n const typeSchema = schema?.types?.[props.resourceType];\n if (!typeSchema) {\n return <Loading />;\n }\n\n const checkboxColumn = props.checkboxesEnabled;\n\n return (\n <div className=\"medplum-search-control\" onContextMenu={(e) => killEvent(e)} data-testid=\"search-control\">\n <table>\n <thead>\n <tr>\n {checkboxColumn && (\n <th className=\"medplum-search-icon-cell\">\n <input\n type=\"checkbox\"\n value=\"checked\"\n aria-label=\"all-checkbox\"\n data-testid=\"all-checkbox\"\n checked={isAllSelected()}\n onChange={(e) => handleAllCheckboxClick(e)}\n />\n </th>\n )}\n {fields.map((field) => (\n <th key={field.name}>{field.name}</th>\n ))}\n </tr>\n </thead>\n <tbody>\n {response?.data?.ResourceList?.map(\n (resource) =>\n resource && (\n <tr\n key={resource.id}\n data-testid=\"search-control-row\"\n onClick={(e) => handleRowClick(e, resource)}\n onAuxClick={(e) => handleRowClick(e, resource)}\n >\n {checkboxColumn && (\n <td className=\"medplum-search-icon-cell\">\n <input\n type=\"checkbox\"\n value=\"checked\"\n data-testid=\"row-checkbox\"\n aria-label={`Checkbox for ${resource.id}`}\n checked={!!selected[resource.id as string]}\n onChange={(e) => handleSingleCheckboxClick(e, resource.id as string)}\n />\n </td>\n )}\n {fields.map((field) => {\n return (\n <td key={field.name}>\n <FhirPathDisplay propertyType={field.propertyType} path={field.fhirPath} resource={resource} />\n </td>\n );\n })}\n </tr>\n )\n )}\n </tbody>\n </table>\n {response?.data?.ResourceList?.length === 0 && (\n <div data-testid=\"empty-search\" className=\"medplum-empty-search\">\n No results\n </div>\n )}\n {outcome && (\n <div data-testid=\"search-error\" className=\"medplum-empty-search\">\n <pre style={{ textAlign: 'left' }}>{JSON.stringify(outcome, undefined, 2)}</pre>\n </div>\n )}\n {props.onBulk && (\n <Button size=\"small\" onClick={() => (props.onBulk as (ids: string[]) => any)(Object.keys(selectedRef.current))}>\n Bulk...\n </Button>\n )}\n </div>\n );\n}\n\nexport const MemoizedFhirPathTable = React.memo(FhirPathTable);\n"],"names":[],"mappings":";;;;;;;;AAiCA;;AAEG;AACG,SAAU,aAAa,CAAC,KAAyB,EAAA;;AACrD,IAAA,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,EAA0C,CAAC;IAC/E,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,EAAgC,CAAC;AACvE,IAAA,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;IAChC,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,EAAmC,CAAC;IAC5E,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAA4B,EAAE,CAAC,CAAC;AAExE,IAAA,MAAM,WAAW,GAAG,MAAM,EAAuB,CAAC;AAClD,IAAA,WAAW,CAAC,OAAO,GAAG,QAAQ,CAAC;AAE/B,IAAA,MAAM,WAAW,GAAG,MAAM,CAA4B,EAAE,CAAC,CAAC;AAC1D,IAAA,WAAW,CAAC,OAAO,GAAG,QAAQ,CAAC;IAE/B,SAAS,CAAC,MAAK;QACb,UAAU,CAAC,SAAS,CAAC,CAAC;AACtB,QAAA,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;AAC7D,KAAC,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;AAErB,IAAA,SAAS,yBAAyB,CAAC,CAAoB,EAAE,EAAU,EAAA;QACjE,CAAC,CAAC,eAAe,EAAE,CAAC;AAEpB,QAAA,MAAM,EAAE,GAAG,CAAC,CAAC,MAA0B,CAAC;AACxC,QAAA,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC;AAC3B,QAAA,MAAM,WAAW,GAAQ,MAAA,CAAA,MAAA,CAAA,EAAA,EAAA,WAAW,CAAC,OAAO,CAAE,CAAC;AAC/C,QAAA,IAAI,OAAO,EAAE;AACX,YAAA,WAAW,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC;AACxB,SAAA;AAAM,aAAA;AACL,YAAA,OAAO,WAAW,CAAC,EAAE,CAAC,CAAC;AACxB,SAAA;QACD,WAAW,CAAC,WAAW,CAAC,CAAC;KAC1B;IAED,SAAS,sBAAsB,CAAC,CAAoB,EAAA;;QAClD,CAAC,CAAC,eAAe,EAAE,CAAC;AAEpB,QAAA,MAAM,EAAE,GAAG,CAAC,CAAC,MAA0B,CAAC;AACxC,QAAA,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC;QAC3B,MAAM,WAAW,GAAG,EAA+B,CAAC;QACpD,MAAM,SAAS,GAAG,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,WAAW,CAAC,OAAO,MAAE,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,IAAI,MAAE,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,YAAY,CAAC;QAC1D,IAAI,OAAO,IAAI,SAAS,EAAE;AACxB,YAAA,SAAS,CAAC,OAAO,CAAC,CAAC,QAAQ,KAAI;AAC7B,gBAAA,IAAI,QAAQ,KAAR,IAAA,IAAA,QAAQ,uBAAR,QAAQ,CAAE,EAAE,EAAE;AAChB,oBAAA,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC;AACjC,iBAAA;AACH,aAAC,CAAC,CAAC;AACJ,SAAA;QACD,WAAW,CAAC,WAAW,CAAC,CAAC;KAC1B;AAED,IAAA,SAAS,aAAa,GAAA;;QACpB,MAAM,SAAS,GAAG,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,WAAW,CAAC,OAAO,MAAE,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,IAAI,MAAE,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,YAAY,CAAC;QAC1D,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE;AACxC,YAAA,OAAO,KAAK,CAAC;AACd,SAAA;AACD,QAAA,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE;AAChC,YAAA,IAAI,CAAA,QAAQ,KAAA,IAAA,IAAR,QAAQ,KAAR,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,QAAQ,CAAE,EAAE,KAAI,CAAC,WAAW,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE;AACrD,gBAAA,OAAO,KAAK,CAAC;AACd,aAAA;AACF,SAAA;AACD,QAAA,OAAO,IAAI,CAAC;KACb;AAED,IAAA,SAAS,cAAc,CAAC,CAAmB,EAAE,QAAkB,EAAA;AAC7D,QAAA,IAAI,cAAc,CAAC,CAAC,CAAC,MAAiB,CAAC,EAAE;;YAEvC,OAAO;AACR,SAAA;QAED,SAAS,CAAC,CAAC,CAAC,CAAC;QAEb,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE;YACnC,KAAK,CAAC,OAAO,CAAC,IAAI,gBAAgB,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC;AAClD,SAAA;QAED,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,UAAU,EAAE;YACtC,KAAK,CAAC,UAAU,CAAC,IAAI,gBAAgB,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC;AACrD,SAAA;KACF;IAED,SAAS,CAAC,MAAK;QACb,OAAO;AACJ,aAAA,aAAa,CAAC,KAAK,CAAC,YAAY,CAAC;AACjC,aAAA,IAAI,CAAC,CAAC,SAAS,KAAI;;;YAGlB,SAAS,CAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EAAM,SAAS,CAAA,CAAG,CAAC;AAC9B,SAAC,CAAC;AACD,aAAA,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;KACvB,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC;AAElC,IAAA,MAAM,UAAU,GAAG,CAAA,EAAA,GAAA,MAAM,aAAN,MAAM,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAN,MAAM,CAAE,KAAK,MAAG,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,KAAK,CAAC,YAAY,CAAC,CAAC;IACvD,IAAI,CAAC,UAAU,EAAE;QACf,OAAO,KAAA,CAAA,aAAA,CAAC,OAAO,EAAA,IAAA,CAAG,CAAC;AACpB,KAAA;AAED,IAAA,MAAM,cAAc,GAAG,KAAK,CAAC,iBAAiB,CAAC;AAE/C,IAAA,QACE,KAAK,CAAA,aAAA,CAAA,KAAA,EAAA,EAAA,SAAS,EAAC,wBAAwB,EAAC,aAAa,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,iBAAc,gBAAgB,EAAA;AACtG,QAAA,KAAA,CAAA,aAAA,CAAA,OAAA,EAAA,IAAA;AACE,YAAA,KAAA,CAAA,aAAA,CAAA,OAAA,EAAA,IAAA;AACE,gBAAA,KAAA,CAAA,aAAA,CAAA,IAAA,EAAA,IAAA;AACG,oBAAA,cAAc,KACb,KAAI,CAAA,aAAA,CAAA,IAAA,EAAA,EAAA,SAAS,EAAC,0BAA0B,EAAA;AACtC,wBAAA,KAAA,CAAA,aAAA,CAAA,OAAA,EAAA,EACE,IAAI,EAAC,UAAU,EACf,KAAK,EAAC,SAAS,EAAA,YAAA,EACJ,cAAc,EAAA,aAAA,EACb,cAAc,EAC1B,OAAO,EAAE,aAAa,EAAE,EACxB,QAAQ,EAAE,CAAC,CAAC,KAAK,sBAAsB,CAAC,CAAC,CAAC,EAAA,CAC1C,CACC,CACN;oBACA,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,MAChB,KAAI,CAAA,aAAA,CAAA,IAAA,EAAA,EAAA,GAAG,EAAE,KAAK,CAAC,IAAI,EAAA,EAAG,KAAK,CAAC,IAAI,CAAM,CACvC,CAAC,CACC,CACC;YACR,KACG,CAAA,aAAA,CAAA,OAAA,EAAA,IAAA,EAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,QAAQ,KAAR,IAAA,IAAA,QAAQ,KAAR,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,QAAQ,CAAE,IAAI,MAAE,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,YAAY,MAAE,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,GAAG,CAChC,CAAC,QAAQ,KACP,QAAQ,KACN,KACE,CAAA,aAAA,CAAA,IAAA,EAAA,EAAA,GAAG,EAAE,QAAQ,CAAC,EAAE,iBACJ,oBAAoB,EAChC,OAAO,EAAE,CAAC,CAAC,KAAK,cAAc,CAAC,CAAC,EAAE,QAAQ,CAAC,EAC3C,UAAU,EAAE,CAAC,CAAC,KAAK,cAAc,CAAC,CAAC,EAAE,QAAQ,CAAC,EAAA;AAE7C,gBAAA,cAAc,KACb,KAAI,CAAA,aAAA,CAAA,IAAA,EAAA,EAAA,SAAS,EAAC,0BAA0B,EAAA;oBACtC,KACE,CAAA,aAAA,CAAA,OAAA,EAAA,EAAA,IAAI,EAAC,UAAU,EACf,KAAK,EAAC,SAAS,iBACH,cAAc,EAAA,YAAA,EACd,gBAAgB,QAAQ,CAAC,EAAE,CAAE,CAAA,EACzC,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAY,CAAC,EAC1C,QAAQ,EAAE,CAAC,CAAC,KAAK,yBAAyB,CAAC,CAAC,EAAE,QAAQ,CAAC,EAAY,CAAC,EAAA,CACpE,CACC,CACN;AACA,gBAAA,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,KAAI;AACpB,oBAAA,QACE,KAAI,CAAA,aAAA,CAAA,IAAA,EAAA,EAAA,GAAG,EAAE,KAAK,CAAC,IAAI,EAAA;wBACjB,KAAC,CAAA,aAAA,CAAA,eAAe,IAAC,YAAY,EAAE,KAAK,CAAC,YAAY,EAAE,IAAI,EAAE,KAAK,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAI,CAAA,CAC5F,EACL;AACJ,iBAAC,CAAC,CACC,CACN,CACJ,CACK,CACF;QACP,CAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,QAAQ,KAAR,IAAA,IAAA,QAAQ,uBAAR,QAAQ,CAAE,IAAI,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAE,YAAY,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAE,MAAM,MAAK,CAAC,KACzC,KAAiB,CAAA,aAAA,CAAA,KAAA,EAAA,EAAA,aAAA,EAAA,cAAc,EAAC,SAAS,EAAC,sBAAsB,EAAA,EAAA,YAAA,CAE1D,CACP;AACA,QAAA,OAAO,KACN,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA,EAAA,aAAA,EAAiB,cAAc,EAAC,SAAS,EAAC,sBAAsB,EAAA;YAC9D,KAAK,CAAA,aAAA,CAAA,KAAA,EAAA,EAAA,KAAK,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,IAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC,CAAO,CAC5E,CACP;AACA,QAAA,KAAK,CAAC,MAAM,KACX,oBAAC,MAAM,EAAA,EAAC,IAAI,EAAC,OAAO,EAAC,OAAO,EAAE,MAAO,KAAK,CAAC,MAAiC,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,EAAA,EAAA,SAAA,CAErG,CACV,CACG,EACN;AACJ,CAAC;AAEY,MAAA,qBAAqB,GAAG,KAAK,CAAC,IAAI,CAAC,aAAa;;;;"}
1
+ {"version":3,"file":"FhirPathTable.js","sources":["../../src/FhirPathTable.tsx"],"sourcesContent":["import { Button, Loader, Table } from '@mantine/core';\nimport { IndexedStructureDefinition, PropertyType } from '@medplum/core';\nimport { OperationOutcome, Resource } from '@medplum/fhirtypes';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { FhirPathDisplay } from './FhirPathDisplay';\nimport { useMedplum } from './MedplumProvider';\nimport { SearchClickEvent } from './SearchControl';\nimport { isCheckboxCell, killEvent } from './utils/dom';\n\nimport './SearchControl.css';\n\nexport interface SmartSearchField {\n readonly propertyType: PropertyType;\n readonly name: string;\n readonly fhirPath: string;\n}\n\nexport interface FhirPathTableProps {\n resourceType: string;\n query: string;\n fields: SmartSearchField[];\n checkboxesEnabled?: boolean;\n onClick?: (e: SearchClickEvent) => void;\n onAuxClick?: (e: SearchClickEvent) => void;\n onBulk?: (ids: string[]) => void;\n}\n\nexport interface SmartSearchResponse {\n data: {\n ResourceList: Resource[];\n };\n}\n\n/**\n * The FhirPathTable component represents the embeddable search table control.\n */\nexport function FhirPathTable(props: FhirPathTableProps): JSX.Element {\n const medplum = useMedplum();\n const [schema, setSchema] = useState<IndexedStructureDefinition | undefined>();\n const [outcome, setOutcome] = useState<OperationOutcome | undefined>();\n const { query, fields } = props;\n const [response, setResponse] = useState<SmartSearchResponse | undefined>();\n const [selected, setSelected] = useState<{ [id: string]: boolean }>({});\n\n const responseRef = useRef<SmartSearchResponse>();\n responseRef.current = response;\n\n const selectedRef = useRef<{ [id: string]: boolean }>({});\n selectedRef.current = selected;\n\n useEffect(() => {\n setOutcome(undefined);\n medplum.graphql(query).then(setResponse).catch(setOutcome);\n }, [medplum, query]);\n\n function handleSingleCheckboxClick(e: React.ChangeEvent, id: string): void {\n e.stopPropagation();\n\n const el = e.target as HTMLInputElement;\n const checked = el.checked;\n const newSelected = { ...selectedRef.current };\n if (checked) {\n newSelected[id] = true;\n } else {\n delete newSelected[id];\n }\n setSelected(newSelected);\n }\n\n function handleAllCheckboxClick(e: React.ChangeEvent): void {\n e.stopPropagation();\n\n const el = e.target as HTMLInputElement;\n const checked = el.checked;\n const newSelected = {} as { [id: string]: boolean };\n const resources = responseRef.current?.data?.ResourceList;\n if (checked && resources) {\n resources.forEach((resource) => {\n if (resource?.id) {\n newSelected[resource.id] = true;\n }\n });\n }\n setSelected(newSelected);\n }\n\n function isAllSelected(): boolean {\n const resources = responseRef.current?.data?.ResourceList;\n if (!resources || resources.length === 0) {\n return false;\n }\n for (const resource of resources) {\n if (resource?.id && !selectedRef.current[resource.id]) {\n return false;\n }\n }\n return true;\n }\n\n function handleRowClick(e: React.MouseEvent, resource: Resource): void {\n if (isCheckboxCell(e.target as Element)) {\n // Ignore clicks on checkboxes\n return;\n }\n\n killEvent(e);\n\n if (e.button !== 1 && props.onClick) {\n props.onClick(new SearchClickEvent(resource, e));\n }\n\n if (e.button === 1 && props.onAuxClick) {\n props.onAuxClick(new SearchClickEvent(resource, e));\n }\n }\n\n useEffect(() => {\n medplum\n .requestSchema(props.resourceType)\n .then((newSchema) => {\n // The schema could have the same object identity,\n // so need to use the spread operator to kick React re-render.\n setSchema({ ...newSchema });\n })\n .catch(console.log);\n }, [medplum, props.resourceType]);\n\n const typeSchema = schema?.types?.[props.resourceType];\n if (!typeSchema) {\n return <Loader />;\n }\n\n const checkboxColumn = props.checkboxesEnabled;\n\n return (\n <div className=\"medplum-search-control\" onContextMenu={(e) => killEvent(e)} data-testid=\"search-control\">\n <Table>\n <thead>\n <tr>\n {checkboxColumn && (\n <th className=\"medplum-search-icon-cell\">\n <input\n type=\"checkbox\"\n value=\"checked\"\n aria-label=\"all-checkbox\"\n data-testid=\"all-checkbox\"\n checked={isAllSelected()}\n onChange={(e) => handleAllCheckboxClick(e)}\n />\n </th>\n )}\n {fields.map((field) => (\n <th key={field.name}>{field.name}</th>\n ))}\n </tr>\n </thead>\n <tbody>\n {response?.data?.ResourceList?.map(\n (resource) =>\n resource && (\n <tr\n key={resource.id}\n data-testid=\"search-control-row\"\n onClick={(e) => handleRowClick(e, resource)}\n onAuxClick={(e) => handleRowClick(e, resource)}\n >\n {checkboxColumn && (\n <td className=\"medplum-search-icon-cell\">\n <input\n type=\"checkbox\"\n value=\"checked\"\n data-testid=\"row-checkbox\"\n aria-label={`Checkbox for ${resource.id}`}\n checked={!!selected[resource.id as string]}\n onChange={(e) => handleSingleCheckboxClick(e, resource.id as string)}\n />\n </td>\n )}\n {fields.map((field) => {\n return (\n <td key={field.name}>\n <FhirPathDisplay propertyType={field.propertyType} path={field.fhirPath} resource={resource} />\n </td>\n );\n })}\n </tr>\n )\n )}\n </tbody>\n </Table>\n {response?.data?.ResourceList?.length === 0 && (\n <div data-testid=\"empty-search\" className=\"medplum-empty-search\">\n No results\n </div>\n )}\n {outcome && (\n <div data-testid=\"search-error\" className=\"medplum-empty-search\">\n <pre style={{ textAlign: 'left' }}>{JSON.stringify(outcome, undefined, 2)}</pre>\n </div>\n )}\n {props.onBulk && (\n <Button onClick={() => (props.onBulk as (ids: string[]) => any)(Object.keys(selectedRef.current))}>\n Bulk...\n </Button>\n )}\n </div>\n );\n}\n\nexport const MemoizedFhirPathTable = React.memo(FhirPathTable);\n"],"names":[],"mappings":"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"}
@@ -1,7 +1,5 @@
1
+ import { Group, NativeSelect, TextInput } from '@mantine/core';
1
2
  import React, { useState, useRef } from 'react';
2
- import { Input } from './Input.js';
3
- import { InputRow } from './InputRow.js';
4
- import { Select } from './Select.js';
5
3
 
6
4
  function HumanNameInput(props) {
7
5
  var _a, _b, _c;
@@ -29,20 +27,12 @@ function HumanNameInput(props) {
29
27
  function setSuffix(suffix) {
30
28
  setValueWrapper(Object.assign(Object.assign({}, valueRef.current), { suffix: suffix ? suffix.split(' ') : undefined }));
31
29
  }
32
- return (React.createElement(InputRow, null,
33
- React.createElement(Select, { defaultValue: value === null || value === void 0 ? void 0 : value.use, onChange: setUse, testid: "use" },
34
- React.createElement("option", null),
35
- React.createElement("option", null, "usual"),
36
- React.createElement("option", null, "official"),
37
- React.createElement("option", null, "temp"),
38
- React.createElement("option", null, "nickname"),
39
- React.createElement("option", null, "anonymous"),
40
- React.createElement("option", null, "old"),
41
- React.createElement("option", null, "maiden")),
42
- React.createElement(Input, { placeholder: "Prefix", defaultValue: (_a = value === null || value === void 0 ? void 0 : value.prefix) === null || _a === void 0 ? void 0 : _a.join(' '), onChange: setPrefix }),
43
- React.createElement(Input, { placeholder: "Given", defaultValue: (_b = value === null || value === void 0 ? void 0 : value.given) === null || _b === void 0 ? void 0 : _b.join(' '), onChange: setGiven }),
44
- React.createElement(Input, { placeholder: "Family", defaultValue: value === null || value === void 0 ? void 0 : value.family, onChange: setFamily }),
45
- React.createElement(Input, { placeholder: "Suffix", defaultValue: (_c = value === null || value === void 0 ? void 0 : value.suffix) === null || _c === void 0 ? void 0 : _c.join(' '), onChange: setSuffix })));
30
+ return (React.createElement(Group, { spacing: "xs", grow: true, noWrap: true },
31
+ React.createElement(NativeSelect, { defaultValue: value === null || value === void 0 ? void 0 : value.use, "data-testid": "use", onChange: (e) => setUse(e.currentTarget.value), data: ['', 'temp', 'old', 'usual', 'official', 'nickname', 'anonymous', 'maiden'] }),
32
+ React.createElement(TextInput, { placeholder: "Prefix", defaultValue: (_a = value === null || value === void 0 ? void 0 : value.prefix) === null || _a === void 0 ? void 0 : _a.join(' '), onChange: (e) => setPrefix(e.currentTarget.value) }),
33
+ React.createElement(TextInput, { placeholder: "Given", defaultValue: (_b = value === null || value === void 0 ? void 0 : value.given) === null || _b === void 0 ? void 0 : _b.join(' '), onChange: (e) => setGiven(e.currentTarget.value) }),
34
+ React.createElement(TextInput, { placeholder: "Family", defaultValue: value === null || value === void 0 ? void 0 : value.family, onChange: (e) => setFamily(e.currentTarget.value) }),
35
+ React.createElement(TextInput, { placeholder: "Suffix", defaultValue: (_c = value === null || value === void 0 ? void 0 : value.suffix) === null || _c === void 0 ? void 0 : _c.join(' '), onChange: (e) => setSuffix(e.currentTarget.value) })));
46
36
  }
47
37
 
48
38
  export { HumanNameInput };