@medplum/react 0.10.0 → 0.10.2

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 (85) 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 +125 -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/stories/PlanDefinitionBuilder.stories.d.ts +2 -0
  15. package/dist/cjs/stories/RequestGroupDisplay.stories.d.ts +1 -0
  16. package/dist/cjs/stories/ResourceTable.stories.d.ts +4 -0
  17. package/dist/cjs/stories/covid19.d.ts +15 -0
  18. package/dist/cjs/styles.css +7 -195
  19. package/dist/esm/CodeInput.js +2 -2
  20. package/dist/esm/CodeInput.js.map +1 -1
  21. package/dist/esm/CodeableConceptInput.d.ts +1 -1
  22. package/dist/esm/CodeableConceptInput.js +1 -1
  23. package/dist/esm/CodeableConceptInput.js.map +1 -1
  24. package/dist/esm/CodingInput.d.ts +1 -1
  25. package/dist/esm/CodingInput.js +1 -1
  26. package/dist/esm/CodingInput.js.map +1 -1
  27. package/dist/esm/DiagnosticReportDisplay.d.ts +0 -1
  28. package/dist/esm/DiagnosticReportDisplay.js +6 -2
  29. package/dist/esm/DiagnosticReportDisplay.js.map +1 -1
  30. package/dist/esm/ResourceHistoryTable.d.ts +0 -1
  31. package/dist/esm/ResourceHistoryTable.js +2 -1
  32. package/dist/esm/ResourceHistoryTable.js.map +1 -1
  33. package/dist/esm/ResourceInput.js +6 -1
  34. package/dist/esm/ResourceInput.js.map +1 -1
  35. package/dist/esm/ResourceTimeline.js +11 -9
  36. package/dist/esm/ResourceTimeline.js.map +1 -1
  37. package/dist/esm/SearchFilterEditor.js +4 -3
  38. package/dist/esm/SearchFilterEditor.js.map +1 -1
  39. package/dist/esm/StatusBadge.d.ts +0 -1
  40. package/dist/esm/StatusBadge.js +55 -1
  41. package/dist/esm/StatusBadge.js.map +1 -1
  42. package/dist/esm/ValueSetAutocomplete.d.ts +1 -1
  43. package/dist/esm/ValueSetAutocomplete.js +48 -40
  44. package/dist/esm/ValueSetAutocomplete.js.map +1 -1
  45. package/dist/esm/index.d.ts +0 -7
  46. package/dist/esm/index.js +0 -7
  47. package/dist/esm/index.js.map +1 -1
  48. package/dist/esm/index.min.js +1 -1
  49. package/dist/esm/index.min.js.map +1 -1
  50. package/dist/esm/stories/CodeInput.stories.d.ts +6 -0
  51. package/dist/esm/stories/CodeableConceptInput.stories.d.ts +6 -0
  52. package/dist/esm/stories/PlanDefinitionBuilder.stories.d.ts +2 -0
  53. package/dist/esm/stories/RequestGroupDisplay.stories.d.ts +1 -0
  54. package/dist/esm/stories/ResourceTable.stories.d.ts +4 -0
  55. package/dist/esm/stories/covid19.d.ts +15 -0
  56. package/dist/esm/styles.css +7 -195
  57. package/package.json +6 -5
  58. package/dist/cjs/FooterLinks.d.ts +0 -6
  59. package/dist/cjs/Scrollable.d.ts +0 -9
  60. package/dist/cjs/Tab.d.ts +0 -12
  61. package/dist/cjs/TabList.d.ts +0 -10
  62. package/dist/cjs/TabPanel.d.ts +0 -6
  63. package/dist/cjs/TabSwitch.d.ts +0 -6
  64. package/dist/cjs/TitleBar.d.ts +0 -6
  65. package/dist/esm/FooterLinks.d.ts +0 -6
  66. package/dist/esm/FooterLinks.js +0 -8
  67. package/dist/esm/FooterLinks.js.map +0 -1
  68. package/dist/esm/Scrollable.d.ts +0 -9
  69. package/dist/esm/Scrollable.js +0 -12
  70. package/dist/esm/Scrollable.js.map +0 -1
  71. package/dist/esm/Tab.d.ts +0 -12
  72. package/dist/esm/Tab.js +0 -19
  73. package/dist/esm/Tab.js.map +0 -1
  74. package/dist/esm/TabList.d.ts +0 -10
  75. package/dist/esm/TabList.js +0 -23
  76. package/dist/esm/TabList.js.map +0 -1
  77. package/dist/esm/TabPanel.d.ts +0 -6
  78. package/dist/esm/TabPanel.js +0 -8
  79. package/dist/esm/TabPanel.js.map +0 -1
  80. package/dist/esm/TabSwitch.d.ts +0 -6
  81. package/dist/esm/TabSwitch.js +0 -16
  82. package/dist/esm/TabSwitch.js.map +0 -1
  83. package/dist/esm/TitleBar.d.ts +0 -6
  84. package/dist/esm/TitleBar.js +0 -8
  85. 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);
@@ -1636,6 +1644,11 @@
1636
1644
  const [value, setValue] = React.useState(defaultValue ? core.getDisplayString(defaultValue) : '');
1637
1645
  const [loading, setLoading] = React.useState(false);
1638
1646
  const [data, setData] = React.useState([]);
1647
+ React.useEffect(() => {
1648
+ if (defaultValue) {
1649
+ setValue(core.getDisplayString(defaultValue));
1650
+ }
1651
+ }, [defaultValue, setValue]);
1639
1652
  function loadValues(input) {
1640
1653
  return __awaiter(this, void 0, void 0, function* () {
1641
1654
  setLoading(true);
@@ -2058,7 +2071,7 @@
2058
2071
  }
2059
2072
  function ObservationTable(props) {
2060
2073
  var _a;
2061
- return (React__default["default"].createElement("table", { className: "medplum-table" },
2074
+ return (React__default["default"].createElement(core$1.Table, { withBorder: true, withColumnBorders: true },
2062
2075
  React__default["default"].createElement("thead", null,
2063
2076
  React__default["default"].createElement("tr", null,
2064
2077
  React__default["default"].createElement("th", null, "Test"),
@@ -2107,6 +2120,9 @@
2107
2120
  if (!range) {
2108
2121
  return null;
2109
2122
  }
2123
+ if (range.text) {
2124
+ return React__default["default"].createElement(React__default["default"].Fragment, null, range.text);
2125
+ }
2110
2126
  return React__default["default"].createElement(RangeDisplay, { value: range });
2111
2127
  }
2112
2128
  /**
@@ -2118,7 +2134,7 @@
2118
2134
  function isCritical(observation) {
2119
2135
  var _a, _b, _c, _d;
2120
2136
  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';
2137
+ return code === 'AA' || code === 'LL' || code === 'HH' || code === 'RR';
2122
2138
  }
2123
2139
 
2124
2140
  function ResourceDiffTable(props) {
@@ -2187,14 +2203,6 @@
2187
2203
  return (React__default["default"].createElement(BackboneElementDisplay, { value: { type: value.resourceType, value }, ignoreMissingValues: props.ignoreMissingValues }));
2188
2204
  }
2189
2205
 
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
2206
  /**
2199
2207
  * ErrorBoundary is a React component that handles errors in its child components.
2200
2208
  * See: https://reactjs.org/docs/error-boundaries.html
@@ -2422,10 +2430,13 @@
2422
2430
  input.focus();
2423
2431
  }
2424
2432
  } },
2425
- React__default["default"].createElement(core$1.Group, { noWrap: true },
2433
+ React__default["default"].createElement(core$1.Group, { spacing: "xs", noWrap: true, style: { width: '100%' } },
2426
2434
  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" })))))),
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 }))))))))),
2429
2440
  items.map((item) => {
2430
2441
  var _a;
2431
2442
  if (item.resourceType === resource.resourceType && item.id === resource.id) {
@@ -2498,7 +2509,7 @@
2498
2509
  }
2499
2510
  function AuditEventTimelineItem(props) {
2500
2511
  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,
2512
+ React__default["default"].createElement(core$1.ScrollArea, null,
2502
2513
  React__default["default"].createElement("pre", null, props.resource.outcomeDesc))));
2503
2514
  }
2504
2515
  function DiagnosticReportTimelineItem(props) {
@@ -3455,7 +3466,8 @@
3455
3466
  }
3456
3467
  }),
3457
3468
  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")));
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"))));
3459
3471
  }
3460
3472
  function FilterRowDisplay(props) {
3461
3473
  const { filter } = props;
@@ -3487,7 +3499,7 @@
3487
3499
  return (React__default["default"].createElement("tr", null,
3488
3500
  React__default["default"].createElement("td", null,
3489
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) })) })),
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) })) }))),
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) }))] }))),
3491
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 }))),
3492
3504
  React__default["default"].createElement("td", null,
3493
3505
  value.code && value.operator && value.value && (React__default["default"].createElement(core$1.Button, { compact: true, variant: "outline", onClick: () => {
@@ -4006,10 +4018,6 @@
4006
4018
  }
4007
4019
  const MemoizedFhirPathTable = React__default["default"].memo(FhirPathTable);
4008
4020
 
4009
- function FooterLinks(props) {
4010
- return React__default["default"].createElement("div", { className: "medplum-footer" }, props.children);
4011
- }
4012
-
4013
4021
  const searches = [
4014
4022
  '$/_history',
4015
4023
  'Communication?subject=$',
@@ -4725,8 +4733,61 @@
4725
4733
  return options.map((option) => (Object.assign(Object.assign({}, option), { id: option.id || generateId() })));
4726
4734
  }
4727
4735
 
4736
+ /*
4737
+ * Request status: https://hl7.org/fhir/valueset-request-status.html
4738
+ * draft, active, on-hold, revoked, completed, entered-in-error, unknown
4739
+ *
4740
+ * Publication status: https://hl7.org/fhir/valueset-publication-status.html
4741
+ * draft, active, retired, unknown
4742
+ *
4743
+ * Observation status: https://www.hl7.org/fhir/valueset-observation-status.html
4744
+ * registered, preliminary, final, amended, cancelled, entered-in-error, unknown
4745
+ *
4746
+ * DiagnosticReport status: https://hl7.org/fhir/valueset-diagnostic-report-status.html
4747
+ * registered, preliminary, final, amended, corrected, appended, cancelled, entered-in-error, unknown
4748
+ *
4749
+ * Task status: https://hl7.org/fhir/valueset-task-status.html
4750
+ * draft, requested, received, accepted, rejected, ready, cancelled, in-progress, on-hold, failed, completed, entered-in-error
4751
+ *
4752
+ * Appointment status: https://www.hl7.org/fhir/valueset-appointmentstatus.html
4753
+ * proposed, pending, booked, arrived, fulfilled, cancelled, noshow, entered-in-error, chcked-in, waitlist
4754
+ */
4755
+ const statusToColor = {
4756
+ draft: 'blue',
4757
+ active: 'blue',
4758
+ 'on-hold': 'yellow',
4759
+ revoked: 'red',
4760
+ completed: 'green',
4761
+ 'entered-in-error': 'red',
4762
+ unknown: 'gray',
4763
+ retired: 'gray',
4764
+ registered: 'blue',
4765
+ preliminary: 'blue',
4766
+ final: 'green',
4767
+ amended: 'yellow',
4768
+ cancelled: 'red',
4769
+ requested: 'blue',
4770
+ received: 'blue',
4771
+ accepted: 'blue',
4772
+ rejected: 'red',
4773
+ ready: 'blue',
4774
+ 'in-progress': 'blue',
4775
+ failed: 'red',
4776
+ proposed: 'blue',
4777
+ pending: 'blue',
4778
+ booked: 'blue',
4779
+ arrived: 'blue',
4780
+ fulfilled: 'green',
4781
+ noshow: 'red',
4782
+ 'checked-in': 'blue',
4783
+ waitlist: 'gray',
4784
+ routine: 'gray',
4785
+ urgent: 'red',
4786
+ asap: 'red',
4787
+ stat: 'red',
4788
+ };
4728
4789
  function StatusBadge(props) {
4729
- return React__default["default"].createElement("span", { className: `medplum-status medplum-status-${props.status}` }, props.status);
4790
+ return React__default["default"].createElement(core$1.Badge, { color: statusToColor[props.status] }, props.status);
4730
4791
  }
4731
4792
 
4732
4793
  function RequestGroupDisplay(props) {
@@ -5071,7 +5132,7 @@
5071
5132
  if (!value) {
5072
5133
  return React__default["default"].createElement("div", null, "Loading...");
5073
5134
  }
5074
- return (React__default["default"].createElement("table", { className: "medplum-table" },
5135
+ return (React__default["default"].createElement(core$1.Table, { withBorder: true, withColumnBorders: true },
5075
5136
  React__default["default"].createElement("thead", null,
5076
5137
  React__default["default"].createElement("tr", null,
5077
5138
  React__default["default"].createElement("th", null, "Author"),
@@ -5311,56 +5372,6 @@
5311
5372
  }) }));
5312
5373
  }
5313
5374
 
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
5375
  exports.AddressDisplay = AddressDisplay;
5365
5376
  exports.AddressInput = AddressInput;
5366
5377
  exports.AttachmentArrayDisplay = AttachmentArrayDisplay;
@@ -5387,7 +5398,6 @@
5387
5398
  exports.EncounterTimeline = EncounterTimeline;
5388
5399
  exports.ErrorBoundary = ErrorBoundary;
5389
5400
  exports.FhirPathTable = FhirPathTable;
5390
- exports.FooterLinks = FooterLinks;
5391
5401
  exports.Form = Form;
5392
5402
  exports.FormSection = FormSection;
5393
5403
  exports.HumanNameDisplay = HumanNameDisplay;
@@ -5424,7 +5434,6 @@
5424
5434
  exports.ResourceTable = ResourceTable;
5425
5435
  exports.ResourceTimeline = ResourceTimeline;
5426
5436
  exports.Scheduler = Scheduler;
5427
- exports.Scrollable = Scrollable;
5428
5437
  exports.SearchChangeEvent = SearchChangeEvent;
5429
5438
  exports.SearchClickEvent = SearchClickEvent;
5430
5439
  exports.SearchControl = SearchControl;
@@ -5434,13 +5443,8 @@
5434
5443
  exports.ServiceRequestTimeline = ServiceRequestTimeline;
5435
5444
  exports.SignInForm = SignInForm;
5436
5445
  exports.StatusBadge = StatusBadge;
5437
- exports.Tab = Tab;
5438
- exports.TabList = TabList;
5439
- exports.TabPanel = TabPanel;
5440
- exports.TabSwitch = TabSwitch;
5441
5446
  exports.Timeline = Timeline;
5442
5447
  exports.TimelineItem = TimelineItem;
5443
- exports.TitleBar = TitleBar;
5444
5448
  exports.addDateEqualsFilter = addDateEqualsFilter;
5445
5449
  exports.addDateFilter = addDateFilter;
5446
5450
  exports.addDateFilterBetween = addDateFilterBetween;