@medplum/react 2.0.0 → 2.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/DiagnosticReportDisplay/DiagnosticReportDisplay.d.ts +2 -0
- package/dist/cjs/DiagnosticReportDisplay/DiagnosticReportDisplay.stories.d.ts +1 -0
- package/dist/cjs/MedplumProvider/MedplumProvider.d.ts +8 -0
- package/dist/cjs/NoteDisplay/NoteDisplay.d.ts +6 -0
- package/dist/cjs/{ResourceDiffTable/ResourceDiffTable.stories.d.ts → NoteDisplay/NoteDisplay.stories.d.ts} +3 -1
- package/dist/cjs/QuantityInput/QuantityInput.d.ts +1 -0
- package/dist/cjs/QuantityInput/QuantityInput.stories.d.ts +7 -0
- package/dist/cjs/ReferenceRangeEditor/ReferenceRangeEditor.d.ts +1 -2
- package/dist/cjs/ResourceTimeline/ResourceTimeline.d.ts +2 -2
- package/dist/cjs/index.cjs +1206 -1204
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/cjs/index.min.cjs +1 -1
- package/dist/esm/AddressDisplay/AddressDisplay.mjs +2 -2
- package/dist/esm/AddressDisplay/AddressDisplay.mjs.map +1 -1
- package/dist/esm/AddressInput/AddressInput.mjs +9 -9
- package/dist/esm/AddressInput/AddressInput.mjs.map +1 -1
- package/dist/esm/AnnotationInput/AnnotationInput.mjs +2 -2
- package/dist/esm/AnnotationInput/AnnotationInput.mjs.map +1 -1
- package/dist/esm/AsyncAutocomplete/AsyncAutocomplete.mjs +2 -2
- package/dist/esm/AsyncAutocomplete/AsyncAutocomplete.mjs.map +1 -1
- package/dist/esm/AttachmentArrayDisplay/AttachmentArrayDisplay.mjs +4 -4
- package/dist/esm/AttachmentArrayDisplay/AttachmentArrayDisplay.mjs.map +1 -1
- package/dist/esm/AttachmentArrayInput/AttachmentArrayInput.mjs +19 -19
- package/dist/esm/AttachmentArrayInput/AttachmentArrayInput.mjs.map +1 -1
- package/dist/esm/AttachmentButton/AttachmentButton.mjs +3 -3
- package/dist/esm/AttachmentButton/AttachmentButton.mjs.map +1 -1
- package/dist/esm/AttachmentDisplay/AttachmentDisplay.mjs +9 -9
- package/dist/esm/AttachmentDisplay/AttachmentDisplay.mjs.map +1 -1
- package/dist/esm/AttachmentInput/AttachmentInput.mjs +5 -5
- package/dist/esm/AttachmentInput/AttachmentInput.mjs.map +1 -1
- package/dist/esm/BackboneElementDisplay/BackboneElementDisplay.mjs +6 -6
- package/dist/esm/BackboneElementDisplay/BackboneElementDisplay.mjs.map +1 -1
- package/dist/esm/BackboneElementInput/BackboneElementInput.mjs +7 -7
- package/dist/esm/BackboneElementInput/BackboneElementInput.mjs.map +1 -1
- package/dist/esm/CalendarInput/CalendarInput.mjs +18 -18
- package/dist/esm/CalendarInput/CalendarInput.mjs.map +1 -1
- package/dist/esm/CheckboxFormSection/CheckboxFormSection.mjs +5 -5
- package/dist/esm/CheckboxFormSection/CheckboxFormSection.mjs.map +1 -1
- package/dist/esm/CodeInput/CodeInput.mjs +2 -2
- package/dist/esm/CodeInput/CodeInput.mjs.map +1 -1
- package/dist/esm/CodeableConceptDisplay/CodeableConceptDisplay.mjs +2 -2
- package/dist/esm/CodeableConceptDisplay/CodeableConceptDisplay.mjs.map +1 -1
- package/dist/esm/CodeableConceptInput/CodeableConceptInput.mjs +2 -2
- package/dist/esm/CodeableConceptInput/CodeableConceptInput.mjs.map +1 -1
- package/dist/esm/CodingDisplay/CodingDisplay.mjs +2 -2
- package/dist/esm/CodingDisplay/CodingDisplay.mjs.map +1 -1
- package/dist/esm/CodingInput/CodingInput.mjs +2 -2
- package/dist/esm/CodingInput/CodingInput.mjs.map +1 -1
- package/dist/esm/ContactDetailDisplay/ContactDetailDisplay.mjs +3 -3
- package/dist/esm/ContactDetailDisplay/ContactDetailDisplay.mjs.map +1 -1
- package/dist/esm/ContactDetailInput/ContactDetailInput.mjs +4 -4
- package/dist/esm/ContactDetailInput/ContactDetailInput.mjs.map +1 -1
- package/dist/esm/ContactPointDisplay/ContactPointDisplay.mjs +2 -2
- package/dist/esm/ContactPointDisplay/ContactPointDisplay.mjs.map +1 -1
- package/dist/esm/ContactPointInput/ContactPointInput.mjs +5 -5
- package/dist/esm/ContactPointInput/ContactPointInput.mjs.map +1 -1
- package/dist/esm/Container/Container.mjs +2 -2
- package/dist/esm/Container/Container.mjs.map +1 -1
- package/dist/esm/DateTimeInput/DateTimeInput.mjs +2 -2
- package/dist/esm/DateTimeInput/DateTimeInput.mjs.map +1 -1
- package/dist/esm/DefaultResourceTimeline/DefaultResourceTimeline.mjs +7 -19
- package/dist/esm/DefaultResourceTimeline/DefaultResourceTimeline.mjs.map +1 -1
- package/dist/esm/DescriptionList/DescriptionList.mjs +5 -5
- package/dist/esm/DescriptionList/DescriptionList.mjs.map +1 -1
- package/dist/esm/DiagnosticReportDisplay/DiagnosticReportDisplay.d.ts +2 -0
- package/dist/esm/DiagnosticReportDisplay/DiagnosticReportDisplay.mjs +56 -52
- package/dist/esm/DiagnosticReportDisplay/DiagnosticReportDisplay.mjs.map +1 -1
- package/dist/esm/DiagnosticReportDisplay/DiagnosticReportDisplay.stories.d.ts +1 -0
- package/dist/esm/Document/Document.mjs +3 -3
- package/dist/esm/Document/Document.mjs.map +1 -1
- package/dist/esm/EncounterTimeline/EncounterTimeline.mjs +8 -25
- package/dist/esm/EncounterTimeline/EncounterTimeline.mjs.map +1 -1
- package/dist/esm/ErrorBoundary/ErrorBoundary.mjs +4 -4
- package/dist/esm/ErrorBoundary/ErrorBoundary.mjs.map +1 -1
- package/dist/esm/ExtensionInput/ExtensionInput.mjs +2 -2
- package/dist/esm/ExtensionInput/ExtensionInput.mjs.map +1 -1
- package/dist/esm/FhirPathDisplay/FhirPathDisplay.mjs +2 -2
- package/dist/esm/FhirPathDisplay/FhirPathDisplay.mjs.map +1 -1
- package/dist/esm/FhirPathTable/FhirPathTable.mjs +19 -19
- package/dist/esm/FhirPathTable/FhirPathTable.mjs.map +1 -1
- package/dist/esm/Form/Form.mjs +2 -2
- package/dist/esm/Form/Form.mjs.map +1 -1
- package/dist/esm/FormSection/FormSection.mjs +2 -2
- package/dist/esm/FormSection/FormSection.mjs.map +1 -1
- package/dist/esm/GoogleButton/GoogleButton.mjs +8 -6
- package/dist/esm/GoogleButton/GoogleButton.mjs.map +1 -1
- package/dist/esm/HumanNameDisplay/HumanNameDisplay.mjs +2 -2
- package/dist/esm/HumanNameDisplay/HumanNameDisplay.mjs.map +1 -1
- package/dist/esm/HumanNameInput/HumanNameInput.mjs +7 -7
- package/dist/esm/HumanNameInput/HumanNameInput.mjs.map +1 -1
- package/dist/esm/IdentifierDisplay/IdentifierDisplay.mjs +2 -2
- package/dist/esm/IdentifierDisplay/IdentifierDisplay.mjs.map +1 -1
- package/dist/esm/IdentifierInput/IdentifierInput.mjs +4 -4
- package/dist/esm/IdentifierInput/IdentifierInput.mjs.map +1 -1
- package/dist/esm/Logo/Logo.mjs +8 -8
- package/dist/esm/Logo/Logo.mjs.map +1 -1
- package/dist/esm/MedplumLink/MedplumLink.mjs +4 -4
- package/dist/esm/MedplumLink/MedplumLink.mjs.map +1 -1
- package/dist/esm/MedplumProvider/MedplumProvider.d.ts +8 -0
- package/dist/esm/MedplumProvider/MedplumProvider.mjs +19 -3
- package/dist/esm/MedplumProvider/MedplumProvider.mjs.map +1 -1
- package/dist/esm/MoneyDisplay/MoneyDisplay.mjs +2 -2
- package/dist/esm/MoneyDisplay/MoneyDisplay.mjs.map +1 -1
- package/dist/esm/MoneyInput/MoneyInput.mjs +4 -4
- package/dist/esm/MoneyInput/MoneyInput.mjs.map +1 -1
- package/dist/esm/NoteDisplay/NoteDisplay.d.ts +6 -0
- package/dist/esm/NoteDisplay/NoteDisplay.mjs +18 -0
- package/dist/esm/NoteDisplay/NoteDisplay.mjs.map +1 -0
- package/dist/esm/{ResourceDiffTable/ResourceDiffTable.stories.d.ts → NoteDisplay/NoteDisplay.stories.d.ts} +3 -1
- package/dist/esm/OperationOutcomeAlert/OperationOutcomeAlert.mjs +3 -3
- package/dist/esm/OperationOutcomeAlert/OperationOutcomeAlert.mjs.map +1 -1
- package/dist/esm/Panel/Panel.mjs +2 -2
- package/dist/esm/Panel/Panel.mjs.map +1 -1
- package/dist/esm/PatientTimeline/PatientTimeline.mjs +13 -20
- package/dist/esm/PatientTimeline/PatientTimeline.mjs.map +1 -1
- package/dist/esm/PeriodInput/PeriodInput.mjs +4 -4
- package/dist/esm/PeriodInput/PeriodInput.mjs.map +1 -1
- package/dist/esm/PlanDefinitionBuilder/PlanDefinitionBuilder.mjs +34 -34
- package/dist/esm/PlanDefinitionBuilder/PlanDefinitionBuilder.mjs.map +1 -1
- package/dist/esm/QuantityDisplay/QuantityDisplay.mjs +2 -2
- package/dist/esm/QuantityDisplay/QuantityDisplay.mjs.map +1 -1
- package/dist/esm/QuantityInput/QuantityInput.d.ts +1 -0
- package/dist/esm/QuantityInput/QuantityInput.mjs +14 -8
- package/dist/esm/QuantityInput/QuantityInput.mjs.map +1 -1
- package/dist/esm/QuantityInput/QuantityInput.stories.d.ts +7 -0
- package/dist/esm/QuestionnaireBuilder/QuestionnaireBuilder.mjs +31 -31
- package/dist/esm/QuestionnaireBuilder/QuestionnaireBuilder.mjs.map +1 -1
- package/dist/esm/QuestionnaireForm/QuestionnaireForm.mjs +33 -33
- package/dist/esm/QuestionnaireForm/QuestionnaireForm.mjs.map +1 -1
- package/dist/esm/RangeDisplay/RangeDisplay.mjs +2 -2
- package/dist/esm/RangeDisplay/RangeDisplay.mjs.map +1 -1
- package/dist/esm/RangeInput/RangeInput.mjs +4 -4
- package/dist/esm/RangeInput/RangeInput.mjs.map +1 -1
- package/dist/esm/RatioDisplay/RatioDisplay.mjs +4 -4
- package/dist/esm/RatioDisplay/RatioDisplay.mjs.map +1 -1
- package/dist/esm/RatioInput/RatioInput.mjs +4 -4
- package/dist/esm/RatioInput/RatioInput.mjs.map +1 -1
- package/dist/esm/ReferenceDisplay/ReferenceDisplay.mjs +3 -3
- package/dist/esm/ReferenceDisplay/ReferenceDisplay.mjs.map +1 -1
- package/dist/esm/ReferenceInput/ReferenceInput.mjs +4 -4
- package/dist/esm/ReferenceInput/ReferenceInput.mjs.map +1 -1
- package/dist/esm/ReferenceRangeEditor/ReferenceRangeEditor.d.ts +1 -2
- package/dist/esm/ReferenceRangeEditor/ReferenceRangeEditor.mjs +31 -31
- package/dist/esm/ReferenceRangeEditor/ReferenceRangeEditor.mjs.map +1 -1
- package/dist/esm/RequestGroupDisplay/RequestGroupDisplay.mjs +15 -15
- package/dist/esm/RequestGroupDisplay/RequestGroupDisplay.mjs.map +1 -1
- package/dist/esm/ResourceArrayDisplay/ResourceArrayDisplay.mjs +3 -3
- package/dist/esm/ResourceArrayDisplay/ResourceArrayDisplay.mjs.map +1 -1
- package/dist/esm/ResourceArrayInput/ResourceArrayInput.mjs +18 -18
- package/dist/esm/ResourceArrayInput/ResourceArrayInput.mjs.map +1 -1
- package/dist/esm/ResourceAvatar/ResourceAvatar.mjs +4 -4
- package/dist/esm/ResourceAvatar/ResourceAvatar.mjs.map +1 -1
- package/dist/esm/ResourceBadge/ResourceBadge.mjs +4 -4
- package/dist/esm/ResourceBadge/ResourceBadge.mjs.map +1 -1
- package/dist/esm/ResourceBlame/ResourceBlame.mjs +13 -13
- package/dist/esm/ResourceBlame/ResourceBlame.mjs.map +1 -1
- package/dist/esm/ResourceDiff/ResourceDiff.mjs +7 -7
- package/dist/esm/ResourceDiff/ResourceDiff.mjs.map +1 -1
- package/dist/esm/ResourceDiffTable/ResourceDiffTable.mjs +18 -18
- package/dist/esm/ResourceDiffTable/ResourceDiffTable.mjs.map +1 -1
- package/dist/esm/ResourceForm/ResourceForm.mjs +12 -12
- package/dist/esm/ResourceForm/ResourceForm.mjs.map +1 -1
- package/dist/esm/ResourceHistoryTable/ResourceHistoryTable.mjs +17 -17
- package/dist/esm/ResourceHistoryTable/ResourceHistoryTable.mjs.map +1 -1
- package/dist/esm/ResourceInput/ResourceInput.mjs +8 -8
- package/dist/esm/ResourceInput/ResourceInput.mjs.map +1 -1
- package/dist/esm/ResourceName/ResourceName.mjs +2 -2
- package/dist/esm/ResourceName/ResourceName.mjs.map +1 -1
- package/dist/esm/ResourcePropertyDisplay/ResourcePropertyDisplay.mjs +27 -27
- package/dist/esm/ResourcePropertyDisplay/ResourcePropertyDisplay.mjs.map +1 -1
- package/dist/esm/ResourcePropertyInput/ResourcePropertyInput.mjs +35 -35
- package/dist/esm/ResourcePropertyInput/ResourcePropertyInput.mjs.map +1 -1
- package/dist/esm/ResourceTable/ResourceTable.mjs +2 -2
- package/dist/esm/ResourceTable/ResourceTable.mjs.map +1 -1
- package/dist/esm/ResourceTimeline/ResourceTimeline.d.ts +2 -2
- package/dist/esm/ResourceTimeline/ResourceTimeline.mjs +67 -73
- package/dist/esm/ResourceTimeline/ResourceTimeline.mjs.map +1 -1
- package/dist/esm/Scheduler/Scheduler.mjs +22 -22
- package/dist/esm/Scheduler/Scheduler.mjs.map +1 -1
- package/dist/esm/SearchControl/SearchControl.mjs +49 -49
- package/dist/esm/SearchControl/SearchControl.mjs.map +1 -1
- package/dist/esm/SearchControl/SearchUtils.mjs +4 -4
- package/dist/esm/SearchControl/SearchUtils.mjs.map +1 -1
- package/dist/esm/SearchFieldEditor/SearchFieldEditor.mjs +25 -25
- package/dist/esm/SearchFieldEditor/SearchFieldEditor.mjs.map +1 -1
- package/dist/esm/SearchFilterEditor/SearchFilterEditor.mjs +37 -37
- package/dist/esm/SearchFilterEditor/SearchFilterEditor.mjs.map +1 -1
- package/dist/esm/SearchFilterValueDialog/SearchFilterValueDialog.mjs +6 -6
- package/dist/esm/SearchFilterValueDialog/SearchFilterValueDialog.mjs.map +1 -1
- package/dist/esm/SearchFilterValueDisplay/SearchFilterValueDisplay.mjs +4 -4
- package/dist/esm/SearchFilterValueDisplay/SearchFilterValueDisplay.mjs.map +1 -1
- package/dist/esm/SearchFilterValueInput/SearchFilterValueInput.mjs +8 -8
- package/dist/esm/SearchFilterValueInput/SearchFilterValueInput.mjs.map +1 -1
- package/dist/esm/SearchPopupMenu/SearchPopupMenu.mjs +62 -62
- package/dist/esm/SearchPopupMenu/SearchPopupMenu.mjs.map +1 -1
- package/dist/esm/ServiceRequestTimeline/ServiceRequestTimeline.mjs +9 -31
- package/dist/esm/ServiceRequestTimeline/ServiceRequestTimeline.mjs.map +1 -1
- package/dist/esm/StatusBadge/StatusBadge.mjs +2 -2
- package/dist/esm/StatusBadge/StatusBadge.mjs.map +1 -1
- package/dist/esm/Timeline/Timeline.mjs +20 -20
- package/dist/esm/Timeline/Timeline.mjs.map +1 -1
- package/dist/esm/TimingInput/TimingInput.mjs +19 -19
- package/dist/esm/TimingInput/TimingInput.mjs.map +1 -1
- package/dist/esm/ValueSetAutocomplete/ValueSetAutocomplete.mjs +2 -2
- package/dist/esm/ValueSetAutocomplete/ValueSetAutocomplete.mjs.map +1 -1
- package/dist/esm/auth/AuthenticationForm.mjs +22 -22
- package/dist/esm/auth/AuthenticationForm.mjs.map +1 -1
- package/dist/esm/auth/ChooseProfileForm.mjs +11 -11
- package/dist/esm/auth/ChooseProfileForm.mjs.map +1 -1
- package/dist/esm/auth/ChooseScopeForm.mjs +9 -9
- package/dist/esm/auth/ChooseScopeForm.mjs.map +1 -1
- package/dist/esm/auth/MfaForm.mjs +12 -12
- package/dist/esm/auth/MfaForm.mjs.map +1 -1
- package/dist/esm/auth/NewProjectForm.mjs +12 -12
- package/dist/esm/auth/NewProjectForm.mjs.map +1 -1
- package/dist/esm/auth/NewUserForm.mjs +22 -22
- package/dist/esm/auth/NewUserForm.mjs.map +1 -1
- package/dist/esm/auth/RegisterForm.mjs +5 -5
- package/dist/esm/auth/RegisterForm.mjs.map +1 -1
- package/dist/esm/auth/SignInForm.mjs +8 -8
- package/dist/esm/auth/SignInForm.mjs.map +1 -1
- package/dist/esm/index.min.mjs +1 -1
- package/dist/esm/index.mjs +1 -1
- package/dist/esm/node_modules/@tabler/icons/icons-react/dist/index.esm.mjs +6 -0
- package/dist/esm/node_modules/@tabler/icons/icons-react/dist/index.esm.mjs.map +1 -0
- package/dist/esm/useResource/useResource.mjs +3 -0
- package/dist/esm/useResource/useResource.mjs.map +1 -1
- package/package.json +20 -25
- package/rollup.config.mjs +0 -110
|
@@ -1 +1 @@
|
|
|
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 *\n * @param {KeyboardEvent} 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 *\n * @param {KeyboardEvent} 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 currentField = state.search.fields ?? [];\n const field = selectedRef.current?.value;\n if (field) {\n const newFields = [...currentField];\n const index = newFields.indexOf(field);\n swapFields(newFields, index, index - 1);\n\n setState({\n search: {\n ...state.search,\n fields: newFields,\n },\n });\n }\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 currentField = state.search.fields ?? [];\n const field = selectedRef.current?.value;\n if (field) {\n const newFields = [...currentField];\n const index = newFields.indexOf(field);\n swapFields(newFields, index, index + 1);\n\n setState({\n search: {\n ...state.search,\n fields: newFields,\n },\n });\n }\n }\n\n /**\n * Swaps two fields in the search.\n *\n * @param {number} i The index of the first field.\n * @param {number} 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\" closeButtonLabel=\"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 */\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
|
+
{"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 *\n * @param {KeyboardEvent} 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 *\n * @param {KeyboardEvent} 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 currentField = state.search.fields ?? [];\n const field = selectedRef.current?.value;\n if (field) {\n const newFields = [...currentField];\n const index = newFields.indexOf(field);\n swapFields(newFields, index, index - 1);\n\n setState({\n search: {\n ...state.search,\n fields: newFields,\n },\n });\n }\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 currentField = state.search.fields ?? [];\n const field = selectedRef.current?.value;\n if (field) {\n const newFields = [...currentField];\n const index = newFields.indexOf(field);\n swapFields(newFields, index, index + 1);\n\n setState({\n search: {\n ...state.search,\n fields: newFields,\n },\n });\n }\n }\n\n /**\n * Swaps two fields in the search.\n *\n * @param {number} i The index of the first field.\n * @param {number} 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\" closeButtonLabel=\"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 */\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":["React"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Modal, Group, Button, NativeSelect } from '@mantine/core';
|
|
2
2
|
import { stringify, globalSchema } from '@medplum/core';
|
|
3
|
-
import
|
|
3
|
+
import e__default, { useState, useRef, useEffect } from 'react';
|
|
4
4
|
import { setFilters, deleteFilter, buildFieldNameString, getOpString, getSearchOperators, addFilter } from '../SearchControl/SearchUtils.mjs';
|
|
5
5
|
import { SearchFilterValueDisplay } from '../SearchFilterValueDisplay/SearchFilterValueDisplay.mjs';
|
|
6
6
|
import { SearchFilterValueInput } from '../SearchFilterValueInput/SearchFilterValueInput.mjs';
|
|
@@ -22,24 +22,24 @@ function SearchFilterEditor(props) {
|
|
|
22
22
|
const resourceType = props.search.resourceType;
|
|
23
23
|
const searchParams = globalSchema.types[resourceType].searchParams;
|
|
24
24
|
const filters = search.filters || [];
|
|
25
|
-
return (
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
25
|
+
return (e__default.createElement(Modal, { title: "Filters", closeButtonLabel: "Close", size: 900, opened: props.visible, onClose: props.onCancel },
|
|
26
|
+
e__default.createElement("div", null,
|
|
27
|
+
e__default.createElement("table", null,
|
|
28
|
+
e__default.createElement("colgroup", null,
|
|
29
|
+
e__default.createElement("col", { style: { width: 200 } }),
|
|
30
|
+
e__default.createElement("col", { style: { width: 200 } }),
|
|
31
|
+
e__default.createElement("col", { style: { width: 380 } }),
|
|
32
|
+
e__default.createElement("col", { style: { width: 120 } })),
|
|
33
|
+
e__default.createElement("thead", null,
|
|
34
|
+
e__default.createElement("tr", null,
|
|
35
|
+
e__default.createElement("th", null, "Field"),
|
|
36
|
+
e__default.createElement("th", null, "Operation"),
|
|
37
|
+
e__default.createElement("th", null, "Value"),
|
|
38
|
+
e__default.createElement("th", null, "Actions"))),
|
|
39
|
+
e__default.createElement("tbody", null,
|
|
40
40
|
filters.map((filter, index) => {
|
|
41
41
|
if (index === editingIndex) {
|
|
42
|
-
return (
|
|
42
|
+
return (e__default.createElement(FilterRowInput, { key: `filter-${index}-${filters.length}-input`, resourceType: resourceType, searchParams: searchParams, defaultValue: filter, okText: "Save", onOk: (newFilter) => {
|
|
43
43
|
const newFilters = [...filters];
|
|
44
44
|
newFilters[index] = newFilter;
|
|
45
45
|
setSearch(setFilters(searchRef.current, newFilters));
|
|
@@ -47,23 +47,23 @@ function SearchFilterEditor(props) {
|
|
|
47
47
|
}, onCancel: () => setEditingIndex(-1) }));
|
|
48
48
|
}
|
|
49
49
|
else {
|
|
50
|
-
return (
|
|
50
|
+
return (e__default.createElement(FilterRowDisplay, { key: `filter-${index}-${filters.length}-display`, resourceType: resourceType, searchParams: searchParams, filter: filter, onEdit: () => setEditingIndex(index), onDelete: () => setSearch(deleteFilter(searchRef.current, index)) }));
|
|
51
51
|
}
|
|
52
52
|
}),
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
53
|
+
e__default.createElement(FilterRowInput, { resourceType: resourceType, searchParams: searchParams, okText: "Add", onOk: onAddFilter })))),
|
|
54
|
+
e__default.createElement(Group, { position: "right", mt: "xl" },
|
|
55
|
+
e__default.createElement(Button, { onClick: () => props.onOk(searchRef.current) }, "OK"))));
|
|
56
56
|
}
|
|
57
57
|
function FilterRowDisplay(props) {
|
|
58
58
|
const { filter } = props;
|
|
59
|
-
return (
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
59
|
+
return (e__default.createElement("tr", null,
|
|
60
|
+
e__default.createElement("td", null, buildFieldNameString(filter.code)),
|
|
61
|
+
e__default.createElement("td", null, getOpString(filter.operator)),
|
|
62
|
+
e__default.createElement("td", null,
|
|
63
|
+
e__default.createElement(SearchFilterValueDisplay, { resourceType: props.resourceType, filter: filter })),
|
|
64
|
+
e__default.createElement("td", null,
|
|
65
|
+
e__default.createElement(Button, { compact: true, variant: "outline", onClick: props.onEdit }, "Edit"),
|
|
66
|
+
e__default.createElement(Button, { compact: true, variant: "outline", onClick: props.onDelete }, "Delete"))));
|
|
67
67
|
}
|
|
68
68
|
function FilterRowInput(props) {
|
|
69
69
|
const [value, setValue] = useState(props.defaultValue ?? {});
|
|
@@ -80,17 +80,17 @@ function FilterRowInput(props) {
|
|
|
80
80
|
}
|
|
81
81
|
const searchParam = props.searchParams[value.code];
|
|
82
82
|
const operators = searchParam && getSearchOperators(searchParam);
|
|
83
|
-
return (
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
value.code && value.operator && value.value && (
|
|
83
|
+
return (e__default.createElement("tr", null,
|
|
84
|
+
e__default.createElement("td", null,
|
|
85
|
+
e__default.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
|
+
e__default.createElement("td", null, operators && (e__default.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
|
+
e__default.createElement("td", null, searchParam && value.operator && (e__default.createElement(SearchFilterValueInput, { resourceType: props.resourceType, searchParam: searchParam, defaultValue: value.value, onChange: setFilterValue }))),
|
|
88
|
+
e__default.createElement("td", null,
|
|
89
|
+
value.code && value.operator && value.value && (e__default.createElement(Button, { compact: true, variant: "outline", onClick: () => {
|
|
90
90
|
props.onOk(valueRef.current);
|
|
91
91
|
setValue({});
|
|
92
92
|
} }, props.okText)),
|
|
93
|
-
props.onCancel && (
|
|
93
|
+
props.onCancel && (e__default.createElement(Button, { compact: true, variant: "outline", onClick: props.onCancel }, "Cancel")))));
|
|
94
94
|
}
|
|
95
95
|
|
|
96
96
|
export { SearchFilterEditor };
|
|
@@ -1 +1 @@
|
|
|
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 title=\"Filters\" closeButtonLabel=\"Close\" size={900} opened={props.visible} onClose={props.onCancel}>\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":"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"}
|
|
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 title=\"Filters\" closeButtonLabel=\"Close\" size={900} opened={props.visible} onClose={props.onCancel}>\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":["React"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Modal, Button } from '@mantine/core';
|
|
2
|
-
import
|
|
2
|
+
import e__default, { useState } from 'react';
|
|
3
3
|
import { Form } from '../Form/Form.mjs';
|
|
4
4
|
import { SearchFilterValueInput } from '../SearchFilterValueInput/SearchFilterValueInput.mjs';
|
|
5
5
|
|
|
@@ -11,11 +11,11 @@ function SearchFilterValueDialog(props) {
|
|
|
11
11
|
function onOk() {
|
|
12
12
|
props.onOk({ ...props.filter, value });
|
|
13
13
|
}
|
|
14
|
-
return (
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
14
|
+
return (e__default.createElement(Modal, { title: props.title, size: "xl", opened: props.visible, onClose: props.onCancel },
|
|
15
|
+
e__default.createElement("div", { style: { width: 500 } },
|
|
16
|
+
e__default.createElement(Form, { onSubmit: onOk },
|
|
17
|
+
e__default.createElement(SearchFilterValueInput, { resourceType: props.resourceType, searchParam: props.searchParam, defaultValue: value, autoFocus: true, onChange: setValue }))),
|
|
18
|
+
e__default.createElement(Button, { onClick: onOk }, "OK")));
|
|
19
19
|
}
|
|
20
20
|
|
|
21
21
|
export { SearchFilterValueDialog };
|
|
@@ -1 +1 @@
|
|
|
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,
|
|
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":["React"],"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,QACEA,UAAC,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,QAAAA,UAAA,CAAA,aAAA,CAAA,KAAA,EAAA,EAAK,KAAK,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,EAAA;AACxB,YAAAA,UAAA,CAAA,aAAA,CAAC,IAAI,EAAA,EAAC,QAAQ,EAAE,IAAI,EAAA;gBAClBA,UAAC,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;QACNA,UAAC,CAAA,aAAA,CAAA,MAAM,IAAC,OAAO,EAAE,IAAI,EAAa,EAAA,IAAA,CAAA,CAC5B,EACR;AACJ;;;;"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { globalSchema, getSearchParameterDetails, SearchParameterType, formatDateTime } from '@medplum/core';
|
|
2
|
-
import
|
|
2
|
+
import e__default from 'react';
|
|
3
3
|
import { ResourceName } from '../ResourceName/ResourceName.mjs';
|
|
4
4
|
|
|
5
5
|
function SearchFilterValueDisplay(props) {
|
|
@@ -7,14 +7,14 @@ function SearchFilterValueDisplay(props) {
|
|
|
7
7
|
const searchParam = globalSchema.types[resourceType]?.searchParams?.[filter.code];
|
|
8
8
|
if (searchParam) {
|
|
9
9
|
if (searchParam.type === 'reference') {
|
|
10
|
-
return
|
|
10
|
+
return e__default.createElement(ResourceName, { value: { reference: filter.value } });
|
|
11
11
|
}
|
|
12
12
|
const searchParamDetails = getSearchParameterDetails(resourceType, searchParam);
|
|
13
13
|
if (filter.code === '_lastUpdated' || searchParamDetails.type === SearchParameterType.DATETIME) {
|
|
14
|
-
return
|
|
14
|
+
return e__default.createElement(e__default.Fragment, null, formatDateTime(filter.value));
|
|
15
15
|
}
|
|
16
16
|
}
|
|
17
|
-
return
|
|
17
|
+
return e__default.createElement(e__default.Fragment, null, filter.value);
|
|
18
18
|
}
|
|
19
19
|
|
|
20
20
|
export { SearchFilterValueDisplay };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SearchFilterValueDisplay.mjs","sources":["../../../src/SearchFilterValueDisplay/SearchFilterValueDisplay.tsx"],"sourcesContent":["import { Filter, formatDateTime, getSearchParameterDetails, globalSchema, SearchParameterType } 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 (searchParam.type === 'reference') {\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":";;;;AASM,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,IAAI,WAAW,CAAC,IAAI,KAAK,WAAW,EAAE;AACpC,YAAA,
|
|
1
|
+
{"version":3,"file":"SearchFilterValueDisplay.mjs","sources":["../../../src/SearchFilterValueDisplay/SearchFilterValueDisplay.tsx"],"sourcesContent":["import { Filter, formatDateTime, getSearchParameterDetails, globalSchema, SearchParameterType } 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 (searchParam.type === 'reference') {\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":["React"],"mappings":";;;;AASM,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,IAAI,WAAW,CAAC,IAAI,KAAK,WAAW,EAAE;AACpC,YAAA,OAAOA,UAAC,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,OAAOA,UAAA,CAAA,aAAA,CAAAA,UAAA,CAAA,QAAA,EAAA,IAAA,EAAG,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC,CAAI,CAAC;AAC5C,SAAA;AACF,KAAA;AAED,IAAA,OAAOA,UAAG,CAAA,aAAA,CAAAA,UAAA,CAAA,QAAA,EAAA,IAAA,EAAA,MAAM,CAAC,KAAK,CAAI,CAAC;AAC7B;;;;"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { TextInput, Checkbox } from '@mantine/core';
|
|
2
2
|
import { getSearchParameterDetails, SearchParameterType } from '@medplum/core';
|
|
3
|
-
import
|
|
3
|
+
import e__default from 'react';
|
|
4
4
|
import { DateTimeInput } from '../DateTimeInput/DateTimeInput.mjs';
|
|
5
5
|
import { QuantityInput } from '../QuantityInput/QuantityInput.mjs';
|
|
6
6
|
import { ReferenceInput } from '../ReferenceInput/ReferenceInput.mjs';
|
|
@@ -10,7 +10,7 @@ function SearchFilterValueInput(props) {
|
|
|
10
10
|
const name = 'filter-value';
|
|
11
11
|
switch (details.type) {
|
|
12
12
|
case SearchParameterType.REFERENCE:
|
|
13
|
-
return (
|
|
13
|
+
return (e__default.createElement(ReferenceInput, { name: name, defaultValue: { reference: props.defaultValue }, targetTypes: props.searchParam?.target, onChange: (newReference) => {
|
|
14
14
|
if (newReference) {
|
|
15
15
|
props.onChange(newReference.reference);
|
|
16
16
|
}
|
|
@@ -19,15 +19,15 @@ function SearchFilterValueInput(props) {
|
|
|
19
19
|
}
|
|
20
20
|
} }));
|
|
21
21
|
case SearchParameterType.BOOLEAN:
|
|
22
|
-
return (
|
|
22
|
+
return (e__default.createElement(Checkbox, { name: name, "data-testid": name, defaultChecked: props.defaultValue === 'true', onChange: (e) => props.onChange(e.currentTarget.checked.toString()) }));
|
|
23
23
|
case SearchParameterType.DATE:
|
|
24
|
-
return (
|
|
24
|
+
return (e__default.createElement(TextInput, { type: "date", name: name, "data-testid": name, defaultValue: props.defaultValue, onChange: (e) => props.onChange(e.currentTarget.value) }));
|
|
25
25
|
case SearchParameterType.DATETIME:
|
|
26
|
-
return
|
|
26
|
+
return e__default.createElement(DateTimeInput, { name: name, defaultValue: props.defaultValue, onChange: props.onChange });
|
|
27
27
|
case SearchParameterType.NUMBER:
|
|
28
|
-
return (
|
|
28
|
+
return (e__default.createElement(TextInput, { type: "number", name: name, "data-testid": name, defaultValue: props.defaultValue, onChange: (e) => props.onChange(e.currentTarget.value) }));
|
|
29
29
|
case SearchParameterType.QUANTITY:
|
|
30
|
-
return (
|
|
30
|
+
return (e__default.createElement(QuantityInput, { name: name, defaultValue: tryParseQuantity(props.defaultValue), onChange: (newQuantity) => {
|
|
31
31
|
if (newQuantity) {
|
|
32
32
|
props.onChange(`${newQuantity.value}`);
|
|
33
33
|
}
|
|
@@ -36,7 +36,7 @@ function SearchFilterValueInput(props) {
|
|
|
36
36
|
}
|
|
37
37
|
} }));
|
|
38
38
|
default:
|
|
39
|
-
return (
|
|
39
|
+
return (e__default.createElement(TextInput, { name: name, "data-testid": name, defaultValue: props.defaultValue, autoFocus: props.autoFocus, onChange: (e) => props.onChange(e.currentTarget.value), placeholder: "Search value" }));
|
|
40
40
|
}
|
|
41
41
|
}
|
|
42
42
|
function tryParseQuantity(value) {
|
|
@@ -1 +1 @@
|
|
|
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":";;;;;;;AAgBM,SAAU,sBAAsB,CAAC,KAAkC,EAAA;AACvE,IAAA,MAAM,OAAO,GAAG,yBAAyB,CAAC,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;IACjF,MAAM,IAAI,GAAG,cAAc,CAAC;IAE5B,QAAQ,OAAO,CAAC,IAAI;QAClB,KAAK,mBAAmB,CAAC,SAAS;AAChC,YAAA,
|
|
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":["React"],"mappings":"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"}
|