@medplum/react 0.9.32 → 0.9.35

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.
Files changed (67) hide show
  1. package/README.md +1 -1
  2. package/dist/cjs/QuestionnaireForm.d.ts +4 -1
  3. package/dist/cjs/Scheduler.d.ts +2 -1
  4. package/dist/cjs/SearchControlField.d.ts +2 -3
  5. package/dist/cjs/SearchFieldEditor.d.ts +1 -2
  6. package/dist/cjs/SearchFilterEditor.d.ts +1 -2
  7. package/dist/cjs/SearchFilterValueDialog.d.ts +1 -2
  8. package/dist/cjs/SearchFilterValueInput.d.ts +0 -2
  9. package/dist/cjs/SearchPopupMenu.d.ts +1 -2
  10. package/dist/cjs/auth/AuthenticationForm.d.ts +2 -0
  11. package/dist/cjs/auth/SignInForm.d.ts +2 -0
  12. package/dist/cjs/index.js +125 -71
  13. package/dist/cjs/index.js.map +1 -1
  14. package/dist/cjs/index.min.js +1 -1
  15. package/dist/cjs/index.min.js.map +1 -1
  16. package/dist/cjs/stories/QuestionnaireForm.stories.d.ts +1 -0
  17. package/dist/cjs/styles.css +51 -51
  18. package/dist/esm/GoogleButton.js +2 -2
  19. package/dist/esm/GoogleButton.js.map +1 -1
  20. package/dist/esm/Popup.js +5 -1
  21. package/dist/esm/Popup.js.map +1 -1
  22. package/dist/esm/QuestionnaireBuilder.js +1 -1
  23. package/dist/esm/QuestionnaireBuilder.js.map +1 -1
  24. package/dist/esm/QuestionnaireForm.d.ts +4 -1
  25. package/dist/esm/QuestionnaireForm.js +49 -10
  26. package/dist/esm/QuestionnaireForm.js.map +1 -1
  27. package/dist/esm/Scheduler.d.ts +2 -1
  28. package/dist/esm/Scheduler.js +18 -24
  29. package/dist/esm/Scheduler.js.map +1 -1
  30. package/dist/esm/SearchControl.js +10 -14
  31. package/dist/esm/SearchControl.js.map +1 -1
  32. package/dist/esm/SearchControlField.d.ts +2 -3
  33. package/dist/esm/SearchControlField.js +6 -8
  34. package/dist/esm/SearchControlField.js.map +1 -1
  35. package/dist/esm/SearchFieldEditor.d.ts +1 -2
  36. package/dist/esm/SearchFieldEditor.js +2 -2
  37. package/dist/esm/SearchFieldEditor.js.map +1 -1
  38. package/dist/esm/SearchFilterEditor.d.ts +1 -2
  39. package/dist/esm/SearchFilterEditor.js +5 -6
  40. package/dist/esm/SearchFilterEditor.js.map +1 -1
  41. package/dist/esm/SearchFilterValueDialog.d.ts +1 -2
  42. package/dist/esm/SearchFilterValueDialog.js +1 -1
  43. package/dist/esm/SearchFilterValueDialog.js.map +1 -1
  44. package/dist/esm/SearchFilterValueInput.d.ts +0 -2
  45. package/dist/esm/SearchFilterValueInput.js +1 -1
  46. package/dist/esm/SearchFilterValueInput.js.map +1 -1
  47. package/dist/esm/SearchPopupMenu.d.ts +1 -2
  48. package/dist/esm/SearchPopupMenu.js.map +1 -1
  49. package/dist/esm/ServiceRequestTimeline.js +3 -3
  50. package/dist/esm/ServiceRequestTimeline.js.map +1 -1
  51. package/dist/esm/auth/AuthenticationForm.d.ts +2 -0
  52. package/dist/esm/auth/AuthenticationForm.js +4 -0
  53. package/dist/esm/auth/AuthenticationForm.js.map +1 -1
  54. package/dist/esm/auth/SignInForm.d.ts +2 -0
  55. package/dist/esm/auth/SignInForm.js +1 -1
  56. package/dist/esm/auth/SignInForm.js.map +1 -1
  57. package/dist/esm/index.js +1 -1
  58. package/dist/esm/index.min.js +1 -1
  59. package/dist/esm/index.min.js.map +1 -1
  60. package/dist/esm/stories/QuestionnaireForm.stories.d.ts +1 -0
  61. package/dist/esm/styles.css +51 -51
  62. package/dist/esm/utils/blame.js +1 -0
  63. package/dist/esm/utils/blame.js.map +1 -1
  64. package/dist/esm/utils/outcomes.js +19 -1
  65. package/dist/esm/utils/outcomes.js.map +1 -1
  66. package/package.json +13 -13
  67. package/stats.html +4034 -0
@@ -1 +1 @@
1
- {"version":3,"file":"QuestionnaireForm.js","sources":["../../src/QuestionnaireForm.tsx"],"sourcesContent":["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).catch(console.log);\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 text: item.text,\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 text: item.text,\n item: newResponseItems,\n });\n }\n\n function onChangeAnswer(newResponseAnswer: QuestionnaireResponseItemAnswer): void {\n props.onChange({\n linkId: item.linkId,\n text: item.text,\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 text: item.text,\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"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"QuestionnaireForm.js","sources":["../../src/QuestionnaireForm.tsx"],"sourcesContent":["import {\n capitalize,\n createReference,\n deepEquals,\n getQuestionnaireAnswers,\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 submitButtonText?: string;\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 const [answers, setAnswers] = useState<Record<string, QuestionnaireResponseItemAnswer>>({});\n\n useEffect(() => {\n medplum\n .requestSchema('Questionnaire')\n .then(() => medplum.requestSchema('QuestionnaireResponse'))\n .then(setSchema)\n .catch(console.log);\n }, [medplum]);\n\n useEffect(() => {\n setResponse(questionnaire ? buildInitialResponse(questionnaire) : undefined);\n }, [questionnaire]);\n\n function setItems(newResponseItems: QuestionnaireResponseItem[]): void {\n const newResponse: QuestionnaireResponse = {\n resourceType: 'QuestionnaireResponse',\n item: newResponseItems,\n };\n setResponse(newResponse);\n setAnswers(getQuestionnaireAnswers(newResponse));\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 && (\n <QuestionnaireFormItemArray items={questionnaire.item} answers={answers} onChange={setItems} />\n )}\n <Button type=\"submit\" size=\"large\">\n {props.submitButtonText || 'OK'}\n </Button>\n </Form>\n );\n}\n\ninterface QuestionnaireFormItemArrayProps {\n items: QuestionnaireItem[];\n answers: Record<string, QuestionnaireResponseItemAnswer>;\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 (!isQuestionEnabled(item, props.answers)) {\n return null;\n }\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 answers={props.answers}\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 text: item.text,\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 answers={props.answers}\n onChange={(newResponseItem) => setResponseItem(index, newResponseItem)}\n />\n </FormSection>\n );\n })}\n </>\n );\n}\n\nexport interface QuestionnaireFormItemProps {\n item: QuestionnaireItem;\n answers: Record<string, QuestionnaireResponseItemAnswer>;\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 text: item.text,\n item: newResponseItems,\n });\n }\n\n function onChangeAnswer(newResponseAnswer: QuestionnaireResponseItemAnswer): void {\n props.onChange({\n linkId: item.linkId,\n text: item.text,\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 && (\n <QuestionnaireFormItemArray items={item.item} answers={props.answers} onChange={onChangeItem} />\n )}\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 text: item.text,\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\nexport function isQuestionEnabled(\n item: QuestionnaireItem,\n answers: Record<string, QuestionnaireResponseItemAnswer>\n): boolean {\n if (!item.enableWhen) {\n return true;\n }\n const enableBehavior = item.enableBehavior || 'any';\n for (const enableWhen of item.enableWhen) {\n const expectedAnswer = getTypedPropertyValue(\n {\n type: 'QuestionnaireItemEnableWhen',\n value: enableWhen,\n },\n 'answer[x]'\n );\n const actualAnswer = getTypedPropertyValue(\n {\n type: 'QuestionnaireResponseItemAnswer',\n value: answers[enableWhen.question as string],\n },\n 'value[x]'\n );\n const match = deepEquals(expectedAnswer, actualAnswer);\n if (enableBehavior === 'any' && match) {\n return true;\n }\n if (enableBehavior === 'all' && !match) {\n return false;\n }\n }\n if (enableBehavior === 'any') {\n return false;\n } else {\n return true;\n }\n}\n"],"names":[],"mappings":"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"}
@@ -1,7 +1,8 @@
1
1
  /// <reference types="react" />
2
- import { Reference, Schedule } from '@medplum/fhirtypes';
2
+ import { Questionnaire, Reference, Schedule } from '@medplum/fhirtypes';
3
3
  import './Scheduler.css';
4
4
  export interface SchedulerProps {
5
5
  schedule: Schedule | Reference<Schedule>;
6
+ questionnaire: Questionnaire | Reference<Questionnaire>;
6
7
  }
7
8
  export declare function Scheduler(props: SchedulerProps): JSX.Element | null;
@@ -3,9 +3,8 @@ import React, { useState, useRef, useEffect } from 'react';
3
3
  import { Avatar } from './Avatar.js';
4
4
  import { Button } from './Button.js';
5
5
  import { getStartMonth, CalendarInput } from './CalendarInput.js';
6
- import { FormSection } from './FormSection.js';
7
- import { Input } from './Input.js';
8
6
  import { useMedplum } from './MedplumProvider.js';
7
+ import { QuestionnaireForm } from './QuestionnaireForm.js';
9
8
  import { ResourceName } from './ResourceName.js';
10
9
  import { useResource } from './useResource.js';
11
10
 
@@ -13,22 +12,23 @@ function Scheduler(props) {
13
12
  var _a;
14
13
  const medplum = useMedplum();
15
14
  const schedule = useResource(props.schedule);
15
+ const questionnaire = useResource(props.questionnaire);
16
16
  const [slots, setSlots] = useState();
17
17
  const slotsRef = useRef();
18
18
  slotsRef.current = slots;
19
19
  const [month, setMonth] = useState(getStartMonth());
20
20
  const [date, setDate] = useState();
21
21
  const [slot, setSlot] = useState();
22
- const [info, setInfo] = useState();
23
- const [form, setForm] = useState();
22
+ const [response, setResponse] = useState();
24
23
  useEffect(() => {
25
24
  if (schedule) {
26
25
  setSlots([]);
27
26
  medplum
28
27
  .searchResources('Slot', new URLSearchParams([
28
+ ['_count', (30 * 24).toString()],
29
29
  ['schedule', getReferenceString(schedule)],
30
- ['start', 'gt' + month.toISOString()],
31
- ['start', 'lt' + new Date(month.getTime() + 31 * 24 * 60 * 60 * 1000).toISOString()],
30
+ ['start', 'gt' + getStart(month)],
31
+ ['start', 'lt' + getEnd(month)],
32
32
  ]))
33
33
  .then(setSlots)
34
34
  .catch(console.log);
@@ -37,7 +37,7 @@ function Scheduler(props) {
37
37
  setSlots(undefined);
38
38
  }
39
39
  }, [medplum, schedule, month]);
40
- if (!schedule || !slots) {
40
+ if (!schedule || !slots || !questionnaire) {
41
41
  return null;
42
42
  }
43
43
  const actor = (_a = schedule.actor) === null || _a === void 0 ? void 0 : _a[0];
@@ -61,26 +61,20 @@ function Scheduler(props) {
61
61
  slotStart.getTime() < date.getTime() + 24 * 3600 * 1000 && (React.createElement("div", { key: s.id },
62
62
  React.createElement(Button, { style: { width: 150 }, onClick: () => setSlot(s) }, formatTime(slotStart)))));
63
63
  }))),
64
- date && slot && !info && (React.createElement("div", null,
65
- React.createElement("h3", null, "Enter your info"),
66
- React.createElement(FormSection, { title: "Name", htmlFor: "name" },
67
- React.createElement(Input, { name: "name" })),
68
- React.createElement(FormSection, { title: "Email", htmlFor: "email" },
69
- React.createElement(Input, { name: "email" })),
70
- React.createElement(Button, { primary: true, onClick: () => setInfo('info') }, "Next"))),
71
- date && slot && info && !form && (React.createElement("div", null,
72
- React.createElement("h3", null, "Custom questions"),
73
- React.createElement(FormSection, { title: "Question 1", htmlFor: "q1" },
74
- React.createElement(Input, { name: "q1" })),
75
- React.createElement(FormSection, { title: "Question 2", htmlFor: "q2" },
76
- React.createElement(Input, { name: "email" })),
77
- React.createElement(FormSection, { title: "Question 3", htmlFor: "q3" },
78
- React.createElement(Input, { name: "email" })),
79
- React.createElement(Button, { primary: true, onClick: () => setForm('form') }, "Next"))),
80
- date && slot && info && form && (React.createElement("div", null,
64
+ date && slot && !response && (React.createElement(QuestionnaireForm, { questionnaire: questionnaire, submitButtonText: 'Next', onSubmit: setResponse })),
65
+ date && slot && response && (React.createElement("div", null,
81
66
  React.createElement("h3", null, "You're all set!"),
82
67
  React.createElement("p", null, "Check your email for a calendar invite."))))));
83
68
  }
69
+ function getStart(month) {
70
+ return formatSlotInstant(month.getTime());
71
+ }
72
+ function getEnd(month) {
73
+ return formatSlotInstant(month.getTime() + 31 * 24 * 60 * 60 * 1000);
74
+ }
75
+ function formatSlotInstant(time) {
76
+ return new Date(Math.max(Date.now(), time)).toISOString();
77
+ }
84
78
  function formatTime(date) {
85
79
  return date.toLocaleTimeString([], { hour: 'numeric', minute: '2-digit' });
86
80
  }
@@ -1 +1 @@
1
- {"version":3,"file":"Scheduler.js","sources":["../../src/Scheduler.tsx"],"sourcesContent":["import { getReferenceString } from '@medplum/core';\nimport { Reference, Schedule, Slot } from '@medplum/fhirtypes';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { Avatar } from './Avatar';\nimport { Button } from './Button';\nimport { CalendarInput, getStartMonth } from './CalendarInput';\nimport { FormSection } from './FormSection';\nimport { Input } from './Input';\nimport { useMedplum } from './MedplumProvider';\nimport { ResourceName } from './ResourceName';\nimport './Scheduler.css';\nimport { useResource } from './useResource';\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 [month, setMonth] = useState<Date>(getStartMonth());\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 setSlots([]);\n medplum\n .searchResources(\n 'Slot',\n new URLSearchParams([\n ['schedule', getReferenceString(schedule)],\n ['start', 'gt' + month.toISOString()],\n ['start', 'lt' + new Date(month.getTime() + 31 * 24 * 60 * 60 * 1000).toISOString()],\n ])\n )\n .then(setSlots)\n .catch(console.log);\n } else {\n setSlots(undefined);\n }\n }, [medplum, schedule, month]);\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} onChangeMonth={setMonth} 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"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Scheduler.js","sources":["../../src/Scheduler.tsx"],"sourcesContent":["import { getReferenceString } from '@medplum/core';\nimport { Questionnaire, QuestionnaireResponse, Reference, Schedule, Slot } from '@medplum/fhirtypes';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { Avatar } from './Avatar';\nimport { Button } from './Button';\nimport { CalendarInput, getStartMonth } from './CalendarInput';\nimport { useMedplum } from './MedplumProvider';\nimport { QuestionnaireForm } from './QuestionnaireForm';\nimport { ResourceName } from './ResourceName';\nimport { useResource } from './useResource';\nimport './Scheduler.css';\n\nexport interface SchedulerProps {\n schedule: Schedule | Reference<Schedule>;\n questionnaire: Questionnaire | Reference<Questionnaire>;\n}\n\nexport function Scheduler(props: SchedulerProps): JSX.Element | null {\n const medplum = useMedplum();\n const schedule = useResource(props.schedule);\n const questionnaire = useResource(props.questionnaire);\n\n const [slots, setSlots] = useState<Slot[]>();\n const slotsRef = useRef<Slot[]>();\n slotsRef.current = slots;\n\n const [month, setMonth] = useState<Date>(getStartMonth());\n const [date, setDate] = useState<Date>();\n const [slot, setSlot] = useState<Slot>();\n const [response, setResponse] = useState<QuestionnaireResponse>();\n\n useEffect(() => {\n if (schedule) {\n setSlots([]);\n medplum\n .searchResources(\n 'Slot',\n new URLSearchParams([\n ['_count', (30 * 24).toString()],\n ['schedule', getReferenceString(schedule)],\n ['start', 'gt' + getStart(month)],\n ['start', 'lt' + getEnd(month)],\n ])\n )\n .then(setSlots)\n .catch(console.log);\n } else {\n setSlots(undefined);\n }\n }, [medplum, schedule, month]);\n\n if (!schedule || !slots || !questionnaire) {\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} onChangeMonth={setMonth} 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 && !response && (\n <QuestionnaireForm questionnaire={questionnaire} submitButtonText={'Next'} onSubmit={setResponse} />\n )}\n {date && slot && response && (\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 getStart(month: Date): string {\n return formatSlotInstant(month.getTime());\n}\n\nfunction getEnd(month: Date): string {\n return formatSlotInstant(month.getTime() + 31 * 24 * 60 * 60 * 1000);\n}\n\nfunction formatSlotInstant(time: number): string {\n return new Date(Math.max(Date.now(), time)).toISOString();\n}\n\nfunction formatTime(date: Date): string {\n return date.toLocaleTimeString([], { hour: 'numeric', minute: '2-digit' });\n}\n"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { formatSearchQuery, parseSearchDefinition, DEFAULT_SEARCH_COUNT } from '@medplum/core';
1
+ import { formatSearchQuery, globalSchema, parseSearchDefinition, DEFAULT_SEARCH_COUNT } from '@medplum/core';
2
2
  import React, { useState, useRef, useEffect } from 'react';
3
3
  import { Button } from './Button.js';
4
4
  import { Loading } from './Loading.js';
@@ -41,7 +41,7 @@ class SearchClickEvent extends Event {
41
41
  function SearchControl(props) {
42
42
  var _a, _b, _c, _d;
43
43
  const medplum = useMedplum();
44
- const [schema, setSchema] = useState();
44
+ const [schemaLoaded, setSchemaLoaded] = useState(false);
45
45
  const [outcome, setOutcome] = useState();
46
46
  const { search, onLoad } = props;
47
47
  const [state, setState] = useState({
@@ -59,7 +59,7 @@ function SearchControl(props) {
59
59
  useEffect(() => {
60
60
  setOutcome(undefined);
61
61
  medplum
62
- .search(search.resourceType, formatSearchQuery(Object.assign(Object.assign({}, search), { total: 'accurate' })))
62
+ .search(search.resourceType, formatSearchQuery(Object.assign(Object.assign({}, search), { total: 'accurate', fields: undefined })))
63
63
  .then((response) => {
64
64
  setState(Object.assign(Object.assign({}, stateRef.current), { searchResponse: response }));
65
65
  if (onLoad) {
@@ -153,19 +153,15 @@ function SearchControl(props) {
153
153
  useEffect(() => {
154
154
  medplum
155
155
  .requestSchema(props.search.resourceType)
156
- .then((newSchema) => {
157
- // The schema could have the same object identity,
158
- // so need to use the spread operator to kick React re-render.
159
- setSchema(Object.assign({}, newSchema));
160
- })
156
+ .then(() => setSchemaLoaded(true))
161
157
  .catch(console.log);
162
158
  }, [medplum, props.search.resourceType]);
163
- const typeSchema = (_a = schema === null || schema === void 0 ? void 0 : schema.types) === null || _a === void 0 ? void 0 : _a[props.search.resourceType];
159
+ const typeSchema = schemaLoaded && ((_a = globalSchema === null || globalSchema === void 0 ? void 0 : globalSchema.types) === null || _a === void 0 ? void 0 : _a[props.search.resourceType]);
164
160
  if (!typeSchema) {
165
161
  return React.createElement(Loading, null);
166
162
  }
167
163
  const checkboxColumn = props.checkboxesEnabled;
168
- const fields = getFieldDefinitions(schema, search);
164
+ const fields = getFieldDefinitions(search);
169
165
  const resourceType = search.resourceType;
170
166
  const lastResult = state.searchResponse;
171
167
  const entries = lastResult === null || lastResult === void 0 ? void 0 : lastResult.entry;
@@ -215,7 +211,7 @@ function SearchControl(props) {
215
211
  (resources === null || resources === void 0 ? void 0 : resources.length) === 0 && (React.createElement("div", { "data-testid": "empty-search", className: "medplum-empty-search" }, "No results")),
216
212
  outcome && (React.createElement("div", { "data-testid": "search-error", className: "medplum-empty-search" },
217
213
  React.createElement("pre", { style: { textAlign: 'left' } }, JSON.stringify(outcome, undefined, 2)))),
218
- React.createElement(SearchPopupMenu, { schema: schema, search: props.search, visible: state.popupVisible, x: state.popupX, y: state.popupY, searchParams: state.popupSearchParams, onPrompt: (searchParam, filter) => {
214
+ React.createElement(SearchPopupMenu, { search: props.search, visible: state.popupVisible, x: state.popupX, y: state.popupY, searchParams: state.popupSearchParams, onPrompt: (searchParam, filter) => {
219
215
  setState(Object.assign(Object.assign({}, stateRef.current), { popupVisible: false, filterDialogVisible: true, filterDialogSearchParam: searchParam, filterDialogFilter: filter }));
220
216
  }, onChange: (result) => {
221
217
  emitSearchChange(result);
@@ -223,19 +219,19 @@ function SearchControl(props) {
223
219
  }, onClose: () => {
224
220
  setState(Object.assign(Object.assign({}, stateRef.current), { popupVisible: false, popupSearchParams: undefined }));
225
221
  } }),
226
- React.createElement(SearchFieldEditor, { schema: schema, search: props.search, visible: stateRef.current.fieldEditorVisible, onOk: (result) => {
222
+ React.createElement(SearchFieldEditor, { search: props.search, visible: stateRef.current.fieldEditorVisible, onOk: (result) => {
227
223
  emitSearchChange(result);
228
224
  setState(Object.assign(Object.assign({}, stateRef.current), { fieldEditorVisible: false }));
229
225
  }, onCancel: () => {
230
226
  setState(Object.assign(Object.assign({}, stateRef.current), { fieldEditorVisible: false }));
231
227
  } }),
232
- React.createElement(SearchFilterEditor, { schema: schema, search: props.search, visible: stateRef.current.filterEditorVisible, onOk: (result) => {
228
+ React.createElement(SearchFilterEditor, { search: props.search, visible: stateRef.current.filterEditorVisible, onOk: (result) => {
233
229
  emitSearchChange(result);
234
230
  setState(Object.assign(Object.assign({}, stateRef.current), { filterEditorVisible: false }));
235
231
  }, onCancel: () => {
236
232
  setState(Object.assign(Object.assign({}, stateRef.current), { filterEditorVisible: false }));
237
233
  } }),
238
- React.createElement(SearchFilterValueDialog, { visible: stateRef.current.filterDialogVisible, title: 'Input', schema: schema, resourceType: resourceType, searchParam: state.filterDialogSearchParam, filter: state.filterDialogFilter, defaultValue: '', onOk: (filter) => {
234
+ React.createElement(SearchFilterValueDialog, { visible: stateRef.current.filterDialogVisible, title: 'Input', resourceType: resourceType, searchParam: state.filterDialogSearchParam, filter: state.filterDialogFilter, defaultValue: '', onOk: (filter) => {
239
235
  emitSearchChange(addFilter(props.search, filter.code, filter.operator, filter.value));
240
236
  setState(Object.assign(Object.assign({}, stateRef.current), { filterDialogVisible: false }));
241
237
  }, onCancel: () => {
@@ -1 +1 @@
1
- {"version":3,"file":"SearchControl.js","sources":["../../src/SearchControl.tsx"],"sourcesContent":["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 './SearchControl.css';\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';\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\n .requestSchema(props.search.resourceType as ResourceType)\n .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 .catch(console.log);\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 &lt;&lt;\n </Button>\n <Button testid=\"next-page-button\" size=\"small\" onClick={() => emitSearchChange(movePage(search, 1))}>\n &gt;&gt;\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 &nbsp;\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"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"SearchControl.js","sources":["../../src/SearchControl.tsx"],"sourcesContent":["import {\n DEFAULT_SEARCH_COUNT,\n Filter,\n formatSearchQuery,\n globalSchema,\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 [schemaLoaded, setSchemaLoaded] = useState<boolean>(false);\n const [outcome, setOutcome] = useState<OperationOutcome | undefined>();\n const { search, onLoad } = props;\n\n const [state, setState] = useState<SearchControlState>({\n selected: {},\n 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(\n search.resourceType as ResourceType,\n formatSearchQuery({ ...search, total: 'accurate', fields: undefined })\n )\n .then((response) => {\n setState({ ...stateRef.current, searchResponse: response });\n if (onLoad) {\n onLoad(new SearchLoadEvent(response));\n }\n })\n .catch((reason) => {\n setState({ ...stateRef.current, searchResponse: undefined });\n setOutcome(reason);\n });\n }, [medplum, search, onLoad]);\n\n function handleSingleCheckboxClick(e: React.ChangeEvent, id: string): void {\n e.stopPropagation();\n\n const el = e.target as HTMLInputElement;\n const checked = el.checked;\n const newSelected = { ...stateRef.current.selected };\n if (checked) {\n newSelected[id] = true;\n } else {\n delete newSelected[id];\n }\n setState({ ...stateRef.current, selected: newSelected });\n }\n\n function handleAllCheckboxClick(e: React.ChangeEvent): void {\n e.stopPropagation();\n\n const el = e.target as HTMLInputElement;\n const checked = el.checked;\n const newSelected = {} as { [id: string]: boolean };\n const searchResponse = stateRef.current?.searchResponse;\n if (checked && searchResponse?.entry) {\n searchResponse.entry.forEach((entry) => {\n if (entry.resource?.id) {\n newSelected[entry.resource.id] = true;\n }\n });\n }\n setState({ ...stateRef.current, selected: newSelected });\n }\n\n function isAllSelected(): boolean {\n const state = stateRef.current;\n if (!state.searchResponse?.entry || state.searchResponse.entry.length === 0) {\n return false;\n }\n for (const e of state.searchResponse.entry) {\n if (e.resource?.id && !state.selected[e.resource.id]) {\n return false;\n }\n }\n return true;\n }\n\n /**\n * 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\n .requestSchema(props.search.resourceType as ResourceType)\n .then(() => setSchemaLoaded(true))\n .catch(console.log);\n }, [medplum, props.search.resourceType]);\n\n const typeSchema = schemaLoaded && globalSchema?.types?.[props.search.resourceType];\n if (!typeSchema) {\n return <Loading />;\n }\n\n const checkboxColumn = props.checkboxesEnabled;\n const fields = getFieldDefinitions(search);\n const resourceType = search.resourceType;\n const lastResult = state.searchResponse;\n const entries = lastResult?.entry;\n const resources = entries?.map((e) => e.resource);\n 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 &lt;&lt;\n </Button>\n <Button testid=\"next-page-button\" size=\"small\" onClick={() => emitSearchChange(movePage(search, 1))}>\n &gt;&gt;\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 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 search={props.search}\n visible={stateRef.current.fieldEditorVisible}\n onOk={(result) => {\n emitSearchChange(result);\n setState({\n ...stateRef.current,\n fieldEditorVisible: false,\n });\n }}\n onCancel={() => {\n setState({\n ...stateRef.current,\n fieldEditorVisible: false,\n });\n }}\n />\n <SearchFilterEditor\n search={props.search}\n visible={stateRef.current.filterEditorVisible}\n onOk={(result) => {\n emitSearchChange(result);\n setState({\n ...stateRef.current,\n filterEditorVisible: false,\n });\n }}\n onCancel={() => {\n setState({\n ...stateRef.current,\n filterEditorVisible: false,\n });\n }}\n />\n <SearchFilterValueDialog\n visible={stateRef.current.filterDialogVisible}\n title={'Input'}\n resourceType={resourceType}\n searchParam={state.filterDialogSearchParam}\n filter={state.filterDialogFilter}\n defaultValue={''}\n onOk={(filter) => {\n emitSearchChange(addFilter(props.search, filter.code, filter.operator, filter.value));\n setState({\n ...stateRef.current,\n filterDialogVisible: false,\n });\n }}\n onCancel={() => {\n setState({\n ...stateRef.current,\n filterDialogVisible: false,\n });\n }}\n />\n </div>\n );\n}\n\nexport const MemoizedSearchControl = React.memo(SearchControl);\n\ninterface FilterDescriptionProps {\n readonly resourceType: string;\n readonly searchParams: SearchParameter[];\n readonly filters?: Filter[];\n}\n\nfunction FilterDescription(props: FilterDescriptionProps): JSX.Element {\n const filters = (props.filters ?? []).filter((f) => props.searchParams.find((p) => p.code === f.code));\n if (filters.length === 0) {\n return <span>no filters</span>;\n }\n\n return (\n <>\n {filters.map((filter: Filter, index: number) => (\n <div key={`filter-${index}-${filters.length}`}>\n {getOpString(filter.operator)}\n &nbsp;\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"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAgCM,MAAO,iBAAkB,SAAQ,KAAK,CAAA;AAG1C,IAAA,WAAA,CAAY,UAAyB,EAAA;QACnC,KAAK,CAAC,QAAQ,CAAC,CAAC;AAChB,QAAA,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;KAC9B;AACF,CAAA;AAEK,MAAO,eAAgB,SAAQ,KAAK,CAAA;AAGxC,IAAA,WAAA,CAAY,QAAgB,EAAA;QAC1B,KAAK,CAAC,MAAM,CAAC,CAAC;AACd,QAAA,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;KAC1B;AACF,CAAA;AAEK,MAAO,gBAAiB,SAAQ,KAAK,CAAA;IAIzC,WAAY,CAAA,QAAkB,EAAE,YAA8B,EAAA;QAC5D,KAAK,CAAC,OAAO,CAAC,CAAC;AACf,QAAA,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;AACzB,QAAA,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;KAClC;AACF,CAAA;AAiCD;;;;AAIG;AACG,SAAU,aAAa,CAAC,KAAyB,EAAA;;AACrD,IAAA,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAU,KAAK,CAAC,CAAC;IACjE,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,EAAgC,CAAC;AACvE,IAAA,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;AAEjC,IAAA,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAqB;AACrD,QAAA,QAAQ,EAAE,EAAE;AACZ,QAAA,YAAY,EAAE,KAAK;AACnB,QAAA,MAAM,EAAE,CAAC;AACT,QAAA,MAAM,EAAE,CAAC;AACT,QAAA,iBAAiB,EAAE,SAAS;AAC5B,QAAA,kBAAkB,EAAE,KAAK;AACzB,QAAA,mBAAmB,EAAE,KAAK;AAC1B,QAAA,mBAAmB,EAAE,KAAK;AAC3B,KAAA,CAAC,CAAC;AAEH,IAAA,MAAM,QAAQ,GAAG,MAAM,CAAqB,KAAK,CAAC,CAAC;AACnD,IAAA,QAAQ,CAAC,OAAO,GAAG,KAAK,CAAC;IAEzB,SAAS,CAAC,MAAK;QACb,UAAU,CAAC,SAAS,CAAC,CAAC;QACtB,OAAO;AACJ,aAAA,MAAM,CACL,MAAM,CAAC,YAA4B,EACnC,iBAAiB,CAAM,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EAAA,MAAM,CAAE,EAAA,EAAA,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,IAAG,CACvE;AACA,aAAA,IAAI,CAAC,CAAC,QAAQ,KAAI;YACjB,QAAQ,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EAAM,QAAQ,CAAC,OAAO,KAAE,cAAc,EAAE,QAAQ,EAAA,CAAA,CAAG,CAAC;AAC5D,YAAA,IAAI,MAAM,EAAE;AACV,gBAAA,MAAM,CAAC,IAAI,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC;AACvC,aAAA;AACH,SAAC,CAAC;AACD,aAAA,KAAK,CAAC,CAAC,MAAM,KAAI;YAChB,QAAQ,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EAAM,QAAQ,CAAC,OAAO,KAAE,cAAc,EAAE,SAAS,EAAA,CAAA,CAAG,CAAC;YAC7D,UAAU,CAAC,MAAM,CAAC,CAAC;AACrB,SAAC,CAAC,CAAC;KACN,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;AAE9B,IAAA,SAAS,yBAAyB,CAAC,CAAoB,EAAE,EAAU,EAAA;QACjE,CAAC,CAAC,eAAe,EAAE,CAAC;AAEpB,QAAA,MAAM,EAAE,GAAG,CAAC,CAAC,MAA0B,CAAC;AACxC,QAAA,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC;QAC3B,MAAM,WAAW,qBAAQ,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAE,CAAC;AACrD,QAAA,IAAI,OAAO,EAAE;AACX,YAAA,WAAW,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC;AACxB,SAAA;AAAM,aAAA;AACL,YAAA,OAAO,WAAW,CAAC,EAAE,CAAC,CAAC;AACxB,SAAA;QACD,QAAQ,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EAAM,QAAQ,CAAC,OAAO,KAAE,QAAQ,EAAE,WAAW,EAAA,CAAA,CAAG,CAAC;KAC1D;IAED,SAAS,sBAAsB,CAAC,CAAoB,EAAA;;QAClD,CAAC,CAAC,eAAe,EAAE,CAAC;AAEpB,QAAA,MAAM,EAAE,GAAG,CAAC,CAAC,MAA0B,CAAC;AACxC,QAAA,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC;QAC3B,MAAM,WAAW,GAAG,EAA+B,CAAC;QACpD,MAAM,cAAc,GAAG,CAAA,EAAA,GAAA,QAAQ,CAAC,OAAO,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAE,cAAc,CAAC;QACxD,IAAI,OAAO,KAAI,cAAc,KAAd,IAAA,IAAA,cAAc,uBAAd,cAAc,CAAE,KAAK,CAAA,EAAE;YACpC,cAAc,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,KAAK,KAAI;;AACrC,gBAAA,IAAI,MAAA,KAAK,CAAC,QAAQ,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAE,EAAE,EAAE;oBACtB,WAAW,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC;AACvC,iBAAA;AACH,aAAC,CAAC,CAAC;AACJ,SAAA;QACD,QAAQ,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EAAM,QAAQ,CAAC,OAAO,KAAE,QAAQ,EAAE,WAAW,EAAA,CAAA,CAAG,CAAC;KAC1D;AAED,IAAA,SAAS,aAAa,GAAA;;AACpB,QAAA,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC;AAC/B,QAAA,IAAI,EAAC,CAAA,EAAA,GAAA,KAAK,CAAC,cAAc,0CAAE,KAAK,CAAA,IAAI,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;AAC3E,YAAA,OAAO,KAAK,CAAC;AACd,SAAA;QACD,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,cAAc,CAAC,KAAK,EAAE;AAC1C,YAAA,IAAI,CAAA,CAAA,EAAA,GAAA,CAAC,CAAC,QAAQ,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAE,EAAE,KAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE;AACpD,gBAAA,OAAO,KAAK,CAAC;AACd,aAAA;AACF,SAAA;AACD,QAAA,OAAO,IAAI,CAAC;KACb;AAED;;;;AAIG;AACH,IAAA,SAAS,eAAe,CAAC,CAAmB,EAAE,YAA2C,EAAA;QACvF,QAAQ,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EACH,QAAQ,CAAC,OAAO,CAAA,EAAA,EACnB,YAAY,EAAE,IAAI,EAClB,MAAM,EAAE,CAAC,CAAC,OAAO,EACjB,MAAM,EAAE,CAAC,CAAC,OAAO,EACjB,iBAAiB,EAAE,YAAY,EAAA,CAAA,CAC/B,CAAC;KACJ;AAED;;;AAGG;IACH,SAAS,gBAAgB,CAAC,SAAwB,EAAA;QAChD,IAAI,KAAK,CAAC,QAAQ,EAAE;YAClB,KAAK,CAAC,QAAQ,CAAC,IAAI,iBAAiB,CAAC,SAAS,CAAC,CAAC,CAAC;AAClD,SAAA;KACF;AAED;;;;;AAKG;AACH,IAAA,SAAS,cAAc,CAAC,CAAmB,EAAE,QAAkB,EAAA;AAC7D,QAAA,IAAI,cAAc,CAAC,CAAC,CAAC,MAAiB,CAAC,EAAE;;YAEvC,OAAO;AACR,SAAA;QAED,SAAS,CAAC,CAAC,CAAC,CAAC;QAEb,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE;YACnC,KAAK,CAAC,OAAO,CAAC,IAAI,gBAAgB,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC;AAClD,SAAA;QAED,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,UAAU,EAAE;YACtC,KAAK,CAAC,UAAU,CAAC,IAAI,gBAAgB,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC;AACrD,SAAA;KACF;IAED,SAAS,CAAC,MAAK;QACb,OAAO;AACJ,aAAA,aAAa,CAAC,KAAK,CAAC,MAAM,CAAC,YAA4B,CAAC;aACxD,IAAI,CAAC,MAAM,eAAe,CAAC,IAAI,CAAC,CAAC;AACjC,aAAA,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;KACvB,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC;IAEzC,MAAM,UAAU,GAAG,YAAY,KAAI,MAAA,YAAY,KAAA,IAAA,IAAZ,YAAY,KAAZ,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,YAAY,CAAE,KAAK,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAG,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,CAAA,CAAC;IACpF,IAAI,CAAC,UAAU,EAAE;QACf,OAAO,KAAA,CAAA,aAAA,CAAC,OAAO,EAAA,IAAA,CAAG,CAAC;AACpB,KAAA;AAED,IAAA,MAAM,cAAc,GAAG,KAAK,CAAC,iBAAiB,CAAC;AAC/C,IAAA,MAAM,MAAM,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;AAC3C,IAAA,MAAM,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;AACzC,IAAA,MAAM,UAAU,GAAG,KAAK,CAAC,cAAc,CAAC;IACxC,MAAM,OAAO,GAAG,UAAU,KAAA,IAAA,IAAV,UAAU,KAAV,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,UAAU,CAAE,KAAK,CAAC;AAClC,IAAA,MAAM,SAAS,GAAG,OAAO,aAAP,OAAO,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAP,OAAO,CAAE,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC;AAClD,IAAA,MAAM,aAAa,GAAG,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,KAAK,CAAC,UAAU,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAE,MAAM,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAE,MAAM,CAAC,CAAC,CAAC,KAAI,EAAA,IAAA,EAAA,CAAA,CAAC,OAAA,CAAA,EAAA,GAAA,CAAC,CAAC,QAAQ,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAE,UAAU,CAAC,YAAY,CAAC,CAAA,EAAA,CAAC,CAAC;AAEpG,IAAA,QACE,KAAK,CAAA,aAAA,CAAA,KAAA,EAAA,EAAA,SAAS,EAAC,wBAAwB,EAAC,aAAa,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,iBAAc,gBAAgB,EAAA;AACrG,QAAA,CAAC,KAAK,CAAC,WAAW,KACjB,oBAAC,QAAQ,EAAA,IAAA;AACP,YAAA,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA,IAAA;AACE,gBAAA,KAAA,CAAA,aAAA,CAAA,IAAA,EAAA,IAAA;AACE,oBAAA,KAAA,CAAA,aAAA,CAAA,GAAA,EAAA,EAAG,IAAI,EAAE,CAAA,yBAAA,EAA4B,YAAY,CAAC,WAAW,EAAE,CAAO,KAAA,CAAA,EAAE,MAAM,EAAC,QAAQ,EAAC,GAAG,EAAC,UAAU,EACnG,EAAA,YAAY,CACX,CACD;gBACJ,aAAa,KACZ,KAAC,CAAA,aAAA,CAAA,MAAM,IACL,MAAM,EAAC,qBAAqB,EAC5B,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EACpB,QAAQ,EAAE,CAAC,QAAQ,KAAI;AACrB,wBAAA,gBAAgB,CAAC,qBAAqB,CAAC,QAAQ,CAAC,CAAC,CAAC;qBACnD,EAAA;oBAED,KAAiB,CAAA,aAAA,CAAA,QAAA,EAAA,IAAA,CAAA;AAChB,oBAAA,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,MAC1B,KAAA,CAAA,aAAA,CAAA,QAAA,EAAA,EAAQ,GAAG,EAAE,GAAG,KAAK,CAAA,CAAA,EAAI,aAAa,CAAC,MAAM,CAAE,CAAA,EAAE,KAAK,EAAE,CAAC,CAAC,QAAQ,EAC/D,EAAA,CAAC,CAAC,IAAI,CACA,CACV,CAAC,CACK,CACV;gBACD,KAAC,CAAA,aAAA,CAAA,MAAM,EACL,EAAA,MAAM,EAAC,eAAe,EACtB,IAAI,EAAC,OAAO,EACZ,OAAO,EAAE,MAAM,QAAQ,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EAAM,QAAQ,CAAC,OAAO,CAAA,EAAA,EAAE,kBAAkB,EAAE,IAAI,EAAA,CAAA,CAAG,EAGnE,EAAA,QAAA,CAAA;gBACT,KAAC,CAAA,aAAA,CAAA,MAAM,EACL,EAAA,MAAM,EAAC,gBAAgB,EACvB,IAAI,EAAC,OAAO,EACZ,OAAO,EAAE,MAAM,QAAQ,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EAAM,QAAQ,CAAC,OAAO,CAAA,EAAA,EAAE,mBAAmB,EAAE,IAAI,EAAA,CAAA,CAAG,EAGpE,EAAA,SAAA,CAAA;AACR,gBAAA,KAAK,CAAC,KAAK,KACV,KAAA,CAAA,aAAA,CAAC,MAAM,EAAC,EAAA,IAAI,EAAC,OAAO,EAAC,OAAO,EAAE,KAAK,CAAC,KAAK,aAEhC,CACV;AACA,gBAAA,KAAK,CAAC,QAAQ,KACb,KAAA,CAAA,aAAA,CAAC,MAAM,EAAC,EAAA,IAAI,EAAC,OAAO,EAAC,OAAO,EAAE,KAAK,CAAC,QAAQ,gBAEnC,CACV;AACA,gBAAA,KAAK,CAAC,QAAQ,KACb,KAAC,CAAA,aAAA,CAAA,MAAM,EACL,EAAA,IAAI,EAAC,OAAO,EACZ,OAAO,EAAE,MAAO,KAAK,CAAC,QAAmC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,gBAG/E,CACV;AACA,gBAAA,KAAK,CAAC,MAAM,KACX,KAAC,CAAA,aAAA,CAAA,MAAM,EACL,EAAA,IAAI,EAAC,OAAO,EACZ,OAAO,EAAE,MAAO,KAAK,CAAC,MAAiC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAA,EAAA,SAAA,CAG7E,CACV,CACG;AACL,YAAA,UAAU,KACT,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA,IAAA;gBACE,KAAM,CAAA,aAAA,CAAA,MAAA,EAAA,EAAA,SAAS,EAAC,wBAAwB,EAAA;AACrC,oBAAA,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC,KAAe,CAAC;;AAAG,oBAAA,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,KAAe,CAAC;;AAAK,oBAAA,GAAG,EACjG,CAAA,EAAA,GAAA,UAAU,CAAC,KAAK,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA;AAAE,oBAAA,EAAA,CAAA,cAAc,EAAE,CAC9B;gBACP,KAAC,CAAA,aAAA,CAAA,MAAM,EAAC,EAAA,MAAM,EAAC,kBAAkB,EAAC,IAAI,EAAC,OAAO,EAAC,OAAO,EAAE,MAAM,gBAAgB,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,EAE3F,EAAA,IAAA,CAAA;AACT,gBAAA,KAAA,CAAA,aAAA,CAAC,MAAM,EAAA,EAAC,MAAM,EAAC,kBAAkB,EAAC,IAAI,EAAC,OAAO,EAAC,OAAO,EAAE,MAAM,gBAAgB,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAE1F,EAAA,IAAA,CAAA,CACL,CACP,CACQ,CACZ;AACD,QAAA,KAAA,CAAA,aAAA,CAAA,OAAA,EAAA,IAAA;AACE,YAAA,KAAA,CAAA,aAAA,CAAA,OAAA,EAAA,IAAA;AACE,gBAAA,KAAA,CAAA,aAAA,CAAA,IAAA,EAAA,IAAA;AACG,oBAAA,cAAc,KACb,KAAI,CAAA,aAAA,CAAA,IAAA,EAAA,EAAA,SAAS,EAAC,0BAA0B,EAAA;AACtC,wBAAA,KAAA,CAAA,aAAA,CAAA,OAAA,EAAA,EACE,IAAI,EAAC,UAAU,EACf,KAAK,EAAC,SAAS,EAAA,YAAA,EACJ,cAAc,EAAA,aAAA,EACb,cAAc,EAC1B,OAAO,EAAE,aAAa,EAAE,EACxB,QAAQ,EAAE,CAAC,CAAC,KAAK,sBAAsB,CAAC,CAAC,CAAC,EAAA,CAC1C,CACC,CACN;AACA,oBAAA,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,MAChB,KAAA,CAAA,aAAA,CAAA,IAAA,EAAA,EAAI,GAAG,EAAE,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,KAAK,eAAe,CAAC,CAAC,EAAE,KAAK,CAAC,YAAY,CAAC,EAAA;AACxE,wBAAA,oBAAoB,CAAC,KAAK,CAAC,IAAI,CAAC;wBAChC,KAAK,CAAC,YAAY,IAAI,KAAA,CAAA,aAAA,CAAC,UAAU,EAAG,IAAA,CAAA,CAClC,CACN,CAAC,CACC;AACJ,gBAAA,CAAC,KAAK,CAAC,WAAW,KACjB,KAAA,CAAA,aAAA,CAAA,IAAA,EAAA,IAAA;AACG,oBAAA,cAAc,IAAI,KAAA,CAAA,aAAA,CAAA,IAAA,EAAA,EAAI,SAAS,EAAC,kCAAkC,EAAG,CAAA;oBACrE,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,MAChB,KAAA,CAAA,aAAA,CAAA,IAAA,EAAA,EAAI,GAAG,EAAE,KAAK,CAAC,IAAI,EAAE,SAAS,EAAC,SAAS,IACrC,KAAK,CAAC,YAAY,KACjB,KAAA,CAAA,aAAA,CAAC,iBAAiB,EAChB,EAAA,YAAY,EAAE,YAAY,EAC1B,YAAY,EAAE,KAAK,CAAC,YAAY,EAChC,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,OAAO,EAC7B,CAAA,CACH,CACE,CACN,CAAC,CACC,CACN,CACK;YACR,KACG,CAAA,aAAA,CAAA,OAAA,EAAA,IAAA,EAAA,SAAS,aAAT,SAAS,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAT,SAAS,CAAE,GAAG,CACb,CAAC,QAAQ,KACP,QAAQ,KACN,KACE,CAAA,aAAA,CAAA,IAAA,EAAA,EAAA,GAAG,EAAE,QAAQ,CAAC,EAAE,EAAA,aAAA,EACJ,oBAAoB,EAChC,OAAO,EAAE,CAAC,CAAC,KAAK,cAAc,CAAC,CAAC,EAAE,QAAQ,CAAC,EAC3C,UAAU,EAAE,CAAC,CAAC,KAAK,cAAc,CAAC,CAAC,EAAE,QAAQ,CAAC,EAAA;AAE7C,gBAAA,cAAc,KACb,KAAI,CAAA,aAAA,CAAA,IAAA,EAAA,EAAA,SAAS,EAAC,0BAA0B,EAAA;oBACtC,KACE,CAAA,aAAA,CAAA,OAAA,EAAA,EAAA,IAAI,EAAC,UAAU,EACf,KAAK,EAAC,SAAS,iBACH,cAAc,EAAA,YAAA,EACd,gBAAgB,QAAQ,CAAC,EAAE,CAAE,CAAA,EACzC,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAY,CAAC,EAChD,QAAQ,EAAE,CAAC,CAAC,KAAK,yBAAyB,CAAC,CAAC,EAAE,QAAQ,CAAC,EAAY,CAAC,EACpE,CAAA,CACC,CACN;AACA,gBAAA,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,MAChB,KAAA,CAAA,aAAA,CAAA,IAAA,EAAA,EAAI,GAAG,EAAE,KAAK,CAAC,IAAI,EAAA,EAAG,WAAW,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAM,CACzD,CAAC,CACC,CACN,CACJ,CACK,CACF;AACP,QAAA,CAAA,SAAS,KAAT,IAAA,IAAA,SAAS,uBAAT,SAAS,CAAE,MAAM,MAAK,CAAC,KACtB,4CAAiB,cAAc,EAAC,SAAS,EAAC,sBAAsB,iBAE1D,CACP;AACA,QAAA,OAAO,KACN,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA,EAAA,aAAA,EAAiB,cAAc,EAAC,SAAS,EAAC,sBAAsB,EAAA;YAC9D,KAAK,CAAA,aAAA,CAAA,KAAA,EAAA,EAAA,KAAK,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,IAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC,CAAO,CAC5E,CACP;AACD,QAAA,KAAA,CAAA,aAAA,CAAC,eAAe,EACd,EAAA,MAAM,EAAE,KAAK,CAAC,MAAM,EACpB,OAAO,EAAE,KAAK,CAAC,YAAY,EAC3B,CAAC,EAAE,KAAK,CAAC,MAAM,EACf,CAAC,EAAE,KAAK,CAAC,MAAM,EACf,YAAY,EAAE,KAAK,CAAC,iBAAiB,EACrC,QAAQ,EAAE,CAAC,WAAW,EAAE,MAAM,KAAI;gBAChC,QAAQ,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EACH,QAAQ,CAAC,OAAO,KACnB,YAAY,EAAE,KAAK,EACnB,mBAAmB,EAAE,IAAI,EACzB,uBAAuB,EAAE,WAAW,EACpC,kBAAkB,EAAE,MAAM,EAAA,CAAA,CAC1B,CAAC;AACL,aAAC,EACD,QAAQ,EAAE,CAAC,MAAM,KAAI;gBACnB,gBAAgB,CAAC,MAAM,CAAC,CAAC;AACzB,gBAAA,QAAQ,CACH,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EAAA,QAAQ,CAAC,OAAO,CACnB,EAAA,EAAA,YAAY,EAAE,KAAK,EACnB,iBAAiB,EAAE,SAAS,IAC5B,CAAC;AACL,aAAC,EACD,OAAO,EAAE,MAAK;AACZ,gBAAA,QAAQ,CACH,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EAAA,QAAQ,CAAC,OAAO,CACnB,EAAA,EAAA,YAAY,EAAE,KAAK,EACnB,iBAAiB,EAAE,SAAS,IAC5B,CAAC;AACL,aAAC,EACD,CAAA;QACF,KAAC,CAAA,aAAA,CAAA,iBAAiB,IAChB,MAAM,EAAE,KAAK,CAAC,MAAM,EACpB,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,kBAAkB,EAC5C,IAAI,EAAE,CAAC,MAAM,KAAI;gBACf,gBAAgB,CAAC,MAAM,CAAC,CAAC;gBACzB,QAAQ,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EACH,QAAQ,CAAC,OAAO,KACnB,kBAAkB,EAAE,KAAK,EAAA,CAAA,CACzB,CAAC;AACL,aAAC,EACD,QAAQ,EAAE,MAAK;gBACb,QAAQ,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EACH,QAAQ,CAAC,OAAO,KACnB,kBAAkB,EAAE,KAAK,EAAA,CAAA,CACzB,CAAC;AACL,aAAC,EACD,CAAA;QACF,KAAC,CAAA,aAAA,CAAA,kBAAkB,IACjB,MAAM,EAAE,KAAK,CAAC,MAAM,EACpB,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,mBAAmB,EAC7C,IAAI,EAAE,CAAC,MAAM,KAAI;gBACf,gBAAgB,CAAC,MAAM,CAAC,CAAC;gBACzB,QAAQ,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EACH,QAAQ,CAAC,OAAO,KACnB,mBAAmB,EAAE,KAAK,EAAA,CAAA,CAC1B,CAAC;AACL,aAAC,EACD,QAAQ,EAAE,MAAK;gBACb,QAAQ,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EACH,QAAQ,CAAC,OAAO,KACnB,mBAAmB,EAAE,KAAK,EAAA,CAAA,CAC1B,CAAC;AACL,aAAC,EACD,CAAA;AACF,QAAA,KAAA,CAAA,aAAA,CAAC,uBAAuB,EACtB,EAAA,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,mBAAmB,EAC7C,KAAK,EAAE,OAAO,EACd,YAAY,EAAE,YAAY,EAC1B,WAAW,EAAE,KAAK,CAAC,uBAAuB,EAC1C,MAAM,EAAE,KAAK,CAAC,kBAAkB,EAChC,YAAY,EAAE,EAAE,EAChB,IAAI,EAAE,CAAC,MAAM,KAAI;gBACf,gBAAgB,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;gBACtF,QAAQ,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EACH,QAAQ,CAAC,OAAO,KACnB,mBAAmB,EAAE,KAAK,EAAA,CAAA,CAC1B,CAAC;AACL,aAAC,EACD,QAAQ,EAAE,MAAK;gBACb,QAAQ,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EACH,QAAQ,CAAC,OAAO,KACnB,mBAAmB,EAAE,KAAK,EAAA,CAAA,CAC1B,CAAC;aACJ,EAAA,CACD,CACE,EACN;AACJ,CAAC;AAEY,MAAA,qBAAqB,GAAG,KAAK,CAAC,IAAI,CAAC,aAAa,EAAE;AAQ/D,SAAS,iBAAiB,CAAC,KAA6B,EAAA;;AACtD,IAAA,MAAM,OAAO,GAAG,CAAC,CAAA,EAAA,GAAA,KAAK,CAAC,OAAO,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,EAAA,GAAI,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AACvG,IAAA,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE;AACxB,QAAA,OAAO,+CAAuB,CAAC;AAChC,KAAA;IAED,QACE,0CACG,OAAO,CAAC,GAAG,CAAC,CAAC,MAAc,EAAE,KAAa,MACzC,KAAK,CAAA,aAAA,CAAA,KAAA,EAAA,EAAA,GAAG,EAAE,CAAA,OAAA,EAAU,KAAK,CAAI,CAAA,EAAA,OAAO,CAAC,MAAM,CAAE,CAAA,EAAA;AAC1C,QAAA,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC;;AAE7B,QAAA,KAAA,CAAA,aAAA,CAAC,wBAAwB,EAAC,EAAA,YAAY,EAAE,KAAK,CAAC,YAAY,EAAE,MAAM,EAAE,MAAM,EAAI,CAAA,CAC1E,CACP,CAAC,CACD,EACH;AACJ,CAAC;AAED,SAAS,UAAU,GAAA;IACjB,QACE,KACE,CAAA,aAAA,CAAA,KAAA,EAAA,EAAA,KAAK,EAAC,4BAA4B,EAClC,SAAS,EAAC,SAAS,EACnB,IAAI,EAAC,MAAM,EACX,OAAO,EAAC,WAAW,EACnB,MAAM,EAAC,oBAAoB,EAC3B,WAAW,EAAE,CAAC,EAAA;AAEd,QAAA,KAAA,CAAA,aAAA,CAAA,MAAA,EAAA,EAAM,aAAa,EAAC,OAAO,EAAC,cAAc,EAAC,OAAO,EAAC,CAAC,EAAC,wBAAwB,EAAG,CAAA,CAC5E,EACN;AACJ,CAAC;AAED,SAAS,QAAQ,CAAC,MAAqB,EAAE,KAAa,EAAA;;AACpD,IAAA,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAA,EAAA,GAAA,MAAM,CAAC,MAAM,MAAI,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,EAAA,GAAA,CAAC,IAAI,CAAC,CAAC,CAAC;AACnD,CAAC;AAED,SAAS,MAAM,CAAC,MAAqB,EAAE,KAAa,EAAA;;AAClD,IAAA,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAA,EAAA,GAAA,MAAM,CAAC,MAAM,MAAI,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,EAAA,GAAA,CAAC,IAAI,CAAC,KAAK,CAAA,EAAA,GAAA,MAAM,CAAC,KAAK,MAAI,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,EAAA,GAAA,oBAAoB,CAAC,CAAC,CAAC;AAC9F;;;;"}
@@ -1,4 +1,4 @@
1
- import { IndexedStructureDefinition, SearchRequest } from '@medplum/core';
1
+ import { SearchRequest } from '@medplum/core';
2
2
  import { ElementDefinition, SearchParameter } from '@medplum/fhirtypes';
3
3
  /**
4
4
  * The SearchControlField type describes a field in the search control.
@@ -34,8 +34,7 @@ export interface SearchControlField {
34
34
  }
35
35
  /**
36
36
  * Returns the collection of field definitions for the search request.
37
- * @param typeSchema The schema for the resource type
38
37
  * @param search The search request definition.
39
38
  * @returns An array of field definitions.
40
39
  */
41
- export declare function getFieldDefinitions(schema: IndexedStructureDefinition, search: SearchRequest): SearchControlField[];
40
+ export declare function getFieldDefinitions(search: SearchRequest): SearchControlField[];