@medplum/react 0.10.0 → 0.10.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. package/dist/cjs/CodeableConceptInput.d.ts +1 -1
  2. package/dist/cjs/CodingInput.d.ts +1 -1
  3. package/dist/cjs/DiagnosticReportDisplay.d.ts +0 -1
  4. package/dist/cjs/ResourceHistoryTable.d.ts +0 -1
  5. package/dist/cjs/StatusBadge.d.ts +0 -1
  6. package/dist/cjs/ValueSetAutocomplete.d.ts +1 -1
  7. package/dist/cjs/index.d.ts +0 -7
  8. package/dist/cjs/index.js +120 -121
  9. package/dist/cjs/index.js.map +1 -1
  10. package/dist/cjs/index.min.js +1 -1
  11. package/dist/cjs/index.min.js.map +1 -1
  12. package/dist/cjs/stories/{Tabs.stories.d.ts → CodeInput.stories.d.ts} +1 -1
  13. package/dist/{esm/stories/Tabs.stories.d.ts → cjs/stories/CodeableConceptInput.stories.d.ts} +1 -1
  14. package/dist/cjs/styles.css +7 -195
  15. package/dist/esm/CodeInput.js +2 -2
  16. package/dist/esm/CodeInput.js.map +1 -1
  17. package/dist/esm/CodeableConceptInput.d.ts +1 -1
  18. package/dist/esm/CodeableConceptInput.js +1 -1
  19. package/dist/esm/CodeableConceptInput.js.map +1 -1
  20. package/dist/esm/CodingInput.d.ts +1 -1
  21. package/dist/esm/CodingInput.js +1 -1
  22. package/dist/esm/CodingInput.js.map +1 -1
  23. package/dist/esm/DiagnosticReportDisplay.d.ts +0 -1
  24. package/dist/esm/DiagnosticReportDisplay.js +6 -2
  25. package/dist/esm/DiagnosticReportDisplay.js.map +1 -1
  26. package/dist/esm/ResourceHistoryTable.d.ts +0 -1
  27. package/dist/esm/ResourceHistoryTable.js +2 -1
  28. package/dist/esm/ResourceHistoryTable.js.map +1 -1
  29. package/dist/esm/ResourceTimeline.js +11 -9
  30. package/dist/esm/ResourceTimeline.js.map +1 -1
  31. package/dist/esm/SearchFilterEditor.js +4 -3
  32. package/dist/esm/SearchFilterEditor.js.map +1 -1
  33. package/dist/esm/StatusBadge.d.ts +0 -1
  34. package/dist/esm/StatusBadge.js +55 -1
  35. package/dist/esm/StatusBadge.js.map +1 -1
  36. package/dist/esm/ValueSetAutocomplete.d.ts +1 -1
  37. package/dist/esm/ValueSetAutocomplete.js +48 -40
  38. package/dist/esm/ValueSetAutocomplete.js.map +1 -1
  39. package/dist/esm/index.d.ts +0 -7
  40. package/dist/esm/index.js +0 -7
  41. package/dist/esm/index.js.map +1 -1
  42. package/dist/esm/index.min.js +1 -1
  43. package/dist/esm/index.min.js.map +1 -1
  44. package/dist/esm/stories/CodeInput.stories.d.ts +6 -0
  45. package/dist/esm/stories/CodeableConceptInput.stories.d.ts +6 -0
  46. package/dist/esm/styles.css +7 -195
  47. package/package.json +5 -5
  48. package/dist/cjs/FooterLinks.d.ts +0 -6
  49. package/dist/cjs/Scrollable.d.ts +0 -9
  50. package/dist/cjs/Tab.d.ts +0 -12
  51. package/dist/cjs/TabList.d.ts +0 -10
  52. package/dist/cjs/TabPanel.d.ts +0 -6
  53. package/dist/cjs/TabSwitch.d.ts +0 -6
  54. package/dist/cjs/TitleBar.d.ts +0 -6
  55. package/dist/esm/FooterLinks.d.ts +0 -6
  56. package/dist/esm/FooterLinks.js +0 -8
  57. package/dist/esm/FooterLinks.js.map +0 -1
  58. package/dist/esm/Scrollable.d.ts +0 -9
  59. package/dist/esm/Scrollable.js +0 -12
  60. package/dist/esm/Scrollable.js.map +0 -1
  61. package/dist/esm/Tab.d.ts +0 -12
  62. package/dist/esm/Tab.js +0 -19
  63. package/dist/esm/Tab.js.map +0 -1
  64. package/dist/esm/TabList.d.ts +0 -10
  65. package/dist/esm/TabList.js +0 -23
  66. package/dist/esm/TabList.js.map +0 -1
  67. package/dist/esm/TabPanel.d.ts +0 -6
  68. package/dist/esm/TabPanel.js +0 -8
  69. package/dist/esm/TabPanel.js.map +0 -1
  70. package/dist/esm/TabSwitch.d.ts +0 -6
  71. package/dist/esm/TabSwitch.js +0 -16
  72. package/dist/esm/TabSwitch.js.map +0 -1
  73. package/dist/esm/TitleBar.d.ts +0 -6
  74. package/dist/esm/TitleBar.js +0 -8
  75. package/dist/esm/TitleBar.js.map +0 -1
@@ -5,6 +5,6 @@ export interface CodeableConceptInputProps {
5
5
  name: string;
6
6
  placeholder?: string;
7
7
  defaultValue?: CodeableConcept;
8
- onChange?: (value: CodeableConcept) => void;
8
+ onChange?: (value: CodeableConcept | undefined) => void;
9
9
  }
10
10
  export declare function CodeableConceptInput(props: CodeableConceptInputProps): JSX.Element;
@@ -5,6 +5,6 @@ export interface CodingInputProps {
5
5
  name: string;
6
6
  placeholder?: string;
7
7
  defaultValue?: Coding;
8
- onChange?: (value: Coding) => void;
8
+ onChange?: (value: Coding | undefined) => void;
9
9
  }
10
10
  export declare function CodingInput(props: CodingInputProps): JSX.Element;
@@ -1,7 +1,6 @@
1
1
  /// <reference types="react" />
2
2
  import { DiagnosticReport, Observation, Reference } from '@medplum/fhirtypes';
3
3
  import './DiagnosticReportDisplay.css';
4
- import './Table.css';
5
4
  export interface DiagnosticReportDisplayProps {
6
5
  value?: DiagnosticReport | Reference<DiagnosticReport>;
7
6
  }
@@ -1,6 +1,5 @@
1
1
  /// <reference types="react" />
2
2
  import { Bundle } from '@medplum/fhirtypes';
3
- import './Table.css';
4
3
  export interface ResourceHistoryTableProps {
5
4
  history?: Bundle;
6
5
  resourceType?: string;
@@ -1,5 +1,4 @@
1
1
  /// <reference types="react" />
2
- import './StatusBadge.css';
3
2
  export interface StatusBadgeProps {
4
3
  readonly status: string;
5
4
  }
@@ -5,6 +5,6 @@ export interface ValueSetAutocompleteProps {
5
5
  name: string;
6
6
  placeholder?: string;
7
7
  defaultValue?: ValueSetExpansionContains;
8
- onChange?: (value: ValueSetExpansionContains) => void;
8
+ onChange?: (value: ValueSetExpansionContains | undefined) => void;
9
9
  }
10
10
  export declare function ValueSetAutocomplete(props: ValueSetAutocompleteProps): JSX.Element;
@@ -23,7 +23,6 @@ export * from './Document';
23
23
  export * from './EncounterTimeline';
24
24
  export * from './ErrorBoundary';
25
25
  export * from './FhirPathTable';
26
- export * from './FooterLinks';
27
26
  export * from './Form';
28
27
  export * from './FormSection';
29
28
  export * from './FormUtils';
@@ -57,19 +56,13 @@ export * from './ResourcePropertyInput';
57
56
  export * from './ResourceTable';
58
57
  export * from './ResourceTimeline';
59
58
  export * from './Scheduler';
60
- export * from './Scrollable';
61
59
  export * from './SearchControl';
62
60
  export * from './SearchFieldEditor';
63
61
  export * from './SearchFilterEditor';
64
62
  export * from './SearchUtils';
65
63
  export * from './ServiceRequestTimeline';
66
64
  export * from './StatusBadge';
67
- export * from './Tab';
68
- export * from './TabList';
69
- export * from './TabPanel';
70
- export * from './TabSwitch';
71
65
  export * from './Timeline';
72
- export * from './TitleBar';
73
66
  export * from './useResource';
74
67
  export * from './utils';
75
68
  export * from './utils/date';
package/dist/cjs/index.js CHANGED
@@ -1228,51 +1228,59 @@
1228
1228
  return (React__default["default"].createElement(core$1.TextInput, { name: props.name, placeholder: "Annotation text", defaultValue: value.text, onChange: (e) => setText(e.currentTarget.value) }));
1229
1229
  }
1230
1230
 
1231
+ function valueSetElementToAutocompleteItem(element) {
1232
+ return {
1233
+ value: element.code,
1234
+ label: getDisplay(element),
1235
+ element,
1236
+ };
1237
+ }
1231
1238
  function ValueSetAutocomplete(props) {
1232
1239
  const medplum = useMedplum();
1233
- const defaultValue = props.defaultValue;
1234
- const [value, setValue] = React.useState(defaultValue);
1235
- const [text, setText] = React.useState(defaultValue ? getDisplay(defaultValue) : '');
1236
- const [loading, setLoading] = React.useState(false);
1237
- const [data, setData] = React.useState([]);
1238
- function loadValues(input) {
1240
+ const { property, defaultValue } = props;
1241
+ const [textValues, setTextValues] = React.useState(defaultValue ? [defaultValue.code] : []);
1242
+ const [data, setData] = React.useState(defaultValue ? [valueSetElementToAutocompleteItem(defaultValue)] : []);
1243
+ const dataRef = React.useRef();
1244
+ dataRef.current = data;
1245
+ const loadValues = React.useCallback((input) => __awaiter(this, void 0, void 0, function* () {
1239
1246
  var _a, _b;
1240
- return __awaiter(this, void 0, void 0, function* () {
1241
- setLoading(true);
1242
- const system = (_a = props.property.binding) === null || _a === void 0 ? void 0 : _a.valueSet;
1243
- const valueSet = yield medplum.searchValueSet(system, input);
1244
- const valueSetElements = (_b = valueSet.expansion) === null || _b === void 0 ? void 0 : _b.contains;
1245
- setData(valueSetElements.map((element) => ({ value: getDisplay(element), element })));
1246
- setLoading(false);
1247
- });
1248
- }
1249
- function handleChange(val) {
1250
- return __awaiter(this, void 0, void 0, function* () {
1251
- setText(val);
1252
- return loadValues(val);
1253
- });
1254
- }
1255
- function handleSelect(item) {
1256
- setValue(item.element);
1257
- setText(item.value);
1258
- setData([]);
1259
- if (props.onChange) {
1260
- props.onChange(item.element);
1247
+ const system = (_a = property.binding) === null || _a === void 0 ? void 0 : _a.valueSet;
1248
+ const valueSet = yield medplum.searchValueSet(system, input);
1249
+ const valueSetElements = (_b = valueSet.expansion) === null || _b === void 0 ? void 0 : _b.contains;
1250
+ const newData = [...dataRef.current];
1251
+ for (const valueSetElement of valueSetElements) {
1252
+ if (!newData.some((item) => item.value === valueSetElement.code)) {
1253
+ newData.push(valueSetElementToAutocompleteItem(valueSetElement));
1254
+ }
1261
1255
  }
1262
- }
1263
- function handleBlur(val) {
1264
- if (!value) {
1265
- const unstructured = {
1266
- display: val,
1267
- code: val,
1268
- };
1269
- setValue(unstructured);
1270
- if (props.onChange) {
1271
- props.onChange(unstructured);
1256
+ setData(newData);
1257
+ }), [medplum, property, dataRef]);
1258
+ function handleChange(values) {
1259
+ setTextValues(values);
1260
+ const textValue = values[0];
1261
+ let currentItem = undefined;
1262
+ if (textValue) {
1263
+ currentItem = dataRef.current.find((item) => item.value === values[0]);
1264
+ if (!currentItem) {
1265
+ const newElement = { code: textValue, display: textValue };
1266
+ currentItem = valueSetElementToAutocompleteItem(newElement);
1267
+ setData([...dataRef.current, currentItem]);
1272
1268
  }
1273
1269
  }
1270
+ if (props.onChange) {
1271
+ props.onChange(currentItem === null || currentItem === void 0 ? void 0 : currentItem.element);
1272
+ }
1274
1273
  }
1275
- return (React__default["default"].createElement(core$1.Autocomplete, { value: text, data: data, placeholder: props.placeholder, onFocus: () => loadValues(text), onBlur: () => handleBlur(text), onChange: handleChange, onItemSubmit: handleSelect, rightSection: loading ? React__default["default"].createElement(core$1.Loader, { size: 16 }) : null }));
1274
+ React.useEffect(() => {
1275
+ loadValues('').catch(console.log);
1276
+ }, [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) => {
1278
+ var _a, _b;
1279
+ return !!(textValues.length === 0 &&
1280
+ !selected &&
1281
+ (((_a = item.element.display) === null || _a === void 0 ? void 0 : _a.toLowerCase().includes(value.toLowerCase().trim())) ||
1282
+ ((_b = item.element.code) === null || _b === void 0 ? void 0 : _b.toLowerCase().includes(value.toLowerCase().trim()))));
1283
+ }, onChange: handleChange, getCreateLabel: (query) => `+ Create ${query}`, onCreate: (query) => valueSetElementToAutocompleteItem({ code: query, display: query }) }));
1276
1284
  }
1277
1285
  function getDisplay(item) {
1278
1286
  return item.display || item.code || '';
@@ -1281,7 +1289,7 @@
1281
1289
  function CodeableConceptInput(props) {
1282
1290
  const [value, setValue] = React.useState(props.defaultValue);
1283
1291
  function handleChange(newValue) {
1284
- const newConcept = valueSetElementToCodeableConcept(newValue);
1292
+ const newConcept = newValue && valueSetElementToCodeableConcept(newValue);
1285
1293
  setValue(newConcept);
1286
1294
  if (props.onChange) {
1287
1295
  props.onChange(newConcept);
@@ -1322,16 +1330,16 @@
1322
1330
  return (React__default["default"].createElement(ValueSetAutocomplete, { property: props.property, name: props.name, placeholder: props.placeholder, defaultValue: codeToValueSetElement(value), onChange: handleChange }));
1323
1331
  }
1324
1332
  function codeToValueSetElement(code) {
1325
- return { code };
1333
+ return code ? { code } : undefined;
1326
1334
  }
1327
1335
  function valueSetElementToCode(element) {
1328
- return element.code;
1336
+ return element === null || element === void 0 ? void 0 : element.code;
1329
1337
  }
1330
1338
 
1331
1339
  function CodingInput(props) {
1332
1340
  const [value, setValue] = React.useState(props.defaultValue);
1333
1341
  function handleChange(newValue) {
1334
- const newConcept = valueSetElementToCoding(newValue);
1342
+ const newConcept = newValue && valueSetElementToCoding(newValue);
1335
1343
  setValue(newConcept);
1336
1344
  if (props.onChange) {
1337
1345
  props.onChange(newConcept);
@@ -2058,7 +2066,7 @@
2058
2066
  }
2059
2067
  function ObservationTable(props) {
2060
2068
  var _a;
2061
- return (React__default["default"].createElement("table", { className: "medplum-table" },
2069
+ return (React__default["default"].createElement(core$1.Table, { withBorder: true, withColumnBorders: true },
2062
2070
  React__default["default"].createElement("thead", null,
2063
2071
  React__default["default"].createElement("tr", null,
2064
2072
  React__default["default"].createElement("th", null, "Test"),
@@ -2107,6 +2115,9 @@
2107
2115
  if (!range) {
2108
2116
  return null;
2109
2117
  }
2118
+ if (range.text) {
2119
+ return React__default["default"].createElement(React__default["default"].Fragment, null, range.text);
2120
+ }
2110
2121
  return React__default["default"].createElement(RangeDisplay, { value: range });
2111
2122
  }
2112
2123
  /**
@@ -2118,7 +2129,7 @@
2118
2129
  function isCritical(observation) {
2119
2130
  var _a, _b, _c, _d;
2120
2131
  const code = (_d = (_c = (_b = (_a = observation.interpretation) === null || _a === void 0 ? void 0 : _a[0]) === null || _b === void 0 ? void 0 : _b.coding) === null || _c === void 0 ? void 0 : _c[0]) === null || _d === void 0 ? void 0 : _d.code;
2121
- return code === 'AA' || code === 'LL' || code === 'HH';
2132
+ return code === 'AA' || code === 'LL' || code === 'HH' || code === 'RR';
2122
2133
  }
2123
2134
 
2124
2135
  function ResourceDiffTable(props) {
@@ -2187,14 +2198,6 @@
2187
2198
  return (React__default["default"].createElement(BackboneElementDisplay, { value: { type: value.resourceType, value }, ignoreMissingValues: props.ignoreMissingValues }));
2188
2199
  }
2189
2200
 
2190
- function Scrollable(props) {
2191
- const containerHeight = props.height || '100%';
2192
- const contentHeight = props.height ? props.height + 25 : '100%';
2193
- const className = 'medplum-scrollable-content' + (props.className ? ` ${props.className}` : '');
2194
- return (React__default["default"].createElement("div", { className: "medplum-scrollable-container", style: { height: containerHeight } },
2195
- React__default["default"].createElement("div", { className: className, role: props.role, style: { height: contentHeight } }, props.children)));
2196
- }
2197
-
2198
2201
  /**
2199
2202
  * ErrorBoundary is a React component that handles errors in its child components.
2200
2203
  * See: https://reactjs.org/docs/error-boundaries.html
@@ -2422,10 +2425,13 @@
2422
2425
  input.focus();
2423
2426
  }
2424
2427
  } },
2425
- React__default["default"].createElement(core$1.Group, { noWrap: true },
2428
+ React__default["default"].createElement(core$1.Group, { spacing: "xs", noWrap: true, style: { width: '100%' } },
2426
2429
  React__default["default"].createElement(ResourceAvatar, { value: sender }),
2427
- React__default["default"].createElement(core$1.TextInput, { name: "text", "data-testid": "timeline-input", ref: inputRef, size: "md", radius: "xl", rightSectionWidth: 40, rightSection: React__default["default"].createElement(AttachmentButton, { onUpload: createMedia }, (props) => (React__default["default"].createElement(core$1.ActionIcon, Object.assign({}, props, { size: 24, radius: "xl", color: "blue", variant: "filled" }),
2428
- React__default["default"].createElement(icons.IconCloudUpload, { size: 16 })))), placeholder: "Add comment" })))))),
2430
+ React__default["default"].createElement(core$1.TextInput, { name: "text", ref: inputRef, placeholder: "Add comment", style: { width: '100%', maxWidth: 300 } }),
2431
+ React__default["default"].createElement(core$1.ActionIcon, { type: "submit", radius: "xl", color: "blue", variant: "filled" },
2432
+ React__default["default"].createElement(icons.IconMessage, { size: 16 })),
2433
+ React__default["default"].createElement(AttachmentButton, { onUpload: createMedia }, (props) => (React__default["default"].createElement(core$1.ActionIcon, Object.assign({}, props, { radius: "xl", color: "blue", variant: "filled" }),
2434
+ React__default["default"].createElement(icons.IconCloudUpload, { size: 16 }))))))))),
2429
2435
  items.map((item) => {
2430
2436
  var _a;
2431
2437
  if (item.resourceType === resource.resourceType && item.id === resource.id) {
@@ -2498,7 +2504,7 @@
2498
2504
  }
2499
2505
  function AuditEventTimelineItem(props) {
2500
2506
  return (React__default["default"].createElement(TimelineItem, { resource: props.resource, padding: true, popupMenuItems: React__default["default"].createElement(TimelineItemPopupMenu, Object.assign({}, props)) },
2501
- React__default["default"].createElement(Scrollable, null,
2507
+ React__default["default"].createElement(core$1.ScrollArea, null,
2502
2508
  React__default["default"].createElement("pre", null, props.resource.outcomeDesc))));
2503
2509
  }
2504
2510
  function DiagnosticReportTimelineItem(props) {
@@ -3455,7 +3461,8 @@
3455
3461
  }
3456
3462
  }),
3457
3463
  React__default["default"].createElement(FilterRowInput, { resourceType: resourceType, searchParams: searchParams, okText: "Add", onOk: onAddFilter })))),
3458
- React__default["default"].createElement(core$1.Button, { onClick: () => props.onOk(searchRef.current) }, "OK")));
3464
+ React__default["default"].createElement(core$1.Group, { position: "right", mt: "xl" },
3465
+ React__default["default"].createElement(core$1.Button, { onClick: () => props.onOk(searchRef.current) }, "OK"))));
3459
3466
  }
3460
3467
  function FilterRowDisplay(props) {
3461
3468
  const { filter } = props;
@@ -3487,7 +3494,7 @@
3487
3494
  return (React__default["default"].createElement("tr", null,
3488
3495
  React__default["default"].createElement("td", null,
3489
3496
  React__default["default"].createElement(core$1.NativeSelect, { "data-testid": "filter-field", defaultValue: valueRef.current.code, onChange: (e) => setFilterCode(e.currentTarget.value), data: Object.keys(props.searchParams).map((param) => ({ value: param, label: buildFieldNameString(param) })) })),
3490
- 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) })) }))),
3497
+ React__default["default"].createElement("td", null, operators && (React__default["default"].createElement(core$1.NativeSelect, { "data-testid": "filter-operation", defaultValue: value.operator, onChange: (e) => setFilterOperator(e.currentTarget.value), data: ['', ...operators.map((op) => ({ value: op, label: getOpString(op) }))] }))),
3491
3498
  React__default["default"].createElement("td", null, searchParam && value.operator && (React__default["default"].createElement(SearchFilterValueInput, { resourceType: props.resourceType, searchParam: searchParam, defaultValue: value.value, onChange: setFilterValue }))),
3492
3499
  React__default["default"].createElement("td", null,
3493
3500
  value.code && value.operator && value.value && (React__default["default"].createElement(core$1.Button, { compact: true, variant: "outline", onClick: () => {
@@ -4006,10 +4013,6 @@
4006
4013
  }
4007
4014
  const MemoizedFhirPathTable = React__default["default"].memo(FhirPathTable);
4008
4015
 
4009
- function FooterLinks(props) {
4010
- return React__default["default"].createElement("div", { className: "medplum-footer" }, props.children);
4011
- }
4012
-
4013
4016
  const searches = [
4014
4017
  '$/_history',
4015
4018
  'Communication?subject=$',
@@ -4725,8 +4728,61 @@
4725
4728
  return options.map((option) => (Object.assign(Object.assign({}, option), { id: option.id || generateId() })));
4726
4729
  }
4727
4730
 
4731
+ /*
4732
+ * Request status: https://hl7.org/fhir/valueset-request-status.html
4733
+ * draft, active, on-hold, revoked, completed, entered-in-error, unknown
4734
+ *
4735
+ * Publication status: https://hl7.org/fhir/valueset-publication-status.html
4736
+ * draft, active, retired, unknown
4737
+ *
4738
+ * Observation status: https://www.hl7.org/fhir/valueset-observation-status.html
4739
+ * registered, preliminary, final, amended, cancelled, entered-in-error, unknown
4740
+ *
4741
+ * DiagnosticReport status: https://hl7.org/fhir/valueset-diagnostic-report-status.html
4742
+ * registered, preliminary, final, amended, corrected, appended, cancelled, entered-in-error, unknown
4743
+ *
4744
+ * Task status: https://hl7.org/fhir/valueset-task-status.html
4745
+ * draft, requested, received, accepted, rejected, ready, cancelled, in-progress, on-hold, failed, completed, entered-in-error
4746
+ *
4747
+ * Appointment status: https://www.hl7.org/fhir/valueset-appointmentstatus.html
4748
+ * proposed, pending, booked, arrived, fulfilled, cancelled, noshow, entered-in-error, chcked-in, waitlist
4749
+ */
4750
+ const statusToColor = {
4751
+ draft: 'blue',
4752
+ active: 'blue',
4753
+ 'on-hold': 'yellow',
4754
+ revoked: 'red',
4755
+ completed: 'green',
4756
+ 'entered-in-error': 'red',
4757
+ unknown: 'gray',
4758
+ retired: 'gray',
4759
+ registered: 'blue',
4760
+ preliminary: 'blue',
4761
+ final: 'green',
4762
+ amended: 'yellow',
4763
+ cancelled: 'red',
4764
+ requested: 'blue',
4765
+ received: 'blue',
4766
+ accepted: 'blue',
4767
+ rejected: 'red',
4768
+ ready: 'blue',
4769
+ 'in-progress': 'blue',
4770
+ failed: 'red',
4771
+ proposed: 'blue',
4772
+ pending: 'blue',
4773
+ booked: 'blue',
4774
+ arrived: 'blue',
4775
+ fulfilled: 'green',
4776
+ noshow: 'red',
4777
+ 'checked-in': 'blue',
4778
+ waitlist: 'gray',
4779
+ routine: 'gray',
4780
+ urgent: 'red',
4781
+ asap: 'red',
4782
+ stat: 'red',
4783
+ };
4728
4784
  function StatusBadge(props) {
4729
- return React__default["default"].createElement("span", { className: `medplum-status medplum-status-${props.status}` }, props.status);
4785
+ return React__default["default"].createElement(core$1.Badge, { color: statusToColor[props.status] }, props.status);
4730
4786
  }
4731
4787
 
4732
4788
  function RequestGroupDisplay(props) {
@@ -5071,7 +5127,7 @@
5071
5127
  if (!value) {
5072
5128
  return React__default["default"].createElement("div", null, "Loading...");
5073
5129
  }
5074
- return (React__default["default"].createElement("table", { className: "medplum-table" },
5130
+ return (React__default["default"].createElement(core$1.Table, { withBorder: true, withColumnBorders: true },
5075
5131
  React__default["default"].createElement("thead", null,
5076
5132
  React__default["default"].createElement("tr", null,
5077
5133
  React__default["default"].createElement("th", null, "Author"),
@@ -5311,56 +5367,6 @@
5311
5367
  }) }));
5312
5368
  }
5313
5369
 
5314
- function Tab(props) {
5315
- let className = 'medplum-tab';
5316
- if (props.selected) {
5317
- className += ' selected';
5318
- }
5319
- function clickHandler(e) {
5320
- killEvent(e);
5321
- // The onClick prop is set by TabBar as parent component.
5322
- // Using Tab outside of a TabBar is unsupported.
5323
- props.onClick(props.name, e.button);
5324
- }
5325
- return (React__default["default"].createElement("a", { href: `#${props.name}`, role: "tab", "aria-selected": props.selected, className: className, onClick: clickHandler, onAuxClick: clickHandler }, props.label));
5326
- }
5327
-
5328
- function TabList(props) {
5329
- return (React__default["default"].createElement(Scrollable, { className: "medplum-surface", height: 50 },
5330
- React__default["default"].createElement("div", { role: "tablist", className: "medplum-tablist" },
5331
- React__default["default"].createElement("div", { className: "medplum-tablist-foreground" }, React__default["default"].Children.map(props.children, (child, tabIndex) => {
5332
- if (React__default["default"].isValidElement(child) && child.type === Tab) {
5333
- return React__default["default"].cloneElement(child, {
5334
- selected: child.props.name === props.value,
5335
- onClick: props.onChange,
5336
- tabIndex,
5337
- });
5338
- }
5339
- else {
5340
- return null;
5341
- }
5342
- })))));
5343
- }
5344
-
5345
- function TabPanel(props) {
5346
- return React__default["default"].createElement("div", { role: "tabpanel" }, props.children);
5347
- }
5348
-
5349
- function TabSwitch(props) {
5350
- return (React__default["default"].createElement(React__default["default"].Fragment, null, React__default["default"].Children.map(props.children, (child) => {
5351
- if (React__default["default"].isValidElement(child) && child.type === TabPanel && child.props.name === props.value) {
5352
- return child;
5353
- }
5354
- else {
5355
- return null;
5356
- }
5357
- })));
5358
- }
5359
-
5360
- function TitleBar(props) {
5361
- return React__default["default"].createElement("div", { className: "medplum-title-bar" }, props.children);
5362
- }
5363
-
5364
5370
  exports.AddressDisplay = AddressDisplay;
5365
5371
  exports.AddressInput = AddressInput;
5366
5372
  exports.AttachmentArrayDisplay = AttachmentArrayDisplay;
@@ -5387,7 +5393,6 @@
5387
5393
  exports.EncounterTimeline = EncounterTimeline;
5388
5394
  exports.ErrorBoundary = ErrorBoundary;
5389
5395
  exports.FhirPathTable = FhirPathTable;
5390
- exports.FooterLinks = FooterLinks;
5391
5396
  exports.Form = Form;
5392
5397
  exports.FormSection = FormSection;
5393
5398
  exports.HumanNameDisplay = HumanNameDisplay;
@@ -5424,7 +5429,6 @@
5424
5429
  exports.ResourceTable = ResourceTable;
5425
5430
  exports.ResourceTimeline = ResourceTimeline;
5426
5431
  exports.Scheduler = Scheduler;
5427
- exports.Scrollable = Scrollable;
5428
5432
  exports.SearchChangeEvent = SearchChangeEvent;
5429
5433
  exports.SearchClickEvent = SearchClickEvent;
5430
5434
  exports.SearchControl = SearchControl;
@@ -5434,13 +5438,8 @@
5434
5438
  exports.ServiceRequestTimeline = ServiceRequestTimeline;
5435
5439
  exports.SignInForm = SignInForm;
5436
5440
  exports.StatusBadge = StatusBadge;
5437
- exports.Tab = Tab;
5438
- exports.TabList = TabList;
5439
- exports.TabPanel = TabPanel;
5440
- exports.TabSwitch = TabSwitch;
5441
5441
  exports.Timeline = Timeline;
5442
5442
  exports.TimelineItem = TimelineItem;
5443
- exports.TitleBar = TitleBar;
5444
5443
  exports.addDateEqualsFilter = addDateEqualsFilter;
5445
5444
  exports.addDateFilter = addDateFilter;
5446
5445
  exports.addDateFilterBetween = addDateFilterBetween;