@medplum/react 2.0.1 → 2.0.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.
- package/dist/cjs/DiagnosticReportDisplay/DiagnosticReportDisplay.d.ts +2 -0
- package/dist/cjs/DiagnosticReportDisplay/DiagnosticReportDisplay.stories.d.ts +1 -0
- package/dist/cjs/MedplumProvider/MedplumProvider.d.ts +8 -0
- package/dist/cjs/NoteDisplay/NoteDisplay.d.ts +6 -0
- package/dist/cjs/{ResourceDiffTable/ResourceDiffTable.stories.d.ts → NoteDisplay/NoteDisplay.stories.d.ts} +3 -1
- package/dist/cjs/QuantityInput/QuantityInput.d.ts +1 -0
- package/dist/cjs/QuantityInput/QuantityInput.stories.d.ts +7 -0
- package/dist/cjs/index.cjs +1160 -1095
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/cjs/index.min.cjs +1 -1
- package/dist/esm/AddressDisplay/AddressDisplay.mjs +2 -2
- package/dist/esm/AddressDisplay/AddressDisplay.mjs.map +1 -1
- package/dist/esm/AddressInput/AddressInput.mjs +9 -9
- package/dist/esm/AddressInput/AddressInput.mjs.map +1 -1
- package/dist/esm/AnnotationInput/AnnotationInput.mjs +2 -2
- package/dist/esm/AnnotationInput/AnnotationInput.mjs.map +1 -1
- package/dist/esm/AsyncAutocomplete/AsyncAutocomplete.mjs +2 -2
- package/dist/esm/AsyncAutocomplete/AsyncAutocomplete.mjs.map +1 -1
- package/dist/esm/AttachmentArrayDisplay/AttachmentArrayDisplay.mjs +4 -4
- package/dist/esm/AttachmentArrayDisplay/AttachmentArrayDisplay.mjs.map +1 -1
- package/dist/esm/AttachmentArrayInput/AttachmentArrayInput.mjs +19 -19
- package/dist/esm/AttachmentArrayInput/AttachmentArrayInput.mjs.map +1 -1
- package/dist/esm/AttachmentButton/AttachmentButton.mjs +3 -3
- package/dist/esm/AttachmentButton/AttachmentButton.mjs.map +1 -1
- package/dist/esm/AttachmentDisplay/AttachmentDisplay.mjs +9 -9
- package/dist/esm/AttachmentDisplay/AttachmentDisplay.mjs.map +1 -1
- package/dist/esm/AttachmentInput/AttachmentInput.mjs +5 -5
- package/dist/esm/AttachmentInput/AttachmentInput.mjs.map +1 -1
- package/dist/esm/BackboneElementDisplay/BackboneElementDisplay.mjs +6 -6
- package/dist/esm/BackboneElementDisplay/BackboneElementDisplay.mjs.map +1 -1
- package/dist/esm/BackboneElementInput/BackboneElementInput.mjs +7 -7
- package/dist/esm/BackboneElementInput/BackboneElementInput.mjs.map +1 -1
- package/dist/esm/CalendarInput/CalendarInput.mjs +18 -18
- package/dist/esm/CalendarInput/CalendarInput.mjs.map +1 -1
- package/dist/esm/CheckboxFormSection/CheckboxFormSection.mjs +5 -5
- package/dist/esm/CheckboxFormSection/CheckboxFormSection.mjs.map +1 -1
- package/dist/esm/CodeInput/CodeInput.mjs +2 -2
- package/dist/esm/CodeInput/CodeInput.mjs.map +1 -1
- package/dist/esm/CodeableConceptDisplay/CodeableConceptDisplay.mjs +2 -2
- package/dist/esm/CodeableConceptDisplay/CodeableConceptDisplay.mjs.map +1 -1
- package/dist/esm/CodeableConceptInput/CodeableConceptInput.mjs +2 -2
- package/dist/esm/CodeableConceptInput/CodeableConceptInput.mjs.map +1 -1
- package/dist/esm/CodingDisplay/CodingDisplay.mjs +2 -2
- package/dist/esm/CodingDisplay/CodingDisplay.mjs.map +1 -1
- package/dist/esm/CodingInput/CodingInput.mjs +2 -2
- package/dist/esm/CodingInput/CodingInput.mjs.map +1 -1
- package/dist/esm/ContactDetailDisplay/ContactDetailDisplay.mjs +3 -3
- package/dist/esm/ContactDetailDisplay/ContactDetailDisplay.mjs.map +1 -1
- package/dist/esm/ContactDetailInput/ContactDetailInput.mjs +4 -4
- package/dist/esm/ContactDetailInput/ContactDetailInput.mjs.map +1 -1
- package/dist/esm/ContactPointDisplay/ContactPointDisplay.mjs +2 -2
- package/dist/esm/ContactPointDisplay/ContactPointDisplay.mjs.map +1 -1
- package/dist/esm/ContactPointInput/ContactPointInput.mjs +5 -5
- package/dist/esm/ContactPointInput/ContactPointInput.mjs.map +1 -1
- package/dist/esm/Container/Container.mjs +2 -2
- package/dist/esm/Container/Container.mjs.map +1 -1
- package/dist/esm/DateTimeInput/DateTimeInput.mjs +2 -2
- package/dist/esm/DateTimeInput/DateTimeInput.mjs.map +1 -1
- package/dist/esm/DefaultResourceTimeline/DefaultResourceTimeline.mjs +2 -2
- package/dist/esm/DefaultResourceTimeline/DefaultResourceTimeline.mjs.map +1 -1
- package/dist/esm/DescriptionList/DescriptionList.mjs +5 -5
- package/dist/esm/DescriptionList/DescriptionList.mjs.map +1 -1
- package/dist/esm/DiagnosticReportDisplay/DiagnosticReportDisplay.d.ts +2 -0
- package/dist/esm/DiagnosticReportDisplay/DiagnosticReportDisplay.mjs +56 -52
- package/dist/esm/DiagnosticReportDisplay/DiagnosticReportDisplay.mjs.map +1 -1
- package/dist/esm/DiagnosticReportDisplay/DiagnosticReportDisplay.stories.d.ts +1 -0
- package/dist/esm/Document/Document.mjs +3 -3
- package/dist/esm/Document/Document.mjs.map +1 -1
- package/dist/esm/EncounterTimeline/EncounterTimeline.mjs +2 -2
- package/dist/esm/EncounterTimeline/EncounterTimeline.mjs.map +1 -1
- package/dist/esm/ErrorBoundary/ErrorBoundary.mjs +4 -4
- package/dist/esm/ErrorBoundary/ErrorBoundary.mjs.map +1 -1
- package/dist/esm/ExtensionInput/ExtensionInput.mjs +2 -2
- package/dist/esm/ExtensionInput/ExtensionInput.mjs.map +1 -1
- package/dist/esm/FhirPathDisplay/FhirPathDisplay.mjs +2 -2
- package/dist/esm/FhirPathDisplay/FhirPathDisplay.mjs.map +1 -1
- package/dist/esm/FhirPathTable/FhirPathTable.mjs +19 -19
- package/dist/esm/FhirPathTable/FhirPathTable.mjs.map +1 -1
- package/dist/esm/Form/Form.mjs +2 -2
- package/dist/esm/Form/Form.mjs.map +1 -1
- package/dist/esm/FormSection/FormSection.mjs +2 -2
- package/dist/esm/FormSection/FormSection.mjs.map +1 -1
- package/dist/esm/GoogleButton/GoogleButton.mjs +8 -6
- package/dist/esm/GoogleButton/GoogleButton.mjs.map +1 -1
- package/dist/esm/HumanNameDisplay/HumanNameDisplay.mjs +2 -2
- package/dist/esm/HumanNameDisplay/HumanNameDisplay.mjs.map +1 -1
- package/dist/esm/HumanNameInput/HumanNameInput.mjs +7 -7
- package/dist/esm/HumanNameInput/HumanNameInput.mjs.map +1 -1
- package/dist/esm/IdentifierDisplay/IdentifierDisplay.mjs +2 -2
- package/dist/esm/IdentifierDisplay/IdentifierDisplay.mjs.map +1 -1
- package/dist/esm/IdentifierInput/IdentifierInput.mjs +4 -4
- package/dist/esm/IdentifierInput/IdentifierInput.mjs.map +1 -1
- package/dist/esm/Logo/Logo.mjs +8 -8
- package/dist/esm/Logo/Logo.mjs.map +1 -1
- package/dist/esm/MedplumLink/MedplumLink.mjs +4 -4
- package/dist/esm/MedplumLink/MedplumLink.mjs.map +1 -1
- package/dist/esm/MedplumProvider/MedplumProvider.d.ts +8 -0
- package/dist/esm/MedplumProvider/MedplumProvider.mjs +19 -3
- package/dist/esm/MedplumProvider/MedplumProvider.mjs.map +1 -1
- package/dist/esm/MoneyDisplay/MoneyDisplay.mjs +2 -2
- package/dist/esm/MoneyDisplay/MoneyDisplay.mjs.map +1 -1
- package/dist/esm/MoneyInput/MoneyInput.mjs +4 -4
- package/dist/esm/MoneyInput/MoneyInput.mjs.map +1 -1
- package/dist/esm/NoteDisplay/NoteDisplay.d.ts +6 -0
- package/dist/esm/NoteDisplay/NoteDisplay.mjs +18 -0
- package/dist/esm/NoteDisplay/NoteDisplay.mjs.map +1 -0
- package/dist/esm/{ResourceDiffTable/ResourceDiffTable.stories.d.ts → NoteDisplay/NoteDisplay.stories.d.ts} +3 -1
- package/dist/esm/OperationOutcomeAlert/OperationOutcomeAlert.mjs +3 -3
- package/dist/esm/OperationOutcomeAlert/OperationOutcomeAlert.mjs.map +1 -1
- package/dist/esm/Panel/Panel.mjs +2 -2
- package/dist/esm/Panel/Panel.mjs.map +1 -1
- package/dist/esm/PatientTimeline/PatientTimeline.mjs +2 -2
- package/dist/esm/PatientTimeline/PatientTimeline.mjs.map +1 -1
- package/dist/esm/PeriodInput/PeriodInput.mjs +4 -4
- package/dist/esm/PeriodInput/PeriodInput.mjs.map +1 -1
- package/dist/esm/PlanDefinitionBuilder/PlanDefinitionBuilder.mjs +34 -34
- package/dist/esm/PlanDefinitionBuilder/PlanDefinitionBuilder.mjs.map +1 -1
- package/dist/esm/QuantityDisplay/QuantityDisplay.mjs +2 -2
- package/dist/esm/QuantityDisplay/QuantityDisplay.mjs.map +1 -1
- package/dist/esm/QuantityInput/QuantityInput.d.ts +1 -0
- package/dist/esm/QuantityInput/QuantityInput.mjs +14 -8
- package/dist/esm/QuantityInput/QuantityInput.mjs.map +1 -1
- package/dist/esm/QuantityInput/QuantityInput.stories.d.ts +7 -0
- package/dist/esm/QuestionnaireBuilder/QuestionnaireBuilder.mjs +31 -31
- package/dist/esm/QuestionnaireBuilder/QuestionnaireBuilder.mjs.map +1 -1
- package/dist/esm/QuestionnaireForm/QuestionnaireForm.mjs +33 -33
- package/dist/esm/QuestionnaireForm/QuestionnaireForm.mjs.map +1 -1
- package/dist/esm/RangeDisplay/RangeDisplay.mjs +2 -2
- package/dist/esm/RangeDisplay/RangeDisplay.mjs.map +1 -1
- package/dist/esm/RangeInput/RangeInput.mjs +4 -4
- package/dist/esm/RangeInput/RangeInput.mjs.map +1 -1
- package/dist/esm/RatioDisplay/RatioDisplay.mjs +4 -4
- package/dist/esm/RatioDisplay/RatioDisplay.mjs.map +1 -1
- package/dist/esm/RatioInput/RatioInput.mjs +4 -4
- package/dist/esm/RatioInput/RatioInput.mjs.map +1 -1
- package/dist/esm/ReferenceDisplay/ReferenceDisplay.mjs +3 -3
- package/dist/esm/ReferenceDisplay/ReferenceDisplay.mjs.map +1 -1
- package/dist/esm/ReferenceInput/ReferenceInput.mjs +4 -4
- package/dist/esm/ReferenceInput/ReferenceInput.mjs.map +1 -1
- package/dist/esm/ReferenceRangeEditor/ReferenceRangeEditor.mjs +31 -31
- package/dist/esm/ReferenceRangeEditor/ReferenceRangeEditor.mjs.map +1 -1
- package/dist/esm/RequestGroupDisplay/RequestGroupDisplay.mjs +15 -15
- package/dist/esm/RequestGroupDisplay/RequestGroupDisplay.mjs.map +1 -1
- package/dist/esm/ResourceArrayDisplay/ResourceArrayDisplay.mjs +3 -3
- package/dist/esm/ResourceArrayDisplay/ResourceArrayDisplay.mjs.map +1 -1
- package/dist/esm/ResourceArrayInput/ResourceArrayInput.mjs +18 -18
- package/dist/esm/ResourceArrayInput/ResourceArrayInput.mjs.map +1 -1
- package/dist/esm/ResourceAvatar/ResourceAvatar.mjs +4 -4
- package/dist/esm/ResourceAvatar/ResourceAvatar.mjs.map +1 -1
- package/dist/esm/ResourceBadge/ResourceBadge.mjs +4 -4
- package/dist/esm/ResourceBadge/ResourceBadge.mjs.map +1 -1
- package/dist/esm/ResourceBlame/ResourceBlame.mjs +13 -13
- package/dist/esm/ResourceBlame/ResourceBlame.mjs.map +1 -1
- package/dist/esm/ResourceDiff/ResourceDiff.mjs +7 -7
- package/dist/esm/ResourceDiff/ResourceDiff.mjs.map +1 -1
- package/dist/esm/ResourceDiffTable/ResourceDiffTable.mjs +18 -18
- package/dist/esm/ResourceDiffTable/ResourceDiffTable.mjs.map +1 -1
- package/dist/esm/ResourceForm/ResourceForm.mjs +12 -12
- package/dist/esm/ResourceForm/ResourceForm.mjs.map +1 -1
- package/dist/esm/ResourceHistoryTable/ResourceHistoryTable.mjs +17 -17
- package/dist/esm/ResourceHistoryTable/ResourceHistoryTable.mjs.map +1 -1
- package/dist/esm/ResourceInput/ResourceInput.mjs +8 -8
- package/dist/esm/ResourceInput/ResourceInput.mjs.map +1 -1
- package/dist/esm/ResourceName/ResourceName.mjs +2 -2
- package/dist/esm/ResourceName/ResourceName.mjs.map +1 -1
- package/dist/esm/ResourcePropertyDisplay/ResourcePropertyDisplay.mjs +26 -26
- package/dist/esm/ResourcePropertyDisplay/ResourcePropertyDisplay.mjs.map +1 -1
- package/dist/esm/ResourcePropertyInput/ResourcePropertyInput.mjs +34 -34
- package/dist/esm/ResourcePropertyInput/ResourcePropertyInput.mjs.map +1 -1
- package/dist/esm/ResourceTable/ResourceTable.mjs +2 -2
- package/dist/esm/ResourceTable/ResourceTable.mjs.map +1 -1
- package/dist/esm/ResourceTimeline/ResourceTimeline.mjs +49 -50
- package/dist/esm/ResourceTimeline/ResourceTimeline.mjs.map +1 -1
- package/dist/esm/Scheduler/Scheduler.mjs +22 -22
- package/dist/esm/Scheduler/Scheduler.mjs.map +1 -1
- package/dist/esm/SearchControl/SearchControl.mjs +49 -49
- package/dist/esm/SearchControl/SearchControl.mjs.map +1 -1
- package/dist/esm/SearchControl/SearchUtils.mjs +4 -4
- package/dist/esm/SearchControl/SearchUtils.mjs.map +1 -1
- package/dist/esm/SearchFieldEditor/SearchFieldEditor.mjs +25 -25
- package/dist/esm/SearchFieldEditor/SearchFieldEditor.mjs.map +1 -1
- package/dist/esm/SearchFilterEditor/SearchFilterEditor.mjs +37 -37
- package/dist/esm/SearchFilterEditor/SearchFilterEditor.mjs.map +1 -1
- package/dist/esm/SearchFilterValueDialog/SearchFilterValueDialog.mjs +6 -6
- package/dist/esm/SearchFilterValueDialog/SearchFilterValueDialog.mjs.map +1 -1
- package/dist/esm/SearchFilterValueDisplay/SearchFilterValueDisplay.mjs +4 -4
- package/dist/esm/SearchFilterValueDisplay/SearchFilterValueDisplay.mjs.map +1 -1
- package/dist/esm/SearchFilterValueInput/SearchFilterValueInput.mjs +8 -8
- package/dist/esm/SearchFilterValueInput/SearchFilterValueInput.mjs.map +1 -1
- package/dist/esm/SearchPopupMenu/SearchPopupMenu.mjs +62 -62
- package/dist/esm/SearchPopupMenu/SearchPopupMenu.mjs.map +1 -1
- package/dist/esm/ServiceRequestTimeline/ServiceRequestTimeline.mjs +2 -2
- package/dist/esm/ServiceRequestTimeline/ServiceRequestTimeline.mjs.map +1 -1
- package/dist/esm/StatusBadge/StatusBadge.mjs +2 -2
- package/dist/esm/StatusBadge/StatusBadge.mjs.map +1 -1
- package/dist/esm/Timeline/Timeline.mjs +20 -20
- package/dist/esm/Timeline/Timeline.mjs.map +1 -1
- package/dist/esm/TimingInput/TimingInput.mjs +19 -19
- package/dist/esm/TimingInput/TimingInput.mjs.map +1 -1
- package/dist/esm/ValueSetAutocomplete/ValueSetAutocomplete.mjs +2 -2
- package/dist/esm/ValueSetAutocomplete/ValueSetAutocomplete.mjs.map +1 -1
- package/dist/esm/auth/AuthenticationForm.mjs +22 -22
- package/dist/esm/auth/AuthenticationForm.mjs.map +1 -1
- package/dist/esm/auth/ChooseProfileForm.mjs +11 -11
- package/dist/esm/auth/ChooseProfileForm.mjs.map +1 -1
- package/dist/esm/auth/ChooseScopeForm.mjs +9 -9
- package/dist/esm/auth/ChooseScopeForm.mjs.map +1 -1
- package/dist/esm/auth/MfaForm.mjs +12 -12
- package/dist/esm/auth/MfaForm.mjs.map +1 -1
- package/dist/esm/auth/NewProjectForm.mjs +12 -12
- package/dist/esm/auth/NewProjectForm.mjs.map +1 -1
- package/dist/esm/auth/NewUserForm.mjs +22 -22
- package/dist/esm/auth/NewUserForm.mjs.map +1 -1
- package/dist/esm/auth/RegisterForm.mjs +5 -5
- package/dist/esm/auth/RegisterForm.mjs.map +1 -1
- package/dist/esm/auth/SignInForm.mjs +8 -8
- package/dist/esm/auth/SignInForm.mjs.map +1 -1
- package/dist/esm/index.min.mjs +1 -1
- package/dist/esm/index.mjs +1 -1
- package/dist/esm/node_modules/@tabler/icons/icons-react/dist/index.esm.mjs +6 -0
- package/dist/esm/node_modules/@tabler/icons/icons-react/dist/index.esm.mjs.map +1 -0
- package/dist/esm/useResource/useResource.mjs +3 -0
- package/dist/esm/useResource/useResource.mjs.map +1 -1
- package/package.json +9 -14
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ReferenceDisplay.mjs","sources":["../../../src/ReferenceDisplay/ReferenceDisplay.tsx"],"sourcesContent":["import { stringify } from '@medplum/core';\nimport { Reference } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { MedplumLink } from '../MedplumLink/MedplumLink';\n\nexport interface ReferenceDisplayProps {\n value?: Reference;\n link?: boolean;\n}\n\nexport function ReferenceDisplay(props: ReferenceDisplayProps): JSX.Element | null {\n if (!props.value) {\n return null;\n }\n\n const displayString = props.value.display || props.value.reference || stringify(props.value);\n\n // The \"link\" prop defaults to \"true\"; undefined is treated as \"true\"\n // To disable the link, it must be explicitly \"false\"\n if (props.link !== false && props.value.reference) {\n return <MedplumLink to={props.value}>{displayString}</MedplumLink>;\n } else {\n return <>{displayString}</>;\n }\n}\n"],"names":[],"mappings":";;;;AAUM,SAAU,gBAAgB,CAAC,KAA4B,EAAA;AAC3D,IAAA,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE;AAChB,QAAA,OAAO,IAAI,CAAC;AACb,KAAA;IAED,MAAM,aAAa,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,KAAK,CAAC,SAAS,IAAI,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;;;IAI7F,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,SAAS,EAAE;QACjD,
|
|
1
|
+
{"version":3,"file":"ReferenceDisplay.mjs","sources":["../../../src/ReferenceDisplay/ReferenceDisplay.tsx"],"sourcesContent":["import { stringify } from '@medplum/core';\nimport { Reference } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { MedplumLink } from '../MedplumLink/MedplumLink';\n\nexport interface ReferenceDisplayProps {\n value?: Reference;\n link?: boolean;\n}\n\nexport function ReferenceDisplay(props: ReferenceDisplayProps): JSX.Element | null {\n if (!props.value) {\n return null;\n }\n\n const displayString = props.value.display || props.value.reference || stringify(props.value);\n\n // The \"link\" prop defaults to \"true\"; undefined is treated as \"true\"\n // To disable the link, it must be explicitly \"false\"\n if (props.link !== false && props.value.reference) {\n return <MedplumLink to={props.value}>{displayString}</MedplumLink>;\n } else {\n return <>{displayString}</>;\n }\n}\n"],"names":["React"],"mappings":";;;;AAUM,SAAU,gBAAgB,CAAC,KAA4B,EAAA;AAC3D,IAAA,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE;AAChB,QAAA,OAAO,IAAI,CAAC;AACb,KAAA;IAED,MAAM,aAAa,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,KAAK,CAAC,SAAS,IAAI,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;;;IAI7F,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,SAAS,EAAE;QACjD,OAAOA,UAAA,CAAA,aAAA,CAAC,WAAW,EAAA,EAAC,EAAE,EAAE,KAAK,CAAC,KAAK,EAAA,EAAG,aAAa,CAAe,CAAC;AACpE,KAAA;AAAM,SAAA;QACL,OAAOA,UAAA,CAAA,aAAA,CAAAA,UAAA,CAAA,QAAA,EAAA,IAAA,EAAG,aAAa,CAAI,CAAC;AAC7B,KAAA;AACH;;;;"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Group, NativeSelect, TextInput } from '@mantine/core';
|
|
2
2
|
import { createReference } from '@medplum/core';
|
|
3
|
-
import
|
|
3
|
+
import e__default, { useState, useRef } from 'react';
|
|
4
4
|
import { ResourceInput } from '../ResourceInput/ResourceInput.mjs';
|
|
5
5
|
|
|
6
6
|
function ReferenceInput(props) {
|
|
@@ -18,9 +18,9 @@ function ReferenceInput(props) {
|
|
|
18
18
|
props.onChange(newValue);
|
|
19
19
|
}
|
|
20
20
|
}
|
|
21
|
-
return (
|
|
22
|
-
targetTypes ? (
|
|
23
|
-
|
|
21
|
+
return (e__default.createElement(Group, { spacing: "xs", grow: true, noWrap: true },
|
|
22
|
+
targetTypes ? (e__default.createElement(NativeSelect, { "data-testid": "reference-input-resource-type-select", defaultValue: resourceType, onChange: (e) => setResourceType(e.currentTarget.value), data: targetTypes })) : (e__default.createElement(TextInput, { "data-testid": "reference-input-resource-type-input", defaultValue: resourceType, onChange: (e) => setResourceType(e.currentTarget.value) })),
|
|
23
|
+
e__default.createElement(ResourceInput, { resourceType: resourceType, name: props.name + '-id', placeholder: props.placeholder, defaultValue: value, onChange: (item) => {
|
|
24
24
|
setValueHelper(item ? createReference(item) : undefined);
|
|
25
25
|
} })));
|
|
26
26
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ReferenceInput.mjs","sources":["../../../src/ReferenceInput/ReferenceInput.tsx"],"sourcesContent":["import { Group, NativeSelect, TextInput } from '@mantine/core';\nimport { createReference } from '@medplum/core';\nimport { Reference, Resource, ResourceType } from '@medplum/fhirtypes';\nimport React, { useRef, useState } from 'react';\nimport { ResourceInput } from '../ResourceInput/ResourceInput';\n\nexport interface ReferenceInputProps {\n name: string;\n placeholder?: string;\n defaultValue?: Reference;\n targetTypes?: string[];\n onChange?: (value: Reference | undefined) => void;\n}\n\nexport function ReferenceInput(props: ReferenceInputProps): JSX.Element {\n const targetTypes = getTargetTypes(props.targetTypes);\n const initialResourceType = getInitialResourceType(props.defaultValue, targetTypes);\n const [value, setValue] = useState<Reference | undefined>(props.defaultValue);\n const [resourceType, setResourceType] = useState<string | undefined>(initialResourceType);\n\n const valueRef = useRef<Reference>();\n valueRef.current = value;\n\n const resourceTypeRef = useRef<string>();\n resourceTypeRef.current = resourceType;\n\n function setValueHelper(newValue: Reference | undefined): void {\n setValue(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n return (\n <Group spacing=\"xs\" grow noWrap>\n {targetTypes ? (\n <NativeSelect\n data-testid=\"reference-input-resource-type-select\"\n defaultValue={resourceType}\n onChange={(e) => setResourceType(e.currentTarget.value)}\n data={targetTypes}\n />\n ) : (\n <TextInput\n data-testid=\"reference-input-resource-type-input\"\n defaultValue={resourceType}\n onChange={(e) => setResourceType(e.currentTarget.value)}\n />\n )}\n <ResourceInput\n resourceType={resourceType as ResourceType}\n name={props.name + '-id'}\n placeholder={props.placeholder}\n defaultValue={value}\n onChange={(item: Resource | undefined) => {\n setValueHelper(item ? createReference(item) : undefined);\n }}\n />\n </Group>\n );\n}\n\nfunction getTargetTypes(targetTypes: string[] | undefined): string[] | undefined {\n if (!targetTypes || targetTypes.length === 0 || (targetTypes.length === 1 && targetTypes[0] === 'Resource')) {\n return undefined;\n }\n return targetTypes;\n}\n\nfunction getInitialResourceType(\n defaultValue: Reference | undefined,\n targetTypes: string[] | undefined\n): string | undefined {\n const defaultValueResourceType = defaultValue?.reference?.split('/')[0];\n if (defaultValueResourceType) {\n return defaultValueResourceType;\n }\n\n if (targetTypes && targetTypes.length > 0) {\n return targetTypes[0];\n }\n\n return undefined;\n}\n"],"names":[],"mappings":";;;;;AAcM,SAAU,cAAc,CAAC,KAA0B,EAAA;IACvD,MAAM,WAAW,GAAG,cAAc,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IACtD,MAAM,mBAAmB,GAAG,sBAAsB,CAAC,KAAK,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;AACpF,IAAA,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAwB,KAAK,CAAC,YAAY,CAAC,CAAC;IAC9E,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAqB,mBAAmB,CAAC,CAAC;AAE1F,IAAA,MAAM,QAAQ,GAAG,MAAM,EAAa,CAAC;AACrC,IAAA,QAAQ,CAAC,OAAO,GAAG,KAAK,CAAC;AAEzB,IAAA,MAAM,eAAe,GAAG,MAAM,EAAU,CAAC;AACzC,IAAA,eAAe,CAAC,OAAO,GAAG,YAAY,CAAC;IAEvC,SAAS,cAAc,CAAC,QAA+B,EAAA;QACrD,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACnB,IAAI,KAAK,CAAC,QAAQ,EAAE;AAClB,YAAA,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AAC1B,SAAA;KACF;IAED,
|
|
1
|
+
{"version":3,"file":"ReferenceInput.mjs","sources":["../../../src/ReferenceInput/ReferenceInput.tsx"],"sourcesContent":["import { Group, NativeSelect, TextInput } from '@mantine/core';\nimport { createReference } from '@medplum/core';\nimport { Reference, Resource, ResourceType } from '@medplum/fhirtypes';\nimport React, { useRef, useState } from 'react';\nimport { ResourceInput } from '../ResourceInput/ResourceInput';\n\nexport interface ReferenceInputProps {\n name: string;\n placeholder?: string;\n defaultValue?: Reference;\n targetTypes?: string[];\n onChange?: (value: Reference | undefined) => void;\n}\n\nexport function ReferenceInput(props: ReferenceInputProps): JSX.Element {\n const targetTypes = getTargetTypes(props.targetTypes);\n const initialResourceType = getInitialResourceType(props.defaultValue, targetTypes);\n const [value, setValue] = useState<Reference | undefined>(props.defaultValue);\n const [resourceType, setResourceType] = useState<string | undefined>(initialResourceType);\n\n const valueRef = useRef<Reference>();\n valueRef.current = value;\n\n const resourceTypeRef = useRef<string>();\n resourceTypeRef.current = resourceType;\n\n function setValueHelper(newValue: Reference | undefined): void {\n setValue(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n return (\n <Group spacing=\"xs\" grow noWrap>\n {targetTypes ? (\n <NativeSelect\n data-testid=\"reference-input-resource-type-select\"\n defaultValue={resourceType}\n onChange={(e) => setResourceType(e.currentTarget.value)}\n data={targetTypes}\n />\n ) : (\n <TextInput\n data-testid=\"reference-input-resource-type-input\"\n defaultValue={resourceType}\n onChange={(e) => setResourceType(e.currentTarget.value)}\n />\n )}\n <ResourceInput\n resourceType={resourceType as ResourceType}\n name={props.name + '-id'}\n placeholder={props.placeholder}\n defaultValue={value}\n onChange={(item: Resource | undefined) => {\n setValueHelper(item ? createReference(item) : undefined);\n }}\n />\n </Group>\n );\n}\n\nfunction getTargetTypes(targetTypes: string[] | undefined): string[] | undefined {\n if (!targetTypes || targetTypes.length === 0 || (targetTypes.length === 1 && targetTypes[0] === 'Resource')) {\n return undefined;\n }\n return targetTypes;\n}\n\nfunction getInitialResourceType(\n defaultValue: Reference | undefined,\n targetTypes: string[] | undefined\n): string | undefined {\n const defaultValueResourceType = defaultValue?.reference?.split('/')[0];\n if (defaultValueResourceType) {\n return defaultValueResourceType;\n }\n\n if (targetTypes && targetTypes.length > 0) {\n return targetTypes[0];\n }\n\n return undefined;\n}\n"],"names":["React"],"mappings":";;;;;AAcM,SAAU,cAAc,CAAC,KAA0B,EAAA;IACvD,MAAM,WAAW,GAAG,cAAc,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IACtD,MAAM,mBAAmB,GAAG,sBAAsB,CAAC,KAAK,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;AACpF,IAAA,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAwB,KAAK,CAAC,YAAY,CAAC,CAAC;IAC9E,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAqB,mBAAmB,CAAC,CAAC;AAE1F,IAAA,MAAM,QAAQ,GAAG,MAAM,EAAa,CAAC;AACrC,IAAA,QAAQ,CAAC,OAAO,GAAG,KAAK,CAAC;AAEzB,IAAA,MAAM,eAAe,GAAG,MAAM,EAAU,CAAC;AACzC,IAAA,eAAe,CAAC,OAAO,GAAG,YAAY,CAAC;IAEvC,SAAS,cAAc,CAAC,QAA+B,EAAA;QACrD,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACnB,IAAI,KAAK,CAAC,QAAQ,EAAE;AAClB,YAAA,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AAC1B,SAAA;KACF;IAED,QACEA,UAAC,CAAA,aAAA,CAAA,KAAK,EAAC,EAAA,OAAO,EAAC,IAAI,EAAC,IAAI,EAAA,IAAA,EAAC,MAAM,EAAA,IAAA,EAAA;AAC5B,QAAA,WAAW,IACVA,UAAC,CAAA,aAAA,CAAA,YAAY,EACC,EAAA,aAAA,EAAA,sCAAsC,EAClD,YAAY,EAAE,YAAY,EAC1B,QAAQ,EAAE,CAAC,CAAC,KAAK,eAAe,CAAC,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,EACvD,IAAI,EAAE,WAAW,EAAA,CACjB,KAEFA,UAAA,CAAA,aAAA,CAAC,SAAS,EAAA,EAAA,aAAA,EACI,qCAAqC,EACjD,YAAY,EAAE,YAAY,EAC1B,QAAQ,EAAE,CAAC,CAAC,KAAK,eAAe,CAAC,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,GACvD,CACH;AACD,QAAAA,UAAA,CAAA,aAAA,CAAC,aAAa,EAAA,EACZ,YAAY,EAAE,YAA4B,EAC1C,IAAI,EAAE,KAAK,CAAC,IAAI,GAAG,KAAK,EACxB,WAAW,EAAE,KAAK,CAAC,WAAW,EAC9B,YAAY,EAAE,KAAK,EACnB,QAAQ,EAAE,CAAC,IAA0B,KAAI;AACvC,gBAAA,cAAc,CAAC,IAAI,GAAG,eAAe,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,CAAC;aAC1D,EAAA,CACD,CACI,EACR;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,WAAiC,EAAA;IACvD,IAAI,CAAC,WAAW,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,KAAK,WAAW,CAAC,MAAM,KAAK,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,KAAK,UAAU,CAAC,EAAE;AAC3G,QAAA,OAAO,SAAS,CAAC;AAClB,KAAA;AACD,IAAA,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,SAAS,sBAAsB,CAC7B,YAAmC,EACnC,WAAiC,EAAA;AAEjC,IAAA,MAAM,wBAAwB,GAAG,YAAY,EAAE,SAAS,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AACxE,IAAA,IAAI,wBAAwB,EAAE;AAC5B,QAAA,OAAO,wBAAwB,CAAC;AACjC,KAAA;AAED,IAAA,IAAI,WAAW,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE;AACzC,QAAA,OAAO,WAAW,CAAC,CAAC,CAAC,CAAC;AACvB,KAAA;AAED,IAAA,OAAO,SAAS,CAAC;AACnB;;;;"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { createStyles, Stack, ActionIcon, Group, Button, Divider, TextInput, NativeSelect, Text } from '@mantine/core';
|
|
2
2
|
import { formatRange, getCodeBySystem } from '@medplum/core';
|
|
3
|
-
import { IconCirclePlus, IconCircleMinus } from '
|
|
4
|
-
import
|
|
3
|
+
import { IconCirclePlus as iS, IconCircleMinus as IP } from '../node_modules/@tabler/icons/icons-react/dist/index.esm.mjs';
|
|
4
|
+
import e__default, { useState, useEffect } from 'react';
|
|
5
5
|
import { Container } from '../Container/Container.mjs';
|
|
6
6
|
import { Form } from '../Form/Form.mjs';
|
|
7
7
|
import { RangeInput } from '../RangeInput/RangeInput.mjs';
|
|
@@ -35,16 +35,16 @@ function ReferenceRangeEditor(props) {
|
|
|
35
35
|
const definition = ensureQualifiedIntervalKeys(defaultDefinition, setIntervalId);
|
|
36
36
|
setIntervalGroups(groupQualifiedIntervals(definition.qualifiedInterval || [], setGroupId));
|
|
37
37
|
}, [defaultDefinition]);
|
|
38
|
-
return (
|
|
39
|
-
|
|
40
|
-
|
|
38
|
+
return (e__default.createElement(Form, { testid: "reference-range-editor", onSubmit: submitDefinition },
|
|
39
|
+
e__default.createElement(Stack, null, intervalGroups.map((intervalGroup) => (e__default.createElement(ReferenceRangeGroupEditor, { unit: getUnitString(defaultDefinition.quantitativeDetails?.unit), onChange: changeInterval, onAdd: addInterval, onRemove: removeInterval, onRemoveGroup: removeGroup, key: `group-${intervalGroup.id}`, intervalGroup: intervalGroup })))),
|
|
40
|
+
e__default.createElement(ActionIcon, { title: "Add Group", size: "sm", onClick: (e) => {
|
|
41
41
|
killEvent(e);
|
|
42
42
|
addGroup({ id: `group-id-${groupId}`, filters: {}, intervals: [] });
|
|
43
43
|
setGroupId((id) => id + 1);
|
|
44
44
|
} },
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
45
|
+
e__default.createElement(iS, null)),
|
|
46
|
+
e__default.createElement(Group, { position: "right" },
|
|
47
|
+
e__default.createElement(Button, { type: "submit" }, "Save"))));
|
|
48
48
|
/**
|
|
49
49
|
* Submit qualified intervals
|
|
50
50
|
*/
|
|
@@ -108,31 +108,31 @@ function ReferenceRangeEditor(props) {
|
|
|
108
108
|
function ReferenceRangeGroupEditor(props) {
|
|
109
109
|
const { intervalGroup, unit } = props;
|
|
110
110
|
const { classes } = useStyles();
|
|
111
|
-
return (
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
111
|
+
return (e__default.createElement(Container, { "data-testid": intervalGroup.id, className: classes.section },
|
|
112
|
+
e__default.createElement(Stack, { spacing: 'lg' },
|
|
113
|
+
e__default.createElement(Group, { position: "right" },
|
|
114
|
+
e__default.createElement(ActionIcon, { title: "Remove Group", "data-testid": `remove-group-button-${intervalGroup.id}`, key: `remove-group-button-${intervalGroup.id}`, size: "sm", onClick: (e) => {
|
|
115
115
|
killEvent(e);
|
|
116
116
|
props.onRemoveGroup(intervalGroup);
|
|
117
117
|
} },
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
intervalGroup.intervals.map((interval) => (
|
|
122
|
-
|
|
123
|
-
|
|
118
|
+
e__default.createElement(IP, null))),
|
|
119
|
+
e__default.createElement(ReferenceRangeGroupFilters, { intervalGroup: intervalGroup, onChange: props.onChange }),
|
|
120
|
+
e__default.createElement(Divider, null),
|
|
121
|
+
intervalGroup.intervals.map((interval) => (e__default.createElement(Stack, { key: `interval-${interval.id}`, spacing: 'xs' },
|
|
122
|
+
e__default.createElement(Group, null,
|
|
123
|
+
e__default.createElement(TextInput, { key: `condition-${interval.id}`, "data-testid": `condition-${interval.id}`, defaultValue: interval.condition, label: 'Condition: ', size: 'sm', onChange: (e) => {
|
|
124
124
|
killEvent(e);
|
|
125
125
|
props.onChange(intervalGroup.id, { ...interval, condition: e.currentTarget.value.trim() });
|
|
126
126
|
} }),
|
|
127
|
-
|
|
127
|
+
e__default.createElement(ActionIcon, { title: "Remove Interval", size: "sm", key: `remove-interval-${interval.id}`, "data-testid": `remove-interval-${interval.id}`, onClick: (e) => {
|
|
128
128
|
killEvent(e);
|
|
129
129
|
props.onRemove(intervalGroup.id, interval);
|
|
130
130
|
} },
|
|
131
|
-
|
|
132
|
-
|
|
131
|
+
e__default.createElement(IP, null))),
|
|
132
|
+
e__default.createElement(RangeInput, { onChange: (range) => {
|
|
133
133
|
props.onChange(intervalGroup.id, { ...interval, range });
|
|
134
134
|
}, key: `range-${interval.id}`, name: `range-${interval.id}`, defaultValue: interval.range })))),
|
|
135
|
-
|
|
135
|
+
e__default.createElement(ActionIcon, { title: "Add Interval", size: "sm", onClick: (e) => {
|
|
136
136
|
killEvent(e);
|
|
137
137
|
props.onAdd(intervalGroup.id, {
|
|
138
138
|
range: {
|
|
@@ -141,7 +141,7 @@ function ReferenceRangeGroupEditor(props) {
|
|
|
141
141
|
},
|
|
142
142
|
});
|
|
143
143
|
} },
|
|
144
|
-
|
|
144
|
+
e__default.createElement(iS, null)))));
|
|
145
145
|
}
|
|
146
146
|
/**
|
|
147
147
|
* Render the "filters" section of the IntervalGroup. Also populates some initial
|
|
@@ -161,9 +161,9 @@ function ReferenceRangeGroupFilters(props) {
|
|
|
161
161
|
};
|
|
162
162
|
}
|
|
163
163
|
}
|
|
164
|
-
return (
|
|
165
|
-
|
|
166
|
-
|
|
164
|
+
return (e__default.createElement(Stack, { style: { maxWidth: '50%' } },
|
|
165
|
+
e__default.createElement(Group, null,
|
|
166
|
+
e__default.createElement(NativeSelect, { data: ['', 'male', 'female'], label: "Gender:", defaultValue: intervalGroup.filters.gender || '', onChange: (e) => {
|
|
167
167
|
for (const interval of intervalGroup.intervals) {
|
|
168
168
|
let newGender = e.currentTarget?.value;
|
|
169
169
|
if (newGender === '') {
|
|
@@ -175,15 +175,15 @@ function ReferenceRangeGroupFilters(props) {
|
|
|
175
175
|
});
|
|
176
176
|
}
|
|
177
177
|
} })),
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
178
|
+
e__default.createElement(Group, { spacing: 'xs' },
|
|
179
|
+
e__default.createElement(Text, { component: "label", htmlFor: `div-age-${intervalGroup.id}` }, "Age:"),
|
|
180
|
+
e__default.createElement("div", { id: `div-age-${intervalGroup.id}` },
|
|
181
|
+
e__default.createElement(RangeInput, { key: `age-${intervalGroup.id}`, name: `age-${intervalGroup.id}`, defaultValue: intervalGroup.filters['age'], onChange: (ageRange) => {
|
|
182
182
|
for (const interval of intervalGroup.intervals) {
|
|
183
183
|
onChange(intervalGroup.id, { ...interval, age: ageRange });
|
|
184
184
|
}
|
|
185
185
|
} }))),
|
|
186
|
-
|
|
186
|
+
e__default.createElement(NativeSelect, { data: ['', 'pre-puberty', 'follicular', 'midcycle', 'luteal', 'postmenopausal'], label: "Endocrine:", defaultValue: intervalGroup.filters.context?.text || '', onChange: (e) => {
|
|
187
187
|
for (const interval of intervalGroup.intervals) {
|
|
188
188
|
let newEndocrine = e.currentTarget?.value;
|
|
189
189
|
if (newEndocrine === '') {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ReferenceRangeEditor.mjs","sources":["../../../src/ReferenceRangeEditor/ReferenceRangeEditor.tsx"],"sourcesContent":["import { ActionIcon, Button, createStyles, Divider, Group, NativeSelect, Stack, Text, TextInput } from '@mantine/core';\nimport { formatRange, getCodeBySystem } from '@medplum/core';\nimport { CodeableConcept, ObservationDefinition, ObservationDefinitionQualifiedInterval } from '@medplum/fhirtypes';\nimport { IconCircleMinus, IconCirclePlus } from '@tabler/icons';\nimport React, { useEffect, useState } from 'react';\nimport { Container } from '../Container/Container';\nimport { Form } from '../Form/Form';\nimport { RangeInput } from '../RangeInput/RangeInput';\nimport { killEvent } from '../utils/dom';\n\nconst useStyles = createStyles((theme) => ({\n section: {\n position: 'relative',\n margin: '4px 4px 8px 0',\n padding: '6px 12px 16px 6px',\n border: `1.5px solid ${theme.colors.gray[3]}`,\n borderRadius: theme.radius.sm,\n transition: 'all 0.1s',\n },\n}));\n\n// Properties of qualified intervals used for grouping\nconst intervalFilters = ['gender', 'age', 'gestationalAge', 'context', 'appliesTo'] as const;\n\nexport interface ReferenceRangeEditorProps {\n definition: ObservationDefinition;\n onSubmit: (result: ObservationDefinition) => void;\n}\n\n// Helper type that groups of qualified intervals by equal filter criteria\ntype IntervalGroup = {\n id: string;\n filters: Record<string, any>;\n intervals: ObservationDefinitionQualifiedInterval[];\n};\n\nconst defaultProps: ReferenceRangeEditorProps = {\n definition: { resourceType: 'ObservationDefinition' },\n onSubmit: () => {\n return;\n },\n};\n\nexport function ReferenceRangeEditor(props: ReferenceRangeEditorProps): JSX.Element {\n props = Object.assign(defaultProps, props);\n const defaultDefinition = props.definition;\n\n const [intervalGroups, setIntervalGroups] = useState<IntervalGroup[]>([]);\n const [groupId, setGroupId] = useState(1);\n const [intervalId, setIntervalId] = useState(1);\n\n useEffect(() => {\n const definition = ensureQualifiedIntervalKeys(defaultDefinition, setIntervalId);\n setIntervalGroups(groupQualifiedIntervals(definition.qualifiedInterval || [], setGroupId));\n }, [defaultDefinition]);\n\n return (\n <Form testid=\"reference-range-editor\" onSubmit={submitDefinition}>\n <Stack>\n {intervalGroups.map((intervalGroup) => (\n <ReferenceRangeGroupEditor\n unit={getUnitString(defaultDefinition.quantitativeDetails?.unit)}\n onChange={changeInterval}\n onAdd={addInterval}\n onRemove={removeInterval}\n onRemoveGroup={removeGroup}\n key={`group-${intervalGroup.id}`}\n intervalGroup={intervalGroup}\n />\n ))}\n </Stack>\n <ActionIcon\n title=\"Add Group\"\n size=\"sm\"\n onClick={(e: React.MouseEvent) => {\n killEvent(e);\n addGroup({ id: `group-id-${groupId}`, filters: {} as IntervalGroup['filters'], intervals: [] });\n setGroupId((id) => id + 1);\n }}\n >\n <IconCirclePlus />\n </ActionIcon>\n\n <Group position=\"right\">\n <Button type=\"submit\">Save</Button>\n </Group>\n </Form>\n );\n\n /**\n * Submit qualified intervals\n */\n\n function submitDefinition(): void {\n const qualifiedInterval = intervalGroups\n .flatMap((group) => group.intervals)\n .filter((interval) => !isEmptyInterval(interval));\n props.onSubmit({ ...defaultDefinition, qualifiedInterval });\n }\n\n /**\n * Add Remove Interval Groups\n */\n\n function addGroup(addedGroup: IntervalGroup): void {\n setIntervalGroups((currentGroups) => [...currentGroups, addedGroup]);\n }\n\n function removeGroup(removedGroup: IntervalGroup): void {\n setIntervalGroups((currentGroups) => currentGroups.filter((group) => group.id !== removedGroup.id));\n }\n\n /**\n * Add/Remove/Update specific Qualified Intervals\n */\n function changeInterval(groupId: string, changedInterval: ObservationDefinitionQualifiedInterval): void {\n setIntervalGroups((groups) => {\n groups = [...groups];\n const currentGroup = groups.find((g) => g.id === groupId);\n\n const index = currentGroup?.intervals?.findIndex((interval) => interval.id === changedInterval.id);\n if (index !== undefined && currentGroup?.intervals?.[index]) {\n currentGroup.intervals[index] = changedInterval;\n }\n return groups;\n });\n }\n\n function addInterval(groupId: string, addedInterval: ObservationDefinitionQualifiedInterval): void {\n if (addedInterval.id === undefined) {\n addedInterval.id = `id-${intervalId}`;\n setIntervalId((id) => id + 1);\n }\n setIntervalGroups((groups) => {\n groups = [...groups];\n const currentGroupIndex = groups.findIndex((g) => g.id === groupId);\n\n if (currentGroupIndex != -1) {\n const currentGroup = { ...groups[currentGroupIndex] };\n addedInterval = { ...addedInterval, ...currentGroup.filters };\n currentGroup.intervals = [...currentGroup.intervals, addedInterval];\n groups[currentGroupIndex] = currentGroup;\n }\n\n return groups;\n });\n }\n\n function removeInterval(groupId: string, removedInterval: ObservationDefinitionQualifiedInterval): void {\n setIntervalGroups((groups) => {\n groups = [...groups];\n const currentGroup = groups.find((g) => g.id === groupId);\n if (currentGroup) {\n currentGroup.intervals = currentGroup.intervals.filter((interval) => interval.id !== removedInterval.id);\n }\n return groups;\n });\n }\n}\n\n/**\n * Helper component that renders an \"interval group\", which is a set of ObservationDefinitionQualifiedIntervals\n * that have the same filter values\n */\nexport interface ReferenceRangeGroupEditorProps {\n intervalGroup: IntervalGroup;\n unit: string | undefined;\n onChange: (groupId: string, changed: ObservationDefinitionQualifiedInterval) => void;\n onAdd: (groupId: string, added: ObservationDefinitionQualifiedInterval) => void;\n onRemove: (groupId: string, removed: ObservationDefinitionQualifiedInterval) => void;\n onRemoveGroup: (removedGroup: IntervalGroup) => void;\n}\n\nexport function ReferenceRangeGroupEditor(props: ReferenceRangeGroupEditorProps): JSX.Element {\n const { intervalGroup, unit } = props;\n const { classes } = useStyles();\n return (\n <Container data-testid={intervalGroup.id} className={classes.section}>\n <Stack spacing={'lg'}>\n <Group position=\"right\">\n <ActionIcon\n title=\"Remove Group\"\n data-testid={`remove-group-button-${intervalGroup.id}`}\n key={`remove-group-button-${intervalGroup.id}`}\n size=\"sm\"\n onClick={(e: React.MouseEvent) => {\n killEvent(e);\n props.onRemoveGroup(intervalGroup);\n }}\n >\n <IconCircleMinus />\n </ActionIcon>\n </Group>\n <ReferenceRangeGroupFilters intervalGroup={intervalGroup} onChange={props.onChange} />\n <Divider />\n {intervalGroup.intervals.map((interval) => (\n <Stack key={`interval-${interval.id}`} spacing={'xs'}>\n <Group>\n <TextInput\n key={`condition-${interval.id}`}\n data-testid={`condition-${interval.id}`}\n defaultValue={interval.condition}\n label={'Condition: '}\n size={'sm'}\n onChange={(e) => {\n killEvent(e);\n props.onChange(intervalGroup.id, { ...interval, condition: e.currentTarget.value.trim() });\n }}\n />\n <ActionIcon\n title=\"Remove Interval\"\n size=\"sm\"\n key={`remove-interval-${interval.id}`}\n data-testid={`remove-interval-${interval.id}`}\n onClick={(e: React.MouseEvent) => {\n killEvent(e);\n props.onRemove(intervalGroup.id, interval);\n }}\n >\n <IconCircleMinus />\n </ActionIcon>\n </Group>\n\n <RangeInput\n onChange={(range) => {\n props.onChange(intervalGroup.id, { ...interval, range });\n }}\n key={`range-${interval.id}`}\n name={`range-${interval.id}`}\n defaultValue={interval.range}\n />\n </Stack>\n ))}\n <ActionIcon\n title=\"Add Interval\"\n size=\"sm\"\n onClick={(e: React.MouseEvent) => {\n killEvent(e);\n props.onAdd(intervalGroup.id, {\n range: {\n low: { unit },\n high: { unit },\n },\n });\n }}\n >\n <IconCirclePlus />\n </ActionIcon>\n </Stack>\n </Container>\n );\n}\n\ninterface ReferenceRangeGroupFiltersProps {\n intervalGroup: IntervalGroup;\n onChange: ReferenceRangeGroupEditorProps['onChange'];\n}\n\n/**\n * Render the \"filters\" section of the IntervalGroup. Also populates some initial\n */\nfunction ReferenceRangeGroupFilters(props: ReferenceRangeGroupFiltersProps): JSX.Element {\n const { intervalGroup, onChange } = props;\n\n // Pre-populate the units of the age filter\n if (!intervalGroup.filters.age) {\n intervalGroup.filters.age = {};\n }\n for (const key of ['low', 'high']) {\n if (!intervalGroup.filters.age[key]?.unit) {\n intervalGroup.filters.age[key] = {\n ...intervalGroup.filters.age[key],\n unit: 'years',\n system: 'http://unitsofmeasure.org',\n };\n }\n }\n\n return (\n <Stack style={{ maxWidth: '50%' }}>\n <Group>\n <NativeSelect\n data={['', 'male', 'female']}\n label=\"Gender:\"\n defaultValue={intervalGroup.filters.gender || ''}\n onChange={(e) => {\n for (const interval of intervalGroup.intervals) {\n let newGender: string | undefined = e.currentTarget?.value;\n if (newGender === '') {\n newGender = undefined;\n }\n onChange(intervalGroup.id, {\n ...interval,\n gender: newGender as ObservationDefinitionQualifiedInterval['gender'],\n });\n }\n }}\n />\n </Group>\n <Group spacing={'xs'}>\n <Text component=\"label\" htmlFor={`div-age-${intervalGroup.id}`}>\n Age:\n </Text>\n <div id={`div-age-${intervalGroup.id}`}>\n <RangeInput\n key={`age-${intervalGroup.id}`}\n name={`age-${intervalGroup.id}`}\n defaultValue={intervalGroup.filters['age']}\n onChange={(ageRange) => {\n for (const interval of intervalGroup.intervals) {\n onChange(intervalGroup.id, { ...interval, age: ageRange });\n }\n }}\n />\n </div>\n </Group>\n <NativeSelect\n data={['', 'pre-puberty', 'follicular', 'midcycle', 'luteal', 'postmenopausal']}\n label=\"Endocrine:\"\n defaultValue={intervalGroup.filters.context?.text || ''}\n onChange={(e) => {\n for (const interval of intervalGroup.intervals) {\n let newEndocrine: string | undefined = e.currentTarget?.value;\n if (newEndocrine === '') {\n newEndocrine = undefined;\n onChange(intervalGroup.id, { ...interval, context: undefined });\n } else {\n onChange(intervalGroup.id, {\n ...interval,\n context: {\n text: newEndocrine,\n coding: [\n { code: newEndocrine, system: 'http://terminology.hl7.org/CodeSystem/referencerange-meaning' },\n ],\n },\n });\n }\n }\n }}\n />\n </Stack>\n );\n}\n\n/**\n * Helper function that assigns ids to each qualifiedInterval of an ObservationDefinition\n * @param definition An ObservationDefinition\n * @param setIntervalId React setState function for the intervalId\n * @returns\n */\nfunction ensureQualifiedIntervalKeys(\n definition: ObservationDefinition,\n setIntervalId: (id: number) => void\n): ObservationDefinition {\n const intervals = definition.qualifiedInterval || [];\n // Set the nextId to the max of any existing numeric id\n let nextId =\n Math.max(\n ...intervals.map((interval) => {\n const existingNum = parseInt(interval.id?.substring(3) || '');\n return !isNaN(existingNum) ? existingNum : Number.NEGATIVE_INFINITY;\n })\n ) + 1;\n\n if (!Number.isFinite(nextId)) {\n nextId = 1;\n }\n\n // If an interval doesn't have an id, set it to the nextId\n definition = {\n ...definition,\n qualifiedInterval: intervals.map((interval) => ({\n ...interval,\n id: interval.id || `id-${nextId++}`,\n })),\n };\n setIntervalId(nextId);\n return definition;\n}\n\n/**\n * Group all ObservationDefinitionQualifiedIntervals based on the values of their \"filter\" properties,\n * so that similar ranges can be grouped together\n */\nfunction groupQualifiedIntervals(\n intervals: ObservationDefinitionQualifiedInterval[],\n setGroupId: (id: number) => void\n): IntervalGroup[] {\n let groupId = 1;\n const groups: Record<string, IntervalGroup> = {};\n for (const interval of intervals) {\n const groupKey = generateGroupKey(interval);\n if (!(groupKey in groups)) {\n groups[groupKey] = {\n id: `group-id-${groupId++}`,\n filters: Object.fromEntries(intervalFilters.map((f) => [f, interval[f]])) as Record<string, any>,\n intervals: [],\n };\n }\n groups[groupKey].intervals.push(interval);\n }\n setGroupId(groupId);\n return Object.values(groups);\n}\n\n/**\n * Generates a unique string for each set of filter values, so that similarly filtered intervals can be grouped together\n * @return A \"group key\" that corresponds to the value of the interval filter properties.\n */\n\nfunction generateGroupKey(interval: ObservationDefinitionQualifiedInterval): string {\n const results = [\n `gender=${interval.gender}`,\n `age=${formatRange(interval.age)}`,\n `gestationalAge=${formatRange(interval.gestationalAge)}`,\n `context=${interval.context?.text}`,\n `appliesTo=${interval.appliesTo?.map((c) => c.text).join('+')}`,\n ];\n\n return results.join(':');\n}\n\nfunction getUnitString(unit: CodeableConcept | undefined): string | undefined {\n return unit && (getCodeBySystem(unit, 'http://unitsofmeasure.org') || unit.text);\n}\n\nfunction isEmptyInterval(interval: ObservationDefinitionQualifiedInterval): boolean {\n return interval.range?.low?.value === undefined && interval.range?.high?.value === undefined;\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ReferenceRangeEditor.mjs","sources":["../../../src/ReferenceRangeEditor/ReferenceRangeEditor.tsx"],"sourcesContent":["import { ActionIcon, Button, createStyles, Divider, Group, NativeSelect, Stack, Text, TextInput } from '@mantine/core';\nimport { formatRange, getCodeBySystem } from '@medplum/core';\nimport { CodeableConcept, ObservationDefinition, ObservationDefinitionQualifiedInterval } from '@medplum/fhirtypes';\nimport { IconCircleMinus, IconCirclePlus } from '@tabler/icons';\nimport React, { useEffect, useState } from 'react';\nimport { Container } from '../Container/Container';\nimport { Form } from '../Form/Form';\nimport { RangeInput } from '../RangeInput/RangeInput';\nimport { killEvent } from '../utils/dom';\n\nconst useStyles = createStyles((theme) => ({\n section: {\n position: 'relative',\n margin: '4px 4px 8px 0',\n padding: '6px 12px 16px 6px',\n border: `1.5px solid ${theme.colors.gray[3]}`,\n borderRadius: theme.radius.sm,\n transition: 'all 0.1s',\n },\n}));\n\n// Properties of qualified intervals used for grouping\nconst intervalFilters = ['gender', 'age', 'gestationalAge', 'context', 'appliesTo'] as const;\n\nexport interface ReferenceRangeEditorProps {\n definition: ObservationDefinition;\n onSubmit: (result: ObservationDefinition) => void;\n}\n\n// Helper type that groups of qualified intervals by equal filter criteria\ntype IntervalGroup = {\n id: string;\n filters: Record<string, any>;\n intervals: ObservationDefinitionQualifiedInterval[];\n};\n\nconst defaultProps: ReferenceRangeEditorProps = {\n definition: { resourceType: 'ObservationDefinition' },\n onSubmit: () => {\n return;\n },\n};\n\nexport function ReferenceRangeEditor(props: ReferenceRangeEditorProps): JSX.Element {\n props = Object.assign(defaultProps, props);\n const defaultDefinition = props.definition;\n\n const [intervalGroups, setIntervalGroups] = useState<IntervalGroup[]>([]);\n const [groupId, setGroupId] = useState(1);\n const [intervalId, setIntervalId] = useState(1);\n\n useEffect(() => {\n const definition = ensureQualifiedIntervalKeys(defaultDefinition, setIntervalId);\n setIntervalGroups(groupQualifiedIntervals(definition.qualifiedInterval || [], setGroupId));\n }, [defaultDefinition]);\n\n return (\n <Form testid=\"reference-range-editor\" onSubmit={submitDefinition}>\n <Stack>\n {intervalGroups.map((intervalGroup) => (\n <ReferenceRangeGroupEditor\n unit={getUnitString(defaultDefinition.quantitativeDetails?.unit)}\n onChange={changeInterval}\n onAdd={addInterval}\n onRemove={removeInterval}\n onRemoveGroup={removeGroup}\n key={`group-${intervalGroup.id}`}\n intervalGroup={intervalGroup}\n />\n ))}\n </Stack>\n <ActionIcon\n title=\"Add Group\"\n size=\"sm\"\n onClick={(e: React.MouseEvent) => {\n killEvent(e);\n addGroup({ id: `group-id-${groupId}`, filters: {} as IntervalGroup['filters'], intervals: [] });\n setGroupId((id) => id + 1);\n }}\n >\n <IconCirclePlus />\n </ActionIcon>\n\n <Group position=\"right\">\n <Button type=\"submit\">Save</Button>\n </Group>\n </Form>\n );\n\n /**\n * Submit qualified intervals\n */\n\n function submitDefinition(): void {\n const qualifiedInterval = intervalGroups\n .flatMap((group) => group.intervals)\n .filter((interval) => !isEmptyInterval(interval));\n props.onSubmit({ ...defaultDefinition, qualifiedInterval });\n }\n\n /**\n * Add Remove Interval Groups\n */\n\n function addGroup(addedGroup: IntervalGroup): void {\n setIntervalGroups((currentGroups) => [...currentGroups, addedGroup]);\n }\n\n function removeGroup(removedGroup: IntervalGroup): void {\n setIntervalGroups((currentGroups) => currentGroups.filter((group) => group.id !== removedGroup.id));\n }\n\n /**\n * Add/Remove/Update specific Qualified Intervals\n */\n function changeInterval(groupId: string, changedInterval: ObservationDefinitionQualifiedInterval): void {\n setIntervalGroups((groups) => {\n groups = [...groups];\n const currentGroup = groups.find((g) => g.id === groupId);\n\n const index = currentGroup?.intervals?.findIndex((interval) => interval.id === changedInterval.id);\n if (index !== undefined && currentGroup?.intervals?.[index]) {\n currentGroup.intervals[index] = changedInterval;\n }\n return groups;\n });\n }\n\n function addInterval(groupId: string, addedInterval: ObservationDefinitionQualifiedInterval): void {\n if (addedInterval.id === undefined) {\n addedInterval.id = `id-${intervalId}`;\n setIntervalId((id) => id + 1);\n }\n setIntervalGroups((groups) => {\n groups = [...groups];\n const currentGroupIndex = groups.findIndex((g) => g.id === groupId);\n\n if (currentGroupIndex != -1) {\n const currentGroup = { ...groups[currentGroupIndex] };\n addedInterval = { ...addedInterval, ...currentGroup.filters };\n currentGroup.intervals = [...currentGroup.intervals, addedInterval];\n groups[currentGroupIndex] = currentGroup;\n }\n\n return groups;\n });\n }\n\n function removeInterval(groupId: string, removedInterval: ObservationDefinitionQualifiedInterval): void {\n setIntervalGroups((groups) => {\n groups = [...groups];\n const currentGroup = groups.find((g) => g.id === groupId);\n if (currentGroup) {\n currentGroup.intervals = currentGroup.intervals.filter((interval) => interval.id !== removedInterval.id);\n }\n return groups;\n });\n }\n}\n\n/**\n * Helper component that renders an \"interval group\", which is a set of ObservationDefinitionQualifiedIntervals\n * that have the same filter values\n */\nexport interface ReferenceRangeGroupEditorProps {\n intervalGroup: IntervalGroup;\n unit: string | undefined;\n onChange: (groupId: string, changed: ObservationDefinitionQualifiedInterval) => void;\n onAdd: (groupId: string, added: ObservationDefinitionQualifiedInterval) => void;\n onRemove: (groupId: string, removed: ObservationDefinitionQualifiedInterval) => void;\n onRemoveGroup: (removedGroup: IntervalGroup) => void;\n}\n\nexport function ReferenceRangeGroupEditor(props: ReferenceRangeGroupEditorProps): JSX.Element {\n const { intervalGroup, unit } = props;\n const { classes } = useStyles();\n return (\n <Container data-testid={intervalGroup.id} className={classes.section}>\n <Stack spacing={'lg'}>\n <Group position=\"right\">\n <ActionIcon\n title=\"Remove Group\"\n data-testid={`remove-group-button-${intervalGroup.id}`}\n key={`remove-group-button-${intervalGroup.id}`}\n size=\"sm\"\n onClick={(e: React.MouseEvent) => {\n killEvent(e);\n props.onRemoveGroup(intervalGroup);\n }}\n >\n <IconCircleMinus />\n </ActionIcon>\n </Group>\n <ReferenceRangeGroupFilters intervalGroup={intervalGroup} onChange={props.onChange} />\n <Divider />\n {intervalGroup.intervals.map((interval) => (\n <Stack key={`interval-${interval.id}`} spacing={'xs'}>\n <Group>\n <TextInput\n key={`condition-${interval.id}`}\n data-testid={`condition-${interval.id}`}\n defaultValue={interval.condition}\n label={'Condition: '}\n size={'sm'}\n onChange={(e) => {\n killEvent(e);\n props.onChange(intervalGroup.id, { ...interval, condition: e.currentTarget.value.trim() });\n }}\n />\n <ActionIcon\n title=\"Remove Interval\"\n size=\"sm\"\n key={`remove-interval-${interval.id}`}\n data-testid={`remove-interval-${interval.id}`}\n onClick={(e: React.MouseEvent) => {\n killEvent(e);\n props.onRemove(intervalGroup.id, interval);\n }}\n >\n <IconCircleMinus />\n </ActionIcon>\n </Group>\n\n <RangeInput\n onChange={(range) => {\n props.onChange(intervalGroup.id, { ...interval, range });\n }}\n key={`range-${interval.id}`}\n name={`range-${interval.id}`}\n defaultValue={interval.range}\n />\n </Stack>\n ))}\n <ActionIcon\n title=\"Add Interval\"\n size=\"sm\"\n onClick={(e: React.MouseEvent) => {\n killEvent(e);\n props.onAdd(intervalGroup.id, {\n range: {\n low: { unit },\n high: { unit },\n },\n });\n }}\n >\n <IconCirclePlus />\n </ActionIcon>\n </Stack>\n </Container>\n );\n}\n\ninterface ReferenceRangeGroupFiltersProps {\n intervalGroup: IntervalGroup;\n onChange: ReferenceRangeGroupEditorProps['onChange'];\n}\n\n/**\n * Render the \"filters\" section of the IntervalGroup. Also populates some initial\n */\nfunction ReferenceRangeGroupFilters(props: ReferenceRangeGroupFiltersProps): JSX.Element {\n const { intervalGroup, onChange } = props;\n\n // Pre-populate the units of the age filter\n if (!intervalGroup.filters.age) {\n intervalGroup.filters.age = {};\n }\n for (const key of ['low', 'high']) {\n if (!intervalGroup.filters.age[key]?.unit) {\n intervalGroup.filters.age[key] = {\n ...intervalGroup.filters.age[key],\n unit: 'years',\n system: 'http://unitsofmeasure.org',\n };\n }\n }\n\n return (\n <Stack style={{ maxWidth: '50%' }}>\n <Group>\n <NativeSelect\n data={['', 'male', 'female']}\n label=\"Gender:\"\n defaultValue={intervalGroup.filters.gender || ''}\n onChange={(e) => {\n for (const interval of intervalGroup.intervals) {\n let newGender: string | undefined = e.currentTarget?.value;\n if (newGender === '') {\n newGender = undefined;\n }\n onChange(intervalGroup.id, {\n ...interval,\n gender: newGender as ObservationDefinitionQualifiedInterval['gender'],\n });\n }\n }}\n />\n </Group>\n <Group spacing={'xs'}>\n <Text component=\"label\" htmlFor={`div-age-${intervalGroup.id}`}>\n Age:\n </Text>\n <div id={`div-age-${intervalGroup.id}`}>\n <RangeInput\n key={`age-${intervalGroup.id}`}\n name={`age-${intervalGroup.id}`}\n defaultValue={intervalGroup.filters['age']}\n onChange={(ageRange) => {\n for (const interval of intervalGroup.intervals) {\n onChange(intervalGroup.id, { ...interval, age: ageRange });\n }\n }}\n />\n </div>\n </Group>\n <NativeSelect\n data={['', 'pre-puberty', 'follicular', 'midcycle', 'luteal', 'postmenopausal']}\n label=\"Endocrine:\"\n defaultValue={intervalGroup.filters.context?.text || ''}\n onChange={(e) => {\n for (const interval of intervalGroup.intervals) {\n let newEndocrine: string | undefined = e.currentTarget?.value;\n if (newEndocrine === '') {\n newEndocrine = undefined;\n onChange(intervalGroup.id, { ...interval, context: undefined });\n } else {\n onChange(intervalGroup.id, {\n ...interval,\n context: {\n text: newEndocrine,\n coding: [\n { code: newEndocrine, system: 'http://terminology.hl7.org/CodeSystem/referencerange-meaning' },\n ],\n },\n });\n }\n }\n }}\n />\n </Stack>\n );\n}\n\n/**\n * Helper function that assigns ids to each qualifiedInterval of an ObservationDefinition\n * @param definition An ObservationDefinition\n * @param setIntervalId React setState function for the intervalId\n * @returns\n */\nfunction ensureQualifiedIntervalKeys(\n definition: ObservationDefinition,\n setIntervalId: (id: number) => void\n): ObservationDefinition {\n const intervals = definition.qualifiedInterval || [];\n // Set the nextId to the max of any existing numeric id\n let nextId =\n Math.max(\n ...intervals.map((interval) => {\n const existingNum = parseInt(interval.id?.substring(3) || '');\n return !isNaN(existingNum) ? existingNum : Number.NEGATIVE_INFINITY;\n })\n ) + 1;\n\n if (!Number.isFinite(nextId)) {\n nextId = 1;\n }\n\n // If an interval doesn't have an id, set it to the nextId\n definition = {\n ...definition,\n qualifiedInterval: intervals.map((interval) => ({\n ...interval,\n id: interval.id || `id-${nextId++}`,\n })),\n };\n setIntervalId(nextId);\n return definition;\n}\n\n/**\n * Group all ObservationDefinitionQualifiedIntervals based on the values of their \"filter\" properties,\n * so that similar ranges can be grouped together\n */\nfunction groupQualifiedIntervals(\n intervals: ObservationDefinitionQualifiedInterval[],\n setGroupId: (id: number) => void\n): IntervalGroup[] {\n let groupId = 1;\n const groups: Record<string, IntervalGroup> = {};\n for (const interval of intervals) {\n const groupKey = generateGroupKey(interval);\n if (!(groupKey in groups)) {\n groups[groupKey] = {\n id: `group-id-${groupId++}`,\n filters: Object.fromEntries(intervalFilters.map((f) => [f, interval[f]])) as Record<string, any>,\n intervals: [],\n };\n }\n groups[groupKey].intervals.push(interval);\n }\n setGroupId(groupId);\n return Object.values(groups);\n}\n\n/**\n * Generates a unique string for each set of filter values, so that similarly filtered intervals can be grouped together\n * @return A \"group key\" that corresponds to the value of the interval filter properties.\n */\n\nfunction generateGroupKey(interval: ObservationDefinitionQualifiedInterval): string {\n const results = [\n `gender=${interval.gender}`,\n `age=${formatRange(interval.age)}`,\n `gestationalAge=${formatRange(interval.gestationalAge)}`,\n `context=${interval.context?.text}`,\n `appliesTo=${interval.appliesTo?.map((c) => c.text).join('+')}`,\n ];\n\n return results.join(':');\n}\n\nfunction getUnitString(unit: CodeableConcept | undefined): string | undefined {\n return unit && (getCodeBySystem(unit, 'http://unitsofmeasure.org') || unit.text);\n}\n\nfunction isEmptyInterval(interval: ObservationDefinitionQualifiedInterval): boolean {\n return interval.range?.low?.value === undefined && interval.range?.high?.value === undefined;\n}\n"],"names":["React","IconCirclePlus","IconCircleMinus"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Grid, Text, Button } from '@mantine/core';
|
|
2
2
|
import { formatDateTime, getReferenceString } from '@medplum/core';
|
|
3
|
-
import { IconCheckbox, IconSquare } from '
|
|
4
|
-
import
|
|
3
|
+
import { IconCheckbox as GW, IconSquare as RSe } from '../node_modules/@tabler/icons/icons-react/dist/index.esm.mjs';
|
|
4
|
+
import e__default, { useState, useEffect } from 'react';
|
|
5
5
|
import { useMedplum } from '../MedplumProvider/MedplumProvider.mjs';
|
|
6
6
|
import { ResourceName } from '../ResourceName/ResourceName.mjs';
|
|
7
7
|
import { StatusBadge } from '../StatusBadge/StatusBadge.mjs';
|
|
@@ -21,26 +21,26 @@ function RequestGroupDisplay(props) {
|
|
|
21
21
|
if (!requestGroup || !responseBundle) {
|
|
22
22
|
return null;
|
|
23
23
|
}
|
|
24
|
-
return (
|
|
24
|
+
return (e__default.createElement(Grid, null, requestGroup.action?.map((action, index) => {
|
|
25
25
|
const task = action.resource && findBundleEntry(action.resource);
|
|
26
26
|
const taskInput = task?.input?.[0]?.valueReference;
|
|
27
27
|
const taskOutput = task?.output?.[0]?.valueReference;
|
|
28
|
-
return (
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
action.description &&
|
|
33
|
-
|
|
28
|
+
return (e__default.createElement(e__default.Fragment, { key: `action-${index}` },
|
|
29
|
+
e__default.createElement(Grid.Col, { span: 1, p: "md" }, task?.status === 'completed' ? e__default.createElement(GW, null) : e__default.createElement(RSe, { color: "gray" })),
|
|
30
|
+
e__default.createElement(Grid.Col, { span: 9, p: "xs" },
|
|
31
|
+
e__default.createElement(Text, { weight: 500 }, action.title),
|
|
32
|
+
action.description && e__default.createElement("div", null, action.description),
|
|
33
|
+
e__default.createElement("div", null,
|
|
34
34
|
"Last edited by\u00A0",
|
|
35
|
-
|
|
35
|
+
e__default.createElement(ResourceName, { value: task?.meta?.author }),
|
|
36
36
|
"\u00A0on\u00A0",
|
|
37
37
|
formatDateTime(task?.meta?.lastUpdated)),
|
|
38
|
-
|
|
38
|
+
e__default.createElement("div", null,
|
|
39
39
|
"Status: ",
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
taskInput && !taskOutput &&
|
|
43
|
-
taskInput && taskOutput && (
|
|
40
|
+
e__default.createElement(StatusBadge, { status: task?.status || 'unknown' }))),
|
|
41
|
+
e__default.createElement(Grid.Col, { span: 2, p: "md" },
|
|
42
|
+
taskInput && !taskOutput && e__default.createElement(Button, { onClick: () => props.onStart(task, taskInput) }, "Start"),
|
|
43
|
+
taskInput && taskOutput && (e__default.createElement(Button, { onClick: () => props.onEdit(task, taskInput, taskOutput) }, "Edit")))));
|
|
44
44
|
})));
|
|
45
45
|
function buildBatchRequest(request) {
|
|
46
46
|
const batchEntries = [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RequestGroupDisplay.mjs","sources":["../../../src/RequestGroupDisplay/RequestGroupDisplay.tsx"],"sourcesContent":["import { Button, Grid, Text } from '@mantine/core';\nimport { formatDateTime, getReferenceString } from '@medplum/core';\nimport { Bundle, BundleEntry, Reference, RequestGroup, Resource, Task } from '@medplum/fhirtypes';\nimport { IconCheckbox, IconSquare } from '@tabler/icons';\nimport React, { useEffect, useState } from 'react';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\nimport { ResourceName } from '../ResourceName/ResourceName';\nimport { StatusBadge } from '../StatusBadge/StatusBadge';\nimport { useResource } from '../useResource/useResource';\n\nexport interface RequestGroupDisplayProps {\n value?: RequestGroup | Reference<RequestGroup>;\n onStart: (task: Task, input: Reference) => void;\n onEdit: (task: Task, input: Reference, output: Reference) => void;\n}\n\nexport function RequestGroupDisplay(props: RequestGroupDisplayProps): JSX.Element | null {\n const medplum = useMedplum();\n const requestGroup = useResource(props.value);\n const [startedLoading, setStartedLoading] = useState(false);\n const [responseBundle, setResponseBundle] = useState<Bundle>();\n\n useEffect(() => {\n if (requestGroup && !startedLoading) {\n medplum.executeBatch(buildBatchRequest(requestGroup)).then(setResponseBundle).catch(console.log);\n setStartedLoading(true);\n }\n }, [medplum, requestGroup, startedLoading]);\n\n if (!requestGroup || !responseBundle) {\n return null;\n }\n\n return (\n <Grid>\n {requestGroup.action?.map((action, index) => {\n const task = action.resource && findBundleEntry(action.resource as Reference<Task>);\n const taskInput = task?.input?.[0]?.valueReference;\n const taskOutput = task?.output?.[0]?.valueReference;\n return (\n <React.Fragment key={`action-${index}`}>\n <Grid.Col span={1} p=\"md\">\n {task?.status === 'completed' ? <IconCheckbox /> : <IconSquare color=\"gray\" />}\n </Grid.Col>\n <Grid.Col span={9} p=\"xs\">\n <Text weight={500}>{action.title}</Text>\n {action.description && <div>{action.description}</div>}\n <div>\n Last edited by \n <ResourceName value={task?.meta?.author as Reference} />\n on \n {formatDateTime(task?.meta?.lastUpdated)}\n </div>\n <div>\n Status: <StatusBadge status={task?.status || 'unknown'} />\n </div>\n </Grid.Col>\n <Grid.Col span={2} p=\"md\">\n {taskInput && !taskOutput && <Button onClick={() => props.onStart(task, taskInput)}>Start</Button>}\n {taskInput && taskOutput && (\n <Button onClick={() => props.onEdit(task, taskInput, taskOutput)}>Edit</Button>\n )}\n </Grid.Col>\n </React.Fragment>\n );\n })}\n </Grid>\n );\n\n function buildBatchRequest(request: RequestGroup): Bundle {\n const batchEntries = [] as BundleEntry[];\n if (request.action) {\n for (const action of request.action) {\n if (action.resource?.reference) {\n batchEntries.push({ request: { method: 'GET', url: action.resource.reference } });\n }\n }\n }\n\n return {\n resourceType: 'Bundle',\n type: 'batch',\n entry: batchEntries,\n };\n }\n\n function findBundleEntry<T extends Resource>(reference: Reference<T>): T | undefined {\n for (const entry of responseBundle?.entry as BundleEntry[]) {\n if (entry.resource && reference.reference === getReferenceString(entry.resource)) {\n return entry.resource as T;\n }\n }\n return undefined;\n }\n}\n"],"names":[],"mappings":";;;;;;;;;AAgBM,SAAU,mBAAmB,CAAC,KAA+B,EAAA;AACjE,IAAA,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,MAAM,YAAY,GAAG,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC9C,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC5D,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,QAAQ,EAAU,CAAC;IAE/D,SAAS,CAAC,MAAK;AACb,QAAA,IAAI,YAAY,IAAI,CAAC,cAAc,EAAE;YACnC,OAAO,CAAC,YAAY,CAAC,iBAAiB,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACjG,iBAAiB,CAAC,IAAI,CAAC,CAAC;AACzB,SAAA;KACF,EAAE,CAAC,OAAO,EAAE,YAAY,EAAE,cAAc,CAAC,CAAC,CAAC;AAE5C,IAAA,IAAI,CAAC,YAAY,IAAI,CAAC,cAAc,EAAE;AACpC,QAAA,OAAO,IAAI,CAAC;AACb,KAAA;AAED,IAAA,
|
|
1
|
+
{"version":3,"file":"RequestGroupDisplay.mjs","sources":["../../../src/RequestGroupDisplay/RequestGroupDisplay.tsx"],"sourcesContent":["import { Button, Grid, Text } from '@mantine/core';\nimport { formatDateTime, getReferenceString } from '@medplum/core';\nimport { Bundle, BundleEntry, Reference, RequestGroup, Resource, Task } from '@medplum/fhirtypes';\nimport { IconCheckbox, IconSquare } from '@tabler/icons';\nimport React, { useEffect, useState } from 'react';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\nimport { ResourceName } from '../ResourceName/ResourceName';\nimport { StatusBadge } from '../StatusBadge/StatusBadge';\nimport { useResource } from '../useResource/useResource';\n\nexport interface RequestGroupDisplayProps {\n value?: RequestGroup | Reference<RequestGroup>;\n onStart: (task: Task, input: Reference) => void;\n onEdit: (task: Task, input: Reference, output: Reference) => void;\n}\n\nexport function RequestGroupDisplay(props: RequestGroupDisplayProps): JSX.Element | null {\n const medplum = useMedplum();\n const requestGroup = useResource(props.value);\n const [startedLoading, setStartedLoading] = useState(false);\n const [responseBundle, setResponseBundle] = useState<Bundle>();\n\n useEffect(() => {\n if (requestGroup && !startedLoading) {\n medplum.executeBatch(buildBatchRequest(requestGroup)).then(setResponseBundle).catch(console.log);\n setStartedLoading(true);\n }\n }, [medplum, requestGroup, startedLoading]);\n\n if (!requestGroup || !responseBundle) {\n return null;\n }\n\n return (\n <Grid>\n {requestGroup.action?.map((action, index) => {\n const task = action.resource && findBundleEntry(action.resource as Reference<Task>);\n const taskInput = task?.input?.[0]?.valueReference;\n const taskOutput = task?.output?.[0]?.valueReference;\n return (\n <React.Fragment key={`action-${index}`}>\n <Grid.Col span={1} p=\"md\">\n {task?.status === 'completed' ? <IconCheckbox /> : <IconSquare color=\"gray\" />}\n </Grid.Col>\n <Grid.Col span={9} p=\"xs\">\n <Text weight={500}>{action.title}</Text>\n {action.description && <div>{action.description}</div>}\n <div>\n Last edited by \n <ResourceName value={task?.meta?.author as Reference} />\n on \n {formatDateTime(task?.meta?.lastUpdated)}\n </div>\n <div>\n Status: <StatusBadge status={task?.status || 'unknown'} />\n </div>\n </Grid.Col>\n <Grid.Col span={2} p=\"md\">\n {taskInput && !taskOutput && <Button onClick={() => props.onStart(task, taskInput)}>Start</Button>}\n {taskInput && taskOutput && (\n <Button onClick={() => props.onEdit(task, taskInput, taskOutput)}>Edit</Button>\n )}\n </Grid.Col>\n </React.Fragment>\n );\n })}\n </Grid>\n );\n\n function buildBatchRequest(request: RequestGroup): Bundle {\n const batchEntries = [] as BundleEntry[];\n if (request.action) {\n for (const action of request.action) {\n if (action.resource?.reference) {\n batchEntries.push({ request: { method: 'GET', url: action.resource.reference } });\n }\n }\n }\n\n return {\n resourceType: 'Bundle',\n type: 'batch',\n entry: batchEntries,\n };\n }\n\n function findBundleEntry<T extends Resource>(reference: Reference<T>): T | undefined {\n for (const entry of responseBundle?.entry as BundleEntry[]) {\n if (entry.resource && reference.reference === getReferenceString(entry.resource)) {\n return entry.resource as T;\n }\n }\n return undefined;\n }\n}\n"],"names":["React","IconCheckbox","IconSquare"],"mappings":"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"}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import
|
|
1
|
+
import e__default from 'react';
|
|
2
2
|
import { ResourcePropertyDisplay } from '../ResourcePropertyDisplay/ResourcePropertyDisplay.mjs';
|
|
3
3
|
|
|
4
4
|
function ResourceArrayDisplay(props) {
|
|
5
5
|
const property = props.property;
|
|
6
6
|
const values = props.values ?? [];
|
|
7
7
|
const propertyType = property.type?.[0]?.code;
|
|
8
|
-
return (
|
|
9
|
-
|
|
8
|
+
return (e__default.createElement(e__default.Fragment, null, values.map((v, index) => (e__default.createElement("div", { key: `${index}-${values.length}` },
|
|
9
|
+
e__default.createElement(ResourcePropertyDisplay, { arrayElement: true, property: property, propertyType: propertyType, value: v, ignoreMissingValues: props.ignoreMissingValues, link: props.link }))))));
|
|
10
10
|
}
|
|
11
11
|
|
|
12
12
|
export { ResourceArrayDisplay };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ResourceArrayDisplay.mjs","sources":["../../../src/ResourceArrayDisplay/ResourceArrayDisplay.tsx"],"sourcesContent":["import { PropertyType } from '@medplum/core';\nimport { ElementDefinition } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { ResourcePropertyDisplay } from '../ResourcePropertyDisplay/ResourcePropertyDisplay';\n\ninterface ResourceArrayDisplayProps {\n property: ElementDefinition;\n values: any[];\n arrayElement?: boolean;\n ignoreMissingValues?: boolean;\n link?: boolean;\n}\n\nexport function ResourceArrayDisplay(props: ResourceArrayDisplayProps): JSX.Element {\n const property = props.property;\n const values = props.values ?? [];\n const propertyType = property.type?.[0]?.code as PropertyType;\n return (\n <>\n {values.map((v: any, index: number) => (\n <div key={`${index}-${values.length}`}>\n <ResourcePropertyDisplay\n arrayElement={true}\n property={property}\n propertyType={propertyType}\n value={v}\n ignoreMissingValues={props.ignoreMissingValues}\n link={props.link}\n />\n </div>\n ))}\n </>\n );\n}\n"],"names":[],"mappings":";;;AAaM,SAAU,oBAAoB,CAAC,KAAgC,EAAA;AACnE,IAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;AAChC,IAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC;IAClC,MAAM,YAAY,GAAG,QAAQ,CAAC,IAAI,GAAG,CAAC,CAAC,EAAE,IAAoB,CAAC;IAC9D,
|
|
1
|
+
{"version":3,"file":"ResourceArrayDisplay.mjs","sources":["../../../src/ResourceArrayDisplay/ResourceArrayDisplay.tsx"],"sourcesContent":["import { PropertyType } from '@medplum/core';\nimport { ElementDefinition } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { ResourcePropertyDisplay } from '../ResourcePropertyDisplay/ResourcePropertyDisplay';\n\ninterface ResourceArrayDisplayProps {\n property: ElementDefinition;\n values: any[];\n arrayElement?: boolean;\n ignoreMissingValues?: boolean;\n link?: boolean;\n}\n\nexport function ResourceArrayDisplay(props: ResourceArrayDisplayProps): JSX.Element {\n const property = props.property;\n const values = props.values ?? [];\n const propertyType = property.type?.[0]?.code as PropertyType;\n return (\n <>\n {values.map((v: any, index: number) => (\n <div key={`${index}-${values.length}`}>\n <ResourcePropertyDisplay\n arrayElement={true}\n property={property}\n propertyType={propertyType}\n value={v}\n ignoreMissingValues={props.ignoreMissingValues}\n link={props.link}\n />\n </div>\n ))}\n </>\n );\n}\n"],"names":["React"],"mappings":";;;AAaM,SAAU,oBAAoB,CAAC,KAAgC,EAAA;AACnE,IAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;AAChC,IAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC;IAClC,MAAM,YAAY,GAAG,QAAQ,CAAC,IAAI,GAAG,CAAC,CAAC,EAAE,IAAoB,CAAC;IAC9D,QACEA,oDACG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,KAAa,MAChCA,UAAK,CAAA,aAAA,CAAA,KAAA,EAAA,EAAA,GAAG,EAAE,CAAA,EAAG,KAAK,CAAI,CAAA,EAAA,MAAM,CAAC,MAAM,CAAE,CAAA,EAAA;AACnC,QAAAA,UAAA,CAAA,aAAA,CAAC,uBAAuB,EAAA,EACtB,YAAY,EAAE,IAAI,EAClB,QAAQ,EAAE,QAAQ,EAClB,YAAY,EAAE,YAAY,EAC1B,KAAK,EAAE,CAAC,EACR,mBAAmB,EAAE,KAAK,CAAC,mBAAmB,EAC9C,IAAI,EAAE,KAAK,CAAC,IAAI,GAChB,CACE,CACP,CAAC,CACD,EACH;AACJ;;;;"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ActionIcon } from '@mantine/core';
|
|
2
|
-
import { IconCircleMinus, IconCirclePlus } from '
|
|
3
|
-
import
|
|
2
|
+
import { IconCircleMinus as IP, IconCirclePlus as iS } from '../node_modules/@tabler/icons/icons-react/dist/index.esm.mjs';
|
|
3
|
+
import e__default, { useState, useRef } from 'react';
|
|
4
4
|
import { ResourcePropertyInput } from '../ResourcePropertyInput/ResourcePropertyInput.mjs';
|
|
5
5
|
import { killEvent } from '../utils/dom.mjs';
|
|
6
6
|
|
|
@@ -14,36 +14,36 @@ function ResourceArrayInput(props) {
|
|
|
14
14
|
props.onChange(newValues);
|
|
15
15
|
}
|
|
16
16
|
}
|
|
17
|
-
return (
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
values.map((v, index) => (
|
|
23
|
-
|
|
24
|
-
|
|
17
|
+
return (e__default.createElement("table", { style: { width: '100%', borderCollapse: 'collapse' } },
|
|
18
|
+
e__default.createElement("colgroup", null,
|
|
19
|
+
e__default.createElement("col", { width: "97%" }),
|
|
20
|
+
e__default.createElement("col", { width: "3%" })),
|
|
21
|
+
e__default.createElement("tbody", null,
|
|
22
|
+
values.map((v, index) => (e__default.createElement("tr", { key: `${index}-${values.length}` },
|
|
23
|
+
e__default.createElement("td", null,
|
|
24
|
+
e__default.createElement(ResourcePropertyInput, { arrayElement: true, property: props.property, name: props.name + '.' + index, defaultValue: v, onChange: (newValue) => {
|
|
25
25
|
const copy = [...valuesRef.current];
|
|
26
26
|
copy[index] = newValue;
|
|
27
27
|
setValuesWrapper(copy);
|
|
28
28
|
} })),
|
|
29
|
-
|
|
30
|
-
|
|
29
|
+
e__default.createElement("td", { style: { textAlign: 'right' } },
|
|
30
|
+
e__default.createElement(ActionIcon, { title: "Remove", size: "sm", onClick: (e) => {
|
|
31
31
|
killEvent(e);
|
|
32
32
|
const copy = [...valuesRef.current];
|
|
33
33
|
copy.splice(index, 1);
|
|
34
34
|
setValuesWrapper(copy);
|
|
35
35
|
} },
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
36
|
+
e__default.createElement(IP, null)))))),
|
|
37
|
+
e__default.createElement("tr", null,
|
|
38
|
+
e__default.createElement("td", null),
|
|
39
|
+
e__default.createElement("td", { style: { textAlign: 'right' } },
|
|
40
|
+
e__default.createElement(ActionIcon, { title: "Add", size: "sm", color: "green", onClick: (e) => {
|
|
41
41
|
killEvent(e);
|
|
42
42
|
const copy = [...valuesRef.current];
|
|
43
43
|
copy.push(undefined);
|
|
44
44
|
setValuesWrapper(copy);
|
|
45
45
|
} },
|
|
46
|
-
|
|
46
|
+
e__default.createElement(iS, null)))))));
|
|
47
47
|
}
|
|
48
48
|
|
|
49
49
|
export { ResourceArrayInput };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ResourceArrayInput.mjs","sources":["../../../src/ResourceArrayInput/ResourceArrayInput.tsx"],"sourcesContent":["import { ActionIcon } from '@mantine/core';\nimport { ElementDefinition } from '@medplum/fhirtypes';\nimport { IconCircleMinus, IconCirclePlus } from '@tabler/icons';\nimport React, { useRef, useState } from 'react';\nimport { ResourcePropertyInput } from '../ResourcePropertyInput/ResourcePropertyInput';\nimport { killEvent } from '../utils/dom';\n\ninterface ResourceArrayInputProps {\n property: ElementDefinition;\n name: string;\n defaultValue?: any[];\n arrayElement?: boolean;\n onChange?: (value: any[]) => void;\n}\n\nexport function ResourceArrayInput(props: ResourceArrayInputProps): JSX.Element {\n const [values, setValues] = useState(\n props.defaultValue && Array.isArray(props.defaultValue) ? props.defaultValue : []\n );\n\n const valuesRef = useRef<any[]>();\n valuesRef.current = values;\n\n function setValuesWrapper(newValues: any[]): void {\n setValues(newValues);\n if (props.onChange) {\n props.onChange(newValues);\n }\n }\n\n return (\n <table style={{ width: '100%', borderCollapse: 'collapse' }}>\n <colgroup>\n <col width=\"97%\" />\n <col width=\"3%\" />\n </colgroup>\n <tbody>\n {values.map((v, index) => (\n <tr key={`${index}-${values.length}`}>\n <td>\n <ResourcePropertyInput\n arrayElement={true}\n property={props.property}\n name={props.name + '.' + index}\n defaultValue={v}\n onChange={(newValue: any) => {\n const copy = [...(valuesRef.current as any[])];\n copy[index] = newValue;\n setValuesWrapper(copy);\n }}\n />\n </td>\n <td style={{ textAlign: 'right' }}>\n <ActionIcon\n title=\"Remove\"\n size=\"sm\"\n onClick={(e: React.MouseEvent) => {\n killEvent(e);\n const copy = [...(valuesRef.current as any[])];\n copy.splice(index, 1);\n setValuesWrapper(copy);\n }}\n >\n <IconCircleMinus />\n </ActionIcon>\n </td>\n </tr>\n ))}\n <tr>\n <td></td>\n <td style={{ textAlign: 'right' }}>\n <ActionIcon\n title=\"Add\"\n size=\"sm\"\n color=\"green\"\n onClick={(e: React.MouseEvent) => {\n killEvent(e);\n const copy = [...(valuesRef.current as any[])];\n copy.push(undefined);\n setValuesWrapper(copy);\n }}\n >\n <IconCirclePlus />\n </ActionIcon>\n </td>\n </tr>\n </tbody>\n </table>\n );\n}\n"],"names":[],"mappings":";;;;;;AAeM,SAAU,kBAAkB,CAAC,KAA8B,EAAA;AAC/D,IAAA,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAClC,KAAK,CAAC,YAAY,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,GAAG,KAAK,CAAC,YAAY,GAAG,EAAE,CAClF,CAAC;AAEF,IAAA,MAAM,SAAS,GAAG,MAAM,EAAS,CAAC;AAClC,IAAA,SAAS,CAAC,OAAO,GAAG,MAAM,CAAC;IAE3B,SAAS,gBAAgB,CAAC,SAAgB,EAAA;QACxC,SAAS,CAAC,SAAS,CAAC,CAAC;QACrB,IAAI,KAAK,CAAC,QAAQ,EAAE;AAClB,YAAA,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;AAC3B,SAAA;KACF;AAED,IAAA,
|
|
1
|
+
{"version":3,"file":"ResourceArrayInput.mjs","sources":["../../../src/ResourceArrayInput/ResourceArrayInput.tsx"],"sourcesContent":["import { ActionIcon } from '@mantine/core';\nimport { ElementDefinition } from '@medplum/fhirtypes';\nimport { IconCircleMinus, IconCirclePlus } from '@tabler/icons';\nimport React, { useRef, useState } from 'react';\nimport { ResourcePropertyInput } from '../ResourcePropertyInput/ResourcePropertyInput';\nimport { killEvent } from '../utils/dom';\n\ninterface ResourceArrayInputProps {\n property: ElementDefinition;\n name: string;\n defaultValue?: any[];\n arrayElement?: boolean;\n onChange?: (value: any[]) => void;\n}\n\nexport function ResourceArrayInput(props: ResourceArrayInputProps): JSX.Element {\n const [values, setValues] = useState(\n props.defaultValue && Array.isArray(props.defaultValue) ? props.defaultValue : []\n );\n\n const valuesRef = useRef<any[]>();\n valuesRef.current = values;\n\n function setValuesWrapper(newValues: any[]): void {\n setValues(newValues);\n if (props.onChange) {\n props.onChange(newValues);\n }\n }\n\n return (\n <table style={{ width: '100%', borderCollapse: 'collapse' }}>\n <colgroup>\n <col width=\"97%\" />\n <col width=\"3%\" />\n </colgroup>\n <tbody>\n {values.map((v, index) => (\n <tr key={`${index}-${values.length}`}>\n <td>\n <ResourcePropertyInput\n arrayElement={true}\n property={props.property}\n name={props.name + '.' + index}\n defaultValue={v}\n onChange={(newValue: any) => {\n const copy = [...(valuesRef.current as any[])];\n copy[index] = newValue;\n setValuesWrapper(copy);\n }}\n />\n </td>\n <td style={{ textAlign: 'right' }}>\n <ActionIcon\n title=\"Remove\"\n size=\"sm\"\n onClick={(e: React.MouseEvent) => {\n killEvent(e);\n const copy = [...(valuesRef.current as any[])];\n copy.splice(index, 1);\n setValuesWrapper(copy);\n }}\n >\n <IconCircleMinus />\n </ActionIcon>\n </td>\n </tr>\n ))}\n <tr>\n <td></td>\n <td style={{ textAlign: 'right' }}>\n <ActionIcon\n title=\"Add\"\n size=\"sm\"\n color=\"green\"\n onClick={(e: React.MouseEvent) => {\n killEvent(e);\n const copy = [...(valuesRef.current as any[])];\n copy.push(undefined);\n setValuesWrapper(copy);\n }}\n >\n <IconCirclePlus />\n </ActionIcon>\n </td>\n </tr>\n </tbody>\n </table>\n );\n}\n"],"names":["React","IconCircleMinus","IconCirclePlus"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Avatar } from '@mantine/core';
|
|
2
2
|
import { getDisplayString, getImageSrc } from '@medplum/core';
|
|
3
|
-
import
|
|
3
|
+
import e__default from 'react';
|
|
4
4
|
import { MedplumLink } from '../MedplumLink/MedplumLink.mjs';
|
|
5
5
|
import { useResource } from '../useResource/useResource.mjs';
|
|
6
6
|
|
|
@@ -13,10 +13,10 @@ function ResourceAvatar(props) {
|
|
|
13
13
|
delete avatarProps.value;
|
|
14
14
|
delete avatarProps.link;
|
|
15
15
|
if (props.link) {
|
|
16
|
-
return (
|
|
17
|
-
|
|
16
|
+
return (e__default.createElement(MedplumLink, { to: resource },
|
|
17
|
+
e__default.createElement(Avatar, { src: imageUrl, alt: text, radius: radius, ...avatarProps })));
|
|
18
18
|
}
|
|
19
|
-
return
|
|
19
|
+
return e__default.createElement(Avatar, { src: imageUrl, alt: text, radius: radius, ...avatarProps });
|
|
20
20
|
}
|
|
21
21
|
|
|
22
22
|
export { ResourceAvatar };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ResourceAvatar.mjs","sources":["../../../src/ResourceAvatar/ResourceAvatar.tsx"],"sourcesContent":["import { Avatar, AvatarProps } from '@mantine/core';\nimport { getDisplayString, getImageSrc } from '@medplum/core';\nimport { Reference, Resource } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { MedplumLink } from '../MedplumLink/MedplumLink';\nimport { useResource } from '../useResource/useResource';\n\nexport interface ResourceAvatarProps extends AvatarProps {\n value?: Reference | Resource;\n link?: boolean;\n}\n\nexport function ResourceAvatar(props: ResourceAvatarProps): JSX.Element {\n const resource = useResource(props.value);\n const text = resource ? getDisplayString(resource) : props.alt ?? '';\n const imageUrl = (resource && getImageSrc(resource)) ?? props.src;\n const radius = props.radius ?? 'xl';\n\n const avatarProps = { ...props };\n delete avatarProps.value;\n delete avatarProps.link;\n\n if (props.link) {\n return (\n <MedplumLink to={resource}>\n <Avatar src={imageUrl} alt={text} radius={radius} {...avatarProps} />\n </MedplumLink>\n );\n }\n\n return <Avatar src={imageUrl} alt={text} radius={radius} {...avatarProps} />;\n}\n"],"names":[],"mappings":";;;;;;AAYM,SAAU,cAAc,CAAC,KAA0B,EAAA;IACvD,MAAM,QAAQ,GAAG,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AAC1C,IAAA,MAAM,IAAI,GAAG,QAAQ,GAAG,gBAAgB,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC,GAAG,IAAI,EAAE,CAAC;AACrE,IAAA,MAAM,QAAQ,GAAG,CAAC,QAAQ,IAAI,WAAW,CAAC,QAAQ,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC;AAClE,IAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC;AAEpC,IAAA,MAAM,WAAW,GAAG,EAAE,GAAG,KAAK,EAAE,CAAC;IACjC,OAAO,WAAW,CAAC,KAAK,CAAC;IACzB,OAAO,WAAW,CAAC,IAAI,CAAC;IAExB,IAAI,KAAK,CAAC,IAAI,EAAE;AACd,QAAA,
|
|
1
|
+
{"version":3,"file":"ResourceAvatar.mjs","sources":["../../../src/ResourceAvatar/ResourceAvatar.tsx"],"sourcesContent":["import { Avatar, AvatarProps } from '@mantine/core';\nimport { getDisplayString, getImageSrc } from '@medplum/core';\nimport { Reference, Resource } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { MedplumLink } from '../MedplumLink/MedplumLink';\nimport { useResource } from '../useResource/useResource';\n\nexport interface ResourceAvatarProps extends AvatarProps {\n value?: Reference | Resource;\n link?: boolean;\n}\n\nexport function ResourceAvatar(props: ResourceAvatarProps): JSX.Element {\n const resource = useResource(props.value);\n const text = resource ? getDisplayString(resource) : props.alt ?? '';\n const imageUrl = (resource && getImageSrc(resource)) ?? props.src;\n const radius = props.radius ?? 'xl';\n\n const avatarProps = { ...props };\n delete avatarProps.value;\n delete avatarProps.link;\n\n if (props.link) {\n return (\n <MedplumLink to={resource}>\n <Avatar src={imageUrl} alt={text} radius={radius} {...avatarProps} />\n </MedplumLink>\n );\n }\n\n return <Avatar src={imageUrl} alt={text} radius={radius} {...avatarProps} />;\n}\n"],"names":["React"],"mappings":";;;;;;AAYM,SAAU,cAAc,CAAC,KAA0B,EAAA;IACvD,MAAM,QAAQ,GAAG,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AAC1C,IAAA,MAAM,IAAI,GAAG,QAAQ,GAAG,gBAAgB,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC,GAAG,IAAI,EAAE,CAAC;AACrE,IAAA,MAAM,QAAQ,GAAG,CAAC,QAAQ,IAAI,WAAW,CAAC,QAAQ,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC;AAClE,IAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC;AAEpC,IAAA,MAAM,WAAW,GAAG,EAAE,GAAG,KAAK,EAAE,CAAC;IACjC,OAAO,WAAW,CAAC,KAAK,CAAC;IACzB,OAAO,WAAW,CAAC,IAAI,CAAC;IAExB,IAAI,KAAK,CAAC,IAAI,EAAE;AACd,QAAA,QACEA,UAAC,CAAA,aAAA,CAAA,WAAW,EAAC,EAAA,EAAE,EAAE,QAAQ,EAAA;AACvB,YAAAA,UAAA,CAAA,aAAA,CAAC,MAAM,EAAC,EAAA,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAA,GAAM,WAAW,EAAI,CAAA,CACzD,EACd;AACH,KAAA;AAED,IAAA,OAAOA,yBAAC,MAAM,EAAA,EAAC,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAM,GAAA,WAAW,GAAI,CAAC;AAC/E;;;;"}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { Group } from '@mantine/core';
|
|
2
|
-
import
|
|
2
|
+
import e__default from 'react';
|
|
3
3
|
import { ResourceAvatar } from '../ResourceAvatar/ResourceAvatar.mjs';
|
|
4
4
|
import { ResourceName } from '../ResourceName/ResourceName.mjs';
|
|
5
5
|
|
|
6
6
|
function ResourceBadge(props) {
|
|
7
|
-
return (
|
|
8
|
-
|
|
9
|
-
|
|
7
|
+
return (e__default.createElement(Group, { spacing: "xs" },
|
|
8
|
+
e__default.createElement(ResourceAvatar, { size: 24, radius: 12, value: props.value, link: props.link }),
|
|
9
|
+
e__default.createElement(ResourceName, { value: props.value, link: props.link })));
|
|
10
10
|
}
|
|
11
11
|
|
|
12
12
|
export { ResourceBadge };
|