@medplum/react 0.10.2 → 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 (133) 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 +1247 -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/esm/AttachmentArrayInput.js +2 -2
  32. package/dist/esm/AttachmentArrayInput.js.map +1 -1
  33. package/dist/esm/AttachmentButton.d.ts +2 -0
  34. package/dist/esm/AttachmentButton.js +4 -1
  35. package/dist/esm/AttachmentButton.js.map +1 -1
  36. package/dist/esm/BackboneElementInput.js +2 -1
  37. package/dist/esm/BackboneElementInput.js.map +1 -1
  38. package/dist/esm/CalendarInput.d.ts +0 -1
  39. package/dist/esm/CalendarInput.js +39 -2
  40. package/dist/esm/CalendarInput.js.map +1 -1
  41. package/dist/esm/CheckboxFormSection.d.ts +0 -1
  42. package/dist/esm/CheckboxFormSection.js +5 -5
  43. package/dist/esm/CheckboxFormSection.js.map +1 -1
  44. package/dist/esm/DescriptionList.d.ts +0 -1
  45. package/dist/esm/DescriptionList.js +23 -1
  46. package/dist/esm/DescriptionList.js.map +1 -1
  47. package/dist/esm/DiagnosticReportDisplay.d.ts +0 -1
  48. package/dist/esm/DiagnosticReportDisplay.js +40 -22
  49. package/dist/esm/DiagnosticReportDisplay.js.map +1 -1
  50. package/dist/esm/Document.d.ts +0 -1
  51. package/dist/esm/Document.js +7 -2
  52. package/dist/esm/Document.js.map +1 -1
  53. package/dist/esm/ErrorBoundary.js +2 -1
  54. package/dist/esm/ErrorBoundary.js.map +1 -1
  55. package/dist/esm/FhirPathTable.d.ts +0 -1
  56. package/dist/esm/FhirPathTable.js +5 -5
  57. package/dist/esm/FhirPathTable.js.map +1 -1
  58. package/dist/esm/FormSection.d.ts +0 -1
  59. package/dist/esm/FormSection.js +3 -11
  60. package/dist/esm/FormSection.js.map +1 -1
  61. package/dist/esm/MedplumLink.d.ts +2 -4
  62. package/dist/esm/MedplumLink.js +11 -8
  63. package/dist/esm/MedplumLink.js.map +1 -1
  64. package/dist/esm/PlanDefinitionBuilder.js +41 -10
  65. package/dist/esm/PlanDefinitionBuilder.js.map +1 -1
  66. package/dist/esm/QuestionnaireBuilder.d.ts +0 -1
  67. package/dist/esm/QuestionnaireBuilder.js +78 -31
  68. package/dist/esm/QuestionnaireBuilder.js.map +1 -1
  69. package/dist/esm/QuestionnaireForm.d.ts +0 -1
  70. package/dist/esm/QuestionnaireForm.js +26 -16
  71. package/dist/esm/QuestionnaireForm.js.map +1 -1
  72. package/dist/esm/RequestGroupDisplay.d.ts +0 -1
  73. package/dist/esm/RequestGroupDisplay.js +8 -7
  74. package/dist/esm/RequestGroupDisplay.js.map +1 -1
  75. package/dist/esm/ResourceBadge.d.ts +0 -1
  76. package/dist/esm/ResourceBadge.js +2 -1
  77. package/dist/esm/ResourceBadge.js.map +1 -1
  78. package/dist/esm/ResourceBlame.d.ts +0 -1
  79. package/dist/esm/ResourceBlame.js +59 -10
  80. package/dist/esm/ResourceBlame.js.map +1 -1
  81. package/dist/esm/ResourceDiff.d.ts +0 -1
  82. package/dist/esm/ResourceDiff.js +13 -2
  83. package/dist/esm/ResourceDiff.js.map +1 -1
  84. package/dist/esm/ResourceDiffTable.d.ts +0 -2
  85. package/dist/esm/ResourceDiffTable.js +25 -3
  86. package/dist/esm/ResourceDiffTable.js.map +1 -1
  87. package/dist/esm/ResourceForm.js +6 -5
  88. package/dist/esm/ResourceForm.js.map +1 -1
  89. package/dist/esm/ResourceInput.js +22 -1
  90. package/dist/esm/ResourceInput.js.map +1 -1
  91. package/dist/esm/ResourceName.d.ts +2 -1
  92. package/dist/esm/ResourceName.js +5 -2
  93. package/dist/esm/ResourceName.js.map +1 -1
  94. package/dist/esm/ResourcePropertyDisplay.js +6 -6
  95. package/dist/esm/ResourcePropertyDisplay.js.map +1 -1
  96. package/dist/esm/ResourceTimeline.d.ts +0 -1
  97. package/dist/esm/ResourceTimeline.js +78 -25
  98. package/dist/esm/ResourceTimeline.js.map +1 -1
  99. package/dist/esm/Scheduler.d.ts +0 -1
  100. package/dist/esm/Scheduler.js +20 -4
  101. package/dist/esm/Scheduler.js.map +1 -1
  102. package/dist/esm/SearchControl.d.ts +0 -1
  103. package/dist/esm/SearchControl.js +33 -18
  104. package/dist/esm/SearchControl.js.map +1 -1
  105. package/dist/esm/SearchFilterEditor.d.ts +0 -1
  106. package/dist/esm/SearchFilterEditor.js +2 -2
  107. package/dist/esm/SearchFilterEditor.js.map +1 -1
  108. package/dist/esm/Timeline.d.ts +0 -1
  109. package/dist/esm/Timeline.js +13 -16
  110. package/dist/esm/Timeline.js.map +1 -1
  111. package/dist/esm/auth/AuthenticationForm.d.ts +1 -0
  112. package/dist/esm/auth/AuthenticationForm.js +6 -3
  113. package/dist/esm/auth/AuthenticationForm.js.map +1 -1
  114. package/dist/esm/auth/ChooseProfileForm.js +3 -3
  115. package/dist/esm/auth/ChooseProfileForm.js.map +1 -1
  116. package/dist/esm/auth/NewProjectForm.js +3 -3
  117. package/dist/esm/auth/NewProjectForm.js.map +1 -1
  118. package/dist/esm/auth/NewUserForm.js +4 -3
  119. package/dist/esm/auth/NewUserForm.js.map +1 -1
  120. package/dist/esm/auth/RegisterForm.d.ts +0 -1
  121. package/dist/esm/auth/RegisterForm.js.map +1 -1
  122. package/dist/esm/auth/SignInForm.d.ts +1 -1
  123. package/dist/esm/auth/SignInForm.js +1 -1
  124. package/dist/esm/auth/SignInForm.js.map +1 -1
  125. package/dist/esm/index.min.js +1 -1
  126. package/dist/esm/index.min.js.map +1 -1
  127. package/dist/esm/stories/DescriptionList.stories.d.ts +5 -0
  128. package/package.json +35 -24
  129. package/rollup.config.mjs +111 -0
  130. package/dist/cjs/defaulttheme.css +0 -192
  131. package/dist/cjs/styles.css +0 -528
  132. package/dist/esm/defaulttheme.css +0 -192
  133. 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,12 +1650,28 @@
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);
@@ -1652,7 +1686,12 @@
1652
1686
  function loadValues(input) {
1653
1687
  return __awaiter(this, void 0, void 0, function* () {
1654
1688
  setLoading(true);
1655
- 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);
1656
1695
  setData(resources.map((resource) => ({ value: core.getDisplayString(resource), resource })));
1657
1696
  setLoading(false);
1658
1697
  });
@@ -1670,16 +1709,16 @@
1670
1709
  props.onChange(item.resource);
1671
1710
  }
1672
1711
  }
1673
- 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 }));
1674
1713
  }
1675
1714
  const ItemComponent = React.forwardRef((_a, ref) => {
1676
1715
  var { value, resource } = _a, others = __rest(_a, ["value", "resource"]);
1677
- return (React__default["default"].createElement("div", Object.assign({ ref: ref }, others),
1678
- React__default["default"].createElement(core$1.Group, { noWrap: true },
1679
- React__default["default"].createElement(ResourceAvatar, { value: resource }),
1680
- React__default["default"].createElement("div", null,
1681
- React__default["default"].createElement(core$1.Text, null, value),
1682
- 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)))));
1683
1722
  });
1684
1723
 
1685
1724
  function ReferenceInput(props) {
@@ -1697,9 +1736,9 @@
1697
1736
  props.onChange(newValue);
1698
1737
  }
1699
1738
  }
1700
- return (React__default["default"].createElement(core$1.Group, { spacing: "xs", grow: true, noWrap: true },
1701
- 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) })),
1702
- 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) => {
1703
1742
  setValueHelper(item ? core.createReference(item) : undefined);
1704
1743
  } })));
1705
1744
  }
@@ -1725,36 +1764,36 @@
1725
1764
  props.onChange(newValues);
1726
1765
  }
1727
1766
  }
1728
- return (React__default["default"].createElement("table", { style: { width: '100%', borderCollapse: 'collapse' } },
1729
- React__default["default"].createElement("colgroup", null,
1730
- React__default["default"].createElement("col", { width: "97%" }),
1731
- React__default["default"].createElement("col", { width: "3%" })),
1732
- React__default["default"].createElement("tbody", null,
1733
- values.map((v, index) => (React__default["default"].createElement("tr", { key: `${index}-${values.length}` },
1734
- React__default["default"].createElement("td", null,
1735
- 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) => {
1736
1775
  const copy = [...valuesRef.current];
1737
1776
  copy[index] = newValue;
1738
1777
  setValuesWrapper(copy);
1739
1778
  } })),
1740
- React__default["default"].createElement("td", { style: { textAlign: 'right' } },
1741
- 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) => {
1742
1781
  killEvent(e);
1743
1782
  const copy = [...valuesRef.current];
1744
1783
  copy.splice(index, 1);
1745
1784
  setValuesWrapper(copy);
1746
1785
  } },
1747
- React__default["default"].createElement(icons.IconCircleMinus, null)))))),
1748
- React__default["default"].createElement("tr", null,
1749
- React__default["default"].createElement("td", null),
1750
- React__default["default"].createElement("td", { style: { textAlign: 'right' } },
1751
- 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) => {
1752
1791
  killEvent(e);
1753
1792
  const copy = [...valuesRef.current];
1754
1793
  copy.push(undefined);
1755
1794
  setValuesWrapper(copy);
1756
1795
  } },
1757
- React__default["default"].createElement(icons.IconCirclePlus, null)))))));
1796
+ React.createElement(icons.IconCirclePlus, null)))))));
1758
1797
  }
1759
1798
 
1760
1799
  const daysOfWeek = ['sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat'];
@@ -1763,11 +1802,11 @@
1763
1802
  const [open, setOpen] = React.useState(false);
1764
1803
  const valueRef = React.useRef();
1765
1804
  valueRef.current = value;
1766
- return (React__default["default"].createElement(React__default["default"].Fragment, null,
1767
- React__default["default"].createElement(core$1.Group, { spacing: "xs", grow: true, noWrap: true },
1768
- React__default["default"].createElement("span", null, core.formatTiming(valueRef.current) || 'No repeat'),
1769
- React__default["default"].createElement(core$1.Button, { onClick: () => setOpen(true) }, "Edit")),
1770
- 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) => {
1771
1810
  if (props.onChange) {
1772
1811
  props.onChange(newValue);
1773
1812
  }
@@ -1816,24 +1855,24 @@
1816
1855
  setRepeat(Object.assign(Object.assign({}, (_c = valueRef.current) === null || _c === void 0 ? void 0 : _c.repeat), { dayOfWeek: existing.filter((d) => d !== day) }));
1817
1856
  }
1818
1857
  }
1819
- return (React__default["default"].createElement(core$1.Modal, { title: "Timing", closeButtonLabel: "Close", opened: props.visible, onClose: () => props.onCancel() },
1820
- React__default["default"].createElement("div", { style: { padding: '5px 20px', textAlign: 'left' } },
1821
- React__default["default"].createElement(FormSection, { title: "Starts on", htmlFor: 'timing-dialog-start' },
1822
- React__default["default"].createElement(DateTimeInput, { name: 'timing-dialog-start', onChange: (newValue) => setStart(newValue) })),
1823
- React__default["default"].createElement(FormSection, { title: "Repeat every", htmlFor: 'timing-dialog-period' },
1824
- React__default["default"].createElement(core$1.Group, { spacing: "xs", grow: true, noWrap: true },
1825
- 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)) }),
1826
- 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: [
1827
1866
  { label: 'day', value: 'd' },
1828
1867
  { label: 'week', value: 'wk' },
1829
1868
  { label: 'month', value: 'mo' },
1830
1869
  { label: 'year', value: 'a' },
1831
1870
  ] }))),
1832
- React__default["default"].createElement(FormSection, { title: "Repeat on" },
1833
- 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 },
1834
- React__default["default"].createElement("label", { htmlFor: 'timing-dialog-repeat-' + day }, day.charAt(0).toUpperCase()),
1835
- React__default["default"].createElement(core$1.Checkbox, { id: 'timing-dialog-repeat-' + day, name: 'timing-dialog-repeat-' + day, onChange: (e) => setDayOfWeek(day, e.currentTarget.checked) }))))))),
1836
- 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")));
1837
1876
  }
1838
1877
 
1839
1878
  function ResourcePropertyInput(props) {
@@ -1844,16 +1883,16 @@
1844
1883
  const value = props.defaultValue;
1845
1884
  if (property.max === '*' && !props.arrayElement) {
1846
1885
  if (propertyType === 'Attachment') {
1847
- 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 });
1848
1887
  }
1849
- 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 });
1850
1889
  }
1851
1890
  const propertyTypes = property.type;
1852
1891
  if (propertyTypes.length > 1) {
1853
- return React__default["default"].createElement(ElementDefinitionInputSelector, Object.assign({ elementDefinitionTypes: propertyTypes }, props));
1892
+ return React.createElement(ElementDefinitionInputSelector, Object.assign({ elementDefinitionTypes: propertyTypes }, props));
1854
1893
  }
1855
1894
  else {
1856
- return React__default["default"].createElement(ElementDefinitionTypeInput, Object.assign({ elementDefinitionType: propertyTypes[0] }, props));
1895
+ return React.createElement(ElementDefinitionTypeInput, Object.assign({ elementDefinitionType: propertyTypes[0] }, props));
1857
1896
  }
1858
1897
  }
1859
1898
  function ElementDefinitionInputSelector(props) {
@@ -1866,14 +1905,14 @@
1866
1905
  initialPropertyType = propertyTypes[0];
1867
1906
  }
1868
1907
  const [selectedType, setSelectedType] = React.useState(initialPropertyType);
1869
- return (React__default["default"].createElement(core$1.Group, { spacing: "xs", grow: true, noWrap: true },
1870
- 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) => {
1871
1910
  setSelectedType(propertyTypes.find((type) => type.code === e.currentTarget.value));
1872
1911
  }, data: propertyTypes.map((type) => ({
1873
1912
  value: type.code,
1874
1913
  label: type.code,
1875
1914
  })) }),
1876
- React__default["default"].createElement(ElementDefinitionTypeInput, Object.assign({}, props, { elementDefinitionType: selectedType, onChange: (newValue) => {
1915
+ React.createElement(ElementDefinitionTypeInput, Object.assign({}, props, { elementDefinitionType: selectedType, onChange: (newValue) => {
1877
1916
  if (props.onChange) {
1878
1917
  props.onChange(newValue, props.name.replace('[x]', core.capitalize(selectedType.code)));
1879
1918
  }
@@ -1894,39 +1933,39 @@
1894
1933
  case core.PropertyType.time:
1895
1934
  case core.PropertyType.uri:
1896
1935
  case core.PropertyType.url:
1897
- 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) => {
1898
1937
  if (props.onChange) {
1899
1938
  props.onChange(e.currentTarget.value);
1900
1939
  }
1901
1940
  }, error: getErrorsForInput(props.outcome, name) }));
1902
1941
  case core.PropertyType.date:
1903
- 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) => {
1904
1943
  if (props.onChange) {
1905
1944
  props.onChange(e.currentTarget.value);
1906
1945
  }
1907
1946
  }, error: getErrorsForInput(props.outcome, name) }));
1908
1947
  case core.PropertyType.dateTime:
1909
1948
  case core.PropertyType.instant:
1910
- 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 });
1911
1950
  case core.PropertyType.decimal:
1912
1951
  case core.PropertyType.integer:
1913
1952
  case core.PropertyType.positiveInt:
1914
1953
  case core.PropertyType.unsignedInt:
1915
- 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) => {
1916
1955
  if (props.onChange) {
1917
1956
  props.onChange(e.currentTarget.valueAsNumber);
1918
1957
  }
1919
1958
  } }));
1920
1959
  case core.PropertyType.code:
1921
- 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 });
1922
1961
  case core.PropertyType.boolean:
1923
- 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) => {
1924
1963
  if (props.onChange) {
1925
1964
  props.onChange(e.currentTarget.checked);
1926
1965
  }
1927
1966
  } }));
1928
1967
  case core.PropertyType.markdown:
1929
- 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) => {
1930
1969
  if (props.onChange) {
1931
1970
  props.onChange(e.currentTarget.value);
1932
1971
  }
@@ -1934,39 +1973,39 @@
1934
1973
  // 2.24.0.2 Complex Types
1935
1974
  // https://www.hl7.org/fhir/datatypes.html#complex
1936
1975
  case core.PropertyType.Address:
1937
- 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 });
1938
1977
  case core.PropertyType.Annotation:
1939
- 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 });
1940
1979
  case core.PropertyType.Attachment:
1941
- 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 });
1942
1981
  case core.PropertyType.CodeableConcept:
1943
- 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 });
1944
1983
  case core.PropertyType.Coding:
1945
- 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 });
1946
1985
  case core.PropertyType.ContactDetail:
1947
- 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 });
1948
1987
  case core.PropertyType.ContactPoint:
1949
- 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 });
1950
1989
  case core.PropertyType.Extension:
1951
- 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 });
1952
1991
  case core.PropertyType.HumanName:
1953
- 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 });
1954
1993
  case core.PropertyType.Identifier:
1955
- 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 });
1956
1995
  case core.PropertyType.Period:
1957
- 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 });
1958
1997
  case core.PropertyType.Quantity:
1959
- 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 });
1960
1999
  case core.PropertyType.Range:
1961
- 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 });
1962
2001
  case core.PropertyType.Ratio:
1963
- 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 });
1964
2003
  case core.PropertyType.Reference:
1965
- 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 }));
1966
2005
  case core.PropertyType.Timing:
1967
- 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 });
1968
2007
  default:
1969
- 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 }));
1970
2009
  }
1971
2010
  }
1972
2011
  function getTargetTypes(property) {
@@ -1986,12 +2025,12 @@
1986
2025
  const typeName = props.typeName;
1987
2026
  const typeSchema = core.globalSchema.types[typeName];
1988
2027
  if (!typeSchema) {
1989
- return React__default["default"].createElement("div", null,
2028
+ return React.createElement("div", null,
1990
2029
  typeName,
1991
2030
  "\u00A0not implemented");
1992
2031
  }
1993
2032
  const typedValue = { type: typeName, value };
1994
- 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) => {
1995
2034
  const key = entry[0];
1996
2035
  if (key === 'id' || DEFAULT_IGNORED_PROPERTIES.indexOf(key) >= 0) {
1997
2036
  return null;
@@ -2002,33 +2041,53 @@
2002
2041
  }
2003
2042
  const [propertyValue, propertyType] = getValueAndType(typedValue, key);
2004
2043
  if (property.type.length === 1 && property.type[0].code === 'boolean') {
2005
- return (React__default["default"].createElement(CheckboxFormSection, { key: key, title: core.getPropertyDisplayName(key), description: property.definition, htmlFor: key },
2006
- 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) => {
2007
2046
  setValueWrapper(setPropertyValue(value, key, propName !== null && propName !== void 0 ? propName : key, entry[1], newValue));
2008
2047
  } })));
2009
2048
  }
2010
- return (React__default["default"].createElement(FormSection, { key: key, title: core.getPropertyDisplayName(key), description: property.definition, htmlFor: key, outcome: props.outcome },
2011
- 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) => {
2012
2051
  setValueWrapper(setPropertyValue(value, key, propName !== null && propName !== void 0 ? propName : key, entry[1], newValue));
2013
2052
  } })));
2014
2053
  })));
2015
2054
  }
2016
2055
 
2017
2056
  function ResourceName(props) {
2018
- const resource = useResource(props.value);
2057
+ const { value, link } = props, rest = __rest(props, ["value", "link"]);
2058
+ const resource = useResource(value);
2019
2059
  if (!resource) {
2020
2060
  return null;
2021
2061
  }
2022
2062
  const text = core.getDisplayString(resource);
2023
- 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));
2024
2064
  }
2025
2065
 
2026
2066
  function ResourceBadge(props) {
2027
- return (React__default["default"].createElement("div", { className: "medplum-resource-badge" },
2028
- React__default["default"].createElement(ResourceAvatar, { size: 24, radius: 12, value: props.value, link: props.link }),
2029
- 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 })));
2030
2070
  }
2031
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
+ }));
2032
2091
  function DiagnosticReportDisplay(props) {
2033
2092
  var _a, _b;
2034
2093
  const diagnosticReport = useResource(props.value);
@@ -2048,69 +2107,68 @@
2048
2107
  textContent += note.text + '\n\n';
2049
2108
  }
2050
2109
  }
2051
- return (React__default["default"].createElement("div", { className: "medplum-diagnostic-report" },
2052
- React__default["default"].createElement("h1", null, "Diagnostic Report"),
2053
- React__default["default"].createElement("div", { className: "medplum-diagnostic-report-header" },
2054
- diagnosticReport.subject && (React__default["default"].createElement("dl", null,
2055
- React__default["default"].createElement("dt", null, "Subject"),
2056
- React__default["default"].createElement("dd", null,
2057
- 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 })))),
2058
2117
  diagnosticReport.resultsInterpreter &&
2059
- diagnosticReport.resultsInterpreter.map((interpreter) => (React__default["default"].createElement("dl", { key: interpreter.reference },
2060
- React__default["default"].createElement("dt", null, "Interpreter"),
2061
- React__default["default"].createElement("dd", null,
2062
- React__default["default"].createElement(ResourceBadge, { value: interpreter, link: true }))))),
2063
- diagnosticReport.issued && (React__default["default"].createElement("dl", null,
2064
- React__default["default"].createElement("dt", null, "Issued"),
2065
- React__default["default"].createElement("dd", null, core.formatDateTime(diagnosticReport.issued)))),
2066
- diagnosticReport.status && (React__default["default"].createElement("dl", null,
2067
- React__default["default"].createElement("dt", null, "Status"),
2068
- React__default["default"].createElement("dd", null, core.capitalize(diagnosticReport.status))))),
2069
- diagnosticReport.result && React__default["default"].createElement(ObservationTable, { value: diagnosticReport.result }),
2070
- 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())));
2071
2130
  }
2072
2131
  function ObservationTable(props) {
2073
2132
  var _a;
2074
- return (React__default["default"].createElement(core$1.Table, { withBorder: true, withColumnBorders: true },
2075
- React__default["default"].createElement("thead", null,
2076
- React__default["default"].createElement("tr", null,
2077
- React__default["default"].createElement("th", null, "Test"),
2078
- React__default["default"].createElement("th", null, "Value"),
2079
- React__default["default"].createElement("th", null, "Reference Range"),
2080
- React__default["default"].createElement("th", null, "Interpretation"))),
2081
- 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 }))))));
2082
2142
  }
2083
2143
  function ObservationRow(props) {
2144
+ const { classes, cx } = useStyles$9();
2084
2145
  const observation = useResource(props.value);
2085
2146
  if (!observation) {
2086
2147
  return null;
2087
2148
  }
2088
- let className = undefined;
2089
- if (isCritical(observation)) {
2090
- className = 'medplum-critical';
2091
- }
2092
- return (React__default["default"].createElement("tr", { className: className },
2093
- React__default["default"].createElement("td", null,
2094
- React__default["default"].createElement(MedplumLink, { to: observation },
2095
- React__default["default"].createElement(CodeableConceptDisplay, { value: observation.code }))),
2096
- React__default["default"].createElement("td", null,
2097
- React__default["default"].createElement(ObservationValueDisplay, { value: observation })),
2098
- React__default["default"].createElement("td", null,
2099
- React__default["default"].createElement(ReferenceRangeDisplay, { value: observation.referenceRange })),
2100
- 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] })))));
2101
2159
  }
2102
2160
  function ObservationValueDisplay(props) {
2103
2161
  var _a;
2104
2162
  const obs = props.value;
2105
2163
  if (obs === null || obs === void 0 ? void 0 : obs.valueQuantity) {
2106
- 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 });
2107
2165
  }
2108
2166
  if (obs === null || obs === void 0 ? void 0 : obs.valueString) {
2109
- return React__default["default"].createElement(React__default["default"].Fragment, null, obs.valueString);
2167
+ return React.createElement(React.Fragment, null, obs.valueString);
2110
2168
  }
2111
2169
  if (obs && 'component' in obs && (obs === null || obs === void 0 ? void 0 : obs.component)) {
2112
- return (React__default["default"].createElement(React__default["default"].Fragment, null, obs.component
2113
- .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 })))
2114
2172
  .reduce((prev, curr) => [prev, ' / ', curr])));
2115
2173
  }
2116
2174
  return null;
@@ -2121,9 +2179,9 @@
2121
2179
  return null;
2122
2180
  }
2123
2181
  if (range.text) {
2124
- return React__default["default"].createElement(React__default["default"].Fragment, null, range.text);
2182
+ return React.createElement(React.Fragment, null, range.text);
2125
2183
  }
2126
- return React__default["default"].createElement(RangeDisplay, { value: range });
2184
+ return React.createElement(RangeDisplay, { value: range });
2127
2185
  }
2128
2186
  /**
2129
2187
  * Returns true if the observation is critical.
@@ -2137,7 +2195,28 @@
2137
2195
  return code === 'AA' || code === 'LL' || code === 'HH' || code === 'RR';
2138
2196
  }
2139
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
+ }));
2140
2218
  function ResourceDiffTable(props) {
2219
+ const { classes } = useStyles$8();
2141
2220
  const medplum = useMedplum();
2142
2221
  const [schema, setSchema] = React.useState();
2143
2222
  React.useEffect(() => {
@@ -2150,17 +2229,17 @@
2150
2229
  if (!typeSchema) {
2151
2230
  return null;
2152
2231
  }
2153
- return (React__default["default"].createElement("table", { className: "medplum-diff-table" },
2154
- React__default["default"].createElement("colgroup", null,
2155
- React__default["default"].createElement("col", { style: { width: '30%' } }),
2156
- React__default["default"].createElement("col", { style: { width: '35%' } }),
2157
- React__default["default"].createElement("col", { style: { width: '35%' } })),
2158
- React__default["default"].createElement("thead", null,
2159
- React__default["default"].createElement("tr", null,
2160
- React__default["default"].createElement("th", null, "Property"),
2161
- React__default["default"].createElement("th", null, "Before"),
2162
- React__default["default"].createElement("th", null, "After"))),
2163
- 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) => {
2164
2243
  const key = entry[0];
2165
2244
  if (key === 'id' || key === 'meta') {
2166
2245
  return null;
@@ -2174,12 +2253,12 @@
2174
2253
  if (core.stringify(originalPropertyValue) === core.stringify(revisedPropertyValue)) {
2175
2254
  return null;
2176
2255
  }
2177
- return (React__default["default"].createElement("tr", { key: key },
2178
- React__default["default"].createElement("td", null, core.getPropertyDisplayName(key)),
2179
- React__default["default"].createElement("td", { className: "medplum-diff-removed" },
2180
- React__default["default"].createElement(ResourcePropertyDisplay, { property: property, propertyType: originalPropertyType, value: originalPropertyValue, ignoreMissingValues: true })),
2181
- React__default["default"].createElement("td", { className: "medplum-diff-added" },
2182
- 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 }))));
2183
2262
  }))));
2184
2263
  }
2185
2264
  function isEmpty(value) {
@@ -2200,14 +2279,14 @@
2200
2279
  if (!schema || !value) {
2201
2280
  return null;
2202
2281
  }
2203
- 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 }));
2204
2283
  }
2205
2284
 
2206
2285
  /**
2207
2286
  * ErrorBoundary is a React component that handles errors in its child components.
2208
2287
  * See: https://reactjs.org/docs/error-boundaries.html
2209
2288
  */
2210
- class ErrorBoundary extends React__default["default"].Component {
2289
+ class ErrorBoundary extends React.Component {
2211
2290
  constructor(props) {
2212
2291
  super(props);
2213
2292
  this.state = {};
@@ -2220,39 +2299,36 @@
2220
2299
  }
2221
2300
  render() {
2222
2301
  if (this.state.error) {
2223
- return React__default["default"].createElement("h1", null, "Something went wrong.");
2302
+ return React.createElement(core$1.Title, null, "Something went wrong.");
2224
2303
  }
2225
2304
  return this.props.children;
2226
2305
  }
2227
2306
  }
2228
2307
 
2229
2308
  function Timeline(props) {
2230
- return React__default["default"].createElement("main", { className: "medplum-document medplum-timeline" }, props.children);
2309
+ return React.createElement(core$1.Container, null, props.children);
2231
2310
  }
2232
2311
  function TimelineItem(props) {
2233
2312
  var _a, _b, _c;
2234
2313
  const author = (_a = props.profile) !== null && _a !== void 0 ? _a : (_b = props.resource.meta) === null || _b === void 0 ? void 0 : _b.author;
2235
- return (React__default["default"].createElement("article", { className: props.className || 'medplum-timeline-item', "data-testid": "timeline-item" },
2236
- React__default["default"].createElement("div", { className: "medplum-timeline-item-header" },
2237
- React__default["default"].createElement("div", { className: "medplum-timeline-item-avatar" },
2238
- React__default["default"].createElement(ResourceAvatar, { value: author, link: true, size: "md" })),
2239
- React__default["default"].createElement("div", { className: "medplum-timeline-item-title" },
2240
- React__default["default"].createElement(ResourceName, { value: author, link: true }),
2241
- React__default["default"].createElement("div", { className: "medplum-timeline-item-subtitle" },
2242
- React__default["default"].createElement(MedplumLink, { to: props.resource }, core.formatDateTime((_c = props.resource.meta) === null || _c === void 0 ? void 0 : _c.lastUpdated)),
2243
- React__default["default"].createElement("span", null, "\u00B7"),
2244
- React__default["default"].createElement(MedplumLink, { to: props.resource }, props.resource.resourceType))),
2245
- props.popupMenuItems && (React__default["default"].createElement(core$1.Menu, { position: "bottom-end", shadow: "md", width: 200 },
2246
- React__default["default"].createElement(core$1.Menu.Target, null,
2247
- React__default["default"].createElement(core$1.ActionIcon, { radius: "xl", "aria-label": `Actions for ${core.getReferenceString(props.resource)}` },
2248
- 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))),
2249
2328
  props.popupMenuItems))),
2250
- React__default["default"].createElement(ErrorBoundary, null,
2251
- props.padding && React__default["default"].createElement("div", { style: { padding: '2px 16px 16px 16px' } }, props.children),
2252
- !props.padding && React__default["default"].createElement(React__default["default"].Fragment, null, props.children)),
2253
- props.socialEnabled && (React__default["default"].createElement("div", { className: "medplum-timeline-item-footer" },
2254
- React__default["default"].createElement(core$1.Button, { variant: "subtle" }, "Like"),
2255
- 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))));
2256
2332
  }
2257
2333
 
2258
2334
  /**
@@ -2301,6 +2377,11 @@
2301
2377
  return new Date(dateTime).getTime();
2302
2378
  }
2303
2379
 
2380
+ const useStyles$7 = core$1.createStyles((theme) => ({
2381
+ pinnedComment: {
2382
+ backgroundColor: theme.colors.blue[0],
2383
+ },
2384
+ }));
2304
2385
  function ResourceTimeline(props) {
2305
2386
  const navigate = reactRouterDom.useNavigate();
2306
2387
  const medplum = useMedplum();
@@ -2389,10 +2470,23 @@
2389
2470
  }
2390
2471
  medplum
2391
2472
  .createResource(props.createMedia(resource, sender, attachment))
2392
- .then((result) => {
2393
- addResources([result]);
2394
- })
2395
- .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
+ }));
2396
2490
  }
2397
2491
  function setPriority(communication, priority) {
2398
2492
  return medplum.updateResource(Object.assign(Object.assign({}, communication), { priority }));
@@ -2416,70 +2510,89 @@
2416
2510
  var _a;
2417
2511
  navigate(`/${version.resourceType}/${version.id}/_history/${(_a = version.meta) === null || _a === void 0 ? void 0 : _a.versionId}`);
2418
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
+ }
2419
2533
  if (!resource || !history) {
2420
- return React__default["default"].createElement(core$1.Loader, null);
2421
- }
2422
- return (React__default["default"].createElement(Timeline, null,
2423
- props.createCommunication && (React__default["default"].createElement("article", { className: "medplum-timeline-item" },
2424
- React__default["default"].createElement("div", { className: "medplum-timeline-item-header" },
2425
- React__default["default"].createElement(Form, { testid: "timeline-form", onSubmit: (formData) => {
2426
- createComment(formData.text);
2427
- const input = inputRef.current;
2428
- if (input) {
2429
- input.value = '';
2430
- input.focus();
2431
- }
2432
- } },
2433
- React__default["default"].createElement(core$1.Group, { spacing: "xs", noWrap: true, style: { width: '100%' } },
2434
- React__default["default"].createElement(ResourceAvatar, { value: sender }),
2435
- React__default["default"].createElement(core$1.TextInput, { name: "text", ref: inputRef, placeholder: "Add comment", style: { width: '100%', maxWidth: 300 } }),
2436
- React__default["default"].createElement(core$1.ActionIcon, { type: "submit", radius: "xl", color: "blue", variant: "filled" },
2437
- React__default["default"].createElement(icons.IconMessage, { size: 16 })),
2438
- React__default["default"].createElement(AttachmentButton, { onUpload: createMedia }, (props) => (React__default["default"].createElement(core$1.ActionIcon, Object.assign({}, props, { radius: "xl", color: "blue", variant: "filled" }),
2439
- 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 })))))))),
2440
2553
  items.map((item) => {
2441
2554
  var _a;
2442
2555
  if (item.resourceType === resource.resourceType && item.id === resource.id) {
2443
- 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 }));
2444
2557
  }
2445
2558
  const key = `${item.resourceType}/${item.id}`;
2446
2559
  switch (item.resourceType) {
2447
2560
  case 'AuditEvent':
2448
- return React__default["default"].createElement(AuditEventTimelineItem, { key: key, resource: item, onDetails: onDetails });
2561
+ return React.createElement(AuditEventTimelineItem, { key: key, resource: item, onDetails: onDetails });
2449
2562
  case 'Communication':
2450
- 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 }));
2451
2564
  case 'DiagnosticReport':
2452
- 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 }));
2453
2566
  case 'Media':
2454
- 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 }));
2455
2568
  default:
2456
- return (React__default["default"].createElement(TimelineItem, { key: key, resource: item, padding: true },
2457
- 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 })));
2458
2571
  }
2459
2572
  })));
2460
2573
  }
2461
2574
  function TimelineItemPopupMenu(props) {
2462
- return (React__default["default"].createElement(core$1.Menu.Dropdown, null,
2463
- React__default["default"].createElement(core$1.Menu.Label, null, "Resource"),
2464
- 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")),
2465
- 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")),
2466
- 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")),
2467
- 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")),
2468
- props.onDelete && (React__default["default"].createElement(React__default["default"].Fragment, null,
2469
- React__default["default"].createElement(core$1.Menu.Divider, null),
2470
- React__default["default"].createElement(core$1.Menu.Label, null, "Danger zone"),
2471
- 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")))));
2472
2585
  }
2473
2586
  function HistoryTimelineItem(props) {
2474
2587
  const previous = getPrevious(props.history, props.resource);
2475
2588
  if (previous) {
2476
- return (React__default["default"].createElement(TimelineItem, { resource: props.resource, padding: true, popupMenuItems: React__default["default"].createElement(TimelineItemPopupMenu, Object.assign({}, props)) },
2477
- 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 })));
2478
2591
  }
2479
2592
  else {
2480
- return (React__default["default"].createElement(TimelineItem, { resource: props.resource, padding: true, popupMenuItems: React__default["default"].createElement(TimelineItemPopupMenu, Object.assign({}, props)) },
2481
- React__default["default"].createElement("h3", null, "Created"),
2482
- 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 })));
2483
2596
  }
2484
2597
  }
2485
2598
  function getPrevious(history, version) {
@@ -2492,10 +2605,11 @@
2492
2605
  }
2493
2606
  function CommunicationTimelineItem(props) {
2494
2607
  var _a, _b;
2608
+ const { classes } = useStyles$7();
2495
2609
  const routine = !props.resource.priority || props.resource.priority === 'routine';
2496
- const className = routine ? 'medplum-timeline-item' : 'medplum-timeline-item medplum-timeline-item-pinned';
2497
- 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)) },
2498
- 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)));
2499
2613
  }
2500
2614
  function MediaTimelineItem(props) {
2501
2615
  var _a;
@@ -2504,21 +2618,35 @@
2504
2618
  !contentType.startsWith('image/') &&
2505
2619
  !contentType.startsWith('video/') &&
2506
2620
  contentType !== 'application/pdf';
2507
- return (React__default["default"].createElement(TimelineItem, { resource: props.resource, padding: !!padding, popupMenuItems: React__default["default"].createElement(TimelineItemPopupMenu, Object.assign({}, props)) },
2508
- 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 })));
2509
2623
  }
2510
2624
  function AuditEventTimelineItem(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(core$1.ScrollArea, null,
2513
- 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))));
2514
2628
  }
2515
2629
  function DiagnosticReportTimelineItem(props) {
2516
- return (React__default["default"].createElement(TimelineItem, { resource: props.resource, padding: true, popupMenuItems: React__default["default"].createElement(TimelineItemPopupMenu, Object.assign({}, props)) },
2517
- 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';
2518
2646
  }
2519
2647
 
2520
2648
  function DefaultResourceTimeline(props) {
2521
- return (React__default["default"].createElement(ResourceTimeline, { value: props.resource, buildSearchRequests: (resource) => ({
2649
+ return (React.createElement(ResourceTimeline, { value: props.resource, buildSearchRequests: (resource) => ({
2522
2650
  resourceType: 'Bundle',
2523
2651
  type: 'batch',
2524
2652
  entry: [
@@ -2539,7 +2667,7 @@
2539
2667
  }
2540
2668
 
2541
2669
  function EncounterTimeline(props) {
2542
- return (React__default["default"].createElement(ResourceTimeline, { value: props.encounter, buildSearchRequests: (resource) => ({
2670
+ return (React.createElement(ResourceTimeline, { value: props.encounter, buildSearchRequests: (resource) => ({
2543
2671
  resourceType: 'Bundle',
2544
2672
  type: 'batch',
2545
2673
  entry: [
@@ -2595,7 +2723,7 @@
2595
2723
  Received ${value.length} elements \
2596
2724
  [${JSON.stringify(value, null, 2)}]`);
2597
2725
  }
2598
- return React__default["default"].createElement(ResourcePropertyDisplay, { value: value[0] || '', propertyType: props.propertyType });
2726
+ return React.createElement(ResourcePropertyDisplay, { value: value[0] || '', propertyType: props.propertyType });
2599
2727
  }
2600
2728
 
2601
2729
  /**
@@ -3150,7 +3278,7 @@
3150
3278
  if (!value) {
3151
3279
  return null;
3152
3280
  }
3153
- 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 }));
3154
3282
  }
3155
3283
  /**
3156
3284
  * Returns a fragment to be displayed in the search table for a search parameter.
@@ -3165,9 +3293,9 @@
3165
3293
  return null;
3166
3294
  }
3167
3295
  if (elementDefinition) {
3168
- 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 }));
3169
3297
  }
3170
- 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)))));
3171
3299
  }
3172
3300
 
3173
3301
  function SearchFieldEditor(props) {
@@ -3301,30 +3429,30 @@
3301
3429
  const available = getFieldsList(typeDef)
3302
3430
  .filter((field) => !(selected === null || selected === void 0 ? void 0 : selected.includes(field)))
3303
3431
  .sort();
3304
- return (React__default["default"].createElement(core$1.Modal, { title: "Fields", closeButtonLabel: "Close", opened: props.visible, onClose: props.onCancel },
3305
- React__default["default"].createElement("div", null,
3306
- React__default["default"].createElement("table", { style: { margin: 'auto' } },
3307
- React__default["default"].createElement("thead", null,
3308
- React__default["default"].createElement("tr", null,
3309
- React__default["default"].createElement("th", { colSpan: 2, align: "center" }, "Available"),
3310
- React__default["default"].createElement("th", { colSpan: 2, align: "center" }, "Selected"))),
3311
- React__default["default"].createElement("tbody", null,
3312
- React__default["default"].createElement("tr", null,
3313
- React__default["default"].createElement("td", { colSpan: 2, align: "center" },
3314
- 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)))))),
3315
- React__default["default"].createElement("td", { colSpan: 2, align: "center" },
3316
- 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)))))))),
3317
- React__default["default"].createElement("tfoot", null,
3318
- React__default["default"].createElement("tr", null,
3319
- React__default["default"].createElement("td", { align: "center" },
3320
- React__default["default"].createElement(core$1.Button, { compact: true, variant: "outline", onClick: onAddField }, "Add")),
3321
- React__default["default"].createElement("td", { align: "center" },
3322
- React__default["default"].createElement(core$1.Button, { compact: true, variant: "outline", onClick: onRemoveField }, "Remove")),
3323
- React__default["default"].createElement("td", { align: "center" },
3324
- React__default["default"].createElement(core$1.Button, { compact: true, variant: "outline", onClick: onMoveUp }, "Up")),
3325
- React__default["default"].createElement("td", { align: "center" },
3326
- React__default["default"].createElement(core$1.Button, { compact: true, variant: "outline", onClick: onMoveDown }, "Down")))))),
3327
- 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")));
3328
3456
  }
3329
3457
  /**
3330
3458
  * Returns a list of fields/columns available for a type.
@@ -3361,14 +3489,14 @@
3361
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];
3362
3490
  if (searchParam) {
3363
3491
  if (searchParam.type === 'reference') {
3364
- return React__default["default"].createElement(ResourceName, { value: { reference: filter.value } });
3492
+ return React.createElement(ResourceName, { value: { reference: filter.value } });
3365
3493
  }
3366
3494
  const searchParamDetails = core.getSearchParameterDetails(resourceType, searchParam);
3367
3495
  if (filter.code === '_lastUpdated' || searchParamDetails.type === core.SearchParameterType.DATETIME) {
3368
- 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));
3369
3497
  }
3370
3498
  }
3371
- return React__default["default"].createElement(React__default["default"].Fragment, null, filter.value);
3499
+ return React.createElement(React.Fragment, null, filter.value);
3372
3500
  }
3373
3501
 
3374
3502
  function SearchFilterValueInput(props) {
@@ -3377,7 +3505,7 @@
3377
3505
  const name = 'filter-value';
3378
3506
  switch (details.type) {
3379
3507
  case core.SearchParameterType.REFERENCE:
3380
- 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) => {
3381
3509
  if (newReference) {
3382
3510
  props.onChange(newReference.reference);
3383
3511
  }
@@ -3386,15 +3514,15 @@
3386
3514
  }
3387
3515
  } }));
3388
3516
  case core.SearchParameterType.BOOLEAN:
3389
- 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()) }));
3390
3518
  case core.SearchParameterType.DATE:
3391
- 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) }));
3392
3520
  case core.SearchParameterType.DATETIME:
3393
- 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 });
3394
3522
  case core.SearchParameterType.NUMBER:
3395
- 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) }));
3396
3524
  case core.SearchParameterType.QUANTITY:
3397
- 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) => {
3398
3526
  if (newQuantity) {
3399
3527
  props.onChange(`${newQuantity.value}`);
3400
3528
  }
@@ -3403,7 +3531,7 @@
3403
3531
  }
3404
3532
  } }));
3405
3533
  default:
3406
- 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" }));
3407
3535
  }
3408
3536
  }
3409
3537
  function tryParseQuantity(value) {
@@ -3437,24 +3565,24 @@
3437
3565
  const resourceType = props.search.resourceType;
3438
3566
  const searchParams = core.globalSchema.types[resourceType].searchParams;
3439
3567
  const filters = search.filters || [];
3440
- return (React__default["default"].createElement(core$1.Modal, { title: "Filters", closeButtonLabel: "Close", size: 900, opened: props.visible, onClose: props.onCancel },
3441
- React__default["default"].createElement("div", { className: "medplum-filter-editor" },
3442
- React__default["default"].createElement("table", { className: "medplum-filter-editor-table" },
3443
- React__default["default"].createElement("colgroup", null,
3444
- React__default["default"].createElement("col", { style: { width: 200 } }),
3445
- React__default["default"].createElement("col", { style: { width: 200 } }),
3446
- React__default["default"].createElement("col", { style: { width: 380 } }),
3447
- React__default["default"].createElement("col", { style: { width: 120 } })),
3448
- React__default["default"].createElement("thead", null,
3449
- React__default["default"].createElement("tr", null,
3450
- React__default["default"].createElement("th", null, "Field"),
3451
- React__default["default"].createElement("th", null, "Operation"),
3452
- React__default["default"].createElement("th", null, "Value"),
3453
- React__default["default"].createElement("th", null, "Actions"))),
3454
- 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,
3455
3583
  filters.map((filter, index) => {
3456
3584
  if (index === editingIndex) {
3457
- 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) => {
3458
3586
  const newFilters = [...filters];
3459
3587
  newFilters[index] = newFilter;
3460
3588
  setSearch(setFilters(searchRef.current, newFilters));
@@ -3462,23 +3590,23 @@
3462
3590
  }, onCancel: () => setEditingIndex(-1) }));
3463
3591
  }
3464
3592
  else {
3465
- 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)) }));
3466
3594
  }
3467
3595
  }),
3468
- React__default["default"].createElement(FilterRowInput, { resourceType: resourceType, searchParams: searchParams, okText: "Add", onOk: onAddFilter })))),
3469
- React__default["default"].createElement(core$1.Group, { position: "right", mt: "xl" },
3470
- 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"))));
3471
3599
  }
3472
3600
  function FilterRowDisplay(props) {
3473
3601
  const { filter } = props;
3474
- return (React__default["default"].createElement("tr", null,
3475
- React__default["default"].createElement("td", null, buildFieldNameString(filter.code)),
3476
- React__default["default"].createElement("td", null, getOpString(filter.operator)),
3477
- React__default["default"].createElement("td", null,
3478
- React__default["default"].createElement(SearchFilterValueDisplay, { resourceType: props.resourceType, filter: filter })),
3479
- React__default["default"].createElement("td", null,
3480
- React__default["default"].createElement(core$1.Button, { compact: true, variant: "outline", onClick: props.onEdit }, "Edit"),
3481
- 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"))));
3482
3610
  }
3483
3611
  function FilterRowInput(props) {
3484
3612
  var _a;
@@ -3496,17 +3624,17 @@
3496
3624
  }
3497
3625
  const searchParam = props.searchParams[value.code];
3498
3626
  const operators = searchParam && getSearchOperators(searchParam);
3499
- return (React__default["default"].createElement("tr", null,
3500
- React__default["default"].createElement("td", null,
3501
- 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) })) })),
3502
- 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) }))] }))),
3503
- React__default["default"].createElement("td", null, searchParam && value.operator && (React__default["default"].createElement(SearchFilterValueInput, { resourceType: props.resourceType, searchParam: searchParam, defaultValue: value.value, onChange: setFilterValue }))),
3504
- React__default["default"].createElement("td", null,
3505
- 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: () => {
3506
3634
  props.onOk(valueRef.current);
3507
3635
  setValue({});
3508
3636
  } }, props.okText)),
3509
- 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")))));
3510
3638
  }
3511
3639
 
3512
3640
  function SearchFilterValueDialog(props) {
@@ -3518,11 +3646,11 @@
3518
3646
  function onOk() {
3519
3647
  props.onOk(Object.assign(Object.assign({}, props.filter), { value }));
3520
3648
  }
3521
- return (React__default["default"].createElement(core$1.Modal, { title: props.title, size: "xl", opened: props.visible, onClose: props.onCancel },
3522
- React__default["default"].createElement("div", { style: { width: 500 } },
3523
- React__default["default"].createElement(Form, { onSubmit: onOk },
3524
- React__default["default"].createElement(SearchFilterValueInput, { resourceType: props.resourceType, searchParam: props.searchParam, defaultValue: value, autoFocus: true, onChange: setValue }))),
3525
- 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")));
3526
3654
  }
3527
3655
 
3528
3656
  function SearchPopupMenu(props) {
@@ -3543,26 +3671,26 @@
3543
3671
  }
3544
3672
  // If there is only one search parameter, then show it directly
3545
3673
  if (props.searchParams.length === 1) {
3546
- 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 }));
3547
3675
  }
3548
3676
  // Otherwise, show a menu, with each search parameter as a sub menu
3549
- 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))))));
3550
3678
  }
3551
3679
  function SearchParameterSubMenu(props) {
3552
3680
  switch (props.searchParam.type) {
3553
3681
  case 'date':
3554
- return React__default["default"].createElement(DateFilterSubMenu, Object.assign({}, props));
3682
+ return React.createElement(DateFilterSubMenu, Object.assign({}, props));
3555
3683
  case 'number':
3556
3684
  case 'quantity':
3557
- return React__default["default"].createElement(NumericFilterSubMenu, Object.assign({}, props));
3685
+ return React.createElement(NumericFilterSubMenu, Object.assign({}, props));
3558
3686
  case 'reference':
3559
- return React__default["default"].createElement(ReferenceFilterSubMenu, Object.assign({}, props));
3687
+ return React.createElement(ReferenceFilterSubMenu, Object.assign({}, props));
3560
3688
  case 'string':
3561
3689
  case 'token':
3562
3690
  case 'uri':
3563
- return React__default["default"].createElement(TextFilterSubMenu, Object.assign({}, props));
3691
+ return React.createElement(TextFilterSubMenu, Object.assign({}, props));
3564
3692
  default:
3565
- return React__default["default"].createElement(React__default["default"].Fragment, null,
3693
+ return React.createElement(React.Fragment, null,
3566
3694
  "Unknown search param type: ",
3567
3695
  props.searchParam.type);
3568
3696
  }
@@ -3570,72 +3698,72 @@
3570
3698
  function DateFilterSubMenu(props) {
3571
3699
  const { searchParam } = props;
3572
3700
  const code = searchParam.code;
3573
- return (React__default["default"].createElement(core$1.Menu.Dropdown, null,
3574
- 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"),
3575
- 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"),
3576
- React__default["default"].createElement(core$1.Menu.Divider, null),
3577
- 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..."),
3578
- 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..."),
3579
- React__default["default"].createElement(core$1.Menu.Divider, null),
3580
- 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..."),
3581
- 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..."),
3582
- 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..."),
3583
- React__default["default"].createElement(core$1.Menu.Divider, null),
3584
- 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"),
3585
- 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"),
3586
- 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"),
3587
- React__default["default"].createElement(core$1.Menu.Divider, null),
3588
- 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"),
3589
- 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"),
3590
- 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"),
3591
- React__default["default"].createElement(core$1.Menu.Divider, null),
3592
- 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"),
3593
- 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))));
3594
3722
  }
3595
3723
  function NumericFilterSubMenu(props) {
3596
3724
  const { searchParam } = props;
3597
- return (React__default["default"].createElement(core$1.Menu.Dropdown, null,
3598
- 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"),
3599
- 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"),
3600
- React__default["default"].createElement(core$1.Menu.Divider, null),
3601
- 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..."),
3602
- 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..."),
3603
- React__default["default"].createElement(core$1.Menu.Divider, null),
3604
- 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..."),
3605
- 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..."),
3606
- 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..."),
3607
- 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..."),
3608
- 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))));
3609
3737
  }
3610
3738
  function ReferenceFilterSubMenu(props) {
3611
3739
  const { searchParam } = props;
3612
- return (React__default["default"].createElement(core$1.Menu.Dropdown, null,
3613
- 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..."),
3614
- 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..."),
3615
- 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))));
3616
3744
  }
3617
3745
  function TextFilterSubMenu(props) {
3618
3746
  const { searchParam } = props;
3619
- return (React__default["default"].createElement(core$1.Menu.Dropdown, null,
3620
- 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"),
3621
- 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"),
3622
- React__default["default"].createElement(core$1.Menu.Divider, null),
3623
- 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..."),
3624
- 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..."),
3625
- React__default["default"].createElement(core$1.Menu.Divider, null),
3626
- 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..."),
3627
- 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..."),
3628
- 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))));
3629
3757
  }
3630
3758
  function CommonMenuItems(props) {
3631
3759
  const { searchParam } = props;
3632
3760
  const code = searchParam.code;
3633
- return (React__default["default"].createElement(React__default["default"].Fragment, null,
3634
- React__default["default"].createElement(core$1.Menu.Divider, null),
3635
- 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"),
3636
- 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"),
3637
- React__default["default"].createElement(core$1.Menu.Divider, null),
3638
- 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")));
3639
3767
  }
3640
3768
 
3641
3769
  class SearchChangeEvent extends Event {
@@ -3657,7 +3785,21 @@
3657
3785
  this.browserEvent = browserEvent;
3658
3786
  }
3659
3787
  }
3660
- 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
+ },
3661
3803
  th: {
3662
3804
  padding: '0 !important',
3663
3805
  },
@@ -3681,7 +3823,7 @@
3681
3823
  */
3682
3824
  function SearchControl(props) {
3683
3825
  var _a, _b;
3684
- const { classes } = useStyles();
3826
+ const { classes } = useStyles$6();
3685
3827
  const medplum = useMedplum();
3686
3828
  const [schemaLoaded, setSchemaLoaded] = React.useState(false);
3687
3829
  const [outcome, setOutcome] = React.useState();
@@ -3793,7 +3935,7 @@
3793
3935
  }, [medplum, props.search.resourceType]);
3794
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]);
3795
3937
  if (!typeSchema) {
3796
- return React__default["default"].createElement(core$1.Loader, null);
3938
+ return React.createElement(core$1.Loader, null);
3797
3939
  }
3798
3940
  const checkboxColumn = props.checkboxesEnabled;
3799
3941
  const fields = getFieldDefinitions(search);
@@ -3805,51 +3947,52 @@
3805
3947
  const buttonColor = 'gray';
3806
3948
  const iconSize = 16;
3807
3949
  const isMobile = window.innerWidth < 768;
3808
- return (React__default["default"].createElement("div", { className: "medplum-search-control", "data-testid": "search-control" },
3809
- !props.hideToolbar && (React__default["default"].createElement(core$1.Group, { position: "apart", mb: "xl" },
3810
- React__default["default"].createElement(core$1.Group, { spacing: 2 },
3811
- 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"),
3812
- 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"),
3813
- 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...")),
3814
- !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...")),
3815
- !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...")),
3816
- !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..."))),
3817
- lastResult && (React__default["default"].createElement(core$1.Group, { spacing: 2 },
3818
- React__default["default"].createElement("span", { className: "medplum-search-summary" },
3819
- getStart$1(search, lastResult.total),
3820
- "-",
3821
- getEnd$1(search, lastResult.total),
3822
- " of",
3823
- ' ', (_b = lastResult.total) === null || _b === void 0 ? void 0 :
3824
- _b.toLocaleString()))))),
3825
- React__default["default"].createElement(core$1.Table, null,
3826
- React__default["default"].createElement("thead", null,
3827
- React__default["default"].createElement("tr", null,
3828
- checkboxColumn && (React__default["default"].createElement("th", { className: "medplum-search-icon-cell" },
3829
- React__default["default"].createElement("input", { type: "checkbox", value: "checked", "aria-label": "all-checkbox", "data-testid": "all-checkbox", checked: isAllSelected(), onChange: (e) => handleAllCheckboxClick(e) }))),
3830
- fields.map((field) => (React__default["default"].createElement("th", { key: field.name },
3831
- React__default["default"].createElement(core$1.Menu, { shadow: "md", width: 240, position: "bottom-end" },
3832
- React__default["default"].createElement(core$1.Menu.Target, null,
3833
- React__default["default"].createElement(core$1.UnstyledButton, { className: classes.control },
3834
- React__default["default"].createElement(core$1.Group, { position: "apart", noWrap: true },
3835
- React__default["default"].createElement(core$1.Text, { weight: 500, size: "sm" }, buildFieldNameString(field.name)),
3836
- React__default["default"].createElement(core$1.Center, { className: classes.icon },
3837
- React__default["default"].createElement(icons.IconAdjustmentsHorizontal, { size: 14, stroke: 1.5 }))))),
3838
- 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) => {
3839
3980
  setState(Object.assign(Object.assign({}, stateRef.current), { filterDialogVisible: true, filterDialogSearchParam: searchParam, filterDialogFilter: filter }));
3840
3981
  }, onChange: (result) => {
3841
3982
  emitSearchChange(result);
3842
3983
  } })))))),
3843
- !props.hideFilters && (React__default["default"].createElement("tr", null,
3844
- checkboxColumn && React__default["default"].createElement("th", { className: "filters medplum-search-icon-cell" }),
3845
- 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 })))))))),
3846
- 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) },
3847
- checkboxColumn && (React__default["default"].createElement("td", { className: "medplum-search-icon-cell" },
3848
- 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) }))),
3849
- fields.map((field) => (React__default["default"].createElement("td", { key: field.name }, renderValue(resource, field))))))))),
3850
- (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")),
3851
- (lastResult === null || lastResult === void 0 ? void 0 : lastResult.total) !== undefined && lastResult.total > 0 && (React__default["default"].createElement(core$1.Center, { m: "md", p: "md" },
3852
- 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) => {
3853
3996
  switch (page) {
3854
3997
  case 'prev':
3855
3998
  return 'Previous page';
@@ -3859,38 +4002,38 @@
3859
4002
  return undefined;
3860
4003
  }
3861
4004
  } }))),
3862
- outcome && (React__default["default"].createElement("div", { "data-testid": "search-error", className: "medplum-empty-search" },
3863
- React__default["default"].createElement("pre", { style: { textAlign: 'left' } }, JSON.stringify(outcome, undefined, 2)))),
3864
- 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) => {
3865
4008
  emitSearchChange(result);
3866
4009
  setState(Object.assign(Object.assign({}, stateRef.current), { fieldEditorVisible: false }));
3867
4010
  }, onCancel: () => {
3868
4011
  setState(Object.assign(Object.assign({}, stateRef.current), { fieldEditorVisible: false }));
3869
4012
  } }),
3870
- 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) => {
3871
4014
  emitSearchChange(result);
3872
4015
  setState(Object.assign(Object.assign({}, stateRef.current), { filterEditorVisible: false }));
3873
4016
  }, onCancel: () => {
3874
4017
  setState(Object.assign(Object.assign({}, stateRef.current), { filterEditorVisible: false }));
3875
4018
  } }),
3876
- 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) => {
3877
4020
  emitSearchChange(addFilter(props.search, filter.code, filter.operator, filter.value));
3878
4021
  setState(Object.assign(Object.assign({}, stateRef.current), { filterDialogVisible: false }));
3879
4022
  }, onCancel: () => {
3880
4023
  setState(Object.assign(Object.assign({}, stateRef.current), { filterDialogVisible: false }));
3881
4024
  } })));
3882
4025
  }
3883
- const MemoizedSearchControl = React__default["default"].memo(SearchControl);
4026
+ const MemoizedSearchControl = React.memo(SearchControl);
3884
4027
  function FilterDescription(props) {
3885
4028
  var _a;
3886
4029
  const filters = ((_a = props.filters) !== null && _a !== void 0 ? _a : []).filter((f) => props.searchParams.find((p) => p.code === f.code));
3887
4030
  if (filters.length === 0) {
3888
- return React__default["default"].createElement("span", null, "no filters");
4031
+ return React.createElement("span", null, "no filters");
3889
4032
  }
3890
- 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}` },
3891
4034
  getOpString(filter.operator),
3892
4035
  "\u00A0",
3893
- React__default["default"].createElement(SearchFilterValueDisplay, { resourceType: props.resourceType, filter: filter }))))));
4036
+ React.createElement(SearchFilterValueDisplay, { resourceType: props.resourceType, filter: filter }))))));
3894
4037
  }
3895
4038
  function getPage(search) {
3896
4039
  return Math.floor((search.offset || 0) / (search.count || core.DEFAULT_SEARCH_COUNT)) + 1;
@@ -3994,29 +4137,29 @@
3994
4137
  }, [medplum, props.resourceType]);
3995
4138
  const typeSchema = (_a = schema === null || schema === void 0 ? void 0 : schema.types) === null || _a === void 0 ? void 0 : _a[props.resourceType];
3996
4139
  if (!typeSchema) {
3997
- return React__default["default"].createElement(core$1.Loader, null);
4140
+ return React.createElement(core$1.Loader, null);
3998
4141
  }
3999
4142
  const checkboxColumn = props.checkboxesEnabled;
4000
- return (React__default["default"].createElement("div", { className: "medplum-search-control", onContextMenu: (e) => killEvent(e), "data-testid": "search-control" },
4001
- React__default["default"].createElement(core$1.Table, null,
4002
- React__default["default"].createElement("thead", null,
4003
- React__default["default"].createElement("tr", null,
4004
- checkboxColumn && (React__default["default"].createElement("th", { className: "medplum-search-icon-cell" },
4005
- React__default["default"].createElement("input", { type: "checkbox", value: "checked", "aria-label": "all-checkbox", "data-testid": "all-checkbox", checked: isAllSelected(), onChange: (e) => handleAllCheckboxClick(e) }))),
4006
- fields.map((field) => (React__default["default"].createElement("th", { key: field.name }, field.name))))),
4007
- 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) },
4008
- checkboxColumn && (React__default["default"].createElement("td", { className: "medplum-search-icon-cell" },
4009
- 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) }))),
4010
4153
  fields.map((field) => {
4011
- return (React__default["default"].createElement("td", { key: field.name },
4012
- 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 })));
4013
4156
  })))))),
4014
- ((_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")),
4015
- outcome && (React__default["default"].createElement("div", { "data-testid": "search-error", className: "medplum-empty-search" },
4016
- React__default["default"].createElement("pre", { style: { textAlign: 'left' } }, JSON.stringify(outcome, undefined, 2)))),
4017
- 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..."))));
4018
4161
  }
4019
- const MemoizedFhirPathTable = React__default["default"].memo(FhirPathTable);
4162
+ const MemoizedFhirPathTable = React.memo(FhirPathTable);
4020
4163
 
4021
4164
  const searches = [
4022
4165
  '$/_history',
@@ -4028,7 +4171,7 @@
4028
4171
  'ServiceRequest?subject=$',
4029
4172
  ];
4030
4173
  function PatientTimeline(props) {
4031
- return (React__default["default"].createElement(ResourceTimeline, { value: props.patient, buildSearchRequests: (resource) => ({
4174
+ return (React.createElement(ResourceTimeline, { value: props.patient, buildSearchRequests: (resource) => ({
4032
4175
  resourceType: 'Bundle',
4033
4176
  type: 'batch',
4034
4177
  entry: searches.map((search) => ({
@@ -4054,6 +4197,32 @@
4054
4197
  }) }));
4055
4198
  }
4056
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
+ }));
4057
4226
  function PlanDefinitionBuilder(props) {
4058
4227
  const medplum = useMedplum();
4059
4228
  const defaultValue = useResource(props.value);
@@ -4087,13 +4256,14 @@
4087
4256
  function changeProperty(property, newValue) {
4088
4257
  setValue(Object.assign(Object.assign({}, valueRef.current), { [property]: newValue }));
4089
4258
  }
4090
- return (React__default["default"].createElement("div", { className: "medplum-questionnaire-builder" },
4091
- React__default["default"].createElement(Form, { testid: "questionnaire-form", onSubmit: () => props.onSubmit(value) },
4092
- React__default["default"].createElement(core$1.TextInput, { label: "Plan Title", defaultValue: value.title, onChange: (e) => changeProperty('title', e.currentTarget.value) }),
4093
- React__default["default"].createElement(ActionArrayBuilder, { actions: value.action || [], selectedKey: selectedKey, setSelectedKey: setSelectedKey, hoverKey: hoverKey, setHoverKey: setHoverKey, onChange: (x) => changeProperty('action', x) }),
4094
- 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"))));
4095
4264
  }
4096
4265
  function ActionArrayBuilder(props) {
4266
+ const { classes } = useStyles$5();
4097
4267
  const actionsRef = React.useRef();
4098
4268
  actionsRef.current = props.actions;
4099
4269
  function changeAction(changedAction) {
@@ -4106,16 +4276,17 @@
4106
4276
  function removeAction(removedAction) {
4107
4277
  props.onChange(actionsRef.current.filter((i) => i !== removedAction));
4108
4278
  }
4109
- return (React__default["default"].createElement("div", { className: "section" },
4110
- props.actions.map((action) => (React__default["default"].createElement("div", { key: action.id },
4111
- React__default["default"].createElement(ActionBuilder, { action: action, selectedKey: props.selectedKey, setSelectedKey: props.setSelectedKey, hoverKey: props.hoverKey, setHoverKey: props.setHoverKey, onChange: changeAction, onRemove: () => removeAction(action) })))),
4112
- React__default["default"].createElement("div", { className: "bottom-actions" },
4113
- 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) => {
4114
4284
  killEvent(e);
4115
4285
  addAction({ id: generateId$1() });
4116
4286
  } }, "Add action"))));
4117
4287
  }
4118
4288
  function ActionBuilder(props) {
4289
+ const { classes, cx } = useStyles$5();
4119
4290
  const { action } = props;
4120
4291
  const actionType = getInitialActionType(action);
4121
4292
  const editing = props.selectedKey === props.action.id;
@@ -4128,11 +4299,14 @@
4128
4299
  killEvent(e);
4129
4300
  props.setHoverKey(props.action.id);
4130
4301
  }
4131
- const className = editing ? 'section editing' : hovering ? 'section hovering' : 'section';
4132
- return (React__default["default"].createElement("div", { "data-testid": action.id, className: className, onClick: onClick, onMouseOver: onHover },
4133
- 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 })),
4134
- React__default["default"].createElement("div", { className: "bottom-actions" },
4135
- 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) => {
4136
4310
  e.preventDefault();
4137
4311
  props.onRemove();
4138
4312
  } }, "Remove"))));
@@ -4146,15 +4320,15 @@
4146
4320
  function ActionDisplay(props) {
4147
4321
  const { action, actionType } = props;
4148
4322
  const [propertyValue, propertyType] = getActionTiming(action);
4149
- return (React__default["default"].createElement("div", null,
4150
- React__default["default"].createElement("div", null,
4323
+ return (React.createElement("div", null,
4324
+ React.createElement("div", null,
4151
4325
  action.title || 'Untitled',
4152
4326
  " ",
4153
4327
  actionType && `(${actionType})`),
4154
- action.definitionCanonical && (React__default["default"].createElement("div", null,
4155
- React__default["default"].createElement(ReferenceDisplay, { value: { reference: action.definitionCanonical } }))),
4156
- propertyValue && (React__default["default"].createElement("div", null,
4157
- 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 })))));
4158
4332
  }
4159
4333
  function ActionEditor(props) {
4160
4334
  const { action } = props;
@@ -4162,35 +4336,34 @@
4162
4336
  function changeProperty(property, value) {
4163
4337
  props.onChange(Object.assign(Object.assign({}, action), { [property]: value }));
4164
4338
  }
4165
- return (React__default["default"].createElement(React__default["default"].Fragment, null,
4166
- React__default["default"].createElement(core$1.TextInput, { name: `actionTitle-${action.id}`, label: "Title", defaultValue: action.title, onChange: (e) => changeProperty('title', e.currentTarget.value) }),
4167
- React__default["default"].createElement(core$1.TextInput, { name: `actionDescription-${action.id}`, label: "Description", defaultValue: action.description, onChange: (e) => changeProperty('description', e.currentTarget.value) }),
4168
- 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'] }),
4169
- 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) })),
4170
4344
  (() => {
4171
4345
  switch (actionType) {
4172
4346
  case 'appointment':
4173
- 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 }));
4174
4348
  case 'lab':
4175
- 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 }));
4176
4350
  case 'questionnaire':
4177
- 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 }));
4178
4352
  case 'task':
4179
- 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 }));
4180
4354
  default:
4181
4355
  return null;
4182
4356
  }
4183
4357
  })(),
4184
- React__default["default"].createElement("p", null, "Timing"),
4185
- React__default["default"].createElement("p", null, "When the action should take place."),
4186
- 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 }))));
4187
4360
  }
4188
4361
  function ActionResourceTypeBuilder(props) {
4189
4362
  const { id, definitionCanonical } = props.action;
4190
4363
  const reference = (definitionCanonical === null || definitionCanonical === void 0 ? void 0 : definitionCanonical.startsWith(props.resourceType + '/'))
4191
4364
  ? { reference: definitionCanonical }
4192
4365
  : undefined;
4193
- 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) => {
4194
4367
  if (newValue) {
4195
4368
  props.onChange(Object.assign(Object.assign({}, props.action), { definitionCanonical: core.getReferenceString(newValue) }));
4196
4369
  }
@@ -4203,7 +4376,7 @@
4203
4376
  const value = props.action;
4204
4377
  const key = 'timing';
4205
4378
  const [propertyValue, propertyType] = getActionTiming(value);
4206
- 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) => {
4207
4380
  props.onChange(setPropertyValue(value, key, propName !== null && propName !== void 0 ? propName : key, timingProperty, newValue));
4208
4381
  } }));
4209
4382
  }
@@ -4305,14 +4478,15 @@
4305
4478
  if (!schema || !questionnaire) {
4306
4479
  return null;
4307
4480
  }
4308
- return (React__default["default"].createElement(Form, { testid: "questionnaire-form", onSubmit: () => {
4481
+ return (React.createElement(Form, { testid: "questionnaire-form", onSubmit: () => {
4309
4482
  if (props.onSubmit && response) {
4310
4483
  props.onSubmit(Object.assign(Object.assign({}, response), { questionnaire: core.getReferenceString(questionnaire), subject: props.subject, source: core.createReference(source), authored: new Date().toISOString() }));
4311
4484
  }
4312
4485
  } },
4313
- questionnaire.title && React__default["default"].createElement("h1", null, questionnaire.title),
4314
- questionnaire.item && (React__default["default"].createElement(QuestionnaireFormItemArray, { items: questionnaire.item, answers: answers, onChange: setItems })),
4315
- 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'))));
4316
4490
  }
4317
4491
  function QuestionnaireFormItemArray(props) {
4318
4492
  const [responseItems, setResponseItems] = React.useState(buildInitialResponseItems(props.items));
@@ -4322,27 +4496,27 @@
4322
4496
  setResponseItems(newResponseItems);
4323
4497
  props.onChange(newResponseItems);
4324
4498
  }
4325
- 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) => {
4326
4500
  if (!isQuestionEnabled(item, props.answers)) {
4327
4501
  return null;
4328
4502
  }
4329
4503
  if (item.type === exports.QuestionnaireItemType.display) {
4330
- return React__default["default"].createElement("p", { key: item.linkId }, item.text);
4504
+ return React.createElement("p", { key: item.linkId }, item.text);
4331
4505
  }
4332
4506
  if (item.type === exports.QuestionnaireItemType.group) {
4333
- 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) }));
4334
4508
  }
4335
4509
  if (item.type === exports.QuestionnaireItemType.boolean) {
4336
4510
  const initial = item.initial && item.initial.length > 0 ? item.initial[0] : undefined;
4337
- return (React__default["default"].createElement(CheckboxFormSection, { key: item.linkId, title: item.text, htmlFor: item.linkId },
4338
- 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, {
4339
4513
  linkId: item.linkId,
4340
4514
  text: item.text,
4341
4515
  answer: [{ valueBoolean: e.currentTarget.checked }],
4342
4516
  }) })));
4343
4517
  }
4344
- return (React__default["default"].createElement(FormSection, { key: item.linkId, htmlFor: item.linkId, title: item.text || '' },
4345
- 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) })));
4346
4520
  })));
4347
4521
  }
4348
4522
  function QuestionnaireFormItem(props) {
@@ -4372,39 +4546,39 @@
4372
4546
  }
4373
4547
  switch (type) {
4374
4548
  case exports.QuestionnaireItemType.group:
4375
- return (React__default["default"].createElement("div", null,
4376
- React__default["default"].createElement("h3", null, item.text),
4377
- 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 }))));
4378
4552
  case exports.QuestionnaireItemType.boolean:
4379
- 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 }) }));
4380
4554
  case exports.QuestionnaireItemType.decimal:
4381
- 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 }) }));
4382
4556
  case exports.QuestionnaireItemType.integer:
4383
- 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 }) }));
4384
4558
  case exports.QuestionnaireItemType.date:
4385
- 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 }) }));
4386
4560
  case exports.QuestionnaireItemType.dateTime:
4387
- 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 }) }));
4388
4562
  case exports.QuestionnaireItemType.time:
4389
- 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 }) }));
4390
4564
  case exports.QuestionnaireItemType.string:
4391
4565
  case exports.QuestionnaireItemType.url:
4392
- 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 }) }));
4393
4567
  case exports.QuestionnaireItemType.text:
4394
- 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 }) }));
4395
4569
  case exports.QuestionnaireItemType.attachment:
4396
- 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 }) }));
4397
4571
  case exports.QuestionnaireItemType.reference:
4398
- 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 }) }));
4399
4573
  case exports.QuestionnaireItemType.quantity:
4400
- 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 }) }));
4401
4575
  case exports.QuestionnaireItemType.choice:
4402
4576
  case exports.QuestionnaireItemType.openChoice:
4403
4577
  if (isDropDownChoice(item)) {
4404
- 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 }));
4405
4579
  }
4406
4580
  else {
4407
- 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 }));
4408
4582
  }
4409
4583
  }
4410
4584
  return null;
@@ -4419,7 +4593,7 @@
4419
4593
  data.push(typedValueToString(optionValue));
4420
4594
  }
4421
4595
  }
4422
- 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) => {
4423
4597
  const index = e.currentTarget.selectedIndex;
4424
4598
  if (index === 0) {
4425
4599
  props.onChangeAnswer({});
@@ -4447,18 +4621,27 @@
4447
4621
  const { name, item, initial, onChangeAnswer } = props;
4448
4622
  const valueElementDefinition = core.globalSchema.types['QuestionnaireItemAnswerOption'].properties['value[x]'];
4449
4623
  const initialValue = core.getTypedPropertyValue({ type: 'QuestionnaireItemInitial', value: initial }, 'value');
4450
- return (React__default["default"].createElement(React__default["default"].Fragment, null, item.answerOption &&
4451
- 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}`;
4452
4630
  const optionValue = core.getTypedPropertyValue({ type: 'QuestionnaireItemAnswerOption', value: option }, 'value');
4453
- const propertyName = 'value' + core.capitalize(optionValue.type);
4454
- const optionName = `${name}-option-${index}`;
4455
- return (React__default["default"].createElement("div", { key: optionName, className: "medplum-questionnaire-option-row" },
4456
- React__default["default"].createElement("div", { className: "medplum-questionnaire-option-checkbox" },
4457
- 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 }) })),
4458
- React__default["default"].createElement("div", null,
4459
- React__default["default"].createElement("label", { htmlFor: optionName },
4460
- React__default["default"].createElement(ResourcePropertyDisplay, { property: valueElementDefinition, propertyType: optionValue.type, value: optionValue.value })))));
4461
- })));
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 }) })))));
4462
4645
  }
4463
4646
  function buildInitialResponse(questionnaire) {
4464
4647
  const response = {
@@ -4524,6 +4707,50 @@
4524
4707
  }
4525
4708
  }
4526
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
+ }));
4527
4754
  function QuestionnaireBuilder(props) {
4528
4755
  const medplum = useMedplum();
4529
4756
  const defaultValue = useResource(props.questionnaire);
@@ -4552,13 +4779,14 @@
4552
4779
  if (!schema || !value) {
4553
4780
  return null;
4554
4781
  }
4555
- return (React__default["default"].createElement("div", { className: "medplum-questionnaire-builder" },
4556
- React__default["default"].createElement(Form, { testid: "questionnaire-form", onSubmit: () => props.onSubmit(value) },
4557
- React__default["default"].createElement(ItemBuilder, { item: value, selectedKey: selectedKey, setSelectedKey: setSelectedKey, hoverKey: hoverKey, setHoverKey: setHoverKey, onChange: setValue }),
4558
- 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"))));
4559
4786
  }
4560
4787
  function ItemBuilder(props) {
4561
4788
  var _a;
4789
+ const { classes, cx } = useStyles$4();
4562
4790
  const resource = props.item;
4563
4791
  const item = props.item;
4564
4792
  const isResource = 'resourceType' in props.item;
@@ -4592,41 +4820,43 @@
4592
4820
  function changeProperty(property, value) {
4593
4821
  props.onChange(Object.assign(Object.assign({}, itemRef.current), { [property]: value }));
4594
4822
  }
4595
- const className = editing ? 'section editing' : hovering ? 'section hovering' : 'section';
4596
- return (React__default["default"].createElement("div", { "data-testid": item.linkId, className: className, onClick: onClick, onMouseOver: onHover },
4597
- editing ? (React__default["default"].createElement(React__default["default"].Fragment, null,
4598
- isResource && (React__default["default"].createElement("div", null,
4599
- React__default["default"].createElement(core$1.TextInput, { defaultValue: resource.title, onChange: (e) => changeProperty('title', e.currentTarget.value) }))),
4600
- !isContainer && (React__default["default"].createElement("div", null,
4601
- React__default["default"].createElement(core$1.NativeSelect, { defaultValue: item.type, onChange: (e) => changeProperty('type', e.currentTarget.value), data: [
4602
- { value: 'display', label: 'Display' },
4603
- { value: 'boolean', label: 'Boolean' },
4604
- { value: 'decimal', label: 'Decimal' },
4605
- { value: 'integer', label: 'Integer' },
4606
- { value: 'date', label: 'Date' },
4607
- { value: 'dateTime', label: 'Date/Time' },
4608
- { value: 'time', label: 'Time' },
4609
- { value: 'string', label: 'String' },
4610
- { value: 'text', label: 'Text' },
4611
- { value: 'url', label: 'URL' },
4612
- { value: 'choice', label: 'Choice' },
4613
- { value: 'open-choice', label: 'Open Choice' },
4614
- { value: 'attachment', label: 'Attachment' },
4615
- { value: 'reference', label: 'Reference' },
4616
- { value: 'quantity', label: 'Quantity' },
4617
- ] }))),
4618
- !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) })),
4619
- isChoiceQuestion(item) && (React__default["default"].createElement(AnswerBuilder, { options: item.answerOption, onChange: (newOptions) => changeProperty('answerOption', newOptions) })))) : (React__default["default"].createElement(React__default["default"].Fragment, null,
4620
- resource.title && React__default["default"].createElement("h1", null, resource.title),
4621
- item.text && React__default["default"].createElement("p", null, item.text),
4622
- !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 })))),
4623
4835
  item.item &&
4624
- item.item.map((i) => (React__default["default"].createElement("div", { key: i.id },
4625
- React__default["default"].createElement(ItemBuilder, { item: i, selectedKey: props.selectedKey, setSelectedKey: props.setSelectedKey, hoverKey: props.hoverKey, setHoverKey: props.setHoverKey, onChange: changeItem, onRemove: () => removeItem(i) })))),
4626
- !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)))),
4627
- React__default["default"].createElement("div", { className: "bottom-actions" },
4628
- isContainer && (React__default["default"].createElement(React__default["default"].Fragment, null,
4629
- 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) => {
4630
4860
  e.preventDefault();
4631
4861
  addItem({
4632
4862
  id: generateId(),
@@ -4635,7 +4865,7 @@
4635
4865
  text: 'Question',
4636
4866
  });
4637
4867
  } }, "Add item"),
4638
- React__default["default"].createElement("a", { href: "#", onClick: (e) => {
4868
+ React.createElement("a", { href: "#", onClick: (e) => {
4639
4869
  e.preventDefault();
4640
4870
  addItem({
4641
4871
  id: generateId(),
@@ -4644,7 +4874,7 @@
4644
4874
  text: 'Group',
4645
4875
  });
4646
4876
  } }, "Add group"))),
4647
- !isResource && (React__default["default"].createElement("a", { href: "#", onClick: (e) => {
4877
+ editing && !isResource && (React.createElement("a", { href: "#", onClick: (e) => {
4648
4878
  e.preventDefault();
4649
4879
  if (props.onRemove) {
4650
4880
  props.onRemove();
@@ -4655,30 +4885,30 @@
4655
4885
  var _a;
4656
4886
  const property = core.globalSchema.types['QuestionnaireItemAnswerOption'].properties['value[x]'];
4657
4887
  const options = (_a = props.options) !== null && _a !== void 0 ? _a : [];
4658
- return (React__default["default"].createElement("div", null,
4888
+ return (React.createElement("div", null,
4659
4889
  options.map((option) => {
4660
4890
  const [propertyValue, propertyType] = getValueAndType({ type: 'QuestionnaireItemAnswerOption', value: option }, 'value');
4661
- return (React__default["default"].createElement("div", { key: option.id, style: {
4891
+ return (React.createElement("div", { key: option.id, style: {
4662
4892
  display: 'flex',
4663
4893
  flexDirection: 'row',
4664
4894
  justifyContent: 'space-between',
4665
4895
  alignItems: 'center',
4666
4896
  width: '80%',
4667
4897
  } },
4668
- React__default["default"].createElement("div", null,
4669
- 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) => {
4670
4900
  const newOptions = [...options];
4671
4901
  const index = newOptions.findIndex((o) => o.id === option.id);
4672
4902
  newOptions[index] = { id: option.id, [propName]: newValue };
4673
4903
  props.onChange(newOptions);
4674
4904
  } })),
4675
- React__default["default"].createElement("div", null,
4676
- React__default["default"].createElement("a", { href: "#", onClick: (e) => {
4905
+ React.createElement("div", null,
4906
+ React.createElement("a", { href: "#", onClick: (e) => {
4677
4907
  killEvent(e);
4678
4908
  props.onChange(options.filter((o) => o.id !== option.id));
4679
4909
  } }, "Remove"))));
4680
4910
  }),
4681
- React__default["default"].createElement("a", { href: "#", onClick: (e) => {
4911
+ React.createElement("a", { href: "#", onClick: (e) => {
4682
4912
  killEvent(e);
4683
4913
  props.onChange([
4684
4914
  ...options,
@@ -4787,7 +5017,7 @@
4787
5017
  stat: 'red',
4788
5018
  };
4789
5019
  function StatusBadge(props) {
4790
- 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);
4791
5021
  }
4792
5022
 
4793
5023
  function RequestGroupDisplay(props) {
@@ -4805,27 +5035,27 @@
4805
5035
  if (!requestGroup || !responseBundle) {
4806
5036
  return null;
4807
5037
  }
4808
- 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) => {
4809
5039
  var _a, _b, _c, _d, _e, _f;
4810
5040
  const task = action.resource && findBundleEntry(action.resource);
4811
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;
4812
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;
4813
- return (React__default["default"].createElement("div", { className: "medplum-request-group-task", key: `action-${index}` },
4814
- React__default["default"].createElement("div", { className: "medplum-request-group-task-checkmark" }, (task === null || task === void 0 ? void 0 : task.status) === 'completed' ? '🗹' : '☐'),
4815
- React__default["default"].createElement("div", { className: "medplum-request-group-task-details" },
4816
- React__default["default"].createElement("div", { className: "medplum-request-group-task-title" }, action.title),
4817
- action.description && React__default["default"].createElement("div", null, action.description),
4818
- 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,
4819
5049
  "Last edited by\u00A0",
4820
- 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 }),
4821
5051
  "\u00A0on\u00A0",
4822
5052
  core.formatDateTime((_f = task === null || task === void 0 ? void 0 : task.meta) === null || _f === void 0 ? void 0 : _f.lastUpdated)),
4823
- React__default["default"].createElement("div", null,
5053
+ React.createElement("div", null,
4824
5054
  "Status: ",
4825
- React__default["default"].createElement(StatusBadge, { status: (task === null || task === void 0 ? void 0 : task.status) || 'unknown' }))),
4826
- React__default["default"].createElement("div", { className: "medplum-request-group-task-actions" },
4827
- taskInput && !taskOutput && React__default["default"].createElement(core$1.Button, { onClick: () => props.onStart(task, taskInput) }, "Start"),
4828
- 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")))));
4829
5059
  })));
4830
5060
  function buildBatchRequest(request) {
4831
5061
  var _a;
@@ -5039,8 +5269,56 @@
5039
5269
  }
5040
5270
  }
5041
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
+ }));
5042
5319
  function ResourceBlame(props) {
5043
5320
  var _a, _b;
5321
+ const { classes } = useStyles$3();
5044
5322
  const medplum = useMedplum();
5045
5323
  const [value, setValue] = React.useState(props.history);
5046
5324
  React.useEffect(() => {
@@ -5049,20 +5327,21 @@
5049
5327
  }
5050
5328
  }, [medplum, props.history, props.resourceType, props.id]);
5051
5329
  if (!value) {
5052
- return React__default["default"].createElement("div", null, "Loading...");
5330
+ return React.createElement("div", null, "Loading...");
5053
5331
  }
5054
5332
  const resource = (_b = (_a = value.entry) === null || _a === void 0 ? void 0 : _a[0]) === null || _b === void 0 ? void 0 : _b.resource;
5055
5333
  const table = blame(value);
5056
- return (React__default["default"].createElement("div", { className: "medplum-blame-container" },
5057
- React__default["default"].createElement("table", { className: "medplum-blame" },
5058
- 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' },
5059
- row.span > 0 && (React__default["default"].createElement("td", { className: "details", rowSpan: row.span },
5060
- React__default["default"].createElement(core$1.Group, { spacing: "xs", grow: true, noWrap: true },
5061
- React__default["default"].createElement(ResourceBadge, { value: row.meta.author, link: true }),
5062
- React__default["default"].createElement(MedplumLink, { to: getVersionUrl$1(resource, row.meta.versionId) }, getTimeString(row.meta.lastUpdated))))),
5063
- React__default["default"].createElement("td", { className: "line-number" }, index + 1),
5064
- React__default["default"].createElement("td", { className: "line" },
5065
- 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)))))))));
5066
5345
  }
5067
5346
  function getVersionUrl$1(resource, versionId) {
5068
5347
  return `/${resource.resourceType}/${resource.id}/_history/${versionId}`;
@@ -5095,6 +5374,15 @@
5095
5374
  return `${count} ${count === 1 ? noun : noun + 's'} ago`;
5096
5375
  }
5097
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
+ }));
5098
5386
  function ResourceDiff(props) {
5099
5387
  let originalResource = props.original;
5100
5388
  let revisedResource = props.revised;
@@ -5105,16 +5393,17 @@
5105
5393
  const original = core.stringify(originalResource, true).match(/[^\r\n]+/g);
5106
5394
  const revised = core.stringify(revisedResource, true).match(/[^\r\n]+/g);
5107
5395
  const deltas = diff(original, revised);
5108
- 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 })))));
5109
5397
  }
5110
5398
  function ChangeDiff(props) {
5111
- return (React__default["default"].createElement(React__default["default"].Fragment, null,
5399
+ const { classes } = useStyles$2();
5400
+ return (React.createElement(React.Fragment, null,
5112
5401
  "...",
5113
- React__default["default"].createElement("br", null),
5114
- props.delta.original.lines.length > 0 && (React__default["default"].createElement("div", { className: "medplum-diff-removed" }, props.delta.original.lines.join('\n'))),
5115
- 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'))),
5116
5405
  "...",
5117
- React__default["default"].createElement("br", null)));
5406
+ React.createElement("br", null)));
5118
5407
  }
5119
5408
 
5120
5409
  function ResourceHistoryTable(props) {
@@ -5130,30 +5419,30 @@
5130
5419
  }
5131
5420
  }, [medplum, props.history, props.resourceType, props.id]);
5132
5421
  if (!value) {
5133
- return React__default["default"].createElement("div", null, "Loading...");
5422
+ return React.createElement("div", null, "Loading...");
5134
5423
  }
5135
- return (React__default["default"].createElement(core$1.Table, { withBorder: true, withColumnBorders: true },
5136
- React__default["default"].createElement("thead", null,
5137
- React__default["default"].createElement("tr", null,
5138
- React__default["default"].createElement("th", null, "Author"),
5139
- React__default["default"].createElement("th", null, "Date"),
5140
- React__default["default"].createElement("th", null, "Version"))),
5141
- 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 }))))));
5142
5431
  }
5143
5432
  function HistoryRow(props) {
5144
5433
  var _a, _b, _c;
5145
5434
  const { response, resource } = props.entry;
5146
5435
  if (resource) {
5147
- return (React__default["default"].createElement("tr", null,
5148
- React__default["default"].createElement("td", null,
5149
- React__default["default"].createElement(ResourceBadge, { value: (_a = resource.meta) === null || _a === void 0 ? void 0 : _a.author, link: true })),
5150
- React__default["default"].createElement("td", null, core.formatDateTime((_b = resource.meta) === null || _b === void 0 ? void 0 : _b.lastUpdated)),
5151
- React__default["default"].createElement("td", null,
5152
- 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))));
5153
5442
  }
5154
5443
  else {
5155
- return (React__default["default"].createElement("tr", null,
5156
- 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))));
5157
5446
  }
5158
5447
  }
5159
5448
  function getVersionUrl(resource) {
@@ -5161,6 +5450,42 @@
5161
5450
  return `/${resource.resourceType}/${resource.id}/_history/${(_a = resource.meta) === null || _a === void 0 ? void 0 : _a.versionId}`;
5162
5451
  }
5163
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
+ }));
5164
5489
  /**
5165
5490
  * Returns a month display string (e.g. "January 2020").
5166
5491
  * @param date Any date within the month.
@@ -5170,6 +5495,7 @@
5170
5495
  return date.toLocaleString('default', { month: 'long' }) + ' ' + date.getFullYear();
5171
5496
  }
5172
5497
  function CalendarInput(props) {
5498
+ const { classes } = useStyles$1();
5173
5499
  const { onChangeMonth, onClick } = props;
5174
5500
  const [month, setMonth] = React.useState(getStartMonth);
5175
5501
  function moveMonth(delta) {
@@ -5181,23 +5507,23 @@
5181
5507
  });
5182
5508
  }
5183
5509
  const grid = React.useMemo(() => buildGrid(month, props.slots), [month, props.slots]);
5184
- return (React__default["default"].createElement("div", null,
5185
- React__default["default"].createElement(core$1.Group, { position: "apart", spacing: "xs", grow: true, noWrap: true },
5186
- React__default["default"].createElement("p", { style: { flex: 1 } }, getMonthString(month)),
5187
- React__default["default"].createElement(core$1.Group, { position: "right", spacing: "xs" },
5188
- React__default["default"].createElement(core$1.Button, { variant: "outline", "aria-label": "Previous month", onClick: () => moveMonth(-1) }, "<"),
5189
- React__default["default"].createElement(core$1.Button, { variant: "outline", "aria-label": "Next month", onClick: () => moveMonth(1) }, ">"))),
5190
- React__default["default"].createElement("table", { className: "medplum-calendar-table" },
5191
- React__default["default"].createElement("thead", null,
5192
- React__default["default"].createElement("tr", null,
5193
- React__default["default"].createElement("th", null, "SUN"),
5194
- React__default["default"].createElement("th", null, "MON"),
5195
- React__default["default"].createElement("th", null, "TUE"),
5196
- React__default["default"].createElement("th", null, "WED"),
5197
- React__default["default"].createElement("th", null, "THU"),
5198
- React__default["default"].createElement("th", null, "FRI"),
5199
- React__default["default"].createElement("th", null, "SAT"))),
5200
- 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()))))))))))));
5201
5527
  }
5202
5528
  function getStartMonth() {
5203
5529
  const result = new Date();
@@ -5252,8 +5578,24 @@
5252
5578
  return false;
5253
5579
  }
5254
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
+ }));
5255
5596
  function Scheduler(props) {
5256
5597
  var _a;
5598
+ const { classes } = useStyles();
5257
5599
  const medplum = useMedplum();
5258
5600
  const schedule = useResource(props.schedule);
5259
5601
  const questionnaire = useResource(props.questionnaire);
@@ -5285,30 +5627,30 @@
5285
5627
  return null;
5286
5628
  }
5287
5629
  const actor = (_a = schedule.actor) === null || _a === void 0 ? void 0 : _a[0];
5288
- return (React__default["default"].createElement("div", { className: "medplum-calendar-container", "data-testid": "scheduler" },
5289
- React__default["default"].createElement("div", { className: "medplum-calendar-info-pane" },
5290
- actor && React__default["default"].createElement(ResourceAvatar, { value: actor, size: "xl" }),
5291
- actor && (React__default["default"].createElement(core$1.Text, { size: "xl", weight: 500 },
5292
- React__default["default"].createElement(ResourceName, { value: actor }))),
5293
- React__default["default"].createElement("p", null, "1 hour"),
5294
- date && React__default["default"].createElement("p", null, date.toLocaleDateString()),
5295
- slot && React__default["default"].createElement("p", null, formatTime(new Date(slot.start)))),
5296
- React__default["default"].createElement("div", { className: "medplum-calendar-selection-pane" },
5297
- !date && (React__default["default"].createElement("div", null,
5298
- React__default["default"].createElement("h3", null, "Select date"),
5299
- React__default["default"].createElement(CalendarInput, { slots: slots, onChangeMonth: setMonth, onClick: setDate }))),
5300
- date && !slot && (React__default["default"].createElement("div", null,
5301
- React__default["default"].createElement("h3", null, "Select time"),
5302
- 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) => {
5303
5645
  const slotStart = new Date(s.start);
5304
5646
  return (slotStart.getTime() > date.getTime() &&
5305
- slotStart.getTime() < date.getTime() + 24 * 3600 * 1000 && (React__default["default"].createElement("div", { key: s.id },
5306
- 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)))));
5307
5649
  })))),
5308
- date && slot && !response && (React__default["default"].createElement(QuestionnaireForm, { questionnaire: questionnaire, submitButtonText: 'Next', onSubmit: setResponse })),
5309
- date && slot && response && (React__default["default"].createElement("div", null,
5310
- React__default["default"].createElement("h3", null, "You're all set!"),
5311
- 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."))))));
5312
5654
  }
5313
5655
  function getStart(month) {
5314
5656
  return formatSlotInstant(month.getTime());
@@ -5324,7 +5666,7 @@
5324
5666
  }
5325
5667
 
5326
5668
  function ServiceRequestTimeline(props) {
5327
- return (React__default["default"].createElement(ResourceTimeline, { value: props.serviceRequest, buildSearchRequests: (resource) => ({
5669
+ return (React.createElement(ResourceTimeline, { value: props.serviceRequest, buildSearchRequests: (resource) => ({
5328
5670
  resourceType: 'Bundle',
5329
5671
  type: 'batch',
5330
5672
  entry: [
@@ -5493,7 +5835,5 @@
5493
5835
  exports.useMedplumProfile = useMedplumProfile;
5494
5836
  exports.useResource = useResource;
5495
5837
 
5496
- Object.defineProperty(exports, '__esModule', { value: true });
5497
-
5498
5838
  }));
5499
5839
  //# sourceMappingURL=index.js.map