@medplum/react 0.9.27 → 0.9.28

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 (59) hide show
  1. package/dist/cjs/index.js +272 -153
  2. package/dist/cjs/index.js.map +1 -1
  3. package/dist/cjs/index.min.js +1 -1
  4. package/dist/cjs/index.min.js.map +1 -1
  5. package/dist/cjs/styles.css +83 -79
  6. package/dist/esm/Autocomplete.d.ts +1 -0
  7. package/dist/esm/Autocomplete.js +4 -8
  8. package/dist/esm/Autocomplete.js.map +1 -1
  9. package/dist/esm/CodeableConceptDisplay.js +4 -2
  10. package/dist/esm/CodeableConceptDisplay.js.map +1 -1
  11. package/dist/esm/DateTimeInput.js +1 -3
  12. package/dist/esm/DateTimeInput.js.map +1 -1
  13. package/dist/esm/DiagnosticReportDisplay.js +2 -4
  14. package/dist/esm/DiagnosticReportDisplay.js.map +1 -1
  15. package/dist/esm/GoogleButton.js +2 -2
  16. package/dist/esm/GoogleButton.js.map +1 -1
  17. package/dist/esm/PlanDefinitionBuilder.js +108 -39
  18. package/dist/esm/PlanDefinitionBuilder.js.map +1 -1
  19. package/dist/esm/QuestionnaireForm.js +3 -0
  20. package/dist/esm/QuestionnaireForm.js.map +1 -1
  21. package/dist/esm/RequestGroupDisplay.js +2 -3
  22. package/dist/esm/RequestGroupDisplay.js.map +1 -1
  23. package/dist/esm/ResourceArrayInput.js +1 -2
  24. package/dist/esm/ResourceArrayInput.js.map +1 -1
  25. package/dist/esm/ResourceHistoryTable.js +2 -3
  26. package/dist/esm/ResourceHistoryTable.js.map +1 -1
  27. package/dist/esm/ResourceInput.d.ts +1 -0
  28. package/dist/esm/ResourceInput.js +4 -3
  29. package/dist/esm/ResourceInput.js.map +1 -1
  30. package/dist/esm/ResourcePropertyDisplay.js +5 -5
  31. package/dist/esm/ResourcePropertyDisplay.js.map +1 -1
  32. package/dist/esm/ResourcePropertyInput.js +3 -0
  33. package/dist/esm/ResourcePropertyInput.js.map +1 -1
  34. package/dist/esm/SearchFilterValueDisplay.js +2 -2
  35. package/dist/esm/SearchFilterValueDisplay.js.map +1 -1
  36. package/dist/esm/SearchUtils.js +2 -3
  37. package/dist/esm/SearchUtils.js.map +1 -1
  38. package/dist/esm/Timeline.js +2 -4
  39. package/dist/esm/Timeline.js.map +1 -1
  40. package/dist/esm/TimingInput.d.ts +8 -0
  41. package/dist/esm/TimingInput.js +90 -0
  42. package/dist/esm/TimingInput.js.map +1 -0
  43. package/dist/esm/index.d.ts +0 -1
  44. package/dist/esm/index.js +0 -1
  45. package/dist/esm/index.js.map +1 -1
  46. package/dist/esm/index.min.js +1 -1
  47. package/dist/esm/index.min.js.map +1 -1
  48. package/dist/esm/stories/Autocomplete.stories.d.ts +1 -0
  49. package/dist/esm/stories/CodeableConceptDisplay.stories.d.ts +8 -0
  50. package/dist/esm/stories/TimingInput.stories.d.ts +6 -0
  51. package/dist/esm/styles.css +83 -79
  52. package/package.json +5 -5
  53. package/stats.html +4034 -0
  54. package/dist/esm/DateTimeDisplay.d.ts +0 -5
  55. package/dist/esm/DateTimeDisplay.js +0 -11
  56. package/dist/esm/DateTimeDisplay.js.map +0 -1
  57. package/dist/esm/PeriodDisplay.d.ts +0 -6
  58. package/dist/esm/PeriodDisplay.js +0 -16
  59. package/dist/esm/PeriodDisplay.js.map +0 -1
package/dist/cjs/index.js CHANGED
@@ -333,7 +333,7 @@
333
333
  var _a, _b;
334
334
  const inputRef = React.useRef(null);
335
335
  const [focused, setFocused] = React.useState(false);
336
- const [lastValue, setLastValue] = React.useState('');
336
+ const [lastValue, setLastValue] = React.useState(undefined);
337
337
  const [timer, setTimer] = React.useState();
338
338
  const [dropDownVisible, setDropDownVisible] = React.useState(false);
339
339
  const [values, setValues] = React.useState((_a = props.defaultValue) !== null && _a !== void 0 ? _a : []);
@@ -387,6 +387,9 @@
387
387
  }
388
388
  function handleFocus() {
389
389
  setFocused(true);
390
+ if (props.loadOnFocus) {
391
+ handleInput();
392
+ }
390
393
  }
391
394
  function handleBlur() {
392
395
  setFocused(false);
@@ -526,13 +529,6 @@
526
529
  // Nothing has changed, move on
527
530
  return;
528
531
  }
529
- if (!value) {
530
- setDropDownVisible(false);
531
- setLastValue('');
532
- setOptions([]);
533
- setSelectedIndex(-1);
534
- return;
535
- }
536
532
  setLastValue(value);
537
533
  const newAbortController = new AbortController();
538
534
  setAbortController(newAbortController);
@@ -845,8 +841,10 @@
845
841
  if (value.text) {
846
842
  return React__default["default"].createElement(React__default["default"].Fragment, null, value.text);
847
843
  }
848
- if (value.coding && value.coding.length > 0) {
849
- return React__default["default"].createElement(CodingDisplay, { value: value.coding[0] });
844
+ if (value.coding) {
845
+ 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 },
846
+ index > 0 && React__default["default"].createElement(React__default["default"].Fragment, null, ', '),
847
+ React__default["default"].createElement(CodingDisplay, { value: coding }))))));
850
848
  }
851
849
  return null;
852
850
  }
@@ -888,13 +886,6 @@
888
886
  _a.map((telecom, index) => (React__default["default"].createElement(ContactPointDisplay, { key: 'telecom-' + index, value: telecom })))));
889
887
  }
890
888
 
891
- function DateTimeDisplay(props) {
892
- if (!props.value) {
893
- return null;
894
- }
895
- return React__default["default"].createElement(React__default["default"].Fragment, null, new Date(props.value).toLocaleString());
896
- }
897
-
898
889
  function HumanNameDisplay(props) {
899
890
  const name = props.value;
900
891
  if (!name) {
@@ -911,17 +902,6 @@
911
902
  _b.value));
912
903
  }
913
904
 
914
- function PeriodDisplay(props) {
915
- const value = props.value;
916
- if (!value || (!value.start && !value.end)) {
917
- return null;
918
- }
919
- return (React__default["default"].createElement("span", null,
920
- React__default["default"].createElement(DateTimeDisplay, { value: value.start }),
921
- "-",
922
- React__default["default"].createElement(DateTimeDisplay, { value: value.end })));
923
- }
924
-
925
905
  function QuantityDisplay(props) {
926
906
  return React__default["default"].createElement(React__default["default"].Fragment, null, formatQuantityString(props.value));
927
907
  }
@@ -1023,7 +1003,7 @@
1023
1003
  return React__default["default"].createElement(ReferenceDisplay, { value: { reference: value }, link: props.link });
1024
1004
  case core.PropertyType.dateTime:
1025
1005
  case core.PropertyType.instant:
1026
- return React__default["default"].createElement(DateTimeDisplay, { value: value });
1006
+ return React__default["default"].createElement("div", null, core.formatDateTime(value));
1027
1007
  case core.PropertyType.markdown:
1028
1008
  return React__default["default"].createElement("pre", null, value);
1029
1009
  case core.PropertyType.Address:
@@ -1045,7 +1025,7 @@
1045
1025
  case core.PropertyType.Identifier:
1046
1026
  return React__default["default"].createElement(IdentifierDisplay, { value: value });
1047
1027
  case core.PropertyType.Period:
1048
- return React__default["default"].createElement(PeriodDisplay, { value: value });
1028
+ return React__default["default"].createElement("div", null, core.formatPeriod(value));
1049
1029
  case core.PropertyType.Quantity:
1050
1030
  return React__default["default"].createElement(QuantityDisplay, { value: value });
1051
1031
  case core.PropertyType.Range:
@@ -1054,6 +1034,8 @@
1054
1034
  return React__default["default"].createElement(RatioDisplay, { value: value });
1055
1035
  case core.PropertyType.Reference:
1056
1036
  return React__default["default"].createElement(ReferenceDisplay, { value: value, link: props.link });
1037
+ case core.PropertyType.Timing:
1038
+ return React__default["default"].createElement("div", null, core.formatTiming(value));
1057
1039
  default:
1058
1040
  if (!(property === null || property === void 0 ? void 0 : property.path)) {
1059
1041
  throw Error(`Displaying property of type ${props.propertyType} requires element definition path`);
@@ -1313,7 +1295,7 @@
1313
1295
  // See: https://developer.mozilla.org/en-US/docs/Web/HTML/Date_and_time_formats#local_date_and_time_strings
1314
1296
  // See: https://stackoverflow.com/a/60368477
1315
1297
  const date = new Date(isoString);
1316
- if (!isValidDate(date)) {
1298
+ if (!core.isValidDate(date)) {
1317
1299
  // If the input string was malformed, return an empty string.
1318
1300
  return '';
1319
1301
  }
@@ -1332,15 +1314,12 @@
1332
1314
  // JavaScript's Date() constructor defaults to the local time zone.
1333
1315
  // The Date() constructor will throw if the value is malformed.
1334
1316
  const date = new Date(localString);
1335
- if (!isValidDate(date)) {
1317
+ if (!core.isValidDate(date)) {
1336
1318
  // If the input string was malformed, return an empty string.
1337
1319
  return '';
1338
1320
  }
1339
1321
  return date.toISOString();
1340
1322
  }
1341
- function isValidDate(date) {
1342
- return date instanceof Date && !isNaN(date.getTime());
1343
- }
1344
1323
 
1345
1324
  function TextArea(props) {
1346
1325
  const className = 'medplum-textarea' + (props.monospace ? ' monospace' : '');
@@ -1493,6 +1472,31 @@
1493
1472
  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 })) })));
1494
1473
  }
1495
1474
 
1475
+ /******************************************************************************
1476
+ Copyright (c) Microsoft Corporation.
1477
+
1478
+ Permission to use, copy, modify, and/or distribute this software for any
1479
+ purpose with or without fee is hereby granted.
1480
+
1481
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
1482
+ REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
1483
+ AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
1484
+ INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
1485
+ LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
1486
+ OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
1487
+ PERFORMANCE OF THIS SOFTWARE.
1488
+ ***************************************************************************** */
1489
+
1490
+ function __awaiter(thisArg, _arguments, P, generator) {
1491
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
1492
+ return new (P || (P = Promise))(function (resolve, reject) {
1493
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
1494
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
1495
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
1496
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
1497
+ });
1498
+ }
1499
+
1496
1500
  function ResourceName(props) {
1497
1501
  const resource = useResource(props.value);
1498
1502
  if (!resource) {
@@ -1517,18 +1521,18 @@
1517
1521
  props.onChange(newValue);
1518
1522
  }
1519
1523
  }
1520
- return (React__default["default"].createElement(Autocomplete, { loadOptions: (input) => {
1524
+ return (React__default["default"].createElement(Autocomplete, { loadOptions: (input) => __awaiter(this, void 0, void 0, function* () {
1521
1525
  return medplum
1522
1526
  .search(resourceTypeRef.current, 'name=' + encodeURIComponent(input) + '&_count=10')
1523
1527
  .then((bundle) => bundle.entry.map((entry) => entry.resource));
1524
- }, getId: (item) => {
1528
+ }), getId: (item) => {
1525
1529
  return item.id;
1526
1530
  }, getIcon: (item) => React__default["default"].createElement(Avatar, { value: item }), getDisplay: (item) => React__default["default"].createElement(ResourceName, { value: item }), getHelpText: (item) => {
1527
1531
  if (item.resourceType === 'Patient' && item.birthDate) {
1528
1532
  return 'DoB: ' + item.birthDate;
1529
1533
  }
1530
1534
  return undefined;
1531
- }, name: props.name, defaultValue: value ? [value] : undefined, className: props.className, placeholder: props.placeholder, onChange: (items) => {
1535
+ }, name: props.name, defaultValue: value ? [value] : undefined, className: props.className, placeholder: props.placeholder, loadOnFocus: props.loadOnFocus, onChange: (items) => {
1532
1536
  setValueWrapper(items.length > 0 ? items[0] : undefined);
1533
1537
  } }));
1534
1538
  }
@@ -1567,8 +1571,7 @@
1567
1571
  }
1568
1572
 
1569
1573
  function ResourceArrayInput(props) {
1570
- var _a;
1571
- const [values, setValues] = React.useState((_a = props.defaultValue) !== null && _a !== void 0 ? _a : []);
1574
+ const [values, setValues] = React.useState(props.defaultValue && Array.isArray(props.defaultValue) ? props.defaultValue : []);
1572
1575
  const valuesRef = React.useRef();
1573
1576
  valuesRef.current = values;
1574
1577
  function setValuesWrapper(newValues) {
@@ -1607,6 +1610,120 @@
1607
1610
  } }, "Add"))))));
1608
1611
  }
1609
1612
 
1613
+ function Dialog(props) {
1614
+ const [x, setX] = React.useState(100);
1615
+ const [y, setY] = React.useState(100);
1616
+ if (!props.visible) {
1617
+ return null;
1618
+ }
1619
+ function handleMouseDown(downEvent) {
1620
+ killEvent(downEvent);
1621
+ const dragX = downEvent.clientX - x;
1622
+ const dragY = downEvent.clientY - y;
1623
+ function handleMouseMove(moveEvent) {
1624
+ killEvent(moveEvent);
1625
+ setX(moveEvent.clientX - dragX);
1626
+ setY(moveEvent.clientY - dragY);
1627
+ }
1628
+ function handleMouseUp(upEvent) {
1629
+ killEvent(upEvent);
1630
+ document.removeEventListener('mouseup', handleMouseUp, true);
1631
+ document.removeEventListener('mousemove', handleMouseMove, true);
1632
+ }
1633
+ document.addEventListener('mouseup', handleMouseUp, true);
1634
+ document.addEventListener('mousemove', handleMouseMove, true);
1635
+ }
1636
+ return (React__default["default"].createElement(React__default["default"].Fragment, null,
1637
+ React__default["default"].createElement("div", { className: "modal-dialog-bg" }),
1638
+ React__default["default"].createElement("div", { className: "modal-dialog", "data-testid": "dialog", tabIndex: 0, style: { left: x + 'px', top: y + 'px' } },
1639
+ React__default["default"].createElement("div", { className: "modal-dialog-title", onMouseDown: (e) => handleMouseDown(e) },
1640
+ React__default["default"].createElement("span", { className: "modal-dialog-title-text" }, props.title),
1641
+ React__default["default"].createElement("span", { className: "modal-dialog-title-close", tabIndex: 0, onClick: props.onCancel },
1642
+ React__default["default"].createElement("svg", { xmlns: "http://www.w3.org/2000/svg", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor" },
1643
+ React__default["default"].createElement("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M6 18L18 6M6 6l12 12" })))),
1644
+ React__default["default"].createElement("div", { className: "modal-dialog-content" }, props.children),
1645
+ React__default["default"].createElement("div", { className: "modal-dialog-buttons" },
1646
+ React__default["default"].createElement(Button, { testid: "dialog-ok", onClick: props.onOk }, "OK"),
1647
+ React__default["default"].createElement(Button, { testid: "dialog-cancel", onClick: props.onCancel }, "Cancel")))));
1648
+ }
1649
+
1650
+ const daysOfWeek = ['sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat'];
1651
+ function TimingInput(props) {
1652
+ const [value, setValue] = React.useState(props.defaultValue || {});
1653
+ const [open, setOpen] = React.useState(false);
1654
+ const valueRef = React.useRef();
1655
+ valueRef.current = value;
1656
+ return (React__default["default"].createElement(React__default["default"].Fragment, null,
1657
+ React__default["default"].createElement(InputRow, null,
1658
+ React__default["default"].createElement("span", null, core.formatTiming(valueRef.current) || 'No repeat'),
1659
+ React__default["default"].createElement(Button, { onClick: () => setOpen(true) }, "Edit")),
1660
+ React__default["default"].createElement(TimingEditorDialog, { visible: open, defaultValue: valueRef.current, onOk: (newValue) => {
1661
+ if (props.onChange) {
1662
+ props.onChange(newValue);
1663
+ }
1664
+ setValue(newValue);
1665
+ setOpen(false);
1666
+ }, onCancel: () => setOpen(false) })));
1667
+ }
1668
+ function TimingEditorDialog(props) {
1669
+ var _a, _b;
1670
+ const [value, setValue] = React.useState(props.defaultValue || {});
1671
+ const valueRef = React.useRef();
1672
+ valueRef.current = value;
1673
+ function setStart(newStart) {
1674
+ setValue(Object.assign(Object.assign({}, valueRef.current), { event: [newStart] }));
1675
+ }
1676
+ function setRepeat(repeat) {
1677
+ setValue(Object.assign(Object.assign({}, valueRef.current), { repeat }));
1678
+ }
1679
+ function setPeriod(newPeriod) {
1680
+ var _a;
1681
+ setRepeat(Object.assign(Object.assign({}, (_a = valueRef.current) === null || _a === void 0 ? void 0 : _a.repeat), { period: newPeriod }));
1682
+ }
1683
+ function setPeriodUnit(newPeriodUnit) {
1684
+ var _a;
1685
+ setRepeat(Object.assign(Object.assign({}, (_a = valueRef.current) === null || _a === void 0 ? void 0 : _a.repeat), { periodUnit: newPeriodUnit }));
1686
+ }
1687
+ function setDayOfWeek(day, enabled) {
1688
+ if (enabled) {
1689
+ addDayOfWeek(day);
1690
+ }
1691
+ else {
1692
+ removeDayOfWeek(day);
1693
+ }
1694
+ }
1695
+ function addDayOfWeek(day) {
1696
+ var _a, _b, _c;
1697
+ const existing = ((_b = (_a = valueRef.current) === null || _a === void 0 ? void 0 : _a.repeat) === null || _b === void 0 ? void 0 : _b.dayOfWeek) || [];
1698
+ if (!existing.includes(day)) {
1699
+ setRepeat(Object.assign(Object.assign({}, (_c = valueRef.current) === null || _c === void 0 ? void 0 : _c.repeat), { dayOfWeek: [...existing, day] }));
1700
+ }
1701
+ }
1702
+ function removeDayOfWeek(day) {
1703
+ var _a, _b, _c;
1704
+ const existing = ((_b = (_a = valueRef.current) === null || _a === void 0 ? void 0 : _a.repeat) === null || _b === void 0 ? void 0 : _b.dayOfWeek) || [];
1705
+ if (existing.includes(day)) {
1706
+ setRepeat(Object.assign(Object.assign({}, (_c = valueRef.current) === null || _c === void 0 ? void 0 : _c.repeat), { dayOfWeek: existing.filter((d) => d !== day) }));
1707
+ }
1708
+ }
1709
+ return (React__default["default"].createElement(Dialog, { title: "Timing", visible: props.visible, onOk: () => props.onOk(value), onCancel: () => props.onCancel() },
1710
+ React__default["default"].createElement("div", { style: { padding: '5px 20px', textAlign: 'left' } },
1711
+ React__default["default"].createElement(FormSection, { title: "Starts on", htmlFor: 'timing-dialog-start' },
1712
+ React__default["default"].createElement(DateTimeInput, { name: 'timing-dialog-start', onChange: (newValue) => setStart(newValue) })),
1713
+ React__default["default"].createElement(FormSection, { title: "Repeat every", htmlFor: 'timing-dialog-period' },
1714
+ React__default["default"].createElement(InputRow, null,
1715
+ React__default["default"].createElement(Input, { type: "number", step: 1, name: 'timing-dialog-period', defaultValue: (_a = value === null || value === void 0 ? void 0 : value.repeat) === null || _a === void 0 ? void 0 : _a.period, onChange: (newValue) => setPeriod(parseInt(newValue)) }),
1716
+ React__default["default"].createElement(Select, { name: 'timing-dialog-periodUnit', defaultValue: (_b = value === null || value === void 0 ? void 0 : value.repeat) === null || _b === void 0 ? void 0 : _b.periodUnit, onChange: (newValue) => setPeriodUnit(newValue) },
1717
+ React__default["default"].createElement("option", { value: "d" }, "day"),
1718
+ React__default["default"].createElement("option", { value: "wk" }, "week"),
1719
+ React__default["default"].createElement("option", { value: "mo" }, "month"),
1720
+ React__default["default"].createElement("option", { value: "a" }, "year")))),
1721
+ React__default["default"].createElement(FormSection, { title: "Repeat on" },
1722
+ React__default["default"].createElement(InputRow, null, daysOfWeek.map((day) => (React__default["default"].createElement(React__default["default"].Fragment, { key: day },
1723
+ React__default["default"].createElement("label", { htmlFor: 'timing-dialog-repeat-' + day }, day.charAt(0).toUpperCase()),
1724
+ React__default["default"].createElement(Checkbox, { name: 'timing-dialog-repeat-' + day, onChange: (newValue) => setDayOfWeek(day, newValue) })))))))));
1725
+ }
1726
+
1610
1727
  function ResourcePropertyInput(props) {
1611
1728
  var _a, _b, _c;
1612
1729
  const property = props.property;
@@ -1719,6 +1836,8 @@
1719
1836
  return React__default["default"].createElement(RatioInput, { name: name, defaultValue: value, onChange: props.onChange });
1720
1837
  case core.PropertyType.Reference:
1721
1838
  return (React__default["default"].createElement(ReferenceInput, { name: name, defaultValue: value, targetTypes: getTargetTypes(property), onChange: props.onChange }));
1839
+ case core.PropertyType.Timing:
1840
+ return React__default["default"].createElement(TimingInput, { name: name, defaultValue: value, onChange: props.onChange });
1722
1841
  default:
1723
1842
  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 }));
1724
1843
  }
@@ -1808,8 +1927,7 @@
1808
1927
  React__default["default"].createElement(ResourceBadge, { value: interpreter, link: true }))))),
1809
1928
  diagnosticReport.issued && (React__default["default"].createElement("dl", null,
1810
1929
  React__default["default"].createElement("dt", null, "Issued"),
1811
- React__default["default"].createElement("dd", null,
1812
- React__default["default"].createElement(DateTimeDisplay, { value: diagnosticReport.issued })))),
1930
+ React__default["default"].createElement("dd", null, core.formatDateTime(diagnosticReport.issued)))),
1813
1931
  diagnosticReport.status && (React__default["default"].createElement("dl", null,
1814
1932
  React__default["default"].createElement("dt", null, "Status"),
1815
1933
  React__default["default"].createElement("dd", null, core.capitalize(diagnosticReport.status))))),
@@ -2104,8 +2222,7 @@
2104
2222
  React__default["default"].createElement("div", { className: "medplum-timeline-item-title" },
2105
2223
  React__default["default"].createElement(ResourceName, { value: author, link: true }),
2106
2224
  React__default["default"].createElement("div", { className: "medplum-timeline-item-subtitle" },
2107
- React__default["default"].createElement(MedplumLink, { to: props.resource },
2108
- React__default["default"].createElement(DateTimeDisplay, { value: (_c = props.resource.meta) === null || _c === void 0 ? void 0 : _c.lastUpdated })),
2225
+ React__default["default"].createElement(MedplumLink, { to: props.resource }, core.formatDateTime((_c = props.resource.meta) === null || _c === void 0 ? void 0 : _c.lastUpdated)),
2109
2226
  React__default["default"].createElement("span", null, "\u00B7"),
2110
2227
  React__default["default"].createElement(MedplumLink, { to: props.resource }, props.resource.resourceType))),
2111
2228
  props.popupMenuItems && (React__default["default"].createElement("div", { className: "medplum-timeline-item-actions" },
@@ -2551,43 +2668,6 @@
2551
2668
  return { name };
2552
2669
  }
2553
2670
 
2554
- function Dialog(props) {
2555
- const [x, setX] = React.useState(100);
2556
- const [y, setY] = React.useState(100);
2557
- if (!props.visible) {
2558
- return null;
2559
- }
2560
- function handleMouseDown(downEvent) {
2561
- killEvent(downEvent);
2562
- const dragX = downEvent.clientX - x;
2563
- const dragY = downEvent.clientY - y;
2564
- function handleMouseMove(moveEvent) {
2565
- killEvent(moveEvent);
2566
- setX(moveEvent.clientX - dragX);
2567
- setY(moveEvent.clientY - dragY);
2568
- }
2569
- function handleMouseUp(upEvent) {
2570
- killEvent(upEvent);
2571
- document.removeEventListener('mouseup', handleMouseUp, true);
2572
- document.removeEventListener('mousemove', handleMouseMove, true);
2573
- }
2574
- document.addEventListener('mouseup', handleMouseUp, true);
2575
- document.addEventListener('mousemove', handleMouseMove, true);
2576
- }
2577
- return (React__default["default"].createElement(React__default["default"].Fragment, null,
2578
- React__default["default"].createElement("div", { className: "modal-dialog-bg" }),
2579
- React__default["default"].createElement("div", { className: "modal-dialog", "data-testid": "dialog", tabIndex: 0, style: { left: x + 'px', top: y + 'px' } },
2580
- React__default["default"].createElement("div", { className: "modal-dialog-title", onMouseDown: (e) => handleMouseDown(e) },
2581
- React__default["default"].createElement("span", { className: "modal-dialog-title-text" }, props.title),
2582
- React__default["default"].createElement("span", { className: "modal-dialog-title-close", tabIndex: 0, onClick: props.onCancel },
2583
- React__default["default"].createElement("svg", { xmlns: "http://www.w3.org/2000/svg", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor" },
2584
- React__default["default"].createElement("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M6 18L18 6M6 6l12 12" })))),
2585
- React__default["default"].createElement("div", { className: "modal-dialog-content" }, props.children),
2586
- React__default["default"].createElement("div", { className: "modal-dialog-buttons" },
2587
- React__default["default"].createElement(Button, { testid: "dialog-ok", onClick: props.onOk }, "OK"),
2588
- React__default["default"].createElement(Button, { testid: "dialog-cancel", onClick: props.onCancel }, "Cancel")))));
2589
- }
2590
-
2591
2671
  const searchParamToOperators = {
2592
2672
  string: [core.Operator.EQUALS, core.Operator.NOT, core.Operator.CONTAINS, core.Operator.EXACT],
2593
2673
  fulltext: [core.Operator.EQUALS, core.Operator.NOT, core.Operator.CONTAINS, core.Operator.EXACT],
@@ -3023,7 +3103,7 @@
3023
3103
  return (_a = resource.meta) === null || _a === void 0 ? void 0 : _a.versionId;
3024
3104
  }
3025
3105
  if (key === '_lastUpdated') {
3026
- return React__default["default"].createElement(DateTimeDisplay, { value: (_b = resource.meta) === null || _b === void 0 ? void 0 : _b.lastUpdated });
3106
+ return core.formatDateTime((_b = resource.meta) === null || _b === void 0 ? void 0 : _b.lastUpdated);
3027
3107
  }
3028
3108
  // Priority 1: ElementDefinition by exact match
3029
3109
  if (field.elementDefinition && `${resource.resourceType}.${field.name}` === field.elementDefinition.path) {
@@ -3263,7 +3343,7 @@
3263
3343
  return React__default["default"].createElement(ResourceName, { value: { reference: filter.value } });
3264
3344
  }
3265
3345
  if (props.filter.code === '_lastUpdated' || (searchParam === null || searchParam === void 0 ? void 0 : searchParam.type) === 'datetime') {
3266
- return React__default["default"].createElement(DateTimeDisplay, { value: filter.value });
3346
+ return React__default["default"].createElement(React__default["default"].Fragment, null, core.formatDateTime(filter.value));
3267
3347
  }
3268
3348
  return React__default["default"].createElement(React__default["default"].Fragment, null, filter.value);
3269
3349
  }
@@ -3951,31 +4031,6 @@
3951
4031
  return React__default["default"].createElement("div", { className: "medplum-footer" }, props.children);
3952
4032
  }
3953
4033
 
3954
- /******************************************************************************
3955
- Copyright (c) Microsoft Corporation.
3956
-
3957
- Permission to use, copy, modify, and/or distribute this software for any
3958
- purpose with or without fee is hereby granted.
3959
-
3960
- THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
3961
- REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
3962
- AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
3963
- INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
3964
- LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
3965
- OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
3966
- PERFORMANCE OF THIS SOFTWARE.
3967
- ***************************************************************************** */
3968
-
3969
- function __awaiter(thisArg, _arguments, P, generator) {
3970
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3971
- return new (P || (P = Promise))(function (resolve, reject) {
3972
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
3973
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
3974
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
3975
- step((generator = generator.apply(thisArg, _arguments || [])).next());
3976
- });
3977
- }
3978
-
3979
4034
  function HeaderSearchInput(props) {
3980
4035
  const medplum = useMedplum();
3981
4036
  return (React__default["default"].createElement(Autocomplete, { loadOptions: (input, signal) => __awaiter(this, void 0, void 0, function* () {
@@ -4274,14 +4329,33 @@
4274
4329
  }
4275
4330
 
4276
4331
  function PlanDefinitionBuilder(props) {
4332
+ const medplum = useMedplum();
4277
4333
  const defaultValue = useResource(props.value);
4334
+ const [schema, setSchema] = React.useState(undefined);
4335
+ const [selectedKey, setSelectedKey] = React.useState();
4336
+ const [hoverKey, setHoverKey] = React.useState();
4278
4337
  const [value, setValue] = React.useState();
4338
+ function handleDocumentMouseOver() {
4339
+ setHoverKey(undefined);
4340
+ }
4341
+ function handleDocumentClick() {
4342
+ setSelectedKey(undefined);
4343
+ }
4279
4344
  const valueRef = React.useRef();
4280
4345
  valueRef.current = value;
4346
+ React.useEffect(() => {
4347
+ medplum.requestSchema('PlanDefinition').then(setSchema);
4348
+ }, [medplum]);
4281
4349
  React.useEffect(() => {
4282
4350
  setValue(ensurePlanDefinitionKeys(defaultValue !== null && defaultValue !== void 0 ? defaultValue : { resourceType: 'PlanDefinition' }));
4351
+ document.addEventListener('mouseover', handleDocumentMouseOver);
4352
+ document.addEventListener('click', handleDocumentClick);
4353
+ return () => {
4354
+ document.removeEventListener('mouseover', handleDocumentMouseOver);
4355
+ document.removeEventListener('click', handleDocumentClick);
4356
+ };
4283
4357
  }, [defaultValue]);
4284
- if (!value) {
4358
+ if (!schema || !value) {
4285
4359
  return null;
4286
4360
  }
4287
4361
  function changeProperty(property, newValue) {
@@ -4289,9 +4363,9 @@
4289
4363
  }
4290
4364
  return (React__default["default"].createElement("div", { className: "medplum-questionnaire-builder" },
4291
4365
  React__default["default"].createElement(Form, { testid: "questionnaire-form", onSubmit: () => props.onSubmit(value) },
4292
- React__default["default"].createElement(FormSection, { title: "Plan Title", description: "The display name of the 'Plan', something that can be ordered.", htmlFor: "title" },
4366
+ React__default["default"].createElement(FormSection, { title: "Plan Title", htmlFor: "title" },
4293
4367
  React__default["default"].createElement(Input, { defaultValue: value.title, onChange: (newValue) => changeProperty('title', newValue) })),
4294
- React__default["default"].createElement(ActionArrayBuilder, { actions: value.action || [], onChange: (x) => changeProperty('action', x) }),
4368
+ React__default["default"].createElement(ActionArrayBuilder, { actions: value.action || [], selectedKey: selectedKey, setSelectedKey: setSelectedKey, hoverKey: hoverKey, setHoverKey: setHoverKey, onChange: (x) => changeProperty('action', x) }),
4295
4369
  React__default["default"].createElement(Button, { type: "submit", size: "large" }, "Save"))));
4296
4370
  }
4297
4371
  function ActionArrayBuilder(props) {
@@ -4302,75 +4376,102 @@
4302
4376
  }
4303
4377
  function addAction(addedAction) {
4304
4378
  props.onChange([...actionsRef.current, addedAction]);
4379
+ props.setSelectedKey(addedAction.id);
4305
4380
  }
4306
4381
  function removeAction(removedAction) {
4307
4382
  props.onChange(actionsRef.current.filter((i) => i !== removedAction));
4308
4383
  }
4309
4384
  return (React__default["default"].createElement("div", { className: "section" },
4310
- props.actions.map((i) => (React__default["default"].createElement("div", { key: i.id },
4311
- React__default["default"].createElement(ActionBuilder, { action: i, onChange: changeAction, onRemove: () => removeAction(i) })))),
4385
+ props.actions.map((action) => (React__default["default"].createElement("div", { key: action.id },
4386
+ React__default["default"].createElement(ActionBuilder, { action: action, selectedKey: props.selectedKey, setSelectedKey: props.setSelectedKey, hoverKey: props.hoverKey, setHoverKey: props.setHoverKey, onChange: changeAction, onRemove: () => removeAction(action) })))),
4312
4387
  React__default["default"].createElement("div", { className: "bottom-actions" },
4313
4388
  React__default["default"].createElement("a", { href: "#", onClick: (e) => {
4314
- e.preventDefault();
4389
+ killEvent(e);
4315
4390
  addAction({ id: generateId$1() });
4316
4391
  } }, "Add action"))));
4317
4392
  }
4318
4393
  function ActionBuilder(props) {
4319
4394
  const { action } = props;
4320
- const [actionType, setActionType] = React.useState(getInitialActionType(action));
4321
- const actionRef = React.useRef();
4322
- actionRef.current = props.action;
4395
+ const actionType = getInitialActionType(action);
4396
+ const editing = props.selectedKey === props.action.id;
4397
+ const hovering = props.hoverKey === props.action.id;
4398
+ function onClick(e) {
4399
+ e.stopPropagation();
4400
+ props.setSelectedKey(props.action.id);
4401
+ }
4402
+ function onHover(e) {
4403
+ killEvent(e);
4404
+ props.setHoverKey(props.action.id);
4405
+ }
4406
+ const className = editing ? 'section editing' : hovering ? 'section hovering' : 'section';
4407
+ return (React__default["default"].createElement("div", { "data-testid": action.id, className: className, onClick: onClick, onMouseOver: onHover },
4408
+ 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 })),
4409
+ React__default["default"].createElement("div", { className: "bottom-actions" },
4410
+ React__default["default"].createElement("a", { href: "#", onClick: (e) => {
4411
+ e.preventDefault();
4412
+ props.onRemove();
4413
+ } }, "Remove"))));
4414
+ }
4415
+ const timingProperty = {
4416
+ path: 'PlanDefinition.action.timing[x]',
4417
+ min: 0,
4418
+ max: '1',
4419
+ type: [{ code: 'dateTime' }, { code: 'Period' }, { code: 'Range' }, { code: 'Timing' }],
4420
+ };
4421
+ function ActionDisplay(props) {
4422
+ const { action, actionType } = props;
4423
+ const [propertyValue, propertyType] = getActionTiming(action);
4424
+ return (React__default["default"].createElement("div", null,
4425
+ React__default["default"].createElement("div", null,
4426
+ action.title || 'Untitled',
4427
+ " ",
4428
+ actionType && `(${actionType})`),
4429
+ action.definitionCanonical && (React__default["default"].createElement("div", null,
4430
+ React__default["default"].createElement(ReferenceDisplay, { value: { reference: action.definitionCanonical } }))),
4431
+ propertyValue && (React__default["default"].createElement("div", null,
4432
+ React__default["default"].createElement(ResourcePropertyDisplay, { property: timingProperty, propertyType: propertyType, value: propertyValue })))));
4433
+ }
4434
+ function ActionEditor(props) {
4435
+ const { action } = props;
4436
+ const [actionType, setActionType] = React.useState(props.actionType);
4323
4437
  function changeProperty(property, value) {
4324
- props.onChange(Object.assign(Object.assign({}, actionRef.current), { [property]: value }));
4438
+ props.onChange(Object.assign(Object.assign({}, action), { [property]: value }));
4325
4439
  }
4326
- return (React__default["default"].createElement("div", { className: "section" },
4327
- React__default["default"].createElement(FormSection, { title: "Action Title", description: "The name of the action, an operational task to be completed.", htmlFor: `actionTitle-${action.id}` },
4440
+ return (React__default["default"].createElement(React__default["default"].Fragment, null,
4441
+ React__default["default"].createElement(FormSection, { title: "Title", htmlFor: `actionTitle-${action.id}` },
4328
4442
  React__default["default"].createElement(Input, { name: `actionTitle-${action.id}`, defaultValue: action.title, onChange: (newValue) => changeProperty('title', newValue) })),
4329
- React__default["default"].createElement(FormSection, { title: "Action Type", description: "The type of the action to be performed.", htmlFor: `actionType-${action.id}` },
4443
+ React__default["default"].createElement(FormSection, { title: "Type of Action", description: "The type of the action to be performed.", htmlFor: `actionType-${action.id}` },
4330
4444
  React__default["default"].createElement(Select, { name: `actionType-${action.id}`, defaultValue: actionType, onChange: setActionType },
4331
4445
  React__default["default"].createElement("option", null),
4332
4446
  React__default["default"].createElement("option", { value: "appointment" }, "Appointment"),
4333
- React__default["default"].createElement("option", { value: "documentation" }, "Documentation"),
4334
4447
  React__default["default"].createElement("option", { value: "lab" }, "Lab"),
4335
4448
  React__default["default"].createElement("option", { value: "questionnaire" }, "Questionnaire"),
4336
- React__default["default"].createElement("option", { value: "shipping" }, "Shipping"),
4337
4449
  React__default["default"].createElement("option", { value: "task" }, "Task"))),
4338
- action.action && action.action.length > 0 && (React__default["default"].createElement(ActionArrayBuilder, { actions: action.action, onChange: (x) => changeProperty('action', x) })),
4450
+ 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
4451
  (() => {
4340
4452
  switch (actionType) {
4341
4453
  case 'appointment':
4342
- return React__default["default"].createElement("div", null, "Appointment details");
4343
- case 'documentation':
4344
- return React__default["default"].createElement("div", null, "Documentation details");
4454
+ 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 }));
4345
4455
  case 'lab':
4346
- return React__default["default"].createElement(LabActionBuilder, { action: action, onChange: props.onChange });
4456
+ return (React__default["default"].createElement(ActionResourceTypeBuilder, { title: "Lab", description: "The subject must complete the following lab panel.", resourceType: "ActivityDefinition", action: action, onChange: props.onChange }));
4347
4457
  case 'questionnaire':
4348
- return React__default["default"].createElement(QuestionnaireActionBuilder, { action: action, onChange: props.onChange });
4349
- case 'shipping':
4350
- return React__default["default"].createElement("div", null, "Shipping details");
4458
+ return (React__default["default"].createElement(ActionResourceTypeBuilder, { title: "Questionnaire", description: "The subject must complete the selected questionnaire.", resourceType: "Questionnaire", action: action, onChange: props.onChange }));
4351
4459
  case 'task':
4352
- return React__default["default"].createElement("div", null, "Task details");
4460
+ return (React__default["default"].createElement(ActionResourceTypeBuilder, { title: "Task", description: "The subject must complete the following task.", resourceType: "ActivityDefinition", action: action, onChange: props.onChange }));
4353
4461
  default:
4354
4462
  return null;
4355
4463
  }
4356
4464
  })(),
4357
- React__default["default"].createElement("div", { className: "bottom-actions" },
4358
- React__default["default"].createElement("a", { href: "#", onClick: (e) => {
4359
- e.preventDefault();
4360
- props.onRemove();
4361
- } }, "Remove"))));
4362
- }
4363
- function LabActionBuilder(props) {
4364
- return (React__default["default"].createElement(FormSection, { title: "Lab Details", description: "Choose observations definitions", htmlFor: props.action.id },
4365
- React__default["default"].createElement("a", { href: "#", onClick: () => props.onChange(props.action) }, "Add")));
4465
+ React__default["default"].createElement(FormSection, { title: "Timing", description: "When the action should take place.", htmlFor: 'timing-' + action.id },
4466
+ React__default["default"].createElement(ActionTimingInput, { name: 'timing-' + action.id, action: action, onChange: props.onChange }))));
4366
4467
  }
4367
- function QuestionnaireActionBuilder(props) {
4468
+ function ActionResourceTypeBuilder(props) {
4368
4469
  const { id, definitionCanonical } = props.action;
4369
- const questionnaireRef = (definitionCanonical === null || definitionCanonical === void 0 ? void 0 : definitionCanonical.startsWith('Questionnaire/'))
4470
+ const reference = (definitionCanonical === null || definitionCanonical === void 0 ? void 0 : definitionCanonical.startsWith(props.resourceType + '/'))
4370
4471
  ? { reference: definitionCanonical }
4371
4472
  : undefined;
4372
- return (React__default["default"].createElement(FormSection, { title: "Questionnaire", description: "Choose questionnaire", htmlFor: id },
4373
- React__default["default"].createElement(ResourceInput, { name: id, resourceType: "Questionnaire", defaultValue: questionnaireRef, onChange: (newValue) => {
4473
+ return (React__default["default"].createElement(FormSection, { title: props.title, description: props.description, htmlFor: id },
4474
+ React__default["default"].createElement(ResourceInput, { name: id, resourceType: props.resourceType, defaultValue: reference, loadOnFocus: true, onChange: (newValue) => {
4374
4475
  if (newValue) {
4375
4476
  props.onChange(Object.assign(Object.assign({}, props.action), { definitionCanonical: core.getReferenceString(newValue) }));
4376
4477
  }
@@ -4379,13 +4480,30 @@
4379
4480
  }
4380
4481
  } })));
4381
4482
  }
4483
+ function ActionTimingInput(props) {
4484
+ const value = props.action;
4485
+ const key = 'timing';
4486
+ const [propertyValue, propertyType] = getActionTiming(value);
4487
+ return (React__default["default"].createElement(ResourcePropertyInput, { property: timingProperty, name: "timing[x]", defaultValue: propertyValue, defaultPropertyType: propertyType, onChange: (newValue, propName) => {
4488
+ props.onChange(setPropertyValue(value, key, propName !== null && propName !== void 0 ? propName : key, timingProperty, newValue));
4489
+ } }));
4490
+ }
4382
4491
  function getInitialActionType(action) {
4383
- var _a;
4384
- if ((_a = action.definitionCanonical) === null || _a === void 0 ? void 0 : _a.startsWith('Questionnaire/')) {
4492
+ var _a, _b, _c;
4493
+ if ((_a = action.definitionCanonical) === null || _a === void 0 ? void 0 : _a.startsWith('Schedule')) {
4494
+ return 'appointment';
4495
+ }
4496
+ if ((_b = action.definitionCanonical) === null || _b === void 0 ? void 0 : _b.startsWith('Questionnaire/')) {
4385
4497
  return 'questionnaire';
4386
4498
  }
4499
+ if ((_c = action.definitionCanonical) === null || _c === void 0 ? void 0 : _c.startsWith('ActivityDefinition/')) {
4500
+ return 'task';
4501
+ }
4387
4502
  return undefined;
4388
4503
  }
4504
+ function getActionTiming(action) {
4505
+ return getValueAndType({ type: 'PlanDefinitionAction', value: action }, 'timing');
4506
+ }
4389
4507
  let nextId$1 = 1;
4390
4508
  /**
4391
4509
  * Generates a unique ID.
@@ -4586,12 +4704,14 @@
4586
4704
  function onChangeItem(newResponseItems) {
4587
4705
  props.onChange({
4588
4706
  linkId: item.linkId,
4707
+ text: item.text,
4589
4708
  item: newResponseItems,
4590
4709
  });
4591
4710
  }
4592
4711
  function onChangeAnswer(newResponseAnswer) {
4593
4712
  props.onChange({
4594
4713
  linkId: item.linkId,
4714
+ text: item.text,
4595
4715
  answer: [newResponseAnswer],
4596
4716
  });
4597
4717
  }
@@ -4692,6 +4812,7 @@
4692
4812
  var _a, _b;
4693
4813
  return {
4694
4814
  linkId: item.linkId,
4815
+ text: item.text,
4695
4816
  item: buildInitialResponseItems(item.item),
4696
4817
  answer: (_b = (_a = item.initial) === null || _a === void 0 ? void 0 : _a.map(buildInitialResponseAnswer)) !== null && _b !== void 0 ? _b : [],
4697
4818
  };
@@ -4958,9 +5079,9 @@
4958
5079
  return clientId;
4959
5080
  }
4960
5081
  const origin = window.location.protocol + '//' + window.location.host;
4961
- const authorizedOrigins = (_b = (_a = "undefined") === null || _a === void 0 ? void 0 : _a.split(',')) !== null && _b !== void 0 ? _b : [];
5082
+ const authorizedOrigins = (_b = (_a = "http://localhost:3000,http://localhost:6006,https://app.medplum.com,https://docs.medplum.com") === null || _a === void 0 ? void 0 : _a.split(',')) !== null && _b !== void 0 ? _b : [];
4962
5083
  if (authorizedOrigins.includes(origin)) {
4963
- return "undefined";
5084
+ return "921088377005-3j1sa10vr6hj86jgmdfh2l53v3mp7lfi.apps.googleusercontent.com";
4964
5085
  }
4965
5086
  return undefined;
4966
5087
  }
@@ -5126,7 +5247,7 @@
5126
5247
  "Last edited by\u00A0",
5127
5248
  React__default["default"].createElement(ResourceName, { value: (_e = task === null || task === void 0 ? void 0 : task.meta) === null || _e === void 0 ? void 0 : _e.author }),
5128
5249
  "\u00A0on\u00A0",
5129
- React__default["default"].createElement(DateTimeDisplay, { value: (_f = task === null || task === void 0 ? void 0 : task.meta) === null || _f === void 0 ? void 0 : _f.lastUpdated })),
5250
+ core.formatDateTime((_f = task === null || task === void 0 ? void 0 : task.meta) === null || _f === void 0 ? void 0 : _f.lastUpdated)),
5130
5251
  React__default["default"].createElement("div", null,
5131
5252
  "Status: ",
5132
5253
  React__default["default"].createElement(StatusBadge, { status: (task === null || task === void 0 ? void 0 : task.status) || 'unknown' }))),
@@ -5451,8 +5572,7 @@
5451
5572
  return (React__default["default"].createElement("tr", null,
5452
5573
  React__default["default"].createElement("td", null,
5453
5574
  React__default["default"].createElement(ResourceBadge, { value: (_a = props.version.meta) === null || _a === void 0 ? void 0 : _a.author, link: true })),
5454
- React__default["default"].createElement("td", null,
5455
- React__default["default"].createElement(DateTimeDisplay, { value: (_b = props.version.meta) === null || _b === void 0 ? void 0 : _b.lastUpdated })),
5575
+ React__default["default"].createElement("td", null, core.formatDateTime((_b = props.version.meta) === null || _b === void 0 ? void 0 : _b.lastUpdated)),
5456
5576
  React__default["default"].createElement("td", null,
5457
5577
  React__default["default"].createElement(MedplumLink, { to: getVersionUrl(props.version) }, (_c = props.version.meta) === null || _c === void 0 ? void 0 : _c.versionId))));
5458
5578
  }
@@ -5846,7 +5966,6 @@
5846
5966
  exports.ContactDetailInput = ContactDetailInput;
5847
5967
  exports.ContactPointDisplay = ContactPointDisplay;
5848
5968
  exports.ContactPointInput = ContactPointInput;
5849
- exports.DateTimeDisplay = DateTimeDisplay;
5850
5969
  exports.DateTimeInput = DateTimeInput;
5851
5970
  exports.DefaultResourceTimeline = DefaultResourceTimeline;
5852
5971
  exports.DiagnosticReportDisplay = DiagnosticReportDisplay;