@medplum/react 2.0.24 → 2.0.26
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 -7714
- package/dist/cjs/index.cjs.map +7 -1
- package/dist/esm/index.mjs +67 -92
- package/dist/esm/index.mjs.map +7 -1
- package/dist/types/auth/NewUserForm.d.ts +1 -0
- package/dist/types/auth/RegisterForm.d.ts +1 -0
- package/package.json +20 -20
- 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 -121
- package/dist/esm/AsyncAutocomplete/AsyncAutocomplete.mjs.map +0 -1
- package/dist/esm/AttachmentArrayDisplay/AttachmentArrayDisplay.mjs +0 -10
- 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 -172
- 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 -288
- package/dist/esm/QuestionnaireBuilder/QuestionnaireBuilder.mjs.map +0 -1
- package/dist/esm/QuestionnaireForm/QuestionnaireForm.mjs +0 -276
- 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,288 +0,0 @@
|
|
|
1
|
-
import { createStyles, Button, TextInput, Textarea, Title, NativeSelect, Anchor } from '@mantine/core';
|
|
2
|
-
import { isResource, globalSchema } from '@medplum/core';
|
|
3
|
-
import React, { useState, useEffect, useRef } from 'react';
|
|
4
|
-
import { Form } from '../Form/Form.mjs';
|
|
5
|
-
import { useMedplum } from '../MedplumProvider/MedplumProvider.mjs';
|
|
6
|
-
import { QuestionnaireFormItem } from '../QuestionnaireForm/QuestionnaireForm.mjs';
|
|
7
|
-
import { getValueAndType } from '../ResourcePropertyDisplay/ResourcePropertyDisplay.mjs';
|
|
8
|
-
import { ResourcePropertyInput } from '../ResourcePropertyInput/ResourcePropertyInput.mjs';
|
|
9
|
-
import { useResource } from '../useResource/useResource.mjs';
|
|
10
|
-
import { killEvent } from '../utils/dom.mjs';
|
|
11
|
-
import { QuestionnaireItemType, isChoiceQuestion } from '../utils/questionnaire.mjs';
|
|
12
|
-
|
|
13
|
-
const useStyles = createStyles((theme) => ({
|
|
14
|
-
section: {
|
|
15
|
-
position: 'relative',
|
|
16
|
-
margin: '4px 4px 8px 0',
|
|
17
|
-
padding: '6px 12px 16px 6px',
|
|
18
|
-
border: `1.5px solid ${theme.colors.gray[1]}`,
|
|
19
|
-
borderRadius: theme.radius.sm,
|
|
20
|
-
transition: 'all 0.1s',
|
|
21
|
-
},
|
|
22
|
-
hovering: {
|
|
23
|
-
border: `1.5px solid ${theme.colors.blue[5]}`,
|
|
24
|
-
},
|
|
25
|
-
editing: {
|
|
26
|
-
border: `1.5px solid ${theme.colors.gray[1]}`,
|
|
27
|
-
borderLeft: `4px solid ${theme.colors.blue[5]}`,
|
|
28
|
-
},
|
|
29
|
-
questionBody: {
|
|
30
|
-
maxWidth: 600,
|
|
31
|
-
},
|
|
32
|
-
topActions: {
|
|
33
|
-
position: 'absolute',
|
|
34
|
-
right: 4,
|
|
35
|
-
top: 1,
|
|
36
|
-
padding: 4,
|
|
37
|
-
color: theme.colors.gray[5],
|
|
38
|
-
fontSize: theme.fontSizes.xs,
|
|
39
|
-
},
|
|
40
|
-
bottomActions: {
|
|
41
|
-
position: 'absolute',
|
|
42
|
-
right: 4,
|
|
43
|
-
bottom: 0,
|
|
44
|
-
fontSize: theme.fontSizes.xs,
|
|
45
|
-
'& a': {
|
|
46
|
-
marginLeft: 8,
|
|
47
|
-
},
|
|
48
|
-
},
|
|
49
|
-
linkIdInput: {
|
|
50
|
-
width: 100,
|
|
51
|
-
marginBottom: 4,
|
|
52
|
-
},
|
|
53
|
-
typeSelect: {
|
|
54
|
-
width: 100,
|
|
55
|
-
},
|
|
56
|
-
}));
|
|
57
|
-
function QuestionnaireBuilder(props) {
|
|
58
|
-
const medplum = useMedplum();
|
|
59
|
-
const defaultValue = useResource(props.questionnaire);
|
|
60
|
-
const [schema, setSchema] = useState();
|
|
61
|
-
const [value, setValue] = useState();
|
|
62
|
-
const [selectedKey, setSelectedKey] = useState();
|
|
63
|
-
const [hoverKey, setHoverKey] = useState();
|
|
64
|
-
function handleDocumentMouseOver() {
|
|
65
|
-
setHoverKey(undefined);
|
|
66
|
-
}
|
|
67
|
-
function handleDocumentClick() {
|
|
68
|
-
setSelectedKey(undefined);
|
|
69
|
-
}
|
|
70
|
-
useEffect(() => {
|
|
71
|
-
medplum.requestSchema('Questionnaire').then(setSchema).catch(console.log);
|
|
72
|
-
}, [medplum]);
|
|
73
|
-
useEffect(() => {
|
|
74
|
-
setValue(ensureQuestionnaireKeys(defaultValue ?? { resourceType: 'Questionnaire' }));
|
|
75
|
-
document.addEventListener('mouseover', handleDocumentMouseOver);
|
|
76
|
-
document.addEventListener('click', handleDocumentClick);
|
|
77
|
-
return () => {
|
|
78
|
-
document.removeEventListener('mouseover', handleDocumentMouseOver);
|
|
79
|
-
document.removeEventListener('click', handleDocumentClick);
|
|
80
|
-
};
|
|
81
|
-
}, [defaultValue]);
|
|
82
|
-
if (!schema || !value) {
|
|
83
|
-
return null;
|
|
84
|
-
}
|
|
85
|
-
return (React.createElement("div", null,
|
|
86
|
-
React.createElement(Form, { testid: "questionnaire-form", onSubmit: () => props.onSubmit(value) },
|
|
87
|
-
React.createElement(ItemBuilder, { item: value, selectedKey: selectedKey, setSelectedKey: setSelectedKey, hoverKey: hoverKey, setHoverKey: setHoverKey, onChange: setValue }),
|
|
88
|
-
React.createElement(Button, { type: "submit" }, "Save"))));
|
|
89
|
-
}
|
|
90
|
-
function ItemBuilder(props) {
|
|
91
|
-
const { classes, cx } = useStyles();
|
|
92
|
-
const resource = props.item;
|
|
93
|
-
const item = props.item;
|
|
94
|
-
const isResource$1 = isResource(props.item);
|
|
95
|
-
const isContainer = isResource$1 || item.type === QuestionnaireItemType.group;
|
|
96
|
-
const linkId = item.linkId ?? '[untitled]';
|
|
97
|
-
const editing = props.selectedKey === props.item.id;
|
|
98
|
-
const hovering = props.hoverKey === props.item.id;
|
|
99
|
-
const itemRef = useRef();
|
|
100
|
-
itemRef.current = props.item;
|
|
101
|
-
function onClick(e) {
|
|
102
|
-
killEvent(e);
|
|
103
|
-
props.setSelectedKey(props.item.id);
|
|
104
|
-
}
|
|
105
|
-
function onHover(e) {
|
|
106
|
-
killEvent(e);
|
|
107
|
-
props.setHoverKey(props.item.id);
|
|
108
|
-
}
|
|
109
|
-
function changeItem(changedItem) {
|
|
110
|
-
const curr = itemRef.current;
|
|
111
|
-
props.onChange({
|
|
112
|
-
...curr,
|
|
113
|
-
item: curr.item?.map((i) => (i.id === changedItem.id ? changedItem : i)),
|
|
114
|
-
});
|
|
115
|
-
}
|
|
116
|
-
function addItem(addedItem) {
|
|
117
|
-
props.onChange({
|
|
118
|
-
...props.item,
|
|
119
|
-
item: [...(props.item.item ?? []), addedItem],
|
|
120
|
-
});
|
|
121
|
-
}
|
|
122
|
-
function removeItem(removedItem) {
|
|
123
|
-
props.onChange({
|
|
124
|
-
...props.item,
|
|
125
|
-
item: props.item.item?.filter((i) => i !== removedItem),
|
|
126
|
-
});
|
|
127
|
-
}
|
|
128
|
-
function changeProperty(property, value) {
|
|
129
|
-
props.onChange({
|
|
130
|
-
...itemRef.current,
|
|
131
|
-
[property]: value,
|
|
132
|
-
});
|
|
133
|
-
}
|
|
134
|
-
const className = cx(classes.section, {
|
|
135
|
-
[classes.editing]: editing,
|
|
136
|
-
[classes.hovering]: hovering && !editing,
|
|
137
|
-
});
|
|
138
|
-
return (React.createElement("div", { "data-testid": item.linkId, className: className, onClick: onClick, onMouseOver: onHover },
|
|
139
|
-
React.createElement("div", { className: classes.questionBody }, editing ? (React.createElement(React.Fragment, null,
|
|
140
|
-
isResource$1 && (React.createElement(TextInput, { size: "xl", defaultValue: resource.title, onChange: (e) => changeProperty('title', e.currentTarget.value) })),
|
|
141
|
-
!isResource$1 && (React.createElement(Textarea, { autosize: true, minRows: 2, defaultValue: item.text, onChange: (e) => changeProperty('text', e.currentTarget.value) })),
|
|
142
|
-
isChoiceQuestion(item) && (React.createElement(AnswerBuilder, { options: item.answerOption, onChange: (newOptions) => changeProperty('answerOption', newOptions) })))) : (React.createElement(React.Fragment, null,
|
|
143
|
-
resource.title && React.createElement(Title, null, resource.title),
|
|
144
|
-
item.text && React.createElement("div", null, item.text),
|
|
145
|
-
!isContainer && React.createElement(QuestionnaireFormItem, { item: item, answers: {}, onChange: () => undefined })))),
|
|
146
|
-
item.item?.map((i) => (React.createElement("div", { key: i.id },
|
|
147
|
-
React.createElement(ItemBuilder, { item: i, selectedKey: props.selectedKey, setSelectedKey: props.setSelectedKey, hoverKey: props.hoverKey, setHoverKey: props.setHoverKey, onChange: changeItem, onRemove: () => removeItem(i) })))),
|
|
148
|
-
!isContainer && (React.createElement("div", { className: classes.topActions }, editing ? (React.createElement(React.Fragment, null,
|
|
149
|
-
React.createElement(TextInput, { size: "xs", className: classes.linkIdInput, defaultValue: item.linkId, onChange: (e) => changeProperty('linkId', e.currentTarget.value) }),
|
|
150
|
-
!isContainer && (React.createElement(NativeSelect, { size: "xs", className: classes.typeSelect, defaultValue: item.type, onChange: (e) => changeProperty('type', e.currentTarget.value), data: [
|
|
151
|
-
{ value: 'display', label: 'Display' },
|
|
152
|
-
{ value: 'boolean', label: 'Boolean' },
|
|
153
|
-
{ value: 'decimal', label: 'Decimal' },
|
|
154
|
-
{ value: 'integer', label: 'Integer' },
|
|
155
|
-
{ value: 'date', label: 'Date' },
|
|
156
|
-
{ value: 'dateTime', label: 'Date/Time' },
|
|
157
|
-
{ value: 'time', label: 'Time' },
|
|
158
|
-
{ value: 'string', label: 'String' },
|
|
159
|
-
{ value: 'text', label: 'Text' },
|
|
160
|
-
{ value: 'url', label: 'URL' },
|
|
161
|
-
{ value: 'choice', label: 'Choice' },
|
|
162
|
-
{ value: 'open-choice', label: 'Open Choice' },
|
|
163
|
-
{ value: 'attachment', label: 'Attachment' },
|
|
164
|
-
{ value: 'reference', label: 'Reference' },
|
|
165
|
-
{ value: 'quantity', label: 'Quantity' },
|
|
166
|
-
] })))) : (React.createElement("div", null, linkId)))),
|
|
167
|
-
React.createElement("div", { className: classes.bottomActions },
|
|
168
|
-
isContainer && (React.createElement(React.Fragment, null,
|
|
169
|
-
React.createElement(Anchor, { href: "#", onClick: (e) => {
|
|
170
|
-
e.preventDefault();
|
|
171
|
-
addItem({
|
|
172
|
-
id: generateId(),
|
|
173
|
-
linkId: generateLinkId('q'),
|
|
174
|
-
type: 'string',
|
|
175
|
-
text: 'Question',
|
|
176
|
-
});
|
|
177
|
-
} }, "Add item"),
|
|
178
|
-
React.createElement(Anchor, { href: "#", onClick: (e) => {
|
|
179
|
-
e.preventDefault();
|
|
180
|
-
addItem({
|
|
181
|
-
id: generateId(),
|
|
182
|
-
linkId: generateLinkId('g'),
|
|
183
|
-
type: 'group',
|
|
184
|
-
text: 'Group',
|
|
185
|
-
});
|
|
186
|
-
} }, "Add group"))),
|
|
187
|
-
editing && !isResource$1 && (React.createElement(Anchor, { href: "#", onClick: (e) => {
|
|
188
|
-
e.preventDefault();
|
|
189
|
-
if (props.onRemove) {
|
|
190
|
-
props.onRemove();
|
|
191
|
-
}
|
|
192
|
-
} }, "Remove")))));
|
|
193
|
-
}
|
|
194
|
-
function AnswerBuilder(props) {
|
|
195
|
-
const property = globalSchema.types['QuestionnaireItemAnswerOption'].properties['value[x]'];
|
|
196
|
-
const options = props.options ?? [];
|
|
197
|
-
return (React.createElement("div", null,
|
|
198
|
-
options.map((option) => {
|
|
199
|
-
const [propertyValue, propertyType] = getValueAndType({ type: 'QuestionnaireItemAnswerOption', value: option }, 'value');
|
|
200
|
-
return (React.createElement("div", { key: option.id, style: {
|
|
201
|
-
display: 'flex',
|
|
202
|
-
flexDirection: 'row',
|
|
203
|
-
justifyContent: 'space-between',
|
|
204
|
-
alignItems: 'center',
|
|
205
|
-
width: '80%',
|
|
206
|
-
} },
|
|
207
|
-
React.createElement("div", null,
|
|
208
|
-
React.createElement(ResourcePropertyInput, { key: option.id, name: "value[x]", property: property, defaultPropertyType: propertyType, defaultValue: propertyValue, onChange: (newValue, propName) => {
|
|
209
|
-
const newOptions = [...options];
|
|
210
|
-
const index = newOptions.findIndex((o) => o.id === option.id);
|
|
211
|
-
newOptions[index] = { id: option.id, [propName]: newValue };
|
|
212
|
-
props.onChange(newOptions);
|
|
213
|
-
} })),
|
|
214
|
-
React.createElement("div", null,
|
|
215
|
-
React.createElement(Anchor, { href: "#", onClick: (e) => {
|
|
216
|
-
killEvent(e);
|
|
217
|
-
props.onChange(options.filter((o) => o.id !== option.id));
|
|
218
|
-
} }, "Remove"))));
|
|
219
|
-
}),
|
|
220
|
-
React.createElement(Anchor, { href: "#", onClick: (e) => {
|
|
221
|
-
killEvent(e);
|
|
222
|
-
props.onChange([
|
|
223
|
-
...options,
|
|
224
|
-
{
|
|
225
|
-
id: generateId(),
|
|
226
|
-
},
|
|
227
|
-
]);
|
|
228
|
-
} }, "Add choice")));
|
|
229
|
-
}
|
|
230
|
-
let nextLinkId = 1;
|
|
231
|
-
let nextId = 1;
|
|
232
|
-
/**
|
|
233
|
-
* Generates a link ID for an item.
|
|
234
|
-
* Link IDs are required properties on QuestionnaireItem objects.
|
|
235
|
-
* @param prefix The link ID prefix string.
|
|
236
|
-
* @returns A unique link ID.
|
|
237
|
-
*/
|
|
238
|
-
function generateLinkId(prefix) {
|
|
239
|
-
return prefix + nextLinkId++;
|
|
240
|
-
}
|
|
241
|
-
/**
|
|
242
|
-
* Generates a unique ID.
|
|
243
|
-
* React needs unique IDs for components for rendering performance.
|
|
244
|
-
* All of the important components in the questionnaire builder have id properties for this:
|
|
245
|
-
* Questionnaire, QuestionnaireItem, and QuestionnaireItemAnswerOption.
|
|
246
|
-
* @returns A unique key.
|
|
247
|
-
*/
|
|
248
|
-
function generateId() {
|
|
249
|
-
return 'id-' + nextId++;
|
|
250
|
-
}
|
|
251
|
-
function ensureQuestionnaireKeys(questionnaire) {
|
|
252
|
-
return {
|
|
253
|
-
...questionnaire,
|
|
254
|
-
id: questionnaire.id || generateId(),
|
|
255
|
-
item: ensureQuestionnaireItemKeys(questionnaire.item),
|
|
256
|
-
};
|
|
257
|
-
}
|
|
258
|
-
function ensureQuestionnaireItemKeys(items) {
|
|
259
|
-
if (!items) {
|
|
260
|
-
return undefined;
|
|
261
|
-
}
|
|
262
|
-
items.forEach((item) => {
|
|
263
|
-
if (item.id?.match(/^id-\d+$/)) {
|
|
264
|
-
nextId = Math.max(nextId, parseInt(item.id.substring(3), 10) + 1);
|
|
265
|
-
}
|
|
266
|
-
if (item.linkId?.match(/^q\d+$/)) {
|
|
267
|
-
nextLinkId = Math.max(nextLinkId, parseInt(item.linkId.substring(1), 10) + 1);
|
|
268
|
-
}
|
|
269
|
-
});
|
|
270
|
-
return items.map((item) => ({
|
|
271
|
-
...item,
|
|
272
|
-
id: item.id || generateId(),
|
|
273
|
-
item: ensureQuestionnaireItemKeys(item.item),
|
|
274
|
-
answerOption: ensureQuestionnaireOptionKeys(item.answerOption),
|
|
275
|
-
}));
|
|
276
|
-
}
|
|
277
|
-
function ensureQuestionnaireOptionKeys(options) {
|
|
278
|
-
if (!options) {
|
|
279
|
-
return undefined;
|
|
280
|
-
}
|
|
281
|
-
return options.map((option) => ({
|
|
282
|
-
...option,
|
|
283
|
-
id: option.id || generateId(),
|
|
284
|
-
}));
|
|
285
|
-
}
|
|
286
|
-
|
|
287
|
-
export { QuestionnaireBuilder };
|
|
288
|
-
//# sourceMappingURL=QuestionnaireBuilder.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"QuestionnaireBuilder.mjs","sources":["../../../src/QuestionnaireBuilder/QuestionnaireBuilder.tsx"],"sourcesContent":["import { Anchor, Button, createStyles, NativeSelect, Textarea, TextInput, Title } from '@mantine/core';\nimport { globalSchema, IndexedStructureDefinition, isResource as isResourceType } from '@medplum/core';\nimport { Questionnaire, QuestionnaireItem, QuestionnaireItemAnswerOption, Reference } from '@medplum/fhirtypes';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { Form } from '../Form/Form';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\nimport { QuestionnaireFormItem } from '../QuestionnaireForm/QuestionnaireForm';\nimport { getValueAndType } from '../ResourcePropertyDisplay/ResourcePropertyDisplay';\nimport { ResourcePropertyInput } from '../ResourcePropertyInput/ResourcePropertyInput';\nimport { useResource } from '../useResource/useResource';\nimport { killEvent } from '../utils/dom';\nimport { isChoiceQuestion, QuestionnaireItemType } from '../utils/questionnaire';\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[1]}`,\n borderRadius: theme.radius.sm,\n transition: 'all 0.1s',\n },\n\n hovering: {\n border: `1.5px solid ${theme.colors.blue[5]}`,\n },\n\n editing: {\n border: `1.5px solid ${theme.colors.gray[1]}`,\n borderLeft: `4px solid ${theme.colors.blue[5]}`,\n },\n\n questionBody: {\n maxWidth: 600,\n },\n\n topActions: {\n position: 'absolute',\n right: 4,\n top: 1,\n padding: 4,\n color: theme.colors.gray[5],\n fontSize: theme.fontSizes.xs,\n },\n\n bottomActions: {\n position: 'absolute',\n right: 4,\n bottom: 0,\n fontSize: theme.fontSizes.xs,\n\n '& a': {\n marginLeft: 8,\n },\n },\n\n linkIdInput: {\n width: 100,\n marginBottom: 4,\n },\n\n typeSelect: {\n width: 100,\n },\n}));\n\nexport interface QuestionnaireBuilderProps {\n questionnaire: Questionnaire | Reference<Questionnaire>;\n onSubmit: (result: Questionnaire) => void;\n}\n\nexport function QuestionnaireBuilder(props: QuestionnaireBuilderProps): JSX.Element | null {\n const medplum = useMedplum();\n const defaultValue = useResource(props.questionnaire);\n const [schema, setSchema] = useState<IndexedStructureDefinition | undefined>();\n const [value, setValue] = useState<Questionnaire>();\n const [selectedKey, setSelectedKey] = useState<string>();\n const [hoverKey, setHoverKey] = useState<string>();\n\n function handleDocumentMouseOver(): void {\n setHoverKey(undefined);\n }\n\n function handleDocumentClick(): void {\n setSelectedKey(undefined);\n }\n\n useEffect(() => {\n medplum.requestSchema('Questionnaire').then(setSchema).catch(console.log);\n }, [medplum]);\n\n useEffect(() => {\n setValue(ensureQuestionnaireKeys(defaultValue ?? { resourceType: 'Questionnaire' }));\n document.addEventListener('mouseover', handleDocumentMouseOver);\n document.addEventListener('click', handleDocumentClick);\n return () => {\n document.removeEventListener('mouseover', handleDocumentMouseOver);\n document.removeEventListener('click', handleDocumentClick);\n };\n }, [defaultValue]);\n\n if (!schema || !value) {\n return null;\n }\n\n return (\n <div>\n <Form testid=\"questionnaire-form\" onSubmit={() => props.onSubmit(value)}>\n <ItemBuilder\n item={value}\n selectedKey={selectedKey}\n setSelectedKey={setSelectedKey}\n hoverKey={hoverKey}\n setHoverKey={setHoverKey}\n onChange={setValue}\n />\n <Button type=\"submit\">Save</Button>\n </Form>\n </div>\n );\n}\n\ninterface ItemBuilderProps<T extends Questionnaire | QuestionnaireItem> {\n item: T;\n selectedKey: string | undefined;\n setSelectedKey: (key: string | undefined) => void;\n hoverKey: string | undefined;\n setHoverKey: (key: string | undefined) => void;\n onChange: (item: T) => void;\n onRemove?: () => void;\n}\n\nfunction ItemBuilder<T extends Questionnaire | QuestionnaireItem>(props: ItemBuilderProps<T>): JSX.Element {\n const { classes, cx } = useStyles();\n const resource = props.item as Questionnaire;\n const item = props.item as QuestionnaireItem;\n const isResource = isResourceType(props.item);\n const isContainer = isResource || item.type === QuestionnaireItemType.group;\n const linkId = item.linkId ?? '[untitled]';\n const editing = props.selectedKey === props.item.id;\n const hovering = props.hoverKey === props.item.id;\n\n const itemRef = useRef<T>();\n itemRef.current = props.item;\n\n function onClick(e: React.SyntheticEvent): void {\n killEvent(e);\n props.setSelectedKey(props.item.id);\n }\n\n function onHover(e: React.SyntheticEvent): void {\n killEvent(e);\n props.setHoverKey(props.item.id);\n }\n\n function changeItem(changedItem: QuestionnaireItem): void {\n const curr = itemRef.current as T;\n props.onChange({\n ...curr,\n item: curr.item?.map((i) => (i.id === changedItem.id ? changedItem : i)),\n } as T);\n }\n\n function addItem(addedItem: QuestionnaireItem): void {\n props.onChange({\n ...props.item,\n item: [...(props.item.item ?? []), addedItem],\n });\n }\n\n function removeItem(removedItem: QuestionnaireItem): void {\n props.onChange({\n ...props.item,\n item: props.item.item?.filter((i) => i !== removedItem),\n });\n }\n\n function changeProperty(property: string, value: any): void {\n props.onChange({\n ...itemRef.current,\n [property]: value,\n } as T);\n }\n\n const className = cx(classes.section, {\n [classes.editing]: editing,\n [classes.hovering]: hovering && !editing,\n });\n\n return (\n <div data-testid={item.linkId} className={className} onClick={onClick} onMouseOver={onHover}>\n <div className={classes.questionBody}>\n {editing ? (\n <>\n {isResource && (\n <TextInput\n size=\"xl\"\n defaultValue={resource.title}\n onChange={(e) => changeProperty('title', e.currentTarget.value)}\n />\n )}\n {!isResource && (\n <Textarea\n autosize\n minRows={2}\n defaultValue={item.text}\n onChange={(e) => changeProperty('text', e.currentTarget.value)}\n />\n )}\n {isChoiceQuestion(item) && (\n <AnswerBuilder\n options={item.answerOption}\n onChange={(newOptions) => changeProperty('answerOption', newOptions)}\n />\n )}\n </>\n ) : (\n <>\n {resource.title && <Title>{resource.title}</Title>}\n {item.text && <div>{item.text}</div>}\n {!isContainer && <QuestionnaireFormItem item={item} answers={{}} onChange={() => undefined} />}\n </>\n )}\n </div>\n {item.item?.map((i) => (\n <div key={i.id}>\n <ItemBuilder\n item={i}\n selectedKey={props.selectedKey}\n setSelectedKey={props.setSelectedKey}\n hoverKey={props.hoverKey}\n setHoverKey={props.setHoverKey}\n onChange={changeItem}\n onRemove={() => removeItem(i)}\n />\n </div>\n ))}\n {!isContainer && (\n <div className={classes.topActions}>\n {editing ? (\n <>\n <TextInput\n size=\"xs\"\n className={classes.linkIdInput}\n defaultValue={item.linkId}\n onChange={(e) => changeProperty('linkId', e.currentTarget.value)}\n />\n {!isContainer && (\n <NativeSelect\n size=\"xs\"\n className={classes.typeSelect}\n defaultValue={item.type}\n onChange={(e) => changeProperty('type', e.currentTarget.value)}\n data={[\n { value: 'display', label: 'Display' },\n { value: 'boolean', label: 'Boolean' },\n { value: 'decimal', label: 'Decimal' },\n { value: 'integer', label: 'Integer' },\n { value: 'date', label: 'Date' },\n { value: 'dateTime', label: 'Date/Time' },\n { value: 'time', label: 'Time' },\n { value: 'string', label: 'String' },\n { value: 'text', label: 'Text' },\n { value: 'url', label: 'URL' },\n { value: 'choice', label: 'Choice' },\n { value: 'open-choice', label: 'Open Choice' },\n { value: 'attachment', label: 'Attachment' },\n { value: 'reference', label: 'Reference' },\n { value: 'quantity', label: 'Quantity' },\n ]}\n />\n )}\n </>\n ) : (\n <div>{linkId}</div>\n )}\n </div>\n )}\n <div className={classes.bottomActions}>\n {isContainer && (\n <>\n <Anchor\n href=\"#\"\n onClick={(e: React.MouseEvent) => {\n e.preventDefault();\n addItem({\n id: generateId(),\n linkId: generateLinkId('q'),\n type: 'string',\n text: 'Question',\n } as QuestionnaireItem);\n }}\n >\n Add item\n </Anchor>\n <Anchor\n href=\"#\"\n onClick={(e: React.MouseEvent) => {\n e.preventDefault();\n addItem({\n id: generateId(),\n linkId: generateLinkId('g'),\n type: 'group',\n text: 'Group',\n } as QuestionnaireItem);\n }}\n >\n Add group\n </Anchor>\n </>\n )}\n {editing && !isResource && (\n <Anchor\n href=\"#\"\n onClick={(e: React.MouseEvent) => {\n e.preventDefault();\n if (props.onRemove) {\n props.onRemove();\n }\n }}\n >\n Remove\n </Anchor>\n )}\n </div>\n </div>\n );\n}\n\ninterface AnswerBuilderProps {\n options?: QuestionnaireItemAnswerOption[];\n onChange: (newOptions: QuestionnaireItemAnswerOption[]) => void;\n}\n\nfunction AnswerBuilder(props: AnswerBuilderProps): JSX.Element {\n const property = globalSchema.types['QuestionnaireItemAnswerOption'].properties['value[x]'];\n const options = props.options ?? [];\n return (\n <div>\n {options.map((option: QuestionnaireItemAnswerOption) => {\n const [propertyValue, propertyType] = getValueAndType(\n { type: 'QuestionnaireItemAnswerOption', value: option },\n 'value'\n );\n return (\n <div\n key={option.id}\n style={{\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'space-between',\n alignItems: 'center',\n width: '80%',\n }}\n >\n <div>\n <ResourcePropertyInput\n key={option.id}\n name=\"value[x]\"\n property={property}\n defaultPropertyType={propertyType}\n defaultValue={propertyValue}\n onChange={(newValue: any, propName?: string) => {\n const newOptions = [...options];\n const index = newOptions.findIndex((o) => o.id === option.id);\n newOptions[index] = { id: option.id, [propName as string]: newValue };\n props.onChange(newOptions);\n }}\n />\n </div>\n <div>\n <Anchor\n href=\"#\"\n onClick={(e: React.SyntheticEvent) => {\n killEvent(e);\n props.onChange(options.filter((o) => o.id !== option.id));\n }}\n >\n Remove\n </Anchor>\n </div>\n </div>\n );\n })}\n <Anchor\n href=\"#\"\n onClick={(e: React.SyntheticEvent) => {\n killEvent(e);\n props.onChange([\n ...options,\n {\n id: generateId(),\n },\n ]);\n }}\n >\n Add choice\n </Anchor>\n </div>\n );\n}\n\nlet nextLinkId = 1;\nlet nextId = 1;\n\n/**\n * Generates a link ID for an item.\n * Link IDs are required properties on QuestionnaireItem objects.\n * @param prefix The link ID prefix string.\n * @returns A unique link ID.\n */\nfunction generateLinkId(prefix: string): string {\n return prefix + nextLinkId++;\n}\n\n/**\n * Generates a unique ID.\n * React needs unique IDs for components for rendering performance.\n * All of the important components in the questionnaire builder have id properties for this:\n * Questionnaire, QuestionnaireItem, and QuestionnaireItemAnswerOption.\n * @returns A unique key.\n */\nfunction generateId(): string {\n return 'id-' + nextId++;\n}\n\nfunction ensureQuestionnaireKeys(questionnaire: Questionnaire): Questionnaire {\n return {\n ...questionnaire,\n id: questionnaire.id || generateId(),\n item: ensureQuestionnaireItemKeys(questionnaire.item),\n } as Questionnaire;\n}\n\nfunction ensureQuestionnaireItemKeys(items: QuestionnaireItem[] | undefined): QuestionnaireItem[] | undefined {\n if (!items) {\n return undefined;\n }\n items.forEach((item) => {\n if (item.id?.match(/^id-\\d+$/)) {\n nextId = Math.max(nextId, parseInt(item.id.substring(3), 10) + 1);\n }\n if (item.linkId?.match(/^q\\d+$/)) {\n nextLinkId = Math.max(nextLinkId, parseInt(item.linkId.substring(1), 10) + 1);\n }\n });\n return items.map((item) => ({\n ...item,\n id: item.id || generateId(),\n item: ensureQuestionnaireItemKeys(item.item),\n answerOption: ensureQuestionnaireOptionKeys(item.answerOption),\n }));\n}\n\nfunction ensureQuestionnaireOptionKeys(\n options: QuestionnaireItemAnswerOption[] | undefined\n): QuestionnaireItemAnswerOption[] | undefined {\n if (!options) {\n return undefined;\n }\n return options.map((option) => ({\n ...option,\n id: option.id || generateId(),\n }));\n}\n"],"names":["isResource","isResourceType"],"mappings":";;;;;;;;;;;;AAaA,MAAM,SAAS,GAAG,YAAY,CAAC,CAAC,KAAK,MAAM;AACzC,IAAA,OAAO,EAAE;AACP,QAAA,QAAQ,EAAE,UAAU;AACpB,QAAA,MAAM,EAAE,eAAe;AACvB,QAAA,OAAO,EAAE,mBAAmB;QAC5B,MAAM,EAAE,CAAe,YAAA,EAAA,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAE,CAAA;AAC7C,QAAA,YAAY,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE;AAC7B,QAAA,UAAU,EAAE,UAAU;AACvB,KAAA;AAED,IAAA,QAAQ,EAAE;QACR,MAAM,EAAE,CAAe,YAAA,EAAA,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAE,CAAA;AAC9C,KAAA;AAED,IAAA,OAAO,EAAE;QACP,MAAM,EAAE,CAAe,YAAA,EAAA,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAE,CAAA;QAC7C,UAAU,EAAE,CAAa,UAAA,EAAA,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAE,CAAA;AAChD,KAAA;AAED,IAAA,YAAY,EAAE;AACZ,QAAA,QAAQ,EAAE,GAAG;AACd,KAAA;AAED,IAAA,UAAU,EAAE;AACV,QAAA,QAAQ,EAAE,UAAU;AACpB,QAAA,KAAK,EAAE,CAAC;AACR,QAAA,GAAG,EAAE,CAAC;AACN,QAAA,OAAO,EAAE,CAAC;QACV,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;AAC3B,QAAA,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC,EAAE;AAC7B,KAAA;AAED,IAAA,aAAa,EAAE;AACb,QAAA,QAAQ,EAAE,UAAU;AACpB,QAAA,KAAK,EAAE,CAAC;AACR,QAAA,MAAM,EAAE,CAAC;AACT,QAAA,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC,EAAE;AAE5B,QAAA,KAAK,EAAE;AACL,YAAA,UAAU,EAAE,CAAC;AACd,SAAA;AACF,KAAA;AAED,IAAA,WAAW,EAAE;AACX,QAAA,KAAK,EAAE,GAAG;AACV,QAAA,YAAY,EAAE,CAAC;AAChB,KAAA;AAED,IAAA,UAAU,EAAE;AACV,QAAA,KAAK,EAAE,GAAG;AACX,KAAA;AACF,CAAA,CAAC,CAAC,CAAC;AAOE,SAAU,oBAAoB,CAAC,KAAgC,EAAA;AACnE,IAAA,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,MAAM,YAAY,GAAG,WAAW,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;IACtD,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,EAA0C,CAAC;IAC/E,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,EAAiB,CAAC;IACpD,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,EAAU,CAAC;IACzD,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,EAAU,CAAC;AAEnD,IAAA,SAAS,uBAAuB,GAAA;QAC9B,WAAW,CAAC,SAAS,CAAC,CAAC;KACxB;AAED,IAAA,SAAS,mBAAmB,GAAA;QAC1B,cAAc,CAAC,SAAS,CAAC,CAAC;KAC3B;IAED,SAAS,CAAC,MAAK;AACb,QAAA,OAAO,CAAC,aAAa,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;AAC5E,KAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAEd,SAAS,CAAC,MAAK;AACb,QAAA,QAAQ,CAAC,uBAAuB,CAAC,YAAY,IAAI,EAAE,YAAY,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC;AACrF,QAAA,QAAQ,CAAC,gBAAgB,CAAC,WAAW,EAAE,uBAAuB,CAAC,CAAC;AAChE,QAAA,QAAQ,CAAC,gBAAgB,CAAC,OAAO,EAAE,mBAAmB,CAAC,CAAC;AACxD,QAAA,OAAO,MAAK;AACV,YAAA,QAAQ,CAAC,mBAAmB,CAAC,WAAW,EAAE,uBAAuB,CAAC,CAAC;AACnE,YAAA,QAAQ,CAAC,mBAAmB,CAAC,OAAO,EAAE,mBAAmB,CAAC,CAAC;AAC7D,SAAC,CAAC;AACJ,KAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC;AAEnB,IAAA,IAAI,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE;AACrB,QAAA,OAAO,IAAI,CAAC;AACb,KAAA;AAED,IAAA,QACE,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA,IAAA;AACE,QAAA,KAAA,CAAA,aAAA,CAAC,IAAI,EAAC,EAAA,MAAM,EAAC,oBAAoB,EAAC,QAAQ,EAAE,MAAM,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAA;YACrE,KAAC,CAAA,aAAA,CAAA,WAAW,EACV,EAAA,IAAI,EAAE,KAAK,EACX,WAAW,EAAE,WAAW,EACxB,cAAc,EAAE,cAAc,EAC9B,QAAQ,EAAE,QAAQ,EAClB,WAAW,EAAE,WAAW,EACxB,QAAQ,EAAE,QAAQ,EAClB,CAAA;YACF,KAAC,CAAA,aAAA,CAAA,MAAM,IAAC,IAAI,EAAC,QAAQ,EAAc,EAAA,MAAA,CAAA,CAC9B,CACH,EACN;AACJ,CAAC;AAYD,SAAS,WAAW,CAA8C,KAA0B,EAAA;IAC1F,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,SAAS,EAAE,CAAC;AACpC,IAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAqB,CAAC;AAC7C,IAAA,MAAM,IAAI,GAAG,KAAK,CAAC,IAAyB,CAAC;IAC7C,MAAMA,YAAU,GAAGC,UAAc,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC9C,MAAM,WAAW,GAAGD,YAAU,IAAI,IAAI,CAAC,IAAI,KAAK,qBAAqB,CAAC,KAAK,CAAC;AAC5E,IAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,YAAY,CAAC;IAC3C,MAAM,OAAO,GAAG,KAAK,CAAC,WAAW,KAAK,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;IACpD,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,KAAK,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;AAElD,IAAA,MAAM,OAAO,GAAG,MAAM,EAAK,CAAC;AAC5B,IAAA,OAAO,CAAC,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC;IAE7B,SAAS,OAAO,CAAC,CAAuB,EAAA;QACtC,SAAS,CAAC,CAAC,CAAC,CAAC;QACb,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;KACrC;IAED,SAAS,OAAO,CAAC,CAAuB,EAAA;QACtC,SAAS,CAAC,CAAC,CAAC,CAAC;QACb,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;KAClC;IAED,SAAS,UAAU,CAAC,WAA8B,EAAA;AAChD,QAAA,MAAM,IAAI,GAAG,OAAO,CAAC,OAAY,CAAC;QAClC,KAAK,CAAC,QAAQ,CAAC;AACb,YAAA,GAAG,IAAI;AACP,YAAA,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,WAAW,CAAC,EAAE,GAAG,WAAW,GAAG,CAAC,CAAC,CAAC;AACpE,SAAA,CAAC,CAAC;KACT;IAED,SAAS,OAAO,CAAC,SAA4B,EAAA;QAC3C,KAAK,CAAC,QAAQ,CAAC;YACb,GAAG,KAAK,CAAC,IAAI;AACb,YAAA,IAAI,EAAE,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE,SAAS,CAAC;AAC9C,SAAA,CAAC,CAAC;KACJ;IAED,SAAS,UAAU,CAAC,WAA8B,EAAA;QAChD,KAAK,CAAC,QAAQ,CAAC;YACb,GAAG,KAAK,CAAC,IAAI;AACb,YAAA,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,WAAW,CAAC;AACxD,SAAA,CAAC,CAAC;KACJ;AAED,IAAA,SAAS,cAAc,CAAC,QAAgB,EAAE,KAAU,EAAA;QAClD,KAAK,CAAC,QAAQ,CAAC;YACb,GAAG,OAAO,CAAC,OAAO;YAClB,CAAC,QAAQ,GAAG,KAAK;AACb,SAAA,CAAC,CAAC;KACT;AAED,IAAA,MAAM,SAAS,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE;AACpC,QAAA,CAAC,OAAO,CAAC,OAAO,GAAG,OAAO;QAC1B,CAAC,OAAO,CAAC,QAAQ,GAAG,QAAQ,IAAI,CAAC,OAAO;AACzC,KAAA,CAAC,CAAC;AAEH,IAAA,QACE,KAAkB,CAAA,aAAA,CAAA,KAAA,EAAA,EAAA,aAAA,EAAA,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAA;QACzF,KAAK,CAAA,aAAA,CAAA,KAAA,EAAA,EAAA,SAAS,EAAE,OAAO,CAAC,YAAY,IACjC,OAAO,IACN,KAAA,CAAA,aAAA,CAAA,KAAA,CAAA,QAAA,EAAA,IAAA;AACG,YAAAA,YAAU,KACT,KAAC,CAAA,aAAA,CAAA,SAAS,IACR,IAAI,EAAC,IAAI,EACT,YAAY,EAAE,QAAQ,CAAC,KAAK,EAC5B,QAAQ,EAAE,CAAC,CAAC,KAAK,cAAc,CAAC,OAAO,EAAE,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,GAC/D,CACH;AACA,YAAA,CAACA,YAAU,KACV,KAAC,CAAA,aAAA,CAAA,QAAQ,IACP,QAAQ,EAAA,IAAA,EACR,OAAO,EAAE,CAAC,EACV,YAAY,EAAE,IAAI,CAAC,IAAI,EACvB,QAAQ,EAAE,CAAC,CAAC,KAAK,cAAc,CAAC,MAAM,EAAE,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,GAC9D,CACH;AACA,YAAA,gBAAgB,CAAC,IAAI,CAAC,KACrB,KAAC,CAAA,aAAA,CAAA,aAAa,EACZ,EAAA,OAAO,EAAE,IAAI,CAAC,YAAY,EAC1B,QAAQ,EAAE,CAAC,UAAU,KAAK,cAAc,CAAC,cAAc,EAAE,UAAU,CAAC,EAAA,CACpE,CACH,CACA,KAEH,KAAA,CAAA,aAAA,CAAA,KAAA,CAAA,QAAA,EAAA,IAAA;YACG,QAAQ,CAAC,KAAK,IAAI,KAAA,CAAA,aAAA,CAAC,KAAK,EAAE,IAAA,EAAA,QAAQ,CAAC,KAAK,CAAS;AACjD,YAAA,IAAI,CAAC,IAAI,IAAI,iCAAM,IAAI,CAAC,IAAI,CAAO;YACnC,CAAC,WAAW,IAAI,KAAC,CAAA,aAAA,CAAA,qBAAqB,IAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,SAAS,EAAA,CAAI,CAC7F,CACJ,CACG;AACL,QAAA,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,MAChB,KAAK,CAAA,aAAA,CAAA,KAAA,EAAA,EAAA,GAAG,EAAE,CAAC,CAAC,EAAE,EAAA;YACZ,KAAC,CAAA,aAAA,CAAA,WAAW,IACV,IAAI,EAAE,CAAC,EACP,WAAW,EAAE,KAAK,CAAC,WAAW,EAC9B,cAAc,EAAE,KAAK,CAAC,cAAc,EACpC,QAAQ,EAAE,KAAK,CAAC,QAAQ,EACxB,WAAW,EAAE,KAAK,CAAC,WAAW,EAC9B,QAAQ,EAAE,UAAU,EACpB,QAAQ,EAAE,MAAM,UAAU,CAAC,CAAC,CAAC,EAAA,CAC7B,CACE,CACP,CAAC;AACD,QAAA,CAAC,WAAW,KACX,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAE,OAAO,CAAC,UAAU,EAC/B,EAAA,OAAO,IACN,KAAA,CAAA,aAAA,CAAA,KAAA,CAAA,QAAA,EAAA,IAAA;AACE,YAAA,KAAA,CAAA,aAAA,CAAC,SAAS,EAAA,EACR,IAAI,EAAC,IAAI,EACT,SAAS,EAAE,OAAO,CAAC,WAAW,EAC9B,YAAY,EAAE,IAAI,CAAC,MAAM,EACzB,QAAQ,EAAE,CAAC,CAAC,KAAK,cAAc,CAAC,QAAQ,EAAE,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,EAChE,CAAA;AACD,YAAA,CAAC,WAAW,KACX,oBAAC,YAAY,EAAA,EACX,IAAI,EAAC,IAAI,EACT,SAAS,EAAE,OAAO,CAAC,UAAU,EAC7B,YAAY,EAAE,IAAI,CAAC,IAAI,EACvB,QAAQ,EAAE,CAAC,CAAC,KAAK,cAAc,CAAC,MAAM,EAAE,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,EAC9D,IAAI,EAAE;AACJ,oBAAA,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE;AACtC,oBAAA,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE;AACtC,oBAAA,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE;AACtC,oBAAA,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE;AACtC,oBAAA,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;AAChC,oBAAA,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW,EAAE;AACzC,oBAAA,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;AAChC,oBAAA,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE;AACpC,oBAAA,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;AAChC,oBAAA,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE;AAC9B,oBAAA,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE;AACpC,oBAAA,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,EAAE;AAC9C,oBAAA,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY,EAAE;AAC5C,oBAAA,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE;AAC1C,oBAAA,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE;AACzC,iBAAA,EAAA,CACD,CACH,CACA,KAEH,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA,IAAA,EAAM,MAAM,CAAO,CACpB,CACG,CACP;AACD,QAAA,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAE,OAAO,CAAC,aAAa,EAAA;AAClC,YAAA,WAAW,KACV,KAAA,CAAA,aAAA,CAAA,KAAA,CAAA,QAAA,EAAA,IAAA;gBACE,KAAC,CAAA,aAAA,CAAA,MAAM,EACL,EAAA,IAAI,EAAC,GAAG,EACR,OAAO,EAAE,CAAC,CAAmB,KAAI;wBAC/B,CAAC,CAAC,cAAc,EAAE,CAAC;AACnB,wBAAA,OAAO,CAAC;4BACN,EAAE,EAAE,UAAU,EAAE;AAChB,4BAAA,MAAM,EAAE,cAAc,CAAC,GAAG,CAAC;AAC3B,4BAAA,IAAI,EAAE,QAAQ;AACd,4BAAA,IAAI,EAAE,UAAU;AACI,yBAAA,CAAC,CAAC;AAC1B,qBAAC,EAGM,EAAA,UAAA,CAAA;gBACT,KAAC,CAAA,aAAA,CAAA,MAAM,EACL,EAAA,IAAI,EAAC,GAAG,EACR,OAAO,EAAE,CAAC,CAAmB,KAAI;wBAC/B,CAAC,CAAC,cAAc,EAAE,CAAC;AACnB,wBAAA,OAAO,CAAC;4BACN,EAAE,EAAE,UAAU,EAAE;AAChB,4BAAA,MAAM,EAAE,cAAc,CAAC,GAAG,CAAC;AAC3B,4BAAA,IAAI,EAAE,OAAO;AACb,4BAAA,IAAI,EAAE,OAAO;AACO,yBAAA,CAAC,CAAC;qBACzB,EAAA,EAAA,WAAA,CAGM,CACR,CACJ;AACA,YAAA,OAAO,IAAI,CAACA,YAAU,KACrB,oBAAC,MAAM,EAAA,EACL,IAAI,EAAC,GAAG,EACR,OAAO,EAAE,CAAC,CAAmB,KAAI;oBAC/B,CAAC,CAAC,cAAc,EAAE,CAAC;oBACnB,IAAI,KAAK,CAAC,QAAQ,EAAE;wBAClB,KAAK,CAAC,QAAQ,EAAE,CAAC;AAClB,qBAAA;AACH,iBAAC,EAGM,EAAA,QAAA,CAAA,CACV,CACG,CACF,EACN;AACJ,CAAC;AAOD,SAAS,aAAa,CAAC,KAAyB,EAAA;AAC9C,IAAA,MAAM,QAAQ,GAAG,YAAY,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;AAC5F,IAAA,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC;AACpC,IAAA,QACE,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA,IAAA;AACG,QAAA,OAAO,CAAC,GAAG,CAAC,CAAC,MAAqC,KAAI;YACrD,MAAM,CAAC,aAAa,EAAE,YAAY,CAAC,GAAG,eAAe,CACnD,EAAE,IAAI,EAAE,+BAA+B,EAAE,KAAK,EAAE,MAAM,EAAE,EACxD,OAAO,CACR,CAAC;YACF,QACE,6BACE,GAAG,EAAE,MAAM,CAAC,EAAE,EACd,KAAK,EAAE;AACL,oBAAA,OAAO,EAAE,MAAM;AACf,oBAAA,aAAa,EAAE,KAAK;AACpB,oBAAA,cAAc,EAAE,eAAe;AAC/B,oBAAA,UAAU,EAAE,QAAQ;AACpB,oBAAA,KAAK,EAAE,KAAK;AACb,iBAAA,EAAA;AAED,gBAAA,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA,IAAA;AACE,oBAAA,KAAA,CAAA,aAAA,CAAC,qBAAqB,EAAA,EACpB,GAAG,EAAE,MAAM,CAAC,EAAE,EACd,IAAI,EAAC,UAAU,EACf,QAAQ,EAAE,QAAQ,EAClB,mBAAmB,EAAE,YAAY,EACjC,YAAY,EAAE,aAAa,EAC3B,QAAQ,EAAE,CAAC,QAAa,EAAE,QAAiB,KAAI;AAC7C,4BAAA,MAAM,UAAU,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC;AAChC,4BAAA,MAAM,KAAK,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,EAAE,CAAC,CAAC;AAC9D,4BAAA,UAAU,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,QAAkB,GAAG,QAAQ,EAAE,CAAC;AACtE,4BAAA,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;AAC7B,yBAAC,GACD,CACE;AACN,gBAAA,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA,IAAA;oBACE,KAAC,CAAA,aAAA,CAAA,MAAM,EACL,EAAA,IAAI,EAAC,GAAG,EACR,OAAO,EAAE,CAAC,CAAuB,KAAI;4BACnC,SAAS,CAAC,CAAC,CAAC,CAAC;4BACb,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;AAC5D,yBAAC,EAGM,EAAA,QAAA,CAAA,CACL,CACF,EACN;AACJ,SAAC,CAAC;QACF,KAAC,CAAA,aAAA,CAAA,MAAM,EACL,EAAA,IAAI,EAAC,GAAG,EACR,OAAO,EAAE,CAAC,CAAuB,KAAI;gBACnC,SAAS,CAAC,CAAC,CAAC,CAAC;gBACb,KAAK,CAAC,QAAQ,CAAC;AACb,oBAAA,GAAG,OAAO;AACV,oBAAA;wBACE,EAAE,EAAE,UAAU,EAAE;AACjB,qBAAA;AACF,iBAAA,CAAC,CAAC;aACJ,EAAA,EAAA,YAAA,CAGM,CACL,EACN;AACJ,CAAC;AAED,IAAI,UAAU,GAAG,CAAC,CAAC;AACnB,IAAI,MAAM,GAAG,CAAC,CAAC;AAEf;;;;;AAKG;AACH,SAAS,cAAc,CAAC,MAAc,EAAA;AACpC,IAAA,OAAO,MAAM,GAAG,UAAU,EAAE,CAAC;AAC/B,CAAC;AAED;;;;;;AAMG;AACH,SAAS,UAAU,GAAA;AACjB,IAAA,OAAO,KAAK,GAAG,MAAM,EAAE,CAAC;AAC1B,CAAC;AAED,SAAS,uBAAuB,CAAC,aAA4B,EAAA;IAC3D,OAAO;AACL,QAAA,GAAG,aAAa;AAChB,QAAA,EAAE,EAAE,aAAa,CAAC,EAAE,IAAI,UAAU,EAAE;AACpC,QAAA,IAAI,EAAE,2BAA2B,CAAC,aAAa,CAAC,IAAI,CAAC;KACrC,CAAC;AACrB,CAAC;AAED,SAAS,2BAA2B,CAAC,KAAsC,EAAA;IACzE,IAAI,CAAC,KAAK,EAAE;AACV,QAAA,OAAO,SAAS,CAAC;AAClB,KAAA;AACD,IAAA,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,KAAI;QACrB,IAAI,IAAI,CAAC,EAAE,EAAE,KAAK,CAAC,UAAU,CAAC,EAAE;YAC9B,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;AACnE,SAAA;QACD,IAAI,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC,EAAE;YAChC,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;AAC/E,SAAA;AACH,KAAC,CAAC,CAAC;IACH,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,MAAM;AAC1B,QAAA,GAAG,IAAI;AACP,QAAA,EAAE,EAAE,IAAI,CAAC,EAAE,IAAI,UAAU,EAAE;AAC3B,QAAA,IAAI,EAAE,2BAA2B,CAAC,IAAI,CAAC,IAAI,CAAC;AAC5C,QAAA,YAAY,EAAE,6BAA6B,CAAC,IAAI,CAAC,YAAY,CAAC;AAC/D,KAAA,CAAC,CAAC,CAAC;AACN,CAAC;AAED,SAAS,6BAA6B,CACpC,OAAoD,EAAA;IAEpD,IAAI,CAAC,OAAO,EAAE;AACZ,QAAA,OAAO,SAAS,CAAC;AAClB,KAAA;IACD,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,MAAM;AAC9B,QAAA,GAAG,MAAM;AACT,QAAA,EAAE,EAAE,MAAM,CAAC,EAAE,IAAI,UAAU,EAAE;AAC9B,KAAA,CAAC,CAAC,CAAC;AACN;;;;"}
|
|
@@ -1,276 +0,0 @@
|
|
|
1
|
-
import { Title, Group, Button, Stack, Checkbox, Textarea, TextInput, NativeSelect, Radio } from '@mantine/core';
|
|
2
|
-
import { getReferenceString, createReference, getTypedPropertyValue, capitalize, globalSchema, stringify, deepEquals, getQuestionnaireAnswers } from '@medplum/core';
|
|
3
|
-
import React, { useState, useEffect } from 'react';
|
|
4
|
-
import { AttachmentInput } from '../AttachmentInput/AttachmentInput.mjs';
|
|
5
|
-
import { CheckboxFormSection } from '../CheckboxFormSection/CheckboxFormSection.mjs';
|
|
6
|
-
import { DateTimeInput } from '../DateTimeInput/DateTimeInput.mjs';
|
|
7
|
-
import { Form } from '../Form/Form.mjs';
|
|
8
|
-
import { FormSection } from '../FormSection/FormSection.mjs';
|
|
9
|
-
import { useMedplum } from '../MedplumProvider/MedplumProvider.mjs';
|
|
10
|
-
import { QuantityInput } from '../QuantityInput/QuantityInput.mjs';
|
|
11
|
-
import { ReferenceInput } from '../ReferenceInput/ReferenceInput.mjs';
|
|
12
|
-
import { ResourcePropertyDisplay } from '../ResourcePropertyDisplay/ResourcePropertyDisplay.mjs';
|
|
13
|
-
import { useResource } from '../useResource/useResource.mjs';
|
|
14
|
-
import { QuestionnaireItemType } from '../utils/questionnaire.mjs';
|
|
15
|
-
|
|
16
|
-
function QuestionnaireForm(props) {
|
|
17
|
-
const medplum = useMedplum();
|
|
18
|
-
const source = medplum.getProfile();
|
|
19
|
-
const [schema, setSchema] = useState();
|
|
20
|
-
const questionnaire = useResource(props.questionnaire);
|
|
21
|
-
const [response, setResponse] = useState();
|
|
22
|
-
const [answers, setAnswers] = useState({});
|
|
23
|
-
useEffect(() => {
|
|
24
|
-
medplum
|
|
25
|
-
.requestSchema('Questionnaire')
|
|
26
|
-
.then(() => medplum.requestSchema('QuestionnaireResponse'))
|
|
27
|
-
.then(setSchema)
|
|
28
|
-
.catch(console.log);
|
|
29
|
-
}, [medplum]);
|
|
30
|
-
useEffect(() => {
|
|
31
|
-
setResponse(questionnaire ? buildInitialResponse(questionnaire) : undefined);
|
|
32
|
-
}, [questionnaire]);
|
|
33
|
-
function setItems(newResponseItems) {
|
|
34
|
-
const newResponse = {
|
|
35
|
-
resourceType: 'QuestionnaireResponse',
|
|
36
|
-
item: newResponseItems,
|
|
37
|
-
};
|
|
38
|
-
setResponse(newResponse);
|
|
39
|
-
setAnswers(getQuestionnaireAnswers(newResponse));
|
|
40
|
-
}
|
|
41
|
-
if (!schema || !questionnaire) {
|
|
42
|
-
return null;
|
|
43
|
-
}
|
|
44
|
-
return (React.createElement(Form, { testid: "questionnaire-form", onSubmit: () => {
|
|
45
|
-
if (props.onSubmit && response) {
|
|
46
|
-
props.onSubmit({
|
|
47
|
-
...response,
|
|
48
|
-
questionnaire: getReferenceString(questionnaire),
|
|
49
|
-
subject: props.subject,
|
|
50
|
-
source: createReference(source),
|
|
51
|
-
authored: new Date().toISOString(),
|
|
52
|
-
status: 'completed',
|
|
53
|
-
});
|
|
54
|
-
}
|
|
55
|
-
} },
|
|
56
|
-
questionnaire.title && React.createElement(Title, null, questionnaire.title),
|
|
57
|
-
questionnaire.item && (React.createElement(QuestionnaireFormItemArray, { items: questionnaire.item, answers: answers, onChange: setItems })),
|
|
58
|
-
React.createElement(Group, { position: "right", mt: "xl" },
|
|
59
|
-
React.createElement(Button, { type: "submit" }, props.submitButtonText || 'OK'))));
|
|
60
|
-
}
|
|
61
|
-
function QuestionnaireFormItemArray(props) {
|
|
62
|
-
const [responseItems, setResponseItems] = useState(buildInitialResponseItems(props.items));
|
|
63
|
-
function setResponseItem(index, newResponseItem) {
|
|
64
|
-
const newResponseItems = responseItems.slice();
|
|
65
|
-
newResponseItems[index] = newResponseItem;
|
|
66
|
-
setResponseItems(newResponseItems);
|
|
67
|
-
props.onChange(newResponseItems);
|
|
68
|
-
}
|
|
69
|
-
return (React.createElement(Stack, null, props.items.map((item, index) => {
|
|
70
|
-
if (!isQuestionEnabled(item, props.answers)) {
|
|
71
|
-
return null;
|
|
72
|
-
}
|
|
73
|
-
if (item.type === QuestionnaireItemType.display) {
|
|
74
|
-
return React.createElement("p", { key: item.linkId }, item.text);
|
|
75
|
-
}
|
|
76
|
-
if (item.type === QuestionnaireItemType.group) {
|
|
77
|
-
return (React.createElement(QuestionnaireFormItem, { key: item.linkId, item: item, answers: props.answers, onChange: (newResponseItem) => setResponseItem(index, newResponseItem) }));
|
|
78
|
-
}
|
|
79
|
-
if (item.type === QuestionnaireItemType.boolean) {
|
|
80
|
-
const initial = item.initial && item.initial.length > 0 ? item.initial[0] : undefined;
|
|
81
|
-
return (React.createElement(CheckboxFormSection, { key: item.linkId, title: item.text, htmlFor: item.linkId },
|
|
82
|
-
React.createElement(Checkbox, { id: item.linkId, name: item.linkId, defaultChecked: initial?.valueBoolean, onChange: (e) => setResponseItem(index, {
|
|
83
|
-
linkId: item.linkId,
|
|
84
|
-
text: item.text,
|
|
85
|
-
answer: [{ valueBoolean: e.currentTarget.checked }],
|
|
86
|
-
}) })));
|
|
87
|
-
}
|
|
88
|
-
return (React.createElement(FormSection, { key: item.linkId, htmlFor: item.linkId, title: item.text || '' },
|
|
89
|
-
React.createElement(QuestionnaireFormItem, { item: item, answers: props.answers, onChange: (newResponseItem) => setResponseItem(index, newResponseItem) })));
|
|
90
|
-
})));
|
|
91
|
-
}
|
|
92
|
-
function QuestionnaireFormItem(props) {
|
|
93
|
-
const item = props.item;
|
|
94
|
-
const type = item.type;
|
|
95
|
-
if (!type) {
|
|
96
|
-
return null;
|
|
97
|
-
}
|
|
98
|
-
const name = item.linkId;
|
|
99
|
-
if (!name) {
|
|
100
|
-
return null;
|
|
101
|
-
}
|
|
102
|
-
const initial = item.initial && item.initial.length > 0 ? item.initial[0] : undefined;
|
|
103
|
-
function onChangeItem(newResponseItems) {
|
|
104
|
-
props.onChange({
|
|
105
|
-
linkId: item.linkId,
|
|
106
|
-
text: item.text,
|
|
107
|
-
item: newResponseItems,
|
|
108
|
-
});
|
|
109
|
-
}
|
|
110
|
-
function onChangeAnswer(newResponseAnswer) {
|
|
111
|
-
props.onChange({
|
|
112
|
-
linkId: item.linkId,
|
|
113
|
-
text: item.text,
|
|
114
|
-
answer: [newResponseAnswer],
|
|
115
|
-
});
|
|
116
|
-
}
|
|
117
|
-
switch (type) {
|
|
118
|
-
case QuestionnaireItemType.group:
|
|
119
|
-
return (React.createElement("div", null,
|
|
120
|
-
React.createElement("h3", null, item.text),
|
|
121
|
-
item.item && (React.createElement(QuestionnaireFormItemArray, { items: item.item, answers: props.answers, onChange: onChangeItem }))));
|
|
122
|
-
case QuestionnaireItemType.boolean:
|
|
123
|
-
return (React.createElement(Checkbox, { id: name, name: name, defaultChecked: initial?.valueBoolean, onChange: (e) => onChangeAnswer({ valueBoolean: e.currentTarget.checked }) }));
|
|
124
|
-
case QuestionnaireItemType.decimal:
|
|
125
|
-
return (React.createElement(TextInput, { type: "number", step: "any", id: name, name: name, defaultValue: initial?.valueDecimal, onChange: (e) => onChangeAnswer({ valueDecimal: e.currentTarget.valueAsNumber }) }));
|
|
126
|
-
case QuestionnaireItemType.integer:
|
|
127
|
-
return (React.createElement(TextInput, { type: "number", step: 1, id: name, name: name, defaultValue: initial?.valueInteger, onChange: (e) => onChangeAnswer({ valueInteger: e.currentTarget.valueAsNumber }) }));
|
|
128
|
-
case QuestionnaireItemType.date:
|
|
129
|
-
return (React.createElement(TextInput, { type: "date", id: name, name: name, defaultValue: initial?.valueDate, onChange: (e) => onChangeAnswer({ valueDate: e.currentTarget.value }) }));
|
|
130
|
-
case QuestionnaireItemType.dateTime:
|
|
131
|
-
return (React.createElement(DateTimeInput, { name: name, defaultValue: initial?.valueDateTime, onChange: (newValue) => onChangeAnswer({ valueDateTime: newValue }) }));
|
|
132
|
-
case QuestionnaireItemType.time:
|
|
133
|
-
return (React.createElement(TextInput, { type: "time", id: name, name: name, defaultValue: initial?.valueTime, onChange: (e) => onChangeAnswer({ valueTime: e.currentTarget.value }) }));
|
|
134
|
-
case QuestionnaireItemType.string:
|
|
135
|
-
case QuestionnaireItemType.url:
|
|
136
|
-
return (React.createElement(TextInput, { id: name, name: name, defaultValue: initial?.valueString, onChange: (e) => onChangeAnswer({ valueString: e.currentTarget.value }) }));
|
|
137
|
-
case QuestionnaireItemType.text:
|
|
138
|
-
return (React.createElement(Textarea, { id: name, name: name, defaultValue: initial?.valueString, onChange: (e) => onChangeAnswer({ valueString: e.currentTarget.value }) }));
|
|
139
|
-
case QuestionnaireItemType.attachment:
|
|
140
|
-
return (React.createElement(AttachmentInput, { name: name, defaultValue: initial?.valueAttachment, onChange: (newValue) => onChangeAnswer({ valueAttachment: newValue }) }));
|
|
141
|
-
case QuestionnaireItemType.reference:
|
|
142
|
-
return (React.createElement(ReferenceInput, { name: name, defaultValue: initial?.valueReference, onChange: (newValue) => onChangeAnswer({ valueReference: newValue }) }));
|
|
143
|
-
case QuestionnaireItemType.quantity:
|
|
144
|
-
return (React.createElement(QuantityInput, { name: name, defaultValue: initial?.valueQuantity, onChange: (newValue) => onChangeAnswer({ valueQuantity: newValue }), disableWheel: true }));
|
|
145
|
-
case QuestionnaireItemType.choice:
|
|
146
|
-
case QuestionnaireItemType.openChoice:
|
|
147
|
-
if (isDropDownChoice(item)) {
|
|
148
|
-
return (React.createElement(QuestionnaireChoiceDropDownInput, { name: name, item: item, initial: initial, onChangeAnswer: onChangeAnswer }));
|
|
149
|
-
}
|
|
150
|
-
else {
|
|
151
|
-
return (React.createElement(QuestionnaireChoiceRadioInput, { name: name, item: item, initial: initial, onChangeAnswer: onChangeAnswer }));
|
|
152
|
-
}
|
|
153
|
-
default:
|
|
154
|
-
return null;
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
function QuestionnaireChoiceDropDownInput(props) {
|
|
158
|
-
const { name, item, initial } = props;
|
|
159
|
-
const initialValue = getTypedPropertyValue({ type: 'QuestionnaireItemInitial', value: initial }, 'value');
|
|
160
|
-
const data = [''];
|
|
161
|
-
if (item.answerOption) {
|
|
162
|
-
for (const option of item.answerOption) {
|
|
163
|
-
const optionValue = getTypedPropertyValue({ type: 'QuestionnaireItemAnswerOption', value: option }, 'value');
|
|
164
|
-
data.push(typedValueToString(optionValue));
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
return (React.createElement(NativeSelect, { id: name, name: name, onChange: (e) => {
|
|
168
|
-
const index = e.currentTarget.selectedIndex;
|
|
169
|
-
if (index === 0) {
|
|
170
|
-
props.onChangeAnswer({});
|
|
171
|
-
return;
|
|
172
|
-
}
|
|
173
|
-
const option = item.answerOption[index - 1];
|
|
174
|
-
const optionValue = getTypedPropertyValue({ type: 'QuestionnaireItemAnswerOption', value: option }, 'value');
|
|
175
|
-
const propertyName = 'value' + capitalize(optionValue.type);
|
|
176
|
-
props.onChangeAnswer({ [propertyName]: optionValue.value });
|
|
177
|
-
}, defaultValue: typedValueToString(initialValue), data: data }));
|
|
178
|
-
}
|
|
179
|
-
function typedValueToString(typedValue) {
|
|
180
|
-
if (!typedValue) {
|
|
181
|
-
return undefined;
|
|
182
|
-
}
|
|
183
|
-
if (typedValue.type === 'CodeableConcept') {
|
|
184
|
-
return typedValue.value.coding[0].display;
|
|
185
|
-
}
|
|
186
|
-
if (typedValue.type === 'Coding') {
|
|
187
|
-
return typedValue.value.display;
|
|
188
|
-
}
|
|
189
|
-
return typedValue.value.toString();
|
|
190
|
-
}
|
|
191
|
-
function QuestionnaireChoiceRadioInput(props) {
|
|
192
|
-
const { name, item, initial, onChangeAnswer } = props;
|
|
193
|
-
const valueElementDefinition = globalSchema.types['QuestionnaireItemAnswerOption'].properties['value[x]'];
|
|
194
|
-
const initialValue = getTypedPropertyValue({ type: 'QuestionnaireItemInitial', value: initial }, 'value');
|
|
195
|
-
const options = [];
|
|
196
|
-
let defaultValue = undefined;
|
|
197
|
-
if (item.answerOption) {
|
|
198
|
-
for (let i = 0; i < item.answerOption.length; i++) {
|
|
199
|
-
const option = item.answerOption[i];
|
|
200
|
-
const optionName = `${name}-option-${i}`;
|
|
201
|
-
const optionValue = getTypedPropertyValue({ type: 'QuestionnaireItemAnswerOption', value: option }, 'value');
|
|
202
|
-
if (initialValue && stringify(optionValue) === stringify(initialValue)) {
|
|
203
|
-
defaultValue = optionName;
|
|
204
|
-
}
|
|
205
|
-
options.push([optionName, optionValue]);
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
return (React.createElement(Radio.Group, { name: name, defaultValue: defaultValue, onChange: (newValue) => {
|
|
209
|
-
const option = options.find((option) => option[0] === newValue);
|
|
210
|
-
if (option) {
|
|
211
|
-
const optionValue = option[1];
|
|
212
|
-
const propertyName = 'value' + capitalize(optionValue.type);
|
|
213
|
-
onChangeAnswer({ [propertyName]: optionValue.value });
|
|
214
|
-
}
|
|
215
|
-
} }, options.map(([optionName, optionValue]) => (React.createElement(Radio, { key: optionName, id: optionName, value: optionName, label: React.createElement(ResourcePropertyDisplay, { property: valueElementDefinition, propertyType: optionValue.type, value: optionValue.value }) })))));
|
|
216
|
-
}
|
|
217
|
-
function buildInitialResponse(questionnaire) {
|
|
218
|
-
const response = {
|
|
219
|
-
resourceType: 'QuestionnaireResponse',
|
|
220
|
-
questionnaire: getReferenceString(questionnaire),
|
|
221
|
-
item: buildInitialResponseItems(questionnaire.item),
|
|
222
|
-
};
|
|
223
|
-
return response;
|
|
224
|
-
}
|
|
225
|
-
function buildInitialResponseItems(items) {
|
|
226
|
-
return items?.map(buildInitialResponseItem) ?? [];
|
|
227
|
-
}
|
|
228
|
-
function buildInitialResponseItem(item) {
|
|
229
|
-
return {
|
|
230
|
-
linkId: item.linkId,
|
|
231
|
-
text: item.text,
|
|
232
|
-
item: buildInitialResponseItems(item.item),
|
|
233
|
-
answer: item.initial?.map(buildInitialResponseAnswer) ?? [],
|
|
234
|
-
};
|
|
235
|
-
}
|
|
236
|
-
function buildInitialResponseAnswer(answer) {
|
|
237
|
-
// This works because QuestionnaireItemInitial and QuestionnaireResponseItemAnswer
|
|
238
|
-
// have the same properties.
|
|
239
|
-
return { ...answer };
|
|
240
|
-
}
|
|
241
|
-
function isDropDownChoice(item) {
|
|
242
|
-
return !!item.extension?.some((e) => e.url === 'http://hl7.org/fhir/StructureDefinition/questionnaire-itemControl' &&
|
|
243
|
-
e.valueCodeableConcept?.coding?.[0]?.code === 'drop-down');
|
|
244
|
-
}
|
|
245
|
-
function isQuestionEnabled(item, answers) {
|
|
246
|
-
if (!item.enableWhen) {
|
|
247
|
-
return true;
|
|
248
|
-
}
|
|
249
|
-
const enableBehavior = item.enableBehavior || 'any';
|
|
250
|
-
for (const enableWhen of item.enableWhen) {
|
|
251
|
-
const expectedAnswer = getTypedPropertyValue({
|
|
252
|
-
type: 'QuestionnaireItemEnableWhen',
|
|
253
|
-
value: enableWhen,
|
|
254
|
-
}, 'answer[x]');
|
|
255
|
-
const actualAnswer = getTypedPropertyValue({
|
|
256
|
-
type: 'QuestionnaireResponseItemAnswer',
|
|
257
|
-
value: answers[enableWhen.question],
|
|
258
|
-
}, 'value[x]');
|
|
259
|
-
const match = deepEquals(expectedAnswer, actualAnswer);
|
|
260
|
-
if (enableBehavior === 'any' && match) {
|
|
261
|
-
return true;
|
|
262
|
-
}
|
|
263
|
-
if (enableBehavior === 'all' && !match) {
|
|
264
|
-
return false;
|
|
265
|
-
}
|
|
266
|
-
}
|
|
267
|
-
if (enableBehavior === 'any') {
|
|
268
|
-
return false;
|
|
269
|
-
}
|
|
270
|
-
else {
|
|
271
|
-
return true;
|
|
272
|
-
}
|
|
273
|
-
}
|
|
274
|
-
|
|
275
|
-
export { QuestionnaireForm, QuestionnaireFormItem, isQuestionEnabled };
|
|
276
|
-
//# sourceMappingURL=QuestionnaireForm.mjs.map
|