@medplum/react 1.0.4 → 1.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/AsyncAutocomplete/AsyncAutocomplete.d.ts +14 -0
- package/dist/cjs/DiagnosticReportDisplay/DiagnosticReportDisplay.stories.d.ts +1 -0
- package/dist/cjs/FhirPathTable/FhirPathTable.d.ts +2 -2
- package/dist/cjs/ValueSetAutocomplete/ValueSetAutocomplete.d.ts +3 -6
- package/dist/cjs/auth/ChooseProfileForm.d.ts +2 -1
- package/dist/cjs/auth/ChooseScopeForm.d.ts +2 -1
- package/dist/cjs/auth/MfaForm.d.ts +7 -0
- package/dist/cjs/auth/OktaButton.d.ts +5 -0
- package/dist/cjs/auth/SignInForm.d.ts +10 -0
- package/dist/cjs/index.d.ts +1 -0
- package/dist/cjs/index.js +319 -181
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/index.min.js +1 -1
- package/dist/cjs/index.min.js.map +1 -1
- package/dist/cjs/stories/referenceLab.d.ts +3 -1
- package/dist/esm/AsyncAutocomplete/AsyncAutocomplete.d.ts +14 -0
- package/dist/esm/AsyncAutocomplete/AsyncAutocomplete.js +116 -0
- package/dist/esm/AsyncAutocomplete/AsyncAutocomplete.js.map +1 -0
- package/dist/esm/CodeInput/CodeInput.js +3 -2
- package/dist/esm/CodeInput/CodeInput.js.map +1 -1
- package/dist/esm/CodeableConceptInput/CodeableConceptInput.js +18 -18
- package/dist/esm/CodeableConceptInput/CodeableConceptInput.js.map +1 -1
- package/dist/esm/CodingInput/CodingInput.js +3 -2
- package/dist/esm/CodingInput/CodingInput.js.map +1 -1
- package/dist/esm/DiagnosticReportDisplay/DiagnosticReportDisplay.js +8 -2
- package/dist/esm/DiagnosticReportDisplay/DiagnosticReportDisplay.js.map +1 -1
- package/dist/esm/DiagnosticReportDisplay/DiagnosticReportDisplay.stories.d.ts +1 -0
- package/dist/esm/FhirPathTable/FhirPathTable.d.ts +2 -2
- package/dist/esm/FhirPathTable/FhirPathTable.js.map +1 -1
- package/dist/esm/QuestionnaireForm/QuestionnaireForm.js +1 -0
- package/dist/esm/QuestionnaireForm/QuestionnaireForm.js.map +1 -1
- package/dist/esm/ResourceInput/ResourceInput.js +2 -2
- package/dist/esm/ResourceInput/ResourceInput.js.map +1 -1
- package/dist/esm/StatusBadge/StatusBadge.js +2 -1
- package/dist/esm/StatusBadge/StatusBadge.js.map +1 -1
- package/dist/esm/ValueSetAutocomplete/ValueSetAutocomplete.d.ts +3 -6
- package/dist/esm/ValueSetAutocomplete/ValueSetAutocomplete.js +24 -44
- package/dist/esm/ValueSetAutocomplete/ValueSetAutocomplete.js.map +1 -1
- package/dist/esm/auth/ChooseProfileForm.d.ts +2 -1
- package/dist/esm/auth/ChooseProfileForm.js.map +1 -1
- package/dist/esm/auth/ChooseScopeForm.d.ts +2 -1
- package/dist/esm/auth/ChooseScopeForm.js.map +1 -1
- package/dist/esm/auth/MfaForm.d.ts +7 -0
- package/dist/esm/auth/MfaForm.js +34 -0
- package/dist/esm/auth/MfaForm.js.map +1 -0
- package/dist/esm/auth/OktaButton.d.ts +5 -0
- package/dist/esm/auth/SignInForm.d.ts +10 -0
- package/dist/esm/auth/SignInForm.js +16 -0
- package/dist/esm/auth/SignInForm.js.map +1 -1
- package/dist/esm/index.d.ts +1 -0
- package/dist/esm/index.js +1 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/index.min.js +1 -1
- package/dist/esm/index.min.js.map +1 -1
- package/dist/esm/stories/referenceLab.d.ts +3 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"QuestionnaireForm.js","sources":["../../../src/QuestionnaireForm/QuestionnaireForm.tsx"],"sourcesContent":["import { Button, Checkbox, Group, NativeSelect, Radio, Stack, Textarea, TextInput, Title } from '@mantine/core';\nimport {\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/AttachmentInput';\nimport { CheckboxFormSection } from '../CheckboxFormSection/CheckboxFormSection';\nimport { DateTimeInput } from '../DateTimeInput/DateTimeInput';\nimport { Form } from '../Form/Form';\nimport { FormSection } from '../FormSection/FormSection';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\nimport { QuantityInput } from '../QuantityInput/QuantityInput';\nimport { ReferenceInput } from '../ReferenceInput/ReferenceInput';\nimport { ResourcePropertyDisplay } from '../ResourcePropertyDisplay/ResourcePropertyDisplay';\nimport { useResource } from '../useResource/useResource';\nimport { QuestionnaireItemType } from '../utils/questionnaire';\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 && <Title>{questionnaire.title}</Title>}\n {questionnaire.item && (\n <QuestionnaireFormItemArray items={questionnaire.item} answers={answers} onChange={setItems} />\n )}\n <Group position=\"right\" mt=\"xl\">\n <Button type=\"submit\">{props.submitButtonText || 'OK'}</Button>\n </Group>\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 <Stack>\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 id={item.linkId}\n name={item.linkId}\n defaultChecked={initial?.valueBoolean}\n onChange={(e) =>\n setResponseItem(index, {\n linkId: item.linkId,\n text: item.text,\n answer: [{ valueBoolean: e.currentTarget.checked }],\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 </Stack>\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 id={name}\n name={name}\n defaultChecked={initial?.valueBoolean}\n onChange={(e) => onChangeAnswer({ valueBoolean: e.currentTarget.checked })}\n />\n );\n case QuestionnaireItemType.decimal:\n return (\n <TextInput\n type=\"number\"\n step=\"any\"\n id={name}\n name={name}\n defaultValue={initial?.valueDecimal}\n onChange={(e) => onChangeAnswer({ valueDecimal: e.currentTarget.valueAsNumber })}\n />\n );\n case QuestionnaireItemType.integer:\n return (\n <TextInput\n type=\"number\"\n step={1}\n id={name}\n name={name}\n defaultValue={initial?.valueInteger}\n onChange={(e) => onChangeAnswer({ valueInteger: e.currentTarget.valueAsNumber })}\n />\n );\n case QuestionnaireItemType.date:\n return (\n <TextInput\n type=\"date\"\n id={name}\n name={name}\n defaultValue={initial?.valueDate}\n onChange={(e) => onChangeAnswer({ valueDate: e.currentTarget.value })}\n />\n );\n case QuestionnaireItemType.dateTime:\n return (\n <DateTimeInput\n name={name}\n defaultValue={initial?.valueDateTime}\n onChange={(newValue: string) => onChangeAnswer({ valueDateTime: newValue })}\n />\n );\n case QuestionnaireItemType.time:\n return (\n <TextInput\n type=\"time\"\n id={name}\n name={name}\n defaultValue={initial?.valueTime}\n onChange={(e) => onChangeAnswer({ valueTime: e.currentTarget.value })}\n />\n );\n case QuestionnaireItemType.string:\n case QuestionnaireItemType.url:\n return (\n <TextInput\n id={name}\n name={name}\n defaultValue={initial?.valueString}\n onChange={(e) => onChangeAnswer({ valueString: e.currentTarget.value })}\n />\n );\n case QuestionnaireItemType.text:\n return (\n <Textarea\n id={name}\n name={name}\n defaultValue={initial?.valueString}\n onChange={(e) => onChangeAnswer({ valueString: e.currentTarget.value })}\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 initialValue = getTypedPropertyValue({ type: 'QuestionnaireItemInitial', value: initial }, 'value') as\n | TypedValue\n | undefined;\n\n const data = [''];\n if (item.answerOption) {\n for (const option of item.answerOption) {\n const optionValue = getTypedPropertyValue(\n { type: 'QuestionnaireItemAnswerOption', value: option },\n 'value'\n ) as TypedValue;\n data.push(typedValueToString(optionValue) as string);\n }\n }\n\n return (\n <NativeSelect\n id={name}\n name={name}\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 defaultValue={typedValueToString(initialValue)}\n data={data}\n />\n );\n}\n\nfunction typedValueToString(typedValue: TypedValue | undefined): string | undefined {\n if (!typedValue) {\n return undefined;\n }\n if (typedValue.type === 'CodeableConcept') {\n return typedValue.value.coding[0].display;\n }\n if (typedValue.type === 'Coding') {\n return typedValue.value.display;\n }\n return typedValue.value.toString();\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\n const options: [string, TypedValue][] = [];\n let defaultValue = undefined;\n if (item.answerOption) {\n for (let i = 0; i < item.answerOption.length; i++) {\n const option = item.answerOption[i];\n const optionName = `${name}-option-${i}`;\n const optionValue = getTypedPropertyValue(\n { type: 'QuestionnaireItemAnswerOption', value: option },\n 'value'\n ) as TypedValue;\n if (initialValue && stringify(optionValue) === stringify(initialValue)) {\n defaultValue = optionName;\n }\n options.push([optionName, optionValue]);\n }\n }\n\n return (\n <Radio.Group\n name={name}\n orientation=\"vertical\"\n defaultValue={defaultValue}\n onChange={(newValue) => {\n const option = options.find((option) => option[0] === newValue);\n if (option) {\n const optionValue = option[1];\n const propertyName = 'value' + capitalize(optionValue.type);\n onChangeAnswer({ [propertyName]: optionValue.value });\n }\n }}\n >\n {options.map(([optionName, optionValue]) => (\n <Radio\n key={optionName}\n id={optionName}\n value={optionName}\n label={\n <ResourcePropertyDisplay\n property={valueElementDefinition}\n propertyType={optionValue.type as PropertyType}\n value={optionValue.value}\n />\n }\n />\n ))}\n </Radio.Group>\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
|
+
{"version":3,"file":"QuestionnaireForm.js","sources":["../../../src/QuestionnaireForm/QuestionnaireForm.tsx"],"sourcesContent":["import { Button, Checkbox, Group, NativeSelect, Radio, Stack, Textarea, TextInput, Title } from '@mantine/core';\nimport {\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/AttachmentInput';\nimport { CheckboxFormSection } from '../CheckboxFormSection/CheckboxFormSection';\nimport { DateTimeInput } from '../DateTimeInput/DateTimeInput';\nimport { Form } from '../Form/Form';\nimport { FormSection } from '../FormSection/FormSection';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\nimport { QuantityInput } from '../QuantityInput/QuantityInput';\nimport { ReferenceInput } from '../ReferenceInput/ReferenceInput';\nimport { ResourcePropertyDisplay } from '../ResourcePropertyDisplay/ResourcePropertyDisplay';\nimport { useResource } from '../useResource/useResource';\nimport { QuestionnaireItemType } from '../utils/questionnaire';\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 status: 'completed',\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 && <Title>{questionnaire.title}</Title>}\n {questionnaire.item && (\n <QuestionnaireFormItemArray items={questionnaire.item} answers={answers} onChange={setItems} />\n )}\n <Group position=\"right\" mt=\"xl\">\n <Button type=\"submit\">{props.submitButtonText || 'OK'}</Button>\n </Group>\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 <Stack>\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 id={item.linkId}\n name={item.linkId}\n defaultChecked={initial?.valueBoolean}\n onChange={(e) =>\n setResponseItem(index, {\n linkId: item.linkId,\n text: item.text,\n answer: [{ valueBoolean: e.currentTarget.checked }],\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 </Stack>\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 id={name}\n name={name}\n defaultChecked={initial?.valueBoolean}\n onChange={(e) => onChangeAnswer({ valueBoolean: e.currentTarget.checked })}\n />\n );\n case QuestionnaireItemType.decimal:\n return (\n <TextInput\n type=\"number\"\n step=\"any\"\n id={name}\n name={name}\n defaultValue={initial?.valueDecimal}\n onChange={(e) => onChangeAnswer({ valueDecimal: e.currentTarget.valueAsNumber })}\n />\n );\n case QuestionnaireItemType.integer:\n return (\n <TextInput\n type=\"number\"\n step={1}\n id={name}\n name={name}\n defaultValue={initial?.valueInteger}\n onChange={(e) => onChangeAnswer({ valueInteger: e.currentTarget.valueAsNumber })}\n />\n );\n case QuestionnaireItemType.date:\n return (\n <TextInput\n type=\"date\"\n id={name}\n name={name}\n defaultValue={initial?.valueDate}\n onChange={(e) => onChangeAnswer({ valueDate: e.currentTarget.value })}\n />\n );\n case QuestionnaireItemType.dateTime:\n return (\n <DateTimeInput\n name={name}\n defaultValue={initial?.valueDateTime}\n onChange={(newValue: string) => onChangeAnswer({ valueDateTime: newValue })}\n />\n );\n case QuestionnaireItemType.time:\n return (\n <TextInput\n type=\"time\"\n id={name}\n name={name}\n defaultValue={initial?.valueTime}\n onChange={(e) => onChangeAnswer({ valueTime: e.currentTarget.value })}\n />\n );\n case QuestionnaireItemType.string:\n case QuestionnaireItemType.url:\n return (\n <TextInput\n id={name}\n name={name}\n defaultValue={initial?.valueString}\n onChange={(e) => onChangeAnswer({ valueString: e.currentTarget.value })}\n />\n );\n case QuestionnaireItemType.text:\n return (\n <Textarea\n id={name}\n name={name}\n defaultValue={initial?.valueString}\n onChange={(e) => onChangeAnswer({ valueString: e.currentTarget.value })}\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 initialValue = getTypedPropertyValue({ type: 'QuestionnaireItemInitial', value: initial }, 'value') as\n | TypedValue\n | undefined;\n\n const data = [''];\n if (item.answerOption) {\n for (const option of item.answerOption) {\n const optionValue = getTypedPropertyValue(\n { type: 'QuestionnaireItemAnswerOption', value: option },\n 'value'\n ) as TypedValue;\n data.push(typedValueToString(optionValue) as string);\n }\n }\n\n return (\n <NativeSelect\n id={name}\n name={name}\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 defaultValue={typedValueToString(initialValue)}\n data={data}\n />\n );\n}\n\nfunction typedValueToString(typedValue: TypedValue | undefined): string | undefined {\n if (!typedValue) {\n return undefined;\n }\n if (typedValue.type === 'CodeableConcept') {\n return typedValue.value.coding[0].display;\n }\n if (typedValue.type === 'Coding') {\n return typedValue.value.display;\n }\n return typedValue.value.toString();\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\n const options: [string, TypedValue][] = [];\n let defaultValue = undefined;\n if (item.answerOption) {\n for (let i = 0; i < item.answerOption.length; i++) {\n const option = item.answerOption[i];\n const optionName = `${name}-option-${i}`;\n const optionValue = getTypedPropertyValue(\n { type: 'QuestionnaireItemAnswerOption', value: option },\n 'value'\n ) as TypedValue;\n if (initialValue && stringify(optionValue) === stringify(initialValue)) {\n defaultValue = optionName;\n }\n options.push([optionName, optionValue]);\n }\n }\n\n return (\n <Radio.Group\n name={name}\n orientation=\"vertical\"\n defaultValue={defaultValue}\n onChange={(newValue) => {\n const option = options.find((option) => option[0] === newValue);\n if (option) {\n const optionValue = option[1];\n const propertyName = 'value' + capitalize(optionValue.type);\n onChangeAnswer({ [propertyName]: optionValue.value });\n }\n }}\n >\n {options.map(([optionName, optionValue]) => (\n <Radio\n key={optionName}\n id={optionName}\n value={optionName}\n label={\n <ResourcePropertyDisplay\n property={valueElementDefinition}\n propertyType={optionValue.type as PropertyType}\n value={optionValue.value}\n />\n }\n />\n ))}\n </Radio.Group>\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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"}
|
|
@@ -21,7 +21,7 @@ const SEARCH_CODES = {
|
|
|
21
21
|
Observation: 'code',
|
|
22
22
|
RequestGroup: '_id',
|
|
23
23
|
ActivityDefinition: 'name',
|
|
24
|
-
User: 'email',
|
|
24
|
+
User: 'email:contains',
|
|
25
25
|
};
|
|
26
26
|
function ResourceInput(props) {
|
|
27
27
|
const medplum = useMedplum();
|
|
@@ -39,7 +39,7 @@ function ResourceInput(props) {
|
|
|
39
39
|
setLoading(true);
|
|
40
40
|
const searchCode = SEARCH_CODES[props.resourceType] || 'name';
|
|
41
41
|
const searchParams = new URLSearchParams({
|
|
42
|
-
[searchCode]:
|
|
42
|
+
[searchCode]: input,
|
|
43
43
|
_count: '10',
|
|
44
44
|
});
|
|
45
45
|
const resources = yield medplum.searchResources(props.resourceType, searchParams);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ResourceInput.js","sources":["../../../src/ResourceInput/ResourceInput.tsx"],"sourcesContent":["import { Autocomplete, AutocompleteItem, Group, Loader, Text } from '@mantine/core';\nimport { getDisplayString } from '@medplum/core';\nimport { Patient, Reference, Resource, ResourceType } from '@medplum/fhirtypes';\nimport React, { forwardRef, useEffect, useState } from 'react';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\nimport { ResourceAvatar } from '../ResourceAvatar/ResourceAvatar';\nimport { useResource } from '../useResource/useResource';\n\n/**\n * Defines which search parameters will be used by the type ahead to search for each resourceType\n */\nconst SEARCH_CODES: Record<string, string> = {\n Schedule: '_id',\n Task: '_id',\n Patient: 'name',\n Practitioner: 'name',\n Questionnaire: 'name',\n ServiceRequest: '_id',\n DiagnosticReport: '_id',\n Specimen: '_id',\n Observation: 'code',\n RequestGroup: '_id',\n ActivityDefinition: 'name',\n User: 'email',\n};\n\nexport interface ResourceInputProps<T extends Resource = Resource> {\n readonly resourceType: ResourceType;\n readonly name: string;\n readonly defaultValue?: T | Reference<T>;\n readonly placeholder?: string;\n readonly loadOnFocus?: boolean;\n readonly onChange?: (value: T | undefined) => void;\n}\n\nexport function ResourceInput<T extends Resource = Resource>(props: ResourceInputProps<T>): JSX.Element {\n const medplum = useMedplum();\n const defaultValue = useResource(props.defaultValue);\n const [value, setValue] = useState<string>(defaultValue ? getDisplayString(defaultValue) : '');\n const [loading, setLoading] = useState(false);\n const [data, setData] = useState<AutocompleteItem[]>([]);\n\n useEffect(() => {\n if (defaultValue) {\n setValue(getDisplayString(defaultValue));\n }\n }, [defaultValue, setValue]);\n\n async function loadValues(input: string): Promise<void> {\n setLoading(true);\n const searchCode = SEARCH_CODES[props.resourceType] || 'name';\n const searchParams = new URLSearchParams({\n [searchCode]:
|
|
1
|
+
{"version":3,"file":"ResourceInput.js","sources":["../../../src/ResourceInput/ResourceInput.tsx"],"sourcesContent":["import { Autocomplete, AutocompleteItem, Group, Loader, Text } from '@mantine/core';\nimport { getDisplayString } from '@medplum/core';\nimport { Patient, Reference, Resource, ResourceType } from '@medplum/fhirtypes';\nimport React, { forwardRef, useEffect, useState } from 'react';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\nimport { ResourceAvatar } from '../ResourceAvatar/ResourceAvatar';\nimport { useResource } from '../useResource/useResource';\n\n/**\n * Defines which search parameters will be used by the type ahead to search for each resourceType\n */\nconst SEARCH_CODES: Record<string, string> = {\n Schedule: '_id',\n Task: '_id',\n Patient: 'name',\n Practitioner: 'name',\n Questionnaire: 'name',\n ServiceRequest: '_id',\n DiagnosticReport: '_id',\n Specimen: '_id',\n Observation: 'code',\n RequestGroup: '_id',\n ActivityDefinition: 'name',\n User: 'email:contains',\n};\n\nexport interface ResourceInputProps<T extends Resource = Resource> {\n readonly resourceType: ResourceType;\n readonly name: string;\n readonly defaultValue?: T | Reference<T>;\n readonly placeholder?: string;\n readonly loadOnFocus?: boolean;\n readonly onChange?: (value: T | undefined) => void;\n}\n\nexport function ResourceInput<T extends Resource = Resource>(props: ResourceInputProps<T>): JSX.Element {\n const medplum = useMedplum();\n const defaultValue = useResource(props.defaultValue);\n const [value, setValue] = useState<string>(defaultValue ? getDisplayString(defaultValue) : '');\n const [loading, setLoading] = useState(false);\n const [data, setData] = useState<AutocompleteItem[]>([]);\n\n useEffect(() => {\n if (defaultValue) {\n setValue(getDisplayString(defaultValue));\n }\n }, [defaultValue, setValue]);\n\n async function loadValues(input: string): Promise<void> {\n setLoading(true);\n const searchCode = SEARCH_CODES[props.resourceType] || 'name';\n const searchParams = new URLSearchParams({\n [searchCode]: input,\n _count: '10',\n });\n\n const resources = await medplum.searchResources(props.resourceType, searchParams);\n setData(resources.map((resource) => ({ value: getDisplayString(resource), resource })));\n setLoading(false);\n }\n\n async function handleChange(val: string): Promise<void> {\n setValue(val);\n return loadValues(val);\n }\n\n function handleSelect(item: AutocompleteItem): void {\n setValue(item.value);\n setData([]);\n if (props.onChange) {\n props.onChange(item.resource);\n }\n }\n\n return (\n <Autocomplete\n itemComponent={ItemComponent}\n value={value}\n data={data}\n placeholder={props.placeholder}\n onFocus={() => loadValues(value)}\n onChange={handleChange}\n onItemSubmit={handleSelect}\n rightSection={loading ? <Loader size={16} /> : null}\n />\n );\n}\n\nconst ItemComponent = forwardRef<HTMLDivElement, any>(({ value, resource, ...others }: any, ref) => {\n return (\n <div ref={ref} {...others}>\n <Group noWrap>\n <ResourceAvatar value={resource} />\n <div>\n <Text>{value}</Text>\n <Text size=\"xs\" color=\"dimmed\">\n {(resource as Patient).birthDate}\n </Text>\n </div>\n </Group>\n </div>\n );\n});\n"],"names":[],"mappings":"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"}
|
|
@@ -9,7 +9,7 @@ import React from 'react';
|
|
|
9
9
|
* draft, active, retired, unknown
|
|
10
10
|
*
|
|
11
11
|
* Observation status: https://www.hl7.org/fhir/valueset-observation-status.html
|
|
12
|
-
* registered, preliminary, final, amended, cancelled, entered-in-error, unknown
|
|
12
|
+
* registered, preliminary, final, amended, corrected, cancelled, entered-in-error, unknown
|
|
13
13
|
*
|
|
14
14
|
* DiagnosticReport status: https://hl7.org/fhir/valueset-diagnostic-report-status.html
|
|
15
15
|
* registered, preliminary, final, amended, corrected, appended, cancelled, entered-in-error, unknown
|
|
@@ -33,6 +33,7 @@ const statusToColor = {
|
|
|
33
33
|
preliminary: 'blue',
|
|
34
34
|
final: 'green',
|
|
35
35
|
amended: 'yellow',
|
|
36
|
+
corrected: 'yellow',
|
|
36
37
|
cancelled: 'red',
|
|
37
38
|
requested: 'blue',
|
|
38
39
|
received: 'blue',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StatusBadge.js","sources":["../../../src/StatusBadge/StatusBadge.tsx"],"sourcesContent":["import { Badge, DefaultMantineColor } from '@mantine/core';\nimport React from 'react';\n\n/*\n * Request status: https://hl7.org/fhir/valueset-request-status.html\n * draft, active, on-hold, revoked, completed, entered-in-error, unknown\n *\n * Publication status: https://hl7.org/fhir/valueset-publication-status.html\n * draft, active, retired, unknown\n *\n * Observation status: https://www.hl7.org/fhir/valueset-observation-status.html\n * registered, preliminary, final, amended, cancelled, entered-in-error, unknown\n *\n * DiagnosticReport status: https://hl7.org/fhir/valueset-diagnostic-report-status.html\n * registered, preliminary, final, amended, corrected, appended, cancelled, entered-in-error, unknown\n *\n * Task status: https://hl7.org/fhir/valueset-task-status.html\n * draft, requested, received, accepted, rejected, ready, cancelled, in-progress, on-hold, failed, completed, entered-in-error\n *\n * Appointment status: https://www.hl7.org/fhir/valueset-appointmentstatus.html\n * proposed, pending, booked, arrived, fulfilled, cancelled, noshow, entered-in-error, chcked-in, waitlist\n */\n\nconst statusToColor: Record<string, DefaultMantineColor> = {\n draft: 'blue',\n active: 'blue',\n 'on-hold': 'yellow',\n revoked: 'red',\n completed: 'green',\n 'entered-in-error': 'red',\n unknown: 'gray',\n retired: 'gray',\n registered: 'blue',\n preliminary: 'blue',\n final: 'green',\n amended: 'yellow',\n cancelled: 'red',\n requested: 'blue',\n received: 'blue',\n accepted: 'blue',\n rejected: 'red',\n ready: 'blue',\n 'in-progress': 'blue',\n failed: 'red',\n proposed: 'blue',\n pending: 'blue',\n booked: 'blue',\n arrived: 'blue',\n fulfilled: 'green',\n noshow: 'red',\n 'checked-in': 'blue',\n waitlist: 'gray',\n routine: 'gray',\n urgent: 'red',\n asap: 'red',\n stat: 'red',\n};\n\nexport interface StatusBadgeProps {\n readonly status: string;\n}\n\nexport function StatusBadge(props: StatusBadgeProps): JSX.Element {\n return <Badge color={statusToColor[props.status]}>{props.status}</Badge>;\n}\n"],"names":[],"mappings":";;;AAGA;;;;;;;;;;;;;;;;;;AAkBG;AAEH,MAAM,aAAa,GAAwC;AACzD,IAAA,KAAK,EAAE,MAAM;AACb,IAAA,MAAM,EAAE,MAAM;AACd,IAAA,SAAS,EAAE,QAAQ;AACnB,IAAA,OAAO,EAAE,KAAK;AACd,IAAA,SAAS,EAAE,OAAO;AAClB,IAAA,kBAAkB,EAAE,KAAK;AACzB,IAAA,OAAO,EAAE,MAAM;AACf,IAAA,OAAO,EAAE,MAAM;AACf,IAAA,UAAU,EAAE,MAAM;AAClB,IAAA,WAAW,EAAE,MAAM;AACnB,IAAA,KAAK,EAAE,OAAO;AACd,IAAA,OAAO,EAAE,QAAQ;AACjB,IAAA,SAAS,EAAE,KAAK;AAChB,IAAA,SAAS,EAAE,MAAM;AACjB,IAAA,QAAQ,EAAE,MAAM;AAChB,IAAA,QAAQ,EAAE,MAAM;AAChB,IAAA,QAAQ,EAAE,KAAK;AACf,IAAA,KAAK,EAAE,MAAM;AACb,IAAA,aAAa,EAAE,MAAM;AACrB,IAAA,MAAM,EAAE,KAAK;AACb,IAAA,QAAQ,EAAE,MAAM;AAChB,IAAA,OAAO,EAAE,MAAM;AACf,IAAA,MAAM,EAAE,MAAM;AACd,IAAA,OAAO,EAAE,MAAM;AACf,IAAA,SAAS,EAAE,OAAO;AAClB,IAAA,MAAM,EAAE,KAAK;AACb,IAAA,YAAY,EAAE,MAAM;AACpB,IAAA,QAAQ,EAAE,MAAM;AAChB,IAAA,OAAO,EAAE,MAAM;AACf,IAAA,MAAM,EAAE,KAAK;AACb,IAAA,IAAI,EAAE,KAAK;AACX,IAAA,IAAI,EAAE,KAAK;CACZ,CAAC;AAMI,SAAU,WAAW,CAAC,KAAuB,EAAA;AACjD,IAAA,OAAO,oBAAC,KAAK,EAAA,EAAC,KAAK,EAAE,aAAa,CAAC,KAAK,CAAC,MAAM,CAAC,EAAG,EAAA,KAAK,CAAC,MAAM,CAAS,CAAC;AAC3E;;;;"}
|
|
1
|
+
{"version":3,"file":"StatusBadge.js","sources":["../../../src/StatusBadge/StatusBadge.tsx"],"sourcesContent":["import { Badge, DefaultMantineColor } from '@mantine/core';\nimport React from 'react';\n\n/*\n * Request status: https://hl7.org/fhir/valueset-request-status.html\n * draft, active, on-hold, revoked, completed, entered-in-error, unknown\n *\n * Publication status: https://hl7.org/fhir/valueset-publication-status.html\n * draft, active, retired, unknown\n *\n * Observation status: https://www.hl7.org/fhir/valueset-observation-status.html\n * registered, preliminary, final, amended, corrected, cancelled, entered-in-error, unknown\n *\n * DiagnosticReport status: https://hl7.org/fhir/valueset-diagnostic-report-status.html\n * registered, preliminary, final, amended, corrected, appended, cancelled, entered-in-error, unknown\n *\n * Task status: https://hl7.org/fhir/valueset-task-status.html\n * draft, requested, received, accepted, rejected, ready, cancelled, in-progress, on-hold, failed, completed, entered-in-error\n *\n * Appointment status: https://www.hl7.org/fhir/valueset-appointmentstatus.html\n * proposed, pending, booked, arrived, fulfilled, cancelled, noshow, entered-in-error, chcked-in, waitlist\n */\n\nconst statusToColor: Record<string, DefaultMantineColor> = {\n draft: 'blue',\n active: 'blue',\n 'on-hold': 'yellow',\n revoked: 'red',\n completed: 'green',\n 'entered-in-error': 'red',\n unknown: 'gray',\n retired: 'gray',\n registered: 'blue',\n preliminary: 'blue',\n final: 'green',\n amended: 'yellow',\n corrected: 'yellow',\n cancelled: 'red',\n requested: 'blue',\n received: 'blue',\n accepted: 'blue',\n rejected: 'red',\n ready: 'blue',\n 'in-progress': 'blue',\n failed: 'red',\n proposed: 'blue',\n pending: 'blue',\n booked: 'blue',\n arrived: 'blue',\n fulfilled: 'green',\n noshow: 'red',\n 'checked-in': 'blue',\n waitlist: 'gray',\n routine: 'gray',\n urgent: 'red',\n asap: 'red',\n stat: 'red',\n};\n\nexport interface StatusBadgeProps {\n readonly status: string;\n}\n\nexport function StatusBadge(props: StatusBadgeProps): JSX.Element {\n return <Badge color={statusToColor[props.status]}>{props.status}</Badge>;\n}\n"],"names":[],"mappings":";;;AAGA;;;;;;;;;;;;;;;;;;AAkBG;AAEH,MAAM,aAAa,GAAwC;AACzD,IAAA,KAAK,EAAE,MAAM;AACb,IAAA,MAAM,EAAE,MAAM;AACd,IAAA,SAAS,EAAE,QAAQ;AACnB,IAAA,OAAO,EAAE,KAAK;AACd,IAAA,SAAS,EAAE,OAAO;AAClB,IAAA,kBAAkB,EAAE,KAAK;AACzB,IAAA,OAAO,EAAE,MAAM;AACf,IAAA,OAAO,EAAE,MAAM;AACf,IAAA,UAAU,EAAE,MAAM;AAClB,IAAA,WAAW,EAAE,MAAM;AACnB,IAAA,KAAK,EAAE,OAAO;AACd,IAAA,OAAO,EAAE,QAAQ;AACjB,IAAA,SAAS,EAAE,QAAQ;AACnB,IAAA,SAAS,EAAE,KAAK;AAChB,IAAA,SAAS,EAAE,MAAM;AACjB,IAAA,QAAQ,EAAE,MAAM;AAChB,IAAA,QAAQ,EAAE,MAAM;AAChB,IAAA,QAAQ,EAAE,KAAK;AACf,IAAA,KAAK,EAAE,MAAM;AACb,IAAA,aAAa,EAAE,MAAM;AACrB,IAAA,MAAM,EAAE,KAAK;AACb,IAAA,QAAQ,EAAE,MAAM;AAChB,IAAA,OAAO,EAAE,MAAM;AACf,IAAA,MAAM,EAAE,MAAM;AACd,IAAA,OAAO,EAAE,MAAM;AACf,IAAA,SAAS,EAAE,OAAO;AAClB,IAAA,MAAM,EAAE,KAAK;AACb,IAAA,YAAY,EAAE,MAAM;AACpB,IAAA,QAAQ,EAAE,MAAM;AAChB,IAAA,OAAO,EAAE,MAAM;AACf,IAAA,MAAM,EAAE,KAAK;AACb,IAAA,IAAI,EAAE,KAAK;AACX,IAAA,IAAI,EAAE,KAAK;CACZ,CAAC;AAMI,SAAU,WAAW,CAAC,KAAuB,EAAA;AACjD,IAAA,OAAO,oBAAC,KAAK,EAAA,EAAC,KAAK,EAAE,aAAa,CAAC,KAAK,CAAC,MAAM,CAAC,EAAG,EAAA,KAAK,CAAC,MAAM,CAAS,CAAC;AAC3E;;;;"}
|
|
@@ -1,10 +1,7 @@
|
|
|
1
1
|
/// <reference types="react" />
|
|
2
2
|
import { ElementDefinition, ValueSetExpansionContains } from '@medplum/fhirtypes';
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
placeholder?: string;
|
|
7
|
-
defaultValue?: ValueSetExpansionContains;
|
|
8
|
-
onChange?: (value: ValueSetExpansionContains | undefined) => void;
|
|
3
|
+
import { AsyncAutocompleteProps } from '../AsyncAutocomplete/AsyncAutocomplete';
|
|
4
|
+
export interface ValueSetAutocompleteProps extends Omit<AsyncAutocompleteProps<ValueSetExpansionContains>, 'loadOptions' | 'toKey' | 'toOption'> {
|
|
5
|
+
elementDefinition: ElementDefinition;
|
|
9
6
|
}
|
|
10
7
|
export declare function ValueSetAutocomplete(props: ValueSetAutocompleteProps): JSX.Element;
|
|
@@ -1,61 +1,41 @@
|
|
|
1
|
-
import { __awaiter } from '../node_modules/tslib/tslib.es6.js';
|
|
2
|
-
import {
|
|
3
|
-
import
|
|
1
|
+
import { __rest, __awaiter } from '../node_modules/tslib/tslib.es6.js';
|
|
2
|
+
import React, { useCallback } from 'react';
|
|
3
|
+
import { AsyncAutocomplete } from '../AsyncAutocomplete/AsyncAutocomplete.js';
|
|
4
4
|
import { useMedplum } from '../MedplumProvider/MedplumProvider.js';
|
|
5
5
|
|
|
6
|
-
function
|
|
6
|
+
function toKey(element) {
|
|
7
|
+
return element.code;
|
|
8
|
+
}
|
|
9
|
+
function toOption(element) {
|
|
7
10
|
return {
|
|
8
11
|
value: element.code,
|
|
9
12
|
label: getDisplay(element),
|
|
10
|
-
element,
|
|
13
|
+
resource: element,
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
function createValue(input) {
|
|
17
|
+
return {
|
|
18
|
+
code: input,
|
|
19
|
+
display: input,
|
|
11
20
|
};
|
|
12
21
|
}
|
|
13
22
|
function ValueSetAutocomplete(props) {
|
|
14
23
|
const medplum = useMedplum();
|
|
15
|
-
const {
|
|
16
|
-
const
|
|
17
|
-
const [data, setData] = useState((defaultValue === null || defaultValue === void 0 ? void 0 : defaultValue.code) ? [valueSetElementToAutocompleteItem(defaultValue)] : []);
|
|
18
|
-
const dataRef = useRef();
|
|
19
|
-
dataRef.current = data;
|
|
20
|
-
const loadValues = useCallback((input) => __awaiter(this, void 0, void 0, function* () {
|
|
24
|
+
const { elementDefinition } = props, rest = __rest(props, ["elementDefinition"]);
|
|
25
|
+
const loadValues = useCallback((input, signal) => __awaiter(this, void 0, void 0, function* () {
|
|
21
26
|
var _a, _b;
|
|
22
|
-
const system = (_a =
|
|
23
|
-
const valueSet = yield medplum.searchValueSet(system, input);
|
|
27
|
+
const system = (_a = elementDefinition.binding) === null || _a === void 0 ? void 0 : _a.valueSet;
|
|
28
|
+
const valueSet = yield medplum.searchValueSet(system, input, { signal });
|
|
24
29
|
const valueSetElements = (_b = valueSet.expansion) === null || _b === void 0 ? void 0 : _b.contains;
|
|
25
|
-
const newData = [
|
|
30
|
+
const newData = [];
|
|
26
31
|
for (const valueSetElement of valueSetElements) {
|
|
27
|
-
if (valueSetElement.code && !newData.some((item) => item.
|
|
28
|
-
newData.push(
|
|
32
|
+
if (valueSetElement.code && !newData.some((item) => item.code === valueSetElement.code)) {
|
|
33
|
+
newData.push(valueSetElement);
|
|
29
34
|
}
|
|
30
35
|
}
|
|
31
|
-
|
|
32
|
-
}), [medplum,
|
|
33
|
-
|
|
34
|
-
setTextValues(values);
|
|
35
|
-
const textValue = values[0];
|
|
36
|
-
let currentItem = undefined;
|
|
37
|
-
if (textValue) {
|
|
38
|
-
currentItem = dataRef.current.find((item) => item.value === values[0]);
|
|
39
|
-
if (!currentItem) {
|
|
40
|
-
const newElement = { code: textValue, display: textValue };
|
|
41
|
-
currentItem = valueSetElementToAutocompleteItem(newElement);
|
|
42
|
-
setData([...dataRef.current, currentItem]);
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
if (props.onChange) {
|
|
46
|
-
props.onChange(currentItem === null || currentItem === void 0 ? void 0 : currentItem.element);
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
useEffect(() => {
|
|
50
|
-
loadValues('').catch(console.log);
|
|
51
|
-
}, [loadValues]);
|
|
52
|
-
return (React.createElement(MultiSelect, { data: data, placeholder: props.placeholder, searchable: true, creatable: true, clearable: true, value: textValues, filter: (value, selected, item) => {
|
|
53
|
-
var _a, _b;
|
|
54
|
-
return !!(textValues.length === 0 &&
|
|
55
|
-
!selected &&
|
|
56
|
-
(((_a = item.element.display) === null || _a === void 0 ? void 0 : _a.toLowerCase().includes(value.toLowerCase().trim())) ||
|
|
57
|
-
((_b = item.element.code) === null || _b === void 0 ? void 0 : _b.toLowerCase().includes(value.toLowerCase().trim()))));
|
|
58
|
-
}, onChange: handleChange, getCreateLabel: (query) => `+ Create ${query}`, onCreate: (query) => valueSetElementToAutocompleteItem({ code: query, display: query }) }));
|
|
36
|
+
return newData;
|
|
37
|
+
}), [medplum, elementDefinition]);
|
|
38
|
+
return (React.createElement(AsyncAutocomplete, Object.assign({}, rest, { creatable: true, clearable: true, toKey: toKey, toOption: toOption, loadOptions: loadValues, getCreateLabel: (query) => `+ Create ${query}`, onCreate: createValue })));
|
|
59
39
|
}
|
|
60
40
|
function getDisplay(item) {
|
|
61
41
|
return item.display || item.code || '';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ValueSetAutocomplete.js","sources":["../../../src/ValueSetAutocomplete/ValueSetAutocomplete.tsx"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"ValueSetAutocomplete.js","sources":["../../../src/ValueSetAutocomplete/ValueSetAutocomplete.tsx"],"sourcesContent":["import { ElementDefinition, ValueSetExpansionContains } from '@medplum/fhirtypes';\nimport React, { useCallback } from 'react';\nimport {\n AsyncAutocomplete,\n AsyncAutocompleteOption,\n AsyncAutocompleteProps,\n} from '../AsyncAutocomplete/AsyncAutocomplete';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\n\nexport interface ValueSetAutocompleteProps\n extends Omit<AsyncAutocompleteProps<ValueSetExpansionContains>, 'loadOptions' | 'toKey' | 'toOption'> {\n elementDefinition: ElementDefinition;\n}\n\nfunction toKey(element: ValueSetExpansionContains): string {\n return element.code as string;\n}\n\nfunction toOption(element: ValueSetExpansionContains): AsyncAutocompleteOption<ValueSetExpansionContains> {\n return {\n value: element.code as string,\n label: getDisplay(element),\n resource: element,\n };\n}\n\nfunction createValue(input: string): ValueSetExpansionContains {\n return {\n code: input,\n display: input,\n };\n}\n\nexport function ValueSetAutocomplete(props: ValueSetAutocompleteProps): JSX.Element {\n const medplum = useMedplum();\n const { elementDefinition, ...rest } = props;\n\n const loadValues = useCallback(\n async (input: string, signal: AbortSignal): Promise<ValueSetExpansionContains[]> => {\n const system = elementDefinition.binding?.valueSet as string;\n const valueSet = await medplum.searchValueSet(system, input, { signal });\n const valueSetElements = valueSet.expansion?.contains as ValueSetExpansionContains[];\n const newData: ValueSetExpansionContains[] = [];\n\n for (const valueSetElement of valueSetElements) {\n if (valueSetElement.code && !newData.some((item) => item.code === valueSetElement.code)) {\n newData.push(valueSetElement);\n }\n }\n\n return newData;\n },\n [medplum, elementDefinition]\n );\n\n return (\n <AsyncAutocomplete\n {...rest}\n creatable\n clearable\n toKey={toKey}\n toOption={toOption}\n loadOptions={loadValues}\n getCreateLabel={(query) => `+ Create ${query}`}\n onCreate={createValue}\n />\n );\n}\n\nfunction getDisplay(item: ValueSetExpansionContains): string {\n return item.display || item.code || '';\n}\n"],"names":[],"mappings":";;;;;AAcA,SAAS,KAAK,CAAC,OAAkC,EAAA;IAC/C,OAAO,OAAO,CAAC,IAAc,CAAC;AAChC,CAAC;AAED,SAAS,QAAQ,CAAC,OAAkC,EAAA;IAClD,OAAO;QACL,KAAK,EAAE,OAAO,CAAC,IAAc;AAC7B,QAAA,KAAK,EAAE,UAAU,CAAC,OAAO,CAAC;AAC1B,QAAA,QAAQ,EAAE,OAAO;KAClB,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,KAAa,EAAA;IAChC,OAAO;AACL,QAAA,IAAI,EAAE,KAAK;AACX,QAAA,OAAO,EAAE,KAAK;KACf,CAAC;AACJ,CAAC;AAEK,SAAU,oBAAoB,CAAC,KAAgC,EAAA;AACnE,IAAA,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,MAAM,EAAE,iBAAiB,EAAA,GAAc,KAAK,EAAd,IAAI,GAAA,MAAA,CAAK,KAAK,EAAtC,CAA8B,mBAAA,CAAA,CAAQ,CAAC;IAE7C,MAAM,UAAU,GAAG,WAAW,CAC5B,CAAO,KAAa,EAAE,MAAmB,KAA0C,SAAA,CAAA,IAAA,EAAA,KAAA,CAAA,EAAA,KAAA,CAAA,EAAA,aAAA;;QACjF,MAAM,MAAM,GAAG,CAAA,EAAA,GAAA,iBAAiB,CAAC,OAAO,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAE,QAAkB,CAAC;AAC7D,QAAA,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,cAAc,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;QACzE,MAAM,gBAAgB,GAAG,CAAA,EAAA,GAAA,QAAQ,CAAC,SAAS,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAE,QAAuC,CAAC;QACrF,MAAM,OAAO,GAAgC,EAAE,CAAC;AAEhD,QAAA,KAAK,MAAM,eAAe,IAAI,gBAAgB,EAAE;YAC9C,IAAI,eAAe,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK,eAAe,CAAC,IAAI,CAAC,EAAE;AACvF,gBAAA,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;AAC/B,aAAA;AACF,SAAA;AAED,QAAA,OAAO,OAAO,CAAC;KAChB,CAAA,EACD,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAC7B,CAAC;AAEF,IAAA,QACE,KAAC,CAAA,aAAA,CAAA,iBAAiB,EACZ,MAAA,CAAA,MAAA,CAAA,EAAA,EAAA,IAAI,IACR,SAAS,EAAA,IAAA,EACT,SAAS,EAAA,IAAA,EACT,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,QAAQ,EAClB,WAAW,EAAE,UAAU,EACvB,cAAc,EAAE,CAAC,KAAK,KAAK,CAAY,SAAA,EAAA,KAAK,EAAE,EAC9C,QAAQ,EAAE,WAAW,EAAA,CAAA,CACrB,EACF;AACJ,CAAC;AAED,SAAS,UAAU,CAAC,IAA+B,EAAA;IACjD,OAAO,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;AACzC;;;;"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
/// <reference types="react" />
|
|
2
|
+
import { LoginAuthenticationResponse } from '@medplum/core';
|
|
2
3
|
import { ProjectMembership } from '@medplum/fhirtypes';
|
|
3
4
|
export interface ChooseProfileFormProps {
|
|
4
5
|
login: string;
|
|
5
6
|
memberships: ProjectMembership[];
|
|
6
|
-
handleAuthResponse: (response:
|
|
7
|
+
handleAuthResponse: (response: LoginAuthenticationResponse) => void;
|
|
7
8
|
}
|
|
8
9
|
export declare function ChooseProfileForm(props: ChooseProfileFormProps): JSX.Element;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChooseProfileForm.js","sources":["../../../src/auth/ChooseProfileForm.tsx"],"sourcesContent":["import { Avatar, Center, Group, Stack, Text, Title, UnstyledButton } from '@mantine/core';\nimport { ProjectMembership } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { Logo } from '../Logo/Logo';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\n\nexport interface ChooseProfileFormProps {\n login: string;\n memberships: ProjectMembership[];\n handleAuthResponse: (response:
|
|
1
|
+
{"version":3,"file":"ChooseProfileForm.js","sources":["../../../src/auth/ChooseProfileForm.tsx"],"sourcesContent":["import { Avatar, Center, Group, Stack, Text, Title, UnstyledButton } from '@mantine/core';\nimport { LoginAuthenticationResponse } from '@medplum/core';\nimport { ProjectMembership } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { Logo } from '../Logo/Logo';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\n\nexport interface ChooseProfileFormProps {\n login: string;\n memberships: ProjectMembership[];\n handleAuthResponse: (response: LoginAuthenticationResponse) => void;\n}\n\nexport function ChooseProfileForm(props: ChooseProfileFormProps): JSX.Element {\n const medplum = useMedplum();\n return (\n <Stack>\n <Center sx={{ flexDirection: 'column' }}>\n <Logo size={32} />\n <Title>Choose profile</Title>\n </Center>\n {props.memberships.map((membership: ProjectMembership) => (\n <UnstyledButton\n key={membership.id}\n onClick={() => {\n medplum\n .post('auth/profile', {\n login: props.login,\n profile: membership.id,\n })\n .then(props.handleAuthResponse)\n .catch(console.log);\n }}\n >\n <Group>\n <Avatar radius=\"xl\" />\n <div style={{ flex: 1 }}>\n <Text size=\"sm\" weight={500}>\n {membership.profile?.display}\n </Text>\n <Text color=\"dimmed\" size=\"xs\">\n {membership.project?.display}\n </Text>\n </div>\n </Group>\n </UnstyledButton>\n ))}\n </Stack>\n );\n}\n"],"names":[],"mappings":";;;;;AAaM,SAAU,iBAAiB,CAAC,KAA6B,EAAA;AAC7D,IAAA,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,QACE,oBAAC,KAAK,EAAA,IAAA;QACJ,KAAC,CAAA,aAAA,CAAA,MAAM,IAAC,EAAE,EAAE,EAAE,aAAa,EAAE,QAAQ,EAAE,EAAA;AACrC,YAAA,KAAA,CAAA,aAAA,CAAC,IAAI,EAAA,EAAC,IAAI,EAAE,EAAE,EAAI,CAAA;YAClB,KAAC,CAAA,aAAA,CAAA,KAAK,yBAAuB,CACtB;QACR,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,UAA6B,KAAI;;AAAC,YAAA,QACxD,KAAA,CAAA,aAAA,CAAC,cAAc,EAAA,EACb,GAAG,EAAE,UAAU,CAAC,EAAE,EAClB,OAAO,EAAE,MAAK;oBACZ,OAAO;yBACJ,IAAI,CAAC,cAAc,EAAE;wBACpB,KAAK,EAAE,KAAK,CAAC,KAAK;wBAClB,OAAO,EAAE,UAAU,CAAC,EAAE;qBACvB,CAAC;AACD,yBAAA,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC;AAC9B,yBAAA,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;iBACvB,EAAA;AAED,gBAAA,KAAA,CAAA,aAAA,CAAC,KAAK,EAAA,IAAA;AACJ,oBAAA,KAAA,CAAA,aAAA,CAAC,MAAM,EAAA,EAAC,MAAM,EAAC,IAAI,EAAG,CAAA;AACtB,oBAAA,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA,EAAK,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,EAAA;AACrB,wBAAA,KAAA,CAAA,aAAA,CAAC,IAAI,EAAC,EAAA,IAAI,EAAC,IAAI,EAAC,MAAM,EAAE,GAAG,EAAA,EACxB,MAAA,UAAU,CAAC,OAAO,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAE,OAAO,CACvB;wBACP,KAAC,CAAA,aAAA,CAAA,IAAI,IAAC,KAAK,EAAC,QAAQ,EAAC,IAAI,EAAC,IAAI,EAAA,EAC3B,MAAA,UAAU,CAAC,OAAO,MAAE,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,OAAO,CACvB,CACH,CACA,CACO,EAClB;SAAA,CAAC,CACI,EACR;AACJ;;;;"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
/// <reference types="react" />
|
|
2
|
+
import { LoginAuthenticationResponse } from '@medplum/core';
|
|
2
3
|
export interface ChooseScopeFormProps {
|
|
3
4
|
login: string;
|
|
4
5
|
scope: string | undefined;
|
|
5
|
-
handleAuthResponse: (response:
|
|
6
|
+
handleAuthResponse: (response: LoginAuthenticationResponse) => void;
|
|
6
7
|
}
|
|
7
8
|
export declare function ChooseScopeForm(props: ChooseScopeFormProps): JSX.Element;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChooseScopeForm.js","sources":["../../../src/auth/ChooseScopeForm.tsx"],"sourcesContent":["import { Button, Center, Checkbox, Group, Stack, Title } from '@mantine/core';\nimport React from 'react';\nimport { Form } from '../Form/Form';\nimport { Logo } from '../Logo/Logo';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\n\nexport interface ChooseScopeFormProps {\n login: string;\n scope: string | undefined;\n handleAuthResponse: (response:
|
|
1
|
+
{"version":3,"file":"ChooseScopeForm.js","sources":["../../../src/auth/ChooseScopeForm.tsx"],"sourcesContent":["import { Button, Center, Checkbox, Group, Stack, Title } from '@mantine/core';\nimport { LoginAuthenticationResponse } from '@medplum/core';\nimport React from 'react';\nimport { Form } from '../Form/Form';\nimport { Logo } from '../Logo/Logo';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\n\nexport interface ChooseScopeFormProps {\n login: string;\n scope: string | undefined;\n handleAuthResponse: (response: LoginAuthenticationResponse) => void;\n}\n\nexport function ChooseScopeForm(props: ChooseScopeFormProps): JSX.Element {\n const medplum = useMedplum();\n return (\n <Form\n style={{ maxWidth: 400 }}\n onSubmit={(formData: Record<string, string>) => {\n medplum\n .post('auth/scope', {\n login: props.login,\n scope: Object.keys(formData).join(' '),\n })\n .then(props.handleAuthResponse)\n .catch(console.log);\n }}\n >\n <Stack>\n <Center sx={{ flexDirection: 'column' }}>\n <Logo size={32} />\n <Title>Choose scope</Title>\n </Center>\n <Stack>\n {(props.scope || 'openid').split(' ').map((scopeName: string) => (\n <Checkbox key={scopeName} id={scopeName} name={scopeName} label={scopeName} defaultChecked />\n ))}\n </Stack>\n <Group position=\"right\" mt=\"xl\">\n <Button type=\"submit\">Set scope</Button>\n </Group>\n </Stack>\n </Form>\n );\n}\n"],"names":[],"mappings":";;;;;;AAaM,SAAU,eAAe,CAAC,KAA2B,EAAA;AACzD,IAAA,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;AAC7B,IAAA,QACE,KAAC,CAAA,aAAA,CAAA,IAAI,EACH,EAAA,KAAK,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,EACxB,QAAQ,EAAE,CAAC,QAAgC,KAAI;YAC7C,OAAO;iBACJ,IAAI,CAAC,YAAY,EAAE;gBAClB,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;aACvC,CAAC;AACD,iBAAA,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC;AAC9B,iBAAA,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;SACvB,EAAA;AAED,QAAA,KAAA,CAAA,aAAA,CAAC,KAAK,EAAA,IAAA;YACJ,KAAC,CAAA,aAAA,CAAA,MAAM,IAAC,EAAE,EAAE,EAAE,aAAa,EAAE,QAAQ,EAAE,EAAA;AACrC,gBAAA,KAAA,CAAA,aAAA,CAAC,IAAI,EAAA,EAAC,IAAI,EAAE,EAAE,EAAI,CAAA;gBAClB,KAAC,CAAA,aAAA,CAAA,KAAK,uBAAqB,CACpB;YACT,KAAC,CAAA,aAAA,CAAA,KAAK,QACH,CAAC,KAAK,CAAC,KAAK,IAAI,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,SAAiB,MAC1D,oBAAC,QAAQ,EAAA,EAAC,GAAG,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,cAAc,EAAA,IAAA,EAAA,CAAG,CAC9F,CAAC,CACI;YACR,KAAC,CAAA,aAAA,CAAA,KAAK,IAAC,QAAQ,EAAC,OAAO,EAAC,EAAE,EAAC,IAAI,EAAA;gBAC7B,KAAC,CAAA,aAAA,CAAA,MAAM,EAAC,EAAA,IAAI,EAAC,QAAQ,gBAAmB,CAClC,CACF,CACH,EACP;AACJ;;;;"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/// <reference types="react" />
|
|
2
|
+
import { LoginAuthenticationResponse } from '@medplum/core';
|
|
3
|
+
export interface MfaFormProps {
|
|
4
|
+
login: string;
|
|
5
|
+
handleAuthResponse: (response: LoginAuthenticationResponse) => void;
|
|
6
|
+
}
|
|
7
|
+
export declare function MfaForm(props: MfaFormProps): JSX.Element;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { Stack, Center, Title, Alert, TextInput, Group, Button } from '@mantine/core';
|
|
2
|
+
import { normalizeErrorString } from '@medplum/core';
|
|
3
|
+
import { IconAlertCircle } from '@tabler/icons';
|
|
4
|
+
import React, { useState } from 'react';
|
|
5
|
+
import { Form } from '../Form/Form.js';
|
|
6
|
+
import { Logo } from '../Logo/Logo.js';
|
|
7
|
+
import { useMedplum } from '../MedplumProvider/MedplumProvider.js';
|
|
8
|
+
|
|
9
|
+
function MfaForm(props) {
|
|
10
|
+
const medplum = useMedplum();
|
|
11
|
+
const [errorMessage, setErrorMessage] = useState(undefined);
|
|
12
|
+
return (React.createElement(Form, { style: { maxWidth: 400 }, onSubmit: (formData) => {
|
|
13
|
+
setErrorMessage(undefined);
|
|
14
|
+
medplum
|
|
15
|
+
.post('auth/mfa/verify', {
|
|
16
|
+
login: props.login,
|
|
17
|
+
token: formData.token,
|
|
18
|
+
})
|
|
19
|
+
.then(props.handleAuthResponse)
|
|
20
|
+
.catch((err) => setErrorMessage(normalizeErrorString(err)));
|
|
21
|
+
} },
|
|
22
|
+
React.createElement(Stack, null,
|
|
23
|
+
React.createElement(Center, { sx: { flexDirection: 'column' } },
|
|
24
|
+
React.createElement(Logo, { size: 32 }),
|
|
25
|
+
React.createElement(Title, null, "Enter MFA code")),
|
|
26
|
+
errorMessage && (React.createElement(Alert, { icon: React.createElement(IconAlertCircle, { size: 16 }), title: "Error", color: "red" }, errorMessage)),
|
|
27
|
+
React.createElement(Stack, null,
|
|
28
|
+
React.createElement(TextInput, { name: "token", label: "MFA code", required: true })),
|
|
29
|
+
React.createElement(Group, { position: "right", mt: "xl" },
|
|
30
|
+
React.createElement(Button, { type: "submit" }, "Submit code")))));
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export { MfaForm };
|
|
34
|
+
//# sourceMappingURL=MfaForm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MfaForm.js","sources":["../../../src/auth/MfaForm.tsx"],"sourcesContent":["import { Alert, Button, Center, Group, Stack, TextInput, Title } from '@mantine/core';\nimport { LoginAuthenticationResponse, normalizeErrorString } from '@medplum/core';\nimport { IconAlertCircle } from '@tabler/icons';\nimport React, { useState } from 'react';\nimport { Form } from '../Form/Form';\nimport { Logo } from '../Logo/Logo';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\n\nexport interface MfaFormProps {\n login: string;\n handleAuthResponse: (response: LoginAuthenticationResponse) => void;\n}\n\nexport function MfaForm(props: MfaFormProps): JSX.Element {\n const medplum = useMedplum();\n const [errorMessage, setErrorMessage] = useState<string | undefined>(undefined);\n return (\n <Form\n style={{ maxWidth: 400 }}\n onSubmit={(formData: Record<string, string>) => {\n setErrorMessage(undefined);\n medplum\n .post('auth/mfa/verify', {\n login: props.login,\n token: formData.token,\n })\n .then(props.handleAuthResponse)\n .catch((err) => setErrorMessage(normalizeErrorString(err)));\n }}\n >\n <Stack>\n <Center sx={{ flexDirection: 'column' }}>\n <Logo size={32} />\n <Title>Enter MFA code</Title>\n </Center>\n {errorMessage && (\n <Alert icon={<IconAlertCircle size={16} />} title=\"Error\" color=\"red\">\n {errorMessage}\n </Alert>\n )}\n <Stack>\n <TextInput name=\"token\" label=\"MFA code\" required />\n </Stack>\n <Group position=\"right\" mt=\"xl\">\n <Button type=\"submit\">Submit code</Button>\n </Group>\n </Stack>\n </Form>\n );\n}\n"],"names":[],"mappings":";;;;;;;;AAaM,SAAU,OAAO,CAAC,KAAmB,EAAA;AACzC,IAAA,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAqB,SAAS,CAAC,CAAC;AAChF,IAAA,QACE,KAAC,CAAA,aAAA,CAAA,IAAI,EACH,EAAA,KAAK,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,EACxB,QAAQ,EAAE,CAAC,QAAgC,KAAI;YAC7C,eAAe,CAAC,SAAS,CAAC,CAAC;YAC3B,OAAO;iBACJ,IAAI,CAAC,iBAAiB,EAAE;gBACvB,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,KAAK,EAAE,QAAQ,CAAC,KAAK;aACtB,CAAC;AACD,iBAAA,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC;AAC9B,iBAAA,KAAK,CAAC,CAAC,GAAG,KAAK,eAAe,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;SAC/D,EAAA;AAED,QAAA,KAAA,CAAA,aAAA,CAAC,KAAK,EAAA,IAAA;YACJ,KAAC,CAAA,aAAA,CAAA,MAAM,IAAC,EAAE,EAAE,EAAE,aAAa,EAAE,QAAQ,EAAE,EAAA;AACrC,gBAAA,KAAA,CAAA,aAAA,CAAC,IAAI,EAAA,EAAC,IAAI,EAAE,EAAE,EAAI,CAAA;gBAClB,KAAC,CAAA,aAAA,CAAA,KAAK,yBAAuB,CACtB;YACR,YAAY,KACX,KAAA,CAAA,aAAA,CAAC,KAAK,EAAA,EAAC,IAAI,EAAE,KAAA,CAAA,aAAA,CAAC,eAAe,EAAA,EAAC,IAAI,EAAE,EAAE,EAAI,CAAA,EAAE,KAAK,EAAC,OAAO,EAAC,KAAK,EAAC,KAAK,EAAA,EAClE,YAAY,CACP,CACT;AACD,YAAA,KAAA,CAAA,aAAA,CAAC,KAAK,EAAA,IAAA;AACJ,gBAAA,KAAA,CAAA,aAAA,CAAC,SAAS,EAAA,EAAC,IAAI,EAAC,OAAO,EAAC,KAAK,EAAC,UAAU,EAAC,QAAQ,EAAA,IAAA,EAAA,CAAG,CAC9C;YACR,KAAC,CAAA,aAAA,CAAA,KAAK,IAAC,QAAQ,EAAC,OAAO,EAAC,EAAE,EAAC,IAAI,EAAA;gBAC7B,KAAC,CAAA,aAAA,CAAA,MAAM,EAAC,EAAA,IAAI,EAAC,QAAQ,kBAAqB,CACpC,CACF,CACH,EACP;AACJ;;;;"}
|
|
@@ -8,4 +8,14 @@ export interface SignInFormProps extends BaseLoginRequest {
|
|
|
8
8
|
readonly onCode?: (code: string) => void;
|
|
9
9
|
readonly children?: React.ReactNode;
|
|
10
10
|
}
|
|
11
|
+
/**
|
|
12
|
+
* The SignInForm component allows users to sign in to Medplum.
|
|
13
|
+
*
|
|
14
|
+
* "Signing in" is a multi-step process:
|
|
15
|
+
* 1) Authentication - identify the user
|
|
16
|
+
* 2) MFA - If MFA is enabled, prompt for MFA code
|
|
17
|
+
* 3) Choose profile - If the user has multiple profiles, prompt to choose one
|
|
18
|
+
* 4) Choose scope - If the user has multiple scopes, prompt to choose one
|
|
19
|
+
* 5) Success - Return to the caller with either a code or a redirect
|
|
20
|
+
*/
|
|
11
21
|
export declare function SignInForm(props: SignInFormProps): JSX.Element;
|
|
@@ -5,14 +5,27 @@ import { useMedplum } from '../MedplumProvider/MedplumProvider.js';
|
|
|
5
5
|
import { AuthenticationForm } from './AuthenticationForm.js';
|
|
6
6
|
import { ChooseProfileForm } from './ChooseProfileForm.js';
|
|
7
7
|
import { ChooseScopeForm } from './ChooseScopeForm.js';
|
|
8
|
+
import { MfaForm } from './MfaForm.js';
|
|
8
9
|
import { NewProjectForm } from './NewProjectForm.js';
|
|
9
10
|
|
|
11
|
+
/**
|
|
12
|
+
* The SignInForm component allows users to sign in to Medplum.
|
|
13
|
+
*
|
|
14
|
+
* "Signing in" is a multi-step process:
|
|
15
|
+
* 1) Authentication - identify the user
|
|
16
|
+
* 2) MFA - If MFA is enabled, prompt for MFA code
|
|
17
|
+
* 3) Choose profile - If the user has multiple profiles, prompt to choose one
|
|
18
|
+
* 4) Choose scope - If the user has multiple scopes, prompt to choose one
|
|
19
|
+
* 5) Success - Return to the caller with either a code or a redirect
|
|
20
|
+
*/
|
|
10
21
|
function SignInForm(props) {
|
|
11
22
|
const { chooseScopes, onSuccess, onForgotPassword, onRegister, onCode } = props, baseLoginRequest = __rest(props, ["chooseScopes", "onSuccess", "onForgotPassword", "onRegister", "onCode"]);
|
|
12
23
|
const medplum = useMedplum();
|
|
13
24
|
const [login, setLogin] = useState(undefined);
|
|
25
|
+
const [mfaRequired, setAuthenticatorRequired] = useState(false);
|
|
14
26
|
const [memberships, setMemberships] = useState(undefined);
|
|
15
27
|
function handleAuthResponse(response) {
|
|
28
|
+
setAuthenticatorRequired(!!response.mfaRequired);
|
|
16
29
|
if (response.login) {
|
|
17
30
|
setLogin(response.login);
|
|
18
31
|
}
|
|
@@ -50,6 +63,9 @@ function SignInForm(props) {
|
|
|
50
63
|
if (!login) {
|
|
51
64
|
return (React.createElement(AuthenticationForm, Object.assign({ generatePkce: !onCode, onForgotPassword: onForgotPassword, onRegister: onRegister, handleAuthResponse: handleAuthResponse }, baseLoginRequest), props.children));
|
|
52
65
|
}
|
|
66
|
+
else if (mfaRequired) {
|
|
67
|
+
return React.createElement(MfaForm, { login: login, handleAuthResponse: handleAuthResponse });
|
|
68
|
+
}
|
|
53
69
|
else if (memberships) {
|
|
54
70
|
return React.createElement(ChooseProfileForm, { login: login, memberships: memberships, handleAuthResponse: handleAuthResponse });
|
|
55
71
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SignInForm.js","sources":["../../../src/auth/SignInForm.tsx"],"sourcesContent":["import { BaseLoginRequest, LoginAuthenticationResponse } from '@medplum/core';\nimport { ProjectMembership } from '@medplum/fhirtypes';\nimport React, { useState } from 'react';\nimport { Document } from '../Document/Document';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\nimport { AuthenticationForm } from './AuthenticationForm';\nimport { ChooseProfileForm } from './ChooseProfileForm';\nimport { ChooseScopeForm } from './ChooseScopeForm';\nimport { NewProjectForm } from './NewProjectForm';\n\nexport interface SignInFormProps extends BaseLoginRequest {\n readonly chooseScopes?: boolean;\n readonly onSuccess?: () => void;\n readonly onForgotPassword?: () => void;\n readonly onRegister?: () => void;\n readonly onCode?: (code: string) => void;\n readonly children?: React.ReactNode;\n}\n\nexport function SignInForm(props: SignInFormProps): JSX.Element {\n const { chooseScopes, onSuccess, onForgotPassword, onRegister, onCode, ...baseLoginRequest } = props;\n const medplum = useMedplum();\n const [login, setLogin] = useState<string | undefined>(undefined);\n const [memberships, setMemberships] = useState<ProjectMembership[] | undefined>(undefined);\n\n function handleAuthResponse(response: LoginAuthenticationResponse): void {\n if (response.login) {\n setLogin(response.login);\n }\n\n if (response.memberships) {\n setMemberships(response.memberships);\n }\n\n if (response.code) {\n if (chooseScopes) {\n setMemberships(undefined);\n } else {\n handleCode(response.code as string);\n }\n }\n }\n\n function handleScopeResponse(response: LoginAuthenticationResponse): void {\n handleCode(response.code as string);\n }\n\n function handleCode(code: string): void {\n if (onCode) {\n onCode(code);\n } else {\n medplum\n .processCode(code)\n .then(() => {\n if (onSuccess) {\n onSuccess();\n }\n })\n .catch(console.log);\n }\n }\n\n return (\n <Document width={450}>\n {(() => {\n if (!login) {\n return (\n <AuthenticationForm\n generatePkce={!onCode}\n onForgotPassword={onForgotPassword}\n onRegister={onRegister}\n handleAuthResponse={handleAuthResponse}\n {...baseLoginRequest}\n >\n {props.children}\n </AuthenticationForm>\n );\n } else if (memberships) {\n return <ChooseProfileForm login={login} memberships={memberships} handleAuthResponse={handleAuthResponse} />;\n } else if (props.projectId === 'new') {\n return <NewProjectForm login={login} handleAuthResponse={handleAuthResponse} />;\n } else if (props.chooseScopes) {\n return <ChooseScopeForm login={login} scope={props.scope} handleAuthResponse={handleScopeResponse} />;\n } else {\n return <div>Success</div>;\n }\n })()}\n </Document>\n );\n}\n"],"names":[],"mappings":";;;;;;;;;
|
|
1
|
+
{"version":3,"file":"SignInForm.js","sources":["../../../src/auth/SignInForm.tsx"],"sourcesContent":["import { BaseLoginRequest, LoginAuthenticationResponse } from '@medplum/core';\nimport { ProjectMembership } from '@medplum/fhirtypes';\nimport React, { useState } from 'react';\nimport { Document } from '../Document/Document';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider';\nimport { AuthenticationForm } from './AuthenticationForm';\nimport { ChooseProfileForm } from './ChooseProfileForm';\nimport { ChooseScopeForm } from './ChooseScopeForm';\nimport { MfaForm } from './MfaForm';\nimport { NewProjectForm } from './NewProjectForm';\n\nexport interface SignInFormProps extends BaseLoginRequest {\n readonly chooseScopes?: boolean;\n readonly onSuccess?: () => void;\n readonly onForgotPassword?: () => void;\n readonly onRegister?: () => void;\n readonly onCode?: (code: string) => void;\n readonly children?: React.ReactNode;\n}\n\n/**\n * The SignInForm component allows users to sign in to Medplum.\n *\n * \"Signing in\" is a multi-step process:\n * 1) Authentication - identify the user\n * 2) MFA - If MFA is enabled, prompt for MFA code\n * 3) Choose profile - If the user has multiple profiles, prompt to choose one\n * 4) Choose scope - If the user has multiple scopes, prompt to choose one\n * 5) Success - Return to the caller with either a code or a redirect\n */\nexport function SignInForm(props: SignInFormProps): JSX.Element {\n const { chooseScopes, onSuccess, onForgotPassword, onRegister, onCode, ...baseLoginRequest } = props;\n const medplum = useMedplum();\n const [login, setLogin] = useState<string | undefined>(undefined);\n const [mfaRequired, setAuthenticatorRequired] = useState<boolean>(false);\n const [memberships, setMemberships] = useState<ProjectMembership[] | undefined>(undefined);\n\n function handleAuthResponse(response: LoginAuthenticationResponse): void {\n setAuthenticatorRequired(!!response.mfaRequired);\n\n if (response.login) {\n setLogin(response.login);\n }\n\n if (response.memberships) {\n setMemberships(response.memberships);\n }\n\n if (response.code) {\n if (chooseScopes) {\n setMemberships(undefined);\n } else {\n handleCode(response.code as string);\n }\n }\n }\n\n function handleScopeResponse(response: LoginAuthenticationResponse): void {\n handleCode(response.code as string);\n }\n\n function handleCode(code: string): void {\n if (onCode) {\n onCode(code);\n } else {\n medplum\n .processCode(code)\n .then(() => {\n if (onSuccess) {\n onSuccess();\n }\n })\n .catch(console.log);\n }\n }\n\n return (\n <Document width={450}>\n {(() => {\n if (!login) {\n return (\n <AuthenticationForm\n generatePkce={!onCode}\n onForgotPassword={onForgotPassword}\n onRegister={onRegister}\n handleAuthResponse={handleAuthResponse}\n {...baseLoginRequest}\n >\n {props.children}\n </AuthenticationForm>\n );\n } else if (mfaRequired) {\n return <MfaForm login={login} handleAuthResponse={handleAuthResponse} />;\n } else if (memberships) {\n return <ChooseProfileForm login={login} memberships={memberships} handleAuthResponse={handleAuthResponse} />;\n } else if (props.projectId === 'new') {\n return <NewProjectForm login={login} handleAuthResponse={handleAuthResponse} />;\n } else if (props.chooseScopes) {\n return <ChooseScopeForm login={login} scope={props.scope} handleAuthResponse={handleScopeResponse} />;\n } else {\n return <div>Success</div>;\n }\n })()}\n </Document>\n );\n}\n"],"names":[],"mappings":"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"}
|
package/dist/esm/index.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export * from './AddressDisplay/AddressDisplay';
|
|
2
2
|
export * from './AddressInput/AddressInput';
|
|
3
3
|
export * from './AnnotationInput/AnnotationInput';
|
|
4
|
+
export * from './AsyncAutocomplete/AsyncAutocomplete';
|
|
4
5
|
export * from './AttachmentArrayDisplay/AttachmentArrayDisplay';
|
|
5
6
|
export * from './AttachmentArrayInput/AttachmentArrayInput';
|
|
6
7
|
export * from './AttachmentButton/AttachmentButton';
|