@medplum/react 0.9.20 → 0.9.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.js +407 -94
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/index.min.js +1 -1
- package/dist/cjs/index.min.js.map +1 -1
- package/dist/cjs/styles.css +109 -36
- package/dist/esm/index.js +406 -97
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/index.min.js +1 -1
- package/dist/esm/index.min.js.map +1 -1
- package/dist/esm/styles.css +109 -36
- package/dist/types/RegisterForm.d.ts +17 -0
- package/dist/types/index.d.ts +3 -0
- package/dist/types/stories/QuestionnaireForm.stories.d.ts +2 -0
- package/dist/types/stories/RegisterForm.stories.d.ts +7 -0
- package/dist/types/utils/recaptcha.d.ts +10 -0
- package/package.json +12 -12
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.min.js","sources":["../../../src/AddressDisplay.tsx","../../../src/utils/outcomes.ts","../../../src/Input.tsx","../../../src/InputRow.tsx","../../../src/Select.tsx","../../../src/AddressInput.tsx","../../../src/AttachmentDisplay.tsx","../../../src/AttachmentArrayDisplay.tsx","../../../src/Button.tsx","../../../src/MedplumProvider.tsx","../../../src/utils/dom.ts","../../../src/UploadButton.tsx","../../../src/AttachmentArrayInput.tsx","../../../src/AttachmentInput.tsx","../../../src/Autocomplete.tsx","../../../src/MedplumLink.tsx","../../../src/useResource.ts","../../../src/Avatar.tsx","../../../src/CheckboxFormSection.tsx","../../../src/constants.ts","../../../src/FormSection.tsx","../../../src/ResourceForm.tsx","../../../src/DescriptionList.tsx","../../../src/BackboneElementDisplay.tsx","../../../src/CodingDisplay.tsx","../../../src/CodeableConceptDisplay.tsx","../../../src/ContactPointDisplay.tsx","../../../src/ContactDetailDisplay.tsx","../../../src/DateTimeDisplay.tsx","../../../src/HumanNameDisplay.tsx","../../../src/IdentifierDisplay.tsx","../../../src/PeriodDisplay.tsx","../../../src/QuantityDisplay.tsx","../../../src/RangeDisplay.tsx","../../../src/RatioDisplay.tsx","../../../src/ReferenceDisplay.tsx","../../../src/ResourceArrayDisplay.tsx","../../../src/ResourcePropertyDisplay.tsx","../../../src/AnnotationInput.tsx","../../../src/Checkbox.tsx","../../../src/CodeableConceptInput.tsx","../../../src/CodeInput.tsx","../../../src/CodingInput.tsx","../../../src/ContactPointInput.tsx","../../../src/ContactDetailInput.tsx","../../../src/DateTimeInput.tsx","../../../src/TextArea.tsx","../../../src/ExtensionInput.tsx","../../../src/HumanNameInput.tsx","../../../src/IdentifierInput.tsx","../../../src/PeriodInput.tsx","../../../src/QuantityInput.tsx","../../../src/RangeInput.tsx","../../../src/RatioInput.tsx","../../../src/ResourceName.tsx","../../../src/ResourceInput.tsx","../../../src/ReferenceInput.tsx","../../../src/ResourceArrayInput.tsx","../../../src/ResourcePropertyInput.tsx","../../../src/BackboneElementInput.tsx","../../../src/ResourceBadge.tsx","../../../src/DiagnosticReportDisplay.tsx","../../../src/FormUtils.ts","../../../src/Form.tsx","../../../src/Loading.tsx","../../../src/MenuItem.tsx","../../../src/ResourceDiffTable.tsx","../../../src/ResourceTable.tsx","../../../src/Scrollable.tsx","../../../src/ErrorBoundary.tsx","../../../src/Popup.tsx","../../../src/Timeline.tsx","../../../src/utils/date.ts","../../../src/ResourceTimeline.tsx","../../../src/Document.tsx","../../../src/FhirPathDisplay.tsx","../../../src/SearchControlField.ts","../../../src/Dialog.tsx","../../../src/SearchUtils.tsx","../../../src/SearchFieldEditor.tsx","../../../src/SearchFilterValueDisplay.tsx","../../../src/SearchFilterValueInput.tsx","../../../src/SearchFilterEditor.tsx","../../../src/SearchFilterValueDialog.tsx","../../../src/MenuSeparator.tsx","../../../src/SubMenu.tsx","../../../src/SearchPopupMenu.tsx","../../../src/TitleBar.tsx","../../../src/SearchControl.tsx","../../../src/FhirPathTable.tsx","../../../../node_modules/tslib/tslib.es6.js","../../../src/HeaderSearchInput.tsx","../../../src/Logo.tsx","../../../src/PatientTimeline.tsx","../../../src/PlanDefinitionBuilder.tsx","../../../src/QuestionnaireUtils.ts","../../../src/QuestionnaireForm.tsx","../../../src/QuestionnaireBuilder.tsx","../../../src/StatusBadge.tsx","../../../src/utils/diff.ts","../../../src/utils/blame.ts","../../../src/ResourceBlame.tsx","../../../src/ResourceDiff.tsx","../../../src/ResourceHistoryTable.tsx","../../../src/utils.ts","../../../src/GoogleButton.tsx","../../../src/SignInForm.tsx","../../../src/Tab.tsx","../../../src/TabPanel.tsx","../../../src/DefaultResourceTimeline.tsx","../../../src/EncounterTimeline.tsx","../../../src/FooterLinks.tsx","../../../src/Header.tsx","../../../src/RequestGroupDisplay.tsx","../../../src/ServiceRequestTimeline.tsx","../../../src/TabList.tsx","../../../src/TabSwitch.tsx"],"sourcesContent":["import { formatAddress } from '@medplum/core';\nimport { Address } from '@medplum/fhirtypes';\nimport React from 'react';\n\nexport interface AddressDisplayProps {\n value?: Address;\n}\n\nexport function AddressDisplay(props: AddressDisplayProps): JSX.Element | null {\n const address = props.value;\n if (!address) {\n return null;\n }\n\n return <>{formatAddress(address)}</>;\n}\n","import { OperationOutcome, OperationOutcomeIssue } from '@medplum/fhirtypes';\n\nexport function getIssuesForExpression(\n outcome: OperationOutcome | undefined,\n expression: string | undefined\n): OperationOutcomeIssue[] | undefined {\n return outcome?.issue?.filter((issue) => issue.expression?.[0] === expression);\n}\n","import { OperationOutcome } from '@medplum/fhirtypes';\nimport React, { RefObject } from 'react';\nimport { getIssuesForExpression } from './utils/outcomes';\nimport './Input.css';\n\nexport interface InputProps {\n name?: string;\n type?: string;\n size?: number;\n step?: number | 'any';\n style?: React.CSSProperties;\n defaultValue?: string | number;\n required?: boolean;\n autoCapitalize?: string;\n autoComplete?: string;\n autoFocus?: boolean;\n inputRef?: RefObject<HTMLInputElement>;\n outcome?: OperationOutcome;\n placeholder?: string;\n testid?: string;\n disabled?: boolean;\n onChange?: (newValue: string) => void;\n}\n\nexport function Input(props: InputProps): JSX.Element {\n const className = 'medplum-input';\n const issues = getIssuesForExpression(props.outcome, props.name);\n const invalid = issues && issues.length > 0;\n return (\n <input\n id={props.name}\n name={props.name}\n type={getInputType(props.type)}\n size={props.size}\n step={props.step}\n className={className}\n style={props.style}\n defaultValue={props.defaultValue || ''}\n required={props.required}\n autoCapitalize={props.autoCapitalize}\n autoComplete={props.autoComplete}\n autoFocus={props.autoFocus}\n ref={props.inputRef}\n aria-invalid={invalid}\n aria-describedby={invalid ? props.name + '-errors' : ''}\n placeholder={props.placeholder}\n data-testid={props.testid}\n disabled={props.disabled}\n onChange={(e) => {\n if (props.onChange) {\n props.onChange(e.currentTarget.value);\n }\n }}\n />\n );\n}\n\n/**\n * Returns the input type for the requested type.\n * JSDOM does not support many of the valid <input> type attributes.\n * For example, it won't fire change events for <input type=\"datetime-local\">.\n * @param requestedType The optional type as requested by the parent component.\n */\nfunction getInputType(requestedType: string | undefined): string {\n const result = requestedType || 'text';\n return process.env.NODE_ENV === 'test' ? result.replace(/datetime-local|date/, 'text') : result;\n}\n","import React from 'react';\nimport './InputRow.css';\n\nexport interface InputRowProps {\n justifyContent?: string;\n children: React.ReactNode;\n}\n\nexport function InputRow(props: InputRowProps): JSX.Element {\n return (\n <div className=\"medplum-input-row\" style={{ justifyContent: props.justifyContent }}>\n {props.children}\n </div>\n );\n}\n","import { OperationOutcome } from '@medplum/fhirtypes';\nimport React, { RefObject } from 'react';\nimport { getIssuesForExpression } from './utils/outcomes';\nimport './Select.css';\n\nexport interface SelectProps {\n name?: string;\n defaultValue?: string;\n required?: boolean;\n autoFocus?: boolean;\n inputRef?: RefObject<HTMLSelectElement>;\n children: React.ReactNode;\n outcome?: OperationOutcome;\n testid?: string;\n style?: React.CSSProperties;\n onChange?: (newValue: string) => void;\n}\n\nexport function Select(props: SelectProps): JSX.Element {\n const className = 'medplum-select';\n const issues = getIssuesForExpression(props.outcome, props.name);\n const invalid = issues && issues.length > 0;\n return (\n <select\n id={props.name}\n name={props.name}\n className={className}\n defaultValue={props.defaultValue || ''}\n required={props.required}\n autoFocus={props.autoFocus}\n ref={props.inputRef}\n style={props.style}\n aria-invalid={invalid}\n aria-describedby={invalid ? props.name + '-errors' : ''}\n data-testid={props.testid}\n onChange={(e) => {\n if (props.onChange) {\n props.onChange(e.currentTarget.value);\n }\n }}\n >\n {props.children}\n </select>\n );\n}\n","import { Address } from '@medplum/fhirtypes';\nimport React, { useRef, useState } from 'react';\nimport { Input } from './Input';\nimport { InputRow } from './InputRow';\nimport { Select } from './Select';\n\nfunction getLine(address: Address, index: number): string {\n return address && address.line && address.line.length > index ? address.line[index] : '';\n}\n\nfunction setLine(address: Address, index: number, str: string): Address {\n const line: string[] = address.line || [];\n while (line.length <= index) {\n line.push('');\n }\n line[index] = str;\n return { ...address, line };\n}\n\nexport interface AddressInputProps {\n name: string;\n defaultValue?: Address;\n onChange?: (value: Address) => void;\n}\n\nexport function AddressInput(props: AddressInputProps): JSX.Element {\n const [value, setValue] = useState<Address>(props.defaultValue || {});\n\n const valueRef = useRef<Address>();\n valueRef.current = value;\n\n function setValueWrapper(newValue: Address): void {\n setValue(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n function setUse(use: string): void {\n setValueWrapper({ ...valueRef.current, use });\n }\n\n function setType(type: string): void {\n setValueWrapper({ ...valueRef.current, type });\n }\n\n function setLine1(line1: string): void {\n setValueWrapper(setLine(valueRef.current || {}, 0, line1));\n }\n\n function setLine2(line2: string): void {\n setValueWrapper(setLine(valueRef.current || {}, 1, line2));\n }\n\n function setCity(city: string): void {\n setValueWrapper({ ...valueRef.current, city });\n }\n\n function setState(state: string): void {\n setValueWrapper({ ...valueRef.current, state });\n }\n\n function setPostalCode(postalCode: string): void {\n setValueWrapper({ ...valueRef.current, postalCode });\n }\n\n return (\n <InputRow>\n <Select testid=\"address-use\" defaultValue={value?.use} onChange={setUse}>\n <option></option>\n <option>home</option>\n <option>mobile</option>\n <option>old</option>\n <option>temp</option>\n <option>work</option>\n </Select>\n <Select testid=\"address-type\" defaultValue={value?.type} onChange={setType}>\n <option></option>\n <option>postal</option>\n <option>physical</option>\n <option>both</option>\n </Select>\n <Input placeholder=\"Line 1\" defaultValue={getLine(value, 0)} onChange={setLine1} />\n <Input placeholder=\"Line 2\" defaultValue={getLine(value, 1)} onChange={setLine2} />\n <Input placeholder=\"City\" defaultValue={value.city} onChange={setCity} />\n <Input placeholder=\"State\" defaultValue={value.state} onChange={setState} />\n <Input placeholder=\"Postal Code\" defaultValue={value.postalCode} onChange={setPostalCode} />\n </InputRow>\n );\n}\n","import { Attachment } from '@medplum/fhirtypes';\nimport React from 'react';\n\nexport interface AttachmentDisplayProps {\n value?: Attachment;\n maxWidth?: number;\n}\n\nexport function AttachmentDisplay(props: AttachmentDisplayProps): JSX.Element | null {\n const value = props.value;\n const { contentType, url, title } = value ?? {};\n\n if (!url) {\n return null;\n }\n\n return (\n <div data-testid=\"attachment-display\">\n {contentType?.startsWith('image/') && (\n <img data-testid=\"attachment-image\" style={{ maxWidth: props.maxWidth }} src={url} alt={value?.title} />\n )}\n {contentType?.startsWith('video/') && (\n <video data-testid=\"attachment-video\" style={{ maxWidth: props.maxWidth }} controls={true}>\n <source type={contentType} src={url} />\n </video>\n )}\n {contentType === 'application/pdf' && !title?.endsWith('.pdf') && (\n <div data-testid=\"attachment-pdf\" style={{ maxWidth: props.maxWidth, minHeight: 400 }}>\n <iframe\n width=\"100%\"\n height=\"400\"\n src={url + '#navpanes=0'}\n allowFullScreen={true}\n frameBorder={0}\n seamless={true}\n />\n </div>\n )}\n <div data-testid=\"download-link\" style={{ padding: '2px 16px 16px 16px' }}>\n <a href={value?.url} data-testid=\"attachment-details\" target=\"_blank\" rel=\"noopener noreferrer\">\n {value?.title || 'Download'}\n </a>\n </div>\n </div>\n );\n}\n","import { Attachment } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { AttachmentDisplay } from './AttachmentDisplay';\n\nexport interface AttachmentArrayDisplayProps {\n values?: Attachment[];\n maxWidth?: number;\n}\n\nexport function AttachmentArrayDisplay(props: AttachmentArrayDisplayProps): JSX.Element {\n return (\n <div>\n {props.values &&\n props.values.map((v, index) => (\n <div key={'attatchment-' + index}>\n <AttachmentDisplay value={v} maxWidth={props.maxWidth} />\n </div>\n ))}\n </div>\n );\n}\n","import React from 'react';\nimport './Button.css';\n\nexport interface ButtonProps {\n type?: 'button' | 'submit';\n style?: React.CSSProperties;\n primary?: boolean;\n danger?: boolean;\n borderless?: boolean;\n size?: 'small' | 'medium' | 'large';\n onClick?: (e: React.MouseEvent) => void;\n children: React.ReactNode;\n label?: string;\n testid?: string;\n}\n\nexport function Button(props: ButtonProps): JSX.Element {\n const className =\n 'medplum-button' +\n (props.primary || props.type === 'submit' ? ' medplum-button-primary' : '') +\n (props.danger ? ' medplum-button-danger' : '') +\n (props.borderless ? ' medplum-button-borderless' : '') +\n (props.size ? ' medplum-button-' + props.size : '');\n return (\n <button\n type={props.type || 'button'}\n className={className}\n style={props.style}\n onClick={props.onClick}\n aria-label={props.label}\n data-testid={props.testid}\n >\n {props.children}\n </button>\n );\n}\n","import { MedplumClient, ProfileResource } from '@medplum/core';\nimport React, { createContext, useContext, useEffect, useState } from 'react';\n\nconst reactContext = createContext(undefined as MedplumContext | undefined);\n\nexport interface MedplumProviderProps {\n medplum: MedplumClient;\n children: React.ReactNode;\n}\n\nexport interface MedplumContext {\n medplum: MedplumClient;\n profile?: ProfileResource;\n loading: boolean;\n}\n\n/**\n * The MedplumProvider component provides Medplum context state.\n *\n * Medplum context includes:\n * 1) medplum - Medplum client library\n * 2) profile - The current user profile (if signed in)\n */\nexport function MedplumProvider(props: MedplumProviderProps): JSX.Element {\n const medplum = props.medplum;\n\n const [state, setState] = useState({\n profile: medplum.getProfile(),\n loading: false,\n });\n\n useEffect(() => {\n function eventListener(): void {\n setState({\n ...state,\n profile: medplum.getProfile(),\n });\n }\n\n medplum.addEventListener('change', eventListener);\n return () => medplum.removeEventListeneer('change', eventListener);\n }, [medplum, state]);\n\n const medplumContext = {\n ...state,\n medplum,\n };\n\n return <reactContext.Provider value={medplumContext}>{props.children}</reactContext.Provider>;\n}\n\n/**\n * Returns the MedplumContext instance.\n */\nexport function useMedplumContext(): MedplumContext {\n return useContext(reactContext) as MedplumContext;\n}\n\n/**\n * Returns the MedplumClient instance.\n * This is a shortcut for useMedplumContext().medplum.\n */\nexport function useMedplum(): MedplumClient {\n return useMedplumContext().medplum;\n}\n\n/**\n * Returns the current Medplum user profile (if signed in).\n * This is a shortcut for useMedplumContext().profile.\n * @returns The current user profile.\n */\nexport function useMedplumProfile(): ProfileResource | undefined {\n return useMedplumContext().profile;\n}\n","/**\n * Kills a browser event.\n * Prevents default behavior.\n * Stops event propagation.\n * @param e The event.\n */\nexport function killEvent(e: Event | React.SyntheticEvent): void {\n e.preventDefault();\n e.stopPropagation();\n}\n\n/**\n * Returns true if the element is a checkbox or a table cell containing a checkbox.\n * Table cells containing checkboxes are commonly accidentally clicked.\n * @param el The HTML DOM element.\n * @returns True if the element is a checkbox or a table cell containing a checkbox.\n */\nexport function isCheckboxCell(el: Element): boolean {\n if (isCheckboxElement(el)) {\n return true;\n }\n\n if (el instanceof HTMLTableCellElement) {\n const children = el.children;\n if (children.length === 1 && isCheckboxElement(children[0])) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction isCheckboxElement(el: Element): boolean {\n return el instanceof HTMLInputElement && el.type === 'checkbox';\n}\n","import { Attachment, Binary, OperationOutcome } from '@medplum/fhirtypes';\nimport React, { useRef } from 'react';\nimport { Button } from './Button';\nimport { useMedplum } from './MedplumProvider';\nimport { killEvent } from './utils/dom';\n\nexport interface UploadButtonProps {\n onUpload: (attachment: Attachment) => void;\n children?: React.ReactNode;\n}\n\nexport function UploadButton(props: UploadButtonProps): JSX.Element {\n const medplum = useMedplum();\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n function onFileChange(e: React.ChangeEvent): void {\n killEvent(e);\n const files = (e.target as HTMLInputElement).files;\n if (files) {\n Array.from(files).forEach(processFile);\n }\n }\n\n /**\n * Processes a single file.\n *\n * @param {File} file The file descriptor.\n */\n function processFile(file: File): void {\n if (!file) {\n return;\n }\n\n const fileName = file.name;\n if (!fileName) {\n return;\n }\n\n const filename = file.name;\n const contentType = file.type || 'application/octet-stream';\n medplum\n .createBinary(file, filename, contentType)\n .then((binary: Binary) => {\n props.onUpload({\n contentType: binary.contentType,\n url: binary.url,\n title: filename,\n });\n })\n .catch((outcome: OperationOutcome) => {\n alert(outcome?.issue?.[0]?.details?.text);\n });\n }\n\n return (\n <>\n <input\n type=\"file\"\n data-testid=\"upload-file-input\"\n style={{ display: 'none' }}\n ref={fileInputRef}\n onChange={(e) => onFileChange(e)}\n />\n <Button\n testid=\"upload-button\"\n onClick={(e) => {\n killEvent(e);\n fileInputRef.current?.click();\n }}\n >\n {props.children || 'Upload...'}\n </Button>\n </>\n );\n}\n","import { Attachment } from '@medplum/fhirtypes';\nimport React, { useRef, useState } from 'react';\nimport { AttachmentDisplay } from './AttachmentDisplay';\nimport { Button } from './Button';\nimport { UploadButton } from './UploadButton';\nimport { killEvent } from './utils/dom';\n\nexport interface AttachmentArrayInputProps {\n name: string;\n defaultValue?: Attachment[];\n arrayElement?: boolean;\n onChange?: (value: Attachment[]) => void;\n}\n\nexport function AttachmentArrayInput(props: AttachmentArrayInputProps): JSX.Element {\n const [values, setValues] = useState<Attachment[]>(props.defaultValue ?? []);\n\n const valuesRef = useRef<Attachment[]>();\n valuesRef.current = values;\n\n function setValuesWrapper(newValues: Attachment[]): void {\n setValues(newValues);\n if (props.onChange) {\n props.onChange(newValues);\n }\n }\n\n return (\n <table style={{ width: '100%' }}>\n <colgroup>\n <col width=\"90%\" />\n <col width=\"10%\" />\n </colgroup>\n <tbody>\n {values.map((v: Attachment, index: number) => (\n <tr key={`${index}-${values.length}`}>\n <td>\n <AttachmentDisplay value={v} maxWidth={200} />\n </td>\n <td className=\"medplum-right\">\n <Button\n onClick={(e) => {\n killEvent(e);\n const copy = values.slice();\n copy.splice(index, 1);\n setValuesWrapper(copy);\n }}\n >\n Remove\n </Button>\n </td>\n </tr>\n ))}\n <tr>\n <td></td>\n <td className=\"medplum-right\">\n <UploadButton\n onUpload={(attachment: Attachment) => {\n setValuesWrapper([...(valuesRef.current as Attachment[]), attachment]);\n }}\n />\n </td>\n </tr>\n </tbody>\n </table>\n );\n}\n","import { Attachment } from '@medplum/fhirtypes';\nimport React, { useState } from 'react';\nimport { AttachmentDisplay } from './AttachmentDisplay';\nimport { Button } from './Button';\nimport { UploadButton } from './UploadButton';\nimport { killEvent } from './utils/dom';\n\nexport interface AttachmentInputProps {\n name: string;\n defaultValue?: Attachment;\n arrayElement?: boolean;\n onChange?: (value: Attachment | undefined) => void;\n}\n\nexport function AttachmentInput(props: AttachmentInputProps): JSX.Element {\n const [value, setValue] = useState(props.defaultValue);\n\n function setValueWrapper(newValue: Attachment | undefined): void {\n setValue(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n if (value) {\n return (\n <>\n <AttachmentDisplay value={value} maxWidth={200} />\n <Button\n onClick={(e) => {\n killEvent(e);\n setValueWrapper(undefined);\n }}\n >\n Remove\n </Button>\n </>\n );\n }\n\n return <UploadButton onUpload={setValueWrapper} />;\n}\n","import React, { useEffect, useRef, useState } from 'react';\nimport { killEvent } from './utils/dom';\nimport './Autocomplete.css';\n\nexport interface AutocompleteProps<T> {\n name: string;\n multiple?: boolean;\n autofocus?: boolean;\n defaultValue?: T[];\n className?: string;\n placeholder?: string;\n loadOptions: (input: string, signal: AbortSignal) => Promise<T[]>;\n buildUnstructured?: (input: string) => T;\n getId: (item: T) => string;\n getIcon?: (item: T) => JSX.Element;\n getDisplay: (item: T) => JSX.Element;\n getHelpText?: (item: T) => string | undefined;\n onChange?: (values: T[]) => void;\n onCreateNew?: () => void;\n}\n\nexport function Autocomplete<T>(props: AutocompleteProps<T>): JSX.Element {\n const inputRef = useRef<HTMLInputElement>(null);\n const [focused, setFocused] = useState(false);\n const [lastValue, setLastValue] = useState('');\n const [timer, setTimer] = useState<number>();\n const [dropDownVisible, setDropDownVisible] = useState(false);\n const [values, setValues] = useState(props.defaultValue ?? []);\n const [options, setOptions] = useState<T[]>([]);\n const [selectedIndex, setSelectedIndex] = useState(-1);\n const [abortController, setAbortController] = useState<AbortController>();\n const [autoSubmit, setAutoSubmit] = useState<boolean>();\n\n const lastValueRef = useRef<string>();\n lastValueRef.current = lastValue;\n\n const timerRef = useRef<number>();\n timerRef.current = timer;\n\n const abortControllerRef = useRef<AbortController>();\n abortControllerRef.current = abortController;\n\n const autoSubmitRef = useRef<boolean>();\n autoSubmitRef.current = autoSubmit;\n\n useEffect(() => {\n return () => {\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n }\n };\n }, []);\n\n useEffect(() => {\n setValues(props.defaultValue ?? []);\n }, [props.defaultValue]);\n\n function setValuesWrapper(newValues: T[]): void {\n setValues(newValues);\n if (props.onChange) {\n props.onChange(newValues);\n }\n }\n\n /**\n * Adds an option to the list of selected options.\n * @param option The option.\n */\n function addOption(option: T): void {\n const inputElement = inputRef.current as HTMLInputElement;\n inputElement.value = '';\n\n const newValues = props.multiple ? [...values, option] : [option];\n setFocused(true);\n setDropDownVisible(false);\n setLastValue('');\n setOptions([]);\n setSelectedIndex(-1);\n setValuesWrapper(newValues);\n }\n\n function handleClick(): void {\n inputRef.current?.focus();\n }\n\n function handleFocus(): void {\n setFocused(true);\n }\n\n function handleBlur(): void {\n setFocused(false);\n dismissOnDelay();\n }\n\n /**\n * Handles an input event.\n * Clears existing timers.\n * Schedules a timer to execute the search after a short delay.\n */\n function handleInput(): void {\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n setAbortController(undefined);\n }\n\n if (timerRef.current !== undefined) {\n window.clearTimeout(timerRef.current);\n }\n\n const newTimer = window.setTimeout(() => handleTimer(), 100);\n setTimer(newTimer);\n }\n\n function handleKeyDown(e: React.KeyboardEvent): void {\n switch (e.key) {\n case 'Enter':\n case 'Tab':\n handleSelectKey(e);\n break;\n\n case 'ArrowUp':\n moveSelection(-1);\n killEvent(e);\n break;\n\n case 'ArrowDown':\n moveSelection(1);\n killEvent(e);\n break;\n\n case 'Backspace':\n handleBackspaceKey(e);\n break;\n\n case ',':\n case ';':\n handleSeparatorKey(e);\n }\n }\n\n /**\n * Handles the \"enter\" or \"tab\" keys. The enter key logic is:\n * Try to add an option with tryAddOption. On success, cancel event.\n * Otherwise, let the browser handle the enter key normally.\n *\n * @param e The key down event.\n */\n function handleSelectKey(e: React.KeyboardEvent): void {\n if (!timerRef.current && !abortControllerRef.current && tryAddOption()) {\n killEvent(e);\n inputRef.current?.focus();\n } else {\n // The user pressed enter, but we don't have results yet.\n // We need to wait for the results to come in.\n setAutoSubmit(true);\n }\n }\n\n /**\n * Handles the \"backspace\" key. The backspace key logic is:\n * If the input is empty and there is at least one item, delete the last item.\n * Otherwise, let the browser handle the backspace key normally.\n *\n * @param e The key down event.\n */\n function handleBackspaceKey(e: React.KeyboardEvent): void {\n if (inputRef.current?.value) {\n // If there is still text in the input,\n // then handle backspace as normal.\n return;\n }\n\n if (values.length > 0) {\n // If there are selected items,\n // then delete the last item.\n killEvent(e);\n setValuesWrapper(values.slice(0, values.length - 1));\n }\n }\n\n /**\n * Handles a \"separator\" key (comma, semicolon, others?).\n *\n * The separator key logic is:\n * If the drop down is visible and something is selected, choose that.\n * If the drop down is visible but nothing is selected, choose the first.\n * If there is content in the input, use that as a \"gray\" option.\n * Otherwise, ignore.\n *\n * @param e The key down event.\n */\n function handleSeparatorKey(e: React.KeyboardEvent): void {\n tryAddOption();\n killEvent(e);\n inputRef.current?.focus();\n }\n\n /**\n * Tries to capture the existing input as an option.\n *\n * @return True if captured an option; false otherwise.\n */\n function tryAddOption(): boolean {\n let option: T | undefined;\n\n if (selectedIndex >= 0 && selectedIndex < options.length) {\n // Currently highlighted row\n option = options[selectedIndex];\n } else if (selectedIndex === -1 && options.length > 0) {\n // Default to first row\n option = options[0];\n } else if (props.buildUnstructured && inputRef.current?.value) {\n // Build semi-structured item\n option = props.buildUnstructured(inputRef.current.value);\n }\n\n if (!option) {\n return false;\n }\n\n addOption(option);\n return true;\n }\n\n /**\n * Handles a timer tick event.\n * If the contents of the input have changed, sends xhr to the server\n * for updated contents.\n */\n function handleTimer(): void {\n setTimer(undefined);\n\n const value = inputRef.current?.value?.trim() || '';\n if (value === lastValueRef.current) {\n // Nothing has changed, move on\n return;\n }\n\n if (!value) {\n setDropDownVisible(false);\n setLastValue('');\n setOptions([]);\n setSelectedIndex(-1);\n return;\n }\n\n setLastValue(value);\n\n const newAbortController = new AbortController();\n setAbortController(newAbortController);\n\n props\n .loadOptions(value, newAbortController.signal)\n .then((newOptions: T[]) => {\n if (!newAbortController.signal.aborted) {\n setDropDownVisible(newOptions.length > 0);\n setOptions(newOptions);\n setAbortController(undefined);\n if (autoSubmitRef.current) {\n addOption(newOptions[0]);\n setAutoSubmit(false);\n }\n }\n })\n .catch(console.log);\n }\n\n /**\n * Moves the selected row.\n * @param delta The amount to move the selection, up is negative.\n */\n function moveSelection(delta: number): void {\n let index = selectedIndex + delta;\n\n if (index < 0) {\n index = 0;\n } else if (index >= options.length) {\n index = options.length - 1;\n }\n\n setSelectedIndex(index);\n }\n\n /**\n * Handles a hover event.\n * @param _e The mouse event.\n * @param index The drop down option index.\n */\n function handleDropDownHover(_e: React.MouseEvent, index: number): void {\n setSelectedIndex(index);\n }\n\n /**\n * Handles a click event.\n * @param e The mouse event.\n * @param option The drop down option.\n */\n function handleDropDownClick(e: React.MouseEvent, option: T): void {\n killEvent(e);\n addOption(option);\n }\n\n /**\n * Dismisses the drop down menu after a slight delay.\n */\n function dismissOnDelay(): void {\n window.setTimeout(() => {\n setDropDownVisible(false);\n }, 200);\n }\n\n const baseClassName = props.className ?? 'medplum-autocomplete-container';\n\n return (\n <div\n data-testid=\"autocomplete\"\n className={baseClassName + (focused ? ' focused' : '')}\n onClick={() => handleClick()}\n >\n <ul onClick={() => handleClick()}>\n {values.map((value) => (\n <li key={props.getId(value)} data-testid=\"selected\" className=\"medplum-autocomplete-item choice\">\n {props.getDisplay(value)}\n </li>\n ))}\n <li className=\"medplum-autocomplete-item\">\n <input\n type=\"text\"\n autoFocus={props.autofocus}\n placeholder={values.length === 0 ? props.placeholder : undefined}\n autoComplete=\"off\"\n autoCapitalize=\"off\"\n spellCheck=\"true\"\n onFocus={() => handleFocus()}\n onBlur={() => handleBlur()}\n onChange={() => handleInput()}\n onInput={() => handleInput()}\n onKeyDown={(e: React.KeyboardEvent) => handleKeyDown(e)}\n ref={inputRef}\n data-testid=\"input-element\"\n />\n </li>\n </ul>\n {dropDownVisible && (\n <div className=\"medplum-autocomplete\" data-testid=\"dropdown\">\n {options.map((option, index) => (\n <div\n key={props.getId(option)}\n className={\n index === selectedIndex\n ? 'medplum-autocomplete-row medplum-autocomplete-active'\n : 'medplum-autocomplete-row'\n }\n onMouseOver={(e) => handleDropDownHover(e, index)}\n onClick={(e) => handleDropDownClick(e, option)}\n >\n {props.getIcon && <div className=\"medplum-autocomplete-icon\">{props.getIcon(option)}</div>}\n <div className=\"medplum-autocomplete-label\">\n {props.getDisplay(option)}\n {props.getHelpText && <div className=\"medplum-autocomplete-help-text\">{props.getHelpText(option)}</div>}\n </div>\n </div>\n ))}\n {props.onCreateNew && (\n <div className=\"medplum-autocomplete-row\" onClick={props.onCreateNew}>\n <div className=\"medplum-autocomplete-label\">Create new...</div>\n </div>\n )}\n </div>\n )}\n </div>\n );\n}\n","import { Reference, Resource } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { killEvent } from './utils/dom';\n\nexport interface MedplumLinkProps {\n to?: Resource | Reference | string;\n suffix?: string;\n label?: string;\n id?: string;\n testid?: string;\n className?: string;\n onClick?: () => void;\n children: React.ReactNode;\n}\n\nexport function MedplumLink(props: MedplumLinkProps): JSX.Element {\n const navigate = useNavigate();\n\n let href = '#';\n if (props.to) {\n if (typeof props.to === 'string') {\n href = props.to;\n } else if ('resourceType' in props.to) {\n href = `/${props.to.resourceType}/${props.to.id}`;\n } else if ('reference' in props.to) {\n href = `/${props.to.reference}`;\n }\n\n if (props.suffix) {\n href += '/' + props.suffix;\n }\n }\n\n return (\n <a\n href={href}\n id={props.id}\n aria-label={props.label}\n data-testid={props.testid || 'link'}\n className={props.className}\n onClick={(e: React.SyntheticEvent) => {\n killEvent(e);\n if (props.onClick) {\n props.onClick();\n } else if (props.to) {\n navigate(href);\n }\n }}\n >\n {props.children}\n </a>\n );\n}\n","import { MedplumClient } from '@medplum/core';\nimport { Device, Reference, Resource } from '@medplum/fhirtypes';\nimport { useEffect, useState } from 'react';\nimport { useMedplum } from './MedplumProvider';\n\nconst system: Device = {\n resourceType: 'Device',\n id: 'system',\n deviceName: [\n {\n name: 'System',\n },\n ],\n};\n\n/**\n * React Hook to use a FHIR reference.\n * Handles the complexity of resolving references and caching resources.\n * @param value The resource or reference to resource.\n * @returns The resolved resource.\n */\nexport function useResource<T extends Resource>(value: Reference<T> | T | undefined): T | undefined {\n const medplum = useMedplum();\n const [resource, setResource] = useState<T | undefined>(getInitialResource(medplum, value));\n\n useEffect(() => {\n let subscribed = true;\n\n if (!resource && value && 'reference' in value && value.reference) {\n medplum\n .readReference(value as Reference<T>)\n .then((r) => {\n if (subscribed) {\n setResource(r);\n }\n })\n .catch(() => setResource(undefined));\n }\n\n return (() => (subscribed = false)) as () => void;\n }, [medplum, resource, value]);\n\n return resource;\n}\n\n/**\n * Returns the initial resource value based on the input value.\n * If the input value is a resource, returns the resource.\n * If the input value is a reference to system, returns the system resource.\n * If the input value is a reference to a resource available in the cache, returns the resource.\n * Otherwise, returns undefined.\n * @param medplum The medplum client.\n * @param value The resource or reference to resource.\n * @returns An initial resource if available; undefined otherwise.\n */\nfunction getInitialResource<T extends Resource>(\n medplum: MedplumClient,\n value: Reference<T> | T | undefined\n): T | undefined {\n if (!value) {\n return undefined;\n }\n\n if ('resourceType' in value) {\n return value;\n }\n\n if ('reference' in value) {\n if (value.reference === 'system') {\n return system as T;\n }\n\n return medplum.getCachedReference(value);\n }\n\n return undefined;\n}\n","import { getDisplayString, getImageSrc } from '@medplum/core';\nimport { Reference, Resource } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { MedplumLink } from './MedplumLink';\nimport { useResource } from './useResource';\nimport './Avatar.css';\n\nexport interface AvatarProps {\n size?: 'xsmall' | 'small' | 'medium' | 'large';\n value?: Reference | Resource;\n src?: string;\n alt?: string;\n color?: string;\n link?: boolean;\n}\n\nexport function Avatar(props: AvatarProps): JSX.Element {\n const resource = useResource(props.value);\n const className = props.size ? 'medplum-avatar ' + props.size : 'medplum-avatar';\n const text = resource ? getDisplayString(resource) : props.alt ?? '';\n const initials = text && getInitials(text);\n const imageUrl = (resource && getImageSrc(resource)) ?? props.src;\n const innerContent = imageUrl ? <img src={imageUrl} alt={text} /> : initials;\n return (\n <div className={className} style={{ backgroundColor: props.color }} data-testid=\"avatar\">\n {props.link && resource ? <MedplumLink to={resource}>{innerContent}</MedplumLink> : innerContent}\n </div>\n );\n}\n\nfunction getInitials(text: string): string {\n return text\n .split(' ')\n .map((n) => n[0])\n .join('');\n}\n","import React from 'react';\nimport './CheckboxFormSection.css';\n\nexport interface CheckboxFormSectionProps {\n htmlFor?: string;\n title?: string;\n description?: string;\n children?: React.ReactNode;\n}\n\nexport function CheckboxFormSection(props: CheckboxFormSectionProps): JSX.Element {\n return (\n <div className=\"medplum-checkbox-form-section\">\n <div className=\"medplum-checkbox-form-section-checkbox-container\">{props.children}</div>\n <div className=\"medplum-checkbox-form-section-details-container\">\n <label htmlFor={props.htmlFor}>{props.title}</label>\n <p>{props.description}</p>\n </div>\n </div>\n );\n}\n","export const DEFAULT_IGNORED_PROPERTIES = [\n 'meta',\n 'implicitRules',\n 'language',\n 'text',\n 'contained',\n 'extension',\n 'modifierExtension',\n];\n","import { OperationOutcome } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { getIssuesForExpression } from './utils/outcomes';\nimport './FormSection.css';\n\nexport interface FormSectionProps {\n title?: string;\n htmlFor?: string;\n description?: string;\n outcome?: OperationOutcome;\n children?: React.ReactNode;\n}\n\nexport function FormSection(props: FormSectionProps): JSX.Element {\n const issues = getIssuesForExpression(props.outcome, props.htmlFor);\n const invalid = issues && issues.length > 0;\n return (\n <fieldset className=\"medplum-form-section\">\n {props.title && <label htmlFor={props.htmlFor}>{props.title}</label>}\n {props.description && <p>{props.description}</p>}\n {props.children}\n {invalid && (\n <div id={props.htmlFor + '-errors'} className=\"medplum-input-error\">\n {issues?.map((issue) => (\n <div data-testid=\"text-field-error\" key={issue.details?.text}>\n {issue.details?.text}\n </div>\n ))}\n </div>\n )}\n </fieldset>\n );\n}\n","import { capitalize, IndexedStructureDefinition } from '@medplum/core';\nimport { ElementDefinition, ElementDefinitionType, OperationOutcome, Reference, Resource } from '@medplum/fhirtypes';\nimport React, { useEffect, useState } from 'react';\nimport { BackboneElementInput } from './BackboneElementInput';\nimport { Button } from './Button';\nimport { FormSection } from './FormSection';\nimport { Input } from './Input';\nimport { useMedplum } from './MedplumProvider';\nimport { useResource } from './useResource';\n\nexport interface ResourceFormProps {\n defaultValue: Resource | Reference;\n outcome?: OperationOutcome;\n onSubmit: (resource: Resource) => void;\n onDelete?: (resource: Resource) => void;\n}\n\nexport function ResourceForm(props: ResourceFormProps): JSX.Element {\n const medplum = useMedplum();\n const defaultValue = useResource(props.defaultValue);\n const [schema, setSchema] = useState<IndexedStructureDefinition | undefined>();\n const [value, setValue] = useState<Resource | undefined>();\n\n useEffect(() => {\n if (defaultValue) {\n setValue(JSON.parse(JSON.stringify(defaultValue)));\n medplum.requestSchema(defaultValue.resourceType).then(setSchema);\n }\n }, [medplum, defaultValue]);\n\n if (!schema || !value) {\n return <div>Loading...</div>;\n }\n\n return (\n <form\n noValidate\n autoComplete=\"off\"\n onSubmit={(e: React.FormEvent) => {\n e.preventDefault();\n if (props.onSubmit) {\n props.onSubmit(value);\n }\n }}\n >\n <FormSection title=\"Resource Type\">\n <Input name=\"resourceType\" defaultValue={value.resourceType} disabled={true} />\n </FormSection>\n <FormSection title=\"ID\">\n <Input name=\"id\" defaultValue={value.id} disabled={true} />\n </FormSection>\n <BackboneElementInput\n typeName={value.resourceType}\n defaultValue={value}\n outcome={props.outcome}\n onChange={setValue}\n />\n <Button type=\"submit\" size=\"large\">\n OK\n </Button>\n {props.onDelete && (\n <Button\n type=\"button\"\n size=\"large\"\n onClick={() => {\n (props.onDelete as (resource: Resource) => void)(value);\n }}\n >\n Delete\n </Button>\n )}\n </form>\n );\n}\n\nexport function setPropertyValue(\n obj: any,\n key: string,\n propName: string,\n elementDefinition: ElementDefinition,\n value: any\n): any {\n const types = elementDefinition.type as ElementDefinitionType[];\n if (types.length > 1) {\n for (const type of types) {\n const compoundKey = key.replace('[x]', capitalize(type.code as string));\n if (compoundKey in obj) {\n delete obj[compoundKey];\n }\n }\n }\n obj[propName] = value;\n return obj;\n}\n","import React from 'react';\nimport './DescriptionList.css';\n\nexport interface DescriptionListProps {\n children: React.ReactNode;\n compact?: boolean;\n}\n\nexport function DescriptionList(props: DescriptionListProps): JSX.Element {\n return <dl className={'medplum-description-list' + (props.compact ? ' compact' : '')}>{props.children}</dl>;\n}\n\nexport interface DescriptionListEntryProps {\n term: string;\n children: React.ReactNode;\n}\n\nexport function DescriptionListEntry(props: DescriptionListEntryProps): JSX.Element {\n return (\n <>\n <dt>{props.term}</dt>\n <dd>{props.children}</dd>\n </>\n );\n}\n","import { getPropertyDisplayName, globalSchema, TypedValue } from '@medplum/core';\nimport React from 'react';\nimport { DEFAULT_IGNORED_PROPERTIES } from './constants';\nimport { DescriptionList, DescriptionListEntry } from './DescriptionList';\nimport { getValueAndType, ResourcePropertyDisplay } from './ResourcePropertyDisplay';\n\nexport interface BackboneElementDisplayProps {\n value: TypedValue;\n compact?: boolean;\n ignoreMissingValues?: boolean;\n link?: boolean;\n}\n\nexport function BackboneElementDisplay(props: BackboneElementDisplayProps): JSX.Element | null {\n const typedValue = props.value;\n const value = typedValue.value;\n if (!value) {\n return null;\n }\n\n const typeName = typedValue.type;\n const typeSchema = globalSchema.types[typeName];\n if (!typeSchema) {\n return <div>{typeName} not implemented</div>;\n }\n\n if (typeof value === 'object' && 'name' in value && Object.keys(value).length === 1) {\n // Special case for common BackboneElement pattern\n // Where there is an object with a single property 'name'\n // Just display the name value.\n return <div>{value.name}</div>;\n }\n\n return (\n <DescriptionList compact={props.compact}>\n {Object.entries(typeSchema.properties).map((entry) => {\n const key = entry[0];\n if (DEFAULT_IGNORED_PROPERTIES.indexOf(key) >= 0) {\n return null;\n }\n const property = entry[1];\n const [propertyValue, propertyType] = getValueAndType(typedValue, key);\n if (\n props.ignoreMissingValues &&\n (!propertyValue || (Array.isArray(propertyValue) && propertyValue.length === 0))\n ) {\n return null;\n }\n return (\n <DescriptionListEntry key={key} term={getPropertyDisplayName(key)}>\n <ResourcePropertyDisplay\n property={property}\n propertyType={propertyType}\n value={propertyValue}\n ignoreMissingValues={props.ignoreMissingValues}\n link={props.link}\n />\n </DescriptionListEntry>\n );\n })}\n </DescriptionList>\n );\n}\n","import { Coding } from '@medplum/fhirtypes';\nimport React from 'react';\n\nexport interface CodingDisplayProps {\n value?: Coding;\n}\n\nexport function CodingDisplay(props: CodingDisplayProps): JSX.Element {\n return <>{props.value?.display || props.value?.code}</>;\n}\n","import { CodeableConcept } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { CodingDisplay } from './CodingDisplay';\n\nexport interface CodeableConceptDisplayProps {\n value?: CodeableConcept;\n}\n\nexport function CodeableConceptDisplay(props: CodeableConceptDisplayProps): JSX.Element | null {\n const value = props.value;\n if (!value) {\n return null;\n }\n\n if (value.text) {\n return <>{value.text}</>;\n }\n\n if (value.coding && value.coding.length > 0) {\n return <CodingDisplay value={value.coding[0]} />;\n }\n\n return null;\n}\n","import { ContactPoint } from '@medplum/fhirtypes';\nimport React from 'react';\n\nexport interface ContactPointDisplayProps {\n value?: ContactPoint;\n}\n\nexport function ContactPointDisplay(props: ContactPointDisplayProps): JSX.Element | null {\n const contactPoint = props.value;\n if (!contactPoint) {\n return null;\n }\n\n const builder = [];\n\n if (contactPoint.value) {\n builder.push(contactPoint.value);\n }\n\n if (contactPoint.use || contactPoint.system) {\n builder.push(' [');\n\n if (contactPoint.use) {\n builder.push(contactPoint.use);\n }\n\n if (contactPoint.use && contactPoint.system) {\n builder.push(' ');\n }\n\n if (contactPoint.system) {\n builder.push(contactPoint.system);\n }\n\n builder.push(']');\n }\n\n return <>{builder.join('').trim()}</>;\n}\n","import { ContactDetail } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { ContactPointDisplay } from './ContactPointDisplay';\n\nexport interface ContactDetailDisplayProps {\n value?: ContactDetail;\n}\n\nexport function ContactDetailDisplay(props: ContactDetailDisplayProps): JSX.Element | null {\n const contactDetail = props.value;\n if (!contactDetail) {\n return null;\n }\n\n return (\n <>\n {contactDetail.name}\n {contactDetail.name && ': '}\n {contactDetail.telecom?.map((telecom, index) => (\n <ContactPointDisplay key={'telecom-' + index} value={telecom} />\n ))}\n </>\n );\n}\n","import React from 'react';\n\nexport interface DateTimeDisplayProps {\n value?: string;\n}\n\nexport function DateTimeDisplay(props: DateTimeDisplayProps): JSX.Element | null {\n if (!props.value) {\n return null;\n }\n return <>{new Date(props.value).toLocaleString()}</>;\n}\n","import { formatHumanName, HumanNameFormatOptions } from '@medplum/core';\nimport { HumanName } from '@medplum/fhirtypes';\nimport React from 'react';\n\nexport interface HumanNameDisplayProps {\n value?: HumanName;\n options?: HumanNameFormatOptions;\n}\n\nexport function HumanNameDisplay(props: HumanNameDisplayProps): JSX.Element | null {\n const name = props.value;\n if (!name) {\n return null;\n }\n\n return <>{formatHumanName(name, props.options)}</>;\n}\n","import { Identifier } from '@medplum/fhirtypes';\nimport React from 'react';\n\nexport interface IdentifierDisplayProps {\n value?: Identifier;\n}\n\nexport function IdentifierDisplay(props: IdentifierDisplayProps): JSX.Element {\n return (\n <div>\n {props.value?.system}: {props.value?.value}\n </div>\n );\n}\n","import { Period } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { DateTimeDisplay } from './DateTimeDisplay';\n\nexport interface PeriodDisplayProps {\n value?: Period;\n}\n\nexport function PeriodDisplay(props: PeriodDisplayProps): JSX.Element | null {\n const value = props.value;\n if (!value || (!value.start && !value.end)) {\n return null;\n }\n\n return (\n <span>\n <DateTimeDisplay value={value.start} />\n -\n <DateTimeDisplay value={value.end} />\n </span>\n );\n}\n","import { Quantity } from '@medplum/fhirtypes';\nimport React from 'react';\n\nexport interface QuantityDisplayProps {\n value?: Quantity;\n}\n\nexport function QuantityDisplay(props: QuantityDisplayProps): JSX.Element | null {\n return <>{formatQuantityString(props.value)}</>;\n}\n\nexport function formatQuantityString(quantity: Quantity | undefined): string {\n if (!quantity) {\n return '';\n }\n\n const result = [];\n\n if (quantity.comparator) {\n result.push(quantity.comparator);\n result.push(' ');\n }\n\n if (quantity.value !== undefined) {\n result.push(quantity.value);\n }\n\n if (quantity.unit) {\n if (quantity.unit !== '%') {\n result.push(' ');\n }\n result.push(quantity.unit);\n }\n\n return result.join('');\n}\n","import { Range } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { formatQuantityString } from './QuantityDisplay';\n\nexport interface RangeDisplayProps {\n value?: Range;\n}\n\nexport function RangeDisplay(props: RangeDisplayProps): JSX.Element | null {\n return <>{formatRangeString(props.value)}</>;\n}\n\nexport function formatRangeString(range: Range | undefined): string {\n if (!range || (!range.low && !range.high)) {\n return '';\n }\n\n if (range.low && !range.high) {\n return `>= ${formatQuantityString(range.low)}`;\n }\n\n if (!range.low && range.high) {\n return `<= ${formatQuantityString(range.high)}`;\n }\n\n return `${formatQuantityString(range.low)} - ${formatQuantityString(range.high)}`;\n}\n","import { Ratio } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { QuantityDisplay } from './QuantityDisplay';\n\nexport interface RatioDisplayProps {\n value?: Ratio;\n}\n\nexport function RatioDisplay(props: RatioDisplayProps): JSX.Element | null {\n const value = props.value;\n if (!value) {\n return null;\n }\n\n return (\n <>\n <QuantityDisplay value={value.numerator} />\n / \n <QuantityDisplay value={value.denominator} />\n </>\n );\n}\n","import { stringify } from '@medplum/core';\nimport { Reference } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { MedplumLink } from './MedplumLink';\n\nexport interface ReferenceDisplayProps {\n value?: Reference;\n link?: boolean;\n}\n\nexport function ReferenceDisplay(props: ReferenceDisplayProps): JSX.Element | null {\n if (!props.value) {\n return null;\n }\n\n const displayString = props.value.display || props.value.reference || stringify(props.value);\n\n // The \"link\" prop defaults to \"true\"; undefined is treated as \"true\"\n // To disable the link, it must be explicitly \"false\"\n if (props.link !== false && props.value.reference) {\n return <MedplumLink to={props.value}>{displayString}</MedplumLink>;\n } else {\n return <>{displayString}</>;\n }\n}\n","import { PropertyType } from '@medplum/core';\nimport { ElementDefinition } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { ResourcePropertyDisplay } from './ResourcePropertyDisplay';\n\ninterface ResourceArrayDisplayProps {\n property: ElementDefinition;\n values: any[];\n arrayElement?: boolean;\n ignoreMissingValues?: boolean;\n link?: boolean;\n}\n\nexport function ResourceArrayDisplay(props: ResourceArrayDisplayProps): JSX.Element {\n const property = props.property;\n const values = props.values ?? [];\n const propertyType = property.type?.[0]?.code as PropertyType;\n return (\n <>\n {values.map((v: any, index: number) => (\n <div key={`${index}-${values.length}`}>\n <ResourcePropertyDisplay\n arrayElement={true}\n property={property}\n propertyType={propertyType}\n value={v}\n ignoreMissingValues={props.ignoreMissingValues}\n link={props.link}\n />\n </div>\n ))}\n </>\n );\n}\n","import { buildTypeName, getTypedPropertyValue, PropertyType, TypedValue } from '@medplum/core';\nimport { ElementDefinition } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { AddressDisplay } from './AddressDisplay';\nimport { AttachmentArrayDisplay } from './AttachmentArrayDisplay';\nimport { AttachmentDisplay } from './AttachmentDisplay';\nimport { BackboneElementDisplay } from './BackboneElementDisplay';\nimport { CodeableConceptDisplay } from './CodeableConceptDisplay';\nimport { CodingDisplay } from './CodingDisplay';\nimport { ContactDetailDisplay } from './ContactDetailDisplay';\nimport { ContactPointDisplay } from './ContactPointDisplay';\nimport { DateTimeDisplay } from './DateTimeDisplay';\nimport { HumanNameDisplay } from './HumanNameDisplay';\nimport { IdentifierDisplay } from './IdentifierDisplay';\nimport { PeriodDisplay } from './PeriodDisplay';\nimport { QuantityDisplay } from './QuantityDisplay';\nimport { RangeDisplay } from './RangeDisplay';\nimport { RatioDisplay } from './RatioDisplay';\nimport { ReferenceDisplay } from './ReferenceDisplay';\nimport { ResourceArrayDisplay } from './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\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 <div>{value === undefined ? '' : Boolean(value).toString()}</div>;\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 <div>{value}</div>;\n case PropertyType.canonical:\n return <ReferenceDisplay value={{ reference: value }} link={props.link} />;\n case PropertyType.dateTime:\n case PropertyType.instant:\n return <DateTimeDisplay value={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 <div>{value?.text}</div>;\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.Period:\n return <PeriodDisplay value={value} />;\n case PropertyType.Quantity:\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 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: buildTypeName(property?.path?.split('.') as string[]), 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","import { createReference } from '@medplum/core';\nimport { Annotation } from '@medplum/fhirtypes';\nimport React, { useRef, useState } from 'react';\nimport { Input } from './Input';\nimport { useMedplumProfile } from './MedplumProvider';\n\nexport interface AnnotationInputProps {\n name: string;\n defaultValue?: Annotation;\n onChange?: (value: Annotation) => void;\n}\n\nexport function AnnotationInput(props: AnnotationInputProps): JSX.Element {\n const author = useMedplumProfile();\n const [value, setValue] = useState<Annotation>(props.defaultValue || {});\n\n const valueRef = useRef<Annotation>();\n valueRef.current = value;\n\n function setText(text: string): void {\n const newValue: Annotation = text\n ? {\n text,\n authorReference: author && createReference(author),\n time: new Date().toISOString(),\n }\n : {};\n\n setValue(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n return (\n <Input name={props.name} type=\"text\" placeholder=\"Annotation text\" defaultValue={value.text} onChange={setText} />\n );\n}\n","import React, { RefObject } from 'react';\nimport './Checkbox.css';\n\nexport interface CheckboxProps {\n name?: string;\n defaultValue?: boolean | number;\n required?: boolean;\n inputRef?: RefObject<HTMLInputElement>;\n testid?: string;\n disabled?: boolean;\n onChange?: (newValue: boolean) => void;\n}\n\nexport function Checkbox(props: CheckboxProps): JSX.Element {\n const className = 'medplum-checkbox';\n return (\n <input\n id={props.name}\n name={props.name}\n className={className}\n type=\"checkbox\"\n value=\"true\"\n defaultChecked={!!props.defaultValue}\n required={props.required}\n ref={props.inputRef}\n data-testid={props.testid}\n disabled={props.disabled}\n onChange={(e) => {\n if (props.onChange) {\n props.onChange(e.currentTarget.checked);\n }\n }}\n />\n );\n}\n","import { stringify } from '@medplum/core';\nimport {\n CodeableConcept,\n ElementDefinition,\n ValueSet,\n ValueSetExpansion,\n ValueSetExpansionContains,\n} from '@medplum/fhirtypes';\nimport React from 'react';\nimport { Autocomplete } from './Autocomplete';\nimport { useMedplum } from './MedplumProvider';\n\nexport interface CodeableConceptInputProps {\n property: ElementDefinition;\n name: string;\n defaultValue?: CodeableConcept;\n onChange?: (value: CodeableConcept) => void;\n}\n\nexport function CodeableConceptInput(props: CodeableConceptInputProps): JSX.Element {\n const medplum = useMedplum();\n\n let defaultValue = undefined;\n if (props.defaultValue) {\n defaultValue = [props.defaultValue];\n }\n\n return (\n <Autocomplete\n loadOptions={(input: string): Promise<CodeableConcept[]> => {\n const system = props.property.binding?.valueSet as string;\n return medplum.searchValueSet(system, input).then((valueSet: ValueSet) => {\n return ((valueSet.expansion as ValueSetExpansion).contains as ValueSetExpansionContains[]).map(\n valueSetElementToCodeableConcept\n );\n });\n }}\n buildUnstructured={buildUnstructured}\n getId={getId}\n getDisplay={getDisplay}\n name={props.name}\n defaultValue={defaultValue}\n onChange={(values: CodeableConcept[]) => {\n if (props.onChange) {\n props.onChange(values[0]);\n }\n }}\n />\n );\n}\n\nfunction valueSetElementToCodeableConcept(element: ValueSetExpansionContains): CodeableConcept {\n return {\n text: element.display,\n coding: [\n {\n system: element.system,\n code: element.code,\n display: element.display,\n },\n ],\n };\n}\n\nfunction buildUnstructured(str: string): CodeableConcept {\n return { text: str };\n}\n\nfunction getId(concept: CodeableConcept): string {\n if (concept.coding && concept.coding.length > 0) {\n return concept.coding[0].code as string;\n }\n return stringify(concept);\n}\n\nfunction getDisplay(concept: CodeableConcept): JSX.Element {\n const text = concept.coding?.[0]?.display ?? concept.coding?.[0]?.code ?? concept.text;\n return <>{text}</>;\n}\n","import { ElementDefinition, ValueSet, ValueSetExpansion, ValueSetExpansionContains } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { Autocomplete } from './Autocomplete';\nimport { useMedplum } from './MedplumProvider';\n\nexport interface CodeInputProps {\n property: ElementDefinition;\n name: string;\n defaultValue?: string;\n onChange?: (value: string) => void;\n}\n\nconst cachedDisplayValues: Record<string, string> = {};\n\nexport function CodeInput(props: CodeInputProps): JSX.Element {\n const medplum = useMedplum();\n\n let defaultValue = undefined;\n if (props.defaultValue) {\n defaultValue = [props.defaultValue];\n }\n\n return (\n <Autocomplete\n loadOptions={(input: string): Promise<string[]> => {\n const system = props.property.binding?.valueSet as string;\n return medplum.searchValueSet(system, input).then((valueSet: ValueSet) => {\n const contains = (valueSet.expansion as ValueSetExpansion).contains as ValueSetExpansionContains[];\n contains.forEach((e) => (cachedDisplayValues[e.code as string] = e.display as string));\n return contains.map((e) => e.code as string);\n });\n }}\n buildUnstructured={(str: string) => str}\n getId={(item: string) => item}\n getDisplay={(item: string) => <>{cachedDisplayValues[item] || item}</>}\n name={props.name}\n defaultValue={defaultValue}\n onChange={(values: string[]) => {\n if (props.onChange) {\n props.onChange(values[0]);\n }\n }}\n />\n );\n}\n","import { Coding, ElementDefinition, ValueSet, ValueSetExpansion, ValueSetExpansionContains } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { Autocomplete } from './Autocomplete';\nimport { CodingDisplay } from './CodingDisplay';\nimport { useMedplum } from './MedplumProvider';\n\nexport interface CodingInputProps {\n property: ElementDefinition;\n name: string;\n defaultValue?: Coding;\n onChange?: (value: Coding) => void;\n}\n\nexport function CodingInput(props: CodingInputProps): JSX.Element {\n const medplum = useMedplum();\n\n let defaultValue = undefined;\n if (props.defaultValue) {\n defaultValue = [props.defaultValue];\n }\n\n return (\n <Autocomplete\n loadOptions={(input: string): Promise<Coding[]> => {\n const system = props.property.binding?.valueSet as string;\n return medplum.searchValueSet(system, input).then((valueSet: ValueSet) => {\n return ((valueSet.expansion as ValueSetExpansion).contains as ValueSetExpansionContains[]).map(\n (e) =>\n ({\n system: e.system,\n code: e.code,\n display: e.display,\n } as Coding)\n );\n });\n }}\n buildUnstructured={(str: string) => ({ code: str })}\n getId={(item: Coding) => item.code as string}\n getDisplay={(item: Coding) => <CodingDisplay value={item} />}\n name={props.name}\n defaultValue={defaultValue}\n onChange={(values: Coding[]) => {\n if (props.onChange) {\n props.onChange(values[0]);\n }\n }}\n />\n );\n}\n","import { ContactPoint } from '@medplum/fhirtypes';\nimport React, { useRef, useState } from 'react';\nimport { Input } from './Input';\nimport { InputRow } from './InputRow';\nimport { Select } from './Select';\n\nexport interface ContactPointInputProps {\n name: string;\n defaultValue?: ContactPoint;\n onChange?: (value: ContactPoint | undefined) => void;\n}\n\nexport function ContactPointInput(props: ContactPointInputProps): JSX.Element {\n const [contactPoint, setContactPoint] = useState(props.defaultValue);\n\n const ref = useRef<ContactPoint>();\n ref.current = contactPoint;\n\n function setContactPointWrapper(newValue: ContactPoint | undefined): void {\n if (newValue && Object.keys(newValue).length === 0) {\n newValue = undefined;\n }\n setContactPoint(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n function setSystem(system: string): void {\n const newValue: ContactPoint = { ...ref.current, system };\n if (!system) {\n delete newValue.system;\n }\n setContactPointWrapper(newValue);\n }\n\n function setUse(use: string): void {\n const newValue: ContactPoint = { ...ref.current, use };\n if (!use) {\n delete newValue.use;\n }\n setContactPointWrapper(newValue);\n }\n\n function setValue(value: string): void {\n const newValue: ContactPoint = { ...ref.current, value };\n if (!value) {\n delete newValue.value;\n }\n setContactPointWrapper(newValue);\n }\n\n return (\n <InputRow>\n <Select defaultValue={contactPoint?.system} onChange={setSystem} testid=\"system\">\n <option></option>\n <option>email</option>\n <option>fax</option>\n <option>pager</option>\n <option>phone</option>\n <option>other</option>\n <option>sms</option>\n </Select>\n <Select defaultValue={contactPoint?.use} onChange={setUse} testid=\"use\">\n <option></option>\n <option>home</option>\n <option>mobile</option>\n <option>old</option>\n <option>temp</option>\n <option>work</option>\n </Select>\n <Input placeholder=\"Value\" defaultValue={contactPoint?.value} onChange={setValue} />\n </InputRow>\n );\n}\n","import { ContactDetail, ContactPoint } from '@medplum/fhirtypes';\nimport React, { useRef, useState } from 'react';\nimport { ContactPointInput } from './ContactPointInput';\nimport { Input } from './Input';\nimport { InputRow } from './InputRow';\n\nexport interface ContactDetailInputProps {\n name: string;\n defaultValue?: ContactDetail;\n onChange?: (value: ContactDetail) => void;\n}\n\nexport function ContactDetailInput(props: ContactDetailInputProps): JSX.Element {\n const [contactPoint, setContactDetail] = useState(props.defaultValue);\n\n const ref = useRef<ContactDetail>();\n ref.current = contactPoint;\n\n function setContactDetailWrapper(newValue: ContactDetail): void {\n setContactDetail(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n function setName(name: string): void {\n const newValue: ContactDetail = { ...ref.current, name };\n if (!name) {\n delete newValue.name;\n }\n setContactDetailWrapper(newValue);\n }\n\n function setTelecom(telecom: ContactPoint | undefined): void {\n const newValue: ContactDetail = { ...ref.current, telecom: telecom && [telecom] };\n if (!telecom) {\n delete newValue.telecom;\n }\n setContactDetailWrapper(newValue);\n }\n\n return (\n <InputRow>\n <Input\n name={props.name + '-name'}\n placeholder=\"Name\"\n style={{ width: 180 }}\n defaultValue={contactPoint?.name}\n onChange={setName}\n />\n <ContactPointInput\n name={props.name + '-telecom'}\n defaultValue={contactPoint?.telecom?.[0]}\n onChange={setTelecom}\n />\n </InputRow>\n );\n}\n","import React from 'react';\nimport { Input, InputProps } from './Input';\n\n/**\n * The DateTimeInput component is a wrapper around the HTML5 input type=\"datetime-local\".\n * The main purpose is to reconcile time zones.\n * Most of our date/time values are in ISO-8601, which includes a time zone offset.\n * The datetime-local input does not support the time zone offset.\n * @param props The Input props.\n * @returns The JSX element to render.\n */\nexport function DateTimeInput(props: InputProps): JSX.Element {\n return (\n <Input\n {...props}\n type=\"datetime-local\"\n defaultValue={convertIsoToLocal(props.defaultValue as string | undefined)}\n onChange={(newValue: string) => {\n if (props.onChange) {\n props.onChange(convertLocalToIso(newValue));\n }\n }}\n />\n );\n}\n\n/**\n * Converts an ISO-8601 date/time string to a local date/time string.\n * @param isoString The ISO-8601 date/time string to convert.\n * @returns The local date/time string.\n */\nexport function convertIsoToLocal(isoString: string | undefined): string {\n if (!isoString) {\n return '';\n }\n\n // Convert the ISO-8601 date to a local datetime-local value.\n // See: https://developer.mozilla.org/en-US/docs/Web/HTML/Date_and_time_formats#local_date_and_time_strings\n // See: https://stackoverflow.com/a/60368477\n const date = new Date(isoString);\n if (!isValidDate(date)) {\n // If the input string was malformed, return an empty string.\n return '';\n }\n\n return date.toLocaleDateString('sv') + 'T' + date.toLocaleTimeString('sv');\n}\n\n/**\n * Converts a local date/time string to an ISO-8601 date/time string.\n * @param localString The local date/time string to convert.\n * @returns The ISO-8601 date/time string.\n */\nexport function convertLocalToIso(localString: string | undefined): string {\n if (!localString) {\n return '';\n }\n\n // Try to parse the local string as a Date\n // JavaScript's Date() constructor defaults to the local time zone.\n // The Date() constructor will throw if the value is malformed.\n const date = new Date(localString);\n if (!isValidDate(date)) {\n // If the input string was malformed, return an empty string.\n return '';\n }\n\n return date.toISOString();\n}\n\nfunction isValidDate(date: Date): boolean {\n return date instanceof Date && !isNaN(date.getTime());\n}\n","import { OperationOutcome } from '@medplum/fhirtypes';\nimport React, { RefObject } from 'react';\nimport { getIssuesForExpression } from './utils/outcomes';\nimport './TextArea.css';\n\nexport interface TextAreaProps {\n name?: string;\n defaultValue?: string;\n required?: boolean;\n autoComplete?: string;\n autoFocus?: boolean;\n inputRef?: RefObject<HTMLTextAreaElement>;\n outcome?: OperationOutcome;\n placeholder?: string;\n testid?: string;\n monospace?: boolean;\n style?: React.CSSProperties;\n onChange?: (newValue: string) => void;\n}\n\nexport function TextArea(props: TextAreaProps): JSX.Element {\n const className = 'medplum-textarea' + (props.monospace ? ' monospace' : '');\n const issues = getIssuesForExpression(props.outcome, props.name);\n const invalid = issues && issues.length > 0;\n return (\n <textarea\n id={props.name}\n name={props.name}\n className={className}\n defaultValue={props.defaultValue || ''}\n required={props.required}\n autoComplete={props.autoComplete}\n autoFocus={props.autoFocus}\n ref={props.inputRef}\n aria-invalid={invalid}\n aria-describedby={invalid ? props.name + '-errors' : ''}\n placeholder={props.placeholder}\n data-testid={props.testid}\n style={props.style}\n onChange={(e) => {\n if (props.onChange) {\n props.onChange(e.currentTarget.value);\n }\n }}\n />\n );\n}\n","import { stringify } from '@medplum/core';\nimport { Extension } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { TextArea } from './TextArea';\n\nexport interface ExtensionInputProps {\n name: string;\n defaultValue?: Extension;\n onChange?: (value: Extension) => void;\n}\n\nexport function ExtensionInput(props: ExtensionInputProps): JSX.Element {\n return (\n <TextArea\n testid=\"extension-input\"\n name={props.name}\n defaultValue={stringify(props.defaultValue)}\n monospace={true}\n onChange={(newValue: string) => {\n if (props.onChange) {\n props.onChange(JSON.parse(newValue));\n }\n }}\n />\n );\n}\n","import { HumanName } from '@medplum/fhirtypes';\nimport React, { useRef, useState } from 'react';\nimport { Input } from './Input';\nimport { InputRow } from './InputRow';\nimport { Select } from './Select';\n\nexport interface HumanNameInputProps {\n name: string;\n defaultValue?: HumanName;\n onChange?: (value: HumanName) => void;\n}\n\nexport function HumanNameInput(props: HumanNameInputProps): JSX.Element {\n const [value, setValue] = useState<HumanName | undefined>(props.defaultValue);\n\n const valueRef = useRef<HumanName>();\n valueRef.current = value;\n\n function setValueWrapper(newValue: HumanName): void {\n setValue(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n function setUse(use: string): void {\n setValueWrapper({ ...valueRef.current, use: use ? use : undefined });\n }\n\n function setPrefix(prefix: string): void {\n setValueWrapper({\n ...valueRef.current,\n prefix: prefix ? prefix.split(' ') : undefined,\n });\n }\n\n function setGiven(given: string): void {\n setValueWrapper({\n ...valueRef.current,\n given: given ? given.split(' ') : undefined,\n });\n }\n\n function setFamily(family: string): void {\n setValueWrapper({\n ...valueRef.current,\n family: family ? family : undefined,\n });\n }\n\n function setSuffix(suffix: string): void {\n setValueWrapper({\n ...valueRef.current,\n suffix: suffix ? suffix.split(' ') : undefined,\n });\n }\n\n return (\n <InputRow>\n <Select defaultValue={value?.use} onChange={setUse} testid=\"use\">\n <option></option>\n <option>usual</option>\n <option>official</option>\n <option>temp</option>\n <option>nickname</option>\n <option>anonymous</option>\n <option>old</option>\n <option>maiden</option>\n </Select>\n <Input placeholder=\"Prefix\" defaultValue={value?.prefix?.join(' ')} onChange={setPrefix} />\n <Input placeholder=\"Given\" defaultValue={value?.given?.join(' ')} onChange={setGiven} />\n <Input placeholder=\"Family\" defaultValue={value?.family} onChange={setFamily} />\n <Input placeholder=\"Suffix\" defaultValue={value?.suffix?.join(' ')} onChange={setSuffix} />\n </InputRow>\n );\n}\n","import { Identifier } from '@medplum/fhirtypes';\nimport React, { useState } from 'react';\nimport { Input } from './Input';\nimport { InputRow } from './InputRow';\n\nexport interface IdentifierInputProps {\n name: string;\n defaultValue?: Identifier;\n onChange?: (value: Identifier) => void;\n}\n\nexport function IdentifierInput(props: IdentifierInputProps): JSX.Element {\n const [value, setValue] = useState(props.defaultValue);\n\n function setValueWrapper(newValue: Identifier): void {\n setValue(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n return (\n <InputRow>\n <Input\n placeholder=\"System\"\n defaultValue={value?.system}\n onChange={(newValue) => setValueWrapper({ ...value, system: newValue })}\n />\n <Input\n placeholder=\"Value\"\n defaultValue={value?.value}\n onChange={(newValue) => setValueWrapper({ ...value, value: newValue })}\n />\n </InputRow>\n );\n}\n","import { Period } from '@medplum/fhirtypes';\nimport React, { useState } from 'react';\nimport { Input } from './Input';\nimport { InputRow } from './InputRow';\n\nexport interface PeriodInputProps {\n name: string;\n defaultValue?: Period;\n onChange?: (value: Period) => void;\n}\n\nexport function PeriodInput(props: PeriodInputProps): JSX.Element {\n const [value, setValue] = useState(props.defaultValue);\n\n function setValueWrapper(newValue: Period): void {\n setValue(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n return (\n <InputRow>\n <Input\n type=\"datetime-local\"\n placeholder=\"Start\"\n defaultValue={value?.start}\n onChange={(newValue) => setValueWrapper({ ...value, start: newValue })}\n />\n <Input\n type=\"datetime-local\"\n placeholder=\"End\"\n defaultValue={value?.end}\n onChange={(newValue) => setValueWrapper({ ...value, end: newValue })}\n />\n </InputRow>\n );\n}\n","import { Quantity } from '@medplum/fhirtypes';\nimport React, { useState } from 'react';\nimport { Input } from './Input';\nimport { InputRow } from './InputRow';\nimport { Select } from './Select';\n\nexport interface QuantityInputProps {\n name: string;\n defaultValue?: Quantity;\n onChange?: (value: Quantity) => void;\n}\n\nexport function QuantityInput(props: QuantityInputProps): JSX.Element {\n const [value, setValue] = useState(props.defaultValue);\n\n function setValueWrapper(newValue: Quantity): void {\n setValue(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n return (\n <InputRow>\n <Select\n style={{ width: 80 }}\n testid={props.name + '-comparator'}\n defaultValue={value?.comparator}\n onChange={(newValue) =>\n setValueWrapper({\n ...value,\n comparator: newValue,\n })\n }\n >\n <option></option>\n <option><</option>\n <option><=</option>\n <option>>=</option>\n <option>></option>\n </Select>\n <Input\n name={props.name}\n type=\"number\"\n step=\"any\"\n placeholder=\"Value\"\n defaultValue={value?.value?.toString()}\n onChange={(newValue) =>\n setValueWrapper({\n ...value,\n value: tryParseNumber(newValue),\n })\n }\n />\n <Input\n placeholder=\"Unit\"\n defaultValue={value?.unit}\n onChange={(newValue) =>\n setValueWrapper({\n ...value,\n unit: newValue,\n })\n }\n />\n </InputRow>\n );\n}\n\nfunction tryParseNumber(str: string): number | undefined {\n if (!str) {\n return undefined;\n }\n return parseFloat(str);\n}\n","import { Range } from '@medplum/fhirtypes';\nimport React, { useState } from 'react';\nimport { InputRow } from './InputRow';\nimport { QuantityInput } from './QuantityInput';\n\nexport interface RangeInputProps {\n name: string;\n defaultValue?: Range;\n onChange?: (value: Range) => void;\n}\n\n/**\n * Renders a Range input.\n * See: https://www.hl7.org/fhir/datatypes.html#Range\n * @param props Range input properties.\n * @returns Range input element.\n */\nexport function RangeInput(props: RangeInputProps): JSX.Element {\n const [value, setValue] = useState(props.defaultValue);\n\n function setValueWrapper(newValue: Range): void {\n setValue(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n return (\n <InputRow>\n <QuantityInput\n name={props.name + '-low'}\n defaultValue={value?.low}\n onChange={(v) =>\n setValueWrapper({\n ...value,\n low: v,\n })\n }\n />\n <QuantityInput\n name={props.name + '-high'}\n defaultValue={value?.high}\n onChange={(v) =>\n setValueWrapper({\n ...value,\n high: v,\n })\n }\n />\n </InputRow>\n );\n}\n","import { Ratio } from '@medplum/fhirtypes';\nimport React, { useState } from 'react';\nimport { InputRow } from './InputRow';\nimport { QuantityInput } from './QuantityInput';\n\nexport interface RatioInputProps {\n name: string;\n defaultValue?: Ratio;\n onChange?: (value: Ratio) => void;\n}\n\n/**\n * Renders a Ratio input.\n * See: https://www.hl7.org/fhir/datatypes.html#Ratio\n * @param props Ratio input properties.\n * @returns Ratio input element.\n */\nexport function RatioInput(props: RatioInputProps): JSX.Element {\n const [value, setValue] = useState(props.defaultValue);\n\n function setValueWrapper(newValue: Ratio): void {\n setValue(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n return (\n <InputRow>\n <QuantityInput\n name={props.name + '-numerator'}\n defaultValue={value?.numerator}\n onChange={(v) =>\n setValueWrapper({\n ...value,\n numerator: v,\n })\n }\n />\n <QuantityInput\n name={props.name + '-denominator'}\n defaultValue={value?.denominator}\n onChange={(v) =>\n setValueWrapper({\n ...value,\n denominator: v,\n })\n }\n />\n </InputRow>\n );\n}\n","import { getDisplayString } from '@medplum/core';\nimport { Reference, Resource } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { MedplumLink } from './MedplumLink';\nimport { useResource } from './useResource';\n\nexport interface ResourceNameProps {\n value?: Reference | Resource;\n link?: boolean;\n}\n\nexport function ResourceName(props: ResourceNameProps): JSX.Element | null {\n const resource = useResource(props.value);\n if (!resource) {\n return null;\n }\n\n const text = getDisplayString(resource);\n\n return props.link ? <MedplumLink to={resource}>{text}</MedplumLink> : <span>{text}</span>;\n}\n","import { Bundle, BundleEntry, Reference, Resource, ResourceType } from '@medplum/fhirtypes';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { Autocomplete } from './Autocomplete';\nimport { Avatar } from './Avatar';\nimport { useMedplum } from './MedplumProvider';\nimport { ResourceName } from './ResourceName';\nimport { useResource } from './useResource';\n\nexport interface ResourceInputProps<T extends Resource = Resource> {\n readonly resourceType: string;\n readonly name: string;\n readonly defaultValue?: T | Reference<T>;\n readonly className?: string;\n readonly placeholder?: string;\n readonly onChange?: (value: T | undefined) => void;\n}\n\nexport function ResourceInput<T extends Resource = Resource>(props: ResourceInputProps<T>): JSX.Element {\n const medplum = useMedplum();\n const defaultResource = useResource(props.defaultValue);\n const [value, setValue] = useState<T>();\n\n const resourceTypeRef = useRef<string>(props.resourceType);\n resourceTypeRef.current = props.resourceType;\n\n useEffect(() => {\n setValue(defaultResource);\n }, [defaultResource]);\n\n function setValueWrapper(newValue: T | undefined): void {\n setValue(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n return (\n <Autocomplete\n loadOptions={(input: string): Promise<T[]> => {\n return medplum\n .search(resourceTypeRef.current as ResourceType, 'name=' + encodeURIComponent(input) + '&_count=10')\n .then((bundle: Bundle) => (bundle.entry as BundleEntry[]).map((entry) => entry.resource as T));\n }}\n getId={(item: T) => {\n return item.id as string;\n }}\n getIcon={(item: T) => <Avatar value={item} />}\n getDisplay={(item: T) => <ResourceName value={item} />}\n getHelpText={(item: T) => {\n if (item.resourceType === 'Patient' && item.birthDate) {\n return 'DoB: ' + item.birthDate;\n }\n return undefined;\n }}\n name={props.name}\n defaultValue={value ? [value] : undefined}\n className={props.className}\n placeholder={props.placeholder}\n onChange={(items: T[]) => {\n setValueWrapper(items.length > 0 ? items[0] : undefined);\n }}\n />\n );\n}\n","import { createReference } from '@medplum/core';\nimport { Reference, Resource } from '@medplum/fhirtypes';\nimport React, { useRef, useState } from 'react';\nimport { Input } from './Input';\nimport { InputRow } from './InputRow';\nimport { ResourceInput } from './ResourceInput';\nimport { Select } from './Select';\n\nexport interface ReferenceInputProps {\n name: string;\n defaultValue?: Reference;\n targetTypes?: string[];\n onChange?: (value: Reference | undefined) => void;\n}\n\nexport function ReferenceInput(props: ReferenceInputProps): JSX.Element {\n const targetTypes = props.targetTypes;\n const initialResourceType = getInitialResourceType(props.defaultValue, targetTypes);\n const [value, setValue] = useState<Reference | undefined>(props.defaultValue);\n const [resourceType, setResourceType] = useState<string | undefined>(initialResourceType);\n\n const valueRef = useRef<Reference>();\n valueRef.current = value;\n\n const resourceTypeRef = useRef<string>();\n resourceTypeRef.current = resourceType;\n\n function setValueHelper(newValue: Reference | undefined): void {\n setValue(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n return (\n <InputRow>\n {targetTypes ? (\n <Select testid=\"reference-input-resource-type-select\" defaultValue={resourceType} onChange={setResourceType}>\n {targetTypes.map((targetType) => (\n <option key={targetType} value={targetType}>\n {targetType}\n </option>\n ))}\n </Select>\n ) : (\n <Input testid=\"reference-input-resource-type-input\" defaultValue={resourceType} onChange={setResourceType} />\n )}\n <ResourceInput\n resourceType={resourceType as string}\n name={props.name + '-id'}\n defaultValue={value}\n onChange={(item: Resource | undefined) => {\n setValueHelper(item ? createReference(item) : undefined);\n }}\n />\n </InputRow>\n );\n}\n\nfunction getInitialResourceType(\n defaultValue: Reference | undefined,\n targetTypes: string[] | undefined\n): string | undefined {\n const defaultValueResourceType = defaultValue?.reference?.split('/')[0];\n if (defaultValueResourceType) {\n return defaultValueResourceType;\n }\n\n if (targetTypes && targetTypes.length > 0) {\n return targetTypes[0];\n }\n\n return undefined;\n}\n","import { ElementDefinition } from '@medplum/fhirtypes';\nimport React, { useRef, useState } from 'react';\nimport { Button } from './Button';\nimport { ResourcePropertyInput } from './ResourcePropertyInput';\nimport { killEvent } from './utils/dom';\n\ninterface ResourceArrayInputProps {\n property: ElementDefinition;\n name: string;\n defaultValue?: any[];\n arrayElement?: boolean;\n onChange?: (value: any[]) => void;\n}\n\nexport function ResourceArrayInput(props: ResourceArrayInputProps): JSX.Element {\n const [values, setValues] = useState(props.defaultValue ?? []);\n\n const valuesRef = useRef<any[]>();\n valuesRef.current = values;\n\n function setValuesWrapper(newValues: any[]): void {\n setValues(newValues);\n if (props.onChange) {\n props.onChange(newValues);\n }\n }\n\n return (\n <table style={{ width: '100%', borderCollapse: 'collapse' }}>\n <colgroup>\n <col width=\"90%\" />\n <col width=\"10%\" />\n </colgroup>\n <tbody>\n {values.map((v, index) => (\n <tr key={`${index}-${values.length}`}>\n <td>\n <ResourcePropertyInput\n arrayElement={true}\n property={props.property}\n name={props.name + '.' + index}\n defaultValue={v}\n onChange={(newValue: any) => {\n const copy = [...(valuesRef.current as any[])];\n copy[index] = newValue;\n setValuesWrapper(copy);\n }}\n />\n </td>\n <td style={{ textAlign: 'right' }}>\n <Button\n onClick={(e) => {\n killEvent(e);\n const copy = [...(valuesRef.current as any[])];\n copy.splice(index, 1);\n setValuesWrapper(copy);\n }}\n >\n Remove\n </Button>\n </td>\n </tr>\n ))}\n <tr>\n <td></td>\n <td style={{ textAlign: 'right' }}>\n <Button\n onClick={(e) => {\n killEvent(e);\n const copy = [...(valuesRef.current as any[])];\n copy.push(undefined);\n setValuesWrapper(copy);\n }}\n >\n Add\n </Button>\n </td>\n </tr>\n </tbody>\n </table>\n );\n}\n","import { buildTypeName, capitalize, PropertyType } from '@medplum/core';\nimport { ElementDefinition, ElementDefinitionType, OperationOutcome } from '@medplum/fhirtypes';\nimport React, { useState } from 'react';\nimport { AddressInput } from './AddressInput';\nimport { AnnotationInput } from './AnnotationInput';\nimport { AttachmentArrayInput } from './AttachmentArrayInput';\nimport { AttachmentInput } from './AttachmentInput';\nimport { BackboneElementInput } from './BackboneElementInput';\nimport { Checkbox } from './Checkbox';\nimport { CodeableConceptInput } from './CodeableConceptInput';\nimport { CodeInput } from './CodeInput';\nimport { CodingInput } from './CodingInput';\nimport { ContactDetailInput } from './ContactDetailInput';\nimport { ContactPointInput } from './ContactPointInput';\nimport { DateTimeInput } from './DateTimeInput';\nimport { ExtensionInput } from './ExtensionInput';\nimport { HumanNameInput } from './HumanNameInput';\nimport { IdentifierInput } from './IdentifierInput';\nimport { Input } from './Input';\nimport { InputRow } from './InputRow';\nimport { PeriodInput } from './PeriodInput';\nimport { QuantityInput } from './QuantityInput';\nimport { RangeInput } from './RangeInput';\nimport { RatioInput } from './RatioInput';\nimport { ReferenceInput } from './ReferenceInput';\nimport { ResourceArrayInput } from './ResourceArrayInput';\nimport { Select } from './Select';\nimport { TextArea } from './TextArea';\n\nexport interface ResourcePropertyInputProps {\n property: ElementDefinition;\n name: string;\n defaultPropertyType?: PropertyType;\n defaultValue?: any;\n arrayElement?: boolean;\n onChange?: (value: any, propName?: string) => void;\n outcome?: OperationOutcome;\n}\n\nexport function ResourcePropertyInput(props: ResourcePropertyInputProps): JSX.Element {\n const property = props.property;\n const propertyType = props.defaultPropertyType ?? (property.type?.[0]?.code as PropertyType);\n const name = props.name;\n const value = props.defaultValue;\n\n if (property.max === '*' && !props.arrayElement) {\n if (propertyType === 'Attachment') {\n return <AttachmentArrayInput name={name} defaultValue={value} onChange={props.onChange} />;\n }\n return <ResourceArrayInput property={property} name={name} defaultValue={value} onChange={props.onChange} />;\n }\n\n const propertyTypes = property.type as ElementDefinitionType[];\n if (propertyTypes.length > 1) {\n return <ElementDefinitionInputSelector elementDefinitionTypes={propertyTypes} {...props} />;\n } else {\n return <ElementDefinitionTypeInput elementDefinitionType={propertyTypes[0]} {...props} />;\n }\n}\n\nexport interface ElementDefinitionSelectorProps extends ResourcePropertyInputProps {\n elementDefinitionTypes: ElementDefinitionType[];\n}\n\nexport function ElementDefinitionInputSelector(props: ElementDefinitionSelectorProps): JSX.Element {\n const propertyTypes = props.elementDefinitionTypes;\n let initialPropertyType: ElementDefinitionType | undefined = undefined;\n if (props.defaultPropertyType) {\n initialPropertyType = propertyTypes.find((t) => t.code === props.defaultPropertyType) as ElementDefinitionType;\n }\n if (!initialPropertyType) {\n initialPropertyType = propertyTypes[0];\n }\n const [selectedType, setSelectedType] = useState(initialPropertyType);\n return (\n <InputRow>\n <Select\n style={{ width: '200px' }}\n defaultValue={selectedType?.code}\n onChange={(newValue) => {\n setSelectedType(\n propertyTypes.find((type: ElementDefinitionType) => type.code === newValue) as ElementDefinitionType\n );\n }}\n >\n {propertyTypes.map((type: ElementDefinitionType) => (\n <option key={type.code} value={type.code}>\n {type.code}\n </option>\n ))}\n </Select>\n <ElementDefinitionTypeInput\n {...props}\n elementDefinitionType={selectedType}\n onChange={(newValue: any) => {\n if (props.onChange) {\n props.onChange(newValue, props.name.replace('[x]', capitalize(selectedType.code as string)));\n }\n }}\n />\n </InputRow>\n );\n}\n\nexport interface ElementDefinitionTypeInputProps extends ResourcePropertyInputProps {\n elementDefinitionType: ElementDefinitionType;\n}\n\nexport function ElementDefinitionTypeInput(props: ElementDefinitionTypeInputProps): JSX.Element {\n const property = props.property;\n const propertyType = props.elementDefinitionType.code as PropertyType;\n const name = props.name;\n const value = props.defaultValue;\n\n switch (propertyType) {\n // 2.24.0.1 Primitive Types\n // https://www.hl7.org/fhir/datatypes.html#primitive\n\n case PropertyType.SystemString:\n case PropertyType.canonical:\n case PropertyType.string:\n case PropertyType.time:\n case PropertyType.uri:\n case PropertyType.url:\n return (\n <Input\n type=\"text\"\n name={name}\n testid={name}\n defaultValue={value}\n onChange={props.onChange}\n outcome={props.outcome}\n />\n );\n case PropertyType.date:\n return (\n <Input\n type=\"date\"\n name={name}\n testid={name}\n defaultValue={value}\n onChange={props.onChange}\n outcome={props.outcome}\n />\n );\n case PropertyType.dateTime:\n case PropertyType.instant:\n return (\n <DateTimeInput\n type=\"datetime-local\"\n name={name}\n testid={name}\n defaultValue={value}\n onChange={props.onChange}\n outcome={props.outcome}\n />\n );\n case PropertyType.decimal:\n case PropertyType.integer:\n case PropertyType.positiveInt:\n case PropertyType.unsignedInt:\n return (\n <Input\n type=\"number\"\n step={propertyType === PropertyType.decimal ? 'any' : 1}\n name={name}\n testid={name}\n defaultValue={value}\n onChange={(newValue) => {\n if (props.onChange) {\n props.onChange(parseFloat(newValue));\n }\n }}\n outcome={props.outcome}\n />\n );\n case PropertyType.code:\n return <CodeInput property={property} name={name} defaultValue={value} onChange={props.onChange} />;\n case PropertyType.boolean:\n return (\n <Checkbox\n name={name}\n testid={name}\n defaultValue={!!value}\n onChange={(newValue) => {\n if (props.onChange) {\n props.onChange(newValue);\n }\n }}\n />\n );\n case PropertyType.markdown:\n return <TextArea name={name} testid={name} defaultValue={value} onChange={props.onChange} />;\n\n // 2.24.0.2 Complex Types\n // https://www.hl7.org/fhir/datatypes.html#complex\n\n case PropertyType.Address:\n return <AddressInput name={name} defaultValue={value} onChange={props.onChange} />;\n case PropertyType.Annotation:\n return <AnnotationInput name={name} defaultValue={value} onChange={props.onChange} />;\n case PropertyType.Attachment:\n return <AttachmentInput name={name} defaultValue={value} onChange={props.onChange} />;\n case PropertyType.CodeableConcept:\n return <CodeableConceptInput property={property} name={name} defaultValue={value} onChange={props.onChange} />;\n case PropertyType.Coding:\n return <CodingInput property={property} name={name} defaultValue={value} onChange={props.onChange} />;\n case PropertyType.ContactDetail:\n return <ContactDetailInput name={name} defaultValue={value} onChange={props.onChange} />;\n case PropertyType.ContactPoint:\n return <ContactPointInput name={name} defaultValue={value} onChange={props.onChange} />;\n case PropertyType.Extension:\n return <ExtensionInput name={name} defaultValue={value} onChange={props.onChange} />;\n case PropertyType.HumanName:\n return <HumanNameInput name={name} defaultValue={value} onChange={props.onChange} />;\n case PropertyType.Identifier:\n return <IdentifierInput name={name} defaultValue={value} onChange={props.onChange} />;\n case PropertyType.Period:\n return <PeriodInput name={name} defaultValue={value} onChange={props.onChange} />;\n case PropertyType.Quantity:\n return <QuantityInput name={name} defaultValue={value} onChange={props.onChange} />;\n case PropertyType.Range:\n return <RangeInput name={name} defaultValue={value} onChange={props.onChange} />;\n case PropertyType.Ratio:\n return <RatioInput name={name} defaultValue={value} onChange={props.onChange} />;\n case PropertyType.Reference:\n return (\n <ReferenceInput\n name={name}\n defaultValue={value}\n targetTypes={getTargetTypes(property)}\n onChange={props.onChange}\n />\n );\n default:\n return (\n <BackboneElementInput\n typeName={buildTypeName(property.path?.split('.') as string[])}\n defaultValue={value}\n onChange={props.onChange}\n outcome={props.outcome}\n />\n );\n }\n}\n\nfunction getTargetTypes(property?: ElementDefinition): string[] | undefined {\n return property?.type?.[0]?.targetProfile?.map((p) => p.split('/').pop() as string);\n}\n","import { getPropertyDisplayName, globalSchema } from '@medplum/core';\nimport { OperationOutcome } from '@medplum/fhirtypes';\nimport React, { useState } from 'react';\nimport { CheckboxFormSection } from './CheckboxFormSection';\nimport { DEFAULT_IGNORED_PROPERTIES } from './constants';\nimport { FormSection } from './FormSection';\nimport { setPropertyValue } from './ResourceForm';\nimport { getValueAndType } from './ResourcePropertyDisplay';\nimport { ResourcePropertyInput } from './ResourcePropertyInput';\n\nexport interface BackboneElementInputProps {\n typeName: string;\n defaultValue?: any;\n outcome?: OperationOutcome;\n onChange?: (value: any) => void;\n}\n\nexport function BackboneElementInput(props: BackboneElementInputProps): JSX.Element {\n const [value, setValue] = useState<any>(props.defaultValue ?? {});\n\n function setValueWrapper(newValue: any): void {\n setValue(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n const typeName = props.typeName;\n const typeSchema = globalSchema.types[typeName];\n if (!typeSchema) {\n return <div>{typeName} not implemented</div>;\n }\n\n const typedValue = { type: typeName, value };\n\n return (\n <>\n {Object.entries(typeSchema.properties).map((entry) => {\n const key = entry[0];\n if (key === 'id' || DEFAULT_IGNORED_PROPERTIES.indexOf(key) >= 0) {\n return null;\n }\n const property = entry[1];\n if (!property.type) {\n return null;\n }\n\n const [propertyValue, propertyType] = getValueAndType(typedValue, key);\n\n if (property.type.length === 1 && property.type[0].code === 'boolean') {\n return (\n <CheckboxFormSection\n key={key}\n title={getPropertyDisplayName(key)}\n description={property.definition}\n htmlFor={key}\n >\n <ResourcePropertyInput\n property={property}\n name={key}\n defaultValue={propertyValue}\n defaultPropertyType={propertyType}\n outcome={props.outcome}\n onChange={(newValue: any, propName?: string) => {\n setValueWrapper(setPropertyValue(value, key, propName ?? key, entry[1], newValue));\n }}\n />\n </CheckboxFormSection>\n );\n }\n\n return (\n <FormSection\n key={key}\n title={getPropertyDisplayName(key)}\n description={property.definition}\n htmlFor={key}\n outcome={props.outcome}\n >\n <ResourcePropertyInput\n property={property}\n name={key}\n defaultValue={propertyValue}\n defaultPropertyType={propertyType}\n outcome={props.outcome}\n onChange={(newValue: any, propName?: string) => {\n setValueWrapper(setPropertyValue(value, key, propName ?? key, entry[1], newValue));\n }}\n />\n </FormSection>\n );\n })}\n </>\n );\n}\n","import { Reference, Resource } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { Avatar } from './Avatar';\nimport { ResourceName } from './ResourceName';\nimport './ResourceBadge.css';\n\nexport interface ResourceBadgeProps {\n value?: Reference | Resource;\n size?: 'xsmall' | 'small' | 'medium' | 'large';\n link?: boolean;\n}\n\nexport function ResourceBadge(props: ResourceBadgeProps): JSX.Element {\n return (\n <div className=\"medplum-resource-badge\">\n <Avatar size={props.size ?? 'small'} value={props.value} link={props.link} />\n <ResourceName value={props.value} link={props.link} />\n </div>\n );\n}\n","import { capitalize } from '@medplum/core';\nimport {\n DiagnosticReport,\n Observation,\n ObservationComponent,\n ObservationReferenceRange,\n Reference,\n} from '@medplum/fhirtypes';\nimport React from 'react';\nimport { CodeableConceptDisplay } from './CodeableConceptDisplay';\nimport { DateTimeDisplay } from './DateTimeDisplay';\nimport { MedplumLink } from './MedplumLink';\nimport { QuantityDisplay } from './QuantityDisplay';\nimport { RangeDisplay } from './RangeDisplay';\nimport { ResourceBadge } from './ResourceBadge';\nimport { useResource } from './useResource';\nimport './DiagnosticReportDisplay.css';\nimport './Table.css';\n\nexport interface DiagnosticReportDisplayProps {\n value?: DiagnosticReport | Reference<DiagnosticReport>;\n}\n\nexport function DiagnosticReportDisplay(props: DiagnosticReportDisplayProps): JSX.Element | null {\n const diagnosticReport = useResource(props.value);\n if (!diagnosticReport) {\n return null;\n }\n\n let textContent: string | undefined = undefined;\n if (diagnosticReport.presentedForm && diagnosticReport.presentedForm.length > 0) {\n const pf = diagnosticReport.presentedForm[0];\n if (pf.contentType?.startsWith('text/plain') && pf.data) {\n textContent = window.atob(pf.data);\n }\n }\n\n return (\n <div className=\"medplum-diagnostic-report\">\n <h1>Diagnostic Report</h1>\n <div className=\"medplum-diagnostic-report-header\">\n {diagnosticReport.subject && (\n <dl>\n <dt>Subject</dt>\n <dd>\n <ResourceBadge value={diagnosticReport.subject} link={true} />\n </dd>\n </dl>\n )}\n {diagnosticReport.resultsInterpreter &&\n diagnosticReport.resultsInterpreter.map((interpreter) => (\n <dl key={interpreter.reference}>\n <dt>Interpreter</dt>\n <dd>\n <ResourceBadge value={interpreter} link={true} />\n </dd>\n </dl>\n ))}\n {diagnosticReport.issued && (\n <dl>\n <dt>Issued</dt>\n <dd>\n <DateTimeDisplay value={diagnosticReport.issued} />\n </dd>\n </dl>\n )}\n {diagnosticReport.status && (\n <dl>\n <dt>Status</dt>\n <dd>{capitalize(diagnosticReport.status)}</dd>\n </dl>\n )}\n </div>\n {textContent && <pre>{textContent}</pre>}\n {diagnosticReport.result && <ObservationTable value={diagnosticReport.result} />}\n </div>\n );\n}\n\nexport interface ObservationTableProps {\n value?: Observation[] | Reference<Observation>[];\n}\n\nexport function ObservationTable(props: ObservationTableProps): JSX.Element {\n return (\n <table className=\"medplum-table\">\n <thead>\n <tr>\n <th>Test</th>\n <th>Value</th>\n <th>Reference Range</th>\n <th>Interpretation</th>\n </tr>\n </thead>\n <tbody>\n {props.value?.map((observation, index) => (\n <ObservationRow key={'obs-' + index} value={observation} />\n ))}\n </tbody>\n </table>\n );\n}\n\ninterface ObservationRowProps {\n value: Observation | Reference<Observation>;\n}\n\nfunction ObservationRow(props: ObservationRowProps): JSX.Element | null {\n const observation = useResource(props.value);\n if (!observation) {\n return null;\n }\n\n return (\n <tr>\n <td>\n <MedplumLink to={observation}>\n <CodeableConceptDisplay value={observation.code} />\n </MedplumLink>\n </td>\n <td>\n <ObservationValueDisplay value={observation} />\n </td>\n <td>\n <ReferenceRangeDisplay value={observation.referenceRange} />\n </td>\n <td>\n {observation.interpretation && observation.interpretation.length > 0 && (\n <CodeableConceptDisplay value={observation.interpretation[0]} />\n )}\n </td>\n </tr>\n );\n}\n\ninterface ObservationValueDisplayProps {\n value?: Observation | ObservationComponent;\n}\n\nfunction ObservationValueDisplay(props: ObservationValueDisplayProps): JSX.Element | null {\n const obs = props.value;\n\n if (obs?.valueQuantity) {\n return <QuantityDisplay value={props.value?.valueQuantity} />;\n }\n\n if (obs?.valueString) {\n return <>{obs.valueString}</>;\n }\n\n if (obs && 'component' in obs && obs?.component) {\n return (\n <>\n {obs.component\n .map<React.ReactNode>((component: ObservationComponent, index: number) => (\n <ObservationValueDisplay key={`obs-${index}`} value={component} />\n ))\n .reduce((prev, curr) => [prev, ' / ', curr])}\n </>\n );\n }\n\n return null;\n}\n\ninterface ReferenceRangeProps {\n value?: ObservationReferenceRange[];\n}\n\nfunction ReferenceRangeDisplay(props: ReferenceRangeProps): JSX.Element | null {\n const range = props.value && props.value.length > 0 && props.value[0];\n if (!range) {\n return null;\n }\n return <RangeDisplay value={range} />;\n}\n","/**\n * Parses an HTML form and returns the result as a JavaScript object.\n * @param form The HTML form element.\n */\nexport function parseForm(form: HTMLFormElement): Record<string, string> {\n const result: Record<string, string> = {};\n\n for (const element of Array.from(form.elements)) {\n if (element instanceof HTMLInputElement) {\n parseInputElement(result, element);\n } else if (element instanceof HTMLTextAreaElement) {\n result[element.name] = element.value;\n } else if (element instanceof HTMLSelectElement) {\n parseSelectElement(result, element);\n }\n }\n\n return result;\n}\n\n/**\n * Parses an HTML input element.\n * Sets the name/value pair in the result,\n * but only if the element is enabled and checked.\n * @param el The input element.\n * @param result The result builder.\n */\nfunction parseInputElement(result: Record<string, string>, el: HTMLInputElement): void {\n if (el.disabled) {\n // Ignore disabled elements\n return;\n }\n\n if ((el.type === 'checkbox' || el.type === 'radio') && !el.checked) {\n // Ignore unchecked radio or checkbox elements\n return;\n }\n\n result[el.name] = el.value;\n}\n\n/**\n * Parses an HTML select element.\n * Sets the name/value pair if one is selected.\n * @param result The result builder.\n * @param el The select element.\n */\nfunction parseSelectElement(result: Record<string, string>, el: HTMLSelectElement): void {\n result[el.name] = el.value;\n}\n","import React, { CSSProperties } from 'react';\nimport { parseForm } from './FormUtils';\n\nexport interface FormProps {\n onSubmit?: (formData: Record<string, string>) => void;\n style?: CSSProperties;\n children?: React.ReactNode;\n testid?: string;\n}\n\nexport function Form(props: FormProps): JSX.Element {\n return (\n <form\n style={props.style}\n data-testid={props.testid}\n onSubmit={(e: React.SyntheticEvent) => {\n e.preventDefault();\n const formData = parseForm(e.target as HTMLFormElement);\n if (props.onSubmit) {\n props.onSubmit(formData);\n }\n }}\n >\n {props.children}\n </form>\n );\n}\n","import React from 'react';\nimport './Loading.css';\n\nexport function Loading(): JSX.Element {\n return (\n <div role=\"progressbar\" aria-busy=\"true\" className=\"medplum-loading\">\n <div className=\"medplum-loading-container\">\n <svg className=\"medplum-loading-spinner\" viewBox=\"0 0 100 100\">\n <circle cx=\"50\" cy=\"50\" r=\"40\" />\n </svg>\n </div>\n </div>\n );\n}\n","import React from 'react';\nimport './MenuItem.css';\n\ninterface MenuItemProps {\n onClick: () => void;\n label?: string;\n children: React.ReactNode;\n}\n\nexport function MenuItem(props: MenuItemProps): JSX.Element {\n return (\n <div className=\"medplum-menu-item\" onClick={() => props.onClick()} aria-label={props.label}>\n {props.children}\n </div>\n );\n}\n","import { getPropertyDisplayName, IndexedStructureDefinition, stringify, toTypedValue } from '@medplum/core';\nimport { Resource } from '@medplum/fhirtypes';\nimport React, { useEffect, useState } from 'react';\nimport { useMedplum } from './MedplumProvider';\nimport { getValueAndType, ResourcePropertyDisplay } from './ResourcePropertyDisplay';\nimport './ResourceDiff.css';\nimport './ResourceDiffTable.css';\n\nexport interface ResourceDiffTableProps {\n original: Resource;\n revised: Resource;\n}\n\nexport function ResourceDiffTable(props: ResourceDiffTableProps): JSX.Element | null {\n const medplum = useMedplum();\n const [schema, setSchema] = useState<IndexedStructureDefinition | undefined>();\n\n useEffect(() => {\n medplum.requestSchema(props.original.resourceType).then(setSchema);\n }, [medplum, props.original.resourceType]);\n\n if (!schema) {\n return null;\n }\n\n const typeSchema = schema.types[props.original.resourceType];\n if (!typeSchema) {\n return null;\n }\n\n return (\n <table className=\"medplum-diff-table\">\n <colgroup>\n <col style={{ width: '30%' }} />\n <col style={{ width: '35%' }} />\n <col style={{ width: '35%' }} />\n </colgroup>\n <thead>\n <tr>\n <th>Property</th>\n <th>Before</th>\n <th>After</th>\n </tr>\n </thead>\n <tbody>\n {Object.entries(typeSchema.properties).map((entry) => {\n const key = entry[0];\n if (key === 'id' || key === 'meta') {\n return null;\n }\n\n const property = entry[1];\n const [originalPropertyValue, originalPropertyType] = getValueAndType(toTypedValue(props.original), key);\n const [revisedPropertyValue, revisedPropertyType] = getValueAndType(toTypedValue(props.revised), key);\n if (isEmpty(originalPropertyValue) && isEmpty(revisedPropertyValue)) {\n return null;\n }\n\n if (stringify(originalPropertyValue) === stringify(revisedPropertyValue)) {\n return null;\n }\n\n return (\n <tr key={key}>\n <td>{getPropertyDisplayName(key)}</td>\n <td className=\"medplum-diff-removed\">\n <ResourcePropertyDisplay\n property={property}\n propertyType={originalPropertyType}\n value={originalPropertyValue}\n ignoreMissingValues={true}\n />\n </td>\n <td className=\"medplum-diff-added\">\n <ResourcePropertyDisplay\n property={property}\n propertyType={revisedPropertyType}\n value={revisedPropertyValue}\n ignoreMissingValues={true}\n />\n </td>\n </tr>\n );\n })}\n </tbody>\n </table>\n );\n}\n\nfunction isEmpty(value: unknown): boolean {\n return (\n !value ||\n (Array.isArray(value) && value.length === 0) ||\n (typeof value === 'object' && Object.keys(value).length === 0)\n );\n}\n","import { IndexedStructureDefinition } from '@medplum/core';\nimport { Reference, Resource } from '@medplum/fhirtypes';\nimport React, { useEffect, useState } from 'react';\nimport { BackboneElementDisplay } from './BackboneElementDisplay';\nimport { useMedplum } from './MedplumProvider';\nimport { useResource } from './useResource';\n\nexport interface ResourceTableProps {\n value: Resource | Reference;\n ignoreMissingValues?: boolean;\n}\n\nexport function ResourceTable(props: ResourceTableProps): JSX.Element | null {\n const medplum = useMedplum();\n const value = useResource(props.value);\n const [schema, setSchema] = useState<IndexedStructureDefinition | undefined>();\n\n useEffect(() => {\n if (value) {\n medplum.requestSchema(value.resourceType).then(setSchema);\n }\n }, [medplum, value]);\n\n if (!schema || !value) {\n return null;\n }\n\n return (\n <BackboneElementDisplay\n value={{ type: value.resourceType, value }}\n ignoreMissingValues={props.ignoreMissingValues}\n />\n );\n}\n","import React from 'react';\nimport './Scrollable.css';\n\nexport interface ScrollableProps {\n readonly role?: string;\n readonly className?: string;\n readonly height?: number;\n readonly children: React.ReactNode;\n}\n\nexport function Scrollable(props: ScrollableProps): JSX.Element {\n const containerHeight = props.height || '100%';\n const contentHeight = props.height ? props.height + 25 : '100%';\n const className = 'medplum-scrollable-content' + (props.className ? ` ${props.className}` : '');\n return (\n <div className=\"medplum-scrollable-container\" style={{ height: containerHeight }}>\n <div className={className} role={props.role} style={{ height: contentHeight }}>\n {props.children}\n </div>\n </div>\n );\n}\n","import React, { ErrorInfo, ReactNode } from 'react';\n\nexport interface ErrorBoundaryProps {\n children: ReactNode;\n}\n\nexport interface ErrorBoundaryState {\n error?: any;\n}\n\n/**\n * ErrorBoundary is a React component that handles errors in its child components.\n * See: https://reactjs.org/docs/error-boundaries.html\n */\nexport class ErrorBoundary extends React.Component<ErrorBoundaryProps, ErrorBoundaryState> {\n state: ErrorBoundaryState;\n\n constructor(props: ErrorBoundaryProps) {\n super(props);\n this.state = {};\n }\n\n static getDerivedStateFromError(error: any): ErrorBoundaryState {\n return { error };\n }\n\n componentDidCatch(error: Error, errorInfo: ErrorInfo): void {\n console.error('Uncaught error:', error, errorInfo);\n }\n\n render(): ReactNode {\n if (this.state.error) {\n return <h1>Something went wrong.</h1>;\n }\n\n return this.props.children;\n }\n}\n","import React, { useEffect, useRef } from 'react';\nimport { Location, useLocation } from 'react-router-dom';\nimport './Popup.css';\n\ninterface PopupProps {\n visible: boolean;\n anchor?: DOMRectReadOnly;\n modal?: boolean;\n autoClose?: boolean;\n onClose: () => void;\n activeClassName?: string;\n inactiveClassName?: string;\n children?: React.ReactNode;\n}\n\nexport function Popup(props: PopupProps): JSX.Element {\n const ref = useRef<HTMLDivElement>(null);\n\n // Track browser URL location, and the location when the popup becomes visible\n const location = useLocation();\n const locationRef = useRef<Location>();\n if (props.visible) {\n if (locationRef.current === undefined) {\n locationRef.current = location;\n }\n } else {\n locationRef.current = undefined;\n }\n\n const propsRef = useRef<PopupProps>();\n propsRef.current = props;\n\n // Listen for clicks outside of the popup\n // If the user clicks outside of the popup, close it\n useEffect(() => {\n function handleClick(e: Event): void {\n if (\n propsRef.current?.visible &&\n propsRef.current?.autoClose &&\n ref?.current &&\n !ref.current.contains(e.target as Node)\n ) {\n props.onClose();\n }\n }\n\n document.addEventListener('click', handleClick, true);\n return () => document.removeEventListener('click', handleClick, true);\n }, [props]);\n\n // Listen for changes in the location\n // If the browser navigates to a new page, close the popup\n useEffect(() => {\n if (props.visible && location !== locationRef.current) {\n props.onClose();\n }\n }, [location, props]);\n\n const style: React.CSSProperties = {\n display: props.visible ? 'block' : 'none',\n };\n\n if (props.anchor) {\n if (props.anchor.right + 250 < document.body.clientWidth) {\n style.left = props.anchor.right + 'px';\n } else {\n style.right = document.body.clientWidth - props.anchor.left + 'px';\n }\n\n if (props.anchor.top + 300 < document.body.clientHeight) {\n style.top = props.anchor.top + 'px';\n } else {\n style.bottom = document.body.clientHeight - props.anchor.top + 'px';\n }\n }\n\n return (\n <>\n {props.modal && (\n <div className={props.visible ? 'medplum-backdrop active' : 'medplum-backdrop'} onClick={props.onClose} />\n )}\n <div\n ref={ref}\n className={'medplum-popup ' + (props.visible ? props.activeClassName : props.inactiveClassName)}\n style={style}\n data-testid=\"popup\"\n >\n {props.children}\n </div>\n </>\n );\n}\n","import { getReferenceString } from '@medplum/core';\nimport { Reference, Resource } from '@medplum/fhirtypes';\nimport React, { useState } from 'react';\nimport { Avatar } from './Avatar';\nimport { Button } from './Button';\nimport { DateTimeDisplay } from './DateTimeDisplay';\nimport { ErrorBoundary } from './ErrorBoundary';\nimport { MedplumLink } from './MedplumLink';\nimport { Popup } from './Popup';\nimport { ResourceName } from './ResourceName';\nimport { killEvent } from './utils/dom';\nimport './Timeline.css';\n\nexport interface TimelineProps {\n children?: React.ReactNode;\n}\n\nexport function Timeline(props: TimelineProps): JSX.Element {\n return <main className=\"medplum-document medplum-timeline\">{props.children}</main>;\n}\n\nexport interface TimelineItemProps {\n resource: Resource;\n profile?: Reference;\n socialEnabled?: boolean;\n children?: React.ReactNode;\n padding?: boolean;\n className?: string;\n popupMenuItems?: React.ReactNode;\n}\n\nexport function TimelineItem(props: TimelineItemProps): JSX.Element {\n const [popupAnchor, setPopupAnchor] = useState<DOMRect | undefined>();\n const author = props.profile ?? props.resource.meta?.author;\n return (\n <article className={props.className || 'medplum-timeline-item'} data-testid=\"timeline-item\">\n <div className=\"medplum-timeline-item-header\">\n <div className=\"medplum-timeline-item-avatar\">\n <Avatar value={author} link={true} size=\"medium\" />\n </div>\n <div className=\"medplum-timeline-item-title\">\n <ResourceName value={author} link={true} />\n <div className=\"medplum-timeline-item-subtitle\">\n <MedplumLink to={props.resource}>\n <DateTimeDisplay value={props.resource.meta?.lastUpdated} />\n </MedplumLink>\n <span>·</span>\n <MedplumLink to={props.resource}>{props.resource.resourceType}</MedplumLink>\n </div>\n </div>\n {props.popupMenuItems && (\n <div className=\"medplum-timeline-item-actions\">\n <a\n href=\"#\"\n aria-label={`Actions for ${getReferenceString(props.resource)}`}\n onClick={(e) => {\n killEvent(e);\n const el = e.currentTarget;\n const rect = el.getBoundingClientRect();\n setPopupAnchor(rect);\n }}\n >\n <svg fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <g transform=\"translate(-446 -350)\">\n <path d=\"M458 360a2 2 0 1 1-4 0 2 2 0 0 1 4 0m6 0a2 2 0 1 1-4 0 2 2 0 0 1 4 0m-12 0a2 2 0 1 1-4 0 2 2 0 0 1 4 0\"></path>\n </g>\n </svg>\n </a>\n </div>\n )}\n </div>\n <ErrorBoundary>\n {props.padding && <div style={{ padding: '2px 16px 16px 16px' }}>{props.children}</div>}\n {!props.padding && <>{props.children}</>}\n </ErrorBoundary>\n {props.socialEnabled && (\n <div className=\"medplum-timeline-item-footer\">\n <Button borderless={true}>Like</Button>\n <Button borderless={true}>Comment</Button>\n </div>\n )}\n {props.popupMenuItems && (\n <Popup visible={!!popupAnchor} anchor={popupAnchor} autoClose={true} onClose={() => setPopupAnchor(undefined)}>\n {props.popupMenuItems}\n </Popup>\n )}\n </article>\n );\n}\n","import { Resource } from '@medplum/fhirtypes';\n\n/**\n * Sorts an array of resources in place by meta.lastUpdated ascending.\n * @param resources Array of resources.\n */\nexport function sortByDateAndPriority(resources: Resource[]): void {\n resources.sort(resourceDateComparator);\n}\n\nfunction resourceDateComparator(a: Resource, b: Resource): number {\n const priority1 = getPriorityScore(a);\n const priority2 = getPriorityScore(b);\n if (priority1 > priority2) {\n return 1;\n }\n if (priority1 < priority2) {\n return -1;\n }\n return getTime(a) - getTime(b);\n}\n\nfunction getPriorityScore(resource: Resource): number {\n const priority = (resource as any).priority;\n if (typeof priority === 'string') {\n return { stat: 4, asap: 3, urgent: 2 }[priority] || 0;\n }\n return 0;\n}\n\nfunction getTime(resource: Resource): number {\n if (resource.resourceType === 'Communication' && resource.sent) {\n return new Date(resource.sent).getTime();\n }\n\n if (\n (resource.resourceType === 'DiagnosticReport' ||\n resource.resourceType === 'Media' ||\n resource.resourceType === 'Observation') &&\n resource.issued\n ) {\n return new Date(resource.issued).getTime();\n }\n\n if (resource.resourceType === 'DocumentReference' && resource.date) {\n return new Date(resource.date).getTime();\n }\n\n const dateTime = resource.meta?.lastUpdated;\n if (!dateTime) {\n return 0;\n }\n return new Date(dateTime).getTime();\n}\n","import { getReferenceString, ProfileResource } from '@medplum/core';\nimport {\n Attachment,\n AuditEvent,\n Bundle,\n BundleEntry,\n Communication,\n DiagnosticReport,\n Media,\n Reference,\n Resource,\n} from '@medplum/fhirtypes';\nimport React, { useCallback, useEffect, useRef, useState } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { AttachmentDisplay } from './AttachmentDisplay';\nimport { Button } from './Button';\nimport { DiagnosticReportDisplay } from './DiagnosticReportDisplay';\nimport { Form } from './Form';\nimport { Input } from './Input';\nimport { Loading } from './Loading';\nimport { useMedplum } from './MedplumProvider';\nimport { MenuItem } from './MenuItem';\nimport { ResourceDiffTable } from './ResourceDiffTable';\nimport { ResourceTable } from './ResourceTable';\nimport { Scrollable } from './Scrollable';\nimport { Timeline, TimelineItem } from './Timeline';\nimport { UploadButton } from './UploadButton';\nimport { useResource } from './useResource';\nimport { sortByDateAndPriority } from './utils/date';\nimport './ResourceTimeline.css';\n\nexport interface ResourceTimelineProps<T extends Resource> {\n value: T | Reference<T>;\n buildSearchRequests: (resource: T) => Bundle;\n createCommunication?: (resource: T, sender: ProfileResource, text: string) => Communication;\n createMedia?: (resource: T, operator: ProfileResource, attachment: Attachment) => Media;\n}\n\nexport function ResourceTimeline<T extends Resource>(props: ResourceTimelineProps<T>): JSX.Element {\n const navigate = useNavigate();\n const medplum = useMedplum();\n const sender = medplum.getProfile() as ProfileResource;\n const inputRef = useRef<HTMLInputElement>(null);\n const resource = useResource(props.value);\n const [history, setHistory] = useState<Bundle>();\n const [items, setItems] = useState<Resource[]>([]);\n const buildSearchRequests = props.buildSearchRequests;\n\n const itemsRef = useRef<Resource[]>(items);\n itemsRef.current = items;\n\n const loadTimeline = useCallback(() => {\n if (!resource) {\n setItems([]);\n setHistory({} as Bundle);\n return;\n }\n\n const batchRequest = buildSearchRequests(resource);\n medplum.post('fhir/R4', batchRequest).then(handleBatchResponse);\n }, [medplum, resource, buildSearchRequests]);\n\n useEffect(() => {\n loadTimeline();\n }, [loadTimeline]);\n\n /**\n * Handles a batch request response.\n * @param batchResponse The batch response.\n */\n function handleBatchResponse(batchResponse: Bundle): void {\n const newItems = [];\n\n if (batchResponse.entry) {\n for (const batchEntry of batchResponse.entry) {\n const bundle = batchEntry.resource as Bundle;\n if (!bundle) {\n // User may not have access to all resource types\n continue;\n }\n\n if (bundle.type === 'history') {\n setHistory(bundle);\n }\n\n if (bundle.entry) {\n for (const entry of bundle.entry) {\n newItems.push(entry.resource as Resource);\n }\n }\n }\n\n sortByDateAndPriority(newItems);\n newItems.reverse();\n }\n\n setItems(newItems);\n }\n\n /**\n * Adds an array of resources to the timeline.\n * @param resources Array of resources.\n */\n function addResources(resources: Resource[]): void {\n const newItems = [...itemsRef.current, ...resources];\n sortByDateAndPriority(newItems);\n newItems.reverse();\n setItems(newItems);\n }\n\n /**\n * Adds a Communication resource to the timeline.\n * @param contentString The comment content.\n */\n function createComment(contentString: string): void {\n if (!resource || !props.createCommunication) {\n // Encounter not loaded yet\n return;\n }\n medplum.createResource(props.createCommunication(resource, sender, contentString)).then((result) => {\n addResources([result]);\n });\n }\n\n /**\n * Adds a Media resource to the timeline.\n * @param attachment The media attachment.\n */\n function createMedia(attachment: Attachment): void {\n if (!resource || !props.createMedia) {\n // Encounter not loaded yet\n return;\n }\n medplum.createResource(props.createMedia(resource, sender, attachment)).then((result) => {\n addResources([result]);\n });\n }\n\n function setPriority(communication: Communication, priority: string): Promise<Communication> {\n return medplum.updateResource({ ...communication, priority });\n }\n\n function onPin(communication: Communication): void {\n setPriority(communication, 'stat').then(loadTimeline);\n }\n\n function onUnpin(communication: Communication): void {\n setPriority(communication, 'routine').then(loadTimeline);\n }\n\n function onDetails(timelineItem: Resource): void {\n navigate(`/${timelineItem.resourceType}/${timelineItem.id}`);\n }\n\n function onEdit(timelineItem: Resource): void {\n navigate(`/${timelineItem.resourceType}/${timelineItem.id}/edit`);\n }\n\n function onDelete(timelineItem: Resource): void {\n navigate(`/${timelineItem.resourceType}/${timelineItem.id}/delete`);\n }\n\n function onVersionDetails(version: Resource): void {\n navigate(`/${version.resourceType}/${version.id}/_history/${version.meta?.versionId}`);\n }\n\n if (!resource || !history) {\n return <Loading />;\n }\n\n return (\n <Timeline>\n {props.createCommunication && (\n <article className=\"medplum-timeline-item\">\n <div className=\"medplum-timeline-item-header\">\n <Form\n testid=\"timeline-form\"\n onSubmit={(formData: Record<string, string>) => {\n createComment(formData.text);\n\n const input = inputRef.current;\n if (input) {\n input.value = '';\n input.focus();\n }\n }}\n >\n <Input name=\"text\" testid=\"timeline-input\" inputRef={inputRef} />\n <Button type=\"submit\">Comment</Button>\n <UploadButton onUpload={createMedia} />\n </Form>\n </div>\n </article>\n )}\n {items.map((item) => {\n if (item.resourceType === resource.resourceType && item.id === resource.id) {\n return (\n <HistoryTimelineItem\n key={item.meta?.versionId}\n history={history}\n resource={item}\n onDetails={onVersionDetails}\n />\n );\n }\n const key = `${item.resourceType}/${item.id}`;\n switch (item.resourceType) {\n case 'AuditEvent':\n return <AuditEventTimelineItem key={key} resource={item} onDetails={onDetails} />;\n case 'Communication':\n return (\n <CommunicationTimelineItem\n key={key}\n resource={item}\n onPin={item.priority !== 'stat' ? onPin : undefined}\n onUnpin={item.priority === 'stat' ? onUnpin : undefined}\n onDetails={onDetails}\n onEdit={onEdit}\n onDelete={onDelete}\n />\n );\n case 'DiagnosticReport':\n return (\n <DiagnosticReportTimelineItem\n key={key}\n resource={item}\n onDetails={onDetails}\n onEdit={onEdit}\n onDelete={onDelete}\n />\n );\n case 'Media':\n return (\n <MediaTimelineItem key={key} resource={item} onDetails={onDetails} onEdit={onEdit} onDelete={onDelete} />\n );\n default:\n return (\n <TimelineItem key={key} resource={item} padding={true}>\n <ResourceTable value={item} ignoreMissingValues={true} />\n </TimelineItem>\n );\n }\n })}\n </Timeline>\n );\n}\n\ninterface BaseTimelineItemProps<T extends Resource> {\n resource: T;\n onPin?: (resource: T) => void;\n onUnpin?: (resource: T) => void;\n onDetails?: (resource: T) => void;\n onEdit?: (resource: T) => void;\n onDelete?: (resource: T) => void;\n}\n\nfunction TimelineItemPopupMenu<T extends Resource>(props: BaseTimelineItemProps<T>): JSX.Element {\n return (\n <>\n {props.onPin && (\n <MenuItem\n onClick={() => (props.onPin as (resource: T) => void)(props.resource)}\n label={`Pin ${getReferenceString(props.resource)}`}\n >\n Pin\n </MenuItem>\n )}\n {props.onUnpin && (\n <MenuItem\n onClick={() => (props.onUnpin as (resource: T) => void)(props.resource)}\n label={`Unpin ${getReferenceString(props.resource)}`}\n >\n Unpin\n </MenuItem>\n )}\n {props.onDetails && (\n <MenuItem\n onClick={() => (props.onDetails as (resource: T) => void)(props.resource)}\n label={`Details ${getReferenceString(props.resource)}`}\n >\n Details\n </MenuItem>\n )}\n {props.onEdit && (\n <MenuItem\n onClick={() => (props.onEdit as (resource: T) => void)(props.resource)}\n label={`Edit ${getReferenceString(props.resource)}`}\n >\n Edit\n </MenuItem>\n )}\n {props.onDelete && (\n <MenuItem\n onClick={() => (props.onDelete as (resource: T) => void)(props.resource)}\n label={`Delete ${getReferenceString(props.resource)}`}\n >\n Delete\n </MenuItem>\n )}\n </>\n );\n}\n\ninterface HistoryTimelineItemProps extends BaseTimelineItemProps<Resource> {\n history: Bundle;\n}\n\nfunction HistoryTimelineItem(props: HistoryTimelineItemProps): JSX.Element {\n const previous = getPrevious(props.history, props.resource);\n if (previous) {\n return (\n <TimelineItem resource={props.resource} padding={true} popupMenuItems={<TimelineItemPopupMenu {...props} />}>\n <ResourceDiffTable original={previous} revised={props.resource} />\n </TimelineItem>\n );\n } else {\n return (\n <TimelineItem resource={props.resource} padding={true} popupMenuItems={<TimelineItemPopupMenu {...props} />}>\n <h3>Created</h3>\n <ResourceTable value={props.resource} ignoreMissingValues={true} />\n </TimelineItem>\n );\n }\n}\n\nfunction getPrevious(history: Bundle, version: Resource): Resource | undefined {\n const entries = history.entry as BundleEntry[];\n const index = entries.findIndex((entry) => entry.resource?.meta?.versionId === version.meta?.versionId);\n if (index >= entries.length - 1) {\n return undefined;\n }\n return entries[index + 1].resource;\n}\n\nfunction CommunicationTimelineItem(props: BaseTimelineItemProps<Communication>): JSX.Element {\n const routine = !props.resource.priority || props.resource.priority === 'routine';\n const className = routine ? 'medplum-timeline-item' : 'medplum-timeline-item medplum-timeline-item-pinned';\n return (\n <TimelineItem\n resource={props.resource}\n profile={props.resource.sender}\n padding={true}\n className={className}\n popupMenuItems={<TimelineItemPopupMenu {...props} />}\n >\n <p>{props.resource.payload?.[0]?.contentString}</p>\n </TimelineItem>\n );\n}\n\nfunction MediaTimelineItem(props: BaseTimelineItemProps<Media>): JSX.Element {\n const contentType = props.resource.content?.contentType;\n const padding =\n contentType &&\n !contentType.startsWith('image/') &&\n !contentType.startsWith('video/') &&\n contentType !== 'application/pdf';\n return (\n <TimelineItem resource={props.resource} padding={!!padding} popupMenuItems={<TimelineItemPopupMenu {...props} />}>\n <AttachmentDisplay value={props.resource.content} />\n </TimelineItem>\n );\n}\n\nfunction AuditEventTimelineItem(props: BaseTimelineItemProps<AuditEvent>): JSX.Element {\n return (\n <TimelineItem resource={props.resource} padding={true} popupMenuItems={<TimelineItemPopupMenu {...props} />}>\n <Scrollable>\n <pre>{props.resource.outcomeDesc}</pre>\n </Scrollable>\n </TimelineItem>\n );\n}\n\nfunction DiagnosticReportTimelineItem(props: BaseTimelineItemProps<DiagnosticReport>): JSX.Element {\n return (\n <TimelineItem resource={props.resource} padding={true} popupMenuItems={<TimelineItemPopupMenu {...props} />}>\n <DiagnosticReportDisplay value={props.resource} />\n </TimelineItem>\n );\n}\n","import React from 'react';\nimport './Document.css';\n\nexport interface DocumentProps {\n width?: number;\n children?: React.ReactNode;\n}\n\nexport function Document(props: DocumentProps): JSX.Element {\n return (\n <main className=\"medplum-document\">\n <article style={{ maxWidth: props.width }}>{props.children}</article>\n </main>\n );\n}\n","import { evalFhirPath, PropertyType } from '@medplum/core';\nimport { Resource } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { ResourcePropertyDisplay } from './ResourcePropertyDisplay';\n\nexport interface FhirPathDisplayProps {\n resource: Resource;\n path: string;\n propertyType: PropertyType;\n}\n\nexport function FhirPathDisplay(props: FhirPathDisplayProps): JSX.Element | null {\n let value;\n\n try {\n value = evalFhirPath(props.path, props.resource);\n } catch (err) {\n console.warn('FhirPathDisplay:', err);\n return null;\n }\n\n if (value.length > 1) {\n throw new Error(\n `Component \"path\" for \"FhirPathDisplay\" must resolve to a single element. \\\n Received ${value.length} elements \\\n [${JSON.stringify(value, null, 2)}]`\n );\n }\n return <ResourcePropertyDisplay value={value[0] || ''} propertyType={props.propertyType} />;\n}\n","import { getSearchParameterDetails, IndexedStructureDefinition, SearchRequest } from '@medplum/core';\nimport { ElementDefinition, SearchParameter } from '@medplum/fhirtypes';\n\n/**\n * The SearchControlField type describes a field in the search control.\n *\n * In a SearchRequest, a field is a simple string. Strings can be one of the following:\n * 1) Simple property names, which refer to ElementDefinition objects\n * 2) Search parameter names, which refer to SearchParameter resources\n *\n * Consider a few examples of how this becomes complicated.\n *\n * \"name\" (easy)\n * - element definition path=\"Patient.name\"\n * - search parameter code=\"name\"\n *\n * \"birthDate\" (medium)\n * - refers to the element definition path=\"Patient.birthDate\"\n * - refers to the search parameter code=\"birthdate\" (note the capitalization)\n *\n * \"email\" (hard)\n * - refers to the search parameter code=\"email\"\n * - refers to the element definition path=\"Patient.telecom\"\n *\n * In the last case, we start with the search parameter, and walk backwards to the\n * element definition in order to get type details for rendering.\n *\n * Overall, we want columns, fields, properties, and search parameters to feel seamless,\n * so we try our darndest to make this work.\n */\nexport interface SearchControlField {\n readonly name: string;\n readonly elementDefinition?: ElementDefinition;\n readonly searchParams?: SearchParameter[];\n}\n\n/**\n * Returns the collection of field definitions for the search request.\n * @param typeSchema The schema for the resource type\n * @param search The search request definition.\n * @returns An array of field definitions.\n */\nexport function getFieldDefinitions(schema: IndexedStructureDefinition, search: SearchRequest): SearchControlField[] {\n const resourceType = search.resourceType;\n const fields = [] as SearchControlField[];\n\n for (const name of search.fields || ['id', '_lastUpdated']) {\n fields.push(getFieldDefinition(schema, resourceType, name));\n }\n return fields;\n}\n\n/**\n * Return the field definition for a given field name.\n * Field names can be either property names or search parameter codes.\n * @param typeSchema The schema for the resource type\n * @param resourceType The resource type.\n * @param name The search field name (either property name or search parameter code).\n * @returns The field definition.\n */\nfunction getFieldDefinition(\n schema: IndexedStructureDefinition,\n resourceType: string,\n name: string\n): SearchControlField {\n if (name === '_lastUpdated') {\n return {\n name: '_lastUpdated',\n searchParams: [\n {\n resourceType: 'SearchParameter',\n base: ['Resource'],\n code: '_lastUpdated',\n name: '_lastUpdated',\n type: 'date',\n expression: 'Resource.meta.lastUpdated',\n },\n ],\n };\n }\n\n if (name === 'meta.versionId') {\n return {\n name: 'meta.versionId',\n searchParams: [\n {\n resourceType: 'SearchParameter',\n base: ['Resource'],\n code: '_versionId',\n name: '_versionId',\n type: 'token',\n expression: 'Resource.meta.versionId',\n },\n ],\n };\n }\n\n const typeSchema = schema.types[resourceType];\n const exactElementDefinition: ElementDefinition | undefined = typeSchema.properties[name];\n const exactSearchParam: SearchParameter | undefined = typeSchema.searchParams?.[name.toLowerCase()];\n\n // Best case: Exact match of element definition or search parameter.\n // Examples: ServiceRequest.subject, Patient.name, Patient.birthDate\n // In this case, we only show the one search parameter.\n if (exactElementDefinition && exactSearchParam) {\n return { name, elementDefinition: exactElementDefinition, searchParams: [exactSearchParam] };\n }\n\n // Next best case: Exact match of element definition\n // Examples: Observation.value\n // In this case, there could be zero or more search parameters that are a function of the element definition.\n // So search for those search parameters.\n if (exactElementDefinition) {\n let searchParams: SearchParameter[] | undefined = undefined;\n if (typeSchema.searchParams) {\n const path = `${resourceType}.${name.replaceAll('[x]', '')}`;\n searchParams = Object.values(typeSchema.searchParams).filter((p) => p.expression?.includes(path));\n if (searchParams.length === 0) {\n searchParams = undefined;\n }\n }\n return { name, elementDefinition: exactElementDefinition, searchParams };\n }\n\n // Search parameter case: Exact match of search parameter\n // Examples: Observation.value-quantity, Patient.email\n // Here we have a search parameter, but no element definition.\n // Observation.value-quantity is a search parameter for the Observation.value element.\n // Patient.email is a search parameter for the Patient.telecom element.\n // So we need to walk backwards to find the element definition.\n if (exactSearchParam) {\n const details = getSearchParameterDetails(schema, resourceType, exactSearchParam);\n return { name, elementDefinition: details.elementDefinition, searchParams: [exactSearchParam] };\n }\n\n // Worst case: no element definition and no search parameter.\n // This is probably a malformed URL that includes an unknown field.\n // We will render the column header, but all cells will be empty.\n return { name };\n}\n","import React, { useState } from 'react';\nimport { Button } from './Button';\nimport { killEvent } from './utils/dom';\nimport './Dialog.css';\n\nexport interface DialogProps {\n visible: boolean;\n title: string;\n children?: React.ReactNode;\n onOk: () => void;\n onCancel: () => void;\n}\n\nexport function Dialog(props: DialogProps): JSX.Element | null {\n const [x, setX] = useState(100);\n const [y, setY] = useState(100);\n\n if (!props.visible) {\n return null;\n }\n\n function handleMouseDown(downEvent: React.MouseEvent): void {\n killEvent(downEvent);\n\n const dragX = downEvent.clientX - x;\n const dragY = downEvent.clientY - y;\n\n function handleMouseMove(moveEvent: MouseEvent): void {\n killEvent(moveEvent);\n setX(moveEvent.clientX - dragX);\n setY(moveEvent.clientY - dragY);\n }\n\n function handleMouseUp(upEvent: MouseEvent): void {\n killEvent(upEvent);\n document.removeEventListener('mouseup', handleMouseUp, true);\n document.removeEventListener('mousemove', handleMouseMove, true);\n }\n\n document.addEventListener('mouseup', handleMouseUp, true);\n document.addEventListener('mousemove', handleMouseMove, true);\n }\n\n return (\n <>\n <div className=\"modal-dialog-bg\"></div>\n <div className=\"modal-dialog\" data-testid=\"dialog\" tabIndex={0} style={{ left: x + 'px', top: y + 'px' }}>\n <div className=\"modal-dialog-title\" onMouseDown={(e) => handleMouseDown(e)}>\n <span className=\"modal-dialog-title-text\">{props.title}</span>\n <span className=\"modal-dialog-title-close\" tabIndex={0} onClick={props.onCancel}>\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </span>\n </div>\n <div className=\"modal-dialog-content\">{props.children}</div>\n <div className=\"modal-dialog-buttons\">\n <Button testid=\"dialog-ok\" onClick={props.onOk}>\n OK\n </Button>\n <Button testid=\"dialog-cancel\" onClick={props.onCancel}>\n Cancel\n </Button>\n </div>\n </div>\n </>\n );\n}\n","import { capitalize, evalFhirPathTyped, Filter, Operator, PropertyType, SearchRequest } from '@medplum/core';\nimport { ElementDefinition, Resource, SearchParameter } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { DateTimeDisplay } from './DateTimeDisplay';\nimport { getValueAndType, ResourcePropertyDisplay } from './ResourcePropertyDisplay';\nimport { SearchControlField } from './SearchControlField';\n\nconst searchParamToOperators: Record<string, Operator[]> = {\n string: [Operator.EQUALS, Operator.NOT, Operator.CONTAINS, Operator.EXACT],\n fulltext: [Operator.EQUALS, Operator.NOT, Operator.CONTAINS, Operator.EXACT],\n token: [Operator.EQUALS, Operator.NOT],\n reference: [Operator.EQUALS, Operator.NOT],\n numeric: [\n Operator.EQUALS,\n Operator.NOT_EQUALS,\n Operator.GREATER_THAN,\n Operator.LESS_THAN,\n Operator.GREATER_THAN_OR_EQUALS,\n Operator.LESS_THAN_OR_EQUALS,\n ],\n quantity: [\n Operator.EQUALS,\n Operator.NOT_EQUALS,\n Operator.GREATER_THAN,\n Operator.LESS_THAN,\n Operator.GREATER_THAN_OR_EQUALS,\n Operator.LESS_THAN_OR_EQUALS,\n ],\n date: [\n Operator.EQUALS,\n Operator.NOT_EQUALS,\n Operator.GREATER_THAN,\n Operator.LESS_THAN,\n Operator.GREATER_THAN_OR_EQUALS,\n Operator.LESS_THAN_OR_EQUALS,\n Operator.STARTS_AFTER,\n Operator.ENDS_BEFORE,\n Operator.APPROXIMATELY,\n ],\n datetime: [\n Operator.EQUALS,\n Operator.NOT_EQUALS,\n Operator.GREATER_THAN,\n Operator.LESS_THAN,\n Operator.GREATER_THAN_OR_EQUALS,\n Operator.LESS_THAN_OR_EQUALS,\n Operator.STARTS_AFTER,\n Operator.ENDS_BEFORE,\n Operator.APPROXIMATELY,\n ],\n};\n\nconst operatorNames: Record<Operator, string> = {\n eq: 'equals',\n ne: 'not equals',\n gt: 'greater than',\n lt: 'less than',\n ge: 'greater than or equals',\n le: 'less than or equals',\n sa: 'starts after',\n eb: 'ends before',\n ap: 'approximately',\n contains: 'contains',\n exact: 'exact',\n text: 'text',\n not: 'not',\n above: 'above',\n below: 'below',\n in: 'in',\n 'not-in': 'not in',\n 'of-type': 'of type',\n missing: 'missing',\n};\n\n/**\n * Sets the array of filters.\n *\n * @param {Array} filters The new filters.\n */\nexport function setFilters(definition: SearchRequest, filters: Filter[]): SearchRequest {\n return {\n ...definition,\n filters: filters,\n offset: 0,\n name: undefined,\n };\n}\n\n/**\n * Clears all of the filters.\n */\nexport function clearFilters(definition: SearchRequest): SearchRequest {\n return setFilters(definition, []);\n}\n\n/**\n * Clears all of the filters on a certain field.\n *\n * @param {string} code The field key name to clear filters.\n */\nexport function clearFiltersOnField(definition: SearchRequest, code: string): SearchRequest {\n return setFilters(\n definition,\n (definition.filters || []).filter((f) => f.code !== code)\n );\n}\n\n/**\n * Adds a filter.\n *\n * @param {string} field The field key name.\n * @param {Operator} op The operation key name.\n * @param {?string} value The filter value.\n * @param {boolean=} opt_clear Optional flag to clear filters on the field.\n */\nexport function addFilter(\n definition: SearchRequest,\n field: string,\n op: Operator,\n value?: string,\n opt_clear?: boolean\n): SearchRequest {\n if (opt_clear) {\n definition = clearFiltersOnField(definition, field);\n }\n\n const nextFilters: Filter[] = [];\n if (definition.filters) {\n nextFilters.push(...definition.filters);\n }\n nextFilters.push({ code: field, operator: op, value: value || '' });\n\n return setFilters(definition, nextFilters);\n}\n\n/**\n * Adds a field.\n *\n * @param {string} field The field key name.\n */\nexport function addField(definition: SearchRequest, field: string): SearchRequest {\n if (definition.fields && definition.fields.includes(field)) {\n return definition;\n }\n const newFields = [];\n if (definition.fields) {\n newFields.push(...definition.fields);\n }\n newFields.push(field);\n return {\n ...definition,\n fields: newFields,\n name: undefined,\n };\n}\n\n/**\n * Deletes a filter at the specified index.\n *\n * @param {number} index The filter index.\n */\nexport function deleteFilter(definition: SearchRequest, index: number): SearchRequest {\n if (!definition.filters) {\n return definition;\n }\n const newFilters = [...definition.filters];\n newFilters.splice(index, 1);\n return {\n ...definition,\n filters: newFilters,\n name: undefined,\n };\n}\n\n/**\n * Adds a filter that constrains the specified field to \"yesterday\".\n *\n * @param {string} field The field key name.\n */\nexport function addYesterdayFilter(definition: SearchRequest, field: string): SearchRequest {\n return addDayFilter(definition, field, -1);\n}\n\n/**\n * Adds a filter that constrains the specified field to \"today\".\n *\n * @param {string} field The field key name.\n */\nexport function addTodayFilter(definition: SearchRequest, field: string): SearchRequest {\n return addDayFilter(definition, field, 0);\n}\n\n/**\n * Adds a filter that constrains the specified field to \"tomorrow\".\n *\n * @param {string} field The field key name.\n */\nexport function addTomorrowFilter(definition: SearchRequest, field: string): SearchRequest {\n return addDayFilter(definition, field, 1);\n}\n\n/**\n * Adds a filter that constrains the specified field to a day.\n * The day is specified as a delta from the current day.\n * \"Today\" would be 0.\n * \"Yesterday\" would be -1.\n * \"Tomorrow\" would be 1.\n *\n * @param {string} field The field key name.\n * @param {number} delta The number of days from this day.\n */\nfunction addDayFilter(definition: SearchRequest, field: string, delta: number): SearchRequest {\n const startTime = new Date();\n startTime.setDate(startTime.getDate() + delta);\n startTime.setHours(0, 0, 0, 0);\n\n const endTime = new Date(startTime.getTime());\n endTime.setDate(endTime.getDate() + 1);\n endTime.setTime(endTime.getTime() - 1);\n\n return addDateFilterBetween(definition, field, startTime, endTime);\n}\n\n/**\n * Adds a filter that constrains the specified field to \"last month\".\n *\n * @param {string} field The field key name.\n */\nexport function addLastMonthFilter(definition: SearchRequest, field: string): SearchRequest {\n return addMonthFilter(definition, field, -1);\n}\n\n/**\n * Adds a filter that constrains the specified field to \"this month\".\n *\n * @param {string} field The field key name.\n */\nexport function addThisMonthFilter(definition: SearchRequest, field: string): SearchRequest {\n return addMonthFilter(definition, field, 0);\n}\n\n/**\n * Adds a filter that constrains the specified field to \"next month\".\n *\n * @param {string} field The field key name.\n */\nexport function addNextMonthFilter(definition: SearchRequest, field: string): SearchRequest {\n return addMonthFilter(definition, field, 1);\n}\n\n/**\n * Adds a filter that constrains the specified field to a month.\n * The month is specified as a delta from the current month.\n * \"This month\" would be 0.\n * \"Last month\" would be -1.\n * \"Next month\" would be 1.\n *\n * @param {string} field The field key name.\n * @param {number} delta The number of months from this month.\n */\nfunction addMonthFilter(definition: SearchRequest, field: string, delta: number): SearchRequest {\n const startTime = new Date();\n startTime.setMonth(startTime.getMonth() + delta);\n startTime.setDate(1);\n startTime.setHours(0, 0, 0, 0);\n\n const endTime = new Date(startTime.getTime());\n endTime.setMonth(endTime.getMonth() + 1);\n endTime.setDate(1);\n endTime.setHours(0, 0, 0, 0);\n endTime.setTime(endTime.getTime() - 1);\n\n return addDateFilterBetween(definition, field, startTime, endTime);\n}\n\n/**\n * Adds a filter that constrains the specified field to the year to date.\n *\n * @param {string} field The field key name.\n */\nexport function addYearToDateFilter(definition: SearchRequest, field: string): SearchRequest {\n const startTime = new Date();\n startTime.setMonth(0);\n startTime.setDate(1);\n startTime.setHours(0, 0, 0, 0);\n\n const endTime = new Date();\n\n return addDateFilterBetween(definition, field, startTime, endTime);\n}\n\n/**\n * Adds a filter for a field equaling a specified date.\n *\n * @param {string} field The field key name.\n * @param {Date} value The date.\n */\nexport function addDateEqualsFilter(definition: SearchRequest, field: string, value: Date): SearchRequest {\n return addDateFilterBetween(definition, field, value, value);\n}\n\n/**\n * Adds a filter for a date before a certain date/time.\n *\n * @param {string} field The field key name.\n * @param {Operator} op The date/time operation.\n * @param {Date} value The date.\n */\nexport function addDateFilter(definition: SearchRequest, field: string, op: Operator, value: Date): SearchRequest {\n definition = clearFiltersOnField(definition, field);\n return addDateFilterImpl(definition, field, op, value);\n}\n\n/**\n * Adds a filter for a date between two dates (inclusive of both dates).\n *\n * @param {string} field The field key name.\n * @param {Date} d1 The start date.\n * @param {Date} d2 The end date.\n */\nexport function addDateFilterBetween(definition: SearchRequest, field: string, d1: Date, d2: Date): SearchRequest {\n definition = clearFiltersOnField(definition, field);\n definition = addDateFilterImpl(definition, field, Operator.GREATER_THAN_OR_EQUALS, d1);\n definition = addDateFilterImpl(definition, field, Operator.LESS_THAN_OR_EQUALS, d2);\n return definition;\n}\n\n/**\n * Adds a filter for a date before a certain date/time.\n *\n * @param {string} field The field key name.\n * @param {Operator} op The date/time operation.\n * @param {Date} value The date.\n */\nfunction addDateFilterImpl(definition: SearchRequest, field: string, op: Operator, value: Date): SearchRequest {\n return addFilter(definition, field, op, value.toISOString());\n}\n\n/**\n * Adds a filter that constrains the specified field to \"missing\".\n *\n * @param {string} field The field key name.\n */\nexport function addMissingFilter(definition: SearchRequest, field: string, value = true): SearchRequest {\n return addFilter(definition, field, Operator.MISSING, value.toString());\n}\n\n/**\n * Returns true if the search has any filters on the specified field.\n *\n * @param {string} code The field key name.\n */\nexport function hasFilterOnField(definition: SearchRequest, code: string): boolean {\n if (!definition.filters) {\n return false;\n }\n return definition.filters.find((f) => f.code === code) !== undefined;\n}\n\n/**\n * Sets the offset (starting at zero).\n *\n * @param {number} offset The offset number.\n */\nexport function setOffset(definition: SearchRequest, offset: number): SearchRequest {\n if (definition.offset === offset) {\n return definition;\n }\n return {\n ...definition,\n offset,\n name: undefined,\n };\n}\n\n/**\n * Moves the page forward or backward.\n *\n * @param {number} delta The delta to the page number.\n * @return {boolean} True if the page actually moved; false otherwise.\n */\nexport function movePage(definition: SearchRequest, delta: number): SearchRequest {\n const count = definition.count ?? 20;\n const currOffset = definition.offset ?? 0;\n const newOffset = currOffset + delta * count;\n return setOffset(definition, Math.max(newOffset, 0));\n}\n\n/**\n * Sorts the search by the specified key, and optional direction.\n * Direction defaults to ascending ('asc') if not specified.\n *\n * @param {string} sortField The sort key.\n */\nexport function setSort(definition: SearchRequest, sort: string, desc?: boolean): SearchRequest {\n if (sort === getSortField(definition) && desc !== undefined && desc === isSortDescending(definition)) {\n return definition;\n }\n return {\n ...definition,\n sortRules: [\n {\n code: sort,\n descending: !!desc,\n },\n ],\n name: undefined,\n };\n}\n\n/**\n * Toggles the sort of the search by key.\n * If the search is already sorted by the key, reverses the direction.\n * If the search is not sorted by the key, sort in ascending order.\n *\n * @param {string} key The field key name.\n */\nexport function toggleSort(definition: SearchRequest, key: string): SearchRequest {\n let desc = false;\n if (getSortField(definition) === key) {\n desc = !isSortDescending(definition);\n }\n return setSort(definition, key, desc);\n}\n\nexport function getSortField(definition: SearchRequest): string | undefined {\n const sortRules = definition.sortRules;\n if (!sortRules || sortRules.length === 0) {\n return undefined;\n }\n const field = sortRules[0].code;\n return field.startsWith('-') ? field.substr(1) : field;\n}\n\nexport function isSortDescending(definition: SearchRequest): boolean {\n const sortRules = definition.sortRules;\n if (!sortRules || sortRules.length === 0) {\n return false;\n }\n return !!sortRules[0].descending;\n}\n\n/**\n * Returns a list of operators for a search parameter.\n * @param searchParam The search parameter.\n * @returns The list of operators that can be used for the search parameter.\n */\nexport function getSearchOperators(searchParam: SearchParameter): Operator[] | undefined {\n return searchParamToOperators[searchParam.type as string];\n}\n\n/**\n * Returns a string representing the operation.\n *\n * @param {string} op The operation code.\n * @return {string} A display string for the operation.\n */\nexport function getOpString(op: Operator): string {\n return operatorNames[op] ?? '';\n}\n\n/**\n * Returns a field display name.\n * @param key The field key.\n * @returns The field display name.\n */\nexport function buildFieldNameString(key: string): string {\n let tmp = key;\n\n // If dot separated, only the last part\n if (tmp.includes('.')) {\n tmp = tmp.split('.').pop() as string;\n }\n\n // Special case for ID\n if (tmp === 'id') {\n return 'ID';\n }\n\n // Special case for Version ID\n if (tmp === 'versionId') {\n return 'Version ID';\n }\n\n // Remove choice of type\n tmp = tmp.replace('[x]', '');\n\n // Convert camel case to space separated\n tmp = tmp.replace(/([A-Z])/g, ' $1');\n\n // Convert dashes and underscores to spaces\n tmp = tmp.replace(/[-_]/g, ' ');\n\n // Normalize whitespace to single space character\n tmp = tmp.replace(/\\s+/g, ' ');\n\n // Trim\n tmp = tmp.trim();\n\n // Capitalize the first letter of each word\n return tmp.split(/\\s/).map(capitalize).join(' ');\n}\n\n/**\n * Returns a fragment to be displayed in the search table for the value.\n * @param resource The parent resource.\n * @param key The search code or FHIRPath expression.\n * @returns The fragment to display.\n */\nexport function renderValue(resource: Resource, field: SearchControlField): string | JSX.Element | null | undefined {\n const key = field.name;\n if (key === 'id') {\n return resource.id;\n }\n\n if (key === 'meta.versionId') {\n return resource.meta?.versionId;\n }\n\n if (key === '_lastUpdated') {\n return <DateTimeDisplay value={resource.meta?.lastUpdated} />;\n }\n\n // Priority 1: ElementDefinition by exact match\n if (field.elementDefinition && `${resource.resourceType}.${field.name}` === field.elementDefinition.path) {\n return renderPropertyValue(resource, field.elementDefinition);\n }\n\n // Priority 2: SearchParameter by exact match\n if (field.searchParams && field.searchParams.length === 1 && field.name === field.searchParams[0].code) {\n return renderSearchParameterValue(resource, field.searchParams[0], field.elementDefinition);\n }\n\n // We don't know how to render this field definition\n return null;\n}\n\n/**\n * Returns a fragment to be displayed in the search table for a resource property.\n * @param resource The parent resource.\n * @param elementDefinition The property element definition.\n * @returns A React element or null.\n */\nfunction renderPropertyValue(resource: Resource, elementDefinition: ElementDefinition): JSX.Element | null {\n const path = elementDefinition.path?.split('.')?.pop()?.replaceAll('[x]', '') || '';\n const [value, propertyType] = getValueAndType({ type: resource.resourceType, value: resource }, path);\n if (!value) {\n return null;\n }\n\n return (\n <ResourcePropertyDisplay\n property={elementDefinition}\n propertyType={propertyType}\n value={value}\n maxWidth={200}\n ignoreMissingValues={true}\n link={false}\n />\n );\n}\n\n/**\n * Returns a fragment to be displayed in the search table for a search parameter.\n * @param resource The parent resource.\n * @param searchParam The search parameter.\n * @param elementDefinition Optional element definition.\n * @returns A React element or null.\n */\nfunction renderSearchParameterValue(\n resource: Resource,\n searchParam: SearchParameter,\n elementDefinition: ElementDefinition | undefined\n): JSX.Element | null {\n const value = evalFhirPathTyped(searchParam.expression as string, [{ type: resource.resourceType, value: resource }]);\n if (!value || value.length === 0) {\n return null;\n }\n\n if (elementDefinition) {\n return (\n <ResourcePropertyDisplay\n propertyType={value[0].type as PropertyType}\n value={value[0].value}\n maxWidth={200}\n ignoreMissingValues={true}\n link={false}\n />\n );\n }\n\n return (\n <>\n {value.map((v, index) => (\n <span key={`${index}-${value.length}`}>\n {typeof v === 'object' ? JSON.stringify(v) : (v as string | number)}\n </span>\n ))}\n </>\n );\n}\n","import { IndexedStructureDefinition, SearchRequest, stringify, TypeSchema } from '@medplum/core';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { Button } from './Button';\nimport { Dialog } from './Dialog';\nimport { buildFieldNameString } from './SearchUtils';\n\ninterface SearchFieldEditorProps {\n schema: IndexedStructureDefinition;\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 = props.schema.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 <Dialog title=\"Fields\" visible={props.visible} onOk={() => props.onOk(state.search)} onCancel={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 size=\"small\" onClick={onAddField}>\n Add\n </Button>\n </td>\n <td align=\"center\">\n <Button size=\"small\" onClick={onRemoveField}>\n Remove\n </Button>\n </td>\n <td align=\"center\">\n <Button size=\"small\" onClick={onMoveUp}>\n Up\n </Button>\n </td>\n <td align=\"center\">\n <Button size=\"small\" onClick={onMoveDown}>\n Down\n </Button>\n </td>\n </tr>\n </tfoot>\n </table>\n </div>\n </Dialog>\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","import { Filter } from '@medplum/core';\nimport React from 'react';\nimport { DateTimeDisplay } from './DateTimeDisplay';\nimport { useMedplum } from './MedplumProvider';\nimport { ResourceName } from './ResourceName';\n\nexport interface SearchFilterValueDisplayProps {\n readonly resourceType: string;\n readonly filter: Filter;\n}\n\nexport function SearchFilterValueDisplay(props: SearchFilterValueDisplayProps): JSX.Element | null {\n const medplum = useMedplum();\n const schema = medplum.getSchema();\n const searchParam = schema.types[props.resourceType]?.searchParams?.[props.filter.code];\n\n const filter = props.filter;\n if (searchParam?.type === 'reference') {\n return <ResourceName value={{ reference: filter.value }} />;\n }\n\n if (props.filter.code === '_lastUpdated' || searchParam?.type === 'datetime') {\n return <DateTimeDisplay value={filter.value} />;\n }\n\n return <>{filter.value}</>;\n}\n","import { getSearchParameterDetails, IndexedStructureDefinition, SearchParameterType } from '@medplum/core';\nimport { Quantity, Reference, SearchParameter } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { Checkbox } from './Checkbox';\nimport { DateTimeInput } from './DateTimeInput';\nimport { Input } from './Input';\nimport { QuantityInput } from './QuantityInput';\nimport { ReferenceInput } from './ReferenceInput';\n\nexport interface SearchFilterValueInputProps {\n schema: IndexedStructureDefinition;\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.schema, 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 testid={name}\n defaultValue={props.defaultValue === 'true'}\n onChange={(newValue) => props.onChange(newValue.toString())}\n />\n );\n\n case SearchParameterType.DATE:\n return <Input type=\"date\" testid={name} defaultValue={props.defaultValue} onChange={props.onChange} />;\n\n case SearchParameterType.DATETIME:\n return <DateTimeInput testid={name} defaultValue={props.defaultValue} onChange={props.onChange} />;\n\n case SearchParameterType.NUMBER:\n return <Input type=\"number\" defaultValue={props.defaultValue} onChange={props.onChange} />;\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 <Input testid={name} defaultValue={props.defaultValue} autoFocus={props.autoFocus} onChange={props.onChange} />\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","import { Filter, IndexedStructureDefinition, Operator, SearchRequest, stringify } from '@medplum/core';\nimport { SearchParameter } from '@medplum/fhirtypes';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { Button } from './Button';\nimport { Dialog } from './Dialog';\nimport { SearchFilterValueDisplay } from './SearchFilterValueDisplay';\nimport { SearchFilterValueInput } from './SearchFilterValueInput';\nimport {\n addFilter,\n buildFieldNameString,\n deleteFilter,\n getOpString,\n getSearchOperators,\n setFilters,\n} from './SearchUtils';\nimport { Select } from './Select';\nimport './SearchFilterEditor.css';\n\nexport interface SearchFilterEditorProps {\n schema: IndexedStructureDefinition;\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 schema = props.schema;\n const resourceType = props.search.resourceType;\n const searchParams = schema.types[resourceType].searchParams as Record<string, SearchParameter>;\n const filters = search.filters || [];\n\n return (\n <Dialog\n title=\"Filters\"\n visible={props.visible}\n onOk={() => props.onOk(searchRef.current)}\n onCancel={props.onCancel}\n >\n <div className=\"medplum-filter-editor\">\n <table className=\"medplum-filter-editor-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 schema={schema}\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\n schema={schema}\n resourceType={resourceType}\n searchParams={searchParams}\n okText=\"Add\"\n onOk={onAddFilter}\n />\n </tbody>\n </table>\n </div>\n </Dialog>\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 size=\"small\" onClick={props.onEdit}>\n Edit\n </Button>\n <Button size=\"small\" onClick={props.onDelete}>\n Delete\n </Button>\n </td>\n </tr>\n );\n}\n\ninterface FilterRowInputProps {\n schema: IndexedStructureDefinition;\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 <Select testid=\"filter-field\" defaultValue={valueRef.current.code} onChange={setFilterCode}>\n <option value=\"\"></option>\n {Object.keys(props.searchParams).map((param) => (\n <option key={param} value={param}>\n {buildFieldNameString(param)}\n </option>\n ))}\n </Select>\n </td>\n <td>\n {operators && (\n <Select\n testid=\"filter-operation\"\n defaultValue={value.operator}\n onChange={setFilterOperator as (newOperator: string) => void}\n >\n <option value=\"\"></option>\n {operators.map((operator) => (\n <option key={operator} value={operator}>\n {getOpString(operator)}\n </option>\n ))}\n </Select>\n )}\n </td>\n <td>\n {searchParam && value.operator && (\n <SearchFilterValueInput\n schema={props.schema}\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 size=\"small\"\n onClick={() => {\n props.onOk(valueRef.current);\n setValue({} as Filter);\n }}\n >\n {props.okText}\n </Button>\n )}\n {props.onCancel && (\n <Button size=\"small\" onClick={props.onCancel}>\n Cancel\n </Button>\n )}\n </td>\n </tr>\n );\n}\n","import { Filter, IndexedStructureDefinition } from '@medplum/core';\nimport { SearchParameter } from '@medplum/fhirtypes';\nimport React, { useState } from 'react';\nimport { Dialog } from './Dialog';\nimport { Form } from './Form';\nimport { SearchFilterValueInput } from './SearchFilterValueInput';\n\nexport interface SearchFilterValueDialogProps {\n title: string;\n visible: boolean;\n schema: IndexedStructureDefinition;\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 <Dialog title={props.title} visible={props.visible} onOk={onOk} onCancel={props.onCancel}>\n <div style={{ width: 500 }}>\n <Form onSubmit={onOk}>\n <SearchFilterValueInput\n schema={props.schema}\n resourceType={props.resourceType}\n searchParam={props.searchParam}\n defaultValue={value}\n autoFocus={true}\n onChange={setValue}\n />\n </Form>\n </div>\n </Dialog>\n );\n}\n","import React from 'react';\nimport './MenuSeparator.css';\n\nexport function MenuSeparator(): JSX.Element {\n return <div className=\"medplum-menu-separator\" />;\n}\n","import React, { useEffect, useRef, useState } from 'react';\nimport { Popup } from './Popup';\nimport './SubMenu.css';\n\nexport interface SubMenuProps {\n title: string;\n children: React.ReactNode;\n}\n\nexport function SubMenu(props: SubMenuProps): JSX.Element {\n const [hover, setHover] = useState(false);\n const [visible, setVisible] = useState(false);\n const [anchor, setAnchor] = useState<DOMRectReadOnly | undefined>(undefined);\n const menuItemRef = useRef<HTMLDivElement>(null);\n\n const hoverRef = useRef<boolean>(false);\n hoverRef.current = hover;\n\n const visibleRef = useRef<boolean>(false);\n visibleRef.current = visible;\n\n function show(): void {\n const el = menuItemRef.current;\n if (el) {\n setAnchor(el.getBoundingClientRect());\n setVisible(true);\n }\n }\n\n useEffect(() => {\n const timerId = window.setInterval(() => {\n if (!visibleRef.current && hoverRef.current) {\n show();\n } else if (visibleRef.current && !hoverRef.current) {\n setVisible(false);\n }\n }, 150);\n return () => window.clearInterval(timerId);\n }, []);\n\n return (\n <div\n ref={menuItemRef}\n className=\"medplum-menu-item medplum-submenu-item\"\n onClick={() => show()}\n onMouseOver={() => setHover(true)}\n onMouseLeave={() => setHover(false)}\n >\n {props.title}\n <span className=\"medplum-submenu-arrow\">{'\\u25BA'}</span>\n <Popup visible={visible} anchor={anchor} autoClose={true} onClose={() => setVisible(false)}>\n {props.children}\n </Popup>\n </div>\n );\n}\n","import { Filter, IndexedStructureDefinition, Operator, SearchRequest } from '@medplum/core';\nimport { SearchParameter } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { MenuItem } from './MenuItem';\nimport { MenuSeparator } from './MenuSeparator';\nimport { Popup } from './Popup';\nimport {\n addLastMonthFilter,\n addMissingFilter,\n addNextMonthFilter,\n addThisMonthFilter,\n addTodayFilter,\n addTomorrowFilter,\n addYearToDateFilter,\n addYesterdayFilter,\n buildFieldNameString,\n clearFiltersOnField,\n setSort,\n} from './SearchUtils';\nimport { SubMenu } from './SubMenu';\n\nexport interface SearchPopupMenuProps {\n schema: IndexedStructureDefinition;\n search: SearchRequest;\n visible: boolean;\n x: number;\n y: number;\n searchParams?: SearchParameter[];\n onPrompt: (searchParam: SearchParameter, filter: Filter) => void;\n onChange: (definition: SearchRequest) => void;\n onClose: () => void;\n}\n\nexport function SearchPopupMenu(props: SearchPopupMenuProps): JSX.Element | null {\n if (!props.searchParams) {\n return null;\n }\n\n function onSort(searchParam: SearchParameter, desc: boolean): void {\n onChange(setSort(props.search, searchParam.code as string, desc));\n }\n\n function onClear(searchParam: SearchParameter): void {\n onChange(clearFiltersOnField(props.search, searchParam.code as string));\n }\n\n function onPrompt(searchParam: SearchParameter, operator: Operator): void {\n props.onPrompt(searchParam, { code: searchParam.code as string, operator, value: '' });\n }\n\n function onChange(definition: SearchRequest): void {\n props.onChange(definition);\n }\n\n const anchor = { left: props.x, right: props.x, top: props.y, bottom: props.y } as DOMRectReadOnly;\n\n // If there is only one search parameter, then show it directly\n if (props.searchParams.length === 1) {\n return (\n <Popup visible={props.visible} anchor={anchor} autoClose={true} onClose={props.onClose}>\n <SearchParameterSubMenu\n search={props.search}\n searchParam={props.searchParams[0]}\n onSort={onSort}\n onPrompt={onPrompt}\n onChange={onChange}\n onClear={onClear}\n />\n </Popup>\n );\n }\n\n // Otherwise, show a menu, with each search parameter as a sub menu\n return (\n <Popup visible={props.visible} anchor={anchor} autoClose={true} onClose={props.onClose}>\n {props.searchParams.map((searchParam) => (\n <SubMenu key={searchParam.code as string} title={buildFieldNameString(searchParam.code as string)}>\n <SearchParameterSubMenu\n search={props.search}\n searchParam={searchParam}\n onSort={onSort}\n onPrompt={onPrompt}\n onChange={onChange}\n onClear={onClear}\n />\n </SubMenu>\n ))}\n </Popup>\n );\n}\n\ninterface SearchPopupSubMenuProps {\n search: SearchRequest;\n searchParam: SearchParameter;\n onSort: (searchParam: SearchParameter, descending: boolean) => void;\n onPrompt: (searchParam: SearchParameter, operator: Operator) => void;\n onChange: (search: SearchRequest) => void;\n onClear: (searchParam: SearchParameter) => void;\n}\n\nfunction SearchParameterSubMenu(props: SearchPopupSubMenuProps): JSX.Element {\n switch (props.searchParam.type) {\n case 'date':\n return <DateFilterSubMenu {...props} />;\n case 'number':\n case 'quantity':\n return <NumericFilterSubMenu {...props} />;\n case 'reference':\n return <ReferenceFilterSubMenu {...props} />;\n case 'string':\n case 'token':\n case 'uri':\n return <TextFilterSubMenu {...props} />;\n default:\n return <>Unknown search param type: {props.searchParam.type}</>;\n }\n}\n\nfunction DateFilterSubMenu(props: SearchPopupSubMenuProps): JSX.Element {\n const { searchParam } = props;\n const code = searchParam.code as string;\n return (\n <>\n <MenuItem onClick={() => props.onSort(searchParam, false)}>Sort Oldest to Newest</MenuItem>\n <MenuItem onClick={() => props.onSort(searchParam, true)}>Sort Newest to Oldest</MenuItem>\n <MenuSeparator />\n <MenuItem onClick={() => props.onPrompt(searchParam, Operator.EQUALS)}>Equals...</MenuItem>\n <MenuItem onClick={() => props.onPrompt(searchParam, Operator.NOT_EQUALS)}>Does not equal...</MenuItem>\n <MenuSeparator />\n <MenuItem onClick={() => props.onPrompt(searchParam, Operator.ENDS_BEFORE)}>Before...</MenuItem>\n <MenuItem onClick={() => props.onPrompt(searchParam, Operator.STARTS_AFTER)}>After...</MenuItem>\n <MenuItem onClick={() => props.onPrompt(searchParam, Operator.EQUALS)}>Between...</MenuItem>\n <MenuSeparator />\n <MenuItem onClick={() => props.onChange(addTomorrowFilter(props.search, code))}>Tomorrow</MenuItem>\n <MenuItem onClick={() => props.onChange(addTodayFilter(props.search, code))}>Today</MenuItem>\n <MenuItem onClick={() => props.onChange(addYesterdayFilter(props.search, code))}>Yesterday</MenuItem>\n <MenuSeparator />\n <MenuItem onClick={() => props.onChange(addNextMonthFilter(props.search, code))}>Next Month</MenuItem>\n <MenuItem onClick={() => props.onChange(addThisMonthFilter(props.search, code))}>This Month</MenuItem>\n <MenuItem onClick={() => props.onChange(addLastMonthFilter(props.search, code))}>Last Month</MenuItem>\n <MenuSeparator />\n <MenuItem onClick={() => props.onChange(addYearToDateFilter(props.search, code))}>Year to date</MenuItem>\n <MenuSeparator />\n <MenuItem onClick={() => props.onChange(addMissingFilter(props.search, code))}>Missing</MenuItem>\n <MenuItem onClick={() => props.onChange(addMissingFilter(props.search, code, false))}>Not missing</MenuItem>\n <MenuSeparator />\n <MenuItem onClick={() => props.onClear(searchParam)}>Clear filters</MenuItem>\n </>\n );\n}\n\nfunction NumericFilterSubMenu(props: SearchPopupSubMenuProps): JSX.Element {\n const { searchParam } = props;\n const code = searchParam.code as string;\n return (\n <>\n <MenuItem onClick={() => props.onSort(searchParam, false)}>Sort Smallest to Largest</MenuItem>\n <MenuItem onClick={() => props.onSort(searchParam, true)}>Sort Largest to Smallest</MenuItem>\n <MenuSeparator />\n <MenuItem onClick={() => props.onPrompt(searchParam, Operator.EQUALS)}>Equals...</MenuItem>\n <MenuItem onClick={() => props.onPrompt(searchParam, Operator.NOT_EQUALS)}>Does not equal...</MenuItem>\n <MenuSeparator />\n <MenuItem onClick={() => props.onPrompt(searchParam, Operator.GREATER_THAN)}>Greater than...</MenuItem>\n <MenuItem onClick={() => props.onPrompt(searchParam, Operator.GREATER_THAN_OR_EQUALS)}>\n Greater than or equal to...\n </MenuItem>\n <MenuItem onClick={() => props.onPrompt(searchParam, Operator.LESS_THAN)}>Less than...</MenuItem>\n <MenuItem onClick={() => props.onPrompt(searchParam, Operator.LESS_THAN_OR_EQUALS)}>\n Less than or equal to...\n </MenuItem>\n <MenuSeparator />\n <MenuItem onClick={() => props.onChange(addMissingFilter(props.search, code))}>Missing</MenuItem>\n <MenuItem onClick={() => props.onChange(addMissingFilter(props.search, code, false))}>Not missing</MenuItem>\n <MenuSeparator />\n <MenuItem onClick={() => props.onClear(searchParam)}>Clear filters</MenuItem>\n </>\n );\n}\n\nfunction ReferenceFilterSubMenu(props: SearchPopupSubMenuProps): JSX.Element {\n const { searchParam } = props;\n const code = searchParam.code as string;\n return (\n <>\n <MenuItem onClick={() => props.onPrompt(searchParam, Operator.EQUALS)}>Equals...</MenuItem>\n <MenuItem onClick={() => props.onPrompt(searchParam, Operator.NOT)}>Does not equal...</MenuItem>\n <MenuSeparator />\n <MenuItem onClick={() => props.onChange(addMissingFilter(props.search, code))}>Missing</MenuItem>\n <MenuItem onClick={() => props.onChange(addMissingFilter(props.search, code, false))}>Not missing</MenuItem>\n <MenuSeparator />\n <MenuItem onClick={() => props.onClear(searchParam)}>Clear filters</MenuItem>\n </>\n );\n}\n\nfunction TextFilterSubMenu(props: SearchPopupSubMenuProps): JSX.Element {\n const { searchParam } = props;\n const code = searchParam.code as string;\n return (\n <>\n <MenuItem onClick={() => props.onSort(searchParam, false)}>Sort A to Z</MenuItem>\n <MenuItem onClick={() => props.onSort(searchParam, true)}>Sort Z to A</MenuItem>\n <MenuSeparator />\n <MenuItem onClick={() => props.onPrompt(searchParam, Operator.EQUALS)}>Equals...</MenuItem>\n <MenuItem onClick={() => props.onPrompt(searchParam, Operator.NOT)}>Does not equal...</MenuItem>\n <MenuSeparator />\n <MenuItem onClick={() => props.onPrompt(searchParam, Operator.CONTAINS)}>Contains...</MenuItem>\n <MenuItem onClick={() => props.onPrompt(searchParam, Operator.EQUALS)}>Does not contain...</MenuItem>\n <MenuSeparator />\n <MenuItem onClick={() => props.onChange(addMissingFilter(props.search, code))}>Missing</MenuItem>\n <MenuItem onClick={() => props.onChange(addMissingFilter(props.search, code, false))}>Not missing</MenuItem>\n <MenuSeparator />\n <MenuItem onClick={() => props.onClear(searchParam)}>Clear filters</MenuItem>\n </>\n );\n}\n","import React from 'react';\nimport './TitleBar.css';\n\nexport interface TitleBarProps {\n children?: React.ReactNode;\n}\n\nexport function TitleBar(props: TitleBarProps): JSX.Element {\n return <div className=\"medplum-title-bar\">{props.children}</div>;\n}\n","import {\n DEFAULT_SEARCH_COUNT,\n Filter,\n formatSearchQuery,\n IndexedStructureDefinition,\n parseSearchDefinition,\n SearchRequest,\n} from '@medplum/core';\nimport {\n Bundle,\n OperationOutcome,\n Resource,\n ResourceType,\n SearchParameter,\n UserConfiguration,\n} from '@medplum/fhirtypes';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { Button } from './Button';\nimport { Loading } from './Loading';\nimport { useMedplum } from './MedplumProvider';\nimport { getFieldDefinitions } from './SearchControlField';\nimport { SearchFieldEditor } from './SearchFieldEditor';\nimport { SearchFilterEditor } from './SearchFilterEditor';\nimport { SearchFilterValueDialog } from './SearchFilterValueDialog';\nimport { SearchFilterValueDisplay } from './SearchFilterValueDisplay';\nimport { SearchPopupMenu } from './SearchPopupMenu';\nimport { addFilter, buildFieldNameString, getOpString, movePage, renderValue } from './SearchUtils';\nimport { Select } from './Select';\nimport { TitleBar } from './TitleBar';\nimport { isCheckboxCell, killEvent } from './utils/dom';\nimport './SearchControl.css';\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 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 popupVisible: boolean;\n popupX: number;\n popupY: number;\n popupSearchParams?: SearchParameter[];\n fieldEditorVisible: boolean;\n filterEditorVisible: boolean;\n filterDialogVisible: boolean;\n filterDialogFilter?: Filter;\n filterDialogSearchParam?: SearchParameter;\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 medplum = useMedplum();\n const [schema, setSchema] = useState<IndexedStructureDefinition | undefined>();\n const [outcome, setOutcome] = useState<OperationOutcome | undefined>();\n const { search, onLoad } = props;\n\n const [state, setState] = useState<SearchControlState>({\n selected: {},\n popupVisible: false,\n popupX: 0,\n popupY: 0,\n popupSearchParams: undefined,\n fieldEditorVisible: false,\n filterEditorVisible: 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(search.resourceType as ResourceType, formatSearchQuery({ ...search, total: 'accurate' }))\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 * Handles a click on a column header cell.\n * @param e The click event.\n * @param key The field key.\n */\n function handleSortClick(e: React.MouseEvent, searchParams: SearchParameter[] | undefined): void {\n setState({\n ...stateRef.current,\n popupVisible: true,\n popupX: e.clientX,\n popupY: e.clientY,\n popupSearchParams: searchParams,\n });\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 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 useEffect(() => {\n medplum.requestSchema(props.search.resourceType as ResourceType).then((newSchema) => {\n // The schema could have the same object identity,\n // so need to use the spread operator to kick React re-render.\n setSchema({ ...newSchema });\n });\n }, [medplum, props.search.resourceType]);\n\n const typeSchema = schema?.types?.[props.search.resourceType];\n if (!typeSchema) {\n return <Loading />;\n }\n\n const checkboxColumn = props.checkboxesEnabled;\n const fields = getFieldDefinitions(schema, 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 const savedSearches = props.userConfig?.search?.filter((s) => s.criteria?.startsWith(resourceType));\n\n return (\n <div className=\"medplum-search-control\" onContextMenu={(e) => killEvent(e)} data-testid=\"search-control\">\n {!props.hideToolbar && (\n <TitleBar>\n <div>\n <h1>\n <a href={`https://www.hl7.org/fhir/${resourceType.toLowerCase()}.html`} target=\"_blank\" rel=\"noopener\">\n {resourceType}\n </a>\n </h1>\n {savedSearches && (\n <Select\n testid=\"saved-search-select\"\n style={{ width: 80 }}\n onChange={(newValue) => {\n emitSearchChange(parseSearchDefinition(newValue));\n }}\n >\n <option></option>\n {savedSearches.map((s, index) => (\n <option key={`${index}-${savedSearches.length}`} value={s.criteria}>\n {s.name}\n </option>\n ))}\n </Select>\n )}\n <Button\n testid=\"fields-button\"\n size=\"small\"\n onClick={() => setState({ ...stateRef.current, fieldEditorVisible: true })}\n >\n Fields\n </Button>\n <Button\n testid=\"filters-button\"\n size=\"small\"\n onClick={() => setState({ ...stateRef.current, filterEditorVisible: true })}\n >\n Filters\n </Button>\n {props.onNew && (\n <Button size=\"small\" onClick={props.onNew}>\n New...\n </Button>\n )}\n {props.onExport && (\n <Button size=\"small\" onClick={props.onExport}>\n Export...\n </Button>\n )}\n {props.onDelete && (\n <Button\n size=\"small\"\n onClick={() => (props.onDelete as (ids: string[]) => any)(Object.keys(state.selected))}\n >\n Delete...\n </Button>\n )}\n {props.onBulk && (\n <Button\n size=\"small\"\n onClick={() => (props.onBulk as (ids: string[]) => any)(Object.keys(state.selected))}\n >\n Bulk...\n </Button>\n )}\n </div>\n {lastResult && (\n <div>\n <span className=\"medplum-search-summary\">\n {getStart(search, lastResult.total as number)}-{getEnd(search, lastResult.total as number)} of{' '}\n {lastResult.total?.toLocaleString()}\n </span>\n <Button testid=\"prev-page-button\" size=\"small\" onClick={() => emitSearchChange(movePage(search, -1))}>\n <<\n </Button>\n <Button testid=\"next-page-button\" size=\"small\" onClick={() => emitSearchChange(movePage(search, 1))}>\n >>\n </Button>\n </div>\n )}\n </TitleBar>\n )}\n <table>\n <thead>\n <tr>\n {checkboxColumn && (\n <th className=\"medplum-search-icon-cell\">\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} onClick={(e) => handleSortClick(e, field.searchParams)}>\n {buildFieldNameString(field.name)}\n {field.searchParams && <FilterIcon />}\n </th>\n ))}\n </tr>\n {!props.hideFilters && (\n <tr>\n {checkboxColumn && <th className=\"filters medplum-search-icon-cell\" />}\n {fields.map((field) => (\n <th key={field.name} className=\"filters\">\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 data-testid=\"search-control-row\"\n onClick={(e) => handleRowClick(e, resource)}\n onAuxClick={(e) => handleRowClick(e, resource)}\n >\n {checkboxColumn && (\n <td className=\"medplum-search-icon-cell\">\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 <div data-testid=\"empty-search\" className=\"medplum-empty-search\">\n No results\n </div>\n )}\n {outcome && (\n <div data-testid=\"search-error\" className=\"medplum-empty-search\">\n <pre style={{ textAlign: 'left' }}>{JSON.stringify(outcome, undefined, 2)}</pre>\n </div>\n )}\n <SearchPopupMenu\n schema={schema}\n search={props.search}\n visible={state.popupVisible}\n x={state.popupX}\n y={state.popupY}\n searchParams={state.popupSearchParams}\n onPrompt={(searchParam, filter) => {\n setState({\n ...stateRef.current,\n popupVisible: false,\n filterDialogVisible: true,\n filterDialogSearchParam: searchParam,\n filterDialogFilter: filter,\n });\n }}\n onChange={(result) => {\n emitSearchChange(result);\n setState({\n ...stateRef.current,\n popupVisible: false,\n popupSearchParams: undefined,\n });\n }}\n onClose={() => {\n setState({\n ...stateRef.current,\n popupVisible: false,\n popupSearchParams: undefined,\n });\n }}\n />\n <SearchFieldEditor\n schema={schema}\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 schema={schema}\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 <SearchFilterValueDialog\n visible={stateRef.current.filterDialogVisible}\n title={'Input'}\n schema={schema}\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 FilterIcon(): JSX.Element {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"h-6 w-6\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"rgba(0, 0, 0, 0.3)\"\n strokeWidth={2}\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M4 6h16M4 12h16m-7 6h7\" />\n </svg>\n );\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","import { IndexedStructureDefinition, PropertyType } from '@medplum/core';\nimport { OperationOutcome, Resource } from '@medplum/fhirtypes';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { Button } from './Button';\nimport { FhirPathDisplay } from './FhirPathDisplay';\nimport { Loading } from './Loading';\nimport { useMedplum } from './MedplumProvider';\nimport { SearchClickEvent } from './SearchControl';\nimport { isCheckboxCell, killEvent } from './utils/dom';\nimport './SearchControl.css';\n\nexport interface SmartSearchField {\n readonly propertyType: PropertyType;\n readonly name: string;\n readonly fhirPath: string;\n}\n\nexport interface FhirPathTableProps {\n resourceType: string;\n query: string;\n fields: SmartSearchField[];\n checkboxesEnabled?: boolean;\n onClick?: (e: SearchClickEvent) => void;\n onAuxClick?: (e: SearchClickEvent) => void;\n onBulk?: (ids: string[]) => void;\n}\n\nexport interface SmartSearchResponse {\n data: {\n ResourceList: Resource[];\n };\n}\n\n/**\n * The FhirPathTable component represents the embeddable search table control.\n */\nexport function FhirPathTable(props: FhirPathTableProps): JSX.Element {\n const medplum = useMedplum();\n const [schema, setSchema] = useState<IndexedStructureDefinition | undefined>();\n const [outcome, setOutcome] = useState<OperationOutcome | undefined>();\n const { query, fields } = props;\n const [response, setResponse] = useState<SmartSearchResponse | undefined>();\n const [selected, setSelected] = useState<{ [id: string]: boolean }>({});\n\n const responseRef = useRef<SmartSearchResponse>();\n responseRef.current = response;\n\n const selectedRef = useRef<{ [id: string]: boolean }>({});\n selectedRef.current = selected;\n\n useEffect(() => {\n setOutcome(undefined);\n medplum.graphql(query).then(setResponse).catch(setOutcome);\n }, [medplum, query]);\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 = { ...selectedRef.current };\n if (checked) {\n newSelected[id] = true;\n } else {\n delete newSelected[id];\n }\n setSelected(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 resources = responseRef.current?.data?.ResourceList;\n if (checked && resources) {\n resources.forEach((resource) => {\n if (resource?.id) {\n newSelected[resource.id] = true;\n }\n });\n }\n setSelected(newSelected);\n }\n\n function isAllSelected(): boolean {\n const resources = responseRef.current?.data?.ResourceList;\n if (!resources || resources.length === 0) {\n return false;\n }\n for (const resource of resources) {\n if (resource?.id && !selectedRef.current[resource.id]) {\n return false;\n }\n }\n return true;\n }\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 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 useEffect(() => {\n medplum.requestSchema(props.resourceType).then((newSchema) => {\n // The schema could have the same object identity,\n // so need to use the spread operator to kick React re-render.\n setSchema({ ...newSchema });\n });\n }, [medplum, props.resourceType]);\n\n const typeSchema = schema?.types?.[props.resourceType];\n if (!typeSchema) {\n return <Loading />;\n }\n\n const checkboxColumn = props.checkboxesEnabled;\n\n return (\n <div className=\"medplum-search-control\" onContextMenu={(e) => killEvent(e)} data-testid=\"search-control\">\n <table>\n <thead>\n <tr>\n {checkboxColumn && (\n <th className=\"medplum-search-icon-cell\">\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}>{field.name}</th>\n ))}\n </tr>\n </thead>\n <tbody>\n {response?.data?.ResourceList?.map(\n (resource) =>\n resource && (\n <tr\n key={resource.id}\n data-testid=\"search-control-row\"\n onClick={(e) => handleRowClick(e, resource)}\n onAuxClick={(e) => handleRowClick(e, resource)}\n >\n {checkboxColumn && (\n <td className=\"medplum-search-icon-cell\">\n <input\n type=\"checkbox\"\n value=\"checked\"\n data-testid=\"row-checkbox\"\n aria-label={`Checkbox for ${resource.id}`}\n checked={!!selected[resource.id as string]}\n onChange={(e) => handleSingleCheckboxClick(e, resource.id as string)}\n />\n </td>\n )}\n {fields.map((field) => {\n return (\n <td key={field.name}>\n <FhirPathDisplay propertyType={field.propertyType} path={field.fhirPath} resource={resource} />\n </td>\n );\n })}\n </tr>\n )\n )}\n </tbody>\n </table>\n {response?.data?.ResourceList?.length === 0 && (\n <div data-testid=\"empty-search\" className=\"medplum-empty-search\">\n No results\n </div>\n )}\n {outcome && (\n <div data-testid=\"search-error\" className=\"medplum-empty-search\">\n <pre style={{ textAlign: 'left' }}>{JSON.stringify(outcome, undefined, 2)}</pre>\n </div>\n )}\n {props.onBulk && (\n <Button size=\"small\" onClick={() => (props.onBulk as (ids: string[]) => any)(Object.keys(selectedRef.current))}>\n Bulk...\n </Button>\n )}\n </div>\n );\n}\n\nexport const MemoizedFhirPathTable = React.memo(FhirPathTable);\n","/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n","import { formatHumanName, isUUID } from '@medplum/core';\nimport { Patient, ServiceRequest } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { Autocomplete } from './Autocomplete';\nimport { Avatar } from './Avatar';\nimport { useMedplum } from './MedplumProvider';\nimport { ResourceName } from './ResourceName';\n\nexport type HeaderSearchTypes = Patient | ServiceRequest;\n\nexport interface HeaderSearchInputProps {\n readonly name: string;\n readonly className?: string;\n readonly placeholder?: string;\n readonly onChange: (value: HeaderSearchTypes) => void;\n}\n\ninterface SearchGraphQLResponse {\n readonly data: {\n readonly Patients1: Patient[] | undefined;\n readonly Patients2: Patient[] | undefined;\n readonly ServiceRequestList: ServiceRequest[] | undefined;\n };\n}\n\nexport function HeaderSearchInput(props: HeaderSearchInputProps): JSX.Element {\n const medplum = useMedplum();\n return (\n <Autocomplete\n loadOptions={async (input: string, signal: AbortSignal): Promise<HeaderSearchTypes[]> => {\n return getResourcesFromResponse(\n (await medplum.graphql(buildGraphQLQuery(input), undefined, undefined, { signal })) as SearchGraphQLResponse,\n input\n );\n }}\n getId={(item: HeaderSearchTypes) => {\n return item.id as string;\n }}\n getIcon={(item: HeaderSearchTypes) => <Avatar value={item} />}\n getDisplay={(item: HeaderSearchTypes) => <ResourceName value={item} />}\n getHelpText={(item: HeaderSearchTypes) => {\n if (item.resourceType === 'Patient' && item.birthDate) {\n return 'DoB: ' + item.birthDate;\n }\n return (item as ServiceRequest).subject?.display;\n }}\n name={props.name}\n className={props.className}\n placeholder={props.placeholder}\n onChange={(items: HeaderSearchTypes[]) => props.onChange(items[0])}\n />\n );\n}\n\nfunction buildGraphQLQuery(input: string): string {\n const escaped = JSON.stringify(input);\n if (isUUID(input)) {\n return `{\n Patients1: PatientList(_id: ${escaped}, _count: 1) {\n resourceType\n id\n identifier {\n system\n value\n }\n name {\n given\n family\n }\n birthDate\n }\n ServiceRequestList(_id: ${escaped}, _count: 1) {\n resourceType\n id\n identifier {\n system\n value\n }\n subject {\n display\n }\n }\n }`.replace(/\\s+/g, ' ');\n }\n return `{\n Patients1: PatientList(name: ${escaped}, _count: 5) {\n resourceType\n id\n identifier {\n system\n value\n }\n name {\n given\n family\n }\n birthDate\n }\n Patients2: PatientList(identifier: ${escaped}, _count: 5) {\n resourceType\n id\n identifier {\n system\n value\n }\n name {\n given\n family\n }\n birthDate\n }\n ServiceRequestList(identifier: ${escaped}, _count: 5) {\n resourceType\n id\n identifier {\n system\n value\n }\n subject {\n display\n }\n }\n }`.replace(/\\s+/g, ' ');\n}\n\n/**\n * Returns a de-duped and sorted list of resources from the search response.\n * The search request is actually 3+ separate searches, which can include duplicates.\n * This function combines the results, de-dupes, and sorts by relevance.\n * @param response The response from a search query.\n * @param query The user entered search query.\n * @returns The resources to display in the autocomplete.\n */\nfunction getResourcesFromResponse(response: SearchGraphQLResponse, query: string): HeaderSearchTypes[] {\n const resources = [];\n if (response.data.Patients1) {\n resources.push(...response.data.Patients1);\n }\n if (response.data.Patients2) {\n resources.push(...response.data.Patients2);\n }\n if (response.data.ServiceRequestList) {\n resources.push(...response.data.ServiceRequestList);\n }\n return sortByRelevance(dedupeResources(resources), query).slice(0, 5);\n}\n\n/**\n * Removes duplicate resources from an array by ID.\n * @param resources The array of resources with possible duplicates.\n * @returns The array of resources with no duplicates.\n */\nfunction dedupeResources(resources: HeaderSearchTypes[]): HeaderSearchTypes[] {\n const ids = new Set<string>();\n const result = [];\n\n for (const resource of resources) {\n if (!ids.has(resource.id as string)) {\n ids.add(resource.id as string);\n result.push(resource);\n }\n }\n\n return result;\n}\n\n/**\n * Sorts an array of resources by relevance.\n * @param resources The candidate resources.\n * @param query The user entered search string.\n * @returns The sorted array of resources.\n */\nfunction sortByRelevance(resources: HeaderSearchTypes[], query: string): HeaderSearchTypes[] {\n return resources.sort((a: HeaderSearchTypes, b: HeaderSearchTypes) => {\n return getResourceScore(b, query) - getResourceScore(a, query);\n });\n}\n\n/**\n * Calculates a relevance score of a candidate resource.\n * Higher scores are better.\n * @param resource The candidate resource.\n * @param query The user entered search string.\n * @returns The relevance score of the candidate resource.\n */\nfunction getResourceScore(resource: HeaderSearchTypes, query: string): number {\n let bestScore = 0;\n\n if (resource.identifier) {\n for (const identifier of resource.identifier) {\n bestScore = Math.max(bestScore, getStringScore(identifier.value, query));\n }\n }\n\n if (resource.resourceType === 'Patient' && resource.name) {\n for (const name of resource.name) {\n bestScore = Math.max(bestScore, getStringScore(formatHumanName(name), query));\n }\n }\n\n return bestScore;\n}\n\n/**\n * Calculates a relevance score of a candidate display string.\n * Higher scores are better.\n * @param str The candidate display string.\n * @param query The user entered search string.\n * @returns The relevance score of the candidate string.\n */\nfunction getStringScore(str: string | undefined, query: string): number {\n if (!str) {\n return 0;\n }\n const index = str.toLowerCase().indexOf(query.toLowerCase());\n if (index < 0) {\n return 0;\n }\n return 100 - index;\n}\n","import React from 'react';\n\nexport interface LogoProps {\n size: number;\n fill?: string;\n}\n\nexport function Logo(props: LogoProps): JSX.Element {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 491 491\" style={{ width: props.size, height: props.size }}>\n <title>Medplum Logo</title>\n <path fill={props.fill || '#ad7136'} d=\"M282 67c6-16 16-29 29-40L289 0c-22 17-37 41-43 68l17 23 19-24z\" />\n <path\n fill={props.fill || '#654b87'}\n d=\"M311 63c-17 0-33 4-48 11-16-7-32-11-49-11-87 0-158 96-158 214s71 214 158 214c17 0 33-4 49-11 15 7 31 11 48 11 87 0 158-96 158-214S398 63 311 63z\"\n />\n <path\n fill={props.fill || '#463068'}\n d=\"M231 489l-17 2c-87 0-158-96-158-214S127 63 214 63l17 1c-39 12-70 102-70 213s31 201 70 212z\"\n />\n <path\n fill={props.fill || '#70d65b'}\n d=\"M207 220a176 176 0 01-177 43A176 176 0 01251 43l1 5c17 59 2 125-45 172z\"\n />\n <path fill={props.fill || '#58b741'} d=\"M252 48A421 421 0 0057 270l-27-7A176 176 0 01251 43l1 5z\" />\n </svg>\n );\n}\n","import { createReference, getReferenceString, ProfileResource } from '@medplum/core';\nimport { Attachment, Patient, Reference, Resource } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { ResourceTimeline } from './ResourceTimeline';\n\nexport interface PatientTimelineProps {\n patient: Patient | Reference<Patient>;\n}\n\nconst searches = [\n '$/_history',\n 'Communication?subject=$',\n 'Device?patient=$',\n 'DeviceRequest?patient=$',\n 'DiagnosticReport?subject=$',\n 'Media?subject=$',\n 'ServiceRequest?subject=$',\n];\n\nexport function PatientTimeline(props: PatientTimelineProps): JSX.Element {\n return (\n <ResourceTimeline\n value={props.patient}\n buildSearchRequests={(resource: Resource) => ({\n resourceType: 'Bundle',\n type: 'batch',\n entry: searches.map((search) => ({\n request: {\n method: 'GET',\n url: search.replaceAll('$', getReferenceString(resource)),\n },\n })),\n })}\n createCommunication={(resource: Patient, sender: ProfileResource, text: string) => ({\n resourceType: 'Communication',\n subject: createReference(resource),\n sender: createReference(sender),\n sent: new Date().toISOString(),\n payload: [{ contentString: text }],\n })}\n createMedia={(resource: Patient, operator: ProfileResource, content: Attachment) => ({\n resourceType: 'Media',\n subject: createReference(resource),\n operator: createReference(operator),\n issued: new Date().toISOString(),\n content,\n })}\n />\n );\n}\n","import { getReferenceString } from '@medplum/core';\nimport { PlanDefinition, PlanDefinitionAction, Reference } from '@medplum/fhirtypes';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { Button } from './Button';\nimport { Form } from './Form';\nimport { FormSection } from './FormSection';\nimport { Input } from './Input';\nimport { ResourceInput } from './ResourceInput';\nimport { Select } from './Select';\nimport { useResource } from './useResource';\n\nexport interface PlanDefinitionBuilderProps {\n value: PlanDefinition | Reference<PlanDefinition>;\n onSubmit: (result: PlanDefinition) => void;\n}\n\nexport function PlanDefinitionBuilder(props: PlanDefinitionBuilderProps): JSX.Element | null {\n const defaultValue = useResource(props.value);\n const [value, setValue] = useState<PlanDefinition>();\n const valueRef = useRef<PlanDefinition>();\n valueRef.current = value;\n\n useEffect(() => {\n setValue(ensurePlanDefinitionKeys(defaultValue ?? { resourceType: 'PlanDefinition' }));\n }, [defaultValue]);\n\n if (!value) {\n return null;\n }\n\n function changeProperty(property: string, newValue: any): void {\n setValue({\n ...valueRef.current,\n [property]: newValue,\n } as PlanDefinition);\n }\n\n return (\n <div className=\"medplum-questionnaire-builder\">\n <Form testid=\"questionnaire-form\" onSubmit={() => props.onSubmit(value)}>\n <FormSection\n title=\"Plan Title\"\n description=\"The display name of the 'Plan', something that can be ordered.\"\n htmlFor=\"title\"\n >\n <Input defaultValue={value.title} onChange={(newValue) => changeProperty('title', newValue)} />\n </FormSection>\n <ActionArrayBuilder actions={value.action || []} onChange={(x) => changeProperty('action', x)} />\n <Button type=\"submit\" size=\"large\">\n Save\n </Button>\n </Form>\n </div>\n );\n}\n\ninterface ActionArrayBuilderProps {\n actions: PlanDefinitionAction[];\n onChange: (actions: PlanDefinitionAction[]) => void;\n}\n\nfunction ActionArrayBuilder(props: ActionArrayBuilderProps): JSX.Element {\n const actionsRef = useRef<PlanDefinitionAction[]>();\n actionsRef.current = props.actions;\n\n function changeAction(changedAction: PlanDefinitionAction): void {\n props.onChange(\n (actionsRef.current as PlanDefinition[]).map((i) => (i.id === changedAction.id ? changedAction : i))\n );\n }\n\n function addAction(addedAction: PlanDefinitionAction): void {\n props.onChange([...(actionsRef.current as PlanDefinition[]), addedAction]);\n }\n\n function removeAction(removedAction: PlanDefinitionAction): void {\n props.onChange((actionsRef.current as PlanDefinition[]).filter((i) => i !== removedAction));\n }\n\n return (\n <div className=\"section\">\n {props.actions.map((i) => (\n <div key={i.id}>\n <ActionBuilder action={i} onChange={changeAction} onRemove={() => removeAction(i)} />\n </div>\n ))}\n <div className=\"bottom-actions\">\n <a\n href=\"#\"\n onClick={(e) => {\n e.preventDefault();\n addAction({ id: generateId() });\n }}\n >\n Add action\n </a>\n </div>\n </div>\n );\n}\n\ninterface ActionBuilderProps {\n action: PlanDefinitionAction;\n onChange: (action: PlanDefinitionAction) => void;\n onRemove: () => void;\n}\n\nfunction ActionBuilder(props: ActionBuilderProps): JSX.Element {\n const { action } = props;\n const [actionType, setActionType] = useState<string | undefined>(getInitialActionType(action));\n\n const actionRef = useRef<PlanDefinitionAction>();\n actionRef.current = props.action;\n\n function changeProperty(property: string, value: any): void {\n props.onChange({\n ...actionRef.current,\n [property]: value,\n } as PlanDefinitionAction);\n }\n\n return (\n <div className=\"section\">\n <FormSection\n title=\"Action Title\"\n description=\"The name of the action, an operational task to be completed.\"\n htmlFor={`actionTitle-${action.id}`}\n >\n <Input\n name={`actionTitle-${action.id}`}\n defaultValue={action.title}\n onChange={(newValue) => changeProperty('title', newValue)}\n />\n </FormSection>\n <FormSection\n title=\"Action Type\"\n description=\"The type of the action to be performed.\"\n htmlFor={`actionType-${action.id}`}\n >\n <Select name={`actionType-${action.id}`} defaultValue={actionType} onChange={setActionType}>\n <option></option>\n <option value=\"appointment\">Appointment</option>\n <option value=\"documentation\">Documentation</option>\n <option value=\"lab\">Lab</option>\n <option value=\"questionnaire\">Questionnaire</option>\n <option value=\"shipping\">Shipping</option>\n <option value=\"task\">Task</option>\n </Select>\n </FormSection>\n {action.action && action.action.length > 0 && (\n <ActionArrayBuilder actions={action.action} onChange={(x) => changeProperty('action', x)} />\n )}\n {(() => {\n switch (actionType) {\n case 'appointment':\n return <div>Appointment details</div>;\n case 'documentation':\n return <div>Documentation details</div>;\n case 'lab':\n return <LabActionBuilder action={action} onChange={props.onChange} />;\n case 'questionnaire':\n return <QuestionnaireActionBuilder action={action} onChange={props.onChange} />;\n case 'shipping':\n return <div>Shipping details</div>;\n case 'task':\n return <div>Task details</div>;\n default:\n return null;\n }\n })()}\n <div className=\"bottom-actions\">\n <a\n href=\"#\"\n onClick={(e) => {\n e.preventDefault();\n props.onRemove();\n }}\n >\n Remove\n </a>\n </div>\n </div>\n );\n}\n\ninterface LabActionBuilderProps {\n action: PlanDefinitionAction;\n onChange: (action: PlanDefinitionAction) => void;\n}\n\nfunction LabActionBuilder(props: LabActionBuilderProps): JSX.Element {\n return (\n <FormSection title=\"Lab Details\" description=\"Choose observations definitions\" htmlFor={props.action.id}>\n <a href=\"#\" onClick={() => props.onChange(props.action)}>\n Add\n </a>\n </FormSection>\n );\n}\n\ninterface QuestionnaireActionBuilderProps {\n action: PlanDefinitionAction;\n onChange: (action: PlanDefinitionAction) => void;\n}\n\nfunction QuestionnaireActionBuilder(props: QuestionnaireActionBuilderProps): JSX.Element {\n const { id, definitionCanonical } = props.action;\n const questionnaireRef = definitionCanonical?.startsWith('Questionnaire/')\n ? { reference: definitionCanonical }\n : undefined;\n return (\n <FormSection title=\"Questionnaire\" description=\"Choose questionnaire\" htmlFor={id}>\n <ResourceInput\n name={id as string}\n resourceType=\"Questionnaire\"\n defaultValue={questionnaireRef}\n onChange={(newValue) => {\n if (newValue) {\n props.onChange({ ...props.action, definitionCanonical: getReferenceString(newValue) });\n } else {\n props.onChange({ ...props.action, definitionCanonical: undefined });\n }\n }}\n />\n </FormSection>\n );\n}\n\nfunction getInitialActionType(action: PlanDefinitionAction): string | undefined {\n if (action.definitionCanonical?.startsWith('Questionnaire/')) {\n return 'questionnaire';\n }\n\n return undefined;\n}\n\nlet nextId = 1;\n\n/**\n * Generates a unique ID.\n * React needs unique IDs for components for rendering performance.\n * All of the important components in the questionnaire builder have id properties for this:\n * Questionnaire, QuestionnaireItem, and QuestionnaireItemAnswerOption.\n * @return A unique key.\n */\nfunction generateId(existing?: string): string {\n if (existing) {\n if (existing.startsWith('id-')) {\n const existingNum = parseInt(existing.substring(3));\n if (!isNaN(existingNum)) {\n nextId = Math.max(nextId, existingNum + 1);\n }\n }\n return existing;\n }\n return 'id-' + nextId++;\n}\n\nfunction ensurePlanDefinitionKeys(planDefinition: PlanDefinition): PlanDefinition {\n return {\n ...planDefinition,\n action: ensurePlanDefinitionActionKeys(planDefinition.action),\n } as PlanDefinition;\n}\n\nfunction ensurePlanDefinitionActionKeys(\n actions: PlanDefinitionAction[] | undefined\n): PlanDefinitionAction[] | undefined {\n if (!actions) {\n return undefined;\n }\n return actions.map((action) => ({\n ...action,\n id: generateId(action.id),\n action: ensurePlanDefinitionActionKeys(action.action),\n }));\n}\n","import { PropertyType } from '@medplum/core';\nimport { Questionnaire, QuestionnaireItem, QuestionnaireItemInitial } from '@medplum/fhirtypes';\n\nexport enum QuestionnaireItemType {\n group = 'group',\n display = 'display',\n question = 'question',\n boolean = 'boolean',\n decimal = 'decimal',\n integer = 'integer',\n date = 'date',\n dateTime = 'dateTime',\n time = 'time',\n string = 'string',\n text = 'text',\n url = 'url',\n choice = 'choice',\n openChoice = 'open-choice',\n attachment = 'attachment',\n reference = 'reference',\n quantity = 'quantity',\n}\n\n/**\n * Adds initial values to a questionnaire resource from key value pairs.\n * The values map uses \"linkId\" as key.\n * The value depends on the questionnaire item type.\n * @param questionnaire The original questionnaire.\n * @param values Key value pairs for initial values.\n * @returns Rewritten questionnaire with initial values.\n */\nexport function addQuestionnaireInitialValues(\n questionnaire: Questionnaire,\n values: Record<string, string>\n): Questionnaire {\n return {\n ...questionnaire,\n item: addInitialValuesToItemArray(questionnaire.item, values),\n };\n}\n\nfunction addInitialValuesToItemArray(\n items: QuestionnaireItem[] | undefined,\n values: any\n): QuestionnaireItem[] | undefined {\n if (!items) {\n return undefined;\n }\n return items.map((item) => addInitialValueToItem(item, values));\n}\n\nfunction addInitialValueToItem(item: QuestionnaireItem, values: Record<string, string>): QuestionnaireItem {\n const { linkId, type } = item;\n if (!linkId || !type) {\n return item;\n }\n\n if (type === 'group') {\n return {\n ...item,\n item: addInitialValuesToItemArray(item.item, values),\n };\n }\n\n const suppliedValue = values[linkId];\n if (!suppliedValue) {\n return item;\n }\n\n let initialValue: QuestionnaireItemInitial | undefined = undefined;\n switch (type) {\n case PropertyType.boolean:\n initialValue = { valueBoolean: suppliedValue === 'true' };\n break;\n case PropertyType.code:\n case PropertyType.Coding:\n initialValue = { valueCoding: { code: suppliedValue } };\n break;\n case PropertyType.date:\n initialValue = { valueDate: suppliedValue };\n break;\n case PropertyType.dateTime:\n case PropertyType.instant:\n initialValue = { valueDateTime: suppliedValue };\n break;\n case PropertyType.decimal:\n initialValue = { valueDecimal: parseFloat(suppliedValue) };\n break;\n case PropertyType.integer:\n case PropertyType.positiveInt:\n case PropertyType.unsignedInt:\n initialValue = { valueInteger: parseInt(suppliedValue) };\n break;\n case PropertyType.SystemString:\n case PropertyType.string:\n case PropertyType.markdown:\n initialValue = { valueString: suppliedValue };\n break;\n case PropertyType.time:\n initialValue = { valueTime: suppliedValue };\n break;\n case PropertyType.uri:\n case PropertyType.url:\n initialValue = { valueUri: suppliedValue };\n break;\n case PropertyType.canonical:\n case PropertyType.Reference:\n initialValue = { valueReference: { reference: suppliedValue } };\n break;\n }\n\n if (!initialValue) {\n return item;\n }\n\n return {\n ...item,\n initial: [initialValue],\n };\n}\n\nexport function isChoiceQuestion(item: QuestionnaireItem): boolean {\n return item.type === 'choice' || item.type === 'open-choice';\n}\n","import {\n capitalize,\n createReference,\n getReferenceString,\n getTypedPropertyValue,\n globalSchema,\n IndexedStructureDefinition,\n ProfileResource,\n PropertyType,\n stringify,\n TypedValue,\n} from '@medplum/core';\nimport {\n Questionnaire,\n QuestionnaireItem,\n QuestionnaireItemAnswerOption,\n QuestionnaireItemInitial,\n QuestionnaireResponse,\n QuestionnaireResponseItem,\n QuestionnaireResponseItemAnswer,\n Reference,\n} from '@medplum/fhirtypes';\nimport React, { useEffect, useState } from 'react';\nimport { AttachmentInput } from './AttachmentInput';\nimport { Button } from './Button';\nimport { Checkbox } from './Checkbox';\nimport { CheckboxFormSection } from './CheckboxFormSection';\nimport { DateTimeInput } from './DateTimeInput';\nimport { Form } from './Form';\nimport { FormSection } from './FormSection';\nimport { Input } from './Input';\nimport { useMedplum } from './MedplumProvider';\nimport { QuantityInput } from './QuantityInput';\nimport { QuestionnaireItemType } from './QuestionnaireUtils';\nimport { ReferenceInput } from './ReferenceInput';\nimport { ResourcePropertyDisplay } from './ResourcePropertyDisplay';\nimport { TextArea } from './TextArea';\nimport { useResource } from './useResource';\nimport './QuestionnaireForm.css';\n\nexport interface QuestionnaireFormProps {\n questionnaire: Questionnaire | Reference<Questionnaire>;\n subject?: Reference;\n onSubmit: (response: QuestionnaireResponse) => void;\n}\n\nexport function QuestionnaireForm(props: QuestionnaireFormProps): JSX.Element | null {\n const medplum = useMedplum();\n const source = medplum.getProfile();\n const [schema, setSchema] = useState<IndexedStructureDefinition | undefined>();\n const questionnaire = useResource(props.questionnaire);\n const [response, setResponse] = useState<QuestionnaireResponse | undefined>();\n\n useEffect(() => {\n medplum.requestSchema('Questionnaire').then(setSchema);\n }, [medplum]);\n\n useEffect(() => {\n setResponse(questionnaire ? buildInitialResponse(questionnaire) : undefined);\n }, [questionnaire]);\n\n function setItems(newResponseItems: QuestionnaireResponseItem[]): void {\n setResponse({\n resourceType: 'QuestionnaireResponse',\n item: newResponseItems,\n });\n }\n\n if (!schema || !questionnaire) {\n return null;\n }\n\n return (\n <Form\n testid=\"questionnaire-form\"\n onSubmit={() => {\n if (props.onSubmit && response) {\n props.onSubmit({\n ...response,\n questionnaire: getReferenceString(questionnaire),\n subject: props.subject,\n source: createReference(source as ProfileResource),\n authored: new Date().toISOString(),\n });\n }\n }}\n >\n {questionnaire.title && <h1>{questionnaire.title}</h1>}\n {questionnaire.item && <QuestionnaireFormItemArray items={questionnaire.item} onChange={setItems} />}\n <Button type=\"submit\" size=\"large\">\n OK\n </Button>\n </Form>\n );\n}\n\ninterface QuestionnaireFormItemArrayProps {\n items: QuestionnaireItem[];\n onChange: (newResponseItems: QuestionnaireResponseItem[]) => void;\n}\n\nfunction QuestionnaireFormItemArray(props: QuestionnaireFormItemArrayProps): JSX.Element {\n const [responseItems, setResponseItems] = useState<QuestionnaireResponseItem[]>(\n buildInitialResponseItems(props.items)\n );\n\n function setResponseItem(index: number, newResponseItem: QuestionnaireResponseItem): void {\n const newResponseItems = responseItems.slice();\n newResponseItems[index] = newResponseItem;\n setResponseItems(newResponseItems);\n props.onChange(newResponseItems);\n }\n\n return (\n <>\n {props.items.map((item, index) => {\n if (item.type === QuestionnaireItemType.display) {\n return <p key={item.linkId}>{item.text}</p>;\n }\n if (item.type === QuestionnaireItemType.group) {\n return (\n <QuestionnaireFormItem\n key={item.linkId}\n item={item}\n onChange={(newResponseItem) => setResponseItem(index, newResponseItem)}\n />\n );\n }\n if (item.type === QuestionnaireItemType.boolean) {\n const initial = item.initial && item.initial.length > 0 ? item.initial[0] : undefined;\n return (\n <CheckboxFormSection key={item.linkId} title={item.text} htmlFor={item.linkId}>\n <Checkbox\n name={item.linkId}\n defaultValue={initial?.valueBoolean}\n onChange={(newValue) =>\n setResponseItem(index, {\n linkId: item.linkId,\n answer: [{ valueBoolean: newValue }],\n })\n }\n />\n </CheckboxFormSection>\n );\n }\n return (\n <FormSection key={item.linkId} htmlFor={item.linkId} title={item.text || ''}>\n <QuestionnaireFormItem\n item={item}\n onChange={(newResponseItem) => setResponseItem(index, newResponseItem)}\n />\n </FormSection>\n );\n })}\n </>\n );\n}\n\nexport interface QuestionnaireFormItemProps {\n item: QuestionnaireItem;\n onChange: (newResponseItem: QuestionnaireResponseItem) => void;\n}\n\nexport function QuestionnaireFormItem(props: QuestionnaireFormItemProps): JSX.Element | null {\n const item = props.item;\n\n const type = item.type as QuestionnaireItemType;\n if (!type) {\n return null;\n }\n\n const name = item.linkId;\n if (!name) {\n return null;\n }\n\n const initial = item.initial && item.initial.length > 0 ? item.initial[0] : undefined;\n\n function onChangeItem(newResponseItems: QuestionnaireResponseItem[]): void {\n props.onChange({\n linkId: item.linkId,\n item: newResponseItems,\n });\n }\n\n function onChangeAnswer(newResponseAnswer: QuestionnaireResponseItemAnswer): void {\n props.onChange({\n linkId: item.linkId,\n answer: [newResponseAnswer],\n });\n }\n\n switch (type) {\n case QuestionnaireItemType.group:\n return (\n <div>\n <h3>{item.text}</h3>\n {item.item && <QuestionnaireFormItemArray items={item.item} onChange={onChangeItem} />}\n </div>\n );\n case QuestionnaireItemType.boolean:\n return (\n <Checkbox\n name={name}\n defaultValue={initial?.valueBoolean}\n onChange={(newValue) => onChangeAnswer({ valueBoolean: newValue })}\n />\n );\n case QuestionnaireItemType.decimal:\n return (\n <Input\n type=\"number\"\n step=\"any\"\n name={name}\n defaultValue={initial?.valueDecimal}\n onChange={(newValue) => onChangeAnswer({ valueDecimal: parseFloat(newValue) })}\n />\n );\n case QuestionnaireItemType.integer:\n return (\n <Input\n type=\"number\"\n step={1}\n name={name}\n defaultValue={initial?.valueInteger}\n onChange={(newValue) => onChangeAnswer({ valueInteger: parseInt(newValue) })}\n />\n );\n case QuestionnaireItemType.date:\n return (\n <Input\n type=\"date\"\n name={name}\n defaultValue={initial?.valueDate}\n onChange={(newValue) => onChangeAnswer({ valueDate: newValue })}\n />\n );\n case QuestionnaireItemType.dateTime:\n return (\n <DateTimeInput\n type=\"datetime-local\"\n name={name}\n defaultValue={initial?.valueDateTime}\n onChange={(newValue) => onChangeAnswer({ valueDateTime: newValue })}\n />\n );\n case QuestionnaireItemType.time:\n return (\n <Input\n type=\"time\"\n name={name}\n defaultValue={initial?.valueTime}\n onChange={(newValue) => onChangeAnswer({ valueTime: newValue })}\n />\n );\n case QuestionnaireItemType.string:\n return (\n <Input\n type=\"text\"\n name={name}\n defaultValue={initial?.valueString}\n onChange={(newValue) => onChangeAnswer({ valueString: newValue })}\n />\n );\n case QuestionnaireItemType.text:\n return (\n <TextArea\n name={name}\n defaultValue={initial?.valueString}\n onChange={(newValue) => onChangeAnswer({ valueString: newValue })}\n />\n );\n case QuestionnaireItemType.url:\n return (\n <Input\n type=\"url\"\n name={name}\n defaultValue={initial?.valueUri}\n onChange={(newValue) => onChangeAnswer({ valueUri: newValue })}\n />\n );\n case QuestionnaireItemType.choice:\n case QuestionnaireItemType.openChoice:\n return (\n <div>\n {item.answerOption &&\n item.answerOption.map((option: QuestionnaireItemAnswerOption, index: number) => {\n const valueElementDefinition = globalSchema.types['QuestionnaireItemAnswerOption'].properties['value[x]'];\n const optionValue = getTypedPropertyValue(\n { type: 'QuestionnaireItemAnswerOption', value: option },\n 'value'\n ) as TypedValue;\n const initialValue = getTypedPropertyValue(\n { type: 'QuestionnaireItemInitial', value: initial },\n 'value'\n ) as TypedValue | undefined;\n const propertyName = 'value' + capitalize(optionValue.type);\n const optionName = `${name}-option-${index}`;\n return (\n <div key={optionName} className=\"medplum-questionnaire-option-row\">\n <div className=\"medplum-questionnaire-option-checkbox\">\n <input\n type=\"radio\"\n id={optionName}\n name={name}\n value={optionValue.value}\n defaultChecked={initialValue && stringify(optionValue) === stringify(initialValue)}\n onChange={() => onChangeAnswer({ [propertyName]: optionValue.value })}\n />\n </div>\n <div>\n <label htmlFor={optionName}>\n <ResourcePropertyDisplay\n property={valueElementDefinition}\n propertyType={optionValue.type as PropertyType}\n value={optionValue.value}\n />\n </label>\n </div>\n </div>\n );\n })}\n </div>\n );\n case QuestionnaireItemType.attachment:\n return (\n <AttachmentInput\n name={name}\n defaultValue={initial?.valueAttachment}\n onChange={(newValue) => onChangeAnswer({ valueAttachment: newValue })}\n />\n );\n case QuestionnaireItemType.reference:\n return (\n <ReferenceInput\n name={name}\n defaultValue={initial?.valueReference}\n onChange={(newValue) => onChangeAnswer({ valueReference: newValue })}\n />\n );\n case QuestionnaireItemType.quantity:\n return (\n <QuantityInput\n name={name}\n defaultValue={initial?.valueQuantity}\n onChange={(newValue) => onChangeAnswer({ valueQuantity: newValue })}\n />\n );\n }\n\n return null;\n}\n\nfunction buildInitialResponse(questionnaire: Questionnaire): QuestionnaireResponse {\n const response: QuestionnaireResponse = {\n resourceType: 'QuestionnaireResponse',\n questionnaire: getReferenceString(questionnaire),\n item: buildInitialResponseItems(questionnaire.item),\n };\n\n return response;\n}\n\nfunction buildInitialResponseItems(items: QuestionnaireItem[] | undefined): QuestionnaireResponseItem[] {\n return items?.map(buildInitialResponseItem) ?? [];\n}\n\nfunction buildInitialResponseItem(item: QuestionnaireItem): QuestionnaireResponseItem {\n return {\n linkId: item.linkId,\n item: buildInitialResponseItems(item.item),\n answer: item.initial?.map(buildInitialResponseAnswer) ?? [],\n };\n}\n\nfunction buildInitialResponseAnswer(answer: QuestionnaireItemInitial): QuestionnaireResponseItemAnswer {\n // This works because QuestionnaireItemInitial and QuestionnaireResponseItemAnswer\n // have the same properties.\n return { ...answer };\n}\n","import { globalSchema, IndexedStructureDefinition } from '@medplum/core';\nimport { Questionnaire, QuestionnaireItem, QuestionnaireItemAnswerOption, Reference } from '@medplum/fhirtypes';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { Button } from './Button';\nimport { Form } from './Form';\nimport { Input } from './Input';\nimport { useMedplum } from './MedplumProvider';\nimport { QuestionnaireFormItem } from './QuestionnaireForm';\nimport { isChoiceQuestion, QuestionnaireItemType } from './QuestionnaireUtils';\nimport { getValueAndType } from './ResourcePropertyDisplay';\nimport { ResourcePropertyInput } from './ResourcePropertyInput';\nimport { Select } from './Select';\nimport { TextArea } from './TextArea';\nimport { useResource } from './useResource';\nimport { killEvent } from './utils/dom';\nimport './QuestionnaireBuilder.css';\n\nexport interface QuestionnaireBuilderProps {\n questionnaire: Questionnaire | Reference<Questionnaire>;\n onSubmit: (result: Questionnaire) => void;\n}\n\nexport function QuestionnaireBuilder(props: QuestionnaireBuilderProps): JSX.Element | null {\n const medplum = useMedplum();\n const defaultValue = useResource(props.questionnaire);\n const [schema, setSchema] = useState<IndexedStructureDefinition | undefined>();\n const [value, setValue] = useState<Questionnaire>();\n const [selectedKey, setSelectedKey] = useState<string>();\n const [hoverKey, setHoverKey] = useState<string>();\n\n function handleDocumentMouseOver(): void {\n setHoverKey(undefined);\n }\n\n function handleDocumentClick(): void {\n setSelectedKey(undefined);\n }\n\n useEffect(() => {\n medplum.requestSchema('Questionnaire').then(setSchema);\n }, [medplum]);\n\n useEffect(() => {\n setValue(ensureQuestionnaireKeys(defaultValue ?? { resourceType: 'Questionnaire' }));\n document.addEventListener('mouseover', handleDocumentMouseOver);\n document.addEventListener('click', handleDocumentClick);\n return () => {\n document.removeEventListener('mouseover', handleDocumentMouseOver);\n document.removeEventListener('click', handleDocumentClick);\n };\n }, [defaultValue]);\n\n if (!schema || !value) {\n return null;\n }\n\n return (\n <div className=\"medplum-questionnaire-builder\">\n <Form testid=\"questionnaire-form\" onSubmit={() => props.onSubmit(value)}>\n <ItemBuilder\n item={value}\n selectedKey={selectedKey}\n setSelectedKey={setSelectedKey}\n hoverKey={hoverKey}\n setHoverKey={setHoverKey}\n onChange={setValue}\n />\n <Button type=\"submit\" size=\"large\">\n Save\n </Button>\n </Form>\n </div>\n );\n}\n\ninterface ItemBuilderProps<T extends Questionnaire | QuestionnaireItem> {\n item: T;\n selectedKey: string | undefined;\n setSelectedKey: (key: string | undefined) => void;\n hoverKey: string | undefined;\n setHoverKey: (key: string | undefined) => void;\n onChange: (item: T) => void;\n onRemove?: () => void;\n}\n\nfunction ItemBuilder<T extends Questionnaire | QuestionnaireItem>(props: ItemBuilderProps<T>): JSX.Element {\n const resource = props.item as Questionnaire;\n const item = props.item as QuestionnaireItem;\n const isResource = 'resourceType' in props.item;\n const isContainer = isResource || item.type === QuestionnaireItemType.group;\n const linkId = item.linkId ?? '[untitled]';\n const editing = props.selectedKey === props.item.id;\n const hovering = props.hoverKey === props.item.id;\n\n const itemRef = useRef<T>();\n itemRef.current = props.item;\n\n function onClick(e: React.SyntheticEvent): void {\n killEvent(e);\n props.setSelectedKey(props.item.id);\n }\n\n function onHover(e: React.SyntheticEvent): void {\n killEvent(e);\n props.setHoverKey(props.item.id);\n }\n\n function changeItem(changedItem: QuestionnaireItem): void {\n const curr = itemRef.current as T;\n props.onChange({\n ...curr,\n item: curr.item?.map((i) => (i.id === changedItem.id ? changedItem : i)),\n } as T);\n }\n\n function addItem(addedItem: QuestionnaireItem): void {\n props.onChange({\n ...props.item,\n item: [...(props.item?.item ?? []), addedItem],\n });\n }\n\n function removeItem(removedItem: QuestionnaireItem): void {\n props.onChange({\n ...props.item,\n item: props.item?.item?.filter((i) => i !== removedItem),\n });\n }\n\n function changeProperty(property: string, value: any): void {\n props.onChange({\n ...itemRef.current,\n [property]: value,\n } as T);\n }\n\n const className = editing ? 'section editing' : hovering ? 'section hovering' : 'section';\n return (\n <div data-testid={item.linkId} className={className} onClick={onClick} onMouseOver={onHover}>\n {editing ? (\n <>\n {isResource && (\n <div>\n <Input defaultValue={resource.title} onChange={(newValue) => changeProperty('title', newValue)} />\n </div>\n )}\n {!isContainer && (\n <div>\n <Select defaultValue={item.type} onChange={(newValue) => changeProperty('type', newValue)}>\n <option value=\"display\">Display</option>\n <optgroup label=\"Question\">\n <option value=\"boolean\">Boolean</option>\n <option value=\"decimal\">Decimal</option>\n <option value=\"integer\">Integer</option>\n <option value=\"date\">Date</option>\n <option value=\"dateTime\">Date/Time</option>\n <option value=\"time\">Time</option>\n <option value=\"string\">String</option>\n <option value=\"text\">Text</option>\n <option value=\"url\">URL</option>\n <option value=\"choice\">Choice</option>\n <option value=\"open-choice\">Open Choice</option>\n <option value=\"attachment\">Attachment</option>\n <option value=\"reference\">Reference</option>\n <option value=\"quantity\">Quantity</option>\n </optgroup>\n </Select>\n </div>\n )}\n {!isResource && (\n <TextArea\n style={{ width: '95%', height: '100px', minHeight: '100px', margin: '8px 4px 4px 4px' }}\n defaultValue={item.text}\n onChange={(newValue) => changeProperty('text', newValue)}\n />\n )}\n {isChoiceQuestion(item) && (\n <AnswerBuilder\n options={item.answerOption}\n onChange={(newOptions) => changeProperty('answerOption', newOptions)}\n />\n )}\n </>\n ) : (\n <>\n {resource.title && <h1>{resource.title}</h1>}\n {item.text && <p>{item.text}</p>}\n {!isContainer && <QuestionnaireFormItem item={item} onChange={() => undefined} />}\n </>\n )}\n {item.item &&\n item.item.map((i) => (\n <div key={i.id}>\n <ItemBuilder\n item={i}\n selectedKey={props.selectedKey}\n setSelectedKey={props.setSelectedKey}\n hoverKey={props.hoverKey}\n setHoverKey={props.setHoverKey}\n onChange={changeItem}\n onRemove={() => removeItem(i)}\n />\n </div>\n ))}\n {!isContainer && (\n <div className=\"top-actions\">\n {editing ? (\n <Input defaultValue={item.linkId} onChange={(newValue) => changeProperty('linkId', newValue)} size={4} />\n ) : (\n <div>{linkId}</div>\n )}\n </div>\n )}\n <div className=\"bottom-actions\">\n {isContainer && (\n <>\n <a\n href=\"#\"\n onClick={(e) => {\n e.preventDefault();\n addItem({\n id: generateId(),\n linkId: generateLinkId('q'),\n type: 'string',\n text: 'Question',\n } as QuestionnaireItem);\n }}\n >\n Add item\n </a>\n <a\n href=\"#\"\n onClick={(e) => {\n e.preventDefault();\n addItem({\n id: generateId(),\n linkId: generateLinkId('g'),\n type: 'group',\n text: 'Group',\n } as QuestionnaireItem);\n }}\n >\n Add group\n </a>\n </>\n )}\n {!isResource && (\n <a\n href=\"#\"\n onClick={(e) => {\n e.preventDefault();\n if (props.onRemove) {\n props.onRemove();\n }\n }}\n >\n Remove\n </a>\n )}\n </div>\n </div>\n );\n}\n\ninterface AnswerBuilderProps {\n options?: QuestionnaireItemAnswerOption[];\n onChange: (newOptions: QuestionnaireItemAnswerOption[]) => void;\n}\n\nfunction AnswerBuilder(props: AnswerBuilderProps): JSX.Element {\n const property = globalSchema.types['QuestionnaireItemAnswerOption'].properties['value[x]'];\n const options = props.options ?? [];\n return (\n <div>\n {options.map((option: QuestionnaireItemAnswerOption) => {\n const [propertyValue, propertyType] = getValueAndType(\n { type: 'QuestionnaireItemAnswerOption', value: option },\n 'value'\n );\n return (\n <div\n key={option.id}\n style={{\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'space-between',\n alignItems: 'center',\n width: '80%',\n }}\n >\n <div>\n <ResourcePropertyInput\n key={option.id}\n name=\"value[x]\"\n property={property}\n defaultPropertyType={propertyType}\n defaultValue={propertyValue}\n onChange={(newValue: any, propName?: string) => {\n const newOptions = [...options];\n const index = newOptions.findIndex((o) => o.id === option.id);\n newOptions[index] = { id: option.id, [propName as string]: newValue };\n props.onChange(newOptions);\n }}\n />\n </div>\n <div>\n <a\n href=\"#\"\n onClick={(e: React.SyntheticEvent) => {\n killEvent(e);\n props.onChange(options.filter((o) => o.id !== option.id));\n }}\n >\n Remove\n </a>\n </div>\n </div>\n );\n })}\n <a\n href=\"#\"\n onClick={(e: React.SyntheticEvent) => {\n killEvent(e);\n props.onChange([\n ...options,\n {\n id: generateId(),\n },\n ]);\n }}\n >\n Add choice\n </a>\n </div>\n );\n}\n\nlet nextLinkId = 1;\nlet nextId = 1;\n\n/**\n * Generates a link ID for an item.\n * Link IDs are required properties on QuestionnaireItem objects.\n * @return A unique link ID.\n */\nfunction generateLinkId(prefix: string): string {\n return prefix + nextLinkId++;\n}\n\n/**\n * Generates a unique ID.\n * React needs unique IDs for components for rendering performance.\n * All of the important components in the questionnaire builder have id properties for this:\n * Questionnaire, QuestionnaireItem, and QuestionnaireItemAnswerOption.\n * @return A unique key.\n */\nfunction generateId(): string {\n return 'id-' + nextId++;\n}\n\nfunction ensureQuestionnaireKeys(questionnaire: Questionnaire): Questionnaire {\n return {\n ...questionnaire,\n id: questionnaire.id || generateId(),\n item: ensureQuestionnaireItemKeys(questionnaire.item),\n } as Questionnaire;\n}\n\nfunction ensureQuestionnaireItemKeys(items: QuestionnaireItem[] | undefined): QuestionnaireItem[] | undefined {\n if (!items) {\n return undefined;\n }\n return items.map((item) => ({\n ...item,\n id: item.id || generateId(),\n item: ensureQuestionnaireItemKeys(item.item),\n answerOption: ensureQuestionnaireOptionKeys(item.answerOption),\n }));\n}\n\nfunction ensureQuestionnaireOptionKeys(\n options: QuestionnaireItemAnswerOption[] | undefined\n): QuestionnaireItemAnswerOption[] | undefined {\n if (!options) {\n return undefined;\n }\n return options.map((option) => ({\n ...option,\n id: option.id || generateId(),\n }));\n}\n","import React from 'react';\nimport './StatusBadge.css';\n\nexport interface StatusBadgeProps {\n readonly status: string;\n}\n\nexport function StatusBadge(props: StatusBadgeProps): JSX.Element {\n return <span className={`medplum-status medplum-status-${props.status}`}>{props.status}</span>;\n}\n","/*\n * Myers Diff algorithm\n * Based on: https://github.com/KengoTODA/java-diff-utils/blob/master/src/main/java/difflib/myers/MyersDiff.java\n * Apache Software License, Version 1.1\n */\n\nexport function diff(original: string[], revised: string[]): Delta[] {\n const path = buildPath(original, revised) as PathNode;\n return buildRevisions(path, original, revised);\n}\n\nexport interface PathNode {\n readonly i: number;\n readonly j: number;\n readonly prev: PathNode | undefined;\n readonly snake: boolean;\n}\n\nexport interface Delta {\n readonly original: Chunk;\n readonly revised: Chunk;\n readonly type: 'change' | 'delete' | 'insert';\n}\n\nexport interface Chunk {\n readonly position: number;\n readonly lines: string[];\n}\n\nfunction buildPath(orig: string[], rev: string[]): PathNode | undefined {\n const N = orig.length;\n const M = rev.length;\n const MAX = N + M + 1;\n const size = 1 + 2 * MAX;\n const middle = (size / 2) | 0;\n const diagonal: (PathNode | undefined)[] = new Array(size);\n\n diagonal[middle + 1] = {\n i: 0,\n j: -1,\n prev: undefined,\n snake: true,\n };\n\n for (let d = 0; d < MAX; d++) {\n for (let k = -d; k <= d; k += 2) {\n const kmiddle = middle + k;\n const kplus = kmiddle + 1;\n const kminus = kmiddle - 1;\n const kplusNode = diagonal[kplus] as PathNode;\n const kminusNode = diagonal[kminus] as PathNode;\n let prev: PathNode | undefined = undefined;\n let i = 0;\n\n if (k === -d || (k !== d && kminusNode.i < kplusNode.i)) {\n i = kplusNode.i;\n prev = kplusNode;\n } else {\n i = kminusNode.i + 1;\n prev = kminusNode;\n }\n\n diagonal[kminus] = undefined; // no longer used\n\n let j = i - k;\n let node = {\n i,\n j,\n prev: previousSnake(prev),\n snake: false,\n };\n\n // orig and rev are zero-based\n // but the algorithm is one-based\n // that's why there's no +1 when indexing the sequences\n while (i < N && j < M && orig[i] === rev[j]) {\n i++;\n j++;\n }\n\n if (i > node.i) {\n node = {\n i,\n j,\n prev: node,\n snake: true,\n };\n }\n\n diagonal[kmiddle] = node;\n\n if (i >= N && j >= M) {\n return diagonal[kmiddle] as PathNode;\n }\n }\n diagonal[middle + d - 1] = undefined;\n }\n\n // According to Myers, this cannot happen\n return undefined;\n}\n\nfunction buildRevisions(startNode: PathNode, orig: string[], rev: string[]): Delta[] {\n const deltas: Delta[] = [];\n let path: PathNode | undefined = startNode;\n\n if (path.snake) {\n path = path.prev;\n }\n\n while (path && path.prev && path.prev.j >= 0) {\n const i = path.i;\n const j = path.j;\n\n path = path.prev;\n const ianchor = path.i;\n const janchor = path.j;\n\n const original = {\n position: ianchor,\n lines: orig.slice(ianchor, i),\n };\n\n const revised = {\n position: janchor,\n lines: rev.slice(janchor, j),\n };\n\n let type: 'insert' | 'delete' | 'change';\n\n if (original.lines.length === 0 && revised.lines.length > 0) {\n type = 'insert';\n } else if (original.lines.length > 0 && revised.lines.length === 0) {\n type = 'delete';\n } else {\n type = 'change';\n }\n\n deltas.push({ original, revised, type });\n\n if (path.snake) {\n path = path.prev;\n }\n }\n\n return deltas;\n}\n\nfunction previousSnake(node: PathNode): PathNode {\n if (node && !node.snake && node.prev) {\n return node.prev;\n }\n return node;\n}\n","import { stringify } from '@medplum/core';\nimport { Bundle, BundleEntry, Meta } from '@medplum/fhirtypes';\nimport { diff } from './diff';\n\nexport interface BlameRow {\n id: string;\n meta: Meta;\n value: string;\n span: number;\n}\n\nexport function blame(history: Bundle): BlameRow[] {\n // Convert to array of array of lines\n const versions = (history.entry as BundleEntry[])\n .map((entry) => ({\n meta: entry.resource?.meta as Meta,\n lines: stringify(entry.resource, true).match(/[^\\r\\n]+/g) as string[],\n }))\n .sort((a, b) => (a.meta.lastUpdated as string).localeCompare(b.meta.lastUpdated as string));\n\n // Start with array of lines from the first version\n const table: BlameRow[] = versions[0].lines.map((line) => ({\n id: versions[0].meta.versionId as string,\n meta: versions[0].meta,\n value: line,\n span: 1,\n }));\n\n compareVersions(table, versions);\n combineSpans(table);\n return table;\n}\n\n/**\n * For each version, update the blame table with revisions.\n * @param table The output blame table.\n * @param versions The array of versions.\n */\nfunction compareVersions(table: BlameRow[], versions: { meta: Meta; lines: string[] }[]): void {\n for (let i = 1; i < versions.length; i++) {\n const revisions = diff(versions[i - 1].lines, versions[i].lines);\n\n for (const revision of revisions) {\n const position = revision.original.position;\n const oldLines = revision.original.lines;\n const newLines = revision.revised.lines;\n\n if (revision.type === 'delete' || revision.type === 'change') {\n // Remove the old rows\n table.splice(position, oldLines.length);\n }\n\n if (revision.type === 'insert' || revision.type === 'change') {\n // Add the new lines\n for (let k = 0; k < revision.revised.lines.length; k++) {\n table.splice(position + k, 0, {\n id: versions[i].meta.versionId as string,\n meta: versions[i].meta,\n value: newLines[k],\n span: 1,\n });\n }\n }\n }\n }\n}\n\n/**\n * Combine adjacent rows into spans.\n * @param table The output blame table.\n */\nfunction combineSpans(table: BlameRow[]): void {\n let start = 0;\n while (start < table.length) {\n let curr = start;\n while (curr < table.length && table[curr].id === table[start].id) {\n table[curr].span = -1;\n curr++;\n }\n table[start].span = curr - start;\n start = curr;\n }\n}\n","import { Bundle, Resource, ResourceType } from '@medplum/fhirtypes';\nimport React, { useEffect, useState } from 'react';\nimport { InputRow } from './InputRow';\nimport { MedplumLink } from './MedplumLink';\nimport { useMedplum } from './MedplumProvider';\nimport { ResourceBadge } from './ResourceBadge';\nimport { blame } from './utils/blame';\nimport './ResourceBlame.css';\n\nexport interface ResourceBlameProps {\n history?: Bundle;\n resourceType?: ResourceType;\n id?: string;\n}\n\nexport function ResourceBlame(props: ResourceBlameProps): JSX.Element {\n const medplum = useMedplum();\n const [value, setValue] = useState<Bundle | undefined>(props.history);\n\n useEffect(() => {\n if (!props.history && props.resourceType && props.id) {\n medplum.readHistory(props.resourceType, props.id).then((result) => setValue(result));\n }\n }, [medplum, props.history, props.resourceType, props.id]);\n\n if (!value) {\n return <div>Loading...</div>;\n }\n\n const resource = value.entry?.[0]?.resource as Resource;\n const table = blame(value);\n return (\n <div className=\"medplum-blame-container\">\n <table className=\"medplum-blame\">\n <tbody>\n {table.map((row, index) => (\n <tr key={'row-' + index} className={row.span > 0 ? 'start-row' : 'normal-row'}>\n {row.span > 0 && (\n <td className=\"details\" rowSpan={row.span}>\n <InputRow justifyContent=\"space-between\">\n <ResourceBadge value={row.meta.author} size=\"xsmall\" link={true} />\n <MedplumLink to={getVersionUrl(resource, row.meta.versionId as string)}>\n {getTimeString(row.meta.lastUpdated as string)}\n </MedplumLink>\n </InputRow>\n </td>\n )}\n <td className=\"line-number\">{index + 1}</td>\n <td className=\"line\">\n <pre className=\"line-pre\">{row.value}</pre>\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n );\n}\n\nfunction getVersionUrl(resource: Resource, versionId: string): string {\n return `/${resource.resourceType}/${resource.id}/_history/${versionId}`;\n}\n\nexport function getTimeString(lastUpdated: string): string {\n const seconds = Math.floor((Date.now() - Date.parse(lastUpdated)) / 1000);\n\n const years = Math.floor(seconds / 31536000);\n if (years > 0) {\n return pluralizeTime(years, 'year');\n }\n\n const months = Math.floor(seconds / 2592000);\n if (months > 0) {\n return pluralizeTime(months, 'month');\n }\n\n const days = Math.floor(seconds / 86400);\n if (days > 0) {\n return pluralizeTime(days, 'day');\n }\n\n const hours = Math.floor(seconds / 3600);\n if (hours > 0) {\n return pluralizeTime(hours, 'hour');\n }\n\n const minutes = Math.floor(seconds / 60);\n if (minutes > 0) {\n return pluralizeTime(minutes, 'minute');\n }\n\n return pluralizeTime(seconds, 'second');\n}\n\nfunction pluralizeTime(count: number, noun: string): string {\n return `${count} ${count === 1 ? noun : noun + 's'} ago`;\n}\n","import { stringify } from '@medplum/core';\nimport { Resource } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { Delta, diff } from './utils/diff';\nimport './ResourceDiff.css';\n\nexport interface ResourceDiffProps {\n original: Resource;\n revised: Resource;\n ignoreMeta?: boolean;\n}\n\nexport function ResourceDiff(props: ResourceDiffProps): JSX.Element {\n let originalResource = props.original;\n let revisedResource = props.revised;\n\n if (props.ignoreMeta) {\n originalResource = { ...originalResource, meta: undefined };\n revisedResource = { ...revisedResource, meta: undefined };\n }\n\n const original = stringify(originalResource, true).match(/[^\\r\\n]+/g) as string[];\n const revised = stringify(revisedResource, true).match(/[^\\r\\n]+/g) as string[];\n const deltas = diff(original, revised);\n return (\n <pre style={{ color: 'gray' }}>\n {deltas.map((delta, index) => (\n <ChangeDiff key={'delta' + index} delta={delta} />\n ))}\n </pre>\n );\n}\n\nfunction ChangeDiff(props: { delta: Delta }): JSX.Element {\n return (\n <>\n ...\n <br />\n {props.delta.original.lines.length > 0 && (\n <div className=\"medplum-diff-removed\">{props.delta.original.lines.join('\\n')}</div>\n )}\n {props.delta.revised.lines.length > 0 && (\n <div className=\"medplum-diff-added\">{props.delta.revised.lines.join('\\n')}</div>\n )}\n ...\n <br />\n </>\n );\n}\n","import { Bundle, Resource, ResourceType } from '@medplum/fhirtypes';\nimport React, { useEffect, useState } from 'react';\nimport { DateTimeDisplay } from './DateTimeDisplay';\nimport { MedplumLink } from './MedplumLink';\nimport { useMedplum } from './MedplumProvider';\nimport { ResourceBadge } from './ResourceBadge';\nimport './Table.css';\n\nexport interface ResourceHistoryTableProps {\n history?: Bundle;\n resourceType?: string;\n id?: string;\n}\n\nexport function ResourceHistoryTable(props: ResourceHistoryTableProps): JSX.Element {\n const medplum = useMedplum();\n const [value, setValue] = useState<Bundle | undefined>(props.history);\n\n useEffect(() => {\n if (!props.history && props.resourceType && props.id) {\n medplum.readHistory(props.resourceType as ResourceType, props.id).then((result) => setValue(result));\n }\n }, [medplum, props.history, props.resourceType, props.id]);\n\n if (!value) {\n return <div>Loading...</div>;\n }\n\n return (\n <table className=\"medplum-table\">\n <thead>\n <tr>\n <th>Author</th>\n <th>Date</th>\n <th>Version</th>\n </tr>\n </thead>\n <tbody>\n {value.entry?.map((entry) => (\n <HistoryRow key={entry.resource?.meta?.versionId} version={entry.resource as Resource} />\n ))}\n </tbody>\n </table>\n );\n}\n\ninterface HistoryRowProps {\n version: Resource;\n}\n\nfunction HistoryRow(props: HistoryRowProps): JSX.Element {\n return (\n <tr>\n <td>\n <ResourceBadge value={props.version.meta?.author} link={true} />\n </td>\n <td>\n <DateTimeDisplay value={props.version.meta?.lastUpdated} />\n </td>\n <td>\n <MedplumLink to={getVersionUrl(props.version)}>{props.version.meta?.versionId}</MedplumLink>\n </td>\n </tr>\n );\n}\n\nfunction getVersionUrl(resource: Resource): string {\n return `/${resource.resourceType}/${resource.id}/_history/${resource.meta?.versionId}`;\n}\n","/**\n * Dynamically creates a script tag for the specified JavaScript file.\n * @param src The JavaScript file URL.\n */\nexport function createScriptTag(src: string, onload?: () => void): void {\n const head = document.getElementsByTagName('head')[0];\n const script = document.createElement('script');\n script.async = true;\n script.src = src;\n script.onload = onload || null;\n head.appendChild(script);\n}\n","import { GoogleCredentialResponse } from '@medplum/core';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { useMedplum } from './MedplumProvider';\nimport { createScriptTag } from './utils';\n\ninterface GoogleApi {\n accounts: {\n id: {\n initialize: (args: any) => void;\n renderButton: (parent: HTMLElement, args: any) => void;\n };\n };\n}\n\ndeclare const google: GoogleApi;\n\nexport interface GoogleButtonProps {\n readonly googleClientId?: string;\n readonly handleGoogleCredential: (response: GoogleCredentialResponse) => void;\n}\n\nexport function GoogleButton(props: GoogleButtonProps): JSX.Element | null {\n const medplum = useMedplum();\n const { handleGoogleCredential } = props;\n const googleClientId = getGoogleClientId(props.googleClientId);\n const parentRef = useRef<HTMLDivElement>(null);\n const [scriptLoaded, setScriptLoaded] = useState<boolean>(typeof google !== 'undefined');\n const [initialized, setInitialized] = useState<boolean>(false);\n const [buttonRendered, setButtonRendered] = useState<boolean>(false);\n\n useEffect(() => {\n if (typeof google === 'undefined') {\n createScriptTag('https://accounts.google.com/gsi/client', () => setScriptLoaded(true));\n return;\n }\n\n if (!initialized) {\n google.accounts.id.initialize({\n client_id: googleClientId,\n callback: handleGoogleCredential,\n });\n setInitialized(true);\n }\n\n if (parentRef.current && !buttonRendered) {\n google.accounts.id.renderButton(parentRef.current, {});\n setButtonRendered(true);\n }\n }, [medplum, googleClientId, initialized, scriptLoaded, parentRef, buttonRendered, handleGoogleCredential]);\n\n if (!googleClientId) {\n return null;\n }\n\n return <div ref={parentRef} />;\n}\n\nexport function getGoogleClientId(clientId: string | undefined): string | undefined {\n if (clientId) {\n return clientId;\n }\n\n const origin = window.location.protocol + '//' + window.location.host;\n const authorizedOrigins = process.env.GOOGLE_AUTH_ORIGINS?.split(',') ?? [];\n if (authorizedOrigins.includes(origin)) {\n return process.env.GOOGLE_CLIENT_ID;\n }\n\n return undefined;\n}\n","import { GoogleCredentialResponse, LoginAuthenticationResponse } from '@medplum/core';\nimport { OperationOutcome, ProjectMembership } from '@medplum/fhirtypes';\nimport React, { useState } from 'react';\nimport { Avatar } from './Avatar';\nimport { Button } from './Button';\nimport { Document } from './Document';\nimport { Form } from './Form';\nimport { FormSection } from './FormSection';\nimport { GoogleButton } from './GoogleButton';\nimport { Input } from './Input';\nimport { Logo } from './Logo';\nimport { MedplumLink } from './MedplumLink';\nimport { useMedplum } from './MedplumProvider';\nimport './SignInForm.css';\nimport './util.css';\nimport { getIssuesForExpression } from './utils/outcomes';\n\nexport interface SignInFormProps {\n readonly remember?: boolean;\n readonly projectId?: string;\n readonly googleClientId?: string;\n readonly clientId?: string;\n readonly scope?: string;\n readonly nonce?: string;\n readonly onSuccess?: () => void;\n readonly onForgotPassword?: () => void;\n readonly onRegister?: () => void;\n readonly onCode?: (code: string) => void;\n readonly children?: React.ReactNode;\n}\n\nexport function SignInForm(props: SignInFormProps): JSX.Element {\n const medplum = useMedplum();\n const [login, setLogin] = useState<string | undefined>(undefined);\n const [memberships, setMemberships] = useState<ProjectMembership[] | undefined>(undefined);\n\n function handleAuthResponse(response: LoginAuthenticationResponse): void {\n if (response.login) {\n setLogin(response.login);\n }\n\n if (response.memberships) {\n setMemberships(response.memberships);\n }\n\n if (response.code) {\n if (props.onCode) {\n props.onCode(response.code);\n } else {\n medplum\n .processCode(response.code)\n .then(() => {\n if (props.onSuccess) {\n props.onSuccess();\n }\n })\n .catch(console.log);\n }\n }\n }\n\n return (\n <Document width={450}>\n {(() => {\n if (!login) {\n return (\n <AuthenticationForm\n clientId={props.clientId}\n scope={props.scope}\n nonce={props.nonce}\n googleClientId={props.googleClientId}\n onForgotPassword={props.onForgotPassword}\n onRegister={props.onRegister}\n handleAuthResponse={handleAuthResponse}\n >\n {props.children}\n </AuthenticationForm>\n );\n } else if (memberships) {\n return <ProfileForm login={login} memberships={memberships} handleAuthResponse={handleAuthResponse} />;\n } else {\n return <div>Success</div>;\n }\n })()}\n </Document>\n );\n}\n\ninterface AuthenticationFormProps {\n readonly projectId?: string;\n readonly clientId?: string;\n readonly scope?: string;\n readonly nonce?: string;\n readonly googleClientId?: string;\n readonly onForgotPassword?: () => void;\n readonly onRegister?: () => void;\n readonly handleAuthResponse: (response: LoginAuthenticationResponse) => void;\n readonly children?: React.ReactNode;\n}\n\nfunction AuthenticationForm(props: AuthenticationFormProps): JSX.Element {\n const medplum = useMedplum();\n const [outcome, setOutcome] = useState<OperationOutcome>();\n const issues = getIssuesForExpression(outcome, undefined);\n\n return (\n <Form\n style={{ maxWidth: 400 }}\n onSubmit={(formData: Record<string, string>) => {\n medplum\n .startLogin({\n clientId: props.clientId,\n scope: props.scope,\n nonce: props.nonce,\n email: formData.email,\n password: formData.password,\n remember: formData.remember === 'true',\n })\n .then(props.handleAuthResponse)\n .catch(setOutcome);\n }}\n >\n <div className=\"medplum-center\">{props.children}</div>\n {issues && (\n <div className=\"medplum-input-error\">\n {issues.map((issue) => (\n <div data-testid=\"text-field-error\" key={issue.details?.text}>\n {issue.details?.text}\n </div>\n ))}\n </div>\n )}\n <FormSection title=\"Email\" htmlFor=\"email\" outcome={outcome}>\n <Input name=\"email\" type=\"email\" testid=\"email\" required={true} autoFocus={true} outcome={outcome} />\n </FormSection>\n <FormSection title=\"Password\" htmlFor=\"password\" outcome={outcome}>\n <Input name=\"password\" type=\"password\" testid=\"password\" autoComplete=\"off\" required={true} outcome={outcome} />\n </FormSection>\n <div className=\"medplum-signin-buttons\">\n {(props.onForgotPassword || props.onRegister) && (\n <div>\n {props.onForgotPassword && (\n <MedplumLink testid=\"forgotpassword\" onClick={props.onForgotPassword}>\n Forgot password\n </MedplumLink>\n )}\n {props.onRegister && (\n <MedplumLink testid=\"register\" onClick={props.onRegister}>\n Register\n </MedplumLink>\n )}\n </div>\n )}\n <div>\n <input type=\"checkbox\" id=\"remember\" name=\"remember\" value=\"true\" />\n <label htmlFor=\"remember\">Remember me</label>\n </div>\n <div>\n <Button type=\"submit\" testid=\"submit\">\n Sign in\n </Button>\n </div>\n </div>\n <div className=\"medplum-signin-google-container\">\n <GoogleButton\n googleClientId={props.googleClientId}\n handleGoogleCredential={(response: GoogleCredentialResponse) => {\n medplum\n .startGoogleLogin({\n clientId: props.clientId,\n scope: props.scope,\n nonce: props.nonce,\n googleClientId: response.clientId,\n googleCredential: response.credential,\n })\n .then(props.handleAuthResponse)\n .catch(setOutcome);\n }}\n />\n </div>\n </Form>\n );\n}\n\ninterface ProfileFormProps {\n login: string;\n memberships: ProjectMembership[];\n handleAuthResponse: (response: any) => void;\n}\n\nfunction ProfileForm(props: ProfileFormProps): JSX.Element {\n const medplum = useMedplum();\n return (\n <div>\n <div className=\"medplum-center\">\n <Logo size={32} />\n <h1>Choose profile</h1>\n </div>\n {props.memberships.map((membership: ProjectMembership) => (\n <div\n className=\"medplum-nav-menu-profile\"\n key={membership.id}\n onClick={() => {\n medplum\n .post('auth/profile', {\n login: props.login,\n profile: membership.id,\n })\n .then(props.handleAuthResponse);\n }}\n >\n <div className=\"medplum-nav-menu-profile-icon\">\n <Avatar alt={membership.profile?.display} />\n </div>\n <div className=\"medplum-nav-menu-profile-label\">\n {membership.profile?.display}\n <div className=\"medplum-nav-menu-profile-help-text\">{membership.project?.display}</div>\n </div>\n </div>\n ))}\n </div>\n );\n}\n","import React from 'react';\nimport './Tab.css';\nimport { killEvent } from './utils/dom';\n\nexport interface TabClickHandler {\n (name: string, button: number): void;\n}\n\nexport interface TabProps {\n name: string;\n label: string;\n selected?: boolean;\n onClick?: TabClickHandler;\n}\n\nexport function Tab(props: TabProps): JSX.Element {\n let className = 'medplum-tab';\n if (props.selected) {\n className += ' selected';\n }\n\n function clickHandler(e: React.MouseEvent): void {\n killEvent(e);\n\n // The onClick prop is set by TabBar as parent component.\n // Using Tab outside of a TabBar is unsupported.\n (props.onClick as TabClickHandler)(props.name, e.button);\n }\n\n return (\n <a\n href={`#${props.name}`}\n role=\"tab\"\n aria-selected={props.selected}\n className={className}\n onClick={clickHandler}\n onAuxClick={clickHandler}\n >\n {props.label}\n </a>\n );\n}\n","import React from 'react';\n\nexport interface TabPanelProps {\n name: string;\n children: React.ReactNode;\n}\n\nexport function TabPanel(props: TabPanelProps): JSX.Element {\n return <div role=\"tabpanel\">{props.children}</div>;\n}\n","import { getReferenceString } from '@medplum/core';\nimport { Reference, Resource } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { ResourceTimeline } from './ResourceTimeline';\n\nexport interface DefaultResourceTimelineProps {\n resource: Resource | Reference;\n}\n\nexport function DefaultResourceTimeline(props: DefaultResourceTimelineProps): JSX.Element {\n return (\n <ResourceTimeline\n value={props.resource}\n buildSearchRequests={(resource: Resource) => ({\n resourceType: 'Bundle',\n type: 'batch',\n entry: [\n {\n request: {\n method: 'GET',\n url: `${getReferenceString(resource)}/_history`,\n },\n },\n {\n request: {\n method: 'GET',\n url: `AuditEvent?entity=${getReferenceString(resource)}&_sort=-_lastUpdated`,\n },\n },\n ],\n })}\n />\n );\n}\n","import { createReference, getReferenceString, ProfileResource } from '@medplum/core';\nimport { Attachment, Encounter, Reference, Resource } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { ResourceTimeline } from './ResourceTimeline';\n\nexport interface EncounterTimelineProps {\n encounter: Encounter | Reference<Encounter>;\n}\n\nexport function EncounterTimeline(props: EncounterTimelineProps): JSX.Element {\n return (\n <ResourceTimeline\n value={props.encounter}\n buildSearchRequests={(resource: Resource) => ({\n resourceType: 'Bundle',\n type: 'batch',\n entry: [\n {\n request: {\n method: 'GET',\n url: `${getReferenceString(resource)}/_history`,\n },\n },\n {\n request: {\n method: 'GET',\n url: `Communication?encounter=${getReferenceString(resource)}`,\n },\n },\n {\n request: {\n method: 'GET',\n url: `Media?encounter=${getReferenceString(resource)}`,\n },\n },\n ],\n })}\n createCommunication={(resource: Encounter, sender: ProfileResource, text: string) => ({\n resourceType: 'Communication',\n encounter: createReference(resource),\n subject: resource.subject,\n sender: createReference(sender),\n sent: new Date().toISOString(),\n payload: [{ contentString: text }],\n })}\n createMedia={(resource: Encounter, operator: ProfileResource, content: Attachment) => ({\n resourceType: 'Media',\n encounter: createReference(resource),\n subject: resource.subject,\n operator: createReference(operator),\n issued: new Date().toISOString(),\n content,\n })}\n />\n );\n}\n","import React from 'react';\nimport './FooterLinks.css';\n\nexport interface FooterLinksProps {\n children?: React.ReactNode;\n}\n\nexport function FooterLinks(props: FooterLinksProps): JSX.Element {\n return <div className=\"medplum-footer\">{props.children}</div>;\n}\n","import { getReferenceString, ProfileResource } from '@medplum/core';\nimport { HumanName, UserConfiguration } from '@medplum/fhirtypes';\nimport React, { useState } from 'react';\nimport { useLocation, useNavigate } from 'react-router-dom';\nimport { Avatar } from './Avatar';\nimport { Button } from './Button';\nimport { HeaderSearchInput, HeaderSearchTypes } from './HeaderSearchInput';\nimport { HumanNameDisplay } from './HumanNameDisplay';\nimport { MedplumLink } from './MedplumLink';\nimport { useMedplumContext } from './MedplumProvider';\nimport { Popup } from './Popup';\nimport './Header.css';\n\nexport interface HeaderProps {\n readonly title?: string;\n readonly bgColor?: string;\n readonly onLogo?: () => void;\n readonly onProfile?: () => void;\n readonly onSignOut?: () => void;\n readonly config?: UserConfiguration;\n}\n\nexport function Header(props: HeaderProps): JSX.Element {\n const navigate = useNavigate();\n const location = useLocation();\n const context = useMedplumContext();\n const medplum = context.medplum;\n const logins = medplum.getLogins();\n const [userMenuVisible, setUserMenuVisible] = useState(false);\n const [sidebarVisible, setSidebarVisible] = useState(false);\n\n return (\n <>\n <header role=\"banner\" data-testid=\"header\" style={{ background: props.bgColor }}>\n <div>\n <MedplumLink\n label=\"Toggle sidebar\"\n testid=\"header-menu-button\"\n onClick={() => setSidebarVisible(!sidebarVisible)}\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n style={{ width: 20, height: 20, verticalAlign: 'text-top' }}\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M3 5a1 1 0 011-1h12a1 1 0 110 2H4a1 1 0 01-1-1zM3 10a1 1 0 011-1h12a1 1 0 110 2H4a1 1 0 01-1-1zM3 15a1 1 0 011-1h12a1 1 0 110 2H4a1 1 0 01-1-1z\"\n clipRule=\"evenodd\"\n />\n </svg>\n </MedplumLink>\n <MedplumLink id=\"medplum-header-logo\" testid=\"header-logo\" onClick={props.onLogo}>\n {props.title || 'Medplum'}\n </MedplumLink>\n {context.profile && (\n <HeaderSearchInput\n key={`header-input-${location.pathname}`}\n name=\"search\"\n className=\"medplum-nav-search-container\"\n placeholder=\"Search\"\n onChange={(resource: HeaderSearchTypes) => navigate(`/${resource.resourceType}/${resource.id}`)}\n />\n )}\n </div>\n {context.profile && (\n <div className=\"medplum-nav-menu-container\">\n <MedplumLink testid=\"header-profile-menu-button\" onClick={() => setUserMenuVisible(true)}>\n <Avatar size=\"small\" color=\"#f68d42\" value={context.profile} />\n </MedplumLink>\n <Popup\n visible={userMenuVisible}\n autoClose={true}\n activeClassName=\"medplum-nav-menu-popover\"\n onClose={() => setUserMenuVisible(false)}\n >\n <div className=\"medplum-nav-menu\">\n <div style={{ margin: 'auto', padding: '8px' }}>\n <Avatar size=\"large\" value={context.profile} />\n </div>\n <div style={{ margin: 'auto', padding: '8px' }}>\n <div style={{ margin: '4px auto 4px auto', fontWeight: 'bold' }}>\n <HumanNameDisplay value={context.profile?.name?.[0] as HumanName} />\n </div>\n <div style={{ margin: '4px auto 4px auto' }}>{medplum.getActiveLogin()?.project?.display}</div>\n <Button\n testid=\"header-profile-link\"\n onClick={() => {\n setUserMenuVisible(false);\n if (props.onProfile) {\n props.onProfile();\n }\n }}\n >\n Manage your account\n </Button>\n </div>\n {logins.length > 1 && (\n <div>\n <hr />\n {logins.map(\n (login) =>\n login.profile?.reference !== getReferenceString(context.profile as ProfileResource) && (\n <div\n className=\"medplum-nav-menu-profile\"\n key={login.profile?.reference}\n onClick={() => {\n medplum.setActiveLogin(login);\n setUserMenuVisible(false);\n window.location.reload();\n }}\n >\n <div className=\"medplum-nav-menu-profile-icon\">\n <Avatar />\n </div>\n <div className=\"medplum-nav-menu-profile-label\">\n {login.profile?.display}\n <div className=\"medplum-nav-menu-profile-help-text\">{login.project?.display}</div>\n </div>\n </div>\n )\n )}\n </div>\n )}\n <hr />\n <div style={{ margin: 'auto', padding: '8px' }}>\n <Button\n testid=\"header-add-account-button\"\n onClick={() => {\n navigate('/signin');\n }}\n >\n Add another account\n </Button>\n </div>\n <hr />\n <div style={{ margin: 'auto', padding: '8px' }}>\n <Button\n testid=\"header-signout-button\"\n onClick={() => {\n setUserMenuVisible(false);\n if (props.onSignOut) {\n props.onSignOut();\n }\n }}\n >\n Sign out of all accounts\n </Button>\n </div>\n <hr />\n <div style={{ margin: 'auto', padding: '8px', fontSize: '12px' }}>\n <a href=\"https://www.medplum.com/terms\">Terms</a>\n <a href=\"https://www.medplum.com/privacy\">Privacy</a>\n </div>\n </div>\n </Popup>\n </div>\n )}\n </header>\n <Popup\n modal={true}\n autoClose={true}\n visible={sidebarVisible}\n activeClassName=\"medplum-sidebar active\"\n inactiveClassName=\"medplum-sidebar\"\n onClose={() => setSidebarVisible(false)}\n >\n {props.config?.menu?.map((menu, index) => (\n <React.Fragment key={`menu-${index}-${props.config?.menu?.length}`}>\n <h5>{menu.title}</h5>\n <ul>\n {menu.link?.map((link) => (\n <li key={link.target}>\n <MedplumLink to={link.target}>{link.name}</MedplumLink>\n </li>\n ))}\n </ul>\n </React.Fragment>\n ))}\n <h5>Settings</h5>\n <ul>\n <li>\n <MedplumLink to={context.profile}>Profile</MedplumLink>\n </li>\n <li>\n <MedplumLink to=\"/changepassword\">Change password</MedplumLink>\n </li>\n </ul>\n </Popup>\n </>\n );\n}\n","import { getReferenceString } from '@medplum/core';\nimport { Bundle, BundleEntry, Reference, RequestGroup, Resource, Task } from '@medplum/fhirtypes';\nimport React, { useEffect, useState } from 'react';\nimport { Button } from './Button';\nimport { DateTimeDisplay } from './DateTimeDisplay';\nimport { useMedplum } from './MedplumProvider';\nimport { ResourceName } from './ResourceName';\nimport { StatusBadge } from './StatusBadge';\nimport { useResource } from './useResource';\nimport './RequestGroupDisplay.css';\n\nexport interface RequestGroupDisplayProps {\n value?: RequestGroup | Reference<RequestGroup>;\n onStart: (task: Task, input: Reference) => void;\n onEdit: (task: Task, input: Reference, output: Reference) => void;\n}\n\nexport function RequestGroupDisplay(props: RequestGroupDisplayProps): JSX.Element | null {\n const medplum = useMedplum();\n const requestGroup = useResource(props.value);\n const [startedLoading, setStartedLoading] = useState(false);\n const [responseBundle, setResponseBundle] = useState<Bundle>();\n\n useEffect(() => {\n if (requestGroup && !startedLoading) {\n medplum.post('fhir/R4', buildBatchRequest(requestGroup)).then(setResponseBundle);\n setStartedLoading(true);\n }\n }, [medplum, requestGroup, startedLoading]);\n\n if (!requestGroup || !responseBundle) {\n return null;\n }\n\n return (\n <div className=\"medplum-request-group\">\n {requestGroup.action?.map((action, index) => {\n const task = action.resource && findBundleEntry(action.resource as Reference<Task>);\n const taskInput = task?.input?.[0]?.valueReference;\n const taskOutput = task?.output?.[0]?.valueReference;\n return (\n <div className=\"medplum-request-group-task\" key={`action-${index}`}>\n <div className=\"medplum-request-group-task-checkmark\">{task?.status === 'completed' ? '🗹' : '☐'}</div>\n <div className=\"medplum-request-group-task-details\">\n <div className=\"medplum-request-group-task-title\">{action.title}</div>\n <div>\n Last edited by \n <ResourceName value={task?.meta?.author as Reference} />\n on \n <DateTimeDisplay value={task?.meta?.lastUpdated} />\n </div>\n <div>\n Status: <StatusBadge status={task?.status || 'unknown'} />\n </div>\n </div>\n <div className=\"medplum-request-group-task-actions\">\n {taskInput && !taskOutput && <Button onClick={() => props.onStart(task, taskInput)}>Start</Button>}\n {taskInput && taskOutput && (\n <Button onClick={() => props.onEdit(task, taskInput, taskOutput)}>Edit</Button>\n )}\n </div>\n </div>\n );\n })}\n </div>\n );\n\n function buildBatchRequest(request: RequestGroup): Bundle {\n const batchEntries = [] as BundleEntry[];\n if (request.action) {\n for (const action of request.action) {\n if (action.resource?.reference) {\n batchEntries.push({ request: { method: 'GET', url: action.resource.reference } });\n }\n }\n }\n\n return {\n resourceType: 'Bundle',\n type: 'batch',\n entry: batchEntries,\n };\n }\n\n function findBundleEntry<T extends Resource>(reference: Reference<T>): T | undefined {\n for (const entry of responseBundle?.entry as BundleEntry[]) {\n if (entry.resource && reference.reference === getReferenceString(entry.resource)) {\n return entry.resource as T;\n }\n }\n return undefined;\n }\n}\n","import { createReference, getReferenceString, ProfileResource } from '@medplum/core';\nimport { Attachment, Group, Patient, Reference, Resource, ServiceRequest } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { ResourceTimeline } from './ResourceTimeline';\n\nexport interface ServiceRequestTimelineProps {\n serviceRequest: ServiceRequest | Reference<ServiceRequest>;\n}\n\nexport function ServiceRequestTimeline(props: ServiceRequestTimelineProps): JSX.Element {\n return (\n <ResourceTimeline\n value={props.serviceRequest}\n buildSearchRequests={(resource: Resource) => ({\n resourceType: 'Bundle',\n type: 'batch',\n entry: [\n {\n request: {\n method: 'GET',\n url: `${getReferenceString(resource)}/_history`,\n },\n },\n {\n request: {\n method: 'GET',\n url: `Communication?based-on=${getReferenceString(resource)}`,\n },\n },\n {\n request: {\n method: 'GET',\n url: `Media?_count=100&based-on=${getReferenceString(resource)}`,\n },\n },\n {\n request: {\n method: 'GET',\n url: `DiagnosticReport?based-on=${getReferenceString(resource)}`,\n },\n },\n ],\n })}\n createCommunication={(resource: ServiceRequest, sender: ProfileResource, text: string) => ({\n resourceType: 'Communication',\n basedOn: [createReference(resource)],\n subject: resource.subject as Reference<Group | Patient>,\n sender: createReference(sender),\n sent: new Date().toISOString(),\n payload: [{ contentString: text }],\n })}\n createMedia={(resource: ServiceRequest, operator: ProfileResource, content: Attachment) => ({\n resourceType: 'Media',\n basedOn: [createReference(resource)],\n subject: resource.subject,\n operator: createReference(operator),\n issued: new Date().toISOString(),\n content,\n })}\n />\n );\n}\n","import React from 'react';\nimport { Scrollable } from './Scrollable';\nimport { Tab, TabClickHandler } from './Tab';\nimport './Surface.css';\nimport './TabList.css';\n\nexport interface TabListProps {\n value?: string;\n onChange: TabClickHandler;\n children: React.ReactNode;\n}\n\nexport function TabList(props: TabListProps): JSX.Element {\n return (\n <Scrollable className=\"medplum-surface\" height={50}>\n <div role=\"tablist\" className=\"medplum-tablist\">\n <div className=\"medplum-tablist-foreground\">\n {React.Children.map(props.children, (child, tabIndex) => {\n if (React.isValidElement(child) && child.type === Tab) {\n return React.cloneElement(child as React.ReactElement<any>, {\n selected: child.props.name === props.value,\n onClick: props.onChange,\n tabIndex,\n });\n } else {\n return null;\n }\n })}\n </div>\n </div>\n </Scrollable>\n );\n}\n","import React from 'react';\nimport { TabPanel } from './TabPanel';\n\nexport interface TabSwitchProps {\n value?: string;\n children: React.ReactNode;\n}\n\nexport function TabSwitch(props: TabSwitchProps): JSX.Element {\n return (\n <>\n {React.Children.map(props.children, (child) => {\n if (React.isValidElement(child) && child.type === TabPanel && child.props.name === props.value) {\n return child;\n } else {\n return null;\n }\n })}\n </>\n );\n}\n"],"names":["AddressDisplay","props","address","value","React","formatAddress","getIssuesForExpression","outcome","expression","_a","issue","filter","Input","issues","name","invalid","length","createElement","id","type","getInputType","size","step","className","style","defaultValue","required","autoCapitalize","autoComplete","autoFocus","ref","inputRef","placeholder","testid","disabled","onChange","e","currentTarget","requestedType","InputRow","justifyContent","children","Select","getLine","index","line","setLine","str","push","Object","assign","AddressInput","setValue","useState","valueRef","useRef","setValueWrapper","newValue","current","use","line1","line2","city","state","postalCode","AttachmentDisplay","contentType","url","title","startsWith","maxWidth","src","alt","controls","endsWith","minHeight","width","height","allowFullScreen","frameBorder","seamless","padding","href","target","rel","AttachmentArrayDisplay","values","map","v","key","Button","primary","danger","borderless","onClick","label","reactContext","createContext","undefined","useMedplumContext","useContext","useMedplum","medplum","useMedplumProfile","profile","killEvent","preventDefault","stopPropagation","isCheckboxCell","el","isCheckboxElement","HTMLTableCellElement","HTMLInputElement","UploadButton","fileInputRef","processFile","file","filename","createBinary","then","binary","onUpload","catch","alert","_c","_b","details","text","Fragment","display","files","Array","from","forEach","onFileChange","click","AttachmentArrayInput","setValues","valuesRef","setValuesWrapper","newValues","copy","slice","splice","attachment","AttachmentInput","Autocomplete","focused","setFocused","lastValue","setLastValue","timer","setTimer","dropDownVisible","setDropDownVisible","options","setOptions","selectedIndex","setSelectedIndex","abortController","setAbortController","autoSubmit","setAutoSubmit","lastValueRef","timerRef","abortControllerRef","autoSubmitRef","addOption","option","multiple","handleClick","focus","handleBlur","window","setTimeout","handleInput","abort","clearTimeout","newTimer","trim","newAbortController","AbortController","loadOptions","signal","newOptions","aborted","console","log","handleTimer","handleKeyDown","tryAddOption","handleSelectKey","moveSelection","handleBackspaceKey","handleSeparatorKey","buildUnstructured","delta","useEffect","baseClassName","getId","getDisplay","autofocus","spellCheck","onFocus","onBlur","onInput","onKeyDown","onMouseOver","_e","handleDropDownHover","handleDropDownClick","getIcon","getHelpText","onCreateNew","MedplumLink","navigate","useNavigate","to","resourceType","reference","suffix","system","deviceName","useResource","resource","setResource","getCachedReference","getInitialResource","subscribed","readReference","r","Avatar","getDisplayString","initials","split","n","join","getInitials","imageUrl","getImageSrc","innerContent","backgroundColor","color","link","CheckboxFormSection","htmlFor","description","DEFAULT_IGNORED_PROPERTIES","FormSection","setPropertyValue","obj","propName","elementDefinition","types","compoundKey","replace","capitalize","code","DescriptionList","compact","DescriptionListEntry","term","BackboneElementDisplay","typedValue","typeName","typeSchema","globalSchema","keys","entries","properties","entry","indexOf","property","propertyValue","propertyType","getValueAndType","ignoreMissingValues","isArray","getPropertyDisplayName","ResourcePropertyDisplay","CodingDisplay","CodeableConceptDisplay","coding","ContactPointDisplay","contactPoint","builder","ContactDetailDisplay","contactDetail","telecom","DateTimeDisplay","Date","toLocaleString","HumanNameDisplay","formatHumanName","IdentifierDisplay","PeriodDisplay","start","end","QuantityDisplay","formatQuantityString","quantity","result","comparator","unit","RangeDisplay","formatRangeString","range","low","high","RatioDisplay","numerator","denominator","ReferenceDisplay","displayString","stringify","ResourceArrayDisplay","arrayElement","max","PropertyType","boolean","Boolean","toString","SystemString","date","integer","positiveInt","string","unsignedInt","uri","canonical","dateTime","instant","markdown","Address","Annotation","Attachment","CodeableConcept","Coding","ContactDetail","ContactPoint","HumanName","Identifier","Period","Quantity","Range","Ratio","Reference","path","Error","buildTypeName","context","typedResult","getTypedPropertyValue","AnnotationInput","author","authorReference","createReference","time","toISOString","Checkbox","defaultChecked","checked","CodeableConceptInput","input","binding","valueSet","searchValueSet","expansion","contains","valueSetElementToCodeableConcept","element","concept","_f","_d","cachedDisplayValues","CodeInput","item","CodingInput","ContactPointInput","setContactPoint","setContactPointWrapper","ContactDetailInput","setContactDetail","setContactDetailWrapper","DateTimeInput","convertIsoToLocal","convertLocalToIso","isoString","isValidDate","toLocaleDateString","toLocaleTimeString","localString","isNaN","getTime","TextArea","monospace","ExtensionInput","JSON","parse","HumanNameInput","prefix","given","family","IdentifierInput","PeriodInput","QuantityInput","tryParseNumber","parseFloat","RangeInput","RatioInput","ResourceName","ResourceInput","defaultResource","resourceTypeRef","search","encodeURIComponent","bundle","birthDate","items","ReferenceInput","targetTypes","initialResourceType","defaultValueResourceType","getInitialResourceType","setResourceType","targetType","ResourceArrayInput","borderCollapse","ResourcePropertyInput","textAlign","defaultPropertyType","propertyTypes","ElementDefinitionInputSelector","elementDefinitionTypes","ElementDefinitionTypeInput","elementDefinitionType","initialPropertyType","find","t","selectedType","setSelectedType","decimal","Extension","getTargetTypes","BackboneElementInput","targetProfile","p","pop","definition","ResourceBadge","DiagnosticReportDisplay","diagnosticReport","textContent","presentedForm","pf","data","atob","subject","resultsInterpreter","interpreter","issued","status","ObservationTable","observation","ObservationRow","ObservationValueDisplay","ReferenceRangeDisplay","referenceRange","interpretation","obs","valueQuantity","valueString","component","reduce","prev","curr","parseForm","form","elements","parseInputElement","HTMLTextAreaElement","HTMLSelectElement","parseSelectElement","Form","onSubmit","formData","Loading","role","viewBox","cx","cy","MenuItem","ResourceDiffTable","schema","setSchema","requestSchema","original","originalPropertyValue","originalPropertyType","toTypedValue","revisedPropertyValue","revisedPropertyType","revised","isEmpty","ResourceTable","Scrollable","containerHeight","contentHeight","ErrorBoundary","Component","constructor","super","this","static","error","componentDidCatch","errorInfo","render","Popup","location","useLocation","locationRef","visible","propsRef","autoClose","onClose","document","addEventListener","removeEventListener","anchor","right","body","clientWidth","left","top","clientHeight","bottom","modal","activeClassName","inactiveClassName","Timeline","TimelineItem","popupAnchor","setPopupAnchor","meta","lastUpdated","popupMenuItems","getReferenceString","rect","getBoundingClientRect","fill","transform","d","socialEnabled","sortByDateAndPriority","resources","sort","resourceDateComparator","a","b","priority1","getPriorityScore","priority2","priority","stat","asap","urgent","sent","ResourceTimeline","sender","getProfile","history","setHistory","setItems","buildSearchRequests","itemsRef","loadTimeline","useCallback","batchRequest","post","handleBatchResponse","batchResponse","newItems","batchEntry","reverse","addResources","setPriority","communication","updateResource","onPin","onUnpin","onDetails","timelineItem","onEdit","onDelete","onVersionDetails","version","versionId","createCommunication","contentString","createResource","createMedia","HistoryTimelineItem","AuditEventTimelineItem","CommunicationTimelineItem","DiagnosticReportTimelineItem","MediaTimelineItem","TimelineItemPopupMenu","previous","findIndex","getPrevious","payload","content","outcomeDesc","Document","FhirPathDisplay","evalFhirPath","err","warn","getFieldDefinition","searchParams","base","exactElementDefinition","exactSearchParam","toLowerCase","replaceAll","includes","getSearchParameterDetails","Dialog","x","setX","y","setY","tabIndex","onMouseDown","downEvent","dragX","clientX","dragY","clientY","handleMouseMove","moveEvent","handleMouseUp","upEvent","handleMouseDown","onCancel","xmlns","stroke","strokeLinecap","strokeLinejoin","strokeWidth","onOk","searchParamToOperators","Operator","EQUALS","NOT","CONTAINS","EXACT","fulltext","token","numeric","NOT_EQUALS","GREATER_THAN","LESS_THAN","GREATER_THAN_OR_EQUALS","LESS_THAN_OR_EQUALS","STARTS_AFTER","ENDS_BEFORE","APPROXIMATELY","datetime","operatorNames","eq","ne","gt","lt","ge","le","sa","eb","ap","exact","not","above","below","in","missing","setFilters","filters","offset","clearFiltersOnField","f","addFilter","field","op","opt_clear","nextFilters","operator","deleteFilter","newFilters","addYesterdayFilter","addDayFilter","addTodayFilter","addTomorrowFilter","startTime","setDate","getDate","setHours","endTime","setTime","addDateFilterBetween","addLastMonthFilter","addMonthFilter","addThisMonthFilter","addNextMonthFilter","setMonth","getMonth","addYearToDateFilter","d1","d2","addDateFilterImpl","addMissingFilter","MISSING","setOffset","movePage","count","newOffset","Math","setSort","desc","getSortField","isSortDescending","sortRules","descending","substr","getSearchOperators","searchParam","getOpString","buildFieldNameString","tmp","renderValue","renderPropertyValue","evalFhirPathTyped","renderSearchParameterValue","SearchFieldEditor","setState","availableRef","selectedRef","onAddField","currentField","fields","newFields","onRemoveField","swapFields","i","j","temp","typeDef","selected","available","Set","names","add","has","getFieldsList","margin","colSpan","align","handleAvailableKeyDown","onDoubleClick","handleSelectedKeyDown","SearchFilterValueDisplay","getSchema","SearchFilterValueInput","SearchParameterType","REFERENCE","newReference","BOOLEAN","DATE","DATETIME","NUMBER","QUANTITY","tryParseQuantity","newQuantity","systemString","unitString","SearchFilterEditor","setSearch","editingIndex","setEditingIndex","searchRef","FilterRowInput","okText","newFilter","FilterRowDisplay","operators","newCode","param","newOperator","newFilterValue","SearchFilterValueDialog","MenuSeparator","SubMenu","hover","setHover","setVisible","setAnchor","menuItemRef","hoverRef","visibleRef","show","timerId","setInterval","clearInterval","onMouseLeave","SearchPopupMenu","onSort","onClear","onPrompt","SearchParameterSubMenu","DateFilterSubMenu","NumericFilterSubMenu","ReferenceFilterSubMenu","TextFilterSubMenu","TitleBar","SearchChangeEvent","Event","SearchLoadEvent","response","SearchClickEvent","browserEvent","SearchControl","setOutcome","onLoad","popupVisible","popupX","popupY","popupSearchParams","fieldEditorVisible","filterEditorVisible","filterDialogVisible","stateRef","emitSearchChange","newSearch","handleRowClick","button","onAuxClick","formatSearchQuery","total","searchResponse","reason","newSchema","checkboxColumn","checkboxesEnabled","getFieldDefinitions","lastResult","savedSearches","userConfig","s","criteria","onContextMenu","hideToolbar","parseSearchDefinition","onNew","onExport","onBulk","min","getStart","DEFAULT_SEARCH_COUNT","getEnd","isAllSelected","newSelected","handleAllCheckboxClick","handleSortClick","FilterIcon","hideFilters","FilterDescription","handleSingleCheckboxClick","filterDialogSearchParam","filterDialogFilter","MemoizedSearchControl","memo","FhirPathTable","query","setResponse","setSelected","responseRef","graphql","ResourceList","fhirPath","MemoizedFhirPathTable","__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","next","rejected","done","apply","HeaderSearchInput","Patients1","Patients2","ServiceRequestList","getResourceScore","sortByRelevance","ids","dedupeResources","getResourcesFromResponse","escaped","isUUID","buildGraphQLQuery","bestScore","identifier","getStringScore","Logo","searches","ActionArrayBuilder","actionsRef","changeAction","changedAction","actions","ActionBuilder","action","onRemove","removeAction","removedAction","addedAction","generateId","actionType","setActionType","definitionCanonical","getInitialActionType","actionRef","changeProperty","LabActionBuilder","QuestionnaireActionBuilder","questionnaireRef","nextId","existing","existingNum","parseInt","substring","ensurePlanDefinitionActionKeys","QuestionnaireItemType","addInitialValuesToItemArray","linkId","suppliedValue","initialValue","valueBoolean","valueCoding","valueDate","valueDateTime","valueDecimal","valueInteger","valueTime","valueUri","valueReference","initial","addInitialValueToItem","isChoiceQuestion","QuestionnaireFormItemArray","responseItems","setResponseItems","buildInitialResponseItems","setResponseItem","newResponseItem","newResponseItems","group","QuestionnaireFormItem","answer","onChangeAnswer","newResponseAnswer","choice","openChoice","answerOption","valueElementDefinition","optionValue","propertyName","optionName","valueAttachment","buildInitialResponseItem","buildInitialResponseAnswer","ItemBuilder","isResource","isContainer","editing","selectedKey","hovering","hoverKey","itemRef","changeItem","changedItem","addItem","addedItem","setSelectedKey","setHoverKey","AnswerBuilder","removedItem","removeItem","generateLinkId","flexDirection","alignItems","o","exports","nextLinkId","ensureQuestionnaireItemKeys","ensureQuestionnaireOptionKeys","StatusBadge","diff","startNode","orig","rev","deltas","snake","ianchor","janchor","position","lines","buildRevisions","N","M","MAX","middle","diagonal","k","kmiddle","kminus","kplusNode","kminusNode","node","previousSnake","buildPath","blame","versions","match","localeCompare","table","span","revisions","revision","oldLines","newLines","compareVersions","combineSpans","getVersionUrl","getTimeString","seconds","floor","now","years","pluralizeTime","months","days","hours","minutes","noun","ChangeDiff","HistoryRow","createScriptTag","onload","head","getElementsByTagName","script","async","appendChild","GoogleButton","handleGoogleCredential","googleClientId","clientId","origin","protocol","host","getGoogleClientId","parentRef","scriptLoaded","setScriptLoaded","google","initialized","setInitialized","buttonRendered","setButtonRendered","accounts","initialize","client_id","callback","renderButton","AuthenticationForm","startLogin","scope","nonce","email","password","remember","handleAuthResponse","onForgotPassword","onRegister","startGoogleLogin","googleCredential","credential","ProfileForm","memberships","membership","login","project","Tab","clickHandler","TabPanel","request","method","encounter","logins","getLogins","userMenuVisible","setUserMenuVisible","sidebarVisible","setSidebarVisible","background","bgColor","verticalAlign","fillRule","clipRule","onLogo","pathname","fontWeight","getActiveLogin","onProfile","setActiveLogin","reload","onSignOut","fontSize","config","menu","loading","eventListener","removeEventListeneer","medplumContext","Provider","patient","planDefinition","questionnaire","handleDocumentMouseOver","handleDocumentClick","source","buildInitialResponse","authored","requestGroup","startedLoading","setStartedLoading","responseBundle","setResponseBundle","batchEntries","buildBatchRequest","task","findBundleEntry","taskInput","taskOutput","output","onStart","readHistory","row","rowSpan","originalResource","revisedResource","ignoreMeta","noValidate","serviceRequest","basedOn","setLogin","setMemberships","onCode","processCode","onSuccess","Children","child","isValidElement","cloneElement"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.min.js","sources":["../../../src/AddressDisplay.tsx","../../../src/utils/outcomes.ts","../../../src/Input.tsx","../../../src/InputRow.tsx","../../../src/Select.tsx","../../../src/AddressInput.tsx","../../../src/AttachmentDisplay.tsx","../../../src/AttachmentArrayDisplay.tsx","../../../src/Button.tsx","../../../src/MedplumProvider.tsx","../../../src/utils/dom.ts","../../../src/UploadButton.tsx","../../../src/AttachmentArrayInput.tsx","../../../src/AttachmentInput.tsx","../../../src/Autocomplete.tsx","../../../src/MedplumLink.tsx","../../../src/useResource.ts","../../../src/Avatar.tsx","../../../src/CheckboxFormSection.tsx","../../../src/constants.ts","../../../src/FormSection.tsx","../../../src/ResourceForm.tsx","../../../src/DescriptionList.tsx","../../../src/BackboneElementDisplay.tsx","../../../src/CodingDisplay.tsx","../../../src/CodeableConceptDisplay.tsx","../../../src/ContactPointDisplay.tsx","../../../src/ContactDetailDisplay.tsx","../../../src/DateTimeDisplay.tsx","../../../src/HumanNameDisplay.tsx","../../../src/IdentifierDisplay.tsx","../../../src/PeriodDisplay.tsx","../../../src/QuantityDisplay.tsx","../../../src/RangeDisplay.tsx","../../../src/RatioDisplay.tsx","../../../src/ReferenceDisplay.tsx","../../../src/ResourceArrayDisplay.tsx","../../../src/ResourcePropertyDisplay.tsx","../../../src/AnnotationInput.tsx","../../../src/Checkbox.tsx","../../../src/CodeableConceptInput.tsx","../../../src/CodeInput.tsx","../../../src/CodingInput.tsx","../../../src/ContactPointInput.tsx","../../../src/ContactDetailInput.tsx","../../../src/DateTimeInput.tsx","../../../src/TextArea.tsx","../../../src/ExtensionInput.tsx","../../../src/HumanNameInput.tsx","../../../src/IdentifierInput.tsx","../../../src/PeriodInput.tsx","../../../src/QuantityInput.tsx","../../../src/RangeInput.tsx","../../../src/RatioInput.tsx","../../../src/ResourceName.tsx","../../../src/ResourceInput.tsx","../../../src/ReferenceInput.tsx","../../../src/ResourceArrayInput.tsx","../../../src/ResourcePropertyInput.tsx","../../../src/BackboneElementInput.tsx","../../../src/ResourceBadge.tsx","../../../src/DiagnosticReportDisplay.tsx","../../../src/FormUtils.ts","../../../src/Form.tsx","../../../src/Loading.tsx","../../../src/MenuItem.tsx","../../../src/ResourceDiffTable.tsx","../../../src/ResourceTable.tsx","../../../src/Scrollable.tsx","../../../src/ErrorBoundary.tsx","../../../src/Popup.tsx","../../../src/Timeline.tsx","../../../src/utils/date.ts","../../../src/ResourceTimeline.tsx","../../../src/Document.tsx","../../../src/FhirPathDisplay.tsx","../../../src/SearchControlField.ts","../../../src/Dialog.tsx","../../../src/SearchUtils.tsx","../../../src/SearchFieldEditor.tsx","../../../src/SearchFilterValueDisplay.tsx","../../../src/SearchFilterValueInput.tsx","../../../src/SearchFilterEditor.tsx","../../../src/SearchFilterValueDialog.tsx","../../../src/MenuSeparator.tsx","../../../src/SubMenu.tsx","../../../src/SearchPopupMenu.tsx","../../../src/TitleBar.tsx","../../../src/SearchControl.tsx","../../../src/FhirPathTable.tsx","../../../../node_modules/tslib/tslib.es6.js","../../../src/HeaderSearchInput.tsx","../../../src/Logo.tsx","../../../src/PatientTimeline.tsx","../../../src/PlanDefinitionBuilder.tsx","../../../src/QuestionnaireUtils.ts","../../../src/QuestionnaireForm.tsx","../../../src/QuestionnaireBuilder.tsx","../../../src/utils.ts","../../../src/GoogleButton.tsx","../../../src/utils/recaptcha.ts","../../../src/StatusBadge.tsx","../../../src/utils/diff.ts","../../../src/utils/blame.ts","../../../src/ResourceBlame.tsx","../../../src/ResourceDiff.tsx","../../../src/ResourceHistoryTable.tsx","../../../src/CalendarInput.tsx","../../../src/Scheduler.tsx","../../../src/SignInForm.tsx","../../../src/Tab.tsx","../../../src/TabPanel.tsx","../../../src/DefaultResourceTimeline.tsx","../../../src/EncounterTimeline.tsx","../../../src/FooterLinks.tsx","../../../src/Header.tsx","../../../src/RegisterForm.tsx","../../../src/RequestGroupDisplay.tsx","../../../src/ServiceRequestTimeline.tsx","../../../src/TabList.tsx","../../../src/TabSwitch.tsx"],"sourcesContent":["import { formatAddress } from '@medplum/core';\nimport { Address } from '@medplum/fhirtypes';\nimport React from 'react';\n\nexport interface AddressDisplayProps {\n value?: Address;\n}\n\nexport function AddressDisplay(props: AddressDisplayProps): JSX.Element | null {\n const address = props.value;\n if (!address) {\n return null;\n }\n\n return <>{formatAddress(address)}</>;\n}\n","import { OperationOutcome, OperationOutcomeIssue } from '@medplum/fhirtypes';\n\nexport function getIssuesForExpression(\n outcome: OperationOutcome | undefined,\n expression: string | undefined\n): OperationOutcomeIssue[] | undefined {\n return outcome?.issue?.filter((issue) => issue.expression?.[0] === expression);\n}\n","import { OperationOutcome } from '@medplum/fhirtypes';\nimport React, { RefObject } from 'react';\nimport { getIssuesForExpression } from './utils/outcomes';\nimport './Input.css';\n\nexport interface InputProps {\n name?: string;\n type?: string;\n size?: number;\n step?: number | 'any';\n style?: React.CSSProperties;\n defaultValue?: string | number;\n required?: boolean;\n autoCapitalize?: string;\n autoComplete?: string;\n autoFocus?: boolean;\n inputRef?: RefObject<HTMLInputElement>;\n outcome?: OperationOutcome;\n placeholder?: string;\n testid?: string;\n disabled?: boolean;\n onChange?: (newValue: string) => void;\n}\n\nexport function Input(props: InputProps): JSX.Element {\n const className = 'medplum-input';\n const issues = getIssuesForExpression(props.outcome, props.name);\n const invalid = issues && issues.length > 0;\n return (\n <input\n id={props.name}\n name={props.name}\n type={getInputType(props.type)}\n size={props.size}\n step={props.step}\n className={className}\n style={props.style}\n defaultValue={props.defaultValue || ''}\n required={props.required}\n autoCapitalize={props.autoCapitalize}\n autoComplete={props.autoComplete}\n autoFocus={props.autoFocus}\n ref={props.inputRef}\n aria-invalid={invalid}\n aria-describedby={invalid ? props.name + '-errors' : ''}\n placeholder={props.placeholder}\n data-testid={props.testid}\n disabled={props.disabled}\n onChange={(e) => {\n if (props.onChange) {\n props.onChange(e.currentTarget.value);\n }\n }}\n />\n );\n}\n\n/**\n * Returns the input type for the requested type.\n * JSDOM does not support many of the valid <input> type attributes.\n * For example, it won't fire change events for <input type=\"datetime-local\">.\n * @param requestedType The optional type as requested by the parent component.\n */\nfunction getInputType(requestedType: string | undefined): string {\n const result = requestedType || 'text';\n return process.env.NODE_ENV === 'test' ? result.replace(/datetime-local|date/, 'text') : result;\n}\n","import React from 'react';\nimport './InputRow.css';\n\nexport interface InputRowProps {\n justifyContent?: string;\n children: React.ReactNode;\n}\n\nexport function InputRow(props: InputRowProps): JSX.Element {\n return (\n <div className=\"medplum-input-row\" style={{ justifyContent: props.justifyContent }}>\n {props.children}\n </div>\n );\n}\n","import { OperationOutcome } from '@medplum/fhirtypes';\nimport React, { RefObject } from 'react';\nimport { getIssuesForExpression } from './utils/outcomes';\nimport './Select.css';\n\nexport interface SelectProps {\n name?: string;\n defaultValue?: string;\n required?: boolean;\n autoFocus?: boolean;\n inputRef?: RefObject<HTMLSelectElement>;\n children: React.ReactNode;\n outcome?: OperationOutcome;\n testid?: string;\n style?: React.CSSProperties;\n onChange?: (newValue: string) => void;\n}\n\nexport function Select(props: SelectProps): JSX.Element {\n const className = 'medplum-select';\n const issues = getIssuesForExpression(props.outcome, props.name);\n const invalid = issues && issues.length > 0;\n return (\n <select\n id={props.name}\n name={props.name}\n className={className}\n defaultValue={props.defaultValue || ''}\n required={props.required}\n autoFocus={props.autoFocus}\n ref={props.inputRef}\n style={props.style}\n aria-invalid={invalid}\n aria-describedby={invalid ? props.name + '-errors' : ''}\n data-testid={props.testid}\n onChange={(e) => {\n if (props.onChange) {\n props.onChange(e.currentTarget.value);\n }\n }}\n >\n {props.children}\n </select>\n );\n}\n","import { Address } from '@medplum/fhirtypes';\nimport React, { useRef, useState } from 'react';\nimport { Input } from './Input';\nimport { InputRow } from './InputRow';\nimport { Select } from './Select';\n\nfunction getLine(address: Address, index: number): string {\n return address && address.line && address.line.length > index ? address.line[index] : '';\n}\n\nfunction setLine(address: Address, index: number, str: string): Address {\n const line: string[] = address.line || [];\n while (line.length <= index) {\n line.push('');\n }\n line[index] = str;\n return { ...address, line };\n}\n\nexport interface AddressInputProps {\n name: string;\n defaultValue?: Address;\n onChange?: (value: Address) => void;\n}\n\nexport function AddressInput(props: AddressInputProps): JSX.Element {\n const [value, setValue] = useState<Address>(props.defaultValue || {});\n\n const valueRef = useRef<Address>();\n valueRef.current = value;\n\n function setValueWrapper(newValue: Address): void {\n setValue(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n function setUse(use: string): void {\n setValueWrapper({ ...valueRef.current, use });\n }\n\n function setType(type: string): void {\n setValueWrapper({ ...valueRef.current, type });\n }\n\n function setLine1(line1: string): void {\n setValueWrapper(setLine(valueRef.current || {}, 0, line1));\n }\n\n function setLine2(line2: string): void {\n setValueWrapper(setLine(valueRef.current || {}, 1, line2));\n }\n\n function setCity(city: string): void {\n setValueWrapper({ ...valueRef.current, city });\n }\n\n function setState(state: string): void {\n setValueWrapper({ ...valueRef.current, state });\n }\n\n function setPostalCode(postalCode: string): void {\n setValueWrapper({ ...valueRef.current, postalCode });\n }\n\n return (\n <InputRow>\n <Select testid=\"address-use\" defaultValue={value?.use} onChange={setUse}>\n <option></option>\n <option>home</option>\n <option>mobile</option>\n <option>old</option>\n <option>temp</option>\n <option>work</option>\n </Select>\n <Select testid=\"address-type\" defaultValue={value?.type} onChange={setType}>\n <option></option>\n <option>postal</option>\n <option>physical</option>\n <option>both</option>\n </Select>\n <Input placeholder=\"Line 1\" defaultValue={getLine(value, 0)} onChange={setLine1} />\n <Input placeholder=\"Line 2\" defaultValue={getLine(value, 1)} onChange={setLine2} />\n <Input placeholder=\"City\" defaultValue={value.city} onChange={setCity} />\n <Input placeholder=\"State\" defaultValue={value.state} onChange={setState} />\n <Input placeholder=\"Postal Code\" defaultValue={value.postalCode} onChange={setPostalCode} />\n </InputRow>\n );\n}\n","import { Attachment } from '@medplum/fhirtypes';\nimport React from 'react';\n\nexport interface AttachmentDisplayProps {\n value?: Attachment;\n maxWidth?: number;\n}\n\nexport function AttachmentDisplay(props: AttachmentDisplayProps): JSX.Element | null {\n const value = props.value;\n const { contentType, url, title } = value ?? {};\n\n if (!url) {\n return null;\n }\n\n return (\n <div data-testid=\"attachment-display\">\n {contentType?.startsWith('image/') && (\n <img data-testid=\"attachment-image\" style={{ maxWidth: props.maxWidth }} src={url} alt={value?.title} />\n )}\n {contentType?.startsWith('video/') && (\n <video data-testid=\"attachment-video\" style={{ maxWidth: props.maxWidth }} controls={true}>\n <source type={contentType} src={url} />\n </video>\n )}\n {contentType === 'application/pdf' && !title?.endsWith('.pdf') && (\n <div data-testid=\"attachment-pdf\" style={{ maxWidth: props.maxWidth, minHeight: 400 }}>\n <iframe\n width=\"100%\"\n height=\"400\"\n src={url + '#navpanes=0'}\n allowFullScreen={true}\n frameBorder={0}\n seamless={true}\n />\n </div>\n )}\n <div data-testid=\"download-link\" style={{ padding: '2px 16px 16px 16px' }}>\n <a href={value?.url} data-testid=\"attachment-details\" target=\"_blank\" rel=\"noopener noreferrer\">\n {value?.title || 'Download'}\n </a>\n </div>\n </div>\n );\n}\n","import { Attachment } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { AttachmentDisplay } from './AttachmentDisplay';\n\nexport interface AttachmentArrayDisplayProps {\n values?: Attachment[];\n maxWidth?: number;\n}\n\nexport function AttachmentArrayDisplay(props: AttachmentArrayDisplayProps): JSX.Element {\n return (\n <div>\n {props.values &&\n props.values.map((v, index) => (\n <div key={'attatchment-' + index}>\n <AttachmentDisplay value={v} maxWidth={props.maxWidth} />\n </div>\n ))}\n </div>\n );\n}\n","import React from 'react';\nimport './Button.css';\n\nexport interface ButtonProps {\n type?: 'button' | 'submit';\n style?: React.CSSProperties;\n primary?: boolean;\n danger?: boolean;\n borderless?: boolean;\n size?: 'small' | 'medium' | 'large';\n onClick?: (e: React.MouseEvent) => void;\n children: React.ReactNode;\n label?: string;\n testid?: string;\n}\n\nexport function Button(props: ButtonProps): JSX.Element {\n const className =\n 'medplum-button' +\n (props.primary || props.type === 'submit' ? ' medplum-button-primary' : '') +\n (props.danger ? ' medplum-button-danger' : '') +\n (props.borderless ? ' medplum-button-borderless' : '') +\n (props.size ? ' medplum-button-' + props.size : '');\n return (\n <button\n type={props.type || 'button'}\n className={className}\n style={props.style}\n onClick={props.onClick}\n aria-label={props.label}\n data-testid={props.testid}\n >\n {props.children}\n </button>\n );\n}\n","import { MedplumClient, ProfileResource } from '@medplum/core';\nimport React, { createContext, useContext, useEffect, useState } from 'react';\n\nconst reactContext = createContext(undefined as MedplumContext | undefined);\n\nexport interface MedplumProviderProps {\n medplum: MedplumClient;\n children: React.ReactNode;\n}\n\nexport interface MedplumContext {\n medplum: MedplumClient;\n profile?: ProfileResource;\n loading: boolean;\n}\n\n/**\n * The MedplumProvider component provides Medplum context state.\n *\n * Medplum context includes:\n * 1) medplum - Medplum client library\n * 2) profile - The current user profile (if signed in)\n */\nexport function MedplumProvider(props: MedplumProviderProps): JSX.Element {\n const medplum = props.medplum;\n\n const [state, setState] = useState({\n profile: medplum.getProfile(),\n loading: false,\n });\n\n useEffect(() => {\n function eventListener(): void {\n setState({\n ...state,\n profile: medplum.getProfile(),\n });\n }\n\n medplum.addEventListener('change', eventListener);\n return () => medplum.removeEventListeneer('change', eventListener);\n }, [medplum, state]);\n\n const medplumContext = {\n ...state,\n medplum,\n };\n\n return <reactContext.Provider value={medplumContext}>{props.children}</reactContext.Provider>;\n}\n\n/**\n * Returns the MedplumContext instance.\n */\nexport function useMedplumContext(): MedplumContext {\n return useContext(reactContext) as MedplumContext;\n}\n\n/**\n * Returns the MedplumClient instance.\n * This is a shortcut for useMedplumContext().medplum.\n */\nexport function useMedplum(): MedplumClient {\n return useMedplumContext().medplum;\n}\n\n/**\n * Returns the current Medplum user profile (if signed in).\n * This is a shortcut for useMedplumContext().profile.\n * @returns The current user profile.\n */\nexport function useMedplumProfile(): ProfileResource | undefined {\n return useMedplumContext().profile;\n}\n","/**\n * Kills a browser event.\n * Prevents default behavior.\n * Stops event propagation.\n * @param e The event.\n */\nexport function killEvent(e: Event | React.SyntheticEvent): void {\n e.preventDefault();\n e.stopPropagation();\n}\n\n/**\n * Returns true if the element is a checkbox or a table cell containing a checkbox.\n * Table cells containing checkboxes are commonly accidentally clicked.\n * @param el The HTML DOM element.\n * @returns True if the element is a checkbox or a table cell containing a checkbox.\n */\nexport function isCheckboxCell(el: Element): boolean {\n if (isCheckboxElement(el)) {\n return true;\n }\n\n if (el instanceof HTMLTableCellElement) {\n const children = el.children;\n if (children.length === 1 && isCheckboxElement(children[0])) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction isCheckboxElement(el: Element): boolean {\n return el instanceof HTMLInputElement && el.type === 'checkbox';\n}\n","import { Attachment, Binary, OperationOutcome } from '@medplum/fhirtypes';\nimport React, { useRef } from 'react';\nimport { Button } from './Button';\nimport { useMedplum } from './MedplumProvider';\nimport { killEvent } from './utils/dom';\n\nexport interface UploadButtonProps {\n onUpload: (attachment: Attachment) => void;\n children?: React.ReactNode;\n}\n\nexport function UploadButton(props: UploadButtonProps): JSX.Element {\n const medplum = useMedplum();\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n function onFileChange(e: React.ChangeEvent): void {\n killEvent(e);\n const files = (e.target as HTMLInputElement).files;\n if (files) {\n Array.from(files).forEach(processFile);\n }\n }\n\n /**\n * Processes a single file.\n *\n * @param {File} file The file descriptor.\n */\n function processFile(file: File): void {\n if (!file) {\n return;\n }\n\n const fileName = file.name;\n if (!fileName) {\n return;\n }\n\n const filename = file.name;\n const contentType = file.type || 'application/octet-stream';\n medplum\n .createBinary(file, filename, contentType)\n .then((binary: Binary) => {\n props.onUpload({\n contentType: binary.contentType,\n url: binary.url,\n title: filename,\n });\n })\n .catch((outcome: OperationOutcome) => {\n alert(outcome?.issue?.[0]?.details?.text);\n });\n }\n\n return (\n <>\n <input\n type=\"file\"\n data-testid=\"upload-file-input\"\n style={{ display: 'none' }}\n ref={fileInputRef}\n onChange={(e) => onFileChange(e)}\n />\n <Button\n testid=\"upload-button\"\n onClick={(e) => {\n killEvent(e);\n fileInputRef.current?.click();\n }}\n >\n {props.children || 'Upload...'}\n </Button>\n </>\n );\n}\n","import { Attachment } from '@medplum/fhirtypes';\nimport React, { useRef, useState } from 'react';\nimport { AttachmentDisplay } from './AttachmentDisplay';\nimport { Button } from './Button';\nimport { UploadButton } from './UploadButton';\nimport { killEvent } from './utils/dom';\n\nexport interface AttachmentArrayInputProps {\n name: string;\n defaultValue?: Attachment[];\n arrayElement?: boolean;\n onChange?: (value: Attachment[]) => void;\n}\n\nexport function AttachmentArrayInput(props: AttachmentArrayInputProps): JSX.Element {\n const [values, setValues] = useState<Attachment[]>(props.defaultValue ?? []);\n\n const valuesRef = useRef<Attachment[]>();\n valuesRef.current = values;\n\n function setValuesWrapper(newValues: Attachment[]): void {\n setValues(newValues);\n if (props.onChange) {\n props.onChange(newValues);\n }\n }\n\n return (\n <table style={{ width: '100%' }}>\n <colgroup>\n <col width=\"90%\" />\n <col width=\"10%\" />\n </colgroup>\n <tbody>\n {values.map((v: Attachment, index: number) => (\n <tr key={`${index}-${values.length}`}>\n <td>\n <AttachmentDisplay value={v} maxWidth={200} />\n </td>\n <td className=\"medplum-right\">\n <Button\n onClick={(e) => {\n killEvent(e);\n const copy = values.slice();\n copy.splice(index, 1);\n setValuesWrapper(copy);\n }}\n >\n Remove\n </Button>\n </td>\n </tr>\n ))}\n <tr>\n <td></td>\n <td className=\"medplum-right\">\n <UploadButton\n onUpload={(attachment: Attachment) => {\n setValuesWrapper([...(valuesRef.current as Attachment[]), attachment]);\n }}\n />\n </td>\n </tr>\n </tbody>\n </table>\n );\n}\n","import { Attachment } from '@medplum/fhirtypes';\nimport React, { useState } from 'react';\nimport { AttachmentDisplay } from './AttachmentDisplay';\nimport { Button } from './Button';\nimport { UploadButton } from './UploadButton';\nimport { killEvent } from './utils/dom';\n\nexport interface AttachmentInputProps {\n name: string;\n defaultValue?: Attachment;\n arrayElement?: boolean;\n onChange?: (value: Attachment | undefined) => void;\n}\n\nexport function AttachmentInput(props: AttachmentInputProps): JSX.Element {\n const [value, setValue] = useState(props.defaultValue);\n\n function setValueWrapper(newValue: Attachment | undefined): void {\n setValue(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n if (value) {\n return (\n <>\n <AttachmentDisplay value={value} maxWidth={200} />\n <Button\n onClick={(e) => {\n killEvent(e);\n setValueWrapper(undefined);\n }}\n >\n Remove\n </Button>\n </>\n );\n }\n\n return <UploadButton onUpload={setValueWrapper} />;\n}\n","import React, { useEffect, useRef, useState } from 'react';\nimport { killEvent } from './utils/dom';\nimport './Autocomplete.css';\n\nexport interface AutocompleteProps<T> {\n name: string;\n multiple?: boolean;\n autofocus?: boolean;\n defaultValue?: T[];\n className?: string;\n placeholder?: string;\n loadOptions: (input: string, signal: AbortSignal) => Promise<T[]>;\n buildUnstructured?: (input: string) => T;\n getId: (item: T) => string;\n getIcon?: (item: T) => JSX.Element;\n getDisplay: (item: T) => JSX.Element;\n getHelpText?: (item: T) => string | undefined;\n onChange?: (values: T[]) => void;\n onCreateNew?: () => void;\n}\n\nexport function Autocomplete<T>(props: AutocompleteProps<T>): JSX.Element {\n const inputRef = useRef<HTMLInputElement>(null);\n const [focused, setFocused] = useState(false);\n const [lastValue, setLastValue] = useState('');\n const [timer, setTimer] = useState<number>();\n const [dropDownVisible, setDropDownVisible] = useState(false);\n const [values, setValues] = useState(props.defaultValue ?? []);\n const [options, setOptions] = useState<T[]>([]);\n const [selectedIndex, setSelectedIndex] = useState(-1);\n const [abortController, setAbortController] = useState<AbortController>();\n const [autoSubmit, setAutoSubmit] = useState<boolean>();\n\n const lastValueRef = useRef<string>();\n lastValueRef.current = lastValue;\n\n const timerRef = useRef<number>();\n timerRef.current = timer;\n\n const abortControllerRef = useRef<AbortController>();\n abortControllerRef.current = abortController;\n\n const autoSubmitRef = useRef<boolean>();\n autoSubmitRef.current = autoSubmit;\n\n useEffect(() => {\n return () => {\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n }\n };\n }, []);\n\n useEffect(() => {\n setValues(props.defaultValue ?? []);\n }, [props.defaultValue]);\n\n function setValuesWrapper(newValues: T[]): void {\n setValues(newValues);\n if (props.onChange) {\n props.onChange(newValues);\n }\n }\n\n /**\n * Adds an option to the list of selected options.\n * @param option The option.\n */\n function addOption(option: T): void {\n const inputElement = inputRef.current as HTMLInputElement;\n inputElement.value = '';\n\n const newValues = props.multiple ? [...values, option] : [option];\n setFocused(true);\n setDropDownVisible(false);\n setLastValue('');\n setOptions([]);\n setSelectedIndex(-1);\n setValuesWrapper(newValues);\n }\n\n function handleClick(): void {\n inputRef.current?.focus();\n }\n\n function handleFocus(): void {\n setFocused(true);\n }\n\n function handleBlur(): void {\n setFocused(false);\n dismissOnDelay();\n }\n\n /**\n * Handles an input event.\n * Clears existing timers.\n * Schedules a timer to execute the search after a short delay.\n */\n function handleInput(): void {\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n setAbortController(undefined);\n }\n\n if (timerRef.current !== undefined) {\n window.clearTimeout(timerRef.current);\n }\n\n const newTimer = window.setTimeout(() => handleTimer(), 100);\n setTimer(newTimer);\n }\n\n function handleKeyDown(e: React.KeyboardEvent): void {\n switch (e.key) {\n case 'Enter':\n case 'Tab':\n handleSelectKey(e);\n break;\n\n case 'ArrowUp':\n moveSelection(-1);\n killEvent(e);\n break;\n\n case 'ArrowDown':\n moveSelection(1);\n killEvent(e);\n break;\n\n case 'Backspace':\n handleBackspaceKey(e);\n break;\n\n case ',':\n case ';':\n handleSeparatorKey(e);\n }\n }\n\n /**\n * Handles the \"enter\" or \"tab\" keys. The enter key logic is:\n * Try to add an option with tryAddOption. On success, cancel event.\n * Otherwise, let the browser handle the enter key normally.\n *\n * @param e The key down event.\n */\n function handleSelectKey(e: React.KeyboardEvent): void {\n if (!timerRef.current && !abortControllerRef.current && tryAddOption()) {\n killEvent(e);\n inputRef.current?.focus();\n } else {\n // The user pressed enter, but we don't have results yet.\n // We need to wait for the results to come in.\n setAutoSubmit(true);\n }\n }\n\n /**\n * Handles the \"backspace\" key. The backspace key logic is:\n * If the input is empty and there is at least one item, delete the last item.\n * Otherwise, let the browser handle the backspace key normally.\n *\n * @param e The key down event.\n */\n function handleBackspaceKey(e: React.KeyboardEvent): void {\n if (inputRef.current?.value) {\n // If there is still text in the input,\n // then handle backspace as normal.\n return;\n }\n\n if (values.length > 0) {\n // If there are selected items,\n // then delete the last item.\n killEvent(e);\n setValuesWrapper(values.slice(0, values.length - 1));\n }\n }\n\n /**\n * Handles a \"separator\" key (comma, semicolon, others?).\n *\n * The separator key logic is:\n * If the drop down is visible and something is selected, choose that.\n * If the drop down is visible but nothing is selected, choose the first.\n * If there is content in the input, use that as a \"gray\" option.\n * Otherwise, ignore.\n *\n * @param e The key down event.\n */\n function handleSeparatorKey(e: React.KeyboardEvent): void {\n tryAddOption();\n killEvent(e);\n inputRef.current?.focus();\n }\n\n /**\n * Tries to capture the existing input as an option.\n *\n * @return True if captured an option; false otherwise.\n */\n function tryAddOption(): boolean {\n let option: T | undefined;\n\n if (selectedIndex >= 0 && selectedIndex < options.length) {\n // Currently highlighted row\n option = options[selectedIndex];\n } else if (selectedIndex === -1 && options.length > 0) {\n // Default to first row\n option = options[0];\n } else if (props.buildUnstructured && inputRef.current?.value) {\n // Build semi-structured item\n option = props.buildUnstructured(inputRef.current.value);\n }\n\n if (!option) {\n return false;\n }\n\n addOption(option);\n return true;\n }\n\n /**\n * Handles a timer tick event.\n * If the contents of the input have changed, sends xhr to the server\n * for updated contents.\n */\n function handleTimer(): void {\n setTimer(undefined);\n\n const value = inputRef.current?.value?.trim() || '';\n if (value === lastValueRef.current) {\n // Nothing has changed, move on\n return;\n }\n\n if (!value) {\n setDropDownVisible(false);\n setLastValue('');\n setOptions([]);\n setSelectedIndex(-1);\n return;\n }\n\n setLastValue(value);\n\n const newAbortController = new AbortController();\n setAbortController(newAbortController);\n\n props\n .loadOptions(value, newAbortController.signal)\n .then((newOptions: T[]) => {\n if (!newAbortController.signal.aborted) {\n setDropDownVisible(newOptions.length > 0);\n setOptions(newOptions);\n setAbortController(undefined);\n if (autoSubmitRef.current) {\n addOption(newOptions[0]);\n setAutoSubmit(false);\n }\n }\n })\n .catch(console.log);\n }\n\n /**\n * Moves the selected row.\n * @param delta The amount to move the selection, up is negative.\n */\n function moveSelection(delta: number): void {\n let index = selectedIndex + delta;\n\n if (index < 0) {\n index = 0;\n } else if (index >= options.length) {\n index = options.length - 1;\n }\n\n setSelectedIndex(index);\n }\n\n /**\n * Handles a hover event.\n * @param _e The mouse event.\n * @param index The drop down option index.\n */\n function handleDropDownHover(_e: React.MouseEvent, index: number): void {\n setSelectedIndex(index);\n }\n\n /**\n * Handles a click event.\n * @param e The mouse event.\n * @param option The drop down option.\n */\n function handleDropDownClick(e: React.MouseEvent, option: T): void {\n killEvent(e);\n addOption(option);\n }\n\n /**\n * Dismisses the drop down menu after a slight delay.\n */\n function dismissOnDelay(): void {\n window.setTimeout(() => {\n setDropDownVisible(false);\n }, 200);\n }\n\n const baseClassName = props.className ?? 'medplum-autocomplete-container';\n\n return (\n <div\n data-testid=\"autocomplete\"\n className={baseClassName + (focused ? ' focused' : '')}\n onClick={() => handleClick()}\n >\n <ul onClick={() => handleClick()}>\n {values.map((value) => (\n <li key={props.getId(value)} data-testid=\"selected\" className=\"medplum-autocomplete-item choice\">\n {props.getDisplay(value)}\n </li>\n ))}\n <li className=\"medplum-autocomplete-item\">\n <input\n type=\"text\"\n autoFocus={props.autofocus}\n placeholder={values.length === 0 ? props.placeholder : undefined}\n autoComplete=\"off\"\n autoCapitalize=\"off\"\n spellCheck=\"true\"\n onFocus={() => handleFocus()}\n onBlur={() => handleBlur()}\n onChange={() => handleInput()}\n onInput={() => handleInput()}\n onKeyDown={(e: React.KeyboardEvent) => handleKeyDown(e)}\n ref={inputRef}\n data-testid=\"input-element\"\n />\n </li>\n </ul>\n {dropDownVisible && (\n <div className=\"medplum-autocomplete\" data-testid=\"dropdown\">\n {options.map((option, index) => (\n <div\n key={props.getId(option)}\n className={\n index === selectedIndex\n ? 'medplum-autocomplete-row medplum-autocomplete-active'\n : 'medplum-autocomplete-row'\n }\n onMouseOver={(e) => handleDropDownHover(e, index)}\n onClick={(e) => handleDropDownClick(e, option)}\n >\n {props.getIcon && <div className=\"medplum-autocomplete-icon\">{props.getIcon(option)}</div>}\n <div className=\"medplum-autocomplete-label\">\n {props.getDisplay(option)}\n {props.getHelpText && <div className=\"medplum-autocomplete-help-text\">{props.getHelpText(option)}</div>}\n </div>\n </div>\n ))}\n {props.onCreateNew && (\n <div className=\"medplum-autocomplete-row\" onClick={props.onCreateNew}>\n <div className=\"medplum-autocomplete-label\">Create new...</div>\n </div>\n )}\n </div>\n )}\n </div>\n );\n}\n","import { Reference, Resource } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { killEvent } from './utils/dom';\n\nexport interface MedplumLinkProps {\n to?: Resource | Reference | string;\n suffix?: string;\n label?: string;\n id?: string;\n testid?: string;\n className?: string;\n onClick?: () => void;\n children: React.ReactNode;\n}\n\nexport function MedplumLink(props: MedplumLinkProps): JSX.Element {\n const navigate = useNavigate();\n\n let href = '#';\n if (props.to) {\n if (typeof props.to === 'string') {\n href = props.to;\n } else if ('resourceType' in props.to) {\n href = `/${props.to.resourceType}/${props.to.id}`;\n } else if ('reference' in props.to) {\n href = `/${props.to.reference}`;\n }\n\n if (props.suffix) {\n href += '/' + props.suffix;\n }\n }\n\n return (\n <a\n href={href}\n id={props.id}\n aria-label={props.label}\n data-testid={props.testid || 'link'}\n className={props.className}\n onClick={(e: React.SyntheticEvent) => {\n killEvent(e);\n if (props.onClick) {\n props.onClick();\n } else if (props.to) {\n navigate(href);\n }\n }}\n >\n {props.children}\n </a>\n );\n}\n","import { MedplumClient } from '@medplum/core';\nimport { Device, Reference, Resource } from '@medplum/fhirtypes';\nimport { useEffect, useState } from 'react';\nimport { useMedplum } from './MedplumProvider';\n\nconst system: Device = {\n resourceType: 'Device',\n id: 'system',\n deviceName: [\n {\n name: 'System',\n },\n ],\n};\n\n/**\n * React Hook to use a FHIR reference.\n * Handles the complexity of resolving references and caching resources.\n * @param value The resource or reference to resource.\n * @returns The resolved resource.\n */\nexport function useResource<T extends Resource>(value: Reference<T> | T | undefined): T | undefined {\n const medplum = useMedplum();\n const [resource, setResource] = useState<T | undefined>(getInitialResource(medplum, value));\n\n useEffect(() => {\n let subscribed = true;\n\n if (!resource && value && 'reference' in value && value.reference) {\n medplum\n .readReference(value as Reference<T>)\n .then((r) => {\n if (subscribed) {\n setResource(r);\n }\n })\n .catch(() => setResource(undefined));\n }\n\n return (() => (subscribed = false)) as () => void;\n }, [medplum, resource, value]);\n\n return resource;\n}\n\n/**\n * Returns the initial resource value based on the input value.\n * If the input value is a resource, returns the resource.\n * If the input value is a reference to system, returns the system resource.\n * If the input value is a reference to a resource available in the cache, returns the resource.\n * Otherwise, returns undefined.\n * @param medplum The medplum client.\n * @param value The resource or reference to resource.\n * @returns An initial resource if available; undefined otherwise.\n */\nfunction getInitialResource<T extends Resource>(\n medplum: MedplumClient,\n value: Reference<T> | T | undefined\n): T | undefined {\n if (!value) {\n return undefined;\n }\n\n if ('resourceType' in value) {\n return value;\n }\n\n if ('reference' in value) {\n if (value.reference === 'system') {\n return system as T;\n }\n\n return medplum.getCachedReference(value);\n }\n\n return undefined;\n}\n","import { getDisplayString, getImageSrc } from '@medplum/core';\nimport { Reference, Resource } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { MedplumLink } from './MedplumLink';\nimport { useResource } from './useResource';\nimport './Avatar.css';\n\nexport interface AvatarProps {\n size?: 'xsmall' | 'small' | 'medium' | 'large';\n value?: Reference | Resource;\n src?: string;\n alt?: string;\n color?: string;\n link?: boolean;\n}\n\nexport function Avatar(props: AvatarProps): JSX.Element {\n const resource = useResource(props.value);\n const className = props.size ? 'medplum-avatar ' + props.size : 'medplum-avatar';\n const text = resource ? getDisplayString(resource) : props.alt ?? '';\n const initials = text && getInitials(text);\n const imageUrl = (resource && getImageSrc(resource)) ?? props.src;\n const innerContent = imageUrl ? <img src={imageUrl} alt={text} /> : initials;\n return (\n <div className={className} style={{ backgroundColor: props.color }} data-testid=\"avatar\">\n {props.link && resource ? <MedplumLink to={resource}>{innerContent}</MedplumLink> : innerContent}\n </div>\n );\n}\n\nfunction getInitials(text: string): string {\n return text\n .split(' ')\n .map((n) => n[0])\n .join('');\n}\n","import React from 'react';\nimport './CheckboxFormSection.css';\n\nexport interface CheckboxFormSectionProps {\n htmlFor?: string;\n title?: string;\n description?: string;\n children?: React.ReactNode;\n}\n\nexport function CheckboxFormSection(props: CheckboxFormSectionProps): JSX.Element {\n return (\n <div className=\"medplum-checkbox-form-section\">\n <div className=\"medplum-checkbox-form-section-checkbox-container\">{props.children}</div>\n <div className=\"medplum-checkbox-form-section-details-container\">\n <label htmlFor={props.htmlFor}>{props.title}</label>\n <p>{props.description}</p>\n </div>\n </div>\n );\n}\n","export const DEFAULT_IGNORED_PROPERTIES = [\n 'meta',\n 'implicitRules',\n 'language',\n 'text',\n 'contained',\n 'extension',\n 'modifierExtension',\n];\n","import { OperationOutcome } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { getIssuesForExpression } from './utils/outcomes';\nimport './FormSection.css';\n\nexport interface FormSectionProps {\n title?: string;\n htmlFor?: string;\n description?: string;\n outcome?: OperationOutcome;\n children?: React.ReactNode;\n}\n\nexport function FormSection(props: FormSectionProps): JSX.Element {\n const issues = getIssuesForExpression(props.outcome, props.htmlFor);\n const invalid = issues && issues.length > 0;\n return (\n <fieldset className=\"medplum-form-section\">\n {props.title && <label htmlFor={props.htmlFor}>{props.title}</label>}\n {props.description && <p>{props.description}</p>}\n {props.children}\n {invalid && (\n <div id={props.htmlFor + '-errors'} className=\"medplum-input-error\">\n {issues?.map((issue) => (\n <div data-testid=\"text-field-error\" key={issue.details?.text}>\n {issue.details?.text}\n </div>\n ))}\n </div>\n )}\n </fieldset>\n );\n}\n","import { capitalize, IndexedStructureDefinition } from '@medplum/core';\nimport { ElementDefinition, ElementDefinitionType, OperationOutcome, Reference, Resource } from '@medplum/fhirtypes';\nimport React, { useEffect, useState } from 'react';\nimport { BackboneElementInput } from './BackboneElementInput';\nimport { Button } from './Button';\nimport { FormSection } from './FormSection';\nimport { Input } from './Input';\nimport { useMedplum } from './MedplumProvider';\nimport { useResource } from './useResource';\n\nexport interface ResourceFormProps {\n defaultValue: Resource | Reference;\n outcome?: OperationOutcome;\n onSubmit: (resource: Resource) => void;\n onDelete?: (resource: Resource) => void;\n}\n\nexport function ResourceForm(props: ResourceFormProps): JSX.Element {\n const medplum = useMedplum();\n const defaultValue = useResource(props.defaultValue);\n const [schema, setSchema] = useState<IndexedStructureDefinition | undefined>();\n const [value, setValue] = useState<Resource | undefined>();\n\n useEffect(() => {\n if (defaultValue) {\n setValue(JSON.parse(JSON.stringify(defaultValue)));\n medplum.requestSchema(defaultValue.resourceType).then(setSchema);\n }\n }, [medplum, defaultValue]);\n\n if (!schema || !value) {\n return <div>Loading...</div>;\n }\n\n return (\n <form\n noValidate\n autoComplete=\"off\"\n onSubmit={(e: React.FormEvent) => {\n e.preventDefault();\n if (props.onSubmit) {\n props.onSubmit(value);\n }\n }}\n >\n <FormSection title=\"Resource Type\">\n <Input name=\"resourceType\" defaultValue={value.resourceType} disabled={true} />\n </FormSection>\n <FormSection title=\"ID\">\n <Input name=\"id\" defaultValue={value.id} disabled={true} />\n </FormSection>\n <BackboneElementInput\n typeName={value.resourceType}\n defaultValue={value}\n outcome={props.outcome}\n onChange={setValue}\n />\n <Button type=\"submit\" size=\"large\">\n OK\n </Button>\n {props.onDelete && (\n <Button\n type=\"button\"\n size=\"large\"\n onClick={() => {\n (props.onDelete as (resource: Resource) => void)(value);\n }}\n >\n Delete\n </Button>\n )}\n </form>\n );\n}\n\nexport function setPropertyValue(\n obj: any,\n key: string,\n propName: string,\n elementDefinition: ElementDefinition,\n value: any\n): any {\n const types = elementDefinition.type as ElementDefinitionType[];\n if (types.length > 1) {\n for (const type of types) {\n const compoundKey = key.replace('[x]', capitalize(type.code as string));\n if (compoundKey in obj) {\n delete obj[compoundKey];\n }\n }\n }\n obj[propName] = value;\n return obj;\n}\n","import React from 'react';\nimport './DescriptionList.css';\n\nexport interface DescriptionListProps {\n children: React.ReactNode;\n compact?: boolean;\n}\n\nexport function DescriptionList(props: DescriptionListProps): JSX.Element {\n return <dl className={'medplum-description-list' + (props.compact ? ' compact' : '')}>{props.children}</dl>;\n}\n\nexport interface DescriptionListEntryProps {\n term: string;\n children: React.ReactNode;\n}\n\nexport function DescriptionListEntry(props: DescriptionListEntryProps): JSX.Element {\n return (\n <>\n <dt>{props.term}</dt>\n <dd>{props.children}</dd>\n </>\n );\n}\n","import { getPropertyDisplayName, globalSchema, TypedValue } from '@medplum/core';\nimport React from 'react';\nimport { DEFAULT_IGNORED_PROPERTIES } from './constants';\nimport { DescriptionList, DescriptionListEntry } from './DescriptionList';\nimport { getValueAndType, ResourcePropertyDisplay } from './ResourcePropertyDisplay';\n\nexport interface BackboneElementDisplayProps {\n value: TypedValue;\n compact?: boolean;\n ignoreMissingValues?: boolean;\n link?: boolean;\n}\n\nexport function BackboneElementDisplay(props: BackboneElementDisplayProps): JSX.Element | null {\n const typedValue = props.value;\n const value = typedValue.value;\n if (!value) {\n return null;\n }\n\n const typeName = typedValue.type;\n const typeSchema = globalSchema.types[typeName];\n if (!typeSchema) {\n return <div>{typeName} not implemented</div>;\n }\n\n if (typeof value === 'object' && 'name' in value && Object.keys(value).length === 1) {\n // Special case for common BackboneElement pattern\n // Where there is an object with a single property 'name'\n // Just display the name value.\n return <div>{value.name}</div>;\n }\n\n return (\n <DescriptionList compact={props.compact}>\n {Object.entries(typeSchema.properties).map((entry) => {\n const key = entry[0];\n if (DEFAULT_IGNORED_PROPERTIES.indexOf(key) >= 0) {\n return null;\n }\n const property = entry[1];\n const [propertyValue, propertyType] = getValueAndType(typedValue, key);\n if (\n props.ignoreMissingValues &&\n (!propertyValue || (Array.isArray(propertyValue) && propertyValue.length === 0))\n ) {\n return null;\n }\n return (\n <DescriptionListEntry key={key} term={getPropertyDisplayName(key)}>\n <ResourcePropertyDisplay\n property={property}\n propertyType={propertyType}\n value={propertyValue}\n ignoreMissingValues={props.ignoreMissingValues}\n link={props.link}\n />\n </DescriptionListEntry>\n );\n })}\n </DescriptionList>\n );\n}\n","import { Coding } from '@medplum/fhirtypes';\nimport React from 'react';\n\nexport interface CodingDisplayProps {\n value?: Coding;\n}\n\nexport function CodingDisplay(props: CodingDisplayProps): JSX.Element {\n return <>{props.value?.display || props.value?.code}</>;\n}\n","import { CodeableConcept } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { CodingDisplay } from './CodingDisplay';\n\nexport interface CodeableConceptDisplayProps {\n value?: CodeableConcept;\n}\n\nexport function CodeableConceptDisplay(props: CodeableConceptDisplayProps): JSX.Element | null {\n const value = props.value;\n if (!value) {\n return null;\n }\n\n if (value.text) {\n return <>{value.text}</>;\n }\n\n if (value.coding && value.coding.length > 0) {\n return <CodingDisplay value={value.coding[0]} />;\n }\n\n return null;\n}\n","import { ContactPoint } from '@medplum/fhirtypes';\nimport React from 'react';\n\nexport interface ContactPointDisplayProps {\n value?: ContactPoint;\n}\n\nexport function ContactPointDisplay(props: ContactPointDisplayProps): JSX.Element | null {\n const contactPoint = props.value;\n if (!contactPoint) {\n return null;\n }\n\n const builder = [];\n\n if (contactPoint.value) {\n builder.push(contactPoint.value);\n }\n\n if (contactPoint.use || contactPoint.system) {\n builder.push(' [');\n\n if (contactPoint.use) {\n builder.push(contactPoint.use);\n }\n\n if (contactPoint.use && contactPoint.system) {\n builder.push(' ');\n }\n\n if (contactPoint.system) {\n builder.push(contactPoint.system);\n }\n\n builder.push(']');\n }\n\n return <>{builder.join('').trim()}</>;\n}\n","import { ContactDetail } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { ContactPointDisplay } from './ContactPointDisplay';\n\nexport interface ContactDetailDisplayProps {\n value?: ContactDetail;\n}\n\nexport function ContactDetailDisplay(props: ContactDetailDisplayProps): JSX.Element | null {\n const contactDetail = props.value;\n if (!contactDetail) {\n return null;\n }\n\n return (\n <>\n {contactDetail.name}\n {contactDetail.name && ': '}\n {contactDetail.telecom?.map((telecom, index) => (\n <ContactPointDisplay key={'telecom-' + index} value={telecom} />\n ))}\n </>\n );\n}\n","import React from 'react';\n\nexport interface DateTimeDisplayProps {\n value?: string;\n}\n\nexport function DateTimeDisplay(props: DateTimeDisplayProps): JSX.Element | null {\n if (!props.value) {\n return null;\n }\n return <>{new Date(props.value).toLocaleString()}</>;\n}\n","import { formatHumanName, HumanNameFormatOptions } from '@medplum/core';\nimport { HumanName } from '@medplum/fhirtypes';\nimport React from 'react';\n\nexport interface HumanNameDisplayProps {\n value?: HumanName;\n options?: HumanNameFormatOptions;\n}\n\nexport function HumanNameDisplay(props: HumanNameDisplayProps): JSX.Element | null {\n const name = props.value;\n if (!name) {\n return null;\n }\n\n return <>{formatHumanName(name, props.options)}</>;\n}\n","import { Identifier } from '@medplum/fhirtypes';\nimport React from 'react';\n\nexport interface IdentifierDisplayProps {\n value?: Identifier;\n}\n\nexport function IdentifierDisplay(props: IdentifierDisplayProps): JSX.Element {\n return (\n <div>\n {props.value?.system}: {props.value?.value}\n </div>\n );\n}\n","import { Period } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { DateTimeDisplay } from './DateTimeDisplay';\n\nexport interface PeriodDisplayProps {\n value?: Period;\n}\n\nexport function PeriodDisplay(props: PeriodDisplayProps): JSX.Element | null {\n const value = props.value;\n if (!value || (!value.start && !value.end)) {\n return null;\n }\n\n return (\n <span>\n <DateTimeDisplay value={value.start} />\n -\n <DateTimeDisplay value={value.end} />\n </span>\n );\n}\n","import { Quantity } from '@medplum/fhirtypes';\nimport React from 'react';\n\nexport interface QuantityDisplayProps {\n value?: Quantity;\n}\n\nexport function QuantityDisplay(props: QuantityDisplayProps): JSX.Element | null {\n return <>{formatQuantityString(props.value)}</>;\n}\n\nexport function formatQuantityString(quantity: Quantity | undefined): string {\n if (!quantity) {\n return '';\n }\n\n const result = [];\n\n if (quantity.comparator) {\n result.push(quantity.comparator);\n result.push(' ');\n }\n\n if (quantity.value !== undefined) {\n result.push(quantity.value);\n }\n\n if (quantity.unit) {\n if (quantity.unit !== '%') {\n result.push(' ');\n }\n result.push(quantity.unit);\n }\n\n return result.join('');\n}\n","import { Range } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { formatQuantityString } from './QuantityDisplay';\n\nexport interface RangeDisplayProps {\n value?: Range;\n}\n\nexport function RangeDisplay(props: RangeDisplayProps): JSX.Element | null {\n return <>{formatRangeString(props.value)}</>;\n}\n\nexport function formatRangeString(range: Range | undefined): string {\n if (!range || (!range.low && !range.high)) {\n return '';\n }\n\n if (range.low && !range.high) {\n return `>= ${formatQuantityString(range.low)}`;\n }\n\n if (!range.low && range.high) {\n return `<= ${formatQuantityString(range.high)}`;\n }\n\n return `${formatQuantityString(range.low)} - ${formatQuantityString(range.high)}`;\n}\n","import { Ratio } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { QuantityDisplay } from './QuantityDisplay';\n\nexport interface RatioDisplayProps {\n value?: Ratio;\n}\n\nexport function RatioDisplay(props: RatioDisplayProps): JSX.Element | null {\n const value = props.value;\n if (!value) {\n return null;\n }\n\n return (\n <>\n <QuantityDisplay value={value.numerator} />\n / \n <QuantityDisplay value={value.denominator} />\n </>\n );\n}\n","import { stringify } from '@medplum/core';\nimport { Reference } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { MedplumLink } from './MedplumLink';\n\nexport interface ReferenceDisplayProps {\n value?: Reference;\n link?: boolean;\n}\n\nexport function ReferenceDisplay(props: ReferenceDisplayProps): JSX.Element | null {\n if (!props.value) {\n return null;\n }\n\n const displayString = props.value.display || props.value.reference || stringify(props.value);\n\n // The \"link\" prop defaults to \"true\"; undefined is treated as \"true\"\n // To disable the link, it must be explicitly \"false\"\n if (props.link !== false && props.value.reference) {\n return <MedplumLink to={props.value}>{displayString}</MedplumLink>;\n } else {\n return <>{displayString}</>;\n }\n}\n","import { PropertyType } from '@medplum/core';\nimport { ElementDefinition } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { ResourcePropertyDisplay } from './ResourcePropertyDisplay';\n\ninterface ResourceArrayDisplayProps {\n property: ElementDefinition;\n values: any[];\n arrayElement?: boolean;\n ignoreMissingValues?: boolean;\n link?: boolean;\n}\n\nexport function ResourceArrayDisplay(props: ResourceArrayDisplayProps): JSX.Element {\n const property = props.property;\n const values = props.values ?? [];\n const propertyType = property.type?.[0]?.code as PropertyType;\n return (\n <>\n {values.map((v: any, index: number) => (\n <div key={`${index}-${values.length}`}>\n <ResourcePropertyDisplay\n arrayElement={true}\n property={property}\n propertyType={propertyType}\n value={v}\n ignoreMissingValues={props.ignoreMissingValues}\n link={props.link}\n />\n </div>\n ))}\n </>\n );\n}\n","import { buildTypeName, getTypedPropertyValue, PropertyType, TypedValue } from '@medplum/core';\nimport { ElementDefinition } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { AddressDisplay } from './AddressDisplay';\nimport { AttachmentArrayDisplay } from './AttachmentArrayDisplay';\nimport { AttachmentDisplay } from './AttachmentDisplay';\nimport { BackboneElementDisplay } from './BackboneElementDisplay';\nimport { CodeableConceptDisplay } from './CodeableConceptDisplay';\nimport { CodingDisplay } from './CodingDisplay';\nimport { ContactDetailDisplay } from './ContactDetailDisplay';\nimport { ContactPointDisplay } from './ContactPointDisplay';\nimport { DateTimeDisplay } from './DateTimeDisplay';\nimport { HumanNameDisplay } from './HumanNameDisplay';\nimport { IdentifierDisplay } from './IdentifierDisplay';\nimport { PeriodDisplay } from './PeriodDisplay';\nimport { QuantityDisplay } from './QuantityDisplay';\nimport { RangeDisplay } from './RangeDisplay';\nimport { RatioDisplay } from './RatioDisplay';\nimport { ReferenceDisplay } from './ReferenceDisplay';\nimport { ResourceArrayDisplay } from './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\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 <div>{value === undefined ? '' : Boolean(value).toString()}</div>;\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 <div>{value}</div>;\n case PropertyType.canonical:\n return <ReferenceDisplay value={{ reference: value }} link={props.link} />;\n case PropertyType.dateTime:\n case PropertyType.instant:\n return <DateTimeDisplay value={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 <div>{value?.text}</div>;\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.Period:\n return <PeriodDisplay value={value} />;\n case PropertyType.Quantity:\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 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: buildTypeName(property?.path?.split('.') as string[]), 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","import { createReference } from '@medplum/core';\nimport { Annotation } from '@medplum/fhirtypes';\nimport React, { useRef, useState } from 'react';\nimport { Input } from './Input';\nimport { useMedplumProfile } from './MedplumProvider';\n\nexport interface AnnotationInputProps {\n name: string;\n defaultValue?: Annotation;\n onChange?: (value: Annotation) => void;\n}\n\nexport function AnnotationInput(props: AnnotationInputProps): JSX.Element {\n const author = useMedplumProfile();\n const [value, setValue] = useState<Annotation>(props.defaultValue || {});\n\n const valueRef = useRef<Annotation>();\n valueRef.current = value;\n\n function setText(text: string): void {\n const newValue: Annotation = text\n ? {\n text,\n authorReference: author && createReference(author),\n time: new Date().toISOString(),\n }\n : {};\n\n setValue(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n return (\n <Input name={props.name} type=\"text\" placeholder=\"Annotation text\" defaultValue={value.text} onChange={setText} />\n );\n}\n","import React, { RefObject } from 'react';\nimport './Checkbox.css';\n\nexport interface CheckboxProps {\n name?: string;\n defaultValue?: boolean | number;\n required?: boolean;\n inputRef?: RefObject<HTMLInputElement>;\n testid?: string;\n disabled?: boolean;\n onChange?: (newValue: boolean) => void;\n}\n\nexport function Checkbox(props: CheckboxProps): JSX.Element {\n const className = 'medplum-checkbox';\n return (\n <input\n id={props.name}\n name={props.name}\n className={className}\n type=\"checkbox\"\n value=\"true\"\n defaultChecked={!!props.defaultValue}\n required={props.required}\n ref={props.inputRef}\n data-testid={props.testid}\n disabled={props.disabled}\n onChange={(e) => {\n if (props.onChange) {\n props.onChange(e.currentTarget.checked);\n }\n }}\n />\n );\n}\n","import { stringify } from '@medplum/core';\nimport {\n CodeableConcept,\n ElementDefinition,\n ValueSet,\n ValueSetExpansion,\n ValueSetExpansionContains,\n} from '@medplum/fhirtypes';\nimport React from 'react';\nimport { Autocomplete } from './Autocomplete';\nimport { useMedplum } from './MedplumProvider';\n\nexport interface CodeableConceptInputProps {\n property: ElementDefinition;\n name: string;\n defaultValue?: CodeableConcept;\n onChange?: (value: CodeableConcept) => void;\n}\n\nexport function CodeableConceptInput(props: CodeableConceptInputProps): JSX.Element {\n const medplum = useMedplum();\n\n let defaultValue = undefined;\n if (props.defaultValue) {\n defaultValue = [props.defaultValue];\n }\n\n return (\n <Autocomplete\n loadOptions={(input: string): Promise<CodeableConcept[]> => {\n const system = props.property.binding?.valueSet as string;\n return medplum.searchValueSet(system, input).then((valueSet: ValueSet) => {\n return ((valueSet.expansion as ValueSetExpansion).contains as ValueSetExpansionContains[]).map(\n valueSetElementToCodeableConcept\n );\n });\n }}\n buildUnstructured={buildUnstructured}\n getId={getId}\n getDisplay={getDisplay}\n name={props.name}\n defaultValue={defaultValue}\n onChange={(values: CodeableConcept[]) => {\n if (props.onChange) {\n props.onChange(values[0]);\n }\n }}\n />\n );\n}\n\nfunction valueSetElementToCodeableConcept(element: ValueSetExpansionContains): CodeableConcept {\n return {\n text: element.display,\n coding: [\n {\n system: element.system,\n code: element.code,\n display: element.display,\n },\n ],\n };\n}\n\nfunction buildUnstructured(str: string): CodeableConcept {\n return { text: str };\n}\n\nfunction getId(concept: CodeableConcept): string {\n if (concept.coding && concept.coding.length > 0) {\n return concept.coding[0].code as string;\n }\n return stringify(concept);\n}\n\nfunction getDisplay(concept: CodeableConcept): JSX.Element {\n const text = concept.coding?.[0]?.display ?? concept.coding?.[0]?.code ?? concept.text;\n return <>{text}</>;\n}\n","import { ElementDefinition, ValueSet, ValueSetExpansion, ValueSetExpansionContains } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { Autocomplete } from './Autocomplete';\nimport { useMedplum } from './MedplumProvider';\n\nexport interface CodeInputProps {\n property: ElementDefinition;\n name: string;\n defaultValue?: string;\n onChange?: (value: string) => void;\n}\n\nconst cachedDisplayValues: Record<string, string> = {};\n\nexport function CodeInput(props: CodeInputProps): JSX.Element {\n const medplum = useMedplum();\n\n let defaultValue = undefined;\n if (props.defaultValue) {\n defaultValue = [props.defaultValue];\n }\n\n return (\n <Autocomplete\n loadOptions={(input: string): Promise<string[]> => {\n const system = props.property.binding?.valueSet as string;\n return medplum.searchValueSet(system, input).then((valueSet: ValueSet) => {\n const contains = (valueSet.expansion as ValueSetExpansion).contains as ValueSetExpansionContains[];\n contains.forEach((e) => (cachedDisplayValues[e.code as string] = e.display as string));\n return contains.map((e) => e.code as string);\n });\n }}\n buildUnstructured={(str: string) => str}\n getId={(item: string) => item}\n getDisplay={(item: string) => <>{cachedDisplayValues[item] || item}</>}\n name={props.name}\n defaultValue={defaultValue}\n onChange={(values: string[]) => {\n if (props.onChange) {\n props.onChange(values[0]);\n }\n }}\n />\n );\n}\n","import { Coding, ElementDefinition, ValueSet, ValueSetExpansion, ValueSetExpansionContains } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { Autocomplete } from './Autocomplete';\nimport { CodingDisplay } from './CodingDisplay';\nimport { useMedplum } from './MedplumProvider';\n\nexport interface CodingInputProps {\n property: ElementDefinition;\n name: string;\n defaultValue?: Coding;\n onChange?: (value: Coding) => void;\n}\n\nexport function CodingInput(props: CodingInputProps): JSX.Element {\n const medplum = useMedplum();\n\n let defaultValue = undefined;\n if (props.defaultValue) {\n defaultValue = [props.defaultValue];\n }\n\n return (\n <Autocomplete\n loadOptions={(input: string): Promise<Coding[]> => {\n const system = props.property.binding?.valueSet as string;\n return medplum.searchValueSet(system, input).then((valueSet: ValueSet) => {\n return ((valueSet.expansion as ValueSetExpansion).contains as ValueSetExpansionContains[]).map(\n (e) =>\n ({\n system: e.system,\n code: e.code,\n display: e.display,\n } as Coding)\n );\n });\n }}\n buildUnstructured={(str: string) => ({ code: str })}\n getId={(item: Coding) => item.code as string}\n getDisplay={(item: Coding) => <CodingDisplay value={item} />}\n name={props.name}\n defaultValue={defaultValue}\n onChange={(values: Coding[]) => {\n if (props.onChange) {\n props.onChange(values[0]);\n }\n }}\n />\n );\n}\n","import { ContactPoint } from '@medplum/fhirtypes';\nimport React, { useRef, useState } from 'react';\nimport { Input } from './Input';\nimport { InputRow } from './InputRow';\nimport { Select } from './Select';\n\nexport interface ContactPointInputProps {\n name: string;\n defaultValue?: ContactPoint;\n onChange?: (value: ContactPoint | undefined) => void;\n}\n\nexport function ContactPointInput(props: ContactPointInputProps): JSX.Element {\n const [contactPoint, setContactPoint] = useState(props.defaultValue);\n\n const ref = useRef<ContactPoint>();\n ref.current = contactPoint;\n\n function setContactPointWrapper(newValue: ContactPoint | undefined): void {\n if (newValue && Object.keys(newValue).length === 0) {\n newValue = undefined;\n }\n setContactPoint(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n function setSystem(system: string): void {\n const newValue: ContactPoint = { ...ref.current, system };\n if (!system) {\n delete newValue.system;\n }\n setContactPointWrapper(newValue);\n }\n\n function setUse(use: string): void {\n const newValue: ContactPoint = { ...ref.current, use };\n if (!use) {\n delete newValue.use;\n }\n setContactPointWrapper(newValue);\n }\n\n function setValue(value: string): void {\n const newValue: ContactPoint = { ...ref.current, value };\n if (!value) {\n delete newValue.value;\n }\n setContactPointWrapper(newValue);\n }\n\n return (\n <InputRow>\n <Select defaultValue={contactPoint?.system} onChange={setSystem} testid=\"system\">\n <option></option>\n <option>email</option>\n <option>fax</option>\n <option>pager</option>\n <option>phone</option>\n <option>other</option>\n <option>sms</option>\n </Select>\n <Select defaultValue={contactPoint?.use} onChange={setUse} testid=\"use\">\n <option></option>\n <option>home</option>\n <option>mobile</option>\n <option>old</option>\n <option>temp</option>\n <option>work</option>\n </Select>\n <Input placeholder=\"Value\" defaultValue={contactPoint?.value} onChange={setValue} />\n </InputRow>\n );\n}\n","import { ContactDetail, ContactPoint } from '@medplum/fhirtypes';\nimport React, { useRef, useState } from 'react';\nimport { ContactPointInput } from './ContactPointInput';\nimport { Input } from './Input';\nimport { InputRow } from './InputRow';\n\nexport interface ContactDetailInputProps {\n name: string;\n defaultValue?: ContactDetail;\n onChange?: (value: ContactDetail) => void;\n}\n\nexport function ContactDetailInput(props: ContactDetailInputProps): JSX.Element {\n const [contactPoint, setContactDetail] = useState(props.defaultValue);\n\n const ref = useRef<ContactDetail>();\n ref.current = contactPoint;\n\n function setContactDetailWrapper(newValue: ContactDetail): void {\n setContactDetail(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n function setName(name: string): void {\n const newValue: ContactDetail = { ...ref.current, name };\n if (!name) {\n delete newValue.name;\n }\n setContactDetailWrapper(newValue);\n }\n\n function setTelecom(telecom: ContactPoint | undefined): void {\n const newValue: ContactDetail = { ...ref.current, telecom: telecom && [telecom] };\n if (!telecom) {\n delete newValue.telecom;\n }\n setContactDetailWrapper(newValue);\n }\n\n return (\n <InputRow>\n <Input\n name={props.name + '-name'}\n placeholder=\"Name\"\n style={{ width: 180 }}\n defaultValue={contactPoint?.name}\n onChange={setName}\n />\n <ContactPointInput\n name={props.name + '-telecom'}\n defaultValue={contactPoint?.telecom?.[0]}\n onChange={setTelecom}\n />\n </InputRow>\n );\n}\n","import React from 'react';\nimport { Input, InputProps } from './Input';\n\n/**\n * The DateTimeInput component is a wrapper around the HTML5 input type=\"datetime-local\".\n * The main purpose is to reconcile time zones.\n * Most of our date/time values are in ISO-8601, which includes a time zone offset.\n * The datetime-local input does not support the time zone offset.\n * @param props The Input props.\n * @returns The JSX element to render.\n */\nexport function DateTimeInput(props: InputProps): JSX.Element {\n return (\n <Input\n {...props}\n type=\"datetime-local\"\n defaultValue={convertIsoToLocal(props.defaultValue as string | undefined)}\n onChange={(newValue: string) => {\n if (props.onChange) {\n props.onChange(convertLocalToIso(newValue));\n }\n }}\n />\n );\n}\n\n/**\n * Converts an ISO-8601 date/time string to a local date/time string.\n * @param isoString The ISO-8601 date/time string to convert.\n * @returns The local date/time string.\n */\nexport function convertIsoToLocal(isoString: string | undefined): string {\n if (!isoString) {\n return '';\n }\n\n // Convert the ISO-8601 date to a local datetime-local value.\n // See: https://developer.mozilla.org/en-US/docs/Web/HTML/Date_and_time_formats#local_date_and_time_strings\n // See: https://stackoverflow.com/a/60368477\n const date = new Date(isoString);\n if (!isValidDate(date)) {\n // If the input string was malformed, return an empty string.\n return '';\n }\n\n return date.toLocaleDateString('sv') + 'T' + date.toLocaleTimeString('sv');\n}\n\n/**\n * Converts a local date/time string to an ISO-8601 date/time string.\n * @param localString The local date/time string to convert.\n * @returns The ISO-8601 date/time string.\n */\nexport function convertLocalToIso(localString: string | undefined): string {\n if (!localString) {\n return '';\n }\n\n // Try to parse the local string as a Date\n // JavaScript's Date() constructor defaults to the local time zone.\n // The Date() constructor will throw if the value is malformed.\n const date = new Date(localString);\n if (!isValidDate(date)) {\n // If the input string was malformed, return an empty string.\n return '';\n }\n\n return date.toISOString();\n}\n\nfunction isValidDate(date: Date): boolean {\n return date instanceof Date && !isNaN(date.getTime());\n}\n","import { OperationOutcome } from '@medplum/fhirtypes';\nimport React, { RefObject } from 'react';\nimport { getIssuesForExpression } from './utils/outcomes';\nimport './TextArea.css';\n\nexport interface TextAreaProps {\n name?: string;\n defaultValue?: string;\n required?: boolean;\n autoComplete?: string;\n autoFocus?: boolean;\n inputRef?: RefObject<HTMLTextAreaElement>;\n outcome?: OperationOutcome;\n placeholder?: string;\n testid?: string;\n monospace?: boolean;\n style?: React.CSSProperties;\n onChange?: (newValue: string) => void;\n}\n\nexport function TextArea(props: TextAreaProps): JSX.Element {\n const className = 'medplum-textarea' + (props.monospace ? ' monospace' : '');\n const issues = getIssuesForExpression(props.outcome, props.name);\n const invalid = issues && issues.length > 0;\n return (\n <textarea\n id={props.name}\n name={props.name}\n className={className}\n defaultValue={props.defaultValue || ''}\n required={props.required}\n autoComplete={props.autoComplete}\n autoFocus={props.autoFocus}\n ref={props.inputRef}\n aria-invalid={invalid}\n aria-describedby={invalid ? props.name + '-errors' : ''}\n placeholder={props.placeholder}\n data-testid={props.testid}\n style={props.style}\n onChange={(e) => {\n if (props.onChange) {\n props.onChange(e.currentTarget.value);\n }\n }}\n />\n );\n}\n","import { stringify } from '@medplum/core';\nimport { Extension } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { TextArea } from './TextArea';\n\nexport interface ExtensionInputProps {\n name: string;\n defaultValue?: Extension;\n onChange?: (value: Extension) => void;\n}\n\nexport function ExtensionInput(props: ExtensionInputProps): JSX.Element {\n return (\n <TextArea\n testid=\"extension-input\"\n name={props.name}\n defaultValue={stringify(props.defaultValue)}\n monospace={true}\n onChange={(newValue: string) => {\n if (props.onChange) {\n props.onChange(JSON.parse(newValue));\n }\n }}\n />\n );\n}\n","import { HumanName } from '@medplum/fhirtypes';\nimport React, { useRef, useState } from 'react';\nimport { Input } from './Input';\nimport { InputRow } from './InputRow';\nimport { Select } from './Select';\n\nexport interface HumanNameInputProps {\n name: string;\n defaultValue?: HumanName;\n onChange?: (value: HumanName) => void;\n}\n\nexport function HumanNameInput(props: HumanNameInputProps): JSX.Element {\n const [value, setValue] = useState<HumanName | undefined>(props.defaultValue);\n\n const valueRef = useRef<HumanName>();\n valueRef.current = value;\n\n function setValueWrapper(newValue: HumanName): void {\n setValue(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n function setUse(use: string): void {\n setValueWrapper({ ...valueRef.current, use: use ? use : undefined });\n }\n\n function setPrefix(prefix: string): void {\n setValueWrapper({\n ...valueRef.current,\n prefix: prefix ? prefix.split(' ') : undefined,\n });\n }\n\n function setGiven(given: string): void {\n setValueWrapper({\n ...valueRef.current,\n given: given ? given.split(' ') : undefined,\n });\n }\n\n function setFamily(family: string): void {\n setValueWrapper({\n ...valueRef.current,\n family: family ? family : undefined,\n });\n }\n\n function setSuffix(suffix: string): void {\n setValueWrapper({\n ...valueRef.current,\n suffix: suffix ? suffix.split(' ') : undefined,\n });\n }\n\n return (\n <InputRow>\n <Select defaultValue={value?.use} onChange={setUse} testid=\"use\">\n <option></option>\n <option>usual</option>\n <option>official</option>\n <option>temp</option>\n <option>nickname</option>\n <option>anonymous</option>\n <option>old</option>\n <option>maiden</option>\n </Select>\n <Input placeholder=\"Prefix\" defaultValue={value?.prefix?.join(' ')} onChange={setPrefix} />\n <Input placeholder=\"Given\" defaultValue={value?.given?.join(' ')} onChange={setGiven} />\n <Input placeholder=\"Family\" defaultValue={value?.family} onChange={setFamily} />\n <Input placeholder=\"Suffix\" defaultValue={value?.suffix?.join(' ')} onChange={setSuffix} />\n </InputRow>\n );\n}\n","import { Identifier } from '@medplum/fhirtypes';\nimport React, { useState } from 'react';\nimport { Input } from './Input';\nimport { InputRow } from './InputRow';\n\nexport interface IdentifierInputProps {\n name: string;\n defaultValue?: Identifier;\n onChange?: (value: Identifier) => void;\n}\n\nexport function IdentifierInput(props: IdentifierInputProps): JSX.Element {\n const [value, setValue] = useState(props.defaultValue);\n\n function setValueWrapper(newValue: Identifier): void {\n setValue(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n return (\n <InputRow>\n <Input\n placeholder=\"System\"\n defaultValue={value?.system}\n onChange={(newValue) => setValueWrapper({ ...value, system: newValue })}\n />\n <Input\n placeholder=\"Value\"\n defaultValue={value?.value}\n onChange={(newValue) => setValueWrapper({ ...value, value: newValue })}\n />\n </InputRow>\n );\n}\n","import { Period } from '@medplum/fhirtypes';\nimport React, { useState } from 'react';\nimport { Input } from './Input';\nimport { InputRow } from './InputRow';\n\nexport interface PeriodInputProps {\n name: string;\n defaultValue?: Period;\n onChange?: (value: Period) => void;\n}\n\nexport function PeriodInput(props: PeriodInputProps): JSX.Element {\n const [value, setValue] = useState(props.defaultValue);\n\n function setValueWrapper(newValue: Period): void {\n setValue(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n return (\n <InputRow>\n <Input\n type=\"datetime-local\"\n placeholder=\"Start\"\n defaultValue={value?.start}\n onChange={(newValue) => setValueWrapper({ ...value, start: newValue })}\n />\n <Input\n type=\"datetime-local\"\n placeholder=\"End\"\n defaultValue={value?.end}\n onChange={(newValue) => setValueWrapper({ ...value, end: newValue })}\n />\n </InputRow>\n );\n}\n","import { Quantity } from '@medplum/fhirtypes';\nimport React, { useState } from 'react';\nimport { Input } from './Input';\nimport { InputRow } from './InputRow';\nimport { Select } from './Select';\n\nexport interface QuantityInputProps {\n name: string;\n defaultValue?: Quantity;\n onChange?: (value: Quantity) => void;\n}\n\nexport function QuantityInput(props: QuantityInputProps): JSX.Element {\n const [value, setValue] = useState(props.defaultValue);\n\n function setValueWrapper(newValue: Quantity): void {\n setValue(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n return (\n <InputRow>\n <Select\n style={{ width: 80 }}\n testid={props.name + '-comparator'}\n defaultValue={value?.comparator}\n onChange={(newValue) =>\n setValueWrapper({\n ...value,\n comparator: newValue,\n })\n }\n >\n <option></option>\n <option><</option>\n <option><=</option>\n <option>>=</option>\n <option>></option>\n </Select>\n <Input\n name={props.name}\n type=\"number\"\n step=\"any\"\n placeholder=\"Value\"\n defaultValue={value?.value?.toString()}\n onChange={(newValue) =>\n setValueWrapper({\n ...value,\n value: tryParseNumber(newValue),\n })\n }\n />\n <Input\n placeholder=\"Unit\"\n defaultValue={value?.unit}\n onChange={(newValue) =>\n setValueWrapper({\n ...value,\n unit: newValue,\n })\n }\n />\n </InputRow>\n );\n}\n\nfunction tryParseNumber(str: string): number | undefined {\n if (!str) {\n return undefined;\n }\n return parseFloat(str);\n}\n","import { Range } from '@medplum/fhirtypes';\nimport React, { useState } from 'react';\nimport { InputRow } from './InputRow';\nimport { QuantityInput } from './QuantityInput';\n\nexport interface RangeInputProps {\n name: string;\n defaultValue?: Range;\n onChange?: (value: Range) => void;\n}\n\n/**\n * Renders a Range input.\n * See: https://www.hl7.org/fhir/datatypes.html#Range\n * @param props Range input properties.\n * @returns Range input element.\n */\nexport function RangeInput(props: RangeInputProps): JSX.Element {\n const [value, setValue] = useState(props.defaultValue);\n\n function setValueWrapper(newValue: Range): void {\n setValue(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n return (\n <InputRow>\n <QuantityInput\n name={props.name + '-low'}\n defaultValue={value?.low}\n onChange={(v) =>\n setValueWrapper({\n ...value,\n low: v,\n })\n }\n />\n <QuantityInput\n name={props.name + '-high'}\n defaultValue={value?.high}\n onChange={(v) =>\n setValueWrapper({\n ...value,\n high: v,\n })\n }\n />\n </InputRow>\n );\n}\n","import { Ratio } from '@medplum/fhirtypes';\nimport React, { useState } from 'react';\nimport { InputRow } from './InputRow';\nimport { QuantityInput } from './QuantityInput';\n\nexport interface RatioInputProps {\n name: string;\n defaultValue?: Ratio;\n onChange?: (value: Ratio) => void;\n}\n\n/**\n * Renders a Ratio input.\n * See: https://www.hl7.org/fhir/datatypes.html#Ratio\n * @param props Ratio input properties.\n * @returns Ratio input element.\n */\nexport function RatioInput(props: RatioInputProps): JSX.Element {\n const [value, setValue] = useState(props.defaultValue);\n\n function setValueWrapper(newValue: Ratio): void {\n setValue(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n return (\n <InputRow>\n <QuantityInput\n name={props.name + '-numerator'}\n defaultValue={value?.numerator}\n onChange={(v) =>\n setValueWrapper({\n ...value,\n numerator: v,\n })\n }\n />\n <QuantityInput\n name={props.name + '-denominator'}\n defaultValue={value?.denominator}\n onChange={(v) =>\n setValueWrapper({\n ...value,\n denominator: v,\n })\n }\n />\n </InputRow>\n );\n}\n","import { getDisplayString } from '@medplum/core';\nimport { Reference, Resource } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { MedplumLink } from './MedplumLink';\nimport { useResource } from './useResource';\n\nexport interface ResourceNameProps {\n value?: Reference | Resource;\n link?: boolean;\n}\n\nexport function ResourceName(props: ResourceNameProps): JSX.Element | null {\n const resource = useResource(props.value);\n if (!resource) {\n return null;\n }\n\n const text = getDisplayString(resource);\n\n return props.link ? <MedplumLink to={resource}>{text}</MedplumLink> : <span>{text}</span>;\n}\n","import { Bundle, BundleEntry, Reference, Resource, ResourceType } from '@medplum/fhirtypes';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { Autocomplete } from './Autocomplete';\nimport { Avatar } from './Avatar';\nimport { useMedplum } from './MedplumProvider';\nimport { ResourceName } from './ResourceName';\nimport { useResource } from './useResource';\n\nexport interface ResourceInputProps<T extends Resource = Resource> {\n readonly resourceType: string;\n readonly name: string;\n readonly defaultValue?: T | Reference<T>;\n readonly className?: string;\n readonly placeholder?: string;\n readonly onChange?: (value: T | undefined) => void;\n}\n\nexport function ResourceInput<T extends Resource = Resource>(props: ResourceInputProps<T>): JSX.Element {\n const medplum = useMedplum();\n const defaultResource = useResource(props.defaultValue);\n const [value, setValue] = useState<T>();\n\n const resourceTypeRef = useRef<string>(props.resourceType);\n resourceTypeRef.current = props.resourceType;\n\n useEffect(() => {\n setValue(defaultResource);\n }, [defaultResource]);\n\n function setValueWrapper(newValue: T | undefined): void {\n setValue(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n return (\n <Autocomplete\n loadOptions={(input: string): Promise<T[]> => {\n return medplum\n .search(resourceTypeRef.current as ResourceType, 'name=' + encodeURIComponent(input) + '&_count=10')\n .then((bundle: Bundle) => (bundle.entry as BundleEntry[]).map((entry) => entry.resource as T));\n }}\n getId={(item: T) => {\n return item.id as string;\n }}\n getIcon={(item: T) => <Avatar value={item} />}\n getDisplay={(item: T) => <ResourceName value={item} />}\n getHelpText={(item: T) => {\n if (item.resourceType === 'Patient' && item.birthDate) {\n return 'DoB: ' + item.birthDate;\n }\n return undefined;\n }}\n name={props.name}\n defaultValue={value ? [value] : undefined}\n className={props.className}\n placeholder={props.placeholder}\n onChange={(items: T[]) => {\n setValueWrapper(items.length > 0 ? items[0] : undefined);\n }}\n />\n );\n}\n","import { createReference } from '@medplum/core';\nimport { Reference, Resource } from '@medplum/fhirtypes';\nimport React, { useRef, useState } from 'react';\nimport { Input } from './Input';\nimport { InputRow } from './InputRow';\nimport { ResourceInput } from './ResourceInput';\nimport { Select } from './Select';\n\nexport interface ReferenceInputProps {\n name: string;\n defaultValue?: Reference;\n targetTypes?: string[];\n onChange?: (value: Reference | undefined) => void;\n}\n\nexport function ReferenceInput(props: ReferenceInputProps): JSX.Element {\n const targetTypes = props.targetTypes;\n const initialResourceType = getInitialResourceType(props.defaultValue, targetTypes);\n const [value, setValue] = useState<Reference | undefined>(props.defaultValue);\n const [resourceType, setResourceType] = useState<string | undefined>(initialResourceType);\n\n const valueRef = useRef<Reference>();\n valueRef.current = value;\n\n const resourceTypeRef = useRef<string>();\n resourceTypeRef.current = resourceType;\n\n function setValueHelper(newValue: Reference | undefined): void {\n setValue(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n return (\n <InputRow>\n {targetTypes ? (\n <Select testid=\"reference-input-resource-type-select\" defaultValue={resourceType} onChange={setResourceType}>\n {targetTypes.map((targetType) => (\n <option key={targetType} value={targetType}>\n {targetType}\n </option>\n ))}\n </Select>\n ) : (\n <Input testid=\"reference-input-resource-type-input\" defaultValue={resourceType} onChange={setResourceType} />\n )}\n <ResourceInput\n resourceType={resourceType as string}\n name={props.name + '-id'}\n defaultValue={value}\n onChange={(item: Resource | undefined) => {\n setValueHelper(item ? createReference(item) : undefined);\n }}\n />\n </InputRow>\n );\n}\n\nfunction getInitialResourceType(\n defaultValue: Reference | undefined,\n targetTypes: string[] | undefined\n): string | undefined {\n const defaultValueResourceType = defaultValue?.reference?.split('/')[0];\n if (defaultValueResourceType) {\n return defaultValueResourceType;\n }\n\n if (targetTypes && targetTypes.length > 0) {\n return targetTypes[0];\n }\n\n return undefined;\n}\n","import { ElementDefinition } from '@medplum/fhirtypes';\nimport React, { useRef, useState } from 'react';\nimport { Button } from './Button';\nimport { ResourcePropertyInput } from './ResourcePropertyInput';\nimport { killEvent } from './utils/dom';\n\ninterface ResourceArrayInputProps {\n property: ElementDefinition;\n name: string;\n defaultValue?: any[];\n arrayElement?: boolean;\n onChange?: (value: any[]) => void;\n}\n\nexport function ResourceArrayInput(props: ResourceArrayInputProps): JSX.Element {\n const [values, setValues] = useState(props.defaultValue ?? []);\n\n const valuesRef = useRef<any[]>();\n valuesRef.current = values;\n\n function setValuesWrapper(newValues: any[]): void {\n setValues(newValues);\n if (props.onChange) {\n props.onChange(newValues);\n }\n }\n\n return (\n <table style={{ width: '100%', borderCollapse: 'collapse' }}>\n <colgroup>\n <col width=\"90%\" />\n <col width=\"10%\" />\n </colgroup>\n <tbody>\n {values.map((v, index) => (\n <tr key={`${index}-${values.length}`}>\n <td>\n <ResourcePropertyInput\n arrayElement={true}\n property={props.property}\n name={props.name + '.' + index}\n defaultValue={v}\n onChange={(newValue: any) => {\n const copy = [...(valuesRef.current as any[])];\n copy[index] = newValue;\n setValuesWrapper(copy);\n }}\n />\n </td>\n <td style={{ textAlign: 'right' }}>\n <Button\n onClick={(e) => {\n killEvent(e);\n const copy = [...(valuesRef.current as any[])];\n copy.splice(index, 1);\n setValuesWrapper(copy);\n }}\n >\n Remove\n </Button>\n </td>\n </tr>\n ))}\n <tr>\n <td></td>\n <td style={{ textAlign: 'right' }}>\n <Button\n onClick={(e) => {\n killEvent(e);\n const copy = [...(valuesRef.current as any[])];\n copy.push(undefined);\n setValuesWrapper(copy);\n }}\n >\n Add\n </Button>\n </td>\n </tr>\n </tbody>\n </table>\n );\n}\n","import { buildTypeName, capitalize, PropertyType } from '@medplum/core';\nimport { ElementDefinition, ElementDefinitionType, OperationOutcome } from '@medplum/fhirtypes';\nimport React, { useState } from 'react';\nimport { AddressInput } from './AddressInput';\nimport { AnnotationInput } from './AnnotationInput';\nimport { AttachmentArrayInput } from './AttachmentArrayInput';\nimport { AttachmentInput } from './AttachmentInput';\nimport { BackboneElementInput } from './BackboneElementInput';\nimport { Checkbox } from './Checkbox';\nimport { CodeableConceptInput } from './CodeableConceptInput';\nimport { CodeInput } from './CodeInput';\nimport { CodingInput } from './CodingInput';\nimport { ContactDetailInput } from './ContactDetailInput';\nimport { ContactPointInput } from './ContactPointInput';\nimport { DateTimeInput } from './DateTimeInput';\nimport { ExtensionInput } from './ExtensionInput';\nimport { HumanNameInput } from './HumanNameInput';\nimport { IdentifierInput } from './IdentifierInput';\nimport { Input } from './Input';\nimport { InputRow } from './InputRow';\nimport { PeriodInput } from './PeriodInput';\nimport { QuantityInput } from './QuantityInput';\nimport { RangeInput } from './RangeInput';\nimport { RatioInput } from './RatioInput';\nimport { ReferenceInput } from './ReferenceInput';\nimport { ResourceArrayInput } from './ResourceArrayInput';\nimport { Select } from './Select';\nimport { TextArea } from './TextArea';\n\nexport interface ResourcePropertyInputProps {\n property: ElementDefinition;\n name: string;\n defaultPropertyType?: PropertyType;\n defaultValue?: any;\n arrayElement?: boolean;\n onChange?: (value: any, propName?: string) => void;\n outcome?: OperationOutcome;\n}\n\nexport function ResourcePropertyInput(props: ResourcePropertyInputProps): JSX.Element {\n const property = props.property;\n const propertyType = props.defaultPropertyType ?? (property.type?.[0]?.code as PropertyType);\n const name = props.name;\n const value = props.defaultValue;\n\n if (property.max === '*' && !props.arrayElement) {\n if (propertyType === 'Attachment') {\n return <AttachmentArrayInput name={name} defaultValue={value} onChange={props.onChange} />;\n }\n return <ResourceArrayInput property={property} name={name} defaultValue={value} onChange={props.onChange} />;\n }\n\n const propertyTypes = property.type as ElementDefinitionType[];\n if (propertyTypes.length > 1) {\n return <ElementDefinitionInputSelector elementDefinitionTypes={propertyTypes} {...props} />;\n } else {\n return <ElementDefinitionTypeInput elementDefinitionType={propertyTypes[0]} {...props} />;\n }\n}\n\nexport interface ElementDefinitionSelectorProps extends ResourcePropertyInputProps {\n elementDefinitionTypes: ElementDefinitionType[];\n}\n\nexport function ElementDefinitionInputSelector(props: ElementDefinitionSelectorProps): JSX.Element {\n const propertyTypes = props.elementDefinitionTypes;\n let initialPropertyType: ElementDefinitionType | undefined = undefined;\n if (props.defaultPropertyType) {\n initialPropertyType = propertyTypes.find((t) => t.code === props.defaultPropertyType) as ElementDefinitionType;\n }\n if (!initialPropertyType) {\n initialPropertyType = propertyTypes[0];\n }\n const [selectedType, setSelectedType] = useState(initialPropertyType);\n return (\n <InputRow>\n <Select\n style={{ width: '200px' }}\n defaultValue={selectedType?.code}\n onChange={(newValue) => {\n setSelectedType(\n propertyTypes.find((type: ElementDefinitionType) => type.code === newValue) as ElementDefinitionType\n );\n }}\n >\n {propertyTypes.map((type: ElementDefinitionType) => (\n <option key={type.code} value={type.code}>\n {type.code}\n </option>\n ))}\n </Select>\n <ElementDefinitionTypeInput\n {...props}\n elementDefinitionType={selectedType}\n onChange={(newValue: any) => {\n if (props.onChange) {\n props.onChange(newValue, props.name.replace('[x]', capitalize(selectedType.code as string)));\n }\n }}\n />\n </InputRow>\n );\n}\n\nexport interface ElementDefinitionTypeInputProps extends ResourcePropertyInputProps {\n elementDefinitionType: ElementDefinitionType;\n}\n\nexport function ElementDefinitionTypeInput(props: ElementDefinitionTypeInputProps): JSX.Element {\n const property = props.property;\n const propertyType = props.elementDefinitionType.code as PropertyType;\n const name = props.name;\n const value = props.defaultValue;\n\n switch (propertyType) {\n // 2.24.0.1 Primitive Types\n // https://www.hl7.org/fhir/datatypes.html#primitive\n\n case PropertyType.SystemString:\n case PropertyType.canonical:\n case PropertyType.string:\n case PropertyType.time:\n case PropertyType.uri:\n case PropertyType.url:\n return (\n <Input\n type=\"text\"\n name={name}\n testid={name}\n defaultValue={value}\n onChange={props.onChange}\n outcome={props.outcome}\n />\n );\n case PropertyType.date:\n return (\n <Input\n type=\"date\"\n name={name}\n testid={name}\n defaultValue={value}\n onChange={props.onChange}\n outcome={props.outcome}\n />\n );\n case PropertyType.dateTime:\n case PropertyType.instant:\n return (\n <DateTimeInput\n type=\"datetime-local\"\n name={name}\n testid={name}\n defaultValue={value}\n onChange={props.onChange}\n outcome={props.outcome}\n />\n );\n case PropertyType.decimal:\n case PropertyType.integer:\n case PropertyType.positiveInt:\n case PropertyType.unsignedInt:\n return (\n <Input\n type=\"number\"\n step={propertyType === PropertyType.decimal ? 'any' : 1}\n name={name}\n testid={name}\n defaultValue={value}\n onChange={(newValue) => {\n if (props.onChange) {\n props.onChange(parseFloat(newValue));\n }\n }}\n outcome={props.outcome}\n />\n );\n case PropertyType.code:\n return <CodeInput property={property} name={name} defaultValue={value} onChange={props.onChange} />;\n case PropertyType.boolean:\n return (\n <Checkbox\n name={name}\n testid={name}\n defaultValue={!!value}\n onChange={(newValue) => {\n if (props.onChange) {\n props.onChange(newValue);\n }\n }}\n />\n );\n case PropertyType.markdown:\n return <TextArea name={name} testid={name} defaultValue={value} onChange={props.onChange} />;\n\n // 2.24.0.2 Complex Types\n // https://www.hl7.org/fhir/datatypes.html#complex\n\n case PropertyType.Address:\n return <AddressInput name={name} defaultValue={value} onChange={props.onChange} />;\n case PropertyType.Annotation:\n return <AnnotationInput name={name} defaultValue={value} onChange={props.onChange} />;\n case PropertyType.Attachment:\n return <AttachmentInput name={name} defaultValue={value} onChange={props.onChange} />;\n case PropertyType.CodeableConcept:\n return <CodeableConceptInput property={property} name={name} defaultValue={value} onChange={props.onChange} />;\n case PropertyType.Coding:\n return <CodingInput property={property} name={name} defaultValue={value} onChange={props.onChange} />;\n case PropertyType.ContactDetail:\n return <ContactDetailInput name={name} defaultValue={value} onChange={props.onChange} />;\n case PropertyType.ContactPoint:\n return <ContactPointInput name={name} defaultValue={value} onChange={props.onChange} />;\n case PropertyType.Extension:\n return <ExtensionInput name={name} defaultValue={value} onChange={props.onChange} />;\n case PropertyType.HumanName:\n return <HumanNameInput name={name} defaultValue={value} onChange={props.onChange} />;\n case PropertyType.Identifier:\n return <IdentifierInput name={name} defaultValue={value} onChange={props.onChange} />;\n case PropertyType.Period:\n return <PeriodInput name={name} defaultValue={value} onChange={props.onChange} />;\n case PropertyType.Quantity:\n return <QuantityInput name={name} defaultValue={value} onChange={props.onChange} />;\n case PropertyType.Range:\n return <RangeInput name={name} defaultValue={value} onChange={props.onChange} />;\n case PropertyType.Ratio:\n return <RatioInput name={name} defaultValue={value} onChange={props.onChange} />;\n case PropertyType.Reference:\n return (\n <ReferenceInput\n name={name}\n defaultValue={value}\n targetTypes={getTargetTypes(property)}\n onChange={props.onChange}\n />\n );\n default:\n return (\n <BackboneElementInput\n typeName={buildTypeName(property.path?.split('.') as string[])}\n defaultValue={value}\n onChange={props.onChange}\n outcome={props.outcome}\n />\n );\n }\n}\n\nfunction getTargetTypes(property?: ElementDefinition): string[] | undefined {\n return property?.type?.[0]?.targetProfile?.map((p) => p.split('/').pop() as string);\n}\n","import { getPropertyDisplayName, globalSchema } from '@medplum/core';\nimport { OperationOutcome } from '@medplum/fhirtypes';\nimport React, { useState } from 'react';\nimport { CheckboxFormSection } from './CheckboxFormSection';\nimport { DEFAULT_IGNORED_PROPERTIES } from './constants';\nimport { FormSection } from './FormSection';\nimport { setPropertyValue } from './ResourceForm';\nimport { getValueAndType } from './ResourcePropertyDisplay';\nimport { ResourcePropertyInput } from './ResourcePropertyInput';\n\nexport interface BackboneElementInputProps {\n typeName: string;\n defaultValue?: any;\n outcome?: OperationOutcome;\n onChange?: (value: any) => void;\n}\n\nexport function BackboneElementInput(props: BackboneElementInputProps): JSX.Element {\n const [value, setValue] = useState<any>(props.defaultValue ?? {});\n\n function setValueWrapper(newValue: any): void {\n setValue(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n const typeName = props.typeName;\n const typeSchema = globalSchema.types[typeName];\n if (!typeSchema) {\n return <div>{typeName} not implemented</div>;\n }\n\n const typedValue = { type: typeName, value };\n\n return (\n <>\n {Object.entries(typeSchema.properties).map((entry) => {\n const key = entry[0];\n if (key === 'id' || DEFAULT_IGNORED_PROPERTIES.indexOf(key) >= 0) {\n return null;\n }\n const property = entry[1];\n if (!property.type) {\n return null;\n }\n\n const [propertyValue, propertyType] = getValueAndType(typedValue, key);\n\n if (property.type.length === 1 && property.type[0].code === 'boolean') {\n return (\n <CheckboxFormSection\n key={key}\n title={getPropertyDisplayName(key)}\n description={property.definition}\n htmlFor={key}\n >\n <ResourcePropertyInput\n property={property}\n name={key}\n defaultValue={propertyValue}\n defaultPropertyType={propertyType}\n outcome={props.outcome}\n onChange={(newValue: any, propName?: string) => {\n setValueWrapper(setPropertyValue(value, key, propName ?? key, entry[1], newValue));\n }}\n />\n </CheckboxFormSection>\n );\n }\n\n return (\n <FormSection\n key={key}\n title={getPropertyDisplayName(key)}\n description={property.definition}\n htmlFor={key}\n outcome={props.outcome}\n >\n <ResourcePropertyInput\n property={property}\n name={key}\n defaultValue={propertyValue}\n defaultPropertyType={propertyType}\n outcome={props.outcome}\n onChange={(newValue: any, propName?: string) => {\n setValueWrapper(setPropertyValue(value, key, propName ?? key, entry[1], newValue));\n }}\n />\n </FormSection>\n );\n })}\n </>\n );\n}\n","import { Reference, Resource } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { Avatar } from './Avatar';\nimport { ResourceName } from './ResourceName';\nimport './ResourceBadge.css';\n\nexport interface ResourceBadgeProps {\n value?: Reference | Resource;\n size?: 'xsmall' | 'small' | 'medium' | 'large';\n link?: boolean;\n}\n\nexport function ResourceBadge(props: ResourceBadgeProps): JSX.Element {\n return (\n <div className=\"medplum-resource-badge\">\n <Avatar size={props.size ?? 'small'} value={props.value} link={props.link} />\n <ResourceName value={props.value} link={props.link} />\n </div>\n );\n}\n","import { capitalize } from '@medplum/core';\nimport {\n DiagnosticReport,\n Observation,\n ObservationComponent,\n ObservationReferenceRange,\n Reference,\n} from '@medplum/fhirtypes';\nimport React from 'react';\nimport { CodeableConceptDisplay } from './CodeableConceptDisplay';\nimport { DateTimeDisplay } from './DateTimeDisplay';\nimport { MedplumLink } from './MedplumLink';\nimport { QuantityDisplay } from './QuantityDisplay';\nimport { RangeDisplay } from './RangeDisplay';\nimport { ResourceBadge } from './ResourceBadge';\nimport { useResource } from './useResource';\nimport './DiagnosticReportDisplay.css';\nimport './Table.css';\n\nexport interface DiagnosticReportDisplayProps {\n value?: DiagnosticReport | Reference<DiagnosticReport>;\n}\n\nexport function DiagnosticReportDisplay(props: DiagnosticReportDisplayProps): JSX.Element | null {\n const diagnosticReport = useResource(props.value);\n const specimen = useResource(diagnosticReport?.specimen?.[0]);\n if (!diagnosticReport) {\n return null;\n }\n\n let textContent = '';\n\n if (diagnosticReport.presentedForm && diagnosticReport.presentedForm.length > 0) {\n const pf = diagnosticReport.presentedForm[0];\n if (pf.contentType?.startsWith('text/plain') && pf.data) {\n textContent = window.atob(pf.data);\n }\n }\n\n if (specimen?.note) {\n for (const note of specimen.note) {\n textContent += note.text + '\\n\\n';\n }\n }\n\n return (\n <div className=\"medplum-diagnostic-report\">\n <h1>Diagnostic Report</h1>\n <div className=\"medplum-diagnostic-report-header\">\n {diagnosticReport.subject && (\n <dl>\n <dt>Subject</dt>\n <dd>\n <ResourceBadge value={diagnosticReport.subject} link={true} />\n </dd>\n </dl>\n )}\n {diagnosticReport.resultsInterpreter &&\n diagnosticReport.resultsInterpreter.map((interpreter) => (\n <dl key={interpreter.reference}>\n <dt>Interpreter</dt>\n <dd>\n <ResourceBadge value={interpreter} link={true} />\n </dd>\n </dl>\n ))}\n {diagnosticReport.issued && (\n <dl>\n <dt>Issued</dt>\n <dd>\n <DateTimeDisplay value={diagnosticReport.issued} />\n </dd>\n </dl>\n )}\n {diagnosticReport.status && (\n <dl>\n <dt>Status</dt>\n <dd>{capitalize(diagnosticReport.status)}</dd>\n </dl>\n )}\n </div>\n {diagnosticReport.result && <ObservationTable value={diagnosticReport.result} />}\n {textContent && <pre>{textContent.trim()}</pre>}\n </div>\n );\n}\n\nexport interface ObservationTableProps {\n value?: Observation[] | Reference<Observation>[];\n}\n\nexport function ObservationTable(props: ObservationTableProps): JSX.Element {\n return (\n <table className=\"medplum-table\">\n <thead>\n <tr>\n <th>Test</th>\n <th>Value</th>\n <th>Reference Range</th>\n <th>Interpretation</th>\n </tr>\n </thead>\n <tbody>\n {props.value?.map((observation, index) => (\n <ObservationRow key={'obs-' + index} value={observation} />\n ))}\n </tbody>\n </table>\n );\n}\n\ninterface ObservationRowProps {\n value: Observation | Reference<Observation>;\n}\n\nfunction ObservationRow(props: ObservationRowProps): JSX.Element | null {\n const observation = useResource(props.value);\n if (!observation) {\n return null;\n }\n\n return (\n <tr>\n <td>\n <MedplumLink to={observation}>\n <CodeableConceptDisplay value={observation.code} />\n </MedplumLink>\n </td>\n <td>\n <ObservationValueDisplay value={observation} />\n </td>\n <td>\n <ReferenceRangeDisplay value={observation.referenceRange} />\n </td>\n <td>\n {observation.interpretation && observation.interpretation.length > 0 && (\n <CodeableConceptDisplay value={observation.interpretation[0]} />\n )}\n </td>\n </tr>\n );\n}\n\ninterface ObservationValueDisplayProps {\n value?: Observation | ObservationComponent;\n}\n\nfunction ObservationValueDisplay(props: ObservationValueDisplayProps): JSX.Element | null {\n const obs = props.value;\n\n if (obs?.valueQuantity) {\n return <QuantityDisplay value={props.value?.valueQuantity} />;\n }\n\n if (obs?.valueString) {\n return <>{obs.valueString}</>;\n }\n\n if (obs && 'component' in obs && obs?.component) {\n return (\n <>\n {obs.component\n .map<React.ReactNode>((component: ObservationComponent, index: number) => (\n <ObservationValueDisplay key={`obs-${index}`} value={component} />\n ))\n .reduce((prev, curr) => [prev, ' / ', curr])}\n </>\n );\n }\n\n return null;\n}\n\ninterface ReferenceRangeProps {\n value?: ObservationReferenceRange[];\n}\n\nfunction ReferenceRangeDisplay(props: ReferenceRangeProps): JSX.Element | null {\n const range = props.value && props.value.length > 0 && props.value[0];\n if (!range) {\n return null;\n }\n return <RangeDisplay value={range} />;\n}\n","/**\n * Parses an HTML form and returns the result as a JavaScript object.\n * @param form The HTML form element.\n */\nexport function parseForm(form: HTMLFormElement): Record<string, string> {\n const result: Record<string, string> = {};\n\n for (const element of Array.from(form.elements)) {\n if (element instanceof HTMLInputElement) {\n parseInputElement(result, element);\n } else if (element instanceof HTMLTextAreaElement) {\n result[element.name] = element.value;\n } else if (element instanceof HTMLSelectElement) {\n parseSelectElement(result, element);\n }\n }\n\n return result;\n}\n\n/**\n * Parses an HTML input element.\n * Sets the name/value pair in the result,\n * but only if the element is enabled and checked.\n * @param el The input element.\n * @param result The result builder.\n */\nfunction parseInputElement(result: Record<string, string>, el: HTMLInputElement): void {\n if (el.disabled) {\n // Ignore disabled elements\n return;\n }\n\n if ((el.type === 'checkbox' || el.type === 'radio') && !el.checked) {\n // Ignore unchecked radio or checkbox elements\n return;\n }\n\n result[el.name] = el.value;\n}\n\n/**\n * Parses an HTML select element.\n * Sets the name/value pair if one is selected.\n * @param result The result builder.\n * @param el The select element.\n */\nfunction parseSelectElement(result: Record<string, string>, el: HTMLSelectElement): void {\n result[el.name] = el.value;\n}\n","import React, { CSSProperties } from 'react';\nimport { parseForm } from './FormUtils';\n\nexport interface FormProps {\n onSubmit?: (formData: Record<string, string>) => void;\n style?: CSSProperties;\n children?: React.ReactNode;\n testid?: string;\n}\n\nexport function Form(props: FormProps): JSX.Element {\n return (\n <form\n style={props.style}\n data-testid={props.testid}\n onSubmit={(e: React.SyntheticEvent) => {\n e.preventDefault();\n const formData = parseForm(e.target as HTMLFormElement);\n if (props.onSubmit) {\n props.onSubmit(formData);\n }\n }}\n >\n {props.children}\n </form>\n );\n}\n","import React from 'react';\nimport './Loading.css';\n\nexport function Loading(): JSX.Element {\n return (\n <div role=\"progressbar\" aria-busy=\"true\" className=\"medplum-loading\">\n <div className=\"medplum-loading-container\">\n <svg className=\"medplum-loading-spinner\" viewBox=\"0 0 100 100\">\n <circle cx=\"50\" cy=\"50\" r=\"40\" />\n </svg>\n </div>\n </div>\n );\n}\n","import React from 'react';\nimport './MenuItem.css';\n\ninterface MenuItemProps {\n onClick: () => void;\n label?: string;\n children: React.ReactNode;\n}\n\nexport function MenuItem(props: MenuItemProps): JSX.Element {\n return (\n <div className=\"medplum-menu-item\" onClick={() => props.onClick()} aria-label={props.label}>\n {props.children}\n </div>\n );\n}\n","import { getPropertyDisplayName, IndexedStructureDefinition, stringify, toTypedValue } from '@medplum/core';\nimport { Resource } from '@medplum/fhirtypes';\nimport React, { useEffect, useState } from 'react';\nimport { useMedplum } from './MedplumProvider';\nimport { getValueAndType, ResourcePropertyDisplay } from './ResourcePropertyDisplay';\nimport './ResourceDiff.css';\nimport './ResourceDiffTable.css';\n\nexport interface ResourceDiffTableProps {\n original: Resource;\n revised: Resource;\n}\n\nexport function ResourceDiffTable(props: ResourceDiffTableProps): JSX.Element | null {\n const medplum = useMedplum();\n const [schema, setSchema] = useState<IndexedStructureDefinition | undefined>();\n\n useEffect(() => {\n medplum.requestSchema(props.original.resourceType).then(setSchema);\n }, [medplum, props.original.resourceType]);\n\n if (!schema) {\n return null;\n }\n\n const typeSchema = schema.types[props.original.resourceType];\n if (!typeSchema) {\n return null;\n }\n\n return (\n <table className=\"medplum-diff-table\">\n <colgroup>\n <col style={{ width: '30%' }} />\n <col style={{ width: '35%' }} />\n <col style={{ width: '35%' }} />\n </colgroup>\n <thead>\n <tr>\n <th>Property</th>\n <th>Before</th>\n <th>After</th>\n </tr>\n </thead>\n <tbody>\n {Object.entries(typeSchema.properties).map((entry) => {\n const key = entry[0];\n if (key === 'id' || key === 'meta') {\n return null;\n }\n\n const property = entry[1];\n const [originalPropertyValue, originalPropertyType] = getValueAndType(toTypedValue(props.original), key);\n const [revisedPropertyValue, revisedPropertyType] = getValueAndType(toTypedValue(props.revised), key);\n if (isEmpty(originalPropertyValue) && isEmpty(revisedPropertyValue)) {\n return null;\n }\n\n if (stringify(originalPropertyValue) === stringify(revisedPropertyValue)) {\n return null;\n }\n\n return (\n <tr key={key}>\n <td>{getPropertyDisplayName(key)}</td>\n <td className=\"medplum-diff-removed\">\n <ResourcePropertyDisplay\n property={property}\n propertyType={originalPropertyType}\n value={originalPropertyValue}\n ignoreMissingValues={true}\n />\n </td>\n <td className=\"medplum-diff-added\">\n <ResourcePropertyDisplay\n property={property}\n propertyType={revisedPropertyType}\n value={revisedPropertyValue}\n ignoreMissingValues={true}\n />\n </td>\n </tr>\n );\n })}\n </tbody>\n </table>\n );\n}\n\nfunction isEmpty(value: unknown): boolean {\n return (\n !value ||\n (Array.isArray(value) && value.length === 0) ||\n (typeof value === 'object' && Object.keys(value).length === 0)\n );\n}\n","import { IndexedStructureDefinition } from '@medplum/core';\nimport { Reference, Resource } from '@medplum/fhirtypes';\nimport React, { useEffect, useState } from 'react';\nimport { BackboneElementDisplay } from './BackboneElementDisplay';\nimport { useMedplum } from './MedplumProvider';\nimport { useResource } from './useResource';\n\nexport interface ResourceTableProps {\n value: Resource | Reference;\n ignoreMissingValues?: boolean;\n}\n\nexport function ResourceTable(props: ResourceTableProps): JSX.Element | null {\n const medplum = useMedplum();\n const value = useResource(props.value);\n const [schema, setSchema] = useState<IndexedStructureDefinition | undefined>();\n\n useEffect(() => {\n if (value) {\n medplum.requestSchema(value.resourceType).then(setSchema);\n }\n }, [medplum, value]);\n\n if (!schema || !value) {\n return null;\n }\n\n return (\n <BackboneElementDisplay\n value={{ type: value.resourceType, value }}\n ignoreMissingValues={props.ignoreMissingValues}\n />\n );\n}\n","import React from 'react';\nimport './Scrollable.css';\n\nexport interface ScrollableProps {\n readonly role?: string;\n readonly className?: string;\n readonly height?: number;\n readonly children: React.ReactNode;\n}\n\nexport function Scrollable(props: ScrollableProps): JSX.Element {\n const containerHeight = props.height || '100%';\n const contentHeight = props.height ? props.height + 25 : '100%';\n const className = 'medplum-scrollable-content' + (props.className ? ` ${props.className}` : '');\n return (\n <div className=\"medplum-scrollable-container\" style={{ height: containerHeight }}>\n <div className={className} role={props.role} style={{ height: contentHeight }}>\n {props.children}\n </div>\n </div>\n );\n}\n","import React, { ErrorInfo, ReactNode } from 'react';\n\nexport interface ErrorBoundaryProps {\n children: ReactNode;\n}\n\nexport interface ErrorBoundaryState {\n error?: any;\n}\n\n/**\n * ErrorBoundary is a React component that handles errors in its child components.\n * See: https://reactjs.org/docs/error-boundaries.html\n */\nexport class ErrorBoundary extends React.Component<ErrorBoundaryProps, ErrorBoundaryState> {\n state: ErrorBoundaryState;\n\n constructor(props: ErrorBoundaryProps) {\n super(props);\n this.state = {};\n }\n\n static getDerivedStateFromError(error: any): ErrorBoundaryState {\n return { error };\n }\n\n componentDidCatch(error: Error, errorInfo: ErrorInfo): void {\n console.error('Uncaught error:', error, errorInfo);\n }\n\n render(): ReactNode {\n if (this.state.error) {\n return <h1>Something went wrong.</h1>;\n }\n\n return this.props.children;\n }\n}\n","import React, { useEffect, useRef } from 'react';\nimport { Location, useLocation } from 'react-router-dom';\nimport './Popup.css';\n\ninterface PopupProps {\n visible: boolean;\n anchor?: DOMRectReadOnly;\n modal?: boolean;\n autoClose?: boolean;\n onClose: () => void;\n activeClassName?: string;\n inactiveClassName?: string;\n children?: React.ReactNode;\n}\n\nexport function Popup(props: PopupProps): JSX.Element {\n const ref = useRef<HTMLDivElement>(null);\n\n // Track browser URL location, and the location when the popup becomes visible\n const location = useLocation();\n const locationRef = useRef<Location>();\n if (props.visible) {\n if (locationRef.current === undefined) {\n locationRef.current = location;\n }\n } else {\n locationRef.current = undefined;\n }\n\n const propsRef = useRef<PopupProps>();\n propsRef.current = props;\n\n // Listen for clicks outside of the popup\n // If the user clicks outside of the popup, close it\n useEffect(() => {\n function handleClick(e: Event): void {\n if (\n propsRef.current?.visible &&\n propsRef.current?.autoClose &&\n ref?.current &&\n !ref.current.contains(e.target as Node)\n ) {\n props.onClose();\n }\n }\n\n document.addEventListener('click', handleClick, true);\n return () => document.removeEventListener('click', handleClick, true);\n }, [props]);\n\n // Listen for changes in the location\n // If the browser navigates to a new page, close the popup\n useEffect(() => {\n if (props.visible && location !== locationRef.current) {\n props.onClose();\n }\n }, [location, props]);\n\n const style: React.CSSProperties = {\n display: props.visible ? 'block' : 'none',\n };\n\n if (props.anchor) {\n if (props.anchor.right + 250 < document.body.clientWidth) {\n style.left = props.anchor.right + 'px';\n } else {\n style.right = document.body.clientWidth - props.anchor.left + 'px';\n }\n\n if (props.anchor.top + 300 < document.body.clientHeight) {\n style.top = props.anchor.top + 'px';\n } else {\n style.bottom = document.body.clientHeight - props.anchor.top + 'px';\n }\n }\n\n return (\n <>\n {props.modal && (\n <div className={props.visible ? 'medplum-backdrop active' : 'medplum-backdrop'} onClick={props.onClose} />\n )}\n <div\n ref={ref}\n className={'medplum-popup ' + (props.visible ? props.activeClassName : props.inactiveClassName)}\n style={style}\n data-testid=\"popup\"\n >\n {props.children}\n </div>\n </>\n );\n}\n","import { getReferenceString } from '@medplum/core';\nimport { Reference, Resource } from '@medplum/fhirtypes';\nimport React, { useState } from 'react';\nimport { Avatar } from './Avatar';\nimport { Button } from './Button';\nimport { DateTimeDisplay } from './DateTimeDisplay';\nimport { ErrorBoundary } from './ErrorBoundary';\nimport { MedplumLink } from './MedplumLink';\nimport { Popup } from './Popup';\nimport { ResourceName } from './ResourceName';\nimport { killEvent } from './utils/dom';\nimport './Timeline.css';\n\nexport interface TimelineProps {\n children?: React.ReactNode;\n}\n\nexport function Timeline(props: TimelineProps): JSX.Element {\n return <main className=\"medplum-document medplum-timeline\">{props.children}</main>;\n}\n\nexport interface TimelineItemProps {\n resource: Resource;\n profile?: Reference;\n socialEnabled?: boolean;\n children?: React.ReactNode;\n padding?: boolean;\n className?: string;\n popupMenuItems?: React.ReactNode;\n}\n\nexport function TimelineItem(props: TimelineItemProps): JSX.Element {\n const [popupAnchor, setPopupAnchor] = useState<DOMRect | undefined>();\n const author = props.profile ?? props.resource.meta?.author;\n return (\n <article className={props.className || 'medplum-timeline-item'} data-testid=\"timeline-item\">\n <div className=\"medplum-timeline-item-header\">\n <div className=\"medplum-timeline-item-avatar\">\n <Avatar value={author} link={true} size=\"medium\" />\n </div>\n <div className=\"medplum-timeline-item-title\">\n <ResourceName value={author} link={true} />\n <div className=\"medplum-timeline-item-subtitle\">\n <MedplumLink to={props.resource}>\n <DateTimeDisplay value={props.resource.meta?.lastUpdated} />\n </MedplumLink>\n <span>·</span>\n <MedplumLink to={props.resource}>{props.resource.resourceType}</MedplumLink>\n </div>\n </div>\n {props.popupMenuItems && (\n <div className=\"medplum-timeline-item-actions\">\n <a\n href=\"#\"\n aria-label={`Actions for ${getReferenceString(props.resource)}`}\n onClick={(e) => {\n killEvent(e);\n const el = e.currentTarget;\n const rect = el.getBoundingClientRect();\n setPopupAnchor(rect);\n }}\n >\n <svg fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <g transform=\"translate(-446 -350)\">\n <path d=\"M458 360a2 2 0 1 1-4 0 2 2 0 0 1 4 0m6 0a2 2 0 1 1-4 0 2 2 0 0 1 4 0m-12 0a2 2 0 1 1-4 0 2 2 0 0 1 4 0\"></path>\n </g>\n </svg>\n </a>\n </div>\n )}\n </div>\n <ErrorBoundary>\n {props.padding && <div style={{ padding: '2px 16px 16px 16px' }}>{props.children}</div>}\n {!props.padding && <>{props.children}</>}\n </ErrorBoundary>\n {props.socialEnabled && (\n <div className=\"medplum-timeline-item-footer\">\n <Button borderless={true}>Like</Button>\n <Button borderless={true}>Comment</Button>\n </div>\n )}\n {props.popupMenuItems && (\n <Popup visible={!!popupAnchor} anchor={popupAnchor} autoClose={true} onClose={() => setPopupAnchor(undefined)}>\n {props.popupMenuItems}\n </Popup>\n )}\n </article>\n );\n}\n","import { Resource } from '@medplum/fhirtypes';\n\n/**\n * Sorts an array of resources in place by meta.lastUpdated ascending.\n * @param resources Array of resources.\n */\nexport function sortByDateAndPriority(resources: Resource[]): void {\n resources.sort(resourceDateComparator);\n}\n\nfunction resourceDateComparator(a: Resource, b: Resource): number {\n const priority1 = getPriorityScore(a);\n const priority2 = getPriorityScore(b);\n if (priority1 > priority2) {\n return 1;\n }\n if (priority1 < priority2) {\n return -1;\n }\n return getTime(a) - getTime(b);\n}\n\nfunction getPriorityScore(resource: Resource): number {\n const priority = (resource as any).priority;\n if (typeof priority === 'string') {\n return { stat: 4, asap: 3, urgent: 2 }[priority] || 0;\n }\n return 0;\n}\n\nfunction getTime(resource: Resource): number {\n if (resource.resourceType === 'Communication' && resource.sent) {\n return new Date(resource.sent).getTime();\n }\n\n if (\n (resource.resourceType === 'DiagnosticReport' ||\n resource.resourceType === 'Media' ||\n resource.resourceType === 'Observation') &&\n resource.issued\n ) {\n return new Date(resource.issued).getTime();\n }\n\n if (resource.resourceType === 'DocumentReference' && resource.date) {\n return new Date(resource.date).getTime();\n }\n\n const dateTime = resource.meta?.lastUpdated;\n if (!dateTime) {\n return 0;\n }\n return new Date(dateTime).getTime();\n}\n","import { getReferenceString, ProfileResource } from '@medplum/core';\nimport {\n Attachment,\n AuditEvent,\n Bundle,\n BundleEntry,\n Communication,\n DiagnosticReport,\n Media,\n Reference,\n Resource,\n} from '@medplum/fhirtypes';\nimport React, { useCallback, useEffect, useRef, useState } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { AttachmentDisplay } from './AttachmentDisplay';\nimport { Button } from './Button';\nimport { DiagnosticReportDisplay } from './DiagnosticReportDisplay';\nimport { Form } from './Form';\nimport { Input } from './Input';\nimport { Loading } from './Loading';\nimport { useMedplum } from './MedplumProvider';\nimport { MenuItem } from './MenuItem';\nimport { ResourceDiffTable } from './ResourceDiffTable';\nimport { ResourceTable } from './ResourceTable';\nimport { Scrollable } from './Scrollable';\nimport { Timeline, TimelineItem } from './Timeline';\nimport { UploadButton } from './UploadButton';\nimport { useResource } from './useResource';\nimport { sortByDateAndPriority } from './utils/date';\nimport './ResourceTimeline.css';\n\nexport interface ResourceTimelineProps<T extends Resource> {\n value: T | Reference<T>;\n buildSearchRequests: (resource: T) => Bundle;\n createCommunication?: (resource: T, sender: ProfileResource, text: string) => Communication;\n createMedia?: (resource: T, operator: ProfileResource, attachment: Attachment) => Media;\n}\n\nexport function ResourceTimeline<T extends Resource>(props: ResourceTimelineProps<T>): JSX.Element {\n const navigate = useNavigate();\n const medplum = useMedplum();\n const sender = medplum.getProfile() as ProfileResource;\n const inputRef = useRef<HTMLInputElement>(null);\n const resource = useResource(props.value);\n const [history, setHistory] = useState<Bundle>();\n const [items, setItems] = useState<Resource[]>([]);\n const buildSearchRequests = props.buildSearchRequests;\n\n const itemsRef = useRef<Resource[]>(items);\n itemsRef.current = items;\n\n const loadTimeline = useCallback(() => {\n if (!resource) {\n setItems([]);\n setHistory({} as Bundle);\n return;\n }\n medplum.executeBatch(buildSearchRequests(resource)).then(handleBatchResponse);\n }, [medplum, resource, buildSearchRequests]);\n\n useEffect(() => {\n loadTimeline();\n }, [loadTimeline]);\n\n /**\n * Handles a batch request response.\n * @param batchResponse The batch response.\n */\n function handleBatchResponse(batchResponse: Bundle): void {\n const newItems = [];\n\n if (batchResponse.entry) {\n for (const batchEntry of batchResponse.entry) {\n const bundle = batchEntry.resource as Bundle;\n if (!bundle) {\n // User may not have access to all resource types\n continue;\n }\n\n if (bundle.type === 'history') {\n setHistory(bundle);\n }\n\n if (bundle.entry) {\n for (const entry of bundle.entry) {\n newItems.push(entry.resource as Resource);\n }\n }\n }\n\n sortByDateAndPriority(newItems);\n newItems.reverse();\n }\n\n setItems(newItems);\n }\n\n /**\n * Adds an array of resources to the timeline.\n * @param resources Array of resources.\n */\n function addResources(resources: Resource[]): void {\n const newItems = [...itemsRef.current, ...resources];\n sortByDateAndPriority(newItems);\n newItems.reverse();\n setItems(newItems);\n }\n\n /**\n * Adds a Communication resource to the timeline.\n * @param contentString The comment content.\n */\n function createComment(contentString: string): void {\n if (!resource || !props.createCommunication) {\n // Encounter not loaded yet\n return;\n }\n medplum.createResource(props.createCommunication(resource, sender, contentString)).then((result) => {\n addResources([result]);\n });\n }\n\n /**\n * Adds a Media resource to the timeline.\n * @param attachment The media attachment.\n */\n function createMedia(attachment: Attachment): void {\n if (!resource || !props.createMedia) {\n // Encounter not loaded yet\n return;\n }\n medplum.createResource(props.createMedia(resource, sender, attachment)).then((result) => {\n addResources([result]);\n });\n }\n\n function setPriority(communication: Communication, priority: string): Promise<Communication> {\n return medplum.updateResource({ ...communication, priority });\n }\n\n function onPin(communication: Communication): void {\n setPriority(communication, 'stat').then(loadTimeline);\n }\n\n function onUnpin(communication: Communication): void {\n setPriority(communication, 'routine').then(loadTimeline);\n }\n\n function onDetails(timelineItem: Resource): void {\n navigate(`/${timelineItem.resourceType}/${timelineItem.id}`);\n }\n\n function onEdit(timelineItem: Resource): void {\n navigate(`/${timelineItem.resourceType}/${timelineItem.id}/edit`);\n }\n\n function onDelete(timelineItem: Resource): void {\n navigate(`/${timelineItem.resourceType}/${timelineItem.id}/delete`);\n }\n\n function onVersionDetails(version: Resource): void {\n navigate(`/${version.resourceType}/${version.id}/_history/${version.meta?.versionId}`);\n }\n\n if (!resource || !history) {\n return <Loading />;\n }\n\n return (\n <Timeline>\n {props.createCommunication && (\n <article className=\"medplum-timeline-item\">\n <div className=\"medplum-timeline-item-header\">\n <Form\n testid=\"timeline-form\"\n onSubmit={(formData: Record<string, string>) => {\n createComment(formData.text);\n\n const input = inputRef.current;\n if (input) {\n input.value = '';\n input.focus();\n }\n }}\n >\n <Input name=\"text\" testid=\"timeline-input\" inputRef={inputRef} />\n <Button type=\"submit\">Comment</Button>\n <UploadButton onUpload={createMedia} />\n </Form>\n </div>\n </article>\n )}\n {items.map((item) => {\n if (item.resourceType === resource.resourceType && item.id === resource.id) {\n return (\n <HistoryTimelineItem\n key={item.meta?.versionId}\n history={history}\n resource={item}\n onDetails={onVersionDetails}\n />\n );\n }\n const key = `${item.resourceType}/${item.id}`;\n switch (item.resourceType) {\n case 'AuditEvent':\n return <AuditEventTimelineItem key={key} resource={item} onDetails={onDetails} />;\n case 'Communication':\n return (\n <CommunicationTimelineItem\n key={key}\n resource={item}\n onPin={item.priority !== 'stat' ? onPin : undefined}\n onUnpin={item.priority === 'stat' ? onUnpin : undefined}\n onDetails={onDetails}\n onEdit={onEdit}\n onDelete={onDelete}\n />\n );\n case 'DiagnosticReport':\n return (\n <DiagnosticReportTimelineItem\n key={key}\n resource={item}\n onDetails={onDetails}\n onEdit={onEdit}\n onDelete={onDelete}\n />\n );\n case 'Media':\n return (\n <MediaTimelineItem key={key} resource={item} onDetails={onDetails} onEdit={onEdit} onDelete={onDelete} />\n );\n default:\n return (\n <TimelineItem key={key} resource={item} padding={true}>\n <ResourceTable value={item} ignoreMissingValues={true} />\n </TimelineItem>\n );\n }\n })}\n </Timeline>\n );\n}\n\ninterface BaseTimelineItemProps<T extends Resource> {\n resource: T;\n onPin?: (resource: T) => void;\n onUnpin?: (resource: T) => void;\n onDetails?: (resource: T) => void;\n onEdit?: (resource: T) => void;\n onDelete?: (resource: T) => void;\n}\n\nfunction TimelineItemPopupMenu<T extends Resource>(props: BaseTimelineItemProps<T>): JSX.Element {\n return (\n <>\n {props.onPin && (\n <MenuItem\n onClick={() => (props.onPin as (resource: T) => void)(props.resource)}\n label={`Pin ${getReferenceString(props.resource)}`}\n >\n Pin\n </MenuItem>\n )}\n {props.onUnpin && (\n <MenuItem\n onClick={() => (props.onUnpin as (resource: T) => void)(props.resource)}\n label={`Unpin ${getReferenceString(props.resource)}`}\n >\n Unpin\n </MenuItem>\n )}\n {props.onDetails && (\n <MenuItem\n onClick={() => (props.onDetails as (resource: T) => void)(props.resource)}\n label={`Details ${getReferenceString(props.resource)}`}\n >\n Details\n </MenuItem>\n )}\n {props.onEdit && (\n <MenuItem\n onClick={() => (props.onEdit as (resource: T) => void)(props.resource)}\n label={`Edit ${getReferenceString(props.resource)}`}\n >\n Edit\n </MenuItem>\n )}\n {props.onDelete && (\n <MenuItem\n onClick={() => (props.onDelete as (resource: T) => void)(props.resource)}\n label={`Delete ${getReferenceString(props.resource)}`}\n >\n Delete\n </MenuItem>\n )}\n </>\n );\n}\n\ninterface HistoryTimelineItemProps extends BaseTimelineItemProps<Resource> {\n history: Bundle;\n}\n\nfunction HistoryTimelineItem(props: HistoryTimelineItemProps): JSX.Element {\n const previous = getPrevious(props.history, props.resource);\n if (previous) {\n return (\n <TimelineItem resource={props.resource} padding={true} popupMenuItems={<TimelineItemPopupMenu {...props} />}>\n <ResourceDiffTable original={previous} revised={props.resource} />\n </TimelineItem>\n );\n } else {\n return (\n <TimelineItem resource={props.resource} padding={true} popupMenuItems={<TimelineItemPopupMenu {...props} />}>\n <h3>Created</h3>\n <ResourceTable value={props.resource} ignoreMissingValues={true} />\n </TimelineItem>\n );\n }\n}\n\nfunction getPrevious(history: Bundle, version: Resource): Resource | undefined {\n const entries = history.entry as BundleEntry[];\n const index = entries.findIndex((entry) => entry.resource?.meta?.versionId === version.meta?.versionId);\n if (index >= entries.length - 1) {\n return undefined;\n }\n return entries[index + 1].resource;\n}\n\nfunction CommunicationTimelineItem(props: BaseTimelineItemProps<Communication>): JSX.Element {\n const routine = !props.resource.priority || props.resource.priority === 'routine';\n const className = routine ? 'medplum-timeline-item' : 'medplum-timeline-item medplum-timeline-item-pinned';\n return (\n <TimelineItem\n resource={props.resource}\n profile={props.resource.sender}\n padding={true}\n className={className}\n popupMenuItems={<TimelineItemPopupMenu {...props} />}\n >\n <p>{props.resource.payload?.[0]?.contentString}</p>\n </TimelineItem>\n );\n}\n\nfunction MediaTimelineItem(props: BaseTimelineItemProps<Media>): JSX.Element {\n const contentType = props.resource.content?.contentType;\n const padding =\n contentType &&\n !contentType.startsWith('image/') &&\n !contentType.startsWith('video/') &&\n contentType !== 'application/pdf';\n return (\n <TimelineItem resource={props.resource} padding={!!padding} popupMenuItems={<TimelineItemPopupMenu {...props} />}>\n <AttachmentDisplay value={props.resource.content} />\n </TimelineItem>\n );\n}\n\nfunction AuditEventTimelineItem(props: BaseTimelineItemProps<AuditEvent>): JSX.Element {\n return (\n <TimelineItem resource={props.resource} padding={true} popupMenuItems={<TimelineItemPopupMenu {...props} />}>\n <Scrollable>\n <pre>{props.resource.outcomeDesc}</pre>\n </Scrollable>\n </TimelineItem>\n );\n}\n\nfunction DiagnosticReportTimelineItem(props: BaseTimelineItemProps<DiagnosticReport>): JSX.Element {\n return (\n <TimelineItem resource={props.resource} padding={true} popupMenuItems={<TimelineItemPopupMenu {...props} />}>\n <DiagnosticReportDisplay value={props.resource} />\n </TimelineItem>\n );\n}\n","import React from 'react';\nimport './Document.css';\n\nexport interface DocumentProps {\n width?: number;\n children?: React.ReactNode;\n}\n\nexport function Document(props: DocumentProps): JSX.Element {\n return (\n <main className=\"medplum-document\">\n <article style={{ maxWidth: props.width }}>{props.children}</article>\n </main>\n );\n}\n","import { evalFhirPath, PropertyType } from '@medplum/core';\nimport { Resource } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { ResourcePropertyDisplay } from './ResourcePropertyDisplay';\n\nexport interface FhirPathDisplayProps {\n resource: Resource;\n path: string;\n propertyType: PropertyType;\n}\n\nexport function FhirPathDisplay(props: FhirPathDisplayProps): JSX.Element | null {\n let value;\n\n try {\n value = evalFhirPath(props.path, props.resource);\n } catch (err) {\n console.warn('FhirPathDisplay:', err);\n return null;\n }\n\n if (value.length > 1) {\n throw new Error(\n `Component \"path\" for \"FhirPathDisplay\" must resolve to a single element. \\\n Received ${value.length} elements \\\n [${JSON.stringify(value, null, 2)}]`\n );\n }\n return <ResourcePropertyDisplay value={value[0] || ''} propertyType={props.propertyType} />;\n}\n","import { getSearchParameterDetails, IndexedStructureDefinition, SearchRequest } from '@medplum/core';\nimport { ElementDefinition, SearchParameter } from '@medplum/fhirtypes';\n\n/**\n * The SearchControlField type describes a field in the search control.\n *\n * In a SearchRequest, a field is a simple string. Strings can be one of the following:\n * 1) Simple property names, which refer to ElementDefinition objects\n * 2) Search parameter names, which refer to SearchParameter resources\n *\n * Consider a few examples of how this becomes complicated.\n *\n * \"name\" (easy)\n * - element definition path=\"Patient.name\"\n * - search parameter code=\"name\"\n *\n * \"birthDate\" (medium)\n * - refers to the element definition path=\"Patient.birthDate\"\n * - refers to the search parameter code=\"birthdate\" (note the capitalization)\n *\n * \"email\" (hard)\n * - refers to the search parameter code=\"email\"\n * - refers to the element definition path=\"Patient.telecom\"\n *\n * In the last case, we start with the search parameter, and walk backwards to the\n * element definition in order to get type details for rendering.\n *\n * Overall, we want columns, fields, properties, and search parameters to feel seamless,\n * so we try our darndest to make this work.\n */\nexport interface SearchControlField {\n readonly name: string;\n readonly elementDefinition?: ElementDefinition;\n readonly searchParams?: SearchParameter[];\n}\n\n/**\n * Returns the collection of field definitions for the search request.\n * @param typeSchema The schema for the resource type\n * @param search The search request definition.\n * @returns An array of field definitions.\n */\nexport function getFieldDefinitions(schema: IndexedStructureDefinition, search: SearchRequest): SearchControlField[] {\n const resourceType = search.resourceType;\n const fields = [] as SearchControlField[];\n\n for (const name of search.fields || ['id', '_lastUpdated']) {\n fields.push(getFieldDefinition(schema, resourceType, name));\n }\n return fields;\n}\n\n/**\n * Return the field definition for a given field name.\n * Field names can be either property names or search parameter codes.\n * @param typeSchema The schema for the resource type\n * @param resourceType The resource type.\n * @param name The search field name (either property name or search parameter code).\n * @returns The field definition.\n */\nfunction getFieldDefinition(\n schema: IndexedStructureDefinition,\n resourceType: string,\n name: string\n): SearchControlField {\n if (name === '_lastUpdated') {\n return {\n name: '_lastUpdated',\n searchParams: [\n {\n resourceType: 'SearchParameter',\n base: ['Resource'],\n code: '_lastUpdated',\n name: '_lastUpdated',\n type: 'date',\n expression: 'Resource.meta.lastUpdated',\n },\n ],\n };\n }\n\n if (name === 'meta.versionId') {\n return {\n name: 'meta.versionId',\n searchParams: [\n {\n resourceType: 'SearchParameter',\n base: ['Resource'],\n code: '_versionId',\n name: '_versionId',\n type: 'token',\n expression: 'Resource.meta.versionId',\n },\n ],\n };\n }\n\n const typeSchema = schema.types[resourceType];\n const exactElementDefinition: ElementDefinition | undefined = typeSchema.properties[name];\n const exactSearchParam: SearchParameter | undefined = typeSchema.searchParams?.[name.toLowerCase()];\n\n // Best case: Exact match of element definition or search parameter.\n // Examples: ServiceRequest.subject, Patient.name, Patient.birthDate\n // In this case, we only show the one search parameter.\n if (exactElementDefinition && exactSearchParam) {\n return { name, elementDefinition: exactElementDefinition, searchParams: [exactSearchParam] };\n }\n\n // Next best case: Exact match of element definition\n // Examples: Observation.value\n // In this case, there could be zero or more search parameters that are a function of the element definition.\n // So search for those search parameters.\n if (exactElementDefinition) {\n let searchParams: SearchParameter[] | undefined = undefined;\n if (typeSchema.searchParams) {\n const path = `${resourceType}.${name.replaceAll('[x]', '')}`;\n searchParams = Object.values(typeSchema.searchParams).filter((p) => p.expression?.includes(path));\n if (searchParams.length === 0) {\n searchParams = undefined;\n }\n }\n return { name, elementDefinition: exactElementDefinition, searchParams };\n }\n\n // Search parameter case: Exact match of search parameter\n // Examples: Observation.value-quantity, Patient.email\n // Here we have a search parameter, but no element definition.\n // Observation.value-quantity is a search parameter for the Observation.value element.\n // Patient.email is a search parameter for the Patient.telecom element.\n // So we need to walk backwards to find the element definition.\n if (exactSearchParam) {\n const details = getSearchParameterDetails(schema, resourceType, exactSearchParam);\n return { name, elementDefinition: details.elementDefinition, searchParams: [exactSearchParam] };\n }\n\n // Worst case: no element definition and no search parameter.\n // This is probably a malformed URL that includes an unknown field.\n // We will render the column header, but all cells will be empty.\n return { name };\n}\n","import React, { useState } from 'react';\nimport { Button } from './Button';\nimport { killEvent } from './utils/dom';\nimport './Dialog.css';\n\nexport interface DialogProps {\n visible: boolean;\n title: string;\n children?: React.ReactNode;\n onOk: () => void;\n onCancel: () => void;\n}\n\nexport function Dialog(props: DialogProps): JSX.Element | null {\n const [x, setX] = useState(100);\n const [y, setY] = useState(100);\n\n if (!props.visible) {\n return null;\n }\n\n function handleMouseDown(downEvent: React.MouseEvent): void {\n killEvent(downEvent);\n\n const dragX = downEvent.clientX - x;\n const dragY = downEvent.clientY - y;\n\n function handleMouseMove(moveEvent: MouseEvent): void {\n killEvent(moveEvent);\n setX(moveEvent.clientX - dragX);\n setY(moveEvent.clientY - dragY);\n }\n\n function handleMouseUp(upEvent: MouseEvent): void {\n killEvent(upEvent);\n document.removeEventListener('mouseup', handleMouseUp, true);\n document.removeEventListener('mousemove', handleMouseMove, true);\n }\n\n document.addEventListener('mouseup', handleMouseUp, true);\n document.addEventListener('mousemove', handleMouseMove, true);\n }\n\n return (\n <>\n <div className=\"modal-dialog-bg\"></div>\n <div className=\"modal-dialog\" data-testid=\"dialog\" tabIndex={0} style={{ left: x + 'px', top: y + 'px' }}>\n <div className=\"modal-dialog-title\" onMouseDown={(e) => handleMouseDown(e)}>\n <span className=\"modal-dialog-title-text\">{props.title}</span>\n <span className=\"modal-dialog-title-close\" tabIndex={0} onClick={props.onCancel}>\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </span>\n </div>\n <div className=\"modal-dialog-content\">{props.children}</div>\n <div className=\"modal-dialog-buttons\">\n <Button testid=\"dialog-ok\" onClick={props.onOk}>\n OK\n </Button>\n <Button testid=\"dialog-cancel\" onClick={props.onCancel}>\n Cancel\n </Button>\n </div>\n </div>\n </>\n );\n}\n","import { capitalize, evalFhirPathTyped, Filter, Operator, PropertyType, SearchRequest } from '@medplum/core';\nimport { ElementDefinition, Resource, SearchParameter } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { DateTimeDisplay } from './DateTimeDisplay';\nimport { getValueAndType, ResourcePropertyDisplay } from './ResourcePropertyDisplay';\nimport { SearchControlField } from './SearchControlField';\n\nconst searchParamToOperators: Record<string, Operator[]> = {\n string: [Operator.EQUALS, Operator.NOT, Operator.CONTAINS, Operator.EXACT],\n fulltext: [Operator.EQUALS, Operator.NOT, Operator.CONTAINS, Operator.EXACT],\n token: [Operator.EQUALS, Operator.NOT],\n reference: [Operator.EQUALS, Operator.NOT],\n numeric: [\n Operator.EQUALS,\n Operator.NOT_EQUALS,\n Operator.GREATER_THAN,\n Operator.LESS_THAN,\n Operator.GREATER_THAN_OR_EQUALS,\n Operator.LESS_THAN_OR_EQUALS,\n ],\n quantity: [\n Operator.EQUALS,\n Operator.NOT_EQUALS,\n Operator.GREATER_THAN,\n Operator.LESS_THAN,\n Operator.GREATER_THAN_OR_EQUALS,\n Operator.LESS_THAN_OR_EQUALS,\n ],\n date: [\n Operator.EQUALS,\n Operator.NOT_EQUALS,\n Operator.GREATER_THAN,\n Operator.LESS_THAN,\n Operator.GREATER_THAN_OR_EQUALS,\n Operator.LESS_THAN_OR_EQUALS,\n Operator.STARTS_AFTER,\n Operator.ENDS_BEFORE,\n Operator.APPROXIMATELY,\n ],\n datetime: [\n Operator.EQUALS,\n Operator.NOT_EQUALS,\n Operator.GREATER_THAN,\n Operator.LESS_THAN,\n Operator.GREATER_THAN_OR_EQUALS,\n Operator.LESS_THAN_OR_EQUALS,\n Operator.STARTS_AFTER,\n Operator.ENDS_BEFORE,\n Operator.APPROXIMATELY,\n ],\n};\n\nconst operatorNames: Record<Operator, string> = {\n eq: 'equals',\n ne: 'not equals',\n gt: 'greater than',\n lt: 'less than',\n ge: 'greater than or equals',\n le: 'less than or equals',\n sa: 'starts after',\n eb: 'ends before',\n ap: 'approximately',\n contains: 'contains',\n exact: 'exact',\n text: 'text',\n not: 'not',\n above: 'above',\n below: 'below',\n in: 'in',\n 'not-in': 'not in',\n 'of-type': 'of type',\n missing: 'missing',\n};\n\n/**\n * Sets the array of filters.\n *\n * @param {Array} filters The new filters.\n */\nexport function setFilters(definition: SearchRequest, filters: Filter[]): SearchRequest {\n return {\n ...definition,\n filters: filters,\n offset: 0,\n name: undefined,\n };\n}\n\n/**\n * Clears all of the filters.\n */\nexport function clearFilters(definition: SearchRequest): SearchRequest {\n return setFilters(definition, []);\n}\n\n/**\n * Clears all of the filters on a certain field.\n *\n * @param {string} code The field key name to clear filters.\n */\nexport function clearFiltersOnField(definition: SearchRequest, code: string): SearchRequest {\n return setFilters(\n definition,\n (definition.filters || []).filter((f) => f.code !== code)\n );\n}\n\n/**\n * Adds a filter.\n *\n * @param {string} field The field key name.\n * @param {Operator} op The operation key name.\n * @param {?string} value The filter value.\n * @param {boolean=} opt_clear Optional flag to clear filters on the field.\n */\nexport function addFilter(\n definition: SearchRequest,\n field: string,\n op: Operator,\n value?: string,\n opt_clear?: boolean\n): SearchRequest {\n if (opt_clear) {\n definition = clearFiltersOnField(definition, field);\n }\n\n const nextFilters: Filter[] = [];\n if (definition.filters) {\n nextFilters.push(...definition.filters);\n }\n nextFilters.push({ code: field, operator: op, value: value || '' });\n\n return setFilters(definition, nextFilters);\n}\n\n/**\n * Adds a field.\n *\n * @param {string} field The field key name.\n */\nexport function addField(definition: SearchRequest, field: string): SearchRequest {\n if (definition.fields && definition.fields.includes(field)) {\n return definition;\n }\n const newFields = [];\n if (definition.fields) {\n newFields.push(...definition.fields);\n }\n newFields.push(field);\n return {\n ...definition,\n fields: newFields,\n name: undefined,\n };\n}\n\n/**\n * Deletes a filter at the specified index.\n *\n * @param {number} index The filter index.\n */\nexport function deleteFilter(definition: SearchRequest, index: number): SearchRequest {\n if (!definition.filters) {\n return definition;\n }\n const newFilters = [...definition.filters];\n newFilters.splice(index, 1);\n return {\n ...definition,\n filters: newFilters,\n name: undefined,\n };\n}\n\n/**\n * Adds a filter that constrains the specified field to \"yesterday\".\n *\n * @param {string} field The field key name.\n */\nexport function addYesterdayFilter(definition: SearchRequest, field: string): SearchRequest {\n return addDayFilter(definition, field, -1);\n}\n\n/**\n * Adds a filter that constrains the specified field to \"today\".\n *\n * @param {string} field The field key name.\n */\nexport function addTodayFilter(definition: SearchRequest, field: string): SearchRequest {\n return addDayFilter(definition, field, 0);\n}\n\n/**\n * Adds a filter that constrains the specified field to \"tomorrow\".\n *\n * @param {string} field The field key name.\n */\nexport function addTomorrowFilter(definition: SearchRequest, field: string): SearchRequest {\n return addDayFilter(definition, field, 1);\n}\n\n/**\n * Adds a filter that constrains the specified field to a day.\n * The day is specified as a delta from the current day.\n * \"Today\" would be 0.\n * \"Yesterday\" would be -1.\n * \"Tomorrow\" would be 1.\n *\n * @param {string} field The field key name.\n * @param {number} delta The number of days from this day.\n */\nfunction addDayFilter(definition: SearchRequest, field: string, delta: number): SearchRequest {\n const startTime = new Date();\n startTime.setDate(startTime.getDate() + delta);\n startTime.setHours(0, 0, 0, 0);\n\n const endTime = new Date(startTime.getTime());\n endTime.setDate(endTime.getDate() + 1);\n endTime.setTime(endTime.getTime() - 1);\n\n return addDateFilterBetween(definition, field, startTime, endTime);\n}\n\n/**\n * Adds a filter that constrains the specified field to \"last month\".\n *\n * @param {string} field The field key name.\n */\nexport function addLastMonthFilter(definition: SearchRequest, field: string): SearchRequest {\n return addMonthFilter(definition, field, -1);\n}\n\n/**\n * Adds a filter that constrains the specified field to \"this month\".\n *\n * @param {string} field The field key name.\n */\nexport function addThisMonthFilter(definition: SearchRequest, field: string): SearchRequest {\n return addMonthFilter(definition, field, 0);\n}\n\n/**\n * Adds a filter that constrains the specified field to \"next month\".\n *\n * @param {string} field The field key name.\n */\nexport function addNextMonthFilter(definition: SearchRequest, field: string): SearchRequest {\n return addMonthFilter(definition, field, 1);\n}\n\n/**\n * Adds a filter that constrains the specified field to a month.\n * The month is specified as a delta from the current month.\n * \"This month\" would be 0.\n * \"Last month\" would be -1.\n * \"Next month\" would be 1.\n *\n * @param {string} field The field key name.\n * @param {number} delta The number of months from this month.\n */\nfunction addMonthFilter(definition: SearchRequest, field: string, delta: number): SearchRequest {\n const startTime = new Date();\n startTime.setMonth(startTime.getMonth() + delta);\n startTime.setDate(1);\n startTime.setHours(0, 0, 0, 0);\n\n const endTime = new Date(startTime.getTime());\n endTime.setMonth(endTime.getMonth() + 1);\n endTime.setDate(1);\n endTime.setHours(0, 0, 0, 0);\n endTime.setTime(endTime.getTime() - 1);\n\n return addDateFilterBetween(definition, field, startTime, endTime);\n}\n\n/**\n * Adds a filter that constrains the specified field to the year to date.\n *\n * @param {string} field The field key name.\n */\nexport function addYearToDateFilter(definition: SearchRequest, field: string): SearchRequest {\n const startTime = new Date();\n startTime.setMonth(0);\n startTime.setDate(1);\n startTime.setHours(0, 0, 0, 0);\n\n const endTime = new Date();\n\n return addDateFilterBetween(definition, field, startTime, endTime);\n}\n\n/**\n * Adds a filter for a field equaling a specified date.\n *\n * @param {string} field The field key name.\n * @param {Date} value The date.\n */\nexport function addDateEqualsFilter(definition: SearchRequest, field: string, value: Date): SearchRequest {\n return addDateFilterBetween(definition, field, value, value);\n}\n\n/**\n * Adds a filter for a date before a certain date/time.\n *\n * @param {string} field The field key name.\n * @param {Operator} op The date/time operation.\n * @param {Date} value The date.\n */\nexport function addDateFilter(definition: SearchRequest, field: string, op: Operator, value: Date): SearchRequest {\n definition = clearFiltersOnField(definition, field);\n return addDateFilterImpl(definition, field, op, value);\n}\n\n/**\n * Adds a filter for a date between two dates (inclusive of both dates).\n *\n * @param {string} field The field key name.\n * @param {Date} d1 The start date.\n * @param {Date} d2 The end date.\n */\nexport function addDateFilterBetween(definition: SearchRequest, field: string, d1: Date, d2: Date): SearchRequest {\n definition = clearFiltersOnField(definition, field);\n definition = addDateFilterImpl(definition, field, Operator.GREATER_THAN_OR_EQUALS, d1);\n definition = addDateFilterImpl(definition, field, Operator.LESS_THAN_OR_EQUALS, d2);\n return definition;\n}\n\n/**\n * Adds a filter for a date before a certain date/time.\n *\n * @param {string} field The field key name.\n * @param {Operator} op The date/time operation.\n * @param {Date} value The date.\n */\nfunction addDateFilterImpl(definition: SearchRequest, field: string, op: Operator, value: Date): SearchRequest {\n return addFilter(definition, field, op, value.toISOString());\n}\n\n/**\n * Adds a filter that constrains the specified field to \"missing\".\n *\n * @param {string} field The field key name.\n */\nexport function addMissingFilter(definition: SearchRequest, field: string, value = true): SearchRequest {\n return addFilter(definition, field, Operator.MISSING, value.toString());\n}\n\n/**\n * Returns true if the search has any filters on the specified field.\n *\n * @param {string} code The field key name.\n */\nexport function hasFilterOnField(definition: SearchRequest, code: string): boolean {\n if (!definition.filters) {\n return false;\n }\n return definition.filters.find((f) => f.code === code) !== undefined;\n}\n\n/**\n * Sets the offset (starting at zero).\n *\n * @param {number} offset The offset number.\n */\nexport function setOffset(definition: SearchRequest, offset: number): SearchRequest {\n if (definition.offset === offset) {\n return definition;\n }\n return {\n ...definition,\n offset,\n name: undefined,\n };\n}\n\n/**\n * Moves the page forward or backward.\n *\n * @param {number} delta The delta to the page number.\n * @return {boolean} True if the page actually moved; false otherwise.\n */\nexport function movePage(definition: SearchRequest, delta: number): SearchRequest {\n const count = definition.count ?? 20;\n const currOffset = definition.offset ?? 0;\n const newOffset = currOffset + delta * count;\n return setOffset(definition, Math.max(newOffset, 0));\n}\n\n/**\n * Sorts the search by the specified key, and optional direction.\n * Direction defaults to ascending ('asc') if not specified.\n *\n * @param {string} sortField The sort key.\n */\nexport function setSort(definition: SearchRequest, sort: string, desc?: boolean): SearchRequest {\n if (sort === getSortField(definition) && desc !== undefined && desc === isSortDescending(definition)) {\n return definition;\n }\n return {\n ...definition,\n sortRules: [\n {\n code: sort,\n descending: !!desc,\n },\n ],\n name: undefined,\n };\n}\n\n/**\n * Toggles the sort of the search by key.\n * If the search is already sorted by the key, reverses the direction.\n * If the search is not sorted by the key, sort in ascending order.\n *\n * @param {string} key The field key name.\n */\nexport function toggleSort(definition: SearchRequest, key: string): SearchRequest {\n let desc = false;\n if (getSortField(definition) === key) {\n desc = !isSortDescending(definition);\n }\n return setSort(definition, key, desc);\n}\n\nexport function getSortField(definition: SearchRequest): string | undefined {\n const sortRules = definition.sortRules;\n if (!sortRules || sortRules.length === 0) {\n return undefined;\n }\n const field = sortRules[0].code;\n return field.startsWith('-') ? field.substr(1) : field;\n}\n\nexport function isSortDescending(definition: SearchRequest): boolean {\n const sortRules = definition.sortRules;\n if (!sortRules || sortRules.length === 0) {\n return false;\n }\n return !!sortRules[0].descending;\n}\n\n/**\n * Returns a list of operators for a search parameter.\n * @param searchParam The search parameter.\n * @returns The list of operators that can be used for the search parameter.\n */\nexport function getSearchOperators(searchParam: SearchParameter): Operator[] | undefined {\n return searchParamToOperators[searchParam.type as string];\n}\n\n/**\n * Returns a string representing the operation.\n *\n * @param {string} op The operation code.\n * @return {string} A display string for the operation.\n */\nexport function getOpString(op: Operator): string {\n return operatorNames[op] ?? '';\n}\n\n/**\n * Returns a field display name.\n * @param key The field key.\n * @returns The field display name.\n */\nexport function buildFieldNameString(key: string): string {\n let tmp = key;\n\n // If dot separated, only the last part\n if (tmp.includes('.')) {\n tmp = tmp.split('.').pop() as string;\n }\n\n // Special case for ID\n if (tmp === 'id') {\n return 'ID';\n }\n\n // Special case for Version ID\n if (tmp === 'versionId') {\n return 'Version ID';\n }\n\n // Remove choice of type\n tmp = tmp.replace('[x]', '');\n\n // Convert camel case to space separated\n tmp = tmp.replace(/([A-Z])/g, ' $1');\n\n // Convert dashes and underscores to spaces\n tmp = tmp.replace(/[-_]/g, ' ');\n\n // Normalize whitespace to single space character\n tmp = tmp.replace(/\\s+/g, ' ');\n\n // Trim\n tmp = tmp.trim();\n\n // Capitalize the first letter of each word\n return tmp.split(/\\s/).map(capitalize).join(' ');\n}\n\n/**\n * Returns a fragment to be displayed in the search table for the value.\n * @param resource The parent resource.\n * @param key The search code or FHIRPath expression.\n * @returns The fragment to display.\n */\nexport function renderValue(resource: Resource, field: SearchControlField): string | JSX.Element | null | undefined {\n const key = field.name;\n if (key === 'id') {\n return resource.id;\n }\n\n if (key === 'meta.versionId') {\n return resource.meta?.versionId;\n }\n\n if (key === '_lastUpdated') {\n return <DateTimeDisplay value={resource.meta?.lastUpdated} />;\n }\n\n // Priority 1: ElementDefinition by exact match\n if (field.elementDefinition && `${resource.resourceType}.${field.name}` === field.elementDefinition.path) {\n return renderPropertyValue(resource, field.elementDefinition);\n }\n\n // Priority 2: SearchParameter by exact match\n if (field.searchParams && field.searchParams.length === 1 && field.name === field.searchParams[0].code) {\n return renderSearchParameterValue(resource, field.searchParams[0], field.elementDefinition);\n }\n\n // We don't know how to render this field definition\n return null;\n}\n\n/**\n * Returns a fragment to be displayed in the search table for a resource property.\n * @param resource The parent resource.\n * @param elementDefinition The property element definition.\n * @returns A React element or null.\n */\nfunction renderPropertyValue(resource: Resource, elementDefinition: ElementDefinition): JSX.Element | null {\n const path = elementDefinition.path?.split('.')?.pop()?.replaceAll('[x]', '') || '';\n const [value, propertyType] = getValueAndType({ type: resource.resourceType, value: resource }, path);\n if (!value) {\n return null;\n }\n\n return (\n <ResourcePropertyDisplay\n property={elementDefinition}\n propertyType={propertyType}\n value={value}\n maxWidth={200}\n ignoreMissingValues={true}\n link={false}\n />\n );\n}\n\n/**\n * Returns a fragment to be displayed in the search table for a search parameter.\n * @param resource The parent resource.\n * @param searchParam The search parameter.\n * @param elementDefinition Optional element definition.\n * @returns A React element or null.\n */\nfunction renderSearchParameterValue(\n resource: Resource,\n searchParam: SearchParameter,\n elementDefinition: ElementDefinition | undefined\n): JSX.Element | null {\n const value = evalFhirPathTyped(searchParam.expression as string, [{ type: resource.resourceType, value: resource }]);\n if (!value || value.length === 0) {\n return null;\n }\n\n if (elementDefinition) {\n return (\n <ResourcePropertyDisplay\n propertyType={value[0].type as PropertyType}\n value={value[0].value}\n maxWidth={200}\n ignoreMissingValues={true}\n link={false}\n />\n );\n }\n\n return (\n <>\n {value.map((v, index) => (\n <span key={`${index}-${value.length}`}>\n {typeof v === 'object' ? JSON.stringify(v) : (v as string | number)}\n </span>\n ))}\n </>\n );\n}\n","import { IndexedStructureDefinition, SearchRequest, stringify, TypeSchema } from '@medplum/core';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { Button } from './Button';\nimport { Dialog } from './Dialog';\nimport { buildFieldNameString } from './SearchUtils';\n\ninterface SearchFieldEditorProps {\n schema: IndexedStructureDefinition;\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 = props.schema.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 <Dialog title=\"Fields\" visible={props.visible} onOk={() => props.onOk(state.search)} onCancel={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 size=\"small\" onClick={onAddField}>\n Add\n </Button>\n </td>\n <td align=\"center\">\n <Button size=\"small\" onClick={onRemoveField}>\n Remove\n </Button>\n </td>\n <td align=\"center\">\n <Button size=\"small\" onClick={onMoveUp}>\n Up\n </Button>\n </td>\n <td align=\"center\">\n <Button size=\"small\" onClick={onMoveDown}>\n Down\n </Button>\n </td>\n </tr>\n </tfoot>\n </table>\n </div>\n </Dialog>\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","import { Filter } from '@medplum/core';\nimport React from 'react';\nimport { DateTimeDisplay } from './DateTimeDisplay';\nimport { useMedplum } from './MedplumProvider';\nimport { ResourceName } from './ResourceName';\n\nexport interface SearchFilterValueDisplayProps {\n readonly resourceType: string;\n readonly filter: Filter;\n}\n\nexport function SearchFilterValueDisplay(props: SearchFilterValueDisplayProps): JSX.Element | null {\n const medplum = useMedplum();\n const schema = medplum.getSchema();\n const searchParam = schema.types[props.resourceType]?.searchParams?.[props.filter.code];\n\n const filter = props.filter;\n if (searchParam?.type === 'reference') {\n return <ResourceName value={{ reference: filter.value }} />;\n }\n\n if (props.filter.code === '_lastUpdated' || searchParam?.type === 'datetime') {\n return <DateTimeDisplay value={filter.value} />;\n }\n\n return <>{filter.value}</>;\n}\n","import { getSearchParameterDetails, IndexedStructureDefinition, SearchParameterType } from '@medplum/core';\nimport { Quantity, Reference, SearchParameter } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { Checkbox } from './Checkbox';\nimport { DateTimeInput } from './DateTimeInput';\nimport { Input } from './Input';\nimport { QuantityInput } from './QuantityInput';\nimport { ReferenceInput } from './ReferenceInput';\n\nexport interface SearchFilterValueInputProps {\n schema: IndexedStructureDefinition;\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.schema, 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 testid={name}\n defaultValue={props.defaultValue === 'true'}\n onChange={(newValue) => props.onChange(newValue.toString())}\n />\n );\n\n case SearchParameterType.DATE:\n return <Input type=\"date\" testid={name} defaultValue={props.defaultValue} onChange={props.onChange} />;\n\n case SearchParameterType.DATETIME:\n return <DateTimeInput testid={name} defaultValue={props.defaultValue} onChange={props.onChange} />;\n\n case SearchParameterType.NUMBER:\n return <Input type=\"number\" defaultValue={props.defaultValue} onChange={props.onChange} />;\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 <Input testid={name} defaultValue={props.defaultValue} autoFocus={props.autoFocus} onChange={props.onChange} />\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","import { Filter, IndexedStructureDefinition, Operator, SearchRequest, stringify } from '@medplum/core';\nimport { SearchParameter } from '@medplum/fhirtypes';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { Button } from './Button';\nimport { Dialog } from './Dialog';\nimport { SearchFilterValueDisplay } from './SearchFilterValueDisplay';\nimport { SearchFilterValueInput } from './SearchFilterValueInput';\nimport {\n addFilter,\n buildFieldNameString,\n deleteFilter,\n getOpString,\n getSearchOperators,\n setFilters,\n} from './SearchUtils';\nimport { Select } from './Select';\nimport './SearchFilterEditor.css';\n\nexport interface SearchFilterEditorProps {\n schema: IndexedStructureDefinition;\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 schema = props.schema;\n const resourceType = props.search.resourceType;\n const searchParams = schema.types[resourceType].searchParams as Record<string, SearchParameter>;\n const filters = search.filters || [];\n\n return (\n <Dialog\n title=\"Filters\"\n visible={props.visible}\n onOk={() => props.onOk(searchRef.current)}\n onCancel={props.onCancel}\n >\n <div className=\"medplum-filter-editor\">\n <table className=\"medplum-filter-editor-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 schema={schema}\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\n schema={schema}\n resourceType={resourceType}\n searchParams={searchParams}\n okText=\"Add\"\n onOk={onAddFilter}\n />\n </tbody>\n </table>\n </div>\n </Dialog>\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 size=\"small\" onClick={props.onEdit}>\n Edit\n </Button>\n <Button size=\"small\" onClick={props.onDelete}>\n Delete\n </Button>\n </td>\n </tr>\n );\n}\n\ninterface FilterRowInputProps {\n schema: IndexedStructureDefinition;\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 <Select testid=\"filter-field\" defaultValue={valueRef.current.code} onChange={setFilterCode}>\n <option value=\"\"></option>\n {Object.keys(props.searchParams).map((param) => (\n <option key={param} value={param}>\n {buildFieldNameString(param)}\n </option>\n ))}\n </Select>\n </td>\n <td>\n {operators && (\n <Select\n testid=\"filter-operation\"\n defaultValue={value.operator}\n onChange={setFilterOperator as (newOperator: string) => void}\n >\n <option value=\"\"></option>\n {operators.map((operator) => (\n <option key={operator} value={operator}>\n {getOpString(operator)}\n </option>\n ))}\n </Select>\n )}\n </td>\n <td>\n {searchParam && value.operator && (\n <SearchFilterValueInput\n schema={props.schema}\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 size=\"small\"\n onClick={() => {\n props.onOk(valueRef.current);\n setValue({} as Filter);\n }}\n >\n {props.okText}\n </Button>\n )}\n {props.onCancel && (\n <Button size=\"small\" onClick={props.onCancel}>\n Cancel\n </Button>\n )}\n </td>\n </tr>\n );\n}\n","import { Filter, IndexedStructureDefinition } from '@medplum/core';\nimport { SearchParameter } from '@medplum/fhirtypes';\nimport React, { useState } from 'react';\nimport { Dialog } from './Dialog';\nimport { Form } from './Form';\nimport { SearchFilterValueInput } from './SearchFilterValueInput';\n\nexport interface SearchFilterValueDialogProps {\n title: string;\n visible: boolean;\n schema: IndexedStructureDefinition;\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 <Dialog title={props.title} visible={props.visible} onOk={onOk} onCancel={props.onCancel}>\n <div style={{ width: 500 }}>\n <Form onSubmit={onOk}>\n <SearchFilterValueInput\n schema={props.schema}\n resourceType={props.resourceType}\n searchParam={props.searchParam}\n defaultValue={value}\n autoFocus={true}\n onChange={setValue}\n />\n </Form>\n </div>\n </Dialog>\n );\n}\n","import React from 'react';\nimport './MenuSeparator.css';\n\nexport function MenuSeparator(): JSX.Element {\n return <div className=\"medplum-menu-separator\" />;\n}\n","import React, { useEffect, useRef, useState } from 'react';\nimport { Popup } from './Popup';\nimport './SubMenu.css';\n\nexport interface SubMenuProps {\n title: string;\n children: React.ReactNode;\n}\n\nexport function SubMenu(props: SubMenuProps): JSX.Element {\n const [hover, setHover] = useState(false);\n const [visible, setVisible] = useState(false);\n const [anchor, setAnchor] = useState<DOMRectReadOnly | undefined>(undefined);\n const menuItemRef = useRef<HTMLDivElement>(null);\n\n const hoverRef = useRef<boolean>(false);\n hoverRef.current = hover;\n\n const visibleRef = useRef<boolean>(false);\n visibleRef.current = visible;\n\n function show(): void {\n const el = menuItemRef.current;\n if (el) {\n setAnchor(el.getBoundingClientRect());\n setVisible(true);\n }\n }\n\n useEffect(() => {\n const timerId = window.setInterval(() => {\n if (!visibleRef.current && hoverRef.current) {\n show();\n } else if (visibleRef.current && !hoverRef.current) {\n setVisible(false);\n }\n }, 150);\n return () => window.clearInterval(timerId);\n }, []);\n\n return (\n <div\n ref={menuItemRef}\n className=\"medplum-menu-item medplum-submenu-item\"\n onClick={() => show()}\n onMouseOver={() => setHover(true)}\n onMouseLeave={() => setHover(false)}\n >\n {props.title}\n <span className=\"medplum-submenu-arrow\">{'\\u25BA'}</span>\n <Popup visible={visible} anchor={anchor} autoClose={true} onClose={() => setVisible(false)}>\n {props.children}\n </Popup>\n </div>\n );\n}\n","import { Filter, IndexedStructureDefinition, Operator, SearchRequest } from '@medplum/core';\nimport { SearchParameter } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { MenuItem } from './MenuItem';\nimport { MenuSeparator } from './MenuSeparator';\nimport { Popup } from './Popup';\nimport {\n addLastMonthFilter,\n addMissingFilter,\n addNextMonthFilter,\n addThisMonthFilter,\n addTodayFilter,\n addTomorrowFilter,\n addYearToDateFilter,\n addYesterdayFilter,\n buildFieldNameString,\n clearFiltersOnField,\n setSort,\n} from './SearchUtils';\nimport { SubMenu } from './SubMenu';\n\nexport interface SearchPopupMenuProps {\n schema: IndexedStructureDefinition;\n search: SearchRequest;\n visible: boolean;\n x: number;\n y: number;\n searchParams?: SearchParameter[];\n onPrompt: (searchParam: SearchParameter, filter: Filter) => void;\n onChange: (definition: SearchRequest) => void;\n onClose: () => void;\n}\n\nexport function SearchPopupMenu(props: SearchPopupMenuProps): JSX.Element | null {\n if (!props.searchParams) {\n return null;\n }\n\n function onSort(searchParam: SearchParameter, desc: boolean): void {\n onChange(setSort(props.search, searchParam.code as string, desc));\n }\n\n function onClear(searchParam: SearchParameter): void {\n onChange(clearFiltersOnField(props.search, searchParam.code as string));\n }\n\n function onPrompt(searchParam: SearchParameter, operator: Operator): void {\n props.onPrompt(searchParam, { code: searchParam.code as string, operator, value: '' });\n }\n\n function onChange(definition: SearchRequest): void {\n props.onChange(definition);\n }\n\n const anchor = { left: props.x, right: props.x, top: props.y, bottom: props.y } as DOMRectReadOnly;\n\n // If there is only one search parameter, then show it directly\n if (props.searchParams.length === 1) {\n return (\n <Popup visible={props.visible} anchor={anchor} autoClose={true} onClose={props.onClose}>\n <SearchParameterSubMenu\n search={props.search}\n searchParam={props.searchParams[0]}\n onSort={onSort}\n onPrompt={onPrompt}\n onChange={onChange}\n onClear={onClear}\n />\n </Popup>\n );\n }\n\n // Otherwise, show a menu, with each search parameter as a sub menu\n return (\n <Popup visible={props.visible} anchor={anchor} autoClose={true} onClose={props.onClose}>\n {props.searchParams.map((searchParam) => (\n <SubMenu key={searchParam.code as string} title={buildFieldNameString(searchParam.code as string)}>\n <SearchParameterSubMenu\n search={props.search}\n searchParam={searchParam}\n onSort={onSort}\n onPrompt={onPrompt}\n onChange={onChange}\n onClear={onClear}\n />\n </SubMenu>\n ))}\n </Popup>\n );\n}\n\ninterface SearchPopupSubMenuProps {\n search: SearchRequest;\n searchParam: SearchParameter;\n onSort: (searchParam: SearchParameter, descending: boolean) => void;\n onPrompt: (searchParam: SearchParameter, operator: Operator) => void;\n onChange: (search: SearchRequest) => void;\n onClear: (searchParam: SearchParameter) => void;\n}\n\nfunction SearchParameterSubMenu(props: SearchPopupSubMenuProps): JSX.Element {\n switch (props.searchParam.type) {\n case 'date':\n return <DateFilterSubMenu {...props} />;\n case 'number':\n case 'quantity':\n return <NumericFilterSubMenu {...props} />;\n case 'reference':\n return <ReferenceFilterSubMenu {...props} />;\n case 'string':\n case 'token':\n case 'uri':\n return <TextFilterSubMenu {...props} />;\n default:\n return <>Unknown search param type: {props.searchParam.type}</>;\n }\n}\n\nfunction DateFilterSubMenu(props: SearchPopupSubMenuProps): JSX.Element {\n const { searchParam } = props;\n const code = searchParam.code as string;\n return (\n <>\n <MenuItem onClick={() => props.onSort(searchParam, false)}>Sort Oldest to Newest</MenuItem>\n <MenuItem onClick={() => props.onSort(searchParam, true)}>Sort Newest to Oldest</MenuItem>\n <MenuSeparator />\n <MenuItem onClick={() => props.onPrompt(searchParam, Operator.EQUALS)}>Equals...</MenuItem>\n <MenuItem onClick={() => props.onPrompt(searchParam, Operator.NOT_EQUALS)}>Does not equal...</MenuItem>\n <MenuSeparator />\n <MenuItem onClick={() => props.onPrompt(searchParam, Operator.ENDS_BEFORE)}>Before...</MenuItem>\n <MenuItem onClick={() => props.onPrompt(searchParam, Operator.STARTS_AFTER)}>After...</MenuItem>\n <MenuItem onClick={() => props.onPrompt(searchParam, Operator.EQUALS)}>Between...</MenuItem>\n <MenuSeparator />\n <MenuItem onClick={() => props.onChange(addTomorrowFilter(props.search, code))}>Tomorrow</MenuItem>\n <MenuItem onClick={() => props.onChange(addTodayFilter(props.search, code))}>Today</MenuItem>\n <MenuItem onClick={() => props.onChange(addYesterdayFilter(props.search, code))}>Yesterday</MenuItem>\n <MenuSeparator />\n <MenuItem onClick={() => props.onChange(addNextMonthFilter(props.search, code))}>Next Month</MenuItem>\n <MenuItem onClick={() => props.onChange(addThisMonthFilter(props.search, code))}>This Month</MenuItem>\n <MenuItem onClick={() => props.onChange(addLastMonthFilter(props.search, code))}>Last Month</MenuItem>\n <MenuSeparator />\n <MenuItem onClick={() => props.onChange(addYearToDateFilter(props.search, code))}>Year to date</MenuItem>\n <MenuSeparator />\n <MenuItem onClick={() => props.onChange(addMissingFilter(props.search, code))}>Missing</MenuItem>\n <MenuItem onClick={() => props.onChange(addMissingFilter(props.search, code, false))}>Not missing</MenuItem>\n <MenuSeparator />\n <MenuItem onClick={() => props.onClear(searchParam)}>Clear filters</MenuItem>\n </>\n );\n}\n\nfunction NumericFilterSubMenu(props: SearchPopupSubMenuProps): JSX.Element {\n const { searchParam } = props;\n const code = searchParam.code as string;\n return (\n <>\n <MenuItem onClick={() => props.onSort(searchParam, false)}>Sort Smallest to Largest</MenuItem>\n <MenuItem onClick={() => props.onSort(searchParam, true)}>Sort Largest to Smallest</MenuItem>\n <MenuSeparator />\n <MenuItem onClick={() => props.onPrompt(searchParam, Operator.EQUALS)}>Equals...</MenuItem>\n <MenuItem onClick={() => props.onPrompt(searchParam, Operator.NOT_EQUALS)}>Does not equal...</MenuItem>\n <MenuSeparator />\n <MenuItem onClick={() => props.onPrompt(searchParam, Operator.GREATER_THAN)}>Greater than...</MenuItem>\n <MenuItem onClick={() => props.onPrompt(searchParam, Operator.GREATER_THAN_OR_EQUALS)}>\n Greater than or equal to...\n </MenuItem>\n <MenuItem onClick={() => props.onPrompt(searchParam, Operator.LESS_THAN)}>Less than...</MenuItem>\n <MenuItem onClick={() => props.onPrompt(searchParam, Operator.LESS_THAN_OR_EQUALS)}>\n Less than or equal to...\n </MenuItem>\n <MenuSeparator />\n <MenuItem onClick={() => props.onChange(addMissingFilter(props.search, code))}>Missing</MenuItem>\n <MenuItem onClick={() => props.onChange(addMissingFilter(props.search, code, false))}>Not missing</MenuItem>\n <MenuSeparator />\n <MenuItem onClick={() => props.onClear(searchParam)}>Clear filters</MenuItem>\n </>\n );\n}\n\nfunction ReferenceFilterSubMenu(props: SearchPopupSubMenuProps): JSX.Element {\n const { searchParam } = props;\n const code = searchParam.code as string;\n return (\n <>\n <MenuItem onClick={() => props.onPrompt(searchParam, Operator.EQUALS)}>Equals...</MenuItem>\n <MenuItem onClick={() => props.onPrompt(searchParam, Operator.NOT)}>Does not equal...</MenuItem>\n <MenuSeparator />\n <MenuItem onClick={() => props.onChange(addMissingFilter(props.search, code))}>Missing</MenuItem>\n <MenuItem onClick={() => props.onChange(addMissingFilter(props.search, code, false))}>Not missing</MenuItem>\n <MenuSeparator />\n <MenuItem onClick={() => props.onClear(searchParam)}>Clear filters</MenuItem>\n </>\n );\n}\n\nfunction TextFilterSubMenu(props: SearchPopupSubMenuProps): JSX.Element {\n const { searchParam } = props;\n const code = searchParam.code as string;\n return (\n <>\n <MenuItem onClick={() => props.onSort(searchParam, false)}>Sort A to Z</MenuItem>\n <MenuItem onClick={() => props.onSort(searchParam, true)}>Sort Z to A</MenuItem>\n <MenuSeparator />\n <MenuItem onClick={() => props.onPrompt(searchParam, Operator.EQUALS)}>Equals...</MenuItem>\n <MenuItem onClick={() => props.onPrompt(searchParam, Operator.NOT)}>Does not equal...</MenuItem>\n <MenuSeparator />\n <MenuItem onClick={() => props.onPrompt(searchParam, Operator.CONTAINS)}>Contains...</MenuItem>\n <MenuItem onClick={() => props.onPrompt(searchParam, Operator.EQUALS)}>Does not contain...</MenuItem>\n <MenuSeparator />\n <MenuItem onClick={() => props.onChange(addMissingFilter(props.search, code))}>Missing</MenuItem>\n <MenuItem onClick={() => props.onChange(addMissingFilter(props.search, code, false))}>Not missing</MenuItem>\n <MenuSeparator />\n <MenuItem onClick={() => props.onClear(searchParam)}>Clear filters</MenuItem>\n </>\n );\n}\n","import React from 'react';\nimport './TitleBar.css';\n\nexport interface TitleBarProps {\n children?: React.ReactNode;\n}\n\nexport function TitleBar(props: TitleBarProps): JSX.Element {\n return <div className=\"medplum-title-bar\">{props.children}</div>;\n}\n","import {\n DEFAULT_SEARCH_COUNT,\n Filter,\n formatSearchQuery,\n IndexedStructureDefinition,\n parseSearchDefinition,\n SearchRequest,\n} from '@medplum/core';\nimport {\n Bundle,\n OperationOutcome,\n Resource,\n ResourceType,\n SearchParameter,\n UserConfiguration,\n} from '@medplum/fhirtypes';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { Button } from './Button';\nimport { Loading } from './Loading';\nimport { useMedplum } from './MedplumProvider';\nimport { getFieldDefinitions } from './SearchControlField';\nimport { SearchFieldEditor } from './SearchFieldEditor';\nimport { SearchFilterEditor } from './SearchFilterEditor';\nimport { SearchFilterValueDialog } from './SearchFilterValueDialog';\nimport { SearchFilterValueDisplay } from './SearchFilterValueDisplay';\nimport { SearchPopupMenu } from './SearchPopupMenu';\nimport { addFilter, buildFieldNameString, getOpString, movePage, renderValue } from './SearchUtils';\nimport { Select } from './Select';\nimport { TitleBar } from './TitleBar';\nimport { isCheckboxCell, killEvent } from './utils/dom';\nimport './SearchControl.css';\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 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 popupVisible: boolean;\n popupX: number;\n popupY: number;\n popupSearchParams?: SearchParameter[];\n fieldEditorVisible: boolean;\n filterEditorVisible: boolean;\n filterDialogVisible: boolean;\n filterDialogFilter?: Filter;\n filterDialogSearchParam?: SearchParameter;\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 medplum = useMedplum();\n const [schema, setSchema] = useState<IndexedStructureDefinition | undefined>();\n const [outcome, setOutcome] = useState<OperationOutcome | undefined>();\n const { search, onLoad } = props;\n\n const [state, setState] = useState<SearchControlState>({\n selected: {},\n popupVisible: false,\n popupX: 0,\n popupY: 0,\n popupSearchParams: undefined,\n fieldEditorVisible: false,\n filterEditorVisible: 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(search.resourceType as ResourceType, formatSearchQuery({ ...search, total: 'accurate' }))\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 * Handles a click on a column header cell.\n * @param e The click event.\n * @param key The field key.\n */\n function handleSortClick(e: React.MouseEvent, searchParams: SearchParameter[] | undefined): void {\n setState({\n ...stateRef.current,\n popupVisible: true,\n popupX: e.clientX,\n popupY: e.clientY,\n popupSearchParams: searchParams,\n });\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 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 useEffect(() => {\n medplum.requestSchema(props.search.resourceType as ResourceType).then((newSchema) => {\n // The schema could have the same object identity,\n // so need to use the spread operator to kick React re-render.\n setSchema({ ...newSchema });\n });\n }, [medplum, props.search.resourceType]);\n\n const typeSchema = schema?.types?.[props.search.resourceType];\n if (!typeSchema) {\n return <Loading />;\n }\n\n const checkboxColumn = props.checkboxesEnabled;\n const fields = getFieldDefinitions(schema, 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 const savedSearches = props.userConfig?.search?.filter((s) => s.criteria?.startsWith(resourceType));\n\n return (\n <div className=\"medplum-search-control\" onContextMenu={(e) => killEvent(e)} data-testid=\"search-control\">\n {!props.hideToolbar && (\n <TitleBar>\n <div>\n <h1>\n <a href={`https://www.hl7.org/fhir/${resourceType.toLowerCase()}.html`} target=\"_blank\" rel=\"noopener\">\n {resourceType}\n </a>\n </h1>\n {savedSearches && (\n <Select\n testid=\"saved-search-select\"\n style={{ width: 80 }}\n onChange={(newValue) => {\n emitSearchChange(parseSearchDefinition(newValue));\n }}\n >\n <option></option>\n {savedSearches.map((s, index) => (\n <option key={`${index}-${savedSearches.length}`} value={s.criteria}>\n {s.name}\n </option>\n ))}\n </Select>\n )}\n <Button\n testid=\"fields-button\"\n size=\"small\"\n onClick={() => setState({ ...stateRef.current, fieldEditorVisible: true })}\n >\n Fields\n </Button>\n <Button\n testid=\"filters-button\"\n size=\"small\"\n onClick={() => setState({ ...stateRef.current, filterEditorVisible: true })}\n >\n Filters\n </Button>\n {props.onNew && (\n <Button size=\"small\" onClick={props.onNew}>\n New...\n </Button>\n )}\n {props.onExport && (\n <Button size=\"small\" onClick={props.onExport}>\n Export...\n </Button>\n )}\n {props.onDelete && (\n <Button\n size=\"small\"\n onClick={() => (props.onDelete as (ids: string[]) => any)(Object.keys(state.selected))}\n >\n Delete...\n </Button>\n )}\n {props.onBulk && (\n <Button\n size=\"small\"\n onClick={() => (props.onBulk as (ids: string[]) => any)(Object.keys(state.selected))}\n >\n Bulk...\n </Button>\n )}\n </div>\n {lastResult && (\n <div>\n <span className=\"medplum-search-summary\">\n {getStart(search, lastResult.total as number)}-{getEnd(search, lastResult.total as number)} of{' '}\n {lastResult.total?.toLocaleString()}\n </span>\n <Button testid=\"prev-page-button\" size=\"small\" onClick={() => emitSearchChange(movePage(search, -1))}>\n <<\n </Button>\n <Button testid=\"next-page-button\" size=\"small\" onClick={() => emitSearchChange(movePage(search, 1))}>\n >>\n </Button>\n </div>\n )}\n </TitleBar>\n )}\n <table>\n <thead>\n <tr>\n {checkboxColumn && (\n <th className=\"medplum-search-icon-cell\">\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} onClick={(e) => handleSortClick(e, field.searchParams)}>\n {buildFieldNameString(field.name)}\n {field.searchParams && <FilterIcon />}\n </th>\n ))}\n </tr>\n {!props.hideFilters && (\n <tr>\n {checkboxColumn && <th className=\"filters medplum-search-icon-cell\" />}\n {fields.map((field) => (\n <th key={field.name} className=\"filters\">\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 data-testid=\"search-control-row\"\n onClick={(e) => handleRowClick(e, resource)}\n onAuxClick={(e) => handleRowClick(e, resource)}\n >\n {checkboxColumn && (\n <td className=\"medplum-search-icon-cell\">\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 <div data-testid=\"empty-search\" className=\"medplum-empty-search\">\n No results\n </div>\n )}\n {outcome && (\n <div data-testid=\"search-error\" className=\"medplum-empty-search\">\n <pre style={{ textAlign: 'left' }}>{JSON.stringify(outcome, undefined, 2)}</pre>\n </div>\n )}\n <SearchPopupMenu\n schema={schema}\n search={props.search}\n visible={state.popupVisible}\n x={state.popupX}\n y={state.popupY}\n searchParams={state.popupSearchParams}\n onPrompt={(searchParam, filter) => {\n setState({\n ...stateRef.current,\n popupVisible: false,\n filterDialogVisible: true,\n filterDialogSearchParam: searchParam,\n filterDialogFilter: filter,\n });\n }}\n onChange={(result) => {\n emitSearchChange(result);\n setState({\n ...stateRef.current,\n popupVisible: false,\n popupSearchParams: undefined,\n });\n }}\n onClose={() => {\n setState({\n ...stateRef.current,\n popupVisible: false,\n popupSearchParams: undefined,\n });\n }}\n />\n <SearchFieldEditor\n schema={schema}\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 schema={schema}\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 <SearchFilterValueDialog\n visible={stateRef.current.filterDialogVisible}\n title={'Input'}\n schema={schema}\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 FilterIcon(): JSX.Element {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"h-6 w-6\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"rgba(0, 0, 0, 0.3)\"\n strokeWidth={2}\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M4 6h16M4 12h16m-7 6h7\" />\n </svg>\n );\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","import { IndexedStructureDefinition, PropertyType } from '@medplum/core';\nimport { OperationOutcome, Resource } from '@medplum/fhirtypes';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { Button } from './Button';\nimport { FhirPathDisplay } from './FhirPathDisplay';\nimport { Loading } from './Loading';\nimport { useMedplum } from './MedplumProvider';\nimport { SearchClickEvent } from './SearchControl';\nimport { isCheckboxCell, killEvent } from './utils/dom';\nimport './SearchControl.css';\n\nexport interface SmartSearchField {\n readonly propertyType: PropertyType;\n readonly name: string;\n readonly fhirPath: string;\n}\n\nexport interface FhirPathTableProps {\n resourceType: string;\n query: string;\n fields: SmartSearchField[];\n checkboxesEnabled?: boolean;\n onClick?: (e: SearchClickEvent) => void;\n onAuxClick?: (e: SearchClickEvent) => void;\n onBulk?: (ids: string[]) => void;\n}\n\nexport interface SmartSearchResponse {\n data: {\n ResourceList: Resource[];\n };\n}\n\n/**\n * The FhirPathTable component represents the embeddable search table control.\n */\nexport function FhirPathTable(props: FhirPathTableProps): JSX.Element {\n const medplum = useMedplum();\n const [schema, setSchema] = useState<IndexedStructureDefinition | undefined>();\n const [outcome, setOutcome] = useState<OperationOutcome | undefined>();\n const { query, fields } = props;\n const [response, setResponse] = useState<SmartSearchResponse | undefined>();\n const [selected, setSelected] = useState<{ [id: string]: boolean }>({});\n\n const responseRef = useRef<SmartSearchResponse>();\n responseRef.current = response;\n\n const selectedRef = useRef<{ [id: string]: boolean }>({});\n selectedRef.current = selected;\n\n useEffect(() => {\n setOutcome(undefined);\n medplum.graphql(query).then(setResponse).catch(setOutcome);\n }, [medplum, query]);\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 = { ...selectedRef.current };\n if (checked) {\n newSelected[id] = true;\n } else {\n delete newSelected[id];\n }\n setSelected(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 resources = responseRef.current?.data?.ResourceList;\n if (checked && resources) {\n resources.forEach((resource) => {\n if (resource?.id) {\n newSelected[resource.id] = true;\n }\n });\n }\n setSelected(newSelected);\n }\n\n function isAllSelected(): boolean {\n const resources = responseRef.current?.data?.ResourceList;\n if (!resources || resources.length === 0) {\n return false;\n }\n for (const resource of resources) {\n if (resource?.id && !selectedRef.current[resource.id]) {\n return false;\n }\n }\n return true;\n }\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 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 useEffect(() => {\n medplum.requestSchema(props.resourceType).then((newSchema) => {\n // The schema could have the same object identity,\n // so need to use the spread operator to kick React re-render.\n setSchema({ ...newSchema });\n });\n }, [medplum, props.resourceType]);\n\n const typeSchema = schema?.types?.[props.resourceType];\n if (!typeSchema) {\n return <Loading />;\n }\n\n const checkboxColumn = props.checkboxesEnabled;\n\n return (\n <div className=\"medplum-search-control\" onContextMenu={(e) => killEvent(e)} data-testid=\"search-control\">\n <table>\n <thead>\n <tr>\n {checkboxColumn && (\n <th className=\"medplum-search-icon-cell\">\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}>{field.name}</th>\n ))}\n </tr>\n </thead>\n <tbody>\n {response?.data?.ResourceList?.map(\n (resource) =>\n resource && (\n <tr\n key={resource.id}\n data-testid=\"search-control-row\"\n onClick={(e) => handleRowClick(e, resource)}\n onAuxClick={(e) => handleRowClick(e, resource)}\n >\n {checkboxColumn && (\n <td className=\"medplum-search-icon-cell\">\n <input\n type=\"checkbox\"\n value=\"checked\"\n data-testid=\"row-checkbox\"\n aria-label={`Checkbox for ${resource.id}`}\n checked={!!selected[resource.id as string]}\n onChange={(e) => handleSingleCheckboxClick(e, resource.id as string)}\n />\n </td>\n )}\n {fields.map((field) => {\n return (\n <td key={field.name}>\n <FhirPathDisplay propertyType={field.propertyType} path={field.fhirPath} resource={resource} />\n </td>\n );\n })}\n </tr>\n )\n )}\n </tbody>\n </table>\n {response?.data?.ResourceList?.length === 0 && (\n <div data-testid=\"empty-search\" className=\"medplum-empty-search\">\n No results\n </div>\n )}\n {outcome && (\n <div data-testid=\"search-error\" className=\"medplum-empty-search\">\n <pre style={{ textAlign: 'left' }}>{JSON.stringify(outcome, undefined, 2)}</pre>\n </div>\n )}\n {props.onBulk && (\n <Button size=\"small\" onClick={() => (props.onBulk as (ids: string[]) => any)(Object.keys(selectedRef.current))}>\n Bulk...\n </Button>\n )}\n </div>\n );\n}\n\nexport const MemoizedFhirPathTable = React.memo(FhirPathTable);\n","/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n","import { formatHumanName, isUUID } from '@medplum/core';\nimport { Patient, ServiceRequest } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { Autocomplete } from './Autocomplete';\nimport { Avatar } from './Avatar';\nimport { useMedplum } from './MedplumProvider';\nimport { ResourceName } from './ResourceName';\n\nexport type HeaderSearchTypes = Patient | ServiceRequest;\n\nexport interface HeaderSearchInputProps {\n readonly name: string;\n readonly className?: string;\n readonly placeholder?: string;\n readonly onChange: (value: HeaderSearchTypes) => void;\n}\n\ninterface SearchGraphQLResponse {\n readonly data: {\n readonly Patients1: Patient[] | undefined;\n readonly Patients2: Patient[] | undefined;\n readonly ServiceRequestList: ServiceRequest[] | undefined;\n };\n}\n\nexport function HeaderSearchInput(props: HeaderSearchInputProps): JSX.Element {\n const medplum = useMedplum();\n return (\n <Autocomplete\n loadOptions={async (input: string, signal: AbortSignal): Promise<HeaderSearchTypes[]> => {\n return getResourcesFromResponse(\n (await medplum.graphql(buildGraphQLQuery(input), undefined, undefined, { signal })) as SearchGraphQLResponse,\n input\n );\n }}\n getId={(item: HeaderSearchTypes) => {\n return item.id as string;\n }}\n getIcon={(item: HeaderSearchTypes) => <Avatar value={item} />}\n getDisplay={(item: HeaderSearchTypes) => <ResourceName value={item} />}\n getHelpText={(item: HeaderSearchTypes) => {\n if (item.resourceType === 'Patient' && item.birthDate) {\n return 'DoB: ' + item.birthDate;\n }\n return (item as ServiceRequest).subject?.display;\n }}\n name={props.name}\n className={props.className}\n placeholder={props.placeholder}\n onChange={(items: HeaderSearchTypes[]) => props.onChange(items[0])}\n />\n );\n}\n\nfunction buildGraphQLQuery(input: string): string {\n const escaped = JSON.stringify(input);\n if (isUUID(input)) {\n return `{\n Patients1: PatientList(_id: ${escaped}, _count: 1) {\n resourceType\n id\n identifier {\n system\n value\n }\n name {\n given\n family\n }\n birthDate\n }\n ServiceRequestList(_id: ${escaped}, _count: 1) {\n resourceType\n id\n identifier {\n system\n value\n }\n subject {\n display\n }\n }\n }`.replace(/\\s+/g, ' ');\n }\n return `{\n Patients1: PatientList(name: ${escaped}, _count: 5) {\n resourceType\n id\n identifier {\n system\n value\n }\n name {\n given\n family\n }\n birthDate\n }\n Patients2: PatientList(identifier: ${escaped}, _count: 5) {\n resourceType\n id\n identifier {\n system\n value\n }\n name {\n given\n family\n }\n birthDate\n }\n ServiceRequestList(identifier: ${escaped}, _count: 5) {\n resourceType\n id\n identifier {\n system\n value\n }\n subject {\n display\n }\n }\n }`.replace(/\\s+/g, ' ');\n}\n\n/**\n * Returns a de-duped and sorted list of resources from the search response.\n * The search request is actually 3+ separate searches, which can include duplicates.\n * This function combines the results, de-dupes, and sorts by relevance.\n * @param response The response from a search query.\n * @param query The user entered search query.\n * @returns The resources to display in the autocomplete.\n */\nfunction getResourcesFromResponse(response: SearchGraphQLResponse, query: string): HeaderSearchTypes[] {\n const resources = [];\n if (response.data.Patients1) {\n resources.push(...response.data.Patients1);\n }\n if (response.data.Patients2) {\n resources.push(...response.data.Patients2);\n }\n if (response.data.ServiceRequestList) {\n resources.push(...response.data.ServiceRequestList);\n }\n return sortByRelevance(dedupeResources(resources), query).slice(0, 5);\n}\n\n/**\n * Removes duplicate resources from an array by ID.\n * @param resources The array of resources with possible duplicates.\n * @returns The array of resources with no duplicates.\n */\nfunction dedupeResources(resources: HeaderSearchTypes[]): HeaderSearchTypes[] {\n const ids = new Set<string>();\n const result = [];\n\n for (const resource of resources) {\n if (!ids.has(resource.id as string)) {\n ids.add(resource.id as string);\n result.push(resource);\n }\n }\n\n return result;\n}\n\n/**\n * Sorts an array of resources by relevance.\n * @param resources The candidate resources.\n * @param query The user entered search string.\n * @returns The sorted array of resources.\n */\nfunction sortByRelevance(resources: HeaderSearchTypes[], query: string): HeaderSearchTypes[] {\n return resources.sort((a: HeaderSearchTypes, b: HeaderSearchTypes) => {\n return getResourceScore(b, query) - getResourceScore(a, query);\n });\n}\n\n/**\n * Calculates a relevance score of a candidate resource.\n * Higher scores are better.\n * @param resource The candidate resource.\n * @param query The user entered search string.\n * @returns The relevance score of the candidate resource.\n */\nfunction getResourceScore(resource: HeaderSearchTypes, query: string): number {\n let bestScore = 0;\n\n if (resource.identifier) {\n for (const identifier of resource.identifier) {\n bestScore = Math.max(bestScore, getStringScore(identifier.value, query));\n }\n }\n\n if (resource.resourceType === 'Patient' && resource.name) {\n for (const name of resource.name) {\n bestScore = Math.max(bestScore, getStringScore(formatHumanName(name), query));\n }\n }\n\n return bestScore;\n}\n\n/**\n * Calculates a relevance score of a candidate display string.\n * Higher scores are better.\n * @param str The candidate display string.\n * @param query The user entered search string.\n * @returns The relevance score of the candidate string.\n */\nfunction getStringScore(str: string | undefined, query: string): number {\n if (!str) {\n return 0;\n }\n const index = str.toLowerCase().indexOf(query.toLowerCase());\n if (index < 0) {\n return 0;\n }\n return 100 - index;\n}\n","import React from 'react';\n\nexport interface LogoProps {\n size: number;\n fill?: string;\n}\n\nexport function Logo(props: LogoProps): JSX.Element {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 491 491\" style={{ width: props.size, height: props.size }}>\n <title>Medplum Logo</title>\n <path fill={props.fill || '#ad7136'} d=\"M282 67c6-16 16-29 29-40L289 0c-22 17-37 41-43 68l17 23 19-24z\" />\n <path\n fill={props.fill || '#654b87'}\n d=\"M311 63c-17 0-33 4-48 11-16-7-32-11-49-11-87 0-158 96-158 214s71 214 158 214c17 0 33-4 49-11 15 7 31 11 48 11 87 0 158-96 158-214S398 63 311 63z\"\n />\n <path\n fill={props.fill || '#463068'}\n d=\"M231 489l-17 2c-87 0-158-96-158-214S127 63 214 63l17 1c-39 12-70 102-70 213s31 201 70 212z\"\n />\n <path\n fill={props.fill || '#70d65b'}\n d=\"M207 220a176 176 0 01-177 43A176 176 0 01251 43l1 5c17 59 2 125-45 172z\"\n />\n <path fill={props.fill || '#58b741'} d=\"M252 48A421 421 0 0057 270l-27-7A176 176 0 01251 43l1 5z\" />\n </svg>\n );\n}\n","import { createReference, getReferenceString, ProfileResource } from '@medplum/core';\nimport { Attachment, Patient, Reference, Resource } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { ResourceTimeline } from './ResourceTimeline';\n\nexport interface PatientTimelineProps {\n patient: Patient | Reference<Patient>;\n}\n\nconst searches = [\n '$/_history',\n 'Communication?subject=$',\n 'Device?patient=$',\n 'DeviceRequest?patient=$',\n 'DiagnosticReport?subject=$',\n 'Media?subject=$',\n 'ServiceRequest?subject=$',\n];\n\nexport function PatientTimeline(props: PatientTimelineProps): JSX.Element {\n return (\n <ResourceTimeline\n value={props.patient}\n buildSearchRequests={(resource: Resource) => ({\n resourceType: 'Bundle',\n type: 'batch',\n entry: searches.map((search) => ({\n request: {\n method: 'GET',\n url: search.replaceAll('$', getReferenceString(resource)),\n },\n })),\n })}\n createCommunication={(resource: Patient, sender: ProfileResource, text: string) => ({\n resourceType: 'Communication',\n subject: createReference(resource),\n sender: createReference(sender),\n sent: new Date().toISOString(),\n payload: [{ contentString: text }],\n })}\n createMedia={(resource: Patient, operator: ProfileResource, content: Attachment) => ({\n resourceType: 'Media',\n subject: createReference(resource),\n operator: createReference(operator),\n issued: new Date().toISOString(),\n content,\n })}\n />\n );\n}\n","import { getReferenceString } from '@medplum/core';\nimport { PlanDefinition, PlanDefinitionAction, Reference } from '@medplum/fhirtypes';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { Button } from './Button';\nimport { Form } from './Form';\nimport { FormSection } from './FormSection';\nimport { Input } from './Input';\nimport { ResourceInput } from './ResourceInput';\nimport { Select } from './Select';\nimport { useResource } from './useResource';\n\nexport interface PlanDefinitionBuilderProps {\n value: PlanDefinition | Reference<PlanDefinition>;\n onSubmit: (result: PlanDefinition) => void;\n}\n\nexport function PlanDefinitionBuilder(props: PlanDefinitionBuilderProps): JSX.Element | null {\n const defaultValue = useResource(props.value);\n const [value, setValue] = useState<PlanDefinition>();\n const valueRef = useRef<PlanDefinition>();\n valueRef.current = value;\n\n useEffect(() => {\n setValue(ensurePlanDefinitionKeys(defaultValue ?? { resourceType: 'PlanDefinition' }));\n }, [defaultValue]);\n\n if (!value) {\n return null;\n }\n\n function changeProperty(property: string, newValue: any): void {\n setValue({\n ...valueRef.current,\n [property]: newValue,\n } as PlanDefinition);\n }\n\n return (\n <div className=\"medplum-questionnaire-builder\">\n <Form testid=\"questionnaire-form\" onSubmit={() => props.onSubmit(value)}>\n <FormSection\n title=\"Plan Title\"\n description=\"The display name of the 'Plan', something that can be ordered.\"\n htmlFor=\"title\"\n >\n <Input defaultValue={value.title} onChange={(newValue) => changeProperty('title', newValue)} />\n </FormSection>\n <ActionArrayBuilder actions={value.action || []} onChange={(x) => changeProperty('action', x)} />\n <Button type=\"submit\" size=\"large\">\n Save\n </Button>\n </Form>\n </div>\n );\n}\n\ninterface ActionArrayBuilderProps {\n actions: PlanDefinitionAction[];\n onChange: (actions: PlanDefinitionAction[]) => void;\n}\n\nfunction ActionArrayBuilder(props: ActionArrayBuilderProps): JSX.Element {\n const actionsRef = useRef<PlanDefinitionAction[]>();\n actionsRef.current = props.actions;\n\n function changeAction(changedAction: PlanDefinitionAction): void {\n props.onChange(\n (actionsRef.current as PlanDefinition[]).map((i) => (i.id === changedAction.id ? changedAction : i))\n );\n }\n\n function addAction(addedAction: PlanDefinitionAction): void {\n props.onChange([...(actionsRef.current as PlanDefinition[]), addedAction]);\n }\n\n function removeAction(removedAction: PlanDefinitionAction): void {\n props.onChange((actionsRef.current as PlanDefinition[]).filter((i) => i !== removedAction));\n }\n\n return (\n <div className=\"section\">\n {props.actions.map((i) => (\n <div key={i.id}>\n <ActionBuilder action={i} onChange={changeAction} onRemove={() => removeAction(i)} />\n </div>\n ))}\n <div className=\"bottom-actions\">\n <a\n href=\"#\"\n onClick={(e) => {\n e.preventDefault();\n addAction({ id: generateId() });\n }}\n >\n Add action\n </a>\n </div>\n </div>\n );\n}\n\ninterface ActionBuilderProps {\n action: PlanDefinitionAction;\n onChange: (action: PlanDefinitionAction) => void;\n onRemove: () => void;\n}\n\nfunction ActionBuilder(props: ActionBuilderProps): JSX.Element {\n const { action } = props;\n const [actionType, setActionType] = useState<string | undefined>(getInitialActionType(action));\n\n const actionRef = useRef<PlanDefinitionAction>();\n actionRef.current = props.action;\n\n function changeProperty(property: string, value: any): void {\n props.onChange({\n ...actionRef.current,\n [property]: value,\n } as PlanDefinitionAction);\n }\n\n return (\n <div className=\"section\">\n <FormSection\n title=\"Action Title\"\n description=\"The name of the action, an operational task to be completed.\"\n htmlFor={`actionTitle-${action.id}`}\n >\n <Input\n name={`actionTitle-${action.id}`}\n defaultValue={action.title}\n onChange={(newValue) => changeProperty('title', newValue)}\n />\n </FormSection>\n <FormSection\n title=\"Action Type\"\n description=\"The type of the action to be performed.\"\n htmlFor={`actionType-${action.id}`}\n >\n <Select name={`actionType-${action.id}`} defaultValue={actionType} onChange={setActionType}>\n <option></option>\n <option value=\"appointment\">Appointment</option>\n <option value=\"documentation\">Documentation</option>\n <option value=\"lab\">Lab</option>\n <option value=\"questionnaire\">Questionnaire</option>\n <option value=\"shipping\">Shipping</option>\n <option value=\"task\">Task</option>\n </Select>\n </FormSection>\n {action.action && action.action.length > 0 && (\n <ActionArrayBuilder actions={action.action} onChange={(x) => changeProperty('action', x)} />\n )}\n {(() => {\n switch (actionType) {\n case 'appointment':\n return <div>Appointment details</div>;\n case 'documentation':\n return <div>Documentation details</div>;\n case 'lab':\n return <LabActionBuilder action={action} onChange={props.onChange} />;\n case 'questionnaire':\n return <QuestionnaireActionBuilder action={action} onChange={props.onChange} />;\n case 'shipping':\n return <div>Shipping details</div>;\n case 'task':\n return <div>Task details</div>;\n default:\n return null;\n }\n })()}\n <div className=\"bottom-actions\">\n <a\n href=\"#\"\n onClick={(e) => {\n e.preventDefault();\n props.onRemove();\n }}\n >\n Remove\n </a>\n </div>\n </div>\n );\n}\n\ninterface LabActionBuilderProps {\n action: PlanDefinitionAction;\n onChange: (action: PlanDefinitionAction) => void;\n}\n\nfunction LabActionBuilder(props: LabActionBuilderProps): JSX.Element {\n return (\n <FormSection title=\"Lab Details\" description=\"Choose observations definitions\" htmlFor={props.action.id}>\n <a href=\"#\" onClick={() => props.onChange(props.action)}>\n Add\n </a>\n </FormSection>\n );\n}\n\ninterface QuestionnaireActionBuilderProps {\n action: PlanDefinitionAction;\n onChange: (action: PlanDefinitionAction) => void;\n}\n\nfunction QuestionnaireActionBuilder(props: QuestionnaireActionBuilderProps): JSX.Element {\n const { id, definitionCanonical } = props.action;\n const questionnaireRef = definitionCanonical?.startsWith('Questionnaire/')\n ? { reference: definitionCanonical }\n : undefined;\n return (\n <FormSection title=\"Questionnaire\" description=\"Choose questionnaire\" htmlFor={id}>\n <ResourceInput\n name={id as string}\n resourceType=\"Questionnaire\"\n defaultValue={questionnaireRef}\n onChange={(newValue) => {\n if (newValue) {\n props.onChange({ ...props.action, definitionCanonical: getReferenceString(newValue) });\n } else {\n props.onChange({ ...props.action, definitionCanonical: undefined });\n }\n }}\n />\n </FormSection>\n );\n}\n\nfunction getInitialActionType(action: PlanDefinitionAction): string | undefined {\n if (action.definitionCanonical?.startsWith('Questionnaire/')) {\n return 'questionnaire';\n }\n\n return undefined;\n}\n\nlet nextId = 1;\n\n/**\n * Generates a unique ID.\n * React needs unique IDs for components for rendering performance.\n * All of the important components in the questionnaire builder have id properties for this:\n * Questionnaire, QuestionnaireItem, and QuestionnaireItemAnswerOption.\n * @return A unique key.\n */\nfunction generateId(existing?: string): string {\n if (existing) {\n if (existing.startsWith('id-')) {\n const existingNum = parseInt(existing.substring(3));\n if (!isNaN(existingNum)) {\n nextId = Math.max(nextId, existingNum + 1);\n }\n }\n return existing;\n }\n return 'id-' + nextId++;\n}\n\nfunction ensurePlanDefinitionKeys(planDefinition: PlanDefinition): PlanDefinition {\n return {\n ...planDefinition,\n action: ensurePlanDefinitionActionKeys(planDefinition.action),\n } as PlanDefinition;\n}\n\nfunction ensurePlanDefinitionActionKeys(\n actions: PlanDefinitionAction[] | undefined\n): PlanDefinitionAction[] | undefined {\n if (!actions) {\n return undefined;\n }\n return actions.map((action) => ({\n ...action,\n id: generateId(action.id),\n action: ensurePlanDefinitionActionKeys(action.action),\n }));\n}\n","import { PropertyType } from '@medplum/core';\nimport { Questionnaire, QuestionnaireItem, QuestionnaireItemInitial } from '@medplum/fhirtypes';\n\nexport enum QuestionnaireItemType {\n group = 'group',\n display = 'display',\n question = 'question',\n boolean = 'boolean',\n decimal = 'decimal',\n integer = 'integer',\n date = 'date',\n dateTime = 'dateTime',\n time = 'time',\n string = 'string',\n text = 'text',\n url = 'url',\n choice = 'choice',\n openChoice = 'open-choice',\n attachment = 'attachment',\n reference = 'reference',\n quantity = 'quantity',\n}\n\n/**\n * Adds initial values to a questionnaire resource from key value pairs.\n * The values map uses \"linkId\" as key.\n * The value depends on the questionnaire item type.\n * @param questionnaire The original questionnaire.\n * @param values Key value pairs for initial values.\n * @returns Rewritten questionnaire with initial values.\n */\nexport function addQuestionnaireInitialValues(\n questionnaire: Questionnaire,\n values: Record<string, string>\n): Questionnaire {\n return {\n ...questionnaire,\n item: addInitialValuesToItemArray(questionnaire.item, values),\n };\n}\n\nfunction addInitialValuesToItemArray(\n items: QuestionnaireItem[] | undefined,\n values: any\n): QuestionnaireItem[] | undefined {\n if (!items) {\n return undefined;\n }\n return items.map((item) => addInitialValueToItem(item, values));\n}\n\nfunction addInitialValueToItem(item: QuestionnaireItem, values: Record<string, string>): QuestionnaireItem {\n const { linkId, type } = item;\n if (!linkId || !type) {\n return item;\n }\n\n if (type === 'group') {\n return {\n ...item,\n item: addInitialValuesToItemArray(item.item, values),\n };\n }\n\n const suppliedValue = values[linkId];\n if (!suppliedValue) {\n return item;\n }\n\n let initialValue: QuestionnaireItemInitial | undefined = undefined;\n switch (type) {\n case PropertyType.boolean:\n initialValue = { valueBoolean: suppliedValue === 'true' };\n break;\n case PropertyType.code:\n case PropertyType.Coding:\n initialValue = { valueCoding: { code: suppliedValue } };\n break;\n case PropertyType.date:\n initialValue = { valueDate: suppliedValue };\n break;\n case PropertyType.dateTime:\n case PropertyType.instant:\n initialValue = { valueDateTime: suppliedValue };\n break;\n case PropertyType.decimal:\n initialValue = { valueDecimal: parseFloat(suppliedValue) };\n break;\n case PropertyType.integer:\n case PropertyType.positiveInt:\n case PropertyType.unsignedInt:\n initialValue = { valueInteger: parseInt(suppliedValue) };\n break;\n case PropertyType.SystemString:\n case PropertyType.string:\n case PropertyType.markdown:\n initialValue = { valueString: suppliedValue };\n break;\n case PropertyType.time:\n initialValue = { valueTime: suppliedValue };\n break;\n case PropertyType.uri:\n case PropertyType.url:\n initialValue = { valueUri: suppliedValue };\n break;\n case PropertyType.canonical:\n case PropertyType.Reference:\n initialValue = { valueReference: { reference: suppliedValue } };\n break;\n }\n\n if (!initialValue) {\n return item;\n }\n\n return {\n ...item,\n initial: [initialValue],\n };\n}\n\nexport function isChoiceQuestion(item: QuestionnaireItem): boolean {\n return item.type === 'choice' || item.type === 'open-choice';\n}\n","import {\n capitalize,\n createReference,\n getReferenceString,\n getTypedPropertyValue,\n globalSchema,\n IndexedStructureDefinition,\n ProfileResource,\n PropertyType,\n stringify,\n TypedValue,\n} from '@medplum/core';\nimport {\n Questionnaire,\n QuestionnaireItem,\n QuestionnaireItemAnswerOption,\n QuestionnaireItemInitial,\n QuestionnaireResponse,\n QuestionnaireResponseItem,\n QuestionnaireResponseItemAnswer,\n Reference,\n} from '@medplum/fhirtypes';\nimport React, { ChangeEvent, useEffect, useState } from 'react';\nimport { AttachmentInput } from './AttachmentInput';\nimport { Button } from './Button';\nimport { Checkbox } from './Checkbox';\nimport { CheckboxFormSection } from './CheckboxFormSection';\nimport { DateTimeInput } from './DateTimeInput';\nimport { Form } from './Form';\nimport { FormSection } from './FormSection';\nimport { Input } from './Input';\nimport { useMedplum } from './MedplumProvider';\nimport { QuantityInput } from './QuantityInput';\nimport { QuestionnaireItemType } from './QuestionnaireUtils';\nimport { ReferenceInput } from './ReferenceInput';\nimport { ResourcePropertyDisplay } from './ResourcePropertyDisplay';\nimport { TextArea } from './TextArea';\nimport { useResource } from './useResource';\nimport './QuestionnaireForm.css';\n\nexport interface QuestionnaireFormProps {\n questionnaire: Questionnaire | Reference<Questionnaire>;\n subject?: Reference;\n onSubmit: (response: QuestionnaireResponse) => void;\n}\n\nexport function QuestionnaireForm(props: QuestionnaireFormProps): JSX.Element | null {\n const medplum = useMedplum();\n const source = medplum.getProfile();\n const [schema, setSchema] = useState<IndexedStructureDefinition | undefined>();\n const questionnaire = useResource(props.questionnaire);\n const [response, setResponse] = useState<QuestionnaireResponse | undefined>();\n\n useEffect(() => {\n medplum.requestSchema('Questionnaire').then(setSchema);\n }, [medplum]);\n\n useEffect(() => {\n setResponse(questionnaire ? buildInitialResponse(questionnaire) : undefined);\n }, [questionnaire]);\n\n function setItems(newResponseItems: QuestionnaireResponseItem[]): void {\n setResponse({\n resourceType: 'QuestionnaireResponse',\n item: newResponseItems,\n });\n }\n\n if (!schema || !questionnaire) {\n return null;\n }\n\n return (\n <Form\n testid=\"questionnaire-form\"\n onSubmit={() => {\n if (props.onSubmit && response) {\n props.onSubmit({\n ...response,\n questionnaire: getReferenceString(questionnaire),\n subject: props.subject,\n source: createReference(source as ProfileResource),\n authored: new Date().toISOString(),\n });\n }\n }}\n >\n {questionnaire.title && <h1>{questionnaire.title}</h1>}\n {questionnaire.item && <QuestionnaireFormItemArray items={questionnaire.item} onChange={setItems} />}\n <Button type=\"submit\" size=\"large\">\n OK\n </Button>\n </Form>\n );\n}\n\ninterface QuestionnaireFormItemArrayProps {\n items: QuestionnaireItem[];\n onChange: (newResponseItems: QuestionnaireResponseItem[]) => void;\n}\n\nfunction QuestionnaireFormItemArray(props: QuestionnaireFormItemArrayProps): JSX.Element {\n const [responseItems, setResponseItems] = useState<QuestionnaireResponseItem[]>(\n buildInitialResponseItems(props.items)\n );\n\n function setResponseItem(index: number, newResponseItem: QuestionnaireResponseItem): void {\n const newResponseItems = responseItems.slice();\n newResponseItems[index] = newResponseItem;\n setResponseItems(newResponseItems);\n props.onChange(newResponseItems);\n }\n\n return (\n <>\n {props.items.map((item, index) => {\n if (item.type === QuestionnaireItemType.display) {\n return <p key={item.linkId}>{item.text}</p>;\n }\n if (item.type === QuestionnaireItemType.group) {\n return (\n <QuestionnaireFormItem\n key={item.linkId}\n item={item}\n onChange={(newResponseItem) => setResponseItem(index, newResponseItem)}\n />\n );\n }\n if (item.type === QuestionnaireItemType.boolean) {\n const initial = item.initial && item.initial.length > 0 ? item.initial[0] : undefined;\n return (\n <CheckboxFormSection key={item.linkId} title={item.text} htmlFor={item.linkId}>\n <Checkbox\n name={item.linkId}\n defaultValue={initial?.valueBoolean}\n onChange={(newValue) =>\n setResponseItem(index, {\n linkId: item.linkId,\n answer: [{ valueBoolean: newValue }],\n })\n }\n />\n </CheckboxFormSection>\n );\n }\n return (\n <FormSection key={item.linkId} htmlFor={item.linkId} title={item.text || ''}>\n <QuestionnaireFormItem\n item={item}\n onChange={(newResponseItem) => setResponseItem(index, newResponseItem)}\n />\n </FormSection>\n );\n })}\n </>\n );\n}\n\nexport interface QuestionnaireFormItemProps {\n item: QuestionnaireItem;\n onChange: (newResponseItem: QuestionnaireResponseItem) => void;\n}\n\nexport function QuestionnaireFormItem(props: QuestionnaireFormItemProps): JSX.Element | null {\n const item = props.item;\n\n const type = item.type as QuestionnaireItemType;\n if (!type) {\n return null;\n }\n\n const name = item.linkId;\n if (!name) {\n return null;\n }\n\n const initial = item.initial && item.initial.length > 0 ? item.initial[0] : undefined;\n\n function onChangeItem(newResponseItems: QuestionnaireResponseItem[]): void {\n props.onChange({\n linkId: item.linkId,\n item: newResponseItems,\n });\n }\n\n function onChangeAnswer(newResponseAnswer: QuestionnaireResponseItemAnswer): void {\n props.onChange({\n linkId: item.linkId,\n answer: [newResponseAnswer],\n });\n }\n\n switch (type) {\n case QuestionnaireItemType.group:\n return (\n <div>\n <h3>{item.text}</h3>\n {item.item && <QuestionnaireFormItemArray items={item.item} onChange={onChangeItem} />}\n </div>\n );\n case QuestionnaireItemType.boolean:\n return (\n <Checkbox\n name={name}\n defaultValue={initial?.valueBoolean}\n onChange={(newValue) => onChangeAnswer({ valueBoolean: newValue })}\n />\n );\n case QuestionnaireItemType.decimal:\n return (\n <Input\n type=\"number\"\n step=\"any\"\n name={name}\n defaultValue={initial?.valueDecimal}\n onChange={(newValue) => onChangeAnswer({ valueDecimal: parseFloat(newValue) })}\n />\n );\n case QuestionnaireItemType.integer:\n return (\n <Input\n type=\"number\"\n step={1}\n name={name}\n defaultValue={initial?.valueInteger}\n onChange={(newValue) => onChangeAnswer({ valueInteger: parseInt(newValue) })}\n />\n );\n case QuestionnaireItemType.date:\n return (\n <Input\n type=\"date\"\n name={name}\n defaultValue={initial?.valueDate}\n onChange={(newValue) => onChangeAnswer({ valueDate: newValue })}\n />\n );\n case QuestionnaireItemType.dateTime:\n return (\n <DateTimeInput\n type=\"datetime-local\"\n name={name}\n defaultValue={initial?.valueDateTime}\n onChange={(newValue) => onChangeAnswer({ valueDateTime: newValue })}\n />\n );\n case QuestionnaireItemType.time:\n return (\n <Input\n type=\"time\"\n name={name}\n defaultValue={initial?.valueTime}\n onChange={(newValue) => onChangeAnswer({ valueTime: newValue })}\n />\n );\n case QuestionnaireItemType.string:\n return (\n <Input\n type=\"text\"\n name={name}\n defaultValue={initial?.valueString}\n onChange={(newValue) => onChangeAnswer({ valueString: newValue })}\n />\n );\n case QuestionnaireItemType.text:\n return (\n <TextArea\n name={name}\n defaultValue={initial?.valueString}\n onChange={(newValue) => onChangeAnswer({ valueString: newValue })}\n />\n );\n case QuestionnaireItemType.url:\n return (\n <Input\n type=\"url\"\n name={name}\n defaultValue={initial?.valueUri}\n onChange={(newValue) => onChangeAnswer({ valueUri: newValue })}\n />\n );\n case QuestionnaireItemType.attachment:\n return (\n <AttachmentInput\n name={name}\n defaultValue={initial?.valueAttachment}\n onChange={(newValue) => onChangeAnswer({ valueAttachment: newValue })}\n />\n );\n case QuestionnaireItemType.reference:\n return (\n <ReferenceInput\n name={name}\n defaultValue={initial?.valueReference}\n onChange={(newValue) => onChangeAnswer({ valueReference: newValue })}\n />\n );\n case QuestionnaireItemType.quantity:\n return (\n <QuantityInput\n name={name}\n defaultValue={initial?.valueQuantity}\n onChange={(newValue) => onChangeAnswer({ valueQuantity: newValue })}\n />\n );\n case QuestionnaireItemType.choice:\n case QuestionnaireItemType.openChoice:\n if (isDropDownChoice(item)) {\n return (\n <QuestionnaireChoiceDropDownInput name={name} item={item} initial={initial} onChangeAnswer={onChangeAnswer} />\n );\n } else {\n return (\n <QuestionnaireChoiceRadioInput name={name} item={item} initial={initial} onChangeAnswer={onChangeAnswer} />\n );\n }\n }\n\n return null;\n}\n\ninterface QuestionnaireChoiceInputProps {\n name: string;\n item: QuestionnaireItem;\n initial: QuestionnaireItemInitial | undefined;\n onChangeAnswer: (newResponseAnswer: QuestionnaireResponseItemAnswer) => void;\n}\n\nfunction QuestionnaireChoiceDropDownInput(props: QuestionnaireChoiceInputProps): JSX.Element {\n const { name, item, initial } = props;\n const valueElementDefinition = globalSchema.types['QuestionnaireItemAnswerOption'].properties['value[x]'];\n const initialValue = getTypedPropertyValue({ type: 'QuestionnaireItemInitial', value: initial }, 'value') as\n | TypedValue\n | undefined;\n\n return (\n <select\n id={name}\n name={name}\n className=\"medplum-select\"\n onChange={(e: ChangeEvent<HTMLSelectElement>) => {\n const index = e.currentTarget.selectedIndex;\n if (index === 0) {\n props.onChangeAnswer({});\n return;\n }\n const option = (item.answerOption as QuestionnaireItemAnswerOption[])[index - 1];\n const optionValue = getTypedPropertyValue(\n { type: 'QuestionnaireItemAnswerOption', value: option },\n 'value'\n ) as TypedValue;\n const propertyName = 'value' + capitalize(optionValue.type);\n props.onChangeAnswer({ [propertyName]: optionValue.value });\n }}\n >\n <option></option>\n {item.answerOption &&\n item.answerOption.map((option: QuestionnaireItemAnswerOption, index: number) => {\n const optionValue = getTypedPropertyValue(\n { type: 'QuestionnaireItemAnswerOption', value: option },\n 'value'\n ) as TypedValue;\n const optionName = `${name}-option-${index}`;\n return (\n <option\n key={optionName}\n value={optionValue.value}\n selected={initialValue && stringify(optionValue) === stringify(initialValue)}\n >\n <ResourcePropertyDisplay\n property={valueElementDefinition}\n propertyType={optionValue.type as PropertyType}\n value={optionValue.value}\n />\n </option>\n );\n })}\n </select>\n );\n}\n\nfunction QuestionnaireChoiceRadioInput(props: QuestionnaireChoiceInputProps): JSX.Element {\n const { name, item, initial, onChangeAnswer } = props;\n const valueElementDefinition = globalSchema.types['QuestionnaireItemAnswerOption'].properties['value[x]'];\n const initialValue = getTypedPropertyValue({ type: 'QuestionnaireItemInitial', value: initial }, 'value') as\n | TypedValue\n | undefined;\n return (\n <>\n {item.answerOption &&\n item.answerOption.map((option: QuestionnaireItemAnswerOption, index: number) => {\n const optionValue = getTypedPropertyValue(\n { type: 'QuestionnaireItemAnswerOption', value: option },\n 'value'\n ) as TypedValue;\n const propertyName = 'value' + capitalize(optionValue.type);\n const optionName = `${name}-option-${index}`;\n return (\n <div key={optionName} className=\"medplum-questionnaire-option-row\">\n <div className=\"medplum-questionnaire-option-checkbox\">\n <input\n type=\"radio\"\n id={optionName}\n name={name}\n value={optionValue.value}\n defaultChecked={initialValue && stringify(optionValue) === stringify(initialValue)}\n onChange={() => onChangeAnswer({ [propertyName]: optionValue.value })}\n />\n </div>\n <div>\n <label htmlFor={optionName}>\n <ResourcePropertyDisplay\n property={valueElementDefinition}\n propertyType={optionValue.type as PropertyType}\n value={optionValue.value}\n />\n </label>\n </div>\n </div>\n );\n })}\n </>\n );\n}\n\nfunction buildInitialResponse(questionnaire: Questionnaire): QuestionnaireResponse {\n const response: QuestionnaireResponse = {\n resourceType: 'QuestionnaireResponse',\n questionnaire: getReferenceString(questionnaire),\n item: buildInitialResponseItems(questionnaire.item),\n };\n\n return response;\n}\n\nfunction buildInitialResponseItems(items: QuestionnaireItem[] | undefined): QuestionnaireResponseItem[] {\n return items?.map(buildInitialResponseItem) ?? [];\n}\n\nfunction buildInitialResponseItem(item: QuestionnaireItem): QuestionnaireResponseItem {\n return {\n linkId: item.linkId,\n item: buildInitialResponseItems(item.item),\n answer: item.initial?.map(buildInitialResponseAnswer) ?? [],\n };\n}\n\nfunction buildInitialResponseAnswer(answer: QuestionnaireItemInitial): QuestionnaireResponseItemAnswer {\n // This works because QuestionnaireItemInitial and QuestionnaireResponseItemAnswer\n // have the same properties.\n return { ...answer };\n}\n\nfunction isDropDownChoice(item: QuestionnaireItem): boolean {\n return !!item.extension?.some(\n (e) =>\n e.url === 'http://hl7.org/fhir/StructureDefinition/questionnaire-itemControl' &&\n e.valueCodeableConcept?.coding?.[0]?.code === 'drop-down'\n );\n}\n","import { globalSchema, IndexedStructureDefinition } from '@medplum/core';\nimport { Questionnaire, QuestionnaireItem, QuestionnaireItemAnswerOption, Reference } from '@medplum/fhirtypes';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { Button } from './Button';\nimport { Form } from './Form';\nimport { Input } from './Input';\nimport { useMedplum } from './MedplumProvider';\nimport { QuestionnaireFormItem } from './QuestionnaireForm';\nimport { isChoiceQuestion, QuestionnaireItemType } from './QuestionnaireUtils';\nimport { getValueAndType } from './ResourcePropertyDisplay';\nimport { ResourcePropertyInput } from './ResourcePropertyInput';\nimport { Select } from './Select';\nimport { TextArea } from './TextArea';\nimport { useResource } from './useResource';\nimport { killEvent } from './utils/dom';\nimport './QuestionnaireBuilder.css';\n\nexport interface QuestionnaireBuilderProps {\n questionnaire: Questionnaire | Reference<Questionnaire>;\n onSubmit: (result: Questionnaire) => void;\n}\n\nexport function QuestionnaireBuilder(props: QuestionnaireBuilderProps): JSX.Element | null {\n const medplum = useMedplum();\n const defaultValue = useResource(props.questionnaire);\n const [schema, setSchema] = useState<IndexedStructureDefinition | undefined>();\n const [value, setValue] = useState<Questionnaire>();\n const [selectedKey, setSelectedKey] = useState<string>();\n const [hoverKey, setHoverKey] = useState<string>();\n\n function handleDocumentMouseOver(): void {\n setHoverKey(undefined);\n }\n\n function handleDocumentClick(): void {\n setSelectedKey(undefined);\n }\n\n useEffect(() => {\n medplum.requestSchema('Questionnaire').then(setSchema);\n }, [medplum]);\n\n useEffect(() => {\n setValue(ensureQuestionnaireKeys(defaultValue ?? { resourceType: 'Questionnaire' }));\n document.addEventListener('mouseover', handleDocumentMouseOver);\n document.addEventListener('click', handleDocumentClick);\n return () => {\n document.removeEventListener('mouseover', handleDocumentMouseOver);\n document.removeEventListener('click', handleDocumentClick);\n };\n }, [defaultValue]);\n\n if (!schema || !value) {\n return null;\n }\n\n return (\n <div className=\"medplum-questionnaire-builder\">\n <Form testid=\"questionnaire-form\" onSubmit={() => props.onSubmit(value)}>\n <ItemBuilder\n item={value}\n selectedKey={selectedKey}\n setSelectedKey={setSelectedKey}\n hoverKey={hoverKey}\n setHoverKey={setHoverKey}\n onChange={setValue}\n />\n <Button type=\"submit\" size=\"large\">\n Save\n </Button>\n </Form>\n </div>\n );\n}\n\ninterface ItemBuilderProps<T extends Questionnaire | QuestionnaireItem> {\n item: T;\n selectedKey: string | undefined;\n setSelectedKey: (key: string | undefined) => void;\n hoverKey: string | undefined;\n setHoverKey: (key: string | undefined) => void;\n onChange: (item: T) => void;\n onRemove?: () => void;\n}\n\nfunction ItemBuilder<T extends Questionnaire | QuestionnaireItem>(props: ItemBuilderProps<T>): JSX.Element {\n const resource = props.item as Questionnaire;\n const item = props.item as QuestionnaireItem;\n const isResource = 'resourceType' in props.item;\n const isContainer = isResource || item.type === QuestionnaireItemType.group;\n const linkId = item.linkId ?? '[untitled]';\n const editing = props.selectedKey === props.item.id;\n const hovering = props.hoverKey === props.item.id;\n\n const itemRef = useRef<T>();\n itemRef.current = props.item;\n\n function onClick(e: React.SyntheticEvent): void {\n killEvent(e);\n props.setSelectedKey(props.item.id);\n }\n\n function onHover(e: React.SyntheticEvent): void {\n killEvent(e);\n props.setHoverKey(props.item.id);\n }\n\n function changeItem(changedItem: QuestionnaireItem): void {\n const curr = itemRef.current as T;\n props.onChange({\n ...curr,\n item: curr.item?.map((i) => (i.id === changedItem.id ? changedItem : i)),\n } as T);\n }\n\n function addItem(addedItem: QuestionnaireItem): void {\n props.onChange({\n ...props.item,\n item: [...(props.item?.item ?? []), addedItem],\n });\n }\n\n function removeItem(removedItem: QuestionnaireItem): void {\n props.onChange({\n ...props.item,\n item: props.item?.item?.filter((i) => i !== removedItem),\n });\n }\n\n function changeProperty(property: string, value: any): void {\n props.onChange({\n ...itemRef.current,\n [property]: value,\n } as T);\n }\n\n const className = editing ? 'section editing' : hovering ? 'section hovering' : 'section';\n return (\n <div data-testid={item.linkId} className={className} onClick={onClick} onMouseOver={onHover}>\n {editing ? (\n <>\n {isResource && (\n <div>\n <Input defaultValue={resource.title} onChange={(newValue) => changeProperty('title', newValue)} />\n </div>\n )}\n {!isContainer && (\n <div>\n <Select defaultValue={item.type} onChange={(newValue) => changeProperty('type', newValue)}>\n <option value=\"display\">Display</option>\n <optgroup label=\"Question\">\n <option value=\"boolean\">Boolean</option>\n <option value=\"decimal\">Decimal</option>\n <option value=\"integer\">Integer</option>\n <option value=\"date\">Date</option>\n <option value=\"dateTime\">Date/Time</option>\n <option value=\"time\">Time</option>\n <option value=\"string\">String</option>\n <option value=\"text\">Text</option>\n <option value=\"url\">URL</option>\n <option value=\"choice\">Choice</option>\n <option value=\"open-choice\">Open Choice</option>\n <option value=\"attachment\">Attachment</option>\n <option value=\"reference\">Reference</option>\n <option value=\"quantity\">Quantity</option>\n </optgroup>\n </Select>\n </div>\n )}\n {!isResource && (\n <TextArea\n style={{ width: '95%', height: '100px', minHeight: '100px', margin: '8px 4px 4px 4px' }}\n defaultValue={item.text}\n onChange={(newValue) => changeProperty('text', newValue)}\n />\n )}\n {isChoiceQuestion(item) && (\n <AnswerBuilder\n options={item.answerOption}\n onChange={(newOptions) => changeProperty('answerOption', newOptions)}\n />\n )}\n </>\n ) : (\n <>\n {resource.title && <h1>{resource.title}</h1>}\n {item.text && <p>{item.text}</p>}\n {!isContainer && <QuestionnaireFormItem item={item} onChange={() => undefined} />}\n </>\n )}\n {item.item &&\n item.item.map((i) => (\n <div key={i.id}>\n <ItemBuilder\n item={i}\n selectedKey={props.selectedKey}\n setSelectedKey={props.setSelectedKey}\n hoverKey={props.hoverKey}\n setHoverKey={props.setHoverKey}\n onChange={changeItem}\n onRemove={() => removeItem(i)}\n />\n </div>\n ))}\n {!isContainer && (\n <div className=\"top-actions\">\n {editing ? (\n <Input defaultValue={item.linkId} onChange={(newValue) => changeProperty('linkId', newValue)} size={4} />\n ) : (\n <div>{linkId}</div>\n )}\n </div>\n )}\n <div className=\"bottom-actions\">\n {isContainer && (\n <>\n <a\n href=\"#\"\n onClick={(e) => {\n e.preventDefault();\n addItem({\n id: generateId(),\n linkId: generateLinkId('q'),\n type: 'string',\n text: 'Question',\n } as QuestionnaireItem);\n }}\n >\n Add item\n </a>\n <a\n href=\"#\"\n onClick={(e) => {\n e.preventDefault();\n addItem({\n id: generateId(),\n linkId: generateLinkId('g'),\n type: 'group',\n text: 'Group',\n } as QuestionnaireItem);\n }}\n >\n Add group\n </a>\n </>\n )}\n {!isResource && (\n <a\n href=\"#\"\n onClick={(e) => {\n e.preventDefault();\n if (props.onRemove) {\n props.onRemove();\n }\n }}\n >\n Remove\n </a>\n )}\n </div>\n </div>\n );\n}\n\ninterface AnswerBuilderProps {\n options?: QuestionnaireItemAnswerOption[];\n onChange: (newOptions: QuestionnaireItemAnswerOption[]) => void;\n}\n\nfunction AnswerBuilder(props: AnswerBuilderProps): JSX.Element {\n const property = globalSchema.types['QuestionnaireItemAnswerOption'].properties['value[x]'];\n const options = props.options ?? [];\n return (\n <div>\n {options.map((option: QuestionnaireItemAnswerOption) => {\n const [propertyValue, propertyType] = getValueAndType(\n { type: 'QuestionnaireItemAnswerOption', value: option },\n 'value'\n );\n return (\n <div\n key={option.id}\n style={{\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'space-between',\n alignItems: 'center',\n width: '80%',\n }}\n >\n <div>\n <ResourcePropertyInput\n key={option.id}\n name=\"value[x]\"\n property={property}\n defaultPropertyType={propertyType}\n defaultValue={propertyValue}\n onChange={(newValue: any, propName?: string) => {\n const newOptions = [...options];\n const index = newOptions.findIndex((o) => o.id === option.id);\n newOptions[index] = { id: option.id, [propName as string]: newValue };\n props.onChange(newOptions);\n }}\n />\n </div>\n <div>\n <a\n href=\"#\"\n onClick={(e: React.SyntheticEvent) => {\n killEvent(e);\n props.onChange(options.filter((o) => o.id !== option.id));\n }}\n >\n Remove\n </a>\n </div>\n </div>\n );\n })}\n <a\n href=\"#\"\n onClick={(e: React.SyntheticEvent) => {\n killEvent(e);\n props.onChange([\n ...options,\n {\n id: generateId(),\n },\n ]);\n }}\n >\n Add choice\n </a>\n </div>\n );\n}\n\nlet nextLinkId = 1;\nlet nextId = 1;\n\n/**\n * Generates a link ID for an item.\n * Link IDs are required properties on QuestionnaireItem objects.\n * @return A unique link ID.\n */\nfunction generateLinkId(prefix: string): string {\n return prefix + nextLinkId++;\n}\n\n/**\n * Generates a unique ID.\n * React needs unique IDs for components for rendering performance.\n * All of the important components in the questionnaire builder have id properties for this:\n * Questionnaire, QuestionnaireItem, and QuestionnaireItemAnswerOption.\n * @return A unique key.\n */\nfunction generateId(): string {\n return 'id-' + nextId++;\n}\n\nfunction ensureQuestionnaireKeys(questionnaire: Questionnaire): Questionnaire {\n return {\n ...questionnaire,\n id: questionnaire.id || generateId(),\n item: ensureQuestionnaireItemKeys(questionnaire.item),\n } as Questionnaire;\n}\n\nfunction ensureQuestionnaireItemKeys(items: QuestionnaireItem[] | undefined): QuestionnaireItem[] | undefined {\n if (!items) {\n return undefined;\n }\n return items.map((item) => ({\n ...item,\n id: item.id || generateId(),\n item: ensureQuestionnaireItemKeys(item.item),\n answerOption: ensureQuestionnaireOptionKeys(item.answerOption),\n }));\n}\n\nfunction ensureQuestionnaireOptionKeys(\n options: QuestionnaireItemAnswerOption[] | undefined\n): QuestionnaireItemAnswerOption[] | undefined {\n if (!options) {\n return undefined;\n }\n return options.map((option) => ({\n ...option,\n id: option.id || generateId(),\n }));\n}\n","/**\n * Dynamically creates a script tag for the specified JavaScript file.\n * @param src The JavaScript file URL.\n */\nexport function createScriptTag(src: string, onload?: () => void): void {\n const head = document.getElementsByTagName('head')[0];\n const script = document.createElement('script');\n script.async = true;\n script.src = src;\n script.onload = onload || null;\n head.appendChild(script);\n}\n","import { GoogleCredentialResponse } from '@medplum/core';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { useMedplum } from './MedplumProvider';\nimport { createScriptTag } from './utils';\n\ninterface GoogleApi {\n accounts: {\n id: {\n initialize: (args: any) => void;\n renderButton: (parent: HTMLElement, args: any) => void;\n };\n };\n}\n\ndeclare const google: GoogleApi;\n\nexport interface GoogleButtonProps {\n readonly googleClientId?: string;\n readonly handleGoogleCredential: (response: GoogleCredentialResponse) => void;\n}\n\nexport function GoogleButton(props: GoogleButtonProps): JSX.Element | null {\n const medplum = useMedplum();\n const { googleClientId, handleGoogleCredential } = props;\n const parentRef = useRef<HTMLDivElement>(null);\n const [scriptLoaded, setScriptLoaded] = useState<boolean>(typeof google !== 'undefined');\n const [initialized, setInitialized] = useState<boolean>(false);\n const [buttonRendered, setButtonRendered] = useState<boolean>(false);\n\n useEffect(() => {\n if (typeof google === 'undefined') {\n createScriptTag('https://accounts.google.com/gsi/client', () => setScriptLoaded(true));\n return;\n }\n\n if (!initialized) {\n google.accounts.id.initialize({\n client_id: googleClientId,\n callback: handleGoogleCredential,\n });\n setInitialized(true);\n }\n\n if (parentRef.current && !buttonRendered) {\n google.accounts.id.renderButton(parentRef.current, {});\n setButtonRendered(true);\n }\n }, [medplum, googleClientId, initialized, scriptLoaded, parentRef, buttonRendered, handleGoogleCredential]);\n\n if (!googleClientId) {\n return null;\n }\n\n return <div ref={parentRef} />;\n}\n\nexport function getGoogleClientId(clientId: string | undefined): string | undefined {\n if (clientId) {\n return clientId;\n }\n\n const origin = window.location.protocol + '//' + window.location.host;\n const authorizedOrigins = process.env.GOOGLE_AUTH_ORIGINS?.split(',') ?? [];\n if (authorizedOrigins.includes(origin)) {\n return process.env.GOOGLE_CLIENT_ID;\n }\n\n return undefined;\n}\n","import { createScriptTag } from '../utils';\n\n/**\n * Dynamically loads the recaptcha script.\n * We do not want to load the script on page load unless the user needs it.\n */\nexport function initRecaptcha(): void {\n if (typeof grecaptcha === 'undefined') {\n createScriptTag('https://www.google.com/recaptcha/api.js?render=' + process.env.RECAPTCHA_SITE_KEY);\n }\n}\n\n/**\n * Starts a request to generate a recapcha token.\n * @returns Promise to a recaptcha token for the current user.\n */\nexport function getRecaptcha(): Promise<string> {\n return new Promise((resolve) => {\n grecaptcha.ready(() => {\n grecaptcha.execute(process.env.RECAPTCHA_SITE_KEY as string, { action: 'submit' }).then(resolve);\n });\n });\n}\n","import React from 'react';\nimport './StatusBadge.css';\n\nexport interface StatusBadgeProps {\n readonly status: string;\n}\n\nexport function StatusBadge(props: StatusBadgeProps): JSX.Element {\n return <span className={`medplum-status medplum-status-${props.status}`}>{props.status}</span>;\n}\n","/*\n * Myers Diff algorithm\n * Based on: https://github.com/KengoTODA/java-diff-utils/blob/master/src/main/java/difflib/myers/MyersDiff.java\n * Apache Software License, Version 1.1\n */\n\nexport function diff(original: string[], revised: string[]): Delta[] {\n const path = buildPath(original, revised) as PathNode;\n return buildRevisions(path, original, revised);\n}\n\nexport interface PathNode {\n readonly i: number;\n readonly j: number;\n readonly prev: PathNode | undefined;\n readonly snake: boolean;\n}\n\nexport interface Delta {\n readonly original: Chunk;\n readonly revised: Chunk;\n readonly type: 'change' | 'delete' | 'insert';\n}\n\nexport interface Chunk {\n readonly position: number;\n readonly lines: string[];\n}\n\nfunction buildPath(orig: string[], rev: string[]): PathNode | undefined {\n const N = orig.length;\n const M = rev.length;\n const MAX = N + M + 1;\n const size = 1 + 2 * MAX;\n const middle = (size / 2) | 0;\n const diagonal: (PathNode | undefined)[] = new Array(size);\n\n diagonal[middle + 1] = {\n i: 0,\n j: -1,\n prev: undefined,\n snake: true,\n };\n\n for (let d = 0; d < MAX; d++) {\n for (let k = -d; k <= d; k += 2) {\n const kmiddle = middle + k;\n const kplus = kmiddle + 1;\n const kminus = kmiddle - 1;\n const kplusNode = diagonal[kplus] as PathNode;\n const kminusNode = diagonal[kminus] as PathNode;\n let prev: PathNode | undefined = undefined;\n let i = 0;\n\n if (k === -d || (k !== d && kminusNode.i < kplusNode.i)) {\n i = kplusNode.i;\n prev = kplusNode;\n } else {\n i = kminusNode.i + 1;\n prev = kminusNode;\n }\n\n diagonal[kminus] = undefined; // no longer used\n\n let j = i - k;\n let node = {\n i,\n j,\n prev: previousSnake(prev),\n snake: false,\n };\n\n // orig and rev are zero-based\n // but the algorithm is one-based\n // that's why there's no +1 when indexing the sequences\n while (i < N && j < M && orig[i] === rev[j]) {\n i++;\n j++;\n }\n\n if (i > node.i) {\n node = {\n i,\n j,\n prev: node,\n snake: true,\n };\n }\n\n diagonal[kmiddle] = node;\n\n if (i >= N && j >= M) {\n return diagonal[kmiddle] as PathNode;\n }\n }\n diagonal[middle + d - 1] = undefined;\n }\n\n // According to Myers, this cannot happen\n return undefined;\n}\n\nfunction buildRevisions(startNode: PathNode, orig: string[], rev: string[]): Delta[] {\n const deltas: Delta[] = [];\n let path: PathNode | undefined = startNode;\n\n if (path.snake) {\n path = path.prev;\n }\n\n while (path && path.prev && path.prev.j >= 0) {\n const i = path.i;\n const j = path.j;\n\n path = path.prev;\n const ianchor = path.i;\n const janchor = path.j;\n\n const original = {\n position: ianchor,\n lines: orig.slice(ianchor, i),\n };\n\n const revised = {\n position: janchor,\n lines: rev.slice(janchor, j),\n };\n\n let type: 'insert' | 'delete' | 'change';\n\n if (original.lines.length === 0 && revised.lines.length > 0) {\n type = 'insert';\n } else if (original.lines.length > 0 && revised.lines.length === 0) {\n type = 'delete';\n } else {\n type = 'change';\n }\n\n deltas.push({ original, revised, type });\n\n if (path.snake) {\n path = path.prev;\n }\n }\n\n return deltas;\n}\n\nfunction previousSnake(node: PathNode): PathNode {\n if (node && !node.snake && node.prev) {\n return node.prev;\n }\n return node;\n}\n","import { stringify } from '@medplum/core';\nimport { Bundle, BundleEntry, Meta } from '@medplum/fhirtypes';\nimport { diff } from './diff';\n\nexport interface BlameRow {\n id: string;\n meta: Meta;\n value: string;\n span: number;\n}\n\nexport function blame(history: Bundle): BlameRow[] {\n // Convert to array of array of lines\n const versions = (history.entry as BundleEntry[])\n .map((entry) => ({\n meta: entry.resource?.meta as Meta,\n lines: stringify(entry.resource, true).match(/[^\\r\\n]+/g) as string[],\n }))\n .sort((a, b) => (a.meta.lastUpdated as string).localeCompare(b.meta.lastUpdated as string));\n\n // Start with array of lines from the first version\n const table: BlameRow[] = versions[0].lines.map((line) => ({\n id: versions[0].meta.versionId as string,\n meta: versions[0].meta,\n value: line,\n span: 1,\n }));\n\n compareVersions(table, versions);\n combineSpans(table);\n return table;\n}\n\n/**\n * For each version, update the blame table with revisions.\n * @param table The output blame table.\n * @param versions The array of versions.\n */\nfunction compareVersions(table: BlameRow[], versions: { meta: Meta; lines: string[] }[]): void {\n for (let i = 1; i < versions.length; i++) {\n const revisions = diff(versions[i - 1].lines, versions[i].lines);\n\n for (const revision of revisions) {\n const position = revision.original.position;\n const oldLines = revision.original.lines;\n const newLines = revision.revised.lines;\n\n if (revision.type === 'delete' || revision.type === 'change') {\n // Remove the old rows\n table.splice(position, oldLines.length);\n }\n\n if (revision.type === 'insert' || revision.type === 'change') {\n // Add the new lines\n for (let k = 0; k < revision.revised.lines.length; k++) {\n table.splice(position + k, 0, {\n id: versions[i].meta.versionId as string,\n meta: versions[i].meta,\n value: newLines[k],\n span: 1,\n });\n }\n }\n }\n }\n}\n\n/**\n * Combine adjacent rows into spans.\n * @param table The output blame table.\n */\nfunction combineSpans(table: BlameRow[]): void {\n let start = 0;\n while (start < table.length) {\n let curr = start;\n while (curr < table.length && table[curr].id === table[start].id) {\n table[curr].span = -1;\n curr++;\n }\n table[start].span = curr - start;\n start = curr;\n }\n}\n","import { Bundle, Resource, ResourceType } from '@medplum/fhirtypes';\nimport React, { useEffect, useState } from 'react';\nimport { InputRow } from './InputRow';\nimport { MedplumLink } from './MedplumLink';\nimport { useMedplum } from './MedplumProvider';\nimport { ResourceBadge } from './ResourceBadge';\nimport { blame } from './utils/blame';\nimport './ResourceBlame.css';\n\nexport interface ResourceBlameProps {\n history?: Bundle;\n resourceType?: ResourceType;\n id?: string;\n}\n\nexport function ResourceBlame(props: ResourceBlameProps): JSX.Element {\n const medplum = useMedplum();\n const [value, setValue] = useState<Bundle | undefined>(props.history);\n\n useEffect(() => {\n if (!props.history && props.resourceType && props.id) {\n medplum.readHistory(props.resourceType, props.id).then((result) => setValue(result));\n }\n }, [medplum, props.history, props.resourceType, props.id]);\n\n if (!value) {\n return <div>Loading...</div>;\n }\n\n const resource = value.entry?.[0]?.resource as Resource;\n const table = blame(value);\n return (\n <div className=\"medplum-blame-container\">\n <table className=\"medplum-blame\">\n <tbody>\n {table.map((row, index) => (\n <tr key={'row-' + index} className={row.span > 0 ? 'start-row' : 'normal-row'}>\n {row.span > 0 && (\n <td className=\"details\" rowSpan={row.span}>\n <InputRow justifyContent=\"space-between\">\n <ResourceBadge value={row.meta.author} size=\"xsmall\" link={true} />\n <MedplumLink to={getVersionUrl(resource, row.meta.versionId as string)}>\n {getTimeString(row.meta.lastUpdated as string)}\n </MedplumLink>\n </InputRow>\n </td>\n )}\n <td className=\"line-number\">{index + 1}</td>\n <td className=\"line\">\n <pre className=\"line-pre\">{row.value}</pre>\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n );\n}\n\nfunction getVersionUrl(resource: Resource, versionId: string): string {\n return `/${resource.resourceType}/${resource.id}/_history/${versionId}`;\n}\n\nexport function getTimeString(lastUpdated: string): string {\n const seconds = Math.floor((Date.now() - Date.parse(lastUpdated)) / 1000);\n\n const years = Math.floor(seconds / 31536000);\n if (years > 0) {\n return pluralizeTime(years, 'year');\n }\n\n const months = Math.floor(seconds / 2592000);\n if (months > 0) {\n return pluralizeTime(months, 'month');\n }\n\n const days = Math.floor(seconds / 86400);\n if (days > 0) {\n return pluralizeTime(days, 'day');\n }\n\n const hours = Math.floor(seconds / 3600);\n if (hours > 0) {\n return pluralizeTime(hours, 'hour');\n }\n\n const minutes = Math.floor(seconds / 60);\n if (minutes > 0) {\n return pluralizeTime(minutes, 'minute');\n }\n\n return pluralizeTime(seconds, 'second');\n}\n\nfunction pluralizeTime(count: number, noun: string): string {\n return `${count} ${count === 1 ? noun : noun + 's'} ago`;\n}\n","import { stringify } from '@medplum/core';\nimport { Resource } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { Delta, diff } from './utils/diff';\nimport './ResourceDiff.css';\n\nexport interface ResourceDiffProps {\n original: Resource;\n revised: Resource;\n ignoreMeta?: boolean;\n}\n\nexport function ResourceDiff(props: ResourceDiffProps): JSX.Element {\n let originalResource = props.original;\n let revisedResource = props.revised;\n\n if (props.ignoreMeta) {\n originalResource = { ...originalResource, meta: undefined };\n revisedResource = { ...revisedResource, meta: undefined };\n }\n\n const original = stringify(originalResource, true).match(/[^\\r\\n]+/g) as string[];\n const revised = stringify(revisedResource, true).match(/[^\\r\\n]+/g) as string[];\n const deltas = diff(original, revised);\n return (\n <pre style={{ color: 'gray' }}>\n {deltas.map((delta, index) => (\n <ChangeDiff key={'delta' + index} delta={delta} />\n ))}\n </pre>\n );\n}\n\nfunction ChangeDiff(props: { delta: Delta }): JSX.Element {\n return (\n <>\n ...\n <br />\n {props.delta.original.lines.length > 0 && (\n <div className=\"medplum-diff-removed\">{props.delta.original.lines.join('\\n')}</div>\n )}\n {props.delta.revised.lines.length > 0 && (\n <div className=\"medplum-diff-added\">{props.delta.revised.lines.join('\\n')}</div>\n )}\n ...\n <br />\n </>\n );\n}\n","import { Bundle, Resource, ResourceType } from '@medplum/fhirtypes';\nimport React, { useEffect, useState } from 'react';\nimport { DateTimeDisplay } from './DateTimeDisplay';\nimport { MedplumLink } from './MedplumLink';\nimport { useMedplum } from './MedplumProvider';\nimport { ResourceBadge } from './ResourceBadge';\nimport './Table.css';\n\nexport interface ResourceHistoryTableProps {\n history?: Bundle;\n resourceType?: string;\n id?: string;\n}\n\nexport function ResourceHistoryTable(props: ResourceHistoryTableProps): JSX.Element {\n const medplum = useMedplum();\n const [value, setValue] = useState<Bundle | undefined>(props.history);\n\n useEffect(() => {\n if (!props.history && props.resourceType && props.id) {\n medplum.readHistory(props.resourceType as ResourceType, props.id).then((result) => setValue(result));\n }\n }, [medplum, props.history, props.resourceType, props.id]);\n\n if (!value) {\n return <div>Loading...</div>;\n }\n\n return (\n <table className=\"medplum-table\">\n <thead>\n <tr>\n <th>Author</th>\n <th>Date</th>\n <th>Version</th>\n </tr>\n </thead>\n <tbody>\n {value.entry?.map((entry) => (\n <HistoryRow key={entry.resource?.meta?.versionId} version={entry.resource as Resource} />\n ))}\n </tbody>\n </table>\n );\n}\n\ninterface HistoryRowProps {\n version: Resource;\n}\n\nfunction HistoryRow(props: HistoryRowProps): JSX.Element {\n return (\n <tr>\n <td>\n <ResourceBadge value={props.version.meta?.author} link={true} />\n </td>\n <td>\n <DateTimeDisplay value={props.version.meta?.lastUpdated} />\n </td>\n <td>\n <MedplumLink to={getVersionUrl(props.version)}>{props.version.meta?.versionId}</MedplumLink>\n </td>\n </tr>\n );\n}\n\nfunction getVersionUrl(resource: Resource): string {\n return `/${resource.resourceType}/${resource.id}/_history/${resource.meta?.versionId}`;\n}\n","import React, { useMemo, useState } from 'react';\nimport { Button } from './Button';\nimport { InputRow } from './InputRow';\nimport { Slot } from '@medplum/fhirtypes';\nimport './CalendarInput.css';\n\nexport interface CalendarInputProps {\n slots: Slot[];\n onClick: (date: Date) => void;\n}\n\n/**\n * Returns a month display string (e.g. \"January 2020\").\n * @param date Any date within the month.\n * @returns The month display string (e.g. \"January 2020\")\n */\nexport function getMonthString(date: Date): string {\n return date.toLocaleString('default', { month: 'long' }) + ' ' + date.getFullYear();\n}\n\ninterface CalendarCell {\n date: Date;\n available: boolean;\n}\n\ntype OptionalCalendarCell = CalendarCell | undefined;\n\nexport function CalendarInput(props: CalendarInputProps): JSX.Element {\n const [month, setMonth] = useState<Date>(getStartMonth);\n\n function moveMonth(delta: number): void {\n setMonth((currMonth) => {\n const prevMonth = new Date(currMonth.getTime());\n prevMonth.setMonth(currMonth.getMonth() + delta);\n return prevMonth;\n });\n }\n\n const grid = useMemo(() => buildGrid(month, props.slots), [month, props.slots]);\n\n return (\n <div>\n <InputRow>\n <p style={{ flex: 1 }}>{getMonthString(month)}</p>\n <p>\n <Button label=\"Previous month\" onClick={() => moveMonth(-1)}>\n <\n </Button>\n <Button label=\"Next month\" onClick={() => moveMonth(1)}>\n >\n </Button>\n </p>\n </InputRow>\n <table className=\"medplum-calendar-table\">\n <thead>\n <tr>\n <th>SUN</th>\n <th>MON</th>\n <th>TUE</th>\n <th>WED</th>\n <th>THU</th>\n <th>FRI</th>\n <th>SAT</th>\n </tr>\n </thead>\n <tbody>\n {grid.map((week, weekIndex) => (\n <tr key={'week-' + weekIndex}>\n {week.map((day, dayIndex) => (\n <td key={'day-' + dayIndex}>\n {day && (\n <button disabled={!day.available} onClick={() => props.onClick(day.date)}>\n {day.date.getDate()}\n </button>\n )}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n );\n}\n\nexport function getStartMonth(): Date {\n const result = new Date();\n result.setDate(1);\n result.setHours(0, 0, 0, 0);\n return result;\n}\n\nfunction buildGrid(startDate: Date, slots: Slot[]): OptionalCalendarCell[][] {\n const d = new Date(startDate.getFullYear(), startDate.getMonth());\n const grid: OptionalCalendarCell[][] = [];\n let row: OptionalCalendarCell[] = [];\n\n // Fill leading empty days\n for (let i = 0; i < d.getDay(); i++) {\n row.push(undefined);\n }\n\n while (d.getMonth() === startDate.getMonth()) {\n row.push({\n date: new Date(d.getTime()),\n // available: isAvailable(d),\n available: isDayAvailable(d, slots),\n });\n\n if (d.getDay() === 6) {\n grid.push(row);\n row = [];\n }\n\n d.setDate(d.getDate() + 1);\n }\n\n // Fill trailing empty days\n if (d.getDay() !== 0) {\n for (let i = d.getDay(); i < 7; i++) {\n row.push(undefined);\n }\n grid.push(row);\n }\n\n return grid;\n}\n\n/**\n * Returns true if the given date is available for booking.\n * @param day The day to check.\n * @param slots The list of available slots.\n * @returns True if there are any available slots for the day.\n */\nfunction isDayAvailable(day: Date, slots: Slot[]): boolean {\n // Note that slot start and end time may or may not be in UTC.\n for (const slot of slots) {\n const slotStart = new Date(slot.start as string);\n if (\n slotStart.getFullYear() === day.getFullYear() &&\n slotStart.getMonth() === day.getMonth() &&\n slotStart.getDate() === day.getDate()\n ) {\n return true;\n }\n }\n\n return false;\n}\n","import { getReferenceString } from '@medplum/core';\nimport { BundleEntry, Reference, Schedule, Slot } from '@medplum/fhirtypes';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { Avatar } from './Avatar';\nimport { Button } from './Button';\nimport { CalendarInput } from './CalendarInput';\nimport { FormSection } from './FormSection';\nimport { Input } from './Input';\nimport { useMedplum } from './MedplumProvider';\nimport { ResourceName } from './ResourceName';\nimport { useResource } from './useResource';\nimport './Scheduler.css';\n\nexport interface SchedulerProps {\n schedule: Schedule | Reference<Schedule>;\n}\n\nexport function Scheduler(props: SchedulerProps): JSX.Element | null {\n const medplum = useMedplum();\n const schedule = useResource(props.schedule);\n\n const [slots, setSlots] = useState<Slot[]>();\n const slotsRef = useRef<Slot[]>();\n slotsRef.current = slots;\n\n const [date, setDate] = useState<Date>();\n const [slot, setSlot] = useState<Slot>();\n const [info, setInfo] = useState<string>();\n const [form, setForm] = useState<string>();\n\n useEffect(() => {\n if (schedule) {\n medplum.search('Slot', 'schedule=' + getReferenceString(schedule)).then((bundle) => {\n setSlots((bundle.entry as BundleEntry<Slot>[]).map((entry) => entry.resource as Slot));\n });\n } else {\n setSlots(undefined);\n }\n }, [medplum, schedule]);\n\n if (!schedule || !slots) {\n return null;\n }\n\n const actor = schedule.actor?.[0];\n\n return (\n <div className=\"medplum-calendar-container\" data-testid=\"scheduler\">\n <div className=\"medplum-calendar-info-pane\">\n {actor && <Avatar value={actor} size=\"large\" />}\n {actor && (\n <h1>\n <ResourceName value={actor} />\n </h1>\n )}\n <p>1 hour</p>\n {date && <p>{date.toLocaleDateString()}</p>}\n {slot && <p>{formatTime(new Date(slot.start as string))}</p>}\n </div>\n <div className=\"medplum-calendar-selection-pane\">\n {!date && (\n <div>\n <h3>Select date</h3>\n <CalendarInput slots={slots} onClick={setDate} />\n </div>\n )}\n {date && !slot && (\n <div>\n <h3>Select time</h3>\n {slots.map((s) => {\n const slotStart = new Date(s.start as string);\n return (\n slotStart.getTime() > date.getTime() &&\n slotStart.getTime() < date.getTime() + 24 * 3600 * 1000 && (\n <div key={s.id}>\n <Button style={{ width: 150 }} onClick={() => setSlot(s)}>\n {formatTime(slotStart)}\n </Button>\n </div>\n )\n );\n })}\n </div>\n )}\n {date && slot && !info && (\n <div>\n <h3>Enter your info</h3>\n <FormSection title=\"Name\" htmlFor=\"name\">\n <Input name=\"name\" />\n </FormSection>\n <FormSection title=\"Email\" htmlFor=\"email\">\n <Input name=\"email\" />\n </FormSection>\n <Button primary={true} onClick={() => setInfo('info')}>\n Next\n </Button>\n </div>\n )}\n {date && slot && info && !form && (\n <div>\n <h3>Custom questions</h3>\n <FormSection title=\"Question 1\" htmlFor=\"q1\">\n <Input name=\"q1\" />\n </FormSection>\n <FormSection title=\"Question 2\" htmlFor=\"q2\">\n <Input name=\"email\" />\n </FormSection>\n <FormSection title=\"Question 3\" htmlFor=\"q3\">\n <Input name=\"email\" />\n </FormSection>\n <Button primary={true} onClick={() => setForm('form')}>\n Next\n </Button>\n </div>\n )}\n {date && slot && info && form && (\n <div>\n <h3>You're all set!</h3>\n <p>Check your email for a calendar invite.</p>\n </div>\n )}\n </div>\n </div>\n );\n}\n\nfunction formatTime(date: Date): string {\n return date.toLocaleTimeString([], { hour: 'numeric', minute: '2-digit' });\n}\n","import { GoogleCredentialResponse, LoginAuthenticationResponse } from '@medplum/core';\nimport { OperationOutcome, ProjectMembership } from '@medplum/fhirtypes';\nimport React, { useState } from 'react';\nimport { Avatar } from './Avatar';\nimport { Button } from './Button';\nimport { Document } from './Document';\nimport { Form } from './Form';\nimport { FormSection } from './FormSection';\nimport { getGoogleClientId, GoogleButton } from './GoogleButton';\nimport { Input } from './Input';\nimport { Logo } from './Logo';\nimport { MedplumLink } from './MedplumLink';\nimport { useMedplum } from './MedplumProvider';\nimport './SignInForm.css';\nimport './util.css';\nimport { getIssuesForExpression } from './utils/outcomes';\n\nexport interface SignInFormProps {\n readonly remember?: boolean;\n readonly projectId?: string;\n readonly googleClientId?: string;\n readonly clientId?: string;\n readonly scope?: string;\n readonly nonce?: string;\n readonly onSuccess?: () => void;\n readonly onForgotPassword?: () => void;\n readonly onRegister?: () => void;\n readonly onCode?: (code: string) => void;\n readonly children?: React.ReactNode;\n}\n\nexport function SignInForm(props: SignInFormProps): JSX.Element {\n const medplum = useMedplum();\n const [login, setLogin] = useState<string | undefined>(undefined);\n const [memberships, setMemberships] = useState<ProjectMembership[] | undefined>(undefined);\n\n function handleAuthResponse(response: LoginAuthenticationResponse): void {\n if (response.login) {\n setLogin(response.login);\n }\n\n if (response.memberships) {\n setMemberships(response.memberships);\n }\n\n if (response.code) {\n if (props.onCode) {\n props.onCode(response.code);\n } else {\n medplum\n .processCode(response.code)\n .then(() => {\n if (props.onSuccess) {\n props.onSuccess();\n }\n })\n .catch(console.log);\n }\n }\n }\n\n return (\n <Document width={450}>\n {(() => {\n if (!login) {\n return (\n <AuthenticationForm\n clientId={props.clientId}\n scope={props.scope}\n nonce={props.nonce}\n googleClientId={props.googleClientId}\n onForgotPassword={props.onForgotPassword}\n onRegister={props.onRegister}\n handleAuthResponse={handleAuthResponse}\n >\n {props.children}\n </AuthenticationForm>\n );\n } else if (memberships) {\n return <ProfileForm login={login} memberships={memberships} handleAuthResponse={handleAuthResponse} />;\n } else {\n return <div>Success</div>;\n }\n })()}\n </Document>\n );\n}\n\ninterface AuthenticationFormProps {\n readonly projectId?: string;\n readonly clientId?: string;\n readonly scope?: string;\n readonly nonce?: string;\n readonly googleClientId?: string;\n readonly onForgotPassword?: () => void;\n readonly onRegister?: () => void;\n readonly handleAuthResponse: (response: LoginAuthenticationResponse) => void;\n readonly children?: React.ReactNode;\n}\n\nfunction AuthenticationForm(props: AuthenticationFormProps): JSX.Element {\n const medplum = useMedplum();\n const googleClientId = getGoogleClientId(props.googleClientId);\n const [outcome, setOutcome] = useState<OperationOutcome>();\n const issues = getIssuesForExpression(outcome, undefined);\n\n return (\n <Form\n style={{ maxWidth: 400 }}\n onSubmit={(formData: Record<string, string>) => {\n medplum\n .startLogin({\n clientId: props.clientId,\n scope: props.scope,\n nonce: props.nonce,\n email: formData.email,\n password: formData.password,\n remember: formData.remember === 'true',\n })\n .then(props.handleAuthResponse)\n .catch(setOutcome);\n }}\n >\n <div className=\"medplum-center\">{props.children}</div>\n {issues && (\n <div className=\"medplum-input-error\">\n {issues.map((issue) => (\n <div data-testid=\"text-field-error\" key={issue.details?.text}>\n {issue.details?.text}\n </div>\n ))}\n </div>\n )}\n {googleClientId && (\n <>\n <div className=\"medplum-signin-google-container\">\n <GoogleButton\n googleClientId={googleClientId}\n handleGoogleCredential={(response: GoogleCredentialResponse) => {\n medplum\n .startGoogleLogin({\n clientId: props.clientId,\n scope: props.scope,\n nonce: props.nonce,\n googleClientId: response.clientId,\n googleCredential: response.credential,\n })\n .then(props.handleAuthResponse)\n .catch(setOutcome);\n }}\n />\n </div>\n <div className=\"medplum-signin-separator\">or</div>\n </>\n )}\n <FormSection title=\"Email\" htmlFor=\"email\" outcome={outcome}>\n <Input name=\"email\" type=\"email\" testid=\"email\" required={true} autoFocus={true} outcome={outcome} />\n </FormSection>\n <FormSection title=\"Password\" htmlFor=\"password\" outcome={outcome}>\n <Input name=\"password\" type=\"password\" testid=\"password\" autoComplete=\"off\" required={true} outcome={outcome} />\n </FormSection>\n <div className=\"medplum-signin-buttons\">\n {(props.onForgotPassword || props.onRegister) && (\n <div>\n {props.onForgotPassword && (\n <MedplumLink testid=\"forgotpassword\" onClick={props.onForgotPassword}>\n Forgot password\n </MedplumLink>\n )}\n {props.onRegister && (\n <MedplumLink testid=\"register\" onClick={props.onRegister}>\n Register\n </MedplumLink>\n )}\n </div>\n )}\n <div>\n <input type=\"checkbox\" id=\"remember\" name=\"remember\" value=\"true\" />\n <label htmlFor=\"remember\">Remember me</label>\n </div>\n <div>\n <Button type=\"submit\" testid=\"submit\">\n Sign in\n </Button>\n </div>\n </div>\n </Form>\n );\n}\n\ninterface ProfileFormProps {\n login: string;\n memberships: ProjectMembership[];\n handleAuthResponse: (response: any) => void;\n}\n\nfunction ProfileForm(props: ProfileFormProps): JSX.Element {\n const medplum = useMedplum();\n return (\n <div>\n <div className=\"medplum-center\">\n <Logo size={32} />\n <h1>Choose profile</h1>\n </div>\n {props.memberships.map((membership: ProjectMembership) => (\n <div\n className=\"medplum-nav-menu-profile\"\n key={membership.id}\n onClick={() => {\n medplum\n .post('auth/profile', {\n login: props.login,\n profile: membership.id,\n })\n .then(props.handleAuthResponse);\n }}\n >\n <div className=\"medplum-nav-menu-profile-icon\">\n <Avatar alt={membership.profile?.display} />\n </div>\n <div className=\"medplum-nav-menu-profile-label\">\n {membership.profile?.display}\n <div className=\"medplum-nav-menu-profile-help-text\">{membership.project?.display}</div>\n </div>\n </div>\n ))}\n </div>\n );\n}\n","import React from 'react';\nimport './Tab.css';\nimport { killEvent } from './utils/dom';\n\nexport interface TabClickHandler {\n (name: string, button: number): void;\n}\n\nexport interface TabProps {\n name: string;\n label: string;\n selected?: boolean;\n onClick?: TabClickHandler;\n}\n\nexport function Tab(props: TabProps): JSX.Element {\n let className = 'medplum-tab';\n if (props.selected) {\n className += ' selected';\n }\n\n function clickHandler(e: React.MouseEvent): void {\n killEvent(e);\n\n // The onClick prop is set by TabBar as parent component.\n // Using Tab outside of a TabBar is unsupported.\n (props.onClick as TabClickHandler)(props.name, e.button);\n }\n\n return (\n <a\n href={`#${props.name}`}\n role=\"tab\"\n aria-selected={props.selected}\n className={className}\n onClick={clickHandler}\n onAuxClick={clickHandler}\n >\n {props.label}\n </a>\n );\n}\n","import React from 'react';\n\nexport interface TabPanelProps {\n name: string;\n children: React.ReactNode;\n}\n\nexport function TabPanel(props: TabPanelProps): JSX.Element {\n return <div role=\"tabpanel\">{props.children}</div>;\n}\n","import { getReferenceString } from '@medplum/core';\nimport { Reference, Resource } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { ResourceTimeline } from './ResourceTimeline';\n\nexport interface DefaultResourceTimelineProps {\n resource: Resource | Reference;\n}\n\nexport function DefaultResourceTimeline(props: DefaultResourceTimelineProps): JSX.Element {\n return (\n <ResourceTimeline\n value={props.resource}\n buildSearchRequests={(resource: Resource) => ({\n resourceType: 'Bundle',\n type: 'batch',\n entry: [\n {\n request: {\n method: 'GET',\n url: `${getReferenceString(resource)}/_history`,\n },\n },\n {\n request: {\n method: 'GET',\n url: `AuditEvent?entity=${getReferenceString(resource)}&_sort=-_lastUpdated`,\n },\n },\n ],\n })}\n />\n );\n}\n","import { createReference, getReferenceString, ProfileResource } from '@medplum/core';\nimport { Attachment, Encounter, Reference, Resource } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { ResourceTimeline } from './ResourceTimeline';\n\nexport interface EncounterTimelineProps {\n encounter: Encounter | Reference<Encounter>;\n}\n\nexport function EncounterTimeline(props: EncounterTimelineProps): JSX.Element {\n return (\n <ResourceTimeline\n value={props.encounter}\n buildSearchRequests={(resource: Resource) => ({\n resourceType: 'Bundle',\n type: 'batch',\n entry: [\n {\n request: {\n method: 'GET',\n url: `${getReferenceString(resource)}/_history`,\n },\n },\n {\n request: {\n method: 'GET',\n url: `Communication?encounter=${getReferenceString(resource)}`,\n },\n },\n {\n request: {\n method: 'GET',\n url: `Media?encounter=${getReferenceString(resource)}`,\n },\n },\n ],\n })}\n createCommunication={(resource: Encounter, sender: ProfileResource, text: string) => ({\n resourceType: 'Communication',\n encounter: createReference(resource),\n subject: resource.subject,\n sender: createReference(sender),\n sent: new Date().toISOString(),\n payload: [{ contentString: text }],\n })}\n createMedia={(resource: Encounter, operator: ProfileResource, content: Attachment) => ({\n resourceType: 'Media',\n encounter: createReference(resource),\n subject: resource.subject,\n operator: createReference(operator),\n issued: new Date().toISOString(),\n content,\n })}\n />\n );\n}\n","import React from 'react';\nimport './FooterLinks.css';\n\nexport interface FooterLinksProps {\n children?: React.ReactNode;\n}\n\nexport function FooterLinks(props: FooterLinksProps): JSX.Element {\n return <div className=\"medplum-footer\">{props.children}</div>;\n}\n","import { getReferenceString, ProfileResource } from '@medplum/core';\nimport { HumanName, UserConfiguration } from '@medplum/fhirtypes';\nimport React, { useState } from 'react';\nimport { useLocation, useNavigate } from 'react-router-dom';\nimport { Avatar } from './Avatar';\nimport { Button } from './Button';\nimport { HeaderSearchInput, HeaderSearchTypes } from './HeaderSearchInput';\nimport { HumanNameDisplay } from './HumanNameDisplay';\nimport { MedplumLink } from './MedplumLink';\nimport { useMedplumContext } from './MedplumProvider';\nimport { Popup } from './Popup';\nimport './Header.css';\n\nexport interface HeaderProps {\n readonly title?: string;\n readonly bgColor?: string;\n readonly onLogo?: () => void;\n readonly onProfile?: () => void;\n readonly onSignOut?: () => void;\n readonly config?: UserConfiguration;\n}\n\nexport function Header(props: HeaderProps): JSX.Element {\n const navigate = useNavigate();\n const location = useLocation();\n const context = useMedplumContext();\n const medplum = context.medplum;\n const logins = medplum.getLogins();\n const [userMenuVisible, setUserMenuVisible] = useState(false);\n const [sidebarVisible, setSidebarVisible] = useState(false);\n\n return (\n <>\n <header role=\"banner\" data-testid=\"header\" style={{ background: props.bgColor }}>\n <div>\n <MedplumLink\n label=\"Toggle sidebar\"\n testid=\"header-menu-button\"\n onClick={() => setSidebarVisible(!sidebarVisible)}\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n style={{ width: 20, height: 20, verticalAlign: 'text-top' }}\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M3 5a1 1 0 011-1h12a1 1 0 110 2H4a1 1 0 01-1-1zM3 10a1 1 0 011-1h12a1 1 0 110 2H4a1 1 0 01-1-1zM3 15a1 1 0 011-1h12a1 1 0 110 2H4a1 1 0 01-1-1z\"\n clipRule=\"evenodd\"\n />\n </svg>\n </MedplumLink>\n <MedplumLink id=\"medplum-header-logo\" testid=\"header-logo\" onClick={props.onLogo}>\n {props.title || 'Medplum'}\n </MedplumLink>\n {context.profile && (\n <HeaderSearchInput\n key={`header-input-${location.pathname}`}\n name=\"search\"\n className=\"medplum-nav-search-container\"\n placeholder=\"Search\"\n onChange={(resource: HeaderSearchTypes) => navigate(`/${resource.resourceType}/${resource.id}`)}\n />\n )}\n </div>\n {context.profile && (\n <div className=\"medplum-nav-menu-container\">\n <MedplumLink testid=\"header-profile-menu-button\" onClick={() => setUserMenuVisible(true)}>\n <Avatar size=\"small\" color=\"#f68d42\" value={context.profile} />\n </MedplumLink>\n <Popup\n visible={userMenuVisible}\n autoClose={true}\n activeClassName=\"medplum-nav-menu-popover\"\n onClose={() => setUserMenuVisible(false)}\n >\n <div className=\"medplum-nav-menu\">\n <div style={{ margin: 'auto', padding: '8px' }}>\n <Avatar size=\"large\" value={context.profile} />\n </div>\n <div style={{ margin: 'auto', padding: '8px' }}>\n <div style={{ margin: '4px auto 4px auto', fontWeight: 'bold' }}>\n <HumanNameDisplay value={context.profile?.name?.[0] as HumanName} />\n </div>\n <div style={{ margin: '4px auto 4px auto' }}>{medplum.getActiveLogin()?.project?.display}</div>\n <Button\n testid=\"header-profile-link\"\n onClick={() => {\n setUserMenuVisible(false);\n if (props.onProfile) {\n props.onProfile();\n }\n }}\n >\n Manage your account\n </Button>\n </div>\n {logins.length > 1 && (\n <div>\n <hr />\n {logins.map(\n (login) =>\n login.profile?.reference !== getReferenceString(context.profile as ProfileResource) && (\n <div\n className=\"medplum-nav-menu-profile\"\n key={login.profile?.reference}\n onClick={() => {\n medplum.setActiveLogin(login);\n setUserMenuVisible(false);\n window.location.reload();\n }}\n >\n <div className=\"medplum-nav-menu-profile-icon\">\n <Avatar />\n </div>\n <div className=\"medplum-nav-menu-profile-label\">\n {login.profile?.display}\n <div className=\"medplum-nav-menu-profile-help-text\">{login.project?.display}</div>\n </div>\n </div>\n )\n )}\n </div>\n )}\n <hr />\n <div style={{ margin: 'auto', padding: '8px' }}>\n <Button\n testid=\"header-add-account-button\"\n onClick={() => {\n navigate('/signin');\n }}\n >\n Add another account\n </Button>\n </div>\n <hr />\n <div style={{ margin: 'auto', padding: '8px' }}>\n <Button\n testid=\"header-signout-button\"\n onClick={() => {\n setUserMenuVisible(false);\n if (props.onSignOut) {\n props.onSignOut();\n }\n }}\n >\n Sign out of all accounts\n </Button>\n </div>\n <hr />\n <div style={{ margin: 'auto', padding: '8px', fontSize: '12px' }}>\n <a href=\"https://www.medplum.com/terms\">Terms</a>\n <a href=\"https://www.medplum.com/privacy\">Privacy</a>\n </div>\n </div>\n </Popup>\n </div>\n )}\n </header>\n <Popup\n modal={true}\n autoClose={true}\n visible={sidebarVisible}\n activeClassName=\"medplum-sidebar active\"\n inactiveClassName=\"medplum-sidebar\"\n onClose={() => setSidebarVisible(false)}\n >\n {props.config?.menu?.map((menu, index) => (\n <React.Fragment key={`menu-${index}-${props.config?.menu?.length}`}>\n <h5>{menu.title}</h5>\n <ul>\n {menu.link?.map((link) => (\n <li key={link.target}>\n <MedplumLink to={link.target}>{link.name}</MedplumLink>\n </li>\n ))}\n </ul>\n </React.Fragment>\n ))}\n <h5>Settings</h5>\n <ul>\n <li>\n <MedplumLink to={context.profile}>Profile</MedplumLink>\n </li>\n <li>\n <MedplumLink to=\"/changepassword\">Change password</MedplumLink>\n </li>\n </ul>\n </Popup>\n </>\n );\n}\n","import { GoogleCredentialResponse, LoginAuthenticationResponse, parseJWTPayload, RegisterRequest } from '@medplum/core';\nimport { OperationOutcome } from '@medplum/fhirtypes';\nimport React, { useEffect, useState } from 'react';\nimport { Button } from './Button';\nimport { Document } from './Document';\nimport { Form } from './Form';\nimport { FormSection } from './FormSection';\nimport { getGoogleClientId, GoogleButton } from './GoogleButton';\nimport { Input } from './Input';\nimport { useMedplum } from './MedplumProvider';\nimport { getIssuesForExpression } from './utils/outcomes';\nimport { getRecaptcha, initRecaptcha } from './utils/recaptcha';\nimport './SignInForm.css';\nimport './util.css';\n\nexport interface BaseRegisterFormProps {\n readonly googleClientId?: string;\n readonly children?: React.ReactNode;\n readonly onSuccess: () => void;\n}\n\nexport interface PatientRegisterFormProps extends BaseRegisterFormProps {\n readonly type: 'patient';\n readonly projectId: string;\n}\n\nexport interface ProjectRegisterFormProps extends BaseRegisterFormProps {\n readonly type: 'project';\n}\n\nexport type RegisterFormProps = PatientRegisterFormProps | ProjectRegisterFormProps;\n\nexport function RegisterForm(props: RegisterFormProps): JSX.Element {\n const medplum = useMedplum();\n const googleClientId = getGoogleClientId(props.googleClientId);\n const [outcome, setOutcome] = useState<OperationOutcome>();\n const issues = getIssuesForExpression(outcome, undefined);\n\n useEffect(initRecaptcha, []);\n\n async function handleAuthResponse(\n registerRequest: RegisterRequest,\n partialLogin: LoginAuthenticationResponse\n ): Promise<void> {\n try {\n let login;\n if (props.type === 'patient') {\n login = await medplum.startNewPatient(registerRequest, partialLogin);\n } else {\n login = await medplum.startNewProject(registerRequest, partialLogin);\n }\n await medplum.processCode(login.code as string);\n props.onSuccess();\n } catch (err) {\n setOutcome(err as OperationOutcome);\n }\n }\n\n return (\n <Document width={450}>\n <Form\n style={{ maxWidth: 400 }}\n onSubmit={async (formData: Record<string, string>) => {\n try {\n const recaptchaToken = await getRecaptcha();\n const registerRequest = { ...formData, recaptchaToken } as RegisterRequest;\n const userLogin = await medplum.startNewUser(registerRequest);\n handleAuthResponse(registerRequest, userLogin);\n } catch (err) {\n setOutcome(err as OperationOutcome);\n }\n }}\n >\n <div className=\"medplum-center\">{props.children}</div>\n {issues && (\n <div className=\"medplum-input-error\">\n {issues.map((issue) => (\n <div data-testid=\"text-field-error\" key={issue.details?.text}>\n {issue.details?.text}\n </div>\n ))}\n </div>\n )}\n {googleClientId && (\n <>\n <div className=\"medplum-signin-google-container\">\n <GoogleButton\n googleClientId={googleClientId}\n handleGoogleCredential={async (response: GoogleCredentialResponse) => {\n try {\n const loginRequest = {\n googleClientId: response.clientId,\n googleCredential: response.credential,\n };\n const userLogin = await medplum.startGoogleLogin(loginRequest);\n const googleClaims = parseJWTPayload(loginRequest.googleCredential);\n const registerRequest = {\n firstName: googleClaims.given_name as string,\n lastName: googleClaims.family_name as string,\n email: googleClaims.email as string,\n };\n handleAuthResponse(registerRequest, userLogin);\n } catch (err) {\n setOutcome(err as OperationOutcome);\n }\n }}\n />\n </div>\n <div className=\"medplum-signin-separator\">or</div>\n </>\n )}\n <FormSection title=\"First Name\" htmlFor=\"firstName\" outcome={outcome}>\n <Input\n name=\"firstName\"\n type=\"text\"\n testid=\"firstName\"\n placeholder=\"First name\"\n required={true}\n autoFocus={true}\n outcome={outcome}\n />\n </FormSection>\n <FormSection title=\"Last Name\" htmlFor=\"lastName\" outcome={outcome}>\n <Input\n name=\"lastName\"\n type=\"text\"\n testid=\"lastName\"\n placeholder=\"Last name\"\n required={true}\n outcome={outcome}\n />\n </FormSection>\n {props.type === 'project' && (\n <FormSection title=\"Project Name\" htmlFor=\"projectName\" outcome={outcome}>\n <Input\n name=\"projectName\"\n type=\"text\"\n testid=\"projectName\"\n placeholder=\"My Project\"\n required={true}\n outcome={outcome}\n />\n </FormSection>\n )}\n <FormSection title=\"Email\" htmlFor=\"email\" outcome={outcome}>\n <Input\n name=\"email\"\n type=\"email\"\n testid=\"email\"\n placeholder=\"name@domain.com\"\n required={true}\n outcome={outcome}\n />\n </FormSection>\n <FormSection title=\"Password\" htmlFor=\"password\" outcome={outcome}>\n <Input\n name=\"password\"\n type=\"password\"\n testid=\"password\"\n autoComplete=\"off\"\n required={true}\n outcome={outcome}\n />\n </FormSection>\n <div className=\"medplum-signin-buttons\">\n <div>\n <input type=\"checkbox\" id=\"remember\" name=\"remember\" value=\"true\" />\n <label htmlFor=\"remember\">Remember me</label>\n </div>\n <div>\n <Button type=\"submit\" testid=\"submit\">\n Create account\n </Button>\n </div>\n </div>\n </Form>\n </Document>\n );\n}\n","import { getReferenceString } from '@medplum/core';\nimport { Bundle, BundleEntry, Reference, RequestGroup, Resource, Task } from '@medplum/fhirtypes';\nimport React, { useEffect, useState } from 'react';\nimport { Button } from './Button';\nimport { DateTimeDisplay } from './DateTimeDisplay';\nimport { useMedplum } from './MedplumProvider';\nimport { ResourceName } from './ResourceName';\nimport { StatusBadge } from './StatusBadge';\nimport { useResource } from './useResource';\nimport './RequestGroupDisplay.css';\n\nexport interface RequestGroupDisplayProps {\n value?: RequestGroup | Reference<RequestGroup>;\n onStart: (task: Task, input: Reference) => void;\n onEdit: (task: Task, input: Reference, output: Reference) => void;\n}\n\nexport function RequestGroupDisplay(props: RequestGroupDisplayProps): JSX.Element | null {\n const medplum = useMedplum();\n const requestGroup = useResource(props.value);\n const [startedLoading, setStartedLoading] = useState(false);\n const [responseBundle, setResponseBundle] = useState<Bundle>();\n\n useEffect(() => {\n if (requestGroup && !startedLoading) {\n medplum.executeBatch(buildBatchRequest(requestGroup)).then(setResponseBundle);\n setStartedLoading(true);\n }\n }, [medplum, requestGroup, startedLoading]);\n\n if (!requestGroup || !responseBundle) {\n return null;\n }\n\n return (\n <div className=\"medplum-request-group\">\n {requestGroup.action?.map((action, index) => {\n const task = action.resource && findBundleEntry(action.resource as Reference<Task>);\n const taskInput = task?.input?.[0]?.valueReference;\n const taskOutput = task?.output?.[0]?.valueReference;\n return (\n <div className=\"medplum-request-group-task\" key={`action-${index}`}>\n <div className=\"medplum-request-group-task-checkmark\">{task?.status === 'completed' ? '🗹' : '☐'}</div>\n <div className=\"medplum-request-group-task-details\">\n <div className=\"medplum-request-group-task-title\">{action.title}</div>\n <div>\n Last edited by \n <ResourceName value={task?.meta?.author as Reference} />\n on \n <DateTimeDisplay value={task?.meta?.lastUpdated} />\n </div>\n <div>\n Status: <StatusBadge status={task?.status || 'unknown'} />\n </div>\n </div>\n <div className=\"medplum-request-group-task-actions\">\n {taskInput && !taskOutput && <Button onClick={() => props.onStart(task, taskInput)}>Start</Button>}\n {taskInput && taskOutput && (\n <Button onClick={() => props.onEdit(task, taskInput, taskOutput)}>Edit</Button>\n )}\n </div>\n </div>\n );\n })}\n </div>\n );\n\n function buildBatchRequest(request: RequestGroup): Bundle {\n const batchEntries = [] as BundleEntry[];\n if (request.action) {\n for (const action of request.action) {\n if (action.resource?.reference) {\n batchEntries.push({ request: { method: 'GET', url: action.resource.reference } });\n }\n }\n }\n\n return {\n resourceType: 'Bundle',\n type: 'batch',\n entry: batchEntries,\n };\n }\n\n function findBundleEntry<T extends Resource>(reference: Reference<T>): T | undefined {\n for (const entry of responseBundle?.entry as BundleEntry[]) {\n if (entry.resource && reference.reference === getReferenceString(entry.resource)) {\n return entry.resource as T;\n }\n }\n return undefined;\n }\n}\n","import { createReference, getReferenceString, ProfileResource } from '@medplum/core';\nimport { Attachment, Group, Patient, Reference, Resource, ServiceRequest } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { ResourceTimeline } from './ResourceTimeline';\n\nexport interface ServiceRequestTimelineProps {\n serviceRequest: ServiceRequest | Reference<ServiceRequest>;\n}\n\nexport function ServiceRequestTimeline(props: ServiceRequestTimelineProps): JSX.Element {\n return (\n <ResourceTimeline\n value={props.serviceRequest}\n buildSearchRequests={(resource: Resource) => ({\n resourceType: 'Bundle',\n type: 'batch',\n entry: [\n {\n request: {\n method: 'GET',\n url: `${getReferenceString(resource)}/_history`,\n },\n },\n {\n request: {\n method: 'GET',\n url: `Communication?based-on=${getReferenceString(resource)}`,\n },\n },\n {\n request: {\n method: 'GET',\n url: `Media?_count=100&based-on=${getReferenceString(resource)}`,\n },\n },\n {\n request: {\n method: 'GET',\n url: `DiagnosticReport?based-on=${getReferenceString(resource)}`,\n },\n },\n ],\n })}\n createCommunication={(resource: ServiceRequest, sender: ProfileResource, text: string) => ({\n resourceType: 'Communication',\n basedOn: [createReference(resource)],\n subject: resource.subject as Reference<Group | Patient>,\n sender: createReference(sender),\n sent: new Date().toISOString(),\n payload: [{ contentString: text }],\n })}\n createMedia={(resource: ServiceRequest, operator: ProfileResource, content: Attachment) => ({\n resourceType: 'Media',\n basedOn: [createReference(resource)],\n subject: resource.subject,\n operator: createReference(operator),\n issued: new Date().toISOString(),\n content,\n })}\n />\n );\n}\n","import React from 'react';\nimport { Scrollable } from './Scrollable';\nimport { Tab, TabClickHandler } from './Tab';\nimport './Surface.css';\nimport './TabList.css';\n\nexport interface TabListProps {\n value?: string;\n onChange: TabClickHandler;\n children: React.ReactNode;\n}\n\nexport function TabList(props: TabListProps): JSX.Element {\n return (\n <Scrollable className=\"medplum-surface\" height={50}>\n <div role=\"tablist\" className=\"medplum-tablist\">\n <div className=\"medplum-tablist-foreground\">\n {React.Children.map(props.children, (child, tabIndex) => {\n if (React.isValidElement(child) && child.type === Tab) {\n return React.cloneElement(child as React.ReactElement<any>, {\n selected: child.props.name === props.value,\n onClick: props.onChange,\n tabIndex,\n });\n } else {\n return null;\n }\n })}\n </div>\n </div>\n </Scrollable>\n );\n}\n","import React from 'react';\nimport { TabPanel } from './TabPanel';\n\nexport interface TabSwitchProps {\n value?: string;\n children: React.ReactNode;\n}\n\nexport function TabSwitch(props: TabSwitchProps): JSX.Element {\n return (\n <>\n {React.Children.map(props.children, (child) => {\n if (React.isValidElement(child) && child.type === TabPanel && child.props.name === props.value) {\n return child;\n } else {\n return null;\n }\n })}\n </>\n );\n}\n"],"names":["AddressDisplay","props","address","value","React","formatAddress","getIssuesForExpression","outcome","expression","_a","issue","filter","Input","issues","name","invalid","length","createElement","id","type","getInputType","size","step","className","style","defaultValue","required","autoCapitalize","autoComplete","autoFocus","ref","inputRef","placeholder","testid","disabled","onChange","e","currentTarget","requestedType","InputRow","justifyContent","children","Select","getLine","index","line","setLine","str","push","Object","assign","AddressInput","setValue","useState","valueRef","useRef","setValueWrapper","newValue","current","use","line1","line2","city","state","postalCode","AttachmentDisplay","contentType","url","title","startsWith","maxWidth","src","alt","controls","endsWith","minHeight","width","height","allowFullScreen","frameBorder","seamless","padding","href","target","rel","AttachmentArrayDisplay","values","map","v","key","Button","primary","danger","borderless","onClick","label","reactContext","createContext","undefined","useMedplumContext","useContext","useMedplum","medplum","useMedplumProfile","profile","killEvent","preventDefault","stopPropagation","isCheckboxCell","el","isCheckboxElement","HTMLTableCellElement","HTMLInputElement","UploadButton","fileInputRef","processFile","file","filename","createBinary","then","binary","onUpload","catch","alert","_c","_b","details","text","Fragment","display","files","Array","from","forEach","onFileChange","click","AttachmentArrayInput","setValues","valuesRef","setValuesWrapper","newValues","copy","slice","splice","attachment","AttachmentInput","Autocomplete","focused","setFocused","lastValue","setLastValue","timer","setTimer","dropDownVisible","setDropDownVisible","options","setOptions","selectedIndex","setSelectedIndex","abortController","setAbortController","autoSubmit","setAutoSubmit","lastValueRef","timerRef","abortControllerRef","autoSubmitRef","addOption","option","multiple","handleClick","focus","handleBlur","window","setTimeout","handleInput","abort","clearTimeout","newTimer","trim","newAbortController","AbortController","loadOptions","signal","newOptions","aborted","console","log","handleTimer","handleKeyDown","tryAddOption","handleSelectKey","moveSelection","handleBackspaceKey","handleSeparatorKey","buildUnstructured","delta","useEffect","baseClassName","getId","getDisplay","autofocus","spellCheck","onFocus","onBlur","onInput","onKeyDown","onMouseOver","_e","handleDropDownHover","handleDropDownClick","getIcon","getHelpText","onCreateNew","MedplumLink","navigate","useNavigate","to","resourceType","reference","suffix","system","deviceName","useResource","resource","setResource","getCachedReference","getInitialResource","subscribed","readReference","r","Avatar","getDisplayString","initials","split","n","join","getInitials","imageUrl","getImageSrc","innerContent","backgroundColor","color","link","CheckboxFormSection","htmlFor","description","DEFAULT_IGNORED_PROPERTIES","FormSection","setPropertyValue","obj","propName","elementDefinition","types","compoundKey","replace","capitalize","code","DescriptionList","compact","DescriptionListEntry","term","BackboneElementDisplay","typedValue","typeName","typeSchema","globalSchema","keys","entries","properties","entry","indexOf","property","propertyValue","propertyType","getValueAndType","ignoreMissingValues","isArray","getPropertyDisplayName","ResourcePropertyDisplay","CodingDisplay","CodeableConceptDisplay","coding","ContactPointDisplay","contactPoint","builder","ContactDetailDisplay","contactDetail","telecom","DateTimeDisplay","Date","toLocaleString","HumanNameDisplay","formatHumanName","IdentifierDisplay","PeriodDisplay","start","end","QuantityDisplay","formatQuantityString","quantity","result","comparator","unit","RangeDisplay","formatRangeString","range","low","high","RatioDisplay","numerator","denominator","ReferenceDisplay","displayString","stringify","ResourceArrayDisplay","arrayElement","max","PropertyType","boolean","Boolean","toString","SystemString","date","integer","positiveInt","string","unsignedInt","uri","canonical","dateTime","instant","markdown","Address","Annotation","Attachment","CodeableConcept","Coding","ContactDetail","ContactPoint","HumanName","Identifier","Period","Quantity","Range","Ratio","Reference","path","Error","buildTypeName","context","typedResult","getTypedPropertyValue","AnnotationInput","author","authorReference","createReference","time","toISOString","Checkbox","defaultChecked","checked","CodeableConceptInput","input","binding","valueSet","searchValueSet","expansion","contains","valueSetElementToCodeableConcept","element","concept","_f","_d","cachedDisplayValues","CodeInput","item","CodingInput","ContactPointInput","setContactPoint","setContactPointWrapper","ContactDetailInput","setContactDetail","setContactDetailWrapper","DateTimeInput","convertIsoToLocal","convertLocalToIso","isoString","isValidDate","toLocaleDateString","toLocaleTimeString","localString","isNaN","getTime","TextArea","monospace","ExtensionInput","JSON","parse","HumanNameInput","prefix","given","family","IdentifierInput","PeriodInput","QuantityInput","tryParseNumber","parseFloat","RangeInput","RatioInput","ResourceName","ResourceInput","defaultResource","resourceTypeRef","search","encodeURIComponent","bundle","birthDate","items","ReferenceInput","targetTypes","initialResourceType","defaultValueResourceType","getInitialResourceType","setResourceType","targetType","ResourceArrayInput","borderCollapse","ResourcePropertyInput","textAlign","defaultPropertyType","propertyTypes","ElementDefinitionInputSelector","elementDefinitionTypes","ElementDefinitionTypeInput","elementDefinitionType","initialPropertyType","find","t","selectedType","setSelectedType","decimal","Extension","getTargetTypes","BackboneElementInput","targetProfile","p","pop","definition","ResourceBadge","DiagnosticReportDisplay","diagnosticReport","specimen","textContent","presentedForm","pf","data","atob","note","subject","resultsInterpreter","interpreter","issued","status","ObservationTable","observation","ObservationRow","ObservationValueDisplay","ReferenceRangeDisplay","referenceRange","interpretation","obs","valueQuantity","valueString","component","reduce","prev","curr","parseForm","form","elements","parseInputElement","HTMLTextAreaElement","HTMLSelectElement","parseSelectElement","Form","onSubmit","formData","Loading","role","viewBox","cx","cy","MenuItem","ResourceDiffTable","schema","setSchema","requestSchema","original","originalPropertyValue","originalPropertyType","toTypedValue","revisedPropertyValue","revisedPropertyType","revised","isEmpty","ResourceTable","Scrollable","containerHeight","contentHeight","ErrorBoundary","Component","constructor","super","this","static","error","componentDidCatch","errorInfo","render","Popup","location","useLocation","locationRef","visible","propsRef","autoClose","onClose","document","addEventListener","removeEventListener","anchor","right","body","clientWidth","left","top","clientHeight","bottom","modal","activeClassName","inactiveClassName","Timeline","TimelineItem","popupAnchor","setPopupAnchor","meta","lastUpdated","popupMenuItems","getReferenceString","rect","getBoundingClientRect","fill","transform","d","socialEnabled","sortByDateAndPriority","resources","sort","resourceDateComparator","a","b","priority1","getPriorityScore","priority2","priority","stat","asap","urgent","sent","ResourceTimeline","sender","getProfile","history","setHistory","setItems","buildSearchRequests","itemsRef","loadTimeline","useCallback","executeBatch","handleBatchResponse","batchResponse","newItems","batchEntry","reverse","addResources","setPriority","communication","updateResource","onPin","onUnpin","onDetails","timelineItem","onEdit","onDelete","onVersionDetails","version","versionId","createCommunication","contentString","createResource","createMedia","HistoryTimelineItem","AuditEventTimelineItem","CommunicationTimelineItem","DiagnosticReportTimelineItem","MediaTimelineItem","TimelineItemPopupMenu","previous","findIndex","getPrevious","payload","content","outcomeDesc","Document","FhirPathDisplay","evalFhirPath","err","warn","getFieldDefinition","searchParams","base","exactElementDefinition","exactSearchParam","toLowerCase","replaceAll","includes","getSearchParameterDetails","Dialog","x","setX","y","setY","tabIndex","onMouseDown","downEvent","dragX","clientX","dragY","clientY","handleMouseMove","moveEvent","handleMouseUp","upEvent","handleMouseDown","onCancel","xmlns","stroke","strokeLinecap","strokeLinejoin","strokeWidth","onOk","searchParamToOperators","Operator","EQUALS","NOT","CONTAINS","EXACT","fulltext","token","numeric","NOT_EQUALS","GREATER_THAN","LESS_THAN","GREATER_THAN_OR_EQUALS","LESS_THAN_OR_EQUALS","STARTS_AFTER","ENDS_BEFORE","APPROXIMATELY","datetime","operatorNames","eq","ne","gt","lt","ge","le","sa","eb","ap","exact","not","above","below","in","missing","setFilters","filters","offset","clearFiltersOnField","f","addFilter","field","op","opt_clear","nextFilters","operator","deleteFilter","newFilters","addYesterdayFilter","addDayFilter","addTodayFilter","addTomorrowFilter","startTime","setDate","getDate","setHours","endTime","setTime","addDateFilterBetween","addLastMonthFilter","addMonthFilter","addThisMonthFilter","addNextMonthFilter","setMonth","getMonth","addYearToDateFilter","d1","d2","addDateFilterImpl","addMissingFilter","MISSING","setOffset","movePage","count","newOffset","Math","setSort","desc","getSortField","isSortDescending","sortRules","descending","substr","getSearchOperators","searchParam","getOpString","buildFieldNameString","tmp","renderValue","renderPropertyValue","evalFhirPathTyped","renderSearchParameterValue","SearchFieldEditor","setState","availableRef","selectedRef","onAddField","currentField","fields","newFields","onRemoveField","swapFields","i","j","temp","typeDef","selected","available","Set","names","add","has","getFieldsList","margin","colSpan","align","handleAvailableKeyDown","onDoubleClick","handleSelectedKeyDown","SearchFilterValueDisplay","getSchema","SearchFilterValueInput","SearchParameterType","REFERENCE","newReference","BOOLEAN","DATE","DATETIME","NUMBER","QUANTITY","tryParseQuantity","newQuantity","systemString","unitString","SearchFilterEditor","setSearch","editingIndex","setEditingIndex","searchRef","FilterRowInput","okText","newFilter","FilterRowDisplay","operators","newCode","param","newOperator","newFilterValue","SearchFilterValueDialog","MenuSeparator","SubMenu","hover","setHover","setVisible","setAnchor","menuItemRef","hoverRef","visibleRef","show","timerId","setInterval","clearInterval","onMouseLeave","SearchPopupMenu","onSort","onClear","onPrompt","SearchParameterSubMenu","DateFilterSubMenu","NumericFilterSubMenu","ReferenceFilterSubMenu","TextFilterSubMenu","TitleBar","SearchChangeEvent","Event","SearchLoadEvent","response","SearchClickEvent","browserEvent","SearchControl","setOutcome","onLoad","popupVisible","popupX","popupY","popupSearchParams","fieldEditorVisible","filterEditorVisible","filterDialogVisible","stateRef","emitSearchChange","newSearch","handleRowClick","button","onAuxClick","formatSearchQuery","total","searchResponse","reason","newSchema","checkboxColumn","checkboxesEnabled","getFieldDefinitions","lastResult","savedSearches","userConfig","s","criteria","onContextMenu","hideToolbar","parseSearchDefinition","onNew","onExport","onBulk","min","getStart","DEFAULT_SEARCH_COUNT","getEnd","isAllSelected","newSelected","handleAllCheckboxClick","handleSortClick","FilterIcon","hideFilters","FilterDescription","handleSingleCheckboxClick","filterDialogSearchParam","filterDialogFilter","MemoizedSearchControl","memo","FhirPathTable","query","setResponse","setSelected","responseRef","graphql","ResourceList","fhirPath","MemoizedFhirPathTable","__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","next","rejected","done","apply","HeaderSearchInput","Patients1","Patients2","ServiceRequestList","getResourceScore","sortByRelevance","ids","dedupeResources","getResourcesFromResponse","escaped","isUUID","buildGraphQLQuery","bestScore","identifier","getStringScore","Logo","searches","ActionArrayBuilder","actionsRef","changeAction","changedAction","actions","ActionBuilder","action","onRemove","removeAction","removedAction","addedAction","generateId","actionType","setActionType","definitionCanonical","getInitialActionType","actionRef","changeProperty","LabActionBuilder","QuestionnaireActionBuilder","questionnaireRef","nextId","existing","existingNum","parseInt","substring","ensurePlanDefinitionActionKeys","QuestionnaireItemType","addInitialValuesToItemArray","linkId","suppliedValue","initialValue","valueBoolean","valueCoding","valueDate","valueDateTime","valueDecimal","valueInteger","valueTime","valueUri","valueReference","initial","addInitialValueToItem","isChoiceQuestion","QuestionnaireFormItemArray","responseItems","setResponseItems","buildInitialResponseItems","setResponseItem","newResponseItem","newResponseItems","group","QuestionnaireFormItem","answer","onChangeAnswer","newResponseAnswer","valueAttachment","choice","openChoice","extension","some","valueCodeableConcept","isDropDownChoice","QuestionnaireChoiceDropDownInput","QuestionnaireChoiceRadioInput","valueElementDefinition","answerOption","optionValue","propertyName","optionName","buildInitialResponseItem","buildInitialResponseAnswer","ItemBuilder","isResource","isContainer","editing","selectedKey","hovering","hoverKey","itemRef","changeItem","changedItem","addItem","addedItem","setSelectedKey","setHoverKey","AnswerBuilder","removedItem","removeItem","generateLinkId","flexDirection","alignItems","o","exports","nextLinkId","ensureQuestionnaireItemKeys","ensureQuestionnaireOptionKeys","createScriptTag","onload","head","getElementsByTagName","script","async","appendChild","GoogleButton","googleClientId","handleGoogleCredential","parentRef","scriptLoaded","setScriptLoaded","google","initialized","setInitialized","buttonRendered","setButtonRendered","accounts","initialize","client_id","callback","renderButton","getGoogleClientId","clientId","origin","protocol","host","initRecaptcha","grecaptcha","process","env","RECAPTCHA_SITE_KEY","getRecaptcha","ready","execute","StatusBadge","diff","startNode","orig","rev","deltas","snake","ianchor","janchor","position","lines","buildRevisions","N","M","MAX","middle","diagonal","k","kmiddle","kminus","kplusNode","kminusNode","node","previousSnake","buildPath","blame","versions","match","localeCompare","table","span","revisions","revision","oldLines","newLines","compareVersions","combineSpans","getVersionUrl","getTimeString","seconds","floor","now","years","pluralizeTime","months","days","hours","minutes","noun","ChangeDiff","HistoryRow","CalendarInput","month","getStartMonth","moveMonth","currMonth","prevMonth","grid","useMemo","startDate","slots","getFullYear","row","getDay","isDayAvailable","buildGrid","flex","week","weekIndex","day","dayIndex","slot","slotStart","formatTime","hour","minute","AuthenticationForm","startLogin","scope","nonce","email","password","remember","handleAuthResponse","startGoogleLogin","googleCredential","credential","onForgotPassword","onRegister","ProfileForm","memberships","membership","post","login","project","Tab","clickHandler","TabPanel","request","method","encounter","logins","getLogins","userMenuVisible","setUserMenuVisible","sidebarVisible","setSidebarVisible","background","bgColor","verticalAlign","fillRule","clipRule","onLogo","pathname","fontWeight","getActiveLogin","onProfile","setActiveLogin","reload","onSignOut","fontSize","config","menu","loading","eventListener","removeEventListeneer","medplumContext","Provider","patient","planDefinition","questionnaire","handleDocumentMouseOver","handleDocumentClick","source","buildInitialResponse","authored","registerRequest","partialLogin","startNewPatient","startNewProject","processCode","onSuccess","recaptchaToken","startNewUser","loginRequest","userLogin","googleClaims","parseJWTPayload","firstName","given_name","lastName","family_name","requestGroup","startedLoading","setStartedLoading","responseBundle","setResponseBundle","batchEntries","buildBatchRequest","task","findBundleEntry","taskInput","taskOutput","output","onStart","readHistory","rowSpan","originalResource","revisedResource","ignoreMeta","noValidate","schedule","setSlots","setSlot","info","setInfo","setForm","actor","serviceRequest","basedOn","setLogin","setMemberships","onCode","Children","child","isValidElement","cloneElement"],"mappings":"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"}
|