@medplum/react 2.0.0 → 2.0.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 (25) hide show
  1. package/dist/cjs/ReferenceRangeEditor/ReferenceRangeEditor.d.ts +1 -2
  2. package/dist/cjs/ResourceTimeline/ResourceTimeline.d.ts +2 -2
  3. package/dist/cjs/index.cjs +54 -117
  4. package/dist/cjs/index.cjs.map +1 -1
  5. package/dist/cjs/index.min.cjs +1 -1
  6. package/dist/esm/DefaultResourceTimeline/DefaultResourceTimeline.mjs +6 -18
  7. package/dist/esm/DefaultResourceTimeline/DefaultResourceTimeline.mjs.map +1 -1
  8. package/dist/esm/EncounterTimeline/EncounterTimeline.mjs +7 -24
  9. package/dist/esm/EncounterTimeline/EncounterTimeline.mjs.map +1 -1
  10. package/dist/esm/PatientTimeline/PatientTimeline.mjs +13 -20
  11. package/dist/esm/PatientTimeline/PatientTimeline.mjs.map +1 -1
  12. package/dist/esm/ReferenceRangeEditor/ReferenceRangeEditor.d.ts +1 -2
  13. package/dist/esm/ReferenceRangeEditor/ReferenceRangeEditor.mjs.map +1 -1
  14. package/dist/esm/ResourcePropertyDisplay/ResourcePropertyDisplay.mjs +2 -2
  15. package/dist/esm/ResourcePropertyDisplay/ResourcePropertyDisplay.mjs.map +1 -1
  16. package/dist/esm/ResourcePropertyInput/ResourcePropertyInput.mjs +2 -2
  17. package/dist/esm/ResourcePropertyInput/ResourcePropertyInput.mjs.map +1 -1
  18. package/dist/esm/ResourceTimeline/ResourceTimeline.d.ts +2 -2
  19. package/dist/esm/ResourceTimeline/ResourceTimeline.mjs +19 -24
  20. package/dist/esm/ResourceTimeline/ResourceTimeline.mjs.map +1 -1
  21. package/dist/esm/ServiceRequestTimeline/ServiceRequestTimeline.mjs +8 -30
  22. package/dist/esm/ServiceRequestTimeline/ServiceRequestTimeline.mjs.map +1 -1
  23. package/dist/esm/index.min.mjs +1 -1
  24. package/package.json +17 -17
  25. package/rollup.config.mjs +0 -110
@@ -1,13 +1,12 @@
1
1
  /// <reference types="react" />
2
2
  import { ObservationDefinition, ObservationDefinitionQualifiedInterval } from '@medplum/fhirtypes';
3
- declare const intervalFilters: readonly ["gender", "age", "gestationalAge", "context", "appliesTo"];
4
3
  export interface ReferenceRangeEditorProps {
5
4
  definition: ObservationDefinition;
6
5
  onSubmit: (result: ObservationDefinition) => void;
7
6
  }
8
7
  type IntervalGroup = {
9
8
  id: string;
10
- filters: Record<typeof intervalFilters[number], any>;
9
+ filters: Record<string, any>;
11
10
  intervals: ObservationDefinitionQualifiedInterval[];
12
11
  };
13
12
  export declare function ReferenceRangeEditor(props: ReferenceRangeEditorProps): JSX.Element;
@@ -1,9 +1,9 @@
1
1
  /// <reference types="react" />
2
- import { ProfileResource } from '@medplum/core';
2
+ import { MedplumClient, ProfileResource } from '@medplum/core';
3
3
  import { Attachment, Bundle, Communication, Media, Reference, Resource } from '@medplum/fhirtypes';
4
4
  export interface ResourceTimelineProps<T extends Resource> {
5
5
  value: T | Reference<T>;
6
- buildSearchRequests: (resource: T) => Bundle;
6
+ loadTimelineResources: (medplum: MedplumClient, resource: T) => Promise<Bundle[]>;
7
7
  createCommunication?: (resource: T, sender: ProfileResource, text: string) => Communication;
8
8
  createMedia?: (resource: T, operator: ProfileResource, attachment: Attachment) => Media;
9
9
  }
@@ -1244,7 +1244,7 @@
1244
1244
  if (!property?.path) {
1245
1245
  throw Error(`Displaying property of type ${props.propertyType} requires element definition path`);
1246
1246
  }
1247
- return (React.createElement(BackboneElementDisplay, { value: { type: core.buildTypeName(property?.path?.split('.')), value }, compact: true, ignoreMissingValues: props.ignoreMissingValues }));
1247
+ return (React.createElement(BackboneElementDisplay, { value: { type: core.getElementDefinitionTypeName(property), value }, compact: true, ignoreMissingValues: props.ignoreMissingValues }));
1248
1248
  }
1249
1249
  }
1250
1250
  /**
@@ -2241,7 +2241,7 @@
2241
2241
  case core.PropertyType.UsageContext:
2242
2242
  return (React.createElement(BackboneElementInput, { typeName: propertyType, defaultValue: value, onChange: props.onChange, outcome: props.outcome }));
2243
2243
  default:
2244
- return (React.createElement(BackboneElementInput, { typeName: core.buildTypeName(property.path?.split('.')), defaultValue: value, onChange: props.onChange, outcome: props.outcome }));
2244
+ return (React.createElement(BackboneElementInput, { typeName: core.getElementDefinitionTypeName(property), defaultValue: value, onChange: props.onChange, outcome: props.outcome }));
2245
2245
  }
2246
2246
  }
2247
2247
  function getTargetTypes(property) {
@@ -2799,7 +2799,7 @@
2799
2799
  const resource = useResource(props.value);
2800
2800
  const [history, setHistory] = React.useState();
2801
2801
  const [items, setItems] = React.useState([]);
2802
- const buildSearchRequests = props.buildSearchRequests;
2802
+ const loadTimelineResources = props.loadTimelineResources;
2803
2803
  const itemsRef = React.useRef(items);
2804
2804
  itemsRef.current = items;
2805
2805
  const loadTimeline = React.useCallback(() => {
@@ -2808,8 +2808,8 @@
2808
2808
  setHistory({});
2809
2809
  return;
2810
2810
  }
2811
- medplum.executeBatch(buildSearchRequests(resource)).then(handleBatchResponse).catch(console.log);
2812
- }, [medplum, resource, buildSearchRequests]);
2811
+ loadTimelineResources(medplum, resource).then(handleBatchResponse).catch(console.log);
2812
+ }, [medplum, resource, loadTimelineResources]);
2813
2813
  React.useEffect(() => {
2814
2814
  loadTimeline();
2815
2815
  }, [loadTimeline]);
@@ -2817,29 +2817,24 @@
2817
2817
  * Handles a batch request response.
2818
2818
  * @param batchResponse The batch response.
2819
2819
  */
2820
- function handleBatchResponse(batchResponse) {
2820
+ function handleBatchResponse(bundles) {
2821
2821
  const newItems = [];
2822
- if (batchResponse.entry) {
2823
- for (const batchEntry of batchResponse.entry) {
2824
- const bundle = batchEntry.resource;
2825
- if (!bundle) {
2826
- // User may not have access to all resource types
2827
- continue;
2828
- }
2829
- if (bundle.type === 'history') {
2830
- setHistory(bundle);
2831
- }
2832
- if (bundle.entry) {
2833
- for (const entry of bundle.entry) {
2834
- if (entry.resource) {
2835
- newItems.push(entry.resource);
2836
- }
2837
- }
2822
+ for (const bundle of bundles) {
2823
+ if (!bundle) {
2824
+ // User may not have access to all resource types
2825
+ continue;
2826
+ }
2827
+ if (bundle.type === 'history') {
2828
+ setHistory(bundle);
2829
+ }
2830
+ if (bundle.entry) {
2831
+ for (const entry of bundle.entry) {
2832
+ newItems.push(entry.resource);
2838
2833
  }
2839
2834
  }
2840
- sortByDateAndPriority(newItems);
2841
- newItems.reverse();
2842
2835
  }
2836
+ sortByDateAndPriority(newItems);
2837
+ newItems.reverse();
2843
2838
  setItems(newItems);
2844
2839
  }
2845
2840
  /**
@@ -2960,10 +2955,10 @@
2960
2955
  React.createElement(AttachmentButton, { onUpload: createMedia, onUploadStart: onUploadStart, onUploadProgress: onUploadProgress }, (props) => (React.createElement(core$1.ActionIcon, { ...props, radius: "xl", color: "blue", variant: "filled" },
2961
2956
  React.createElement(icons.IconCloudUpload, { size: 16 })))))))),
2962
2957
  items.map((item) => {
2958
+ const key = `${item.resourceType}/${item.id}/${item.meta?.versionId}`;
2963
2959
  if (item.resourceType === resource.resourceType && item.id === resource.id) {
2964
- return (React.createElement(HistoryTimelineItem, { key: item.meta?.versionId, history: history, resource: item, onDetails: onVersionDetails }));
2960
+ return (React.createElement(HistoryTimelineItem, { key: key, history: history, resource: item, onDetails: onVersionDetails }));
2965
2961
  }
2966
- const key = `${item.resourceType}/${item.id}`;
2967
2962
  switch (item.resourceType) {
2968
2963
  case 'AuditEvent':
2969
2964
  return React.createElement(AuditEventTimelineItem, { key: key, resource: item, onDetails: onDetails });
@@ -3052,51 +3047,22 @@
3052
3047
  }
3053
3048
 
3054
3049
  function DefaultResourceTimeline(props) {
3055
- return (React.createElement(ResourceTimeline, { value: props.resource, buildSearchRequests: (resource) => ({
3056
- resourceType: 'Bundle',
3057
- type: 'batch',
3058
- entry: [
3059
- {
3060
- request: {
3061
- method: 'GET',
3062
- url: `${core.getReferenceString(resource)}/_history`,
3063
- },
3064
- },
3065
- {
3066
- request: {
3067
- method: 'GET',
3068
- url: `AuditEvent?entity=${core.getReferenceString(resource)}&_sort=-_lastUpdated`,
3069
- },
3070
- },
3071
- ],
3072
- }) }));
3050
+ return (React.createElement(ResourceTimeline, { value: props.resource, loadTimelineResources: async (medplum, resource) => {
3051
+ return Promise.all([
3052
+ medplum.readHistory(resource.resourceType, resource.id),
3053
+ medplum.search('AuditEvent', '_sort=-_lastUpdated&entity=' + core.getReferenceString(resource)),
3054
+ ]);
3055
+ } }));
3073
3056
  }
3074
3057
 
3075
3058
  function EncounterTimeline(props) {
3076
- return (React.createElement(ResourceTimeline, { value: props.encounter, buildSearchRequests: (resource) => ({
3077
- resourceType: 'Bundle',
3078
- type: 'batch',
3079
- entry: [
3080
- {
3081
- request: {
3082
- method: 'GET',
3083
- url: `${core.getReferenceString(resource)}/_history`,
3084
- },
3085
- },
3086
- {
3087
- request: {
3088
- method: 'GET',
3089
- url: `Communication?encounter=${core.getReferenceString(resource)}`,
3090
- },
3091
- },
3092
- {
3093
- request: {
3094
- method: 'GET',
3095
- url: `Media?encounter=${core.getReferenceString(resource)}`,
3096
- },
3097
- },
3098
- ],
3099
- }), createCommunication: (resource, sender, text) => ({
3059
+ return (React.createElement(ResourceTimeline, { value: props.encounter, loadTimelineResources: async (medplum, resource) => {
3060
+ return Promise.all([
3061
+ medplum.readHistory('Encounter', resource.id),
3062
+ medplum.search('Communication', 'encounter=' + core.getReferenceString(resource)),
3063
+ medplum.search('Media', 'encounter=' + core.getReferenceString(resource)),
3064
+ ]);
3065
+ }, createCommunication: (resource, sender, text) => ({
3100
3066
  resourceType: 'Communication',
3101
3067
  status: 'completed',
3102
3068
  encounter: core.createReference(resource),
@@ -4569,26 +4535,19 @@
4569
4535
  }
4570
4536
  const MemoizedFhirPathTable = React.memo(FhirPathTable);
4571
4537
 
4572
- const searches = [
4573
- '$/_history',
4574
- 'Communication?subject=$',
4575
- 'Device?patient=$',
4576
- 'DeviceRequest?patient=$',
4577
- 'DiagnosticReport?subject=$',
4578
- 'Media?subject=$',
4579
- 'ServiceRequest?subject=$',
4580
- ];
4581
4538
  function PatientTimeline(props) {
4582
- return (React.createElement(ResourceTimeline, { value: props.patient, buildSearchRequests: (resource) => ({
4583
- resourceType: 'Bundle',
4584
- type: 'batch',
4585
- entry: searches.map((search) => ({
4586
- request: {
4587
- method: 'GET',
4588
- url: search.replaceAll('$', core.getReferenceString(resource)),
4589
- },
4590
- })),
4591
- }), createCommunication: (resource, sender, text) => ({
4539
+ const loadTimelineResources = React.useCallback((medplum, resource) => {
4540
+ return Promise.all([
4541
+ medplum.readHistory('Patient', resource.id),
4542
+ medplum.search('Communication', 'subject=' + core.getReferenceString(resource)),
4543
+ medplum.search('Device', 'patient=' + core.getReferenceString(resource)),
4544
+ medplum.search('DeviceRequest', 'patient=' + core.getReferenceString(resource)),
4545
+ medplum.search('DiagnosticReport', 'subject=' + core.getReferenceString(resource)),
4546
+ medplum.search('Media', 'subject=' + core.getReferenceString(resource)),
4547
+ medplum.search('ServiceRequest', 'subject=' + core.getReferenceString(resource)),
4548
+ ]);
4549
+ }, []);
4550
+ return (React.createElement(ResourceTimeline, { value: props.patient, loadTimelineResources: loadTimelineResources, createCommunication: (resource, sender, text) => ({
4592
4551
  resourceType: 'Communication',
4593
4552
  status: 'completed',
4594
4553
  subject: core.createReference(resource),
@@ -6175,36 +6134,14 @@
6175
6134
  }
6176
6135
 
6177
6136
  function ServiceRequestTimeline(props) {
6178
- return (React.createElement(ResourceTimeline, { value: props.serviceRequest, buildSearchRequests: (resource) => ({
6179
- resourceType: 'Bundle',
6180
- type: 'batch',
6181
- entry: [
6182
- {
6183
- request: {
6184
- method: 'GET',
6185
- url: `${core.getReferenceString(resource)}/_history`,
6186
- },
6187
- },
6188
- {
6189
- request: {
6190
- method: 'GET',
6191
- url: `Communication?based-on=${core.getReferenceString(resource)}&_sort=-_lastUpdated`,
6192
- },
6193
- },
6194
- {
6195
- request: {
6196
- method: 'GET',
6197
- url: `Media?_count=100&based-on=${core.getReferenceString(resource)}&_sort=-_lastUpdated`,
6198
- },
6199
- },
6200
- {
6201
- request: {
6202
- method: 'GET',
6203
- url: `DiagnosticReport?based-on=${core.getReferenceString(resource)}&_sort=-_lastUpdated`,
6204
- },
6205
- },
6206
- ],
6207
- }), createCommunication: (resource, sender, text) => ({
6137
+ return (React.createElement(ResourceTimeline, { value: props.serviceRequest, loadTimelineResources: async (medplum, resource) => {
6138
+ return Promise.all([
6139
+ medplum.readHistory('ServiceRequest', resource.id),
6140
+ medplum.search('Communication', 'based-on=' + core.getReferenceString(resource)),
6141
+ medplum.search('Media', '_count=100&based-on=' + core.getReferenceString(resource)),
6142
+ medplum.search('DiagnosticReport', 'based-on=' + core.getReferenceString(resource)),
6143
+ ]);
6144
+ }, createCommunication: (resource, sender, text) => ({
6208
6145
  resourceType: 'Communication',
6209
6146
  status: 'completed',
6210
6147
  basedOn: [core.createReference(resource)],