@medplum/react 2.0.21 → 2.0.23
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 +173 -128
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/cjs/index.min.cjs +1 -1
- package/dist/esm/AttachmentButton/AttachmentButton.mjs +1 -2
- package/dist/esm/AttachmentButton/AttachmentButton.mjs.map +1 -1
- package/dist/esm/DateTimeInput/DateTimeInput.mjs +1 -0
- package/dist/esm/DateTimeInput/DateTimeInput.mjs.map +1 -1
- package/dist/esm/FhirPathTable/FhirPathTable.mjs +2 -0
- package/dist/esm/FhirPathTable/FhirPathTable.mjs.map +1 -1
- package/dist/esm/Form/FormUtils.mjs +2 -1
- package/dist/esm/Form/FormUtils.mjs.map +1 -1
- package/dist/esm/GoogleButton/GoogleButton.mjs +2 -2
- package/dist/esm/GoogleButton/GoogleButton.mjs.map +1 -1
- package/dist/esm/MedplumProvider/MedplumProvider.mjs +4 -0
- package/dist/esm/MedplumProvider/MedplumProvider.mjs.map +1 -1
- package/dist/esm/PlanDefinitionBuilder/PlanDefinitionBuilder.mjs +2 -1
- package/dist/esm/PlanDefinitionBuilder/PlanDefinitionBuilder.mjs.map +1 -1
- package/dist/esm/QuestionnaireBuilder/QuestionnaireBuilder.mjs +3 -2
- package/dist/esm/QuestionnaireBuilder/QuestionnaireBuilder.mjs.map +1 -1
- package/dist/esm/ReferenceRangeEditor/ReferenceRangeEditor.mjs +13 -5
- package/dist/esm/ReferenceRangeEditor/ReferenceRangeEditor.mjs.map +1 -1
- package/dist/esm/ResourceName/ResourceName.mjs +0 -5
- package/dist/esm/ResourceName/ResourceName.mjs.map +1 -1
- package/dist/esm/ResourcePropertyDisplay/ResourcePropertyDisplay.mjs +6 -3
- package/dist/esm/ResourcePropertyDisplay/ResourcePropertyDisplay.mjs.map +1 -1
- package/dist/esm/SearchControl/SearchControl.mjs +2 -1
- package/dist/esm/SearchControl/SearchControl.mjs.map +1 -1
- package/dist/esm/SearchControl/SearchUtils.mjs +77 -54
- package/dist/esm/SearchControl/SearchUtils.mjs.map +1 -1
- package/dist/esm/SearchFieldEditor/SearchFieldEditor.mjs +6 -7
- package/dist/esm/SearchFieldEditor/SearchFieldEditor.mjs.map +1 -1
- package/dist/esm/ValueSetAutocomplete/ValueSetAutocomplete.mjs +3 -0
- package/dist/esm/ValueSetAutocomplete/ValueSetAutocomplete.mjs.map +1 -1
- package/dist/esm/auth/SignInForm.mjs +6 -2
- package/dist/esm/auth/SignInForm.mjs.map +1 -1
- package/dist/esm/index.min.mjs +1 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/createReactComponent.mjs +1 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/createReactComponent.mjs.map +1 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/defaultAttributes.mjs +1 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/defaultAttributes.mjs.map +1 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconAdjustmentsHorizontal.mjs +1 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconAdjustmentsHorizontal.mjs.map +1 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconAlertCircle.mjs +1 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconAlertCircle.mjs.map +1 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconBleach.mjs +1 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconBleach.mjs.map +1 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconBleachOff.mjs +1 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconBleachOff.mjs.map +1 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconBoxMultiple.mjs +1 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconBoxMultiple.mjs.map +1 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconBracketsContain.mjs +1 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconBracketsContain.mjs.map +1 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconBucket.mjs +1 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconBucket.mjs.map +1 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconBucketOff.mjs +1 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconBucketOff.mjs.map +1 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconCalendar.mjs +1 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconCalendar.mjs.map +1 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconCheck.mjs +1 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconCheck.mjs.map +1 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconCheckbox.mjs +1 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconCheckbox.mjs.map +1 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconChevronDown.mjs +1 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconChevronDown.mjs.map +1 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconCircleMinus.mjs +1 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconCircleMinus.mjs.map +1 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconCirclePlus.mjs +1 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconCirclePlus.mjs.map +1 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconCloudUpload.mjs +1 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconCloudUpload.mjs.map +1 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconColumns.mjs +1 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconColumns.mjs.map +1 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconCurrencyDollar.mjs +1 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconCurrencyDollar.mjs.map +1 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconDots.mjs +1 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconDots.mjs.map +1 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconEdit.mjs +1 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconEdit.mjs.map +1 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconEqual.mjs +1 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconEqual.mjs.map +1 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconEqualNot.mjs +1 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconEqualNot.mjs.map +1 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconFileAlert.mjs +1 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconFileAlert.mjs.map +1 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconFilePlus.mjs +1 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconFilePlus.mjs.map +1 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconFilter.mjs +1 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconFilter.mjs.map +1 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconListDetails.mjs +1 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconListDetails.mjs.map +1 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconLogout.mjs +1 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconLogout.mjs.map +1 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconMathGreater.mjs +1 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconMathGreater.mjs.map +1 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconMathLower.mjs +1 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconMathLower.mjs.map +1 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconMessage.mjs +1 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconMessage.mjs.map +1 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconPin.mjs +1 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconPin.mjs.map +1 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconPinnedOff.mjs +1 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconPinnedOff.mjs.map +1 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconPlus.mjs +1 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconPlus.mjs.map +1 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconSearch.mjs +1 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconSearch.mjs.map +1 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconSettings.mjs +1 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconSettings.mjs.map +1 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconSortAscending.mjs +1 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconSortAscending.mjs.map +1 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconSortDescending.mjs +1 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconSortDescending.mjs.map +1 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconSquare.mjs +1 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconSquare.mjs.map +1 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconSwitchHorizontal.mjs +1 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconSwitchHorizontal.mjs.map +1 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconTableExport.mjs +1 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconTableExport.mjs.map +1 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconTrash.mjs +1 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconTrash.mjs.map +1 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconX.mjs +1 -1
- package/dist/esm/node_modules/@tabler/icons-react/dist/esm/icons/IconX.mjs.map +1 -1
- package/dist/esm/useResource/useResource.mjs +1 -0
- package/dist/esm/useResource/useResource.mjs.map +1 -1
- package/dist/esm/utils/script.mjs +1 -0
- package/dist/esm/utils/script.mjs.map +1 -1
- package/dist/types/FhirPathTable/FhirPathTable.d.ts +2 -0
- package/dist/types/Form/FormUtils.d.ts +1 -0
- package/dist/types/MedplumProvider/MedplumProvider.d.ts +4 -0
- package/dist/types/ResourceName/ResourceName.d.ts +0 -5
- package/dist/types/ResourcePropertyDisplay/ResourcePropertyDisplay.d.ts +4 -2
- package/dist/types/SearchControl/SearchControl.d.ts +2 -0
- package/dist/types/SearchControl/SearchUtils.d.ts +64 -44
- package/dist/types/ValueSetAutocomplete/ValueSetAutocomplete.d.ts +3 -0
- package/dist/types/auth/SignInForm.d.ts +2 -0
- package/dist/types/useResource/useResource.d.ts +1 -0
- package/dist/types/utils/script.d.ts +1 -0
- package/package.json +12 -12
|
@@ -66,6 +66,8 @@ function ReferenceRangeEditor(props) {
|
|
|
66
66
|
}
|
|
67
67
|
/**
|
|
68
68
|
* Add/Remove/Update specific Qualified Intervals
|
|
69
|
+
* @param groupId The reference range group ID.
|
|
70
|
+
* @param changedInterval The updated reference range interval.
|
|
69
71
|
*/
|
|
70
72
|
function changeInterval(groupId, changedInterval) {
|
|
71
73
|
setIntervalGroups((groups) => {
|
|
@@ -145,7 +147,9 @@ function ReferenceRangeGroupEditor(props) {
|
|
|
145
147
|
React.createElement(IconCirclePlus, null)))));
|
|
146
148
|
}
|
|
147
149
|
/**
|
|
148
|
-
* Render the "filters" section of the IntervalGroup.
|
|
150
|
+
* Render the "filters" section of the IntervalGroup.
|
|
151
|
+
* @param props The ReferenceRangeGroupFilter React props.
|
|
152
|
+
* @returns The ReferenceRangeGroupFilter React node.
|
|
149
153
|
*/
|
|
150
154
|
function ReferenceRangeGroupFilters(props) {
|
|
151
155
|
const { intervalGroup, onChange } = props;
|
|
@@ -209,7 +213,7 @@ function ReferenceRangeGroupFilters(props) {
|
|
|
209
213
|
* Helper function that assigns ids to each qualifiedInterval of an ObservationDefinition
|
|
210
214
|
* @param definition An ObservationDefinition
|
|
211
215
|
* @param setIntervalId React setState function for the intervalId
|
|
212
|
-
* @returns
|
|
216
|
+
* @returns The updated observation definition.
|
|
213
217
|
*/
|
|
214
218
|
function ensureQualifiedIntervalKeys(definition, setIntervalId) {
|
|
215
219
|
const intervals = definition.qualifiedInterval || [];
|
|
@@ -234,7 +238,10 @@ function ensureQualifiedIntervalKeys(definition, setIntervalId) {
|
|
|
234
238
|
}
|
|
235
239
|
/**
|
|
236
240
|
* Group all ObservationDefinitionQualifiedIntervals based on the values of their "filter" properties,
|
|
237
|
-
* so that similar ranges can be grouped together
|
|
241
|
+
* so that similar ranges can be grouped together.
|
|
242
|
+
* @param intervals Array of reference range intervals.
|
|
243
|
+
* @param setGroupId Callback to set the group ID.
|
|
244
|
+
* @returns The grouped intervals.
|
|
238
245
|
*/
|
|
239
246
|
function groupQualifiedIntervals(intervals, setGroupId) {
|
|
240
247
|
let groupId = 1;
|
|
@@ -254,8 +261,9 @@ function groupQualifiedIntervals(intervals, setGroupId) {
|
|
|
254
261
|
return Object.values(groups);
|
|
255
262
|
}
|
|
256
263
|
/**
|
|
257
|
-
* Generates a unique string for each set of filter values, so that similarly filtered intervals can be grouped together
|
|
258
|
-
* @
|
|
264
|
+
* Generates a unique string for each set of filter values, so that similarly filtered intervals can be grouped together.
|
|
265
|
+
* @param interval The reference range interval.
|
|
266
|
+
* @returns A "group key" that corresponds to the value of the interval filter properties.
|
|
259
267
|
*/
|
|
260
268
|
function generateGroupKey(interval) {
|
|
261
269
|
const results = [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ReferenceRangeEditor.mjs","sources":["../../../src/ReferenceRangeEditor/ReferenceRangeEditor.tsx"],"sourcesContent":["import { ActionIcon, Button, createStyles, Divider, Group, NativeSelect, Stack, Text, TextInput } from '@mantine/core';\nimport { formatRange, getCodeBySystem } from '@medplum/core';\nimport { CodeableConcept, ObservationDefinition, ObservationDefinitionQualifiedInterval } from '@medplum/fhirtypes';\nimport { IconCircleMinus, IconCirclePlus } from '@tabler/icons-react';\nimport React, { useEffect, useState } from 'react';\nimport { Container } from '../Container/Container';\nimport { Form } from '../Form/Form';\nimport { RangeInput } from '../RangeInput/RangeInput';\nimport { killEvent } from '../utils/dom';\n\nconst useStyles = createStyles((theme) => ({\n section: {\n position: 'relative',\n margin: '4px 4px 8px 0',\n padding: '6px 12px 16px 6px',\n border: `1.5px solid ${theme.colors.gray[3]}`,\n borderRadius: theme.radius.sm,\n transition: 'all 0.1s',\n },\n}));\n\n// Properties of qualified intervals used for grouping\nconst intervalFilters = ['gender', 'age', 'gestationalAge', 'context', 'appliesTo'] as const;\n\nexport interface ReferenceRangeEditorProps {\n definition: ObservationDefinition;\n onSubmit: (result: ObservationDefinition) => void;\n}\n\n// Helper type that groups of qualified intervals by equal filter criteria\ntype IntervalGroup = {\n id: string;\n filters: Record<string, any>;\n intervals: ObservationDefinitionQualifiedInterval[];\n};\n\nconst defaultProps: ReferenceRangeEditorProps = {\n definition: { resourceType: 'ObservationDefinition' },\n onSubmit: () => {\n return;\n },\n};\n\nexport function ReferenceRangeEditor(props: ReferenceRangeEditorProps): JSX.Element {\n props = Object.assign(defaultProps, props);\n const defaultDefinition = props.definition;\n\n const [intervalGroups, setIntervalGroups] = useState<IntervalGroup[]>([]);\n const [groupId, setGroupId] = useState(1);\n const [intervalId, setIntervalId] = useState(1);\n\n useEffect(() => {\n const definition = ensureQualifiedIntervalKeys(defaultDefinition, setIntervalId);\n setIntervalGroups(groupQualifiedIntervals(definition.qualifiedInterval || [], setGroupId));\n }, [defaultDefinition]);\n\n return (\n <Form testid=\"reference-range-editor\" onSubmit={submitDefinition}>\n <Stack>\n {intervalGroups.map((intervalGroup) => (\n <ReferenceRangeGroupEditor\n unit={getUnitString(defaultDefinition.quantitativeDetails?.unit)}\n onChange={changeInterval}\n onAdd={addInterval}\n onRemove={removeInterval}\n onRemoveGroup={removeGroup}\n key={`group-${intervalGroup.id}`}\n intervalGroup={intervalGroup}\n />\n ))}\n </Stack>\n <ActionIcon\n title=\"Add Group\"\n size=\"sm\"\n onClick={(e: React.MouseEvent) => {\n killEvent(e);\n addGroup({ id: `group-id-${groupId}`, filters: {} as IntervalGroup['filters'], intervals: [] });\n setGroupId((id) => id + 1);\n }}\n >\n <IconCirclePlus />\n </ActionIcon>\n\n <Group position=\"right\">\n <Button type=\"submit\">Save</Button>\n </Group>\n </Form>\n );\n\n /**\n * Submit qualified intervals\n */\n\n function submitDefinition(): void {\n const qualifiedInterval = intervalGroups\n .flatMap((group) => group.intervals)\n .filter((interval) => !isEmptyInterval(interval));\n props.onSubmit({ ...defaultDefinition, qualifiedInterval });\n }\n\n /**\n * Add Remove Interval Groups\n */\n\n function addGroup(addedGroup: IntervalGroup): void {\n setIntervalGroups((currentGroups) => [...currentGroups, addedGroup]);\n }\n\n function removeGroup(removedGroup: IntervalGroup): void {\n setIntervalGroups((currentGroups) => currentGroups.filter((group) => group.id !== removedGroup.id));\n }\n\n /**\n * Add/Remove/Update specific Qualified Intervals\n */\n function changeInterval(groupId: string, changedInterval: ObservationDefinitionQualifiedInterval): void {\n setIntervalGroups((groups) => {\n groups = [...groups];\n const currentGroup = groups.find((g) => g.id === groupId);\n\n const index = currentGroup?.intervals?.findIndex((interval) => interval.id === changedInterval.id);\n if (index !== undefined && currentGroup?.intervals?.[index]) {\n currentGroup.intervals[index] = changedInterval;\n }\n return groups;\n });\n }\n\n function addInterval(groupId: string, addedInterval: ObservationDefinitionQualifiedInterval): void {\n if (addedInterval.id === undefined) {\n addedInterval.id = `id-${intervalId}`;\n setIntervalId((id) => id + 1);\n }\n setIntervalGroups((groups) => {\n groups = [...groups];\n const currentGroupIndex = groups.findIndex((g) => g.id === groupId);\n\n if (currentGroupIndex !== -1) {\n const currentGroup = { ...groups[currentGroupIndex] };\n addedInterval = { ...addedInterval, ...currentGroup.filters };\n currentGroup.intervals = [...currentGroup.intervals, addedInterval];\n groups[currentGroupIndex] = currentGroup;\n }\n\n return groups;\n });\n }\n\n function removeInterval(groupId: string, removedInterval: ObservationDefinitionQualifiedInterval): void {\n setIntervalGroups((groups) => {\n groups = [...groups];\n const currentGroup = groups.find((g) => g.id === groupId);\n if (currentGroup) {\n currentGroup.intervals = currentGroup.intervals.filter((interval) => interval.id !== removedInterval.id);\n }\n return groups;\n });\n }\n}\n\n/**\n * Helper component that renders an \"interval group\", which is a set of ObservationDefinitionQualifiedIntervals\n * that have the same filter values\n */\nexport interface ReferenceRangeGroupEditorProps {\n intervalGroup: IntervalGroup;\n unit: string | undefined;\n onChange: (groupId: string, changed: ObservationDefinitionQualifiedInterval) => void;\n onAdd: (groupId: string, added: ObservationDefinitionQualifiedInterval) => void;\n onRemove: (groupId: string, removed: ObservationDefinitionQualifiedInterval) => void;\n onRemoveGroup: (removedGroup: IntervalGroup) => void;\n}\n\nexport function ReferenceRangeGroupEditor(props: ReferenceRangeGroupEditorProps): JSX.Element {\n const { intervalGroup, unit } = props;\n const { classes } = useStyles();\n return (\n <Container data-testid={intervalGroup.id} className={classes.section}>\n <Stack spacing={'lg'}>\n <Group position=\"right\">\n <ActionIcon\n title=\"Remove Group\"\n data-testid={`remove-group-button-${intervalGroup.id}`}\n key={`remove-group-button-${intervalGroup.id}`}\n size=\"sm\"\n onClick={(e: React.MouseEvent) => {\n killEvent(e);\n props.onRemoveGroup(intervalGroup);\n }}\n >\n <IconCircleMinus />\n </ActionIcon>\n </Group>\n <ReferenceRangeGroupFilters intervalGroup={intervalGroup} onChange={props.onChange} />\n <Divider />\n {intervalGroup.intervals.map((interval) => (\n <Stack key={`interval-${interval.id}`} spacing={'xs'}>\n <Group>\n <TextInput\n key={`condition-${interval.id}`}\n data-testid={`condition-${interval.id}`}\n defaultValue={interval.condition}\n label={'Condition: '}\n size={'sm'}\n onChange={(e) => {\n killEvent(e);\n props.onChange(intervalGroup.id, { ...interval, condition: e.currentTarget.value.trim() });\n }}\n />\n <ActionIcon\n title=\"Remove Interval\"\n size=\"sm\"\n key={`remove-interval-${interval.id}`}\n data-testid={`remove-interval-${interval.id}`}\n onClick={(e: React.MouseEvent) => {\n killEvent(e);\n props.onRemove(intervalGroup.id, interval);\n }}\n >\n <IconCircleMinus />\n </ActionIcon>\n </Group>\n\n <RangeInput\n onChange={(range) => {\n props.onChange(intervalGroup.id, { ...interval, range });\n }}\n key={`range-${interval.id}`}\n name={`range-${interval.id}`}\n defaultValue={interval.range}\n />\n </Stack>\n ))}\n <ActionIcon\n title=\"Add Interval\"\n size=\"sm\"\n onClick={(e: React.MouseEvent) => {\n killEvent(e);\n props.onAdd(intervalGroup.id, {\n range: {\n low: { unit },\n high: { unit },\n },\n });\n }}\n >\n <IconCirclePlus />\n </ActionIcon>\n </Stack>\n </Container>\n );\n}\n\ninterface ReferenceRangeGroupFiltersProps {\n intervalGroup: IntervalGroup;\n onChange: ReferenceRangeGroupEditorProps['onChange'];\n}\n\n/**\n * Render the \"filters\" section of the IntervalGroup. Also populates some initial\n */\nfunction ReferenceRangeGroupFilters(props: ReferenceRangeGroupFiltersProps): JSX.Element {\n const { intervalGroup, onChange } = props;\n\n // Pre-populate the units of the age filter\n if (!intervalGroup.filters.age) {\n intervalGroup.filters.age = {};\n }\n for (const key of ['low', 'high']) {\n if (!intervalGroup.filters.age[key]?.unit) {\n intervalGroup.filters.age[key] = {\n ...intervalGroup.filters.age[key],\n unit: 'years',\n system: 'http://unitsofmeasure.org',\n };\n }\n }\n\n return (\n <Stack style={{ maxWidth: '50%' }}>\n <Group>\n <NativeSelect\n data={['', 'male', 'female']}\n label=\"Gender:\"\n defaultValue={intervalGroup.filters.gender || ''}\n onChange={(e) => {\n for (const interval of intervalGroup.intervals) {\n let newGender: string | undefined = e.currentTarget?.value;\n if (newGender === '') {\n newGender = undefined;\n }\n onChange(intervalGroup.id, {\n ...interval,\n gender: newGender as ObservationDefinitionQualifiedInterval['gender'],\n });\n }\n }}\n />\n </Group>\n <Group spacing={'xs'}>\n <Text component=\"label\" htmlFor={`div-age-${intervalGroup.id}`}>\n Age:\n </Text>\n <div id={`div-age-${intervalGroup.id}`}>\n <RangeInput\n key={`age-${intervalGroup.id}`}\n name={`age-${intervalGroup.id}`}\n defaultValue={intervalGroup.filters['age']}\n onChange={(ageRange) => {\n for (const interval of intervalGroup.intervals) {\n onChange(intervalGroup.id, { ...interval, age: ageRange });\n }\n }}\n />\n </div>\n </Group>\n <NativeSelect\n data={['', 'pre-puberty', 'follicular', 'midcycle', 'luteal', 'postmenopausal']}\n label=\"Endocrine:\"\n defaultValue={intervalGroup.filters.context?.text || ''}\n onChange={(e) => {\n for (const interval of intervalGroup.intervals) {\n let newEndocrine: string | undefined = e.currentTarget?.value;\n if (newEndocrine === '') {\n newEndocrine = undefined;\n onChange(intervalGroup.id, { ...interval, context: undefined });\n } else {\n onChange(intervalGroup.id, {\n ...interval,\n context: {\n text: newEndocrine,\n coding: [\n { code: newEndocrine, system: 'http://terminology.hl7.org/CodeSystem/referencerange-meaning' },\n ],\n },\n });\n }\n }\n }}\n />\n </Stack>\n );\n}\n\n/**\n * Helper function that assigns ids to each qualifiedInterval of an ObservationDefinition\n * @param definition An ObservationDefinition\n * @param setIntervalId React setState function for the intervalId\n * @returns\n */\nfunction ensureQualifiedIntervalKeys(\n definition: ObservationDefinition,\n setIntervalId: (id: number) => void\n): ObservationDefinition {\n const intervals = definition.qualifiedInterval || [];\n // Set the nextId to the max of any existing numeric id\n let nextId =\n Math.max(\n ...intervals.map((interval) => {\n const existingNum = parseInt(interval.id?.substring(3) || '');\n return !isNaN(existingNum) ? existingNum : Number.NEGATIVE_INFINITY;\n })\n ) + 1;\n\n if (!Number.isFinite(nextId)) {\n nextId = 1;\n }\n\n // If an interval doesn't have an id, set it to the nextId\n definition = {\n ...definition,\n qualifiedInterval: intervals.map((interval) => ({\n ...interval,\n id: interval.id || `id-${nextId++}`,\n })),\n };\n setIntervalId(nextId);\n return definition;\n}\n\n/**\n * Group all ObservationDefinitionQualifiedIntervals based on the values of their \"filter\" properties,\n * so that similar ranges can be grouped together\n */\nfunction groupQualifiedIntervals(\n intervals: ObservationDefinitionQualifiedInterval[],\n setGroupId: (id: number) => void\n): IntervalGroup[] {\n let groupId = 1;\n const groups: Record<string, IntervalGroup> = {};\n for (const interval of intervals) {\n const groupKey = generateGroupKey(interval);\n if (!(groupKey in groups)) {\n groups[groupKey] = {\n id: `group-id-${groupId++}`,\n filters: Object.fromEntries(intervalFilters.map((f) => [f, interval[f]])) as Record<string, any>,\n intervals: [],\n };\n }\n groups[groupKey].intervals.push(interval);\n }\n setGroupId(groupId);\n return Object.values(groups);\n}\n\n/**\n * Generates a unique string for each set of filter values, so that similarly filtered intervals can be grouped together\n * @return A \"group key\" that corresponds to the value of the interval filter properties.\n */\n\nfunction generateGroupKey(interval: ObservationDefinitionQualifiedInterval): string {\n const results = [\n `gender=${interval.gender}`,\n `age=${formatRange(interval.age)}`,\n `gestationalAge=${formatRange(interval.gestationalAge)}`,\n `context=${interval.context?.text}`,\n `appliesTo=${interval.appliesTo?.map((c) => c.text).join('+')}`,\n ];\n\n return results.join(':');\n}\n\nfunction getUnitString(unit: CodeableConcept | undefined): string | undefined {\n return unit && (getCodeBySystem(unit, 'http://unitsofmeasure.org') || unit.text);\n}\n\nfunction isEmptyInterval(interval: ObservationDefinitionQualifiedInterval): boolean {\n return interval.range?.low?.value === undefined && interval.range?.high?.value === undefined;\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ReferenceRangeEditor.mjs","sources":["../../../src/ReferenceRangeEditor/ReferenceRangeEditor.tsx"],"sourcesContent":["import { ActionIcon, Button, createStyles, Divider, Group, NativeSelect, Stack, Text, TextInput } from '@mantine/core';\nimport { formatRange, getCodeBySystem } from '@medplum/core';\nimport { CodeableConcept, ObservationDefinition, ObservationDefinitionQualifiedInterval } from '@medplum/fhirtypes';\nimport { IconCircleMinus, IconCirclePlus } from '@tabler/icons-react';\nimport React, { useEffect, useState } from 'react';\nimport { Container } from '../Container/Container';\nimport { Form } from '../Form/Form';\nimport { RangeInput } from '../RangeInput/RangeInput';\nimport { killEvent } from '../utils/dom';\n\nconst useStyles = createStyles((theme) => ({\n section: {\n position: 'relative',\n margin: '4px 4px 8px 0',\n padding: '6px 12px 16px 6px',\n border: `1.5px solid ${theme.colors.gray[3]}`,\n borderRadius: theme.radius.sm,\n transition: 'all 0.1s',\n },\n}));\n\n// Properties of qualified intervals used for grouping\nconst intervalFilters = ['gender', 'age', 'gestationalAge', 'context', 'appliesTo'] as const;\n\nexport interface ReferenceRangeEditorProps {\n definition: ObservationDefinition;\n onSubmit: (result: ObservationDefinition) => void;\n}\n\n// Helper type that groups of qualified intervals by equal filter criteria\ntype IntervalGroup = {\n id: string;\n filters: Record<string, any>;\n intervals: ObservationDefinitionQualifiedInterval[];\n};\n\nconst defaultProps: ReferenceRangeEditorProps = {\n definition: { resourceType: 'ObservationDefinition' },\n onSubmit: () => {\n return;\n },\n};\n\nexport function ReferenceRangeEditor(props: ReferenceRangeEditorProps): JSX.Element {\n props = Object.assign(defaultProps, props);\n const defaultDefinition = props.definition;\n\n const [intervalGroups, setIntervalGroups] = useState<IntervalGroup[]>([]);\n const [groupId, setGroupId] = useState(1);\n const [intervalId, setIntervalId] = useState(1);\n\n useEffect(() => {\n const definition = ensureQualifiedIntervalKeys(defaultDefinition, setIntervalId);\n setIntervalGroups(groupQualifiedIntervals(definition.qualifiedInterval || [], setGroupId));\n }, [defaultDefinition]);\n\n return (\n <Form testid=\"reference-range-editor\" onSubmit={submitDefinition}>\n <Stack>\n {intervalGroups.map((intervalGroup) => (\n <ReferenceRangeGroupEditor\n unit={getUnitString(defaultDefinition.quantitativeDetails?.unit)}\n onChange={changeInterval}\n onAdd={addInterval}\n onRemove={removeInterval}\n onRemoveGroup={removeGroup}\n key={`group-${intervalGroup.id}`}\n intervalGroup={intervalGroup}\n />\n ))}\n </Stack>\n <ActionIcon\n title=\"Add Group\"\n size=\"sm\"\n onClick={(e: React.MouseEvent) => {\n killEvent(e);\n addGroup({ id: `group-id-${groupId}`, filters: {} as IntervalGroup['filters'], intervals: [] });\n setGroupId((id) => id + 1);\n }}\n >\n <IconCirclePlus />\n </ActionIcon>\n\n <Group position=\"right\">\n <Button type=\"submit\">Save</Button>\n </Group>\n </Form>\n );\n\n /**\n * Submit qualified intervals\n */\n\n function submitDefinition(): void {\n const qualifiedInterval = intervalGroups\n .flatMap((group) => group.intervals)\n .filter((interval) => !isEmptyInterval(interval));\n props.onSubmit({ ...defaultDefinition, qualifiedInterval });\n }\n\n /**\n * Add Remove Interval Groups\n */\n\n function addGroup(addedGroup: IntervalGroup): void {\n setIntervalGroups((currentGroups) => [...currentGroups, addedGroup]);\n }\n\n function removeGroup(removedGroup: IntervalGroup): void {\n setIntervalGroups((currentGroups) => currentGroups.filter((group) => group.id !== removedGroup.id));\n }\n\n /**\n * Add/Remove/Update specific Qualified Intervals\n * @param groupId The reference range group ID.\n * @param changedInterval The updated reference range interval.\n */\n function changeInterval(groupId: string, changedInterval: ObservationDefinitionQualifiedInterval): void {\n setIntervalGroups((groups) => {\n groups = [...groups];\n const currentGroup = groups.find((g) => g.id === groupId);\n\n const index = currentGroup?.intervals?.findIndex((interval) => interval.id === changedInterval.id);\n if (index !== undefined && currentGroup?.intervals?.[index]) {\n currentGroup.intervals[index] = changedInterval;\n }\n return groups;\n });\n }\n\n function addInterval(groupId: string, addedInterval: ObservationDefinitionQualifiedInterval): void {\n if (addedInterval.id === undefined) {\n addedInterval.id = `id-${intervalId}`;\n setIntervalId((id) => id + 1);\n }\n setIntervalGroups((groups) => {\n groups = [...groups];\n const currentGroupIndex = groups.findIndex((g) => g.id === groupId);\n\n if (currentGroupIndex !== -1) {\n const currentGroup = { ...groups[currentGroupIndex] };\n addedInterval = { ...addedInterval, ...currentGroup.filters };\n currentGroup.intervals = [...currentGroup.intervals, addedInterval];\n groups[currentGroupIndex] = currentGroup;\n }\n\n return groups;\n });\n }\n\n function removeInterval(groupId: string, removedInterval: ObservationDefinitionQualifiedInterval): void {\n setIntervalGroups((groups) => {\n groups = [...groups];\n const currentGroup = groups.find((g) => g.id === groupId);\n if (currentGroup) {\n currentGroup.intervals = currentGroup.intervals.filter((interval) => interval.id !== removedInterval.id);\n }\n return groups;\n });\n }\n}\n\n/**\n * Helper component that renders an \"interval group\", which is a set of ObservationDefinitionQualifiedIntervals\n * that have the same filter values\n */\nexport interface ReferenceRangeGroupEditorProps {\n intervalGroup: IntervalGroup;\n unit: string | undefined;\n onChange: (groupId: string, changed: ObservationDefinitionQualifiedInterval) => void;\n onAdd: (groupId: string, added: ObservationDefinitionQualifiedInterval) => void;\n onRemove: (groupId: string, removed: ObservationDefinitionQualifiedInterval) => void;\n onRemoveGroup: (removedGroup: IntervalGroup) => void;\n}\n\nexport function ReferenceRangeGroupEditor(props: ReferenceRangeGroupEditorProps): JSX.Element {\n const { intervalGroup, unit } = props;\n const { classes } = useStyles();\n return (\n <Container data-testid={intervalGroup.id} className={classes.section}>\n <Stack spacing={'lg'}>\n <Group position=\"right\">\n <ActionIcon\n title=\"Remove Group\"\n data-testid={`remove-group-button-${intervalGroup.id}`}\n key={`remove-group-button-${intervalGroup.id}`}\n size=\"sm\"\n onClick={(e: React.MouseEvent) => {\n killEvent(e);\n props.onRemoveGroup(intervalGroup);\n }}\n >\n <IconCircleMinus />\n </ActionIcon>\n </Group>\n <ReferenceRangeGroupFilters intervalGroup={intervalGroup} onChange={props.onChange} />\n <Divider />\n {intervalGroup.intervals.map((interval) => (\n <Stack key={`interval-${interval.id}`} spacing={'xs'}>\n <Group>\n <TextInput\n key={`condition-${interval.id}`}\n data-testid={`condition-${interval.id}`}\n defaultValue={interval.condition}\n label={'Condition: '}\n size={'sm'}\n onChange={(e) => {\n killEvent(e);\n props.onChange(intervalGroup.id, { ...interval, condition: e.currentTarget.value.trim() });\n }}\n />\n <ActionIcon\n title=\"Remove Interval\"\n size=\"sm\"\n key={`remove-interval-${interval.id}`}\n data-testid={`remove-interval-${interval.id}`}\n onClick={(e: React.MouseEvent) => {\n killEvent(e);\n props.onRemove(intervalGroup.id, interval);\n }}\n >\n <IconCircleMinus />\n </ActionIcon>\n </Group>\n\n <RangeInput\n onChange={(range) => {\n props.onChange(intervalGroup.id, { ...interval, range });\n }}\n key={`range-${interval.id}`}\n name={`range-${interval.id}`}\n defaultValue={interval.range}\n />\n </Stack>\n ))}\n <ActionIcon\n title=\"Add Interval\"\n size=\"sm\"\n onClick={(e: React.MouseEvent) => {\n killEvent(e);\n props.onAdd(intervalGroup.id, {\n range: {\n low: { unit },\n high: { unit },\n },\n });\n }}\n >\n <IconCirclePlus />\n </ActionIcon>\n </Stack>\n </Container>\n );\n}\n\ninterface ReferenceRangeGroupFiltersProps {\n intervalGroup: IntervalGroup;\n onChange: ReferenceRangeGroupEditorProps['onChange'];\n}\n\n/**\n * Render the \"filters\" section of the IntervalGroup.\n * @param props The ReferenceRangeGroupFilter React props.\n * @returns The ReferenceRangeGroupFilter React node.\n */\nfunction ReferenceRangeGroupFilters(props: ReferenceRangeGroupFiltersProps): JSX.Element {\n const { intervalGroup, onChange } = props;\n\n // Pre-populate the units of the age filter\n if (!intervalGroup.filters.age) {\n intervalGroup.filters.age = {};\n }\n for (const key of ['low', 'high']) {\n if (!intervalGroup.filters.age[key]?.unit) {\n intervalGroup.filters.age[key] = {\n ...intervalGroup.filters.age[key],\n unit: 'years',\n system: 'http://unitsofmeasure.org',\n };\n }\n }\n\n return (\n <Stack style={{ maxWidth: '50%' }}>\n <Group>\n <NativeSelect\n data={['', 'male', 'female']}\n label=\"Gender:\"\n defaultValue={intervalGroup.filters.gender || ''}\n onChange={(e) => {\n for (const interval of intervalGroup.intervals) {\n let newGender: string | undefined = e.currentTarget?.value;\n if (newGender === '') {\n newGender = undefined;\n }\n onChange(intervalGroup.id, {\n ...interval,\n gender: newGender as ObservationDefinitionQualifiedInterval['gender'],\n });\n }\n }}\n />\n </Group>\n <Group spacing={'xs'}>\n <Text component=\"label\" htmlFor={`div-age-${intervalGroup.id}`}>\n Age:\n </Text>\n <div id={`div-age-${intervalGroup.id}`}>\n <RangeInput\n key={`age-${intervalGroup.id}`}\n name={`age-${intervalGroup.id}`}\n defaultValue={intervalGroup.filters['age']}\n onChange={(ageRange) => {\n for (const interval of intervalGroup.intervals) {\n onChange(intervalGroup.id, { ...interval, age: ageRange });\n }\n }}\n />\n </div>\n </Group>\n <NativeSelect\n data={['', 'pre-puberty', 'follicular', 'midcycle', 'luteal', 'postmenopausal']}\n label=\"Endocrine:\"\n defaultValue={intervalGroup.filters.context?.text || ''}\n onChange={(e) => {\n for (const interval of intervalGroup.intervals) {\n let newEndocrine: string | undefined = e.currentTarget?.value;\n if (newEndocrine === '') {\n newEndocrine = undefined;\n onChange(intervalGroup.id, { ...interval, context: undefined });\n } else {\n onChange(intervalGroup.id, {\n ...interval,\n context: {\n text: newEndocrine,\n coding: [\n { code: newEndocrine, system: 'http://terminology.hl7.org/CodeSystem/referencerange-meaning' },\n ],\n },\n });\n }\n }\n }}\n />\n </Stack>\n );\n}\n\n/**\n * Helper function that assigns ids to each qualifiedInterval of an ObservationDefinition\n * @param definition An ObservationDefinition\n * @param setIntervalId React setState function for the intervalId\n * @returns The updated observation definition.\n */\nfunction ensureQualifiedIntervalKeys(\n definition: ObservationDefinition,\n setIntervalId: (id: number) => void\n): ObservationDefinition {\n const intervals = definition.qualifiedInterval || [];\n // Set the nextId to the max of any existing numeric id\n let nextId =\n Math.max(\n ...intervals.map((interval) => {\n const existingNum = parseInt(interval.id?.substring(3) || '');\n return !isNaN(existingNum) ? existingNum : Number.NEGATIVE_INFINITY;\n })\n ) + 1;\n\n if (!Number.isFinite(nextId)) {\n nextId = 1;\n }\n\n // If an interval doesn't have an id, set it to the nextId\n definition = {\n ...definition,\n qualifiedInterval: intervals.map((interval) => ({\n ...interval,\n id: interval.id || `id-${nextId++}`,\n })),\n };\n setIntervalId(nextId);\n return definition;\n}\n\n/**\n * Group all ObservationDefinitionQualifiedIntervals based on the values of their \"filter\" properties,\n * so that similar ranges can be grouped together.\n * @param intervals Array of reference range intervals.\n * @param setGroupId Callback to set the group ID.\n * @returns The grouped intervals.\n */\nfunction groupQualifiedIntervals(\n intervals: ObservationDefinitionQualifiedInterval[],\n setGroupId: (id: number) => void\n): IntervalGroup[] {\n let groupId = 1;\n const groups: Record<string, IntervalGroup> = {};\n for (const interval of intervals) {\n const groupKey = generateGroupKey(interval);\n if (!(groupKey in groups)) {\n groups[groupKey] = {\n id: `group-id-${groupId++}`,\n filters: Object.fromEntries(intervalFilters.map((f) => [f, interval[f]])) as Record<string, any>,\n intervals: [],\n };\n }\n groups[groupKey].intervals.push(interval);\n }\n setGroupId(groupId);\n return Object.values(groups);\n}\n\n/**\n * Generates a unique string for each set of filter values, so that similarly filtered intervals can be grouped together.\n * @param interval The reference range interval.\n * @returns A \"group key\" that corresponds to the value of the interval filter properties.\n */\nfunction generateGroupKey(interval: ObservationDefinitionQualifiedInterval): string {\n const results = [\n `gender=${interval.gender}`,\n `age=${formatRange(interval.age)}`,\n `gestationalAge=${formatRange(interval.gestationalAge)}`,\n `context=${interval.context?.text}`,\n `appliesTo=${interval.appliesTo?.map((c) => c.text).join('+')}`,\n ];\n\n return results.join(':');\n}\n\nfunction getUnitString(unit: CodeableConcept | undefined): string | undefined {\n return unit && (getCodeBySystem(unit, 'http://unitsofmeasure.org') || unit.text);\n}\n\nfunction isEmptyInterval(interval: ObservationDefinitionQualifiedInterval): boolean {\n return interval.range?.low?.value === undefined && interval.range?.high?.value === undefined;\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -4,11 +4,6 @@ import React, { useState } from 'react';
|
|
|
4
4
|
import { MedplumLink } from '../MedplumLink/MedplumLink.mjs';
|
|
5
5
|
import { useResource } from '../useResource/useResource.mjs';
|
|
6
6
|
|
|
7
|
-
/**
|
|
8
|
-
* Renders the name of a resource, given either the resource itself or a reference to the resource.
|
|
9
|
-
* @param props
|
|
10
|
-
* @returns
|
|
11
|
-
*/
|
|
12
7
|
function ResourceName(props) {
|
|
13
8
|
const { value, link, ...rest } = props;
|
|
14
9
|
const [outcome, setOutcome] = useState();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ResourceName.mjs","sources":["../../../src/ResourceName/ResourceName.tsx"],"sourcesContent":["import { Text, TextProps } from '@mantine/core';\nimport { getDisplayString, isOk, normalizeErrorString } from '@medplum/core';\nimport { OperationOutcome, Reference, Resource } from '@medplum/fhirtypes';\nimport React, { useState } from 'react';\nimport { MedplumLink } from '../MedplumLink/MedplumLink';\nimport { useResource } from '../useResource/useResource';\n\nexport interface ResourceNameProps extends TextProps {\n value?: Reference | Resource;\n link?: boolean;\n}\n\
|
|
1
|
+
{"version":3,"file":"ResourceName.mjs","sources":["../../../src/ResourceName/ResourceName.tsx"],"sourcesContent":["import { Text, TextProps } from '@mantine/core';\nimport { getDisplayString, isOk, normalizeErrorString } from '@medplum/core';\nimport { OperationOutcome, Reference, Resource } from '@medplum/fhirtypes';\nimport React, { useState } from 'react';\nimport { MedplumLink } from '../MedplumLink/MedplumLink';\nimport { useResource } from '../useResource/useResource';\n\nexport interface ResourceNameProps extends TextProps {\n value?: Reference | Resource;\n link?: boolean;\n}\n\nexport function ResourceName(props: ResourceNameProps): JSX.Element | null {\n const { value, link, ...rest } = props;\n const [outcome, setOutcome] = useState<OperationOutcome | undefined>();\n const resource = useResource(value, setOutcome);\n let text: string;\n\n if (outcome && !isOk(outcome)) {\n text = `[${normalizeErrorString(outcome)}]`;\n } else if (resource) {\n text = getDisplayString(resource);\n } else {\n return null;\n }\n\n return link ? (\n <MedplumLink to={value} {...rest}>\n {text}\n </MedplumLink>\n ) : (\n <Text component=\"span\" {...rest}>\n {text}\n </Text>\n );\n}\n"],"names":[],"mappings":";;;;;;AAYM,SAAU,YAAY,CAAC,KAAwB,EAAA;IACnD,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,GAAG,KAAK,CAAC;IACvC,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,EAAgC,CAAC;IACvE,MAAM,QAAQ,GAAG,WAAW,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;AAChD,IAAA,IAAI,IAAY,CAAC;AAEjB,IAAA,IAAI,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE;AAC7B,QAAA,IAAI,GAAG,CAAI,CAAA,EAAA,oBAAoB,CAAC,OAAO,CAAC,GAAG,CAAC;AAC7C,KAAA;AAAM,SAAA,IAAI,QAAQ,EAAE;AACnB,QAAA,IAAI,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;AACnC,KAAA;AAAM,SAAA;AACL,QAAA,OAAO,IAAI,CAAC;AACb,KAAA;AAED,IAAA,OAAO,IAAI,IACT,KAAC,CAAA,aAAA,CAAA,WAAW,EAAC,EAAA,EAAE,EAAE,KAAK,EAAM,GAAA,IAAI,IAC7B,IAAI,CACO,KAEd,KAAA,CAAA,aAAA,CAAC,IAAI,EAAC,EAAA,SAAS,EAAC,MAAM,KAAK,IAAI,EAAA,EAC5B,IAAI,CACA,CACR,CAAC;AACJ;;;;"}
|
|
@@ -18,7 +18,9 @@ import { ReferenceDisplay } from '../ReferenceDisplay/ReferenceDisplay.mjs';
|
|
|
18
18
|
import { ResourceArrayDisplay } from '../ResourceArrayDisplay/ResourceArrayDisplay.mjs';
|
|
19
19
|
|
|
20
20
|
/**
|
|
21
|
-
* Low-level component that renders a property from a given resource, given type information
|
|
21
|
+
* Low-level component that renders a property from a given resource, given type information.
|
|
22
|
+
* @param props The ResourcePropertyDisplay React props.
|
|
23
|
+
* @returns The ResourcePropertyDisplay React node.
|
|
22
24
|
*/
|
|
23
25
|
function ResourcePropertyDisplay(props) {
|
|
24
26
|
const { property, propertyType, value } = props;
|
|
@@ -32,11 +34,12 @@ function ResourcePropertyDisplay(props) {
|
|
|
32
34
|
case PropertyType.boolean:
|
|
33
35
|
return React.createElement(React.Fragment, null, value === undefined ? '' : Boolean(value).toString());
|
|
34
36
|
case PropertyType.SystemString:
|
|
37
|
+
case PropertyType.string:
|
|
38
|
+
return React.createElement("div", { style: { whiteSpace: 'pre-wrap' } }, value);
|
|
35
39
|
case PropertyType.code:
|
|
36
40
|
case PropertyType.date:
|
|
37
41
|
case PropertyType.integer:
|
|
38
42
|
case PropertyType.positiveInt:
|
|
39
|
-
case PropertyType.string:
|
|
40
43
|
case PropertyType.unsignedInt:
|
|
41
44
|
case PropertyType.uri:
|
|
42
45
|
case PropertyType.url:
|
|
@@ -98,7 +101,7 @@ function ResourcePropertyDisplay(props) {
|
|
|
98
101
|
* According to the spec, there can only be one property for a given element definition.
|
|
99
102
|
* This function returns the value and the type.
|
|
100
103
|
* @param context The base context (usually a FHIR resource).
|
|
101
|
-
* @param
|
|
104
|
+
* @param path The property path.
|
|
102
105
|
* @returns The value of the property and the property type.
|
|
103
106
|
*/
|
|
104
107
|
function getValueAndType(context, path) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ResourcePropertyDisplay.mjs","sources":["../../../src/ResourcePropertyDisplay/ResourcePropertyDisplay.tsx"],"sourcesContent":["import {\n formatDateTime,\n formatPeriod,\n formatTiming,\n getElementDefinitionTypeName,\n getTypedPropertyValue,\n PropertyType,\n TypedValue,\n} from '@medplum/core';\nimport { ElementDefinition } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { AddressDisplay } from '../AddressDisplay/AddressDisplay';\nimport { AttachmentArrayDisplay } from '../AttachmentArrayDisplay/AttachmentArrayDisplay';\nimport { AttachmentDisplay } from '../AttachmentDisplay/AttachmentDisplay';\nimport { BackboneElementDisplay } from '../BackboneElementDisplay/BackboneElementDisplay';\nimport { CodeableConceptDisplay } from '../CodeableConceptDisplay/CodeableConceptDisplay';\nimport { CodingDisplay } from '../CodingDisplay/CodingDisplay';\nimport { ContactDetailDisplay } from '../ContactDetailDisplay/ContactDetailDisplay';\nimport { ContactPointDisplay } from '../ContactPointDisplay/ContactPointDisplay';\nimport { HumanNameDisplay } from '../HumanNameDisplay/HumanNameDisplay';\nimport { IdentifierDisplay } from '../IdentifierDisplay/IdentifierDisplay';\nimport { MoneyDisplay } from '../MoneyDisplay/MoneyDisplay';\nimport { QuantityDisplay } from '../QuantityDisplay/QuantityDisplay';\nimport { RangeDisplay } from '../RangeDisplay/RangeDisplay';\nimport { RatioDisplay } from '../RatioDisplay/RatioDisplay';\nimport { ReferenceDisplay } from '../ReferenceDisplay/ReferenceDisplay';\nimport { ResourceArrayDisplay } from '../ResourceArrayDisplay/ResourceArrayDisplay';\n\nexport interface ResourcePropertyDisplayProps {\n property?: ElementDefinition;\n propertyType: PropertyType;\n value: any;\n arrayElement?: boolean;\n maxWidth?: number;\n ignoreMissingValues?: boolean;\n link?: boolean;\n}\n\n/**\n * Low-level component that renders a property from a given resource, given type information\n */\nexport function ResourcePropertyDisplay(props: ResourcePropertyDisplayProps): JSX.Element {\n const { property, propertyType, value } = props;\n\n if (property?.max === '*' && !props.arrayElement) {\n if (propertyType === 'Attachment') {\n return <AttachmentArrayDisplay values={value} maxWidth={props.maxWidth} />;\n }\n return (\n <ResourceArrayDisplay\n property={property}\n values={value}\n ignoreMissingValues={props.ignoreMissingValues}\n link={props.link}\n />\n );\n }\n\n switch (propertyType) {\n case PropertyType.boolean:\n return <>{value === undefined ? '' : Boolean(value).toString()}</>;\n case PropertyType.SystemString:\n case PropertyType.code:\n case PropertyType.date:\n case PropertyType.integer:\n case PropertyType.positiveInt:\n case PropertyType.string:\n case PropertyType.unsignedInt:\n case PropertyType.uri:\n case PropertyType.url:\n return <>{value}</>;\n case PropertyType.canonical:\n return <ReferenceDisplay value={{ reference: value }} link={props.link} />;\n case PropertyType.dateTime:\n case PropertyType.instant:\n return <>{formatDateTime(value)}</>;\n case PropertyType.markdown:\n return <pre>{value}</pre>;\n case PropertyType.Address:\n return <AddressDisplay value={value} />;\n case PropertyType.Annotation:\n return <>{value?.text}</>;\n case PropertyType.Attachment:\n return <AttachmentDisplay value={value} maxWidth={props.maxWidth} />;\n case PropertyType.CodeableConcept:\n return <CodeableConceptDisplay value={value} />;\n case PropertyType.Coding:\n return <CodingDisplay value={value} />;\n case PropertyType.ContactDetail:\n return <ContactDetailDisplay value={value} />;\n case PropertyType.ContactPoint:\n return <ContactPointDisplay value={value} />;\n case PropertyType.HumanName:\n return <HumanNameDisplay value={value} />;\n case PropertyType.Identifier:\n return <IdentifierDisplay value={value} />;\n case PropertyType.Money:\n return <MoneyDisplay value={value} />;\n case PropertyType.Period:\n return <>{formatPeriod(value)}</>;\n case PropertyType.Quantity:\n case PropertyType.Duration:\n return <QuantityDisplay value={value} />;\n case PropertyType.Range:\n return <RangeDisplay value={value} />;\n case PropertyType.Ratio:\n return <RatioDisplay value={value} />;\n case PropertyType.Reference:\n return <ReferenceDisplay value={value} link={props.link} />;\n case PropertyType.Timing:\n return <>{formatTiming(value)}</>;\n case PropertyType.Dosage:\n case PropertyType.UsageContext:\n return (\n <BackboneElementDisplay\n value={{ type: propertyType, value }}\n compact={true}\n ignoreMissingValues={props.ignoreMissingValues}\n />\n );\n default:\n if (!property?.path) {\n throw Error(`Displaying property of type ${props.propertyType} requires element definition path`);\n }\n return (\n <BackboneElementDisplay\n value={{ type: getElementDefinitionTypeName(property), value }}\n compact={true}\n ignoreMissingValues={props.ignoreMissingValues}\n />\n );\n }\n}\n\n/**\n * Returns the value of the property and the property type.\n * Some property definitions support multiple types.\n * For example, \"Observation.value[x]\" can be \"valueString\", \"valueInteger\", \"valueQuantity\", etc.\n * According to the spec, there can only be one property for a given element definition.\n * This function returns the value and the type.\n * @param context The base context (usually a FHIR resource).\n * @param property The property definition.\n * @returns The value of the property and the property type.\n */\nexport function getValueAndType(context: TypedValue, path: string): [any, PropertyType] {\n const typedResult = getTypedPropertyValue(context, path);\n if (!typedResult) {\n return [undefined, 'undefined' as PropertyType];\n }\n\n if (Array.isArray(typedResult)) {\n return [typedResult.map((e) => e.value), typedResult[0].type as PropertyType];\n }\n\n return [typedResult.value, typedResult.type as PropertyType];\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ResourcePropertyDisplay.mjs","sources":["../../../src/ResourcePropertyDisplay/ResourcePropertyDisplay.tsx"],"sourcesContent":["import {\n formatDateTime,\n formatPeriod,\n formatTiming,\n getElementDefinitionTypeName,\n getTypedPropertyValue,\n PropertyType,\n TypedValue,\n} from '@medplum/core';\nimport { ElementDefinition } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { AddressDisplay } from '../AddressDisplay/AddressDisplay';\nimport { AttachmentArrayDisplay } from '../AttachmentArrayDisplay/AttachmentArrayDisplay';\nimport { AttachmentDisplay } from '../AttachmentDisplay/AttachmentDisplay';\nimport { BackboneElementDisplay } from '../BackboneElementDisplay/BackboneElementDisplay';\nimport { CodeableConceptDisplay } from '../CodeableConceptDisplay/CodeableConceptDisplay';\nimport { CodingDisplay } from '../CodingDisplay/CodingDisplay';\nimport { ContactDetailDisplay } from '../ContactDetailDisplay/ContactDetailDisplay';\nimport { ContactPointDisplay } from '../ContactPointDisplay/ContactPointDisplay';\nimport { HumanNameDisplay } from '../HumanNameDisplay/HumanNameDisplay';\nimport { IdentifierDisplay } from '../IdentifierDisplay/IdentifierDisplay';\nimport { MoneyDisplay } from '../MoneyDisplay/MoneyDisplay';\nimport { QuantityDisplay } from '../QuantityDisplay/QuantityDisplay';\nimport { RangeDisplay } from '../RangeDisplay/RangeDisplay';\nimport { RatioDisplay } from '../RatioDisplay/RatioDisplay';\nimport { ReferenceDisplay } from '../ReferenceDisplay/ReferenceDisplay';\nimport { ResourceArrayDisplay } from '../ResourceArrayDisplay/ResourceArrayDisplay';\n\nexport interface ResourcePropertyDisplayProps {\n property?: ElementDefinition;\n propertyType: PropertyType;\n value: any;\n arrayElement?: boolean;\n maxWidth?: number;\n ignoreMissingValues?: boolean;\n link?: boolean;\n}\n\n/**\n * Low-level component that renders a property from a given resource, given type information.\n * @param props The ResourcePropertyDisplay React props.\n * @returns The ResourcePropertyDisplay React node.\n */\nexport function ResourcePropertyDisplay(props: ResourcePropertyDisplayProps): JSX.Element {\n const { property, propertyType, value } = props;\n\n if (property?.max === '*' && !props.arrayElement) {\n if (propertyType === 'Attachment') {\n return <AttachmentArrayDisplay values={value} maxWidth={props.maxWidth} />;\n }\n return (\n <ResourceArrayDisplay\n property={property}\n values={value}\n ignoreMissingValues={props.ignoreMissingValues}\n link={props.link}\n />\n );\n }\n\n switch (propertyType) {\n case PropertyType.boolean:\n return <>{value === undefined ? '' : Boolean(value).toString()}</>;\n case PropertyType.SystemString:\n case PropertyType.string:\n return <div style={{ whiteSpace: 'pre-wrap' }}>{value}</div>;\n case PropertyType.code:\n case PropertyType.date:\n case PropertyType.integer:\n case PropertyType.positiveInt:\n case PropertyType.unsignedInt:\n case PropertyType.uri:\n case PropertyType.url:\n return <>{value}</>;\n case PropertyType.canonical:\n return <ReferenceDisplay value={{ reference: value }} link={props.link} />;\n case PropertyType.dateTime:\n case PropertyType.instant:\n return <>{formatDateTime(value)}</>;\n case PropertyType.markdown:\n return <pre>{value}</pre>;\n case PropertyType.Address:\n return <AddressDisplay value={value} />;\n case PropertyType.Annotation:\n return <>{value?.text}</>;\n case PropertyType.Attachment:\n return <AttachmentDisplay value={value} maxWidth={props.maxWidth} />;\n case PropertyType.CodeableConcept:\n return <CodeableConceptDisplay value={value} />;\n case PropertyType.Coding:\n return <CodingDisplay value={value} />;\n case PropertyType.ContactDetail:\n return <ContactDetailDisplay value={value} />;\n case PropertyType.ContactPoint:\n return <ContactPointDisplay value={value} />;\n case PropertyType.HumanName:\n return <HumanNameDisplay value={value} />;\n case PropertyType.Identifier:\n return <IdentifierDisplay value={value} />;\n case PropertyType.Money:\n return <MoneyDisplay value={value} />;\n case PropertyType.Period:\n return <>{formatPeriod(value)}</>;\n case PropertyType.Quantity:\n case PropertyType.Duration:\n return <QuantityDisplay value={value} />;\n case PropertyType.Range:\n return <RangeDisplay value={value} />;\n case PropertyType.Ratio:\n return <RatioDisplay value={value} />;\n case PropertyType.Reference:\n return <ReferenceDisplay value={value} link={props.link} />;\n case PropertyType.Timing:\n return <>{formatTiming(value)}</>;\n case PropertyType.Dosage:\n case PropertyType.UsageContext:\n return (\n <BackboneElementDisplay\n value={{ type: propertyType, value }}\n compact={true}\n ignoreMissingValues={props.ignoreMissingValues}\n />\n );\n default:\n if (!property?.path) {\n throw Error(`Displaying property of type ${props.propertyType} requires element definition path`);\n }\n return (\n <BackboneElementDisplay\n value={{ type: getElementDefinitionTypeName(property), value }}\n compact={true}\n ignoreMissingValues={props.ignoreMissingValues}\n />\n );\n }\n}\n\n/**\n * Returns the value of the property and the property type.\n * Some property definitions support multiple types.\n * For example, \"Observation.value[x]\" can be \"valueString\", \"valueInteger\", \"valueQuantity\", etc.\n * According to the spec, there can only be one property for a given element definition.\n * This function returns the value and the type.\n * @param context The base context (usually a FHIR resource).\n * @param path The property path.\n * @returns The value of the property and the property type.\n */\nexport function getValueAndType(context: TypedValue, path: string): [any, PropertyType] {\n const typedResult = getTypedPropertyValue(context, path);\n if (!typedResult) {\n return [undefined, 'undefined' as PropertyType];\n }\n\n if (Array.isArray(typedResult)) {\n return [typedResult.map((e) => e.value), typedResult[0].type as PropertyType];\n }\n\n return [typedResult.value, typedResult.type as PropertyType];\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -74,6 +74,8 @@ const useStyles = createStyles((theme) => ({
|
|
|
74
74
|
* The SearchControl component represents the embeddable search table control.
|
|
75
75
|
* It includes the table, rows, headers, sorting, etc.
|
|
76
76
|
* It does not include the field editor, filter editor, pagination buttons.
|
|
77
|
+
* @param props The SearchControl React props.
|
|
78
|
+
* @returns The SearchControl React node.
|
|
77
79
|
*/
|
|
78
80
|
function SearchControl(props) {
|
|
79
81
|
const { classes } = useStyles();
|
|
@@ -156,7 +158,6 @@ function SearchControl(props) {
|
|
|
156
158
|
}
|
|
157
159
|
/**
|
|
158
160
|
* Handles a click on a order row.
|
|
159
|
-
*
|
|
160
161
|
* @param e The click event.
|
|
161
162
|
* @param resource The FHIR resource.
|
|
162
163
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SearchControl.mjs","sources":["../../../src/SearchControl/SearchControl.tsx"],"sourcesContent":["import {\n Button,\n Center,\n createStyles,\n Group,\n Loader,\n Menu,\n Pagination,\n Table,\n Text,\n UnstyledButton,\n} from '@mantine/core';\nimport { DEFAULT_SEARCH_COUNT, Filter, formatSearchQuery, globalSchema, SearchRequest } from '@medplum/core';\nimport {\n Bundle,\n OperationOutcome,\n Resource,\n ResourceType,\n SearchParameter,\n UserConfiguration,\n} from '@medplum/fhirtypes';\nimport {\n IconAdjustmentsHorizontal,\n IconBoxMultiple,\n IconColumns,\n IconFilePlus,\n IconFilter,\n IconTableExport,\n IconTrash,\n} from '@tabler/icons-react';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { Container } from '../Container/Container';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\nimport { SearchExportDialog } from '../SearchExportDialog/SearchExportDialog';\nimport { SearchFieldEditor } from '../SearchFieldEditor/SearchFieldEditor';\nimport { SearchFilterEditor } from '../SearchFilterEditor/SearchFilterEditor';\nimport { SearchFilterValueDialog } from '../SearchFilterValueDialog/SearchFilterValueDialog';\nimport { SearchFilterValueDisplay } from '../SearchFilterValueDisplay/SearchFilterValueDisplay';\nimport { SearchPopupMenu } from '../SearchPopupMenu/SearchPopupMenu';\nimport { isCheckboxCell, killEvent } from '../utils/dom';\nimport { getFieldDefinitions } from './SearchControlField';\nimport { addFilter, buildFieldNameString, getOpString, renderValue, setPage } from './SearchUtils';\n\nexport class SearchChangeEvent extends Event {\n readonly definition: SearchRequest;\n\n constructor(definition: SearchRequest) {\n super('change');\n this.definition = definition;\n }\n}\n\nexport class SearchLoadEvent extends Event {\n readonly response: Bundle;\n\n constructor(response: Bundle) {\n super('load');\n this.response = response;\n }\n}\n\nexport class SearchClickEvent extends Event {\n readonly resource: Resource;\n readonly browserEvent: React.MouseEvent;\n\n constructor(resource: Resource, browserEvent: React.MouseEvent) {\n super('click');\n this.resource = resource;\n this.browserEvent = browserEvent;\n }\n}\n\nexport interface SearchControlProps {\n search: SearchRequest;\n userConfig?: UserConfiguration;\n checkboxesEnabled?: boolean;\n hideToolbar?: boolean;\n hideFilters?: boolean;\n onLoad?: (e: SearchLoadEvent) => void;\n onChange?: (e: SearchChangeEvent) => void;\n onClick?: (e: SearchClickEvent) => void;\n onAuxClick?: (e: SearchClickEvent) => void;\n onNew?: () => void;\n onExport?: () => void;\n onExportCsv?: () => void;\n onExportTransactionBundle?: () => void;\n onDelete?: (ids: string[]) => void;\n onPatch?: (ids: string[]) => void;\n onBulk?: (ids: string[]) => void;\n}\n\ninterface SearchControlState {\n searchResponse?: Bundle;\n selected: { [id: string]: boolean };\n fieldEditorVisible: boolean;\n filterEditorVisible: boolean;\n filterDialogVisible: boolean;\n exportDialogVisible: boolean;\n filterDialogFilter?: Filter;\n filterDialogSearchParam?: SearchParameter;\n}\n\nconst useStyles = createStyles((theme) => ({\n root: {\n maxWidth: '100%',\n overflow: 'auto',\n textAlign: 'left',\n marginBottom: '20px',\n },\n\n table: {\n cursor: 'pointer',\n },\n\n tr: {\n '&:hover': {\n backgroundColor: theme.colorScheme === 'dark' ? theme.colors.dark[7] : theme.colors.gray[0],\n },\n },\n\n th: {\n padding: '0 !important',\n },\n\n control: {\n width: '100%',\n padding: `${theme.spacing.xs} ${theme.spacing.md}`,\n\n '&:hover': {\n backgroundColor: theme.colorScheme === 'dark' ? theme.colors.dark[6] : theme.colors.gray[0],\n },\n },\n\n icon: {\n width: 21,\n height: 21,\n borderRadius: 21,\n },\n}));\n\n/**\n * The SearchControl component represents the embeddable search table control.\n * It includes the table, rows, headers, sorting, etc.\n * It does not include the field editor, filter editor, pagination buttons.\n */\nexport function SearchControl(props: SearchControlProps): JSX.Element {\n const { classes } = useStyles();\n const medplum = useMedplum();\n const [schemaLoaded, setSchemaLoaded] = useState<boolean>(false);\n const [outcome, setOutcome] = useState<OperationOutcome | undefined>();\n const { search, onLoad } = props;\n\n const [state, setState] = useState<SearchControlState>({\n selected: {},\n fieldEditorVisible: false,\n filterEditorVisible: false,\n exportDialogVisible: false,\n filterDialogVisible: false,\n });\n\n const stateRef = useRef<SearchControlState>(state);\n stateRef.current = state;\n\n useEffect(() => {\n setOutcome(undefined);\n medplum\n .search(\n search.resourceType as ResourceType,\n formatSearchQuery({ ...search, total: search.total ?? 'estimate', fields: undefined })\n )\n .then((response) => {\n setState({ ...stateRef.current, searchResponse: response });\n if (onLoad) {\n onLoad(new SearchLoadEvent(response));\n }\n })\n .catch((reason) => {\n setState({ ...stateRef.current, searchResponse: undefined });\n setOutcome(reason);\n });\n }, [medplum, search, onLoad]);\n\n function handleSingleCheckboxClick(e: React.ChangeEvent, id: string): void {\n e.stopPropagation();\n\n const el = e.target as HTMLInputElement;\n const checked = el.checked;\n const newSelected = { ...stateRef.current.selected };\n if (checked) {\n newSelected[id] = true;\n } else {\n delete newSelected[id];\n }\n setState({ ...stateRef.current, selected: newSelected });\n }\n\n function handleAllCheckboxClick(e: React.ChangeEvent): void {\n e.stopPropagation();\n\n const el = e.target as HTMLInputElement;\n const checked = el.checked;\n const newSelected = {} as { [id: string]: boolean };\n const searchResponse = stateRef.current?.searchResponse;\n if (checked && searchResponse?.entry) {\n searchResponse.entry.forEach((entry) => {\n if (entry.resource?.id) {\n newSelected[entry.resource.id] = true;\n }\n });\n }\n setState({ ...stateRef.current, selected: newSelected });\n }\n\n function isAllSelected(): boolean {\n const state = stateRef.current;\n if (!state.searchResponse?.entry || state.searchResponse.entry.length === 0) {\n return false;\n }\n for (const e of state.searchResponse.entry) {\n if (e.resource?.id && !state.selected[e.resource.id]) {\n return false;\n }\n }\n return true;\n }\n\n /**\n * Emits a change event to the optional change listener.\n * @param newSearch The new search definition.\n */\n function emitSearchChange(newSearch: SearchRequest): void {\n if (props.onChange) {\n props.onChange(new SearchChangeEvent(newSearch));\n }\n }\n\n /**\n * Handles a click on a order row.\n *\n * @param e The click event.\n * @param resource The FHIR resource.\n */\n function handleRowClick(e: React.MouseEvent, resource: Resource): void {\n if (isCheckboxCell(e.target as Element)) {\n // Ignore clicks on checkboxes\n return;\n }\n\n if (e.button === 2) {\n // Ignore right clicks\n return;\n }\n\n killEvent(e);\n\n if (e.button !== 1 && props.onClick) {\n props.onClick(new SearchClickEvent(resource, e));\n }\n\n if (e.button === 1 && props.onAuxClick) {\n props.onAuxClick(new SearchClickEvent(resource, e));\n }\n }\n\n function isExportPassed(): boolean {\n return !!(props.onExport || props.onExportCsv || props.onExportTransactionBundle);\n }\n\n useEffect(() => {\n setSchemaLoaded(false);\n medplum\n .requestSchema(props.search.resourceType as ResourceType)\n .then(() => setSchemaLoaded(true))\n .catch(console.log);\n }, [medplum, props.search.resourceType]);\n\n const typeSchema = schemaLoaded && globalSchema?.types?.[props.search.resourceType];\n if (!typeSchema) {\n return (\n <Center style={{ width: '100%', height: '100%' }}>\n <Loader />\n </Center>\n );\n }\n\n const checkboxColumn = props.checkboxesEnabled;\n const fields = getFieldDefinitions(search);\n const resourceType = search.resourceType;\n const lastResult = state.searchResponse;\n const entries = lastResult?.entry;\n const resources = entries?.map((e) => e.resource);\n\n const buttonVariant = 'subtle';\n const buttonColor = 'gray';\n const iconSize = 16;\n const isMobile = window.innerWidth < 768;\n\n return (\n <div className={classes.root} data-testid=\"search-control\">\n {!props.hideToolbar && (\n <Group position=\"apart\" mb=\"xl\">\n <Group spacing={2}>\n <Button\n compact\n variant={buttonVariant}\n color={buttonColor}\n leftIcon={<IconColumns size={iconSize} />}\n onClick={() => setState({ ...stateRef.current, fieldEditorVisible: true })}\n >\n Fields\n </Button>\n <Button\n compact\n variant={buttonVariant}\n color={buttonColor}\n leftIcon={<IconFilter size={iconSize} />}\n onClick={() => setState({ ...stateRef.current, filterEditorVisible: true })}\n >\n Filters\n </Button>\n {props.onNew && (\n <Button\n compact\n variant={buttonVariant}\n color={buttonColor}\n leftIcon={<IconFilePlus size={iconSize} />}\n onClick={props.onNew}\n >\n New...\n </Button>\n )}\n {!isMobile && isExportPassed() && (\n <Button\n compact\n variant={buttonVariant}\n color={buttonColor}\n leftIcon={<IconTableExport size={iconSize} />}\n onClick={\n props.onExport ? props.onExport : () => setState({ ...stateRef.current, exportDialogVisible: true })\n }\n >\n Export...\n </Button>\n )}\n {!isMobile && props.onDelete && (\n <Button\n compact\n variant={buttonVariant}\n color={buttonColor}\n leftIcon={<IconTrash size={iconSize} />}\n onClick={() => (props.onDelete as (ids: string[]) => any)(Object.keys(state.selected))}\n >\n Delete...\n </Button>\n )}\n {!isMobile && props.onBulk && (\n <Button\n compact\n variant={buttonVariant}\n color={buttonColor}\n leftIcon={<IconBoxMultiple size={iconSize} />}\n onClick={() => (props.onBulk as (ids: string[]) => any)(Object.keys(state.selected))}\n >\n Bulk...\n </Button>\n )}\n </Group>\n {lastResult && (\n <Text size=\"xs\" color=\"dimmed\">\n {getStart(search, lastResult.total as number)}-{getEnd(search, lastResult.total as number)} of{' '}\n {lastResult.total?.toLocaleString()}\n </Text>\n )}\n </Group>\n )}\n <Table className={classes.table}>\n <thead>\n <tr>\n {checkboxColumn && (\n <th>\n <input\n type=\"checkbox\"\n value=\"checked\"\n aria-label=\"all-checkbox\"\n data-testid=\"all-checkbox\"\n checked={isAllSelected()}\n onChange={(e) => handleAllCheckboxClick(e)}\n />\n </th>\n )}\n {fields.map((field) => (\n <th key={field.name}>\n <Menu shadow=\"md\" width={240} position=\"bottom-end\">\n <Menu.Target>\n <UnstyledButton className={classes.control}>\n <Group position=\"apart\" noWrap>\n <Text weight={500} size=\"sm\">\n {buildFieldNameString(field.name)}\n </Text>\n <Center className={classes.icon}>\n <IconAdjustmentsHorizontal size={14} stroke={1.5} />\n </Center>\n </Group>\n </UnstyledButton>\n </Menu.Target>\n <SearchPopupMenu\n search={props.search}\n searchParams={field.searchParams}\n onPrompt={(searchParam, filter) => {\n setState({\n ...stateRef.current,\n filterDialogVisible: true,\n filterDialogSearchParam: searchParam,\n filterDialogFilter: filter,\n });\n }}\n onChange={(result) => {\n emitSearchChange(result);\n }}\n />\n </Menu>\n </th>\n ))}\n </tr>\n {!props.hideFilters && (\n <tr>\n {checkboxColumn && <th />}\n {fields.map((field) => (\n <th key={field.name}>\n {field.searchParams && (\n <FilterDescription\n resourceType={resourceType}\n searchParams={field.searchParams}\n filters={props.search.filters}\n />\n )}\n </th>\n ))}\n </tr>\n )}\n </thead>\n <tbody>\n {resources?.map(\n (resource) =>\n resource && (\n <tr\n key={resource.id}\n className={classes.tr}\n data-testid=\"search-control-row\"\n onClick={(e) => handleRowClick(e, resource)}\n onAuxClick={(e) => handleRowClick(e, resource)}\n >\n {checkboxColumn && (\n <td>\n <input\n type=\"checkbox\"\n value=\"checked\"\n data-testid=\"row-checkbox\"\n aria-label={`Checkbox for ${resource.id}`}\n checked={!!state.selected[resource.id as string]}\n onChange={(e) => handleSingleCheckboxClick(e, resource.id as string)}\n />\n </td>\n )}\n {fields.map((field) => (\n <td key={field.name}>{renderValue(resource, field)}</td>\n ))}\n </tr>\n )\n )}\n </tbody>\n </Table>\n {resources?.length === 0 && (\n <Container>\n <Center style={{ height: 150 }}>\n <Text size=\"xl\" color=\"dimmed\">\n No results\n </Text>\n </Center>\n </Container>\n )}\n {lastResult?.total !== undefined && lastResult.total > 0 && (\n <Center m=\"md\" p=\"md\">\n <Pagination\n value={getPage(search)}\n total={getTotalPages(search, lastResult.total)}\n onChange={(newPage) => emitSearchChange(setPage(search, newPage))}\n getControlProps={(control) => {\n switch (control) {\n case 'previous':\n return { 'aria-label': 'Previous page' };\n case 'next':\n return { 'aria-label': 'Next page' };\n default:\n return {};\n }\n }}\n />\n </Center>\n )}\n {outcome && (\n <div data-testid=\"search-error\">\n <pre style={{ textAlign: 'left' }}>{JSON.stringify(outcome, undefined, 2)}</pre>\n </div>\n )}\n <SearchFieldEditor\n search={props.search}\n visible={stateRef.current.fieldEditorVisible}\n onOk={(result) => {\n emitSearchChange(result);\n setState({\n ...stateRef.current,\n fieldEditorVisible: false,\n });\n }}\n onCancel={() => {\n setState({\n ...stateRef.current,\n fieldEditorVisible: false,\n });\n }}\n />\n <SearchFilterEditor\n search={props.search}\n visible={stateRef.current.filterEditorVisible}\n onOk={(result) => {\n emitSearchChange(result);\n setState({\n ...stateRef.current,\n filterEditorVisible: false,\n });\n }}\n onCancel={() => {\n setState({\n ...stateRef.current,\n filterEditorVisible: false,\n });\n }}\n />\n <SearchExportDialog\n visible={stateRef.current.exportDialogVisible}\n exportCsv={props.onExportCsv}\n exportTransactionBundle={props.onExportTransactionBundle}\n onCancel={() => {\n setState({\n ...stateRef.current,\n exportDialogVisible: false,\n });\n }}\n />\n <SearchFilterValueDialog\n key={state.filterDialogSearchParam?.code}\n visible={stateRef.current.filterDialogVisible}\n title={'Input'}\n resourceType={resourceType}\n searchParam={state.filterDialogSearchParam}\n filter={state.filterDialogFilter}\n defaultValue={''}\n onOk={(filter) => {\n emitSearchChange(addFilter(props.search, filter.code, filter.operator, filter.value));\n setState({\n ...stateRef.current,\n filterDialogVisible: false,\n });\n }}\n onCancel={() => {\n setState({\n ...stateRef.current,\n filterDialogVisible: false,\n });\n }}\n />\n </div>\n );\n}\n\nexport const MemoizedSearchControl = React.memo(SearchControl);\n\ninterface FilterDescriptionProps {\n readonly resourceType: string;\n readonly searchParams: SearchParameter[];\n readonly filters?: Filter[];\n}\n\nfunction FilterDescription(props: FilterDescriptionProps): JSX.Element {\n const filters = (props.filters ?? []).filter((f) => props.searchParams.find((p) => p.code === f.code));\n if (filters.length === 0) {\n return <span>no filters</span>;\n }\n\n return (\n <>\n {filters.map((filter: Filter, index: number) => (\n <div key={`filter-${index}-${filters.length}`}>\n {getOpString(filter.operator)}\n \n <SearchFilterValueDisplay resourceType={props.resourceType} filter={filter} />\n </div>\n ))}\n </>\n );\n}\n\nfunction getPage(search: SearchRequest): number {\n return Math.floor((search.offset || 0) / (search.count || DEFAULT_SEARCH_COUNT)) + 1;\n}\n\nfunction getTotalPages(search: SearchRequest, total: number): number {\n const pageSize = search.count || DEFAULT_SEARCH_COUNT;\n return Math.ceil(total / pageSize);\n}\n\nfunction getStart(search: SearchRequest, total: number): number {\n return Math.min(total, (search.offset ?? 0) + 1);\n}\n\nfunction getEnd(search: SearchRequest, total: number): number {\n return Math.min(total, ((search.offset ?? 0) + 1) * (search.count ?? DEFAULT_SEARCH_COUNT));\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"SearchControl.mjs","sources":["../../../src/SearchControl/SearchControl.tsx"],"sourcesContent":["import {\n Button,\n Center,\n createStyles,\n Group,\n Loader,\n Menu,\n Pagination,\n Table,\n Text,\n UnstyledButton,\n} from '@mantine/core';\nimport { DEFAULT_SEARCH_COUNT, Filter, formatSearchQuery, globalSchema, SearchRequest } from '@medplum/core';\nimport {\n Bundle,\n OperationOutcome,\n Resource,\n ResourceType,\n SearchParameter,\n UserConfiguration,\n} from '@medplum/fhirtypes';\nimport {\n IconAdjustmentsHorizontal,\n IconBoxMultiple,\n IconColumns,\n IconFilePlus,\n IconFilter,\n IconTableExport,\n IconTrash,\n} from '@tabler/icons-react';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { Container } from '../Container/Container';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\nimport { SearchExportDialog } from '../SearchExportDialog/SearchExportDialog';\nimport { SearchFieldEditor } from '../SearchFieldEditor/SearchFieldEditor';\nimport { SearchFilterEditor } from '../SearchFilterEditor/SearchFilterEditor';\nimport { SearchFilterValueDialog } from '../SearchFilterValueDialog/SearchFilterValueDialog';\nimport { SearchFilterValueDisplay } from '../SearchFilterValueDisplay/SearchFilterValueDisplay';\nimport { SearchPopupMenu } from '../SearchPopupMenu/SearchPopupMenu';\nimport { isCheckboxCell, killEvent } from '../utils/dom';\nimport { getFieldDefinitions } from './SearchControlField';\nimport { addFilter, buildFieldNameString, getOpString, renderValue, setPage } from './SearchUtils';\n\nexport class SearchChangeEvent extends Event {\n readonly definition: SearchRequest;\n\n constructor(definition: SearchRequest) {\n super('change');\n this.definition = definition;\n }\n}\n\nexport class SearchLoadEvent extends Event {\n readonly response: Bundle;\n\n constructor(response: Bundle) {\n super('load');\n this.response = response;\n }\n}\n\nexport class SearchClickEvent extends Event {\n readonly resource: Resource;\n readonly browserEvent: React.MouseEvent;\n\n constructor(resource: Resource, browserEvent: React.MouseEvent) {\n super('click');\n this.resource = resource;\n this.browserEvent = browserEvent;\n }\n}\n\nexport interface SearchControlProps {\n search: SearchRequest;\n userConfig?: UserConfiguration;\n checkboxesEnabled?: boolean;\n hideToolbar?: boolean;\n hideFilters?: boolean;\n onLoad?: (e: SearchLoadEvent) => void;\n onChange?: (e: SearchChangeEvent) => void;\n onClick?: (e: SearchClickEvent) => void;\n onAuxClick?: (e: SearchClickEvent) => void;\n onNew?: () => void;\n onExport?: () => void;\n onExportCsv?: () => void;\n onExportTransactionBundle?: () => void;\n onDelete?: (ids: string[]) => void;\n onPatch?: (ids: string[]) => void;\n onBulk?: (ids: string[]) => void;\n}\n\ninterface SearchControlState {\n searchResponse?: Bundle;\n selected: { [id: string]: boolean };\n fieldEditorVisible: boolean;\n filterEditorVisible: boolean;\n filterDialogVisible: boolean;\n exportDialogVisible: boolean;\n filterDialogFilter?: Filter;\n filterDialogSearchParam?: SearchParameter;\n}\n\nconst useStyles = createStyles((theme) => ({\n root: {\n maxWidth: '100%',\n overflow: 'auto',\n textAlign: 'left',\n marginBottom: '20px',\n },\n\n table: {\n cursor: 'pointer',\n },\n\n tr: {\n '&:hover': {\n backgroundColor: theme.colorScheme === 'dark' ? theme.colors.dark[7] : theme.colors.gray[0],\n },\n },\n\n th: {\n padding: '0 !important',\n },\n\n control: {\n width: '100%',\n padding: `${theme.spacing.xs} ${theme.spacing.md}`,\n\n '&:hover': {\n backgroundColor: theme.colorScheme === 'dark' ? theme.colors.dark[6] : theme.colors.gray[0],\n },\n },\n\n icon: {\n width: 21,\n height: 21,\n borderRadius: 21,\n },\n}));\n\n/**\n * The SearchControl component represents the embeddable search table control.\n * It includes the table, rows, headers, sorting, etc.\n * It does not include the field editor, filter editor, pagination buttons.\n * @param props The SearchControl React props.\n * @returns The SearchControl React node.\n */\nexport function SearchControl(props: SearchControlProps): JSX.Element {\n const { classes } = useStyles();\n const medplum = useMedplum();\n const [schemaLoaded, setSchemaLoaded] = useState<boolean>(false);\n const [outcome, setOutcome] = useState<OperationOutcome | undefined>();\n const { search, onLoad } = props;\n\n const [state, setState] = useState<SearchControlState>({\n selected: {},\n fieldEditorVisible: false,\n filterEditorVisible: false,\n exportDialogVisible: false,\n filterDialogVisible: false,\n });\n\n const stateRef = useRef<SearchControlState>(state);\n stateRef.current = state;\n\n useEffect(() => {\n setOutcome(undefined);\n medplum\n .search(\n search.resourceType as ResourceType,\n formatSearchQuery({ ...search, total: search.total ?? 'estimate', fields: undefined })\n )\n .then((response) => {\n setState({ ...stateRef.current, searchResponse: response });\n if (onLoad) {\n onLoad(new SearchLoadEvent(response));\n }\n })\n .catch((reason) => {\n setState({ ...stateRef.current, searchResponse: undefined });\n setOutcome(reason);\n });\n }, [medplum, search, onLoad]);\n\n function handleSingleCheckboxClick(e: React.ChangeEvent, id: string): void {\n e.stopPropagation();\n\n const el = e.target as HTMLInputElement;\n const checked = el.checked;\n const newSelected = { ...stateRef.current.selected };\n if (checked) {\n newSelected[id] = true;\n } else {\n delete newSelected[id];\n }\n setState({ ...stateRef.current, selected: newSelected });\n }\n\n function handleAllCheckboxClick(e: React.ChangeEvent): void {\n e.stopPropagation();\n\n const el = e.target as HTMLInputElement;\n const checked = el.checked;\n const newSelected = {} as { [id: string]: boolean };\n const searchResponse = stateRef.current?.searchResponse;\n if (checked && searchResponse?.entry) {\n searchResponse.entry.forEach((entry) => {\n if (entry.resource?.id) {\n newSelected[entry.resource.id] = true;\n }\n });\n }\n setState({ ...stateRef.current, selected: newSelected });\n }\n\n function isAllSelected(): boolean {\n const state = stateRef.current;\n if (!state.searchResponse?.entry || state.searchResponse.entry.length === 0) {\n return false;\n }\n for (const e of state.searchResponse.entry) {\n if (e.resource?.id && !state.selected[e.resource.id]) {\n return false;\n }\n }\n return true;\n }\n\n /**\n * Emits a change event to the optional change listener.\n * @param newSearch The new search definition.\n */\n function emitSearchChange(newSearch: SearchRequest): void {\n if (props.onChange) {\n props.onChange(new SearchChangeEvent(newSearch));\n }\n }\n\n /**\n * Handles a click on a order row.\n * @param e The click event.\n * @param resource The FHIR resource.\n */\n function handleRowClick(e: React.MouseEvent, resource: Resource): void {\n if (isCheckboxCell(e.target as Element)) {\n // Ignore clicks on checkboxes\n return;\n }\n\n if (e.button === 2) {\n // Ignore right clicks\n return;\n }\n\n killEvent(e);\n\n if (e.button !== 1 && props.onClick) {\n props.onClick(new SearchClickEvent(resource, e));\n }\n\n if (e.button === 1 && props.onAuxClick) {\n props.onAuxClick(new SearchClickEvent(resource, e));\n }\n }\n\n function isExportPassed(): boolean {\n return !!(props.onExport || props.onExportCsv || props.onExportTransactionBundle);\n }\n\n useEffect(() => {\n setSchemaLoaded(false);\n medplum\n .requestSchema(props.search.resourceType as ResourceType)\n .then(() => setSchemaLoaded(true))\n .catch(console.log);\n }, [medplum, props.search.resourceType]);\n\n const typeSchema = schemaLoaded && globalSchema?.types?.[props.search.resourceType];\n if (!typeSchema) {\n return (\n <Center style={{ width: '100%', height: '100%' }}>\n <Loader />\n </Center>\n );\n }\n\n const checkboxColumn = props.checkboxesEnabled;\n const fields = getFieldDefinitions(search);\n const resourceType = search.resourceType;\n const lastResult = state.searchResponse;\n const entries = lastResult?.entry;\n const resources = entries?.map((e) => e.resource);\n\n const buttonVariant = 'subtle';\n const buttonColor = 'gray';\n const iconSize = 16;\n const isMobile = window.innerWidth < 768;\n\n return (\n <div className={classes.root} data-testid=\"search-control\">\n {!props.hideToolbar && (\n <Group position=\"apart\" mb=\"xl\">\n <Group spacing={2}>\n <Button\n compact\n variant={buttonVariant}\n color={buttonColor}\n leftIcon={<IconColumns size={iconSize} />}\n onClick={() => setState({ ...stateRef.current, fieldEditorVisible: true })}\n >\n Fields\n </Button>\n <Button\n compact\n variant={buttonVariant}\n color={buttonColor}\n leftIcon={<IconFilter size={iconSize} />}\n onClick={() => setState({ ...stateRef.current, filterEditorVisible: true })}\n >\n Filters\n </Button>\n {props.onNew && (\n <Button\n compact\n variant={buttonVariant}\n color={buttonColor}\n leftIcon={<IconFilePlus size={iconSize} />}\n onClick={props.onNew}\n >\n New...\n </Button>\n )}\n {!isMobile && isExportPassed() && (\n <Button\n compact\n variant={buttonVariant}\n color={buttonColor}\n leftIcon={<IconTableExport size={iconSize} />}\n onClick={\n props.onExport ? props.onExport : () => setState({ ...stateRef.current, exportDialogVisible: true })\n }\n >\n Export...\n </Button>\n )}\n {!isMobile && props.onDelete && (\n <Button\n compact\n variant={buttonVariant}\n color={buttonColor}\n leftIcon={<IconTrash size={iconSize} />}\n onClick={() => (props.onDelete as (ids: string[]) => any)(Object.keys(state.selected))}\n >\n Delete...\n </Button>\n )}\n {!isMobile && props.onBulk && (\n <Button\n compact\n variant={buttonVariant}\n color={buttonColor}\n leftIcon={<IconBoxMultiple size={iconSize} />}\n onClick={() => (props.onBulk as (ids: string[]) => any)(Object.keys(state.selected))}\n >\n Bulk...\n </Button>\n )}\n </Group>\n {lastResult && (\n <Text size=\"xs\" color=\"dimmed\">\n {getStart(search, lastResult.total as number)}-{getEnd(search, lastResult.total as number)} of{' '}\n {lastResult.total?.toLocaleString()}\n </Text>\n )}\n </Group>\n )}\n <Table className={classes.table}>\n <thead>\n <tr>\n {checkboxColumn && (\n <th>\n <input\n type=\"checkbox\"\n value=\"checked\"\n aria-label=\"all-checkbox\"\n data-testid=\"all-checkbox\"\n checked={isAllSelected()}\n onChange={(e) => handleAllCheckboxClick(e)}\n />\n </th>\n )}\n {fields.map((field) => (\n <th key={field.name}>\n <Menu shadow=\"md\" width={240} position=\"bottom-end\">\n <Menu.Target>\n <UnstyledButton className={classes.control}>\n <Group position=\"apart\" noWrap>\n <Text weight={500} size=\"sm\">\n {buildFieldNameString(field.name)}\n </Text>\n <Center className={classes.icon}>\n <IconAdjustmentsHorizontal size={14} stroke={1.5} />\n </Center>\n </Group>\n </UnstyledButton>\n </Menu.Target>\n <SearchPopupMenu\n search={props.search}\n searchParams={field.searchParams}\n onPrompt={(searchParam, filter) => {\n setState({\n ...stateRef.current,\n filterDialogVisible: true,\n filterDialogSearchParam: searchParam,\n filterDialogFilter: filter,\n });\n }}\n onChange={(result) => {\n emitSearchChange(result);\n }}\n />\n </Menu>\n </th>\n ))}\n </tr>\n {!props.hideFilters && (\n <tr>\n {checkboxColumn && <th />}\n {fields.map((field) => (\n <th key={field.name}>\n {field.searchParams && (\n <FilterDescription\n resourceType={resourceType}\n searchParams={field.searchParams}\n filters={props.search.filters}\n />\n )}\n </th>\n ))}\n </tr>\n )}\n </thead>\n <tbody>\n {resources?.map(\n (resource) =>\n resource && (\n <tr\n key={resource.id}\n className={classes.tr}\n data-testid=\"search-control-row\"\n onClick={(e) => handleRowClick(e, resource)}\n onAuxClick={(e) => handleRowClick(e, resource)}\n >\n {checkboxColumn && (\n <td>\n <input\n type=\"checkbox\"\n value=\"checked\"\n data-testid=\"row-checkbox\"\n aria-label={`Checkbox for ${resource.id}`}\n checked={!!state.selected[resource.id as string]}\n onChange={(e) => handleSingleCheckboxClick(e, resource.id as string)}\n />\n </td>\n )}\n {fields.map((field) => (\n <td key={field.name}>{renderValue(resource, field)}</td>\n ))}\n </tr>\n )\n )}\n </tbody>\n </Table>\n {resources?.length === 0 && (\n <Container>\n <Center style={{ height: 150 }}>\n <Text size=\"xl\" color=\"dimmed\">\n No results\n </Text>\n </Center>\n </Container>\n )}\n {lastResult?.total !== undefined && lastResult.total > 0 && (\n <Center m=\"md\" p=\"md\">\n <Pagination\n value={getPage(search)}\n total={getTotalPages(search, lastResult.total)}\n onChange={(newPage) => emitSearchChange(setPage(search, newPage))}\n getControlProps={(control) => {\n switch (control) {\n case 'previous':\n return { 'aria-label': 'Previous page' };\n case 'next':\n return { 'aria-label': 'Next page' };\n default:\n return {};\n }\n }}\n />\n </Center>\n )}\n {outcome && (\n <div data-testid=\"search-error\">\n <pre style={{ textAlign: 'left' }}>{JSON.stringify(outcome, undefined, 2)}</pre>\n </div>\n )}\n <SearchFieldEditor\n search={props.search}\n visible={stateRef.current.fieldEditorVisible}\n onOk={(result) => {\n emitSearchChange(result);\n setState({\n ...stateRef.current,\n fieldEditorVisible: false,\n });\n }}\n onCancel={() => {\n setState({\n ...stateRef.current,\n fieldEditorVisible: false,\n });\n }}\n />\n <SearchFilterEditor\n search={props.search}\n visible={stateRef.current.filterEditorVisible}\n onOk={(result) => {\n emitSearchChange(result);\n setState({\n ...stateRef.current,\n filterEditorVisible: false,\n });\n }}\n onCancel={() => {\n setState({\n ...stateRef.current,\n filterEditorVisible: false,\n });\n }}\n />\n <SearchExportDialog\n visible={stateRef.current.exportDialogVisible}\n exportCsv={props.onExportCsv}\n exportTransactionBundle={props.onExportTransactionBundle}\n onCancel={() => {\n setState({\n ...stateRef.current,\n exportDialogVisible: false,\n });\n }}\n />\n <SearchFilterValueDialog\n key={state.filterDialogSearchParam?.code}\n visible={stateRef.current.filterDialogVisible}\n title={'Input'}\n resourceType={resourceType}\n searchParam={state.filterDialogSearchParam}\n filter={state.filterDialogFilter}\n defaultValue={''}\n onOk={(filter) => {\n emitSearchChange(addFilter(props.search, filter.code, filter.operator, filter.value));\n setState({\n ...stateRef.current,\n filterDialogVisible: false,\n });\n }}\n onCancel={() => {\n setState({\n ...stateRef.current,\n filterDialogVisible: false,\n });\n }}\n />\n </div>\n );\n}\n\nexport const MemoizedSearchControl = React.memo(SearchControl);\n\ninterface FilterDescriptionProps {\n readonly resourceType: string;\n readonly searchParams: SearchParameter[];\n readonly filters?: Filter[];\n}\n\nfunction FilterDescription(props: FilterDescriptionProps): JSX.Element {\n const filters = (props.filters ?? []).filter((f) => props.searchParams.find((p) => p.code === f.code));\n if (filters.length === 0) {\n return <span>no filters</span>;\n }\n\n return (\n <>\n {filters.map((filter: Filter, index: number) => (\n <div key={`filter-${index}-${filters.length}`}>\n {getOpString(filter.operator)}\n \n <SearchFilterValueDisplay resourceType={props.resourceType} filter={filter} />\n </div>\n ))}\n </>\n );\n}\n\nfunction getPage(search: SearchRequest): number {\n return Math.floor((search.offset || 0) / (search.count || DEFAULT_SEARCH_COUNT)) + 1;\n}\n\nfunction getTotalPages(search: SearchRequest, total: number): number {\n const pageSize = search.count || DEFAULT_SEARCH_COUNT;\n return Math.ceil(total / pageSize);\n}\n\nfunction getStart(search: SearchRequest, total: number): number {\n return Math.min(total, (search.offset ?? 0) + 1);\n}\n\nfunction getEnd(search: SearchRequest, total: number): number {\n return Math.min(total, ((search.offset ?? 0) + 1) * (search.count ?? DEFAULT_SEARCH_COUNT));\n}\n"],"names":[],"mappings":"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"}
|