@medplum/react 2.0.23 → 2.0.25
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/index.cjs +11 -7713
- package/dist/cjs/index.cjs.map +7 -1
- package/dist/esm/index.mjs +67 -92
- package/dist/esm/index.mjs.map +7 -1
- package/package.json +18 -21
- package/dist/cjs/index.min.cjs +0 -1
- package/dist/esm/AddressDisplay/AddressDisplay.mjs +0 -13
- package/dist/esm/AddressDisplay/AddressDisplay.mjs.map +0 -1
- package/dist/esm/AddressInput/AddressInput.mjs +0 -57
- package/dist/esm/AddressInput/AddressInput.mjs.map +0 -1
- package/dist/esm/AnnotationInput/AnnotationInput.mjs +0 -28
- package/dist/esm/AnnotationInput/AnnotationInput.mjs.map +0 -1
- package/dist/esm/AppShell/AppShell.mjs +0 -37
- package/dist/esm/AppShell/AppShell.mjs.map +0 -1
- package/dist/esm/AppShell/Header.mjs +0 -88
- package/dist/esm/AppShell/Header.mjs.map +0 -1
- package/dist/esm/AppShell/HeaderSearchInput.mjs +0 -230
- package/dist/esm/AppShell/HeaderSearchInput.mjs.map +0 -1
- package/dist/esm/AppShell/Navbar.mjs +0 -169
- package/dist/esm/AppShell/Navbar.mjs.map +0 -1
- package/dist/esm/AsyncAutocomplete/AsyncAutocomplete.mjs +0 -115
- package/dist/esm/AsyncAutocomplete/AsyncAutocomplete.mjs.map +0 -1
- package/dist/esm/AttachmentArrayDisplay/AttachmentArrayDisplay.mjs +0 -11
- package/dist/esm/AttachmentArrayDisplay/AttachmentArrayDisplay.mjs.map +0 -1
- package/dist/esm/AttachmentArrayInput/AttachmentArrayInput.mjs +0 -45
- package/dist/esm/AttachmentArrayInput/AttachmentArrayInput.mjs.map +0 -1
- package/dist/esm/AttachmentButton/AttachmentButton.mjs +0 -55
- package/dist/esm/AttachmentButton/AttachmentButton.mjs.map +0 -1
- package/dist/esm/AttachmentDisplay/AttachmentDisplay.mjs +0 -21
- package/dist/esm/AttachmentDisplay/AttachmentDisplay.mjs.map +0 -1
- package/dist/esm/AttachmentInput/AttachmentInput.mjs +0 -27
- package/dist/esm/AttachmentInput/AttachmentInput.mjs.map +0 -1
- package/dist/esm/BackboneElementDisplay/BackboneElementDisplay.mjs +0 -49
- package/dist/esm/BackboneElementDisplay/BackboneElementDisplay.mjs.map +0 -1
- package/dist/esm/BackboneElementInput/BackboneElementInput.mjs +0 -52
- package/dist/esm/BackboneElementInput/BackboneElementInput.mjs.map +0 -1
- package/dist/esm/BookmarkDialog/BookmarkDialog.mjs +0 -47
- package/dist/esm/BookmarkDialog/BookmarkDialog.mjs.map +0 -1
- package/dist/esm/CalendarInput/CalendarInput.mjs +0 -133
- package/dist/esm/CalendarInput/CalendarInput.mjs.map +0 -1
- package/dist/esm/CheckboxFormSection/CheckboxFormSection.mjs +0 -12
- package/dist/esm/CheckboxFormSection/CheckboxFormSection.mjs.map +0 -1
- package/dist/esm/CodeInput/CodeInput.mjs +0 -24
- package/dist/esm/CodeInput/CodeInput.mjs.map +0 -1
- package/dist/esm/CodeableConceptDisplay/CodeableConceptDisplay.mjs +0 -9
- package/dist/esm/CodeableConceptDisplay/CodeableConceptDisplay.mjs.map +0 -1
- package/dist/esm/CodeableConceptInput/CodeableConceptInput.mjs +0 -36
- package/dist/esm/CodeableConceptInput/CodeableConceptInput.mjs.map +0 -1
- package/dist/esm/CodingDisplay/CodingDisplay.mjs +0 -9
- package/dist/esm/CodingDisplay/CodingDisplay.mjs.map +0 -1
- package/dist/esm/CodingInput/CodingInput.mjs +0 -32
- package/dist/esm/CodingInput/CodingInput.mjs.map +0 -1
- package/dist/esm/ContactDetailDisplay/ContactDetailDisplay.mjs +0 -16
- package/dist/esm/ContactDetailDisplay/ContactDetailDisplay.mjs.map +0 -1
- package/dist/esm/ContactDetailInput/ContactDetailInput.mjs +0 -35
- package/dist/esm/ContactDetailInput/ContactDetailInput.mjs.map +0 -1
- package/dist/esm/ContactPointDisplay/ContactPointDisplay.mjs +0 -29
- package/dist/esm/ContactPointDisplay/ContactPointDisplay.mjs.map +0 -1
- package/dist/esm/ContactPointInput/ContactPointInput.mjs +0 -45
- package/dist/esm/ContactPointInput/ContactPointInput.mjs.map +0 -1
- package/dist/esm/Container/Container.mjs +0 -19
- package/dist/esm/Container/Container.mjs.map +0 -1
- package/dist/esm/DateTimeInput/DateTimeInput.mjs +0 -71
- package/dist/esm/DateTimeInput/DateTimeInput.mjs.map +0 -1
- package/dist/esm/DefaultResourceTimeline/DefaultResourceTimeline.mjs +0 -16
- package/dist/esm/DefaultResourceTimeline/DefaultResourceTimeline.mjs.map +0 -1
- package/dist/esm/DescriptionList/DescriptionList.mjs +0 -35
- package/dist/esm/DescriptionList/DescriptionList.mjs.map +0 -1
- package/dist/esm/DiagnosticReportDisplay/DiagnosticReportDisplay.mjs +0 -174
- package/dist/esm/DiagnosticReportDisplay/DiagnosticReportDisplay.mjs.map +0 -1
- package/dist/esm/Document/Document.mjs +0 -12
- package/dist/esm/Document/Document.mjs.map +0 -1
- package/dist/esm/EncounterTimeline/EncounterTimeline.mjs +0 -32
- package/dist/esm/EncounterTimeline/EncounterTimeline.mjs.map +0 -1
- package/dist/esm/ErrorBoundary/ErrorBoundary.mjs +0 -30
- package/dist/esm/ErrorBoundary/ErrorBoundary.mjs.map +0 -1
- package/dist/esm/ExtensionInput/ExtensionInput.mjs +0 -14
- package/dist/esm/ExtensionInput/ExtensionInput.mjs.map +0 -1
- package/dist/esm/FhirPathDisplay/FhirPathDisplay.mjs +0 -23
- package/dist/esm/FhirPathDisplay/FhirPathDisplay.mjs.map +0 -1
- package/dist/esm/FhirPathTable/FhirPathTable.mjs +0 -122
- package/dist/esm/FhirPathTable/FhirPathTable.mjs.map +0 -1
- package/dist/esm/Form/Form.mjs +0 -15
- package/dist/esm/Form/Form.mjs.map +0 -1
- package/dist/esm/Form/FormUtils.mjs +0 -50
- package/dist/esm/Form/FormUtils.mjs.map +0 -1
- package/dist/esm/FormSection/FormSection.mjs +0 -10
- package/dist/esm/FormSection/FormSection.mjs.map +0 -1
- package/dist/esm/GoogleButton/GoogleButton.mjs +0 -49
- package/dist/esm/GoogleButton/GoogleButton.mjs.map +0 -1
- package/dist/esm/HumanNameDisplay/HumanNameDisplay.mjs +0 -13
- package/dist/esm/HumanNameDisplay/HumanNameDisplay.mjs.map +0 -1
- package/dist/esm/HumanNameInput/HumanNameInput.mjs +0 -50
- package/dist/esm/HumanNameInput/HumanNameInput.mjs.map +0 -1
- package/dist/esm/IdentifierDisplay/IdentifierDisplay.mjs +0 -11
- package/dist/esm/IdentifierDisplay/IdentifierDisplay.mjs.map +0 -1
- package/dist/esm/IdentifierInput/IdentifierInput.mjs +0 -18
- package/dist/esm/IdentifierInput/IdentifierInput.mjs.map +0 -1
- package/dist/esm/Loading/Loading.mjs +0 -10
- package/dist/esm/Loading/Loading.mjs.map +0 -1
- package/dist/esm/Logo/Logo.mjs +0 -14
- package/dist/esm/Logo/Logo.mjs.map +0 -1
- package/dist/esm/MedplumLink/MedplumLink.mjs +0 -52
- package/dist/esm/MedplumLink/MedplumLink.mjs.map +0 -1
- package/dist/esm/MedplumProvider/MedplumProvider.mjs +0 -84
- package/dist/esm/MedplumProvider/MedplumProvider.mjs.map +0 -1
- package/dist/esm/MoneyDisplay/MoneyDisplay.mjs +0 -9
- package/dist/esm/MoneyDisplay/MoneyDisplay.mjs.map +0 -1
- package/dist/esm/MoneyInput/MoneyInput.mjs +0 -53
- package/dist/esm/MoneyInput/MoneyInput.mjs.map +0 -1
- package/dist/esm/NoteDisplay/NoteDisplay.mjs +0 -18
- package/dist/esm/NoteDisplay/NoteDisplay.mjs.map +0 -1
- package/dist/esm/OperationOutcomeAlert/OperationOutcomeAlert.mjs +0 -14
- package/dist/esm/OperationOutcomeAlert/OperationOutcomeAlert.mjs.map +0 -1
- package/dist/esm/Panel/Panel.mjs +0 -34
- package/dist/esm/Panel/Panel.mjs.map +0 -1
- package/dist/esm/PatientTimeline/PatientTimeline.mjs +0 -38
- package/dist/esm/PatientTimeline/PatientTimeline.mjs.map +0 -1
- package/dist/esm/PeriodInput/PeriodInput.mjs +0 -19
- package/dist/esm/PeriodInput/PeriodInput.mjs.map +0 -1
- package/dist/esm/PlanDefinitionBuilder/PlanDefinitionBuilder.mjs +0 -258
- package/dist/esm/PlanDefinitionBuilder/PlanDefinitionBuilder.mjs.map +0 -1
- package/dist/esm/QuantityDisplay/QuantityDisplay.mjs +0 -9
- package/dist/esm/QuantityDisplay/QuantityDisplay.mjs.map +0 -1
- package/dist/esm/QuantityInput/QuantityInput.mjs +0 -40
- package/dist/esm/QuantityInput/QuantityInput.mjs.map +0 -1
- package/dist/esm/QuestionnaireBuilder/QuestionnaireBuilder.mjs +0 -289
- package/dist/esm/QuestionnaireBuilder/QuestionnaireBuilder.mjs.map +0 -1
- package/dist/esm/QuestionnaireForm/QuestionnaireForm.mjs +0 -275
- package/dist/esm/QuestionnaireForm/QuestionnaireForm.mjs.map +0 -1
- package/dist/esm/RangeDisplay/RangeDisplay.mjs +0 -9
- package/dist/esm/RangeDisplay/RangeDisplay.mjs.map +0 -1
- package/dist/esm/RangeInput/RangeInput.mjs +0 -31
- package/dist/esm/RangeInput/RangeInput.mjs.map +0 -1
- package/dist/esm/RatioDisplay/RatioDisplay.mjs +0 -16
- package/dist/esm/RatioDisplay/RatioDisplay.mjs.map +0 -1
- package/dist/esm/RatioInput/RatioInput.mjs +0 -31
- package/dist/esm/RatioInput/RatioInput.mjs.map +0 -1
- package/dist/esm/ReferenceDisplay/ReferenceDisplay.mjs +0 -21
- package/dist/esm/ReferenceDisplay/ReferenceDisplay.mjs.map +0 -1
- package/dist/esm/ReferenceInput/ReferenceInput.mjs +0 -45
- package/dist/esm/ReferenceInput/ReferenceInput.mjs.map +0 -1
- package/dist/esm/ReferenceRangeEditor/ReferenceRangeEditor.mjs +0 -286
- package/dist/esm/ReferenceRangeEditor/ReferenceRangeEditor.mjs.map +0 -1
- package/dist/esm/RequestGroupDisplay/RequestGroupDisplay.mjs +0 -72
- package/dist/esm/RequestGroupDisplay/RequestGroupDisplay.mjs.map +0 -1
- package/dist/esm/ResourceArrayDisplay/ResourceArrayDisplay.mjs +0 -13
- package/dist/esm/ResourceArrayDisplay/ResourceArrayDisplay.mjs.map +0 -1
- package/dist/esm/ResourceArrayInput/ResourceArrayInput.mjs +0 -51
- package/dist/esm/ResourceArrayInput/ResourceArrayInput.mjs.map +0 -1
- package/dist/esm/ResourceAvatar/ResourceAvatar.mjs +0 -23
- package/dist/esm/ResourceAvatar/ResourceAvatar.mjs.map +0 -1
- package/dist/esm/ResourceBadge/ResourceBadge.mjs +0 -13
- package/dist/esm/ResourceBadge/ResourceBadge.mjs.map +0 -1
- package/dist/esm/ResourceBlame/ResourceBlame.mjs +0 -113
- package/dist/esm/ResourceBlame/ResourceBlame.mjs.map +0 -1
- package/dist/esm/ResourceDiff/ResourceDiff.mjs +0 -39
- package/dist/esm/ResourceDiff/ResourceDiff.mjs.map +0 -1
- package/dist/esm/ResourceDiffTable/ResourceDiffTable.mjs +0 -80
- package/dist/esm/ResourceDiffTable/ResourceDiffTable.mjs.map +0 -1
- package/dist/esm/ResourceForm/ResourceForm.mjs +0 -56
- package/dist/esm/ResourceForm/ResourceForm.mjs.map +0 -1
- package/dist/esm/ResourceHistoryTable/ResourceHistoryTable.mjs +0 -50
- package/dist/esm/ResourceHistoryTable/ResourceHistoryTable.mjs.map +0 -1
- package/dist/esm/ResourceInput/ResourceInput.mjs +0 -70
- package/dist/esm/ResourceInput/ResourceInput.mjs.map +0 -1
- package/dist/esm/ResourceName/ResourceName.mjs +0 -25
- package/dist/esm/ResourceName/ResourceName.mjs.map +0 -1
- package/dist/esm/ResourcePropertyDisplay/ResourcePropertyDisplay.mjs +0 -119
- package/dist/esm/ResourcePropertyDisplay/ResourcePropertyDisplay.mjs.map +0 -1
- package/dist/esm/ResourcePropertyInput/ResourcePropertyInput.mjs +0 -171
- package/dist/esm/ResourcePropertyInput/ResourcePropertyInput.mjs.map +0 -1
- package/dist/esm/ResourceTable/ResourceTable.mjs +0 -25
- package/dist/esm/ResourceTable/ResourceTable.mjs.map +0 -1
- package/dist/esm/ResourceTimeline/ResourceTimeline.mjs +0 -309
- package/dist/esm/ResourceTimeline/ResourceTimeline.mjs.map +0 -1
- package/dist/esm/Scheduler/Scheduler.mjs +0 -98
- package/dist/esm/Scheduler/Scheduler.mjs.map +0 -1
- package/dist/esm/SearchControl/SearchControl.mjs +0 -337
- package/dist/esm/SearchControl/SearchControl.mjs.map +0 -1
- package/dist/esm/SearchControl/SearchControlField.mjs +0 -95
- package/dist/esm/SearchControl/SearchControlField.mjs.map +0 -1
- package/dist/esm/SearchControl/SearchUtils.mjs +0 -497
- package/dist/esm/SearchControl/SearchUtils.mjs.map +0 -1
- package/dist/esm/SearchExportDialog/SearchExportDialog.mjs +0 -19
- package/dist/esm/SearchExportDialog/SearchExportDialog.mjs.map +0 -1
- package/dist/esm/SearchFieldEditor/SearchFieldEditor.mjs +0 -196
- package/dist/esm/SearchFieldEditor/SearchFieldEditor.mjs.map +0 -1
- package/dist/esm/SearchFilterEditor/SearchFilterEditor.mjs +0 -97
- package/dist/esm/SearchFilterEditor/SearchFilterEditor.mjs.map +0 -1
- package/dist/esm/SearchFilterValueDialog/SearchFilterValueDialog.mjs +0 -22
- package/dist/esm/SearchFilterValueDialog/SearchFilterValueDialog.mjs.map +0 -1
- package/dist/esm/SearchFilterValueDisplay/SearchFilterValueDisplay.mjs +0 -22
- package/dist/esm/SearchFilterValueDisplay/SearchFilterValueDisplay.mjs.map +0 -1
- package/dist/esm/SearchFilterValueInput/SearchFilterValueInput.mjs +0 -57
- package/dist/esm/SearchFilterValueInput/SearchFilterValueInput.mjs.map +0 -1
- package/dist/esm/SearchPopupMenu/SearchPopupMenu.mjs +0 -134
- package/dist/esm/SearchPopupMenu/SearchPopupMenu.mjs.map +0 -1
- package/dist/esm/ServiceRequestTimeline/ServiceRequestTimeline.mjs +0 -36
- package/dist/esm/ServiceRequestTimeline/ServiceRequestTimeline.mjs.map +0 -1
- package/dist/esm/StatusBadge/StatusBadge.mjs +0 -63
- package/dist/esm/StatusBadge/StatusBadge.mjs.map +0 -1
- package/dist/esm/Timeline/Timeline.mjs +0 -40
- package/dist/esm/Timeline/Timeline.mjs.map +0 -1
- package/dist/esm/TimingInput/TimingInput.mjs +0 -76
- package/dist/esm/TimingInput/TimingInput.mjs.map +0 -1
- package/dist/esm/ValueSetAutocomplete/ValueSetAutocomplete.mjs +0 -58
- package/dist/esm/ValueSetAutocomplete/ValueSetAutocomplete.mjs.map +0 -1
- package/dist/esm/auth/AuthenticationForm.mjs +0 -89
- package/dist/esm/auth/AuthenticationForm.mjs.map +0 -1
- package/dist/esm/auth/ChooseProfileForm.mjs +0 -33
- package/dist/esm/auth/ChooseProfileForm.mjs.map +0 -1
- package/dist/esm/auth/ChooseScopeForm.mjs +0 -28
- package/dist/esm/auth/ChooseScopeForm.mjs.map +0 -1
- package/dist/esm/auth/MfaForm.mjs +0 -34
- package/dist/esm/auth/MfaForm.mjs.map +0 -1
- package/dist/esm/auth/NewProjectForm.mjs +0 -39
- package/dist/esm/auth/NewProjectForm.mjs.map +0 -1
- package/dist/esm/auth/NewUserForm.mjs +0 -84
- package/dist/esm/auth/NewUserForm.mjs.map +0 -1
- package/dist/esm/auth/RegisterForm.mjs +0 -39
- package/dist/esm/auth/RegisterForm.mjs.map +0 -1
- package/dist/esm/auth/SignInForm.mjs +0 -100
- package/dist/esm/auth/SignInForm.mjs.map +0 -1
- package/dist/esm/constants.mjs +0 -12
- package/dist/esm/constants.mjs.map +0 -1
- package/dist/esm/index.min.mjs +0 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/createReactComponent.mjs +0 -70
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/createReactComponent.mjs.map +0 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/defaultAttributes.mjs +0 -18
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/defaultAttributes.mjs.map +0 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconAdjustmentsHorizontal.mjs +0 -25
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconAdjustmentsHorizontal.mjs.map +0 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconAlertCircle.mjs +0 -15
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconAlertCircle.mjs.map +0 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconBleach.mjs +0 -19
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconBleach.mjs.map +0 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconBleachOff.mjs +0 -20
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconBleachOff.mjs.map +0 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconBoxMultiple.mjs +0 -26
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconBoxMultiple.mjs.map +0 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconBracketsContain.mjs +0 -17
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconBracketsContain.mjs.map +0 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconBucket.mjs +0 -20
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconBucket.mjs.map +0 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconBucketOff.mjs +0 -27
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconBucketOff.mjs.map +0 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconCalendar.mjs +0 -24
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconCalendar.mjs.map +0 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconCheck.mjs +0 -13
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconCheck.mjs.map +0 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconCheckbox.mjs +0 -20
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconCheckbox.mjs.map +0 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconChevronDown.mjs +0 -13
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconChevronDown.mjs.map +0 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconCircleMinus.mjs +0 -14
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconCircleMinus.mjs.map +0 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconCirclePlus.mjs +0 -15
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconCirclePlus.mjs.map +0 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconCloudUpload.mjs +0 -21
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconCloudUpload.mjs.map +0 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconColumns.mjs +0 -20
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconColumns.mjs.map +0 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconCurrencyDollar.mjs +0 -20
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconCurrencyDollar.mjs.map +0 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconDots.mjs +0 -15
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconDots.mjs.map +0 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconEdit.mjs +0 -27
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconEdit.mjs.map +0 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconEqual.mjs +0 -14
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconEqual.mjs.map +0 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconEqualNot.mjs +0 -15
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconEqualNot.mjs.map +0 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconFileAlert.mjs +0 -22
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconFileAlert.mjs.map +0 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconFilePlus.mjs +0 -22
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconFilePlus.mjs.map +0 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconFilter.mjs +0 -19
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconFilter.mjs.map +0 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconListDetails.mjs +0 -30
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconListDetails.mjs.map +0 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconLogout.mjs +0 -21
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconLogout.mjs.map +0 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconMathGreater.mjs +0 -13
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconMathGreater.mjs.map +0 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconMathLower.mjs +0 -13
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconMathLower.mjs.map +0 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconMessage.mjs +0 -21
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconMessage.mjs.map +0 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconPin.mjs +0 -21
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconPin.mjs.map +0 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconPinnedOff.mjs +0 -22
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconPinnedOff.mjs.map +0 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconPlus.mjs +0 -14
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconPlus.mjs.map +0 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconSearch.mjs +0 -14
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconSearch.mjs.map +0 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconSettings.mjs +0 -20
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconSettings.mjs.map +0 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconSortAscending.mjs +0 -17
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconSortAscending.mjs.map +0 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconSortDescending.mjs +0 -17
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconSortDescending.mjs.map +0 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconSquare.mjs +0 -19
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconSquare.mjs.map +0 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconSwitchHorizontal.mjs +0 -20
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconSwitchHorizontal.mjs.map +0 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconTableExport.mjs +0 -23
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconTableExport.mjs.map +0 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconTrash.mjs +0 -20
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconTrash.mjs.map +0 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconX.mjs +0 -14
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconX.mjs.map +0 -1
- package/dist/esm/useResource/useResource.mjs +0 -68
- package/dist/esm/useResource/useResource.mjs.map +0 -1
- package/dist/esm/utils/blame.mjs +0 -72
- package/dist/esm/utils/blame.mjs.map +0 -1
- package/dist/esm/utils/date.mjs +0 -56
- package/dist/esm/utils/date.mjs.map +0 -1
- package/dist/esm/utils/diff.mjs +0 -118
- package/dist/esm/utils/diff.mjs.map +0 -1
- package/dist/esm/utils/dom.mjs +0 -34
- package/dist/esm/utils/dom.mjs.map +0 -1
- package/dist/esm/utils/outcomes.mjs +0 -30
- package/dist/esm/utils/outcomes.mjs.map +0 -1
- package/dist/esm/utils/questionnaire.mjs +0 -26
- package/dist/esm/utils/questionnaire.mjs.map +0 -1
- package/dist/esm/utils/recaptcha.mjs +0 -32
- package/dist/esm/utils/recaptcha.mjs.map +0 -1
- package/dist/esm/utils/script.mjs +0 -16
- package/dist/esm/utils/script.mjs.map +0 -1
|
@@ -1,196 +0,0 @@
|
|
|
1
|
-
import { Modal, Button } from '@mantine/core';
|
|
2
|
-
import { stringify, globalSchema } from '@medplum/core';
|
|
3
|
-
import React, { useState, useRef, useEffect } from 'react';
|
|
4
|
-
import { buildFieldNameString } from '../SearchControl/SearchUtils.mjs';
|
|
5
|
-
|
|
6
|
-
function SearchFieldEditor(props) {
|
|
7
|
-
const [state, setState] = useState({
|
|
8
|
-
search: JSON.parse(stringify(props.search)),
|
|
9
|
-
});
|
|
10
|
-
const availableRef = useRef(null);
|
|
11
|
-
const selectedRef = useRef(null);
|
|
12
|
-
useEffect(() => {
|
|
13
|
-
setState({ search: props.search });
|
|
14
|
-
}, [props.search]);
|
|
15
|
-
/**
|
|
16
|
-
* Handles a key down event on the "available" field.
|
|
17
|
-
* If the user presses enter, it is a shortcut for the "Add" button.
|
|
18
|
-
* @param e The keyboard event.
|
|
19
|
-
*/
|
|
20
|
-
function handleAvailableKeyDown(e) {
|
|
21
|
-
if (e.key === 'Enter') {
|
|
22
|
-
onAddField();
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
/**
|
|
26
|
-
* Handles a double click on the "available" field.
|
|
27
|
-
* If the user double clicks an entry, it is a shortcut for the "Add" button.
|
|
28
|
-
*/
|
|
29
|
-
function handleAvailableDoubleClick() {
|
|
30
|
-
onAddField();
|
|
31
|
-
}
|
|
32
|
-
/**
|
|
33
|
-
* Handles a key down event on the "available" field.
|
|
34
|
-
* If the user presses enter, it is a shortcut for the "Add" button.
|
|
35
|
-
* @param e The keyboard event.
|
|
36
|
-
*/
|
|
37
|
-
function handleSelectedKeyDown(e) {
|
|
38
|
-
if (e.key === 'Enter') {
|
|
39
|
-
onRemoveField();
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
/**
|
|
43
|
-
* Handles a double click on the "available" field.
|
|
44
|
-
* If the user double clicks an entry, it is a shortcut for the "Add" button.
|
|
45
|
-
*/
|
|
46
|
-
function handleSelectedDoubleClick() {
|
|
47
|
-
onRemoveField();
|
|
48
|
-
}
|
|
49
|
-
/**
|
|
50
|
-
* Handles a click on the "Add" button.
|
|
51
|
-
* Moves the "available" selection into the "selected" list.
|
|
52
|
-
*/
|
|
53
|
-
function onAddField() {
|
|
54
|
-
const currentField = state.search.fields ?? [];
|
|
55
|
-
const key = availableRef.current?.value;
|
|
56
|
-
if (key) {
|
|
57
|
-
const newFields = [...currentField, key];
|
|
58
|
-
setState({
|
|
59
|
-
search: {
|
|
60
|
-
...state.search,
|
|
61
|
-
fields: newFields,
|
|
62
|
-
},
|
|
63
|
-
});
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
/**
|
|
67
|
-
* Handles a click on the "Remove" button.
|
|
68
|
-
* Moves the "selected" selection into the "available" list.
|
|
69
|
-
*/
|
|
70
|
-
function onRemoveField() {
|
|
71
|
-
const currentField = state.search.fields ?? [];
|
|
72
|
-
const key = selectedRef.current?.value;
|
|
73
|
-
if (key) {
|
|
74
|
-
const newFields = [...currentField];
|
|
75
|
-
newFields.splice(newFields.indexOf(key), 1);
|
|
76
|
-
setState({
|
|
77
|
-
search: {
|
|
78
|
-
...state.search,
|
|
79
|
-
fields: newFields,
|
|
80
|
-
},
|
|
81
|
-
});
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
/**
|
|
85
|
-
* Handles a click on the "Up" button.
|
|
86
|
-
* Moves the selection up one position in the list.
|
|
87
|
-
*/
|
|
88
|
-
function onMoveUp() {
|
|
89
|
-
const currentFields = state.search.fields ?? [];
|
|
90
|
-
const field = selectedRef.current?.value;
|
|
91
|
-
if (!field) {
|
|
92
|
-
return;
|
|
93
|
-
}
|
|
94
|
-
const newFields = [...currentFields];
|
|
95
|
-
const index = newFields.indexOf(field);
|
|
96
|
-
if (index <= 0) {
|
|
97
|
-
return;
|
|
98
|
-
}
|
|
99
|
-
swapFields(newFields, index, index - 1);
|
|
100
|
-
setState({ search: { ...state.search, fields: newFields } });
|
|
101
|
-
}
|
|
102
|
-
/**
|
|
103
|
-
* Handles a click on the "Down" button.
|
|
104
|
-
* Moves the selection down one position in the list.
|
|
105
|
-
*/
|
|
106
|
-
function onMoveDown() {
|
|
107
|
-
const currentFields = state.search.fields ?? [];
|
|
108
|
-
const field = selectedRef.current?.value;
|
|
109
|
-
if (!field) {
|
|
110
|
-
return;
|
|
111
|
-
}
|
|
112
|
-
const newFields = [...currentFields];
|
|
113
|
-
const index = newFields.indexOf(field);
|
|
114
|
-
if (index >= newFields.length - 1) {
|
|
115
|
-
return;
|
|
116
|
-
}
|
|
117
|
-
swapFields(newFields, index, index + 1);
|
|
118
|
-
setState({ search: { ...state.search, fields: newFields } });
|
|
119
|
-
}
|
|
120
|
-
/**
|
|
121
|
-
* Swaps two fields in the search.
|
|
122
|
-
* @param fields The array of fields.
|
|
123
|
-
* @param i The index of the first field.
|
|
124
|
-
* @param j The index of the second field.
|
|
125
|
-
*/
|
|
126
|
-
function swapFields(fields, i, j) {
|
|
127
|
-
const temp = fields[i];
|
|
128
|
-
fields[i] = fields[j];
|
|
129
|
-
fields[j] = temp;
|
|
130
|
-
}
|
|
131
|
-
if (!props.visible) {
|
|
132
|
-
return null;
|
|
133
|
-
}
|
|
134
|
-
const resourceType = props.search.resourceType;
|
|
135
|
-
const typeDef = globalSchema.types[resourceType];
|
|
136
|
-
const selected = state.search.fields ?? [];
|
|
137
|
-
const available = getFieldsList(typeDef)
|
|
138
|
-
.filter((field) => !selected?.includes(field))
|
|
139
|
-
.sort();
|
|
140
|
-
return (React.createElement(Modal, { title: "Fields", closeButtonProps: { 'aria-label': 'Close' }, opened: props.visible, onClose: props.onCancel },
|
|
141
|
-
React.createElement("div", null,
|
|
142
|
-
React.createElement("table", { style: { margin: 'auto' } },
|
|
143
|
-
React.createElement("thead", null,
|
|
144
|
-
React.createElement("tr", null,
|
|
145
|
-
React.createElement("th", { colSpan: 2, align: "center" }, "Available"),
|
|
146
|
-
React.createElement("th", { colSpan: 2, align: "center" }, "Selected"))),
|
|
147
|
-
React.createElement("tbody", null,
|
|
148
|
-
React.createElement("tr", null,
|
|
149
|
-
React.createElement("td", { colSpan: 2, align: "center" },
|
|
150
|
-
React.createElement("select", { ref: availableRef, size: 15, tabIndex: 1, style: { width: '200px' }, onKeyDown: (e) => handleAvailableKeyDown(e), onDoubleClick: () => handleAvailableDoubleClick(), "data-testid": "available" }, available.map((key) => (React.createElement("option", { key: key, value: key }, buildFieldNameString(key)))))),
|
|
151
|
-
React.createElement("td", { colSpan: 2, align: "center" },
|
|
152
|
-
React.createElement("select", { ref: selectedRef, size: 15, tabIndex: 4, style: { width: '200px' }, onKeyDown: (e) => handleSelectedKeyDown(e), onDoubleClick: () => handleSelectedDoubleClick(), "data-testid": "selected" }, selected.map((key) => (React.createElement("option", { key: key, value: key }, buildFieldNameString(key)))))))),
|
|
153
|
-
React.createElement("tfoot", null,
|
|
154
|
-
React.createElement("tr", null,
|
|
155
|
-
React.createElement("td", { align: "center" },
|
|
156
|
-
React.createElement(Button, { compact: true, variant: "outline", onClick: onAddField }, "Add")),
|
|
157
|
-
React.createElement("td", { align: "center" },
|
|
158
|
-
React.createElement(Button, { compact: true, variant: "outline", onClick: onRemoveField }, "Remove")),
|
|
159
|
-
React.createElement("td", { align: "center" },
|
|
160
|
-
React.createElement(Button, { compact: true, variant: "outline", onClick: onMoveUp }, "Up")),
|
|
161
|
-
React.createElement("td", { align: "center" },
|
|
162
|
-
React.createElement(Button, { compact: true, variant: "outline", onClick: onMoveDown }, "Down")))))),
|
|
163
|
-
React.createElement(Button, { onClick: () => props.onOk(state.search) }, "OK")));
|
|
164
|
-
}
|
|
165
|
-
/**
|
|
166
|
-
* Returns a list of fields/columns available for a type.
|
|
167
|
-
* The result is the union of properties and search parameters.
|
|
168
|
-
* @param typeSchema The type definition.
|
|
169
|
-
* @returns A list of fields/columns available for a resource type.
|
|
170
|
-
*/
|
|
171
|
-
function getFieldsList(typeSchema) {
|
|
172
|
-
const result = [];
|
|
173
|
-
const keys = new Set();
|
|
174
|
-
const names = new Set();
|
|
175
|
-
// Add properties first
|
|
176
|
-
for (const key of Object.keys(typeSchema.properties)) {
|
|
177
|
-
result.push(key);
|
|
178
|
-
keys.add(key.toLowerCase());
|
|
179
|
-
names.add(buildFieldNameString(key));
|
|
180
|
-
}
|
|
181
|
-
// Add search parameters if unique
|
|
182
|
-
if (typeSchema.searchParams) {
|
|
183
|
-
for (const code of Object.keys(typeSchema.searchParams)) {
|
|
184
|
-
const name = buildFieldNameString(code);
|
|
185
|
-
if (!keys.has(code) && !names.has(name)) {
|
|
186
|
-
result.push(code);
|
|
187
|
-
keys.add(code);
|
|
188
|
-
names.add(buildFieldNameString(code));
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
return result;
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
export { SearchFieldEditor };
|
|
196
|
-
//# sourceMappingURL=SearchFieldEditor.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SearchFieldEditor.mjs","sources":["../../../src/SearchFieldEditor/SearchFieldEditor.tsx"],"sourcesContent":["import { Button, Modal } from '@mantine/core';\nimport { globalSchema, SearchRequest, stringify, TypeSchema } from '@medplum/core';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { buildFieldNameString } from '../SearchControl/SearchUtils';\n\ninterface SearchFieldEditorProps {\n visible: boolean;\n search: SearchRequest;\n onOk: (search: SearchRequest) => void;\n onCancel: () => void;\n}\n\nexport function SearchFieldEditor(props: SearchFieldEditorProps): JSX.Element | null {\n const [state, setState] = useState({\n search: JSON.parse(stringify(props.search)) as SearchRequest,\n });\n\n const availableRef = useRef<HTMLSelectElement>(null);\n const selectedRef = useRef<HTMLSelectElement>(null);\n\n useEffect(() => {\n setState({ search: props.search });\n }, [props.search]);\n\n /**\n * Handles a key down event on the \"available\" field.\n * If the user presses enter, it is a shortcut for the \"Add\" button.\n * @param e The keyboard event.\n */\n function handleAvailableKeyDown(e: React.KeyboardEvent): void {\n if (e.key === 'Enter') {\n onAddField();\n }\n }\n\n /**\n * Handles a double click on the \"available\" field.\n * If the user double clicks an entry, it is a shortcut for the \"Add\" button.\n */\n function handleAvailableDoubleClick(): void {\n onAddField();\n }\n\n /**\n * Handles a key down event on the \"available\" field.\n * If the user presses enter, it is a shortcut for the \"Add\" button.\n * @param e The keyboard event.\n */\n function handleSelectedKeyDown(e: React.KeyboardEvent): void {\n if (e.key === 'Enter') {\n onRemoveField();\n }\n }\n\n /**\n * Handles a double click on the \"available\" field.\n * If the user double clicks an entry, it is a shortcut for the \"Add\" button.\n */\n function handleSelectedDoubleClick(): void {\n onRemoveField();\n }\n\n /**\n * Handles a click on the \"Add\" button.\n * Moves the \"available\" selection into the \"selected\" list.\n */\n function onAddField(): void {\n const currentField = state.search.fields ?? [];\n const key = availableRef.current?.value;\n if (key) {\n const newFields = [...currentField, key];\n setState({\n search: {\n ...state.search,\n fields: newFields,\n },\n });\n }\n }\n\n /**\n * Handles a click on the \"Remove\" button.\n * Moves the \"selected\" selection into the \"available\" list.\n */\n function onRemoveField(): void {\n const currentField = state.search.fields ?? [];\n const key = selectedRef.current?.value;\n if (key) {\n const newFields = [...currentField];\n newFields.splice(newFields.indexOf(key), 1);\n setState({\n search: {\n ...state.search,\n fields: newFields,\n },\n });\n }\n }\n\n /**\n * Handles a click on the \"Up\" button.\n * Moves the selection up one position in the list.\n */\n function onMoveUp(): void {\n const currentFields = state.search.fields ?? [];\n const field = selectedRef.current?.value;\n if (!field) {\n return;\n }\n\n const newFields = [...currentFields];\n const index = newFields.indexOf(field);\n if (index <= 0) {\n return;\n }\n\n swapFields(newFields, index, index - 1);\n setState({ search: { ...state.search, fields: newFields } });\n }\n\n /**\n * Handles a click on the \"Down\" button.\n * Moves the selection down one position in the list.\n */\n function onMoveDown(): void {\n const currentFields = state.search.fields ?? [];\n const field = selectedRef.current?.value;\n if (!field) {\n return;\n }\n\n const newFields = [...currentFields];\n const index = newFields.indexOf(field);\n if (index >= newFields.length - 1) {\n return;\n }\n\n swapFields(newFields, index, index + 1);\n setState({ search: { ...state.search, fields: newFields } });\n }\n\n /**\n * Swaps two fields in the search.\n * @param fields The array of fields.\n * @param i The index of the first field.\n * @param j The index of the second field.\n */\n function swapFields(fields: string[], i: number, j: number): void {\n const temp = fields[i];\n fields[i] = fields[j];\n fields[j] = temp;\n }\n\n if (!props.visible) {\n return null;\n }\n\n const resourceType = props.search.resourceType;\n const typeDef = globalSchema.types[resourceType];\n\n const selected = state.search.fields ?? [];\n const available = getFieldsList(typeDef)\n .filter((field) => !selected?.includes(field))\n .sort();\n\n return (\n <Modal title=\"Fields\" closeButtonProps={{ 'aria-label': 'Close' }} opened={props.visible} onClose={props.onCancel}>\n <div>\n <table style={{ margin: 'auto' }}>\n <thead>\n <tr>\n <th colSpan={2} align=\"center\">\n Available\n </th>\n <th colSpan={2} align=\"center\">\n Selected\n </th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <td colSpan={2} align=\"center\">\n <select\n ref={availableRef}\n size={15}\n tabIndex={1}\n style={{ width: '200px' }}\n onKeyDown={(e) => handleAvailableKeyDown(e)}\n onDoubleClick={() => handleAvailableDoubleClick()}\n data-testid=\"available\"\n >\n {available.map((key) => (\n <option key={key} value={key}>\n {buildFieldNameString(key)}\n </option>\n ))}\n </select>\n </td>\n <td colSpan={2} align=\"center\">\n <select\n ref={selectedRef}\n size={15}\n tabIndex={4}\n style={{ width: '200px' }}\n onKeyDown={(e) => handleSelectedKeyDown(e)}\n onDoubleClick={() => handleSelectedDoubleClick()}\n data-testid=\"selected\"\n >\n {selected.map((key) => (\n <option key={key} value={key}>\n {buildFieldNameString(key)}\n </option>\n ))}\n </select>\n </td>\n </tr>\n </tbody>\n <tfoot>\n <tr>\n <td align=\"center\">\n <Button compact variant=\"outline\" onClick={onAddField}>\n Add\n </Button>\n </td>\n <td align=\"center\">\n <Button compact variant=\"outline\" onClick={onRemoveField}>\n Remove\n </Button>\n </td>\n <td align=\"center\">\n <Button compact variant=\"outline\" onClick={onMoveUp}>\n Up\n </Button>\n </td>\n <td align=\"center\">\n <Button compact variant=\"outline\" onClick={onMoveDown}>\n Down\n </Button>\n </td>\n </tr>\n </tfoot>\n </table>\n </div>\n <Button onClick={() => props.onOk(state.search)}>OK</Button>\n </Modal>\n );\n}\n\n/**\n * Returns a list of fields/columns available for a type.\n * The result is the union of properties and search parameters.\n * @param typeSchema The type definition.\n * @returns A list of fields/columns available for a resource type.\n */\nfunction getFieldsList(typeSchema: TypeSchema): string[] {\n const result = [] as string[];\n const keys = new Set<string>();\n const names = new Set<string>();\n\n // Add properties first\n for (const key of Object.keys(typeSchema.properties)) {\n result.push(key);\n keys.add(key.toLowerCase());\n names.add(buildFieldNameString(key));\n }\n\n // Add search parameters if unique\n if (typeSchema.searchParams) {\n for (const code of Object.keys(typeSchema.searchParams)) {\n const name = buildFieldNameString(code);\n if (!keys.has(code) && !names.has(name)) {\n result.push(code);\n keys.add(code);\n names.add(buildFieldNameString(code));\n }\n }\n }\n\n return result;\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1,97 +0,0 @@
|
|
|
1
|
-
import { Modal, Group, Button, NativeSelect } from '@mantine/core';
|
|
2
|
-
import { stringify, globalSchema } from '@medplum/core';
|
|
3
|
-
import React, { useState, useRef, useEffect } from 'react';
|
|
4
|
-
import { setFilters, deleteFilter, buildFieldNameString, getOpString, getSearchOperators, addFilter } from '../SearchControl/SearchUtils.mjs';
|
|
5
|
-
import { SearchFilterValueDisplay } from '../SearchFilterValueDisplay/SearchFilterValueDisplay.mjs';
|
|
6
|
-
import { SearchFilterValueInput } from '../SearchFilterValueInput/SearchFilterValueInput.mjs';
|
|
7
|
-
|
|
8
|
-
function SearchFilterEditor(props) {
|
|
9
|
-
const [search, setSearch] = useState(JSON.parse(stringify(props.search)));
|
|
10
|
-
const [editingIndex, setEditingIndex] = useState(-1);
|
|
11
|
-
const searchRef = useRef(search);
|
|
12
|
-
searchRef.current = search;
|
|
13
|
-
useEffect(() => {
|
|
14
|
-
setSearch(JSON.parse(stringify(props.search)));
|
|
15
|
-
}, [props.search]);
|
|
16
|
-
function onAddFilter(filter) {
|
|
17
|
-
setSearch(addFilter(searchRef.current, filter.code, filter.operator, filter.value));
|
|
18
|
-
}
|
|
19
|
-
if (!props.visible) {
|
|
20
|
-
return null;
|
|
21
|
-
}
|
|
22
|
-
const resourceType = props.search.resourceType;
|
|
23
|
-
const searchParams = globalSchema.types[resourceType].searchParams ?? {};
|
|
24
|
-
const filters = search.filters || [];
|
|
25
|
-
return (React.createElement(Modal, { title: "Filters", closeButtonProps: { 'aria-label': 'Close' }, size: 900, opened: props.visible, onClose: props.onCancel },
|
|
26
|
-
React.createElement("div", null,
|
|
27
|
-
React.createElement("table", null,
|
|
28
|
-
React.createElement("colgroup", null,
|
|
29
|
-
React.createElement("col", { style: { width: 200 } }),
|
|
30
|
-
React.createElement("col", { style: { width: 200 } }),
|
|
31
|
-
React.createElement("col", { style: { width: 380 } }),
|
|
32
|
-
React.createElement("col", { style: { width: 120 } })),
|
|
33
|
-
React.createElement("thead", null,
|
|
34
|
-
React.createElement("tr", null,
|
|
35
|
-
React.createElement("th", null, "Field"),
|
|
36
|
-
React.createElement("th", null, "Operation"),
|
|
37
|
-
React.createElement("th", null, "Value"),
|
|
38
|
-
React.createElement("th", null, "Actions"))),
|
|
39
|
-
React.createElement("tbody", null,
|
|
40
|
-
filters.map((filter, index) => {
|
|
41
|
-
if (index === editingIndex) {
|
|
42
|
-
return (React.createElement(FilterRowInput, { key: `filter-${index}-${filters.length}-input`, resourceType: resourceType, searchParams: searchParams, defaultValue: filter, okText: "Save", onOk: (newFilter) => {
|
|
43
|
-
const newFilters = [...filters];
|
|
44
|
-
newFilters[index] = newFilter;
|
|
45
|
-
setSearch(setFilters(searchRef.current, newFilters));
|
|
46
|
-
setEditingIndex(-1);
|
|
47
|
-
}, onCancel: () => setEditingIndex(-1) }));
|
|
48
|
-
}
|
|
49
|
-
else {
|
|
50
|
-
return (React.createElement(FilterRowDisplay, { key: `filter-${index}-${filters.length}-display`, resourceType: resourceType, searchParams: searchParams, filter: filter, onEdit: () => setEditingIndex(index), onDelete: () => setSearch(deleteFilter(searchRef.current, index)) }));
|
|
51
|
-
}
|
|
52
|
-
}),
|
|
53
|
-
React.createElement(FilterRowInput, { resourceType: resourceType, searchParams: searchParams, okText: "Add", onOk: onAddFilter })))),
|
|
54
|
-
React.createElement(Group, { position: "right", mt: "xl" },
|
|
55
|
-
React.createElement(Button, { onClick: () => props.onOk(searchRef.current) }, "OK"))));
|
|
56
|
-
}
|
|
57
|
-
function FilterRowDisplay(props) {
|
|
58
|
-
const { filter } = props;
|
|
59
|
-
return (React.createElement("tr", null,
|
|
60
|
-
React.createElement("td", null, buildFieldNameString(filter.code)),
|
|
61
|
-
React.createElement("td", null, getOpString(filter.operator)),
|
|
62
|
-
React.createElement("td", null,
|
|
63
|
-
React.createElement(SearchFilterValueDisplay, { resourceType: props.resourceType, filter: filter })),
|
|
64
|
-
React.createElement("td", null,
|
|
65
|
-
React.createElement(Button, { compact: true, variant: "outline", onClick: props.onEdit }, "Edit"),
|
|
66
|
-
React.createElement(Button, { compact: true, variant: "outline", onClick: props.onDelete }, "Delete"))));
|
|
67
|
-
}
|
|
68
|
-
function FilterRowInput(props) {
|
|
69
|
-
const [value, setValue] = useState(props.defaultValue ?? {});
|
|
70
|
-
const valueRef = useRef(value);
|
|
71
|
-
valueRef.current = value;
|
|
72
|
-
function setFilterCode(newCode) {
|
|
73
|
-
setValue({ ...valueRef.current, code: newCode });
|
|
74
|
-
}
|
|
75
|
-
function setFilterOperator(newOperator) {
|
|
76
|
-
setValue({ ...valueRef.current, operator: newOperator });
|
|
77
|
-
}
|
|
78
|
-
function setFilterValue(newFilterValue) {
|
|
79
|
-
setValue({ ...valueRef.current, value: newFilterValue });
|
|
80
|
-
}
|
|
81
|
-
const searchParam = props.searchParams[value.code];
|
|
82
|
-
const operators = searchParam && getSearchOperators(searchParam);
|
|
83
|
-
return (React.createElement("tr", null,
|
|
84
|
-
React.createElement("td", null,
|
|
85
|
-
React.createElement(NativeSelect, { "data-testid": "filter-field", defaultValue: valueRef.current.code, onChange: (e) => setFilterCode(e.currentTarget.value), data: Object.keys(props.searchParams).map((param) => ({ value: param, label: buildFieldNameString(param) })) })),
|
|
86
|
-
React.createElement("td", null, operators && (React.createElement(NativeSelect, { "data-testid": "filter-operation", defaultValue: value.operator, onChange: (e) => setFilterOperator(e.currentTarget.value), data: ['', ...operators.map((op) => ({ value: op, label: getOpString(op) }))] }))),
|
|
87
|
-
React.createElement("td", null, searchParam && value.operator && (React.createElement(SearchFilterValueInput, { resourceType: props.resourceType, searchParam: searchParam, defaultValue: value.value, onChange: setFilterValue }))),
|
|
88
|
-
React.createElement("td", null,
|
|
89
|
-
value.code && value.operator && value.value && (React.createElement(Button, { compact: true, variant: "outline", onClick: () => {
|
|
90
|
-
props.onOk(valueRef.current);
|
|
91
|
-
setValue({});
|
|
92
|
-
} }, props.okText)),
|
|
93
|
-
props.onCancel && (React.createElement(Button, { compact: true, variant: "outline", onClick: props.onCancel }, "Cancel")))));
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
export { SearchFilterEditor };
|
|
97
|
-
//# sourceMappingURL=SearchFilterEditor.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SearchFilterEditor.mjs","sources":["../../../src/SearchFilterEditor/SearchFilterEditor.tsx"],"sourcesContent":["import { Button, Group, Modal, NativeSelect } from '@mantine/core';\nimport { Filter, globalSchema, Operator, SearchRequest, stringify } from '@medplum/core';\nimport { SearchParameter } from '@medplum/fhirtypes';\nimport React, { useEffect, useRef, useState } from 'react';\nimport {\n addFilter,\n buildFieldNameString,\n deleteFilter,\n getOpString,\n getSearchOperators,\n setFilters,\n} from '../SearchControl/SearchUtils';\nimport { SearchFilterValueDisplay } from '../SearchFilterValueDisplay/SearchFilterValueDisplay';\nimport { SearchFilterValueInput } from '../SearchFilterValueInput/SearchFilterValueInput';\n\nexport interface SearchFilterEditorProps {\n visible: boolean;\n search: SearchRequest;\n onOk: (search: SearchRequest) => void;\n onCancel: () => void;\n}\n\nexport function SearchFilterEditor(props: SearchFilterEditorProps): JSX.Element | null {\n const [search, setSearch] = useState<SearchRequest>(JSON.parse(stringify(props.search)) as SearchRequest);\n const [editingIndex, setEditingIndex] = useState<number>(-1);\n\n const searchRef = useRef<SearchRequest>(search);\n searchRef.current = search;\n\n useEffect(() => {\n setSearch(JSON.parse(stringify(props.search)) as SearchRequest);\n }, [props.search]);\n\n function onAddFilter(filter: Filter): void {\n setSearch(addFilter(searchRef.current, filter.code, filter.operator, filter.value));\n }\n\n if (!props.visible) {\n return null;\n }\n\n const resourceType = props.search.resourceType;\n const searchParams = (globalSchema.types[resourceType].searchParams as Record<string, SearchParameter>) ?? {};\n const filters = search.filters || [];\n\n return (\n <Modal\n title=\"Filters\"\n closeButtonProps={{ 'aria-label': 'Close' }}\n size={900}\n opened={props.visible}\n onClose={props.onCancel}\n >\n <div>\n <table>\n <colgroup>\n <col style={{ width: 200 }} />\n <col style={{ width: 200 }} />\n <col style={{ width: 380 }} />\n <col style={{ width: 120 }} />\n </colgroup>\n <thead>\n <tr>\n <th>Field</th>\n <th>Operation</th>\n <th>Value</th>\n <th>Actions</th>\n </tr>\n </thead>\n <tbody>\n {filters.map((filter: Filter, index: number) => {\n if (index === editingIndex) {\n return (\n <FilterRowInput\n key={`filter-${index}-${filters.length}-input`}\n resourceType={resourceType}\n searchParams={searchParams}\n defaultValue={filter}\n okText=\"Save\"\n onOk={(newFilter: Filter) => {\n const newFilters = [...filters];\n newFilters[index] = newFilter;\n setSearch(setFilters(searchRef.current, newFilters));\n setEditingIndex(-1);\n }}\n onCancel={() => setEditingIndex(-1)}\n />\n );\n } else {\n return (\n <FilterRowDisplay\n key={`filter-${index}-${filters.length}-display`}\n resourceType={resourceType}\n searchParams={searchParams}\n filter={filter}\n onEdit={() => setEditingIndex(index)}\n onDelete={() => setSearch(deleteFilter(searchRef.current, index))}\n />\n );\n }\n })}\n <FilterRowInput resourceType={resourceType} searchParams={searchParams} okText=\"Add\" onOk={onAddFilter} />\n </tbody>\n </table>\n </div>\n <Group position=\"right\" mt=\"xl\">\n <Button onClick={() => props.onOk(searchRef.current)}>OK</Button>\n </Group>\n </Modal>\n );\n}\n\ninterface FilterRowDisplayProps {\n readonly searchParams: Record<string, SearchParameter>;\n readonly resourceType: string;\n readonly filter: Filter;\n readonly onEdit: () => void;\n readonly onDelete: () => void;\n}\n\nfunction FilterRowDisplay(props: FilterRowDisplayProps): JSX.Element | null {\n const { filter } = props;\n return (\n <tr>\n <td>{buildFieldNameString(filter.code)}</td>\n <td>{getOpString(filter.operator)}</td>\n <td>\n <SearchFilterValueDisplay resourceType={props.resourceType} filter={filter} />\n </td>\n <td>\n <Button compact variant=\"outline\" onClick={props.onEdit}>\n Edit\n </Button>\n <Button compact variant=\"outline\" onClick={props.onDelete}>\n Delete\n </Button>\n </td>\n </tr>\n );\n}\n\ninterface FilterRowInputProps {\n resourceType: string;\n searchParams: Record<string, SearchParameter>;\n defaultValue?: Filter;\n okText: string;\n onOk: (value: Filter) => void;\n onCancel?: () => void;\n}\n\nfunction FilterRowInput(props: FilterRowInputProps): JSX.Element {\n const [value, setValue] = useState<Filter>(props.defaultValue ?? ({} as Filter));\n const valueRef = useRef<Filter>(value);\n valueRef.current = value;\n\n function setFilterCode(newCode: string): void {\n setValue({ ...valueRef.current, code: newCode });\n }\n\n function setFilterOperator(newOperator: Operator): void {\n setValue({ ...valueRef.current, operator: newOperator });\n }\n\n function setFilterValue(newFilterValue: string): void {\n setValue({ ...valueRef.current, value: newFilterValue });\n }\n\n const searchParam = props.searchParams[value.code];\n const operators = searchParam && getSearchOperators(searchParam);\n\n return (\n <tr>\n <td>\n <NativeSelect\n data-testid=\"filter-field\"\n defaultValue={valueRef.current.code}\n onChange={(e) => setFilterCode(e.currentTarget.value)}\n data={Object.keys(props.searchParams).map((param) => ({ value: param, label: buildFieldNameString(param) }))}\n />\n </td>\n <td>\n {operators && (\n <NativeSelect\n data-testid=\"filter-operation\"\n defaultValue={value.operator}\n onChange={(e) => setFilterOperator(e.currentTarget.value as Operator)}\n data={['', ...operators.map((op) => ({ value: op, label: getOpString(op) }))]}\n />\n )}\n </td>\n <td>\n {searchParam && value.operator && (\n <SearchFilterValueInput\n resourceType={props.resourceType}\n searchParam={searchParam}\n defaultValue={value.value}\n onChange={setFilterValue}\n />\n )}\n </td>\n <td>\n {value.code && value.operator && value.value && (\n <Button\n compact\n variant=\"outline\"\n onClick={() => {\n props.onOk(valueRef.current);\n setValue({} as Filter);\n }}\n >\n {props.okText}\n </Button>\n )}\n {props.onCancel && (\n <Button compact variant=\"outline\" onClick={props.onCancel}>\n Cancel\n </Button>\n )}\n </td>\n </tr>\n );\n}\n"],"names":[],"mappings":";;;;;;;AAsBM,SAAU,kBAAkB,CAAC,KAA8B,EAAA;IAC/D,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAkB,CAAC,CAAC;IAC1G,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAS,CAAC,CAAC,CAAC,CAAC;AAE7D,IAAA,MAAM,SAAS,GAAG,MAAM,CAAgB,MAAM,CAAC,CAAC;AAChD,IAAA,SAAS,CAAC,OAAO,GAAG,MAAM,CAAC;IAE3B,SAAS,CAAC,MAAK;AACb,QAAA,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAkB,CAAC,CAAC;AAClE,KAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IAEnB,SAAS,WAAW,CAAC,MAAc,EAAA;QACjC,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;KACrF;AAED,IAAA,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE;AAClB,QAAA,OAAO,IAAI,CAAC;AACb,KAAA;AAED,IAAA,MAAM,YAAY,GAAG,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC;AAC/C,IAAA,MAAM,YAAY,GAAI,YAAY,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,YAAgD,IAAI,EAAE,CAAC;AAC9G,IAAA,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;AAErC,IAAA,QACE,KAAA,CAAA,aAAA,CAAC,KAAK,EAAA,EACJ,KAAK,EAAC,SAAS,EACf,gBAAgB,EAAE,EAAE,YAAY,EAAE,OAAO,EAAE,EAC3C,IAAI,EAAE,GAAG,EACT,MAAM,EAAE,KAAK,CAAC,OAAO,EACrB,OAAO,EAAE,KAAK,CAAC,QAAQ,EAAA;AAEvB,QAAA,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA,IAAA;AACE,YAAA,KAAA,CAAA,aAAA,CAAA,OAAA,EAAA,IAAA;AACE,gBAAA,KAAA,CAAA,aAAA,CAAA,UAAA,EAAA,IAAA;AACE,oBAAA,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA,EAAK,KAAK,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,EAAI,CAAA;AAC9B,oBAAA,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA,EAAK,KAAK,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,EAAI,CAAA;AAC9B,oBAAA,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA,EAAK,KAAK,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,EAAI,CAAA;oBAC9B,KAAK,CAAA,aAAA,CAAA,KAAA,EAAA,EAAA,KAAK,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,GAAI,CACrB;AACX,gBAAA,KAAA,CAAA,aAAA,CAAA,OAAA,EAAA,IAAA;AACE,oBAAA,KAAA,CAAA,aAAA,CAAA,IAAA,EAAA,IAAA;wBACE,KAAc,CAAA,aAAA,CAAA,IAAA,EAAA,IAAA,EAAA,OAAA,CAAA;wBACd,KAAkB,CAAA,aAAA,CAAA,IAAA,EAAA,IAAA,EAAA,WAAA,CAAA;wBAClB,KAAc,CAAA,aAAA,CAAA,IAAA,EAAA,IAAA,EAAA,OAAA,CAAA;AACd,wBAAA,KAAA,CAAA,aAAA,CAAA,IAAA,EAAA,IAAA,EAAA,SAAA,CAAgB,CACb,CACC;AACR,gBAAA,KAAA,CAAA,aAAA,CAAA,OAAA,EAAA,IAAA;oBACG,OAAO,CAAC,GAAG,CAAC,CAAC,MAAc,EAAE,KAAa,KAAI;wBAC7C,IAAI,KAAK,KAAK,YAAY,EAAE;AAC1B,4BAAA,QACE,KAAA,CAAA,aAAA,CAAC,cAAc,EAAA,EACb,GAAG,EAAE,CAAA,OAAA,EAAU,KAAK,CAAA,CAAA,EAAI,OAAO,CAAC,MAAM,CAAQ,MAAA,CAAA,EAC9C,YAAY,EAAE,YAAY,EAC1B,YAAY,EAAE,YAAY,EAC1B,YAAY,EAAE,MAAM,EACpB,MAAM,EAAC,MAAM,EACb,IAAI,EAAE,CAAC,SAAiB,KAAI;AAC1B,oCAAA,MAAM,UAAU,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC;AAChC,oCAAA,UAAU,CAAC,KAAK,CAAC,GAAG,SAAS,CAAC;oCAC9B,SAAS,CAAC,UAAU,CAAC,SAAS,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC;AACrD,oCAAA,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC;AACtB,iCAAC,EACD,QAAQ,EAAE,MAAM,eAAe,CAAC,CAAC,CAAC,CAAC,EAAA,CACnC,EACF;AACH,yBAAA;AAAM,6BAAA;4BACL,QACE,KAAC,CAAA,aAAA,CAAA,gBAAgB,EACf,EAAA,GAAG,EAAE,CAAU,OAAA,EAAA,KAAK,CAAI,CAAA,EAAA,OAAO,CAAC,MAAM,UAAU,EAChD,YAAY,EAAE,YAAY,EAC1B,YAAY,EAAE,YAAY,EAC1B,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,eAAe,CAAC,KAAK,CAAC,EACpC,QAAQ,EAAE,MAAM,SAAS,CAAC,YAAY,CAAC,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,EACjE,CAAA,EACF;AACH,yBAAA;AACH,qBAAC,CAAC;oBACF,KAAC,CAAA,aAAA,CAAA,cAAc,IAAC,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,EAAC,KAAK,EAAC,IAAI,EAAE,WAAW,EAAI,CAAA,CACpG,CACF,CACJ;QACN,KAAC,CAAA,aAAA,CAAA,KAAK,IAAC,QAAQ,EAAC,OAAO,EAAC,EAAE,EAAC,IAAI,EAAA;AAC7B,YAAA,KAAA,CAAA,aAAA,CAAC,MAAM,EAAC,EAAA,OAAO,EAAE,MAAM,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,SAAa,CAC3D,CACF,EACR;AACJ,CAAC;AAUD,SAAS,gBAAgB,CAAC,KAA4B,EAAA;AACpD,IAAA,MAAM,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;AACzB,IAAA,QACE,KAAA,CAAA,aAAA,CAAA,IAAA,EAAA,IAAA;AACE,QAAA,KAAA,CAAA,aAAA,CAAA,IAAA,EAAA,IAAA,EAAK,oBAAoB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAM;AAC5C,QAAA,KAAA,CAAA,aAAA,CAAA,IAAA,EAAA,IAAA,EAAK,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAM;AACvC,QAAA,KAAA,CAAA,aAAA,CAAA,IAAA,EAAA,IAAA;AACE,YAAA,KAAA,CAAA,aAAA,CAAC,wBAAwB,EAAA,EAAC,YAAY,EAAE,KAAK,CAAC,YAAY,EAAE,MAAM,EAAE,MAAM,EAAA,CAAI,CAC3E;AACL,QAAA,KAAA,CAAA,aAAA,CAAA,IAAA,EAAA,IAAA;AACE,YAAA,KAAA,CAAA,aAAA,CAAC,MAAM,EAAA,EAAC,OAAO,EAAA,IAAA,EAAC,OAAO,EAAC,SAAS,EAAC,OAAO,EAAE,KAAK,CAAC,MAAM,EAE9C,EAAA,MAAA,CAAA;AACT,YAAA,KAAA,CAAA,aAAA,CAAC,MAAM,EAAC,EAAA,OAAO,EAAC,IAAA,EAAA,OAAO,EAAC,SAAS,EAAC,OAAO,EAAE,KAAK,CAAC,QAAQ,aAEhD,CACN,CACF,EACL;AACJ,CAAC;AAWD,SAAS,cAAc,CAAC,KAA0B,EAAA;AAChD,IAAA,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAS,KAAK,CAAC,YAAY,IAAK,EAAa,CAAC,CAAC;AACjF,IAAA,MAAM,QAAQ,GAAG,MAAM,CAAS,KAAK,CAAC,CAAC;AACvC,IAAA,QAAQ,CAAC,OAAO,GAAG,KAAK,CAAC;IAEzB,SAAS,aAAa,CAAC,OAAe,EAAA;AACpC,QAAA,QAAQ,CAAC,EAAE,GAAG,QAAQ,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;KAClD;IAED,SAAS,iBAAiB,CAAC,WAAqB,EAAA;AAC9C,QAAA,QAAQ,CAAC,EAAE,GAAG,QAAQ,CAAC,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC,CAAC;KAC1D;IAED,SAAS,cAAc,CAAC,cAAsB,EAAA;AAC5C,QAAA,QAAQ,CAAC,EAAE,GAAG,QAAQ,CAAC,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,CAAC;KAC1D;IAED,MAAM,WAAW,GAAG,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACnD,MAAM,SAAS,GAAG,WAAW,IAAI,kBAAkB,CAAC,WAAW,CAAC,CAAC;AAEjE,IAAA,QACE,KAAA,CAAA,aAAA,CAAA,IAAA,EAAA,IAAA;AACE,QAAA,KAAA,CAAA,aAAA,CAAA,IAAA,EAAA,IAAA;AACE,YAAA,KAAA,CAAA,aAAA,CAAC,YAAY,EAAA,EAAA,aAAA,EACC,cAAc,EAC1B,YAAY,EAAE,QAAQ,CAAC,OAAO,CAAC,IAAI,EACnC,QAAQ,EAAE,CAAC,CAAC,KAAK,aAAa,CAAC,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,EACrD,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,oBAAoB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,GAC5G,CACC;AACL,QAAA,KAAA,CAAA,aAAA,CAAA,IAAA,EAAA,IAAA,EACG,SAAS,KACR,KAAA,CAAA,aAAA,CAAC,YAAY,EAAA,EAAA,aAAA,EACC,kBAAkB,EAC9B,YAAY,EAAE,KAAK,CAAC,QAAQ,EAC5B,QAAQ,EAAE,CAAC,CAAC,KAAK,iBAAiB,CAAC,CAAC,CAAC,aAAa,CAAC,KAAiB,CAAC,EACrE,IAAI,EAAE,CAAC,EAAE,EAAE,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,WAAW,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAA,CAC7E,CACH,CACE;AACL,QAAA,KAAA,CAAA,aAAA,CAAA,IAAA,EAAA,IAAA,EACG,WAAW,IAAI,KAAK,CAAC,QAAQ,KAC5B,KAAA,CAAA,aAAA,CAAC,sBAAsB,EAAA,EACrB,YAAY,EAAE,KAAK,CAAC,YAAY,EAChC,WAAW,EAAE,WAAW,EACxB,YAAY,EAAE,KAAK,CAAC,KAAK,EACzB,QAAQ,EAAE,cAAc,EAAA,CACxB,CACH,CACE;AACL,QAAA,KAAA,CAAA,aAAA,CAAA,IAAA,EAAA,IAAA;YACG,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,KAAK,KAC1C,oBAAC,MAAM,EAAA,EACL,OAAO,EAAA,IAAA,EACP,OAAO,EAAC,SAAS,EACjB,OAAO,EAAE,MAAK;AACZ,oBAAA,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;oBAC7B,QAAQ,CAAC,EAAY,CAAC,CAAC;AACzB,iBAAC,EAEA,EAAA,KAAK,CAAC,MAAM,CACN,CACV;YACA,KAAK,CAAC,QAAQ,KACb,oBAAC,MAAM,EAAA,EAAC,OAAO,EAAA,IAAA,EAAC,OAAO,EAAC,SAAS,EAAC,OAAO,EAAE,KAAK,CAAC,QAAQ,aAEhD,CACV,CACE,CACF,EACL;AACJ;;;;"}
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import { Modal, Button } from '@mantine/core';
|
|
2
|
-
import React, { useState } from 'react';
|
|
3
|
-
import { Form } from '../Form/Form.mjs';
|
|
4
|
-
import { SearchFilterValueInput } from '../SearchFilterValueInput/SearchFilterValueInput.mjs';
|
|
5
|
-
|
|
6
|
-
function SearchFilterValueDialog(props) {
|
|
7
|
-
const [value, setValue] = useState(props.defaultValue ?? '');
|
|
8
|
-
if (!props.visible || !props.searchParam || !props.filter) {
|
|
9
|
-
return null;
|
|
10
|
-
}
|
|
11
|
-
function onOk() {
|
|
12
|
-
props.onOk({ ...props.filter, value });
|
|
13
|
-
}
|
|
14
|
-
return (React.createElement(Modal, { title: props.title, size: "xl", opened: props.visible, onClose: props.onCancel },
|
|
15
|
-
React.createElement("div", { style: { width: 500 } },
|
|
16
|
-
React.createElement(Form, { onSubmit: onOk },
|
|
17
|
-
React.createElement(SearchFilterValueInput, { resourceType: props.resourceType, searchParam: props.searchParam, defaultValue: value, autoFocus: true, onChange: setValue }))),
|
|
18
|
-
React.createElement(Button, { onClick: onOk }, "OK")));
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
export { SearchFilterValueDialog };
|
|
22
|
-
//# sourceMappingURL=SearchFilterValueDialog.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SearchFilterValueDialog.mjs","sources":["../../../src/SearchFilterValueDialog/SearchFilterValueDialog.tsx"],"sourcesContent":["import { Button, Modal } from '@mantine/core';\nimport { Filter } from '@medplum/core';\nimport { SearchParameter } from '@medplum/fhirtypes';\nimport React, { useState } from 'react';\nimport { Form } from '../Form/Form';\nimport { SearchFilterValueInput } from '../SearchFilterValueInput/SearchFilterValueInput';\n\nexport interface SearchFilterValueDialogProps {\n title: string;\n visible: boolean;\n resourceType: string;\n searchParam?: SearchParameter;\n filter?: Filter;\n defaultValue?: string;\n onOk: (filter: Filter) => void;\n onCancel: () => void;\n}\n\nexport function SearchFilterValueDialog(props: SearchFilterValueDialogProps): JSX.Element | null {\n const [value, setValue] = useState<string>(props.defaultValue ?? '');\n\n if (!props.visible || !props.searchParam || !props.filter) {\n return null;\n }\n\n function onOk(): void {\n props.onOk({ ...(props.filter as Filter), value });\n }\n\n return (\n <Modal title={props.title} size=\"xl\" opened={props.visible} onClose={props.onCancel}>\n <div style={{ width: 500 }}>\n <Form onSubmit={onOk}>\n <SearchFilterValueInput\n resourceType={props.resourceType}\n searchParam={props.searchParam}\n defaultValue={value}\n autoFocus={true}\n onChange={setValue}\n />\n </Form>\n </div>\n <Button onClick={onOk}>OK</Button>\n </Modal>\n );\n}\n"],"names":[],"mappings":";;;;;AAkBM,SAAU,uBAAuB,CAAC,KAAmC,EAAA;AACzE,IAAA,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAS,KAAK,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC;AAErE,IAAA,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,WAAW,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE;AACzD,QAAA,OAAO,IAAI,CAAC;AACb,KAAA;AAED,IAAA,SAAS,IAAI,GAAA;AACX,QAAA,KAAK,CAAC,IAAI,CAAC,EAAE,GAAI,KAAK,CAAC,MAAiB,EAAE,KAAK,EAAE,CAAC,CAAC;KACpD;IAED,QACE,KAAC,CAAA,aAAA,CAAA,KAAK,EAAC,EAAA,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,IAAI,EAAC,IAAI,EAAC,MAAM,EAAE,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,QAAQ,EAAA;AACjF,QAAA,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA,EAAK,KAAK,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,EAAA;AACxB,YAAA,KAAA,CAAA,aAAA,CAAC,IAAI,EAAA,EAAC,QAAQ,EAAE,IAAI,EAAA;gBAClB,KAAC,CAAA,aAAA,CAAA,sBAAsB,EACrB,EAAA,YAAY,EAAE,KAAK,CAAC,YAAY,EAChC,WAAW,EAAE,KAAK,CAAC,WAAW,EAC9B,YAAY,EAAE,KAAK,EACnB,SAAS,EAAE,IAAI,EACf,QAAQ,EAAE,QAAQ,EAClB,CAAA,CACG,CACH;QACN,KAAC,CAAA,aAAA,CAAA,MAAM,IAAC,OAAO,EAAE,IAAI,EAAa,EAAA,IAAA,CAAA,CAC5B,EACR;AACJ;;;;"}
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import { globalSchema, Operator, getSearchParameterDetails, SearchParameterType, formatDateTime } from '@medplum/core';
|
|
2
|
-
import React from 'react';
|
|
3
|
-
import { ResourceName } from '../ResourceName/ResourceName.mjs';
|
|
4
|
-
|
|
5
|
-
function SearchFilterValueDisplay(props) {
|
|
6
|
-
const { resourceType, filter } = props;
|
|
7
|
-
const searchParam = globalSchema.types[resourceType]?.searchParams?.[filter.code];
|
|
8
|
-
if (searchParam) {
|
|
9
|
-
if (searchParam.type === 'reference' &&
|
|
10
|
-
(filter.operator === Operator.EQUALS || filter.operator === Operator.NOT_EQUALS)) {
|
|
11
|
-
return React.createElement(ResourceName, { value: { reference: filter.value } });
|
|
12
|
-
}
|
|
13
|
-
const searchParamDetails = getSearchParameterDetails(resourceType, searchParam);
|
|
14
|
-
if (filter.code === '_lastUpdated' || searchParamDetails.type === SearchParameterType.DATETIME) {
|
|
15
|
-
return React.createElement(React.Fragment, null, formatDateTime(filter.value));
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
return React.createElement(React.Fragment, null, filter.value);
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
export { SearchFilterValueDisplay };
|
|
22
|
-
//# sourceMappingURL=SearchFilterValueDisplay.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SearchFilterValueDisplay.mjs","sources":["../../../src/SearchFilterValueDisplay/SearchFilterValueDisplay.tsx"],"sourcesContent":["import {\n Filter,\n formatDateTime,\n getSearchParameterDetails,\n globalSchema,\n Operator,\n SearchParameterType,\n} from '@medplum/core';\nimport React from 'react';\nimport { ResourceName } from '../ResourceName/ResourceName';\n\nexport interface SearchFilterValueDisplayProps {\n readonly resourceType: string;\n readonly filter: Filter;\n}\n\nexport function SearchFilterValueDisplay(props: SearchFilterValueDisplayProps): JSX.Element {\n const { resourceType, filter } = props;\n\n const searchParam = globalSchema.types[resourceType]?.searchParams?.[filter.code];\n if (searchParam) {\n if (\n searchParam.type === 'reference' &&\n (filter.operator === Operator.EQUALS || filter.operator === Operator.NOT_EQUALS)\n ) {\n return <ResourceName value={{ reference: filter.value }} />;\n }\n\n const searchParamDetails = getSearchParameterDetails(resourceType, searchParam);\n if (filter.code === '_lastUpdated' || searchParamDetails.type === SearchParameterType.DATETIME) {\n return <>{formatDateTime(filter.value)}</>;\n }\n }\n\n return <>{filter.value}</>;\n}\n"],"names":[],"mappings":";;;;AAgBM,SAAU,wBAAwB,CAAC,KAAoC,EAAA;AAC3E,IAAA,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;AAEvC,IAAA,MAAM,WAAW,GAAG,YAAY,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;AAClF,IAAA,IAAI,WAAW,EAAE;AACf,QAAA,IACE,WAAW,CAAC,IAAI,KAAK,WAAW;AAChC,aAAC,MAAM,CAAC,QAAQ,KAAK,QAAQ,CAAC,MAAM,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ,CAAC,UAAU,CAAC,EAChF;AACA,YAAA,OAAO,KAAC,CAAA,aAAA,CAAA,YAAY,EAAC,EAAA,KAAK,EAAE,EAAE,SAAS,EAAE,MAAM,CAAC,KAAK,EAAE,GAAI,CAAC;AAC7D,SAAA;QAED,MAAM,kBAAkB,GAAG,yBAAyB,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;AAChF,QAAA,IAAI,MAAM,CAAC,IAAI,KAAK,cAAc,IAAI,kBAAkB,CAAC,IAAI,KAAK,mBAAmB,CAAC,QAAQ,EAAE;YAC9F,OAAO,KAAA,CAAA,aAAA,CAAA,KAAA,CAAA,QAAA,EAAA,IAAA,EAAG,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC,CAAI,CAAC;AAC5C,SAAA;AACF,KAAA;AAED,IAAA,OAAO,KAAG,CAAA,aAAA,CAAA,KAAA,CAAA,QAAA,EAAA,IAAA,EAAA,MAAM,CAAC,KAAK,CAAI,CAAC;AAC7B;;;;"}
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
import { TextInput, Checkbox } from '@mantine/core';
|
|
2
|
-
import { getSearchParameterDetails, SearchParameterType } from '@medplum/core';
|
|
3
|
-
import React from 'react';
|
|
4
|
-
import { DateTimeInput } from '../DateTimeInput/DateTimeInput.mjs';
|
|
5
|
-
import { QuantityInput } from '../QuantityInput/QuantityInput.mjs';
|
|
6
|
-
import { ReferenceInput } from '../ReferenceInput/ReferenceInput.mjs';
|
|
7
|
-
|
|
8
|
-
function SearchFilterValueInput(props) {
|
|
9
|
-
const details = getSearchParameterDetails(props.resourceType, props.searchParam);
|
|
10
|
-
const name = 'filter-value';
|
|
11
|
-
switch (details.type) {
|
|
12
|
-
case SearchParameterType.REFERENCE:
|
|
13
|
-
return (React.createElement(ReferenceInput, { name: name, defaultValue: { reference: props.defaultValue }, targetTypes: props.searchParam?.target, onChange: (newReference) => {
|
|
14
|
-
if (newReference) {
|
|
15
|
-
props.onChange(newReference.reference);
|
|
16
|
-
}
|
|
17
|
-
else {
|
|
18
|
-
props.onChange('');
|
|
19
|
-
}
|
|
20
|
-
} }));
|
|
21
|
-
case SearchParameterType.BOOLEAN:
|
|
22
|
-
return (React.createElement(Checkbox, { name: name, "data-testid": name, defaultChecked: props.defaultValue === 'true', onChange: (e) => props.onChange(e.currentTarget.checked.toString()) }));
|
|
23
|
-
case SearchParameterType.DATE:
|
|
24
|
-
return (React.createElement(TextInput, { type: "date", name: name, "data-testid": name, defaultValue: props.defaultValue, onChange: (e) => props.onChange(e.currentTarget.value) }));
|
|
25
|
-
case SearchParameterType.DATETIME:
|
|
26
|
-
return React.createElement(DateTimeInput, { name: name, defaultValue: props.defaultValue, onChange: props.onChange });
|
|
27
|
-
case SearchParameterType.NUMBER:
|
|
28
|
-
return (React.createElement(TextInput, { type: "number", name: name, "data-testid": name, defaultValue: props.defaultValue, onChange: (e) => props.onChange(e.currentTarget.value) }));
|
|
29
|
-
case SearchParameterType.QUANTITY:
|
|
30
|
-
return (React.createElement(QuantityInput, { name: name, defaultValue: tryParseQuantity(props.defaultValue), onChange: (newQuantity) => {
|
|
31
|
-
if (newQuantity) {
|
|
32
|
-
props.onChange(`${newQuantity.value}`);
|
|
33
|
-
}
|
|
34
|
-
else {
|
|
35
|
-
props.onChange('');
|
|
36
|
-
}
|
|
37
|
-
} }));
|
|
38
|
-
default:
|
|
39
|
-
return (React.createElement(TextInput, { name: name, "data-testid": name, defaultValue: props.defaultValue, autoFocus: props.autoFocus, onChange: (e) => props.onChange(e.currentTarget.value), placeholder: "Search value" }));
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
function tryParseQuantity(value) {
|
|
43
|
-
if (value) {
|
|
44
|
-
const [valueString, systemString, unitString] = value.split('|');
|
|
45
|
-
if (valueString) {
|
|
46
|
-
return {
|
|
47
|
-
value: parseFloat(valueString),
|
|
48
|
-
system: systemString,
|
|
49
|
-
unit: unitString,
|
|
50
|
-
};
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
return undefined;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
export { SearchFilterValueInput };
|
|
57
|
-
//# sourceMappingURL=SearchFilterValueInput.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SearchFilterValueInput.mjs","sources":["../../../src/SearchFilterValueInput/SearchFilterValueInput.tsx"],"sourcesContent":["import { Checkbox, TextInput } from '@mantine/core';\nimport { getSearchParameterDetails, SearchParameterType } from '@medplum/core';\nimport { Quantity, Reference, SearchParameter } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { DateTimeInput } from '../DateTimeInput/DateTimeInput';\nimport { QuantityInput } from '../QuantityInput/QuantityInput';\nimport { ReferenceInput } from '../ReferenceInput/ReferenceInput';\n\nexport interface SearchFilterValueInputProps {\n resourceType: string;\n searchParam: SearchParameter;\n defaultValue?: string;\n autoFocus?: boolean;\n onChange: (value: string) => void;\n}\n\nexport function SearchFilterValueInput(props: SearchFilterValueInputProps): JSX.Element | null {\n const details = getSearchParameterDetails(props.resourceType, props.searchParam);\n const name = 'filter-value';\n\n switch (details.type) {\n case SearchParameterType.REFERENCE:\n return (\n <ReferenceInput\n name={name}\n defaultValue={{ reference: props.defaultValue }}\n targetTypes={props.searchParam?.target}\n onChange={(newReference: Reference | undefined) => {\n if (newReference) {\n props.onChange(newReference.reference as string);\n } else {\n props.onChange('');\n }\n }}\n />\n );\n\n case SearchParameterType.BOOLEAN:\n return (\n <Checkbox\n name={name}\n data-testid={name}\n defaultChecked={props.defaultValue === 'true'}\n onChange={(e) => props.onChange(e.currentTarget.checked.toString())}\n />\n );\n\n case SearchParameterType.DATE:\n return (\n <TextInput\n type=\"date\"\n name={name}\n data-testid={name}\n defaultValue={props.defaultValue}\n onChange={(e) => props.onChange(e.currentTarget.value)}\n />\n );\n\n case SearchParameterType.DATETIME:\n return <DateTimeInput name={name} defaultValue={props.defaultValue} onChange={props.onChange} />;\n\n case SearchParameterType.NUMBER:\n return (\n <TextInput\n type=\"number\"\n name={name}\n data-testid={name}\n defaultValue={props.defaultValue}\n onChange={(e) => props.onChange(e.currentTarget.value)}\n />\n );\n\n case SearchParameterType.QUANTITY:\n return (\n <QuantityInput\n name={name}\n defaultValue={tryParseQuantity(props.defaultValue)}\n onChange={(newQuantity: Quantity | undefined) => {\n if (newQuantity) {\n props.onChange(`${newQuantity.value}`);\n } else {\n props.onChange('');\n }\n }}\n />\n );\n\n default:\n return (\n <TextInput\n name={name}\n data-testid={name}\n defaultValue={props.defaultValue}\n autoFocus={props.autoFocus}\n onChange={(e) => props.onChange(e.currentTarget.value)}\n placeholder=\"Search value\"\n />\n );\n }\n}\n\nfunction tryParseQuantity(value: string | undefined): Quantity | undefined {\n if (value) {\n const [valueString, systemString, unitString] = value.split('|');\n if (valueString) {\n return {\n value: parseFloat(valueString),\n system: systemString,\n unit: unitString,\n };\n }\n }\n return undefined;\n}\n"],"names":[],"mappings":"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"}
|