@medplum/react 0.10.1 → 1.0.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 (141) hide show
  1. package/dist/cjs/AttachmentButton.d.ts +2 -0
  2. package/dist/cjs/CalendarInput.d.ts +0 -1
  3. package/dist/cjs/CheckboxFormSection.d.ts +0 -1
  4. package/dist/cjs/DescriptionList.d.ts +0 -1
  5. package/dist/cjs/DiagnosticReportDisplay.d.ts +0 -1
  6. package/dist/cjs/Document.d.ts +0 -1
  7. package/dist/cjs/FhirPathTable.d.ts +0 -1
  8. package/dist/cjs/FormSection.d.ts +0 -1
  9. package/dist/cjs/MedplumLink.d.ts +2 -4
  10. package/dist/cjs/QuestionnaireBuilder.d.ts +0 -1
  11. package/dist/cjs/QuestionnaireForm.d.ts +0 -1
  12. package/dist/cjs/RequestGroupDisplay.d.ts +0 -1
  13. package/dist/cjs/ResourceBadge.d.ts +0 -1
  14. package/dist/cjs/ResourceBlame.d.ts +0 -1
  15. package/dist/cjs/ResourceDiff.d.ts +0 -1
  16. package/dist/cjs/ResourceDiffTable.d.ts +0 -2
  17. package/dist/cjs/ResourceName.d.ts +2 -1
  18. package/dist/cjs/ResourceTimeline.d.ts +0 -1
  19. package/dist/cjs/Scheduler.d.ts +0 -1
  20. package/dist/cjs/SearchControl.d.ts +0 -1
  21. package/dist/cjs/SearchFilterEditor.d.ts +0 -1
  22. package/dist/cjs/Timeline.d.ts +0 -1
  23. package/dist/cjs/auth/AuthenticationForm.d.ts +1 -0
  24. package/dist/cjs/auth/RegisterForm.d.ts +0 -1
  25. package/dist/cjs/auth/SignInForm.d.ts +1 -1
  26. package/dist/cjs/index.js +1252 -907
  27. package/dist/cjs/index.js.map +1 -1
  28. package/dist/cjs/index.min.js +1 -1
  29. package/dist/cjs/index.min.js.map +1 -1
  30. package/dist/cjs/stories/DescriptionList.stories.d.ts +5 -0
  31. package/dist/cjs/stories/PlanDefinitionBuilder.stories.d.ts +2 -0
  32. package/dist/cjs/stories/RequestGroupDisplay.stories.d.ts +1 -0
  33. package/dist/cjs/stories/ResourceTable.stories.d.ts +4 -0
  34. package/dist/cjs/stories/covid19.d.ts +15 -0
  35. package/dist/esm/AttachmentArrayInput.js +2 -2
  36. package/dist/esm/AttachmentArrayInput.js.map +1 -1
  37. package/dist/esm/AttachmentButton.d.ts +2 -0
  38. package/dist/esm/AttachmentButton.js +4 -1
  39. package/dist/esm/AttachmentButton.js.map +1 -1
  40. package/dist/esm/BackboneElementInput.js +2 -1
  41. package/dist/esm/BackboneElementInput.js.map +1 -1
  42. package/dist/esm/CalendarInput.d.ts +0 -1
  43. package/dist/esm/CalendarInput.js +39 -2
  44. package/dist/esm/CalendarInput.js.map +1 -1
  45. package/dist/esm/CheckboxFormSection.d.ts +0 -1
  46. package/dist/esm/CheckboxFormSection.js +5 -5
  47. package/dist/esm/CheckboxFormSection.js.map +1 -1
  48. package/dist/esm/DescriptionList.d.ts +0 -1
  49. package/dist/esm/DescriptionList.js +23 -1
  50. package/dist/esm/DescriptionList.js.map +1 -1
  51. package/dist/esm/DiagnosticReportDisplay.d.ts +0 -1
  52. package/dist/esm/DiagnosticReportDisplay.js +40 -22
  53. package/dist/esm/DiagnosticReportDisplay.js.map +1 -1
  54. package/dist/esm/Document.d.ts +0 -1
  55. package/dist/esm/Document.js +7 -2
  56. package/dist/esm/Document.js.map +1 -1
  57. package/dist/esm/ErrorBoundary.js +2 -1
  58. package/dist/esm/ErrorBoundary.js.map +1 -1
  59. package/dist/esm/FhirPathTable.d.ts +0 -1
  60. package/dist/esm/FhirPathTable.js +5 -5
  61. package/dist/esm/FhirPathTable.js.map +1 -1
  62. package/dist/esm/FormSection.d.ts +0 -1
  63. package/dist/esm/FormSection.js +3 -11
  64. package/dist/esm/FormSection.js.map +1 -1
  65. package/dist/esm/MedplumLink.d.ts +2 -4
  66. package/dist/esm/MedplumLink.js +11 -8
  67. package/dist/esm/MedplumLink.js.map +1 -1
  68. package/dist/esm/PlanDefinitionBuilder.js +41 -10
  69. package/dist/esm/PlanDefinitionBuilder.js.map +1 -1
  70. package/dist/esm/QuestionnaireBuilder.d.ts +0 -1
  71. package/dist/esm/QuestionnaireBuilder.js +78 -31
  72. package/dist/esm/QuestionnaireBuilder.js.map +1 -1
  73. package/dist/esm/QuestionnaireForm.d.ts +0 -1
  74. package/dist/esm/QuestionnaireForm.js +26 -16
  75. package/dist/esm/QuestionnaireForm.js.map +1 -1
  76. package/dist/esm/RequestGroupDisplay.d.ts +0 -1
  77. package/dist/esm/RequestGroupDisplay.js +8 -7
  78. package/dist/esm/RequestGroupDisplay.js.map +1 -1
  79. package/dist/esm/ResourceBadge.d.ts +0 -1
  80. package/dist/esm/ResourceBadge.js +2 -1
  81. package/dist/esm/ResourceBadge.js.map +1 -1
  82. package/dist/esm/ResourceBlame.d.ts +0 -1
  83. package/dist/esm/ResourceBlame.js +59 -10
  84. package/dist/esm/ResourceBlame.js.map +1 -1
  85. package/dist/esm/ResourceDiff.d.ts +0 -1
  86. package/dist/esm/ResourceDiff.js +13 -2
  87. package/dist/esm/ResourceDiff.js.map +1 -1
  88. package/dist/esm/ResourceDiffTable.d.ts +0 -2
  89. package/dist/esm/ResourceDiffTable.js +25 -3
  90. package/dist/esm/ResourceDiffTable.js.map +1 -1
  91. package/dist/esm/ResourceForm.js +6 -5
  92. package/dist/esm/ResourceForm.js.map +1 -1
  93. package/dist/esm/ResourceInput.js +28 -2
  94. package/dist/esm/ResourceInput.js.map +1 -1
  95. package/dist/esm/ResourceName.d.ts +2 -1
  96. package/dist/esm/ResourceName.js +5 -2
  97. package/dist/esm/ResourceName.js.map +1 -1
  98. package/dist/esm/ResourcePropertyDisplay.js +6 -6
  99. package/dist/esm/ResourcePropertyDisplay.js.map +1 -1
  100. package/dist/esm/ResourceTimeline.d.ts +0 -1
  101. package/dist/esm/ResourceTimeline.js +78 -25
  102. package/dist/esm/ResourceTimeline.js.map +1 -1
  103. package/dist/esm/Scheduler.d.ts +0 -1
  104. package/dist/esm/Scheduler.js +20 -4
  105. package/dist/esm/Scheduler.js.map +1 -1
  106. package/dist/esm/SearchControl.d.ts +0 -1
  107. package/dist/esm/SearchControl.js +33 -18
  108. package/dist/esm/SearchControl.js.map +1 -1
  109. package/dist/esm/SearchFilterEditor.d.ts +0 -1
  110. package/dist/esm/SearchFilterEditor.js +2 -2
  111. package/dist/esm/SearchFilterEditor.js.map +1 -1
  112. package/dist/esm/Timeline.d.ts +0 -1
  113. package/dist/esm/Timeline.js +13 -16
  114. package/dist/esm/Timeline.js.map +1 -1
  115. package/dist/esm/auth/AuthenticationForm.d.ts +1 -0
  116. package/dist/esm/auth/AuthenticationForm.js +6 -3
  117. package/dist/esm/auth/AuthenticationForm.js.map +1 -1
  118. package/dist/esm/auth/ChooseProfileForm.js +3 -3
  119. package/dist/esm/auth/ChooseProfileForm.js.map +1 -1
  120. package/dist/esm/auth/NewProjectForm.js +3 -3
  121. package/dist/esm/auth/NewProjectForm.js.map +1 -1
  122. package/dist/esm/auth/NewUserForm.js +4 -3
  123. package/dist/esm/auth/NewUserForm.js.map +1 -1
  124. package/dist/esm/auth/RegisterForm.d.ts +0 -1
  125. package/dist/esm/auth/RegisterForm.js.map +1 -1
  126. package/dist/esm/auth/SignInForm.d.ts +1 -1
  127. package/dist/esm/auth/SignInForm.js +1 -1
  128. package/dist/esm/auth/SignInForm.js.map +1 -1
  129. package/dist/esm/index.min.js +1 -1
  130. package/dist/esm/index.min.js.map +1 -1
  131. package/dist/esm/stories/DescriptionList.stories.d.ts +5 -0
  132. package/dist/esm/stories/PlanDefinitionBuilder.stories.d.ts +2 -0
  133. package/dist/esm/stories/RequestGroupDisplay.stories.d.ts +1 -0
  134. package/dist/esm/stories/ResourceTable.stories.d.ts +4 -0
  135. package/dist/esm/stories/covid19.d.ts +15 -0
  136. package/package.json +35 -23
  137. package/rollup.config.mjs +111 -0
  138. package/dist/cjs/defaulttheme.css +0 -192
  139. package/dist/cjs/styles.css +0 -528
  140. package/dist/esm/defaulttheme.css +0 -192
  141. package/dist/esm/styles.css +0 -528
package/dist/cjs/index.js CHANGED
@@ -1,19 +1,15 @@
1
1
  (function (global, factory) {
2
- typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@medplum/core'), require('react'), require('@mantine/core'), require('@tabler/icons'), require('react-router-dom')) :
3
- typeof define === 'function' && define.amd ? define(['exports', '@medplum/core', 'react', '@mantine/core', '@tabler/icons', 'react-router-dom'], factory) :
4
- (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory((global.medplum = global.medplum || {}, global.medplum.ui = {}), global.medplum.core, global.React, global.mantine.core, global.tabler.icons, global.ReactRouterDOM));
5
- })(this, (function (exports, core, React, core$1, icons, reactRouterDom) { 'use strict';
6
-
7
- function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
8
-
9
- var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
2
+ typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@medplum/core'), require('react'), require('@mantine/core'), require('@tabler/icons'), require('react-router-dom'), require('@mantine/notifications')) :
3
+ typeof define === 'function' && define.amd ? define(['exports', '@medplum/core', 'react', '@mantine/core', '@tabler/icons', 'react-router-dom', '@mantine/notifications'], factory) :
4
+ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory((global.medplum = global.medplum || {}, global.medplum.react = {}), global.medplum.core, global.React, global.mantine.core, global.tabler.icons, global.ReactRouterDOM, global.mantine.notifications));
5
+ })(this, (function (exports, core, React, core$1, icons, reactRouterDom, notifications) { 'use strict';
10
6
 
11
7
  function AddressDisplay(props) {
12
8
  const address = props.value;
13
9
  if (!address) {
14
10
  return null;
15
11
  }
16
- return React__default["default"].createElement(React__default["default"].Fragment, null, core.formatAddress(address));
12
+ return React.createElement(React.Fragment, null, core.formatAddress(address));
17
13
  }
18
14
 
19
15
  function getLine(address, index) {
@@ -58,14 +54,14 @@
58
54
  function setPostalCode(postalCode) {
59
55
  setValueWrapper(Object.assign(Object.assign({}, valueRef.current), { postalCode }));
60
56
  }
61
- return (React__default["default"].createElement(core$1.Group, { spacing: "xs", grow: true, noWrap: true },
62
- React__default["default"].createElement(core$1.NativeSelect, { "data-testid": "address-use", defaultValue: value === null || value === void 0 ? void 0 : value.use, onChange: (e) => setUse(e.currentTarget.value), data: ['', 'home', 'work', 'temp', 'old', 'billing'] }),
63
- React__default["default"].createElement(core$1.NativeSelect, { "data-testid": "address-type", defaultValue: value === null || value === void 0 ? void 0 : value.type, onChange: (e) => setType(e.currentTarget.value), data: ['', 'postal', 'physical', 'both'] }),
64
- React__default["default"].createElement(core$1.TextInput, { placeholder: "Line 1", defaultValue: getLine(value, 0), onChange: (e) => setLine1(e.currentTarget.value) }),
65
- React__default["default"].createElement(core$1.TextInput, { placeholder: "Line 2", defaultValue: getLine(value, 1), onChange: (e) => setLine2(e.currentTarget.value) }),
66
- React__default["default"].createElement(core$1.TextInput, { placeholder: "City", defaultValue: value.city, onChange: (e) => setCity(e.currentTarget.value) }),
67
- React__default["default"].createElement(core$1.TextInput, { placeholder: "State", defaultValue: value.state, onChange: (e) => setState(e.currentTarget.value) }),
68
- React__default["default"].createElement(core$1.TextInput, { placeholder: "Postal Code", defaultValue: value.postalCode, onChange: (e) => setPostalCode(e.currentTarget.value) })));
57
+ return (React.createElement(core$1.Group, { spacing: "xs", grow: true, noWrap: true },
58
+ React.createElement(core$1.NativeSelect, { "data-testid": "address-use", defaultValue: value === null || value === void 0 ? void 0 : value.use, onChange: (e) => setUse(e.currentTarget.value), data: ['', 'home', 'work', 'temp', 'old', 'billing'] }),
59
+ React.createElement(core$1.NativeSelect, { "data-testid": "address-type", defaultValue: value === null || value === void 0 ? void 0 : value.type, onChange: (e) => setType(e.currentTarget.value), data: ['', 'postal', 'physical', 'both'] }),
60
+ React.createElement(core$1.TextInput, { placeholder: "Line 1", defaultValue: getLine(value, 0), onChange: (e) => setLine1(e.currentTarget.value) }),
61
+ React.createElement(core$1.TextInput, { placeholder: "Line 2", defaultValue: getLine(value, 1), onChange: (e) => setLine2(e.currentTarget.value) }),
62
+ React.createElement(core$1.TextInput, { placeholder: "City", defaultValue: value.city, onChange: (e) => setCity(e.currentTarget.value) }),
63
+ React.createElement(core$1.TextInput, { placeholder: "State", defaultValue: value.state, onChange: (e) => setState(e.currentTarget.value) }),
64
+ React.createElement(core$1.TextInput, { placeholder: "Postal Code", defaultValue: value.postalCode, onChange: (e) => setPostalCode(e.currentTarget.value) })));
69
65
  }
70
66
 
71
67
  function AttachmentDisplay(props) {
@@ -74,20 +70,20 @@
74
70
  if (!url) {
75
71
  return null;
76
72
  }
77
- return (React__default["default"].createElement("div", { "data-testid": "attachment-display" },
78
- (contentType === null || contentType === void 0 ? void 0 : contentType.startsWith('image/')) && (React__default["default"].createElement("img", { "data-testid": "attachment-image", style: { maxWidth: props.maxWidth }, src: url, alt: value === null || value === void 0 ? void 0 : value.title })),
79
- (contentType === null || contentType === void 0 ? void 0 : contentType.startsWith('video/')) && (React__default["default"].createElement("video", { "data-testid": "attachment-video", style: { maxWidth: props.maxWidth }, controls: true },
80
- React__default["default"].createElement("source", { type: contentType, src: url }))),
81
- contentType === 'application/pdf' && !(title === null || title === void 0 ? void 0 : title.endsWith('.pdf')) && (React__default["default"].createElement("div", { "data-testid": "attachment-pdf", style: { maxWidth: props.maxWidth, minHeight: 400 } },
82
- React__default["default"].createElement("iframe", { width: "100%", height: "400", src: url + '#navpanes=0', allowFullScreen: true, frameBorder: 0, seamless: true }))),
83
- React__default["default"].createElement("div", { "data-testid": "download-link", style: { padding: '2px 16px 16px 16px' } },
84
- React__default["default"].createElement("a", { href: value === null || value === void 0 ? void 0 : value.url, "data-testid": "attachment-details", target: "_blank", rel: "noopener noreferrer" }, (value === null || value === void 0 ? void 0 : value.title) || 'Download'))));
73
+ return (React.createElement("div", { "data-testid": "attachment-display" },
74
+ (contentType === null || contentType === void 0 ? void 0 : contentType.startsWith('image/')) && (React.createElement("img", { "data-testid": "attachment-image", style: { maxWidth: props.maxWidth }, src: url, alt: value === null || value === void 0 ? void 0 : value.title })),
75
+ (contentType === null || contentType === void 0 ? void 0 : contentType.startsWith('video/')) && (React.createElement("video", { "data-testid": "attachment-video", style: { maxWidth: props.maxWidth }, controls: true },
76
+ React.createElement("source", { type: contentType, src: url }))),
77
+ contentType === 'application/pdf' && !(title === null || title === void 0 ? void 0 : title.endsWith('.pdf')) && (React.createElement("div", { "data-testid": "attachment-pdf", style: { maxWidth: props.maxWidth, minHeight: 400 } },
78
+ React.createElement("iframe", { width: "100%", height: "400", src: url + '#navpanes=0', allowFullScreen: true, frameBorder: 0, seamless: true }))),
79
+ React.createElement("div", { "data-testid": "download-link", style: { padding: '2px 16px 16px 16px' } },
80
+ React.createElement("a", { href: value === null || value === void 0 ? void 0 : value.url, "data-testid": "attachment-details", target: "_blank", rel: "noopener noreferrer" }, (value === null || value === void 0 ? void 0 : value.title) || 'Download'))));
85
81
  }
86
82
 
87
83
  function AttachmentArrayDisplay(props) {
88
- return (React__default["default"].createElement("div", null, props.values &&
89
- props.values.map((v, index) => (React__default["default"].createElement("div", { key: 'attatchment-' + index },
90
- React__default["default"].createElement(AttachmentDisplay, { value: v, maxWidth: props.maxWidth }))))));
84
+ return (React.createElement("div", null, props.values &&
85
+ props.values.map((v, index) => (React.createElement("div", { key: 'attatchment-' + index },
86
+ React.createElement(AttachmentDisplay, { value: v, maxWidth: props.maxWidth }))))));
91
87
  }
92
88
 
93
89
  const reactContext = React.createContext(undefined);
@@ -112,7 +108,7 @@
112
108
  return () => medplum.removeEventListeneer('change', eventListener);
113
109
  }, [medplum, state]);
114
110
  const medplumContext = Object.assign(Object.assign({}, state), { medplum });
115
- return React__default["default"].createElement(reactContext.Provider, { value: medplumContext }, props.children);
111
+ return React.createElement(reactContext.Provider, { value: medplumContext }, props.children);
116
112
  }
117
113
  /**
118
114
  * Returns the MedplumContext instance.
@@ -196,10 +192,13 @@
196
192
  if (!fileName) {
197
193
  return;
198
194
  }
195
+ if (props.onUploadStart) {
196
+ props.onUploadStart();
197
+ }
199
198
  const filename = file.name;
200
199
  const contentType = file.type || 'application/octet-stream';
201
200
  medplum
202
- .createBinary(file, filename, contentType)
201
+ .createBinary(file, filename, contentType, props.onUploadProgress)
203
202
  .then((binary) => {
204
203
  props.onUpload({
205
204
  contentType: binary.contentType,
@@ -212,8 +211,8 @@
212
211
  alert((_c = (_b = (_a = outcome === null || outcome === void 0 ? void 0 : outcome.issue) === null || _a === void 0 ? void 0 : _a[0]) === null || _b === void 0 ? void 0 : _b.details) === null || _c === void 0 ? void 0 : _c.text);
213
212
  });
214
213
  }
215
- return (React__default["default"].createElement(React__default["default"].Fragment, null,
216
- React__default["default"].createElement("input", { type: "file", "data-testid": "upload-file-input", style: { display: 'none' }, ref: fileInputRef, onChange: (e) => onFileChange(e) }),
214
+ return (React.createElement(React.Fragment, null,
215
+ React.createElement("input", { type: "file", "data-testid": "upload-file-input", style: { display: 'none' }, ref: fileInputRef, onChange: (e) => onFileChange(e) }),
217
216
  props.children({ onClick })));
218
217
  }
219
218
 
@@ -228,29 +227,29 @@
228
227
  props.onChange(newValues);
229
228
  }
230
229
  }
231
- return (React__default["default"].createElement("table", { style: { width: '100%' } },
232
- React__default["default"].createElement("colgroup", null,
233
- React__default["default"].createElement("col", { width: "97%" }),
234
- React__default["default"].createElement("col", { width: "3%" })),
235
- React__default["default"].createElement("tbody", null,
236
- values.map((v, index) => (React__default["default"].createElement("tr", { key: `${index}-${values.length}` },
237
- React__default["default"].createElement("td", null,
238
- React__default["default"].createElement(AttachmentDisplay, { value: v, maxWidth: 200 })),
239
- React__default["default"].createElement("td", { className: "medplum-right" },
240
- React__default["default"].createElement(core$1.ActionIcon, { title: "Remove", size: "sm", onClick: (e) => {
230
+ return (React.createElement("table", { style: { width: '100%' } },
231
+ React.createElement("colgroup", null,
232
+ React.createElement("col", { width: "97%" }),
233
+ React.createElement("col", { width: "3%" })),
234
+ React.createElement("tbody", null,
235
+ values.map((v, index) => (React.createElement("tr", { key: `${index}-${values.length}` },
236
+ React.createElement("td", null,
237
+ React.createElement(AttachmentDisplay, { value: v, maxWidth: 200 })),
238
+ React.createElement("td", null,
239
+ React.createElement(core$1.ActionIcon, { title: "Remove", size: "sm", onClick: (e) => {
241
240
  killEvent(e);
242
241
  const copy = values.slice();
243
242
  copy.splice(index, 1);
244
243
  setValuesWrapper(copy);
245
244
  } },
246
- React__default["default"].createElement(icons.IconCircleMinus, null)))))),
247
- React__default["default"].createElement("tr", null,
248
- React__default["default"].createElement("td", null),
249
- React__default["default"].createElement("td", { className: "medplum-right" },
250
- React__default["default"].createElement(AttachmentButton, { onUpload: (attachment) => {
245
+ React.createElement(icons.IconCircleMinus, null)))))),
246
+ React.createElement("tr", null,
247
+ React.createElement("td", null),
248
+ React.createElement("td", null,
249
+ React.createElement(AttachmentButton, { onUpload: (attachment) => {
251
250
  setValuesWrapper([...valuesRef.current, attachment]);
252
- } }, (props) => (React__default["default"].createElement(core$1.ActionIcon, Object.assign({}, props, { title: "Add", size: "sm", color: "green" }),
253
- React__default["default"].createElement(icons.IconCloudUpload, { size: 16 })))))))));
251
+ } }, (props) => (React.createElement(core$1.ActionIcon, Object.assign({}, props, { title: "Add", size: "sm", color: "green" }),
252
+ React.createElement(icons.IconCloudUpload, { size: 16 })))))))));
254
253
  }
255
254
 
256
255
  function AttachmentInput(props) {
@@ -262,19 +261,23 @@
262
261
  }
263
262
  }
264
263
  if (value) {
265
- return (React__default["default"].createElement(React__default["default"].Fragment, null,
266
- React__default["default"].createElement(AttachmentDisplay, { value: value, maxWidth: 200 }),
267
- React__default["default"].createElement(core$1.Button, { onClick: (e) => {
264
+ return (React.createElement(React.Fragment, null,
265
+ React.createElement(AttachmentDisplay, { value: value, maxWidth: 200 }),
266
+ React.createElement(core$1.Button, { onClick: (e) => {
268
267
  killEvent(e);
269
268
  setValueWrapper(undefined);
270
269
  } }, "Remove")));
271
270
  }
272
- return (React__default["default"].createElement(AttachmentButton, { onUpload: setValueWrapper }, (props) => React__default["default"].createElement(core$1.Button, Object.assign({}, props), "Upload...")));
271
+ return (React.createElement(AttachmentButton, { onUpload: setValueWrapper }, (props) => React.createElement(core$1.Button, Object.assign({}, props), "Upload...")));
273
272
  }
274
273
 
275
274
  function Document(props) {
276
- return (React__default["default"].createElement("main", { className: "medplum-document" },
277
- React__default["default"].createElement("article", { style: { maxWidth: props.width } }, props.children)));
275
+ let style = undefined;
276
+ if (props.width) {
277
+ style = { maxWidth: props.width };
278
+ }
279
+ return (React.createElement(core$1.Container, null,
280
+ React.createElement(core$1.Paper, { style: style, mx: "auto", my: "lg", p: "lg", shadow: "xs", radius: "sm", withBorder: true }, props.children)));
278
281
  }
279
282
 
280
283
  /******************************************************************************
@@ -362,7 +365,7 @@
362
365
  }
363
366
 
364
367
  function Form(props) {
365
- return (React__default["default"].createElement("form", { style: props.style, "data-testid": props.testid, onSubmit: (e) => {
368
+ return (React.createElement("form", { style: props.style, "data-testid": props.testid, onSubmit: (e) => {
366
369
  e.preventDefault();
367
370
  const formData = parseForm(e.target);
368
371
  if (props.onSubmit) {
@@ -372,13 +375,13 @@
372
375
  }
373
376
 
374
377
  function Logo(props) {
375
- return (React__default["default"].createElement("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 491 491", style: { width: props.size, height: props.size } },
376
- React__default["default"].createElement("title", null, "Medplum Logo"),
377
- React__default["default"].createElement("path", { fill: props.fill || '#ad7136', d: "M282 67c6-16 16-29 29-40L289 0c-22 17-37 41-43 68l17 23 19-24z" }),
378
- React__default["default"].createElement("path", { fill: props.fill || '#946af9', d: "M311 63c-17 0-33 4-48 11-16-7-32-11-49-11-87 0-158 96-158 214s71 214 158 214c17 0 33-4 49-11 15 7 31 11 48 11 87 0 158-96 158-214S398 63 311 63z" }),
379
- React__default["default"].createElement("path", { fill: props.fill || '#7857c5', d: "M231 489l-17 2c-87 0-158-96-158-214S127 63 214 63l17 1c-39 12-70 102-70 213s31 201 70 212z" }),
380
- React__default["default"].createElement("path", { fill: props.fill || '#40bc26', d: "M207 220a176 176 0 01-177 43A176 176 0 01251 43l1 5c17 59 2 125-45 172z" }),
381
- React__default["default"].createElement("path", { fill: props.fill || '#33961e', d: "M252 48A421 421 0 0057 270l-27-7A176 176 0 01251 43l1 5z" })));
378
+ return (React.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 491 491", style: { width: props.size, height: props.size } },
379
+ React.createElement("title", null, "Medplum Logo"),
380
+ React.createElement("path", { fill: props.fill || '#ad7136', d: "M282 67c6-16 16-29 29-40L289 0c-22 17-37 41-43 68l17 23 19-24z" }),
381
+ React.createElement("path", { fill: props.fill || '#946af9', d: "M311 63c-17 0-33 4-48 11-16-7-32-11-49-11-87 0-158 96-158 214s71 214 158 214c17 0 33-4 49-11 15 7 31 11 48 11 87 0 158-96 158-214S398 63 311 63z" }),
382
+ React.createElement("path", { fill: props.fill || '#7857c5', d: "M231 489l-17 2c-87 0-158-96-158-214S127 63 214 63l17 1c-39 12-70 102-70 213s31 201 70 212z" }),
383
+ React.createElement("path", { fill: props.fill || '#40bc26', d: "M207 220a176 176 0 01-177 43A176 176 0 01251 43l1 5c17 59 2 125-45 172z" }),
384
+ React.createElement("path", { fill: props.fill || '#33961e', d: "M252 48A421 421 0 0057 270l-27-7A176 176 0 01251 43l1 5z" })));
382
385
  }
383
386
 
384
387
  function getErrorsForInput(outcome, expression) {
@@ -411,7 +414,7 @@
411
414
  function NewProjectForm(props) {
412
415
  const medplum = useMedplum();
413
416
  const [outcome, setOutcome] = React.useState();
414
- return (React__default["default"].createElement(Form, { style: { maxWidth: 400 }, onSubmit: (formData) => __awaiter(this, void 0, void 0, function* () {
417
+ return (React.createElement(Form, { style: { maxWidth: 400 }, onSubmit: (formData) => __awaiter(this, void 0, void 0, function* () {
415
418
  try {
416
419
  props.handleAuthResponse(yield medplum.startNewProject({
417
420
  login: props.login,
@@ -422,19 +425,19 @@
422
425
  setOutcome(err);
423
426
  }
424
427
  }) },
425
- React__default["default"].createElement("div", { className: "medplum-center" },
426
- React__default["default"].createElement(Logo, { size: 32 }),
427
- React__default["default"].createElement("h1", null, "Create project")),
428
- React__default["default"].createElement(core$1.Stack, { spacing: "xl" },
429
- React__default["default"].createElement(core$1.TextInput, { name: "projectName", label: "Project Name", placeholder: "My Project", required: true, autoFocus: true, error: getErrorsForInput(outcome, 'firstName') }),
430
- React__default["default"].createElement(core$1.Text, { color: "dimmed", size: "xs" },
428
+ React.createElement(core$1.Center, { sx: { flexDirection: 'column' } },
429
+ React.createElement(Logo, { size: 32 }),
430
+ React.createElement(core$1.Title, null, "Create project")),
431
+ React.createElement(core$1.Stack, { spacing: "xl" },
432
+ React.createElement(core$1.TextInput, { name: "projectName", label: "Project Name", placeholder: "My Project", required: true, autoFocus: true, error: getErrorsForInput(outcome, 'firstName') }),
433
+ React.createElement(core$1.Text, { color: "dimmed", size: "xs" },
431
434
  "By clicking submit you agree to the Medplum ",
432
- React__default["default"].createElement("a", { href: "https://www.medplum.com/privacy" }, "Privacy\u00A0Policy"),
435
+ React.createElement("a", { href: "https://www.medplum.com/privacy" }, "Privacy\u00A0Policy"),
433
436
  ' and ',
434
- React__default["default"].createElement("a", { href: "https://www.medplum.com/terms" }, "Terms\u00A0of\u00A0Service"),
437
+ React.createElement("a", { href: "https://www.medplum.com/terms" }, "Terms\u00A0of\u00A0Service"),
435
438
  ".")),
436
- React__default["default"].createElement(core$1.Group, { position: "right", mt: "xl", noWrap: true },
437
- React__default["default"].createElement(core$1.Button, { type: "submit" }, "Create project"))));
439
+ React.createElement(core$1.Group, { position: "right", mt: "xl", noWrap: true },
440
+ React.createElement(core$1.Button, { type: "submit" }, "Create project"))));
438
441
  }
439
442
 
440
443
  /**
@@ -477,7 +480,7 @@
477
480
  if (!googleClientId) {
478
481
  return null;
479
482
  }
480
- return React__default["default"].createElement("div", { ref: parentRef });
483
+ return React.createElement("div", { ref: parentRef });
481
484
  }
482
485
  function getGoogleClientId(clientId) {
483
486
  var _a, _b;
@@ -527,7 +530,7 @@
527
530
  const [outcome, setOutcome] = React.useState();
528
531
  const issues = getIssuesForExpression(outcome, undefined);
529
532
  React.useEffect(() => initRecaptcha(recaptchaSiteKey), [recaptchaSiteKey]);
530
- return (React__default["default"].createElement(Form, { style: { maxWidth: 400 }, onSubmit: (formData) => __awaiter(this, void 0, void 0, function* () {
533
+ return (React.createElement(Form, { style: { maxWidth: 400 }, onSubmit: (formData) => __awaiter(this, void 0, void 0, function* () {
531
534
  try {
532
535
  const recaptchaToken = yield getRecaptcha(recaptchaSiteKey);
533
536
  props.handleAuthResponse(yield medplum.startNewUser({
@@ -545,14 +548,14 @@
545
548
  setOutcome(err);
546
549
  }
547
550
  }) },
548
- React__default["default"].createElement("div", { className: "medplum-center" }, props.children),
549
- issues && (React__default["default"].createElement("div", { className: "medplum-input-error" }, issues.map((issue) => {
551
+ React.createElement(core$1.Center, { sx: { flexDirection: 'column' } }, props.children),
552
+ issues && (React.createElement(core$1.Alert, { icon: React.createElement(icons.IconAlertCircle, { size: 16 }), color: "red" }, issues.map((issue) => {
550
553
  var _a, _b;
551
- return (React__default["default"].createElement("div", { "data-testid": "text-field-error", key: (_a = issue.details) === null || _a === void 0 ? void 0 : _a.text }, (_b = issue.details) === null || _b === void 0 ? void 0 : _b.text));
554
+ return (React.createElement("div", { "data-testid": "text-field-error", key: (_a = issue.details) === null || _a === void 0 ? void 0 : _a.text }, (_b = issue.details) === null || _b === void 0 ? void 0 : _b.text));
552
555
  }))),
553
- googleClientId && (React__default["default"].createElement(React__default["default"].Fragment, null,
554
- React__default["default"].createElement(core$1.Group, { position: "center", p: "xl", style: { height: 70 } },
555
- React__default["default"].createElement(GoogleButton, { googleClientId: googleClientId, handleGoogleCredential: (response) => __awaiter(this, void 0, void 0, function* () {
556
+ googleClientId && (React.createElement(React.Fragment, null,
557
+ React.createElement(core$1.Group, { position: "center", p: "xl", style: { height: 70 } },
558
+ React.createElement(GoogleButton, { googleClientId: googleClientId, handleGoogleCredential: (response) => __awaiter(this, void 0, void 0, function* () {
556
559
  try {
557
560
  props.handleAuthResponse(yield medplum.startGoogleLogin({
558
561
  googleClientId: response.clientId,
@@ -564,28 +567,28 @@
564
567
  setOutcome(err);
565
568
  }
566
569
  }) })),
567
- React__default["default"].createElement(core$1.Divider, { label: "or", labelPosition: "center", my: "lg" }))),
568
- React__default["default"].createElement(core$1.Stack, { spacing: "xl" },
569
- React__default["default"].createElement(core$1.TextInput, { name: "firstName", type: "text", label: "First name", placeholder: "First name", required: true, autoFocus: true, error: getErrorsForInput(outcome, 'firstName') }),
570
- React__default["default"].createElement(core$1.TextInput, { name: "lastName", type: "text", label: "Last name", placeholder: "Last name", required: true, error: getErrorsForInput(outcome, 'lastName') }),
571
- React__default["default"].createElement(core$1.TextInput, { name: "email", type: "email", label: "Email", placeholder: "name@domain.com", required: true, error: getErrorsForInput(outcome, 'email') }),
572
- React__default["default"].createElement(core$1.PasswordInput, { name: "password", label: "Password", autoComplete: "off", required: true, error: getErrorsForInput(outcome, 'password') }),
573
- React__default["default"].createElement(core$1.Text, { color: "dimmed", size: "xs" },
570
+ React.createElement(core$1.Divider, { label: "or", labelPosition: "center", my: "lg" }))),
571
+ React.createElement(core$1.Stack, { spacing: "xl" },
572
+ React.createElement(core$1.TextInput, { name: "firstName", type: "text", label: "First name", placeholder: "First name", required: true, autoFocus: true, error: getErrorsForInput(outcome, 'firstName') }),
573
+ React.createElement(core$1.TextInput, { name: "lastName", type: "text", label: "Last name", placeholder: "Last name", required: true, error: getErrorsForInput(outcome, 'lastName') }),
574
+ React.createElement(core$1.TextInput, { name: "email", type: "email", label: "Email", placeholder: "name@domain.com", required: true, error: getErrorsForInput(outcome, 'email') }),
575
+ React.createElement(core$1.PasswordInput, { name: "password", label: "Password", autoComplete: "off", required: true, error: getErrorsForInput(outcome, 'password') }),
576
+ React.createElement(core$1.Text, { color: "dimmed", size: "xs" },
574
577
  "By clicking submit you agree to the Medplum ",
575
- React__default["default"].createElement("a", { href: "https://www.medplum.com/privacy" }, "Privacy\u00A0Policy"),
578
+ React.createElement("a", { href: "https://www.medplum.com/privacy" }, "Privacy\u00A0Policy"),
576
579
  ' and ',
577
- React__default["default"].createElement("a", { href: "https://www.medplum.com/terms" }, "Terms\u00A0of\u00A0Service"),
580
+ React.createElement("a", { href: "https://www.medplum.com/terms" }, "Terms\u00A0of\u00A0Service"),
578
581
  "."),
579
- React__default["default"].createElement(core$1.Text, { color: "dimmed", size: "xs" },
582
+ React.createElement(core$1.Text, { color: "dimmed", size: "xs" },
580
583
  "This site is protected by reCAPTCHA and the Google",
581
584
  ' ',
582
- React__default["default"].createElement("a", { href: "https://policies.google.com/privacy" }, "Privacy\u00A0Policy"),
585
+ React.createElement("a", { href: "https://policies.google.com/privacy" }, "Privacy\u00A0Policy"),
583
586
  ' and ',
584
- React__default["default"].createElement("a", { href: "https://policies.google.com/terms" }, "Terms\u00A0of\u00A0Service"),
587
+ React.createElement("a", { href: "https://policies.google.com/terms" }, "Terms\u00A0of\u00A0Service"),
585
588
  " apply.")),
586
- React__default["default"].createElement(core$1.Group, { position: "apart", mt: "xl", noWrap: true },
587
- React__default["default"].createElement(core$1.Checkbox, { name: "remember", label: "Remember me", size: "xs" }),
588
- React__default["default"].createElement(core$1.Button, { type: "submit" }, "Create account"))));
589
+ React.createElement(core$1.Group, { position: "apart", mt: "xl", noWrap: true },
590
+ React.createElement(core$1.Checkbox, { name: "remember", label: "Remember me", size: "xs" }),
591
+ React.createElement(core$1.Button, { type: "submit" }, "Create account"))));
589
592
  }
590
593
 
591
594
  function RegisterForm(props) {
@@ -613,10 +616,10 @@
613
616
  setLogin(response.login);
614
617
  }
615
618
  }
616
- return (React__default["default"].createElement(Document, { width: 450 },
617
- outcome && React__default["default"].createElement("pre", null, JSON.stringify(outcome, null, 2)),
618
- !login && (React__default["default"].createElement(NewUserForm, { projectId: projectId, googleClientId: googleClientId, recaptchaSiteKey: recaptchaSiteKey, handleAuthResponse: handleAuthResponse }, props.children)),
619
- login && type === 'project' && React__default["default"].createElement(NewProjectForm, { login: login, handleAuthResponse: handleAuthResponse })));
619
+ return (React.createElement(Document, { width: 450 },
620
+ outcome && React.createElement("pre", null, JSON.stringify(outcome, null, 2)),
621
+ !login && (React.createElement(NewUserForm, { projectId: projectId, googleClientId: googleClientId, recaptchaSiteKey: recaptchaSiteKey, handleAuthResponse: handleAuthResponse }, props.children)),
622
+ login && type === 'project' && React.createElement(NewProjectForm, { login: login, handleAuthResponse: handleAuthResponse })));
620
623
  }
621
624
 
622
625
  function AuthenticationForm(props) {
@@ -631,11 +634,12 @@
631
634
  }
632
635
  });
633
636
  }
634
- return (React__default["default"].createElement(Form, { style: { maxWidth: 400 }, onSubmit: (formData) => {
637
+ return (React.createElement(Form, { style: { maxWidth: 400 }, onSubmit: (formData) => {
635
638
  startPkce()
636
639
  .then(() => medplum.startLogin({
637
640
  projectId: props.projectId,
638
641
  clientId: props.clientId,
642
+ resourceType: props.resourceType,
639
643
  scope: props.scope,
640
644
  nonce: props.nonce,
641
645
  codeChallenge: props.codeChallenge,
@@ -647,18 +651,19 @@
647
651
  .then(props.handleAuthResponse)
648
652
  .catch(setOutcome);
649
653
  } },
650
- React__default["default"].createElement("div", { className: "medplum-center" }, props.children),
651
- issues && (React__default["default"].createElement("div", { className: "medplum-input-error" }, issues.map((issue) => {
654
+ React.createElement(core$1.Center, { sx: { flexDirection: 'column' } }, props.children),
655
+ issues && (React.createElement(core$1.Alert, { icon: React.createElement(icons.IconAlertCircle, { size: 16 }), color: "red" }, issues.map((issue) => {
652
656
  var _a, _b;
653
- return (React__default["default"].createElement("div", { "data-testid": "text-field-error", key: (_a = issue.details) === null || _a === void 0 ? void 0 : _a.text }, (_b = issue.details) === null || _b === void 0 ? void 0 : _b.text));
657
+ return (React.createElement("div", { "data-testid": "text-field-error", key: (_a = issue.details) === null || _a === void 0 ? void 0 : _a.text }, (_b = issue.details) === null || _b === void 0 ? void 0 : _b.text));
654
658
  }))),
655
- googleClientId && (React__default["default"].createElement(React__default["default"].Fragment, null,
656
- React__default["default"].createElement(core$1.Group, { position: "center", p: "xl", style: { height: 70 } },
657
- React__default["default"].createElement(GoogleButton, { googleClientId: googleClientId, handleGoogleCredential: (response) => {
659
+ googleClientId && (React.createElement(React.Fragment, null,
660
+ React.createElement(core$1.Group, { position: "center", p: "xl", style: { height: 70 } },
661
+ React.createElement(GoogleButton, { googleClientId: googleClientId, handleGoogleCredential: (response) => {
658
662
  startPkce()
659
663
  .then(() => medplum.startGoogleLogin({
660
664
  projectId: props.projectId,
661
665
  clientId: props.clientId,
666
+ resourceType: props.resourceType,
662
667
  scope: props.scope,
663
668
  nonce: props.nonce,
664
669
  codeChallenge: props.codeChallenge,
@@ -669,26 +674,26 @@
669
674
  .then(props.handleAuthResponse)
670
675
  .catch(setOutcome);
671
676
  } })),
672
- React__default["default"].createElement(core$1.Divider, { label: "or", labelPosition: "center", my: "lg" }))),
673
- React__default["default"].createElement(core$1.Stack, { spacing: "xl" },
674
- React__default["default"].createElement(core$1.TextInput, { name: "email", type: "email", label: "Email", placeholder: "name@domain.com", required: true, autoFocus: true, error: getErrorsForInput(outcome, 'email') }),
675
- React__default["default"].createElement(core$1.PasswordInput, { name: "password", type: "password", label: "Password", autoComplete: "off", required: true, error: getErrorsForInput(outcome, 'password') })),
676
- React__default["default"].createElement(core$1.Group, { position: "apart", mt: "xl", noWrap: true },
677
- props.onForgotPassword && (React__default["default"].createElement(core$1.Anchor, { component: "button", type: "button", color: "dimmed", onClick: props.onForgotPassword, size: "xs" }, "Forgot password")),
678
- props.onRegister && (React__default["default"].createElement(core$1.Anchor, { component: "button", type: "button", color: "dimmed", onClick: props.onRegister, size: "xs" }, "Register")),
679
- React__default["default"].createElement(core$1.Checkbox, { name: "remember", label: "Remember me", size: "xs" }),
680
- React__default["default"].createElement(core$1.Button, { type: "submit" }, "Sign in"))));
677
+ React.createElement(core$1.Divider, { label: "or", labelPosition: "center", my: "lg" }))),
678
+ React.createElement(core$1.Stack, { spacing: "xl" },
679
+ React.createElement(core$1.TextInput, { name: "email", type: "email", label: "Email", placeholder: "name@domain.com", required: true, autoFocus: true, error: getErrorsForInput(outcome, 'email') }),
680
+ React.createElement(core$1.PasswordInput, { name: "password", type: "password", label: "Password", autoComplete: "off", required: true, error: getErrorsForInput(outcome, 'password') })),
681
+ React.createElement(core$1.Group, { position: "apart", mt: "xl", noWrap: true },
682
+ props.onForgotPassword && (React.createElement(core$1.Anchor, { component: "button", type: "button", color: "dimmed", onClick: props.onForgotPassword, size: "xs" }, "Forgot password")),
683
+ props.onRegister && (React.createElement(core$1.Anchor, { component: "button", type: "button", color: "dimmed", onClick: props.onRegister, size: "xs" }, "Register")),
684
+ React.createElement(core$1.Checkbox, { name: "remember", label: "Remember me", size: "xs" }),
685
+ React.createElement(core$1.Button, { type: "submit" }, "Sign in"))));
681
686
  }
682
687
 
683
688
  function ChooseProfileForm(props) {
684
689
  const medplum = useMedplum();
685
- return (React__default["default"].createElement(core$1.Stack, null,
686
- React__default["default"].createElement("div", { className: "medplum-center" },
687
- React__default["default"].createElement(Logo, { size: 32 }),
688
- React__default["default"].createElement(core$1.Text, { size: "lg", weight: 500 }, "Choose profile")),
690
+ return (React.createElement(core$1.Stack, null,
691
+ React.createElement(core$1.Center, { sx: { flexDirection: 'column' } },
692
+ React.createElement(Logo, { size: 32 }),
693
+ React.createElement(core$1.Title, null, "Choose profile")),
689
694
  props.memberships.map((membership) => {
690
695
  var _a, _b;
691
- return (React__default["default"].createElement(core$1.UnstyledButton, { key: membership.id, onClick: () => {
696
+ return (React.createElement(core$1.UnstyledButton, { key: membership.id, onClick: () => {
692
697
  medplum
693
698
  .post('auth/profile', {
694
699
  login: props.login,
@@ -697,11 +702,11 @@
697
702
  .then(props.handleAuthResponse)
698
703
  .catch(console.log);
699
704
  } },
700
- React__default["default"].createElement(core$1.Group, null,
701
- React__default["default"].createElement(core$1.Avatar, { radius: "xl" }),
702
- React__default["default"].createElement("div", { style: { flex: 1 } },
703
- React__default["default"].createElement(core$1.Text, { size: "sm", weight: 500 }, (_a = membership.profile) === null || _a === void 0 ? void 0 : _a.display),
704
- React__default["default"].createElement(core$1.Text, { color: "dimmed", size: "xs" }, (_b = membership.project) === null || _b === void 0 ? void 0 : _b.display)))));
705
+ React.createElement(core$1.Group, null,
706
+ React.createElement(core$1.Avatar, { radius: "xl" }),
707
+ React.createElement("div", { style: { flex: 1 } },
708
+ React.createElement(core$1.Text, { size: "sm", weight: 500 }, (_a = membership.profile) === null || _a === void 0 ? void 0 : _a.display),
709
+ React.createElement(core$1.Text, { color: "dimmed", size: "xs" }, (_b = membership.project) === null || _b === void 0 ? void 0 : _b.display)))));
705
710
  })));
706
711
  }
707
712
 
@@ -732,28 +737,27 @@
732
737
  }
733
738
  }
734
739
  }
735
- return (React__default["default"].createElement(Document, { width: 450 }, (() => {
740
+ return (React.createElement(Document, { width: 450 }, (() => {
736
741
  if (!login) {
737
- return (React__default["default"].createElement(AuthenticationForm, { projectId: props.projectId, clientId: props.clientId, scope: props.scope, nonce: props.nonce, googleClientId: props.googleClientId, generatePkce: !props.onCode, codeChallenge: props.codeChallenge, codeChallengeMethod: props.codeChallengeMethod, onForgotPassword: props.onForgotPassword, onRegister: props.onRegister, handleAuthResponse: handleAuthResponse }, props.children));
742
+ return (React.createElement(AuthenticationForm, { projectId: props.projectId, clientId: props.clientId, resourceType: props.resourceType, scope: props.scope, nonce: props.nonce, googleClientId: props.googleClientId, generatePkce: !props.onCode, codeChallenge: props.codeChallenge, codeChallengeMethod: props.codeChallengeMethod, onForgotPassword: props.onForgotPassword, onRegister: props.onRegister, handleAuthResponse: handleAuthResponse }, props.children));
738
743
  }
739
744
  else if (memberships) {
740
- return React__default["default"].createElement(ChooseProfileForm, { login: login, memberships: memberships, handleAuthResponse: handleAuthResponse });
745
+ return React.createElement(ChooseProfileForm, { login: login, memberships: memberships, handleAuthResponse: handleAuthResponse });
741
746
  }
742
747
  else if (props.projectId === 'new') {
743
- return React__default["default"].createElement(NewProjectForm, { login: login, handleAuthResponse: handleAuthResponse });
748
+ return React.createElement(NewProjectForm, { login: login, handleAuthResponse: handleAuthResponse });
744
749
  }
745
750
  else {
746
- return React__default["default"].createElement("div", null, "Success");
751
+ return React.createElement("div", null, "Success");
747
752
  }
748
753
  })()));
749
754
  }
750
755
 
751
756
  function CheckboxFormSection(props) {
752
- return (React__default["default"].createElement("div", { className: "medplum-checkbox-form-section" },
753
- React__default["default"].createElement("div", { className: "medplum-checkbox-form-section-checkbox-container" }, props.children),
754
- React__default["default"].createElement("div", { className: "medplum-checkbox-form-section-details-container" },
755
- React__default["default"].createElement("label", { htmlFor: props.htmlFor }, props.title),
756
- React__default["default"].createElement("p", null, props.description))));
757
+ return (React.createElement(core$1.Group, { noWrap: true },
758
+ React.createElement("div", null, props.children),
759
+ React.createElement("div", null,
760
+ React.createElement(core$1.Input.Wrapper, { id: props.htmlFor, label: props.title, description: props.description }, (() => null)()))));
757
761
  }
758
762
 
759
763
  const DEFAULT_IGNORED_PROPERTIES = [
@@ -767,16 +771,7 @@
767
771
  ];
768
772
 
769
773
  function FormSection(props) {
770
- const issues = getIssuesForExpression(props.outcome, props.htmlFor);
771
- const invalid = issues && issues.length > 0;
772
- return (React__default["default"].createElement("fieldset", { className: "medplum-form-section" },
773
- props.title && React__default["default"].createElement("label", { htmlFor: props.htmlFor }, props.title),
774
- props.description && React__default["default"].createElement("p", null, props.description),
775
- props.children,
776
- invalid && (React__default["default"].createElement("div", { id: props.htmlFor + '-errors', className: "medplum-input-error" }, issues === null || issues === void 0 ? void 0 : issues.map((issue) => {
777
- var _a, _b;
778
- return (React__default["default"].createElement("div", { "data-testid": "text-field-error", key: (_a = issue.details) === null || _a === void 0 ? void 0 : _a.text }, (_b = issue.details) === null || _b === void 0 ? void 0 : _b.text));
779
- })))));
774
+ return (React.createElement(core$1.Input.Wrapper, { id: props.htmlFor, label: props.title, description: props.description, error: getErrorsForInput(props.outcome, props.htmlFor) }, props.children));
780
775
  }
781
776
 
782
777
  const system = {
@@ -851,22 +846,23 @@
851
846
  }
852
847
  }, [medplum, defaultValue]);
853
848
  if (!schema || !value) {
854
- return React__default["default"].createElement("div", null, "Loading...");
849
+ return React.createElement("div", null, "Loading...");
855
850
  }
856
- return (React__default["default"].createElement("form", { noValidate: true, autoComplete: "off", onSubmit: (e) => {
851
+ return (React.createElement("form", { noValidate: true, autoComplete: "off", onSubmit: (e) => {
857
852
  e.preventDefault();
858
853
  if (props.onSubmit) {
859
854
  props.onSubmit(value);
860
855
  }
861
856
  } },
862
- React__default["default"].createElement(FormSection, { title: "Resource Type", htmlFor: "resourceType", outcome: props.outcome },
863
- React__default["default"].createElement(core$1.TextInput, { name: "resourceType", defaultValue: value.resourceType, disabled: true })),
864
- React__default["default"].createElement(FormSection, { title: "ID", htmlFor: "id", outcome: props.outcome },
865
- React__default["default"].createElement(core$1.TextInput, { name: "id", defaultValue: value.id, disabled: true })),
866
- React__default["default"].createElement(BackboneElementInput, { typeName: value.resourceType, defaultValue: value, outcome: props.outcome, onChange: setValue }),
867
- React__default["default"].createElement(core$1.Group, null,
868
- React__default["default"].createElement(core$1.Button, { type: "submit" }, "OK"),
869
- props.onDelete && (React__default["default"].createElement(core$1.Button, { variant: "outline", color: "red", type: "button", onClick: () => {
857
+ React.createElement(core$1.Stack, { mb: "xl" },
858
+ React.createElement(FormSection, { title: "Resource Type", htmlFor: "resourceType", outcome: props.outcome },
859
+ React.createElement(core$1.TextInput, { name: "resourceType", defaultValue: value.resourceType, disabled: true })),
860
+ React.createElement(FormSection, { title: "ID", htmlFor: "id", outcome: props.outcome },
861
+ React.createElement(core$1.TextInput, { name: "id", defaultValue: value.id, disabled: true }))),
862
+ React.createElement(BackboneElementInput, { typeName: value.resourceType, defaultValue: value, outcome: props.outcome, onChange: setValue }),
863
+ React.createElement(core$1.Group, null,
864
+ React.createElement(core$1.Button, { type: "submit" }, "OK"),
865
+ props.onDelete && (React.createElement(core$1.Button, { variant: "outline", color: "red", type: "button", onClick: () => {
870
866
  props.onDelete(value);
871
867
  } }, "Delete")))));
872
868
  }
@@ -884,13 +880,34 @@
884
880
  return obj;
885
881
  }
886
882
 
883
+ const useStyles$a = core$1.createStyles((theme) => ({
884
+ root: {
885
+ display: 'grid',
886
+ gridTemplateColumns: '30% 70%',
887
+ margin: 0,
888
+ '& > dt, & > dd': {
889
+ padding: `${theme.spacing.sm}px ${theme.spacing.sm}px`,
890
+ borderTop: `0.1px solid ${theme.colors.gray[3]}`,
891
+ margin: 0,
892
+ },
893
+ },
894
+ compact: {
895
+ gridTemplateColumns: '20% 80%',
896
+ '& > dt, & > dd': {
897
+ padding: `0 ${theme.spacing.xs}px ${theme.spacing.xs}px 0`,
898
+ border: 0,
899
+ },
900
+ },
901
+ }));
887
902
  function DescriptionList(props) {
888
- return React__default["default"].createElement("dl", { className: 'medplum-description-list' + (props.compact ? ' compact' : '') }, props.children);
903
+ const { children, compact } = props;
904
+ const { classes, cx } = useStyles$a();
905
+ return React.createElement("dl", { className: cx(classes.root, { [classes.compact]: compact }) }, children);
889
906
  }
890
907
  function DescriptionListEntry(props) {
891
- return (React__default["default"].createElement(React__default["default"].Fragment, null,
892
- React__default["default"].createElement("dt", null, props.term),
893
- React__default["default"].createElement("dd", null, props.children)));
908
+ return (React.createElement(React.Fragment, null,
909
+ React.createElement("dt", null, props.term),
910
+ React.createElement("dd", null, props.children)));
894
911
  }
895
912
 
896
913
  function BackboneElementDisplay(props) {
@@ -902,7 +919,7 @@
902
919
  const typeName = typedValue.type;
903
920
  const typeSchema = core.globalSchema.types[typeName];
904
921
  if (!typeSchema) {
905
- return React__default["default"].createElement("div", null,
922
+ return React.createElement("div", null,
906
923
  typeName,
907
924
  "\u00A0not implemented");
908
925
  }
@@ -910,9 +927,9 @@
910
927
  // Special case for common BackboneElement pattern
911
928
  // Where there is an object with a single property 'name'
912
929
  // Just display the name value.
913
- return React__default["default"].createElement("div", null, value.name);
930
+ return React.createElement("div", null, value.name);
914
931
  }
915
- return (React__default["default"].createElement(DescriptionList, { compact: props.compact }, Object.entries(typeSchema.properties).map((entry) => {
932
+ return (React.createElement(DescriptionList, { compact: props.compact }, Object.entries(typeSchema.properties).map((entry) => {
916
933
  const key = entry[0];
917
934
  if (DEFAULT_IGNORED_PROPERTIES.indexOf(key) >= 0) {
918
935
  return null;
@@ -923,14 +940,14 @@
923
940
  (!propertyValue || (Array.isArray(propertyValue) && propertyValue.length === 0))) {
924
941
  return null;
925
942
  }
926
- return (React__default["default"].createElement(DescriptionListEntry, { key: key, term: core.getPropertyDisplayName(key) },
927
- React__default["default"].createElement(ResourcePropertyDisplay, { property: property, propertyType: propertyType, value: propertyValue, ignoreMissingValues: props.ignoreMissingValues, link: props.link })));
943
+ return (React.createElement(DescriptionListEntry, { key: key, term: core.getPropertyDisplayName(key) },
944
+ React.createElement(ResourcePropertyDisplay, { property: property, propertyType: propertyType, value: propertyValue, ignoreMissingValues: props.ignoreMissingValues, link: props.link })));
928
945
  })));
929
946
  }
930
947
 
931
948
  function CodingDisplay(props) {
932
949
  var _a, _b;
933
- return React__default["default"].createElement(React__default["default"].Fragment, null, ((_a = props.value) === null || _a === void 0 ? void 0 : _a.display) || ((_b = props.value) === null || _b === void 0 ? void 0 : _b.code));
950
+ return React.createElement(React.Fragment, null, ((_a = props.value) === null || _a === void 0 ? void 0 : _a.display) || ((_b = props.value) === null || _b === void 0 ? void 0 : _b.code));
934
951
  }
935
952
 
936
953
  function CodeableConceptDisplay(props) {
@@ -939,12 +956,12 @@
939
956
  return null;
940
957
  }
941
958
  if (value.text) {
942
- return React__default["default"].createElement(React__default["default"].Fragment, null, value.text);
959
+ return React.createElement(React.Fragment, null, value.text);
943
960
  }
944
961
  if (value.coding) {
945
- return (React__default["default"].createElement(React__default["default"].Fragment, null, value.coding.map((coding, index) => (React__default["default"].createElement(React__default["default"].Fragment, { key: 'coding-' + index },
946
- index > 0 && React__default["default"].createElement(React__default["default"].Fragment, null, ', '),
947
- React__default["default"].createElement(CodingDisplay, { value: coding }))))));
962
+ return (React.createElement(React.Fragment, null, value.coding.map((coding, index) => (React.createElement(React.Fragment, { key: 'coding-' + index },
963
+ index > 0 && React.createElement(React.Fragment, null, ', '),
964
+ React.createElement(CodingDisplay, { value: coding }))))));
948
965
  }
949
966
  return null;
950
967
  }
@@ -971,7 +988,7 @@
971
988
  }
972
989
  builder.push(']');
973
990
  }
974
- return React__default["default"].createElement(React__default["default"].Fragment, null, builder.join('').trim());
991
+ return React.createElement(React.Fragment, null, builder.join('').trim());
975
992
  }
976
993
 
977
994
  function ContactDetailDisplay(props) {
@@ -980,10 +997,10 @@
980
997
  if (!contactDetail) {
981
998
  return null;
982
999
  }
983
- return (React__default["default"].createElement(React__default["default"].Fragment, null,
1000
+ return (React.createElement(React.Fragment, null,
984
1001
  contactDetail.name,
985
1002
  contactDetail.name && ': ', (_a = contactDetail.telecom) === null || _a === void 0 ? void 0 :
986
- _a.map((telecom, index) => (React__default["default"].createElement(ContactPointDisplay, { key: 'telecom-' + index, value: telecom })))));
1003
+ _a.map((telecom, index) => (React.createElement(ContactPointDisplay, { key: 'telecom-' + index, value: telecom })))));
987
1004
  }
988
1005
 
989
1006
  function HumanNameDisplay(props) {
@@ -991,19 +1008,19 @@
991
1008
  if (!name) {
992
1009
  return null;
993
1010
  }
994
- return React__default["default"].createElement(React__default["default"].Fragment, null, core.formatHumanName(name, props.options));
1011
+ return React.createElement(React.Fragment, null, core.formatHumanName(name, props.options));
995
1012
  }
996
1013
 
997
1014
  function IdentifierDisplay(props) {
998
1015
  var _a, _b;
999
- return (React__default["default"].createElement("div", null, (_a = props.value) === null || _a === void 0 ? void 0 :
1016
+ return (React.createElement("div", null, (_a = props.value) === null || _a === void 0 ? void 0 :
1000
1017
  _a.system,
1001
1018
  ": ", (_b = props.value) === null || _b === void 0 ? void 0 :
1002
1019
  _b.value));
1003
1020
  }
1004
1021
 
1005
1022
  function QuantityDisplay(props) {
1006
- return React__default["default"].createElement(React__default["default"].Fragment, null, formatQuantityString(props.value));
1023
+ return React.createElement(React.Fragment, null, formatQuantityString(props.value));
1007
1024
  }
1008
1025
  function formatQuantityString(quantity) {
1009
1026
  if (!quantity) {
@@ -1027,7 +1044,7 @@
1027
1044
  }
1028
1045
 
1029
1046
  function RangeDisplay(props) {
1030
- return React__default["default"].createElement(React__default["default"].Fragment, null, formatRangeString(props.value));
1047
+ return React.createElement(React.Fragment, null, formatRangeString(props.value));
1031
1048
  }
1032
1049
  function formatRangeString(range) {
1033
1050
  if (!range || (!range.low && !range.high)) {
@@ -1047,27 +1064,28 @@
1047
1064
  if (!value) {
1048
1065
  return null;
1049
1066
  }
1050
- return (React__default["default"].createElement(React__default["default"].Fragment, null,
1051
- React__default["default"].createElement(QuantityDisplay, { value: value.numerator }),
1067
+ return (React.createElement(React.Fragment, null,
1068
+ React.createElement(QuantityDisplay, { value: value.numerator }),
1052
1069
  "\u00A0/\u00A0",
1053
- React__default["default"].createElement(QuantityDisplay, { value: value.denominator })));
1070
+ React.createElement(QuantityDisplay, { value: value.denominator })));
1054
1071
  }
1055
1072
 
1056
1073
  function MedplumLink(props) {
1057
1074
  const navigate = reactRouterDom.useNavigate();
1058
- let href = getHref(props.to);
1059
- if (props.suffix) {
1060
- href += '/' + props.suffix;
1075
+ const { to, suffix, label, onClick, children } = props, rest = __rest(props, ["to", "suffix", "label", "onClick", "children"]);
1076
+ let href = getHref(to);
1077
+ if (suffix) {
1078
+ href += '/' + suffix;
1061
1079
  }
1062
- return (React__default["default"].createElement("a", { href: href, id: props.id, "aria-label": props.label, "data-testid": props.testid || 'link', className: props.className, onClick: (e) => {
1080
+ return (React.createElement(core$1.Anchor, Object.assign({ href: href, "aria-label": label, onClick: (e) => {
1063
1081
  killEvent(e);
1064
- if (props.onClick) {
1065
- props.onClick();
1082
+ if (onClick) {
1083
+ onClick();
1066
1084
  }
1067
- else if (props.to) {
1085
+ else if (to) {
1068
1086
  navigate(href);
1069
1087
  }
1070
- } }, props.children));
1088
+ } }, rest), children));
1071
1089
  }
1072
1090
  function getHref(to) {
1073
1091
  if (to) {
@@ -1104,10 +1122,10 @@
1104
1122
  // The "link" prop defaults to "true"; undefined is treated as "true"
1105
1123
  // To disable the link, it must be explicitly "false"
1106
1124
  if (props.link !== false && props.value.reference) {
1107
- return React__default["default"].createElement(MedplumLink, { to: props.value }, displayString);
1125
+ return React.createElement(MedplumLink, { to: props.value }, displayString);
1108
1126
  }
1109
1127
  else {
1110
- return React__default["default"].createElement(React__default["default"].Fragment, null, displayString);
1128
+ return React.createElement(React.Fragment, null, displayString);
1111
1129
  }
1112
1130
  }
1113
1131
 
@@ -1116,8 +1134,8 @@
1116
1134
  const property = props.property;
1117
1135
  const values = (_a = props.values) !== null && _a !== void 0 ? _a : [];
1118
1136
  const propertyType = (_c = (_b = property.type) === null || _b === void 0 ? void 0 : _b[0]) === null || _c === void 0 ? void 0 : _c.code;
1119
- return (React__default["default"].createElement(React__default["default"].Fragment, null, values.map((v, index) => (React__default["default"].createElement("div", { key: `${index}-${values.length}` },
1120
- React__default["default"].createElement(ResourcePropertyDisplay, { arrayElement: true, property: property, propertyType: propertyType, value: v, ignoreMissingValues: props.ignoreMissingValues, link: props.link }))))));
1137
+ return (React.createElement(React.Fragment, null, values.map((v, index) => (React.createElement("div", { key: `${index}-${values.length}` },
1138
+ React.createElement(ResourcePropertyDisplay, { arrayElement: true, property: property, propertyType: propertyType, value: v, ignoreMissingValues: props.ignoreMissingValues, link: props.link }))))));
1121
1139
  }
1122
1140
 
1123
1141
  function ResourcePropertyDisplay(props) {
@@ -1125,13 +1143,13 @@
1125
1143
  const { property, propertyType, value } = props;
1126
1144
  if ((property === null || property === void 0 ? void 0 : property.max) === '*' && !props.arrayElement) {
1127
1145
  if (propertyType === 'Attachment') {
1128
- return React__default["default"].createElement(AttachmentArrayDisplay, { values: value, maxWidth: props.maxWidth });
1146
+ return React.createElement(AttachmentArrayDisplay, { values: value, maxWidth: props.maxWidth });
1129
1147
  }
1130
- return (React__default["default"].createElement(ResourceArrayDisplay, { property: property, values: value, ignoreMissingValues: props.ignoreMissingValues, link: props.link }));
1148
+ return (React.createElement(ResourceArrayDisplay, { property: property, values: value, ignoreMissingValues: props.ignoreMissingValues, link: props.link }));
1131
1149
  }
1132
1150
  switch (propertyType) {
1133
1151
  case core.PropertyType.boolean:
1134
- return React__default["default"].createElement("div", null, value === undefined ? '' : Boolean(value).toString());
1152
+ return React.createElement(React.Fragment, null, value === undefined ? '' : Boolean(value).toString());
1135
1153
  case core.PropertyType.SystemString:
1136
1154
  case core.PropertyType.code:
1137
1155
  case core.PropertyType.date:
@@ -1141,49 +1159,49 @@
1141
1159
  case core.PropertyType.unsignedInt:
1142
1160
  case core.PropertyType.uri:
1143
1161
  case core.PropertyType.url:
1144
- return React__default["default"].createElement("div", null, value);
1162
+ return React.createElement(React.Fragment, null, value);
1145
1163
  case core.PropertyType.canonical:
1146
- return React__default["default"].createElement(ReferenceDisplay, { value: { reference: value }, link: props.link });
1164
+ return React.createElement(ReferenceDisplay, { value: { reference: value }, link: props.link });
1147
1165
  case core.PropertyType.dateTime:
1148
1166
  case core.PropertyType.instant:
1149
- return React__default["default"].createElement("div", null, core.formatDateTime(value));
1167
+ return React.createElement(React.Fragment, null, core.formatDateTime(value));
1150
1168
  case core.PropertyType.markdown:
1151
- return React__default["default"].createElement("pre", null, value);
1169
+ return React.createElement("pre", null, value);
1152
1170
  case core.PropertyType.Address:
1153
- return React__default["default"].createElement(AddressDisplay, { value: value });
1171
+ return React.createElement(AddressDisplay, { value: value });
1154
1172
  case core.PropertyType.Annotation:
1155
- return React__default["default"].createElement("div", null, value === null || value === void 0 ? void 0 : value.text);
1173
+ return React.createElement(React.Fragment, null, value === null || value === void 0 ? void 0 : value.text);
1156
1174
  case core.PropertyType.Attachment:
1157
- return React__default["default"].createElement(AttachmentDisplay, { value: value, maxWidth: props.maxWidth });
1175
+ return React.createElement(AttachmentDisplay, { value: value, maxWidth: props.maxWidth });
1158
1176
  case core.PropertyType.CodeableConcept:
1159
- return React__default["default"].createElement(CodeableConceptDisplay, { value: value });
1177
+ return React.createElement(CodeableConceptDisplay, { value: value });
1160
1178
  case core.PropertyType.Coding:
1161
- return React__default["default"].createElement(CodingDisplay, { value: value });
1179
+ return React.createElement(CodingDisplay, { value: value });
1162
1180
  case core.PropertyType.ContactDetail:
1163
- return React__default["default"].createElement(ContactDetailDisplay, { value: value });
1181
+ return React.createElement(ContactDetailDisplay, { value: value });
1164
1182
  case core.PropertyType.ContactPoint:
1165
- return React__default["default"].createElement(ContactPointDisplay, { value: value });
1183
+ return React.createElement(ContactPointDisplay, { value: value });
1166
1184
  case core.PropertyType.HumanName:
1167
- return React__default["default"].createElement(HumanNameDisplay, { value: value });
1185
+ return React.createElement(HumanNameDisplay, { value: value });
1168
1186
  case core.PropertyType.Identifier:
1169
- return React__default["default"].createElement(IdentifierDisplay, { value: value });
1187
+ return React.createElement(IdentifierDisplay, { value: value });
1170
1188
  case core.PropertyType.Period:
1171
- return React__default["default"].createElement("div", null, core.formatPeriod(value));
1189
+ return React.createElement(React.Fragment, null, core.formatPeriod(value));
1172
1190
  case core.PropertyType.Quantity:
1173
- return React__default["default"].createElement(QuantityDisplay, { value: value });
1191
+ return React.createElement(QuantityDisplay, { value: value });
1174
1192
  case core.PropertyType.Range:
1175
- return React__default["default"].createElement(RangeDisplay, { value: value });
1193
+ return React.createElement(RangeDisplay, { value: value });
1176
1194
  case core.PropertyType.Ratio:
1177
- return React__default["default"].createElement(RatioDisplay, { value: value });
1195
+ return React.createElement(RatioDisplay, { value: value });
1178
1196
  case core.PropertyType.Reference:
1179
- return React__default["default"].createElement(ReferenceDisplay, { value: value, link: props.link });
1197
+ return React.createElement(ReferenceDisplay, { value: value, link: props.link });
1180
1198
  case core.PropertyType.Timing:
1181
- return React__default["default"].createElement("div", null, core.formatTiming(value));
1199
+ return React.createElement(React.Fragment, null, core.formatTiming(value));
1182
1200
  default:
1183
1201
  if (!(property === null || property === void 0 ? void 0 : property.path)) {
1184
1202
  throw Error(`Displaying property of type ${props.propertyType} requires element definition path`);
1185
1203
  }
1186
- return (React__default["default"].createElement(BackboneElementDisplay, { value: { type: core.buildTypeName((_a = property === null || property === void 0 ? void 0 : property.path) === null || _a === void 0 ? void 0 : _a.split('.')), value }, compact: true, ignoreMissingValues: props.ignoreMissingValues }));
1204
+ return (React.createElement(BackboneElementDisplay, { value: { type: core.buildTypeName((_a = property === null || property === void 0 ? void 0 : property.path) === null || _a === void 0 ? void 0 : _a.split('.')), value }, compact: true, ignoreMissingValues: props.ignoreMissingValues }));
1187
1205
  }
1188
1206
  }
1189
1207
  /**
@@ -1225,7 +1243,7 @@
1225
1243
  props.onChange(newValue);
1226
1244
  }
1227
1245
  }
1228
- return (React__default["default"].createElement(core$1.TextInput, { name: props.name, placeholder: "Annotation text", defaultValue: value.text, onChange: (e) => setText(e.currentTarget.value) }));
1246
+ return (React.createElement(core$1.TextInput, { name: props.name, placeholder: "Annotation text", defaultValue: value.text, onChange: (e) => setText(e.currentTarget.value) }));
1229
1247
  }
1230
1248
 
1231
1249
  function valueSetElementToAutocompleteItem(element) {
@@ -1274,7 +1292,7 @@
1274
1292
  React.useEffect(() => {
1275
1293
  loadValues('').catch(console.log);
1276
1294
  }, [loadValues]);
1277
- return (React__default["default"].createElement(core$1.MultiSelect, { data: data, placeholder: props.placeholder, searchable: true, creatable: true, clearable: true, value: textValues, filter: (value, selected, item) => {
1295
+ return (React.createElement(core$1.MultiSelect, { data: data, placeholder: props.placeholder, searchable: true, creatable: true, clearable: true, value: textValues, filter: (value, selected, item) => {
1278
1296
  var _a, _b;
1279
1297
  return !!(textValues.length === 0 &&
1280
1298
  !selected &&
@@ -1295,7 +1313,7 @@
1295
1313
  props.onChange(newConcept);
1296
1314
  }
1297
1315
  }
1298
- return (React__default["default"].createElement(ValueSetAutocomplete, { property: props.property, name: props.name, placeholder: props.placeholder, defaultValue: value && codeableConceptToValueSetElement(value), onChange: handleChange }));
1316
+ return (React.createElement(ValueSetAutocomplete, { property: props.property, name: props.name, placeholder: props.placeholder, defaultValue: value && codeableConceptToValueSetElement(value), onChange: handleChange }));
1299
1317
  }
1300
1318
  function codeableConceptToValueSetElement(concept) {
1301
1319
  var _a, _b, _c, _d, _e, _f;
@@ -1327,7 +1345,7 @@
1327
1345
  props.onChange(newCode);
1328
1346
  }
1329
1347
  }
1330
- return (React__default["default"].createElement(ValueSetAutocomplete, { property: props.property, name: props.name, placeholder: props.placeholder, defaultValue: codeToValueSetElement(value), onChange: handleChange }));
1348
+ return (React.createElement(ValueSetAutocomplete, { property: props.property, name: props.name, placeholder: props.placeholder, defaultValue: codeToValueSetElement(value), onChange: handleChange }));
1331
1349
  }
1332
1350
  function codeToValueSetElement(code) {
1333
1351
  return code ? { code } : undefined;
@@ -1345,7 +1363,7 @@
1345
1363
  props.onChange(newConcept);
1346
1364
  }
1347
1365
  }
1348
- return (React__default["default"].createElement(ValueSetAutocomplete, { property: props.property, name: props.name, placeholder: props.placeholder, defaultValue: value && codingToValueSetElement(value), onChange: handleChange }));
1366
+ return (React.createElement(ValueSetAutocomplete, { property: props.property, name: props.name, placeholder: props.placeholder, defaultValue: value && codingToValueSetElement(value), onChange: handleChange }));
1349
1367
  }
1350
1368
  function codingToValueSetElement(coding) {
1351
1369
  return {
@@ -1396,10 +1414,10 @@
1396
1414
  }
1397
1415
  setContactPointWrapper(newValue);
1398
1416
  }
1399
- return (React__default["default"].createElement(core$1.Group, { spacing: "xs", grow: true, noWrap: true },
1400
- React__default["default"].createElement(core$1.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'] }),
1401
- React__default["default"].createElement(core$1.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'] }),
1402
- React__default["default"].createElement(core$1.TextInput, { placeholder: "Value", defaultValue: contactPoint === null || contactPoint === void 0 ? void 0 : contactPoint.value, onChange: (e) => setValue(e.currentTarget.value) })));
1417
+ return (React.createElement(core$1.Group, { spacing: "xs", grow: true, noWrap: true },
1418
+ React.createElement(core$1.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'] }),
1419
+ React.createElement(core$1.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'] }),
1420
+ React.createElement(core$1.TextInput, { placeholder: "Value", defaultValue: contactPoint === null || contactPoint === void 0 ? void 0 : contactPoint.value, onChange: (e) => setValue(e.currentTarget.value) })));
1403
1421
  }
1404
1422
 
1405
1423
  function ContactDetailInput(props) {
@@ -1427,9 +1445,9 @@
1427
1445
  }
1428
1446
  setContactDetailWrapper(newValue);
1429
1447
  }
1430
- return (React__default["default"].createElement(core$1.Group, { spacing: "xs", grow: true, noWrap: true },
1431
- React__default["default"].createElement(core$1.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) }),
1432
- React__default["default"].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 })));
1448
+ return (React.createElement(core$1.Group, { spacing: "xs", grow: true, noWrap: true },
1449
+ React.createElement(core$1.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) }),
1450
+ 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 })));
1433
1451
  }
1434
1452
 
1435
1453
  /**
@@ -1441,7 +1459,7 @@
1441
1459
  * @returns The JSX element to render.
1442
1460
  */
1443
1461
  function DateTimeInput(props) {
1444
- return (React__default["default"].createElement(core$1.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) => {
1462
+ return (React.createElement(core$1.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) => {
1445
1463
  if (props.onChange) {
1446
1464
  const newValue = e.currentTarget.value;
1447
1465
  props.onChange(convertLocalToIso(newValue));
@@ -1496,7 +1514,7 @@
1496
1514
  }
1497
1515
 
1498
1516
  function ExtensionInput(props) {
1499
- return (React__default["default"].createElement(core$1.JsonInput, { id: props.name, name: props.name, "data-testid": "extension-input", defaultValue: core.stringify(props.defaultValue), onChange: (newValue) => {
1517
+ return (React.createElement(core$1.JsonInput, { id: props.name, name: props.name, "data-testid": "extension-input", defaultValue: core.stringify(props.defaultValue), onChange: (newValue) => {
1500
1518
  if (props.onChange) {
1501
1519
  props.onChange(JSON.parse(newValue));
1502
1520
  }
@@ -1529,12 +1547,12 @@
1529
1547
  function setSuffix(suffix) {
1530
1548
  setValueWrapper(Object.assign(Object.assign({}, valueRef.current), { suffix: suffix ? suffix.split(' ') : undefined }));
1531
1549
  }
1532
- return (React__default["default"].createElement(core$1.Group, { spacing: "xs", grow: true, noWrap: true },
1533
- React__default["default"].createElement(core$1.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'] }),
1534
- React__default["default"].createElement(core$1.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) }),
1535
- React__default["default"].createElement(core$1.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) }),
1536
- React__default["default"].createElement(core$1.TextInput, { placeholder: "Family", defaultValue: value === null || value === void 0 ? void 0 : value.family, onChange: (e) => setFamily(e.currentTarget.value) }),
1537
- React__default["default"].createElement(core$1.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) })));
1550
+ return (React.createElement(core$1.Group, { spacing: "xs", grow: true, noWrap: true },
1551
+ React.createElement(core$1.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'] }),
1552
+ React.createElement(core$1.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) }),
1553
+ React.createElement(core$1.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) }),
1554
+ React.createElement(core$1.TextInput, { placeholder: "Family", defaultValue: value === null || value === void 0 ? void 0 : value.family, onChange: (e) => setFamily(e.currentTarget.value) }),
1555
+ React.createElement(core$1.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) })));
1538
1556
  }
1539
1557
 
1540
1558
  function IdentifierInput(props) {
@@ -1545,9 +1563,9 @@
1545
1563
  props.onChange(newValue);
1546
1564
  }
1547
1565
  }
1548
- return (React__default["default"].createElement(core$1.Group, { spacing: "xs", grow: true, noWrap: true },
1549
- React__default["default"].createElement(core$1.TextInput, { placeholder: "System", defaultValue: value === null || value === void 0 ? void 0 : value.system, onChange: (e) => setValueWrapper(Object.assign(Object.assign({}, value), { system: e.currentTarget.value })) }),
1550
- React__default["default"].createElement(core$1.TextInput, { placeholder: "Value", defaultValue: value === null || value === void 0 ? void 0 : value.value, onChange: (e) => setValueWrapper(Object.assign(Object.assign({}, value), { value: e.currentTarget.value })) })));
1566
+ return (React.createElement(core$1.Group, { spacing: "xs", grow: true, noWrap: true },
1567
+ React.createElement(core$1.TextInput, { placeholder: "System", defaultValue: value === null || value === void 0 ? void 0 : value.system, onChange: (e) => setValueWrapper(Object.assign(Object.assign({}, value), { system: e.currentTarget.value })) }),
1568
+ React.createElement(core$1.TextInput, { placeholder: "Value", defaultValue: value === null || value === void 0 ? void 0 : value.value, onChange: (e) => setValueWrapper(Object.assign(Object.assign({}, value), { value: e.currentTarget.value })) })));
1551
1569
  }
1552
1570
 
1553
1571
  function PeriodInput(props) {
@@ -1558,9 +1576,9 @@
1558
1576
  props.onChange(newValue);
1559
1577
  }
1560
1578
  }
1561
- return (React__default["default"].createElement(core$1.Group, { spacing: "xs", grow: true, noWrap: true },
1562
- React__default["default"].createElement(DateTimeInput, { name: props.name + '.start', placeholder: "Start", defaultValue: value === null || value === void 0 ? void 0 : value.start, onChange: (newValue) => setValueWrapper(Object.assign(Object.assign({}, value), { start: newValue })) }),
1563
- React__default["default"].createElement(DateTimeInput, { name: props.name + '.end', placeholder: "End", defaultValue: value === null || value === void 0 ? void 0 : value.end, onChange: (newValue) => setValueWrapper(Object.assign(Object.assign({}, value), { end: newValue })) })));
1579
+ return (React.createElement(core$1.Group, { spacing: "xs", grow: true, noWrap: true },
1580
+ React.createElement(DateTimeInput, { name: props.name + '.start', placeholder: "Start", defaultValue: value === null || value === void 0 ? void 0 : value.start, onChange: (newValue) => setValueWrapper(Object.assign(Object.assign({}, value), { start: newValue })) }),
1581
+ React.createElement(DateTimeInput, { name: props.name + '.end', placeholder: "End", defaultValue: value === null || value === void 0 ? void 0 : value.end, onChange: (newValue) => setValueWrapper(Object.assign(Object.assign({}, value), { end: newValue })) })));
1564
1582
  }
1565
1583
 
1566
1584
  function QuantityInput(props) {
@@ -1572,10 +1590,10 @@
1572
1590
  props.onChange(newValue);
1573
1591
  }
1574
1592
  }
1575
- return (React__default["default"].createElement(core$1.Group, { spacing: "xs", grow: true, noWrap: true },
1576
- React__default["default"].createElement(core$1.NativeSelect, { style: { width: 80 }, "data-testid": props.name + '-comparator', defaultValue: value === null || value === void 0 ? void 0 : value.comparator, data: ['', '<', '<=', '>=', '>'], onChange: (e) => setValueWrapper(Object.assign(Object.assign({}, value), { comparator: e.currentTarget.value })) }),
1577
- React__default["default"].createElement(core$1.TextInput, { id: props.name, name: props.name, "data-testid": props.name, type: "number", step: "any", placeholder: "Value", defaultValue: (_a = value === null || value === void 0 ? void 0 : value.value) === null || _a === void 0 ? void 0 : _a.toString(), onChange: (e) => setValueWrapper(Object.assign(Object.assign({}, value), { value: tryParseNumber(e.currentTarget.value) })) }),
1578
- React__default["default"].createElement(core$1.TextInput, { placeholder: "Unit", defaultValue: value === null || value === void 0 ? void 0 : value.unit, onChange: (e) => setValueWrapper(Object.assign(Object.assign({}, value), { unit: e.currentTarget.value })) })));
1593
+ return (React.createElement(core$1.Group, { spacing: "xs", grow: true, noWrap: true },
1594
+ React.createElement(core$1.NativeSelect, { style: { width: 80 }, "data-testid": props.name + '-comparator', defaultValue: value === null || value === void 0 ? void 0 : value.comparator, data: ['', '<', '<=', '>=', '>'], onChange: (e) => setValueWrapper(Object.assign(Object.assign({}, value), { comparator: e.currentTarget.value })) }),
1595
+ React.createElement(core$1.TextInput, { id: props.name, name: props.name, "data-testid": props.name, type: "number", step: "any", placeholder: "Value", defaultValue: (_a = value === null || value === void 0 ? void 0 : value.value) === null || _a === void 0 ? void 0 : _a.toString(), onChange: (e) => setValueWrapper(Object.assign(Object.assign({}, value), { value: tryParseNumber(e.currentTarget.value) })) }),
1596
+ React.createElement(core$1.TextInput, { placeholder: "Unit", defaultValue: value === null || value === void 0 ? void 0 : value.unit, onChange: (e) => setValueWrapper(Object.assign(Object.assign({}, value), { unit: e.currentTarget.value })) })));
1579
1597
  }
1580
1598
  function tryParseNumber(str) {
1581
1599
  if (!str) {
@@ -1598,9 +1616,9 @@
1598
1616
  props.onChange(newValue);
1599
1617
  }
1600
1618
  }
1601
- return (React__default["default"].createElement(core$1.Group, { spacing: "xs", grow: true, noWrap: true },
1602
- React__default["default"].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 })) }),
1603
- React__default["default"].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 })) })));
1619
+ return (React.createElement(core$1.Group, { spacing: "xs", grow: true, noWrap: true },
1620
+ 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 })) }),
1621
+ 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 })) })));
1604
1622
  }
1605
1623
 
1606
1624
  /**
@@ -1617,9 +1635,9 @@
1617
1635
  props.onChange(newValue);
1618
1636
  }
1619
1637
  }
1620
- return (React__default["default"].createElement(core$1.Group, { spacing: "xs", grow: true, noWrap: true },
1621
- React__default["default"].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 })) }),
1622
- React__default["default"].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 })) })));
1638
+ return (React.createElement(core$1.Group, { spacing: "xs", grow: true, noWrap: true },
1639
+ 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 })) }),
1640
+ 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 })) })));
1623
1641
  }
1624
1642
 
1625
1643
  function ResourceAvatar(props) {
@@ -1632,22 +1650,48 @@
1632
1650
  delete avatarProps.value;
1633
1651
  delete avatarProps.link;
1634
1652
  if (props.link) {
1635
- return (React__default["default"].createElement(MedplumLink, { to: resource },
1636
- React__default["default"].createElement(core$1.Avatar, Object.assign({ src: imageUrl, alt: text, radius: radius }, avatarProps))));
1653
+ return (React.createElement(MedplumLink, { to: resource },
1654
+ React.createElement(core$1.Avatar, Object.assign({ src: imageUrl, alt: text, radius: radius }, avatarProps))));
1637
1655
  }
1638
- return React__default["default"].createElement(core$1.Avatar, Object.assign({ src: imageUrl, alt: text, radius: radius }, avatarProps));
1656
+ return React.createElement(core$1.Avatar, Object.assign({ src: imageUrl, alt: text, radius: radius }, avatarProps));
1639
1657
  }
1640
1658
 
1659
+ /**
1660
+ * Defines which search parameters will be used by the type ahead to search for each resourceType
1661
+ */
1662
+ const SEARCH_CODES = {
1663
+ Schedule: '_id',
1664
+ Task: '_id',
1665
+ Patient: 'name',
1666
+ Practitioner: 'name',
1667
+ Questionnaire: 'name',
1668
+ ServiceRequest: '_id',
1669
+ DiagnosticReport: '_id',
1670
+ Specimen: '_id',
1671
+ Observation: 'code',
1672
+ RequestGroup: '_id',
1673
+ ActivityDefinition: 'name',
1674
+ };
1641
1675
  function ResourceInput(props) {
1642
1676
  const medplum = useMedplum();
1643
1677
  const defaultValue = useResource(props.defaultValue);
1644
1678
  const [value, setValue] = React.useState(defaultValue ? core.getDisplayString(defaultValue) : '');
1645
1679
  const [loading, setLoading] = React.useState(false);
1646
1680
  const [data, setData] = React.useState([]);
1681
+ React.useEffect(() => {
1682
+ if (defaultValue) {
1683
+ setValue(core.getDisplayString(defaultValue));
1684
+ }
1685
+ }, [defaultValue, setValue]);
1647
1686
  function loadValues(input) {
1648
1687
  return __awaiter(this, void 0, void 0, function* () {
1649
1688
  setLoading(true);
1650
- const resources = yield medplum.searchResources(props.resourceType, 'name=' + encodeURIComponent(input) + '&_count=10');
1689
+ const searchCode = SEARCH_CODES[props.resourceType] || 'name';
1690
+ const searchParams = new URLSearchParams({
1691
+ [searchCode]: encodeURIComponent(input),
1692
+ _count: '10',
1693
+ });
1694
+ const resources = yield medplum.searchResources(props.resourceType, searchParams);
1651
1695
  setData(resources.map((resource) => ({ value: core.getDisplayString(resource), resource })));
1652
1696
  setLoading(false);
1653
1697
  });
@@ -1665,16 +1709,16 @@
1665
1709
  props.onChange(item.resource);
1666
1710
  }
1667
1711
  }
1668
- return (React__default["default"].createElement(core$1.Autocomplete, { itemComponent: ItemComponent, value: value, data: data, placeholder: props.placeholder, onFocus: () => loadValues(value), onChange: handleChange, onItemSubmit: handleSelect, rightSection: loading ? React__default["default"].createElement(core$1.Loader, { size: 16 }) : null }));
1712
+ return (React.createElement(core$1.Autocomplete, { itemComponent: ItemComponent, value: value, data: data, placeholder: props.placeholder, onFocus: () => loadValues(value), onChange: handleChange, onItemSubmit: handleSelect, rightSection: loading ? React.createElement(core$1.Loader, { size: 16 }) : null }));
1669
1713
  }
1670
1714
  const ItemComponent = React.forwardRef((_a, ref) => {
1671
1715
  var { value, resource } = _a, others = __rest(_a, ["value", "resource"]);
1672
- return (React__default["default"].createElement("div", Object.assign({ ref: ref }, others),
1673
- React__default["default"].createElement(core$1.Group, { noWrap: true },
1674
- React__default["default"].createElement(ResourceAvatar, { value: resource }),
1675
- React__default["default"].createElement("div", null,
1676
- React__default["default"].createElement(core$1.Text, null, value),
1677
- React__default["default"].createElement(core$1.Text, { size: "xs", color: "dimmed" }, resource.birthDate)))));
1716
+ return (React.createElement("div", Object.assign({ ref: ref }, others),
1717
+ React.createElement(core$1.Group, { noWrap: true },
1718
+ React.createElement(ResourceAvatar, { value: resource }),
1719
+ React.createElement("div", null,
1720
+ React.createElement(core$1.Text, null, value),
1721
+ React.createElement(core$1.Text, { size: "xs", color: "dimmed" }, resource.birthDate)))));
1678
1722
  });
1679
1723
 
1680
1724
  function ReferenceInput(props) {
@@ -1692,9 +1736,9 @@
1692
1736
  props.onChange(newValue);
1693
1737
  }
1694
1738
  }
1695
- return (React__default["default"].createElement(core$1.Group, { spacing: "xs", grow: true, noWrap: true },
1696
- targetTypes ? (React__default["default"].createElement(core$1.NativeSelect, { "data-testid": "reference-input-resource-type-select", defaultValue: resourceType, onChange: (e) => setResourceType(e.currentTarget.value), data: targetTypes })) : (React__default["default"].createElement(core$1.TextInput, { "data-testid": "reference-input-resource-type-input", defaultValue: resourceType, onChange: (e) => setResourceType(e.currentTarget.value) })),
1697
- React__default["default"].createElement(ResourceInput, { resourceType: resourceType, name: props.name + '-id', placeholder: props.placeholder, defaultValue: value, onChange: (item) => {
1739
+ return (React.createElement(core$1.Group, { spacing: "xs", grow: true, noWrap: true },
1740
+ targetTypes ? (React.createElement(core$1.NativeSelect, { "data-testid": "reference-input-resource-type-select", defaultValue: resourceType, onChange: (e) => setResourceType(e.currentTarget.value), data: targetTypes })) : (React.createElement(core$1.TextInput, { "data-testid": "reference-input-resource-type-input", defaultValue: resourceType, onChange: (e) => setResourceType(e.currentTarget.value) })),
1741
+ React.createElement(ResourceInput, { resourceType: resourceType, name: props.name + '-id', placeholder: props.placeholder, defaultValue: value, onChange: (item) => {
1698
1742
  setValueHelper(item ? core.createReference(item) : undefined);
1699
1743
  } })));
1700
1744
  }
@@ -1720,36 +1764,36 @@
1720
1764
  props.onChange(newValues);
1721
1765
  }
1722
1766
  }
1723
- return (React__default["default"].createElement("table", { style: { width: '100%', borderCollapse: 'collapse' } },
1724
- React__default["default"].createElement("colgroup", null,
1725
- React__default["default"].createElement("col", { width: "97%" }),
1726
- React__default["default"].createElement("col", { width: "3%" })),
1727
- React__default["default"].createElement("tbody", null,
1728
- values.map((v, index) => (React__default["default"].createElement("tr", { key: `${index}-${values.length}` },
1729
- React__default["default"].createElement("td", null,
1730
- React__default["default"].createElement(ResourcePropertyInput, { arrayElement: true, property: props.property, name: props.name + '.' + index, defaultValue: v, onChange: (newValue) => {
1767
+ return (React.createElement("table", { style: { width: '100%', borderCollapse: 'collapse' } },
1768
+ React.createElement("colgroup", null,
1769
+ React.createElement("col", { width: "97%" }),
1770
+ React.createElement("col", { width: "3%" })),
1771
+ React.createElement("tbody", null,
1772
+ values.map((v, index) => (React.createElement("tr", { key: `${index}-${values.length}` },
1773
+ React.createElement("td", null,
1774
+ React.createElement(ResourcePropertyInput, { arrayElement: true, property: props.property, name: props.name + '.' + index, defaultValue: v, onChange: (newValue) => {
1731
1775
  const copy = [...valuesRef.current];
1732
1776
  copy[index] = newValue;
1733
1777
  setValuesWrapper(copy);
1734
1778
  } })),
1735
- React__default["default"].createElement("td", { style: { textAlign: 'right' } },
1736
- React__default["default"].createElement(core$1.ActionIcon, { title: "Remove", size: "sm", onClick: (e) => {
1779
+ React.createElement("td", { style: { textAlign: 'right' } },
1780
+ React.createElement(core$1.ActionIcon, { title: "Remove", size: "sm", onClick: (e) => {
1737
1781
  killEvent(e);
1738
1782
  const copy = [...valuesRef.current];
1739
1783
  copy.splice(index, 1);
1740
1784
  setValuesWrapper(copy);
1741
1785
  } },
1742
- React__default["default"].createElement(icons.IconCircleMinus, null)))))),
1743
- React__default["default"].createElement("tr", null,
1744
- React__default["default"].createElement("td", null),
1745
- React__default["default"].createElement("td", { style: { textAlign: 'right' } },
1746
- React__default["default"].createElement(core$1.ActionIcon, { title: "Add", size: "sm", color: "green", onClick: (e) => {
1786
+ React.createElement(icons.IconCircleMinus, null)))))),
1787
+ React.createElement("tr", null,
1788
+ React.createElement("td", null),
1789
+ React.createElement("td", { style: { textAlign: 'right' } },
1790
+ React.createElement(core$1.ActionIcon, { title: "Add", size: "sm", color: "green", onClick: (e) => {
1747
1791
  killEvent(e);
1748
1792
  const copy = [...valuesRef.current];
1749
1793
  copy.push(undefined);
1750
1794
  setValuesWrapper(copy);
1751
1795
  } },
1752
- React__default["default"].createElement(icons.IconCirclePlus, null)))))));
1796
+ React.createElement(icons.IconCirclePlus, null)))))));
1753
1797
  }
1754
1798
 
1755
1799
  const daysOfWeek = ['sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat'];
@@ -1758,11 +1802,11 @@
1758
1802
  const [open, setOpen] = React.useState(false);
1759
1803
  const valueRef = React.useRef();
1760
1804
  valueRef.current = value;
1761
- return (React__default["default"].createElement(React__default["default"].Fragment, null,
1762
- React__default["default"].createElement(core$1.Group, { spacing: "xs", grow: true, noWrap: true },
1763
- React__default["default"].createElement("span", null, core.formatTiming(valueRef.current) || 'No repeat'),
1764
- React__default["default"].createElement(core$1.Button, { onClick: () => setOpen(true) }, "Edit")),
1765
- React__default["default"].createElement(TimingEditorDialog, { visible: open, defaultValue: valueRef.current, onOk: (newValue) => {
1805
+ return (React.createElement(React.Fragment, null,
1806
+ React.createElement(core$1.Group, { spacing: "xs", grow: true, noWrap: true },
1807
+ React.createElement("span", null, core.formatTiming(valueRef.current) || 'No repeat'),
1808
+ React.createElement(core$1.Button, { onClick: () => setOpen(true) }, "Edit")),
1809
+ React.createElement(TimingEditorDialog, { visible: open, defaultValue: valueRef.current, onOk: (newValue) => {
1766
1810
  if (props.onChange) {
1767
1811
  props.onChange(newValue);
1768
1812
  }
@@ -1811,24 +1855,24 @@
1811
1855
  setRepeat(Object.assign(Object.assign({}, (_c = valueRef.current) === null || _c === void 0 ? void 0 : _c.repeat), { dayOfWeek: existing.filter((d) => d !== day) }));
1812
1856
  }
1813
1857
  }
1814
- return (React__default["default"].createElement(core$1.Modal, { title: "Timing", closeButtonLabel: "Close", opened: props.visible, onClose: () => props.onCancel() },
1815
- React__default["default"].createElement("div", { style: { padding: '5px 20px', textAlign: 'left' } },
1816
- React__default["default"].createElement(FormSection, { title: "Starts on", htmlFor: 'timing-dialog-start' },
1817
- React__default["default"].createElement(DateTimeInput, { name: 'timing-dialog-start', onChange: (newValue) => setStart(newValue) })),
1818
- React__default["default"].createElement(FormSection, { title: "Repeat every", htmlFor: 'timing-dialog-period' },
1819
- React__default["default"].createElement(core$1.Group, { spacing: "xs", grow: true, noWrap: true },
1820
- React__default["default"].createElement(core$1.TextInput, { type: "number", step: 1, id: "timing-dialog-period", name: "timing-dialog-period", defaultValue: (_a = value === null || value === void 0 ? void 0 : value.repeat) === null || _a === void 0 ? void 0 : _a.period, onChange: (e) => setPeriod(parseInt(e.currentTarget.value)) }),
1821
- React__default["default"].createElement(core$1.NativeSelect, { id: "timing-dialog-periodUnit", name: "timing-dialog-periodUnit", defaultValue: (_b = value === null || value === void 0 ? void 0 : value.repeat) === null || _b === void 0 ? void 0 : _b.periodUnit, onChange: (e) => setPeriodUnit(e.currentTarget.value), data: [
1858
+ return (React.createElement(core$1.Modal, { title: "Timing", closeButtonLabel: "Close", opened: props.visible, onClose: () => props.onCancel() },
1859
+ React.createElement("div", { style: { padding: '5px 20px', textAlign: 'left' } },
1860
+ React.createElement(FormSection, { title: "Starts on", htmlFor: 'timing-dialog-start' },
1861
+ React.createElement(DateTimeInput, { name: 'timing-dialog-start', onChange: (newValue) => setStart(newValue) })),
1862
+ React.createElement(FormSection, { title: "Repeat every", htmlFor: 'timing-dialog-period' },
1863
+ React.createElement(core$1.Group, { spacing: "xs", grow: true, noWrap: true },
1864
+ React.createElement(core$1.TextInput, { type: "number", step: 1, id: "timing-dialog-period", name: "timing-dialog-period", defaultValue: (_a = value === null || value === void 0 ? void 0 : value.repeat) === null || _a === void 0 ? void 0 : _a.period, onChange: (e) => setPeriod(parseInt(e.currentTarget.value)) }),
1865
+ React.createElement(core$1.NativeSelect, { id: "timing-dialog-periodUnit", name: "timing-dialog-periodUnit", defaultValue: (_b = value === null || value === void 0 ? void 0 : value.repeat) === null || _b === void 0 ? void 0 : _b.periodUnit, onChange: (e) => setPeriodUnit(e.currentTarget.value), data: [
1822
1866
  { label: 'day', value: 'd' },
1823
1867
  { label: 'week', value: 'wk' },
1824
1868
  { label: 'month', value: 'mo' },
1825
1869
  { label: 'year', value: 'a' },
1826
1870
  ] }))),
1827
- React__default["default"].createElement(FormSection, { title: "Repeat on" },
1828
- React__default["default"].createElement(core$1.Group, { spacing: "xs", grow: true, noWrap: true }, daysOfWeek.map((day) => (React__default["default"].createElement(React__default["default"].Fragment, { key: day },
1829
- React__default["default"].createElement("label", { htmlFor: 'timing-dialog-repeat-' + day }, day.charAt(0).toUpperCase()),
1830
- React__default["default"].createElement(core$1.Checkbox, { id: 'timing-dialog-repeat-' + day, name: 'timing-dialog-repeat-' + day, onChange: (e) => setDayOfWeek(day, e.currentTarget.checked) }))))))),
1831
- React__default["default"].createElement(core$1.Button, { onClick: () => props.onOk(value) }, "OK")));
1871
+ React.createElement(FormSection, { title: "Repeat on" },
1872
+ React.createElement(core$1.Group, { spacing: "xs", grow: true, noWrap: true }, daysOfWeek.map((day) => (React.createElement(React.Fragment, { key: day },
1873
+ React.createElement("label", { htmlFor: 'timing-dialog-repeat-' + day }, day.charAt(0).toUpperCase()),
1874
+ React.createElement(core$1.Checkbox, { id: 'timing-dialog-repeat-' + day, name: 'timing-dialog-repeat-' + day, onChange: (e) => setDayOfWeek(day, e.currentTarget.checked) }))))))),
1875
+ React.createElement(core$1.Button, { onClick: () => props.onOk(value) }, "OK")));
1832
1876
  }
1833
1877
 
1834
1878
  function ResourcePropertyInput(props) {
@@ -1839,16 +1883,16 @@
1839
1883
  const value = props.defaultValue;
1840
1884
  if (property.max === '*' && !props.arrayElement) {
1841
1885
  if (propertyType === 'Attachment') {
1842
- return React__default["default"].createElement(AttachmentArrayInput, { name: name, defaultValue: value, onChange: props.onChange });
1886
+ return React.createElement(AttachmentArrayInput, { name: name, defaultValue: value, onChange: props.onChange });
1843
1887
  }
1844
- return React__default["default"].createElement(ResourceArrayInput, { property: property, name: name, defaultValue: value, onChange: props.onChange });
1888
+ return React.createElement(ResourceArrayInput, { property: property, name: name, defaultValue: value, onChange: props.onChange });
1845
1889
  }
1846
1890
  const propertyTypes = property.type;
1847
1891
  if (propertyTypes.length > 1) {
1848
- return React__default["default"].createElement(ElementDefinitionInputSelector, Object.assign({ elementDefinitionTypes: propertyTypes }, props));
1892
+ return React.createElement(ElementDefinitionInputSelector, Object.assign({ elementDefinitionTypes: propertyTypes }, props));
1849
1893
  }
1850
1894
  else {
1851
- return React__default["default"].createElement(ElementDefinitionTypeInput, Object.assign({ elementDefinitionType: propertyTypes[0] }, props));
1895
+ return React.createElement(ElementDefinitionTypeInput, Object.assign({ elementDefinitionType: propertyTypes[0] }, props));
1852
1896
  }
1853
1897
  }
1854
1898
  function ElementDefinitionInputSelector(props) {
@@ -1861,14 +1905,14 @@
1861
1905
  initialPropertyType = propertyTypes[0];
1862
1906
  }
1863
1907
  const [selectedType, setSelectedType] = React.useState(initialPropertyType);
1864
- return (React__default["default"].createElement(core$1.Group, { spacing: "xs", grow: true, noWrap: true },
1865
- React__default["default"].createElement(core$1.NativeSelect, { style: { width: '200px' }, defaultValue: selectedType === null || selectedType === void 0 ? void 0 : selectedType.code, onChange: (e) => {
1908
+ return (React.createElement(core$1.Group, { spacing: "xs", grow: true, noWrap: true },
1909
+ React.createElement(core$1.NativeSelect, { style: { width: '200px' }, defaultValue: selectedType === null || selectedType === void 0 ? void 0 : selectedType.code, onChange: (e) => {
1866
1910
  setSelectedType(propertyTypes.find((type) => type.code === e.currentTarget.value));
1867
1911
  }, data: propertyTypes.map((type) => ({
1868
1912
  value: type.code,
1869
1913
  label: type.code,
1870
1914
  })) }),
1871
- React__default["default"].createElement(ElementDefinitionTypeInput, Object.assign({}, props, { elementDefinitionType: selectedType, onChange: (newValue) => {
1915
+ React.createElement(ElementDefinitionTypeInput, Object.assign({}, props, { elementDefinitionType: selectedType, onChange: (newValue) => {
1872
1916
  if (props.onChange) {
1873
1917
  props.onChange(newValue, props.name.replace('[x]', core.capitalize(selectedType.code)));
1874
1918
  }
@@ -1889,39 +1933,39 @@
1889
1933
  case core.PropertyType.time:
1890
1934
  case core.PropertyType.uri:
1891
1935
  case core.PropertyType.url:
1892
- return (React__default["default"].createElement(core$1.TextInput, { id: name, name: name, "data-testid": name, defaultValue: value, onChange: (e) => {
1936
+ return (React.createElement(core$1.TextInput, { id: name, name: name, "data-testid": name, defaultValue: value, onChange: (e) => {
1893
1937
  if (props.onChange) {
1894
1938
  props.onChange(e.currentTarget.value);
1895
1939
  }
1896
1940
  }, error: getErrorsForInput(props.outcome, name) }));
1897
1941
  case core.PropertyType.date:
1898
- return (React__default["default"].createElement(core$1.TextInput, { type: "date", id: name, name: name, "data-testid": name, defaultValue: value, onChange: (e) => {
1942
+ return (React.createElement(core$1.TextInput, { type: "date", id: name, name: name, "data-testid": name, defaultValue: value, onChange: (e) => {
1899
1943
  if (props.onChange) {
1900
1944
  props.onChange(e.currentTarget.value);
1901
1945
  }
1902
1946
  }, error: getErrorsForInput(props.outcome, name) }));
1903
1947
  case core.PropertyType.dateTime:
1904
1948
  case core.PropertyType.instant:
1905
- return React__default["default"].createElement(DateTimeInput, { name: name, defaultValue: value, onChange: props.onChange, outcome: props.outcome });
1949
+ return React.createElement(DateTimeInput, { name: name, defaultValue: value, onChange: props.onChange, outcome: props.outcome });
1906
1950
  case core.PropertyType.decimal:
1907
1951
  case core.PropertyType.integer:
1908
1952
  case core.PropertyType.positiveInt:
1909
1953
  case core.PropertyType.unsignedInt:
1910
- return (React__default["default"].createElement(core$1.TextInput, { type: "number", step: propertyType === core.PropertyType.decimal ? 'any' : '1', id: name, name: name, "data-testid": name, defaultValue: value, onChange: (e) => {
1954
+ return (React.createElement(core$1.TextInput, { type: "number", step: propertyType === core.PropertyType.decimal ? 'any' : '1', id: name, name: name, "data-testid": name, defaultValue: value, onChange: (e) => {
1911
1955
  if (props.onChange) {
1912
1956
  props.onChange(e.currentTarget.valueAsNumber);
1913
1957
  }
1914
1958
  } }));
1915
1959
  case core.PropertyType.code:
1916
- return React__default["default"].createElement(CodeInput, { property: property, name: name, defaultValue: value, onChange: props.onChange });
1960
+ return React.createElement(CodeInput, { property: property, name: name, defaultValue: value, onChange: props.onChange });
1917
1961
  case core.PropertyType.boolean:
1918
- return (React__default["default"].createElement(core$1.Checkbox, { id: name, name: name, "data-testid": name, defaultChecked: !!value, onChange: (e) => {
1962
+ return (React.createElement(core$1.Checkbox, { id: name, name: name, "data-testid": name, defaultChecked: !!value, onChange: (e) => {
1919
1963
  if (props.onChange) {
1920
1964
  props.onChange(e.currentTarget.checked);
1921
1965
  }
1922
1966
  } }));
1923
1967
  case core.PropertyType.markdown:
1924
- return (React__default["default"].createElement(core$1.Textarea, { id: name, name: name, "data-testid": name, defaultValue: value, onChange: (e) => {
1968
+ return (React.createElement(core$1.Textarea, { id: name, name: name, "data-testid": name, defaultValue: value, onChange: (e) => {
1925
1969
  if (props.onChange) {
1926
1970
  props.onChange(e.currentTarget.value);
1927
1971
  }
@@ -1929,39 +1973,39 @@
1929
1973
  // 2.24.0.2 Complex Types
1930
1974
  // https://www.hl7.org/fhir/datatypes.html#complex
1931
1975
  case core.PropertyType.Address:
1932
- return React__default["default"].createElement(AddressInput, { name: name, defaultValue: value, onChange: props.onChange });
1976
+ return React.createElement(AddressInput, { name: name, defaultValue: value, onChange: props.onChange });
1933
1977
  case core.PropertyType.Annotation:
1934
- return React__default["default"].createElement(AnnotationInput, { name: name, defaultValue: value, onChange: props.onChange });
1978
+ return React.createElement(AnnotationInput, { name: name, defaultValue: value, onChange: props.onChange });
1935
1979
  case core.PropertyType.Attachment:
1936
- return React__default["default"].createElement(AttachmentInput, { name: name, defaultValue: value, onChange: props.onChange });
1980
+ return React.createElement(AttachmentInput, { name: name, defaultValue: value, onChange: props.onChange });
1937
1981
  case core.PropertyType.CodeableConcept:
1938
- return React__default["default"].createElement(CodeableConceptInput, { property: property, name: name, defaultValue: value, onChange: props.onChange });
1982
+ return React.createElement(CodeableConceptInput, { property: property, name: name, defaultValue: value, onChange: props.onChange });
1939
1983
  case core.PropertyType.Coding:
1940
- return React__default["default"].createElement(CodingInput, { property: property, name: name, defaultValue: value, onChange: props.onChange });
1984
+ return React.createElement(CodingInput, { property: property, name: name, defaultValue: value, onChange: props.onChange });
1941
1985
  case core.PropertyType.ContactDetail:
1942
- return React__default["default"].createElement(ContactDetailInput, { name: name, defaultValue: value, onChange: props.onChange });
1986
+ return React.createElement(ContactDetailInput, { name: name, defaultValue: value, onChange: props.onChange });
1943
1987
  case core.PropertyType.ContactPoint:
1944
- return React__default["default"].createElement(ContactPointInput, { name: name, defaultValue: value, onChange: props.onChange });
1988
+ return React.createElement(ContactPointInput, { name: name, defaultValue: value, onChange: props.onChange });
1945
1989
  case core.PropertyType.Extension:
1946
- return React__default["default"].createElement(ExtensionInput, { name: name, defaultValue: value, onChange: props.onChange });
1990
+ return React.createElement(ExtensionInput, { name: name, defaultValue: value, onChange: props.onChange });
1947
1991
  case core.PropertyType.HumanName:
1948
- return React__default["default"].createElement(HumanNameInput, { name: name, defaultValue: value, onChange: props.onChange });
1992
+ return React.createElement(HumanNameInput, { name: name, defaultValue: value, onChange: props.onChange });
1949
1993
  case core.PropertyType.Identifier:
1950
- return React__default["default"].createElement(IdentifierInput, { name: name, defaultValue: value, onChange: props.onChange });
1994
+ return React.createElement(IdentifierInput, { name: name, defaultValue: value, onChange: props.onChange });
1951
1995
  case core.PropertyType.Period:
1952
- return React__default["default"].createElement(PeriodInput, { name: name, defaultValue: value, onChange: props.onChange });
1996
+ return React.createElement(PeriodInput, { name: name, defaultValue: value, onChange: props.onChange });
1953
1997
  case core.PropertyType.Quantity:
1954
- return React__default["default"].createElement(QuantityInput, { name: name, defaultValue: value, onChange: props.onChange });
1998
+ return React.createElement(QuantityInput, { name: name, defaultValue: value, onChange: props.onChange });
1955
1999
  case core.PropertyType.Range:
1956
- return React__default["default"].createElement(RangeInput, { name: name, defaultValue: value, onChange: props.onChange });
2000
+ return React.createElement(RangeInput, { name: name, defaultValue: value, onChange: props.onChange });
1957
2001
  case core.PropertyType.Ratio:
1958
- return React__default["default"].createElement(RatioInput, { name: name, defaultValue: value, onChange: props.onChange });
2002
+ return React.createElement(RatioInput, { name: name, defaultValue: value, onChange: props.onChange });
1959
2003
  case core.PropertyType.Reference:
1960
- return (React__default["default"].createElement(ReferenceInput, { name: name, defaultValue: value, targetTypes: getTargetTypes(property), onChange: props.onChange }));
2004
+ return (React.createElement(ReferenceInput, { name: name, defaultValue: value, targetTypes: getTargetTypes(property), onChange: props.onChange }));
1961
2005
  case core.PropertyType.Timing:
1962
- return React__default["default"].createElement(TimingInput, { name: name, defaultValue: value, onChange: props.onChange });
2006
+ return React.createElement(TimingInput, { name: name, defaultValue: value, onChange: props.onChange });
1963
2007
  default:
1964
- return (React__default["default"].createElement(BackboneElementInput, { typeName: core.buildTypeName((_a = property.path) === null || _a === void 0 ? void 0 : _a.split('.')), defaultValue: value, onChange: props.onChange, outcome: props.outcome }));
2008
+ return (React.createElement(BackboneElementInput, { typeName: core.buildTypeName((_a = property.path) === null || _a === void 0 ? void 0 : _a.split('.')), defaultValue: value, onChange: props.onChange, outcome: props.outcome }));
1965
2009
  }
1966
2010
  }
1967
2011
  function getTargetTypes(property) {
@@ -1981,12 +2025,12 @@
1981
2025
  const typeName = props.typeName;
1982
2026
  const typeSchema = core.globalSchema.types[typeName];
1983
2027
  if (!typeSchema) {
1984
- return React__default["default"].createElement("div", null,
2028
+ return React.createElement("div", null,
1985
2029
  typeName,
1986
2030
  "\u00A0not implemented");
1987
2031
  }
1988
2032
  const typedValue = { type: typeName, value };
1989
- return (React__default["default"].createElement(React__default["default"].Fragment, null, Object.entries(typeSchema.properties).map((entry) => {
2033
+ return (React.createElement(core$1.Stack, null, Object.entries(typeSchema.properties).map((entry) => {
1990
2034
  const key = entry[0];
1991
2035
  if (key === 'id' || DEFAULT_IGNORED_PROPERTIES.indexOf(key) >= 0) {
1992
2036
  return null;
@@ -1997,33 +2041,53 @@
1997
2041
  }
1998
2042
  const [propertyValue, propertyType] = getValueAndType(typedValue, key);
1999
2043
  if (property.type.length === 1 && property.type[0].code === 'boolean') {
2000
- return (React__default["default"].createElement(CheckboxFormSection, { key: key, title: core.getPropertyDisplayName(key), description: property.definition, htmlFor: key },
2001
- React__default["default"].createElement(ResourcePropertyInput, { property: property, name: key, defaultValue: propertyValue, defaultPropertyType: propertyType, outcome: props.outcome, onChange: (newValue, propName) => {
2044
+ return (React.createElement(CheckboxFormSection, { key: key, title: core.getPropertyDisplayName(key), description: property.definition, htmlFor: key },
2045
+ React.createElement(ResourcePropertyInput, { property: property, name: key, defaultValue: propertyValue, defaultPropertyType: propertyType, outcome: props.outcome, onChange: (newValue, propName) => {
2002
2046
  setValueWrapper(setPropertyValue(value, key, propName !== null && propName !== void 0 ? propName : key, entry[1], newValue));
2003
2047
  } })));
2004
2048
  }
2005
- return (React__default["default"].createElement(FormSection, { key: key, title: core.getPropertyDisplayName(key), description: property.definition, htmlFor: key, outcome: props.outcome },
2006
- React__default["default"].createElement(ResourcePropertyInput, { property: property, name: key, defaultValue: propertyValue, defaultPropertyType: propertyType, outcome: props.outcome, onChange: (newValue, propName) => {
2049
+ return (React.createElement(FormSection, { key: key, title: core.getPropertyDisplayName(key), description: property.definition, htmlFor: key, outcome: props.outcome },
2050
+ React.createElement(ResourcePropertyInput, { property: property, name: key, defaultValue: propertyValue, defaultPropertyType: propertyType, outcome: props.outcome, onChange: (newValue, propName) => {
2007
2051
  setValueWrapper(setPropertyValue(value, key, propName !== null && propName !== void 0 ? propName : key, entry[1], newValue));
2008
2052
  } })));
2009
2053
  })));
2010
2054
  }
2011
2055
 
2012
2056
  function ResourceName(props) {
2013
- const resource = useResource(props.value);
2057
+ const { value, link } = props, rest = __rest(props, ["value", "link"]);
2058
+ const resource = useResource(value);
2014
2059
  if (!resource) {
2015
2060
  return null;
2016
2061
  }
2017
2062
  const text = core.getDisplayString(resource);
2018
- return props.link ? React__default["default"].createElement(MedplumLink, { to: resource }, text) : React__default["default"].createElement("span", null, text);
2063
+ return link ? (React.createElement(MedplumLink, Object.assign({ to: resource }, rest), text)) : (React.createElement(core$1.Text, Object.assign({ component: "span" }, rest), text));
2019
2064
  }
2020
2065
 
2021
2066
  function ResourceBadge(props) {
2022
- return (React__default["default"].createElement("div", { className: "medplum-resource-badge" },
2023
- React__default["default"].createElement(ResourceAvatar, { size: 24, radius: 12, value: props.value, link: props.link }),
2024
- React__default["default"].createElement(ResourceName, { value: props.value, link: props.link })));
2067
+ return (React.createElement(core$1.Group, { spacing: "xs" },
2068
+ React.createElement(ResourceAvatar, { size: 24, radius: 12, value: props.value, link: props.link }),
2069
+ React.createElement(ResourceName, { value: props.value, link: props.link })));
2025
2070
  }
2026
2071
 
2072
+ const useStyles$9 = core$1.createStyles((theme) => ({
2073
+ table: {
2074
+ border: `0.1px solid ${theme.colors.gray[5]}`,
2075
+ borderCollapse: 'collapse',
2076
+ '& td, & th': {
2077
+ border: `0.1px solid ${theme.colors.gray[5]}`,
2078
+ padding: 4,
2079
+ },
2080
+ },
2081
+ criticalRow: {
2082
+ background: theme.colorScheme === 'dark' ? theme.colors.red[7] : theme.colors.red[1],
2083
+ border: `0.1px solid ${theme.colors.red[5]}`,
2084
+ color: theme.colors.red[5],
2085
+ fontWeight: 500,
2086
+ '& td': {
2087
+ border: `0.1px solid ${theme.colors.red[5]}`,
2088
+ },
2089
+ },
2090
+ }));
2027
2091
  function DiagnosticReportDisplay(props) {
2028
2092
  var _a, _b;
2029
2093
  const diagnosticReport = useResource(props.value);
@@ -2043,69 +2107,68 @@
2043
2107
  textContent += note.text + '\n\n';
2044
2108
  }
2045
2109
  }
2046
- return (React__default["default"].createElement("div", { className: "medplum-diagnostic-report" },
2047
- React__default["default"].createElement("h1", null, "Diagnostic Report"),
2048
- React__default["default"].createElement("div", { className: "medplum-diagnostic-report-header" },
2049
- diagnosticReport.subject && (React__default["default"].createElement("dl", null,
2050
- React__default["default"].createElement("dt", null, "Subject"),
2051
- React__default["default"].createElement("dd", null,
2052
- React__default["default"].createElement(ResourceBadge, { value: diagnosticReport.subject, link: true })))),
2110
+ return (React.createElement(core$1.Stack, null,
2111
+ React.createElement(core$1.Title, null, "Diagnostic Report"),
2112
+ React.createElement(core$1.Group, { mt: "md", spacing: 30 },
2113
+ diagnosticReport.subject && (React.createElement("div", null,
2114
+ React.createElement(core$1.Text, { size: "xs", transform: "uppercase", color: "dimmed" }, "Subject"),
2115
+ React.createElement(core$1.Text, null,
2116
+ React.createElement(ResourceBadge, { value: diagnosticReport.subject, link: true })))),
2053
2117
  diagnosticReport.resultsInterpreter &&
2054
- diagnosticReport.resultsInterpreter.map((interpreter) => (React__default["default"].createElement("dl", { key: interpreter.reference },
2055
- React__default["default"].createElement("dt", null, "Interpreter"),
2056
- React__default["default"].createElement("dd", null,
2057
- React__default["default"].createElement(ResourceBadge, { value: interpreter, link: true }))))),
2058
- diagnosticReport.issued && (React__default["default"].createElement("dl", null,
2059
- React__default["default"].createElement("dt", null, "Issued"),
2060
- React__default["default"].createElement("dd", null, core.formatDateTime(diagnosticReport.issued)))),
2061
- diagnosticReport.status && (React__default["default"].createElement("dl", null,
2062
- React__default["default"].createElement("dt", null, "Status"),
2063
- React__default["default"].createElement("dd", null, core.capitalize(diagnosticReport.status))))),
2064
- diagnosticReport.result && React__default["default"].createElement(ObservationTable, { value: diagnosticReport.result }),
2065
- textContent && React__default["default"].createElement("pre", null, textContent.trim())));
2118
+ diagnosticReport.resultsInterpreter.map((interpreter) => (React.createElement("div", { key: interpreter.reference },
2119
+ React.createElement(core$1.Text, { size: "xs", transform: "uppercase", color: "dimmed" }, "Interpreter"),
2120
+ React.createElement(core$1.Text, null,
2121
+ React.createElement(ResourceBadge, { value: interpreter, link: true }))))),
2122
+ diagnosticReport.issued && (React.createElement("div", null,
2123
+ React.createElement(core$1.Text, { size: "xs", transform: "uppercase", color: "dimmed" }, "Issued"),
2124
+ React.createElement(core$1.Text, null, core.formatDateTime(diagnosticReport.issued)))),
2125
+ diagnosticReport.status && (React.createElement("div", null,
2126
+ React.createElement(core$1.Text, { size: "xs", transform: "uppercase", color: "dimmed" }, "Status"),
2127
+ React.createElement(core$1.Text, null, core.capitalize(diagnosticReport.status))))),
2128
+ diagnosticReport.result && React.createElement(ObservationTable, { value: diagnosticReport.result }),
2129
+ textContent && React.createElement("pre", null, textContent.trim())));
2066
2130
  }
2067
2131
  function ObservationTable(props) {
2068
2132
  var _a;
2069
- return (React__default["default"].createElement(core$1.Table, { withBorder: true, withColumnBorders: true },
2070
- React__default["default"].createElement("thead", null,
2071
- React__default["default"].createElement("tr", null,
2072
- React__default["default"].createElement("th", null, "Test"),
2073
- React__default["default"].createElement("th", null, "Value"),
2074
- React__default["default"].createElement("th", null, "Reference Range"),
2075
- React__default["default"].createElement("th", null, "Interpretation"))),
2076
- React__default["default"].createElement("tbody", null, (_a = props.value) === null || _a === void 0 ? void 0 : _a.map((observation, index) => (React__default["default"].createElement(ObservationRow, { key: 'obs-' + index, value: observation }))))));
2133
+ const { classes } = useStyles$9();
2134
+ return (React.createElement("table", { className: classes.table },
2135
+ React.createElement("thead", null,
2136
+ React.createElement("tr", null,
2137
+ React.createElement("th", null, "Test"),
2138
+ React.createElement("th", null, "Value"),
2139
+ React.createElement("th", null, "Reference Range"),
2140
+ React.createElement("th", null, "Interpretation"))),
2141
+ React.createElement("tbody", null, (_a = props.value) === null || _a === void 0 ? void 0 : _a.map((observation, index) => (React.createElement(ObservationRow, { key: 'obs-' + index, value: observation }))))));
2077
2142
  }
2078
2143
  function ObservationRow(props) {
2144
+ const { classes, cx } = useStyles$9();
2079
2145
  const observation = useResource(props.value);
2080
2146
  if (!observation) {
2081
2147
  return null;
2082
2148
  }
2083
- let className = undefined;
2084
- if (isCritical(observation)) {
2085
- className = 'medplum-critical';
2086
- }
2087
- return (React__default["default"].createElement("tr", { className: className },
2088
- React__default["default"].createElement("td", null,
2089
- React__default["default"].createElement(MedplumLink, { to: observation },
2090
- React__default["default"].createElement(CodeableConceptDisplay, { value: observation.code }))),
2091
- React__default["default"].createElement("td", null,
2092
- React__default["default"].createElement(ObservationValueDisplay, { value: observation })),
2093
- React__default["default"].createElement("td", null,
2094
- React__default["default"].createElement(ReferenceRangeDisplay, { value: observation.referenceRange })),
2095
- React__default["default"].createElement("td", null, observation.interpretation && observation.interpretation.length > 0 && (React__default["default"].createElement(CodeableConceptDisplay, { value: observation.interpretation[0] })))));
2149
+ const critical = isCritical(observation);
2150
+ return (React.createElement("tr", { className: cx({ [classes.criticalRow]: critical }) },
2151
+ React.createElement("td", null,
2152
+ React.createElement(MedplumLink, { to: observation },
2153
+ React.createElement(CodeableConceptDisplay, { value: observation.code }))),
2154
+ React.createElement("td", null,
2155
+ React.createElement(ObservationValueDisplay, { value: observation })),
2156
+ React.createElement("td", null,
2157
+ React.createElement(ReferenceRangeDisplay, { value: observation.referenceRange })),
2158
+ React.createElement("td", null, observation.interpretation && observation.interpretation.length > 0 && (React.createElement(CodeableConceptDisplay, { value: observation.interpretation[0] })))));
2096
2159
  }
2097
2160
  function ObservationValueDisplay(props) {
2098
2161
  var _a;
2099
2162
  const obs = props.value;
2100
2163
  if (obs === null || obs === void 0 ? void 0 : obs.valueQuantity) {
2101
- return React__default["default"].createElement(QuantityDisplay, { value: (_a = props.value) === null || _a === void 0 ? void 0 : _a.valueQuantity });
2164
+ return React.createElement(QuantityDisplay, { value: (_a = props.value) === null || _a === void 0 ? void 0 : _a.valueQuantity });
2102
2165
  }
2103
2166
  if (obs === null || obs === void 0 ? void 0 : obs.valueString) {
2104
- return React__default["default"].createElement(React__default["default"].Fragment, null, obs.valueString);
2167
+ return React.createElement(React.Fragment, null, obs.valueString);
2105
2168
  }
2106
2169
  if (obs && 'component' in obs && (obs === null || obs === void 0 ? void 0 : obs.component)) {
2107
- return (React__default["default"].createElement(React__default["default"].Fragment, null, obs.component
2108
- .map((component, index) => (React__default["default"].createElement(ObservationValueDisplay, { key: `obs-${index}`, value: component })))
2170
+ return (React.createElement(React.Fragment, null, obs.component
2171
+ .map((component, index) => (React.createElement(ObservationValueDisplay, { key: `obs-${index}`, value: component })))
2109
2172
  .reduce((prev, curr) => [prev, ' / ', curr])));
2110
2173
  }
2111
2174
  return null;
@@ -2116,9 +2179,9 @@
2116
2179
  return null;
2117
2180
  }
2118
2181
  if (range.text) {
2119
- return React__default["default"].createElement(React__default["default"].Fragment, null, range.text);
2182
+ return React.createElement(React.Fragment, null, range.text);
2120
2183
  }
2121
- return React__default["default"].createElement(RangeDisplay, { value: range });
2184
+ return React.createElement(RangeDisplay, { value: range });
2122
2185
  }
2123
2186
  /**
2124
2187
  * Returns true if the observation is critical.
@@ -2132,7 +2195,28 @@
2132
2195
  return code === 'AA' || code === 'LL' || code === 'HH' || code === 'RR';
2133
2196
  }
2134
2197
 
2198
+ const useStyles$8 = core$1.createStyles((theme) => ({
2199
+ root: {
2200
+ borderCollapse: 'collapse',
2201
+ width: '100%',
2202
+ '& tr': {
2203
+ borderTop: `0.1px solid ${theme.colors.gray[3]}`,
2204
+ },
2205
+ '& th, & td': {
2206
+ padding: `${theme.spacing.sm}px ${theme.spacing.sm}px`,
2207
+ verticalAlign: 'top',
2208
+ },
2209
+ },
2210
+ removed: {
2211
+ color: theme.colors.red[7],
2212
+ textDecoration: 'line-through',
2213
+ },
2214
+ added: {
2215
+ color: theme.colors.green[7],
2216
+ },
2217
+ }));
2135
2218
  function ResourceDiffTable(props) {
2219
+ const { classes } = useStyles$8();
2136
2220
  const medplum = useMedplum();
2137
2221
  const [schema, setSchema] = React.useState();
2138
2222
  React.useEffect(() => {
@@ -2145,17 +2229,17 @@
2145
2229
  if (!typeSchema) {
2146
2230
  return null;
2147
2231
  }
2148
- return (React__default["default"].createElement("table", { className: "medplum-diff-table" },
2149
- React__default["default"].createElement("colgroup", null,
2150
- React__default["default"].createElement("col", { style: { width: '30%' } }),
2151
- React__default["default"].createElement("col", { style: { width: '35%' } }),
2152
- React__default["default"].createElement("col", { style: { width: '35%' } })),
2153
- React__default["default"].createElement("thead", null,
2154
- React__default["default"].createElement("tr", null,
2155
- React__default["default"].createElement("th", null, "Property"),
2156
- React__default["default"].createElement("th", null, "Before"),
2157
- React__default["default"].createElement("th", null, "After"))),
2158
- React__default["default"].createElement("tbody", null, Object.entries(typeSchema.properties).map((entry) => {
2232
+ return (React.createElement("table", { className: classes.root },
2233
+ React.createElement("colgroup", null,
2234
+ React.createElement("col", { style: { width: '30%' } }),
2235
+ React.createElement("col", { style: { width: '35%' } }),
2236
+ React.createElement("col", { style: { width: '35%' } })),
2237
+ React.createElement("thead", null,
2238
+ React.createElement("tr", null,
2239
+ React.createElement("th", null, "Property"),
2240
+ React.createElement("th", null, "Before"),
2241
+ React.createElement("th", null, "After"))),
2242
+ React.createElement("tbody", null, Object.entries(typeSchema.properties).map((entry) => {
2159
2243
  const key = entry[0];
2160
2244
  if (key === 'id' || key === 'meta') {
2161
2245
  return null;
@@ -2169,12 +2253,12 @@
2169
2253
  if (core.stringify(originalPropertyValue) === core.stringify(revisedPropertyValue)) {
2170
2254
  return null;
2171
2255
  }
2172
- return (React__default["default"].createElement("tr", { key: key },
2173
- React__default["default"].createElement("td", null, core.getPropertyDisplayName(key)),
2174
- React__default["default"].createElement("td", { className: "medplum-diff-removed" },
2175
- React__default["default"].createElement(ResourcePropertyDisplay, { property: property, propertyType: originalPropertyType, value: originalPropertyValue, ignoreMissingValues: true })),
2176
- React__default["default"].createElement("td", { className: "medplum-diff-added" },
2177
- React__default["default"].createElement(ResourcePropertyDisplay, { property: property, propertyType: revisedPropertyType, value: revisedPropertyValue, ignoreMissingValues: true }))));
2256
+ return (React.createElement("tr", { key: key },
2257
+ React.createElement("td", null, core.getPropertyDisplayName(key)),
2258
+ React.createElement("td", { className: classes.removed },
2259
+ React.createElement(ResourcePropertyDisplay, { property: property, propertyType: originalPropertyType, value: originalPropertyValue, ignoreMissingValues: true })),
2260
+ React.createElement("td", { className: classes.added },
2261
+ React.createElement(ResourcePropertyDisplay, { property: property, propertyType: revisedPropertyType, value: revisedPropertyValue, ignoreMissingValues: true }))));
2178
2262
  }))));
2179
2263
  }
2180
2264
  function isEmpty(value) {
@@ -2195,14 +2279,14 @@
2195
2279
  if (!schema || !value) {
2196
2280
  return null;
2197
2281
  }
2198
- return (React__default["default"].createElement(BackboneElementDisplay, { value: { type: value.resourceType, value }, ignoreMissingValues: props.ignoreMissingValues }));
2282
+ return (React.createElement(BackboneElementDisplay, { value: { type: value.resourceType, value }, ignoreMissingValues: props.ignoreMissingValues }));
2199
2283
  }
2200
2284
 
2201
2285
  /**
2202
2286
  * ErrorBoundary is a React component that handles errors in its child components.
2203
2287
  * See: https://reactjs.org/docs/error-boundaries.html
2204
2288
  */
2205
- class ErrorBoundary extends React__default["default"].Component {
2289
+ class ErrorBoundary extends React.Component {
2206
2290
  constructor(props) {
2207
2291
  super(props);
2208
2292
  this.state = {};
@@ -2215,39 +2299,36 @@
2215
2299
  }
2216
2300
  render() {
2217
2301
  if (this.state.error) {
2218
- return React__default["default"].createElement("h1", null, "Something went wrong.");
2302
+ return React.createElement(core$1.Title, null, "Something went wrong.");
2219
2303
  }
2220
2304
  return this.props.children;
2221
2305
  }
2222
2306
  }
2223
2307
 
2224
2308
  function Timeline(props) {
2225
- return React__default["default"].createElement("main", { className: "medplum-document medplum-timeline" }, props.children);
2309
+ return React.createElement(core$1.Container, null, props.children);
2226
2310
  }
2227
2311
  function TimelineItem(props) {
2228
2312
  var _a, _b, _c;
2229
2313
  const author = (_a = props.profile) !== null && _a !== void 0 ? _a : (_b = props.resource.meta) === null || _b === void 0 ? void 0 : _b.author;
2230
- return (React__default["default"].createElement("article", { className: props.className || 'medplum-timeline-item', "data-testid": "timeline-item" },
2231
- React__default["default"].createElement("div", { className: "medplum-timeline-item-header" },
2232
- React__default["default"].createElement("div", { className: "medplum-timeline-item-avatar" },
2233
- React__default["default"].createElement(ResourceAvatar, { value: author, link: true, size: "md" })),
2234
- React__default["default"].createElement("div", { className: "medplum-timeline-item-title" },
2235
- React__default["default"].createElement(ResourceName, { value: author, link: true }),
2236
- React__default["default"].createElement("div", { className: "medplum-timeline-item-subtitle" },
2237
- React__default["default"].createElement(MedplumLink, { to: props.resource }, core.formatDateTime((_c = props.resource.meta) === null || _c === void 0 ? void 0 : _c.lastUpdated)),
2238
- React__default["default"].createElement("span", null, "\u00B7"),
2239
- React__default["default"].createElement(MedplumLink, { to: props.resource }, props.resource.resourceType))),
2240
- props.popupMenuItems && (React__default["default"].createElement(core$1.Menu, { position: "bottom-end", shadow: "md", width: 200 },
2241
- React__default["default"].createElement(core$1.Menu.Target, null,
2242
- React__default["default"].createElement(core$1.ActionIcon, { radius: "xl", "aria-label": `Actions for ${core.getReferenceString(props.resource)}` },
2243
- React__default["default"].createElement(icons.IconDots, null))),
2314
+ return (React.createElement(core$1.Paper, { "data-testid": "timeline-item", m: "lg", p: "sm", shadow: "xs", radius: "sm", withBorder: true, className: props.className },
2315
+ React.createElement(core$1.Group, { position: "apart", spacing: 8 },
2316
+ React.createElement(ResourceAvatar, { value: author, link: true, size: "md" }),
2317
+ React.createElement("div", { style: { flex: 1 } },
2318
+ React.createElement(core$1.Text, { size: "sm" },
2319
+ React.createElement(ResourceName, { color: "dark", weight: 500, value: author, link: true })),
2320
+ React.createElement(core$1.Text, { size: "xs" },
2321
+ React.createElement(MedplumLink, { color: "dimmed", to: props.resource }, core.formatDateTime((_c = props.resource.meta) === null || _c === void 0 ? void 0 : _c.lastUpdated)),
2322
+ React.createElement(core$1.Text, { component: "span", color: "dimmed", mx: 8 }, "\u00B7"),
2323
+ React.createElement(MedplumLink, { color: "dimmed", to: props.resource }, props.resource.resourceType))),
2324
+ props.popupMenuItems && (React.createElement(core$1.Menu, { position: "bottom-end", shadow: "md", width: 200 },
2325
+ React.createElement(core$1.Menu.Target, null,
2326
+ React.createElement(core$1.ActionIcon, { radius: "xl", "aria-label": `Actions for ${core.getReferenceString(props.resource)}` },
2327
+ React.createElement(icons.IconDots, null))),
2244
2328
  props.popupMenuItems))),
2245
- React__default["default"].createElement(ErrorBoundary, null,
2246
- props.padding && React__default["default"].createElement("div", { style: { padding: '2px 16px 16px 16px' } }, props.children),
2247
- !props.padding && React__default["default"].createElement(React__default["default"].Fragment, null, props.children)),
2248
- props.socialEnabled && (React__default["default"].createElement("div", { className: "medplum-timeline-item-footer" },
2249
- React__default["default"].createElement(core$1.Button, { variant: "subtle" }, "Like"),
2250
- React__default["default"].createElement(core$1.Button, { variant: "subtle" }, "Comment")))));
2329
+ React.createElement(ErrorBoundary, null,
2330
+ props.padding && React.createElement("div", { style: { padding: '2px 16px 16px 16px' } }, props.children),
2331
+ !props.padding && React.createElement(React.Fragment, null, props.children))));
2251
2332
  }
2252
2333
 
2253
2334
  /**
@@ -2296,6 +2377,11 @@
2296
2377
  return new Date(dateTime).getTime();
2297
2378
  }
2298
2379
 
2380
+ const useStyles$7 = core$1.createStyles((theme) => ({
2381
+ pinnedComment: {
2382
+ backgroundColor: theme.colors.blue[0],
2383
+ },
2384
+ }));
2299
2385
  function ResourceTimeline(props) {
2300
2386
  const navigate = reactRouterDom.useNavigate();
2301
2387
  const medplum = useMedplum();
@@ -2384,10 +2470,23 @@
2384
2470
  }
2385
2471
  medplum
2386
2472
  .createResource(props.createMedia(resource, sender, attachment))
2387
- .then((result) => {
2388
- addResources([result]);
2389
- })
2390
- .catch(console.log);
2473
+ .then((result) => addResources([result]))
2474
+ .then(() => notifications.updateNotification({
2475
+ id: 'upload-notification',
2476
+ color: 'teal',
2477
+ title: 'Upload complete',
2478
+ message: '',
2479
+ icon: React.createElement(icons.IconCheck, { size: 16 }),
2480
+ autoClose: 2000,
2481
+ }))
2482
+ .catch((reason) => notifications.updateNotification({
2483
+ id: 'upload-notification',
2484
+ color: 'red',
2485
+ title: 'Upload error',
2486
+ message: core.normalizeErrorString(reason),
2487
+ icon: React.createElement(icons.IconFileAlert, { size: 16 }),
2488
+ autoClose: 2000,
2489
+ }));
2391
2490
  }
2392
2491
  function setPriority(communication, priority) {
2393
2492
  return medplum.updateResource(Object.assign(Object.assign({}, communication), { priority }));
@@ -2411,70 +2510,89 @@
2411
2510
  var _a;
2412
2511
  navigate(`/${version.resourceType}/${version.id}/_history/${(_a = version.meta) === null || _a === void 0 ? void 0 : _a.versionId}`);
2413
2512
  }
2513
+ function onUploadStart() {
2514
+ notifications.showNotification({
2515
+ id: 'upload-notification',
2516
+ loading: true,
2517
+ title: 'Initializing upload...',
2518
+ message: 'Please wait...',
2519
+ autoClose: false,
2520
+ disallowClose: true,
2521
+ });
2522
+ }
2523
+ function onUploadProgress(e) {
2524
+ notifications.updateNotification({
2525
+ id: 'upload-notification',
2526
+ loading: true,
2527
+ title: 'Uploading...',
2528
+ message: getProgressMessage(e),
2529
+ autoClose: false,
2530
+ disallowClose: true,
2531
+ });
2532
+ }
2414
2533
  if (!resource || !history) {
2415
- return React__default["default"].createElement(core$1.Loader, null);
2416
- }
2417
- return (React__default["default"].createElement(Timeline, null,
2418
- props.createCommunication && (React__default["default"].createElement("article", { className: "medplum-timeline-item" },
2419
- React__default["default"].createElement("div", { className: "medplum-timeline-item-header" },
2420
- React__default["default"].createElement(Form, { testid: "timeline-form", onSubmit: (formData) => {
2421
- createComment(formData.text);
2422
- const input = inputRef.current;
2423
- if (input) {
2424
- input.value = '';
2425
- input.focus();
2426
- }
2427
- } },
2428
- React__default["default"].createElement(core$1.Group, { spacing: "xs", noWrap: true, style: { width: '100%' } },
2429
- React__default["default"].createElement(ResourceAvatar, { value: sender }),
2430
- React__default["default"].createElement(core$1.TextInput, { name: "text", ref: inputRef, placeholder: "Add comment", style: { width: '100%', maxWidth: 300 } }),
2431
- React__default["default"].createElement(core$1.ActionIcon, { type: "submit", radius: "xl", color: "blue", variant: "filled" },
2432
- React__default["default"].createElement(icons.IconMessage, { size: 16 })),
2433
- React__default["default"].createElement(AttachmentButton, { onUpload: createMedia }, (props) => (React__default["default"].createElement(core$1.ActionIcon, Object.assign({}, props, { radius: "xl", color: "blue", variant: "filled" }),
2434
- React__default["default"].createElement(icons.IconCloudUpload, { size: 16 }))))))))),
2534
+ return React.createElement(core$1.Loader, null);
2535
+ }
2536
+ return (React.createElement(Timeline, null,
2537
+ props.createCommunication && (React.createElement(core$1.Paper, { m: "lg", p: "sm", shadow: "xs", radius: "sm", withBorder: true },
2538
+ React.createElement(Form, { testid: "timeline-form", onSubmit: (formData) => {
2539
+ createComment(formData.text);
2540
+ const input = inputRef.current;
2541
+ if (input) {
2542
+ input.value = '';
2543
+ input.focus();
2544
+ }
2545
+ } },
2546
+ React.createElement(core$1.Group, { spacing: "xs", noWrap: true, style: { width: '100%' } },
2547
+ React.createElement(ResourceAvatar, { value: sender }),
2548
+ React.createElement(core$1.TextInput, { name: "text", ref: inputRef, placeholder: "Add comment", style: { width: '100%', maxWidth: 300 } }),
2549
+ React.createElement(core$1.ActionIcon, { type: "submit", radius: "xl", color: "blue", variant: "filled" },
2550
+ React.createElement(icons.IconMessage, { size: 16 })),
2551
+ React.createElement(AttachmentButton, { onUpload: createMedia, onUploadStart: onUploadStart, onUploadProgress: onUploadProgress }, (props) => (React.createElement(core$1.ActionIcon, Object.assign({}, props, { radius: "xl", color: "blue", variant: "filled" }),
2552
+ React.createElement(icons.IconCloudUpload, { size: 16 })))))))),
2435
2553
  items.map((item) => {
2436
2554
  var _a;
2437
2555
  if (item.resourceType === resource.resourceType && item.id === resource.id) {
2438
- return (React__default["default"].createElement(HistoryTimelineItem, { key: (_a = item.meta) === null || _a === void 0 ? void 0 : _a.versionId, history: history, resource: item, onDetails: onVersionDetails }));
2556
+ return (React.createElement(HistoryTimelineItem, { key: (_a = item.meta) === null || _a === void 0 ? void 0 : _a.versionId, history: history, resource: item, onDetails: onVersionDetails }));
2439
2557
  }
2440
2558
  const key = `${item.resourceType}/${item.id}`;
2441
2559
  switch (item.resourceType) {
2442
2560
  case 'AuditEvent':
2443
- return React__default["default"].createElement(AuditEventTimelineItem, { key: key, resource: item, onDetails: onDetails });
2561
+ return React.createElement(AuditEventTimelineItem, { key: key, resource: item, onDetails: onDetails });
2444
2562
  case 'Communication':
2445
- return (React__default["default"].createElement(CommunicationTimelineItem, { key: key, resource: item, onPin: item.priority !== 'stat' ? onPin : undefined, onUnpin: item.priority === 'stat' ? onUnpin : undefined, onDetails: onDetails, onEdit: onEdit, onDelete: onDelete }));
2563
+ return (React.createElement(CommunicationTimelineItem, { key: key, resource: item, onPin: item.priority !== 'stat' ? onPin : undefined, onUnpin: item.priority === 'stat' ? onUnpin : undefined, onDetails: onDetails, onEdit: onEdit, onDelete: onDelete }));
2446
2564
  case 'DiagnosticReport':
2447
- return (React__default["default"].createElement(DiagnosticReportTimelineItem, { key: key, resource: item, onDetails: onDetails, onEdit: onEdit, onDelete: onDelete }));
2565
+ return (React.createElement(DiagnosticReportTimelineItem, { key: key, resource: item, onDetails: onDetails, onEdit: onEdit, onDelete: onDelete }));
2448
2566
  case 'Media':
2449
- return (React__default["default"].createElement(MediaTimelineItem, { key: key, resource: item, onDetails: onDetails, onEdit: onEdit, onDelete: onDelete }));
2567
+ return (React.createElement(MediaTimelineItem, { key: key, resource: item, onDetails: onDetails, onEdit: onEdit, onDelete: onDelete }));
2450
2568
  default:
2451
- return (React__default["default"].createElement(TimelineItem, { key: key, resource: item, padding: true },
2452
- React__default["default"].createElement(ResourceTable, { value: item, ignoreMissingValues: true })));
2569
+ return (React.createElement(TimelineItem, { key: key, resource: item, padding: true },
2570
+ React.createElement(ResourceTable, { value: item, ignoreMissingValues: true })));
2453
2571
  }
2454
2572
  })));
2455
2573
  }
2456
2574
  function TimelineItemPopupMenu(props) {
2457
- return (React__default["default"].createElement(core$1.Menu.Dropdown, null,
2458
- React__default["default"].createElement(core$1.Menu.Label, null, "Resource"),
2459
- props.onPin && (React__default["default"].createElement(core$1.Menu.Item, { icon: React__default["default"].createElement(icons.IconPin, { size: 14 }), onClick: () => props.onPin(props.resource), "aria-label": `Pin ${core.getReferenceString(props.resource)}` }, "Pin")),
2460
- props.onUnpin && (React__default["default"].createElement(core$1.Menu.Item, { icon: React__default["default"].createElement(icons.IconPinnedOff, { size: 14 }), onClick: () => props.onUnpin(props.resource), "aria-label": `Unpin ${core.getReferenceString(props.resource)}` }, "Unpin")),
2461
- props.onDetails && (React__default["default"].createElement(core$1.Menu.Item, { icon: React__default["default"].createElement(icons.IconListDetails, { size: 14 }), onClick: () => props.onDetails(props.resource), "aria-label": `Details ${core.getReferenceString(props.resource)}` }, "Details")),
2462
- props.onEdit && (React__default["default"].createElement(core$1.Menu.Item, { icon: React__default["default"].createElement(icons.IconEdit, { size: 14 }), onClick: () => props.onEdit(props.resource), "aria-label": `Edit ${core.getReferenceString(props.resource)}` }, "Edit")),
2463
- props.onDelete && (React__default["default"].createElement(React__default["default"].Fragment, null,
2464
- React__default["default"].createElement(core$1.Menu.Divider, null),
2465
- React__default["default"].createElement(core$1.Menu.Label, null, "Danger zone"),
2466
- React__default["default"].createElement(core$1.Menu.Item, { color: "red", icon: React__default["default"].createElement(icons.IconTrash, { size: 14 }), onClick: () => props.onDelete(props.resource), "aria-label": `Delete ${core.getReferenceString(props.resource)}` }, "Delete")))));
2575
+ return (React.createElement(core$1.Menu.Dropdown, null,
2576
+ React.createElement(core$1.Menu.Label, null, "Resource"),
2577
+ props.onPin && (React.createElement(core$1.Menu.Item, { icon: React.createElement(icons.IconPin, { size: 14 }), onClick: () => props.onPin(props.resource), "aria-label": `Pin ${core.getReferenceString(props.resource)}` }, "Pin")),
2578
+ props.onUnpin && (React.createElement(core$1.Menu.Item, { icon: React.createElement(icons.IconPinnedOff, { size: 14 }), onClick: () => props.onUnpin(props.resource), "aria-label": `Unpin ${core.getReferenceString(props.resource)}` }, "Unpin")),
2579
+ props.onDetails && (React.createElement(core$1.Menu.Item, { icon: React.createElement(icons.IconListDetails, { size: 14 }), onClick: () => props.onDetails(props.resource), "aria-label": `Details ${core.getReferenceString(props.resource)}` }, "Details")),
2580
+ props.onEdit && (React.createElement(core$1.Menu.Item, { icon: React.createElement(icons.IconEdit, { size: 14 }), onClick: () => props.onEdit(props.resource), "aria-label": `Edit ${core.getReferenceString(props.resource)}` }, "Edit")),
2581
+ props.onDelete && (React.createElement(React.Fragment, null,
2582
+ React.createElement(core$1.Menu.Divider, null),
2583
+ React.createElement(core$1.Menu.Label, null, "Danger zone"),
2584
+ React.createElement(core$1.Menu.Item, { color: "red", icon: React.createElement(icons.IconTrash, { size: 14 }), onClick: () => props.onDelete(props.resource), "aria-label": `Delete ${core.getReferenceString(props.resource)}` }, "Delete")))));
2467
2585
  }
2468
2586
  function HistoryTimelineItem(props) {
2469
2587
  const previous = getPrevious(props.history, props.resource);
2470
2588
  if (previous) {
2471
- return (React__default["default"].createElement(TimelineItem, { resource: props.resource, padding: true, popupMenuItems: React__default["default"].createElement(TimelineItemPopupMenu, Object.assign({}, props)) },
2472
- React__default["default"].createElement(ResourceDiffTable, { original: previous, revised: props.resource })));
2589
+ return (React.createElement(TimelineItem, { resource: props.resource, padding: true, popupMenuItems: React.createElement(TimelineItemPopupMenu, Object.assign({}, props)) },
2590
+ React.createElement(ResourceDiffTable, { original: previous, revised: props.resource })));
2473
2591
  }
2474
2592
  else {
2475
- return (React__default["default"].createElement(TimelineItem, { resource: props.resource, padding: true, popupMenuItems: React__default["default"].createElement(TimelineItemPopupMenu, Object.assign({}, props)) },
2476
- React__default["default"].createElement("h3", null, "Created"),
2477
- React__default["default"].createElement(ResourceTable, { value: props.resource, ignoreMissingValues: true })));
2593
+ return (React.createElement(TimelineItem, { resource: props.resource, padding: true, popupMenuItems: React.createElement(TimelineItemPopupMenu, Object.assign({}, props)) },
2594
+ React.createElement("h3", null, "Created"),
2595
+ React.createElement(ResourceTable, { value: props.resource, ignoreMissingValues: true })));
2478
2596
  }
2479
2597
  }
2480
2598
  function getPrevious(history, version) {
@@ -2487,10 +2605,11 @@
2487
2605
  }
2488
2606
  function CommunicationTimelineItem(props) {
2489
2607
  var _a, _b;
2608
+ const { classes } = useStyles$7();
2490
2609
  const routine = !props.resource.priority || props.resource.priority === 'routine';
2491
- const className = routine ? 'medplum-timeline-item' : 'medplum-timeline-item medplum-timeline-item-pinned';
2492
- return (React__default["default"].createElement(TimelineItem, { resource: props.resource, profile: props.resource.sender, padding: true, className: className, popupMenuItems: React__default["default"].createElement(TimelineItemPopupMenu, Object.assign({}, props)) },
2493
- React__default["default"].createElement("p", null, (_b = (_a = props.resource.payload) === null || _a === void 0 ? void 0 : _a[0]) === null || _b === void 0 ? void 0 : _b.contentString)));
2610
+ const className = routine ? undefined : classes.pinnedComment;
2611
+ return (React.createElement(TimelineItem, { resource: props.resource, profile: props.resource.sender, padding: true, className: className, popupMenuItems: React.createElement(TimelineItemPopupMenu, Object.assign({}, props)) },
2612
+ React.createElement("p", null, (_b = (_a = props.resource.payload) === null || _a === void 0 ? void 0 : _a[0]) === null || _b === void 0 ? void 0 : _b.contentString)));
2494
2613
  }
2495
2614
  function MediaTimelineItem(props) {
2496
2615
  var _a;
@@ -2499,21 +2618,35 @@
2499
2618
  !contentType.startsWith('image/') &&
2500
2619
  !contentType.startsWith('video/') &&
2501
2620
  contentType !== 'application/pdf';
2502
- return (React__default["default"].createElement(TimelineItem, { resource: props.resource, padding: !!padding, popupMenuItems: React__default["default"].createElement(TimelineItemPopupMenu, Object.assign({}, props)) },
2503
- React__default["default"].createElement(AttachmentDisplay, { value: props.resource.content })));
2621
+ return (React.createElement(TimelineItem, { resource: props.resource, padding: !!padding, popupMenuItems: React.createElement(TimelineItemPopupMenu, Object.assign({}, props)) },
2622
+ React.createElement(AttachmentDisplay, { value: props.resource.content })));
2504
2623
  }
2505
2624
  function AuditEventTimelineItem(props) {
2506
- return (React__default["default"].createElement(TimelineItem, { resource: props.resource, padding: true, popupMenuItems: React__default["default"].createElement(TimelineItemPopupMenu, Object.assign({}, props)) },
2507
- React__default["default"].createElement(core$1.ScrollArea, null,
2508
- React__default["default"].createElement("pre", null, props.resource.outcomeDesc))));
2625
+ return (React.createElement(TimelineItem, { resource: props.resource, padding: true, popupMenuItems: React.createElement(TimelineItemPopupMenu, Object.assign({}, props)) },
2626
+ React.createElement(core$1.ScrollArea, null,
2627
+ React.createElement("pre", null, props.resource.outcomeDesc))));
2509
2628
  }
2510
2629
  function DiagnosticReportTimelineItem(props) {
2511
- return (React__default["default"].createElement(TimelineItem, { resource: props.resource, padding: true, popupMenuItems: React__default["default"].createElement(TimelineItemPopupMenu, Object.assign({}, props)) },
2512
- React__default["default"].createElement(DiagnosticReportDisplay, { value: props.resource })));
2630
+ return (React.createElement(TimelineItem, { resource: props.resource, padding: true, popupMenuItems: React.createElement(TimelineItemPopupMenu, Object.assign({}, props)) },
2631
+ React.createElement(DiagnosticReportDisplay, { value: props.resource })));
2632
+ }
2633
+ function getProgressMessage(e) {
2634
+ if (e.lengthComputable) {
2635
+ const percent = (100 * e.loaded) / e.total;
2636
+ return `Uploaded: ${formatFileSize(e.loaded)} / ${formatFileSize(e.total)} ${percent.toFixed(2)}%`;
2637
+ }
2638
+ return `Uploaded: ${formatFileSize(e.loaded)}`;
2639
+ }
2640
+ function formatFileSize(bytes) {
2641
+ if (bytes == 0) {
2642
+ return '0.00 B';
2643
+ }
2644
+ const e = Math.floor(Math.log(bytes) / Math.log(1024));
2645
+ return (bytes / Math.pow(1024, e)).toFixed(2) + ' ' + ' KMGTP'.charAt(e) + 'B';
2513
2646
  }
2514
2647
 
2515
2648
  function DefaultResourceTimeline(props) {
2516
- return (React__default["default"].createElement(ResourceTimeline, { value: props.resource, buildSearchRequests: (resource) => ({
2649
+ return (React.createElement(ResourceTimeline, { value: props.resource, buildSearchRequests: (resource) => ({
2517
2650
  resourceType: 'Bundle',
2518
2651
  type: 'batch',
2519
2652
  entry: [
@@ -2534,7 +2667,7 @@
2534
2667
  }
2535
2668
 
2536
2669
  function EncounterTimeline(props) {
2537
- return (React__default["default"].createElement(ResourceTimeline, { value: props.encounter, buildSearchRequests: (resource) => ({
2670
+ return (React.createElement(ResourceTimeline, { value: props.encounter, buildSearchRequests: (resource) => ({
2538
2671
  resourceType: 'Bundle',
2539
2672
  type: 'batch',
2540
2673
  entry: [
@@ -2590,7 +2723,7 @@
2590
2723
  Received ${value.length} elements \
2591
2724
  [${JSON.stringify(value, null, 2)}]`);
2592
2725
  }
2593
- return React__default["default"].createElement(ResourcePropertyDisplay, { value: value[0] || '', propertyType: props.propertyType });
2726
+ return React.createElement(ResourcePropertyDisplay, { value: value[0] || '', propertyType: props.propertyType });
2594
2727
  }
2595
2728
 
2596
2729
  /**
@@ -3145,7 +3278,7 @@
3145
3278
  if (!value) {
3146
3279
  return null;
3147
3280
  }
3148
- return (React__default["default"].createElement(ResourcePropertyDisplay, { property: elementDefinition, propertyType: propertyType, value: value, maxWidth: 200, ignoreMissingValues: true, link: false }));
3281
+ return (React.createElement(ResourcePropertyDisplay, { property: elementDefinition, propertyType: propertyType, value: value, maxWidth: 200, ignoreMissingValues: true, link: false }));
3149
3282
  }
3150
3283
  /**
3151
3284
  * Returns a fragment to be displayed in the search table for a search parameter.
@@ -3160,9 +3293,9 @@
3160
3293
  return null;
3161
3294
  }
3162
3295
  if (elementDefinition) {
3163
- return (React__default["default"].createElement(ResourcePropertyDisplay, { propertyType: value[0].type, value: value[0].value, maxWidth: 200, ignoreMissingValues: true, link: false }));
3296
+ return (React.createElement(ResourcePropertyDisplay, { propertyType: value[0].type, value: value[0].value, maxWidth: 200, ignoreMissingValues: true, link: false }));
3164
3297
  }
3165
- return (React__default["default"].createElement(React__default["default"].Fragment, null, value.map((v, index) => (React__default["default"].createElement("span", { key: `${index}-${value.length}` }, typeof v === 'object' ? JSON.stringify(v) : v)))));
3298
+ return (React.createElement(React.Fragment, null, value.map((v, index) => (React.createElement("span", { key: `${index}-${value.length}` }, typeof v === 'object' ? JSON.stringify(v) : v)))));
3166
3299
  }
3167
3300
 
3168
3301
  function SearchFieldEditor(props) {
@@ -3296,30 +3429,30 @@
3296
3429
  const available = getFieldsList(typeDef)
3297
3430
  .filter((field) => !(selected === null || selected === void 0 ? void 0 : selected.includes(field)))
3298
3431
  .sort();
3299
- return (React__default["default"].createElement(core$1.Modal, { title: "Fields", closeButtonLabel: "Close", opened: props.visible, onClose: props.onCancel },
3300
- React__default["default"].createElement("div", null,
3301
- React__default["default"].createElement("table", { style: { margin: 'auto' } },
3302
- React__default["default"].createElement("thead", null,
3303
- React__default["default"].createElement("tr", null,
3304
- React__default["default"].createElement("th", { colSpan: 2, align: "center" }, "Available"),
3305
- React__default["default"].createElement("th", { colSpan: 2, align: "center" }, "Selected"))),
3306
- React__default["default"].createElement("tbody", null,
3307
- React__default["default"].createElement("tr", null,
3308
- React__default["default"].createElement("td", { colSpan: 2, align: "center" },
3309
- React__default["default"].createElement("select", { ref: availableRef, size: 15, tabIndex: 1, style: { width: '200px' }, onKeyDown: (e) => handleAvailableKeyDown(e), onDoubleClick: () => handleAvailableDoubleClick(), "data-testid": "available" }, available.map((key) => (React__default["default"].createElement("option", { key: key, value: key }, buildFieldNameString(key)))))),
3310
- React__default["default"].createElement("td", { colSpan: 2, align: "center" },
3311
- React__default["default"].createElement("select", { ref: selectedRef, size: 15, tabIndex: 4, style: { width: '200px' }, onKeyDown: (e) => handleSelectedKeyDown(e), onDoubleClick: () => handleSelectedDoubleClick(), "data-testid": "selected" }, selected.map((key) => (React__default["default"].createElement("option", { key: key, value: key }, buildFieldNameString(key)))))))),
3312
- React__default["default"].createElement("tfoot", null,
3313
- React__default["default"].createElement("tr", null,
3314
- React__default["default"].createElement("td", { align: "center" },
3315
- React__default["default"].createElement(core$1.Button, { compact: true, variant: "outline", onClick: onAddField }, "Add")),
3316
- React__default["default"].createElement("td", { align: "center" },
3317
- React__default["default"].createElement(core$1.Button, { compact: true, variant: "outline", onClick: onRemoveField }, "Remove")),
3318
- React__default["default"].createElement("td", { align: "center" },
3319
- React__default["default"].createElement(core$1.Button, { compact: true, variant: "outline", onClick: onMoveUp }, "Up")),
3320
- React__default["default"].createElement("td", { align: "center" },
3321
- React__default["default"].createElement(core$1.Button, { compact: true, variant: "outline", onClick: onMoveDown }, "Down")))))),
3322
- React__default["default"].createElement(core$1.Button, { onClick: () => props.onOk(state.search) }, "OK")));
3432
+ return (React.createElement(core$1.Modal, { title: "Fields", closeButtonLabel: "Close", opened: props.visible, onClose: props.onCancel },
3433
+ React.createElement("div", null,
3434
+ React.createElement("table", { style: { margin: 'auto' } },
3435
+ React.createElement("thead", null,
3436
+ React.createElement("tr", null,
3437
+ React.createElement("th", { colSpan: 2, align: "center" }, "Available"),
3438
+ React.createElement("th", { colSpan: 2, align: "center" }, "Selected"))),
3439
+ React.createElement("tbody", null,
3440
+ React.createElement("tr", null,
3441
+ React.createElement("td", { colSpan: 2, align: "center" },
3442
+ React.createElement("select", { ref: availableRef, size: 15, tabIndex: 1, style: { width: '200px' }, onKeyDown: (e) => handleAvailableKeyDown(e), onDoubleClick: () => handleAvailableDoubleClick(), "data-testid": "available" }, available.map((key) => (React.createElement("option", { key: key, value: key }, buildFieldNameString(key)))))),
3443
+ React.createElement("td", { colSpan: 2, align: "center" },
3444
+ React.createElement("select", { ref: selectedRef, size: 15, tabIndex: 4, style: { width: '200px' }, onKeyDown: (e) => handleSelectedKeyDown(e), onDoubleClick: () => handleSelectedDoubleClick(), "data-testid": "selected" }, selected.map((key) => (React.createElement("option", { key: key, value: key }, buildFieldNameString(key)))))))),
3445
+ React.createElement("tfoot", null,
3446
+ React.createElement("tr", null,
3447
+ React.createElement("td", { align: "center" },
3448
+ React.createElement(core$1.Button, { compact: true, variant: "outline", onClick: onAddField }, "Add")),
3449
+ React.createElement("td", { align: "center" },
3450
+ React.createElement(core$1.Button, { compact: true, variant: "outline", onClick: onRemoveField }, "Remove")),
3451
+ React.createElement("td", { align: "center" },
3452
+ React.createElement(core$1.Button, { compact: true, variant: "outline", onClick: onMoveUp }, "Up")),
3453
+ React.createElement("td", { align: "center" },
3454
+ React.createElement(core$1.Button, { compact: true, variant: "outline", onClick: onMoveDown }, "Down")))))),
3455
+ React.createElement(core$1.Button, { onClick: () => props.onOk(state.search) }, "OK")));
3323
3456
  }
3324
3457
  /**
3325
3458
  * Returns a list of fields/columns available for a type.
@@ -3356,14 +3489,14 @@
3356
3489
  const searchParam = (_b = (_a = core.globalSchema.types[resourceType]) === null || _a === void 0 ? void 0 : _a.searchParams) === null || _b === void 0 ? void 0 : _b[filter.code];
3357
3490
  if (searchParam) {
3358
3491
  if (searchParam.type === 'reference') {
3359
- return React__default["default"].createElement(ResourceName, { value: { reference: filter.value } });
3492
+ return React.createElement(ResourceName, { value: { reference: filter.value } });
3360
3493
  }
3361
3494
  const searchParamDetails = core.getSearchParameterDetails(resourceType, searchParam);
3362
3495
  if (filter.code === '_lastUpdated' || searchParamDetails.type === core.SearchParameterType.DATETIME) {
3363
- return React__default["default"].createElement(React__default["default"].Fragment, null, core.formatDateTime(filter.value));
3496
+ return React.createElement(React.Fragment, null, core.formatDateTime(filter.value));
3364
3497
  }
3365
3498
  }
3366
- return React__default["default"].createElement(React__default["default"].Fragment, null, filter.value);
3499
+ return React.createElement(React.Fragment, null, filter.value);
3367
3500
  }
3368
3501
 
3369
3502
  function SearchFilterValueInput(props) {
@@ -3372,7 +3505,7 @@
3372
3505
  const name = 'filter-value';
3373
3506
  switch (details.type) {
3374
3507
  case core.SearchParameterType.REFERENCE:
3375
- return (React__default["default"].createElement(ReferenceInput, { name: name, defaultValue: { reference: props.defaultValue }, targetTypes: (_a = props.searchParam) === null || _a === void 0 ? void 0 : _a.target, onChange: (newReference) => {
3508
+ return (React.createElement(ReferenceInput, { name: name, defaultValue: { reference: props.defaultValue }, targetTypes: (_a = props.searchParam) === null || _a === void 0 ? void 0 : _a.target, onChange: (newReference) => {
3376
3509
  if (newReference) {
3377
3510
  props.onChange(newReference.reference);
3378
3511
  }
@@ -3381,15 +3514,15 @@
3381
3514
  }
3382
3515
  } }));
3383
3516
  case core.SearchParameterType.BOOLEAN:
3384
- return (React__default["default"].createElement(core$1.Checkbox, { name: name, "data-testid": name, defaultChecked: props.defaultValue === 'true', onChange: (e) => props.onChange(e.currentTarget.checked.toString()) }));
3517
+ return (React.createElement(core$1.Checkbox, { name: name, "data-testid": name, defaultChecked: props.defaultValue === 'true', onChange: (e) => props.onChange(e.currentTarget.checked.toString()) }));
3385
3518
  case core.SearchParameterType.DATE:
3386
- return (React__default["default"].createElement(core$1.TextInput, { type: "date", name: name, "data-testid": name, defaultValue: props.defaultValue, onChange: (e) => props.onChange(e.currentTarget.value) }));
3519
+ return (React.createElement(core$1.TextInput, { type: "date", name: name, "data-testid": name, defaultValue: props.defaultValue, onChange: (e) => props.onChange(e.currentTarget.value) }));
3387
3520
  case core.SearchParameterType.DATETIME:
3388
- return React__default["default"].createElement(DateTimeInput, { name: name, defaultValue: props.defaultValue, onChange: props.onChange });
3521
+ return React.createElement(DateTimeInput, { name: name, defaultValue: props.defaultValue, onChange: props.onChange });
3389
3522
  case core.SearchParameterType.NUMBER:
3390
- return (React__default["default"].createElement(core$1.TextInput, { type: "number", name: name, "data-testid": name, defaultValue: props.defaultValue, onChange: (e) => props.onChange(e.currentTarget.value) }));
3523
+ return (React.createElement(core$1.TextInput, { type: "number", name: name, "data-testid": name, defaultValue: props.defaultValue, onChange: (e) => props.onChange(e.currentTarget.value) }));
3391
3524
  case core.SearchParameterType.QUANTITY:
3392
- return (React__default["default"].createElement(QuantityInput, { name: name, defaultValue: tryParseQuantity(props.defaultValue), onChange: (newQuantity) => {
3525
+ return (React.createElement(QuantityInput, { name: name, defaultValue: tryParseQuantity(props.defaultValue), onChange: (newQuantity) => {
3393
3526
  if (newQuantity) {
3394
3527
  props.onChange(`${newQuantity.value}`);
3395
3528
  }
@@ -3398,7 +3531,7 @@
3398
3531
  }
3399
3532
  } }));
3400
3533
  default:
3401
- return (React__default["default"].createElement(core$1.TextInput, { name: name, "data-testid": name, defaultValue: props.defaultValue, autoFocus: props.autoFocus, onChange: (e) => props.onChange(e.currentTarget.value), placeholder: "Search value" }));
3534
+ return (React.createElement(core$1.TextInput, { name: name, "data-testid": name, defaultValue: props.defaultValue, autoFocus: props.autoFocus, onChange: (e) => props.onChange(e.currentTarget.value), placeholder: "Search value" }));
3402
3535
  }
3403
3536
  }
3404
3537
  function tryParseQuantity(value) {
@@ -3432,24 +3565,24 @@
3432
3565
  const resourceType = props.search.resourceType;
3433
3566
  const searchParams = core.globalSchema.types[resourceType].searchParams;
3434
3567
  const filters = search.filters || [];
3435
- return (React__default["default"].createElement(core$1.Modal, { title: "Filters", closeButtonLabel: "Close", size: 900, opened: props.visible, onClose: props.onCancel },
3436
- React__default["default"].createElement("div", { className: "medplum-filter-editor" },
3437
- React__default["default"].createElement("table", { className: "medplum-filter-editor-table" },
3438
- React__default["default"].createElement("colgroup", null,
3439
- React__default["default"].createElement("col", { style: { width: 200 } }),
3440
- React__default["default"].createElement("col", { style: { width: 200 } }),
3441
- React__default["default"].createElement("col", { style: { width: 380 } }),
3442
- React__default["default"].createElement("col", { style: { width: 120 } })),
3443
- React__default["default"].createElement("thead", null,
3444
- React__default["default"].createElement("tr", null,
3445
- React__default["default"].createElement("th", null, "Field"),
3446
- React__default["default"].createElement("th", null, "Operation"),
3447
- React__default["default"].createElement("th", null, "Value"),
3448
- React__default["default"].createElement("th", null, "Actions"))),
3449
- React__default["default"].createElement("tbody", null,
3568
+ return (React.createElement(core$1.Modal, { title: "Filters", closeButtonLabel: "Close", size: 900, opened: props.visible, onClose: props.onCancel },
3569
+ React.createElement("div", null,
3570
+ React.createElement("table", null,
3571
+ React.createElement("colgroup", null,
3572
+ React.createElement("col", { style: { width: 200 } }),
3573
+ React.createElement("col", { style: { width: 200 } }),
3574
+ React.createElement("col", { style: { width: 380 } }),
3575
+ React.createElement("col", { style: { width: 120 } })),
3576
+ React.createElement("thead", null,
3577
+ React.createElement("tr", null,
3578
+ React.createElement("th", null, "Field"),
3579
+ React.createElement("th", null, "Operation"),
3580
+ React.createElement("th", null, "Value"),
3581
+ React.createElement("th", null, "Actions"))),
3582
+ React.createElement("tbody", null,
3450
3583
  filters.map((filter, index) => {
3451
3584
  if (index === editingIndex) {
3452
- return (React__default["default"].createElement(FilterRowInput, { key: `filter-${index}-${filters.length}-input`, resourceType: resourceType, searchParams: searchParams, defaultValue: filter, okText: "Save", onOk: (newFilter) => {
3585
+ return (React.createElement(FilterRowInput, { key: `filter-${index}-${filters.length}-input`, resourceType: resourceType, searchParams: searchParams, defaultValue: filter, okText: "Save", onOk: (newFilter) => {
3453
3586
  const newFilters = [...filters];
3454
3587
  newFilters[index] = newFilter;
3455
3588
  setSearch(setFilters(searchRef.current, newFilters));
@@ -3457,23 +3590,23 @@
3457
3590
  }, onCancel: () => setEditingIndex(-1) }));
3458
3591
  }
3459
3592
  else {
3460
- return (React__default["default"].createElement(FilterRowDisplay, { key: `filter-${index}-${filters.length}-display`, resourceType: resourceType, searchParams: searchParams, filter: filter, onEdit: () => setEditingIndex(index), onDelete: () => setSearch(deleteFilter(searchRef.current, index)) }));
3593
+ return (React.createElement(FilterRowDisplay, { key: `filter-${index}-${filters.length}-display`, resourceType: resourceType, searchParams: searchParams, filter: filter, onEdit: () => setEditingIndex(index), onDelete: () => setSearch(deleteFilter(searchRef.current, index)) }));
3461
3594
  }
3462
3595
  }),
3463
- React__default["default"].createElement(FilterRowInput, { resourceType: resourceType, searchParams: searchParams, okText: "Add", onOk: onAddFilter })))),
3464
- React__default["default"].createElement(core$1.Group, { position: "right", mt: "xl" },
3465
- React__default["default"].createElement(core$1.Button, { onClick: () => props.onOk(searchRef.current) }, "OK"))));
3596
+ React.createElement(FilterRowInput, { resourceType: resourceType, searchParams: searchParams, okText: "Add", onOk: onAddFilter })))),
3597
+ React.createElement(core$1.Group, { position: "right", mt: "xl" },
3598
+ React.createElement(core$1.Button, { onClick: () => props.onOk(searchRef.current) }, "OK"))));
3466
3599
  }
3467
3600
  function FilterRowDisplay(props) {
3468
3601
  const { filter } = props;
3469
- return (React__default["default"].createElement("tr", null,
3470
- React__default["default"].createElement("td", null, buildFieldNameString(filter.code)),
3471
- React__default["default"].createElement("td", null, getOpString(filter.operator)),
3472
- React__default["default"].createElement("td", null,
3473
- React__default["default"].createElement(SearchFilterValueDisplay, { resourceType: props.resourceType, filter: filter })),
3474
- React__default["default"].createElement("td", null,
3475
- React__default["default"].createElement(core$1.Button, { compact: true, variant: "outline", onClick: props.onEdit }, "Edit"),
3476
- React__default["default"].createElement(core$1.Button, { compact: true, variant: "outline", onClick: props.onDelete }, "Delete"))));
3602
+ return (React.createElement("tr", null,
3603
+ React.createElement("td", null, buildFieldNameString(filter.code)),
3604
+ React.createElement("td", null, getOpString(filter.operator)),
3605
+ React.createElement("td", null,
3606
+ React.createElement(SearchFilterValueDisplay, { resourceType: props.resourceType, filter: filter })),
3607
+ React.createElement("td", null,
3608
+ React.createElement(core$1.Button, { compact: true, variant: "outline", onClick: props.onEdit }, "Edit"),
3609
+ React.createElement(core$1.Button, { compact: true, variant: "outline", onClick: props.onDelete }, "Delete"))));
3477
3610
  }
3478
3611
  function FilterRowInput(props) {
3479
3612
  var _a;
@@ -3491,17 +3624,17 @@
3491
3624
  }
3492
3625
  const searchParam = props.searchParams[value.code];
3493
3626
  const operators = searchParam && getSearchOperators(searchParam);
3494
- return (React__default["default"].createElement("tr", null,
3495
- React__default["default"].createElement("td", null,
3496
- React__default["default"].createElement(core$1.NativeSelect, { "data-testid": "filter-field", defaultValue: valueRef.current.code, onChange: (e) => setFilterCode(e.currentTarget.value), data: Object.keys(props.searchParams).map((param) => ({ value: param, label: buildFieldNameString(param) })) })),
3497
- React__default["default"].createElement("td", null, operators && (React__default["default"].createElement(core$1.NativeSelect, { "data-testid": "filter-operation", defaultValue: value.operator, onChange: (e) => setFilterOperator(e.currentTarget.value), data: ['', ...operators.map((op) => ({ value: op, label: getOpString(op) }))] }))),
3498
- React__default["default"].createElement("td", null, searchParam && value.operator && (React__default["default"].createElement(SearchFilterValueInput, { resourceType: props.resourceType, searchParam: searchParam, defaultValue: value.value, onChange: setFilterValue }))),
3499
- React__default["default"].createElement("td", null,
3500
- value.code && value.operator && value.value && (React__default["default"].createElement(core$1.Button, { compact: true, variant: "outline", onClick: () => {
3627
+ return (React.createElement("tr", null,
3628
+ React.createElement("td", null,
3629
+ React.createElement(core$1.NativeSelect, { "data-testid": "filter-field", defaultValue: valueRef.current.code, onChange: (e) => setFilterCode(e.currentTarget.value), data: Object.keys(props.searchParams).map((param) => ({ value: param, label: buildFieldNameString(param) })) })),
3630
+ React.createElement("td", null, operators && (React.createElement(core$1.NativeSelect, { "data-testid": "filter-operation", defaultValue: value.operator, onChange: (e) => setFilterOperator(e.currentTarget.value), data: ['', ...operators.map((op) => ({ value: op, label: getOpString(op) }))] }))),
3631
+ React.createElement("td", null, searchParam && value.operator && (React.createElement(SearchFilterValueInput, { resourceType: props.resourceType, searchParam: searchParam, defaultValue: value.value, onChange: setFilterValue }))),
3632
+ React.createElement("td", null,
3633
+ value.code && value.operator && value.value && (React.createElement(core$1.Button, { compact: true, variant: "outline", onClick: () => {
3501
3634
  props.onOk(valueRef.current);
3502
3635
  setValue({});
3503
3636
  } }, props.okText)),
3504
- props.onCancel && (React__default["default"].createElement(core$1.Button, { compact: true, variant: "outline", onClick: props.onCancel }, "Cancel")))));
3637
+ props.onCancel && (React.createElement(core$1.Button, { compact: true, variant: "outline", onClick: props.onCancel }, "Cancel")))));
3505
3638
  }
3506
3639
 
3507
3640
  function SearchFilterValueDialog(props) {
@@ -3513,11 +3646,11 @@
3513
3646
  function onOk() {
3514
3647
  props.onOk(Object.assign(Object.assign({}, props.filter), { value }));
3515
3648
  }
3516
- return (React__default["default"].createElement(core$1.Modal, { title: props.title, size: "xl", opened: props.visible, onClose: props.onCancel },
3517
- React__default["default"].createElement("div", { style: { width: 500 } },
3518
- React__default["default"].createElement(Form, { onSubmit: onOk },
3519
- React__default["default"].createElement(SearchFilterValueInput, { resourceType: props.resourceType, searchParam: props.searchParam, defaultValue: value, autoFocus: true, onChange: setValue }))),
3520
- React__default["default"].createElement(core$1.Button, { onClick: onOk }, "OK")));
3649
+ return (React.createElement(core$1.Modal, { title: props.title, size: "xl", opened: props.visible, onClose: props.onCancel },
3650
+ React.createElement("div", { style: { width: 500 } },
3651
+ React.createElement(Form, { onSubmit: onOk },
3652
+ React.createElement(SearchFilterValueInput, { resourceType: props.resourceType, searchParam: props.searchParam, defaultValue: value, autoFocus: true, onChange: setValue }))),
3653
+ React.createElement(core$1.Button, { onClick: onOk }, "OK")));
3521
3654
  }
3522
3655
 
3523
3656
  function SearchPopupMenu(props) {
@@ -3538,26 +3671,26 @@
3538
3671
  }
3539
3672
  // If there is only one search parameter, then show it directly
3540
3673
  if (props.searchParams.length === 1) {
3541
- return (React__default["default"].createElement(SearchParameterSubMenu, { search: props.search, searchParam: props.searchParams[0], onSort: onSort, onPrompt: onPrompt, onChange: onChange, onClear: onClear }));
3674
+ return (React.createElement(SearchParameterSubMenu, { search: props.search, searchParam: props.searchParams[0], onSort: onSort, onPrompt: onPrompt, onChange: onChange, onClear: onClear }));
3542
3675
  }
3543
3676
  // Otherwise, show a menu, with each search parameter as a sub menu
3544
- return (React__default["default"].createElement(core$1.Menu.Dropdown, null, props.searchParams.map((searchParam) => (React__default["default"].createElement(core$1.Menu.Item, { key: searchParam.code }, buildFieldNameString(searchParam.code))))));
3677
+ return (React.createElement(core$1.Menu.Dropdown, null, props.searchParams.map((searchParam) => (React.createElement(core$1.Menu.Item, { key: searchParam.code }, buildFieldNameString(searchParam.code))))));
3545
3678
  }
3546
3679
  function SearchParameterSubMenu(props) {
3547
3680
  switch (props.searchParam.type) {
3548
3681
  case 'date':
3549
- return React__default["default"].createElement(DateFilterSubMenu, Object.assign({}, props));
3682
+ return React.createElement(DateFilterSubMenu, Object.assign({}, props));
3550
3683
  case 'number':
3551
3684
  case 'quantity':
3552
- return React__default["default"].createElement(NumericFilterSubMenu, Object.assign({}, props));
3685
+ return React.createElement(NumericFilterSubMenu, Object.assign({}, props));
3553
3686
  case 'reference':
3554
- return React__default["default"].createElement(ReferenceFilterSubMenu, Object.assign({}, props));
3687
+ return React.createElement(ReferenceFilterSubMenu, Object.assign({}, props));
3555
3688
  case 'string':
3556
3689
  case 'token':
3557
3690
  case 'uri':
3558
- return React__default["default"].createElement(TextFilterSubMenu, Object.assign({}, props));
3691
+ return React.createElement(TextFilterSubMenu, Object.assign({}, props));
3559
3692
  default:
3560
- return React__default["default"].createElement(React__default["default"].Fragment, null,
3693
+ return React.createElement(React.Fragment, null,
3561
3694
  "Unknown search param type: ",
3562
3695
  props.searchParam.type);
3563
3696
  }
@@ -3565,72 +3698,72 @@
3565
3698
  function DateFilterSubMenu(props) {
3566
3699
  const { searchParam } = props;
3567
3700
  const code = searchParam.code;
3568
- return (React__default["default"].createElement(core$1.Menu.Dropdown, null,
3569
- React__default["default"].createElement(core$1.Menu.Item, { icon: React__default["default"].createElement(icons.IconSortAscending, { size: 14 }), onClick: () => props.onSort(searchParam, false) }, "Sort Oldest to Newest"),
3570
- React__default["default"].createElement(core$1.Menu.Item, { icon: React__default["default"].createElement(icons.IconSortDescending, { size: 14 }), onClick: () => props.onSort(searchParam, true) }, "Sort Newest to Oldest"),
3571
- React__default["default"].createElement(core$1.Menu.Divider, null),
3572
- React__default["default"].createElement(core$1.Menu.Item, { icon: React__default["default"].createElement(icons.IconEqual, { size: 14 }), onClick: () => props.onPrompt(searchParam, core.Operator.EQUALS) }, "Equals..."),
3573
- React__default["default"].createElement(core$1.Menu.Item, { icon: React__default["default"].createElement(icons.IconEqualNot, { size: 14 }), onClick: () => props.onPrompt(searchParam, core.Operator.NOT_EQUALS) }, "Does not equal..."),
3574
- React__default["default"].createElement(core$1.Menu.Divider, null),
3575
- React__default["default"].createElement(core$1.Menu.Item, { icon: React__default["default"].createElement(icons.IconMathLower, { size: 14 }), onClick: () => props.onPrompt(searchParam, core.Operator.ENDS_BEFORE) }, "Before..."),
3576
- React__default["default"].createElement(core$1.Menu.Item, { icon: React__default["default"].createElement(icons.IconMathGreater, { size: 14 }), onClick: () => props.onPrompt(searchParam, core.Operator.STARTS_AFTER) }, "After..."),
3577
- React__default["default"].createElement(core$1.Menu.Item, { icon: React__default["default"].createElement(icons.IconBracketsContain, { size: 14 }), onClick: () => props.onPrompt(searchParam, core.Operator.EQUALS) }, "Between..."),
3578
- React__default["default"].createElement(core$1.Menu.Divider, null),
3579
- React__default["default"].createElement(core$1.Menu.Item, { icon: React__default["default"].createElement(icons.IconCalendar, { size: 14 }), onClick: () => props.onChange(addTomorrowFilter(props.search, code)) }, "Tomorrow"),
3580
- React__default["default"].createElement(core$1.Menu.Item, { icon: React__default["default"].createElement(icons.IconCalendar, { size: 14 }), onClick: () => props.onChange(addTodayFilter(props.search, code)) }, "Today"),
3581
- React__default["default"].createElement(core$1.Menu.Item, { icon: React__default["default"].createElement(icons.IconCalendar, { size: 14 }), onClick: () => props.onChange(addYesterdayFilter(props.search, code)) }, "Yesterday"),
3582
- React__default["default"].createElement(core$1.Menu.Divider, null),
3583
- React__default["default"].createElement(core$1.Menu.Item, { icon: React__default["default"].createElement(icons.IconCalendar, { size: 14 }), onClick: () => props.onChange(addNextMonthFilter(props.search, code)) }, "Next Month"),
3584
- React__default["default"].createElement(core$1.Menu.Item, { icon: React__default["default"].createElement(icons.IconCalendar, { size: 14 }), onClick: () => props.onChange(addThisMonthFilter(props.search, code)) }, "This Month"),
3585
- React__default["default"].createElement(core$1.Menu.Item, { icon: React__default["default"].createElement(icons.IconCalendar, { size: 14 }), onClick: () => props.onChange(addLastMonthFilter(props.search, code)) }, "Last Month"),
3586
- React__default["default"].createElement(core$1.Menu.Divider, null),
3587
- React__default["default"].createElement(core$1.Menu.Item, { icon: React__default["default"].createElement(icons.IconCalendar, { size: 14 }), onClick: () => props.onChange(addYearToDateFilter(props.search, code)) }, "Year to date"),
3588
- React__default["default"].createElement(CommonMenuItems, Object.assign({}, props))));
3701
+ return (React.createElement(core$1.Menu.Dropdown, null,
3702
+ React.createElement(core$1.Menu.Item, { icon: React.createElement(icons.IconSortAscending, { size: 14 }), onClick: () => props.onSort(searchParam, false) }, "Sort Oldest to Newest"),
3703
+ React.createElement(core$1.Menu.Item, { icon: React.createElement(icons.IconSortDescending, { size: 14 }), onClick: () => props.onSort(searchParam, true) }, "Sort Newest to Oldest"),
3704
+ React.createElement(core$1.Menu.Divider, null),
3705
+ React.createElement(core$1.Menu.Item, { icon: React.createElement(icons.IconEqual, { size: 14 }), onClick: () => props.onPrompt(searchParam, core.Operator.EQUALS) }, "Equals..."),
3706
+ React.createElement(core$1.Menu.Item, { icon: React.createElement(icons.IconEqualNot, { size: 14 }), onClick: () => props.onPrompt(searchParam, core.Operator.NOT_EQUALS) }, "Does not equal..."),
3707
+ React.createElement(core$1.Menu.Divider, null),
3708
+ React.createElement(core$1.Menu.Item, { icon: React.createElement(icons.IconMathLower, { size: 14 }), onClick: () => props.onPrompt(searchParam, core.Operator.ENDS_BEFORE) }, "Before..."),
3709
+ React.createElement(core$1.Menu.Item, { icon: React.createElement(icons.IconMathGreater, { size: 14 }), onClick: () => props.onPrompt(searchParam, core.Operator.STARTS_AFTER) }, "After..."),
3710
+ React.createElement(core$1.Menu.Item, { icon: React.createElement(icons.IconBracketsContain, { size: 14 }), onClick: () => props.onPrompt(searchParam, core.Operator.EQUALS) }, "Between..."),
3711
+ React.createElement(core$1.Menu.Divider, null),
3712
+ React.createElement(core$1.Menu.Item, { icon: React.createElement(icons.IconCalendar, { size: 14 }), onClick: () => props.onChange(addTomorrowFilter(props.search, code)) }, "Tomorrow"),
3713
+ React.createElement(core$1.Menu.Item, { icon: React.createElement(icons.IconCalendar, { size: 14 }), onClick: () => props.onChange(addTodayFilter(props.search, code)) }, "Today"),
3714
+ React.createElement(core$1.Menu.Item, { icon: React.createElement(icons.IconCalendar, { size: 14 }), onClick: () => props.onChange(addYesterdayFilter(props.search, code)) }, "Yesterday"),
3715
+ React.createElement(core$1.Menu.Divider, null),
3716
+ React.createElement(core$1.Menu.Item, { icon: React.createElement(icons.IconCalendar, { size: 14 }), onClick: () => props.onChange(addNextMonthFilter(props.search, code)) }, "Next Month"),
3717
+ React.createElement(core$1.Menu.Item, { icon: React.createElement(icons.IconCalendar, { size: 14 }), onClick: () => props.onChange(addThisMonthFilter(props.search, code)) }, "This Month"),
3718
+ React.createElement(core$1.Menu.Item, { icon: React.createElement(icons.IconCalendar, { size: 14 }), onClick: () => props.onChange(addLastMonthFilter(props.search, code)) }, "Last Month"),
3719
+ React.createElement(core$1.Menu.Divider, null),
3720
+ React.createElement(core$1.Menu.Item, { icon: React.createElement(icons.IconCalendar, { size: 14 }), onClick: () => props.onChange(addYearToDateFilter(props.search, code)) }, "Year to date"),
3721
+ React.createElement(CommonMenuItems, Object.assign({}, props))));
3589
3722
  }
3590
3723
  function NumericFilterSubMenu(props) {
3591
3724
  const { searchParam } = props;
3592
- return (React__default["default"].createElement(core$1.Menu.Dropdown, null,
3593
- React__default["default"].createElement(core$1.Menu.Item, { icon: React__default["default"].createElement(icons.IconSortAscending, { size: 14 }), onClick: () => props.onSort(searchParam, false) }, "Sort Smallest to Largest"),
3594
- React__default["default"].createElement(core$1.Menu.Item, { icon: React__default["default"].createElement(icons.IconSortDescending, { size: 14 }), onClick: () => props.onSort(searchParam, true) }, "Sort Largest to Smallest"),
3595
- React__default["default"].createElement(core$1.Menu.Divider, null),
3596
- React__default["default"].createElement(core$1.Menu.Item, { icon: React__default["default"].createElement(icons.IconEqual, { size: 14 }), onClick: () => props.onPrompt(searchParam, core.Operator.EQUALS) }, "Equals..."),
3597
- React__default["default"].createElement(core$1.Menu.Item, { icon: React__default["default"].createElement(icons.IconEqualNot, { size: 14 }), onClick: () => props.onPrompt(searchParam, core.Operator.NOT_EQUALS) }, "Does not equal..."),
3598
- React__default["default"].createElement(core$1.Menu.Divider, null),
3599
- React__default["default"].createElement(core$1.Menu.Item, { icon: React__default["default"].createElement(icons.IconMathGreater, { size: 14 }), onClick: () => props.onPrompt(searchParam, core.Operator.GREATER_THAN) }, "Greater than..."),
3600
- React__default["default"].createElement(core$1.Menu.Item, { icon: React__default["default"].createElement(icons.IconSettings, { size: 14 }), onClick: () => props.onPrompt(searchParam, core.Operator.GREATER_THAN_OR_EQUALS) }, "Greater than or equal to..."),
3601
- React__default["default"].createElement(core$1.Menu.Item, { icon: React__default["default"].createElement(icons.IconMathLower, { size: 14 }), onClick: () => props.onPrompt(searchParam, core.Operator.LESS_THAN) }, "Less than..."),
3602
- React__default["default"].createElement(core$1.Menu.Item, { icon: React__default["default"].createElement(icons.IconSettings, { size: 14 }), onClick: () => props.onPrompt(searchParam, core.Operator.LESS_THAN_OR_EQUALS) }, "Less than or equal to..."),
3603
- React__default["default"].createElement(CommonMenuItems, Object.assign({}, props))));
3725
+ return (React.createElement(core$1.Menu.Dropdown, null,
3726
+ React.createElement(core$1.Menu.Item, { icon: React.createElement(icons.IconSortAscending, { size: 14 }), onClick: () => props.onSort(searchParam, false) }, "Sort Smallest to Largest"),
3727
+ React.createElement(core$1.Menu.Item, { icon: React.createElement(icons.IconSortDescending, { size: 14 }), onClick: () => props.onSort(searchParam, true) }, "Sort Largest to Smallest"),
3728
+ React.createElement(core$1.Menu.Divider, null),
3729
+ React.createElement(core$1.Menu.Item, { icon: React.createElement(icons.IconEqual, { size: 14 }), onClick: () => props.onPrompt(searchParam, core.Operator.EQUALS) }, "Equals..."),
3730
+ React.createElement(core$1.Menu.Item, { icon: React.createElement(icons.IconEqualNot, { size: 14 }), onClick: () => props.onPrompt(searchParam, core.Operator.NOT_EQUALS) }, "Does not equal..."),
3731
+ React.createElement(core$1.Menu.Divider, null),
3732
+ React.createElement(core$1.Menu.Item, { icon: React.createElement(icons.IconMathGreater, { size: 14 }), onClick: () => props.onPrompt(searchParam, core.Operator.GREATER_THAN) }, "Greater than..."),
3733
+ React.createElement(core$1.Menu.Item, { icon: React.createElement(icons.IconSettings, { size: 14 }), onClick: () => props.onPrompt(searchParam, core.Operator.GREATER_THAN_OR_EQUALS) }, "Greater than or equal to..."),
3734
+ React.createElement(core$1.Menu.Item, { icon: React.createElement(icons.IconMathLower, { size: 14 }), onClick: () => props.onPrompt(searchParam, core.Operator.LESS_THAN) }, "Less than..."),
3735
+ React.createElement(core$1.Menu.Item, { icon: React.createElement(icons.IconSettings, { size: 14 }), onClick: () => props.onPrompt(searchParam, core.Operator.LESS_THAN_OR_EQUALS) }, "Less than or equal to..."),
3736
+ React.createElement(CommonMenuItems, Object.assign({}, props))));
3604
3737
  }
3605
3738
  function ReferenceFilterSubMenu(props) {
3606
3739
  const { searchParam } = props;
3607
- return (React__default["default"].createElement(core$1.Menu.Dropdown, null,
3608
- React__default["default"].createElement(core$1.Menu.Item, { icon: React__default["default"].createElement(icons.IconEqual, { size: 14 }), onClick: () => props.onPrompt(searchParam, core.Operator.EQUALS) }, "Equals..."),
3609
- React__default["default"].createElement(core$1.Menu.Item, { icon: React__default["default"].createElement(icons.IconEqualNot, { size: 14 }), onClick: () => props.onPrompt(searchParam, core.Operator.NOT) }, "Does not equal..."),
3610
- React__default["default"].createElement(CommonMenuItems, Object.assign({}, props))));
3740
+ return (React.createElement(core$1.Menu.Dropdown, null,
3741
+ React.createElement(core$1.Menu.Item, { icon: React.createElement(icons.IconEqual, { size: 14 }), onClick: () => props.onPrompt(searchParam, core.Operator.EQUALS) }, "Equals..."),
3742
+ React.createElement(core$1.Menu.Item, { icon: React.createElement(icons.IconEqualNot, { size: 14 }), onClick: () => props.onPrompt(searchParam, core.Operator.NOT) }, "Does not equal..."),
3743
+ React.createElement(CommonMenuItems, Object.assign({}, props))));
3611
3744
  }
3612
3745
  function TextFilterSubMenu(props) {
3613
3746
  const { searchParam } = props;
3614
- return (React__default["default"].createElement(core$1.Menu.Dropdown, null,
3615
- React__default["default"].createElement(core$1.Menu.Item, { icon: React__default["default"].createElement(icons.IconSortAscending, { size: 14 }), onClick: () => props.onSort(searchParam, false) }, "Sort A to Z"),
3616
- React__default["default"].createElement(core$1.Menu.Item, { icon: React__default["default"].createElement(icons.IconSortDescending, { size: 14 }), onClick: () => props.onSort(searchParam, true) }, "Sort Z to A"),
3617
- React__default["default"].createElement(core$1.Menu.Divider, null),
3618
- React__default["default"].createElement(core$1.Menu.Item, { icon: React__default["default"].createElement(icons.IconEqual, { size: 14 }), onClick: () => props.onPrompt(searchParam, core.Operator.EQUALS) }, "Equals..."),
3619
- React__default["default"].createElement(core$1.Menu.Item, { icon: React__default["default"].createElement(icons.IconEqualNot, { size: 14 }), onClick: () => props.onPrompt(searchParam, core.Operator.NOT) }, "Does not equal..."),
3620
- React__default["default"].createElement(core$1.Menu.Divider, null),
3621
- React__default["default"].createElement(core$1.Menu.Item, { icon: React__default["default"].createElement(icons.IconBucket, { size: 14 }), onClick: () => props.onPrompt(searchParam, core.Operator.CONTAINS) }, "Contains..."),
3622
- React__default["default"].createElement(core$1.Menu.Item, { icon: React__default["default"].createElement(icons.IconBucketOff, { size: 14 }), onClick: () => props.onPrompt(searchParam, core.Operator.EQUALS) }, "Does not contain..."),
3623
- React__default["default"].createElement(CommonMenuItems, Object.assign({}, props))));
3747
+ return (React.createElement(core$1.Menu.Dropdown, null,
3748
+ React.createElement(core$1.Menu.Item, { icon: React.createElement(icons.IconSortAscending, { size: 14 }), onClick: () => props.onSort(searchParam, false) }, "Sort A to Z"),
3749
+ React.createElement(core$1.Menu.Item, { icon: React.createElement(icons.IconSortDescending, { size: 14 }), onClick: () => props.onSort(searchParam, true) }, "Sort Z to A"),
3750
+ React.createElement(core$1.Menu.Divider, null),
3751
+ React.createElement(core$1.Menu.Item, { icon: React.createElement(icons.IconEqual, { size: 14 }), onClick: () => props.onPrompt(searchParam, core.Operator.EQUALS) }, "Equals..."),
3752
+ React.createElement(core$1.Menu.Item, { icon: React.createElement(icons.IconEqualNot, { size: 14 }), onClick: () => props.onPrompt(searchParam, core.Operator.NOT) }, "Does not equal..."),
3753
+ React.createElement(core$1.Menu.Divider, null),
3754
+ React.createElement(core$1.Menu.Item, { icon: React.createElement(icons.IconBucket, { size: 14 }), onClick: () => props.onPrompt(searchParam, core.Operator.CONTAINS) }, "Contains..."),
3755
+ React.createElement(core$1.Menu.Item, { icon: React.createElement(icons.IconBucketOff, { size: 14 }), onClick: () => props.onPrompt(searchParam, core.Operator.EQUALS) }, "Does not contain..."),
3756
+ React.createElement(CommonMenuItems, Object.assign({}, props))));
3624
3757
  }
3625
3758
  function CommonMenuItems(props) {
3626
3759
  const { searchParam } = props;
3627
3760
  const code = searchParam.code;
3628
- return (React__default["default"].createElement(React__default["default"].Fragment, null,
3629
- React__default["default"].createElement(core$1.Menu.Divider, null),
3630
- React__default["default"].createElement(core$1.Menu.Item, { icon: React__default["default"].createElement(icons.IconBleach, { size: 14 }), onClick: () => props.onChange(addMissingFilter(props.search, code)) }, "Missing"),
3631
- React__default["default"].createElement(core$1.Menu.Item, { icon: React__default["default"].createElement(icons.IconBleachOff, { size: 14 }), onClick: () => props.onChange(addMissingFilter(props.search, code, false)) }, "Not missing"),
3632
- React__default["default"].createElement(core$1.Menu.Divider, null),
3633
- React__default["default"].createElement(core$1.Menu.Item, { icon: React__default["default"].createElement(icons.IconX, { size: 14 }), onClick: () => props.onClear(searchParam) }, "Clear filters")));
3761
+ return (React.createElement(React.Fragment, null,
3762
+ React.createElement(core$1.Menu.Divider, null),
3763
+ React.createElement(core$1.Menu.Item, { icon: React.createElement(icons.IconBleach, { size: 14 }), onClick: () => props.onChange(addMissingFilter(props.search, code)) }, "Missing"),
3764
+ React.createElement(core$1.Menu.Item, { icon: React.createElement(icons.IconBleachOff, { size: 14 }), onClick: () => props.onChange(addMissingFilter(props.search, code, false)) }, "Not missing"),
3765
+ React.createElement(core$1.Menu.Divider, null),
3766
+ React.createElement(core$1.Menu.Item, { icon: React.createElement(icons.IconX, { size: 14 }), onClick: () => props.onClear(searchParam) }, "Clear filters")));
3634
3767
  }
3635
3768
 
3636
3769
  class SearchChangeEvent extends Event {
@@ -3652,7 +3785,21 @@
3652
3785
  this.browserEvent = browserEvent;
3653
3786
  }
3654
3787
  }
3655
- const useStyles = core$1.createStyles((theme) => ({
3788
+ const useStyles$6 = core$1.createStyles((theme) => ({
3789
+ root: {
3790
+ maxWidth: '100%',
3791
+ overflow: 'auto',
3792
+ textAlign: 'left',
3793
+ marginBottom: '20px',
3794
+ },
3795
+ table: {
3796
+ cursor: 'pointer',
3797
+ },
3798
+ tr: {
3799
+ '&:hover': {
3800
+ backgroundColor: theme.colorScheme === 'dark' ? theme.colors.dark[7] : theme.colors.gray[0],
3801
+ },
3802
+ },
3656
3803
  th: {
3657
3804
  padding: '0 !important',
3658
3805
  },
@@ -3676,7 +3823,7 @@
3676
3823
  */
3677
3824
  function SearchControl(props) {
3678
3825
  var _a, _b;
3679
- const { classes } = useStyles();
3826
+ const { classes } = useStyles$6();
3680
3827
  const medplum = useMedplum();
3681
3828
  const [schemaLoaded, setSchemaLoaded] = React.useState(false);
3682
3829
  const [outcome, setOutcome] = React.useState();
@@ -3788,7 +3935,7 @@
3788
3935
  }, [medplum, props.search.resourceType]);
3789
3936
  const typeSchema = schemaLoaded && ((_a = core.globalSchema === null || core.globalSchema === void 0 ? void 0 : core.globalSchema.types) === null || _a === void 0 ? void 0 : _a[props.search.resourceType]);
3790
3937
  if (!typeSchema) {
3791
- return React__default["default"].createElement(core$1.Loader, null);
3938
+ return React.createElement(core$1.Loader, null);
3792
3939
  }
3793
3940
  const checkboxColumn = props.checkboxesEnabled;
3794
3941
  const fields = getFieldDefinitions(search);
@@ -3800,51 +3947,52 @@
3800
3947
  const buttonColor = 'gray';
3801
3948
  const iconSize = 16;
3802
3949
  const isMobile = window.innerWidth < 768;
3803
- return (React__default["default"].createElement("div", { className: "medplum-search-control", "data-testid": "search-control" },
3804
- !props.hideToolbar && (React__default["default"].createElement(core$1.Group, { position: "apart", mb: "xl" },
3805
- React__default["default"].createElement(core$1.Group, { spacing: 2 },
3806
- React__default["default"].createElement(core$1.Button, { compact: true, variant: buttonVariant, color: buttonColor, leftIcon: React__default["default"].createElement(icons.IconFilter, { size: iconSize }), onClick: () => setState(Object.assign(Object.assign({}, stateRef.current), { fieldEditorVisible: true })) }, "Fields"),
3807
- React__default["default"].createElement(core$1.Button, { compact: true, variant: buttonVariant, color: buttonColor, leftIcon: React__default["default"].createElement(icons.IconColumns, { size: iconSize }), onClick: () => setState(Object.assign(Object.assign({}, stateRef.current), { filterEditorVisible: true })) }, "Filters"),
3808
- props.onNew && (React__default["default"].createElement(core$1.Button, { compact: true, variant: buttonVariant, color: buttonColor, leftIcon: React__default["default"].createElement(icons.IconFilePlus, { size: iconSize }), onClick: props.onNew }, "New...")),
3809
- !isMobile && props.onExport && (React__default["default"].createElement(core$1.Button, { compact: true, variant: buttonVariant, color: buttonColor, leftIcon: React__default["default"].createElement(icons.IconTableExport, { size: iconSize }), onClick: props.onExport }, "Export...")),
3810
- !isMobile && props.onDelete && (React__default["default"].createElement(core$1.Button, { compact: true, variant: buttonVariant, color: buttonColor, leftIcon: React__default["default"].createElement(icons.IconTrash, { size: iconSize }), onClick: () => props.onDelete(Object.keys(state.selected)) }, "Delete...")),
3811
- !isMobile && props.onBulk && (React__default["default"].createElement(core$1.Button, { compact: true, variant: buttonVariant, color: buttonColor, leftIcon: React__default["default"].createElement(icons.IconBoxMultiple, { size: iconSize }), onClick: () => props.onBulk(Object.keys(state.selected)) }, "Bulk..."))),
3812
- lastResult && (React__default["default"].createElement(core$1.Group, { spacing: 2 },
3813
- React__default["default"].createElement("span", { className: "medplum-search-summary" },
3814
- getStart$1(search, lastResult.total),
3815
- "-",
3816
- getEnd$1(search, lastResult.total),
3817
- " of",
3818
- ' ', (_b = lastResult.total) === null || _b === void 0 ? void 0 :
3819
- _b.toLocaleString()))))),
3820
- React__default["default"].createElement(core$1.Table, null,
3821
- React__default["default"].createElement("thead", null,
3822
- React__default["default"].createElement("tr", null,
3823
- checkboxColumn && (React__default["default"].createElement("th", { className: "medplum-search-icon-cell" },
3824
- React__default["default"].createElement("input", { type: "checkbox", value: "checked", "aria-label": "all-checkbox", "data-testid": "all-checkbox", checked: isAllSelected(), onChange: (e) => handleAllCheckboxClick(e) }))),
3825
- fields.map((field) => (React__default["default"].createElement("th", { key: field.name },
3826
- React__default["default"].createElement(core$1.Menu, { shadow: "md", width: 240, position: "bottom-end" },
3827
- React__default["default"].createElement(core$1.Menu.Target, null,
3828
- React__default["default"].createElement(core$1.UnstyledButton, { className: classes.control },
3829
- React__default["default"].createElement(core$1.Group, { position: "apart", noWrap: true },
3830
- React__default["default"].createElement(core$1.Text, { weight: 500, size: "sm" }, buildFieldNameString(field.name)),
3831
- React__default["default"].createElement(core$1.Center, { className: classes.icon },
3832
- React__default["default"].createElement(icons.IconAdjustmentsHorizontal, { size: 14, stroke: 1.5 }))))),
3833
- React__default["default"].createElement(SearchPopupMenu, { search: props.search, searchParams: field.searchParams, onPrompt: (searchParam, filter) => {
3950
+ return (React.createElement("div", { className: classes.root, "data-testid": "search-control" },
3951
+ !props.hideToolbar && (React.createElement(core$1.Group, { position: "apart", mb: "xl" },
3952
+ React.createElement(core$1.Group, { spacing: 2 },
3953
+ React.createElement(core$1.Button, { compact: true, variant: buttonVariant, color: buttonColor, leftIcon: React.createElement(icons.IconFilter, { size: iconSize }), onClick: () => setState(Object.assign(Object.assign({}, stateRef.current), { fieldEditorVisible: true })) }, "Fields"),
3954
+ React.createElement(core$1.Button, { compact: true, variant: buttonVariant, color: buttonColor, leftIcon: React.createElement(icons.IconColumns, { size: iconSize }), onClick: () => setState(Object.assign(Object.assign({}, stateRef.current), { filterEditorVisible: true })) }, "Filters"),
3955
+ props.onNew && (React.createElement(core$1.Button, { compact: true, variant: buttonVariant, color: buttonColor, leftIcon: React.createElement(icons.IconFilePlus, { size: iconSize }), onClick: props.onNew }, "New...")),
3956
+ !isMobile && props.onExport && (React.createElement(core$1.Button, { compact: true, variant: buttonVariant, color: buttonColor, leftIcon: React.createElement(icons.IconTableExport, { size: iconSize }), onClick: props.onExport }, "Export...")),
3957
+ !isMobile && props.onDelete && (React.createElement(core$1.Button, { compact: true, variant: buttonVariant, color: buttonColor, leftIcon: React.createElement(icons.IconTrash, { size: iconSize }), onClick: () => props.onDelete(Object.keys(state.selected)) }, "Delete...")),
3958
+ !isMobile && props.onBulk && (React.createElement(core$1.Button, { compact: true, variant: buttonVariant, color: buttonColor, leftIcon: React.createElement(icons.IconBoxMultiple, { size: iconSize }), onClick: () => props.onBulk(Object.keys(state.selected)) }, "Bulk..."))),
3959
+ lastResult && (React.createElement(core$1.Text, { size: "xs", color: "dimmed" },
3960
+ getStart$1(search, lastResult.total),
3961
+ "-",
3962
+ getEnd$1(search, lastResult.total),
3963
+ " of",
3964
+ ' ', (_b = lastResult.total) === null || _b === void 0 ? void 0 :
3965
+ _b.toLocaleString())))),
3966
+ React.createElement(core$1.Table, { className: classes.table },
3967
+ React.createElement("thead", null,
3968
+ React.createElement("tr", null,
3969
+ checkboxColumn && (React.createElement("th", null,
3970
+ React.createElement("input", { type: "checkbox", value: "checked", "aria-label": "all-checkbox", "data-testid": "all-checkbox", checked: isAllSelected(), onChange: (e) => handleAllCheckboxClick(e) }))),
3971
+ fields.map((field) => (React.createElement("th", { key: field.name },
3972
+ React.createElement(core$1.Menu, { shadow: "md", width: 240, position: "bottom-end" },
3973
+ React.createElement(core$1.Menu.Target, null,
3974
+ React.createElement(core$1.UnstyledButton, { className: classes.control },
3975
+ React.createElement(core$1.Group, { position: "apart", noWrap: true },
3976
+ React.createElement(core$1.Text, { weight: 500, size: "sm" }, buildFieldNameString(field.name)),
3977
+ React.createElement(core$1.Center, { className: classes.icon },
3978
+ React.createElement(icons.IconAdjustmentsHorizontal, { size: 14, stroke: 1.5 }))))),
3979
+ React.createElement(SearchPopupMenu, { search: props.search, searchParams: field.searchParams, onPrompt: (searchParam, filter) => {
3834
3980
  setState(Object.assign(Object.assign({}, stateRef.current), { filterDialogVisible: true, filterDialogSearchParam: searchParam, filterDialogFilter: filter }));
3835
3981
  }, onChange: (result) => {
3836
3982
  emitSearchChange(result);
3837
3983
  } })))))),
3838
- !props.hideFilters && (React__default["default"].createElement("tr", null,
3839
- checkboxColumn && React__default["default"].createElement("th", { className: "filters medplum-search-icon-cell" }),
3840
- fields.map((field) => (React__default["default"].createElement("th", { key: field.name, className: "filters" }, field.searchParams && (React__default["default"].createElement(FilterDescription, { resourceType: resourceType, searchParams: field.searchParams, filters: props.search.filters })))))))),
3841
- React__default["default"].createElement("tbody", null, resources === null || resources === void 0 ? void 0 : resources.map((resource) => resource && (React__default["default"].createElement("tr", { key: resource.id, "data-testid": "search-control-row", onClick: (e) => handleRowClick(e, resource), onAuxClick: (e) => handleRowClick(e, resource) },
3842
- checkboxColumn && (React__default["default"].createElement("td", { className: "medplum-search-icon-cell" },
3843
- React__default["default"].createElement("input", { type: "checkbox", value: "checked", "data-testid": "row-checkbox", "aria-label": `Checkbox for ${resource.id}`, checked: !!state.selected[resource.id], onChange: (e) => handleSingleCheckboxClick(e, resource.id) }))),
3844
- fields.map((field) => (React__default["default"].createElement("td", { key: field.name }, renderValue(resource, field))))))))),
3845
- (resources === null || resources === void 0 ? void 0 : resources.length) === 0 && (React__default["default"].createElement("div", { "data-testid": "empty-search", className: "medplum-empty-search" }, "No results")),
3846
- (lastResult === null || lastResult === void 0 ? void 0 : lastResult.total) !== undefined && lastResult.total > 0 && (React__default["default"].createElement(core$1.Center, { m: "md", p: "md" },
3847
- React__default["default"].createElement(core$1.Pagination, { page: getPage(search), total: getTotalPages(search, lastResult.total), onChange: (newPage) => emitSearchChange(setPage(search, newPage)), getItemAriaLabel: (page) => {
3984
+ !props.hideFilters && (React.createElement("tr", null,
3985
+ checkboxColumn && React.createElement("th", null),
3986
+ fields.map((field) => (React.createElement("th", { key: field.name }, field.searchParams && (React.createElement(FilterDescription, { resourceType: resourceType, searchParams: field.searchParams, filters: props.search.filters })))))))),
3987
+ React.createElement("tbody", null, resources === null || resources === void 0 ? void 0 : resources.map((resource) => resource && (React.createElement("tr", { key: resource.id, className: classes.tr, "data-testid": "search-control-row", onClick: (e) => handleRowClick(e, resource), onAuxClick: (e) => handleRowClick(e, resource) },
3988
+ checkboxColumn && (React.createElement("td", null,
3989
+ React.createElement("input", { type: "checkbox", value: "checked", "data-testid": "row-checkbox", "aria-label": `Checkbox for ${resource.id}`, checked: !!state.selected[resource.id], onChange: (e) => handleSingleCheckboxClick(e, resource.id) }))),
3990
+ fields.map((field) => (React.createElement("td", { key: field.name }, renderValue(resource, field))))))))),
3991
+ (resources === null || resources === void 0 ? void 0 : resources.length) === 0 && (React.createElement(core$1.Container, null,
3992
+ React.createElement(core$1.Center, null,
3993
+ React.createElement(core$1.Text, { size: "xl", color: "dimmed" }, "No results")))),
3994
+ (lastResult === null || lastResult === void 0 ? void 0 : lastResult.total) !== undefined && lastResult.total > 0 && (React.createElement(core$1.Center, { m: "md", p: "md" },
3995
+ React.createElement(core$1.Pagination, { page: getPage(search), total: getTotalPages(search, lastResult.total), onChange: (newPage) => emitSearchChange(setPage(search, newPage)), getItemAriaLabel: (page) => {
3848
3996
  switch (page) {
3849
3997
  case 'prev':
3850
3998
  return 'Previous page';
@@ -3854,38 +4002,38 @@
3854
4002
  return undefined;
3855
4003
  }
3856
4004
  } }))),
3857
- outcome && (React__default["default"].createElement("div", { "data-testid": "search-error", className: "medplum-empty-search" },
3858
- React__default["default"].createElement("pre", { style: { textAlign: 'left' } }, JSON.stringify(outcome, undefined, 2)))),
3859
- React__default["default"].createElement(SearchFieldEditor, { search: props.search, visible: stateRef.current.fieldEditorVisible, onOk: (result) => {
4005
+ outcome && (React.createElement("div", { "data-testid": "search-error" },
4006
+ React.createElement("pre", { style: { textAlign: 'left' } }, JSON.stringify(outcome, undefined, 2)))),
4007
+ React.createElement(SearchFieldEditor, { search: props.search, visible: stateRef.current.fieldEditorVisible, onOk: (result) => {
3860
4008
  emitSearchChange(result);
3861
4009
  setState(Object.assign(Object.assign({}, stateRef.current), { fieldEditorVisible: false }));
3862
4010
  }, onCancel: () => {
3863
4011
  setState(Object.assign(Object.assign({}, stateRef.current), { fieldEditorVisible: false }));
3864
4012
  } }),
3865
- React__default["default"].createElement(SearchFilterEditor, { search: props.search, visible: stateRef.current.filterEditorVisible, onOk: (result) => {
4013
+ React.createElement(SearchFilterEditor, { search: props.search, visible: stateRef.current.filterEditorVisible, onOk: (result) => {
3866
4014
  emitSearchChange(result);
3867
4015
  setState(Object.assign(Object.assign({}, stateRef.current), { filterEditorVisible: false }));
3868
4016
  }, onCancel: () => {
3869
4017
  setState(Object.assign(Object.assign({}, stateRef.current), { filterEditorVisible: false }));
3870
4018
  } }),
3871
- React__default["default"].createElement(SearchFilterValueDialog, { visible: stateRef.current.filterDialogVisible, title: 'Input', resourceType: resourceType, searchParam: state.filterDialogSearchParam, filter: state.filterDialogFilter, defaultValue: '', onOk: (filter) => {
4019
+ React.createElement(SearchFilterValueDialog, { visible: stateRef.current.filterDialogVisible, title: 'Input', resourceType: resourceType, searchParam: state.filterDialogSearchParam, filter: state.filterDialogFilter, defaultValue: '', onOk: (filter) => {
3872
4020
  emitSearchChange(addFilter(props.search, filter.code, filter.operator, filter.value));
3873
4021
  setState(Object.assign(Object.assign({}, stateRef.current), { filterDialogVisible: false }));
3874
4022
  }, onCancel: () => {
3875
4023
  setState(Object.assign(Object.assign({}, stateRef.current), { filterDialogVisible: false }));
3876
4024
  } })));
3877
4025
  }
3878
- const MemoizedSearchControl = React__default["default"].memo(SearchControl);
4026
+ const MemoizedSearchControl = React.memo(SearchControl);
3879
4027
  function FilterDescription(props) {
3880
4028
  var _a;
3881
4029
  const filters = ((_a = props.filters) !== null && _a !== void 0 ? _a : []).filter((f) => props.searchParams.find((p) => p.code === f.code));
3882
4030
  if (filters.length === 0) {
3883
- return React__default["default"].createElement("span", null, "no filters");
4031
+ return React.createElement("span", null, "no filters");
3884
4032
  }
3885
- return (React__default["default"].createElement(React__default["default"].Fragment, null, filters.map((filter, index) => (React__default["default"].createElement("div", { key: `filter-${index}-${filters.length}` },
4033
+ return (React.createElement(React.Fragment, null, filters.map((filter, index) => (React.createElement("div", { key: `filter-${index}-${filters.length}` },
3886
4034
  getOpString(filter.operator),
3887
4035
  "\u00A0",
3888
- React__default["default"].createElement(SearchFilterValueDisplay, { resourceType: props.resourceType, filter: filter }))))));
4036
+ React.createElement(SearchFilterValueDisplay, { resourceType: props.resourceType, filter: filter }))))));
3889
4037
  }
3890
4038
  function getPage(search) {
3891
4039
  return Math.floor((search.offset || 0) / (search.count || core.DEFAULT_SEARCH_COUNT)) + 1;
@@ -3989,29 +4137,29 @@
3989
4137
  }, [medplum, props.resourceType]);
3990
4138
  const typeSchema = (_a = schema === null || schema === void 0 ? void 0 : schema.types) === null || _a === void 0 ? void 0 : _a[props.resourceType];
3991
4139
  if (!typeSchema) {
3992
- return React__default["default"].createElement(core$1.Loader, null);
4140
+ return React.createElement(core$1.Loader, null);
3993
4141
  }
3994
4142
  const checkboxColumn = props.checkboxesEnabled;
3995
- return (React__default["default"].createElement("div", { className: "medplum-search-control", onContextMenu: (e) => killEvent(e), "data-testid": "search-control" },
3996
- React__default["default"].createElement(core$1.Table, null,
3997
- React__default["default"].createElement("thead", null,
3998
- React__default["default"].createElement("tr", null,
3999
- checkboxColumn && (React__default["default"].createElement("th", { className: "medplum-search-icon-cell" },
4000
- React__default["default"].createElement("input", { type: "checkbox", value: "checked", "aria-label": "all-checkbox", "data-testid": "all-checkbox", checked: isAllSelected(), onChange: (e) => handleAllCheckboxClick(e) }))),
4001
- fields.map((field) => (React__default["default"].createElement("th", { key: field.name }, field.name))))),
4002
- React__default["default"].createElement("tbody", null, (_c = (_b = response === null || response === void 0 ? void 0 : response.data) === null || _b === void 0 ? void 0 : _b.ResourceList) === null || _c === void 0 ? void 0 : _c.map((resource) => resource && (React__default["default"].createElement("tr", { key: resource.id, "data-testid": "search-control-row", onClick: (e) => handleRowClick(e, resource), onAuxClick: (e) => handleRowClick(e, resource) },
4003
- checkboxColumn && (React__default["default"].createElement("td", { className: "medplum-search-icon-cell" },
4004
- React__default["default"].createElement("input", { type: "checkbox", value: "checked", "data-testid": "row-checkbox", "aria-label": `Checkbox for ${resource.id}`, checked: !!selected[resource.id], onChange: (e) => handleSingleCheckboxClick(e, resource.id) }))),
4143
+ return (React.createElement("div", { onContextMenu: (e) => killEvent(e), "data-testid": "search-control" },
4144
+ React.createElement(core$1.Table, null,
4145
+ React.createElement("thead", null,
4146
+ React.createElement("tr", null,
4147
+ checkboxColumn && (React.createElement("th", null,
4148
+ React.createElement("input", { type: "checkbox", value: "checked", "aria-label": "all-checkbox", "data-testid": "all-checkbox", checked: isAllSelected(), onChange: (e) => handleAllCheckboxClick(e) }))),
4149
+ fields.map((field) => (React.createElement("th", { key: field.name }, field.name))))),
4150
+ React.createElement("tbody", null, (_c = (_b = response === null || response === void 0 ? void 0 : response.data) === null || _b === void 0 ? void 0 : _b.ResourceList) === null || _c === void 0 ? void 0 : _c.map((resource) => resource && (React.createElement("tr", { key: resource.id, "data-testid": "search-control-row", onClick: (e) => handleRowClick(e, resource), onAuxClick: (e) => handleRowClick(e, resource) },
4151
+ checkboxColumn && (React.createElement("td", null,
4152
+ React.createElement("input", { type: "checkbox", value: "checked", "data-testid": "row-checkbox", "aria-label": `Checkbox for ${resource.id}`, checked: !!selected[resource.id], onChange: (e) => handleSingleCheckboxClick(e, resource.id) }))),
4005
4153
  fields.map((field) => {
4006
- return (React__default["default"].createElement("td", { key: field.name },
4007
- React__default["default"].createElement(FhirPathDisplay, { propertyType: field.propertyType, path: field.fhirPath, resource: resource })));
4154
+ return (React.createElement("td", { key: field.name },
4155
+ React.createElement(FhirPathDisplay, { propertyType: field.propertyType, path: field.fhirPath, resource: resource })));
4008
4156
  })))))),
4009
- ((_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__default["default"].createElement("div", { "data-testid": "empty-search", className: "medplum-empty-search" }, "No results")),
4010
- outcome && (React__default["default"].createElement("div", { "data-testid": "search-error", className: "medplum-empty-search" },
4011
- React__default["default"].createElement("pre", { style: { textAlign: 'left' } }, JSON.stringify(outcome, undefined, 2)))),
4012
- props.onBulk && (React__default["default"].createElement(core$1.Button, { onClick: () => props.onBulk(Object.keys(selectedRef.current)) }, "Bulk..."))));
4157
+ ((_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" }, "No results"),
4158
+ outcome && (React.createElement("div", { "data-testid": "search-error" },
4159
+ React.createElement("pre", { style: { textAlign: 'left' } }, JSON.stringify(outcome, undefined, 2)))),
4160
+ props.onBulk && (React.createElement(core$1.Button, { onClick: () => props.onBulk(Object.keys(selectedRef.current)) }, "Bulk..."))));
4013
4161
  }
4014
- const MemoizedFhirPathTable = React__default["default"].memo(FhirPathTable);
4162
+ const MemoizedFhirPathTable = React.memo(FhirPathTable);
4015
4163
 
4016
4164
  const searches = [
4017
4165
  '$/_history',
@@ -4023,7 +4171,7 @@
4023
4171
  'ServiceRequest?subject=$',
4024
4172
  ];
4025
4173
  function PatientTimeline(props) {
4026
- return (React__default["default"].createElement(ResourceTimeline, { value: props.patient, buildSearchRequests: (resource) => ({
4174
+ return (React.createElement(ResourceTimeline, { value: props.patient, buildSearchRequests: (resource) => ({
4027
4175
  resourceType: 'Bundle',
4028
4176
  type: 'batch',
4029
4177
  entry: searches.map((search) => ({
@@ -4049,6 +4197,32 @@
4049
4197
  }) }));
4050
4198
  }
4051
4199
 
4200
+ const useStyles$5 = core$1.createStyles((theme) => ({
4201
+ section: {
4202
+ position: 'relative',
4203
+ margin: '4px 4px 8px 0',
4204
+ padding: '6px 12px 16px 6px',
4205
+ border: `1.5px solid ${theme.colors.gray[1]}`,
4206
+ borderRadius: theme.radius.sm,
4207
+ transition: 'all 0.1s',
4208
+ },
4209
+ hovering: {
4210
+ border: `1.5px solid ${theme.colors.blue[5]}`,
4211
+ },
4212
+ editing: {
4213
+ border: `1.5px solid ${theme.colors.gray[1]}`,
4214
+ borderLeft: `4px solid ${theme.colors.blue[5]}`,
4215
+ },
4216
+ bottomActions: {
4217
+ position: 'absolute',
4218
+ right: 4,
4219
+ bottom: 0,
4220
+ fontSize: theme.fontSizes.xs,
4221
+ '& a': {
4222
+ marginLeft: 8,
4223
+ },
4224
+ },
4225
+ }));
4052
4226
  function PlanDefinitionBuilder(props) {
4053
4227
  const medplum = useMedplum();
4054
4228
  const defaultValue = useResource(props.value);
@@ -4082,13 +4256,14 @@
4082
4256
  function changeProperty(property, newValue) {
4083
4257
  setValue(Object.assign(Object.assign({}, valueRef.current), { [property]: newValue }));
4084
4258
  }
4085
- return (React__default["default"].createElement("div", { className: "medplum-questionnaire-builder" },
4086
- React__default["default"].createElement(Form, { testid: "questionnaire-form", onSubmit: () => props.onSubmit(value) },
4087
- React__default["default"].createElement(core$1.TextInput, { label: "Plan Title", defaultValue: value.title, onChange: (e) => changeProperty('title', e.currentTarget.value) }),
4088
- React__default["default"].createElement(ActionArrayBuilder, { actions: value.action || [], selectedKey: selectedKey, setSelectedKey: setSelectedKey, hoverKey: hoverKey, setHoverKey: setHoverKey, onChange: (x) => changeProperty('action', x) }),
4089
- React__default["default"].createElement(core$1.Button, { type: "submit" }, "Save"))));
4259
+ return (React.createElement("div", null,
4260
+ React.createElement(Form, { testid: "questionnaire-form", onSubmit: () => props.onSubmit(value) },
4261
+ React.createElement(core$1.TextInput, { label: "Plan Title", defaultValue: value.title, onChange: (e) => changeProperty('title', e.currentTarget.value) }),
4262
+ React.createElement(ActionArrayBuilder, { actions: value.action || [], selectedKey: selectedKey, setSelectedKey: setSelectedKey, hoverKey: hoverKey, setHoverKey: setHoverKey, onChange: (x) => changeProperty('action', x) }),
4263
+ React.createElement(core$1.Button, { type: "submit" }, "Save"))));
4090
4264
  }
4091
4265
  function ActionArrayBuilder(props) {
4266
+ const { classes } = useStyles$5();
4092
4267
  const actionsRef = React.useRef();
4093
4268
  actionsRef.current = props.actions;
4094
4269
  function changeAction(changedAction) {
@@ -4101,16 +4276,17 @@
4101
4276
  function removeAction(removedAction) {
4102
4277
  props.onChange(actionsRef.current.filter((i) => i !== removedAction));
4103
4278
  }
4104
- return (React__default["default"].createElement("div", { className: "section" },
4105
- props.actions.map((action) => (React__default["default"].createElement("div", { key: action.id },
4106
- React__default["default"].createElement(ActionBuilder, { action: action, selectedKey: props.selectedKey, setSelectedKey: props.setSelectedKey, hoverKey: props.hoverKey, setHoverKey: props.setHoverKey, onChange: changeAction, onRemove: () => removeAction(action) })))),
4107
- React__default["default"].createElement("div", { className: "bottom-actions" },
4108
- React__default["default"].createElement("a", { href: "#", onClick: (e) => {
4279
+ return (React.createElement("div", { className: classes.section },
4280
+ props.actions.map((action) => (React.createElement("div", { key: action.id },
4281
+ React.createElement(ActionBuilder, { action: action, selectedKey: props.selectedKey, setSelectedKey: props.setSelectedKey, hoverKey: props.hoverKey, setHoverKey: props.setHoverKey, onChange: changeAction, onRemove: () => removeAction(action) })))),
4282
+ React.createElement("div", { className: classes.bottomActions },
4283
+ React.createElement("a", { href: "#", onClick: (e) => {
4109
4284
  killEvent(e);
4110
4285
  addAction({ id: generateId$1() });
4111
4286
  } }, "Add action"))));
4112
4287
  }
4113
4288
  function ActionBuilder(props) {
4289
+ const { classes, cx } = useStyles$5();
4114
4290
  const { action } = props;
4115
4291
  const actionType = getInitialActionType(action);
4116
4292
  const editing = props.selectedKey === props.action.id;
@@ -4123,11 +4299,14 @@
4123
4299
  killEvent(e);
4124
4300
  props.setHoverKey(props.action.id);
4125
4301
  }
4126
- const className = editing ? 'section editing' : hovering ? 'section hovering' : 'section';
4127
- return (React__default["default"].createElement("div", { "data-testid": action.id, className: className, onClick: onClick, onMouseOver: onHover },
4128
- editing ? (React__default["default"].createElement(ActionEditor, { action: action, actionType: actionType, onChange: props.onChange, selectedKey: props.selectedKey, setSelectedKey: props.setSelectedKey, hoverKey: props.hoverKey, setHoverKey: props.setHoverKey, onRemove: props.onRemove })) : (React__default["default"].createElement(ActionDisplay, { action: action, actionType: actionType })),
4129
- React__default["default"].createElement("div", { className: "bottom-actions" },
4130
- React__default["default"].createElement("a", { href: "#", onClick: (e) => {
4302
+ const className = cx(classes.section, {
4303
+ [classes.editing]: editing,
4304
+ [classes.hovering]: hovering && !editing,
4305
+ });
4306
+ return (React.createElement("div", { "data-testid": action.id, className: className, onClick: onClick, onMouseOver: onHover },
4307
+ editing ? (React.createElement(ActionEditor, { action: action, actionType: actionType, onChange: props.onChange, selectedKey: props.selectedKey, setSelectedKey: props.setSelectedKey, hoverKey: props.hoverKey, setHoverKey: props.setHoverKey, onRemove: props.onRemove })) : (React.createElement(ActionDisplay, { action: action, actionType: actionType })),
4308
+ React.createElement("div", { className: classes.bottomActions },
4309
+ React.createElement("a", { href: "#", onClick: (e) => {
4131
4310
  e.preventDefault();
4132
4311
  props.onRemove();
4133
4312
  } }, "Remove"))));
@@ -4141,15 +4320,15 @@
4141
4320
  function ActionDisplay(props) {
4142
4321
  const { action, actionType } = props;
4143
4322
  const [propertyValue, propertyType] = getActionTiming(action);
4144
- return (React__default["default"].createElement("div", null,
4145
- React__default["default"].createElement("div", null,
4323
+ return (React.createElement("div", null,
4324
+ React.createElement("div", null,
4146
4325
  action.title || 'Untitled',
4147
4326
  " ",
4148
4327
  actionType && `(${actionType})`),
4149
- action.definitionCanonical && (React__default["default"].createElement("div", null,
4150
- React__default["default"].createElement(ReferenceDisplay, { value: { reference: action.definitionCanonical } }))),
4151
- propertyValue && (React__default["default"].createElement("div", null,
4152
- React__default["default"].createElement(ResourcePropertyDisplay, { property: timingProperty, propertyType: propertyType, value: propertyValue })))));
4328
+ action.definitionCanonical && (React.createElement("div", null,
4329
+ React.createElement(ReferenceDisplay, { value: { reference: action.definitionCanonical } }))),
4330
+ propertyValue && (React.createElement("div", null,
4331
+ React.createElement(ResourcePropertyDisplay, { property: timingProperty, propertyType: propertyType, value: propertyValue })))));
4153
4332
  }
4154
4333
  function ActionEditor(props) {
4155
4334
  const { action } = props;
@@ -4157,35 +4336,34 @@
4157
4336
  function changeProperty(property, value) {
4158
4337
  props.onChange(Object.assign(Object.assign({}, action), { [property]: value }));
4159
4338
  }
4160
- return (React__default["default"].createElement(React__default["default"].Fragment, null,
4161
- React__default["default"].createElement(core$1.TextInput, { name: `actionTitle-${action.id}`, label: "Title", defaultValue: action.title, onChange: (e) => changeProperty('title', e.currentTarget.value) }),
4162
- React__default["default"].createElement(core$1.TextInput, { name: `actionDescription-${action.id}`, label: "Description", defaultValue: action.description, onChange: (e) => changeProperty('description', e.currentTarget.value) }),
4163
- React__default["default"].createElement(core$1.NativeSelect, { label: "Type of Action", description: "The type of the action to be performed.", name: `actionType-${action.id}`, defaultValue: actionType, onChange: (e) => setActionType(e.currentTarget.value), data: ['', 'appointment', 'lab', 'questionnaire', 'task'] }),
4164
- action.action && action.action.length > 0 && (React__default["default"].createElement(ActionArrayBuilder, { actions: action.action, selectedKey: props.selectedKey, setSelectedKey: props.setSelectedKey, hoverKey: props.hoverKey, setHoverKey: props.setHoverKey, onChange: (x) => changeProperty('action', x) })),
4339
+ return (React.createElement(core$1.Stack, { spacing: "xl" },
4340
+ React.createElement(core$1.TextInput, { name: `actionTitle-${action.id}`, label: "Title", defaultValue: action.title, onChange: (e) => changeProperty('title', e.currentTarget.value) }),
4341
+ React.createElement(core$1.TextInput, { name: `actionDescription-${action.id}`, label: "Description", defaultValue: action.description, onChange: (e) => changeProperty('description', e.currentTarget.value) }),
4342
+ React.createElement(core$1.NativeSelect, { label: "Type of Action", description: "The type of the action to be performed.", name: `actionType-${action.id}`, defaultValue: actionType, onChange: (e) => setActionType(e.currentTarget.value), data: ['', 'appointment', 'lab', 'questionnaire', 'task'] }),
4343
+ action.action && action.action.length > 0 && (React.createElement(ActionArrayBuilder, { actions: action.action, selectedKey: props.selectedKey, setSelectedKey: props.setSelectedKey, hoverKey: props.hoverKey, setHoverKey: props.setHoverKey, onChange: (x) => changeProperty('action', x) })),
4165
4344
  (() => {
4166
4345
  switch (actionType) {
4167
4346
  case 'appointment':
4168
- return (React__default["default"].createElement(ActionResourceTypeBuilder, { title: "Appointment", description: "The subject must schedule an appointment from the schedule.", resourceType: "Schedule", action: action, onChange: props.onChange }));
4347
+ return (React.createElement(ActionResourceTypeBuilder, { title: "Appointment", description: "The subject must schedule an appointment from the schedule.", resourceType: "Schedule", action: action, onChange: props.onChange }));
4169
4348
  case 'lab':
4170
- return (React__default["default"].createElement(ActionResourceTypeBuilder, { title: "Lab", description: "The subject must complete the following lab panel.", resourceType: "ActivityDefinition", action: action, onChange: props.onChange }));
4349
+ return (React.createElement(ActionResourceTypeBuilder, { title: "Lab", description: "The subject must complete the following lab panel.", resourceType: "ActivityDefinition", action: action, onChange: props.onChange }));
4171
4350
  case 'questionnaire':
4172
- return (React__default["default"].createElement(ActionResourceTypeBuilder, { title: "Questionnaire", description: "The subject must complete the selected questionnaire.", resourceType: "Questionnaire", action: action, onChange: props.onChange }));
4351
+ return (React.createElement(ActionResourceTypeBuilder, { title: "Questionnaire", description: "The subject must complete the selected questionnaire.", resourceType: "Questionnaire", action: action, onChange: props.onChange }));
4173
4352
  case 'task':
4174
- return (React__default["default"].createElement(ActionResourceTypeBuilder, { title: "Task", description: "The subject must complete the following task.", resourceType: "ActivityDefinition", action: action, onChange: props.onChange }));
4353
+ return (React.createElement(ActionResourceTypeBuilder, { title: "Task", description: "The subject must complete the following task.", resourceType: "ActivityDefinition", action: action, onChange: props.onChange }));
4175
4354
  default:
4176
4355
  return null;
4177
4356
  }
4178
4357
  })(),
4179
- React__default["default"].createElement("p", null, "Timing"),
4180
- React__default["default"].createElement("p", null, "When the action should take place."),
4181
- React__default["default"].createElement(ActionTimingInput, { name: 'timing-' + action.id, action: action, onChange: props.onChange })));
4358
+ React.createElement(FormSection, { title: "Timing", description: "When the action should take place." },
4359
+ React.createElement(ActionTimingInput, { name: 'timing-' + action.id, action: action, onChange: props.onChange }))));
4182
4360
  }
4183
4361
  function ActionResourceTypeBuilder(props) {
4184
4362
  const { id, definitionCanonical } = props.action;
4185
4363
  const reference = (definitionCanonical === null || definitionCanonical === void 0 ? void 0 : definitionCanonical.startsWith(props.resourceType + '/'))
4186
4364
  ? { reference: definitionCanonical }
4187
4365
  : undefined;
4188
- return (React__default["default"].createElement(ResourceInput, { name: id, resourceType: props.resourceType, defaultValue: reference, loadOnFocus: true, onChange: (newValue) => {
4366
+ return (React.createElement(ResourceInput, { name: id, resourceType: props.resourceType, defaultValue: reference, loadOnFocus: true, onChange: (newValue) => {
4189
4367
  if (newValue) {
4190
4368
  props.onChange(Object.assign(Object.assign({}, props.action), { definitionCanonical: core.getReferenceString(newValue) }));
4191
4369
  }
@@ -4198,7 +4376,7 @@
4198
4376
  const value = props.action;
4199
4377
  const key = 'timing';
4200
4378
  const [propertyValue, propertyType] = getActionTiming(value);
4201
- return (React__default["default"].createElement(ResourcePropertyInput, { property: timingProperty, name: "timing[x]", defaultValue: propertyValue, defaultPropertyType: propertyType, onChange: (newValue, propName) => {
4379
+ return (React.createElement(ResourcePropertyInput, { property: timingProperty, name: "timing[x]", defaultValue: propertyValue, defaultPropertyType: propertyType, onChange: (newValue, propName) => {
4202
4380
  props.onChange(setPropertyValue(value, key, propName !== null && propName !== void 0 ? propName : key, timingProperty, newValue));
4203
4381
  } }));
4204
4382
  }
@@ -4300,14 +4478,15 @@
4300
4478
  if (!schema || !questionnaire) {
4301
4479
  return null;
4302
4480
  }
4303
- return (React__default["default"].createElement(Form, { testid: "questionnaire-form", onSubmit: () => {
4481
+ return (React.createElement(Form, { testid: "questionnaire-form", onSubmit: () => {
4304
4482
  if (props.onSubmit && response) {
4305
4483
  props.onSubmit(Object.assign(Object.assign({}, response), { questionnaire: core.getReferenceString(questionnaire), subject: props.subject, source: core.createReference(source), authored: new Date().toISOString() }));
4306
4484
  }
4307
4485
  } },
4308
- questionnaire.title && React__default["default"].createElement("h1", null, questionnaire.title),
4309
- questionnaire.item && (React__default["default"].createElement(QuestionnaireFormItemArray, { items: questionnaire.item, answers: answers, onChange: setItems })),
4310
- React__default["default"].createElement(core$1.Button, { type: "submit" }, props.submitButtonText || 'OK')));
4486
+ questionnaire.title && React.createElement(core$1.Title, null, questionnaire.title),
4487
+ questionnaire.item && (React.createElement(QuestionnaireFormItemArray, { items: questionnaire.item, answers: answers, onChange: setItems })),
4488
+ React.createElement(core$1.Group, { position: "right", mt: "xl" },
4489
+ React.createElement(core$1.Button, { type: "submit" }, props.submitButtonText || 'OK'))));
4311
4490
  }
4312
4491
  function QuestionnaireFormItemArray(props) {
4313
4492
  const [responseItems, setResponseItems] = React.useState(buildInitialResponseItems(props.items));
@@ -4317,27 +4496,27 @@
4317
4496
  setResponseItems(newResponseItems);
4318
4497
  props.onChange(newResponseItems);
4319
4498
  }
4320
- return (React__default["default"].createElement(React__default["default"].Fragment, null, props.items.map((item, index) => {
4499
+ return (React.createElement(core$1.Stack, null, props.items.map((item, index) => {
4321
4500
  if (!isQuestionEnabled(item, props.answers)) {
4322
4501
  return null;
4323
4502
  }
4324
4503
  if (item.type === exports.QuestionnaireItemType.display) {
4325
- return React__default["default"].createElement("p", { key: item.linkId }, item.text);
4504
+ return React.createElement("p", { key: item.linkId }, item.text);
4326
4505
  }
4327
4506
  if (item.type === exports.QuestionnaireItemType.group) {
4328
- return (React__default["default"].createElement(QuestionnaireFormItem, { key: item.linkId, item: item, answers: props.answers, onChange: (newResponseItem) => setResponseItem(index, newResponseItem) }));
4507
+ return (React.createElement(QuestionnaireFormItem, { key: item.linkId, item: item, answers: props.answers, onChange: (newResponseItem) => setResponseItem(index, newResponseItem) }));
4329
4508
  }
4330
4509
  if (item.type === exports.QuestionnaireItemType.boolean) {
4331
4510
  const initial = item.initial && item.initial.length > 0 ? item.initial[0] : undefined;
4332
- return (React__default["default"].createElement(CheckboxFormSection, { key: item.linkId, title: item.text, htmlFor: item.linkId },
4333
- React__default["default"].createElement(core$1.Checkbox, { id: item.linkId, name: item.linkId, defaultChecked: initial === null || initial === void 0 ? void 0 : initial.valueBoolean, onChange: (e) => setResponseItem(index, {
4511
+ return (React.createElement(CheckboxFormSection, { key: item.linkId, title: item.text, htmlFor: item.linkId },
4512
+ React.createElement(core$1.Checkbox, { id: item.linkId, name: item.linkId, defaultChecked: initial === null || initial === void 0 ? void 0 : initial.valueBoolean, onChange: (e) => setResponseItem(index, {
4334
4513
  linkId: item.linkId,
4335
4514
  text: item.text,
4336
4515
  answer: [{ valueBoolean: e.currentTarget.checked }],
4337
4516
  }) })));
4338
4517
  }
4339
- return (React__default["default"].createElement(FormSection, { key: item.linkId, htmlFor: item.linkId, title: item.text || '' },
4340
- React__default["default"].createElement(QuestionnaireFormItem, { item: item, answers: props.answers, onChange: (newResponseItem) => setResponseItem(index, newResponseItem) })));
4518
+ return (React.createElement(FormSection, { key: item.linkId, htmlFor: item.linkId, title: item.text || '' },
4519
+ React.createElement(QuestionnaireFormItem, { item: item, answers: props.answers, onChange: (newResponseItem) => setResponseItem(index, newResponseItem) })));
4341
4520
  })));
4342
4521
  }
4343
4522
  function QuestionnaireFormItem(props) {
@@ -4367,39 +4546,39 @@
4367
4546
  }
4368
4547
  switch (type) {
4369
4548
  case exports.QuestionnaireItemType.group:
4370
- return (React__default["default"].createElement("div", null,
4371
- React__default["default"].createElement("h3", null, item.text),
4372
- item.item && (React__default["default"].createElement(QuestionnaireFormItemArray, { items: item.item, answers: props.answers, onChange: onChangeItem }))));
4549
+ return (React.createElement("div", null,
4550
+ React.createElement("h3", null, item.text),
4551
+ item.item && (React.createElement(QuestionnaireFormItemArray, { items: item.item, answers: props.answers, onChange: onChangeItem }))));
4373
4552
  case exports.QuestionnaireItemType.boolean:
4374
- return (React__default["default"].createElement(core$1.Checkbox, { id: name, name: name, defaultChecked: initial === null || initial === void 0 ? void 0 : initial.valueBoolean, onChange: (e) => onChangeAnswer({ valueBoolean: e.currentTarget.checked }) }));
4553
+ return (React.createElement(core$1.Checkbox, { id: name, name: name, defaultChecked: initial === null || initial === void 0 ? void 0 : initial.valueBoolean, onChange: (e) => onChangeAnswer({ valueBoolean: e.currentTarget.checked }) }));
4375
4554
  case exports.QuestionnaireItemType.decimal:
4376
- return (React__default["default"].createElement(core$1.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 }) }));
4555
+ return (React.createElement(core$1.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 }) }));
4377
4556
  case exports.QuestionnaireItemType.integer:
4378
- return (React__default["default"].createElement(core$1.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 }) }));
4557
+ return (React.createElement(core$1.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 }) }));
4379
4558
  case exports.QuestionnaireItemType.date:
4380
- return (React__default["default"].createElement(core$1.TextInput, { type: "date", id: name, name: name, defaultValue: initial === null || initial === void 0 ? void 0 : initial.valueDate, onChange: (e) => onChangeAnswer({ valueDate: e.currentTarget.value }) }));
4559
+ return (React.createElement(core$1.TextInput, { type: "date", id: name, name: name, defaultValue: initial === null || initial === void 0 ? void 0 : initial.valueDate, onChange: (e) => onChangeAnswer({ valueDate: e.currentTarget.value }) }));
4381
4560
  case exports.QuestionnaireItemType.dateTime:
4382
- return (React__default["default"].createElement(DateTimeInput, { name: name, defaultValue: initial === null || initial === void 0 ? void 0 : initial.valueDateTime, onChange: (newValue) => onChangeAnswer({ valueDateTime: newValue }) }));
4561
+ return (React.createElement(DateTimeInput, { name: name, defaultValue: initial === null || initial === void 0 ? void 0 : initial.valueDateTime, onChange: (newValue) => onChangeAnswer({ valueDateTime: newValue }) }));
4383
4562
  case exports.QuestionnaireItemType.time:
4384
- return (React__default["default"].createElement(core$1.TextInput, { type: "time", id: name, name: name, defaultValue: initial === null || initial === void 0 ? void 0 : initial.valueTime, onChange: (e) => onChangeAnswer({ valueTime: e.currentTarget.value }) }));
4563
+ return (React.createElement(core$1.TextInput, { type: "time", id: name, name: name, defaultValue: initial === null || initial === void 0 ? void 0 : initial.valueTime, onChange: (e) => onChangeAnswer({ valueTime: e.currentTarget.value }) }));
4385
4564
  case exports.QuestionnaireItemType.string:
4386
4565
  case exports.QuestionnaireItemType.url:
4387
- return (React__default["default"].createElement(core$1.TextInput, { id: name, name: name, defaultValue: initial === null || initial === void 0 ? void 0 : initial.valueString, onChange: (e) => onChangeAnswer({ valueString: e.currentTarget.value }) }));
4566
+ return (React.createElement(core$1.TextInput, { id: name, name: name, defaultValue: initial === null || initial === void 0 ? void 0 : initial.valueString, onChange: (e) => onChangeAnswer({ valueString: e.currentTarget.value }) }));
4388
4567
  case exports.QuestionnaireItemType.text:
4389
- return (React__default["default"].createElement(core$1.Textarea, { id: name, name: name, defaultValue: initial === null || initial === void 0 ? void 0 : initial.valueString, onChange: (e) => onChangeAnswer({ valueString: e.currentTarget.value }) }));
4568
+ return (React.createElement(core$1.Textarea, { id: name, name: name, defaultValue: initial === null || initial === void 0 ? void 0 : initial.valueString, onChange: (e) => onChangeAnswer({ valueString: e.currentTarget.value }) }));
4390
4569
  case exports.QuestionnaireItemType.attachment:
4391
- return (React__default["default"].createElement(AttachmentInput, { name: name, defaultValue: initial === null || initial === void 0 ? void 0 : initial.valueAttachment, onChange: (newValue) => onChangeAnswer({ valueAttachment: newValue }) }));
4570
+ return (React.createElement(AttachmentInput, { name: name, defaultValue: initial === null || initial === void 0 ? void 0 : initial.valueAttachment, onChange: (newValue) => onChangeAnswer({ valueAttachment: newValue }) }));
4392
4571
  case exports.QuestionnaireItemType.reference:
4393
- return (React__default["default"].createElement(ReferenceInput, { name: name, defaultValue: initial === null || initial === void 0 ? void 0 : initial.valueReference, onChange: (newValue) => onChangeAnswer({ valueReference: newValue }) }));
4572
+ return (React.createElement(ReferenceInput, { name: name, defaultValue: initial === null || initial === void 0 ? void 0 : initial.valueReference, onChange: (newValue) => onChangeAnswer({ valueReference: newValue }) }));
4394
4573
  case exports.QuestionnaireItemType.quantity:
4395
- return (React__default["default"].createElement(QuantityInput, { name: name, defaultValue: initial === null || initial === void 0 ? void 0 : initial.valueQuantity, onChange: (newValue) => onChangeAnswer({ valueQuantity: newValue }) }));
4574
+ return (React.createElement(QuantityInput, { name: name, defaultValue: initial === null || initial === void 0 ? void 0 : initial.valueQuantity, onChange: (newValue) => onChangeAnswer({ valueQuantity: newValue }) }));
4396
4575
  case exports.QuestionnaireItemType.choice:
4397
4576
  case exports.QuestionnaireItemType.openChoice:
4398
4577
  if (isDropDownChoice(item)) {
4399
- return (React__default["default"].createElement(QuestionnaireChoiceDropDownInput, { name: name, item: item, initial: initial, onChangeAnswer: onChangeAnswer }));
4578
+ return (React.createElement(QuestionnaireChoiceDropDownInput, { name: name, item: item, initial: initial, onChangeAnswer: onChangeAnswer }));
4400
4579
  }
4401
4580
  else {
4402
- return (React__default["default"].createElement(QuestionnaireChoiceRadioInput, { name: name, item: item, initial: initial, onChangeAnswer: onChangeAnswer }));
4581
+ return (React.createElement(QuestionnaireChoiceRadioInput, { name: name, item: item, initial: initial, onChangeAnswer: onChangeAnswer }));
4403
4582
  }
4404
4583
  }
4405
4584
  return null;
@@ -4414,7 +4593,7 @@
4414
4593
  data.push(typedValueToString(optionValue));
4415
4594
  }
4416
4595
  }
4417
- return (React__default["default"].createElement(core$1.NativeSelect, { id: name, name: name, className: "medplum-select", onChange: (e) => {
4596
+ return (React.createElement(core$1.NativeSelect, { id: name, name: name, onChange: (e) => {
4418
4597
  const index = e.currentTarget.selectedIndex;
4419
4598
  if (index === 0) {
4420
4599
  props.onChangeAnswer({});
@@ -4442,18 +4621,27 @@
4442
4621
  const { name, item, initial, onChangeAnswer } = props;
4443
4622
  const valueElementDefinition = core.globalSchema.types['QuestionnaireItemAnswerOption'].properties['value[x]'];
4444
4623
  const initialValue = core.getTypedPropertyValue({ type: 'QuestionnaireItemInitial', value: initial }, 'value');
4445
- return (React__default["default"].createElement(React__default["default"].Fragment, null, item.answerOption &&
4446
- item.answerOption.map((option, index) => {
4624
+ const options = [];
4625
+ let defaultValue = undefined;
4626
+ if (item.answerOption) {
4627
+ for (let i = 0; i < item.answerOption.length; i++) {
4628
+ const option = item.answerOption[i];
4629
+ const optionName = `${name}-option-${i}`;
4447
4630
  const optionValue = core.getTypedPropertyValue({ type: 'QuestionnaireItemAnswerOption', value: option }, 'value');
4448
- const propertyName = 'value' + core.capitalize(optionValue.type);
4449
- const optionName = `${name}-option-${index}`;
4450
- return (React__default["default"].createElement("div", { key: optionName, className: "medplum-questionnaire-option-row" },
4451
- React__default["default"].createElement("div", { className: "medplum-questionnaire-option-checkbox" },
4452
- React__default["default"].createElement("input", { type: "radio", id: optionName, name: name, value: optionValue.value, defaultChecked: initialValue && core.stringify(optionValue) === core.stringify(initialValue), onChange: () => onChangeAnswer({ [propertyName]: optionValue.value }) })),
4453
- React__default["default"].createElement("div", null,
4454
- React__default["default"].createElement("label", { htmlFor: optionName },
4455
- React__default["default"].createElement(ResourcePropertyDisplay, { property: valueElementDefinition, propertyType: optionValue.type, value: optionValue.value })))));
4456
- })));
4631
+ if (initialValue && core.stringify(optionValue) === core.stringify(initialValue)) {
4632
+ defaultValue = optionName;
4633
+ }
4634
+ options.push([optionName, optionValue]);
4635
+ }
4636
+ }
4637
+ return (React.createElement(core$1.Radio.Group, { name: name, orientation: "vertical", defaultValue: defaultValue, onChange: (newValue) => {
4638
+ const option = options.find((option) => option[0] === newValue);
4639
+ if (option) {
4640
+ const optionValue = option[1];
4641
+ const propertyName = 'value' + core.capitalize(optionValue.type);
4642
+ onChangeAnswer({ [propertyName]: optionValue.value });
4643
+ }
4644
+ } }, options.map(([optionName, optionValue]) => (React.createElement(core$1.Radio, { key: optionName, id: optionName, value: optionName, label: React.createElement(ResourcePropertyDisplay, { property: valueElementDefinition, propertyType: optionValue.type, value: optionValue.value }) })))));
4457
4645
  }
4458
4646
  function buildInitialResponse(questionnaire) {
4459
4647
  const response = {
@@ -4519,6 +4707,50 @@
4519
4707
  }
4520
4708
  }
4521
4709
 
4710
+ const useStyles$4 = core$1.createStyles((theme) => ({
4711
+ section: {
4712
+ position: 'relative',
4713
+ margin: '4px 4px 8px 0',
4714
+ padding: '6px 12px 16px 6px',
4715
+ border: `1.5px solid ${theme.colors.gray[1]}`,
4716
+ borderRadius: theme.radius.sm,
4717
+ transition: 'all 0.1s',
4718
+ },
4719
+ hovering: {
4720
+ border: `1.5px solid ${theme.colors.blue[5]}`,
4721
+ },
4722
+ editing: {
4723
+ border: `1.5px solid ${theme.colors.gray[1]}`,
4724
+ borderLeft: `4px solid ${theme.colors.blue[5]}`,
4725
+ },
4726
+ questionBody: {
4727
+ maxWidth: 600,
4728
+ },
4729
+ topActions: {
4730
+ position: 'absolute',
4731
+ right: 4,
4732
+ top: 1,
4733
+ padding: 4,
4734
+ color: theme.colors.gray[5],
4735
+ fontSize: theme.fontSizes.xs,
4736
+ },
4737
+ bottomActions: {
4738
+ position: 'absolute',
4739
+ right: 4,
4740
+ bottom: 0,
4741
+ fontSize: theme.fontSizes.xs,
4742
+ '& a': {
4743
+ marginLeft: 8,
4744
+ },
4745
+ },
4746
+ linkIdInput: {
4747
+ width: 100,
4748
+ marginBottom: 4,
4749
+ },
4750
+ typeSelect: {
4751
+ width: 100,
4752
+ },
4753
+ }));
4522
4754
  function QuestionnaireBuilder(props) {
4523
4755
  const medplum = useMedplum();
4524
4756
  const defaultValue = useResource(props.questionnaire);
@@ -4547,13 +4779,14 @@
4547
4779
  if (!schema || !value) {
4548
4780
  return null;
4549
4781
  }
4550
- return (React__default["default"].createElement("div", { className: "medplum-questionnaire-builder" },
4551
- React__default["default"].createElement(Form, { testid: "questionnaire-form", onSubmit: () => props.onSubmit(value) },
4552
- React__default["default"].createElement(ItemBuilder, { item: value, selectedKey: selectedKey, setSelectedKey: setSelectedKey, hoverKey: hoverKey, setHoverKey: setHoverKey, onChange: setValue }),
4553
- React__default["default"].createElement(core$1.Button, { type: "submit" }, "Save"))));
4782
+ return (React.createElement("div", null,
4783
+ React.createElement(Form, { testid: "questionnaire-form", onSubmit: () => props.onSubmit(value) },
4784
+ React.createElement(ItemBuilder, { item: value, selectedKey: selectedKey, setSelectedKey: setSelectedKey, hoverKey: hoverKey, setHoverKey: setHoverKey, onChange: setValue }),
4785
+ React.createElement(core$1.Button, { type: "submit" }, "Save"))));
4554
4786
  }
4555
4787
  function ItemBuilder(props) {
4556
4788
  var _a;
4789
+ const { classes, cx } = useStyles$4();
4557
4790
  const resource = props.item;
4558
4791
  const item = props.item;
4559
4792
  const isResource = 'resourceType' in props.item;
@@ -4587,41 +4820,43 @@
4587
4820
  function changeProperty(property, value) {
4588
4821
  props.onChange(Object.assign(Object.assign({}, itemRef.current), { [property]: value }));
4589
4822
  }
4590
- const className = editing ? 'section editing' : hovering ? 'section hovering' : 'section';
4591
- return (React__default["default"].createElement("div", { "data-testid": item.linkId, className: className, onClick: onClick, onMouseOver: onHover },
4592
- editing ? (React__default["default"].createElement(React__default["default"].Fragment, null,
4593
- isResource && (React__default["default"].createElement("div", null,
4594
- React__default["default"].createElement(core$1.TextInput, { defaultValue: resource.title, onChange: (e) => changeProperty('title', e.currentTarget.value) }))),
4595
- !isContainer && (React__default["default"].createElement("div", null,
4596
- React__default["default"].createElement(core$1.NativeSelect, { defaultValue: item.type, onChange: (e) => changeProperty('type', e.currentTarget.value), data: [
4597
- { value: 'display', label: 'Display' },
4598
- { value: 'boolean', label: 'Boolean' },
4599
- { value: 'decimal', label: 'Decimal' },
4600
- { value: 'integer', label: 'Integer' },
4601
- { value: 'date', label: 'Date' },
4602
- { value: 'dateTime', label: 'Date/Time' },
4603
- { value: 'time', label: 'Time' },
4604
- { value: 'string', label: 'String' },
4605
- { value: 'text', label: 'Text' },
4606
- { value: 'url', label: 'URL' },
4607
- { value: 'choice', label: 'Choice' },
4608
- { value: 'open-choice', label: 'Open Choice' },
4609
- { value: 'attachment', label: 'Attachment' },
4610
- { value: 'reference', label: 'Reference' },
4611
- { value: 'quantity', label: 'Quantity' },
4612
- ] }))),
4613
- !isResource && (React__default["default"].createElement(core$1.Textarea, { style: { width: '95%', height: '100px', minHeight: '100px', margin: '8px 4px 4px 4px' }, defaultValue: item.text, onChange: (e) => changeProperty('text', e.currentTarget.value) })),
4614
- isChoiceQuestion(item) && (React__default["default"].createElement(AnswerBuilder, { options: item.answerOption, onChange: (newOptions) => changeProperty('answerOption', newOptions) })))) : (React__default["default"].createElement(React__default["default"].Fragment, null,
4615
- resource.title && React__default["default"].createElement("h1", null, resource.title),
4616
- item.text && React__default["default"].createElement("p", null, item.text),
4617
- !isContainer && React__default["default"].createElement(QuestionnaireFormItem, { item: item, answers: {}, onChange: () => undefined }))),
4823
+ const className = cx(classes.section, {
4824
+ [classes.editing]: editing,
4825
+ [classes.hovering]: hovering && !editing,
4826
+ });
4827
+ return (React.createElement("div", { "data-testid": item.linkId, className: className, onClick: onClick, onMouseOver: onHover },
4828
+ React.createElement("div", { className: classes.questionBody }, editing ? (React.createElement(React.Fragment, null,
4829
+ isResource && (React.createElement(core$1.TextInput, { size: "xl", defaultValue: resource.title, onChange: (e) => changeProperty('title', e.currentTarget.value) })),
4830
+ !isResource && (React.createElement(core$1.Textarea, { autosize: true, minRows: 2, defaultValue: item.text, onChange: (e) => changeProperty('text', e.currentTarget.value) })),
4831
+ isChoiceQuestion(item) && (React.createElement(AnswerBuilder, { options: item.answerOption, onChange: (newOptions) => changeProperty('answerOption', newOptions) })))) : (React.createElement(React.Fragment, null,
4832
+ resource.title && React.createElement(core$1.Title, null, resource.title),
4833
+ item.text && React.createElement("div", null, item.text),
4834
+ !isContainer && React.createElement(QuestionnaireFormItem, { item: item, answers: {}, onChange: () => undefined })))),
4618
4835
  item.item &&
4619
- item.item.map((i) => (React__default["default"].createElement("div", { key: i.id },
4620
- React__default["default"].createElement(ItemBuilder, { item: i, selectedKey: props.selectedKey, setSelectedKey: props.setSelectedKey, hoverKey: props.hoverKey, setHoverKey: props.setHoverKey, onChange: changeItem, onRemove: () => removeItem(i) })))),
4621
- !isContainer && (React__default["default"].createElement("div", { className: "top-actions" }, editing ? (React__default["default"].createElement(core$1.TextInput, { defaultValue: item.linkId, onChange: (e) => changeProperty('linkId', e.currentTarget.value) })) : (React__default["default"].createElement("div", null, linkId)))),
4622
- React__default["default"].createElement("div", { className: "bottom-actions" },
4623
- isContainer && (React__default["default"].createElement(React__default["default"].Fragment, null,
4624
- React__default["default"].createElement("a", { href: "#", onClick: (e) => {
4836
+ item.item.map((i) => (React.createElement("div", { key: i.id },
4837
+ React.createElement(ItemBuilder, { item: i, selectedKey: props.selectedKey, setSelectedKey: props.setSelectedKey, hoverKey: props.hoverKey, setHoverKey: props.setHoverKey, onChange: changeItem, onRemove: () => removeItem(i) })))),
4838
+ !isContainer && (React.createElement("div", { className: classes.topActions }, editing ? (React.createElement(React.Fragment, null,
4839
+ React.createElement(core$1.TextInput, { size: "xs", className: classes.linkIdInput, defaultValue: item.linkId, onChange: (e) => changeProperty('linkId', e.currentTarget.value) }),
4840
+ !isContainer && (React.createElement(core$1.NativeSelect, { size: "xs", className: classes.typeSelect, defaultValue: item.type, onChange: (e) => changeProperty('type', e.currentTarget.value), data: [
4841
+ { value: 'display', label: 'Display' },
4842
+ { value: 'boolean', label: 'Boolean' },
4843
+ { value: 'decimal', label: 'Decimal' },
4844
+ { value: 'integer', label: 'Integer' },
4845
+ { value: 'date', label: 'Date' },
4846
+ { value: 'dateTime', label: 'Date/Time' },
4847
+ { value: 'time', label: 'Time' },
4848
+ { value: 'string', label: 'String' },
4849
+ { value: 'text', label: 'Text' },
4850
+ { value: 'url', label: 'URL' },
4851
+ { value: 'choice', label: 'Choice' },
4852
+ { value: 'open-choice', label: 'Open Choice' },
4853
+ { value: 'attachment', label: 'Attachment' },
4854
+ { value: 'reference', label: 'Reference' },
4855
+ { value: 'quantity', label: 'Quantity' },
4856
+ ] })))) : (React.createElement("div", null, linkId)))),
4857
+ React.createElement("div", { className: classes.bottomActions },
4858
+ isContainer && (React.createElement(React.Fragment, null,
4859
+ React.createElement("a", { href: "#", onClick: (e) => {
4625
4860
  e.preventDefault();
4626
4861
  addItem({
4627
4862
  id: generateId(),
@@ -4630,7 +4865,7 @@
4630
4865
  text: 'Question',
4631
4866
  });
4632
4867
  } }, "Add item"),
4633
- React__default["default"].createElement("a", { href: "#", onClick: (e) => {
4868
+ React.createElement("a", { href: "#", onClick: (e) => {
4634
4869
  e.preventDefault();
4635
4870
  addItem({
4636
4871
  id: generateId(),
@@ -4639,7 +4874,7 @@
4639
4874
  text: 'Group',
4640
4875
  });
4641
4876
  } }, "Add group"))),
4642
- !isResource && (React__default["default"].createElement("a", { href: "#", onClick: (e) => {
4877
+ editing && !isResource && (React.createElement("a", { href: "#", onClick: (e) => {
4643
4878
  e.preventDefault();
4644
4879
  if (props.onRemove) {
4645
4880
  props.onRemove();
@@ -4650,30 +4885,30 @@
4650
4885
  var _a;
4651
4886
  const property = core.globalSchema.types['QuestionnaireItemAnswerOption'].properties['value[x]'];
4652
4887
  const options = (_a = props.options) !== null && _a !== void 0 ? _a : [];
4653
- return (React__default["default"].createElement("div", null,
4888
+ return (React.createElement("div", null,
4654
4889
  options.map((option) => {
4655
4890
  const [propertyValue, propertyType] = getValueAndType({ type: 'QuestionnaireItemAnswerOption', value: option }, 'value');
4656
- return (React__default["default"].createElement("div", { key: option.id, style: {
4891
+ return (React.createElement("div", { key: option.id, style: {
4657
4892
  display: 'flex',
4658
4893
  flexDirection: 'row',
4659
4894
  justifyContent: 'space-between',
4660
4895
  alignItems: 'center',
4661
4896
  width: '80%',
4662
4897
  } },
4663
- React__default["default"].createElement("div", null,
4664
- React__default["default"].createElement(ResourcePropertyInput, { key: option.id, name: "value[x]", property: property, defaultPropertyType: propertyType, defaultValue: propertyValue, onChange: (newValue, propName) => {
4898
+ React.createElement("div", null,
4899
+ React.createElement(ResourcePropertyInput, { key: option.id, name: "value[x]", property: property, defaultPropertyType: propertyType, defaultValue: propertyValue, onChange: (newValue, propName) => {
4665
4900
  const newOptions = [...options];
4666
4901
  const index = newOptions.findIndex((o) => o.id === option.id);
4667
4902
  newOptions[index] = { id: option.id, [propName]: newValue };
4668
4903
  props.onChange(newOptions);
4669
4904
  } })),
4670
- React__default["default"].createElement("div", null,
4671
- React__default["default"].createElement("a", { href: "#", onClick: (e) => {
4905
+ React.createElement("div", null,
4906
+ React.createElement("a", { href: "#", onClick: (e) => {
4672
4907
  killEvent(e);
4673
4908
  props.onChange(options.filter((o) => o.id !== option.id));
4674
4909
  } }, "Remove"))));
4675
4910
  }),
4676
- React__default["default"].createElement("a", { href: "#", onClick: (e) => {
4911
+ React.createElement("a", { href: "#", onClick: (e) => {
4677
4912
  killEvent(e);
4678
4913
  props.onChange([
4679
4914
  ...options,
@@ -4782,7 +5017,7 @@
4782
5017
  stat: 'red',
4783
5018
  };
4784
5019
  function StatusBadge(props) {
4785
- return React__default["default"].createElement(core$1.Badge, { color: statusToColor[props.status] }, props.status);
5020
+ return React.createElement(core$1.Badge, { color: statusToColor[props.status] }, props.status);
4786
5021
  }
4787
5022
 
4788
5023
  function RequestGroupDisplay(props) {
@@ -4800,27 +5035,27 @@
4800
5035
  if (!requestGroup || !responseBundle) {
4801
5036
  return null;
4802
5037
  }
4803
- return (React__default["default"].createElement("div", { className: "medplum-request-group" }, (_a = requestGroup.action) === null || _a === void 0 ? void 0 : _a.map((action, index) => {
5038
+ return (React.createElement(core$1.Grid, null, (_a = requestGroup.action) === null || _a === void 0 ? void 0 : _a.map((action, index) => {
4804
5039
  var _a, _b, _c, _d, _e, _f;
4805
5040
  const task = action.resource && findBundleEntry(action.resource);
4806
5041
  const taskInput = (_b = (_a = task === null || task === void 0 ? void 0 : task.input) === null || _a === void 0 ? void 0 : _a[0]) === null || _b === void 0 ? void 0 : _b.valueReference;
4807
5042
  const taskOutput = (_d = (_c = task === null || task === void 0 ? void 0 : task.output) === null || _c === void 0 ? void 0 : _c[0]) === null || _d === void 0 ? void 0 : _d.valueReference;
4808
- return (React__default["default"].createElement("div", { className: "medplum-request-group-task", key: `action-${index}` },
4809
- React__default["default"].createElement("div", { className: "medplum-request-group-task-checkmark" }, (task === null || task === void 0 ? void 0 : task.status) === 'completed' ? '🗹' : '☐'),
4810
- React__default["default"].createElement("div", { className: "medplum-request-group-task-details" },
4811
- React__default["default"].createElement("div", { className: "medplum-request-group-task-title" }, action.title),
4812
- action.description && React__default["default"].createElement("div", null, action.description),
4813
- React__default["default"].createElement("div", null,
5043
+ return (React.createElement(React.Fragment, { key: `action-${index}` },
5044
+ React.createElement(core$1.Grid.Col, { span: 1, p: "md" }, (task === null || task === void 0 ? void 0 : task.status) === 'completed' ? React.createElement(icons.IconCheckbox, null) : React.createElement(icons.IconSquare, { color: "gray" })),
5045
+ React.createElement(core$1.Grid.Col, { span: 9, p: "xs" },
5046
+ React.createElement(core$1.Text, { weight: 500 }, action.title),
5047
+ action.description && React.createElement("div", null, action.description),
5048
+ React.createElement("div", null,
4814
5049
  "Last edited by\u00A0",
4815
- React__default["default"].createElement(ResourceName, { value: (_e = task === null || task === void 0 ? void 0 : task.meta) === null || _e === void 0 ? void 0 : _e.author }),
5050
+ React.createElement(ResourceName, { value: (_e = task === null || task === void 0 ? void 0 : task.meta) === null || _e === void 0 ? void 0 : _e.author }),
4816
5051
  "\u00A0on\u00A0",
4817
5052
  core.formatDateTime((_f = task === null || task === void 0 ? void 0 : task.meta) === null || _f === void 0 ? void 0 : _f.lastUpdated)),
4818
- React__default["default"].createElement("div", null,
5053
+ React.createElement("div", null,
4819
5054
  "Status: ",
4820
- React__default["default"].createElement(StatusBadge, { status: (task === null || task === void 0 ? void 0 : task.status) || 'unknown' }))),
4821
- React__default["default"].createElement("div", { className: "medplum-request-group-task-actions" },
4822
- taskInput && !taskOutput && React__default["default"].createElement(core$1.Button, { onClick: () => props.onStart(task, taskInput) }, "Start"),
4823
- taskInput && taskOutput && (React__default["default"].createElement(core$1.Button, { onClick: () => props.onEdit(task, taskInput, taskOutput) }, "Edit")))));
5055
+ React.createElement(StatusBadge, { status: (task === null || task === void 0 ? void 0 : task.status) || 'unknown' }))),
5056
+ React.createElement(core$1.Grid.Col, { span: 2, p: "md" },
5057
+ taskInput && !taskOutput && React.createElement(core$1.Button, { onClick: () => props.onStart(task, taskInput) }, "Start"),
5058
+ taskInput && taskOutput && (React.createElement(core$1.Button, { onClick: () => props.onEdit(task, taskInput, taskOutput) }, "Edit")))));
4824
5059
  })));
4825
5060
  function buildBatchRequest(request) {
4826
5061
  var _a;
@@ -5034,8 +5269,56 @@
5034
5269
  }
5035
5270
  }
5036
5271
 
5272
+ const useStyles$3 = core$1.createStyles((theme) => ({
5273
+ container: {
5274
+ overflowX: 'auto',
5275
+ },
5276
+ root: {
5277
+ border: `0.1px solid ${theme.colors.gray[3]}`,
5278
+ borderCollapse: 'collapse',
5279
+ borderRadius: theme.radius.sm,
5280
+ borderSpacing: 0,
5281
+ fontSize: theme.fontSizes.xs,
5282
+ width: '100%',
5283
+ '& td': {
5284
+ padding: '2px 4px 0 4px',
5285
+ verticalAlign: 'top',
5286
+ whiteSpace: 'nowrap',
5287
+ },
5288
+ },
5289
+ startRow: {
5290
+ borderTop: `0.1px solid ${theme.colors.gray[3]}`,
5291
+ },
5292
+ normalRow: {
5293
+ borderTop: 0,
5294
+ },
5295
+ author: {
5296
+ lineHeight: '10px',
5297
+ },
5298
+ dateTime: {
5299
+ borderRight: `0.1px solid ${theme.colors.gray[3]}`,
5300
+ lineHeight: '20px',
5301
+ },
5302
+ lineNumber: {
5303
+ backgroundColor: theme.colors.gray[1],
5304
+ border: 0,
5305
+ color: theme.colors.gray[5],
5306
+ fontFamily: theme.fontFamilyMonospace,
5307
+ padding: `${theme.spacing.xs}px ${theme.spacing.sm}px`,
5308
+ textAlign: 'right',
5309
+ },
5310
+ line: {
5311
+ fontFamily: theme.fontFamilyMonospace,
5312
+ fontSize: theme.fontSizes.sm,
5313
+ padding: `${theme.spacing.xs}px ${theme.spacing.sm}px`,
5314
+ },
5315
+ pre: {
5316
+ margin: 0,
5317
+ },
5318
+ }));
5037
5319
  function ResourceBlame(props) {
5038
5320
  var _a, _b;
5321
+ const { classes } = useStyles$3();
5039
5322
  const medplum = useMedplum();
5040
5323
  const [value, setValue] = React.useState(props.history);
5041
5324
  React.useEffect(() => {
@@ -5044,20 +5327,21 @@
5044
5327
  }
5045
5328
  }, [medplum, props.history, props.resourceType, props.id]);
5046
5329
  if (!value) {
5047
- return React__default["default"].createElement("div", null, "Loading...");
5330
+ return React.createElement("div", null, "Loading...");
5048
5331
  }
5049
5332
  const resource = (_b = (_a = value.entry) === null || _a === void 0 ? void 0 : _a[0]) === null || _b === void 0 ? void 0 : _b.resource;
5050
5333
  const table = blame(value);
5051
- return (React__default["default"].createElement("div", { className: "medplum-blame-container" },
5052
- React__default["default"].createElement("table", { className: "medplum-blame" },
5053
- React__default["default"].createElement("tbody", null, table.map((row, index) => (React__default["default"].createElement("tr", { key: 'row-' + index, className: row.span > 0 ? 'start-row' : 'normal-row' },
5054
- row.span > 0 && (React__default["default"].createElement("td", { className: "details", rowSpan: row.span },
5055
- React__default["default"].createElement(core$1.Group, { spacing: "xs", grow: true, noWrap: true },
5056
- React__default["default"].createElement(ResourceBadge, { value: row.meta.author, link: true }),
5057
- React__default["default"].createElement(MedplumLink, { to: getVersionUrl$1(resource, row.meta.versionId) }, getTimeString(row.meta.lastUpdated))))),
5058
- React__default["default"].createElement("td", { className: "line-number" }, index + 1),
5059
- React__default["default"].createElement("td", { className: "line" },
5060
- React__default["default"].createElement("pre", { className: "line-pre" }, row.value)))))))));
5334
+ return (React.createElement("div", { className: classes.container },
5335
+ React.createElement("table", { className: classes.root },
5336
+ React.createElement("tbody", null, table.map((row, index) => (React.createElement("tr", { key: 'row-' + index, className: row.span > 0 ? classes.startRow : classes.normalRow },
5337
+ row.span > 0 && (React.createElement(React.Fragment, null,
5338
+ React.createElement("td", { className: classes.author, rowSpan: row.span },
5339
+ React.createElement(ResourceBadge, { value: row.meta.author, link: true })),
5340
+ React.createElement("td", { className: classes.dateTime, rowSpan: row.span },
5341
+ React.createElement(MedplumLink, { to: getVersionUrl$1(resource, row.meta.versionId) }, getTimeString(row.meta.lastUpdated))))),
5342
+ React.createElement("td", { className: classes.lineNumber }, index + 1),
5343
+ React.createElement("td", { className: classes.line },
5344
+ React.createElement("pre", { className: classes.pre }, row.value)))))))));
5061
5345
  }
5062
5346
  function getVersionUrl$1(resource, versionId) {
5063
5347
  return `/${resource.resourceType}/${resource.id}/_history/${versionId}`;
@@ -5090,6 +5374,15 @@
5090
5374
  return `${count} ${count === 1 ? noun : noun + 's'} ago`;
5091
5375
  }
5092
5376
 
5377
+ const useStyles$2 = core$1.createStyles((theme) => ({
5378
+ removed: {
5379
+ color: theme.colors.red[7],
5380
+ textDecoration: 'line-through',
5381
+ },
5382
+ added: {
5383
+ color: theme.colors.green[7],
5384
+ },
5385
+ }));
5093
5386
  function ResourceDiff(props) {
5094
5387
  let originalResource = props.original;
5095
5388
  let revisedResource = props.revised;
@@ -5100,16 +5393,17 @@
5100
5393
  const original = core.stringify(originalResource, true).match(/[^\r\n]+/g);
5101
5394
  const revised = core.stringify(revisedResource, true).match(/[^\r\n]+/g);
5102
5395
  const deltas = diff(original, revised);
5103
- return (React__default["default"].createElement("pre", { style: { color: 'gray' } }, deltas.map((delta, index) => (React__default["default"].createElement(ChangeDiff, { key: 'delta' + index, delta: delta })))));
5396
+ return (React.createElement("pre", { style: { color: 'gray' } }, deltas.map((delta, index) => (React.createElement(ChangeDiff, { key: 'delta' + index, delta: delta })))));
5104
5397
  }
5105
5398
  function ChangeDiff(props) {
5106
- return (React__default["default"].createElement(React__default["default"].Fragment, null,
5399
+ const { classes } = useStyles$2();
5400
+ return (React.createElement(React.Fragment, null,
5107
5401
  "...",
5108
- React__default["default"].createElement("br", null),
5109
- props.delta.original.lines.length > 0 && (React__default["default"].createElement("div", { className: "medplum-diff-removed" }, props.delta.original.lines.join('\n'))),
5110
- props.delta.revised.lines.length > 0 && (React__default["default"].createElement("div", { className: "medplum-diff-added" }, props.delta.revised.lines.join('\n'))),
5402
+ React.createElement("br", null),
5403
+ props.delta.original.lines.length > 0 && (React.createElement("div", { className: classes.removed }, props.delta.original.lines.join('\n'))),
5404
+ props.delta.revised.lines.length > 0 && (React.createElement("div", { className: classes.added }, props.delta.revised.lines.join('\n'))),
5111
5405
  "...",
5112
- React__default["default"].createElement("br", null)));
5406
+ React.createElement("br", null)));
5113
5407
  }
5114
5408
 
5115
5409
  function ResourceHistoryTable(props) {
@@ -5125,30 +5419,30 @@
5125
5419
  }
5126
5420
  }, [medplum, props.history, props.resourceType, props.id]);
5127
5421
  if (!value) {
5128
- return React__default["default"].createElement("div", null, "Loading...");
5422
+ return React.createElement("div", null, "Loading...");
5129
5423
  }
5130
- return (React__default["default"].createElement(core$1.Table, { withBorder: true, withColumnBorders: true },
5131
- React__default["default"].createElement("thead", null,
5132
- React__default["default"].createElement("tr", null,
5133
- React__default["default"].createElement("th", null, "Author"),
5134
- React__default["default"].createElement("th", null, "Date"),
5135
- React__default["default"].createElement("th", null, "Version"))),
5136
- React__default["default"].createElement("tbody", null, (_a = value.entry) === null || _a === void 0 ? void 0 : _a.map((entry, index) => (React__default["default"].createElement(HistoryRow, { key: 'entry-' + index, entry: entry }))))));
5424
+ return (React.createElement(core$1.Table, { withBorder: true, withColumnBorders: true },
5425
+ React.createElement("thead", null,
5426
+ React.createElement("tr", null,
5427
+ React.createElement("th", null, "Author"),
5428
+ React.createElement("th", null, "Date"),
5429
+ React.createElement("th", null, "Version"))),
5430
+ React.createElement("tbody", null, (_a = value.entry) === null || _a === void 0 ? void 0 : _a.map((entry, index) => (React.createElement(HistoryRow, { key: 'entry-' + index, entry: entry }))))));
5137
5431
  }
5138
5432
  function HistoryRow(props) {
5139
5433
  var _a, _b, _c;
5140
5434
  const { response, resource } = props.entry;
5141
5435
  if (resource) {
5142
- return (React__default["default"].createElement("tr", null,
5143
- React__default["default"].createElement("td", null,
5144
- React__default["default"].createElement(ResourceBadge, { value: (_a = resource.meta) === null || _a === void 0 ? void 0 : _a.author, link: true })),
5145
- React__default["default"].createElement("td", null, core.formatDateTime((_b = resource.meta) === null || _b === void 0 ? void 0 : _b.lastUpdated)),
5146
- React__default["default"].createElement("td", null,
5147
- React__default["default"].createElement(MedplumLink, { to: getVersionUrl(resource) }, (_c = resource.meta) === null || _c === void 0 ? void 0 : _c.versionId))));
5436
+ return (React.createElement("tr", null,
5437
+ React.createElement("td", null,
5438
+ React.createElement(ResourceBadge, { value: (_a = resource.meta) === null || _a === void 0 ? void 0 : _a.author, link: true })),
5439
+ React.createElement("td", null, core.formatDateTime((_b = resource.meta) === null || _b === void 0 ? void 0 : _b.lastUpdated)),
5440
+ React.createElement("td", null,
5441
+ React.createElement(MedplumLink, { to: getVersionUrl(resource) }, (_c = resource.meta) === null || _c === void 0 ? void 0 : _c.versionId))));
5148
5442
  }
5149
5443
  else {
5150
- return (React__default["default"].createElement("tr", null,
5151
- React__default["default"].createElement("td", { colSpan: 3 }, core.normalizeErrorString(response === null || response === void 0 ? void 0 : response.outcome))));
5444
+ return (React.createElement("tr", null,
5445
+ React.createElement("td", { colSpan: 3 }, core.normalizeErrorString(response === null || response === void 0 ? void 0 : response.outcome))));
5152
5446
  }
5153
5447
  }
5154
5448
  function getVersionUrl(resource) {
@@ -5156,6 +5450,42 @@
5156
5450
  return `/${resource.resourceType}/${resource.id}/_history/${(_a = resource.meta) === null || _a === void 0 ? void 0 : _a.versionId}`;
5157
5451
  }
5158
5452
 
5453
+ const useStyles$1 = core$1.createStyles((theme) => ({
5454
+ table: {
5455
+ width: 350,
5456
+ '& th': {
5457
+ fontWeight: 'normal',
5458
+ fontSize: 11,
5459
+ padding: 8,
5460
+ textAlign: 'center',
5461
+ },
5462
+ '& td': {
5463
+ padding: '2px 4px',
5464
+ },
5465
+ '& td button': {
5466
+ width: 44,
5467
+ height: 44,
5468
+ color: theme.colors[theme.primaryColor][5],
5469
+ fontSize: 16,
5470
+ fontWeight: 500,
5471
+ textAlign: 'center',
5472
+ padding: 0,
5473
+ backgroundColor: theme.colors[theme.primaryColor][0],
5474
+ border: 0,
5475
+ borderRadius: '50%',
5476
+ cursor: 'pointer',
5477
+ },
5478
+ '& td button:hover': {
5479
+ backgroundColor: theme.colors[theme.primaryColor][1],
5480
+ },
5481
+ '& td button:disabled': {
5482
+ backgroundColor: 'transparent',
5483
+ cursor: 'default',
5484
+ color: theme.colors.gray[4],
5485
+ fontWeight: 'normal',
5486
+ },
5487
+ },
5488
+ }));
5159
5489
  /**
5160
5490
  * Returns a month display string (e.g. "January 2020").
5161
5491
  * @param date Any date within the month.
@@ -5165,6 +5495,7 @@
5165
5495
  return date.toLocaleString('default', { month: 'long' }) + ' ' + date.getFullYear();
5166
5496
  }
5167
5497
  function CalendarInput(props) {
5498
+ const { classes } = useStyles$1();
5168
5499
  const { onChangeMonth, onClick } = props;
5169
5500
  const [month, setMonth] = React.useState(getStartMonth);
5170
5501
  function moveMonth(delta) {
@@ -5176,23 +5507,23 @@
5176
5507
  });
5177
5508
  }
5178
5509
  const grid = React.useMemo(() => buildGrid(month, props.slots), [month, props.slots]);
5179
- return (React__default["default"].createElement("div", null,
5180
- React__default["default"].createElement(core$1.Group, { position: "apart", spacing: "xs", grow: true, noWrap: true },
5181
- React__default["default"].createElement("p", { style: { flex: 1 } }, getMonthString(month)),
5182
- React__default["default"].createElement(core$1.Group, { position: "right", spacing: "xs" },
5183
- React__default["default"].createElement(core$1.Button, { variant: "outline", "aria-label": "Previous month", onClick: () => moveMonth(-1) }, "<"),
5184
- React__default["default"].createElement(core$1.Button, { variant: "outline", "aria-label": "Next month", onClick: () => moveMonth(1) }, ">"))),
5185
- React__default["default"].createElement("table", { className: "medplum-calendar-table" },
5186
- React__default["default"].createElement("thead", null,
5187
- React__default["default"].createElement("tr", null,
5188
- React__default["default"].createElement("th", null, "SUN"),
5189
- React__default["default"].createElement("th", null, "MON"),
5190
- React__default["default"].createElement("th", null, "TUE"),
5191
- React__default["default"].createElement("th", null, "WED"),
5192
- React__default["default"].createElement("th", null, "THU"),
5193
- React__default["default"].createElement("th", null, "FRI"),
5194
- React__default["default"].createElement("th", null, "SAT"))),
5195
- React__default["default"].createElement("tbody", null, grid.map((week, weekIndex) => (React__default["default"].createElement("tr", { key: 'week-' + weekIndex }, week.map((day, dayIndex) => (React__default["default"].createElement("td", { key: 'day-' + dayIndex }, day && (React__default["default"].createElement(core$1.Button, { disabled: !day.available, onClick: () => onClick(day.date) }, day.date.getDate()))))))))))));
5510
+ return (React.createElement("div", null,
5511
+ React.createElement(core$1.Group, { position: "apart", spacing: "xs", grow: true, noWrap: true },
5512
+ React.createElement("p", { style: { flex: 1 } }, getMonthString(month)),
5513
+ React.createElement(core$1.Group, { position: "right", spacing: "xs" },
5514
+ React.createElement(core$1.Button, { variant: "outline", "aria-label": "Previous month", onClick: () => moveMonth(-1) }, "<"),
5515
+ React.createElement(core$1.Button, { variant: "outline", "aria-label": "Next month", onClick: () => moveMonth(1) }, ">"))),
5516
+ React.createElement("table", { className: classes.table },
5517
+ React.createElement("thead", null,
5518
+ React.createElement("tr", null,
5519
+ React.createElement("th", null, "SUN"),
5520
+ React.createElement("th", null, "MON"),
5521
+ React.createElement("th", null, "TUE"),
5522
+ React.createElement("th", null, "WED"),
5523
+ React.createElement("th", null, "THU"),
5524
+ React.createElement("th", null, "FRI"),
5525
+ React.createElement("th", null, "SAT"))),
5526
+ React.createElement("tbody", null, grid.map((week, weekIndex) => (React.createElement("tr", { key: 'week-' + weekIndex }, week.map((day, dayIndex) => (React.createElement("td", { key: 'day-' + dayIndex }, day && (React.createElement(core$1.Button, { disabled: !day.available, onClick: () => onClick(day.date) }, day.date.getDate()))))))))))));
5196
5527
  }
5197
5528
  function getStartMonth() {
5198
5529
  const result = new Date();
@@ -5247,8 +5578,24 @@
5247
5578
  return false;
5248
5579
  }
5249
5580
 
5581
+ const useStyles = core$1.createStyles((theme) => ({
5582
+ container: {
5583
+ display: 'flex',
5584
+ minHeight: 400,
5585
+ },
5586
+ info: {
5587
+ minWidth: 300,
5588
+ padding: 20,
5589
+ borderRight: `1px solid ${theme.colors.gray[3]}`,
5590
+ },
5591
+ selection: {
5592
+ minWidth: 300,
5593
+ padding: 20,
5594
+ },
5595
+ }));
5250
5596
  function Scheduler(props) {
5251
5597
  var _a;
5598
+ const { classes } = useStyles();
5252
5599
  const medplum = useMedplum();
5253
5600
  const schedule = useResource(props.schedule);
5254
5601
  const questionnaire = useResource(props.questionnaire);
@@ -5280,30 +5627,30 @@
5280
5627
  return null;
5281
5628
  }
5282
5629
  const actor = (_a = schedule.actor) === null || _a === void 0 ? void 0 : _a[0];
5283
- return (React__default["default"].createElement("div", { className: "medplum-calendar-container", "data-testid": "scheduler" },
5284
- React__default["default"].createElement("div", { className: "medplum-calendar-info-pane" },
5285
- actor && React__default["default"].createElement(ResourceAvatar, { value: actor, size: "xl" }),
5286
- actor && (React__default["default"].createElement(core$1.Text, { size: "xl", weight: 500 },
5287
- React__default["default"].createElement(ResourceName, { value: actor }))),
5288
- React__default["default"].createElement("p", null, "1 hour"),
5289
- date && React__default["default"].createElement("p", null, date.toLocaleDateString()),
5290
- slot && React__default["default"].createElement("p", null, formatTime(new Date(slot.start)))),
5291
- React__default["default"].createElement("div", { className: "medplum-calendar-selection-pane" },
5292
- !date && (React__default["default"].createElement("div", null,
5293
- React__default["default"].createElement("h3", null, "Select date"),
5294
- React__default["default"].createElement(CalendarInput, { slots: slots, onChangeMonth: setMonth, onClick: setDate }))),
5295
- date && !slot && (React__default["default"].createElement("div", null,
5296
- React__default["default"].createElement("h3", null, "Select time"),
5297
- React__default["default"].createElement(core$1.Stack, null, slots.map((s) => {
5630
+ return (React.createElement("div", { className: classes.container, "data-testid": "scheduler" },
5631
+ React.createElement("div", { className: classes.info },
5632
+ actor && React.createElement(ResourceAvatar, { value: actor, size: "xl" }),
5633
+ actor && (React.createElement(core$1.Text, { size: "xl", weight: 500 },
5634
+ React.createElement(ResourceName, { value: actor }))),
5635
+ React.createElement("p", null, "1 hour"),
5636
+ date && React.createElement("p", null, date.toLocaleDateString()),
5637
+ slot && React.createElement("p", null, formatTime(new Date(slot.start)))),
5638
+ React.createElement("div", { className: classes.selection },
5639
+ !date && (React.createElement("div", null,
5640
+ React.createElement("h3", null, "Select date"),
5641
+ React.createElement(CalendarInput, { slots: slots, onChangeMonth: setMonth, onClick: setDate }))),
5642
+ date && !slot && (React.createElement("div", null,
5643
+ React.createElement("h3", null, "Select time"),
5644
+ React.createElement(core$1.Stack, null, slots.map((s) => {
5298
5645
  const slotStart = new Date(s.start);
5299
5646
  return (slotStart.getTime() > date.getTime() &&
5300
- slotStart.getTime() < date.getTime() + 24 * 3600 * 1000 && (React__default["default"].createElement("div", { key: s.id },
5301
- React__default["default"].createElement(core$1.Button, { variant: "outline", style: { width: 150 }, onClick: () => setSlot(s) }, formatTime(slotStart)))));
5647
+ slotStart.getTime() < date.getTime() + 24 * 3600 * 1000 && (React.createElement("div", { key: s.id },
5648
+ React.createElement(core$1.Button, { variant: "outline", style: { width: 150 }, onClick: () => setSlot(s) }, formatTime(slotStart)))));
5302
5649
  })))),
5303
- date && slot && !response && (React__default["default"].createElement(QuestionnaireForm, { questionnaire: questionnaire, submitButtonText: 'Next', onSubmit: setResponse })),
5304
- date && slot && response && (React__default["default"].createElement("div", null,
5305
- React__default["default"].createElement("h3", null, "You're all set!"),
5306
- React__default["default"].createElement("p", null, "Check your email for a calendar invite."))))));
5650
+ date && slot && !response && (React.createElement(QuestionnaireForm, { questionnaire: questionnaire, submitButtonText: 'Next', onSubmit: setResponse })),
5651
+ date && slot && response && (React.createElement("div", null,
5652
+ React.createElement("h3", null, "You're all set!"),
5653
+ React.createElement("p", null, "Check your email for a calendar invite."))))));
5307
5654
  }
5308
5655
  function getStart(month) {
5309
5656
  return formatSlotInstant(month.getTime());
@@ -5319,7 +5666,7 @@
5319
5666
  }
5320
5667
 
5321
5668
  function ServiceRequestTimeline(props) {
5322
- return (React__default["default"].createElement(ResourceTimeline, { value: props.serviceRequest, buildSearchRequests: (resource) => ({
5669
+ return (React.createElement(ResourceTimeline, { value: props.serviceRequest, buildSearchRequests: (resource) => ({
5323
5670
  resourceType: 'Bundle',
5324
5671
  type: 'batch',
5325
5672
  entry: [
@@ -5488,7 +5835,5 @@
5488
5835
  exports.useMedplumProfile = useMedplumProfile;
5489
5836
  exports.useResource = useResource;
5490
5837
 
5491
- Object.defineProperty(exports, '__esModule', { value: true });
5492
-
5493
5838
  }));
5494
5839
  //# sourceMappingURL=index.js.map